h264.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:214k
源码类别:

Audio

开发平台:

Visual C++

  1.         if(h->nal_ref_idc==0 && abs_frame_num > 0)
  2.             abs_frame_num--;
  3.             
  4.         expected_delta_per_poc_cycle = 0;
  5.         for(i=0; i < h->sps.poc_cycle_length; i++)
  6.             expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[ i ]; //FIXME integrate during sps parse
  7.         if(abs_frame_num > 0){
  8.             int poc_cycle_cnt          = (abs_frame_num - 1) / h->sps.poc_cycle_length;
  9.             int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length;
  10.             expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle;
  11.             for(i = 0; i <= frame_num_in_poc_cycle; i++)
  12.                 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[ i ];
  13.         } else
  14.             expectedpoc = 0;
  15.         if(h->nal_ref_idc == 0) 
  16.             expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic;
  17.         
  18.         field_poc[0] = expectedpoc + h->delta_poc[0];
  19.         field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field;
  20.         if(s->picture_structure == PICT_FRAME)
  21.             field_poc[1] += h->delta_poc[1];
  22.     }else{
  23.         int poc;
  24.         if(h->nal_unit_type == NAL_IDR_SLICE){
  25.             poc= 0;
  26.         }else{
  27.             if(h->nal_ref_idc) poc= 2*(h->frame_num_offset + h->frame_num);
  28.             else               poc= 2*(h->frame_num_offset + h->frame_num) - 1;
  29.         }
  30.         field_poc[0]= poc;
  31.         field_poc[1]= poc;
  32.     }
  33.     
  34.     if(s->picture_structure != PICT_BOTTOM_FIELD)
  35.         s->current_picture_ptr->field_poc[0]= field_poc[0];
  36.     if(s->picture_structure != PICT_TOP_FIELD)
  37.         s->current_picture_ptr->field_poc[1]= field_poc[1];
  38.     if(s->picture_structure == PICT_FRAME) // FIXME field pix?
  39.         s->current_picture_ptr->poc= FFMIN(field_poc[0], field_poc[1]);
  40.     return 0;
  41. }
  42. /**
  43.  * decodes a slice header.
  44.  * this will allso call MPV_common_init() and frame_start() as needed
  45.  */
  46. static int decode_slice_header(H264Context *h){
  47.     MpegEncContext * const s = &h->s;
  48.     int first_mb_in_slice, pps_id;
  49.     int num_ref_idx_active_override_flag;
  50.     static const uint8_t slice_type_map[5]= {P_TYPE, B_TYPE, I_TYPE, SP_TYPE, SI_TYPE};
  51.     s->current_picture.reference= h->nal_ref_idc != 0;
  52.     first_mb_in_slice= get_ue_golomb(&s->gb);
  53.     h->slice_type= get_ue_golomb(&s->gb);
  54.     if(h->slice_type > 9){
  55.         av_log(h->s.avctx, AV_LOG_ERROR, "slice type too large (%d) at %d %dn", h->slice_type, s->mb_x, s->mb_y);
  56.     }
  57.     if(h->slice_type > 4){
  58.         h->slice_type -= 5;
  59.         h->slice_type_fixed=1;
  60.     }else
  61.         h->slice_type_fixed=0;
  62.     
  63.     h->slice_type= slice_type_map[ h->slice_type ];
  64.     
  65.     s->pict_type= h->slice_type; // to make a few old func happy, its wrong though
  66.         
  67.     pps_id= get_ue_golomb(&s->gb);
  68.     if(pps_id>255){
  69.         av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of rangen");
  70.         return -1;
  71.     }
  72.     h->pps= h->pps_buffer[pps_id];
  73.     if(h->pps.slice_group_count == 0){
  74.         av_log(h->s.avctx, AV_LOG_ERROR, "non existing PPS referencedn");
  75.         return -1;
  76.     }
  77.     h->sps= h->sps_buffer[ h->pps.sps_id ];
  78.     if(h->sps.log2_max_frame_num == 0){
  79.         av_log(h->s.avctx, AV_LOG_ERROR, "non existing SPS referencedn");
  80.         return -1;
  81.     }
  82.     
  83.     s->mb_width= h->sps.mb_width;
  84.     s->mb_height= h->sps.mb_height;
  85.     
  86.     h->b_stride=  s->mb_width*4;
  87.     h->b8_stride= s->mb_width*2;
  88.     s->mb_x = first_mb_in_slice % s->mb_width;
  89.     s->mb_y = first_mb_in_slice / s->mb_width; //FIXME AFFW
  90.     
  91.     s->width = 16*s->mb_width - 2*(h->sps.crop_left + h->sps.crop_right );
  92.     if(h->sps.frame_mbs_only_flag)
  93.         s->height= 16*s->mb_height - 2*(h->sps.crop_top  + h->sps.crop_bottom);
  94.     else
  95.         s->height= 16*s->mb_height - 4*(h->sps.crop_top  + h->sps.crop_bottom); //FIXME recheck
  96.     
  97.     if (s->context_initialized 
  98.         && (   s->width != s->avctx->width || s->height != s->avctx->height)) {
  99.         free_tables(h);
  100.         MPV_common_end(s);
  101.     }
  102.     if (!s->context_initialized) {
  103.         if (MPV_common_init(s) < 0)
  104.             return -1;
  105.         alloc_tables(h);
  106.         s->avctx->width = s->width;
  107.         s->avctx->height = s->height;
  108.         s->avctx->sample_aspect_ratio= h->sps.sar;
  109.     }
  110.     if(first_mb_in_slice == 0){
  111.         frame_start(h);
  112.     }
  113.     s->current_picture_ptr->frame_num= //FIXME frame_num cleanup
  114.     h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num);
  115.     if(h->sps.frame_mbs_only_flag){
  116.         s->picture_structure= PICT_FRAME;
  117.     }else{
  118.         if(get_bits1(&s->gb)) //field_pic_flag
  119.             s->picture_structure= PICT_TOP_FIELD + get_bits1(&s->gb); //bottom_field_flag
  120.         else
  121.             s->picture_structure= PICT_FRAME;
  122.     }
  123.     if(s->picture_structure==PICT_FRAME){
  124.         h->curr_pic_num=   h->frame_num;
  125.         h->max_pic_num= 1<< h->sps.log2_max_frame_num;
  126.     }else{
  127.         h->curr_pic_num= 2*h->frame_num;
  128.         h->max_pic_num= 1<<(h->sps.log2_max_frame_num + 1);
  129.     }
  130.         
  131.     if(h->nal_unit_type == NAL_IDR_SLICE){
  132.         get_ue_golomb(&s->gb); /* idr_pic_id */
  133.     }
  134.    
  135.     if(h->sps.poc_type==0){
  136.         h->poc_lsb= get_bits(&s->gb, h->sps.log2_max_poc_lsb);
  137.         
  138.         if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME){
  139.             h->delta_poc_bottom= get_se_golomb(&s->gb);
  140.         }
  141.     }
  142.     
  143.     if(h->sps.poc_type==1 && !h->sps.delta_pic_order_always_zero_flag){
  144.         h->delta_poc[0]= get_se_golomb(&s->gb);
  145.         
  146.         if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME)
  147.             h->delta_poc[1]= get_se_golomb(&s->gb);
  148.     }
  149.     
  150.     init_poc(h);
  151.     
  152.     if(h->pps.redundant_pic_cnt_present){
  153.         h->redundant_pic_count= get_ue_golomb(&s->gb);
  154.     }
  155.     //set defaults, might be overriden a few line later
  156.     h->ref_count[0]= h->pps.ref_count[0];
  157.     h->ref_count[1]= h->pps.ref_count[1];
  158.     if(h->slice_type == P_TYPE || h->slice_type == SP_TYPE || h->slice_type == B_TYPE){
  159.         if(h->slice_type == B_TYPE){
  160.             h->direct_spatial_mv_pred= get_bits1(&s->gb);
  161.         }
  162.         num_ref_idx_active_override_flag= get_bits1(&s->gb);
  163.     
  164.         if(num_ref_idx_active_override_flag){
  165.             h->ref_count[0]= get_ue_golomb(&s->gb) + 1;
  166.             if(h->slice_type==B_TYPE)
  167.                 h->ref_count[1]= get_ue_golomb(&s->gb) + 1;
  168.             if(h->ref_count[0] > 32 || h->ref_count[1] > 32){
  169.                 av_log(h->s.avctx, AV_LOG_ERROR, "reference overflown");
  170.                 return -1;
  171.             }
  172.         }
  173.     }
  174.     if(first_mb_in_slice == 0){
  175.         fill_default_ref_list(h);
  176.     }
  177.     decode_ref_pic_list_reordering(h);
  178.     if(   (h->pps.weighted_pred          && (h->slice_type == P_TYPE || h->slice_type == SP_TYPE )) 
  179.        || (h->pps.weighted_bipred_idc==1 && h->slice_type==B_TYPE ) )
  180.         pred_weight_table(h);
  181.     
  182.     if(s->current_picture.reference)
  183.         decode_ref_pic_marking(h);
  184.     if( h->slice_type != I_TYPE && h->slice_type != SI_TYPE && h->pps.cabac )
  185.         h->cabac_init_idc = get_ue_golomb(&s->gb);
  186.     h->last_qscale_diff = 0;
  187.     s->qscale = h->pps.init_qp + get_se_golomb(&s->gb);
  188.     if(s->qscale<0 || s->qscale>51){
  189.         av_log(s->avctx, AV_LOG_ERROR, "QP %d out of rangen", s->qscale);
  190.         return -1;
  191.     }
  192.     //FIXME qscale / qp ... stuff
  193.     if(h->slice_type == SP_TYPE){
  194.         get_bits1(&s->gb); /* sp_for_switch_flag */
  195.     }
  196.     if(h->slice_type==SP_TYPE || h->slice_type == SI_TYPE){
  197.         get_se_golomb(&s->gb); /* slice_qs_delta */
  198.     }
  199.     h->deblocking_filter = 1;
  200.     h->slice_alpha_c0_offset = 0;
  201.     h->slice_beta_offset = 0;
  202.     if( h->pps.deblocking_filter_parameters_present ) {
  203.         h->deblocking_filter= get_ue_golomb(&s->gb);
  204.         if(h->deblocking_filter < 2) 
  205.             h->deblocking_filter^= 1; // 1<->0
  206.         if( h->deblocking_filter ) {
  207.             h->slice_alpha_c0_offset = get_se_golomb(&s->gb) << 1;
  208.             h->slice_beta_offset = get_se_golomb(&s->gb) << 1;
  209.         }
  210.     }
  211. #if 0 //FMO
  212.     if( h->pps.num_slice_groups > 1  && h->pps.mb_slice_group_map_type >= 3 && h->pps.mb_slice_group_map_type <= 5)
  213.         slice_group_change_cycle= get_bits(&s->gb, ?);
  214. #endif
  215.     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
  216.         av_log(h->s.avctx, AV_LOG_DEBUG, "mb:%d %c pps:%d frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%dn", 
  217.                first_mb_in_slice, 
  218.                av_get_pict_type_char(h->slice_type),
  219.                pps_id, h->frame_num,
  220.                s->current_picture_ptr->field_poc[0], s->current_picture_ptr->field_poc[1],
  221.                h->ref_count[0], h->ref_count[1],
  222.                s->qscale,
  223.                h->deblocking_filter
  224.                );
  225.     }
  226.     return 0;
  227. }
  228. /**
  229.  *
  230.  */
  231. static inline int get_level_prefix(GetBitContext *gb){
  232.     unsigned int buf;
  233.     int log;
  234.     
  235.     OPEN_READER(re, gb);
  236.     UPDATE_CACHE(re, gb);
  237.     buf=GET_CACHE(re, gb);
  238.     
  239.     log= 32 - av_log2(buf);
  240. #ifdef TRACE
  241.     print_bin(buf>>(32-log), log);
  242.     printf("%5d %2d %3d lpr @%5d in %s get_level_prefixn", buf>>(32-log), log, log-1, get_bits_count(gb), __FILE__);
  243. #endif
  244.     LAST_SKIP_BITS(re, gb, log);
  245.     CLOSE_READER(re, gb);
  246.     return log-1;
  247. }
  248. /**
  249.  * decodes a residual block.
  250.  * @param n block index
  251.  * @param scantable scantable
  252.  * @param max_coeff number of coefficients in the block
  253.  * @return <0 if an error occured
  254.  */
  255. static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, int n, const uint8_t *scantable, int qp, int max_coeff){
  256.     MpegEncContext * const s = &h->s;
  257.     const uint16_t *qmul= dequant_coeff[qp];
  258.     static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3};
  259.     int level[16], run[16];
  260.     int suffix_length, zeros_left, coeff_num, coeff_token, total_coeff, i, trailing_ones;
  261.     //FIXME put trailing_onex into the context
  262.     if(n == CHROMA_DC_BLOCK_INDEX){
  263.         coeff_token= get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1);
  264.         total_coeff= coeff_token>>2;
  265.     }else{    
  266.         if(n == LUMA_DC_BLOCK_INDEX){
  267.             total_coeff= pred_non_zero_count(h, 0);
  268.             coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
  269.             total_coeff= coeff_token>>2;
  270.         }else{
  271.             total_coeff= pred_non_zero_count(h, n);
  272.             coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
  273.             total_coeff= coeff_token>>2;
  274.             h->non_zero_count_cache[ scan8[n] ]= total_coeff;
  275.         }
  276.     }
  277.     //FIXME set last_non_zero?
  278.     if(total_coeff==0)
  279.         return 0;
  280.         
  281.     trailing_ones= coeff_token&3;
  282.     tprintf("trailing:%d, total:%dn", trailing_ones, total_coeff);
  283.     assert(total_coeff<=16);
  284.     
  285.     for(i=0; i<trailing_ones; i++){
  286.         level[i]= 1 - 2*get_bits1(gb);
  287.     }
  288.     suffix_length= total_coeff > 10 && trailing_ones < 3;
  289.     for(; i<total_coeff; i++){
  290.         const int prefix= get_level_prefix(gb);
  291.         int level_code, mask;
  292.         if(prefix<14){ //FIXME try to build a large unified VLC table for all this
  293.             if(suffix_length)
  294.                 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
  295.             else
  296.                 level_code= (prefix<<suffix_length); //part
  297.         }else if(prefix==14){
  298.             if(suffix_length)
  299.                 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
  300.             else
  301.                 level_code= prefix + get_bits(gb, 4); //part
  302.         }else if(prefix==15){
  303.             level_code= (prefix<<suffix_length) + get_bits(gb, 12); //part
  304.             if(suffix_length==0) level_code+=15; //FIXME doesnt make (much)sense
  305.         }else{
  306.             av_log(h->s.avctx, AV_LOG_ERROR, "prefix too large at %d %dn", s->mb_x, s->mb_y);
  307.             return -1;
  308.         }
  309.         if(i==trailing_ones && i<3) level_code+= 2; //FIXME split first iteration
  310.         mask= -(level_code&1);
  311.         level[i]= (((2+level_code)>>1) ^ mask) - mask;
  312.         if(suffix_length==0) suffix_length=1; //FIXME split first iteration
  313. #if 1
  314.         if(ABS(level[i]) > (3<<(suffix_length-1)) && suffix_length<6) suffix_length++;
  315. #else        
  316.         if((2+level_code)>>1) > (3<<(suffix_length-1)) && suffix_length<6) suffix_length++;
  317.         /* ? == prefix > 2 or sth */
  318. #endif
  319.         tprintf("level: %d suffix_length:%dn", level[i], suffix_length);
  320.     }
  321.     if(total_coeff == max_coeff)
  322.         zeros_left=0;
  323.     else{
  324.         if(n == CHROMA_DC_BLOCK_INDEX)
  325.             zeros_left= get_vlc2(gb, chroma_dc_total_zeros_vlc[ total_coeff-1 ].table, CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1);
  326.         else
  327.             zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff-1 ].table, TOTAL_ZEROS_VLC_BITS, 1);
  328.     }
  329.     
  330.     for(i=0; i<total_coeff-1; i++){
  331.         if(zeros_left <=0)
  332.             break;
  333.         else if(zeros_left < 7){
  334.             run[i]= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1);
  335.         }else{
  336.             run[i]= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2);
  337.         }
  338.         zeros_left -= run[i];
  339.     }
  340.     if(zeros_left<0){
  341.         av_log(h->s.avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %dn", s->mb_x, s->mb_y);
  342.         return -1;
  343.     }
  344.     
  345.     for(; i<total_coeff-1; i++){
  346.         run[i]= 0;
  347.     }
  348.     run[i]= zeros_left;
  349.     coeff_num=-1;
  350.     if(n > 24){
  351.         for(i=total_coeff-1; i>=0; i--){ //FIXME merge into rundecode?
  352.             int j;
  353.             coeff_num += run[i] + 1; //FIXME add 1 earlier ?
  354.             j= scantable[ coeff_num ];
  355.             block[j]= level[i];
  356.         }
  357.     }else{
  358.         for(i=total_coeff-1; i>=0; i--){ //FIXME merge into  rundecode?
  359.             int j;
  360.             coeff_num += run[i] + 1; //FIXME add 1 earlier ?
  361.             j= scantable[ coeff_num ];
  362.             block[j]= level[i] * qmul[j];
  363. //            printf("%d %d  ", block[j], qmul[j]);
  364.         }
  365.     }
  366.     return 0;
  367. }
  368. /**
  369.  * decodes a macroblock
  370.  * @returns 0 if ok, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
  371.  */
  372. static int decode_mb_cavlc(H264Context *h){
  373.     MpegEncContext * const s = &h->s;
  374.     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  375.     int mb_type, partition_count, cbp;
  376.     s->dsp.clear_blocks(h->mb); //FIXME avoid if allready clear (move after skip handlong?    
  377.     tprintf("pic:%d mb:%d/%dn", h->frame_num, s->mb_x, s->mb_y);
  378.     cbp = 0; /* avoid warning. FIXME: find a solution without slowing
  379.                 down the code */
  380.     if(h->slice_type != I_TYPE && h->slice_type != SI_TYPE){
  381.         if(s->mb_skip_run==-1)
  382.             s->mb_skip_run= get_ue_golomb(&s->gb);
  383.         
  384.         if (s->mb_skip_run--) {
  385.             int mx, my;
  386.             /* skip mb */
  387. //FIXME b frame
  388.             mb_type= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0;
  389.             memset(h->non_zero_count[mb_xy], 0, 16);
  390.             memset(h->non_zero_count_cache + 8, 0, 8*5); //FIXME ugly, remove pfui
  391.             if(h->sps.mb_aff && s->mb_skip_run==0 && (s->mb_y&1)==0){
  392.                 h->mb_field_decoding_flag= get_bits1(&s->gb);
  393.             }
  394.             if(h->mb_field_decoding_flag)
  395.                 mb_type|= MB_TYPE_INTERLACED;
  396.             
  397.             fill_caches(h, mb_type); //FIXME check what is needed and what not ...
  398.             pred_pskip_motion(h, &mx, &my);
  399.             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1);
  400.             fill_rectangle(  h->mv_cache[0][scan8[0]], 4, 4, 8, pack16to32(mx,my), 4);
  401.             write_back_motion(h, mb_type);
  402.             s->current_picture.mb_type[mb_xy]= mb_type; //FIXME SKIP type
  403.             s->current_picture.qscale_table[mb_xy]= s->qscale;
  404.             h->slice_table[ mb_xy ]= h->slice_num;
  405.             h->prev_mb_skiped= 1;
  406.             return 0;
  407.         }
  408.     }
  409.     if(h->sps.mb_aff /* && !field pic FIXME needed? */){
  410.         if((s->mb_y&1)==0)
  411.             h->mb_field_decoding_flag = get_bits1(&s->gb);
  412.     }else
  413.         h->mb_field_decoding_flag=0; //FIXME som ed note ?!
  414.     
  415.     h->prev_mb_skiped= 0;
  416.     
  417.     mb_type= get_ue_golomb(&s->gb);
  418.     if(h->slice_type == B_TYPE){
  419.         if(mb_type < 23){
  420.             partition_count= b_mb_type_info[mb_type].partition_count;
  421.             mb_type=         b_mb_type_info[mb_type].type;
  422.         }else{
  423.             mb_type -= 23;
  424.             goto decode_intra_mb;
  425.         }
  426.     }else if(h->slice_type == P_TYPE /*|| h->slice_type == SP_TYPE */){
  427.         if(mb_type < 5){
  428.             partition_count= p_mb_type_info[mb_type].partition_count;
  429.             mb_type=         p_mb_type_info[mb_type].type;
  430.         }else{
  431.             mb_type -= 5;
  432.             goto decode_intra_mb;
  433.         }
  434.     }else{
  435.        assert(h->slice_type == I_TYPE);
  436. decode_intra_mb:
  437.         if(mb_type > 25){
  438.             av_log(h->s.avctx, AV_LOG_ERROR, "mb_type %d in %c slice to large at %d %dn", mb_type, av_get_pict_type_char(h->slice_type), s->mb_x, s->mb_y);
  439.             return -1;
  440.         }
  441.         partition_count=0;
  442.         cbp= i_mb_type_info[mb_type].cbp;
  443.         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
  444.         mb_type= i_mb_type_info[mb_type].type;
  445.     }
  446.     if(h->mb_field_decoding_flag)
  447.         mb_type |= MB_TYPE_INTERLACED;
  448.     s->current_picture.mb_type[mb_xy]= mb_type;
  449.     h->slice_table[ mb_xy ]= h->slice_num;
  450.     
  451.     if(IS_INTRA_PCM(mb_type)){
  452.         const uint8_t *ptr;
  453.         int x, y;
  454.         
  455.         // we assume these blocks are very rare so we dont optimize it
  456.         align_get_bits(&s->gb);
  457.         
  458.         ptr= s->gb.buffer + get_bits_count(&s->gb);
  459.     
  460.         for(y=0; y<16; y++){
  461.             const int index= 4*(y&3) + 64*(y>>2);
  462.             for(x=0; x<16; x++){
  463.                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
  464.             }
  465.         }
  466.         for(y=0; y<8; y++){
  467.             const int index= 256 + 4*(y&3) + 32*(y>>2);
  468.             for(x=0; x<8; x++){
  469.                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
  470.             }
  471.         }
  472.         for(y=0; y<8; y++){
  473.             const int index= 256 + 64 + 4*(y&3) + 32*(y>>2);
  474.             for(x=0; x<8; x++){
  475.                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
  476.             }
  477.         }
  478.     
  479.         skip_bits(&s->gb, 384); //FIXME check /fix the bitstream readers
  480.         
  481.         //FIXME deblock filter, non_zero_count_cache init ...
  482.         memset(h->non_zero_count[mb_xy], 16, 16);
  483.         s->current_picture.qscale_table[mb_xy]= s->qscale;
  484.         
  485.         return 0;
  486.     }
  487.         
  488.     fill_caches(h, mb_type);
  489.     //mb_pred
  490.     if(IS_INTRA(mb_type)){
  491. //            init_top_left_availability(h);
  492.             if(IS_INTRA4x4(mb_type)){
  493.                 int i;
  494. //                fill_intra4x4_pred_table(h);
  495.                 for(i=0; i<16; i++){
  496.                     const int mode_coded= !get_bits1(&s->gb);
  497.                     const int predicted_mode=  pred_intra_mode(h, i);
  498.                     int mode;
  499.                     if(mode_coded){
  500.                         const int rem_mode= get_bits(&s->gb, 3);
  501.                         if(rem_mode<predicted_mode)
  502.                             mode= rem_mode;
  503.                         else
  504.                             mode= rem_mode + 1;
  505.                     }else{
  506.                         mode= predicted_mode;
  507.                     }
  508.                     
  509.                     h->intra4x4_pred_mode_cache[ scan8[i] ] = mode;
  510.                 }
  511.                 write_back_intra_pred_mode(h);
  512.                 if( check_intra4x4_pred_mode(h) < 0)
  513.                     return -1;
  514.             }else{
  515.                 h->intra16x16_pred_mode= check_intra_pred_mode(h, h->intra16x16_pred_mode);
  516.                 if(h->intra16x16_pred_mode < 0)
  517.                     return -1;
  518.             }
  519.             h->chroma_pred_mode= get_ue_golomb(&s->gb);
  520.             h->chroma_pred_mode= check_intra_pred_mode(h, h->chroma_pred_mode);
  521.             if(h->chroma_pred_mode < 0)
  522.                 return -1;
  523.     }else if(partition_count==4){
  524.         int i, j, sub_partition_count[4], list, ref[2][4];
  525.         
  526.         if(h->slice_type == B_TYPE){
  527.             for(i=0; i<4; i++){
  528.                 h->sub_mb_type[i]= get_ue_golomb(&s->gb);
  529.                 if(h->sub_mb_type[i] >=13){
  530.                     av_log(h->s.avctx, AV_LOG_ERROR, "B sub_mb_type %d out of range at %d %dn", h->sub_mb_type[i], s->mb_x, s->mb_y);
  531.                     return -1;
  532.                 }
  533.                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
  534.                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
  535.             }
  536.         }else{
  537.             assert(h->slice_type == P_TYPE || h->slice_type == SP_TYPE); //FIXME SP correct ?
  538.             for(i=0; i<4; i++){
  539.                 h->sub_mb_type[i]= get_ue_golomb(&s->gb);
  540.                 if(h->sub_mb_type[i] >=4){
  541.                     av_log(h->s.avctx, AV_LOG_ERROR, "P sub_mb_type %d out of range at %d %dn", h->sub_mb_type[i], s->mb_x, s->mb_y);
  542.                     return -1;
  543.                 }
  544.                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
  545.                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
  546.             }
  547.         }
  548.         
  549.         for(list=0; list<2; list++){
  550.             const int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list];
  551.             if(ref_count == 0) continue;
  552.             for(i=0; i<4; i++){
  553.                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
  554.                     ref[list][i] = get_te0_golomb(&s->gb, ref_count); //FIXME init to 0 before and skip?
  555.                 }else{
  556.                  //FIXME
  557.                     ref[list][i] = -1;
  558.                 }
  559.             }
  560.         }
  561.         
  562.         for(list=0; list<2; list++){
  563.             const int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list];
  564.             if(ref_count == 0) continue;
  565.             for(i=0; i<4; i++){
  566.                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ]=
  567.                 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
  568.                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
  569.                     const int sub_mb_type= h->sub_mb_type[i];
  570.                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
  571.                     for(j=0; j<sub_partition_count[i]; j++){
  572.                         int mx, my;
  573.                         const int index= 4*i + block_width*j;
  574.                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
  575.                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
  576.                         mx += get_se_golomb(&s->gb);
  577.                         my += get_se_golomb(&s->gb);
  578.                         tprintf("final mv:%d %dn", mx, my);
  579.                         if(IS_SUB_8X8(sub_mb_type)){
  580.                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]= 
  581.                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
  582.                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]= 
  583.                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
  584.                         }else if(IS_SUB_8X4(sub_mb_type)){
  585.                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]= mx;
  586.                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]= my;
  587.                         }else if(IS_SUB_4X8(sub_mb_type)){
  588.                             mv_cache[ 0 ][0]= mv_cache[ 8 ][0]= mx;
  589.                             mv_cache[ 0 ][1]= mv_cache[ 8 ][1]= my;
  590.                         }else{
  591.                             assert(IS_SUB_4X4(sub_mb_type));
  592.                             mv_cache[ 0 ][0]= mx;
  593.                             mv_cache[ 0 ][1]= my;
  594.                         }
  595.                     }
  596.                 }else{
  597.                     uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
  598.                     p[0] = p[1]=
  599.                     p[8] = p[9]= 0;
  600.                 }
  601.             }
  602.         }
  603.     }else if(!IS_DIRECT(mb_type)){
  604.         int list, mx, my, i;
  605.          //FIXME we should set ref_idx_l? to 0 if we use that later ...
  606.         if(IS_16X16(mb_type)){
  607.             for(list=0; list<2; list++){
  608.                 if(h->ref_count[0]>0){
  609.                     if(IS_DIR(mb_type, 0, list)){
  610.                         const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
  611.                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
  612.                     }
  613.                 }
  614.             }
  615.             for(list=0; list<2; list++){
  616.                 if(IS_DIR(mb_type, 0, list)){
  617.                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
  618.                     mx += get_se_golomb(&s->gb);
  619.                     my += get_se_golomb(&s->gb);
  620.                     tprintf("final mv:%d %dn", mx, my);
  621.                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
  622.                 }
  623.             }
  624.         }
  625.         else if(IS_16X8(mb_type)){
  626.             for(list=0; list<2; list++){
  627.                 if(h->ref_count[list]>0){
  628.                     for(i=0; i<2; i++){
  629.                         if(IS_DIR(mb_type, i, list)){
  630.                             const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
  631.                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
  632.                         }
  633.                     }
  634.                 }
  635.             }
  636.             for(list=0; list<2; list++){
  637.                 for(i=0; i<2; i++){
  638.                     if(IS_DIR(mb_type, i, list)){
  639.                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
  640.                         mx += get_se_golomb(&s->gb);
  641.                         my += get_se_golomb(&s->gb);
  642.                         tprintf("final mv:%d %dn", mx, my);
  643.                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
  644.                     }
  645.                 }
  646.             }
  647.         }else{
  648.             assert(IS_8X16(mb_type));
  649.             for(list=0; list<2; list++){
  650.                 if(h->ref_count[list]>0){
  651.                     for(i=0; i<2; i++){
  652.                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
  653.                             const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
  654.                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
  655.                         }
  656.                     }
  657.                 }
  658.             }
  659.             for(list=0; list<2; list++){
  660.                 for(i=0; i<2; i++){
  661.                     if(IS_DIR(mb_type, i, list)){
  662.                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
  663.                         mx += get_se_golomb(&s->gb);
  664.                         my += get_se_golomb(&s->gb);
  665.                         tprintf("final mv:%d %dn", mx, my);
  666.                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
  667.                     }
  668.                 }
  669.             }
  670.         }
  671.     }
  672.     
  673.     if(IS_INTER(mb_type))
  674.         write_back_motion(h, mb_type);
  675.     
  676.     if(!IS_INTRA16x16(mb_type)){
  677.         cbp= get_ue_golomb(&s->gb);
  678.         if(cbp > 47){
  679.             av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%d) at %d %dn", cbp, s->mb_x, s->mb_y);
  680.             return -1;
  681.         }
  682.         
  683.         if(IS_INTRA4x4(mb_type))
  684.             cbp= golomb_to_intra4x4_cbp[cbp];
  685.         else
  686.             cbp= golomb_to_inter_cbp[cbp];
  687.     }
  688.     if(cbp || IS_INTRA16x16(mb_type)){
  689.         int i8x8, i4x4, chroma_idx;
  690.         int chroma_qp, dquant;
  691.         GetBitContext *gb= IS_INTRA(mb_type) ? h->intra_gb_ptr : h->inter_gb_ptr;
  692.         const uint8_t *scan, *dc_scan;
  693.         
  694. //        fill_non_zero_count_cache(h);
  695.         if(IS_INTERLACED(mb_type)){
  696.             scan= field_scan;
  697.             dc_scan= luma_dc_field_scan;
  698.         }else{
  699.             scan= zigzag_scan;
  700.             dc_scan= luma_dc_zigzag_scan;
  701.         }
  702.         dquant= get_se_golomb(&s->gb);
  703.         if( dquant > 25 || dquant < -26 ){
  704.             av_log(h->s.avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %dn", dquant, s->mb_x, s->mb_y);
  705.             return -1;
  706.         }
  707.         
  708.         s->qscale += dquant;
  709.         if(((unsigned)s->qscale) > 51){
  710.             if(s->qscale<0) s->qscale+= 52;
  711.             else            s->qscale-= 52;
  712.         }
  713.         
  714.         h->chroma_qp= chroma_qp= get_chroma_qp(h, s->qscale);
  715.         if(IS_INTRA16x16(mb_type)){
  716.             if( decode_residual(h, h->intra_gb_ptr, h->mb, LUMA_DC_BLOCK_INDEX, dc_scan, s->qscale, 16) < 0){
  717.                 return -1; //FIXME continue if partotioned and other retirn -1 too
  718.             }
  719.             assert((cbp&15) == 0 || (cbp&15) == 15);
  720.             if(cbp&15){
  721.                 for(i8x8=0; i8x8<4; i8x8++){
  722.                     for(i4x4=0; i4x4<4; i4x4++){
  723.                         const int index= i4x4 + 4*i8x8;
  724.                         if( decode_residual(h, h->intra_gb_ptr, h->mb + 16*index, index, scan + 1, s->qscale, 15) < 0 ){
  725.                             return -1;
  726.                         }
  727.                     }
  728.                 }
  729.             }else{
  730.                 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
  731.             }
  732.         }else{
  733.             for(i8x8=0; i8x8<4; i8x8++){
  734.                 if(cbp & (1<<i8x8)){
  735.                     for(i4x4=0; i4x4<4; i4x4++){
  736.                         const int index= i4x4 + 4*i8x8;
  737.                         
  738.                         if( decode_residual(h, gb, h->mb + 16*index, index, scan, s->qscale, 16) <0 ){
  739.                             return -1;
  740.                         }
  741.                     }
  742.                 }else{
  743.                     uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
  744.                     nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
  745.                 }
  746.             }
  747.         }
  748.         
  749.         if(cbp&0x30){
  750.             for(chroma_idx=0; chroma_idx<2; chroma_idx++)
  751.                 if( decode_residual(h, gb, h->mb + 256 + 16*4*chroma_idx, CHROMA_DC_BLOCK_INDEX, chroma_dc_scan, chroma_qp, 4) < 0){
  752.                     return -1;
  753.                 }
  754.         }
  755.         if(cbp&0x20){
  756.             for(chroma_idx=0; chroma_idx<2; chroma_idx++){
  757.                 for(i4x4=0; i4x4<4; i4x4++){
  758.                     const int index= 16 + 4*chroma_idx + i4x4;
  759.                     if( decode_residual(h, gb, h->mb + 16*index, index, scan + 1, chroma_qp, 15) < 0){
  760.                         return -1;
  761.                     }
  762.                 }
  763.             }
  764.         }else{
  765.             uint8_t * const nnz= &h->non_zero_count_cache[0];
  766.             nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
  767.             nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
  768.         }
  769.     }else{
  770.         uint8_t * const nnz= &h->non_zero_count_cache[0];
  771.         fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1);
  772.         nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
  773.         nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
  774.     }
  775.     s->current_picture.qscale_table[mb_xy]= s->qscale;
  776.     write_back_non_zero_count(h);
  777.     return 0;
  778. }
  779. static int decode_cabac_mb_type( H264Context *h ) {
  780.     MpegEncContext * const s = &h->s;
  781.     if( h->slice_type == I_TYPE ) {
  782.         const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  783.         int ctx = 0;
  784.         int mb_type;
  785.         if( s->mb_x > 0 && !IS_INTRA4x4( s->current_picture.mb_type[mb_xy-1] ) )
  786.             ctx++;
  787.         if( s->mb_y > 0 && !IS_INTRA4x4( s->current_picture.mb_type[mb_xy-s->mb_stride] ) )
  788.             ctx++;
  789.         if( get_cabac( &h->cabac, &h->cabac_state[3+ctx] ) == 0 )
  790.             return 0;   /* I4x4 */
  791.         if( get_cabac_terminate( &h->cabac ) )
  792.             return 25;  /* PCM */
  793.         mb_type = 1;    /* I16x16 */
  794.         if( get_cabac( &h->cabac, &h->cabac_state[3+3] ) )
  795.             mb_type += 12;  /* cbp_luma != 0 */
  796.         if( get_cabac( &h->cabac, &h->cabac_state[3+4] ) ) {
  797.             if( get_cabac( &h->cabac, &h->cabac_state[3+5] ) )
  798.                 mb_type += 4 * 2;   /* cbp_chroma == 2 */
  799.             else
  800.                 mb_type += 4 * 1;   /* cbp_chroma == 1 */
  801.         }
  802.         if( get_cabac( &h->cabac, &h->cabac_state[3+6] ) )
  803.             mb_type += 2;
  804.         if( get_cabac( &h->cabac, &h->cabac_state[3+7] ) )
  805.             mb_type += 1;
  806.         return mb_type;
  807.     } else if( h->slice_type == P_TYPE ) {
  808.         if( get_cabac( &h->cabac, &h->cabac_state[14] ) == 0 ) {
  809.             /* P-type */
  810.             if( get_cabac( &h->cabac, &h->cabac_state[15] ) == 0 ) {
  811.                 if( get_cabac( &h->cabac, &h->cabac_state[16] ) == 0 )
  812.                     return 0; /* P_L0_D16x16; */
  813.                 else
  814.                     return 3; /* P_8x8; */
  815.             } else {
  816.                 if( get_cabac( &h->cabac, &h->cabac_state[17] ) == 0 )
  817.                     return 2; /* P_L0_D8x16; */
  818.                 else
  819.                     return 1; /* P_L0_D16x8; */
  820.             }
  821.         } else {
  822.             int mb_type;
  823.             /* I-type */
  824.             if( get_cabac( &h->cabac, &h->cabac_state[17] ) == 0 )
  825.                 return 5+0; /* I_4x4 */
  826.             if( get_cabac_terminate( &h->cabac ) )
  827.                 return 5+25; /*I_PCM */
  828.             mb_type = 5+1;    /* I16x16 */
  829.             if( get_cabac( &h->cabac, &h->cabac_state[17+1] ) )
  830.                 mb_type += 12;  /* cbp_luma != 0 */
  831.             if( get_cabac( &h->cabac, &h->cabac_state[17+2] ) ) {
  832.                 if( get_cabac( &h->cabac, &h->cabac_state[17+2] ) )
  833.                     mb_type += 4 * 2;   /* cbp_chroma == 2 */
  834.                 else
  835.                     mb_type += 4 * 1;   /* cbp_chroma == 1 */
  836.             }
  837.             if( get_cabac( &h->cabac, &h->cabac_state[17+3] ) )
  838.                 mb_type += 2;
  839.             if( get_cabac( &h->cabac, &h->cabac_state[17+3] ) )
  840.                 mb_type += 1;
  841.             return mb_type;
  842.         }
  843.     } else {
  844.         /* TODO do others frames types */
  845.         return -1;
  846.     }
  847. }
  848. static int decode_cabac_mb_skip( H264Context *h) {
  849.     MpegEncContext * const s = &h->s;
  850.     const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
  851.     const int mba_xy = mb_xy - 1;
  852.     const int mbb_xy = mb_xy - s->mb_stride;
  853.     int ctx = 0;
  854.     if( s->mb_x > 0 && !IS_SKIP( s->current_picture.mb_type[mba_xy] ) )
  855.         ctx++;
  856.     if( s->mb_y > 0 && !IS_SKIP( s->current_picture.mb_type[mbb_xy] ) )
  857.         ctx++;
  858.     if( h->slice_type == P_TYPE || h->slice_type == SP_TYPE)
  859.         return get_cabac( &h->cabac, &h->cabac_state[11+ctx] );
  860.     else /* B-frame */
  861.         return get_cabac( &h->cabac, &h->cabac_state[24+ctx] );
  862. }
  863. static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
  864.     int mode = 0;
  865.     if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
  866.         return pred_mode;
  867.     if( get_cabac( &h->cabac, &h->cabac_state[69] ) )
  868.         mode += 1;
  869.     if( get_cabac( &h->cabac, &h->cabac_state[69] ) )
  870.         mode += 2;
  871.     if( get_cabac( &h->cabac, &h->cabac_state[69] ) )
  872.         mode += 4;
  873.     if( mode >= pred_mode )
  874.         return mode + 1;
  875.     else
  876.         return mode;
  877. }
  878. static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
  879.     MpegEncContext * const s = &h->s;
  880.     const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
  881.     const int mba_xy = mb_xy - 1;
  882.     const int mbb_xy = mb_xy - s->mb_stride;
  883.     int ctx = 0;
  884.     /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
  885.     if( s->mb_x > 0 && h->chroma_pred_mode_table[mba_xy] != 0 )
  886.         ctx++;
  887.     if( s->mb_y > 0 && h->chroma_pred_mode_table[mbb_xy] != 0 )
  888.         ctx++;
  889.     if( get_cabac( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
  890.         return 0;
  891.     if( get_cabac( &h->cabac, &h->cabac_state[64+3] ) == 0 )
  892.         return 1;
  893.     if( get_cabac( &h->cabac, &h->cabac_state[64+3] ) == 0 )
  894.         return 2;
  895.     else
  896.         return 3;
  897. }
  898. static const uint8_t block_idx_x[16] = {
  899.     0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3
  900. };
  901. static const uint8_t block_idx_y[16] = {
  902.     0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3
  903. };
  904. static const uint8_t block_idx_xy[4][4] = {
  905.     { 0, 2, 8,  10},
  906.     { 1, 3, 9,  11},
  907.     { 4, 6, 12, 14},
  908.     { 5, 7, 13, 15}
  909. };
  910. static int decode_cabac_mb_cbp_luma( H264Context *h) {
  911.     MpegEncContext * const s = &h->s;
  912.     const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
  913.     int cbp = 0;
  914.     int i8x8;
  915.     h->cbp_table[mb_xy] = 0;  /* FIXME aaahahahah beurk */
  916.     for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
  917.         int mba_xy = -1;
  918.         int mbb_xy = -1;
  919.         int x, y;
  920.         int ctx = 0;
  921.         x = block_idx_x[4*i8x8];
  922.         y = block_idx_y[4*i8x8];
  923.         if( x > 0 )
  924.             mba_xy = mb_xy;
  925.         else if( s->mb_x > 0 )
  926.             mba_xy = mb_xy - 1;
  927.         if( y > 0 )
  928.             mbb_xy = mb_xy;
  929.         else if( s->mb_y > 0 )
  930.             mbb_xy = mb_xy - s->mb_stride;
  931.         /* No need to test for skip as we put 0 for skip block */
  932.         if( mba_xy >= 0 ) {
  933.             int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
  934.             if( ((h->cbp_table[mba_xy] >> i8x8a)&0x01) == 0 )
  935.                 ctx++;
  936.         }
  937.         if( mbb_xy >= 0 ) {
  938.             int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
  939.             if( ((h->cbp_table[mbb_xy] >> i8x8b)&0x01) == 0 )
  940.                 ctx += 2;
  941.         }
  942.         if( get_cabac( &h->cabac, &h->cabac_state[73 + ctx] ) ) {
  943.             cbp |= 1 << i8x8;
  944.             h->cbp_table[mb_xy] = cbp;  /* FIXME aaahahahah beurk */
  945.         }
  946.     }
  947.     return cbp;
  948. }
  949. static int decode_cabac_mb_cbp_chroma( H264Context *h) {
  950.     MpegEncContext * const s = &h->s;
  951.     const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
  952.     int ctx;
  953.     int cbp_a, cbp_b;
  954.     /* No need to test for skip */
  955.     if( s->mb_x > 0 )
  956.         cbp_a = (h->cbp_table[mb_xy-1]>>4)&0x03;
  957.     else
  958.         cbp_a = -1;
  959.     if( s->mb_y > 0 )
  960.         cbp_b = (h->cbp_table[mb_xy-s->mb_stride]>>4)&0x03;
  961.     else
  962.         cbp_b = -1;
  963.     ctx = 0;
  964.     if( cbp_a > 0 ) ctx++;
  965.     if( cbp_b > 0 ) ctx += 2;
  966.     if( get_cabac( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
  967.         return 0;
  968.     ctx = 4;
  969.     if( cbp_a == 2 ) ctx++;
  970.     if( cbp_b == 2 ) ctx += 2;
  971.     if( get_cabac( &h->cabac, &h->cabac_state[77 + ctx] ) )
  972.         return 2;
  973.     else
  974.         return 1;
  975. }
  976. static int decode_cabac_mb_dqp( H264Context *h) {
  977.     MpegEncContext * const s = &h->s;
  978.     int mbn_xy;
  979.     int   ctx = 0;
  980.     int   val = 0;
  981.     if( s->mb_x > 0 )
  982.         mbn_xy = s->mb_x + s->mb_y*s->mb_stride - 1;
  983.     else
  984.         mbn_xy = s->mb_width - 1 + (s->mb_y-1)*s->mb_stride;
  985.     if( mbn_xy >= 0 && h->last_qscale_diff != 0 && ( IS_INTRA16x16(s->current_picture.mb_type[mbn_xy] ) || (h->cbp_table[mbn_xy]&0x3f) ) )
  986.         ctx++;
  987.     while( get_cabac( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
  988.         if( ctx < 2 )
  989.             ctx = 2;
  990.         else
  991.             ctx = 3;
  992.         val++;
  993.     }
  994.     if( val&0x01 )
  995.         return (val + 1)/2;
  996.     else
  997.         return -(val + 1)/2;
  998. }
  999. static int decode_cabac_mb_sub_type( H264Context *h ) {
  1000.     if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
  1001.         return 0;   /* 8x8 */
  1002.     if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
  1003.         return 1;   /* 8x4 */
  1004.     if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
  1005.         return 2;   /* 4x8 */
  1006.     return 3;       /* 4x4 */
  1007. }
  1008. static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
  1009.     int refa = h->ref_cache[list][scan8[n] - 1];
  1010.     int refb = h->ref_cache[list][scan8[n] - 8];
  1011.     int ref  = 0;
  1012.     int ctx  = 0;
  1013.     if( refa > 0 )
  1014.         ctx++;
  1015.     if( refb > 0 )
  1016.         ctx += 2;
  1017.     while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
  1018.         ref++;
  1019.         if( ctx < 4 )
  1020.             ctx = 4;
  1021.         else
  1022.             ctx = 5;
  1023.     }
  1024.     return ref;
  1025. }
  1026. static int decode_cabac_mb_mvd( H264Context *h, int list, int n, int l ) {
  1027.     int amvd = abs( h->mvd_cache[list][scan8[n] - 1][l] ) +
  1028.                abs( h->mvd_cache[list][scan8[n] - 8][l] );
  1029.     int ctxbase = (l == 0) ? 40 : 47;
  1030.     int ctx;
  1031.     int mvd = 0;
  1032.     if( amvd < 3 )
  1033.         ctx = 0;
  1034.     else if( amvd > 32 )
  1035.         ctx = 2;
  1036.     else
  1037.         ctx = 1;
  1038.     while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase+ctx] ) ) {
  1039.         mvd++;
  1040.         if( ctx < 3 )
  1041.             ctx = 3;
  1042.         else if( ctx < 6 )
  1043.             ctx++;
  1044.     }
  1045.     if( mvd >= 9 ) {
  1046.         int k = 3;
  1047.         while( get_cabac_bypass( &h->cabac ) ) {
  1048.             mvd += 1 << k;
  1049.             k++;
  1050.         }
  1051.         while( k-- ) {
  1052.             if( get_cabac_bypass( &h->cabac ) )
  1053.                 mvd += 1 << k;
  1054.         }
  1055.     }
  1056.     if( mvd != 0 && get_cabac_bypass( &h->cabac ) )
  1057.         return -mvd;
  1058.     return mvd;
  1059. }
  1060. static int get_cabac_cbf_ctx( H264Context *h, int cat, int idx ) {
  1061.     MpegEncContext * const s = &h->s;
  1062.     const int mb_xy  = s->mb_x + s->mb_y*s->mb_stride;
  1063.     int mba_xy = -1;
  1064.     int mbb_xy = -1;
  1065.     int nza = -1;
  1066.     int nzb = -1;
  1067.     int ctx = 0;
  1068.     if( cat == 0 ) {
  1069.         if( s->mb_x > 0 ) {
  1070.             mba_xy = mb_xy - 1;
  1071.             if( IS_INTRA16x16(s->current_picture.mb_type[mba_xy] ) )
  1072.                     nza = h->cbp_table[mba_xy]&0x100;
  1073.         }
  1074.         if( s->mb_y > 0 ) {
  1075.             mbb_xy = mb_xy - s->mb_stride;
  1076.             if( IS_INTRA16x16(s->current_picture.mb_type[mbb_xy] ) )
  1077.                     nzb = h->cbp_table[mbb_xy]&0x100;
  1078.         }
  1079.     } else if( cat == 1 || cat == 2 ) {
  1080.         int i8x8a, i8x8b;
  1081.         int x, y;
  1082.         x = block_idx_x[idx];
  1083.         y = block_idx_y[idx];
  1084.         if( x > 0 )
  1085.             mba_xy = mb_xy;
  1086.         else if( s->mb_x > 0 )
  1087.             mba_xy = mb_xy - 1;
  1088.         if( y > 0 )
  1089.             mbb_xy = mb_xy;
  1090.         else if( s->mb_y > 0 )
  1091.             mbb_xy = mb_xy - s->mb_stride;
  1092.         /* No need to test for skip */
  1093.         if( mba_xy >= 0 ) {
  1094.             i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
  1095.             if( !IS_INTRA_PCM(s->current_picture.mb_type[mba_xy] ) &&
  1096.                 ((h->cbp_table[mba_xy]&0x0f)>>i8x8a))
  1097.                 nza = h->non_zero_count_cache[scan8[idx] - 1];
  1098.         }
  1099.         if( mbb_xy >= 0 ) {
  1100.             i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
  1101.             if( !IS_INTRA_PCM(s->current_picture.mb_type[mbb_xy] ) &&
  1102.                 ((h->cbp_table[mbb_xy]&0x0f)>>i8x8b))
  1103.                 nzb = h->non_zero_count_cache[scan8[idx] - 8];
  1104.         }
  1105.     } else if( cat == 3 ) {
  1106.         if( s->mb_x > 0 ) {
  1107.             mba_xy = mb_xy - 1;
  1108.             if( !IS_INTRA_PCM(s->current_picture.mb_type[mba_xy] ) &&
  1109.                 (h->cbp_table[mba_xy]&0x30) )
  1110.                 nza = (h->cbp_table[mba_xy]>>(6+idx))&0x01;
  1111.         }
  1112.         if( s->mb_y > 0 ) {
  1113.             mbb_xy = mb_xy - s->mb_stride;
  1114.             if( !IS_INTRA_PCM(s->current_picture.mb_type[mbb_xy] ) &&
  1115.                 (h->cbp_table[mbb_xy]&0x30) )
  1116.                 nzb = (h->cbp_table[mbb_xy]>>(6+idx))&0x01;
  1117.         }
  1118.     } else if( cat == 4 ) {
  1119.         int idxc = idx % 4 ;
  1120.         if( idxc == 1 || idxc == 3 )
  1121.             mba_xy = mb_xy;
  1122.         else if( s->mb_x > 0 )
  1123.             mba_xy = mb_xy -1;
  1124.         if( idxc == 2 || idxc == 3 )
  1125.             mbb_xy = mb_xy;
  1126.         else if( s->mb_y > 0 )
  1127.             mbb_xy = mb_xy - s->mb_stride;
  1128.         if( mba_xy >= 0 &&
  1129.             !IS_INTRA_PCM(s->current_picture.mb_type[mba_xy] ) &&
  1130.             (h->cbp_table[mba_xy]&0x30) == 0x20 )
  1131.             nza = h->non_zero_count_cache[scan8[16+idx] - 1];
  1132.         if( mbb_xy >= 0 &&
  1133.             !IS_INTRA_PCM(s->current_picture.mb_type[mbb_xy] ) &&
  1134.             (h->cbp_table[mbb_xy]&0x30) == 0x20 )
  1135.             nzb = h->non_zero_count_cache[scan8[16+idx] - 8];
  1136.     }
  1137.     if( ( mba_xy < 0 && IS_INTRA( s->current_picture.mb_type[mb_xy] ) ) ||
  1138.         ( mba_xy >= 0 && IS_INTRA_PCM(s->current_picture.mb_type[mba_xy] ) ) ||
  1139.           nza > 0 )
  1140.         ctx++;
  1141.     if( ( mbb_xy < 0 && IS_INTRA( s->current_picture.mb_type[mb_xy] ) ) ||
  1142.         ( mbb_xy >= 0 && IS_INTRA_PCM(s->current_picture.mb_type[mbb_xy] ) ) ||
  1143.           nzb > 0 )
  1144.         ctx += 2;
  1145.     return ctx + 4 * cat;
  1146. }
  1147. static int decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int qp, int max_coeff) {
  1148.     const int mb_xy  = h->s.mb_x + h->s.mb_y*h->s.mb_stride;
  1149.     const uint16_t *qmul= dequant_coeff[qp];
  1150.     static const int significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
  1151.     static const int last_significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
  1152.     static const int coeff_abs_level_m1_offset[5] = { 0, 10, 20, 30, 39 };
  1153.     int coeff[16];
  1154.     int last = 0;
  1155.     int coeff_count = 0;
  1156.     int nz[16] = {0};
  1157.     int i;
  1158.     int abslevel1 = 0;
  1159.     int abslevelgt1 = 0;
  1160.     /* cat: 0-> DC 16x16  n = 0
  1161.      *      1-> AC 16x16  n = luma4x4idx
  1162.      *      2-> Luma4x4   n = luma4x4idx
  1163.      *      3-> DC Chroma n = iCbCr
  1164.      *      4-> AC Chroma n = 4 * iCbCr + chroma4x4idx
  1165.      */
  1166.     /* read coded block flag */
  1167.     if( get_cabac( &h->cabac, &h->cabac_state[85 + get_cabac_cbf_ctx( h, cat, n ) ] ) == 0 ) {
  1168.         if( cat == 1 || cat == 2 )
  1169.             h->non_zero_count_cache[scan8[n]] = 0;
  1170.         else if( cat == 4 )
  1171.             h->non_zero_count_cache[scan8[16+n]] = 0;
  1172.         return 0;
  1173.     }
  1174.     while( last < max_coeff - 1 ) {
  1175.         int ctx = FFMIN( last, max_coeff - 2 );
  1176.         if( get_cabac( &h->cabac, &h->cabac_state[105+significant_coeff_flag_offset[cat]+ctx] ) == 0 ) {
  1177.             nz[last++] = 0;
  1178.         }
  1179.         else {
  1180.             nz[last++] = 1;
  1181.             coeff_count++;
  1182.             if( get_cabac( &h->cabac, &h->cabac_state[166+last_significant_coeff_flag_offset[cat]+ctx] ) ) {
  1183.                 while( last < max_coeff ) {
  1184.                     nz[last++] = 0;
  1185.                 }
  1186.                 break;
  1187.             }
  1188.         }
  1189.     }
  1190.     if( last == max_coeff -1 ) {
  1191.         nz[last++] = 1;
  1192.         coeff_count++;
  1193.     }
  1194.     if( cat == 0 && coeff_count > 0 )
  1195.         h->cbp_table[mb_xy] |= 0x100;
  1196.     else if( cat == 1 || cat == 2 )
  1197.         h->non_zero_count_cache[scan8[n]] = coeff_count;
  1198.     else if( cat == 3 && coeff_count > 0 )
  1199.         h->cbp_table[mb_xy] |= 0x40 << n;
  1200.     else if( cat == 4 )
  1201.         h->non_zero_count_cache[scan8[16+n]] = coeff_count;
  1202.     for( i = coeff_count - 1; i >= 0; i-- ) {
  1203.         int coeff_abs_m1;
  1204.         int ctx = (abslevelgt1 != 0 ? 0 : FFMIN( 4, abslevel1 + 1 )) + coeff_abs_level_m1_offset[cat];
  1205.         if( get_cabac( &h->cabac, &h->cabac_state[227+ctx] ) == 0 ) {
  1206.             coeff_abs_m1 = 0;
  1207.         } else {
  1208.             coeff_abs_m1 = 1;
  1209.             ctx = 5 + FFMIN( 4, abslevelgt1 ) + coeff_abs_level_m1_offset[cat];
  1210.             while( coeff_abs_m1 < 14 && get_cabac( &h->cabac, &h->cabac_state[227+ctx] ) ) {
  1211.                 coeff_abs_m1++;
  1212.             }
  1213.         }
  1214.         if( coeff_abs_m1 >= 14 ) {
  1215.             int j = 0;
  1216.             while( get_cabac_bypass( &h->cabac ) ) {
  1217.                 coeff_abs_m1 += 1 << j;
  1218.                 j++;
  1219.             }
  1220.             while( j-- ) {
  1221.                 if( get_cabac_bypass( &h->cabac ) )
  1222.                     coeff_abs_m1 += 1 << j ;
  1223.             }
  1224.         }
  1225.         if( get_cabac_bypass( &h->cabac ) )
  1226.             coeff[i] = -1 *( coeff_abs_m1 + 1 );
  1227.         else
  1228.             coeff[i] = coeff_abs_m1 + 1;
  1229.         if( coeff_abs_m1 == 0 )
  1230.             abslevel1++;
  1231.         else
  1232.             abslevelgt1++;
  1233.     }
  1234.     if( cat == 0 || cat == 3 ) { /* DC */
  1235.         int j;
  1236.         for( i = 0, j = 0; j < coeff_count; i++ ) {
  1237.             if( nz[i] ) {
  1238.                 block[scantable[i]] = coeff[j];
  1239.                 j++;
  1240.             }
  1241.         }
  1242.     } else { /* AC */
  1243.         int j;
  1244.         for( i = 0, j = 0; j < coeff_count; i++ ) {
  1245.             if( nz[i] ) {
  1246.                 block[scantable[i]] = coeff[j] * qmul[scantable[i]];
  1247.                 j++;
  1248.             }
  1249.         }
  1250.     }
  1251.     return 0;
  1252. }
  1253. /**
  1254.  * decodes a macroblock
  1255.  * @returns 0 if ok, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
  1256.  */
  1257. static int decode_mb_cabac(H264Context *h) {
  1258.     MpegEncContext * const s = &h->s;
  1259.     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  1260.     int mb_type, partition_count, cbp = 0;
  1261.     s->dsp.clear_blocks(h->mb); //FIXME avoid if allready clear (move after skip handlong?)
  1262.     if( h->slice_type == B_TYPE ) {
  1263.         av_log( h->s.avctx, AV_LOG_ERROR, "B-frame not supported with CABACn" );
  1264.         return -1;
  1265.     }
  1266.     if( h->sps.mb_aff ) {
  1267.         av_log( h->s.avctx, AV_LOG_ERROR, "Fields not supported with CABACn" );
  1268.         return -1;
  1269.     }
  1270.     if( h->slice_type != I_TYPE && h->slice_type != SI_TYPE ) {
  1271.         /* read skip flags */
  1272.         if( decode_cabac_mb_skip( h ) ) {
  1273.             int mx, my;
  1274.             /* skip mb */
  1275.             mb_type= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0|MB_TYPE_SKIP;
  1276.             memset(h->non_zero_count[mb_xy], 0, 16);
  1277.             memset(h->non_zero_count_cache + 8, 0, 8*5); //FIXME ugly, remove pfui
  1278. #if 0
  1279.             if(h->sps.mb_aff && s->mb_skip_run==0 && (s->mb_y&1)==0){
  1280.                 h->mb_field_decoding_flag= get_bits1(&s->gb);
  1281.             }
  1282.             if(h->mb_field_decoding_flag)
  1283.                 mb_type|= MB_TYPE_INTERLACED;
  1284. #endif
  1285.             fill_caches(h, mb_type); //FIXME check what is needed and what not ...
  1286.             pred_pskip_motion(h, &mx, &my);
  1287.             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1);
  1288.             fill_rectangle(  h->mvd_cache[0][scan8[0]], 4, 4, 8, pack16to32(0,0), 4);
  1289.             fill_rectangle(  h->mv_cache[0][scan8[0]], 4, 4, 8, pack16to32(mx,my), 4);
  1290.             write_back_motion(h, mb_type);
  1291.             s->current_picture.mb_type[mb_xy]= mb_type; //FIXME SKIP type
  1292.             s->current_picture.qscale_table[mb_xy]= s->qscale;
  1293.             h->slice_table[ mb_xy ]= h->slice_num;
  1294.             h->cbp_table[mb_xy] = 0;
  1295.             h->chroma_pred_mode_table[mb_xy] = 0;
  1296.             h->last_qscale_diff = 0;
  1297.             h->prev_mb_skiped= 1;
  1298.             return 0;
  1299.         }
  1300.     }
  1301.     h->prev_mb_skiped = 0;
  1302.     if( ( mb_type = decode_cabac_mb_type( h ) ) < 0 ) {
  1303.         av_log( h->s.avctx, AV_LOG_ERROR, "decode_cabac_mb_type failedn" );
  1304.         return -1;
  1305.     }
  1306.     if( h->slice_type == P_TYPE ) {
  1307.         if( mb_type < 5) {
  1308.             partition_count= p_mb_type_info[mb_type].partition_count;
  1309.             mb_type=         p_mb_type_info[mb_type].type;
  1310.         } else {
  1311.             mb_type -= 5;
  1312.             goto decode_intra_mb;
  1313.         }
  1314.     } else {
  1315.        assert(h->slice_type == I_TYPE);
  1316. decode_intra_mb:
  1317.         partition_count = 0;
  1318.         cbp= i_mb_type_info[mb_type].cbp;
  1319.         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
  1320.         mb_type= i_mb_type_info[mb_type].type;
  1321.     }
  1322. #if 0
  1323.     if(h->mb_field_decoding_flag)
  1324.         mb_type |= MB_TYPE_INTERLACED;
  1325. #endif
  1326.     s->current_picture.mb_type[mb_xy]= mb_type;
  1327.     h->slice_table[ mb_xy ]= h->slice_num;
  1328.     if(IS_INTRA_PCM(mb_type)) {
  1329.         /* TODO */
  1330.         h->cbp_table[mb_xy] = 0xf +4*2;
  1331.         h->chroma_pred_mode_table[mb_xy] = 0;
  1332.         s->current_picture.qscale_table[mb_xy]= s->qscale;
  1333.         return -1;
  1334.     }
  1335.     fill_caches(h, mb_type);
  1336.     if( IS_INTRA( mb_type ) ) {
  1337.         if( IS_INTRA4x4( mb_type ) ) {
  1338.             int i;
  1339.             for( i = 0; i < 16; i++ ) {
  1340.                 int pred = pred_intra_mode( h, i );
  1341.                 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
  1342.                 //av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%dn", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] );
  1343.             }
  1344.             write_back_intra_pred_mode(h);
  1345.             if( check_intra4x4_pred_mode(h) < 0 ) return -1;
  1346.         } else {
  1347.             h->intra16x16_pred_mode= check_intra_pred_mode( h, h->intra16x16_pred_mode );
  1348.             if( h->intra16x16_pred_mode < 0 ) return -1;
  1349.         }
  1350.         h->chroma_pred_mode_table[mb_xy] =
  1351.             h->chroma_pred_mode          = decode_cabac_mb_chroma_pre_mode( h );
  1352.         h->chroma_pred_mode= check_intra_pred_mode( h, h->chroma_pred_mode );
  1353.         if( h->chroma_pred_mode < 0 ) return -1;
  1354.     } else if( partition_count == 4 ) {
  1355.         int i, j, sub_partition_count[4], list, ref[2][4];
  1356.         /* Only P-frame */
  1357.         for( i = 0; i < 4; i++ ) {
  1358.             h->sub_mb_type[i] = decode_cabac_mb_sub_type( h );
  1359.             sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
  1360.             h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
  1361.         }
  1362.         for( list = 0; list < 2; list++ ) {
  1363.             if( h->ref_count[list] > 0 ) {
  1364.                 for( i = 0; i < 4; i++ ) {
  1365.                     if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
  1366.                         if( h->ref_count[list] > 1 )
  1367.                             ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
  1368.                         else
  1369.                             ref[list][i] = 0;
  1370.                     } else {
  1371.                         ref[list][i] = -1;
  1372.                     }
  1373.                                                        h->ref_cache[list][ scan8[4*i]+1 ]=
  1374.                     h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
  1375.                 }
  1376.             }
  1377.         }
  1378.         for(list=0; list<2; list++){
  1379.             for(i=0; i<4; i++){
  1380.                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ];
  1381.                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
  1382.                     const int sub_mb_type= h->sub_mb_type[i];
  1383.                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
  1384.                     for(j=0; j<sub_partition_count[i]; j++){
  1385.                         int mpx, mpy;
  1386.                         int mx, my;
  1387.                         const int index= 4*i + block_width*j;
  1388.                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
  1389.                         int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
  1390.                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mpx, &mpy);
  1391.                         mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 );
  1392.                         my = mpy + decode_cabac_mb_mvd( h, list, index, 1 );
  1393.                         tprintf("final mv:%d %dn", mx, my);
  1394.                         if(IS_SUB_8X8(sub_mb_type)){
  1395.                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]=
  1396.                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
  1397.                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]=
  1398.                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
  1399.                             mvd_cache[ 0 ][0]= mvd_cache[ 1 ][0]=
  1400.                             mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx;
  1401.                             mvd_cache[ 0 ][1]= mvd_cache[ 1 ][1]=
  1402.                             mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy;
  1403.                         }else if(IS_SUB_8X4(sub_mb_type)){
  1404.                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]= mx;
  1405.                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]= my;
  1406.                             mvd_cache[ 0 ][0]= mvd_cache[ 1 ][0]= mx- mpx;
  1407.                             mvd_cache[ 0 ][1]= mvd_cache[ 1 ][1]= my - mpy;
  1408.                         }else if(IS_SUB_4X8(sub_mb_type)){
  1409.                             mv_cache[ 0 ][0]= mv_cache[ 8 ][0]= mx;
  1410.                             mv_cache[ 0 ][1]= mv_cache[ 8 ][1]= my;
  1411.                             mvd_cache[ 0 ][0]= mvd_cache[ 8 ][0]= mx - mpx;
  1412.                             mvd_cache[ 0 ][1]= mvd_cache[ 8 ][1]= my - mpy;
  1413.                         }else{
  1414.                             assert(IS_SUB_4X4(sub_mb_type));
  1415.                             mv_cache[ 0 ][0]= mx;
  1416.                             mv_cache[ 0 ][1]= my;
  1417.                             mvd_cache[ 0 ][0]= mx - mpx;
  1418.                             mvd_cache[ 0 ][1]= my - mpy;
  1419.                         }
  1420.                     }
  1421.                 }else{
  1422.                     uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
  1423.                     uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][0];
  1424.                     p[0] = p[1] = p[8] = p[9] = 0;
  1425.                     pd[0]= pd[1]= pd[8]= pd[9]= 0;
  1426.                 }
  1427.             }
  1428.         }
  1429.     } else if( !IS_DIRECT(mb_type) ) {
  1430.         int list, mx, my, i, mpx, mpy;
  1431.         if(IS_16X16(mb_type)){
  1432.             for(list=0; list<2; list++){
  1433.                 if(IS_DIR(mb_type, 0, list)){
  1434.                     if(h->ref_count[list] > 0 ){
  1435.                         const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0;
  1436.                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
  1437.                     }
  1438.                 }
  1439.             }
  1440.             for(list=0; list<2; list++){
  1441.                 if(IS_DIR(mb_type, 0, list)){
  1442.                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy);
  1443.                     mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 );
  1444.                     my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 );
  1445.                     tprintf("final mv:%d %dn", mx, my);
  1446.                     fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
  1447.                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
  1448.                 }
  1449.             }
  1450.         }
  1451.         else if(IS_16X8(mb_type)){
  1452.             for(list=0; list<2; list++){
  1453.                 if(h->ref_count[list]>0){
  1454.                     for(i=0; i<2; i++){
  1455.                         if(IS_DIR(mb_type, i, list)){
  1456.                             const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 8*i ) : 0;
  1457.                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
  1458.                         }
  1459.                     }
  1460.                 }
  1461.             }
  1462.             for(list=0; list<2; list++){
  1463.                 for(i=0; i<2; i++){
  1464.                     if(IS_DIR(mb_type, i, list)){
  1465.                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mpx, &mpy);
  1466.                         mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 );
  1467.                         my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 );
  1468.                         tprintf("final mv:%d %dn", mx, my);
  1469.                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4);
  1470.                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
  1471.                     }
  1472.                 }
  1473.             }
  1474.         }else{
  1475.             assert(IS_8X16(mb_type));
  1476.             for(list=0; list<2; list++){
  1477.                 if(h->ref_count[list]>0){
  1478.                     for(i=0; i<2; i++){
  1479.                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
  1480.                             const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 4*i ) : 0;
  1481.                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
  1482.                         }
  1483.                     }
  1484.                 }
  1485.             }
  1486.             for(list=0; list<2; list++){
  1487.                 for(i=0; i<2; i++){
  1488.                     if(IS_DIR(mb_type, i, list)){
  1489.                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mpx, &mpy);
  1490.                         mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 );
  1491.                         my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 );
  1492.                         tprintf("final mv:%d %dn", mx, my);
  1493.                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
  1494.                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
  1495.                     }
  1496.                 }
  1497.             }
  1498.         }
  1499.     }
  1500.    if( IS_INTER( mb_type ) ) {
  1501.         h->chroma_pred_mode_table[mb_xy] = 0;
  1502.         write_back_motion( h, mb_type );
  1503.    }
  1504.     if( !IS_INTRA16x16( mb_type ) ) {
  1505.         cbp  = decode_cabac_mb_cbp_luma( h );
  1506.         cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
  1507.     }
  1508.     h->cbp_table[mb_xy] = cbp;
  1509.     if( cbp || IS_INTRA16x16( mb_type ) ) {
  1510.         const uint8_t *scan, *dc_scan;
  1511.         int dqp;
  1512.         if(IS_INTERLACED(mb_type)){
  1513.             scan= field_scan;
  1514.             dc_scan= luma_dc_field_scan;
  1515.         }else{
  1516.             scan= zigzag_scan;
  1517.             dc_scan= luma_dc_zigzag_scan;
  1518.         }
  1519.         h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h );
  1520.         s->qscale += dqp;
  1521.         if(((unsigned)s->qscale) > 51){
  1522.             if(s->qscale<0) s->qscale+= 52;
  1523.             else            s->qscale-= 52;
  1524.         }
  1525.         h->chroma_qp = get_chroma_qp(h, s->qscale);
  1526.         if( IS_INTRA16x16( mb_type ) ) {
  1527.             int i;
  1528.             //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DCn" );
  1529.             if( decode_cabac_residual( h, h->mb, 0, 0, dc_scan, s->qscale, 16) < 0)
  1530.                 return -1;
  1531.             if( cbp&15 ) {
  1532.                 for( i = 0; i < 16; i++ ) {
  1533.                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%dn", i );
  1534.                     if( decode_cabac_residual(h, h->mb + 16*i, 1, i, scan + 1, s->qscale, 15) < 0 )
  1535.                         return -1;
  1536.                 }
  1537.             } else {
  1538.                 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
  1539.             }
  1540.         } else {
  1541.             int i8x8, i4x4;
  1542.             for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
  1543.                 if( cbp & (1<<i8x8) ) {
  1544.                     for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
  1545.                         const int index = 4*i8x8 + i4x4;
  1546.                         //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %dn", index );
  1547.                         if( decode_cabac_residual(h, h->mb + 16*index, 2, index, scan, s->qscale, 16) < 0 )
  1548.                             return -1;
  1549.                     }
  1550.                 } else {
  1551.                     uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
  1552.                     nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
  1553.                 }
  1554.             }
  1555.         }
  1556.         if( cbp&0x30 ){
  1557.             int c;
  1558.             for( c = 0; c < 2; c++ ) {
  1559.                 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DCn",c );
  1560.                 if( decode_cabac_residual(h, h->mb + 256 + 16*4*c, 3, c, chroma_dc_scan, h->chroma_qp, 4) < 0)
  1561.                     return -1;
  1562.             }
  1563.         }
  1564.         if( cbp&0x20 ) {
  1565.             int c, i;
  1566.             for( c = 0; c < 2; c++ ) {
  1567.                 for( i = 0; i < 4; i++ ) {
  1568.                     const int index = 16 + 4 * c + i;
  1569.                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %dn",c, index - 16 );
  1570.                     if( decode_cabac_residual(h, h->mb + 16*index, 4, index - 16, scan + 1, h->chroma_qp, 15) < 0)
  1571.                         return -1;
  1572.                 }
  1573.             }
  1574.         } else {
  1575.             uint8_t * const nnz= &h->non_zero_count_cache[0];
  1576.             nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
  1577.             nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
  1578.         }
  1579.     } else {
  1580.         memset( &h->non_zero_count_cache[8], 0, 8*5 );
  1581.     }
  1582.     s->current_picture.qscale_table[mb_xy]= s->qscale;
  1583.     write_back_non_zero_count(h);
  1584.     return 0;
  1585. }
  1586. static void filter_mb_edgev( H264Context *h, uint8_t *pix, int stride, int bS[4], int qp ) {
  1587.     int i, d;
  1588.     const int index_a = clip( qp + h->slice_alpha_c0_offset, 0, 51 );
  1589.     const int alpha = alpha_table[index_a];
  1590.     const int beta  = beta_table[clip( qp + h->slice_beta_offset, 0, 51 )];
  1591.     for( i = 0; i < 4; i++ ) {
  1592.         if( bS[i] == 0 ) {
  1593.             pix += 4 * stride;
  1594.             continue;
  1595.         }
  1596.         if( bS[i] < 4 ) {
  1597.             const int tc0 = tc0_table[index_a][bS[i] - 1];
  1598.             /* 4px edge length */
  1599.             for( d = 0; d < 4; d++ ) {
  1600.                 const int p0 = pix[-1];
  1601.                 const int p1 = pix[-2];
  1602.                 const int p2 = pix[-3];
  1603.                 const int q0 = pix[0];
  1604.                 const int q1 = pix[1];
  1605.                 const int q2 = pix[2];
  1606.                 if( ABS( p0 - q0 ) < alpha &&
  1607.                     ABS( p1 - p0 ) < beta &&
  1608.                     ABS( q1 - q0 ) < beta ) {
  1609.                     int tc = tc0;
  1610.                     int i_delta;
  1611.                     if( ABS( p2 - p0 ) < beta ) {
  1612.                         pix[-2] = p1 + clip( ( p2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( p1 << 1 ) ) >> 1, -tc0, tc0 );
  1613.                         tc++;
  1614.                     }
  1615.                     if( ABS( q2 - q0 ) < beta ) {
  1616.                         pix[1] = q1 + clip( ( q2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( q1 << 1 ) ) >> 1, -tc0, tc0 );
  1617.                         tc++;
  1618.                     }
  1619.                     i_delta = clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
  1620.                     pix[-1] = clip_uint8( p0 + i_delta );    /* p0' */
  1621.                     pix[0]  = clip_uint8( q0 - i_delta );    /* q0' */
  1622.                 }
  1623.                 pix += stride;
  1624.             }
  1625.         }else{
  1626.             /* 4px edge length */
  1627.             for( d = 0; d < 4; d++ ) {
  1628.                 const int p0 = pix[-1];
  1629.                 const int p1 = pix[-2];
  1630.                 const int p2 = pix[-3];
  1631.                 const int q0 = pix[0];
  1632.                 const int q1 = pix[1];
  1633.                 const int q2 = pix[2];
  1634.                 if( ABS( p0 - q0 ) < alpha &&
  1635.                     ABS( p1 - p0 ) < beta &&
  1636.                     ABS( q1 - q0 ) < beta ) {
  1637.                     if(ABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
  1638.                         if( ABS( p2 - p0 ) < beta)
  1639.                         {
  1640.                             const int p3 = pix[-4];
  1641.                             /* p0', p1', p2' */
  1642.                             pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
  1643.                             pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
  1644.                             pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
  1645.                         } else {
  1646.                             /* p0' */
  1647.                             pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  1648.                         }
  1649.                         if( ABS( q2 - q0 ) < beta)
  1650.                         {
  1651.                             const int q3 = pix[3];
  1652.                             /* q0', q1', q2' */
  1653.                             pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
  1654.                             pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
  1655.                             pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
  1656.                         } else {
  1657.                             /* q0' */
  1658.                             pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  1659.                         }
  1660.                     }else{
  1661.                         /* p0', q0' */
  1662.                         pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  1663.                         pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  1664.                     }
  1665.                 }
  1666.                 pix += stride;
  1667.             }
  1668.         }
  1669.     }
  1670. }
  1671. static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int bS[4], int qp ) {
  1672.     int i, d;
  1673.     const int index_a = clip( qp + h->slice_alpha_c0_offset, 0, 51 );
  1674.     const int alpha = alpha_table[index_a];
  1675.     const int beta  = beta_table[clip( qp + h->slice_beta_offset, 0, 51 )];
  1676.     for( i = 0; i < 4; i++ ) {
  1677.         if( bS[i] == 0 ) {
  1678.             pix += 2 * stride;
  1679.             continue;
  1680.         }
  1681.         if( bS[i] < 4 ) {
  1682.             const int tc = tc0_table[index_a][bS[i] - 1] + 1;
  1683.             /* 2px edge length (because we use same bS than the one for luma) */
  1684.             for( d = 0; d < 2; d++ ){
  1685.                 const int p0 = pix[-1];
  1686.                 const int p1 = pix[-2];
  1687.                 const int q0 = pix[0];
  1688.                 const int q1 = pix[1];
  1689.                 if( ABS( p0 - q0 ) < alpha &&
  1690.                     ABS( p1 - p0 ) < beta &&
  1691.                     ABS( q1 - q0 ) < beta ) {
  1692.                     const int i_delta = clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
  1693.                     pix[-1] = clip_uint8( p0 + i_delta );    /* p0' */
  1694.                     pix[0]  = clip_uint8( q0 - i_delta );    /* q0' */
  1695.                 }
  1696.                 pix += stride;
  1697.             }
  1698.         }else{
  1699.             /* 2px edge length (because we use same bS than the one for luma) */
  1700.             for( d = 0; d < 2; d++ ){
  1701.                 const int p0 = pix[-1];
  1702.                 const int p1 = pix[-2];
  1703.                 const int q0 = pix[0];
  1704.                 const int q1 = pix[1];
  1705.                 if( ABS( p0 - q0 ) < alpha &&
  1706.                     ABS( p1 - p0 ) < beta &&
  1707.                     ABS( q1 - q0 ) < beta ) {
  1708.                     pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;   /* p0' */
  1709.                     pix[0]  = ( 2*q1 + q0 + p1 + 2 ) >> 2;   /* q0' */
  1710.                 }
  1711.                 pix += stride;
  1712.             }
  1713.         }
  1714.     }
  1715. }
  1716. static void filter_mb_edgeh( H264Context *h, uint8_t *pix, int stride, int bS[4], int qp ) {
  1717.     int i, d;
  1718.     const int index_a = clip( qp + h->slice_alpha_c0_offset, 0, 51 );
  1719.     const int alpha = alpha_table[index_a];
  1720.     const int beta  = beta_table[clip( qp + h->slice_beta_offset, 0, 51 )];
  1721.     const int pix_next  = stride;
  1722.     for( i = 0; i < 4; i++ ) {
  1723.         if( bS[i] == 0 ) {
  1724.             pix += 4;
  1725.             continue;
  1726.         }
  1727.         if( bS[i] < 4 ) {
  1728.             const int tc0 = tc0_table[index_a][bS[i] - 1];
  1729.             /* 4px edge length */
  1730.             for( d = 0; d < 4; d++ ) {
  1731.                 const int p0 = pix[-1*pix_next];
  1732.                 const int p1 = pix[-2*pix_next];
  1733.                 const int p2 = pix[-3*pix_next];
  1734.                 const int q0 = pix[0];
  1735.                 const int q1 = pix[1*pix_next];
  1736.                 const int q2 = pix[2*pix_next];
  1737.                 if( ABS( p0 - q0 ) < alpha &&
  1738.                     ABS( p1 - p0 ) < beta &&
  1739.                     ABS( q1 - q0 ) < beta ) {
  1740.                     int tc = tc0;
  1741.                     int i_delta;
  1742.                     if( ABS( p2 - p0 ) < beta ) {
  1743.                         pix[-2*pix_next] = p1 + clip( ( p2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( p1 << 1 ) ) >> 1, -tc0, tc0 );
  1744.                         tc++;
  1745.                     }
  1746.                     if( ABS( q2 - q0 ) < beta ) {
  1747.                         pix[pix_next] = q1 + clip( ( q2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( q1 << 1 ) ) >> 1, -tc0, tc0 );
  1748.                         tc++;
  1749.                     }
  1750.                     i_delta = clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
  1751.                     pix[-pix_next] = clip_uint8( p0 + i_delta );    /* p0' */
  1752.                     pix[0]         = clip_uint8( q0 - i_delta );    /* q0' */
  1753.                 }
  1754.                 pix++;
  1755.             }
  1756.         }else{
  1757.             /* 4px edge length */
  1758.             for( d = 0; d < 4; d++ ) {
  1759.                 const int p0 = pix[-1*pix_next];
  1760.                 const int p1 = pix[-2*pix_next];
  1761.                 const int p2 = pix[-3*pix_next];
  1762.                 const int q0 = pix[0];
  1763.                 const int q1 = pix[1*pix_next];
  1764.                 const int q2 = pix[2*pix_next];
  1765.                 if( ABS( p0 - q0 ) < alpha &&
  1766.                     ABS( p1 - p0 ) < beta &&
  1767.                     ABS( q1 - q0 ) < beta ) {
  1768.                     const int p3 = pix[-4*pix_next];
  1769.                     const int q3 = pix[ 3*pix_next];
  1770.                     if(ABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
  1771.                         if( ABS( p2 - p0 ) < beta) {
  1772.                             /* p0', p1', p2' */
  1773.                             pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
  1774.                             pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
  1775.                             pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
  1776.                         } else {
  1777.                             /* p0' */
  1778.                             pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  1779.                         }
  1780.                         if( ABS( q2 - q0 ) < beta) {
  1781.                             /* q0', q1', q2' */
  1782.                             pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
  1783.                             pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
  1784.                             pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
  1785.                         } else {
  1786.                             /* q0' */
  1787.                             pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  1788.                         }
  1789.                     }else{
  1790.                         /* p0', q0' */
  1791.                         pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
  1792.                         pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
  1793.                     }
  1794.                 }
  1795.                 pix++;
  1796.             }
  1797.         }
  1798.     }
  1799. }
  1800. static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int bS[4], int qp ) {
  1801.     int i, d;
  1802.     const int index_a = clip( qp + h->slice_alpha_c0_offset, 0, 51 );
  1803.     const int alpha = alpha_table[index_a];
  1804.     const int beta  = beta_table[clip( qp + h->slice_beta_offset, 0, 51 )];
  1805.     const int pix_next  = stride;
  1806.     for( i = 0; i < 4; i++ )
  1807.     {
  1808.         if( bS[i] == 0 ) {
  1809.             pix += 2;
  1810.             continue;
  1811.         }
  1812.         if( bS[i] < 4 ) {
  1813.             int tc = tc0_table[index_a][bS[i] - 1] + 1;
  1814.             /* 2px edge length (see deblocking_filter_edgecv) */
  1815.             for( d = 0; d < 2; d++ ) {
  1816.                 const int p0 = pix[-1*pix_next];
  1817.                 const int p1 = pix[-2*pix_next];
  1818.                 const int q0 = pix[0];
  1819.                 const int q1 = pix[1*pix_next];
  1820.                 if( ABS( p0 - q0 ) < alpha &&
  1821.                     ABS( p1 - p0 ) < beta &&
  1822.                     ABS( q1 - q0 ) < beta ) {
  1823.                     int i_delta = clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
  1824.                     pix[-pix_next] = clip_uint8( p0 + i_delta );    /* p0' */
  1825.                     pix[0]         = clip_uint8( q0 - i_delta );    /* q0' */
  1826.                 }
  1827.                 pix++;
  1828.             }
  1829.         }else{
  1830.             /* 2px edge length (see deblocking_filter_edgecv) */
  1831.             for( d = 0; d < 2; d++ ) {
  1832.                 const int p0 = pix[-1*pix_next];
  1833.                 const int p1 = pix[-2*pix_next];
  1834.                 const int q0 = pix[0];
  1835.                 const int q1 = pix[1*pix_next];
  1836.                 if( ABS( p0 - q0 ) < alpha &&
  1837.                     ABS( p1 - p0 ) < beta &&
  1838.                     ABS( q1 - q0 ) < beta ) {
  1839.                     pix[-pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;   /* p0' */
  1840.                     pix[0]         = ( 2*q1 + q0 + p1 + 2 ) >> 2;   /* q0' */
  1841.                 }
  1842.                 pix++;
  1843.             }
  1844.         }
  1845.     }
  1846. }
  1847. static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr) {
  1848.     MpegEncContext * const s = &h->s;
  1849.     const int mb_xy= mb_x + mb_y*s->mb_stride;
  1850.     int linesize, uvlinesize;
  1851.     int dir;
  1852.     /* FIXME Implement deblocking filter for field MB */
  1853.     if( h->sps.mb_aff ) {
  1854.         return;
  1855.     }
  1856.     linesize = s->linesize;
  1857.     uvlinesize = s->uvlinesize;
  1858.     /* dir : 0 -> vertical edge, 1 -> horizontal edge */
  1859.     for( dir = 0; dir < 2; dir++ )
  1860.     {
  1861.         int start = 0;
  1862.         int edge;
  1863.         /* test picture boundary */
  1864.         if( ( dir == 0 && mb_x == 0 ) || ( dir == 1 && mb_y == 0 ) ) {
  1865.             start = 1;
  1866.         }
  1867.         /* FIXME test slice boundary */
  1868.         if( h->deblocking_filter == 2 ) {
  1869.         }
  1870.         /* Calculate bS */
  1871.         for( edge = start; edge < 4; edge++ ) {
  1872.             /* mbn_xy: neighbour macroblock (how that works for field ?) */
  1873.             int mbn_xy = edge > 0 ? mb_xy : ( dir == 0 ? mb_xy -1 : mb_xy - s->mb_stride );
  1874.             int bS[4];
  1875.             int qp;
  1876.             if( IS_INTRA( s->current_picture.mb_type[mb_xy] ) ||
  1877.                 IS_INTRA( s->current_picture.mb_type[mbn_xy] ) ) {
  1878.                 bS[0] = bS[1] = bS[2] = bS[3] = ( edge == 0 ? 4 : 3 );
  1879.             } else {
  1880.                 int i;
  1881.                 for( i = 0; i < 4; i++ ) {
  1882.                     int x = dir == 0 ? edge : i;
  1883.                     int y = dir == 0 ? i    : edge;
  1884.                     int b_idx= 8 + 4 + x + 8*y;
  1885.                     int bn_idx= b_idx - (dir ? 8:1);
  1886.                     if( h->non_zero_count_cache[b_idx] != 0 ||
  1887.                         h->non_zero_count_cache[bn_idx] != 0 ) {
  1888.                         bS[i] = 2;
  1889.                     }
  1890.                     else if( h->slice_type == P_TYPE ) {
  1891.                         if( h->ref_cache[0][b_idx] != h->ref_cache[0][bn_idx] ||
  1892.                             ABS( h->mv_cache[0][b_idx][0] - h->mv_cache[0][bn_idx][0] ) >= 4 ||
  1893.                             ABS( h->mv_cache[0][b_idx][1] - h->mv_cache[0][bn_idx][1] ) >= 4 )
  1894.                             bS[i] = 1;
  1895.                         else
  1896.                             bS[i] = 0;
  1897.                     }
  1898.                     else {
  1899.                         /* FIXME Add support for B frame */
  1900.                         return;
  1901.                     }
  1902.                 }
  1903.                 if(bS[0]+bS[1]+bS[2]+bS[3] == 0)
  1904.                     continue;
  1905.             }
  1906.             /* Filter edge */
  1907.             qp = ( s->qscale + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
  1908.             if( dir == 0 ) {
  1909.                 filter_mb_edgev( h, &img_y[4*edge], linesize, bS, qp );
  1910.                 if( (edge&1) == 0 ) {
  1911.                     int chroma_qp = ( h->chroma_qp +
  1912.                                       get_chroma_qp( h, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1;
  1913.                     filter_mb_edgecv( h, &img_cb[2*edge], uvlinesize, bS, chroma_qp );
  1914.                     filter_mb_edgecv( h, &img_cr[2*edge], uvlinesize, bS, chroma_qp );
  1915.                 }
  1916.             } else {
  1917.                 filter_mb_edgeh( h, &img_y[4*edge*linesize], linesize, bS, qp );
  1918.                 if( (edge&1) == 0 ) {
  1919.                     int chroma_qp = ( h->chroma_qp +
  1920.                                       get_chroma_qp( h, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1;
  1921.                     filter_mb_edgech( h, &img_cb[2*edge*uvlinesize], uvlinesize, bS, chroma_qp );
  1922.                     filter_mb_edgech( h, &img_cr[2*edge*uvlinesize], uvlinesize, bS, chroma_qp );
  1923.                 }
  1924.             }
  1925.         }
  1926.     }
  1927. }
  1928. static int decode_slice(H264Context *h){
  1929.     MpegEncContext * const s = &h->s;
  1930.     const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
  1931.     s->mb_skip_run= -1;
  1932.     if( h->pps.cabac ) {
  1933.         int i;
  1934.         /* realign */
  1935.         align_get_bits( &s->gb );
  1936.         /* init cabac */
  1937.         ff_init_cabac_states( &h->cabac, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64 );
  1938.         ff_init_cabac_decoder( &h->cabac,
  1939.                                s->gb.buffer + get_bits_count(&s->gb)/8,
  1940.                                ( s->gb.size_in_bits - get_bits_count(&s->gb) + 7)/8);
  1941.         /* calculate pre-state */
  1942.         for( i= 0; i < 399; i++ ) {
  1943.             int pre;
  1944.             if( h->slice_type == I_TYPE )
  1945.                 pre = clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cabac_context_init_I[i][1], 1, 126 );
  1946.             else
  1947.                 pre = 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 );
  1948.             if( pre <= 63 )
  1949.                 h->cabac_state[i] = 2 * ( 63 - pre ) + 0;
  1950.             else
  1951.                 h->cabac_state[i] = 2 * ( pre - 64 ) + 1;
  1952.         }
  1953.         for(;;){
  1954.             int ret = decode_mb_cabac(h);
  1955.             int eos = get_cabac_terminate( &h->cabac ); /* End of Slice flag */
  1956.             hl_decode_mb(h);
  1957.             /* XXX: useless as decode_mb_cabac it doesn't support that ... */
  1958.             if( ret >= 0 && h->sps.mb_aff ) { //FIXME optimal? or let mb_decode decode 16x32 ?
  1959.                 s->mb_y++;
  1960.                 ret = decode_mb_cabac(h);
  1961.                 eos = get_cabac_terminate( &h->cabac );
  1962.                 hl_decode_mb(h);
  1963.                 s->mb_y--;
  1964.             }
  1965.             if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 1) {
  1966.                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %dn", s->mb_x, s->mb_y);
  1967.                 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);
  1968.                 return -1;
  1969.             }
  1970.             if( ++s->mb_x >= s->mb_width ) {
  1971.                 s->mb_x = 0;
  1972.                 ff_draw_horiz_band(s, 16*s->mb_y, 16);
  1973.                 if( ++s->mb_y >= s->mb_height ) {
  1974.                     tprintf("slice end %d %dn", get_bits_count(&s->gb), s->gb.size_in_bits);
  1975.                 }
  1976.             }
  1977.             if( eos || s->mb_y >= s->mb_height ) {
  1978.                 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);
  1979.                 return 0;
  1980.             }
  1981. #if 0
  1982.             /* TODO test over-reading in cabac code */
  1983.             else if( read too much in h->cabac ) {
  1984.                 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);
  1985.                 return -1;
  1986.             }
  1987. #endif
  1988.         }
  1989.     } else {
  1990.         for(;;){
  1991.             int ret = decode_mb_cavlc(h);
  1992.             hl_decode_mb(h);
  1993.             if(ret>=0 && h->sps.mb_aff){ //FIXME optimal? or let mb_decode decode 16x32 ?
  1994.                 s->mb_y++;
  1995.                 ret = decode_mb_cavlc(h);
  1996.                 hl_decode_mb(h);
  1997.                 s->mb_y--;
  1998.             }
  1999.             if(ret<0){
  2000.                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %dn", s->mb_x, s->mb_y);
  2001.                 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);
  2002.                 return -1;
  2003.             }
  2004.             if(++s->mb_x >= s->mb_width){
  2005.                 s->mb_x=0;
  2006.                 ff_draw_horiz_band(s, 16*s->mb_y, 16);
  2007.                 if(++s->mb_y >= s->mb_height){
  2008.                     tprintf("slice end %d %dn", get_bits_count(&s->gb), s->gb.size_in_bits);
  2009.                     if(get_bits_count(&s->gb) == s->gb.size_in_bits ) {
  2010.                         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);
  2011.                         return 0;
  2012.                     }else{
  2013.                         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);
  2014.                         return -1;
  2015.                     }
  2016.                 }
  2017.             }
  2018.             if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){
  2019.                 if(get_bits_count(&s->gb) == s->gb.size_in_bits ){
  2020.                     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);
  2021.                     return 0;
  2022.                 }else{
  2023.                     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);
  2024.                     return -1;
  2025.                 }
  2026.             }
  2027.         }
  2028.     }
  2029. #if 0
  2030.     for(;s->mb_y < s->mb_height; s->mb_y++){
  2031.         for(;s->mb_x < s->mb_width; s->mb_x++){
  2032.             int ret= decode_mb(h);
  2033.             
  2034.             hl_decode_mb(h);
  2035.             if(ret<0){
  2036.                 fprintf(stderr, "error while decoding MB %d %dn", s->mb_x, s->mb_y);
  2037.                 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);
  2038.                 return -1;
  2039.             }
  2040.         
  2041.             if(++s->mb_x >= s->mb_width){
  2042.                 s->mb_x=0;
  2043.                 if(++s->mb_y >= s->mb_height){
  2044.                     if(get_bits_count(s->gb) == s->gb.size_in_bits){
  2045.                         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);
  2046.                         return 0;
  2047.                     }else{
  2048.                         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);
  2049.                         return -1;
  2050.                     }
  2051.                 }
  2052.             }
  2053.         
  2054.             if(get_bits_count(s->?gb) >= s->gb?.size_in_bits){
  2055.                 if(get_bits_count(s->gb) == s->gb.size_in_bits){
  2056.                     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);
  2057.                     return 0;
  2058.                 }else{
  2059.                     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);
  2060.                     return -1;
  2061.                 }
  2062.             }
  2063.         }
  2064.         s->mb_x=0;
  2065.         ff_draw_horiz_band(s, 16*s->mb_y, 16);
  2066.     }
  2067. #endif
  2068.     return -1; //not reached
  2069. }
  2070. static inline int decode_vui_parameters(H264Context *h, SPS *sps){
  2071.     MpegEncContext * const s = &h->s;
  2072.     int aspect_ratio_info_present_flag, aspect_ratio_idc;
  2073.     aspect_ratio_info_present_flag= get_bits1(&s->gb);
  2074.     
  2075.     if( aspect_ratio_info_present_flag ) {
  2076.         aspect_ratio_idc= get_bits(&s->gb, 8);
  2077.         if( aspect_ratio_idc == EXTENDED_SAR ) {
  2078.             sps->sar.num= get_bits(&s->gb, 16);
  2079.             sps->sar.den= get_bits(&s->gb, 16);
  2080.         }else if(aspect_ratio_idc < 16){
  2081.             sps->sar=  pixel_aspect[aspect_ratio_idc];
  2082.         }else{
  2083.             av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ration");
  2084.             return -1;
  2085.         }
  2086.     }else{
  2087.         sps->sar.num= 
  2088.         sps->sar.den= 0;
  2089.     }
  2090. //            s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
  2091. #if 0
  2092. | overscan_info_present_flag                        |0  |u(1)    |
  2093. | if( overscan_info_present_flag )                  |   |        |
  2094. |  overscan_appropriate_flag                        |0  |u(1)    |
  2095. | video_signal_type_present_flag                    |0  |u(1)    |
  2096. | if( video_signal_type_present_flag ) {            |   |        |
  2097. |  video_format                                     |0  |u(3)    |
  2098. |  video_full_range_flag                            |0  |u(1)    |
  2099. |  colour_description_present_flag                  |0  |u(1)    |
  2100. |  if( colour_description_present_flag ) {          |   |        |
  2101. |   colour_primaries                                |0  |u(8)    |
  2102. |   transfer_characteristics                        |0  |u(8)    |
  2103. |   matrix_coefficients                             |0  |u(8)    |
  2104. |  }                                                |   |        |
  2105. | }                                                 |   |        |
  2106. | chroma_location_info_present_flag                 |0  |u(1)    |
  2107. | if ( chroma_location_info_present_flag ) {        |   |        |
  2108. |  chroma_sample_location_type_top_field            |0  |ue(v)   |
  2109. |  chroma_sample_location_type_bottom_field         |0  |ue(v)   |
  2110. | }                                                 |   |        |
  2111. | timing_info_present_flag                          |0  |u(1)    |
  2112. | if( timing_info_present_flag ) {                  |   |        |
  2113. |  num_units_in_tick                                |0  |u(32)   |
  2114. |  time_scale                                       |0  |u(32)   |
  2115. |  fixed_frame_rate_flag                            |0  |u(1)    |
  2116. | }                                                 |   |        |
  2117. | nal_hrd_parameters_present_flag                   |0  |u(1)    |
  2118. | if( nal_hrd_parameters_present_flag  = =  1)      |   |        |
  2119. |  hrd_parameters( )                                |   |        |
  2120. | vcl_hrd_parameters_present_flag                   |0  |u(1)    |
  2121. | if( vcl_hrd_parameters_present_flag  = =  1)      |   |        |
  2122. |  hrd_parameters( )                                |   |        |
  2123. | if( ( nal_hrd_parameters_present_flag  = =  1  | ||   |        |
  2124. |                                                   |   |        |
  2125. |( vcl_hrd_parameters_present_flag  = =  1 ) )      |   |        |
  2126. |  low_delay_hrd_flag                               |0  |u(1)    |
  2127. | bitstream_restriction_flag                        |0  |u(1)    |
  2128. | if( bitstream_restriction_flag ) {                |0  |u(1)    |
  2129. |  motion_vectors_over_pic_boundaries_flag          |0  |u(1)    |
  2130. |  max_bytes_per_pic_denom                          |0  |ue(v)   |
  2131. |  max_bits_per_mb_denom                            |0  |ue(v)   |
  2132. |  log2_max_mv_length_horizontal                    |0  |ue(v)   |
  2133. |  log2_max_mv_length_vertical                      |0  |ue(v)   |
  2134. |  num_reorder_frames                               |0  |ue(v)   |
  2135. |  max_dec_frame_buffering                          |0  |ue(v)   |
  2136. | }                                                 |   |        |
  2137. |}                                                  |   |        |
  2138. #endif
  2139.     return 0;
  2140. }
  2141. static inline int decode_seq_parameter_set(H264Context *h){
  2142.     MpegEncContext * const s = &h->s;
  2143.     int profile_idc, level_idc;
  2144.     int sps_id, i;
  2145.     SPS *sps;
  2146.     
  2147.     profile_idc= get_bits(&s->gb, 8);
  2148.     get_bits1(&s->gb);   //constraint_set0_flag
  2149.     get_bits1(&s->gb);   //constraint_set1_flag
  2150.     get_bits1(&s->gb);   //constraint_set2_flag
  2151.     get_bits(&s->gb, 5); // reserved
  2152.     level_idc= get_bits(&s->gb, 8);
  2153.     sps_id= get_ue_golomb(&s->gb);
  2154.     
  2155.     sps= &h->sps_buffer[ sps_id ];
  2156.     sps->profile_idc= profile_idc;
  2157.     sps->level_idc= level_idc;
  2158.     
  2159.     sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4;
  2160.     sps->poc_type= get_ue_golomb(&s->gb);
  2161.     
  2162.     if(sps->poc_type == 0){ //FIXME #define
  2163.         sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
  2164.     } else if(sps->poc_type == 1){//FIXME #define
  2165.         sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
  2166.         sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
  2167.         sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb);
  2168.         sps->poc_cycle_length= get_ue_golomb(&s->gb);
  2169.         
  2170.         for(i=0; i<sps->poc_cycle_length; i++)
  2171.             sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb);
  2172.     }
  2173.     if(sps->poc_type > 2){
  2174.         av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %dn", sps->poc_type);
  2175.         return -1;
  2176.     }
  2177.     sps->ref_frame_count= get_ue_golomb(&s->gb);
  2178.     sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb);
  2179.     sps->mb_width= get_ue_golomb(&s->gb) + 1;
  2180.     sps->mb_height= get_ue_golomb(&s->gb) + 1;
  2181.     sps->frame_mbs_only_flag= get_bits1(&s->gb);
  2182.     if(!sps->frame_mbs_only_flag)
  2183.         sps->mb_aff= get_bits1(&s->gb);
  2184.     else
  2185.         sps->mb_aff= 0;
  2186.     sps->direct_8x8_inference_flag= get_bits1(&s->gb);
  2187.     sps->crop= get_bits1(&s->gb);
  2188.     if(sps->crop){
  2189.         sps->crop_left  = get_ue_golomb(&s->gb);
  2190.         sps->crop_right = get_ue_golomb(&s->gb);
  2191.         sps->crop_top   = get_ue_golomb(&s->gb);
  2192.         sps->crop_bottom= get_ue_golomb(&s->gb);
  2193.         if(sps->crop_left || sps->crop_top){
  2194.             av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completly supported, this could look slightly wrong ...n");
  2195.         }
  2196.     }else{
  2197.         sps->crop_left  = 
  2198.         sps->crop_right = 
  2199.         sps->crop_top   = 
  2200.         sps->crop_bottom= 0;
  2201.     }
  2202.     sps->vui_parameters_present_flag= get_bits1(&s->gb);
  2203.     if( sps->vui_parameters_present_flag )
  2204.         decode_vui_parameters(h, sps);
  2205.     
  2206.     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
  2207.         av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%d profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %sn", 
  2208.                sps_id, sps->profile_idc, sps->level_idc,
  2209.                sps->poc_type,
  2210.                sps->ref_frame_count,
  2211.                sps->mb_width, sps->mb_height,
  2212.                sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
  2213.                sps->direct_8x8_inference_flag ? "8B8" : "",
  2214.                sps->crop_left, sps->crop_right, 
  2215.                sps->crop_top, sps->crop_bottom, 
  2216.                sps->vui_parameters_present_flag ? "VUI" : ""
  2217.                );
  2218.     }
  2219.     return 0;
  2220. }
  2221. static inline int decode_picture_parameter_set(H264Context *h){
  2222.     MpegEncContext * const s = &h->s;
  2223.     int pps_id= get_ue_golomb(&s->gb);
  2224.     PPS *pps= &h->pps_buffer[pps_id];
  2225.     
  2226.     pps->sps_id= get_ue_golomb(&s->gb);
  2227.     pps->cabac= get_bits1(&s->gb);
  2228.     pps->pic_order_present= get_bits1(&s->gb);
  2229.     pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
  2230.     if(pps->slice_group_count > 1 ){
  2231.         pps->mb_slice_group_map_type= get_ue_golomb(&s->gb);
  2232.         av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supportedn");
  2233.         switch(pps->mb_slice_group_map_type){
  2234.         case 0:
  2235. #if 0
  2236. |   for( i = 0; i <= num_slice_groups_minus1; i++ ) |   |        |
  2237. |    run_length[ i ]                                |1  |ue(v)   |
  2238. #endif
  2239.             break;
  2240.         case 2:
  2241. #if 0
  2242. |   for( i = 0; i < num_slice_groups_minus1; i++ )  |   |        |
  2243. |{                                                  |   |        |
  2244. |    top_left_mb[ i ]                               |1  |ue(v)   |
  2245. |    bottom_right_mb[ i ]                           |1  |ue(v)   |
  2246. |   }                                               |   |        |
  2247. #endif
  2248.             break;
  2249.         case 3:
  2250.         case 4:
  2251.         case 5:
  2252. #if 0
  2253. |   slice_group_change_direction_flag               |1  |u(1)    |
  2254. |   slice_group_change_rate_minus1                  |1  |ue(v)   |
  2255. #endif
  2256.             break;
  2257.         case 6:
  2258. #if 0
  2259. |   slice_group_id_cnt_minus1                       |1  |ue(v)   |
  2260. |   for( i = 0; i <= slice_group_id_cnt_minus1; i++ |   |        |
  2261. |)                                                  |   |        |
  2262. |    slice_group_id[ i ]                            |1  |u(v)    |
  2263. #endif
  2264.             break;
  2265.         }
  2266.     }
  2267.     pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
  2268.     pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
  2269.     if(pps->ref_count[0] > 32 || pps->ref_count[1] > 32){
  2270.         av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)n");
  2271.         return -1;
  2272.     }
  2273.     
  2274.     pps->weighted_pred= get_bits1(&s->gb);
  2275.     pps->weighted_bipred_idc= get_bits(&s->gb, 2);
  2276.     pps->init_qp= get_se_golomb(&s->gb) + 26;
  2277.     pps->init_qs= get_se_golomb(&s->gb) + 26;
  2278.     pps->chroma_qp_index_offset= get_se_golomb(&s->gb);
  2279.     pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
  2280.     pps->constrained_intra_pred= get_bits1(&s->gb);
  2281.     pps->redundant_pic_cnt_present = get_bits1(&s->gb);
  2282.     
  2283.     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
  2284.         av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%d sps:%d %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d %s %s %sn", 
  2285.                pps_id, pps->sps_id,
  2286.                pps->cabac ? "CABAC" : "CAVLC",
  2287.                pps->slice_group_count,
  2288.                pps->ref_count[0], pps->ref_count[1],
  2289.                pps->weighted_pred ? "weighted" : "",
  2290.                pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset,
  2291.                pps->deblocking_filter_parameters_present ? "LPAR" : "",
  2292.                pps->constrained_intra_pred ? "CONSTR" : "",
  2293.                pps->redundant_pic_cnt_present ? "REDU" : ""
  2294.                );
  2295.     }
  2296.     
  2297.     return 0;
  2298. }
  2299. /**
  2300.  * finds the end of the current frame in the bitstream.
  2301.  * @return the position of the first byte of the next frame, or -1
  2302.  */
  2303. static int find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){
  2304.     int i;
  2305.     uint32_t state;
  2306. //printf("first %02X%02X%02X%02Xn", buf[0], buf[1],buf[2],buf[3]);
  2307. //    mb_addr= pc->mb_addr - 1;
  2308.     state= pc->state;
  2309.     //FIXME this will fail with slices
  2310.     for(i=0; i<buf_size; i++){
  2311.         state= (state<<8) | buf[i];
  2312.         if((state&0xFFFFFF1F) == 0x101 || (state&0xFFFFFF1F) == 0x102 || (state&0xFFFFFF1F) == 0x105){
  2313.             if(pc->frame_start_found){
  2314.                 pc->state=-1; 
  2315.                 pc->frame_start_found= 0;
  2316.                 return i-3;
  2317.             }
  2318.             pc->frame_start_found= 1;
  2319.         }
  2320.     }
  2321.     
  2322.     pc->state= state;
  2323.     return END_NOT_FOUND;
  2324. }
  2325. static int h264_parse(AVCodecParserContext *s,
  2326.                       AVCodecContext *avctx,
  2327.                       uint8_t **poutbuf, int *poutbuf_size, 
  2328.                       const uint8_t *buf, int buf_size)
  2329. {
  2330.     ParseContext *pc = s->priv_data;
  2331.     int next;
  2332.     
  2333.     next= find_frame_end(pc, buf, buf_size);
  2334.     if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
  2335.         *poutbuf = NULL;
  2336.         *poutbuf_size = 0;
  2337.         return buf_size;
  2338.     }
  2339.     *poutbuf = (uint8_t *)buf;
  2340.     *poutbuf_size = buf_size;
  2341.     return next;
  2342. }
  2343. static int decode_nal_units(H264Context *h, uint8_t *buf, int buf_size){
  2344.     MpegEncContext * const s = &h->s;
  2345.     AVCodecContext * const avctx= s->avctx;
  2346.     int buf_index=0;
  2347. #if 0
  2348.     int i;
  2349.     for(i=0; i<32; i++){
  2350.         printf("%X ", buf[i]);
  2351.     }
  2352. #endif
  2353.     for(;;){
  2354.         int consumed;
  2355.         int dst_length;
  2356.         int bit_length;
  2357.         uint8_t *ptr;
  2358.         
  2359.         // start code prefix search
  2360.         for(; buf_index + 3 < buf_size; buf_index++){
  2361.             // this should allways succeed in the first iteration
  2362.             if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1)
  2363.                 break;
  2364.         }
  2365.         
  2366.         if(buf_index+3 >= buf_size) break;
  2367.         
  2368.         buf_index+=3;
  2369.         
  2370.         ptr= decode_nal(h, buf + buf_index, &dst_length, &consumed, buf_size - buf_index);
  2371.         if(ptr[dst_length - 1] == 0) dst_length--;
  2372.         bit_length= 8*dst_length - decode_rbsp_trailing(ptr + dst_length - 1);
  2373.         if(s->avctx->debug&FF_DEBUG_STARTCODE){
  2374.             av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d at %d length %dn", h->nal_unit_type, buf_index, dst_length);
  2375.         }
  2376.         
  2377.         buf_index += consumed;
  2378.         if( s->hurry_up == 1 && h->nal_ref_idc  == 0 )
  2379.             continue;
  2380.         
  2381.         switch(h->nal_unit_type){
  2382.         case NAL_IDR_SLICE:
  2383.             idr(h); //FIXME ensure we dont loose some frames if there is reordering
  2384.         case NAL_SLICE:
  2385.             init_get_bits(&s->gb, ptr, bit_length);
  2386.             h->intra_gb_ptr=
  2387.             h->inter_gb_ptr= &s->gb;
  2388.             s->data_partitioning = 0;
  2389.             
  2390.             if(decode_slice_header(h) < 0) return -1;
  2391.             if(h->redundant_pic_count==0 && s->hurry_up < 5 )
  2392.                 decode_slice(h);
  2393.             break;
  2394.         case NAL_DPA:
  2395.             init_get_bits(&s->gb, ptr, bit_length);
  2396.             h->intra_gb_ptr=
  2397.             h->inter_gb_ptr= NULL;
  2398.             s->data_partitioning = 1;
  2399.             
  2400.             if(decode_slice_header(h) < 0) return -1;
  2401.             break;
  2402.         case NAL_DPB:
  2403.             init_get_bits(&h->intra_gb, ptr, bit_length);
  2404.             h->intra_gb_ptr= &h->intra_gb;
  2405.             break;
  2406.         case NAL_DPC:
  2407.             init_get_bits(&h->inter_gb, ptr, bit_length);
  2408.             h->inter_gb_ptr= &h->inter_gb;
  2409.             if(h->redundant_pic_count==0 && h->intra_gb_ptr && s->data_partitioning && s->hurry_up < 5 )
  2410.                 decode_slice(h);
  2411.             break;
  2412.         case NAL_SEI:
  2413.             break;
  2414.         case NAL_SPS:
  2415.             init_get_bits(&s->gb, ptr, bit_length);
  2416.             decode_seq_parameter_set(h);
  2417.             
  2418.             if(s->flags& CODEC_FLAG_LOW_DELAY)
  2419.                 s->low_delay=1;
  2420.       
  2421.             avctx->has_b_frames= !s->low_delay;
  2422.             break;
  2423.         case NAL_PPS:
  2424.             init_get_bits(&s->gb, ptr, bit_length);
  2425.             
  2426.             decode_picture_parameter_set(h);
  2427.             break;
  2428.         case NAL_PICTURE_DELIMITER:
  2429.             break;
  2430.         case NAL_FILTER_DATA:
  2431.             break;
  2432. default:
  2433.     av_log(avctx, AV_LOG_ERROR, "Unknown NAL code: %dn", h->nal_unit_type);
  2434.         }        
  2435.         //FIXME move after where irt is set
  2436.         s->current_picture.pict_type= s->pict_type;
  2437.         s->current_picture.key_frame= s->pict_type == I_TYPE;
  2438.     }
  2439.     
  2440.     if(!s->current_picture_ptr) return buf_index; //no frame
  2441.     
  2442.     h->prev_frame_num_offset= h->frame_num_offset;
  2443.     h->prev_frame_num= h->frame_num;
  2444.     if(s->current_picture_ptr->reference){
  2445.         h->prev_poc_msb= h->poc_msb;
  2446.         h->prev_poc_lsb= h->poc_lsb;
  2447.     }
  2448.     if(s->current_picture_ptr->reference)
  2449.         execute_ref_pic_marking(h, h->mmco, h->mmco_index);
  2450.     else
  2451.         assert(h->mmco_index==0);
  2452.     ff_er_frame_end(s);
  2453.     MPV_frame_end(s);
  2454.     return buf_index;
  2455. }
  2456. /**
  2457.  * retunrs the number of bytes consumed for building the current frame
  2458.  */
  2459. static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){
  2460.     if(s->flags&CODEC_FLAG_TRUNCATED){
  2461.         pos -= s->parse_context.last_index;
  2462.         if(pos<0) pos=0; // FIXME remove (uneeded?)
  2463.         
  2464.         return pos;
  2465.     }else{
  2466.         if(pos==0) pos=1; //avoid infinite loops (i doubt thats needed but ...)
  2467.         if(pos+10>buf_size) pos=buf_size; // oops ;)
  2468.         return pos;
  2469.     }
  2470. }
  2471. static int decode_frame(AVCodecContext *avctx, 
  2472.                              void *data, int *data_size,
  2473.                              uint8_t *buf, int buf_size)
  2474. {
  2475.     H264Context *h = avctx->priv_data;
  2476.     MpegEncContext *s = &h->s;
  2477.     AVFrame *pict = data; 
  2478.     int buf_index;
  2479.     
  2480.     s->flags= avctx->flags;
  2481.     s->flags2= avctx->flags2;
  2482.    /* no supplementary picture */
  2483.     if (buf_size == 0) {
  2484.         return 0;
  2485.     }
  2486.     
  2487.     if(s->flags&CODEC_FLAG_TRUNCATED){
  2488.         int next= find_frame_end(&s->parse_context, buf, buf_size);
  2489.         
  2490.         if( ff_combine_frame(&s->parse_context, next, &buf, &buf_size) < 0 )
  2491.             return buf_size;
  2492. //printf("next:%d buf_size:%d last_index:%dn", next, buf_size, s->parse_context.last_index);
  2493.     }
  2494.     if(s->avctx->extradata_size && s->picture_number==0){
  2495.         if(0 < decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) ) 
  2496.             return -1;
  2497.     }
  2498.     buf_index=decode_nal_units(h, buf, buf_size);
  2499.     if(buf_index < 0) 
  2500.         return -1;
  2501.     //FIXME do something with unavailable reference frames    
  2502.  
  2503. //    if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_index, buf_size);
  2504. #if 0
  2505.     if(s->pict_type==B_TYPE || s->low_delay){
  2506.         *pict= *(AVFrame*)&s->current_picture;
  2507.     } else {
  2508.         *pict= *(AVFrame*)&s->last_picture;
  2509.     }
  2510. #endif
  2511.     if(!s->current_picture_ptr){
  2512.         av_log(h->s.avctx, AV_LOG_DEBUG, "error, NO framen");
  2513.         return -1;
  2514.     }
  2515.     *pict= *(AVFrame*)&s->current_picture; //FIXME 
  2516. //    ff_print_debug_info(s, pict); //Del by ty
  2517.     assert(pict->data[0]);
  2518. //printf("out %dn", (int)pict->data[0]);
  2519. #if 0 //?
  2520.     /* Return the Picture timestamp as the frame number */
  2521.     /* we substract 1 because it is added on utils.c    */
  2522.     avctx->frame_number = s->picture_number - 1;
  2523. #endif
  2524. #if 0
  2525.     /* dont output the last pic after seeking */
  2526.     if(s->last_picture_ptr || s->low_delay)
  2527.     //Note this isnt a issue as a IDR pic should flush teh buffers
  2528. #endif
  2529.         *data_size = sizeof(AVFrame);
  2530.     return get_consumed_bytes(s, buf_index, buf_size);
  2531. }
  2532. #if 0
  2533. static inline void fill_mb_avail(H264Context *h){
  2534.     MpegEncContext * const s = &h->s;
  2535.     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  2536.     if(s->mb_y){
  2537.         h->mb_avail[0]= s->mb_x                 && h->slice_table[mb_xy - s->mb_stride - 1] == h->slice_num;
  2538.         h->mb_avail[1]=                            h->slice_table[mb_xy - s->mb_stride    ] == h->slice_num;
  2539.         h->mb_avail[2]= s->mb_x+1 < s->mb_width && h->slice_table[mb_xy - s->mb_stride + 1] == h->slice_num;
  2540.     }else{
  2541.         h->mb_avail[0]=
  2542.         h->mb_avail[1]=
  2543.         h->mb_avail[2]= 0;
  2544.     }
  2545.     h->mb_avail[3]= s->mb_x && h->slice_table[mb_xy - 1] == h->slice_num;
  2546.     h->mb_avail[4]= 1; //FIXME move out
  2547.     h->mb_avail[5]= 0; //FIXME move out
  2548. }
  2549. #endif
  2550. int FindStartCode (unsigned char *Buf, int zeros_in_startcode)
  2551. {
  2552.   int info;
  2553.   int i;
  2554.   info = 1;
  2555.   for (i = 0; i < zeros_in_startcode; i++)
  2556.     if(Buf[i] != 0)
  2557.       info = 0;
  2558.   if(Buf[i] != 1)
  2559.     info = 0;
  2560.   return info;
  2561. }
  2562. int getNextNal(FILE* inpf, unsigned char* Buf)
  2563. {
  2564. int pos = 0;
  2565. int StartCodeFound = 0;
  2566. int info2 = 0;
  2567. int info3 = 0;
  2568. while(!feof(inpf) && (Buf[pos++]=fgetc(inpf))==0);
  2569. while (!StartCodeFound)
  2570. {
  2571. if (feof (inpf))
  2572. {
  2573. // return -1;
  2574. return pos-1;
  2575. }
  2576. Buf[pos++] = fgetc (inpf);
  2577. info3 = FindStartCode(&Buf[pos-4], 3);
  2578. if(info3 != 1)
  2579. info2 = FindStartCode(&Buf[pos-3], 2);
  2580. StartCodeFound = (info2 == 1 || info3 == 1);
  2581. }
  2582. fseek (inpf, -4, SEEK_CUR);
  2583. return pos - 4;
  2584. }
  2585. #define COUNT 8000
  2586. #define SIZE (COUNT*40)
  2587. int main(){
  2588. FILE * inpf;
  2589. FILE * outf;
  2590. int nWrite;
  2591. int i;
  2592. int nalLen;
  2593. unsigned char* Buf;
  2594. int  got_picture, consumed_bytes; 
  2595. int cnt=0;
  2596. AVCodec *codec;   // Codec
  2597.     AVCodecContext *c;   // Codec Context
  2598.     AVFrame *picture;   // Frame
  2599. char outfile[] = "test.pgm";
  2600. inpf = fopen("e:\bitavc\foreman_enc.264", "rb");
  2601. outf = fopen("e:\bitavc\out.yuv", "wb");
  2602. nalLen = 0;
  2603. Buf = (unsigned char*)calloc ( 1000000, sizeof(char));
  2604. avcodec_init(); 
  2605. avcodec_register_all(); 
  2606. codec = avcodec_find_decoder(CODEC_ID_H264);
  2607. if (!codec)  {
  2608. return 0; 
  2609. //allocate codec context
  2610.     c = avcodec_alloc_context(); 
  2611. if(!c){
  2612. return 0;
  2613. }
  2614. //open codec
  2615.     if (avcodec_open(c, codec) < 0) {
  2616. return 0; 
  2617. //allocate frame buffer
  2618.     picture   = avcodec_alloc_frame();
  2619. if(!picture){
  2620. return 0;
  2621. }
  2622. while(!feof(inpf))
  2623. {
  2624. nalLen = getNextNal(inpf, Buf);
  2625. //try to decode this frame
  2626. // consumed_bytes= decode_frame(c, picture, &got_picture, Buf, nalLen); 
  2627. // if (got_picture > 0)
  2628. //        c->frame_number++;
  2629. consumed_bytes= avcodec_decode_video(c, picture, &got_picture, Buf, nalLen);
  2630. //ljz added
  2631. cnt++;
  2632. printf("No:=%4d, length=%4dn",cnt,consumed_bytes);
  2633. if(consumed_bytes > 0)
  2634. {
  2635. for(i=0; i<c->height; i++)
  2636. fwrite(picture->data[0] + i * picture->linesize[0], 1, c->width, outf);
  2637. for(i=0; i<c->height/2; i++)
  2638. fwrite(picture->data[1] + i * picture->linesize[1], 1, c->width/2, outf);
  2639. for(i=0; i<c->height/2; i++)
  2640. fwrite(picture->data[2] + i * picture->linesize[2], 1, c->width/2, outf);
  2641. }
  2642. }
  2643. if(inpf)
  2644. fclose(inpf);
  2645. if(outf)
  2646. fclose(outf);
  2647. if(c) {
  2648. avcodec_close(c); 
  2649. av_free(c);
  2650. c = NULL;
  2651. if(picture) {
  2652. av_free(picture);
  2653. picture = NULL;
  2654. }
  2655. if(Buf)
  2656. {
  2657. free(Buf);
  2658. Buf = NULL;
  2659. }    
  2660.     return 0;
  2661. }
  2662. //#endif
  2663. static int decode_end(AVCodecContext *avctx)
  2664. {
  2665.     H264Context *h = avctx->priv_data;
  2666.     MpegEncContext *s = &h->s;
  2667.     
  2668.     free_tables(h); //FIXME cleanup init stuff perhaps
  2669.     MPV_common_end(s);
  2670. //    memset(h, 0, sizeof(H264Context));
  2671.         
  2672.     return 0;
  2673. }
  2674. AVCodec h264_decoder = {
  2675.     "h264",
  2676.     CODEC_TYPE_VIDEO,
  2677.     CODEC_ID_H264,
  2678.     sizeof(H264Context),
  2679.     decode_init,
  2680.     NULL,
  2681.     decode_end,
  2682.     decode_frame,
  2683.     /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
  2684. };
  2685. AVCodecParser h264_parser = {
  2686.     { CODEC_ID_H264 },
  2687.     sizeof(ParseContext),
  2688.     NULL,
  2689.     h264_parse,
  2690.     ff_parse_close,
  2691. };
  2692. //#include "svq3.c"