comparison h264.c @ 8395:195cba8f6257 libavcodec

Move filter_luma_intra into dsputil for later addition of asm.
author darkshikari
date Fri, 19 Dec 2008 00:44:51 +0000
parents a9132c1bd56a
children 11b1f7762830
comparison
equal deleted inserted replaced
8394:a9132c1bd56a 8395:195cba8f6257
5852 int8_t tc[4]; 5852 int8_t tc[4];
5853 for(i=0; i<4; i++) 5853 for(i=0; i<4; i++)
5854 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1; 5854 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
5855 h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc); 5855 h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc);
5856 } else { 5856 } else {
5857 /* 16px edge length, because bS=4 is triggered by being at 5857 h->s.dsp.h264_h_loop_filter_luma_intra(pix, stride, alpha, beta);
5858 * the edge of an intra MB, so all 4 bS are the same */
5859 for( d = 0; d < 16; d++ ) {
5860 const int p0 = pix[-1];
5861 const int p1 = pix[-2];
5862 const int p2 = pix[-3];
5863
5864 const int q0 = pix[0];
5865 const int q1 = pix[1];
5866 const int q2 = pix[2];
5867
5868 if( FFABS( p0 - q0 ) < alpha &&
5869 FFABS( p1 - p0 ) < beta &&
5870 FFABS( q1 - q0 ) < beta ) {
5871
5872 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
5873 if( FFABS( p2 - p0 ) < beta)
5874 {
5875 const int p3 = pix[-4];
5876 /* p0', p1', p2' */
5877 pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
5878 pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
5879 pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
5880 } else {
5881 /* p0' */
5882 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
5883 }
5884 if( FFABS( q2 - q0 ) < beta)
5885 {
5886 const int q3 = pix[3];
5887 /* q0', q1', q2' */
5888 pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
5889 pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
5890 pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
5891 } else {
5892 /* q0' */
5893 pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
5894 }
5895 }else{
5896 /* p0', q0' */
5897 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
5898 pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
5899 }
5900 tprintf(h->s.avctx, "filter_mb_edgev i:%d d:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, p2, p1, p0, q0, q1, q2, pix[-2], pix[-1], pix[0], pix[1]);
5901 }
5902 pix += stride;
5903 }
5904 } 5858 }
5905 } 5859 }
5906 static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { 5860 static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
5907 int i; 5861 int i;
5908 const int index_a = qp + h->slice_alpha_c0_offset; 5862 const int index_a = qp + h->slice_alpha_c0_offset;
6081 int8_t tc[4]; 6035 int8_t tc[4];
6082 for(i=0; i<4; i++) 6036 for(i=0; i<4; i++)
6083 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1; 6037 tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
6084 h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc); 6038 h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc);
6085 } else { 6039 } else {
6086 /* 16px edge length, see filter_mb_edgev */ 6040 h->s.dsp.h264_v_loop_filter_luma_intra(pix, stride, alpha, beta);
6087 for( d = 0; d < 16; d++ ) {
6088 const int p0 = pix[-1*pix_next];
6089 const int p1 = pix[-2*pix_next];
6090 const int p2 = pix[-3*pix_next];
6091 const int q0 = pix[0];
6092 const int q1 = pix[1*pix_next];
6093 const int q2 = pix[2*pix_next];
6094
6095 if( FFABS( p0 - q0 ) < alpha &&
6096 FFABS( p1 - p0 ) < beta &&
6097 FFABS( q1 - q0 ) < beta ) {
6098
6099 const int p3 = pix[-4*pix_next];
6100 const int q3 = pix[ 3*pix_next];
6101
6102 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
6103 if( FFABS( p2 - p0 ) < beta) {
6104 /* p0', p1', p2' */
6105 pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
6106 pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
6107 pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
6108 } else {
6109 /* p0' */
6110 pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
6111 }
6112 if( FFABS( q2 - q0 ) < beta) {
6113 /* q0', q1', q2' */
6114 pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
6115 pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
6116 pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
6117 } else {
6118 /* q0' */
6119 pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
6120 }
6121 }else{
6122 /* p0', q0' */
6123 pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
6124 pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
6125 }
6126 tprintf(h->s.avctx, "filter_mb_edgeh i:%d d:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, qp, index_a, alpha, beta, bS[i], p2, p1, p0, q0, q1, q2, pix[-2*pix_next], pix[-pix_next], pix[0], pix[pix_next]);
6127 }
6128 pix++;
6129 }
6130 } 6041 }
6131 } 6042 }
6132 6043
6133 static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) { 6044 static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
6134 int i; 6045 int i;