[FFmpeg-devel] [PATCH v2] avfilter/src_movie: change the deprecate API to new decode api

Hendrik Leppkes h.leppkes at gmail.com
Sat Mar 23 20:45:00 EET 2019


> > @@ -524,17 +522,22 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id)
> >          return AVERROR(ENOMEM);
> >
> >      frame_type = st->st->codecpar->codec_type;
> > -    switch (frame_type) {
> > -    case AVMEDIA_TYPE_VIDEO:
> > -        ret = avcodec_decode_video2(st->codec_ctx, frame, &got_frame, pkt);
> > -        break;
> > -    case AVMEDIA_TYPE_AUDIO:
> > -        ret = avcodec_decode_audio4(st->codec_ctx, frame, &got_frame, pkt);
> > -        break;
> > -    default:
> > +    if (frame_type == AVMEDIA_TYPE_VIDEO || frame_type == AVMEDIA_TYPE_AUDIO) {
>
> > +        ret = avcodec_send_packet(st->codec_ctx, pkt);
> > +        if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
> > +            ret = 0;
> > +        }
> > +        if (ret >= 0) {
> > +            ret = avcodec_receive_frame(st->codec_ctx, frame);
>
> This is doing one avcodec_receive_frame() for each
> avcodec_send_packet(): this is not how the new API is supposed to be
> used. If it was, there would not have been the need for a new API in the
> first place, would it?
>

Its indeed not ideal, and instead it should loop over receive_frame
until EAGAIN is returned. Otherwise you might lose frames when
send_packet doesnt actually accept a new one yet.

Additionally, the patch could still use quite some cleanup in the
AVPacket handling, since the new API will always consume a full
AVPacket, and any manual handling of partial packets is no longer
required, so this all can be removed as well further down in that
function.

- Hendrik


More information about the ffmpeg-devel mailing list