[FFmpeg-devel] [PATCH 2/2] ffmpeg: use avcodec_copy_context before avcodec_open2 and open both ctxs

Michael Niedermayer michaelni at gmx.at
Wed Dec 3 01:53:39 CET 2014


On Wed, Dec 03, 2014 at 01:39:12AM +0100, Lukasz Marek wrote:
> 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.

where does ffmpeg treat the context as open ?
i know of the coded_frame case but thats only used to transfer some
flags into the muxer and isnt really a pretty way to do it but
for that simply allocating the frame so the flags can be set
should work
i mean you can probably just check if its NULL and allocate
before the few flags are set in it


> 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.

yes


> 
> Of course I may miss something.

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I know you won't believe me, but the highest form of Human Excellence is
to question oneself and others. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141203/0b793165/attachment.asc>


More information about the ffmpeg-devel mailing list