[FFmpeg-devel] [PATCH 5/6] pngdec: fix and simplify apng reference handling

Anton Khirnov anton at khirnov.net
Thu Feb 18 14:16:26 EET 2021


Quoting Paul B Mahol (2021-02-17 14:34:18)
> On Wed, Feb 17, 2021 at 12:33 PM Anton Khirnov <anton at khirnov.net> wrote:
> 
> > Quoting Paul B Mahol (2021-02-17 11:52:31)
> > > On Tue, Feb 16, 2021 at 9:26 PM Anton Khirnov <anton at khirnov.net> wrote:
> > > > @@ -1088,23 +1084,23 @@ static int handle_p_frame_apng(AVCodecContext
> > > > *avctx, PNGDecContext *s,
> > > >      if (!buffer)
> > > >          return AVERROR(ENOMEM);
> > > >
> > > > +    ff_thread_await_progress(&s->last_picture, INT_MAX, 0);
> > > >
> > > > -    // Do the disposal operation specified by the last frame on the
> > frame
> > > > -    if (s->last_dispose_op != APNG_DISPOSE_OP_PREVIOUS) {
> > > > -        ff_thread_await_progress(&s->last_picture, INT_MAX, 0);
> > > > -        memcpy(buffer, s->last_picture.f->data[0], s->image_linesize *
> > > > s->height);
> > > > -
> > > > -        if (s->last_dispose_op == APNG_DISPOSE_OP_BACKGROUND)
> > > > -            for (y = s->last_y_offset; y < s->last_y_offset +
> > s->last_h;
> > > > ++y)
> > > > -                memset(buffer + s->image_linesize * y + s->bpp *
> > > > s->last_x_offset, 0, s->bpp * s->last_w);
> > > > +    // need to reset a rectangle to background:
> > > > +    // create a new writable copy
> > > > +    if (s->last_dispose_op == APNG_DISPOSE_OP_BACKGROUND) {
> > > > +        int ret = av_frame_make_writable(s->last_picture.f);
> > > > +        if (ret < 0)
> > > > +            return ret;
> > > >
> > > > -        memcpy(s->previous_picture.f->data[0], buffer,
> > s->image_linesize
> > > > * s->height);
> > > > -        ff_thread_report_progress(&s->previous_picture, INT_MAX, 0);
> > > > -    } else {
> > > > -        ff_thread_await_progress(&s->previous_picture, INT_MAX, 0);
> > > > -        memcpy(buffer, s->previous_picture.f->data[0],
> > s->image_linesize
> > > > * s->height);
> > > > +        for (y = s->last_y_offset; y < s->last_y_offset + s->last_h;
> > y++)
> > > > {
> > > > +            memset(s->last_picture.f->data[0] + s->image_linesize * y
> > +
> > > > +                   s->bpp * s->last_x_offset, 0, s->bpp * s->last_w);
> > > > +        }
> > > >      }
> > > >
> > > > +    memcpy(buffer, s->last_picture.f->data[0], s->image_linesize *
> > > > s->height);
> > > > +
> > > >      // Perform blending
> > > >      if (s->blend_op == APNG_BLEND_OP_SOURCE) {
> > > >          for (y = s->y_offset; y < s->y_offset + s->cur_h; ++y) {
> > > > @@ -1448,22 +1444,17 @@ exit_loop:
> > > >              if (CONFIG_PNG_DECODER && avctx->codec_id !=
> > AV_CODEC_ID_APNG)
> > > >                  handle_p_frame_png(s, p);
> > > >              else if (CONFIG_APNG_DECODER &&
> > > > -                     s->previous_picture.f->width == p->width  &&
> > > > -                     s->previous_picture.f->height== p->height &&
> > > > -                     s->previous_picture.f->format== p->format &&
> > > >
> > >
> > > No explanation provided why those line are removed.
> > >
> >
> > They are removed because previous_picture is removed. As is actually
> > explained in the commit message.
> >
> >
> But you just replaced previous with last?

The same check is already done for last_picture a few lines above.

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list