[Libav-user] Finding AVCodecContext data from sps and pps packets

Sampsa Riikonen sampsa.riikonen at iki.fi
Mon May 30 09:48:29 CEST 2016


I have a code in which I am receiving H264 sps, pps and frame packets 
and want to mux them into matroska, using libav*.

As instructed in the sample codes, I am doing roughly the following:

AVFormatContext *oc;
AVCodec *codec;
AVCodecContext *ctx;
AVStream *stream;
AVPacket *avpkt;

avformat_alloc_output_context2(&oc, NULL, NULL, "output.mkv");

codec  = avcodec_find_decoder(AV_CODEC_ID_H264); // AVCodec = possible 
parameters for a codec
ctx    = avcodec_alloc_context3(codec);          // reserve memory for 
codec related thingies.. AVCodecContext = defines codec parameters (as 
per AVCodec)
stream = avformat_new_stream(oc,ctx->codec);     // add new stream to 
AVFormatContext ctx->codec is "AVCodec"

avcodec_copy_context(stream->codec,ctx);         // stream.codec == 
AVCodecContext (we populate the codec parameters for stream "stream")

// THE QUESTION: How do we populate stream->codec, i.e. AVCodecContext 
instance, correctly for the stream? (***)

avio_open(&oc->pb, filename, AVIO_FLAG_WRITE);   // open the matroska 
file ..
ret = avformat_write_header(oc, NULL);


av_interleaved_write_frame(oc,avpkt);           // pass packets to the muxer

The problem is, that prior to opening the matroska file, stream->codec 
has no information about picture dimensions (matroska header requires 
pic dimensions).
I can solve this by passing sps, pps and an i-frame to a decoder (with 
avcodec_decode_video2), which populates an AVCodecContext with correct 
picture information, and then use that AVCodecContext.
However, this seems to be an overkill.. I do not want to decode 
anything, just to get the codec parameters from sps and pps.  Is there a 
simpler way to achieve this?

In fact, for files (AVFormatContext), there is the routine 
"avformat_find_stream_info" for such task.  At the present case, 
however, I only have raw sps, pps and frame packets.

One observation more: the sps, pps and I-frame (nal unit types 7,8 & 5), 
must the aggregated into a single packet in order for the matroska muxer 
to work.



More information about the Libav-user mailing list