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

Yurii Monakov monakov.y at gmail.com
Thu Mar 24 06:13:10 EET 2022


Hi,

You should initialize AVCodecContext, open it and then you can fill
AVStream::codecpar with avcodec_parameters_from_context function. Please
look at doc/examples/muxing.c for sample code.

Yurii

ср, 23 марта 2022 г. в 14:07, Gustav González <xtingray at gmail.com>:

> Hi,
>
> 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
> manually.
>
> 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?
> Thanks,
> --
>   Gustav Gonzalez
>   xtingray at gmail.com
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20220324/1d91cf1e/attachment.htm>


More information about the Libav-user mailing list