The Killer's Game Openh264 !free! ✦

make OS=windows ARCH=x86_64 Link libopenh264.dll or static .lib into your game engine. #include "codec_api.h" ISVCEncoder* encoder = nullptr; WelsCreateSVCEncoder(&encoder);

SEncParamExt param; encoder->GetDefaultParams(¶m); param.iUsageType = CAMERA_VIDEO_REAL_TIME; // Low latency param.iPicWidth = 1280; param.iPicHeight = 720; param.fMaxFrameRate = 30.0f; param.iTargetBitrate = 2000000; // 2 Mbps param.iRCMode = RC_BITRATE_MODE;

(example for Windows/MSVC):

encoder->Initialize(¶m); OpenH264 expects YUV 4:2:0. Convert your frame buffer:

SSourcePicture pic; pic.iPicWidth = width; pic.iPicHeight = height; pic.iColorFormat = videoFormatI420; pic.pData[0] = y_plane; pic.pData[1] = u_plane; pic.pData[2] = v_plane; SFrameBSInfo info; encoder->EncodeFrame(&pic, &info); the killer's game openh264

// Assuming game gives you RGB24 void RGB24toYUV420(uint8_t* rgb, uint8_t* yuv, int width, int height) // Standard conversion matrix (BT.601) for (int i = 0; i < width * height; i++) int r = rgb[3*i]; int g = rgb[3*i+1]; int b = rgb[3*i+2]; yuv[i] = (66*r + 129*g + 25*b + 128)>>8 + 16; // Y // ... U/V planes

for (int i = 0; i < info.iLayerNum; i++) SLayerBSInfo& layer = info.sLayerInfo[i]; // Write layer.pBsBuf to file or network make OS=windows ARCH=x86_64 Link libopenh264

uint8_t* h264_stream = ...; // read from file uint8_t* yuv_out = new uint8_t[width height 3/2]; decoder->DecodeFrameNoDelay(h264_stream, stream_len, yuv_out);