comparison h264_cabac.c @ 11170:d092ec99cb59 libavcodec

Merge decode_cabac_mb_dqp() with surronding code. ~20 cpu cycles faster
author michael
date Sun, 14 Feb 2010 23:06:25 +0000
parents a820571a6712
children 57a27888f388
comparison
equal deleted inserted replaced
11169:e251be458ac3 11170:d092ec99cb59
896 ctx = 4; 896 ctx = 4;
897 if( cbp_a == 2 ) ctx++; 897 if( cbp_a == 2 ) ctx++;
898 if( cbp_b == 2 ) ctx += 2; 898 if( cbp_b == 2 ) ctx += 2;
899 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ); 899 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
900 } 900 }
901 static int decode_cabac_mb_dqp( H264Context *h) { 901
902 int ctx= h->last_qscale_diff != 0;
903 int val = 0;
904
905 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
906 ctx= 2+(ctx>>1);
907 val++;
908 if(val > 102) //prevent infinite loop
909 return INT_MIN;
910 }
911
912 if( val&0x01 )
913 return (val + 1)>>1 ;
914 else
915 return -((val + 1)>>1);
916 }
917 static int decode_cabac_p_mb_sub_type( H264Context *h ) { 902 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
918 if( get_cabac( &h->cabac, &h->cabac_state[21] ) ) 903 if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
919 return 0; /* 8x8 */ 904 return 0; /* 8x8 */
920 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) ) 905 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
921 return 1; /* 8x4 */ 906 return 1; /* 8x4 */
1670 s->current_picture.mb_type[mb_xy]= mb_type; 1655 s->current_picture.mb_type[mb_xy]= mb_type;
1671 1656
1672 if( cbp || IS_INTRA16x16( mb_type ) ) { 1657 if( cbp || IS_INTRA16x16( mb_type ) ) {
1673 const uint8_t *scan, *scan8x8, *dc_scan; 1658 const uint8_t *scan, *scan8x8, *dc_scan;
1674 const uint32_t *qmul; 1659 const uint32_t *qmul;
1675 int dqp;
1676 1660
1677 if(IS_INTERLACED(mb_type)){ 1661 if(IS_INTERLACED(mb_type)){
1678 scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0; 1662 scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
1679 scan= s->qscale ? h->field_scan : h->field_scan_q0; 1663 scan= s->qscale ? h->field_scan : h->field_scan_q0;
1680 dc_scan= luma_dc_field_scan; 1664 dc_scan= luma_dc_field_scan;
1682 scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0; 1666 scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
1683 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0; 1667 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
1684 dc_scan= luma_dc_zigzag_scan; 1668 dc_scan= luma_dc_zigzag_scan;
1685 } 1669 }
1686 1670
1687 h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h ); 1671 // decode_cabac_mb_dqp
1688 if( dqp == INT_MIN ){ 1672 if(get_cabac_noinline( &h->cabac, &h->cabac_state[60 + (h->last_qscale_diff != 0)])){
1689 av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y); 1673 int val = 1;
1690 return -1; 1674 int ctx= 2;
1691 } 1675
1692 s->qscale += dqp; 1676 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
1677 ctx= 3;
1678 val++;
1679 if(val > 102){ //prevent infinite loop
1680 av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
1681 return -1;
1682 }
1683 }
1684
1685 if( val&0x01 )
1686 val= (val + 1)>>1 ;
1687 else
1688 val= -((val + 1)>>1);
1689 h->last_qscale_diff = val;
1690 s->qscale += val;
1693 if(((unsigned)s->qscale) > 51){ 1691 if(((unsigned)s->qscale) > 51){
1694 if(s->qscale<0) s->qscale+= 52; 1692 if(s->qscale<0) s->qscale+= 52;
1695 else s->qscale-= 52; 1693 else s->qscale-= 52;
1696 } 1694 }
1697 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); 1695 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
1698 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); 1696 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
1697 }else
1698 h->last_qscale_diff=0;
1699 1699
1700 if( IS_INTRA16x16( mb_type ) ) { 1700 if( IS_INTRA16x16( mb_type ) ) {
1701 int i; 1701 int i;
1702 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" ); 1702 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
1703 decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16); 1703 decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16);