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
