[FFmpeg-devel] [PATCH] doc/examples/filtering_video: switch to new decoding API

Matthieu Bouron matthieu.bouron at gmail.com
Thu Mar 30 16:23:23 EEST 2017


On Thu, Mar 30, 2017 at 02:23:11PM +0200, wm4 wrote:
> On Thu, 30 Mar 2017 13:35:47 +0200
> Matthieu Bouron <matthieu.bouron at gmail.com> wrote:
> 
> > From e9e5b3e679a12fdd9495c53177ade51c3dee7ba2 Mon Sep 17 00:00:00 2001
> > From: Matthieu Bouron <matthieu.bouron at gmail.com>
> > Date: Wed, 29 Mar 2017 14:58:01 +0200
> > Subject: [PATCH] doc/examples/filtering_video: switch to new decoding API
> > 
> > ---
> >  doc/examples/filtering_video.c | 46 +++++++++++++++++++++++++-----------------
> >  1 file changed, 27 insertions(+), 19 deletions(-)
> > 
> > diff --git a/doc/examples/filtering_video.c b/doc/examples/filtering_video.c
> > index 15116d3881..4d973024f1 100644
> > --- a/doc/examples/filtering_video.c
> > +++ b/doc/examples/filtering_video.c
> > @@ -213,7 +213,6 @@ int main(int argc, char **argv)
> >      AVPacket packet;
> >      AVFrame *frame = av_frame_alloc();
> >      AVFrame *filt_frame = av_frame_alloc();
> > -    int got_frame;
> >  
> >      if (!frame || !filt_frame) {
> >          perror("Could not allocate frame");
> > @@ -238,33 +237,42 @@ int main(int argc, char **argv)
> >              break;
> >  
> >          if (packet.stream_index == video_stream_index) {
> > -            got_frame = 0;
> > -            ret = avcodec_decode_video2(dec_ctx, frame, &got_frame, &packet);
> > +            ret = avcodec_send_packet(dec_ctx, &packet);
> 
> I assume the "flush" packet makes it to this code as well...
> 
> >              if (ret < 0) {
> > -                av_log(NULL, AV_LOG_ERROR, "Error decoding video\n");
> > +                av_log(NULL, AV_LOG_ERROR, "Error while sending a packet to the decoder\n");
> >                  break;
> >              }
> >  
> > -            if (got_frame) {
> > -                frame->pts = av_frame_get_best_effort_timestamp(frame);
> > -
> > -                /* push the decoded frame into the filtergraph */
> > -                if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
> > -                    av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
> > +            while (ret >= 0) {
> > +                ret = avcodec_receive_frame(dec_ctx, frame);
> > +                if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
> >                      break;
> 
> On EOF this assumes the demuxer takes care of it, and if the demuxer is
> unexpectedly not EOF, the send call will error. So LGTM.
> 
> > +                } else if (ret < 0) {
> > +                    av_log(NULL, AV_LOG_ERROR, "Error while receiving a frame from the decoder\n");
> > +                    goto end;
> >                  }
> >  
> > -                /* pull filtered frames from the filtergraph */
> > -                while (1) {
> > -                    ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
> > -                    if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
> > +                if (ret >= 0) {
> > +                    frame->pts = av_frame_get_best_effort_timestamp(frame);
> > +
> > +                    /* push the decoded frame into the filtergraph */
> > +                    if (av_buffersrc_add_frame_flags(buffersrc_ctx, frame, AV_BUFFERSRC_FLAG_KEEP_REF) < 0) {
> > +                        av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
> >                          break;
> > -                    if (ret < 0)
> > -                        goto end;
> > -                    display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base);
> > -                    av_frame_unref(filt_frame);
> > +                    }
> > +
> > +                    /* pull filtered frames from the filtergraph */
> > +                    while (1) {
> > +                        ret = av_buffersink_get_frame(buffersink_ctx, filt_frame);
> > +                        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
> > +                            break;
> > +                        if (ret < 0)
> > +                            goto end;
> > +                        display_frame(filt_frame, buffersink_ctx->inputs[0]->time_base);
> > +                        av_frame_unref(filt_frame);
> > +                    }
> > +                    av_frame_unref(frame);
> >                  }
> > -                av_frame_unref(frame);
> >              }
> >          }
> >          av_packet_unref(&packet);
> 
> LGTM.

Patch applied.

> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


More information about the ffmpeg-devel mailing list