On Sun, 18 Dec 2011 17:20:22 +0000, Mans Rullgard <[email protected]> wrote: > This was intended as an optimisation for skipped blocks in MPEG2 > P-frames and never used elsewhere. Removing this "optimisation" > speeds up MPEG2 decoding by 1-2% (ARM Cortex-A9). > > Signed-off-by: Mans Rullgard <[email protected]> > --- > avplay.c | 1 - > libavcodec/avcodec.h | 9 ++++----- > libavcodec/mpegvideo.c | 36 +++++------------------------------- > libavcodec/mpegvideo.h | 2 -- > libavcodec/pthread.c | 7 ------- > libavcodec/utils.c | 2 -- > libavcodec/version.h | 3 +++ > 7 files changed, 12 insertions(+), 48 deletions(-) > > diff --git a/avplay.c b/avplay.c > index f90899c..5fcfaa6 100644 > --- a/avplay.c > +++ b/avplay.c > @@ -1564,7 +1564,6 @@ static int input_get_buffer(AVCodecContext *codec, > AVFrame *pic) > pic->linesize[i] = ref->linesize[i]; > } > pic->opaque = ref; > - pic->age = INT_MAX; > pic->type = FF_BUFFER_TYPE_USER; > pic->reordered_opaque = codec->reordered_opaque; > if(codec->pkt) pic->pkt_pts = codec->pkt->pts; > diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h > index 1715bbb..7f4651b 100644 > --- a/libavcodec/avcodec.h > +++ b/libavcodec/avcodec.h > @@ -1004,13 +1004,12 @@ typedef struct AVFrame { > */ > int quality; > > +#if FF_API_AVFRAME_AGE > /** > - * buffer age (1->was last buffer and dint change, 2->..., ...). > - * Set to INT_MAX if the buffer has not been used yet. > - * - encoding: unused > - * - decoding: MUST be set by get_buffer() for video. > + * @deprecated unused > */ > - int age; > + attribute_deprecated int age; > +#endif > > /** > * is this picture used as reference > diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c > index ab57b51..d190606 100644 > --- a/libavcodec/mpegvideo.c > +++ b/libavcodec/mpegvideo.c > @@ -263,9 +263,9 @@ static int alloc_frame_buffer(MpegEncContext *s, Picture > *pic) > else > r = avcodec_default_get_buffer(s->avctx, (AVFrame *) pic); > > - if (r < 0 || !pic->f.age || !pic->f.type || !pic->f.data[0]) { > - av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %d %p)\n", > - r, pic->f.age, pic->f.type, pic->f.data[0]); > + if (r < 0 || !pic->f.type || !pic->f.data[0]) { > + av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %d %p)\n", > + r, pic->f.type, pic->f.data[0]); > av_freep(&pic->f.hwaccel_picture_private); > return -1; > } > @@ -369,15 +369,6 @@ int ff_alloc_picture(MpegEncContext *s, Picture *pic, > int shared) > 1 * sizeof(AVPanScan), fail) > } > > - /* It might be nicer if the application would keep track of these > - * but it would require an API change. */ > - memmove(s->prev_pict_types + 1, s->prev_pict_types, > - PREV_PICT_TYPES_BUFFER_SIZE-1); > - s->prev_pict_types[0] = s->dropable ? AV_PICTURE_TYPE_B : s->pict_type; > - if (pic->f.age < PREV_PICT_TYPES_BUFFER_SIZE && > - s->prev_pict_types[pic->f.age] == AV_PICTURE_TYPE_B) > - pic->f.age = INT_MAX; // Skipped MBs in B-frames are quite rare in > MPEG-1/2 > - // and it is a bit tricky to skip them anyway. > pic->owner2 = s; > > return 0; > @@ -574,9 +565,6 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, > s->current_picture_ptr = REBASE_PICTURE(s1->current_picture_ptr, s, s1); > s->next_picture_ptr = REBASE_PICTURE(s1->next_picture_ptr, s, s1); > > - memcpy(s->prev_pict_types, s1->prev_pict_types, > - PREV_PICT_TYPES_BUFFER_SIZE); > - > // Error/bug resilience > s->next_p_frame_damaged = s1->next_p_frame_damaged; > s->workaround_bugs = s1->workaround_bugs; > @@ -880,8 +868,6 @@ av_cold int MPV_common_init(MpegEncContext *s) > /* init macroblock skip table */ > FF_ALLOCZ_OR_GOTO(s->avctx, s->mbskip_table, mb_array_size + 2, > fail); > // Note the + 1 is for a quicker mpeg4 slice_end detection > - FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, > - PREV_PICT_TYPES_BUFFER_SIZE, fail); > > s->parse_context.state = -1; > if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) || > @@ -981,7 +967,6 @@ void MPV_common_end(MpegEncContext *s) > av_freep(&s->pred_dir_table); > > av_freep(&s->mbskip_table); > - av_freep(&s->prev_pict_types); > av_freep(&s->bitstream_buffer); > s->allocated_bitstream_buffer_size = 0; > > @@ -2215,24 +2200,13 @@ void MPV_decode_mb_internal(MpegEncContext *s, > DCTELEM block[12][64], > /* skip only during decoding as we might trash the buffers during > encoding a bit */ > if(!s->encoding){ > uint8_t *mbskip_ptr = &s->mbskip_table[mb_xy]; > - const int age = s->current_picture.f.age; > - > - assert(age); > > if (s->mb_skipped) { > s->mb_skipped= 0; > assert(s->pict_type!=AV_PICTURE_TYPE_I); > - > - (*mbskip_ptr) ++; /* indicate that this time we skipped it */ > - if(*mbskip_ptr >99) *mbskip_ptr= 99; > - > - /* if previous was skipped too, then nothing to do ! */ > - if (*mbskip_ptr >= age && s->current_picture.f.reference){ > - return; > - } > + *mbskip_ptr = 1; > } else if(!s->current_picture.f.reference) { > - (*mbskip_ptr) ++; /* increase counter so the age can be > compared cleanly */ > - if(*mbskip_ptr >99) *mbskip_ptr= 99; > + *mbskip_ptr = 1; > } else{ > *mbskip_ptr = 0; /* not skipped */ > } > diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h > index 38bbd12..6483893 100644 > --- a/libavcodec/mpegvideo.h > +++ b/libavcodec/mpegvideo.h > @@ -309,8 +309,6 @@ typedef struct MpegEncContext { > uint8_t *coded_block; ///< used for coded block pattern > prediction (msmpeg4v3, wmv1) > int16_t (*ac_val_base)[16]; > int16_t (*ac_val[3])[16]; ///< used for for mpeg4 AC prediction, > all 3 arrays must be continuous > - uint8_t *prev_pict_types; ///< previous picture types in bitstream > order, used for mb skip > -#define PREV_PICT_TYPES_BUFFER_SIZE 256 > int mb_skipped; ///< MUST BE SET only during DECODING > uint8_t *mbskip_table; /**< used to avoid copy if macroblock > skipped (for black regions for example) > and used for b-frame encoding & decoding > (contains skip table of next P Frame) */ > diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c > index 5f427c0..7e03c64 100644 > --- a/libavcodec/pthread.c > +++ b/libavcodec/pthread.c > @@ -855,13 +855,6 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame > *f) > > pthread_mutex_unlock(&p->parent->buffer_mutex); > > - /* > - * Buffer age is difficult to keep track of between > - * multiple threads, and the optimizations it allows > - * are not worth the effort. It is disabled for now. > - */ > - f->age = INT_MAX; > - > return err; > } > > diff --git a/libavcodec/utils.c b/libavcodec/utils.c > index 68fc525..1a0a8d4 100644 > --- a/libavcodec/utils.c > +++ b/libavcodec/utils.c > @@ -383,7 +383,6 @@ static int video_get_buffer(AVCodecContext *s, AVFrame > *pic) > } > > if(buf->base[0]){ > - pic->age= *picture_number - buf->last_pic_num; > buf->last_pic_num= *picture_number;
Unless I'm missing something, last_pic_num is now unused. -- Anton Khirnov _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
