comparison h264.c @ 12492:58a960d6e34c libavcodec

Rename h264_idct_sse2.asm to h264_idct.asm; move inline IDCT asm from h264dsp_mmx.c to h264_idct.asm (as yasm code). Because the loops are now coded in asm instead of C, this is (depending on the function) up to 50% faster for cases where gcc didn't do a great job at looping. Since h264_idct_add8() is now faster than the manual loop setup in h264.c, in-asm idct calling can now be enabled for chroma as well (see r16207). For MMX, this is 5% faster. For SSE2 (which isn't done for chroma if h264.c does the looping), this makes it up to 50% faster. Speed gain overall is ~0.5-1.0%.
author rbultje
date Tue, 14 Sep 2010 13:36:26 +0000
parents f7bedc1ce1bc
children 7c0dbd8eb53a
comparison
equal deleted inserted replaced
12491:990f8a5fc8af 12492:58a960d6e34c
1316 } 1316 }
1317 }else{ 1317 }else{
1318 chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp[0], h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]); 1318 chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp[0], h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]);
1319 chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp[1], h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]); 1319 chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp[1], h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]);
1320 if(is_h264){ 1320 if(is_h264){
1321 idct_add = h->h264dsp.h264_idct_add; 1321 h->h264dsp.h264_idct_add8(dest, block_offset,
1322 idct_dc_add = h->h264dsp.h264_idct_dc_add; 1322 h->mb, uvlinesize,
1323 for(i=16; i<16+8; i++){ 1323 h->non_zero_count_cache);
1324 if(h->non_zero_count_cache[ scan8[i] ])
1325 idct_add (dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
1326 else if(h->mb[i*16])
1327 idct_dc_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
1328 }
1329 }else{ 1324 }else{
1330 for(i=16; i<16+8; i++){ 1325 for(i=16; i<16+8; i++){
1331 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ 1326 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
1332 uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i]; 1327 uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i];
1333 ff_svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, ff_h264_chroma_qp[s->qscale + 12] - 12, 2); 1328 ff_svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, ff_h264_chroma_qp[s->qscale + 12] - 12, 2);