
VCodecImsdk C++ library
v4.2.2
Table of contents
- Overview
- Versions
- Library files
- VCodecImsdk class description
- Build and connect to your project
- Simple example
- Test application
Overview
The VCodecImsdk C++ library provides hardware video encoding/decoding (H264, HEVC, and JPEG) for Intel HD Graphics based on Intel Media SDK on Windows. The VCodecImsdk class inherits interface and data structures from the open-source VCodec interface library (source code included, Apache 2.0 license). The library provides a simple interface to be implemented in different C++ projects. It is written with the C++11 standard. The library is supplied as source code only in the form of a 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 | - Updated VCodec interface with variable bitrate parameters. |
| 4.2.2 | 02.11.2025 | - Updated VCodec submodule. - Documentation updated. |
Library files
The library is supplied only as 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 the VCodecImsdk class declaration.
VCodecImsdkVersion.h ----- Header file which includes the version of the library.
VCodecImsdkVersion.h.in -- CMake service file to generate version file.
VCodecImsdk class description
VCodecImsdk class declaration
The VCodecImsdk class is declared in the 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 a string of the current version of the VCodecImsdk class. Method declaration:
static std::string getVersion();
This method can be used without a VCodecImsdk class instance:
cout << "VCodecImsdk class version: " << VCodecImsdk::getVersion();
Console output:
VCodecImsdk class version: 4.2.2
transcode method
The transcode(…) method is intended to encode and decode video frames (see Frame class description). The 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, the src frame must have a raw pixel format such as NV12. To decode, the src frame must have a compressed pixel format (field fourcc of Frame class): HEVC, JPEG, H264. |
| dst | Result video frame (see Frame class description). To encode video data, the dst frame must have a compressed pixel format (field fourcc of Frame class): HEVC, JPEG, H264. For decoding, the dst frame must be NV12. |
Returns: TRUE if the frame was encoded/decoded successfully or FALSE if not.
setParam method
The setParam(…) method is designed to set new video codec parameter values. Method declaration:
bool setParam(VCodecParam id, float value) override;
| Parameter | Description |
|---|---|
| id | Video codec parameter ID according to the VCodecParam enum. |
| value | Video codec parameter value. |
Returns: TRUE if the parameter was set successfully or FALSE if not.
The VCodec.h file of the VCodec library 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 parameters description. Some parameters are not supported by the particular VCodecImsdk library.
| Parameter | Access | Description |
|---|---|---|
| LOG_LEVEL | read / write | Not supported by VCodecImsdk library. |
| BITRATE_KBPS | read / write | Bitrate, kbps. Default 2000 kbps. For H264, H265(HEVC), and JPEG encoding. For JPEG encoding, this value is used to calculate quality based on frame size and FPS. |
| MIN_BITRATE_KBPS | read / write | Not supported by VCodecImsdk library. |
| MAX_BITRATE_KBPS | read / write | Not supported by VCodecImsdk library. |
| BITRATE_MODE | read / write | Not supported by VCodecImsdk library. |
| QUALITY | read / write | Not supported by VCodecImsdk library. |
| FPS | read / write | FPS (Frames Per Second). Default 30.0. For H264, H265(HEVC), and JPEG encoding. Used for encoding parameter calculation. |
| GOP | read / write | GOP size (Group of Pictures). Default 30. For H264 and H265(HEVC) encoding. Defines the period of key frames. |
| H264_PROFILE | read / write | Not supported by VCodecImsdk library. |
| TYPE | read / write | Not supported by VCodecImsdk library. |
| CUSTOM_1 | read / write | Not supported by VCodecImsdk library. |
| CUSTOM_2 | read / write | Not supported by VCodecImsdk library. |
| CUSTOM_3 | read / write | Not supported by VCodecImsdk library. |
getParam method
The getParam(…) method is designed to obtain video codec parameter values. Method declaration:
float getParam(VCodecParam id);
| Parameter | Description |
|---|---|
| id | Video codec parameter ID according to the VCodecParam enum (see Table 2). |
Returns: Parameter value or -1 if the parameter is not supported.
executeCommand method
The executeCommand(…) method is designed to execute video codec commands. Version 4.2.2 doesn’t support commands. The method will return FALSE. Method declaration:
bool executeCommand(VCodecCommand id);
| Parameter | Description |
|---|---|
| id | Video codec command ID according to the VCodecCommand enum. |
Returns: The method returns FALSE in any case.
The VCodec.h file of the VCodec library 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 may be unsupported by particular video codec classes.
| 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 to install additional libraries. Typical commands to build the VCodecImsdk library:
cd VCodecImsdk
mkdir build
cd build
cmake ..
make
If you want to connect the VCodecImsdk library to your CMake project as source code, you can follow these steps. For example, if your repository has the following structure:
CMakeLists.txt
src
CMakeList.txt
yourLib.h
yourLib.cpp
Create a 3rdparty folder in your repository. Copy the VCodecImsdk repository folder to the 3rdparty folder. The new structure of your repository:
CMakeLists.txt
src
CMakeList.txt
yourLib.h
yourLib.cpp
3rdparty
VCodecImsdk
Create a CMakeLists.txt file in the 3rdparty folder. The 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)
################################################################################
## INCLUDING SUBDIRECTORIES
## Adding subdirectories according to the 3rd-party configuration
################################################################################
add_subdirectory(VCodecImsdk)
The file 3rdparty/CMakeLists.txt adds the VCodecImsdk folder to your project and will exclude the test application from compiling. Your repository’s new structure will be:
CMakeLists.txt
src
CMakeList.txt
yourLib.h
yourLib.cpp
3rdparty
CMakeLists.txt
VCodecImsdk
Next, you need to include the 3rdparty folder in the main CMakeLists.txt file of your repository. Add the following line at the end of your main CMakeLists.txt:
add_subdirectory(3rdparty)
Next, you have to include the VCodecImsdk library in your src/CMakeLists.txt file:
target_link_libraries(${PROJECT_NAME} VCodecImsdk)
Done!
Simple example
The example application generates an image color pattern with a moving rectangle and writes compressed data to a binary file “out.hevc”. The 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 with 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");
// Parameters 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 + objectWidth; ++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 << "Cannot encode frame" << std::endl;
continue;
}
// Write to file.
fwrite(frameHEVC.data, frameHEVC.size, 1, outputFile);
}
// Close file.
fclose(outputFile);
return 1;
}
Test application
The test application (VCodecImsdk/test/main.cpp) for the VCodecImsdk C++ library shows how the library works on Intel platforms. The test application generates artificial video, compresses it according to the user’s parameters (codec type, bitrate or JPEG quality, GOP size, and H264 profile), writes results to binary files “out.h264”, “out.hevc”, or “out.mjpeg”, and decompresses them. The application shows encoding and decoding time for each video frame. After starting, you will see the following output:
====================================
VCodecImsdk v4.2.2 test
====================================
Enter Encoder type (0 - JPEG, 1 - H264, 2 - HEVC) :
Choose the codec type (0 - JPEG, 1 - H264, 2 - HEVC). If H264 codec is chosen, you will see the following message:
====================================
VCodecImsdk v4.2.2 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 the parameters are chosen, the test application will create an out.h264 file and will start writing encoded frames until stopped. The user can set custom parameters (video resolution, bitrate, GOP size, and H264 profile). If the JPEG codec is chosen, you will see the following 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 the parameters are chosen, the test application will start writing encoded frames until stopped (if the user sets the number of frames). During encoding, the application shows encoded data size, 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