[FFmpeg-devel] [PATCH] vp9: ignore reference segmentation map if error_resilience flag is set.

Ronald S. Bultje rsbultje at gmail.com
Wed Aug 13 12:48:49 CEST 2014


Hi,


On Wed, Aug 13, 2014 at 2:25 AM, Hendrik Leppkes <h.leppkes at gmail.com>
wrote:

> On Wed, Aug 13, 2014 at 12:11 AM, Ronald S. Bultje <rsbultje at gmail.com>
> wrote:
> > Fixes ffvp9_fails_where_libvpx.succeeds.webm from ticket 3849.
> > ---
> >  libavcodec/vp9.c | 26 +++++++++++++++-----------
> >  1 file changed, 15 insertions(+), 11 deletions(-)
> >
> > diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c
> > index 56975bd..186aec1 100644
> > --- a/libavcodec/vp9.c
> > +++ b/libavcodec/vp9.c
> > @@ -278,7 +278,7 @@ static int vp9_alloc_frame(AVCodecContext *ctx,
> VP9Frame *f)
> >
> >      // retain segmentation map if it doesn't update
> >      if (s->segmentation.enabled && !s->segmentation.update_map &&
> > -        !s->intraonly && !s->keyframe) {
> > +        !s->intraonly && !s->keyframe && !s->errorres) {
> >          memcpy(f->segmentation_map,
> s->frames[LAST_FRAME].segmentation_map, sz);
> >      }
> >
> > @@ -1344,16 +1344,20 @@ static void decode_mode(AVCodecContext *ctx)
> >                  vp56_rac_get_prob_branchy(&s->c,
> >                      s->prob.segpred[s->above_segpred_ctx[col] +
> >                                      s->left_segpred_ctx[row7]]))) {
> > -        int pred = 8, x;
> > -        uint8_t *refsegmap = s->frames[LAST_FRAME].segmentation_map;
> > -
> > -        if (!s->last_uses_2pass)
> > -            ff_thread_await_progress(&s->frames[LAST_FRAME].tf, row >>
> 3, 0);
> > -        for (y = 0; y < h4; y++)
> > -            for (x = 0; x < w4; x++)
> > -                pred = FFMIN(pred, refsegmap[(y + row) * 8 * s->sb_cols
> + x + col]);
> > -        av_assert1(pred < 8);
> > -        b->seg_id = pred;
> > +        if (!s->errorres) {
> > +            int pred = 8, x;
> > +            uint8_t *refsegmap = s->frames[LAST_FRAME].segmentation_map;
> > +
> > +            if (!s->last_uses_2pass)
> > +                ff_thread_await_progress(&s->frames[LAST_FRAME].tf, row
> >> 3, 0);
> > +            for (y = 0; y < h4; y++)
> > +                for (x = 0; x < w4; x++)
> > +                    pred = FFMIN(pred, refsegmap[(y + row) * 8 *
> s->sb_cols + x + col]);
> > +            av_assert1(pred < 8);
> > +            b->seg_id = pred;
> > +        } else {
> > +            b->seg_id = 0;
> > +        }
> >
> >          memset(&s->above_segpred_ctx[col], 1, w4);
> >          memset(&s->left_segpred_ctx[row7], 1, h4);
> > --
> > 1.8.5.5
> >
>
> Might it be useful to add some of those special samples to fate?


Probably. The first 10 frames of the sample in this ticket would show this
already, is anyone good with webm file cutting/remuxing? If not, I can try
to add it this weekend.

Ronald


More information about the ffmpeg-devel mailing list