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

>     }
>  discard_packet:
>
[...]
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to