On Tue, 27 Sep 2011 15:33:01 -0700, Alex Converse <[email protected]> 
wrote:
> On Tue, Sep 27, 2011 at 10:37 AM, Anton Khirnov <[email protected]> wrote:
> > Module: libav
> > Branch: master
> > Commit: d3c1d37a9019ed32a1710d53c1ad08c44bd072da
> >
> > Author:    Anton Khirnov <[email protected]>
> > Committer: Anton Khirnov <[email protected]>
> > Date:      Fri Sep 23 16:17:42 2011 +0200
> >
> > avconv: use different variables for decoded and filtered frame.
> >
> > Makes the code less obfuscated and fixes encoding one video stream to
> > several outputs.
> >
> > Also use avcodec_alloc_frame() instead of allocating AVFrame on stack.
> >
> > Breaks me_threshold in avconv, as motion vectors aren't passed through
> > lavfi. They could be copied manually, but I don't think this misfeature
> > is useful enough to justify ugly hacks.
> >
> > ---
> >
> >  avconv.c                      |   36 +++++++++++++++++++++++++-----------
> >  tests/codec-regression.sh     |    5 -----
> >  tests/ref/vsynth1/mpeg2thread |    4 ----
> >  tests/ref/vsynth2/mpeg2thread |    4 ----
> >  4 files changed, 25 insertions(+), 24 deletions(-)
> >
> > diff --git a/avconv.c b/avconv.c
> > index 9d2ad51..ed5d709 100644
> > --- a/avconv.c
> > +++ b/avconv.c
> > @@ -1520,7 +1520,6 @@ static int output_packet(InputStream *ist, int 
> > ist_index,
> >     OutputStream *ost;
> >     int ret, i;
> >     int got_output;
> > -    AVFrame picture;
> >     void *buffer_to_free = NULL;
> >     static unsigned int samples_size= 0;
> >     AVSubtitle subtitle, *subtitle_to_free;
> > @@ -1555,6 +1554,7 @@ static int output_packet(InputStream *ist, int 
> > ist_index,
> >     while (avpkt.size > 0 || (!pkt && got_output)) {
> >         uint8_t *data_buf, *decoded_data_buf;
> >         int data_size, decoded_data_size;
> > +        AVFrame *decoded_frame, *filtered_frame;
> >     handle_eof:
> >         ist->pts= ist->next_pts;
> >
> > @@ -1564,6 +1564,7 @@ static int output_packet(InputStream *ist, int 
> > ist_index,
> >             ist->showed_multi_packet_warning=1;
> >
> >         /* decode the packet if needed */
> > +        decoded_frame    = filtered_frame = NULL;
> >         decoded_data_buf = NULL; /* fail safe */
> >         decoded_data_size= 0;
> >         data_buf  = avpkt.data;
> > @@ -1600,22 +1601,24 @@ static int output_packet(InputStream *ist, int 
> > ist_index,
> >                 break;}
> >             case AVMEDIA_TYPE_VIDEO:
> >                     decoded_data_size = (ist->st->codec->width * 
> > ist->st->codec->height * 3) / 2;
> > -                    /* XXX: allocate picture correctly */
> > -                    avcodec_get_frame_defaults(&picture);
> > +                    if (!(decoded_frame = avcodec_alloc_frame()))
> > +                        return AVERROR(ENOMEM);
> >                     avpkt.pts = pkt_pts;
> >                     avpkt.dts = ist->pts;
> >                     pkt_pts = AV_NOPTS_VALUE;
> >
> >                     ret = avcodec_decode_video2(ist->st->codec,
> > -                                                &picture, &got_output, 
> > &avpkt);
> > -                    quality = same_quant ? picture.quality : 0;
> > +                                                decoded_frame, 
> > &got_output, &avpkt);
> > +                    quality = same_quant ? decoded_frame->quality : 0;
> >                     if (ret < 0)
> > -                        return ret;
> > +                        goto fail;
> >                     if (!got_output) {
> >                         /* no picture yet */
> > +                        av_freep(&decoded_frame);
> >                         goto discard_packet;
> >                     }
> > -                    ist->next_pts = ist->pts = 
> > guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
> > +                    ist->next_pts = ist->pts = 
> > guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts,
> > +                                                                 
> > decoded_frame->pkt_dts);
> >                     if (ist->st->codec->time_base.num != 0) {
> >                         int ticks= ist->st->parser ? 
> > ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
> >                         ist->next_pts += ((int64_t)AV_TIME_BASE *
> > @@ -1624,7 +1627,7 @@ static int output_packet(InputStream *ist, int 
> > ist_index,
> >                     }
> >                     avpkt.size = 0;
> >                     buffer_to_free = NULL;
> > -                    pre_process_video_frame(ist, (AVPicture *)&picture, 
> > &buffer_to_free);
> > +                    pre_process_video_frame(ist, (AVPicture 
> > *)decoded_frame, &buffer_to_free);
> >                     break;
> >             case AVMEDIA_TYPE_SUBTITLE:
> >                 ret = avcodec_decode_subtitle2(ist->st->codec,
> > @@ -1705,16 +1708,22 @@ static int output_packet(InputStream *ist, int 
> > ist_index,
> >                     sar = ist->st->sample_aspect_ratio;
> >                 else
> >                     sar = ist->st->codec->sample_aspect_ratio;
> > -                av_vsrc_buffer_add_frame(ost->input_video_filter, 
> > &picture, ist->pts, sar);
> > +                av_vsrc_buffer_add_frame(ost->input_video_filter, 
> > decoded_frame, ist->pts, sar);
> > +                if (!(filtered_frame = avcodec_alloc_frame())) {
> > +                    ret = AVERROR(ENOMEM);
> > +                    goto fail;
> > +                }
> >             }
> >             frame_available = ist->st->codec->codec_type != 
> > AVMEDIA_TYPE_VIDEO ||
> >                 !ost->output_video_filter || 
> > avfilter_poll_frame(ost->output_video_filter->inputs[0]);
> >             while (frame_available) {
> >                 AVRational ist_pts_tb;
> >                 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && 
> > ost->output_video_filter)
> > -                    get_filtered_video_frame(ost->output_video_filter, 
> > &picture, &ost->picref, &ist_pts_tb);
> > +                    get_filtered_video_frame(ost->output_video_filter, 
> > filtered_frame, &ost->picref, &ist_pts_tb);
> >                 if (ost->picref)
> >                     ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, 
> > AV_TIME_BASE_Q);
> > +#else
> > +                filtered_frame = decoded_frame;
> >  #endif
> >                 os = output_files[ost->file_index].ctx;
> >
> > @@ -1732,7 +1741,7 @@ static int output_packet(InputStream *ist, int 
> > ist_index,
> >                         if (ost->picref->video && !ost->frame_aspect_ratio)
> >                             ost->st->codec->sample_aspect_ratio = 
> > ost->picref->video->pixel_aspect;
> >  #endif
> > -                        do_video_out(os, ost, ist, &picture, &frame_size,
> > +                        do_video_out(os, ost, ist, filtered_frame, 
> > &frame_size,
> >                                      same_quant ? quality : 
> > ost->st->codec->global_quality);
> >                         if (vstats_filename && frame_size)
> >                             do_video_stats(os, ost, frame_size);
> > @@ -1806,15 +1815,20 @@ static int output_packet(InputStream *ist, int 
> > ist_index,
> >                 if (ost->picref)
> >                     avfilter_unref_buffer(ost->picref);
> >             }
> > +            av_freep(&filtered_frame);
> >  #endif
> >             }
> >
> > +fail:
> >         av_free(buffer_to_free);
> >         /* XXX: allocate the subtitles in the codec ? */
> >         if (subtitle_to_free) {
> >             avsubtitle_free(subtitle_to_free);
> >             subtitle_to_free = NULL;
> >         }
> > +        av_freep(&decoded_frame);
> > +        if (ret < 0)
> > +            return ret;
> 
> This part seems to have broken copy.
> 
> See "[PATCH] avconv: Initialize return value for codec copy path."
> 

Blergh, i could swear i initialized it. Or at least i wanted to.
Sorry about that.

-- 
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to