From 44a5e7b64c1e12b373aca3266d086de4e50c94d3 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 18 Jan 2010 00:20:44 +0000 Subject: [PATCH] Move the qp check to skip the loop filter up. Originally committed as revision 21274 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264.c | 3 ++- libavcodec/h264.h | 24 +++++++++++++++++++++--- libavcodec/h264_loopfilter.c | 11 ----------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 3f44d521fc..8d7478c0f1 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -2184,7 +2184,8 @@ static void loop_filter(H264Context *h){ uvlinesize = h->mb_uvlinesize = s->uvlinesize; } backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, !is_complex); - fill_filter_caches(h, mb_type); //FIXME don't fill stuff which isn't used by filter_mb + if(fill_filter_caches(h, mb_type) < 0) + continue; h->chroma_qp[0] = get_chroma_qp(h, 0, s->current_picture.qscale_table[mb_xy]); h->chroma_qp[1] = get_chroma_qp(h, 1, s->current_picture.qscale_table[mb_xy]); diff --git a/libavcodec/h264.h b/libavcodec/h264.h index d37eb61160..1cc0f877ca 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -726,7 +726,7 @@ static inline int get_chroma_qp(H264Context *h, int t, int qscale){ static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my); -static av_always_inline void fill_caches(H264Context *h, int mb_type, int for_deblock){ +static av_always_inline int fill_caches(H264Context *h, int mb_type, int for_deblock){ MpegEncContext * const s = &h->s; const int mb_xy= h->mb_xy; int topleft_xy, top_xy, topright_xy, left_xy[2]; @@ -795,6 +795,19 @@ static av_always_inline void fill_caches(H264Context *h, int mb_type, int for_de h->left_mb_xy[0] = left_xy[0]; h->left_mb_xy[1] = left_xy[1]; if(for_deblock){ + + //for sufficiently low qp, filtering wouldn't do anything + //this is a conservative estimate: could also check beta_offset and more accurate chroma_qp + if(!FRAME_MBAFF){ + int qp_thresh = h->qp_thresh; + int qp = s->current_picture.qscale_table[mb_xy]; + if(qp <= qp_thresh + && (s->mb_x == 0 || ((qp + s->current_picture.qscale_table[mb_xy-1] + 1)>>1) <= qp_thresh) + && (top_xy < 0 || ((qp + s->current_picture.qscale_table[top_xy ] + 1)>>1) <= qp_thresh)){ + return 1; + } + } + *((uint64_t*)&h->non_zero_count_cache[0+8*1])= *((uint64_t*)&h->non_zero_count[mb_xy][ 0]); *((uint64_t*)&h->non_zero_count_cache[0+8*2])= *((uint64_t*)&h->non_zero_count[mb_xy][ 8]); *((uint32_t*)&h->non_zero_count_cache[0+8*5])= *((uint32_t*)&h->non_zero_count[mb_xy][16]); @@ -1186,14 +1199,19 @@ static av_always_inline void fill_caches(H264Context *h, int mb_type, int for_de if(!for_deblock) h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[0]); + return 0; } static void fill_decode_caches(H264Context *h, int mb_type){ fill_caches(h, mb_type, 0); } -static void fill_filter_caches(H264Context *h, int mb_type){ - fill_caches(h, mb_type, 1); +/** + * + * @returns non zero if the loop filter can be skiped + */ +static int fill_filter_caches(H264Context *h, int mb_type){ + return fill_caches(h, mb_type, 1); } /** diff --git a/libavcodec/h264_loopfilter.c b/libavcodec/h264_loopfilter.c index f95af66d02..98a5d9e6c3 100644 --- a/libavcodec/h264_loopfilter.c +++ b/libavcodec/h264_loopfilter.c @@ -651,17 +651,6 @@ void ff_h264_filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint av_unused int dir; int list; - //for sufficiently low qp, filtering wouldn't do anything - //this is a conservative estimate: could also check beta_offset and more accurate chroma_qp - if(!FRAME_MBAFF){ - int qp_thresh = h->qp_thresh; - int qp = s->current_picture.qscale_table[mb_xy]; - if(qp <= qp_thresh - && (mb_x == 0 || ((qp + s->current_picture.qscale_table[mb_xy-1] + 1)>>1) <= qp_thresh) - && (h->top_mb_xy < 0 || ((qp + s->current_picture.qscale_table[h->top_mb_xy] + 1)>>1) <= qp_thresh)){ - return; - } - } // CAVLC 8x8dct requires NNZ values for residual decoding that differ from what the loop filter needs if(!h->pps.cabac && h->pps.transform_8x8_mode){ int top_type, left_type[2];