> -----Original Message----- > From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf > Of James Almer > Sent: Tuesday, July 30, 2019 00:44 > To: ffmpeg-devel@ffmpeg.org > Subject: Re: [FFmpeg-devel] [PATCH 3/4] fftools/ffmpeg: support variable > dimension encode > > On 7/29/2019 11:44 AM, Linjie Fu wrote: > > Flush encoders when dimension change happens, reset draining to resume > > encode. > > > > If encoder doesn't support variable dimension, stop encoding and > > report errors. > > > > Signed-off-by: Linjie Fu <linjie...@intel.com> > > --- > > fftools/ffmpeg.c | 13 +++++++++++++ > > libavcodec/encode.c | 4 ++++ > > 2 files changed, 17 insertions(+) > > > > diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c > > index 5d52430..8ceeaaa 100644 > > --- a/fftools/ffmpeg.c > > +++ b/fftools/ffmpeg.c > > @@ -130,6 +130,7 @@ static void do_video_stats(OutputStream *ost, int > frame_size); > > static BenchmarkTimeStamps get_benchmark_time_stamps(void); > > static int64_t getmaxrss(void); > > static int ifilter_has_all_input_formats(FilterGraph *fg); > > +static void flush_encoders(void); > > > > static int run_as_daemon = 0; > > static int nb_frames_dup = 0; > > @@ -1067,6 +1068,18 @@ static void do_video_out(OutputFile *of, > > InputStream *ist = NULL; > > AVFilterContext *filter = ost->filter->filter; > > > > + /* flush encoders in dynamic resolution encode */ > > + if (next_picture && (enc->width != next_picture->width || > > + enc->height != next_picture->height)) { > > + flush_encoders(); > > + > > + if (!(enc->codec->capabilities & > AV_CODEC_CAP_VARIABLE_DIMENSIONS)) { > > + av_log(NULL, AV_LOG_ERROR, "Dynamic resolution encode " > > + "is not supported by %s.\n", enc->codec->name); > > + goto error; > > + } > > + } > > + > > if (ost->source_index >= 0) > > ist = input_streams[ost->source_index]; > > > > diff --git a/libavcodec/encode.c b/libavcodec/encode.c > > index d12c425..9303bc9 100644 > > --- a/libavcodec/encode.c > > +++ b/libavcodec/encode.c > > @@ -389,6 +389,10 @@ int attribute_align_arg > avcodec_send_frame(AVCodecContext *avctx, const AVFrame > > if (!avcodec_is_open(avctx) || !av_codec_is_encoder(avctx->codec)) > > return AVERROR(EINVAL); > > > > + /* reset draining when encoder is flushed in variable dimensions > encoding */ > > + if (frame) > > + avctx->internal->draining = 0; > > This is an API change that can break some workflows. > > avcodec_flush_buffers() is the public function meant to flush an > AVCodecContext. >
Thanks for the hint, updated. - linjie _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".