On Mon, 18 Feb 2013 13:09:37 +0100, Janne Grunau <[email protected]> wrote:
> On 2013-01-08 15:37:54 +0100, Anton Khirnov wrote:
> > ---
> > libavcodec/ffv1.c | 5 +----
> > libavcodec/ffv1.h | 2 ++
> > libavcodec/ffv1dec.c | 48
> > ++++++++++++++++++++++--------------------------
> > 3 files changed, 25 insertions(+), 30 deletions(-)
> >
> > diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c
> > index 682d111..d67485f 100644
> > --- a/libavcodec/ffv1.c
> > +++ b/libavcodec/ffv1.c
> > @@ -267,10 +267,7 @@ av_cold int ffv1_close(AVCodecContext *avctx)
> > FFV1Context *s = avctx->priv_data;
> > int i, j;
> >
> > - if (avctx->codec->decode && s->picture.data[0])
> > - avctx->release_buffer(avctx, &s->picture);
>
> what about picture? it is still used by the decoder
>
No, only by the encoder from what i can see.
> > - if (avctx->codec->decode && s->last_picture.data[0])
> > - avctx->release_buffer(avctx, &s->last_picture);
> > + av_frame_unref(&s->last_picture);
> >
> > for (j = 0; j < s->slice_count; j++) {
> > FFV1Context *fs = s->slice_context[j];
> > diff --git a/libavcodec/ffv1.h b/libavcodec/ffv1.h
> > index 4752cea..43c9607 100644
> > --- a/libavcodec/ffv1.h
> > +++ b/libavcodec/ffv1.h
> > @@ -80,6 +80,8 @@ typedef struct FFV1Context {
> > int flags;
> > int picture_number;
> > AVFrame picture, last_picture;
> > +
> > + AVFrame *cur;
>
> I don't see the need for this nor how it makes anything simpler. just
> pass the current AVFrame pointer as parameter for decode_slice_header
> and decode_slice
>
decode_slice() is called by AVCodecContext.execute(), so it can only have one
parameter, which is the FFV1Context.
Also I just noticed I'm not setting it for per-slice contexts. Will be fixed in
the next patch.
> > int plane_count;
> > int ac; // 1 = range coder <-> 0 = golomb rice
> > int ac_byte_count; // number of bytes used for AC coding
> > diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c
> > index 72f255c..12f9cb1 100644
> > --- a/libavcodec/ffv1dec.c
> > +++ b/libavcodec/ffv1dec.c
> > @@ -317,16 +317,16 @@ static int decode_slice_header(FFV1Context *f,
> > FFV1Context *fs)
> >
> > ps = get_symbol(c, state, 0);
> > if (ps == 1) {
> > - f->picture.interlaced_frame = 1;
> > - f->picture.top_field_first = 1;
> > + f->cur->interlaced_frame = 1;
> > + f->cur->top_field_first = 1;
> > } else if (ps == 2) {
> > - f->picture.interlaced_frame = 1;
> > - f->picture.top_field_first = 0;
> > + f->cur->interlaced_frame = 1;
> > + f->cur->top_field_first = 0;
> > } else if (ps == 3) {
> > - f->picture.interlaced_frame = 0;
> > + f->cur->interlaced_frame = 0;
> > }
> > - f->picture.sample_aspect_ratio.num = get_symbol(c, state, 0);
> > - f->picture.sample_aspect_ratio.den = get_symbol(c, state, 0);
> > + f->cur->sample_aspect_ratio.num = get_symbol(c, state, 0);
> > + f->cur->sample_aspect_ratio.den = get_symbol(c, state, 0);
> >
> > return 0;
> > }
> > @@ -339,7 +339,7 @@ static int decode_slice(AVCodecContext *c, void *arg)
> > const int ps = (av_pix_fmt_desc_get(c->pix_fmt)->flags &
> > PIX_FMT_PLANAR)
> > ? (c->bits_per_raw_sample > 8) + 1
> > : 4;
> > - AVFrame *const p = &f->picture;
> > + AVFrame *const p = f->cur;
> >
> > if (f->version > 2) {
> > if (decode_slice_header(f, fs) < 0) {
> > @@ -349,7 +349,7 @@ static int decode_slice(AVCodecContext *c, void *arg)
> > }
> > if ((ret = ffv1_init_slice_state(f, fs)) < 0)
> > return ret;
> > - if (f->picture.key_frame)
> > + if (f->cur->key_frame)
> > ffv1_clear_slice_state(f, fs);
> > width = fs->slice_width;
> > height = fs->slice_height;
> > @@ -800,23 +800,18 @@ static int ffv1_decode_frame(AVCodecContext *avctx,
> > void *data,
> > int buf_size = avpkt->size;
> > FFV1Context *f = avctx->priv_data;
> > RangeCoder *const c = &f->slice_context[0]->c;
> > - AVFrame *const p = &f->picture;
>
> diff would be smaller if you assign the user supplied frame and
> continue to use p
>
Ok, will do.
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel