h264.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:321k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1.     /* map node ctx => cabac ctx for level>1 */
  2.     static const uint8_t coeff_abs_levelgt1_ctx[8] = { 5, 5, 5, 5, 6, 7, 8, 9 };
  3.     static const uint8_t coeff_abs_level_transition[2][8] = {
  4.     /* update node ctx after decoding a level=1 */
  5.         { 1, 2, 3, 3, 4, 5, 6, 7 },
  6.     /* update node ctx after decoding a level>1 */
  7.         { 4, 4, 4, 4, 5, 6, 7, 7 }
  8.     };
  9.     int index[64];
  10.     int av_unused last;
  11.     int coeff_count = 0;
  12.     int node_ctx = 0;
  13.     uint8_t *significant_coeff_ctx_base;
  14.     uint8_t *last_coeff_ctx_base;
  15.     uint8_t *abs_level_m1_ctx_base;
  16. #ifndef ARCH_X86
  17. #define CABAC_ON_STACK
  18. #endif
  19. #ifdef CABAC_ON_STACK
  20. #define CC &cc
  21.     CABACContext cc;
  22.     cc.range     = h->cabac.range;
  23.     cc.low       = h->cabac.low;
  24.     cc.bytestream= h->cabac.bytestream;
  25. #else
  26. #define CC &h->cabac
  27. #endif
  28.     /* cat: 0-> DC 16x16  n = 0
  29.      *      1-> AC 16x16  n = luma4x4idx
  30.      *      2-> Luma4x4   n = luma4x4idx
  31.      *      3-> DC Chroma n = iCbCr
  32.      *      4-> AC Chroma n = 4 * iCbCr + chroma4x4idx
  33.      *      5-> Luma8x8   n = 4 * luma8x8idx
  34.      */
  35.     /* read coded block flag */
  36.     if( cat != 5 ) {
  37.         if( get_cabac( CC, &h->cabac_state[85 + get_cabac_cbf_ctx( h, cat, n ) ] ) == 0 ) {
  38.             if( cat == 1 || cat == 2 )
  39.                 h->non_zero_count_cache[scan8[n]] = 0;
  40.             else if( cat == 4 )
  41.                 h->non_zero_count_cache[scan8[16+n]] = 0;
  42. #ifdef CABAC_ON_STACK
  43.             h->cabac.range     = cc.range     ;
  44.             h->cabac.low       = cc.low       ;
  45.             h->cabac.bytestream= cc.bytestream;
  46. #endif
  47.             return;
  48.         }
  49.     }
  50.     significant_coeff_ctx_base = h->cabac_state
  51.         + significant_coeff_flag_offset[MB_FIELD][cat];
  52.     last_coeff_ctx_base = h->cabac_state
  53.         + last_coeff_flag_offset[MB_FIELD][cat];
  54.     abs_level_m1_ctx_base = h->cabac_state
  55.         + coeff_abs_level_m1_offset[cat];
  56.     if( cat == 5 ) {
  57. #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) 
  58.         for(last= 0; last < coefs; last++) { 
  59.             uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; 
  60.             if( get_cabac( CC, sig_ctx )) { 
  61.                 uint8_t *last_ctx = last_coeff_ctx_base + last_off; 
  62.                 index[coeff_count++] = last; 
  63.                 if( get_cabac( CC, last_ctx ) ) { 
  64.                     last= max_coeff; 
  65.                     break; 
  66.                 } 
  67.             } 
  68.         }
  69.         if( last == max_coeff -1 ) {
  70.             index[coeff_count++] = last;
  71.         }
  72.         const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
  73. #if defined(ARCH_X86) && defined(HAVE_7REGS) && defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS)
  74.         coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, sig_off);
  75.     } else {
  76.         coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index);
  77. #else
  78.         DECODE_SIGNIFICANCE( 63, sig_off[last], last_coeff_flag_offset_8x8[last] );
  79.     } else {
  80.         DECODE_SIGNIFICANCE( max_coeff - 1, last, last );
  81. #endif
  82.     }
  83.     assert(coeff_count > 0);
  84.     if( cat == 0 )
  85.         h->cbp_table[h->mb_xy] |= 0x100;
  86.     else if( cat == 1 || cat == 2 )
  87.         h->non_zero_count_cache[scan8[n]] = coeff_count;
  88.     else if( cat == 3 )
  89.         h->cbp_table[h->mb_xy] |= 0x40 << n;
  90.     else if( cat == 4 )
  91.         h->non_zero_count_cache[scan8[16+n]] = coeff_count;
  92.     else {
  93.         assert( cat == 5 );
  94.         fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
  95.     }
  96.     for( coeff_count--; coeff_count >= 0; coeff_count-- ) {
  97.         uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base;
  98.         int j= scantable[index[coeff_count]];
  99.         if( get_cabac( CC, ctx ) == 0 ) {
  100.             node_ctx = coeff_abs_level_transition[0][node_ctx];
  101.             if( !qmul ) {
  102.                 block[j] = get_cabac_bypass_sign( CC, -1);
  103.             }else{
  104.                 block[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6;
  105.             }
  106.         } else {
  107.             int coeff_abs = 2;
  108.             ctx = coeff_abs_levelgt1_ctx[node_ctx] + abs_level_m1_ctx_base;
  109.             node_ctx = coeff_abs_level_transition[1][node_ctx];
  110.             while( coeff_abs < 15 && get_cabac( CC, ctx ) ) {
  111.                 coeff_abs++;
  112.             }
  113.             if( coeff_abs >= 15 ) {
  114.                 int j = 0;
  115.                 while( get_cabac_bypass( CC ) ) {
  116.                     j++;
  117.                 }
  118.                 coeff_abs=1;
  119.                 while( j-- ) {
  120.                     coeff_abs += coeff_abs + get_cabac_bypass( CC );
  121.                 }
  122.                 coeff_abs+= 14;
  123.             }
  124.             if( !qmul ) {
  125.                 if( get_cabac_bypass( CC ) ) block[j] = -coeff_abs;
  126.                 else                                block[j] =  coeff_abs;
  127.             }else{
  128.                 if( get_cabac_bypass( CC ) ) block[j] = (-coeff_abs * qmul[j] + 32) >> 6;
  129.                 else                                block[j] = ( coeff_abs * qmul[j] + 32) >> 6;
  130.             }
  131.         }
  132.     }
  133. #ifdef CABAC_ON_STACK
  134.             h->cabac.range     = cc.range     ;
  135.             h->cabac.low       = cc.low       ;
  136.             h->cabac.bytestream= cc.bytestream;
  137. #endif
  138. }
  139. static inline void compute_mb_neighbors(H264Context *h)
  140. {
  141.     MpegEncContext * const s = &h->s;
  142.     const int mb_xy  = h->mb_xy;
  143.     h->top_mb_xy     = mb_xy - s->mb_stride;
  144.     h->left_mb_xy[0] = mb_xy - 1;
  145.     if(FRAME_MBAFF){
  146.         const int pair_xy          = s->mb_x     + (s->mb_y & ~1)*s->mb_stride;
  147.         const int top_pair_xy      = pair_xy     - s->mb_stride;
  148.         const int top_mb_frame_flag      = !IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]);
  149.         const int left_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]);
  150.         const int curr_mb_frame_flag = !MB_FIELD;
  151.         const int bottom = (s->mb_y & 1);
  152.         if (bottom
  153.                 ? !curr_mb_frame_flag // bottom macroblock
  154.                 : (!curr_mb_frame_flag && !top_mb_frame_flag) // top macroblock
  155.                 ) {
  156.             h->top_mb_xy -= s->mb_stride;
  157.         }
  158.         if (left_mb_frame_flag != curr_mb_frame_flag) {
  159.             h->left_mb_xy[0] = pair_xy - 1;
  160.         }
  161.     } else if (FIELD_PICTURE) {
  162.         h->top_mb_xy -= s->mb_stride;
  163.     }
  164.     return;
  165. }
  166. /**
  167.  * decodes a macroblock
  168.  * @returns 0 if ok, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
  169.  */
  170. static int decode_mb_cabac(H264Context *h) {
  171.     MpegEncContext * const s = &h->s;
  172.     int mb_xy;
  173.     int mb_type, partition_count, cbp = 0;
  174.     int dct8x8_allowed= h->pps.transform_8x8_mode;
  175.     mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
  176.     s->dsp.clear_blocks(h->mb); //FIXME avoid if already clear (move after skip handlong?)
  177.     tprintf(s->avctx, "pic:%d mb:%d/%dn", h->frame_num, s->mb_x, s->mb_y);
  178.     if( h->slice_type != FF_I_TYPE && h->slice_type != FF_SI_TYPE ) {
  179.         int skip;
  180.         /* a skipped mb needs the aff flag from the following mb */
  181.         if( FRAME_MBAFF && s->mb_x==0 && (s->mb_y&1)==0 )
  182.             predict_field_decoding_flag(h);
  183.         if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped )
  184.             skip = h->next_mb_skipped;
  185.         else
  186.             skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y );
  187.         /* read skip flags */
  188.         if( skip ) {
  189.             if( FRAME_MBAFF && (s->mb_y&1)==0 ){
  190.                 s->current_picture.mb_type[mb_xy] = MB_TYPE_SKIP;
  191.                 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 );
  192.                 if(h->next_mb_skipped)
  193.                     predict_field_decoding_flag(h);
  194.                 else
  195.                     h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
  196.             }
  197.             decode_mb_skip(h);
  198.             h->cbp_table[mb_xy] = 0;
  199.             h->chroma_pred_mode_table[mb_xy] = 0;
  200.             h->last_qscale_diff = 0;
  201.             return 0;
  202.         }
  203.     }
  204.     if(FRAME_MBAFF){
  205.         if( (s->mb_y&1) == 0 )
  206.             h->mb_mbaff =
  207.             h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
  208.     }else
  209.         h->mb_field_decoding_flag= (s->picture_structure!=PICT_FRAME);
  210.     h->prev_mb_skipped = 0;
  211.     compute_mb_neighbors(h);
  212.     if( ( mb_type = decode_cabac_mb_type( h ) ) < 0 ) {
  213.         av_log( h->s.avctx, AV_LOG_ERROR, "decode_cabac_mb_type failedn" );
  214.         return -1;
  215.     }
  216.     if( h->slice_type == FF_B_TYPE ) {
  217.         if( mb_type < 23 ){
  218.             partition_count= b_mb_type_info[mb_type].partition_count;
  219.             mb_type=         b_mb_type_info[mb_type].type;
  220.         }else{
  221.             mb_type -= 23;
  222.             goto decode_intra_mb;
  223.         }
  224.     } else if( h->slice_type == FF_P_TYPE ) {
  225.         if( mb_type < 5) {
  226.             partition_count= p_mb_type_info[mb_type].partition_count;
  227.             mb_type=         p_mb_type_info[mb_type].type;
  228.         } else {
  229.             mb_type -= 5;
  230.             goto decode_intra_mb;
  231.         }
  232.     } else {
  233.        assert(h->slice_type == FF_I_TYPE);
  234. decode_intra_mb:
  235.         partition_count = 0;
  236.         cbp= i_mb_type_info[mb_type].cbp;
  237.         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
  238.         mb_type= i_mb_type_info[mb_type].type;
  239.     }
  240.     if(MB_FIELD)
  241.         mb_type |= MB_TYPE_INTERLACED;
  242.     h->slice_table[ mb_xy ]= h->slice_num;
  243.     if(IS_INTRA_PCM(mb_type)) {
  244.         const uint8_t *ptr;
  245.         unsigned int x, y;
  246.         // We assume these blocks are very rare so we do not optimize it.
  247.         // FIXME The two following lines get the bitstream position in the cabac
  248.         // decode, I think it should be done by a function in cabac.h (or cabac.c).
  249.         ptr= h->cabac.bytestream;
  250.         if(h->cabac.low&0x1) ptr--;
  251.         if(CABAC_BITS==16){
  252.             if(h->cabac.low&0x1FF) ptr--;
  253.         }
  254.         // The pixels are stored in the same order as levels in h->mb array.
  255.         for(y=0; y<16; y++){
  256.             const int index= 4*(y&3) + 32*((y>>2)&1) + 128*(y>>3);
  257.             for(x=0; x<16; x++){
  258.                 tprintf(s->avctx, "LUMA ICPM LEVEL (%3d)n", *ptr);
  259.                 h->mb[index + (x&3) + 16*((x>>2)&1) + 64*(x>>3)]= *ptr++;
  260.             }
  261.         }
  262.         for(y=0; y<8; y++){
  263.             const int index= 256 + 4*(y&3) + 32*(y>>2);
  264.             for(x=0; x<8; x++){
  265.                 tprintf(s->avctx, "CHROMA U ICPM LEVEL (%3d)n", *ptr);
  266.                 h->mb[index + (x&3) + 16*(x>>2)]= *ptr++;
  267.             }
  268.         }
  269.         for(y=0; y<8; y++){
  270.             const int index= 256 + 64 + 4*(y&3) + 32*(y>>2);
  271.             for(x=0; x<8; x++){
  272.                 tprintf(s->avctx, "CHROMA V ICPM LEVEL (%3d)n", *ptr);
  273.                 h->mb[index + (x&3) + 16*(x>>2)]= *ptr++;
  274.             }
  275.         }
  276.         ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
  277.         // All blocks are present
  278.         h->cbp_table[mb_xy] = 0x1ef;
  279.         h->chroma_pred_mode_table[mb_xy] = 0;
  280.         // In deblocking, the quantizer is 0
  281.         s->current_picture.qscale_table[mb_xy]= 0;
  282.         h->chroma_qp[0] = get_chroma_qp(h, 0, 0);
  283.         h->chroma_qp[1] = get_chroma_qp(h, 1, 0);
  284.         // All coeffs are present
  285.         memset(h->non_zero_count[mb_xy], 16, 16);
  286.         s->current_picture.mb_type[mb_xy]= mb_type;
  287.         return 0;
  288.     }
  289.     if(MB_MBAFF){
  290.         h->ref_count[0] <<= 1;
  291.         h->ref_count[1] <<= 1;
  292.     }
  293.     fill_caches(h, mb_type, 0);
  294.     if( IS_INTRA( mb_type ) ) {
  295.         int i, pred_mode;
  296.         if( IS_INTRA4x4( mb_type ) ) {
  297.             if( dct8x8_allowed && decode_cabac_mb_transform_size( h ) ) {
  298.                 mb_type |= MB_TYPE_8x8DCT;
  299.                 for( i = 0; i < 16; i+=4 ) {
  300.                     int pred = pred_intra_mode( h, i );
  301.                     int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
  302.                     fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
  303.                 }
  304.             } else {
  305.                 for( i = 0; i < 16; i++ ) {
  306.                     int pred = pred_intra_mode( h, i );
  307.                     h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
  308.               #ifdef TRACE
  309.                 av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%dn", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] );
  310. #endif
  311. }
  312.             }
  313.             write_back_intra_pred_mode(h);
  314.             if( check_intra4x4_pred_mode(h) < 0 ) return -1;
  315.         } else {
  316.             h->intra16x16_pred_mode= check_intra_pred_mode( h, h->intra16x16_pred_mode );
  317.             if( h->intra16x16_pred_mode < 0 ) return -1;
  318.         }
  319.         h->chroma_pred_mode_table[mb_xy] =
  320.         pred_mode                        = decode_cabac_mb_chroma_pre_mode( h );
  321.         pred_mode= check_intra_pred_mode( h, pred_mode );
  322.         if( pred_mode < 0 ) return -1;
  323.         h->chroma_pred_mode= pred_mode;
  324.     } else if( partition_count == 4 ) {
  325.         int i, j, sub_partition_count[4], list, ref[2][4];
  326.         if( h->slice_type == FF_B_TYPE ) {
  327.             for( i = 0; i < 4; i++ ) {
  328.                 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
  329.                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
  330.                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
  331.             }
  332.             if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
  333.                           h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
  334.                 pred_direct_motion(h, &mb_type);
  335.                 h->ref_cache[0][scan8[4]] =
  336.                 h->ref_cache[1][scan8[4]] =
  337.                 h->ref_cache[0][scan8[12]] =
  338.                 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
  339.                 if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) {
  340.                     for( i = 0; i < 4; i++ )
  341.                         if( IS_DIRECT(h->sub_mb_type[i]) )
  342.                             fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, 1, 1 );
  343.                 }
  344.             }
  345.         } else {
  346.             for( i = 0; i < 4; i++ ) {
  347.                 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
  348.                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
  349.                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
  350.             }
  351.         }
  352.         for( list = 0; list < h->list_count; list++ ) {
  353.                 for( i = 0; i < 4; i++ ) {
  354.                     if(IS_DIRECT(h->sub_mb_type[i])) continue;
  355.                     if(IS_DIR(h->sub_mb_type[i], 0, list)){
  356.                         if( h->ref_count[list] > 1 )
  357.                             ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
  358.                         else
  359.                             ref[list][i] = 0;
  360.                     } else {
  361.                         ref[list][i] = -1;
  362.                     }
  363.                                                        h->ref_cache[list][ scan8[4*i]+1 ]=
  364.                     h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
  365.                 }
  366.         }
  367.         if(dct8x8_allowed)
  368.             dct8x8_allowed = get_dct8x8_allowed(h);
  369.         for(list=0; list<h->list_count; list++){
  370.             for(i=0; i<4; i++){
  371.                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ];
  372.                 if(IS_DIRECT(h->sub_mb_type[i])){
  373.                     fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 4);
  374.                     continue;
  375.                 }
  376.                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
  377.                     const int sub_mb_type= h->sub_mb_type[i];
  378.                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
  379.                     for(j=0; j<sub_partition_count[i]; j++){
  380.                         int mpx, mpy;
  381.                         int mx, my;
  382.                         const int index= 4*i + block_width*j;
  383.                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
  384.                         int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
  385.                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mpx, &mpy);
  386.                         mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 );
  387.                         my = mpy + decode_cabac_mb_mvd( h, list, index, 1 );
  388.                         tprintf(s->avctx, "final mv:%d %dn", mx, my);
  389.                         if(IS_SUB_8X8(sub_mb_type)){
  390.                             mv_cache[ 1 ][0]=
  391.                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
  392.                             mv_cache[ 1 ][1]=
  393.                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
  394.                             mvd_cache[ 1 ][0]=
  395.                             mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx;
  396.                             mvd_cache[ 1 ][1]=
  397.                             mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy;
  398.                         }else if(IS_SUB_8X4(sub_mb_type)){
  399.                             mv_cache[ 1 ][0]= mx;
  400.                             mv_cache[ 1 ][1]= my;
  401.                             mvd_cache[ 1 ][0]= mx - mpx;
  402.                             mvd_cache[ 1 ][1]= my - mpy;
  403.                         }else if(IS_SUB_4X8(sub_mb_type)){
  404.                             mv_cache[ 8 ][0]= mx;
  405.                             mv_cache[ 8 ][1]= my;
  406.                             mvd_cache[ 8 ][0]= mx - mpx;
  407.                             mvd_cache[ 8 ][1]= my - mpy;
  408.                         }
  409.                         mv_cache[ 0 ][0]= mx;
  410.                         mv_cache[ 0 ][1]= my;
  411.                         mvd_cache[ 0 ][0]= mx - mpx;
  412.                         mvd_cache[ 0 ][1]= my - mpy;
  413.                     }
  414.                 }else{
  415.                     uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
  416.                     uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][0];
  417.                     p[0] = p[1] = p[8] = p[9] = 0;
  418.                     pd[0]= pd[1]= pd[8]= pd[9]= 0;
  419.                 }
  420.             }
  421.         }
  422.     } else if( IS_DIRECT(mb_type) ) {
  423.         pred_direct_motion(h, &mb_type);
  424.         fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4);
  425.         fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4);
  426.         dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
  427.     } else {
  428.         int list, mx, my, i, mpx, mpy;
  429.         if(IS_16X16(mb_type)){
  430.             for(list=0; list<h->list_count; list++){
  431.                 if(IS_DIR(mb_type, 0, list)){
  432.                         const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0;
  433.                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
  434.                 }else
  435.                     fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); //FIXME factorize and the other fill_rect below too
  436.             }
  437.             for(list=0; list<h->list_count; list++){
  438.                 if(IS_DIR(mb_type, 0, list)){
  439.                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy);
  440.                     mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 );
  441.                     my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 );
  442.                     tprintf(s->avctx, "final mv:%d %dn", mx, my);
  443.                     fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
  444.                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
  445.                 }else
  446.                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4);
  447.             }
  448.         }
  449.         else if(IS_16X8(mb_type)){
  450.             for(list=0; list<h->list_count; list++){
  451.                     for(i=0; i<2; i++){
  452.                         if(IS_DIR(mb_type, i, list)){
  453.                             const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 8*i ) : 0;
  454.                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
  455.                         }else
  456.                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
  457.                     }
  458.             }
  459.             for(list=0; list<h->list_count; list++){
  460.                 for(i=0; i<2; i++){
  461.                     if(IS_DIR(mb_type, i, list)){
  462.                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mpx, &mpy);
  463.                         mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 );
  464.                         my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 );
  465.                         tprintf(s->avctx, "final mv:%d %dn", mx, my);
  466.                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4);
  467.                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
  468.                     }else{
  469.                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
  470.                         fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
  471.                     }
  472.                 }
  473.             }
  474.         }else{
  475.             assert(IS_8X16(mb_type));
  476.             for(list=0; list<h->list_count; list++){
  477.                     for(i=0; i<2; i++){
  478.                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
  479.                             const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 4*i ) : 0;
  480.                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
  481.                         }else
  482.                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
  483.                     }
  484.             }
  485.             for(list=0; list<h->list_count; list++){
  486.                 for(i=0; i<2; i++){
  487.                     if(IS_DIR(mb_type, i, list)){
  488.                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mpx, &mpy);
  489.                         mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 );
  490.                         my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 );
  491.                         tprintf(s->avctx, "final mv:%d %dn", mx, my);
  492.                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
  493.                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
  494.                     }else{
  495.                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
  496.                         fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
  497.                     }
  498.                 }
  499.             }
  500.         }
  501.     }
  502.    if( IS_INTER( mb_type ) ) {
  503.         h->chroma_pred_mode_table[mb_xy] = 0;
  504.         write_back_motion( h, mb_type );
  505.    }
  506.     if( !IS_INTRA16x16( mb_type ) ) {
  507.         cbp  = decode_cabac_mb_cbp_luma( h );
  508.         cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
  509.     }
  510.     h->cbp_table[mb_xy] = h->cbp = cbp;
  511.     if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
  512.         if( decode_cabac_mb_transform_size( h ) )
  513.             mb_type |= MB_TYPE_8x8DCT;
  514.     }
  515.     s->current_picture.mb_type[mb_xy]= mb_type;
  516.     if( cbp || IS_INTRA16x16( mb_type ) ) {
  517.         const uint8_t *scan, *scan8x8, *dc_scan;
  518.         const uint32_t *qmul;
  519.         int dqp;
  520.         if(IS_INTERLACED(mb_type)){
  521.             scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
  522.             scan= s->qscale ? h->field_scan : h->field_scan_q0;
  523.             dc_scan= luma_dc_field_scan;
  524.         }else{
  525.             scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
  526.             scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
  527.             dc_scan= luma_dc_zigzag_scan;
  528.         }
  529.         h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h );
  530.         if( dqp == INT_MIN ){
  531.             av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %dn", s->mb_x, s->mb_y);
  532.             return -1;
  533.         }
  534.         s->qscale += dqp;
  535.         if(((unsigned)s->qscale) > 51){
  536.             if(s->qscale<0) s->qscale+= 52;
  537.             else            s->qscale-= 52;
  538.         }
  539.         h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
  540.         h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
  541.         if( IS_INTRA16x16( mb_type ) ) {
  542.             int i;
  543.             //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DCn" );
  544.             decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16);
  545.             if( cbp&15 ) {
  546.                 qmul = h->dequant4_coeff[0][s->qscale];
  547.                 for( i = 0; i < 16; i++ ) {
  548.                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%dn", i );
  549.                     decode_cabac_residual(h, h->mb + 16*i, 1, i, scan + 1, qmul, 15);
  550.                 }
  551.             } else {
  552.                 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
  553.             }
  554.         } else {
  555.             int i8x8, i4x4;
  556.             for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
  557.                 if( cbp & (1<<i8x8) ) {
  558.                     if( IS_8x8DCT(mb_type) ) {
  559.                         decode_cabac_residual(h, h->mb + 64*i8x8, 5, 4*i8x8,
  560.                             scan8x8, h->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][s->qscale], 64);
  561.                     } else {
  562.                         qmul = h->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][s->qscale];
  563.                         for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
  564.                             const int index = 4*i8x8 + i4x4;
  565.                             //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %dn", index );
  566. //START_TIMER
  567.                             decode_cabac_residual(h, h->mb + 16*index, 2, index, scan, qmul, 16);
  568. //STOP_TIMER("decode_residual")
  569.                         }
  570.                     }
  571.                 } else {
  572.                     uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
  573.                     nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
  574.                 }
  575.             }
  576.         }
  577.         if( cbp&0x30 ){
  578.             int c;
  579.             for( c = 0; c < 2; c++ ) {
  580.                 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DCn",c );
  581.                 decode_cabac_residual(h, h->mb + 256 + 16*4*c, 3, c, chroma_dc_scan, NULL, 4);
  582.             }
  583.         }
  584.         if( cbp&0x20 ) {
  585.             int c, i;
  586.             for( c = 0; c < 2; c++ ) {
  587.                 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
  588.                 for( i = 0; i < 4; i++ ) {
  589.                     const int index = 16 + 4 * c + i;
  590.                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %dn",c, index - 16 );
  591.                     decode_cabac_residual(h, h->mb + 16*index, 4, index - 16, scan + 1, qmul, 15);
  592.                 }
  593.             }
  594.         } else {
  595.             uint8_t * const nnz= &h->non_zero_count_cache[0];
  596.             nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
  597.             nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
  598.         }
  599.     } else {
  600.         uint8_t * const nnz= &h->non_zero_count_cache[0];
  601.         fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1);
  602.         nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
  603.         nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
  604.         h->last_qscale_diff = 0;
  605.     }
  606.     s->current_picture.qscale_table[mb_xy]= s->qscale;
  607.     write_back_non_zero_count(h);
  608.     if(MB_MBAFF){
  609.         h->ref_count[0] >>= 1;
  610.         h->ref_count[1] >>= 1;
  611.     }
  612.     return 0;
  613. }
  614. static void filter_mb_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
  615.     int i, d;
  616.     const int index_a = qp + h->slice_alpha_c0_offset;
  617.     const int alpha = (alpha_table+52)[index_a];
  618.     const int beta  = (beta_table+52)[qp + h->slice_beta_offset];
  619.     if( bS[0] < 4 ) {
  620.         int8_t tc[4];
  621.         for(i=0; i<4; i++)
  622.             tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
  623.         h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc);
  624.     } else {
  625.         /* 16px edge length, because bS=4 is triggered by being at
  626.          * the edge of an intra MB, so all 4 bS are the same */
  627.             for( d = 0; d < 16; d++ ) {
  628.                 const int p0 = pix[-1];
  629.                 const int p1 = pix[-2];
  630.                 const int p2 = pix[-3];
  631.                 const int q0 = pix[0];
  632.                 const int q1 = pix[1];
  633.                 const int q2 = pix[2];
  634.                 if( FFABS( p0 - q0 ) < alpha &&
  635.                     FFABS( p1 - p0 ) < beta &&
  636.                     FFABS( q1 - q0 ) < beta ) {
  637.                     if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
  638.                         if( FFABS( p2 - p0 ) < beta)
  639.                         {
  640.                             const int p3 = pix[-4];
  641.                             /* p0', p1', p2' */
  642.                             pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
  643.                             pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
  644.                             pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
  645.                         } else {
  646.                             /* p0' */
  647.                             pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  648.                         }
  649.                         if( FFABS( q2 - q0 ) < beta)
  650.                         {
  651.                             const int q3 = pix[3];
  652.                             /* q0', q1', q2' */
  653.                             pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
  654.                             pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
  655.                             pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
  656.                         } else {
  657.                             /* q0' */
  658.                             pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  659.                         }
  660.                     }else{
  661.                         /* p0', q0' */
  662.                         pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  663.                         pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  664.                     }
  665.                     tprintf(h->s.avctx, "filter_mb_edgev i:%d d:%dn# 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]);
  666.                 }
  667.                 pix += stride;
  668.             }
  669.     }
  670. }
  671. static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
  672.     int i;
  673.     const int index_a = qp + h->slice_alpha_c0_offset;
  674.     const int alpha = (alpha_table+52)[index_a];
  675.     const int beta  = (beta_table+52)[qp + h->slice_beta_offset];
  676.     if( bS[0] < 4 ) {
  677.         int8_t tc[4];
  678.         for(i=0; i<4; i++)
  679.             tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0;
  680.         h->s.dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc);
  681.     } else {
  682.         h->s.dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta);
  683.     }
  684. }
  685. static void filter_mb_mbaff_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[8], int qp[2] ) {
  686.     int i;
  687.     for( i = 0; i < 16; i++, pix += stride) {
  688.         int index_a;
  689.         int alpha;
  690.         int beta;
  691.         int qp_index;
  692.         int bS_index = (i >> 1);
  693.         if (!MB_FIELD) {
  694.             bS_index &= ~1;
  695.             bS_index |= (i & 1);
  696.         }
  697.         if( bS[bS_index] == 0 ) {
  698.             continue;
  699.         }
  700.         qp_index = MB_FIELD ? (i >> 3) : (i & 1);
  701.         index_a = qp[qp_index] + h->slice_alpha_c0_offset;
  702.         alpha = (alpha_table+52)[index_a];
  703.         beta  = (beta_table+52)[qp[qp_index] + h->slice_beta_offset];
  704.         if( bS[bS_index] < 4 ) {
  705.             const int tc0 = (tc0_table+52)[index_a][bS[bS_index] - 1];
  706.             const int p0 = pix[-1];
  707.             const int p1 = pix[-2];
  708.             const int p2 = pix[-3];
  709.             const int q0 = pix[0];
  710.             const int q1 = pix[1];
  711.             const int q2 = pix[2];
  712.             if( FFABS( p0 - q0 ) < alpha &&
  713.                 FFABS( p1 - p0 ) < beta &&
  714.                 FFABS( q1 - q0 ) < beta ) {
  715.                 int tc = tc0;
  716.                 int i_delta;
  717.                 if( FFABS( p2 - p0 ) < beta ) {
  718.                     pix[-2] = p1 + av_clip( ( p2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( p1 << 1 ) ) >> 1, -tc0, tc0 );
  719.                     tc++;
  720.                 }
  721.                 if( FFABS( q2 - q0 ) < beta ) {
  722.                     pix[1] = q1 + av_clip( ( q2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( q1 << 1 ) ) >> 1, -tc0, tc0 );
  723.                     tc++;
  724.                 }
  725.                 i_delta = av_clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
  726.                 pix[-1] = av_clip_uint8( p0 + i_delta );    /* p0' */
  727.                 pix[0]  = av_clip_uint8( q0 - i_delta );    /* q0' */
  728.                 tprintf(h->s.avctx, "filter_mb_mbaff_edgev i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d, tc:%dn# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]n", i, qp[qp_index], index_a, alpha, beta, tc, bS[bS_index], pix[-3], p1, p0, q0, q1, pix[2], p1, pix[-1], pix[0], q1);
  729.             }
  730.         }else{
  731.             const int p0 = pix[-1];
  732.             const int p1 = pix[-2];
  733.             const int p2 = pix[-3];
  734.             const int q0 = pix[0];
  735.             const int q1 = pix[1];
  736.             const int q2 = pix[2];
  737.             if( FFABS( p0 - q0 ) < alpha &&
  738.                 FFABS( p1 - p0 ) < beta &&
  739.                 FFABS( q1 - q0 ) < beta ) {
  740.                 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
  741.                     if( FFABS( p2 - p0 ) < beta)
  742.                     {
  743.                         const int p3 = pix[-4];
  744.                         /* p0', p1', p2' */
  745.                         pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
  746.                         pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
  747.                         pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
  748.                     } else {
  749.                         /* p0' */
  750.                         pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  751.                     }
  752.                     if( FFABS( q2 - q0 ) < beta)
  753.                     {
  754.                         const int q3 = pix[3];
  755.                         /* q0', q1', q2' */
  756.                         pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
  757.                         pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
  758.                         pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
  759.                     } else {
  760.                         /* q0' */
  761.                         pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  762.                     }
  763.                 }else{
  764.                     /* p0', q0' */
  765.                     pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  766.                     pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  767.                 }
  768.                 tprintf(h->s.avctx, "filter_mb_mbaff_edgev i:%d, qp:%d, indexA:%d, alpha:%d, beta:%dn# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x, %02x, %02x]n", i, qp[qp_index], index_a, alpha, beta, p2, p1, p0, q0, q1, q2, pix[-3], pix[-2], pix[-1], pix[0], pix[1], pix[2]);
  769.             }
  770.         }
  771.     }
  772. }
  773. static void filter_mb_mbaff_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[8], int qp[2] ) {
  774.     int i;
  775.     for( i = 0; i < 8; i++, pix += stride) {
  776.         int index_a;
  777.         int alpha;
  778.         int beta;
  779.         int qp_index;
  780.         int bS_index = i;
  781.         if( bS[bS_index] == 0 ) {
  782.             continue;
  783.         }
  784.         qp_index = MB_FIELD ? (i >> 2) : (i & 1);
  785.         index_a = qp[qp_index] + h->slice_alpha_c0_offset;
  786.         alpha = (alpha_table+52)[index_a];
  787.         beta  = (beta_table+52)[qp[qp_index] + h->slice_beta_offset];
  788.         if( bS[bS_index] < 4 ) {
  789.             const int tc = (tc0_table+52)[index_a][bS[bS_index] - 1] + 1;
  790.             const int p0 = pix[-1];
  791.             const int p1 = pix[-2];
  792.             const int q0 = pix[0];
  793.             const int q1 = pix[1];
  794.             if( FFABS( p0 - q0 ) < alpha &&
  795.                 FFABS( p1 - p0 ) < beta &&
  796.                 FFABS( q1 - q0 ) < beta ) {
  797.                 const int i_delta = av_clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
  798.                 pix[-1] = av_clip_uint8( p0 + i_delta );    /* p0' */
  799.                 pix[0]  = av_clip_uint8( q0 - i_delta );    /* q0' */
  800.                 tprintf(h->s.avctx, "filter_mb_mbaff_edgecv i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d, tc:%dn# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]n", i, qp[qp_index], index_a, alpha, beta, tc, bS[bS_index], pix[-3], p1, p0, q0, q1, pix[2], p1, pix[-1], pix[0], q1);
  801.             }
  802.         }else{
  803.             const int p0 = pix[-1];
  804.             const int p1 = pix[-2];
  805.             const int q0 = pix[0];
  806.             const int q1 = pix[1];
  807.             if( FFABS( p0 - q0 ) < alpha &&
  808.                 FFABS( p1 - p0 ) < beta &&
  809.                 FFABS( q1 - q0 ) < beta ) {
  810.                 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;   /* p0' */
  811.                 pix[0]  = ( 2*q1 + q0 + p1 + 2 ) >> 2;   /* q0' */
  812.                 tprintf(h->s.avctx, "filter_mb_mbaff_edgecv i:%dn# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x, %02x, %02x]n", i, pix[-3], p1, p0, q0, q1, pix[2], pix[-3], pix[-2], pix[-1], pix[0], pix[1], pix[2]);
  813.             }
  814.         }
  815.     }
  816. }
  817. static void filter_mb_edgeh( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
  818.     int i, d;
  819.     const int index_a = qp + h->slice_alpha_c0_offset;
  820.     const int alpha = (alpha_table+52)[index_a];
  821.     const int beta  = (beta_table+52)[qp + h->slice_beta_offset];
  822.     const int pix_next  = stride;
  823.     if( bS[0] < 4 ) {
  824.         int8_t tc[4];
  825.         for(i=0; i<4; i++)
  826.             tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
  827.         h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc);
  828.     } else {
  829.         /* 16px edge length, see filter_mb_edgev */
  830.             for( d = 0; d < 16; d++ ) {
  831.                 const int p0 = pix[-1*pix_next];
  832.                 const int p1 = pix[-2*pix_next];
  833.                 const int p2 = pix[-3*pix_next];
  834.                 const int q0 = pix[0];
  835.                 const int q1 = pix[1*pix_next];
  836.                 const int q2 = pix[2*pix_next];
  837.                 if( FFABS( p0 - q0 ) < alpha &&
  838.                     FFABS( p1 - p0 ) < beta &&
  839.                     FFABS( q1 - q0 ) < beta ) {
  840.                     const int p3 = pix[-4*pix_next];
  841.                     const int q3 = pix[ 3*pix_next];
  842.                     if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
  843.                         if( FFABS( p2 - p0 ) < beta) {
  844.                             /* p0', p1', p2' */
  845.                             pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
  846.                             pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
  847.                             pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
  848.                         } else {
  849.                             /* p0' */
  850.                             pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  851.                         }
  852.                         if( FFABS( q2 - q0 ) < beta) {
  853.                             /* q0', q1', q2' */
  854.                             pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
  855.                             pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
  856.                             pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
  857.                         } else {
  858.                             /* q0' */
  859.                             pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  860.                         }
  861.                     }else{
  862.                         /* p0', q0' */
  863.                         pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  864.                         pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  865.                     }
  866.                     tprintf(h->s.avctx, "filter_mb_edgeh i:%d d:%d, qp:%d, indexA:%d, alpha:%d, beta:%dn# 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]);
  867.                 }
  868.                 pix++;
  869.             }
  870.     }
  871. }
  872. static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
  873.     int i;
  874.     const int index_a = qp + h->slice_alpha_c0_offset;
  875.     const int alpha = (alpha_table+52)[index_a];
  876.     const int beta  = (beta_table+52)[qp + h->slice_beta_offset];
  877.     if( bS[0] < 4 ) {
  878.         int8_t tc[4];
  879.         for(i=0; i<4; i++)
  880.             tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0;
  881.         h->s.dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc);
  882.     } else {
  883.         h->s.dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta);
  884.     }
  885. }
  886. static void 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) {
  887.     MpegEncContext * const s = &h->s;
  888.     int mb_y_firstrow = s->picture_structure == PICT_BOTTOM_FIELD;
  889.     int mb_xy, mb_type;
  890.     int qp, qp0, qp1, qpc, qpc0, qpc1, qp_thresh;
  891.     mb_xy = h->mb_xy;
  892.     if(mb_x==0 || mb_y==mb_y_firstrow || !s->dsp.h264_loop_filter_strength || h->pps.chroma_qp_diff ||
  893.        (h->deblocking_filter == 2 && (h->slice_table[mb_xy] != h->slice_table[h->top_mb_xy] ||
  894.                                       h->slice_table[mb_xy] != h->slice_table[mb_xy - 1]))) {
  895.         filter_mb(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize);
  896.         return;
  897.     }
  898.     assert(!FRAME_MBAFF);
  899.     mb_type = s->current_picture.mb_type[mb_xy];
  900.     qp = s->current_picture.qscale_table[mb_xy];
  901.     qp0 = s->current_picture.qscale_table[mb_xy-1];
  902.     qp1 = s->current_picture.qscale_table[h->top_mb_xy];
  903.     qpc = get_chroma_qp( h, 0, qp );
  904.     qpc0 = get_chroma_qp( h, 0, qp0 );
  905.     qpc1 = get_chroma_qp( h, 0, qp1 );
  906.     qp0 = (qp + qp0 + 1) >> 1;
  907.     qp1 = (qp + qp1 + 1) >> 1;
  908.     qpc0 = (qpc + qpc0 + 1) >> 1;
  909.     qpc1 = (qpc + qpc1 + 1) >> 1;
  910.     qp_thresh = 15 - h->slice_alpha_c0_offset;
  911.     if(qp <= qp_thresh && qp0 <= qp_thresh && qp1 <= qp_thresh &&
  912.        qpc <= qp_thresh && qpc0 <= qp_thresh && qpc1 <= qp_thresh)
  913.         return;
  914.     if( IS_INTRA(mb_type) ) {
  915.         int16_t bS4[4] = {4,4,4,4};
  916.         int16_t bS3[4] = {3,3,3,3};
  917.         int16_t *bSH = FIELD_PICTURE ? bS3 : bS4;
  918.         if( IS_8x8DCT(mb_type) ) {
  919.             filter_mb_edgev( h, &img_y[4*0], linesize, bS4, qp0 );
  920.             filter_mb_edgev( h, &img_y[4*2], linesize, bS3, qp );
  921.             filter_mb_edgeh( h, &img_y[4*0*linesize], linesize, bSH, qp1 );
  922.             filter_mb_edgeh( h, &img_y[4*2*linesize], linesize, bS3, qp );
  923.         } else {
  924.             filter_mb_edgev( h, &img_y[4*0], linesize, bS4, qp0 );
  925.             filter_mb_edgev( h, &img_y[4*1], linesize, bS3, qp );
  926.             filter_mb_edgev( h, &img_y[4*2], linesize, bS3, qp );
  927.             filter_mb_edgev( h, &img_y[4*3], linesize, bS3, qp );
  928.             filter_mb_edgeh( h, &img_y[4*0*linesize], linesize, bSH, qp1 );
  929.             filter_mb_edgeh( h, &img_y[4*1*linesize], linesize, bS3, qp );
  930.             filter_mb_edgeh( h, &img_y[4*2*linesize], linesize, bS3, qp );
  931.             filter_mb_edgeh( h, &img_y[4*3*linesize], linesize, bS3, qp );
  932.         }
  933.         filter_mb_edgecv( h, &img_cb[2*0], uvlinesize, bS4, qpc0 );
  934.         filter_mb_edgecv( h, &img_cb[2*2], uvlinesize, bS3, qpc );
  935.         filter_mb_edgecv( h, &img_cr[2*0], uvlinesize, bS4, qpc0 );
  936.         filter_mb_edgecv( h, &img_cr[2*2], uvlinesize, bS3, qpc );
  937.         filter_mb_edgech( h, &img_cb[2*0*uvlinesize], uvlinesize, bSH, qpc1 );
  938.         filter_mb_edgech( h, &img_cb[2*2*uvlinesize], uvlinesize, bS3, qpc );
  939.         filter_mb_edgech( h, &img_cr[2*0*uvlinesize], uvlinesize, bSH, qpc1 );
  940.         filter_mb_edgech( h, &img_cr[2*2*uvlinesize], uvlinesize, bS3, qpc );
  941.         return;
  942.     } else {
  943.         DECLARE_ALIGNED_8(int16_t, bS[2][4][4]);
  944.         uint64_t (*bSv)[4] = (uint64_t(*)[4])bS;
  945.         int edges;
  946.         if( IS_8x8DCT(mb_type) && (h->cbp&7) == 7 ) {
  947.             edges = 4;
  948.             bSv[0][0] = bSv[0][2] = bSv[1][0] = bSv[1][2] = 0x0002000200020002;
  949.         } else {
  950.             int mask_edge1 = (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 :
  951.                              (mb_type & MB_TYPE_16x8) ? 1 : 0;
  952.             int mask_edge0 = (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16))
  953.                              && (s->current_picture.mb_type[mb_xy-1] & (MB_TYPE_16x16 | MB_TYPE_8x16))
  954.                              ? 3 : 0;
  955.             int step = IS_8x8DCT(mb_type) ? 2 : 1;
  956.             edges = (mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4;
  957.             s->dsp.h264_loop_filter_strength( bS, h->non_zero_count_cache, h->ref_cache, h->mv_cache,
  958.                                               (h->slice_type == FF_B_TYPE), edges, step, mask_edge0, mask_edge1 );
  959.         }
  960.         if( IS_INTRA(s->current_picture.mb_type[mb_xy-1]) )
  961.             bSv[0][0] = 0x0004000400040004;
  962.         if( IS_INTRA(s->current_picture.mb_type[h->top_mb_xy]) )
  963.             bSv[1][0] = FIELD_PICTURE ? 0x0003000300030003 : 0x0004000400040004;
  964. #define FILTER(hv,dir,edge)
  965.         if(bSv[dir][edge]) {
  966.             filter_mb_edge##hv( h, &img_y[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qp : qp##dir );
  967.             if(!(edge&1)) {
  968.                 filter_mb_edgec##hv( h, &img_cb[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir );
  969.                 filter_mb_edgec##hv( h, &img_cr[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir );
  970.             }
  971.         }
  972.         if( edges == 1 ) {
  973.             FILTER(v,0,0);
  974.             FILTER(h,1,0);
  975.         } else if( IS_8x8DCT(mb_type) ) {
  976.             FILTER(v,0,0);
  977.             FILTER(v,0,2);
  978.             FILTER(h,1,0);
  979.             FILTER(h,1,2);
  980.         } else {
  981.             FILTER(v,0,0);
  982.             FILTER(v,0,1);
  983.             FILTER(v,0,2);
  984.             FILTER(v,0,3);
  985.             FILTER(h,1,0);
  986.             FILTER(h,1,1);
  987.             FILTER(h,1,2);
  988.             FILTER(h,1,3);
  989.         }
  990. #undef FILTER
  991.     }
  992. }
  993. static void filter_mb( 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) {
  994.     MpegEncContext * const s = &h->s;
  995.     const int mb_xy= mb_x + mb_y*s->mb_stride;
  996.     const int mb_type = s->current_picture.mb_type[mb_xy];
  997.     const int mvy_limit = IS_INTERLACED(mb_type) ? 2 : 4;
  998.     int first_vertical_edge_done = 0;
  999.     int dir;
  1000.     /* FIXME: A given frame may occupy more than one position in
  1001.      * the reference list. So ref2frm should be populated with
  1002.      * frame numbers, not indexes. */
  1003.     static const int ref2frm[34] = {-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
  1004.                                     16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
  1005.     //for sufficiently low qp, filtering wouldn't do anything
  1006.     //this is a conservative estimate: could also check beta_offset and more accurate chroma_qp
  1007.     if(!FRAME_MBAFF){
  1008.         int qp_thresh = 15 - h->slice_alpha_c0_offset - FFMAX3(0, h->pps.chroma_qp_index_offset[0], h->pps.chroma_qp_index_offset[1]);
  1009.         int qp = s->current_picture.qscale_table[mb_xy];
  1010.         if(qp <= qp_thresh
  1011.            && (mb_x == 0 || ((qp + s->current_picture.qscale_table[mb_xy-1] + 1)>>1) <= qp_thresh)
  1012.            && (mb_y == 0 || ((qp + s->current_picture.qscale_table[h->top_mb_xy] + 1)>>1) <= qp_thresh)){
  1013.             return;
  1014.         }
  1015.     }
  1016.     if (FRAME_MBAFF
  1017.             // left mb is in picture
  1018.             && h->slice_table[mb_xy-1] != 255
  1019.             // and current and left pair do not have the same interlaced type
  1020.             && (IS_INTERLACED(mb_type) != IS_INTERLACED(s->current_picture.mb_type[mb_xy-1]))
  1021.             // and left mb is in the same slice if deblocking_filter == 2
  1022.             && (h->deblocking_filter!=2 || h->slice_table[mb_xy-1] == h->slice_table[mb_xy])) {
  1023.         /* First vertical edge is different in MBAFF frames
  1024.          * There are 8 different bS to compute and 2 different Qp
  1025.          */
  1026.         const int pair_xy = mb_x + (mb_y&~1)*s->mb_stride;
  1027.         const int left_mb_xy[2] = { pair_xy-1, pair_xy-1+s->mb_stride };
  1028.         int16_t bS[8];
  1029.         int qp[2];
  1030.         int bqp[2];
  1031.         int rqp[2];
  1032.         int mb_qp, mbn0_qp, mbn1_qp;
  1033.         int i;
  1034.         first_vertical_edge_done = 1;
  1035.         if( IS_INTRA(mb_type) )
  1036.             bS[0] = bS[1] = bS[2] = bS[3] = bS[4] = bS[5] = bS[6] = bS[7] = 4;
  1037.         else {
  1038.             for( i = 0; i < 8; i++ ) {
  1039.                 int mbn_xy = MB_FIELD ? left_mb_xy[i>>2] : left_mb_xy[i&1];
  1040.                 if( IS_INTRA( s->current_picture.mb_type[mbn_xy] ) )
  1041.                     bS[i] = 4;
  1042.                 else if( h->non_zero_count_cache[12+8*(i>>1)] != 0 ||
  1043.                          /* FIXME: with 8x8dct + cavlc, should check cbp instead of nnz */
  1044.                          h->non_zero_count[mbn_xy][MB_FIELD ? i&3 : (i>>2)+(mb_y&1)*2] )
  1045.                     bS[i] = 2;
  1046.                 else
  1047.                     bS[i] = 1;
  1048.             }
  1049.         }
  1050.         mb_qp = s->current_picture.qscale_table[mb_xy];
  1051.         mbn0_qp = s->current_picture.qscale_table[left_mb_xy[0]];
  1052.         mbn1_qp = s->current_picture.qscale_table[left_mb_xy[1]];
  1053.         qp[0] = ( mb_qp + mbn0_qp + 1 ) >> 1;
  1054.         bqp[0] = ( get_chroma_qp( h, 0, mb_qp ) +
  1055.                    get_chroma_qp( h, 0, mbn0_qp ) + 1 ) >> 1;
  1056.         rqp[0] = ( get_chroma_qp( h, 1, mb_qp ) +
  1057.                    get_chroma_qp( h, 1, mbn0_qp ) + 1 ) >> 1;
  1058.         qp[1] = ( mb_qp + mbn1_qp + 1 ) >> 1;
  1059.         bqp[1] = ( get_chroma_qp( h, 0, mb_qp ) +
  1060.                    get_chroma_qp( h, 0, mbn1_qp ) + 1 ) >> 1;
  1061.         rqp[1] = ( get_chroma_qp( h, 1, mb_qp ) +
  1062.                    get_chroma_qp( h, 1, mbn1_qp ) + 1 ) >> 1;
  1063.         /* Filter edge */
  1064.         tprintf(s->avctx, "filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d", mb_x, mb_y, qp[0], qp[1], bqp[0], bqp[1], rqp[0], rqp[1], linesize, uvlinesize);
  1065.         { int i; for (i = 0; i < 8; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "n"); }
  1066.         filter_mb_mbaff_edgev ( h, &img_y [0], linesize,   bS, qp );
  1067.         filter_mb_mbaff_edgecv( h, &img_cb[0], uvlinesize, bS, bqp );
  1068.         filter_mb_mbaff_edgecv( h, &img_cr[0], uvlinesize, bS, rqp );
  1069.     }
  1070.     /* dir : 0 -> vertical edge, 1 -> horizontal edge */
  1071.     for( dir = 0; dir < 2; dir++ )
  1072.     {
  1073.         int edge;
  1074.         const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy;
  1075.         const int mbm_type = s->current_picture.mb_type[mbm_xy];
  1076.         int start = h->slice_table[mbm_xy] == 255 ? 1 : 0;
  1077.         const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP))
  1078.                                   == (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4;
  1079.         // how often to recheck mv-based bS when iterating between edges
  1080.         const int mask_edge = (mb_type & (MB_TYPE_16x16 | (MB_TYPE_16x8 << dir))) ? 3 :
  1081.                               (mb_type & (MB_TYPE_8x16 >> dir)) ? 1 : 0;
  1082.         // how often to recheck mv-based bS when iterating along each edge
  1083.         const int mask_par0 = mb_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir));
  1084.         if (first_vertical_edge_done) {
  1085.             start = 1;
  1086.             first_vertical_edge_done = 0;
  1087.         }
  1088.         if (h->deblocking_filter==2 && h->slice_table[mbm_xy] != h->slice_table[mb_xy])
  1089.             start = 1;
  1090.         if (FRAME_MBAFF && (dir == 1) && ((mb_y&1) == 0) && start == 0
  1091.             && !IS_INTERLACED(mb_type)
  1092.             && IS_INTERLACED(mbm_type)
  1093.             ) {
  1094.             // This is a special case in the norm where the filtering must
  1095.             // be done twice (one each of the field) even if we are in a
  1096.             // frame macroblock.
  1097.             //
  1098.             static const int nnz_idx[4] = {4,5,6,3};
  1099.             unsigned int tmp_linesize   = 2 *   linesize;
  1100.             unsigned int tmp_uvlinesize = 2 * uvlinesize;
  1101.             int mbn_xy = mb_xy - 2 * s->mb_stride;
  1102.             int qp;
  1103.             int i, j;
  1104.             int16_t bS[4];
  1105.             for(j=0; j<2; j++, mbn_xy += s->mb_stride){
  1106.                 if( IS_INTRA(mb_type) ||
  1107.                     IS_INTRA(s->current_picture.mb_type[mbn_xy]) ) {
  1108.                     bS[0] = bS[1] = bS[2] = bS[3] = 3;
  1109.                 } else {
  1110.                     const uint8_t *mbn_nnz = h->non_zero_count[mbn_xy];
  1111.                     for( i = 0; i < 4; i++ ) {
  1112.                         if( h->non_zero_count_cache[scan8[0]+i] != 0 ||
  1113.                             mbn_nnz[nnz_idx[i]] != 0 )
  1114.                             bS[i] = 2;
  1115.                         else
  1116.                             bS[i] = 1;
  1117.                     }
  1118.                 }
  1119.                 // Do not use s->qscale as luma quantizer because it has not the same
  1120.                 // value in IPCM macroblocks.
  1121.                 qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
  1122.                 tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, tmp_linesize, tmp_uvlinesize);
  1123.                 { int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "n"); }
  1124.                 filter_mb_edgeh( h, &img_y[j*linesize], tmp_linesize, bS, qp );
  1125.                 filter_mb_edgech( h, &img_cb[j*uvlinesize], tmp_uvlinesize, bS,
  1126.                                   ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
  1127.                 filter_mb_edgech( h, &img_cr[j*uvlinesize], tmp_uvlinesize, bS,
  1128.                                   ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
  1129.             }
  1130.             start = 1;
  1131.         }
  1132.         /* Calculate bS */
  1133.         for( edge = start; edge < edges; edge++ ) {
  1134.             /* mbn_xy: neighbor macroblock */
  1135.             const int mbn_xy = edge > 0 ? mb_xy : mbm_xy;
  1136.             const int mbn_type = s->current_picture.mb_type[mbn_xy];
  1137.             int16_t bS[4];
  1138.             int qp;
  1139.             if( (edge&1) && IS_8x8DCT(mb_type) )
  1140.                 continue;
  1141.             if( IS_INTRA(mb_type) ||
  1142.                 IS_INTRA(mbn_type) ) {
  1143.                 int value;
  1144.                 if (edge == 0) {
  1145.                     if (   (!IS_INTERLACED(mb_type) && !IS_INTERLACED(mbm_type))
  1146.                         || ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0))
  1147.                     ) {
  1148.                         value = 4;
  1149.                     } else {
  1150.                         value = 3;
  1151.                     }
  1152.                 } else {
  1153.                     value = 3;
  1154.                 }
  1155.                 bS[0] = bS[1] = bS[2] = bS[3] = value;
  1156.             } else {
  1157.                 int i, l;
  1158.                 int mv_done;
  1159.                 if( edge & mask_edge ) {
  1160.                     bS[0] = bS[1] = bS[2] = bS[3] = 0;
  1161.                     mv_done = 1;
  1162.                 }
  1163.                 else if( FRAME_MBAFF && IS_INTERLACED(mb_type ^ mbn_type)) {
  1164.                     bS[0] = bS[1] = bS[2] = bS[3] = 1;
  1165.                     mv_done = 1;
  1166.                 }
  1167.                 else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) {
  1168.                     int b_idx= 8 + 4 + edge * (dir ? 8:1);
  1169.                     int bn_idx= b_idx - (dir ? 8:1);
  1170.                     int v = 0;
  1171.                     for( l = 0; !v && l < 1 + (h->slice_type == FF_B_TYPE); l++ ) {
  1172.                         v |= ref2frm[h->ref_cache[l][b_idx]+2] != ref2frm[h->ref_cache[l][bn_idx]+2] ||
  1173.                              FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 ||
  1174.                              FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit;
  1175.                     }
  1176.                     bS[0] = bS[1] = bS[2] = bS[3] = v;
  1177.                     mv_done = 1;
  1178.                 }
  1179.                 else
  1180.                     mv_done = 0;
  1181.                 for( i = 0; i < 4; i++ ) {
  1182.                     int x = dir == 0 ? edge : i;
  1183.                     int y = dir == 0 ? i    : edge;
  1184.                     int b_idx= 8 + 4 + x + 8*y;
  1185.                     int bn_idx= b_idx - (dir ? 8:1);
  1186.                     if( h->non_zero_count_cache[b_idx] != 0 ||
  1187.                         h->non_zero_count_cache[bn_idx] != 0 ) {
  1188.                         bS[i] = 2;
  1189.                     }
  1190.                     else if(!mv_done)
  1191.                     {
  1192.                         bS[i] = 0;
  1193.                         for( l = 0; l < 1 + (h->slice_type == FF_B_TYPE); l++ ) {
  1194.                             if( ref2frm[h->ref_cache[l][b_idx]+2] != ref2frm[h->ref_cache[l][bn_idx]+2] ||
  1195.                                 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 ||
  1196.                                 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) {
  1197.                                 bS[i] = 1;
  1198.                                 break;
  1199.                             }
  1200.                         }
  1201.                     }
  1202.                 }
  1203.                 if(bS[0]+bS[1]+bS[2]+bS[3] == 0)
  1204.                     continue;
  1205.             }
  1206.             /* Filter edge */
  1207.             // Do not use s->qscale as luma quantizer because it has not the same
  1208.             // value in IPCM macroblocks.
  1209.             qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
  1210.             //tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%dn", mb_x, mb_y, dir, edge, qp, h->chroma_qp, s->current_picture.qscale_table[mbn_xy]);
  1211.             tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize);
  1212.             { int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "n"); }
  1213.             if( dir == 0 ) {
  1214.                 filter_mb_edgev( h, &img_y[4*edge], linesize, bS, qp );
  1215.                 if( (edge&1) == 0 ) {
  1216.                     filter_mb_edgecv( h, &img_cb[2*edge], uvlinesize, bS,
  1217.                                       ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
  1218.                     filter_mb_edgecv( h, &img_cr[2*edge], uvlinesize, bS,
  1219.                                       ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
  1220.                 }
  1221.             } else {
  1222.                 filter_mb_edgeh( h, &img_y[4*edge*linesize], linesize, bS, qp );
  1223.                 if( (edge&1) == 0 ) {
  1224.                     filter_mb_edgech( h, &img_cb[2*edge*uvlinesize], uvlinesize, bS,
  1225.                                       ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
  1226.                     filter_mb_edgech( h, &img_cr[2*edge*uvlinesize], uvlinesize, bS,
  1227.                                       ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
  1228.                 }
  1229.             }
  1230.         }
  1231.     }
  1232. }
  1233. static int decode_slice(struct AVCodecContext *avctx, H264Context *h){
  1234.     MpegEncContext * const s = &h->s;
  1235.     const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
  1236.     s->mb_skip_run= -1;
  1237.     if( h->pps.cabac ) {
  1238.         int i;
  1239.         /* realign */
  1240.         align_get_bits( &s->gb );
  1241.         /* init cabac */
  1242.         ff_init_cabac_states( &h->cabac);
  1243.         ff_init_cabac_decoder( &h->cabac,
  1244.                                s->gb.buffer + get_bits_count(&s->gb)/8,
  1245.                                ( s->gb.size_in_bits - get_bits_count(&s->gb) + 7)/8);
  1246.         /* calculate pre-state */
  1247.         for( i= 0; i < 460; i++ ) {
  1248.             int pre;
  1249.             if( h->slice_type == FF_I_TYPE )
  1250.                 pre = av_clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cabac_context_init_I[i][1], 1, 126 );
  1251.             else
  1252.                 pre = av_clip( ((cabac_context_init_PB[h->cabac_init_idc][i][0] * s->qscale) >>4 ) + cabac_context_init_PB[h->cabac_init_idc][i][1], 1, 126 );
  1253.             if( pre <= 63 )
  1254.                 h->cabac_state[i] = 2 * ( 63 - pre ) + 0;
  1255.             else
  1256.                 h->cabac_state[i] = 2 * ( pre - 64 ) + 1;
  1257.         }
  1258.         for(;;){
  1259. //START_TIMER
  1260.             int ret = decode_mb_cabac(h);
  1261.             int eos;
  1262. //STOP_TIMER("decode_mb_cabac")
  1263.             if(ret>=0) hl_decode_mb(h);
  1264.             if( ret >= 0 && FRAME_MBAFF ) { //FIXME optimal? or let mb_decode decode 16x32 ?
  1265.                 s->mb_y++;
  1266.                 if(ret>=0) ret = decode_mb_cabac(h);
  1267.                 if(ret>=0) hl_decode_mb(h);
  1268.                 s->mb_y--;
  1269.             }
  1270.             eos = get_cabac_terminate( &h->cabac );
  1271.             if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) {
  1272.                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d, bytestream (%td)n", s->mb_x, s->mb_y, h->cabac.bytestream_end - h->cabac.bytestream);
  1273.                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
  1274.                 return -1;
  1275.             }
  1276.             if( ++s->mb_x >= s->mb_width ) {
  1277.                 s->mb_x = 0;
  1278.                 ff_draw_horiz_band(s, 16*s->mb_y, 16);
  1279.                 ++s->mb_y;
  1280.                 if(FIELD_OR_MBAFF_PICTURE) {
  1281.                     ++s->mb_y;
  1282.                 }
  1283.             }
  1284.             if( eos || s->mb_y >= s->mb_height ) {
  1285.                 tprintf(s->avctx, "slice end %d %dn", get_bits_count(&s->gb), s->gb.size_in_bits);
  1286.                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
  1287.                 return 0;
  1288.             }
  1289.         }
  1290.     } else {
  1291.         for(;;){
  1292.             int ret = decode_mb_cavlc(h);
  1293.             if(ret>=0) hl_decode_mb(h);
  1294.             if(ret>=0 && FRAME_MBAFF){ //FIXME optimal? or let mb_decode decode 16x32 ?
  1295.                 s->mb_y++;
  1296.                 ret = decode_mb_cavlc(h);
  1297.                 if(ret>=0) hl_decode_mb(h);
  1298.                 s->mb_y--;
  1299.             }
  1300.             if(ret<0){
  1301.                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %dn", s->mb_x, s->mb_y);
  1302.                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
  1303.                 return -1;
  1304.             }
  1305.             if(++s->mb_x >= s->mb_width){
  1306.                 s->mb_x=0;
  1307.                 ff_draw_horiz_band(s, 16*s->mb_y, 16);
  1308.                 ++s->mb_y;
  1309.                 if(FIELD_OR_MBAFF_PICTURE) {
  1310.                     ++s->mb_y;
  1311.                 }
  1312.                 if(s->mb_y >= s->mb_height){
  1313.                     tprintf(s->avctx, "slice end %d %dn", get_bits_count(&s->gb), s->gb.size_in_bits);
  1314.                     if(get_bits_count(&s->gb) == s->gb.size_in_bits ) {
  1315.                         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
  1316.                         return 0;
  1317.                     }else{
  1318.                         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
  1319.                         return -1;
  1320.                     }
  1321.                 }
  1322.             }
  1323.             if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){
  1324.                 tprintf(s->avctx, "slice end %d %dn", get_bits_count(&s->gb), s->gb.size_in_bits);
  1325.                 if(get_bits_count(&s->gb) == s->gb.size_in_bits ){
  1326.                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
  1327.                     return 0;
  1328.                 }else{
  1329.                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
  1330.                     return -1;
  1331.                 }
  1332.             }
  1333.         }
  1334.     }
  1335. #if 0
  1336.     for(;s->mb_y < s->mb_height; s->mb_y++){
  1337.         for(;s->mb_x < s->mb_width; s->mb_x++){
  1338.             int ret= decode_mb(h);
  1339.             hl_decode_mb(h);
  1340.             if(ret<0){
  1341.                 av_log(s->avctx, AV_LOG_ERROR, "error while decoding MB %d %dn", s->mb_x, s->mb_y);
  1342.                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
  1343.                 return -1;
  1344.             }
  1345.             if(++s->mb_x >= s->mb_width){
  1346.                 s->mb_x=0;
  1347.                 if(++s->mb_y >= s->mb_height){
  1348.                     if(get_bits_count(s->gb) == s->gb.size_in_bits){
  1349.                         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
  1350.                         return 0;
  1351.                     }else{
  1352.                         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
  1353.                         return -1;
  1354.                     }
  1355.                 }
  1356.             }
  1357.             if(get_bits_count(s->?gb) >= s->gb?.size_in_bits){
  1358.                 if(get_bits_count(s->gb) == s->gb.size_in_bits){
  1359.                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
  1360.                     return 0;
  1361.                 }else{
  1362.                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
  1363.                     return -1;
  1364.                 }
  1365.             }
  1366.         }
  1367.         s->mb_x=0;
  1368.         ff_draw_horiz_band(s, 16*s->mb_y, 16);
  1369.     }
  1370. #endif
  1371.     return -1; //not reached
  1372. }
  1373. static int decode_unregistered_user_data(H264Context *h, int size){
  1374.     MpegEncContext * const s = &h->s;
  1375.     uint8_t user_data[16+256];
  1376.     int e, build, i;
  1377.     if(size<16)
  1378.         return -1;
  1379.     for(i=0; i<sizeof(user_data)-1 && i<size; i++){
  1380.         user_data[i]= get_bits(&s->gb, 8);
  1381.     }
  1382.     user_data[i]= 0;
  1383.     e= sscanf(user_data+16, "x264 - core %d"/*%s - H.264/MPEG-4 AVC codec - Copyleft 2005 - http://www.videolan.org/x264.html*/, &build);
  1384.     if(e==1 && build>=0)
  1385.         h->x264_build= build;
  1386.     if(s->avctx->debug & FF_DEBUG_BUGS)
  1387.         av_log(s->avctx, AV_LOG_DEBUG, "user data:"%s"n", user_data+16);
  1388.     for(; i<size; i++)
  1389.         skip_bits(&s->gb, 8);
  1390.     return 0;
  1391. }
  1392. static int decode_sei(H264Context *h){
  1393.     MpegEncContext * const s = &h->s;
  1394.     while(get_bits_count(&s->gb) + 16 < s->gb.size_in_bits){
  1395.         int size, type;
  1396.         type=0;
  1397.         do{
  1398.             type+= show_bits(&s->gb, 8);
  1399.         }while(get_bits(&s->gb, 8) == 255);
  1400.         size=0;
  1401.         do{
  1402.             size+= show_bits(&s->gb, 8);
  1403.         }while(get_bits(&s->gb, 8) == 255);
  1404.         switch(type){
  1405.         case 5:
  1406.             if(decode_unregistered_user_data(h, size) < 0)
  1407.                 return -1;
  1408.             break;
  1409.         default:
  1410.             skip_bits(&s->gb, 8*size);
  1411.         }
  1412.         //FIXME check bits here
  1413.         align_get_bits(&s->gb);
  1414.     }
  1415.     return 0;
  1416. }
  1417. static inline void decode_hrd_parameters(H264Context *h, SPS *sps){
  1418.     MpegEncContext * const s = &h->s;
  1419.     int cpb_count, i;
  1420.     cpb_count = get_ue_golomb(&s->gb) + 1;
  1421.     get_bits(&s->gb, 4); /* bit_rate_scale */
  1422.     get_bits(&s->gb, 4); /* cpb_size_scale */
  1423.     for(i=0; i<cpb_count; i++){
  1424.         get_ue_golomb(&s->gb); /* bit_rate_value_minus1 */
  1425.         get_ue_golomb(&s->gb); /* cpb_size_value_minus1 */
  1426.         get_bits1(&s->gb);     /* cbr_flag */
  1427.     }
  1428.     get_bits(&s->gb, 5); /* initial_cpb_removal_delay_length_minus1 */
  1429.     get_bits(&s->gb, 5); /* cpb_removal_delay_length_minus1 */
  1430.     get_bits(&s->gb, 5); /* dpb_output_delay_length_minus1 */
  1431.     get_bits(&s->gb, 5); /* time_offset_length */
  1432. }
  1433. static inline int decode_vui_parameters(H264Context *h, SPS *sps){
  1434.     MpegEncContext * const s = &h->s;
  1435.     int aspect_ratio_info_present_flag;
  1436.     unsigned int aspect_ratio_idc;
  1437.     int nal_hrd_parameters_present_flag, vcl_hrd_parameters_present_flag;
  1438.     aspect_ratio_info_present_flag= get_bits1(&s->gb);
  1439.     if( aspect_ratio_info_present_flag ) {
  1440.         aspect_ratio_idc= get_bits(&s->gb, 8);
  1441.         if( aspect_ratio_idc == EXTENDED_SAR ) {
  1442.             sps->sar.num= get_bits(&s->gb, 16);
  1443.             sps->sar.den= get_bits(&s->gb, 16);
  1444.         }else if(aspect_ratio_idc < sizeof(pixel_aspect)/sizeof(*pixel_aspect)){
  1445.             sps->sar=  pixel_aspect[aspect_ratio_idc];
  1446.         }else{
  1447.             av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ration");
  1448.             return -1;
  1449.         }
  1450.     }else{
  1451.         sps->sar.num=
  1452.         sps->sar.den= 0;
  1453.     }
  1454. //            s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
  1455.     if(get_bits1(&s->gb)){      /* overscan_info_present_flag */
  1456.         get_bits1(&s->gb);      /* overscan_appropriate_flag */
  1457.     }
  1458.     if(get_bits1(&s->gb)){      /* video_signal_type_present_flag */
  1459.         get_bits(&s->gb, 3);    /* video_format */
  1460.         get_bits1(&s->gb);      /* video_full_range_flag */
  1461.         if(get_bits1(&s->gb)){  /* colour_description_present_flag */
  1462.             get_bits(&s->gb, 8); /* colour_primaries */
  1463.             get_bits(&s->gb, 8); /* transfer_characteristics */
  1464.             get_bits(&s->gb, 8); /* matrix_coefficients */
  1465.         }
  1466.     }
  1467.     if(get_bits1(&s->gb)){      /* chroma_location_info_present_flag */
  1468.         get_ue_golomb(&s->gb);  /* chroma_sample_location_type_top_field */
  1469.         get_ue_golomb(&s->gb);  /* chroma_sample_location_type_bottom_field */
  1470.     }
  1471.     sps->timing_info_present_flag = get_bits1(&s->gb);
  1472.     if(sps->timing_info_present_flag){
  1473.         sps->num_units_in_tick = get_bits_long(&s->gb, 32);
  1474.         sps->time_scale = get_bits_long(&s->gb, 32);
  1475.         sps->fixed_frame_rate_flag = get_bits1(&s->gb);
  1476.     }
  1477.     nal_hrd_parameters_present_flag = get_bits1(&s->gb);
  1478.     if(nal_hrd_parameters_present_flag)
  1479.         decode_hrd_parameters(h, sps);
  1480.     vcl_hrd_parameters_present_flag = get_bits1(&s->gb);
  1481.     if(vcl_hrd_parameters_present_flag)
  1482.         decode_hrd_parameters(h, sps);
  1483.     if(nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag)
  1484.         get_bits1(&s->gb);     /* low_delay_hrd_flag */
  1485.     get_bits1(&s->gb);         /* pic_struct_present_flag */
  1486.     sps->bitstream_restriction_flag = get_bits1(&s->gb);
  1487.     if(sps->bitstream_restriction_flag){
  1488.         unsigned int num_reorder_frames;
  1489.         get_bits1(&s->gb);     /* motion_vectors_over_pic_boundaries_flag */
  1490.         get_ue_golomb(&s->gb); /* max_bytes_per_pic_denom */
  1491.         get_ue_golomb(&s->gb); /* max_bits_per_mb_denom */
  1492.         get_ue_golomb(&s->gb); /* log2_max_mv_length_horizontal */
  1493.         get_ue_golomb(&s->gb); /* log2_max_mv_length_vertical */
  1494.         num_reorder_frames= get_ue_golomb(&s->gb);
  1495.         get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/
  1496.         if(num_reorder_frames > 16 /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){
  1497.             av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %dn", num_reorder_frames);
  1498.             return -1;
  1499.         }
  1500.         sps->num_reorder_frames= num_reorder_frames;
  1501.     }
  1502.     return 0;
  1503. }
  1504. static void decode_scaling_list(H264Context *h, uint8_t *factors, int size,
  1505.                                 const uint8_t *jvt_list, const uint8_t *fallback_list){
  1506.     MpegEncContext * const s = &h->s;
  1507.     int i, last = 8, next = 8;
  1508.     const uint8_t *scan = size == 16 ? zigzag_scan : zigzag_scan8x8;
  1509.     if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */
  1510.         memcpy(factors, fallback_list, size*sizeof(uint8_t));
  1511.     else
  1512.     for(i=0;i<size;i++){
  1513.         if(next)
  1514.             next = (last + get_se_golomb(&s->gb)) & 0xff;
  1515.         if(!i && !next){ /* matrix not written, we use the preset one */
  1516.             memcpy(factors, jvt_list, size*sizeof(uint8_t));
  1517.             break;
  1518.         }
  1519.         last = factors[scan[i]] = next ? next : last;
  1520.     }
  1521. }
  1522. static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
  1523.                                    uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
  1524.     MpegEncContext * const s = &h->s;
  1525.     int fallback_sps = !is_sps && sps->scaling_matrix_present;
  1526.     const uint8_t *fallback[4] = {
  1527.         fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
  1528.         fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
  1529.         fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
  1530.         fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1]
  1531.     };
  1532.     if(get_bits1(&s->gb)){
  1533.         sps->scaling_matrix_present |= is_sps;
  1534.         decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y
  1535.         decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr
  1536.         decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb
  1537.         decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y
  1538.         decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr
  1539.         decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
  1540.         if(is_sps || pps->transform_8x8_mode){
  1541.             decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]);  // Intra, Y
  1542.             decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]);  // Inter, Y
  1543.         }
  1544.     } else if(fallback_sps) {
  1545.         memcpy(scaling_matrix4, sps->scaling_matrix4, 6*16*sizeof(uint8_t));
  1546.         memcpy(scaling_matrix8, sps->scaling_matrix8, 2*64*sizeof(uint8_t));
  1547.     }
  1548. }
  1549. /**
  1550.  * Returns and optionally allocates SPS / PPS structures in the supplied array 'vec'
  1551.  */
  1552. static void *
  1553. alloc_parameter_set(H264Context *h, void **vec, const unsigned int id, const unsigned int max,
  1554.                     const size_t size, const char *name)
  1555. {
  1556.     if(id>=max) {
  1557.         av_log(h->s.avctx, AV_LOG_ERROR, "%s_id (%d) out of rangen", name, id);
  1558.         return NULL;
  1559.     }
  1560.     if(!vec[id]) {
  1561.         vec[id] = av_mallocz(size);
  1562.         if(vec[id] == NULL)
  1563.             av_log(h->s.avctx, AV_LOG_ERROR, "cannot allocate memory for %sn", name);
  1564.     }
  1565.     return vec[id];
  1566. }
  1567. static inline int decode_seq_parameter_set(H264Context *h){
  1568.     MpegEncContext * const s = &h->s;
  1569.     int profile_idc, level_idc;
  1570.     unsigned int sps_id, tmp, mb_width, mb_height;
  1571.     int i;
  1572.     SPS *sps;
  1573.     profile_idc= get_bits(&s->gb, 8);
  1574.     get_bits1(&s->gb);   //constraint_set0_flag
  1575.     get_bits1(&s->gb);   //constraint_set1_flag
  1576.     get_bits1(&s->gb);   //constraint_set2_flag
  1577.     get_bits1(&s->gb);   //constraint_set3_flag
  1578.     get_bits(&s->gb, 4); // reserved
  1579.     level_idc= get_bits(&s->gb, 8);
  1580.     sps_id= get_ue_golomb(&s->gb);
  1581.     sps = alloc_parameter_set(h, (void **)h->sps_buffers, sps_id, MAX_SPS_COUNT, sizeof(SPS), "sps");
  1582.     if(sps == NULL)
  1583.         return -1;
  1584.     sps->profile_idc= profile_idc;
  1585.     sps->level_idc= level_idc;
  1586.     if(sps->profile_idc >= 100){ //high profile
  1587.         if(get_ue_golomb(&s->gb) == 3) //chroma_format_idc
  1588.             get_bits1(&s->gb);  //residual_color_transform_flag
  1589.         get_ue_golomb(&s->gb);  //bit_depth_luma_minus8
  1590.         get_ue_golomb(&s->gb);  //bit_depth_chroma_minus8
  1591.         sps->transform_bypass = get_bits1(&s->gb);
  1592.         decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
  1593.     }else
  1594.         sps->scaling_matrix_present = 0;
  1595.     sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4;
  1596.     sps->poc_type= get_ue_golomb(&s->gb);
  1597.     if(sps->poc_type == 0){ //FIXME #define
  1598.         sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
  1599.     } else if(sps->poc_type == 1){//FIXME #define
  1600.         sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
  1601.         sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
  1602.         sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb);
  1603.         tmp= get_ue_golomb(&s->gb);
  1604.         if(tmp >= sizeof(sps->offset_for_ref_frame) / sizeof(sps->offset_for_ref_frame[0])){
  1605.             av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %un", tmp);
  1606.             return -1;
  1607.         }
  1608.         sps->poc_cycle_length= tmp;
  1609.         for(i=0; i<sps->poc_cycle_length; i++)
  1610.             sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb);
  1611.     }else if(sps->poc_type != 2){
  1612.         av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %dn", sps->poc_type);
  1613.         return -1;
  1614.     }
  1615.     tmp= get_ue_golomb(&s->gb);
  1616.     if(tmp > MAX_PICTURE_COUNT-2 || tmp >= 32){
  1617.         av_log(h->s.avctx, AV_LOG_ERROR, "too many reference framesn");
  1618.         return -1;
  1619.     }
  1620.     sps->ref_frame_count= tmp;
  1621.     sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb);
  1622.     mb_width= get_ue_golomb(&s->gb) + 1;
  1623.     mb_height= get_ue_golomb(&s->gb) + 1;
  1624.     if(mb_width >= INT_MAX/16 || mb_height >= INT_MAX/16 ||
  1625.        avcodec_check_dimensions(NULL, 16*mb_width, 16*mb_height)){
  1626.         av_log(h->s.avctx, AV_LOG_ERROR, "mb_width/height overflown");
  1627.         return -1;
  1628.     }
  1629.     sps->mb_width = mb_width;
  1630.     sps->mb_height= mb_height;
  1631.     sps->frame_mbs_only_flag= get_bits1(&s->gb);
  1632.     if(!sps->frame_mbs_only_flag)
  1633.         sps->mb_aff= get_bits1(&s->gb);
  1634.     else
  1635.         sps->mb_aff= 0;
  1636.     sps->direct_8x8_inference_flag= get_bits1(&s->gb);
  1637. #ifndef ALLOW_INTERLACE
  1638.     if(sps->mb_aff)
  1639.         av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.n");
  1640. #endif
  1641.     if(!sps->direct_8x8_inference_flag && sps->mb_aff)
  1642.         av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF + !direct_8x8_inference is not implementedn");
  1643.     sps->crop= get_bits1(&s->gb);
  1644.     if(sps->crop){
  1645.         sps->crop_left  = get_ue_golomb(&s->gb);
  1646.         sps->crop_right = get_ue_golomb(&s->gb);
  1647.         sps->crop_top   = get_ue_golomb(&s->gb);
  1648.         sps->crop_bottom= get_ue_golomb(&s->gb);
  1649.         if(sps->crop_left || sps->crop_top){
  1650.             av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...n");
  1651.         }
  1652.         if(sps->crop_right >= 8 || sps->crop_bottom >= (8>> !h->sps.frame_mbs_only_flag)){
  1653.             av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...n");
  1654.         }
  1655.     }else{
  1656.         sps->crop_left  =
  1657.         sps->crop_right =
  1658.         sps->crop_top   =
  1659.         sps->crop_bottom= 0;
  1660.     }
  1661.     sps->vui_parameters_present_flag= get_bits1(&s->gb);
  1662.     if( sps->vui_parameters_present_flag )
  1663.         decode_vui_parameters(h, sps);
  1664.     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
  1665.         av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %sn",
  1666.                sps_id, sps->profile_idc, sps->level_idc,
  1667.                sps->poc_type,
  1668.                sps->ref_frame_count,
  1669.                sps->mb_width, sps->mb_height,
  1670.                sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
  1671.                sps->direct_8x8_inference_flag ? "8B8" : "",
  1672.                sps->crop_left, sps->crop_right,
  1673.                sps->crop_top, sps->crop_bottom,
  1674.                sps->vui_parameters_present_flag ? "VUI" : ""
  1675.                );
  1676.     }
  1677.     return 0;
  1678. }
  1679. static void
  1680. build_qp_table(PPS *pps, int t, int index)
  1681. {
  1682.     int i;
  1683.     for(i = 0; i < 255; i++)
  1684.         pps->chroma_qp_table[t][i & 0xff] = chroma_qp[av_clip(i + index, 0, 51)];
  1685. }
  1686. static inline int decode_picture_parameter_set(H264Context *h, int bit_length){
  1687.     MpegEncContext * const s = &h->s;
  1688.     unsigned int tmp, pps_id= get_ue_golomb(&s->gb);
  1689.     PPS *pps;
  1690.     pps = alloc_parameter_set(h, (void **)h->pps_buffers, pps_id, MAX_PPS_COUNT, sizeof(PPS), "pps");
  1691.     if(pps == NULL)
  1692.         return -1;
  1693.     tmp= get_ue_golomb(&s->gb);
  1694.     if(tmp>=MAX_SPS_COUNT || h->sps_buffers[tmp] == NULL){
  1695.         av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of rangen");
  1696.         return -1;
  1697.     }
  1698.     pps->sps_id= tmp;
  1699.     pps->cabac= get_bits1(&s->gb);
  1700.     pps->pic_order_present= get_bits1(&s->gb);
  1701.     pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
  1702.     if(pps->slice_group_count > 1 ){
  1703.         pps->mb_slice_group_map_type= get_ue_golomb(&s->gb);
  1704.         av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supportedn");
  1705.         switch(pps->mb_slice_group_map_type){
  1706.         case 0:
  1707. #if 0
  1708. |   for( i = 0; i <= num_slice_groups_minus1; i++ ) |   |        |
  1709. |    run_length[ i ]                                |1  |ue(v)   |
  1710. #endif
  1711.             break;
  1712.         case 2:
  1713. #if 0
  1714. |   for( i = 0; i < num_slice_groups_minus1; i++ )  |   |        |
  1715. |{                                                  |   |        |
  1716. |    top_left_mb[ i ]                               |1  |ue(v)   |
  1717. |    bottom_right_mb[ i ]                           |1  |ue(v)   |
  1718. |   }                                               |   |        |
  1719. #endif
  1720.             break;
  1721.         case 3:
  1722.         case 4:
  1723.         case 5:
  1724. #if 0
  1725. |   slice_group_change_direction_flag               |1  |u(1)    |
  1726. |   slice_group_change_rate_minus1                  |1  |ue(v)   |
  1727. #endif
  1728.             break;
  1729.         case 6:
  1730. #if 0
  1731. |   slice_group_id_cnt_minus1                       |1  |ue(v)   |
  1732. |   for( i = 0; i <= slice_group_id_cnt_minus1; i++ |   |        |
  1733. |)                                                  |   |        |
  1734. |    slice_group_id[ i ]                            |1  |u(v)    |
  1735. #endif
  1736.             break;
  1737.         }
  1738.     }
  1739.     pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
  1740.     pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
  1741.     if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){
  1742.         av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)n");
  1743.         pps->ref_count[0]= pps->ref_count[1]= 1;
  1744.         return -1;
  1745.     }
  1746.     pps->weighted_pred= get_bits1(&s->gb);
  1747.     pps->weighted_bipred_idc= get_bits(&s->gb, 2);
  1748.     pps->init_qp= get_se_golomb(&s->gb) + 26;
  1749.     pps->init_qs= get_se_golomb(&s->gb) + 26;
  1750.     pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb);
  1751.     pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
  1752.     pps->constrained_intra_pred= get_bits1(&s->gb);
  1753.     pps->redundant_pic_cnt_present = get_bits1(&s->gb);
  1754.     pps->transform_8x8_mode= 0;
  1755.     h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit
  1756.     memset(pps->scaling_matrix4, 16, 6*16*sizeof(uint8_t));
  1757.     memset(pps->scaling_matrix8, 16, 2*64*sizeof(uint8_t));
  1758.     if(get_bits_count(&s->gb) < bit_length){
  1759.         pps->transform_8x8_mode= get_bits1(&s->gb);
  1760.         decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
  1761.         pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset
  1762.     } else {
  1763.         pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0];
  1764.     }
  1765.     build_qp_table(pps, 0, pps->chroma_qp_index_offset[0]);
  1766.     if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1]) {
  1767.         build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]);
  1768.         h->pps.chroma_qp_diff= 1;
  1769.     } else
  1770.         memcpy(pps->chroma_qp_table[1], pps->chroma_qp_table[0], 256);
  1771.     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
  1772.         av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%u sps:%u %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d/%d %s %s %s %sn",
  1773.                pps_id, pps->sps_id,
  1774.                pps->cabac ? "CABAC" : "CAVLC",
  1775.                pps->slice_group_count,
  1776.                pps->ref_count[0], pps->ref_count[1],
  1777.                pps->weighted_pred ? "weighted" : "",
  1778.                pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1],
  1779.                pps->deblocking_filter_parameters_present ? "LPAR" : "",
  1780.                pps->constrained_intra_pred ? "CONSTR" : "",
  1781.                pps->redundant_pic_cnt_present ? "REDU" : "",
  1782.                pps->transform_8x8_mode ? "8x8DCT" : ""
  1783.                );
  1784.     }
  1785.     return 0;
  1786. }
  1787. /**
  1788.  * Call decode_slice() for each context.
  1789.  *
  1790.  * @param h h264 master context
  1791.  * @param context_count number of contexts to execute
  1792.  */
  1793. static void execute_decode_slices(H264Context *h, int context_count){
  1794.     MpegEncContext * const s = &h->s;
  1795.     AVCodecContext * const avctx= s->avctx;
  1796.     H264Context *hx;
  1797.     int i;
  1798.     if(context_count == 1) {
  1799.         decode_slice(avctx, h);
  1800.     } else {
  1801.         for(i = 1; i < context_count; i++) {
  1802.             hx = h->thread_context[i];
  1803.             hx->s.error_resilience = avctx->error_resilience;
  1804.             hx->s.error_count = 0;
  1805.         }
  1806.         avctx->execute(avctx, (void *)decode_slice,
  1807.                        (void **)h->thread_context, NULL, context_count);
  1808.         /* pull back stuff from slices to master context */
  1809.         hx = h->thread_context[context_count - 1];
  1810.         s->mb_x = hx->s.mb_x;
  1811.         s->mb_y = hx->s.mb_y;
  1812.         s->dropable = hx->s.dropable;
  1813.         s->picture_structure = hx->s.picture_structure;
  1814.         for(i = 1; i < context_count; i++)
  1815.             h->s.error_count += h->thread_context[i]->s.error_count;
  1816.     }
  1817. }
  1818. static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
  1819.     MpegEncContext * const s = &h->s;
  1820.     AVCodecContext * const avctx= s->avctx;
  1821.     int buf_index=0;
  1822.     H264Context *hx; ///< thread context
  1823.     int context_count = 0;
  1824.     h->max_contexts = avctx->thread_count;
  1825. #if 0
  1826.     int i;
  1827.     for(i=0; i<50; i++){
  1828.         av_log(NULL, AV_LOG_ERROR,"%02X ", buf[i]);
  1829.     }
  1830. #endif
  1831.     if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){
  1832.         h->current_slice = 0;
  1833.         if (!s->first_field)
  1834.             s->current_picture_ptr= NULL;
  1835.     }
  1836.     for(;;){
  1837.         int consumed;
  1838.         int dst_length;
  1839.         int bit_length;
  1840.         const uint8_t *ptr;
  1841.         int i, nalsize = 0;
  1842.         int err;
  1843.         if(h->is_avc) {
  1844.             if(buf_index >= buf_size) break;
  1845.             nalsize = 0;
  1846.             for(i = 0; i < h->nal_length_size; i++)
  1847.                 nalsize = (nalsize << 8) | buf[buf_index++];
  1848.             if(nalsize <= 1 || (nalsize+buf_index > buf_size)){
  1849.                 if(nalsize == 1){
  1850.                     buf_index++;
  1851.                     continue;
  1852.                 }else{
  1853.                     av_log(h->s.avctx, AV_LOG_ERROR, "AVC: nal size %dn", nalsize);
  1854.                     break;
  1855.                 }
  1856.             }
  1857.         } else {
  1858.             // start code prefix search
  1859.             for(; buf_index + 3 < buf_size; buf_index++){
  1860.                 // This should always succeed in the first iteration.
  1861.                 if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1)
  1862.                     break;
  1863.             }
  1864.             if(buf_index+3 >= buf_size) break;
  1865.             buf_index+=3;
  1866.         }
  1867.         hx = h->thread_context[context_count];
  1868.         ptr= decode_nal(hx, buf + buf_index, &dst_length, &consumed, h->is_avc ? nalsize : buf_size - buf_index);
  1869.         if (ptr==NULL || dst_length < 0){
  1870.             return -1;
  1871.         }
  1872.         while(ptr[dst_length - 1] == 0 && dst_length > 0)
  1873.             dst_length--;
  1874.         bit_length= !dst_length ? 0 : (8*dst_length - decode_rbsp_trailing(h, ptr + dst_length - 1));
  1875.         if(s->avctx->debug&FF_DEBUG_STARTCODE){
  1876.             av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d at %d/%d length %dn", hx->nal_unit_type, buf_index, buf_size, dst_length);
  1877.         }
  1878.         if (h->is_avc && (nalsize != consumed)){
  1879.             av_log(h->s.avctx, AV_LOG_ERROR, "AVC: Consumed only %d bytes instead of %dn", consumed, nalsize);
  1880.             consumed= nalsize;
  1881.         }
  1882.         buf_index += consumed;
  1883.         if(  (s->hurry_up == 1 && h->nal_ref_idc  == 0) //FIXME do not discard SEI id
  1884.            ||(avctx->skip_frame >= AVDISCARD_NONREF && h->nal_ref_idc  == 0))
  1885.             continue;
  1886.       again:
  1887.         err = 0;
  1888.         switch(hx->nal_unit_type){
  1889.         case NAL_IDR_SLICE:
  1890.             if (h->nal_unit_type != NAL_IDR_SLICE) {
  1891.                 av_log(h->s.avctx, AV_LOG_ERROR, "Invalid mix of idr and non-idr slices");
  1892.                 return -1;
  1893.             }
  1894.             idr(h); //FIXME ensure we don't loose some frames if there is reordering
  1895.         case NAL_SLICE:
  1896.             init_get_bits(&hx->s.gb, ptr, bit_length);
  1897.             hx->intra_gb_ptr=
  1898.             hx->inter_gb_ptr= &hx->s.gb;
  1899.             hx->s.data_partitioning = 0;
  1900.             if((err = decode_slice_header(hx, h)))
  1901.                break;
  1902.             s->current_picture_ptr->key_frame|= (hx->nal_unit_type == NAL_IDR_SLICE);
  1903.             if(hx->redundant_pic_count==0 && hx->s.hurry_up < 5
  1904.                && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc)
  1905.                && (avctx->skip_frame < AVDISCARD_BIDIR  || hx->slice_type!=FF_B_TYPE)
  1906.                && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type==FF_I_TYPE)
  1907.                && avctx->skip_frame < AVDISCARD_ALL)
  1908.                 context_count++;
  1909.             break;
  1910.         case NAL_DPA:
  1911.             init_get_bits(&hx->s.gb, ptr, bit_length);
  1912.             hx->intra_gb_ptr=
  1913.             hx->inter_gb_ptr= NULL;
  1914.             hx->s.data_partitioning = 1;
  1915.             err = decode_slice_header(hx, h);
  1916.             break;
  1917.         case NAL_DPB:
  1918.             init_get_bits(&hx->intra_gb, ptr, bit_length);
  1919.             hx->intra_gb_ptr= &hx->intra_gb;
  1920.             break;
  1921.         case NAL_DPC:
  1922.             init_get_bits(&hx->inter_gb, ptr, bit_length);
  1923.             hx->inter_gb_ptr= &hx->inter_gb;
  1924.             if(hx->redundant_pic_count==0 && hx->intra_gb_ptr && hx->s.data_partitioning
  1925.                && s->context_initialized
  1926.                && s->hurry_up < 5
  1927.                && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc)
  1928.                && (avctx->skip_frame < AVDISCARD_BIDIR  || hx->slice_type!=FF_B_TYPE)
  1929.                && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type==FF_I_TYPE)
  1930.                && avctx->skip_frame < AVDISCARD_ALL)
  1931.                 context_count++;
  1932.             break;
  1933.         case NAL_SEI:
  1934.             init_get_bits(&s->gb, ptr, bit_length);
  1935.             decode_sei(h);
  1936.             break;
  1937.         case NAL_SPS:
  1938.             init_get_bits(&s->gb, ptr, bit_length);
  1939.             decode_seq_parameter_set(h);
  1940.             if(s->flags& CODEC_FLAG_LOW_DELAY)
  1941.                 s->low_delay=1;
  1942.             if(avctx->has_b_frames < 2)
  1943.                 avctx->has_b_frames= !s->low_delay;
  1944.             break;
  1945.         case NAL_PPS:
  1946.             init_get_bits(&s->gb, ptr, bit_length);
  1947.             decode_picture_parameter_set(h, bit_length);
  1948.             break;
  1949.         case NAL_AUD:
  1950.         case NAL_END_SEQUENCE:
  1951.         case NAL_END_STREAM:
  1952.         case NAL_FILLER_DATA:
  1953.         case NAL_SPS_EXT:
  1954.         case NAL_AUXILIARY_SLICE:
  1955.             break;
  1956.         default:
  1957.             av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d bits)n", h->nal_unit_type, bit_length);
  1958.         }
  1959.         if(context_count == h->max_contexts) {
  1960.             execute_decode_slices(h, context_count);
  1961.             context_count = 0;
  1962.         }
  1963.         if (err < 0)
  1964.             av_log(h->s.avctx, AV_LOG_ERROR, "decode_slice_header errorn");
  1965.         else if(err == 1) {
  1966.             /* Slice could not be decoded in parallel mode, copy down
  1967.              * NAL unit stuff to context 0 and restart. Note that
  1968.              * rbsp_buffer is not transfered, but since we no longer
  1969.              * run in parallel mode this should not be an issue. */
  1970.             h->nal_unit_type = hx->nal_unit_type;
  1971.             h->nal_ref_idc   = hx->nal_ref_idc;
  1972.             hx = h;
  1973.             goto again;
  1974.         }
  1975.     }
  1976.     if(context_count)
  1977.         execute_decode_slices(h, context_count);
  1978.     return buf_index;
  1979. }
  1980. /**
  1981.  * returns the number of bytes consumed for building the current frame
  1982.  */
  1983. static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){
  1984.     if(s->flags&CODEC_FLAG_TRUNCATED){
  1985.         pos -= s->parse_context.last_index;
  1986.         if(pos<0) pos=0; // FIXME remove (unneeded?)
  1987.         return pos;
  1988.     }else{
  1989.         if(pos==0) pos=1; //avoid infinite loops (i doubt that is needed but ...)
  1990.         if(pos+10>buf_size) pos=buf_size; // oops ;)
  1991.         return pos;
  1992.     }
  1993. }
  1994. static int decode_frame(AVCodecContext *avctx,
  1995.                              void *data, int *data_size,
  1996.                              const uint8_t *buf, int buf_size)
  1997. {
  1998.     H264Context *h = avctx->priv_data;
  1999.     MpegEncContext *s = &h->s;
  2000.     AVFrame *pict = data;
  2001.     int buf_index;
  2002.     s->flags= avctx->flags;
  2003.     s->flags2= avctx->flags2;
  2004.     if(s->flags&CODEC_FLAG_TRUNCATED){
  2005.         const int next= ff_h264_find_frame_end(h, buf, buf_size);
  2006.         assert((buf_size > 0) || (next == END_NOT_FOUND));
  2007.         if( ff_combine_frame(&s->parse_context, next, &buf, &buf_size) < 0 )
  2008.           return buf_size;
  2009. //printf("next:%d buf_size:%d last_index:%dn", next, buf_size, s->parse_context.last_index);
  2010.     }
  2011.    /* no supplementary picture */
  2012.     if (buf_size == 0) {
  2013.         Picture *out;
  2014.         int i, out_idx;
  2015. //FIXME factorize this with the output code below
  2016.         out = h->delayed_pic[0];
  2017.         out_idx = 0;
  2018.         for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame; i++)
  2019.             if(h->delayed_pic[i]->poc < out->poc){
  2020.                 out = h->delayed_pic[i];
  2021.                 out_idx = i;
  2022.             }
  2023.         for(i=out_idx; h->delayed_pic[i]; i++)
  2024.             h->delayed_pic[i] = h->delayed_pic[i+1];
  2025.         if(out){
  2026.             *data_size = sizeof(AVFrame);
  2027.             *pict= *(AVFrame*)out;
  2028.         }
  2029.         return 0;
  2030.     }
  2031.     if(h->is_avc && !h->got_avcC) {
  2032.         int i, cnt, nalsize;
  2033.         unsigned char *p = avctx->extradata;
  2034.         if(avctx->extradata_size < 7) {
  2035.             av_log(avctx, AV_LOG_ERROR, "avcC too shortn");
  2036.             return -1;
  2037.         }
  2038.         if(*p != 1) {
  2039.             av_log(avctx, AV_LOG_ERROR, "Unknown avcC version %dn", *p);
  2040.             return -1;
  2041.         }
  2042.         /* sps and pps in the avcC always have length coded with 2 bytes,
  2043.            so put a fake nal_length_size = 2 while parsing them */
  2044.         h->nal_length_size = 2;
  2045.         // Decode sps from avcC
  2046.         cnt = *(p+5) & 0x1f; // Number of sps
  2047.         p += 6;
  2048.         for (i = 0; i < cnt; i++) {
  2049.             nalsize = AV_RB16(p) + 2;
  2050.             if(decode_nal_units(h, p, nalsize) < 0) {
  2051.                 av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failedn", i);
  2052.                 return -1;
  2053.             }
  2054.             p += nalsize;
  2055.         }
  2056.         // Decode pps from avcC
  2057.         cnt = *(p++); // Number of pps
  2058.         for (i = 0; i < cnt; i++) {
  2059.             nalsize = AV_RB16(p) + 2;
  2060.             if(decode_nal_units(h, p, nalsize)  != nalsize) {
  2061.                 av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failedn", i);
  2062.                 return -1;
  2063.             }
  2064.             p += nalsize;
  2065.         }
  2066.         // Now store right nal length size, that will be use to parse all other nals
  2067.         h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1;
  2068.         // Do not reparse avcC
  2069.         h->got_avcC = 1;
  2070.     }
  2071.     if(avctx->frame_number==0 && !h->is_avc && s->avctx->extradata_size){
  2072.         if(decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) < 0)
  2073.             return -1;
  2074.     }
  2075.     buf_index=decode_nal_units(h, buf, buf_size);
  2076.     if(buf_index < 0)
  2077.         return -1;
  2078.     if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){
  2079.         if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0;
  2080.         av_log(avctx, AV_LOG_ERROR, "no frame!n");
  2081.         return -1;
  2082.     }
  2083.     if(!(s->flags2 & CODEC_FLAG2_CHUNKS) || (s->mb_y >= s->mb_height && s->mb_height)){
  2084.         Picture *out = s->current_picture_ptr;
  2085.         Picture *cur = s->current_picture_ptr;
  2086.         Picture *prev = h->delayed_output_pic;
  2087.         int i, pics, cross_idr, out_of_order, out_idx;
  2088.         s->mb_y= 0;
  2089.         s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264;
  2090.         s->current_picture_ptr->pict_type= s->pict_type;
  2091.         h->prev_frame_num_offset= h->frame_num_offset;
  2092.         h->prev_frame_num= h->frame_num;
  2093.         if(!s->dropable) {
  2094.             h->prev_poc_msb= h->poc_msb;
  2095.             h->prev_poc_lsb= h->poc_lsb;
  2096.             execute_ref_pic_marking(h, h->mmco, h->mmco_index);
  2097.         }
  2098.         /*
  2099.          * FIXME: Error handling code does not seem to support interlaced
  2100.          * when slices span multiple rows
  2101.          * The ff_er_add_slice calls don't work right for bottom
  2102.          * fields; they cause massive erroneous error concealing
  2103.          * Error marking covers both fields (top and bottom).
  2104.          * This causes a mismatched s->error_count
  2105.          * and a bad error table. Further, the error count goes to
  2106.          * INT_MAX when called for bottom field, because mb_y is
  2107.          * past end by one (callers fault) and resync_mb_y != 0
  2108.          * causes problems for the first MB line, too.
  2109.          */
  2110.         if (!FIELD_PICTURE)
  2111.             ff_er_frame_end(s);
  2112.         MPV_frame_end(s);
  2113.         if (s->first_field) {
  2114.             /* Wait for second field. */
  2115.             *data_size = 0;
  2116.         } else {
  2117.             cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE;
  2118.             /* Derive top_field_first from field pocs. */
  2119.             cur->top_field_first = cur->field_poc[0] < cur->field_poc[1];
  2120.         //FIXME do something with unavailable reference frames
  2121. #if 0 //decode order
  2122.             *data_size = sizeof(AVFrame);
  2123. #else
  2124.             /* Sort B-frames into display order */
  2125.             if(h->sps.bitstream_restriction_flag
  2126.                && s->avctx->has_b_frames < h->sps.num_reorder_frames){
  2127.                 s->avctx->has_b_frames = h->sps.num_reorder_frames;
  2128.                 s->low_delay = 0;
  2129.             }
  2130.             pics = 0;
  2131.             while(h->delayed_pic[pics]) pics++;
  2132.             assert(pics+1 < sizeof(h->delayed_pic) / sizeof(h->delayed_pic[0]));
  2133.             h->delayed_pic[pics++] = cur;
  2134.             if(cur->reference == 0)
  2135.                 cur->reference = DELAYED_PIC_REF;
  2136.             cross_idr = 0;
  2137.             for(i=0; h->delayed_pic[i]; i++)
  2138.                 if(h->delayed_pic[i]->key_frame || h->delayed_pic[i]->poc==0)
  2139.                     cross_idr = 1;
  2140.             out = h->delayed_pic[0];
  2141.             out_idx = 0;
  2142.             for(i=1; h->delayed_pic[i] && !h->delayed_pic[i]->key_frame; i++)
  2143.                 if(h->delayed_pic[i]->poc < out->poc){
  2144.                     out = h->delayed_pic[i];
  2145.                     out_idx = i;
  2146.                 }
  2147.             out_of_order = !cross_idr && prev && out->poc < prev->poc;
  2148.             if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames)
  2149.                 { }
  2150.             else if(prev && pics <= s->avctx->has_b_frames)
  2151.                 out = prev;
  2152.             else if((out_of_order && pics-1 == s->avctx->has_b_frames && pics < 15)
  2153.                || (s->low_delay &&
  2154.                 ((!cross_idr && prev && out->poc > prev->poc + 2)
  2155.                  || cur->pict_type == FF_B_TYPE)))
  2156.             {
  2157.                 s->low_delay = 0;
  2158.                 s->avctx->has_b_frames++;
  2159.                 out = prev;
  2160.             }
  2161.             else if(out_of_order)
  2162.                 out = prev;
  2163.             if(out_of_order || pics > s->avctx->has_b_frames){
  2164.                 for(i=out_idx; h->delayed_pic[i]; i++)
  2165.                     h->delayed_pic[i] = h->delayed_pic[i+1];
  2166.             }
  2167.             if(prev == out)
  2168.                 *data_size = 0;
  2169.             else
  2170.                 *data_size = sizeof(AVFrame);
  2171.             if(prev && prev != out && prev->reference == DELAYED_PIC_REF)
  2172.                 prev->reference = 0;
  2173.             h->delayed_output_pic = out;
  2174. #endif
  2175.             if(out)
  2176.                 *pict= *(AVFrame*)out;
  2177.             else
  2178.                 av_log(avctx, AV_LOG_DEBUG, "no picturen");
  2179.         }
  2180.     }
  2181.     assert(pict->data[0] || !*data_size);
  2182.     ff_print_debug_info(s, pict);
  2183. //printf("out %dn", (int)pict->data[0]);
  2184. #if 0 //?
  2185.     /* Return the Picture timestamp as the frame number */
  2186.     /* we subtract 1 because it is added on utils.c     */
  2187.     avctx->frame_number = s->picture_number - 1;
  2188. #endif
  2189.     return get_consumed_bytes(s, buf_index, buf_size);
  2190. }
  2191. #if 0
  2192. static inline void fill_mb_avail(H264Context *h){
  2193.     MpegEncContext * const s = &h->s;
  2194.     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  2195.     if(s->mb_y){
  2196.         h->mb_avail[0]= s->mb_x                 && h->slice_table[mb_xy - s->mb_stride - 1] == h->slice_num;
  2197.         h->mb_avail[1]=                            h->slice_table[mb_xy - s->mb_stride    ] == h->slice_num;
  2198.         h->mb_avail[2]= s->mb_x+1 < s->mb_width && h->slice_table[mb_xy - s->mb_stride + 1] == h->slice_num;
  2199.     }else{
  2200.         h->mb_avail[0]=
  2201.         h->mb_avail[1]=
  2202.         h->mb_avail[2]= 0;
  2203.     }
  2204.     h->mb_avail[3]= s->mb_x && h->slice_table[mb_xy - 1] == h->slice_num;
  2205.     h->mb_avail[4]= 1; //FIXME move out
  2206.     h->mb_avail[5]= 0; //FIXME move out
  2207. }
  2208. #endif
  2209. #ifdef TEST
  2210. #undef printf
  2211. #undef random
  2212. #define COUNT 8000
  2213. #define SIZE (COUNT*40)
  2214. int main(void){
  2215.     int i;
  2216.     uint8_t temp[SIZE];
  2217.     PutBitContext pb;
  2218.     GetBitContext gb;
  2219. //    int int_temp[10000];
  2220.     DSPContext dsp;
  2221.     AVCodecContext avctx;
  2222.     dsputil_init(&dsp, &avctx);
  2223.     init_put_bits(&pb, temp, SIZE);
  2224.     printf("testing unsigned exp golombn");
  2225.     for(i=0; i<COUNT; i++){
  2226.         START_TIMER
  2227.         set_ue_golomb(&pb, i);
  2228.         STOP_TIMER("set_ue_golomb");
  2229.     }
  2230.     flush_put_bits(&pb);
  2231.     init_get_bits(&gb, temp, 8*SIZE);
  2232.     for(i=0; i<COUNT; i++){
  2233.         int j, s;
  2234.         s= show_bits(&gb, 24);
  2235.         START_TIMER
  2236.         j= get_ue_golomb(&gb);
  2237.         if(j != i){
  2238.             printf("mismatch! at %d (%d should be %d) bits:%6Xn", i, j, i, s);
  2239. //            return -1;
  2240.         }
  2241.         STOP_TIMER("get_ue_golomb");
  2242.     }
  2243.     init_put_bits(&pb, temp, SIZE);
  2244.     printf("testing signed exp golombn");
  2245.     for(i=0; i<COUNT; i++){
  2246.         START_TIMER
  2247.         set_se_golomb(&pb, i - COUNT/2);
  2248.         STOP_TIMER("set_se_golomb");
  2249.     }
  2250.     flush_put_bits(&pb);
  2251.     init_get_bits(&gb, temp, 8*SIZE);
  2252.     for(i=0; i<COUNT; i++){
  2253.         int j, s;
  2254.         s= show_bits(&gb, 24);
  2255.         START_TIMER
  2256.         j= get_se_golomb(&gb);
  2257.         if(j != i - COUNT/2){
  2258.             printf("mismatch! at %d (%d should be %d) bits:%6Xn", i, j, i, s);
  2259. //            return -1;
  2260.         }
  2261.         STOP_TIMER("get_se_golomb");
  2262.     }
  2263. #if 0
  2264.     printf("testing 4x4 (I)DCTn");
  2265.     DCTELEM block[16];
  2266.     uint8_t src[16], ref[16];
  2267.     uint64_t error= 0, max_error=0;
  2268.     for(i=0; i<COUNT; i++){
  2269.         int j;
  2270. //        printf("%d %d %dn", r1, r2, (r2-r1)*16);
  2271.         for(j=0; j<16; j++){
  2272.             ref[j]= random()%255;
  2273.             src[j]= random()%255;
  2274.         }
  2275.         h264_diff_dct_c(block, src, ref, 4);
  2276.         //normalize
  2277.         for(j=0; j<16; j++){
  2278. //            printf("%d ", block[j]);
  2279.             block[j]= block[j]*4;
  2280.             if(j&1) block[j]= (block[j]*4 + 2)/5;
  2281.             if(j&4) block[j]= (block[j]*4 + 2)/5;
  2282.         }
  2283. //        printf("n");
  2284.         s->dsp.h264_idct_add(ref, block, 4);
  2285. /*        for(j=0; j<16; j++){
  2286.             printf("%d ", ref[j]);
  2287.         }
  2288.         printf("n");*/
  2289.         for(j=0; j<16; j++){
  2290.             int diff= FFABS(src[j] - ref[j]);
  2291.             error+= diff*diff;
  2292.             max_error= FFMAX(max_error, diff);
  2293.         }
  2294.     }
  2295.     printf("error=%f max_error=%dn", ((float)error)/COUNT/16, (int)max_error );
  2296.     printf("testing quantizern");
  2297.     for(qp=0; qp<52; qp++){
  2298.         for(i=0; i<16; i++)
  2299.             src1_block[i]= src2_block[i]= random()%255;
  2300.     }
  2301.     printf("Testing NAL layern");
  2302.     uint8_t bitstream[COUNT];
  2303.     uint8_t nal[COUNT*2];
  2304.     H264Context h;
  2305.     memset(&h, 0, sizeof(H264Context));
  2306.     for(i=0; i<COUNT; i++){
  2307.         int zeros= i;
  2308.         int nal_length;
  2309.         int consumed;
  2310.         int out_length;
  2311.         uint8_t *out;
  2312.         int j;
  2313.         for(j=0; j<COUNT; j++){
  2314.             bitstream[j]= (random() % 255) + 1;
  2315.         }
  2316.         for(j=0; j<zeros; j++){
  2317.             int pos= random() % COUNT;
  2318.             while(bitstream[pos] == 0){
  2319.                 pos++;
  2320.                 pos %= COUNT;
  2321.             }
  2322.             bitstream[pos]=0;
  2323.         }
  2324.         START_TIMER
  2325.         nal_length= encode_nal(&h, nal, bitstream, COUNT, COUNT*2);
  2326.         if(nal_length<0){
  2327.             printf("encoding failedn");
  2328.             return -1;
  2329.         }
  2330.         out= decode_nal(&h, nal, &out_length, &consumed, nal_length);
  2331.         STOP_TIMER("NAL")
  2332.         if(out_length != COUNT){
  2333.             printf("incorrect length %d %dn", out_length, COUNT);
  2334.             return -1;
  2335.         }
  2336.         if(consumed != nal_length){
  2337.             printf("incorrect consumed length %d %dn", nal_length, consumed);
  2338.             return -1;
  2339.         }
  2340.         if(memcmp(bitstream, out, COUNT)){
  2341.             printf("mismatchn");
  2342.             return -1;
  2343.         }
  2344.     }
  2345. #endif
  2346.     printf("Testing RBSPn");
  2347.     return 0;
  2348. }
  2349. #endif /* TEST */
  2350. static av_cold int decode_end(AVCodecContext *avctx)
  2351. {
  2352.     H264Context *h = avctx->priv_data;
  2353.     MpegEncContext *s = &h->s;
  2354.     av_freep(&h->rbsp_buffer[0]);
  2355.     av_freep(&h->rbsp_buffer[1]);
  2356.     free_tables(h); //FIXME cleanup init stuff perhaps
  2357.     MPV_common_end(s);
  2358. //    memset(h, 0, sizeof(H264Context));
  2359.     return 0;
  2360. }
  2361. AVCodec h264_decoder = {
  2362.     "h264",
  2363.     CODEC_TYPE_VIDEO,
  2364.     CODEC_ID_H264,
  2365.     sizeof(H264Context),
  2366.     decode_init,
  2367.     NULL,
  2368.     decode_end,
  2369.     decode_frame,
  2370.     /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
  2371.      flush_dpb,
  2372.      NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
  2373. };
  2374. #include "svq3.c"