[Libav-user] Replacing deprecated AVStream codec parameter in libav

Gustav González xtingray at gmail.com
Wed Mar 23 13:06:39 EET 2022


A long time ago, I implemented a C++ class to create MP4 video files from
an array of images. The code works pretty well, nevertheless, I discovered
a deprecation warning that I want to rid off. The parameter "*codec*" from
the *AVStream* structure has been deprecated and I want to replace it.

Here is my current working code:

AVOutputFormat *outputFormat = av_guess_format("ffh264",
movieFile.toLocal8Bit().data(), nullptr);
if (!outputFormat)
    return false;

enum AVCodecID videoCodecID = outputFormat->video_codec;

AVCodec *videoCodec = avcodec_find_encoder(videoCodecID);
if (!videoCodec)
    return false;

AVStream *stream = avformat_new_stream(formatContext, videoCodec);
if (!stream)
    return false;

AVCodecContext *videoCodecContext = stream->codec; // <- codec is a
deprecated parameter

videoCodecContext->width = videoW;
videoCodecContext->height = videoH;

Now, to replace the "*codec*" parameter, it is recommended to use the
parameter "*codecpar*" (*AVCodecParameters*) that was included in the
AVStream structure. The usual way is this:

if (avcodec_parameters_to_context(videoCodecContext, stream->codecpar) < 0)
    return nullptr;

Unfortunately, when I try to use that code, I got this problem: usually,
all the information stored in the *codecpar* parameter comes from the data
structure from a previous video file that was opened previously. In other
words, the information already exists. In my case, the situation is
different because I am creating an MP4 file from scratch so there is no
previous *codecpar* record to use, therefore I have to create a new
instance of AVCodecParameters structure by myself, setting every variable

As far, I was able to set all the variables from the *codecpar* structure,
except for two:

uint8_t * extradata
int       extradata_size

Note: currently I can create an MP4 file "successfully" without setting
those variables, but the file is incomplete and when I try to play it using
"mplayer" I got this error message:

[extract_extradata @ 0x55b5bb7e45c0] No start code is found.

I was researching these two fields, and it seems they store some kind of
information related to the codec, which in my case is H264.

So, my specific question is: if I am setting a *codecpar* variable (
*AVCodecParameters*) from scratch, how can I set values for the fields
*extradata* and *extradata_size* in the right way for the codec H264?
  Gustav Gonzalez
  xtingray at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20220323/8f75607c/attachment.htm>

More information about the Libav-user mailing list