Mercurial > libavcodec.hg
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); |