h264.c
上传用户:chinavct
上传日期:2022-06-20
资源大小:330k
文件大小:325k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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