UsageExampleForDecoder - sijchen/openh264 GitHub Wiki

This page is about the example of decoder usage

Decoder usage example

  • An example for using the decoder for Decoding only or Parsing only

Step 1:decoder declaration

//decoder declaration
ISVCDecoder *pSvcDecoder;
//input: encoded bitstream start position; should include start code prefix
unsigned char *pBuf =...;
//input: encoded bit stream length; should include the size of start code prefix
int iSize =...;
//output: [0~2] for Y,U,V buffer for Decoding only
unsigned char *pData[3] =...;
//in-out: for Decoding only: declare and initialize the output buffer info, this should never co-exist with Parsing only
SBufferInfo sDstBufInfo;
memset(&sDstBufInfo, 0, sizeof(SBufferInfo));
//in-out: for Parsing only: declare and initialize the output bitstream buffer info for parse only, this should never co-exist with Decoding only
SParserBsInfo sDstParseInfo;
    memset(&sDstParseInfo, 0, sizeof(SParserBsInfo));
    sDstParseInfo.pDstBuff = new unsigned char[PARSE_SIZE]; //In Parsing only, allocate enough buffer to save transcoded bitstream for a frame

Step 2:decoder creation

CreateDecoder(pSvcDecoder);

Step 3:declare required parameter, used to differentiate Decoding only and Parsing only

SDecodingParam sDecParam = {0};
sDecParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_AVC;
//for Parsing only, the assignment is mandatory
sDecParam.bParseOnly = true;

Step 4:initialize the parameter and decoder context, allocate memory

Initialize(&sDecParam);

Step 5:do actual decoding process in slice level; this can be done in a loop until data ends

 //for Decoding only
 iRet = DecodeFrameNoDelay(pBuf, iSize, pData, &sDstBufInfo);
 //or
 iRet = DecodeFrame2(pBuf, iSize, pData, &sDstBufInfo);
 //for Parsing only
 iRet = DecodeParser(pBuf, iSize, &sDstParseInfo);
 //decode failed
 If (iRet != 0){
     RequestIDR or something like that.
 }
 //for Decoding only, pData can be used for render.
 if (sDstBufInfo.iBufferStatus==1){
     output pData[0], pData[1], pData[2];
 }
//for Parsing only, sDstParseInfo can be used for, e.g., HW decoding
 if (sDstBufInfo.iNalNum > 0){
     Hardware decoding sDstParseInfo;
 }
 //no-delay decoding can be realized by directly calling DecodeFrameNoDelay(), which is the recommended usage.
 //no-delay decoding can also be realized by directly calling DecodeFrame2() again with NULL input, as in the following. In this case, decoder would immediately reconstruct the input data. This can also be used similarly for Parsing only. Consequent decoding error and output indication should also be considered as above.
 iRet = DecodeFrame2(NULL, 0, pData, &sDstBufInfo);
 judge iRet, sDstBufInfo.iBufferStatus ...

Step 6:uninitialize the decoder and memory free

Uninitialize();

Step 7:destroy the decoder

DestroyDecoder();
⚠️ **GitHub.com Fallback** ⚠️