Setting codec_data in h264 caps for qtmux

coezbek coezbek at scopis.com
Wed Apr 4 06:58:29 PDT 2012


Thanks Mohammed and Stefan!

With the link from Mohammend I came up with the following (C++ albeit) to
construct a AVCDecoderConfigurationRecord for use as a codec_data for qtmux.

I am not sure whether lengthSizeMinusOne will always indicate 4bytes.

GstBuffer* BitstreamMuxer::createCodecData(GstBuffer* sps, GstBuffer* pps)
{
  unsigned int offset = 0;

  GstBuffer* codec_data_buffer = gst_buffer_new_and_alloc(sps->size +
pps->size + 11);
  guint8* codec_data = codec_data_buffer->data;

  codec_data[offset++] = 0x01; // Configuration Version 
  codec_data[offset++] = sps->data[1]; // AVCProfileIndication
  codec_data[offset++] = sps->data[2]; // profile_compatibility
  codec_data[offset++] = sps->data[3]; // AVCLevelIndication 
  codec_data[offset++] = 0xff; // lengthSizeMinusOne == 3 -> length == 4
byte

  // SPS
  codec_data[offset++] = 0xe1; // numOfSequenceParameterSets | b11100000 ->
numSPS == 1
 
  assert(sps->size <= 0xffff);
  codec_data[offset++] = (sps->size >> 8) & 0xff; //
numOfSequenceParameterSets high 8bit
  codec_data[offset++] = sps->size & 0xff; // numOfSequenceParameterSets low
8bit
  memcpy(codec_data + offset, sps->data, sps->size);
  offset += sps->size;

  // PPS
  codec_data[offset++] = 0x1; // numOfPictureParameterSets == 1
  
  assert(pps->size <= 0xffff);
  codec_data[offset++] = (pps->size >> 8) & 0xff;
  codec_data[offset++] = pps->size & 0xff;
  memcpy(codec_data + offset, pps->data, pps->size);
  offset += pps->size;
  
  assert(offset == codec_data_buffer->size);

  return codec_data_buffer;
}

--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Setting-codec-data-in-h264-caps-for-qtmux-tp4525597p4531940.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


More information about the gstreamer-devel mailing list