vcodec_imsdk_web_logo

VCodecImsdk C++ library

v4.2.1

Table of contents

Overview

VCodecImsdk C++ library provides hardware video encoding / decoding (H264, HEVC and JPEG) for Intel HD Graphics based on Intel Media SDK on Windows. VCodecImsdk class inherits interface and data structures from open source VCodec interface library (source code included, Apache 2.0 license). The library provides simple interface to be implemented in different C++ projects. It is written with C++11 standard. The library is supplied as source code only in form of CMake project.

Encoding time for 11th Gen Intel(R) Core(TM) i5-1145G7E:

codec / resolution 2560x1440 1920x1080 1280x720 640x512
H264 11.6 msec 8.6 msec 4.4 msec 2.6 msec
HEVC 23.4 msec 15.2 msec 9.3 msec 5.2 msec
JPEG 8.2 msec 4.8 msec 2.5 msec 1.2 msec

Decoding time for 11th Gen Intel(R) Core(TM) i5-1145G7E:

codec / resolution 2560x1440 1920x1080 1280x720 640x512
H264 7.3 msec 4.8 msec 2.5 msec 1.3 msec
HEVC 7.4 msec 4.3 msec 2.2 msec 1.3 msec
JPEG 8.7 msec 5.2 msec 2.6 msec 1.3 msec

Versions

Table 1 - Library versions.

Version Release date What’s new
1.0.1 19.05.2022 First version.
2.0.0 27.06.2022 - new interface
3.0.0 27.01.2023 - Added JPEG encoding support.
- Added test application.
4.0.0 15.09.2023 - Interface changes to VCodec.
- Test application updated.
- Added example application.
4.0.1 10.01.2024 - VCodec interface library updated.
- Examples updated.
- Documentation updated.
4.0.2 26.04.2024 - VCodec interface library updated.
- Documentation updated.
4.1.0 16.05.2024 - VCodec interface library updated.
- Documentation updated.
4.2.0 08.07.2024 - CMake updated.
- Repository structure changed.
4.2.1 04.11.2024 - Update VCodec interface with variable bitrate params.

Library files

The library is supplied only by source code. The user is given a set of files in the form of a CMake project (repository). The repository structure is shown below:

CMakeLists.txt --------------- Main CMake file of the library.
3rdparty --------------------- Folder with third-party libraries.
    CMakeLists.txt ----------- CMake file which includes third-party libraries.
    VCodec ------------------- Source code of VCodec library.
example ---------------------- Folder with simple example of VCodecImsdk usage.
    CMakeLists.txt ----------- CMake file for example application.
    main.cpp ----------------- Source code file of example application.
test ------------------------- Folder with codec test application.
    CMakeLists.txt ----------- CMake file for codec test application.
    main.cpp ----------------- Source code file of codec test application.
src -------------------------- Folder with source code of the library.
    Backend ------------------ Folder with backend files.
    IMSDK_WIN ---------------- Implementation of IMSDK on Windows.
    MediaSamples ------------- Folder with service samples.
    CMakeLists.txt ----------- CMake file of the library.
    VCodecImsdk.cpp ---------- C++ implementation file.
    VCodecImsdk.h ------------ Header file which includes VCodecImsdk class declaration.
    VCodecImsdkVersion.h ----- Header file which includes version of the library.
    VCodecImsdkVersion.h.in -- CMake service file to generate version file.

VCodecImsdk class description

VCodecImsdk class declaration

VCodecImsdk class declared in VCodecImsdk.h file. Class declaration:

namespace cr
{
namespace video
{
class VCodecImsdk : public VCodec
{
public:

    /// Get library version.
    static std::string getVersion();

    /// Class constructor.
    VCodecImsdk();

    /// Class destructor.
    ~VCodecImsdk();

    /// Set parameter value.
    bool setParam(VCodecParam id, float value) override;

    /// Get parameter value.
    float getParam(VCodecParam id) override;

    /// Encode/Decode video frame.
    bool transcode(Frame& src, Frame& dst) override;

    /// Execute command.
     bool executeCommand(VCodecCommand id) override;
};
}
}

getVersion method

The getVersion() method returns string of current version of VCodecImsdk class. Method declaration:

static std::string getVersion();

Method can be used without VCodecImsdk class instance:

cout << "VCodecImsdk class version: " << VCodecImsdk::getVersion();

Console output:

VCodecImsdk class version: 4.2.1

transcode method

The transcode(…) method intended to encode and decode video frame (see Frame class description). Video codec encodes/decodes video frames frame-by-frame. Method declaration:

bool transcode(Frame& src, Frame& dst) override;
Parameter Value
src Source video frame (see Frame class description). To encode video src frame must have raw pixel format such as NV12. To decode src frame must have compressed pixel format (field fourcc of Frame class): HEVC, JPEG, H264.
dst Result video frame (see Frame class description). To encode video data dst frame must have compressed pixel format (field fourcc of Frame class): HEVC, JPEG, H264. In contrary, src frame must be NV12.

Returns: TRUE if frame was encoded/decoded or FALSE if not.

setParam method

The setParam(…) method designed to set new video codec parameters value. Method declaration:

bool setParam(VCodecParam id, float value) override;
Parameter Description
id Video codec parameter ID according to VCodecParam enum.
value Video codec parameter value.

Returns: TRUE is the parameter was set or FALSE if not.

VCodec.h file of VCodec library which defines IDs for parameters (VCodecParam enum) and IDs for commands (VCodecCommand enum). VCodecParam declaration:

namespace cr
{
namespace video
{
enum class VCodecParam
{
    /// [read/write] Log level: 0-Disable, 1-Console, 2-File, 3-Console and file.
    LOG_LEVEL = 1,
    /// [read/write] Bitrate, kbps. For H264 and H265 codecs.
    BITRATE_KBPS,
    /// [read/write] Minimum bitrate, kbps. For variable bitrate mode.
    MIN_BITRATE_KBPS,
    /// [read/write] Maximum bitrate, kbps. For variable bitrate mode.
    MAX_BITRATE_KBPS,
    /// [read/write] Bitrate mode: 0 - constant bitrate, 1 - variable bitrate.
    BITRATE_MODE,
    /// [read/write] Quality 0-100%. For JPEG codecs.
    QUALITY,
    /// [read/write] FPS. For H264 and H265 codecs.
    FPS,
    /// [read/write] GOP size. For H264 and H265 codecs.
    GOP,
    /// [read/write] H264 profile: 0 - Baseline, 1 - Main, 2 - High.
    H264_PROFILE,
    /// [read/write] Codec type. Depends on implementation.
    TYPE,
    /// Custom 1. Depends on implementation.
    CUSTOM_1,
    /// Custom 2. Depends on implementation.
    CUSTOM_2,
    /// Custom 3. Depends on implementation.
    CUSTOM_3
};
}
}

Table 2 - Video codec params description. Some params not supported by particular VCodecLibav library.

Parameter Access Description
LOG_LEVEL read / write Logging mode. Values:
0 - Disable.
1 - Only file.
2 - Only terminal (console).
3 - File and terminal.
BITRATE_KBPS read / write Bitrate, kbps. Default 5000 kbps. For H264 and H265(HEVC) encoding. According to this value, FPS and GOP size video codec calculate parameter for H264 or H265(HEVC) encoding.
- Sets special settings for noisy video if bitrate is 0 for hardware encoding.
- For software JPEG encoding bitrate incising gives higher quality.
MIN_BITRATE_KBPS read / write Minimum bitrate, kbps. Only for H264 and H265(HEVC) codecs. Default 2000 kbps. For variable bitrate mode. For H264 and H265(HEVC) encoding.
MAX_BITRATE_KBPS read / write Maximum bitrate, kbps. Only for H264 and H265(HEVC) codecs. Default 8000 kbps. For variable bitrate mode. For H264 and H265(HEVC) encoding.
BITRATE_MODE read / write Only for H264 and H265(HEVC) codecs. Bitrate mode: 0 - constant bitrate (default), 1 - variable bitrate. In variable bitrate mode for software encoder
QUALITY read / write Quality 0(low quality)-100%(maximum quality). Only for hardware JPEG encoding. Not supported by JPEG SW encoding.
FPS read / write FPS. For H264 and H265(HEVC) encoding only. According to this value, FPS and GOP size video codec calculate parameter for H264 and H265(HEVC) encoding.
GOP read / write GOP size (Period of key frames) for H264 and H265(HEVC) encoding. Value: 1 - each output frame is key frame, 20 - each 20th frame is key frame etc.
H264_PROFILE read / write H264 profile for H264 encoding:
0 - Baseline.
1 - Main.
2 - High. For hardware encoding only.
TYPE read / write Type of encoder/decoder:
0 - hardware (default).
1 - software.
CUSTOM_1 read / write Number of thread for software encoder/decoder. Thread’s count for software encoder\decoder H264 / HEVC(H265) (not for JPEG): 1 - 32, default value 1. Note: in case one thread software encoder produces only one slice per frame. In case multiple threads frame can have multiple slices which can effect on RTSP servers.
CUSTOM_2 read / write Not supported by VCodecLibav library.
CUSTOM_3 read / write Not supported by VCodecLibav library.

getParam method

The getParam(…) method designed to obtain video codec parameter value. Method declaration:

float getParam(VCodecParam id);
Parameter Description
id Video codec parameter ID according to VCodecParam enum (see Table 2).

Returns: parameter value or -1 if the parameters not supported.

executeCommand method

The executeCommand(…) method designed to execute video codec command. Version 4.0.1 doesn’t support commands. Method will return FALSE. Method declaration:

bool executeCommand(VCodecCommand id);
Parameter Description
id Video codec command ID according to VCodecCommand enum.

Returns: method returns FALSE in any case.

VCodec.h file of VCodec library which defines IDs for parameters (VCodecParam enum) and IDs for commands (VCodecCommand enum). VCodecCommand declaration:

enum class VCodecCommand
{
    /// Reset.
    RESET = 1,
    /// Generate key frame. For H264 and H265 codecs.
    MAKE_KEY_FRAME
};

Table 3 - Video codec commands description. Some commands maybe unsupported by particular video codec class.

Command Description
RESET Not supported by VCodecImsdk library.
MAKE_KEY_FRAME Not supported by VCodecImsdk library.

Build and connect to your project

For Windows you don’t need install additional libraries. Typical commands to build VCodecImsdk library:

cd VCodecImsdk
mkdir build
cd build
cmake ..
make

If you want connect VCodecImsdk library to your CMake project as source code you can make follow. For example, if your repository has structure:

CMakeLists.txt
src
    CMakeList.txt
    yourLib.h
    yourLib.cpp

Create folder 3rdparty in your repository. Copy repository folder VCodecImsdk to 3rdparty folder. New structure of your repository:

CMakeLists.txt
src
    CMakeList.txt
    yourLib.h
    yourLib.cpp
3rdparty
    VCodecImsdk

Create CMakeLists.txt file in 3rdparty folder. CMakeLists.txt should contain:

cmake_minimum_required(VERSION 3.13)

################################################################################
## 3RD-PARTY
## dependencies for the project
################################################################################
project(3rdparty LANGUAGES CXX)

################################################################################
## SETTINGS
## basic 3rd-party settings before use
################################################################################
# To inherit the top-level architecture when the project is used as a submodule.
SET(PARENT ${PARENT}_YOUR_PROJECT_3RDPARTY)
# Disable self-overwriting of parameters inside included subdirectories.
SET(${PARENT}_SUBMODULE_CACHE_OVERWRITE OFF CACHE BOOL "" FORCE)

################################################################################
## CONFIGURATION
## 3rd-party submodules configuration
################################################################################
SET(${PARENT}_SUBMODULE_VCODEC_IMSDK                    ON  CACHE BOOL "" FORCE)
if (${PARENT}_SUBMODULE_VCODEC_IMSDK)
    SET(${PARENT}_VCODEC_IMSDK                          ON  CACHE BOOL "" FORCE)
    SET(${PARENT}_VCODEC_IMSDK_TEST                     OFF CACHE BOOL "" FORCE)
    SET(${PARENT}_VCODEC_IMSDK_EXAMPLE                  OFF CACHE BOOL "" FORCE)
endif()

################################################################################
## INCLUDING SUBDIRECTORIES
## Adding subdirectories according to the 3rd-party configuration
################################################################################
if (${PARENT}_SUBMODULE_VCODEC_IMSDK)
    add_subdirectory(VCodecImsdk)
endif()

File 3rdparty/CMakeLists.txt adds folder VCodecImsdk to your project and will exclude test application from compiling. Your repository new structure will be:

CMakeLists.txt
src
    CMakeList.txt
    yourLib.h
    yourLib.cpp
3rdparty
    CMakeLists.txt
    VCodecImsdk

Next you need include folder 3rdparty in main CMakeLists.txt file of your repository. Add string at the end of your main CMakeLists.txt:

add_subdirectory(3rdparty)

Next you have to include VCodecImsdk library in your src/CMakeLists.txt file:

target_link_libraries(${PROJECT_NAME} VCodecImsdk)

Done!

Simple example

Example application generates image color pattern with moving rectangle and writes compressed data to binary file “out.hevc”. Example shows how to create codec objects and how to encode video frames:

#include <iostream>
#include "VCodecImsdk.h"

int main(void)
{
    // Create codec and set parameters.
    cr::video::VCodec* videoCodec = new cr::video::VCodecImsdk();
    videoCodec->setParam(cr::video::VCodecParam::BITRATE_KBPS, 7500);
    videoCodec->setParam(cr::video::VCodecParam::GOP, 30);
    videoCodec->setParam(cr::video::VCodecParam::FPS, 30);

    // Create NV12 frame and fill by random values.
    const int width = 1280;
    const int height = 720;
    cr::video::Frame frameNv12(width, height, cr::video::Fourcc::NV12);
    for (uint32_t i = 0; i < frameNv12.size; ++i)
        frameNv12.data[i] = (uint8_t)i;

    // Create output HEVC frame.
    cr::video::Frame frameHEVC(width, height, cr::video::Fourcc::HEVC);

    // Create output file.
    FILE *outputFile = fopen("out.hevc", "w+b");

    // Params for moving object.
    int objectWidth = 128;
    int objectHeight = 128;
    int directionX = 1;
    int directionY = 1;
    int objectX = width / 4;
    int objectY = height / 2;

    // Encode and record 200 frames.
    for (uint32_t n = 0; n < 200; ++n)
    {
        // Draw moving object.
        memset(frameNv12.data, 128, width * height);
        for (int y = objectY; y < objectY + objectHeight; ++y)
            for (int x = objectX; x < objectX + objectHeight; ++x)
                frameNv12.data[y * width + x] = 255;
        objectX += directionX;
        objectY += directionY;
        if (objectX >= width - objectWidth - 5 || objectX <= objectWidth + 5)
            directionX = -directionX;
        if (objectY >= height - objectHeight - 5 || objectY <= objectHeight + 5)
            directionY = -directionY;

        // Encode.
        if (!videoCodec->transcode(frameNv12, frameHEVC))
        {
            std::cout << "Can't encode frame" << std::endl;
            continue;
        }

        // Write to file.
        fwrite(frameHEVC.data, frameHEVC.size, 1, outputFile);  
    }

    // Close file.
    fclose(outputFile);

    return 1;
}

Test application

Test application (VCodecImsdk/test/main.cpp) for VCodecImsdk C++ library shows how library works on Intel platform. Test application generates artificial video, compresses it according to user’s parameters (codec type, bitrate or JPEG quality, GOP size and H264 profile), writes results to binary file “out.h264”, “out.hevc” or “out.mjpeg” and decompresses. The application shows encoding and decoding time for each video frame. After start you will see output:

====================================
VCodecImsdk v4.2.1 test
====================================

Enter Encoder type (0 - JPEG, 1 - H264, 2 - HEVC) :

Chose codec type (0 - JPEG, 1 - H264). If H264 codec chosen you will see message:

====================================
VCodecImsdk v4.2.1 test
====================================

Enter Encoder type (0 - JPEG, 1 - H264, 2 - HEVC) : 1
Default params:
Bitrate, kbps 6000
Minimum bitrate, kbps 3000
Maximum bitrate, kbps 7000
FPS: 30
GOP size: 30
Video width 1920
Video height 1080
H264 Profile: BASELINE
Use default params (0 - no, 1 - yes) :

When params chosen test application will create out.h264 file and will start writing encoded frames until stop. User can set custom parameters (video resolution, bitrate, GOP size and H264 profile). If JPEG codec chosen you will see message:

Enter Encoder type (0 - JPEG, 1 - H264, 2 - HEVC) : 1
Default params:
Bitrate, kbps 6000
Minimum bitrate, kbps 3000
Maximum bitrate, kbps 7000
FPS: 30
GOP size: 30
Video width 1920
Video height 1080
H264 Profile: 0
Use default params (0 - no, 1 - yes) : 0
Set video width : 1280
Set video height : 720
Set bitrate, kbps : 2000
Set GOP size : 30
Set FPS : 30
Set profile (0 - BASELINE, 1 - MAIN, 2 - HIGH): 0
Set number frames: 100

When params chosen test application will start writing encoded frames until stop (if user set number of frames). During encoding the application shows encoded data size and encoding time and decoding time:

Data size 1382400 / 6579   encoding time  578601 us / decoding time 411758 us
Data size 1382400 / 157   encoding time  8536 us / decoding time 6739 us
Data size 1382400 / 160   encoding time  6291 us / decoding time 2202 us
Data size 1382400 / 167   encoding time  3667 us / decoding time 3988 us
Data size 1382400 / 166   encoding time  4124 us / decoding time 3744 us
Data size 1382400 / 161   encoding time  2970 us / decoding time 4891 us
Data size 1382400 / 186   encoding time  3133 us / decoding time 1781 us