How to fill 'extradata' field of AVCodecContext with SPS and PPS data?

前端 未结 2 1885
北海茫月
北海茫月 2021-01-03 07:54

Here is the problem: When decoding H264 stream with ffmpeg, I can obtain raw data of SPS and PPS but I have no idea how to fill them into the extradata

相关标签:
2条回答
  • 2021-01-03 08:17

    The data you mentioned is a byte stream holding NAL units for SPS and PPS. extradata in turn expects a pointer to AVC decoder configuration record, which is the data you have with extra formatting.

    See MPEG-4 Part 15 "Advanced Video Coding (AVC) file format" section 5.2.4.1 for details.

    5.2.4.1.1 Syntax 
    
    aligned(8) class AVCDecoderConfigurationRecord { 
       unsigned int(8) configurationVersion = 1; 
       unsigned int(8) AVCProfileIndication; 
       unsigned int(8) profile_compatibility; 
       unsigned int(8) AVCLevelIndication;  
       bit(6) reserved = ‘111111’b;
       unsigned int(2) lengthSizeMinusOne;  
       bit(3) reserved = ‘111’b;
       unsigned int(5) numOfSequenceParameterSets; 
       for (i=0; i< numOfSequenceParameterSets;  i++) { 
          unsigned int(16) sequenceParameterSetLength ; 
      bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit; 
     } 
       unsigned int(8) numOfPictureParameterSets; 
       for (i=0; i< numOfPictureParameterSets;  i++) { 
      unsigned int(16) pictureParameterSetLength; 
      bit(8*pictureParameterSetLength) pictureParameterSetNALUnit; 
     } 
    }
    
    0 讨论(0)
  • 2021-01-03 08:32
    c_v->extradata = (uint8_t*)av_malloc(flvBufSize + FF_INPUT_BUFFER_PADDING_SIZE);
    if(!c_v->extradata){
        loge("Could not av_malloc extradata");
    }
    logv("extradata_size =%d", c_v->extradata_size);
    c_v->extradata_size = flvBufSize;
    memcpy(c_v->extradata, avpkt.data, avpkt.size);
    
    if (avcodec_open2(c_v, codec_v, NULL) < 0) {
        loge("could not open video codec");                             
    }
    
    0 讨论(0)
提交回复
热议问题