[FFmpeg-devel] [PATCH 2/2] ffmpeg: use avcodec_copy_context before avcodec_open2 and open both ctxs
Lukasz Marek
lukasz.m.luki2 at gmail.com
Wed Dec 3 01:39:12 CET 2014
On 03.12.2014 00:35, Michael Niedermayer wrote:
> On Tue, Dec 02, 2014 at 07:27:33PM +0100, Lukasz Marek wrote:
>> avcodec_copy_context make dest context unopened.
>> ffmpeg treats it as opened.
>>
>> Signed-off-by: Lukasz Marek <lukasz.m.luki2 at gmail.com>
>> ---
>> ffmpeg.c | 29 ++++++++++++++++++++---------
>> 1 file changed, 20 insertions(+), 9 deletions(-)
>>
>> diff --git a/ffmpeg.c b/ffmpeg.c
>> index b44401f..4fa9f1e 100644
>> --- a/ffmpeg.c
>> +++ b/ffmpeg.c
>> @@ -2932,6 +2932,7 @@ static int transcode_init(void)
>> if (ost->encoding_needed) {
>> AVCodec *codec = ost->enc;
>> AVCodecContext *dec = NULL;
>> + AVDictionary *opt_copy = NULL;
>>
>> if ((ist = get_input_stream(ost)))
>> dec = ist->dec_ctx;
>> @@ -2949,13 +2950,24 @@ static int transcode_init(void)
>> av_dict_set(&ost->encoder_opts, "threads", "auto", 0);
>> av_dict_set(&ost->encoder_opts, "side_data_only_packets", "1", 0);
>>
>> - if ((ret = avcodec_open2(ost->enc_ctx, codec, &ost->encoder_opts)) < 0) {
>> + ret = avcodec_copy_context(ost->st->codec, ost->enc_ctx);
>> + if (ret < 0) {
>> + av_log(NULL, AV_LOG_FATAL,
>> + "Error initializing the output stream codec context.\n");
>> + exit_program(1);
>> + }
>> +
>> + av_dict_copy(&opt_copy, ost->encoder_opts, 0);
>> + if ((ret = avcodec_open2(ost->enc_ctx, codec, &ost->encoder_opts)) < 0 ||
>> + (ret = avcodec_open2(ost->st->codec, codec, &opt_copy)) < 0) {
>
> if the encoder is opened twice it would print any info or warnings
> twice. libxvid would open 2pass files twice potentially i think
>
> maybe coded_frame could just be allocated somewhere before use
> in ffmpeg raw and leaving the copy as it is in ffmpeg ?
I'm not familiar with ffmpeg.c code closely; is ost->st->codec context
used by ffmpeg for anything? I guess not (but im not sure).
If so, I think is all working because of that. You have two contexts
that share some pointers (like mentioned coded_frame). Of cource it can
be reallocated here, but this code is still in contradiction with doxy
of avcodec_copy_context that states dest context should be treat as not
opened. FFmpeg uses it as opened.
This avcodec_copy_context function is still very hacky, it is better
than pure memcpy, but it doesn't separate src and dest completely.. yet.
Of course I may miss something.
More information about the ffmpeg-devel
mailing list