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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * macroblock.c: h264 decoder library
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: macroblock.c,v 1.1 2004/06/03 19:27:07 fenrir Exp $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <stdint.h>
  27. #include "common/common.h"
  28. #include "common/vlc.h"
  29. #include "vlc.h"
  30. #include "macroblock.h"
  31. static const uint8_t block_idx_x[16] =
  32. {
  33.     0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3
  34. };
  35. static const uint8_t block_idx_y[16] =
  36. {
  37.     0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3
  38. };
  39. static const uint8_t block_idx_xy[4][4] =
  40. {
  41.     { 0, 2, 8,  10},
  42.     { 1, 3, 9,  11},
  43.     { 4, 6, 12, 14},
  44.     { 5, 7, 13, 15}
  45. };
  46. static const int golomb_to_intra4x4_cbp[48]=
  47. {
  48.     47, 31, 15,  0, 23, 27, 29, 30,  7, 11, 13, 14, 39, 43, 45, 46,
  49.     16,  3,  5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44,  1,  2,  4,
  50.      8, 17, 18, 20, 24,  6,  9, 22, 25, 32, 33, 34, 36, 40, 38, 41
  51. };
  52. static const int golomb_to_inter_cbp[48]=
  53. {
  54.      0, 16,  1,  2,  4,  8, 32,  3,  5, 10, 12, 15, 47,  7, 11, 13,
  55.     14,  6,  9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46,
  56.     17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41
  57. };
  58. static const int i_chroma_qp_table[52] =
  59. {
  60.      0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
  61.     10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  62.     20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
  63.     29, 30, 31, 32, 32, 33, 34, 34, 35, 35,
  64.     36, 36, 37, 37, 37, 38, 38, 38, 39, 39,
  65.     39, 39
  66. };
  67. void x264_mb_partition_ref_set( x264_macroblock_t *mb, int i_list, int i_part, int i_ref )
  68. {
  69.     int x,  y;
  70.     int w,  h;
  71.     int dx, dy;
  72.     x264_mb_partition_getxy( mb, i_part, 0, &x, &y );
  73.     if( mb->i_partition == D_16x16 )
  74.     {
  75.         w = 4; h = 4;
  76.     }
  77.     else if( mb->i_partition == D_16x8 )
  78.     {
  79.         w = 4; h = 2;
  80.     }
  81.     else if( mb->i_partition == D_8x16 )
  82.     {
  83.         w = 2; h = 4;
  84.     }
  85.     else
  86.     {
  87.         /* D_8x8 */
  88.         w = 2; h = 2;
  89.     }
  90.     for( dx = 0; dx < w; dx++ )
  91.     {
  92.         for( dy = 0; dy < h; dy++ )
  93.         {
  94.             mb->partition[x+dx][y+dy].i_ref[i_list] = i_ref;
  95.         }
  96.     }
  97. }
  98. void x264_mb_partition_mv_set( x264_macroblock_t *mb, int i_list, int i_part, int i_sub, int mv[2] )
  99. {
  100.     int x,  y;
  101.     int w,  h;
  102.     int dx, dy;
  103.     x264_mb_partition_getxy( mb, i_part, i_sub, &x, &y );
  104.     x264_mb_partition_size ( mb, i_part, i_sub, &w, &h );
  105.     for( dx = 0; dx < w; dx++ )
  106.     {
  107.         for( dy = 0; dy < h; dy++ )
  108.         {
  109.             mb->partition[x+dx][y+dy].mv[i_list][0] = mv[0];
  110.             mb->partition[x+dx][y+dy].mv[i_list][1] = mv[1];
  111.         }
  112.     }
  113. }
  114. int x264_macroblock_read_cabac( x264_t *h, bs_t *s, x264_macroblock_t *mb )
  115. {
  116.     return -1;
  117. }
  118. static int x264_macroblock_decode_ipcm( x264_t *h, bs_t *s, x264_macroblock_t *mb )
  119. {
  120.     /* TODO */
  121.     return -1;
  122. }
  123. #define BLOCK_INDEX_CHROMA_DC   (-1)
  124. #define BLOCK_INDEX_LUMA_DC     (-2)
  125. static int bs_read_vlc( bs_t *s, x264_vlc_table_t *table )
  126. {
  127.     int i_nb_bits;
  128.     int i_value = 0;
  129.     int i_bits;
  130.     int i_index;
  131.     int i_level = 0;
  132.     i_index = bs_show( s, table->i_lookup_bits );
  133.     if( i_index >= table->i_lookup )
  134.     {
  135.         return( -1 );
  136.     }
  137.     i_value = table->lookup[i_index].i_value;
  138.     i_bits  = table->lookup[i_index].i_size;
  139.     while( i_bits < 0 )
  140.     {
  141.         i_level++;
  142.         if( i_level > 5 )
  143.         {
  144.             return( -1 );        // FIXME what to do ?
  145.         }
  146.         bs_skip( s, table->i_lookup_bits );
  147.         i_nb_bits = -i_bits;
  148.         i_index = bs_show( s, i_nb_bits ) + i_value;
  149.         if( i_index >= table->i_lookup )
  150.         {
  151.             return( -1 );
  152.         }
  153.         i_value = table->lookup[i_index].i_value;
  154.         i_bits  = table->lookup[i_index].i_size;
  155.     }
  156.     bs_skip( s, i_bits );
  157.     return( i_value );
  158. }
  159. static int block_residual_read_cavlc( x264_t *h, bs_t *s, x264_macroblock_t *mb,
  160.                                       int i_idx, int *l, int i_count )
  161. {
  162.     int i;
  163.     int level[16], run[16];
  164.     int i_coeff;
  165.     int i_total, i_trailing;
  166.     int i_suffix_length;
  167.     int i_zero_left;
  168.     for( i = 0; i < i_count; i++ )
  169.     {
  170.         l[i] = 0;
  171.     }
  172.     /* total/trailing */
  173.     if( i_idx == BLOCK_INDEX_CHROMA_DC )
  174.     {
  175.         int i_tt;
  176.         if( ( i_tt = bs_read_vlc( s, h->x264_coeff_token_lookup[4] )) < 0 )
  177.         {
  178.             return -1;
  179.         }
  180.         i_total = i_tt / 4;
  181.         i_trailing = i_tt % 4;
  182.     }
  183.     else
  184.     {
  185.         /* x264_mb_predict_non_zero_code return 0 <-> (16+16+1)>>1 = 16 */
  186.         static const int ct_index[17] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3 };
  187.         int nC;
  188.         int i_tt;
  189.         if( i_idx == BLOCK_INDEX_LUMA_DC )
  190.         {
  191.             nC = x264_mb_predict_non_zero_code( h, mb, 0 );
  192.         }
  193.         else
  194.         {
  195.             nC = x264_mb_predict_non_zero_code( h, mb, i_idx );
  196.         }
  197.         if( ( i_tt = bs_read_vlc( s, h->x264_coeff_token_lookup[ct_index[nC]] ) ) < 0 )
  198.         {
  199.             return -1;
  200.         }
  201.         i_total = i_tt / 4;
  202.         i_trailing = i_tt % 4;
  203.     }
  204.     if( i_idx >= 0 )
  205.     {
  206.         mb->block[i_idx].i_non_zero_count = i_total;
  207.     }
  208.     if( i_total <= 0 )
  209.     {
  210.         return 0;
  211.     }
  212.     i_suffix_length = i_total > 10 && i_trailing < 3 ? 1 : 0;
  213.     for( i = 0; i < i_trailing; i++ )
  214.     {
  215.         level[i] = 1 - 2 * bs_read1( s );
  216.     }
  217.     for( ; i < i_total; i++ )
  218.     {
  219.         int i_prefix;
  220.         int i_level_code;
  221.         i_prefix = bs_read_vlc( s, h->x264_level_prefix_lookup );
  222.         if( i_prefix == -1 )
  223.         {
  224.             return -1;
  225.         }
  226.         else if( i_prefix < 14 )
  227.         {
  228.             if( i_suffix_length > 0 )
  229.             {
  230.                 i_level_code = (i_prefix << i_suffix_length) + bs_read( s, i_suffix_length );
  231.             }
  232.             else
  233.             {
  234.                 i_level_code = i_prefix;
  235.             }
  236.         }
  237.         else if( i_prefix == 14 )
  238.         {
  239.             if( i_suffix_length > 0 )
  240.             {
  241.                 i_level_code = (i_prefix << i_suffix_length) + bs_read( s, i_suffix_length );
  242.             }
  243.             else
  244.             {
  245.                 i_level_code = i_prefix + bs_read( s, 4 );
  246.             }
  247.         }
  248.         else /* if( i_prefix == 15 ) */
  249.         {
  250.             i_level_code = (i_prefix << i_suffix_length) + bs_read( s, 12 );
  251.             if( i_suffix_length == 0 )
  252.             {
  253.                 i_level_code += 15;
  254.             }
  255.         }
  256.         if( i == i_trailing && i_trailing < 3 )
  257.         {
  258.             i_level_code += 2;
  259.         }
  260.         /* Optimise */
  261.         level[i] = i_level_code&0x01 ? -((i_level_code+1)/2) : (i_level_code+2)/2;
  262.         if( i_suffix_length == 0 )
  263.         {
  264.             i_suffix_length++;
  265.         }
  266.         if( abs( level[i] ) > ( 3 << ( i_suffix_length - 1 ) ) && i_suffix_length < 6 )
  267.         {
  268.             i_suffix_length++;
  269.         }
  270.     }
  271.     if( i_total < i_count )
  272.     {
  273.         if( i_idx == BLOCK_INDEX_CHROMA_DC )
  274.         {
  275.             i_zero_left = bs_read_vlc( s, h->x264_total_zeros_dc_lookup[i_total-1] );
  276.         }
  277.         else
  278.         {
  279.             i_zero_left = bs_read_vlc( s, h->x264_total_zeros_lookup[i_total-1] );
  280.         }
  281.         if( i_zero_left < 0 )
  282.         {
  283.             return -1;
  284.         }
  285.     }
  286.     else
  287.     {
  288.         i_zero_left = 0;
  289.     }
  290.     for( i = 0; i < i_total - 1; i++ )
  291.     {
  292.         if( i_zero_left <= 0 )
  293.         {
  294.             break;
  295.         }
  296.         run[i] = bs_read_vlc( s, h->x264_run_before_lookup[X264_MIN( i_zero_left - 1, 6 )] );
  297.         if( run[i] < 0 )
  298.         {
  299.             return -1;
  300.         }
  301.         i_zero_left -= run[i];
  302.     }
  303.     if( i_zero_left < 0 )
  304.     {
  305.         return -1;
  306.     }
  307.     for( ; i < i_total - 1; i++ )
  308.     {
  309.         run[i] = 0;
  310.     }
  311.     run[i_total-1] = i_zero_left;
  312.     i_coeff = -1;
  313.     for( i = i_total - 1; i >= 0; i-- )
  314.     {
  315.         i_coeff += run[i] + 1;
  316.         l[i_coeff] = level[i];
  317.     }
  318.     return 0;
  319. }
  320. static inline void array_zero_set( int *l, int i_count )
  321. {
  322.     int i;
  323.     for( i = 0; i < i_count; i++ )
  324.     {
  325.         l[i] = 0;
  326.     }
  327. }
  328. int x264_macroblock_read_cavlc( x264_t *h, bs_t *s, x264_macroblock_t *mb )
  329. {
  330.     int i_mb_i_offset;
  331.     int i_mb_p_offset;
  332.     int b_sub_ref0 = 0;
  333.     int i_type;
  334.     int i;
  335.     /* read the mb type */
  336.     switch( h->sh.i_type )
  337.     {
  338.         case SLICE_TYPE_I:
  339.             i_mb_p_offset = 0;  /* shut up gcc */
  340.             i_mb_i_offset = 0;
  341.             break;
  342.         case SLICE_TYPE_P:
  343.             i_mb_p_offset = 0;
  344.             i_mb_i_offset = 5;
  345.             break;
  346.         case SLICE_TYPE_B:
  347.             i_mb_p_offset = 23;
  348.             i_mb_i_offset = 23 + 5;
  349.             break;
  350.         default:
  351.             fprintf( stderr, "internal error or slice unsupportedn" );
  352.             return -1;
  353.     }
  354.     i_type = bs_read_ue( s );
  355.     if( i_type < i_mb_i_offset )
  356.     {
  357.         if( i_type < i_mb_p_offset )
  358.         {
  359.             fprintf( stderr, "unsupported mb type(B*)n" );
  360.             /* TODO for B frame */
  361.             return -1;
  362.         }
  363.         else
  364.         {
  365.             i_type -= i_mb_p_offset;
  366.             if( i_type == 0 )
  367.             {
  368.                 mb->i_type = P_L0;
  369.                 mb->i_partition = D_16x16;
  370.             }
  371.             else if( i_type == 1 )
  372.             {
  373.                 mb->i_type = P_L0;
  374.                 mb->i_partition = D_16x8;
  375.             }
  376.             else if( i_type == 2 )
  377.             {
  378.                 mb->i_type = P_L0;
  379.                 mb->i_partition = D_8x16;
  380.             }
  381.             else if( i_type == 3 || i_type == 4 )
  382.             {
  383.                 mb->i_type = P_8x8;
  384.                 mb->i_partition = D_8x8;
  385.                 b_sub_ref0 = i_type == 4 ? 1 : 0;
  386.             }
  387.             else
  388.             {
  389.                 fprintf( stderr, "invalid mb typen" );
  390.                 return -1;
  391.             }
  392.         }
  393.     }
  394.     else
  395.     {
  396.         i_type -= i_mb_i_offset;
  397.         if( i_type == 0 )
  398.         {
  399.             mb->i_type = I_4x4;
  400.         }
  401.         else if( i_type < 25 )
  402.         {
  403.             mb->i_type = I_16x16;
  404.             mb->i_intra16x16_pred_mode = (i_type - 1)%4;
  405.             mb->i_cbp_chroma = ( (i_type-1) / 4 )%3;
  406.             mb->i_cbp_luma   = ((i_type-1) / 12) ? 0x0f : 0x00;
  407.         }
  408.         else if( i_type == 25 )
  409.         {
  410.             mb->i_type = I_PCM;
  411.         }
  412.         else
  413.         {
  414.             fprintf( stderr, "invalid mb type (%d)n", i_type );
  415.             return -1;
  416.         }
  417.     }
  418.     if( mb->i_type == I_PCM )
  419.     {
  420.         return x264_macroblock_decode_ipcm( h, s, mb );
  421.     }
  422.     if( IS_INTRA( mb->i_type ) )
  423.     {
  424.         if( mb->i_type == I_4x4 )
  425.         {
  426.             for( i = 0; i < 16; i++ )
  427.             {
  428.                 int b_coded;
  429.                 b_coded = bs_read1( s );
  430.                 if( b_coded )
  431.                 {
  432.                     mb->block[i].i_intra4x4_pred_mode = x264_mb_predict_intra4x4_mode( h, mb, i );
  433.                 }
  434.                 else
  435.                 {
  436.                     int i_predicted_mode = x264_mb_predict_intra4x4_mode( h, mb, i );
  437.                     int i_mode = bs_read( s, 3 );
  438.                     if( i_mode >= i_predicted_mode )
  439.                     {
  440.                         mb->block[i].i_intra4x4_pred_mode = i_mode + 1;
  441.                     }
  442.                     else
  443.                     {
  444.                         mb->block[i].i_intra4x4_pred_mode = i_mode;
  445.                     }
  446.                 }
  447.             }
  448.         }
  449.         mb->i_chroma_pred_mode = bs_read_ue( s );
  450.     }
  451.     else if( mb->i_type == P_8x8 || mb->i_type == B_8x8)
  452.     {
  453.         /* FIXME won't work for B_8x8 */
  454.         for( i = 0; i < 4; i++ )
  455.         {
  456.             int i_sub_partition;
  457.             i_sub_partition = bs_read_ue( s );
  458.             switch( i_sub_partition )
  459.             {
  460.                 case 0:
  461.                     mb->i_sub_partition[i] = D_L0_8x8;
  462.                     break;
  463.                 case 1:
  464.                     mb->i_sub_partition[i] = D_L0_8x4;
  465.                     break;
  466.                 case 2:
  467.                     mb->i_sub_partition[i] = D_L0_4x8;
  468.                     break;
  469.                 case 3:
  470.                     mb->i_sub_partition[i] = D_L0_4x4;
  471.                     break;
  472.                 default:
  473.                     fprintf( stderr, "invalid i_sub_partitionn" );
  474.                     return -1;
  475.             }
  476.         }
  477.         for( i = 0; i < 4; i++ )
  478.         {
  479.             int i_ref;
  480.             i_ref = b_sub_ref0 ? 0 : bs_read_te( s, h->sh.i_num_ref_idx_l0_active - 1 );
  481.             x264_mb_partition_ref_set( mb, 0, i, i_ref );
  482.         }
  483.         for( i = 0; i < 4; i++ )
  484.         {
  485.             int i_sub;
  486.             int i_ref;
  487.             x264_mb_partition_get( mb, 0, i, 0, &i_ref, NULL, NULL );
  488.             for( i_sub = 0; i_sub < x264_mb_partition_count_table[mb->i_sub_partition[i]]; i_sub++ )
  489.             {
  490.                 int mv[2];
  491.                 x264_mb_predict_mv( mb, 0, i, i_sub, mv );
  492.                 mv[0] += bs_read_se( s );
  493.                 mv[1] += bs_read_se( s );
  494.                 x264_mb_partition_mv_set( mb, 0, i, i_sub, mv );
  495.             }
  496.         }
  497.     }
  498.     else if( mb->i_type != B_DIRECT )
  499.     {
  500.         /* FIXME will work only for P block */
  501.         /* FIXME using x264_mb_partition_set/x264_mb_partition_get here are too unoptimised
  502.          * I should introduce ref and mv get/set */
  503.         /* Motion Vector */
  504.         int i_part = x264_mb_partition_count_table[mb->i_partition];
  505.         for( i = 0; i < i_part; i++ )
  506.         {
  507.             int i_ref;
  508.             i_ref = bs_read_te( s, h->sh.i_num_ref_idx_l0_active - 1 );
  509.             x264_mb_partition_ref_set( mb, 0, i, i_ref );
  510.         }
  511.         for( i = 0; i < i_part; i++ )
  512.         {
  513.             int mv[2];
  514.             x264_mb_predict_mv( mb, 0, i, 0, mv );
  515.             mv[0] += bs_read_se( s );
  516.             mv[1] += bs_read_se( s );
  517.             x264_mb_partition_mv_set( mb, 0, i, 0, mv );
  518.         }
  519.     }
  520.     if( mb->i_type != I_16x16 )
  521.     {
  522.         int i_cbp;
  523.         i_cbp = bs_read_ue( s );
  524.         if( i_cbp >= 48 )
  525.         {
  526.             fprintf( stderr, "invalid cbpn" );
  527.             return -1;
  528.         }
  529.         if( mb->i_type == I_4x4 )
  530.         {
  531.             i_cbp = golomb_to_intra4x4_cbp[i_cbp];
  532.         }
  533.         else
  534.         {
  535.             i_cbp = golomb_to_inter_cbp[i_cbp];
  536.         }
  537.         mb->i_cbp_luma   = i_cbp&0x0f;
  538.         mb->i_cbp_chroma = i_cbp >> 4;
  539.     }
  540.     if( mb->i_cbp_luma > 0 || mb->i_cbp_chroma > 0 || mb->i_type == I_16x16 )
  541.     {
  542.         mb->i_qp = bs_read_se( s ) + h->pps->i_pic_init_qp + h->sh.i_qp_delta;
  543.         /* write residual */
  544.         if( mb->i_type == I_16x16 )
  545.         {
  546.             /* DC Luma */
  547.             if( block_residual_read_cavlc( h, s, mb, BLOCK_INDEX_LUMA_DC , mb->luma16x16_dc, 16 ) < 0 )
  548.             {
  549.                 return -1;
  550.             }
  551.             if( mb->i_cbp_luma != 0 )
  552.             {
  553.                 /* AC Luma */
  554.                 for( i = 0; i < 16; i++ )
  555.                 {
  556.                     if( block_residual_read_cavlc( h, s, mb, i, mb->block[i].residual_ac, 15 ) < 0 )
  557.                     {
  558.                         return -1;
  559.                     }
  560.                 }
  561.             }
  562.             else
  563.             {
  564.                 for( i = 0; i < 16; i++ )
  565.                 {
  566.                     mb->block[i].i_non_zero_count = 0;
  567.                     array_zero_set( mb->block[i].residual_ac, 15 );
  568.                 }
  569.             }
  570.         }
  571.         else
  572.         {
  573.             for( i = 0; i < 16; i++ )
  574.             {
  575.                 if( mb->i_cbp_luma & ( 1 << ( i / 4 ) ) )
  576.                 {
  577.                     if( block_residual_read_cavlc( h, s, mb, i, mb->block[i].luma4x4, 16 ) < 0 )
  578.                     {
  579.                         return -1;
  580.                     }
  581.                 }
  582.                 else
  583.                 {
  584.                     mb->block[i].i_non_zero_count = 0;
  585.                     array_zero_set( mb->block[i].luma4x4, 16 );
  586.                 }
  587.             }
  588.         }
  589.         if( mb->i_cbp_chroma &0x03 )    /* Chroma DC residual present */
  590.         {
  591.             if( block_residual_read_cavlc( h, s, mb, BLOCK_INDEX_CHROMA_DC, mb->chroma_dc[0], 4 ) < 0 ||
  592.                 block_residual_read_cavlc( h, s, mb, BLOCK_INDEX_CHROMA_DC, mb->chroma_dc[1], 4 ) < 0 )
  593.             {
  594.                 return -1;
  595.             }
  596.         }
  597.         else
  598.         {
  599.             array_zero_set( mb->chroma_dc[0], 4 );
  600.             array_zero_set( mb->chroma_dc[1], 4 );
  601.         }
  602.         if( mb->i_cbp_chroma&0x02 ) /* Chroma AC residual present */
  603.         {
  604.             for( i = 0; i < 8; i++ )
  605.             {
  606.                 if( block_residual_read_cavlc( h, s, mb, 16 + i, mb->block[16+i].residual_ac, 15 ) < 0 )
  607.                 {
  608.                     return -1;
  609.                 }
  610.             }
  611.         }
  612.         else
  613.         {
  614.             for( i = 0; i < 8; i++ )
  615.             {
  616.                 mb->block[16+i].i_non_zero_count = 0;
  617.                 array_zero_set( mb->block[16+i].residual_ac, 15 );
  618.             }
  619.         }
  620.     }
  621.     else
  622.     {
  623.         mb->i_qp = h->pps->i_pic_init_qp + h->sh.i_qp_delta;
  624.         for( i = 0; i < 16; i++ )
  625.         {
  626.             mb->block[i].i_non_zero_count = 0;
  627.             array_zero_set( mb->block[i].luma4x4, 16 );
  628.         }
  629.         array_zero_set( mb->chroma_dc[0], 4 );
  630.         array_zero_set( mb->chroma_dc[1], 4 );
  631.         for( i = 0; i < 8; i++ )
  632.         {
  633.             array_zero_set( mb->block[16+i].residual_ac, 15 );
  634.             mb->block[16+i].i_non_zero_count = 0;
  635.         }
  636.     }
  637.     //fprintf( stderr, "mb read type=%dn", mb->i_type );
  638.     return 0;
  639. }
  640. static int x264_mb_pred_mode16x16_valid( x264_macroblock_t *mb, int i_mode )
  641. {
  642.     if( ( mb->i_neighbour & (MB_LEFT|MB_TOP) ) == (MB_LEFT|MB_TOP) )
  643.     {
  644.         return i_mode;
  645.     }
  646.     else if( ( mb->i_neighbour & MB_LEFT ) )
  647.     {
  648.         if( i_mode == I_PRED_16x16_DC )
  649.         {
  650.             return I_PRED_16x16_DC_LEFT;
  651.         }
  652.         else if( i_mode == I_PRED_16x16_H )
  653.         {
  654.             return I_PRED_16x16_H;
  655.         }
  656.         fprintf( stderr, "invalid 16x16 predictionn" );
  657.         return I_PRED_16x16_DC_LEFT;
  658.     }
  659.     else if( ( mb->i_neighbour & MB_TOP ) )
  660.     {
  661.         if( i_mode == I_PRED_16x16_DC )
  662.         {
  663.             return I_PRED_16x16_DC_TOP;
  664.         }
  665.         else if( i_mode == I_PRED_16x16_V )
  666.         {
  667.             return I_PRED_16x16_V;
  668.         }
  669.         fprintf( stderr, "invalid 16x16 predictionn" );
  670.         return I_PRED_16x16_DC_TOP;
  671.     }
  672.     else
  673.     {
  674.         return I_PRED_16x16_DC_128;
  675.     }
  676. }
  677. static int x264_mb_pred_mode8x8_valid( x264_macroblock_t *mb, int i_mode )
  678. {
  679.     if( ( mb->i_neighbour & (MB_LEFT|MB_TOP) ) == (MB_LEFT|MB_TOP) )
  680.     {
  681.         return i_mode;
  682.     }
  683.     else if( ( mb->i_neighbour & MB_LEFT ) )
  684.     {
  685.         if( i_mode == I_PRED_CHROMA_DC )
  686.         {
  687.             return I_PRED_CHROMA_DC_LEFT;
  688.         }
  689.         else if( i_mode == I_PRED_CHROMA_H )
  690.         {
  691.             return I_PRED_CHROMA_H;
  692.         }
  693.         fprintf( stderr, "invalid 8x8 predictionn" );
  694.         return I_PRED_CHROMA_DC_LEFT;
  695.     }
  696.     else if( ( mb->i_neighbour & MB_TOP ) )
  697.     {
  698.         if( i_mode == I_PRED_CHROMA_DC )
  699.         {
  700.             return I_PRED_CHROMA_DC_TOP;
  701.         }
  702.         else if( i_mode == I_PRED_CHROMA_V )
  703.         {
  704.             return I_PRED_CHROMA_V;
  705.         }
  706.         fprintf( stderr, "invalid 8x8 predictionn" );
  707.         return I_PRED_CHROMA_DC_TOP;
  708.     }
  709.     else
  710.     {
  711.         return I_PRED_CHROMA_DC_128;
  712.     }
  713. }
  714. static int x264_mb_pred_mode4x4_valid( x264_macroblock_t *mb, int idx, int i_mode, int *pb_emu )
  715. {
  716.     int b_a, b_b, b_c;
  717.     static const int needmb[16] =
  718.     {
  719.         MB_LEFT|MB_TOP, MB_TOP,
  720.         MB_LEFT,        MB_PRIVATE,
  721.         MB_TOP,         MB_TOP|MB_TOPRIGHT,
  722.         0,              MB_PRIVATE,
  723.         MB_LEFT,        0,
  724.         MB_LEFT,        MB_PRIVATE,
  725.         0,              MB_PRIVATE,
  726.         0,              MB_PRIVATE
  727.     };
  728.     int b_emu = 0;
  729.     *pb_emu = 0;
  730.     b_a = (needmb[idx]&mb->i_neighbour&MB_LEFT) == (needmb[idx]&MB_LEFT);
  731.     b_b = (needmb[idx]&mb->i_neighbour&MB_TOP) == (needmb[idx]&MB_TOP);
  732.     b_c = (needmb[idx]&mb->i_neighbour&(MB_TOPRIGHT|MB_PRIVATE)) == (needmb[idx]&(MB_TOPRIGHT|MB_PRIVATE));
  733.     if( b_c == 0 && b_b )
  734.     {
  735.         b_emu = 1;
  736.         b_c = 1;
  737.     }
  738.     /* handle I_PRED_4x4_DC */
  739.     if( i_mode == I_PRED_4x4_DC )
  740.     {
  741.         if( b_a && b_b )
  742.         {
  743.             return I_PRED_4x4_DC;
  744.         }
  745.         else if( b_a )
  746.         {
  747.             return I_PRED_4x4_DC_LEFT;
  748.         }
  749.         else if( b_b )
  750.         {
  751.             return I_PRED_4x4_DC_TOP;
  752.         }
  753.         return I_PRED_4x4_DC_128;
  754.     }
  755.     /* handle 1 dir needed only */
  756.     if( ( b_a && i_mode == I_PRED_4x4_H ) ||
  757.         ( b_b && i_mode == I_PRED_4x4_V ) )
  758.     {
  759.         return i_mode;
  760.     }
  761.     /* handle b_c case (b_b always true) */
  762.     if( b_c && ( i_mode == I_PRED_4x4_DDL || i_mode == I_PRED_4x4_VL ) )
  763.     {
  764.         *pb_emu = b_emu;
  765.         return i_mode;
  766.     }
  767.     if( b_a && b_b )
  768.     {
  769.         /* I_PRED_4x4_DDR, I_PRED_4x4_VR, I_PRED_4x4_HD, I_PRED_4x4_HU */
  770.         return i_mode;
  771.     }
  772.     fprintf( stderr, "invalid 4x4 predict mode(%d, mb:%x-%x idx:%dn", i_mode, mb->i_mb_x, mb->i_mb_y, idx );
  773.     return I_PRED_CHROMA_DC_128;    /* unefficient */
  774. }
  775. /****************************************************************************
  776.  * UnScan functions
  777.  ****************************************************************************/
  778. static const int scan_zigzag_x[16]={0, 1, 0, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 3, 2, 3};
  779. static const int scan_zigzag_y[16]={0, 0, 1, 2, 1, 0, 0, 1, 2, 3, 3, 2, 1, 2, 3, 3};
  780. static inline void unscan_zigzag_4x4full( int16_t dct[4][4], int level[16] )
  781. {
  782.     int i;
  783.     for( i = 0; i < 16; i++ )
  784.     {
  785.         dct[scan_zigzag_y[i]][scan_zigzag_x[i]] = level[i];
  786.     }
  787. }
  788. static inline void unscan_zigzag_4x4( int16_t dct[4][4], int level[15] )
  789. {
  790.     int i;
  791.     for( i = 1; i < 16; i++ )
  792.     {
  793.         dct[scan_zigzag_y[i]][scan_zigzag_x[i]] = level[i - 1];
  794.     }
  795. }
  796. static inline void unscan_zigzag_2x2_dc( int16_t dct[2][2], int level[4] )
  797. {
  798.     dct[0][0] = level[0];
  799.     dct[0][1] = level[1];
  800.     dct[1][0] = level[2];
  801.     dct[1][1] = level[3];
  802. }
  803. int x264_macroblock_decode( x264_t *h, x264_macroblock_t *mb )
  804. {
  805.     x264_mb_context_t *ctx = mb->context;
  806.     int i_qscale;
  807.     int ch;
  808.     int i;
  809.     if( !IS_INTRA(mb->i_type ) )
  810.     {
  811.         /* Motion compensation */
  812.         x264_mb_mc( h, mb );
  813.     }
  814.     /* luma */
  815.     i_qscale = mb->i_qp;
  816.     if( mb->i_type == I_16x16 )
  817.     {
  818.         int     i_mode = x264_mb_pred_mode16x16_valid( mb, mb->i_intra16x16_pred_mode );
  819.         int16_t luma[16][4][4];
  820.         int16_t dct4x4[16+1][4][4];
  821.         /* do the right prediction */
  822.         h->predict_16x16[i_mode]( ctx->p_fdec[0], ctx->i_fdec[0] );
  823.         /* get dc coeffs */
  824.         unscan_zigzag_4x4full( dct4x4[0], mb->luma16x16_dc );
  825.         h->dctf.idct4x4dc( dct4x4[0], dct4x4[0] );
  826.         x264_mb_dequant_4x4_dc( dct4x4[0], i_qscale );
  827.         /* decode the 16x16 macroblock */
  828.         for( i = 0; i < 16; i++ )
  829.         {
  830.             unscan_zigzag_4x4( dct4x4[1+i], mb->block[i].residual_ac );
  831.             x264_mb_dequant_4x4( dct4x4[1+i], i_qscale );
  832.             /* copy dc coeff */
  833.             dct4x4[1+i][0][0] = dct4x4[0][block_idx_y[i]][block_idx_x[i]];
  834.             h->dctf.idct4x4( luma[i], dct4x4[i+1] );
  835.         }
  836.         /* put pixels to fdec */
  837.         h->pixf.add16x16( ctx->p_fdec[0], ctx->i_fdec[0], luma );
  838.     }
  839.     else if( mb->i_type == I_4x4 )
  840.     {
  841.         for( i = 0; i < 16; i++ )
  842.         {
  843.             int16_t luma[4][4];
  844.             int16_t dct4x4[4][4];
  845.             uint8_t *p_dst_by;
  846.             int     i_mode;
  847.             int     b_emu;
  848.             /* Do the right prediction */
  849.             p_dst_by = ctx->p_fdec[0] + 4 * block_idx_x[i] + 4 * block_idx_y[i] * ctx->i_fdec[0];
  850.             i_mode   = x264_mb_pred_mode4x4_valid( mb, i, mb->block[i].i_intra4x4_pred_mode, &b_emu );
  851.             if( b_emu )
  852.             {
  853.                 fprintf( stderr, "mmmh b_emun" );
  854.                 memset( &p_dst_by[4], p_dst_by[3], 4 );
  855.             }
  856.             h->predict_4x4[i_mode]( p_dst_by, ctx->i_fdec[0] );
  857.             if( mb->block[i].i_non_zero_count > 0 )
  858.             {
  859.                 /* decode one 4x4 block */
  860.                 unscan_zigzag_4x4full( dct4x4, mb->block[i].luma4x4 );
  861.                 x264_mb_dequant_4x4( dct4x4, i_qscale );
  862.                 h->dctf.idct4x4( luma, dct4x4 );
  863.                 h->pixf.add4x4( p_dst_by, ctx->i_fdec[0], luma );
  864.             }
  865.         }
  866.     }
  867.     else /* Inter mb */
  868.     {
  869.         for( i = 0; i < 16; i++ )
  870.         {
  871.             uint8_t *p_dst_by;
  872.             int16_t luma[4][4];
  873.             int16_t dct4x4[4][4];
  874.             if( mb->block[i].i_non_zero_count > 0 )
  875.             {
  876.                 unscan_zigzag_4x4full( dct4x4, mb->block[i].luma4x4 );
  877.                 x264_mb_dequant_4x4( dct4x4, i_qscale );
  878.                 h->dctf.idct4x4( luma, dct4x4 );
  879.                 p_dst_by = ctx->p_fdec[0] + 4 * block_idx_x[i] + 4 * block_idx_y[i] * ctx->i_fdec[0];
  880.                 h->pixf.add4x4( p_dst_by, ctx->i_fdec[0], luma );
  881.             }
  882.         }
  883.     }
  884.     /* chroma */
  885.     i_qscale = i_chroma_qp_table[x264_clip3( i_qscale + h->pps->i_chroma_qp_index_offset, 0, 51 )];
  886.     if( IS_INTRA( mb->i_type ) )
  887.     {
  888.         int i_mode = x264_mb_pred_mode8x8_valid( mb, mb->i_chroma_pred_mode );
  889.         /* do the right prediction */
  890.         h->predict_8x8[i_mode]( ctx->p_fdec[1], ctx->i_fdec[1] );
  891.         h->predict_8x8[i_mode]( ctx->p_fdec[2], ctx->i_fdec[2] );
  892.     }
  893.     if( mb->i_cbp_chroma != 0 )
  894.     {
  895.         for( ch = 0; ch < 2; ch++ )
  896.         {
  897.             int16_t chroma[4][4][4];
  898.             int16_t dct2x2[2][2];
  899.             int16_t dct4x4[4][4][4];
  900.             /* get dc chroma */
  901.             unscan_zigzag_2x2_dc( dct2x2, mb->chroma_dc[ch] );
  902.             h->dctf.idct2x2dc( dct2x2, dct2x2 );
  903.             x264_mb_dequant_2x2_dc( dct2x2, i_qscale );
  904.             for( i = 0; i < 4; i++ )
  905.             {
  906.                 unscan_zigzag_4x4( dct4x4[i], mb->block[16+i+ch*4].residual_ac );
  907.                 x264_mb_dequant_4x4( dct4x4[i], i_qscale );
  908.                 /* copy dc coeff */
  909.                 dct4x4[i][0][0] = dct2x2[block_idx_y[i]][block_idx_x[i]];
  910.                 h->dctf.idct4x4( chroma[i], dct4x4[i] );
  911.             }
  912.             h->pixf.add8x8( ctx->p_fdec[1+ch], ctx->i_fdec[1+ch], chroma );
  913.         }
  914.     }
  915.     return 0;
  916. }
  917. void x264_macroblock_decode_skip( x264_t *h, x264_macroblock_t *mb )
  918. {
  919.     int i;
  920.     int x, y;
  921.     int mv[2];
  922.     /* decode it as a 16x16 with no luma/chroma */
  923.     mb->i_type = P_L0;
  924.     mb->i_partition = D_16x16;
  925.     mb->i_cbp_luma = 0;
  926.     mb->i_cbp_chroma = 0;
  927.     for( i = 0; i < 16 + 8; i++ )
  928.     {
  929.         mb->block[i].i_non_zero_count = 0;
  930.     }
  931.     for( i = 0; i < 16; i++ )
  932.     {
  933.         array_zero_set( mb->block[i].luma4x4, 16 );
  934.     }
  935.     array_zero_set( mb->chroma_dc[0], 4 );
  936.     array_zero_set( mb->chroma_dc[1], 4 );
  937.     for( i = 0; i < 8; i++ )
  938.     {
  939.         array_zero_set( mb->block[16+i].residual_ac, 15 );
  940.     }
  941.     /* set ref0 */
  942.     for( x = 0; x < 4; x++ )
  943.     {
  944.         for( y = 0; y < 4; y++ )
  945.         {
  946.             mb->partition[x][y].i_ref[0] = 0;
  947.         }
  948.     }
  949.     /* get mv */
  950.     x264_mb_predict_mv_pskip( mb, mv );
  951.     x264_mb_partition_mv_set( mb, 0, 0, 0, mv );
  952.     /* Motion compensation */
  953.     x264_mb_mc( h, mb );
  954.     mb->i_type = P_SKIP;
  955. }