Overview
The VCodecOneVpl C++ library provides hardware video encoding/decoding (H264, HEVC, and JPEG) for Intel HD Graphics based on the oneVPL API. The VCodecOneVpl class inherits interface and data structures from the open-source VCodec library (provides interface for video codecs, source code included, Apache 2.0 license) and also includes the Logger open-source library (provides functions to print logs, source code included, Apache 2.0 license). The library provides a simple interface to be implemented in different C++ projects and is compatible with Linux and Windows. It is written with the C++17 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 on Ubuntu 22.04 LTS:
H264 codec, 2560x1440 - 11.6 msec, 1920x1080 - 8.6 msec, 1280x720 - 4.4 msec, 640x512 - 2.6 msec.
HEVC codec, 2560x1440 - 23.4 msec, 1920x1080 - 15.2 msec, 1280x720 - 9.3 msec, 640x512 - 5.2 msec.
JPEG codec, 2560x1440 - 8.2 msec, 1920x1080 - 4.8 msec, 1280x720 - 2.5 msec, 640x512 - 1.2 msec.
Decoding time for 11th Gen Intel(R) Core(TM) i5-1145G7E on Ubuntu 22.04 LTS:
H264 codec, 2560x1440 - 7.3 msec, 1920x1080 - 4.8 msec, 1280x720 - 2.5 msec, 640x512 - 1.3 msec.
HEVC codec, 2560x1440 - 7.4 msec, 1920x1080 - 4.3 msec, 1280x720 - 2.2 msec, 640x512 - 1.3 msec.
JPEG codec, 2560x1440 - 8.7 msec, 1920x1080 - 5.2 msec, 1280x720 - 2.6 msec, 640x512 - 1.3 msec.
Documentation
Documentation: GO TO DOCUMENTATION
Simple interface
namespace cr
{
namespace video
{
/**
* @brief VCodecOneVpl class.
*/
class VCodecOneVplImpl : public VCodec
{
public:
/// Class constructor.
VCodecOneVplImpl();
/// Class destructor.
~VCodecOneVplImpl();
/// 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;
};
}
}
Simple example
#include <iostream>
#include "VCodecOneVpl.h"
int main(void)
{
// Set codec parameters.
cr::video::VCodec* videoCodec = new cr::video::VCodecOneVpl();
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 color planes 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;
}

