comparison h264_loopfilter.c @ 11499:2a4dc3c0b012 libavcodec

Move H264 dsputil functions into their own struct This moves the H264-specific functions from DSPContext to the new H264DSPContext. The code is made conditional on CONFIG_H264DSP which is set by the codecs requiring it. The qpel and chroma MC functions are not moved as these are used by non-h264 code.
author mru
date Tue, 16 Mar 2010 01:17:00 +0000
parents 98970e51365a
children 7dd2a45249a9
comparison
equal deleted inserted replaced
11498:8e889ce0d616 11499:2a4dc3c0b012
110 int8_t tc[4]; 110 int8_t tc[4];
111 tc[0] = tc0_table[index_a][bS[0]]; 111 tc[0] = tc0_table[index_a][bS[0]];
112 tc[1] = tc0_table[index_a][bS[1]]; 112 tc[1] = tc0_table[index_a][bS[1]];
113 tc[2] = tc0_table[index_a][bS[2]]; 113 tc[2] = tc0_table[index_a][bS[2]];
114 tc[3] = tc0_table[index_a][bS[3]]; 114 tc[3] = tc0_table[index_a][bS[3]];
115 h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc); 115 h->h264dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc);
116 } else { 116 } else {
117 h->s.dsp.h264_h_loop_filter_luma_intra(pix, stride, alpha, beta); 117 h->h264dsp.h264_h_loop_filter_luma_intra(pix, stride, alpha, beta);
118 } 118 }
119 } 119 }
120 static void av_always_inline filter_mb_edgecv( uint8_t *pix, int stride, int16_t bS[4], unsigned int qp, H264Context *h ) { 120 static void av_always_inline filter_mb_edgecv( uint8_t *pix, int stride, int16_t bS[4], unsigned int qp, H264Context *h ) {
121 const unsigned int index_a = qp + h->slice_alpha_c0_offset; 121 const unsigned int index_a = qp + h->slice_alpha_c0_offset;
122 const int alpha = alpha_table[index_a]; 122 const int alpha = alpha_table[index_a];
127 int8_t tc[4]; 127 int8_t tc[4];
128 tc[0] = tc0_table[index_a][bS[0]]+1; 128 tc[0] = tc0_table[index_a][bS[0]]+1;
129 tc[1] = tc0_table[index_a][bS[1]]+1; 129 tc[1] = tc0_table[index_a][bS[1]]+1;
130 tc[2] = tc0_table[index_a][bS[2]]+1; 130 tc[2] = tc0_table[index_a][bS[2]]+1;
131 tc[3] = tc0_table[index_a][bS[3]]+1; 131 tc[3] = tc0_table[index_a][bS[3]]+1;
132 h->s.dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc); 132 h->h264dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc);
133 } else { 133 } else {
134 h->s.dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta); 134 h->h264dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta);
135 } 135 }
136 } 136 }
137 137
138 static void filter_mb_mbaff_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int bsi, int qp ) { 138 static void filter_mb_mbaff_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int bsi, int qp ) {
139 int i; 139 int i;
280 int8_t tc[4]; 280 int8_t tc[4];
281 tc[0] = tc0_table[index_a][bS[0]]; 281 tc[0] = tc0_table[index_a][bS[0]];
282 tc[1] = tc0_table[index_a][bS[1]]; 282 tc[1] = tc0_table[index_a][bS[1]];
283 tc[2] = tc0_table[index_a][bS[2]]; 283 tc[2] = tc0_table[index_a][bS[2]];
284 tc[3] = tc0_table[index_a][bS[3]]; 284 tc[3] = tc0_table[index_a][bS[3]];
285 h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc); 285 h->h264dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc);
286 } else { 286 } else {
287 h->s.dsp.h264_v_loop_filter_luma_intra(pix, stride, alpha, beta); 287 h->h264dsp.h264_v_loop_filter_luma_intra(pix, stride, alpha, beta);
288 } 288 }
289 } 289 }
290 290
291 static void av_always_inline filter_mb_edgech( uint8_t *pix, int stride, int16_t bS[4], unsigned int qp, H264Context *h ) { 291 static void av_always_inline filter_mb_edgech( uint8_t *pix, int stride, int16_t bS[4], unsigned int qp, H264Context *h ) {
292 const unsigned int index_a = qp + h->slice_alpha_c0_offset; 292 const unsigned int index_a = qp + h->slice_alpha_c0_offset;
298 int8_t tc[4]; 298 int8_t tc[4];
299 tc[0] = tc0_table[index_a][bS[0]]+1; 299 tc[0] = tc0_table[index_a][bS[0]]+1;
300 tc[1] = tc0_table[index_a][bS[1]]+1; 300 tc[1] = tc0_table[index_a][bS[1]]+1;
301 tc[2] = tc0_table[index_a][bS[2]]+1; 301 tc[2] = tc0_table[index_a][bS[2]]+1;
302 tc[3] = tc0_table[index_a][bS[3]]+1; 302 tc[3] = tc0_table[index_a][bS[3]]+1;
303 h->s.dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc); 303 h->h264dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc);
304 } else { 304 } else {
305 h->s.dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta); 305 h->h264dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta);
306 } 306 }
307 } 307 }
308 308
309 void ff_h264_filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) { 309 void ff_h264_filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize) {
310 MpegEncContext * const s = &h->s; 310 MpegEncContext * const s = &h->s;
312 int mb_type, left_type; 312 int mb_type, left_type;
313 int qp, qp0, qp1, qpc, qpc0, qpc1, qp_thresh; 313 int qp, qp0, qp1, qpc, qpc0, qpc1, qp_thresh;
314 314
315 mb_xy = h->mb_xy; 315 mb_xy = h->mb_xy;
316 316
317 if(!h->top_type || !s->dsp.h264_loop_filter_strength || h->pps.chroma_qp_diff) { 317 if(!h->top_type || !h->h264dsp.h264_loop_filter_strength || h->pps.chroma_qp_diff) {
318 ff_h264_filter_mb(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize); 318 ff_h264_filter_mb(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize);
319 return; 319 return;
320 } 320 }
321 assert(!FRAME_MBAFF); 321 assert(!FRAME_MBAFF);
322 left_type= h->left_type[0]; 322 left_type= h->left_type[0];
379 } else { 379 } else {
380 int mask_edge1 = (3*(((5*mb_type)>>5)&1)) | (mb_type>>4); //(mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 : (mb_type & MB_TYPE_16x8) ? 1 : 0; 380 int mask_edge1 = (3*(((5*mb_type)>>5)&1)) | (mb_type>>4); //(mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 : (mb_type & MB_TYPE_16x8) ? 1 : 0;
381 int mask_edge0 = 3*((mask_edge1>>1) & ((5*left_type)>>5)&1); // (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) && (h->left_type[0] & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 : 0; 381 int mask_edge0 = 3*((mask_edge1>>1) & ((5*left_type)>>5)&1); // (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) && (h->left_type[0] & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 : 0;
382 int step = 1+(mb_type>>24); //IS_8x8DCT(mb_type) ? 2 : 1; 382 int step = 1+(mb_type>>24); //IS_8x8DCT(mb_type) ? 2 : 1;
383 edges = 4 - 3*((mb_type>>3) & !(h->cbp & 15)); //(mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4; 383 edges = 4 - 3*((mb_type>>3) & !(h->cbp & 15)); //(mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4;
384 s->dsp.h264_loop_filter_strength( bS, h->non_zero_count_cache, h->ref_cache, h->mv_cache, 384 h->h264dsp.h264_loop_filter_strength( bS, h->non_zero_count_cache, h->ref_cache, h->mv_cache,
385 h->list_count==2, edges, step, mask_edge0, mask_edge1, FIELD_PICTURE); 385 h->list_count==2, edges, step, mask_edge0, mask_edge1, FIELD_PICTURE);
386 } 386 }
387 if( IS_INTRA(left_type) ) 387 if( IS_INTRA(left_type) )
388 AV_WN64A(bS[0][0], 0x0004000400040004ULL); 388 AV_WN64A(bS[0][0], 0x0004000400040004ULL);
389 if( IS_INTRA(h->top_type) ) 389 if( IS_INTRA(h->top_type) )