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

Audio

开发平台:

Visual C++

  1. /*
  2.  * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
  3.  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  *
  19.  */
  20.  
  21. /**
  22.  * @file h264.c
  23.  * H.264 / AVC / MPEG4 part10 codec.
  24.  * @author Michael Niedermayer <michaelni@gmx.at>
  25.  */
  26. #include "common.h"
  27. #include "dsputil.h"
  28. #include "avcodec.h"
  29. #include "mpegvideo.h"
  30. #include "h264data.h"
  31. #include "golomb.h"
  32. #include "cabac.h"
  33. #include <stdlib.h> //Add by ty
  34. #include <stdio.h> //Add by ty
  35. #undef NDEBUG
  36. #include <assert.h>
  37. #define interlaced_dct interlaced_dct_is_a_bad_name
  38. #define mb_intra mb_intra_isnt_initalized_see_mb_type
  39. #define LUMA_DC_BLOCK_INDEX   25
  40. #define CHROMA_DC_BLOCK_INDEX 26
  41. #define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
  42. #define COEFF_TOKEN_VLC_BITS           8
  43. #define TOTAL_ZEROS_VLC_BITS           9
  44. #define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
  45. #define RUN_VLC_BITS                   3
  46. #define RUN7_VLC_BITS                  6
  47. #define MAX_SPS_COUNT 32
  48. #define MAX_PPS_COUNT 256
  49. #define MAX_MMCO_COUNT 66
  50. //AS by ty
  51. static const uint32_t svq3_dequant_coeff[32] = {
  52.    3881,  4351,  4890,  5481,  6154,  6914,  7761,  8718,
  53.    9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
  54.   24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
  55.   61694, 68745, 77615, 89113,100253,109366,126635,141533
  56. };
  57. //AE by ty
  58. /**
  59.  * Sequence parameter set
  60.  */
  61. typedef struct SPS{
  62.     
  63.     int profile_idc;
  64.     int level_idc;
  65.     int log2_max_frame_num;            ///< log2_max_frame_num_minus4 + 4
  66.     int poc_type;                      ///< pic_order_cnt_type
  67.     int log2_max_poc_lsb;              ///< log2_max_pic_order_cnt_lsb_minus4
  68.     int delta_pic_order_always_zero_flag;
  69.     int offset_for_non_ref_pic;
  70.     int offset_for_top_to_bottom_field;
  71.     int poc_cycle_length;              ///< num_ref_frames_in_pic_order_cnt_cycle
  72.     int ref_frame_count;               ///< num_ref_frames
  73.     int gaps_in_frame_num_allowed_flag;
  74.     int mb_width;                      ///< frame_width_in_mbs_minus1 + 1
  75.     int mb_height;                     ///< frame_height_in_mbs_minus1 + 1
  76.     int frame_mbs_only_flag;
  77.     int mb_aff;                        ///<mb_adaptive_frame_field_flag
  78.     int direct_8x8_inference_flag;
  79.     int crop;                   ///< frame_cropping_flag
  80.     int crop_left;              ///< frame_cropping_rect_left_offset
  81.     int crop_right;             ///< frame_cropping_rect_right_offset
  82.     int crop_top;               ///< frame_cropping_rect_top_offset
  83.     int crop_bottom;            ///< frame_cropping_rect_bottom_offset
  84.     int vui_parameters_present_flag;
  85.     AVRational sar;
  86.     short offset_for_ref_frame[256]; //FIXME dyn aloc?
  87. }SPS;
  88. /**
  89.  * Picture parameter set
  90.  */
  91. typedef struct PPS{
  92.     int sps_id;
  93.     int cabac;                  ///< entropy_coding_mode_flag
  94.     int pic_order_present;      ///< pic_order_present_flag
  95.     int slice_group_count;      ///< num_slice_groups_minus1 + 1
  96.     int mb_slice_group_map_type;
  97.     int ref_count[2];           ///< num_ref_idx_l0/1_active_minus1 + 1
  98.     int weighted_pred;          ///< weighted_pred_flag
  99.     int weighted_bipred_idc;
  100.     int init_qp;                ///< pic_init_qp_minus26 + 26
  101.     int init_qs;                ///< pic_init_qs_minus26 + 26
  102.     int chroma_qp_index_offset;
  103.     int deblocking_filter_parameters_present; ///< deblocking_filter_parameters_present_flag
  104.     int constrained_intra_pred; ///< constrained_intra_pred_flag
  105.     int redundant_pic_cnt_present; ///< redundant_pic_cnt_present_flag
  106. }PPS;
  107. /**
  108.  * Memory management control operation opcode.
  109.  */
  110. typedef enum MMCOOpcode{
  111.     MMCO_END=0,
  112.     MMCO_SHORT2UNUSED,
  113.     MMCO_LONG2UNUSED,
  114.     MMCO_SHORT2LONG,
  115.     MMCO_SET_MAX_LONG,
  116.     MMCO_RESET, 
  117.     MMCO_LONG,
  118. } MMCOOpcode;
  119. /**
  120.  * Memory management control operation.
  121.  */
  122. typedef struct MMCO{
  123.     MMCOOpcode opcode;
  124.     int short_frame_num;
  125.     int long_index;
  126. } MMCO;
  127. /**
  128.  * H264Context
  129.  */
  130. typedef struct H264Context{
  131.     MpegEncContext s;
  132.     int nal_ref_idc;
  133.     int nal_unit_type;
  134. #define NAL_SLICE 1
  135. #define NAL_DPA 2
  136. #define NAL_DPB 3
  137. #define NAL_DPC 4
  138. #define NAL_IDR_SLICE 5
  139. #define NAL_SEI 6
  140. #define NAL_SPS 7
  141. #define NAL_PPS 8
  142. #define NAL_PICTURE_DELIMITER 9
  143. #define NAL_FILTER_DATA 10
  144.     uint8_t *rbsp_buffer;
  145.     int rbsp_buffer_size;
  146.     int chroma_qp; //QPc
  147.     int prev_mb_skiped; //FIXME remove (IMHO not used)
  148.     //prediction stuff
  149.     int chroma_pred_mode;
  150.     int intra16x16_pred_mode;
  151.     
  152.     int8_t intra4x4_pred_mode_cache[5*8];
  153.     int8_t (*intra4x4_pred_mode)[8];
  154.     void (*pred4x4  [9+3])(uint8_t *src, uint8_t *topright, int stride);//FIXME move to dsp?
  155.     void (*pred8x8  [4+3])(uint8_t *src, int stride);
  156.     void (*pred16x16[4+3])(uint8_t *src, int stride);
  157.     unsigned int topleft_samples_available;
  158.     unsigned int top_samples_available;
  159.     unsigned int topright_samples_available;
  160.     unsigned int left_samples_available;
  161.     uint8_t (*top_border)[16+2*8];
  162.     uint8_t left_border[17+2*9];
  163.     /**
  164.      * non zero coeff count cache.
  165.      * is 64 if not available.
  166.      */
  167.     uint8_t non_zero_count_cache[6*8];
  168.     uint8_t (*non_zero_count)[16];
  169.     /**
  170.      * Motion vector cache.
  171.      */
  172.     int16_t mv_cache[2][5*8][2];
  173.     int8_t ref_cache[2][5*8];
  174. #define LIST_NOT_USED -1 //FIXME rename?
  175. #define PART_NOT_AVAILABLE -2
  176.     
  177.     /**
  178.      * is 1 if the specific list MV&references are set to 0,0,-2.
  179.      */
  180.     int mv_cache_clean[2];
  181.     int block_offset[16+8];
  182.     int chroma_subblock_offset[16]; //FIXME remove
  183.     
  184.     uint16_t *mb2b_xy; //FIXME are these 4 a good idea?
  185.     uint16_t *mb2b8_xy;
  186.     int b_stride;
  187.     int b8_stride;
  188.     int halfpel_flag;
  189.     int thirdpel_flag;
  190.     int unknown_svq3_flag;
  191.     int next_slice_index;
  192.     SPS sps_buffer[MAX_SPS_COUNT];
  193.     SPS sps; ///< current sps
  194.     
  195.     PPS pps_buffer[MAX_PPS_COUNT];
  196.     /**
  197.      * current pps
  198.      */
  199.     PPS pps; //FIXME move tp Picture perhaps? (->no) do we need that?
  200.     int slice_num;
  201.     uint8_t *slice_table_base;
  202.     uint8_t *slice_table;      ///< slice_table_base + mb_stride + 1
  203.     int slice_type;
  204.     int slice_type_fixed;
  205.     
  206.     //interlacing specific flags
  207.     int mb_field_decoding_flag;
  208.     
  209.     int sub_mb_type[4];
  210.     
  211.     //POC stuff
  212.     int poc_lsb;
  213.     int poc_msb;
  214.     int delta_poc_bottom;
  215.     int delta_poc[2];
  216.     int frame_num;
  217.     int prev_poc_msb;             ///< poc_msb of the last reference pic for POC type 0
  218.     int prev_poc_lsb;             ///< poc_lsb of the last reference pic for POC type 0
  219.     int frame_num_offset;         ///< for POC type 2
  220.     int prev_frame_num_offset;    ///< for POC type 2
  221.     int prev_frame_num;           ///< frame_num of the last pic for POC type 1/2
  222.     /**
  223.      * frame_num for frames or 2*frame_num for field pics.
  224.      */
  225.     int curr_pic_num;
  226.     
  227.     /**
  228.      * max_frame_num or 2*max_frame_num for field pics.
  229.      */
  230.     int max_pic_num;
  231.     //Weighted pred stuff
  232.     int luma_log2_weight_denom;
  233.     int chroma_log2_weight_denom;
  234.     int luma_weight[2][16];
  235.     int luma_offset[2][16];
  236.     int chroma_weight[2][16][2];
  237.     int chroma_offset[2][16][2];
  238.    
  239.     //deblock
  240.     int deblocking_filter;         ///< disable_deblocking_filter_idc with 1<->0 
  241.     int slice_alpha_c0_offset;
  242.     int slice_beta_offset;
  243.      
  244.     int redundant_pic_count;
  245.     
  246.     int direct_spatial_mv_pred;
  247.     /**
  248.      * num_ref_idx_l0/1_active_minus1 + 1
  249.      */
  250.     int ref_count[2];// FIXME split for AFF
  251.     Picture *short_ref[16];
  252.     Picture *long_ref[16];
  253.     Picture default_ref_list[2][32];
  254.     Picture ref_list[2][32]; //FIXME size?
  255.     Picture field_ref_list[2][32]; //FIXME size?
  256.     
  257.     /**
  258.      * memory management control operations buffer.
  259.      */
  260.     MMCO mmco[MAX_MMCO_COUNT];
  261.     int mmco_index;
  262.     
  263.     int long_ref_count;  ///< number of actual long term references
  264.     int short_ref_count; ///< number of actual short term references
  265.     
  266.     //data partitioning
  267.     GetBitContext intra_gb;
  268.     GetBitContext inter_gb;
  269.     GetBitContext *intra_gb_ptr;
  270.     GetBitContext *inter_gb_ptr;
  271.     
  272. //    DCTELEM mb[16*24] __align8;
  273.     DCTELEM __align8 mb[16*24] ;
  274.     /**
  275.      * Cabac
  276.      */
  277.     CABACContext cabac;
  278.     uint8_t      cabac_state[399];
  279.     int          cabac_init_idc;
  280.     /* 0x100 -> non null luma_dc, 0x80/0x40 -> non null chroma_dc (cb/cr), 0x?0 -> chroma_cbp(0,1,2), 0x0? luma_cbp */
  281.     uint16_t     *cbp_table;
  282.     /* chroma_pred_mode for i4x4 or i16x16, else 0 */
  283.     uint8_t     *chroma_pred_mode_table;
  284.     int         last_qscale_diff;
  285.     int16_t     (*mvd_table[2])[2];
  286.     int16_t     mvd_cache[2][5*8][2];
  287. }H264Context;
  288. static VLC coeff_token_vlc[4];
  289. static VLC chroma_dc_coeff_token_vlc;
  290. static VLC total_zeros_vlc[15];
  291. static VLC chroma_dc_total_zeros_vlc[3];
  292. static VLC run_vlc[6];
  293. static VLC run7_vlc;
  294. static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp);
  295. static void svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc);
  296. static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr);
  297. static inline uint32_t pack16to32(int a, int b){
  298. #ifdef WORDS_BIGENDIAN
  299.    return (b&0xFFFF) + (a<<16);
  300. #else
  301.    return (a&0xFFFF) + (b<<16);
  302. #endif
  303. }
  304. /**
  305.  * fill a rectangle.
  306.  * @param h height of the recatangle, should be a constant
  307.  * @param w width of the recatangle, should be a constant
  308.  * @param size the size of val (1 or 4), should be a constant
  309.  */
  310. static inline void fill_rectangle(void *vp, int w, int h, int stride, uint32_t val, int size){ //FIXME ensure this IS inlined
  311.     uint8_t *p= (uint8_t*)vp;
  312.     assert(size==1 || size==4);
  313.     
  314.     w      *= size;
  315.     stride *= size;
  316.     
  317. //FIXME check what gcc generates for 64 bit on x86 and possible write a 32 bit ver of it
  318.     if(w==2 && h==2){
  319.         *(uint16_t*)(p + 0)=
  320.         *(uint16_t*)(p + stride)= size==4 ? val : val*0x0101;
  321.     }else if(w==2 && h==4){
  322.         *(uint16_t*)(p + 0*stride)=
  323.         *(uint16_t*)(p + 1*stride)=
  324.         *(uint16_t*)(p + 2*stride)=
  325.         *(uint16_t*)(p + 3*stride)= size==4 ? val : val*0x0101;
  326.     }else if(w==4 && h==1){
  327.         *(uint32_t*)(p + 0*stride)= size==4 ? val : val*0x01010101;
  328.     }else if(w==4 && h==2){
  329.         *(uint32_t*)(p + 0*stride)=
  330.         *(uint32_t*)(p + 1*stride)= size==4 ? val : val*0x01010101;
  331.     }else if(w==4 && h==4){
  332.         *(uint32_t*)(p + 0*stride)=
  333.         *(uint32_t*)(p + 1*stride)=
  334.         *(uint32_t*)(p + 2*stride)=
  335.         *(uint32_t*)(p + 3*stride)= size==4 ? val : val*0x01010101;
  336.     }else if(w==8 && h==1){
  337.         *(uint32_t*)(p + 0)=
  338.         *(uint32_t*)(p + 4)= size==4 ? val : val*0x01010101;
  339.     }else if(w==8 && h==2){
  340.         *(uint32_t*)(p + 0 + 0*stride)=
  341.         *(uint32_t*)(p + 4 + 0*stride)=
  342.         *(uint32_t*)(p + 0 + 1*stride)=
  343.         *(uint32_t*)(p + 4 + 1*stride)=  size==4 ? val : val*0x01010101;
  344.     }else if(w==8 && h==4){
  345.         *(uint64_t*)(p + 0*stride)=
  346.         *(uint64_t*)(p + 1*stride)=
  347.         *(uint64_t*)(p + 2*stride)=
  348. //        *(uint64_t*)(p + 3*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
  349.         *(uint64_t*)(p + 3*stride)= size==4 ? val*0x0100000001 : val*0x0101010101010101;
  350.     }else if(w==16 && h==2){
  351.         *(uint64_t*)(p + 0+0*stride)=
  352.         *(uint64_t*)(p + 8+0*stride)=
  353.         *(uint64_t*)(p + 0+1*stride)=
  354. //        *(uint64_t*)(p + 8+1*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
  355.         *(uint64_t*)(p + 8+1*stride)= size==4 ? val*0x0100000001 : val*0x0101010101010101;
  356.     }else if(w==16 && h==4){
  357.         *(uint64_t*)(p + 0+0*stride)=
  358.         *(uint64_t*)(p + 8+0*stride)=
  359.         *(uint64_t*)(p + 0+1*stride)=
  360.         *(uint64_t*)(p + 8+1*stride)=
  361.         *(uint64_t*)(p + 0+2*stride)=
  362.         *(uint64_t*)(p + 8+2*stride)=
  363.         *(uint64_t*)(p + 0+3*stride)=
  364. //        *(uint64_t*)(p + 8+3*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
  365.         *(uint64_t*)(p + 8+3*stride)= size==4 ? val*0x0100000001 : val*0x0101010101010101;
  366.     }else
  367.         assert(0);
  368. }
  369. static inline void fill_caches(H264Context *h, int mb_type){
  370.     MpegEncContext * const s = &h->s;
  371.     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  372.     int topleft_xy, top_xy, topright_xy, left_xy[2];
  373.     int topleft_type, top_type, topright_type, left_type[2];
  374.     int left_block[4];
  375.     int i;
  376.     //wow what a mess, why didnt they simplify the interlacing&intra stuff, i cant imagine that these complex rules are worth it 
  377.     
  378.     if(h->sps.mb_aff){
  379.     //FIXME
  380.         topleft_xy = 0; /* avoid warning */
  381.         top_xy = 0; /* avoid warning */
  382.         topright_xy = 0; /* avoid warning */
  383.     }else{
  384.         topleft_xy = mb_xy-1 - s->mb_stride;
  385.         top_xy     = mb_xy   - s->mb_stride;
  386.         topright_xy= mb_xy+1 - s->mb_stride;
  387.         left_xy[0]   = mb_xy-1;
  388.         left_xy[1]   = mb_xy-1;
  389.         left_block[0]= 0;
  390.         left_block[1]= 1;
  391.         left_block[2]= 2;
  392.         left_block[3]= 3;
  393.     }
  394.     topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0;
  395.     top_type     = h->slice_table[top_xy     ] == h->slice_num ? s->current_picture.mb_type[top_xy]     : 0;
  396.     topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0;
  397.     left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0;
  398.     left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0;
  399.     if(IS_INTRA(mb_type)){
  400.         h->topleft_samples_available= 
  401.         h->top_samples_available= 
  402.         h->left_samples_available= 0xFFFF;
  403.         h->topright_samples_available= 0xEEEA;
  404.         if(!IS_INTRA(top_type) && (top_type==0 || h->pps.constrained_intra_pred)){
  405.             h->topleft_samples_available= 0xB3FF;
  406.             h->top_samples_available= 0x33FF;
  407.             h->topright_samples_available= 0x26EA;
  408.         }
  409.         for(i=0; i<2; i++){
  410.             if(!IS_INTRA(left_type[i]) && (left_type[i]==0 || h->pps.constrained_intra_pred)){
  411.                 h->topleft_samples_available&= 0xDF5F;
  412.                 h->left_samples_available&= 0x5F5F;
  413.             }
  414.         }
  415.         
  416.         if(!IS_INTRA(topleft_type) && (topleft_type==0 || h->pps.constrained_intra_pred))
  417.             h->topleft_samples_available&= 0x7FFF;
  418.         
  419.         if(!IS_INTRA(topright_type) && (topright_type==0 || h->pps.constrained_intra_pred))
  420.             h->topright_samples_available&= 0xFBFF;
  421.     
  422.         if(IS_INTRA4x4(mb_type)){
  423.             if(IS_INTRA4x4(top_type)){
  424.                 h->intra4x4_pred_mode_cache[4+8*0]= h->intra4x4_pred_mode[top_xy][4];
  425.                 h->intra4x4_pred_mode_cache[5+8*0]= h->intra4x4_pred_mode[top_xy][5];
  426.                 h->intra4x4_pred_mode_cache[6+8*0]= h->intra4x4_pred_mode[top_xy][6];
  427.                 h->intra4x4_pred_mode_cache[7+8*0]= h->intra4x4_pred_mode[top_xy][3];
  428.             }else{
  429.                 int pred;
  430.                 if(IS_INTRA16x16(top_type) || (IS_INTER(top_type) && !h->pps.constrained_intra_pred))
  431.                     pred= 2;
  432.                 else{
  433.                     pred= -1;
  434.                 }
  435.                 h->intra4x4_pred_mode_cache[4+8*0]=
  436.                 h->intra4x4_pred_mode_cache[5+8*0]=
  437.                 h->intra4x4_pred_mode_cache[6+8*0]=
  438.                 h->intra4x4_pred_mode_cache[7+8*0]= pred;
  439.             }
  440.             for(i=0; i<2; i++){
  441.                 if(IS_INTRA4x4(left_type[i])){
  442.                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+2*i]];
  443.                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+2*i]];
  444.                 }else{
  445.                     int pred;
  446.                     if(IS_INTRA16x16(left_type[i]) || (IS_INTER(left_type[i]) && !h->pps.constrained_intra_pred))
  447.                         pred= 2;
  448.                     else{
  449.                         pred= -1;
  450.                     }
  451.                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]=
  452.                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= pred;
  453.                 }
  454.             }
  455.         }
  456.     }
  457.     
  458.     
  459. /*
  460. 0 . T T. T T T T 
  461. 1 L . .L . . . . 
  462. 2 L . .L . . . . 
  463. 3 . T TL . . . . 
  464. 4 L . .L . . . . 
  465. 5 L . .. . . . . 
  466. */
  467. //FIXME constraint_intra_pred & partitioning & nnz (lets hope this is just a typo in the spec)
  468.     if(top_type){
  469.         h->non_zero_count_cache[4+8*0]= h->non_zero_count[top_xy][0];
  470.         h->non_zero_count_cache[5+8*0]= h->non_zero_count[top_xy][1];
  471.         h->non_zero_count_cache[6+8*0]= h->non_zero_count[top_xy][2];
  472.         h->non_zero_count_cache[7+8*0]= h->non_zero_count[top_xy][3];
  473.     
  474.         h->non_zero_count_cache[1+8*0]= h->non_zero_count[top_xy][7];
  475.         h->non_zero_count_cache[2+8*0]= h->non_zero_count[top_xy][8];
  476.     
  477.         h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][10];
  478.         h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11];
  479.     }else{
  480.         h->non_zero_count_cache[4+8*0]=      
  481.         h->non_zero_count_cache[5+8*0]=
  482.         h->non_zero_count_cache[6+8*0]=
  483.         h->non_zero_count_cache[7+8*0]=
  484.     
  485.         h->non_zero_count_cache[1+8*0]=
  486.         h->non_zero_count_cache[2+8*0]=
  487.     
  488.         h->non_zero_count_cache[1+8*3]=
  489.         h->non_zero_count_cache[2+8*3]= 64;
  490.     }
  491.     
  492.     if(left_type[0]){
  493.         h->non_zero_count_cache[3+8*1]= h->non_zero_count[left_xy[0]][6];
  494.         h->non_zero_count_cache[3+8*2]= h->non_zero_count[left_xy[0]][5];
  495.         h->non_zero_count_cache[0+8*1]= h->non_zero_count[left_xy[0]][9]; //FIXME left_block
  496.         h->non_zero_count_cache[0+8*4]= h->non_zero_count[left_xy[0]][12];
  497.     }else{
  498.         h->non_zero_count_cache[3+8*1]= 
  499.         h->non_zero_count_cache[3+8*2]= 
  500.         h->non_zero_count_cache[0+8*1]= 
  501.         h->non_zero_count_cache[0+8*4]= 64;
  502.     }
  503.     
  504.     if(left_type[1]){
  505.         h->non_zero_count_cache[3+8*3]= h->non_zero_count[left_xy[1]][4];
  506.         h->non_zero_count_cache[3+8*4]= h->non_zero_count[left_xy[1]][3];
  507.         h->non_zero_count_cache[0+8*2]= h->non_zero_count[left_xy[1]][8];
  508.         h->non_zero_count_cache[0+8*5]= h->non_zero_count[left_xy[1]][11];
  509.     }else{
  510.         h->non_zero_count_cache[3+8*3]= 
  511.         h->non_zero_count_cache[3+8*4]= 
  512.         h->non_zero_count_cache[0+8*2]= 
  513.         h->non_zero_count_cache[0+8*5]= 64;
  514.     }
  515.     
  516. #if 1
  517.     if(IS_INTER(mb_type)){
  518.         int list;
  519.         for(list=0; list<2; list++){
  520.             if((!IS_8X8(mb_type)) && !USES_LIST(mb_type, list)){
  521.                 /*if(!h->mv_cache_clean[list]){
  522.                     memset(h->mv_cache [list],  0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all?
  523.                     memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t));
  524.                     h->mv_cache_clean[list]= 1;
  525.                 }*/
  526.                 continue; //FIXME direct mode ...
  527.             }
  528.             h->mv_cache_clean[list]= 0;
  529.             
  530.             if(IS_INTER(topleft_type)){
  531.                 const int b_xy = h->mb2b_xy[topleft_xy] + 3 + 3*h->b_stride;
  532.                 const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + h->b8_stride;
  533.                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
  534.                 h->ref_cache[list][scan8[0] - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy];
  535.             }else{
  536.                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= 0;
  537.                 h->ref_cache[list][scan8[0] - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
  538.             }
  539.             
  540.             if(IS_INTER(top_type)){
  541.                 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
  542.                 const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride;
  543.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0];
  544.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1];
  545.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2];
  546.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3];
  547.                 h->ref_cache[list][scan8[0] + 0 - 1*8]=
  548.                 h->ref_cache[list][scan8[0] + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0];
  549.                 h->ref_cache[list][scan8[0] + 2 - 1*8]=
  550.                 h->ref_cache[list][scan8[0] + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1];
  551.             }else{
  552.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 0 - 1*8]= 
  553.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 1 - 1*8]= 
  554.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 2 - 1*8]= 
  555.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 3 - 1*8]= 0;
  556.                 *(uint32_t*)&h->ref_cache[list][scan8[0] + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101;
  557.             }
  558.             if(IS_INTER(topright_type)){
  559.                 const int b_xy= h->mb2b_xy[topright_xy] + 3*h->b_stride;
  560.                 const int b8_xy= h->mb2b8_xy[topright_xy] + h->b8_stride;
  561.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
  562.                 h->ref_cache[list][scan8[0] + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy];
  563.             }else{
  564.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 4 - 1*8]= 0;
  565.                 h->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
  566.             }
  567.             
  568.             //FIXME unify cleanup or sth
  569.             if(IS_INTER(left_type[0])){
  570.                 const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
  571.                 const int b8_xy= h->mb2b8_xy[left_xy[0]] + 1;
  572.                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 + 0*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0]];
  573.                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 + 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1]];
  574.                 h->ref_cache[list][scan8[0] - 1 + 0*8]= 
  575.                 h->ref_cache[list][scan8[0] - 1 + 1*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0]>>1)];
  576.             }else{
  577.                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 0*8]=
  578.                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 1*8]= 0;
  579.                 h->ref_cache[list][scan8[0] - 1 + 0*8]=
  580.                 h->ref_cache[list][scan8[0] - 1 + 1*8]= left_type[0] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
  581.             }
  582.             
  583.             if(IS_INTER(left_type[1])){
  584.                 const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
  585.                 const int b8_xy= h->mb2b8_xy[left_xy[1]] + 1;
  586.                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 + 2*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[2]];
  587.                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 + 3*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[3]];
  588.                 h->ref_cache[list][scan8[0] - 1 + 2*8]= 
  589.                 h->ref_cache[list][scan8[0] - 1 + 3*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[2]>>1)];
  590.             }else{
  591.                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 2*8]=
  592.                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 3*8]= 0;
  593.                 h->ref_cache[list][scan8[0] - 1 + 2*8]=
  594.                 h->ref_cache[list][scan8[0] - 1 + 3*8]= left_type[0] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
  595.             }
  596.             h->ref_cache[list][scan8[5 ]+1] = 
  597.             h->ref_cache[list][scan8[7 ]+1] = 
  598.             h->ref_cache[list][scan8[13]+1] =  //FIXME remove past 3 (init somewher else)
  599.             h->ref_cache[list][scan8[4 ]] = 
  600.             h->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE;
  601.             *(uint32_t*)h->mv_cache [list][scan8[5 ]+1]=
  602.             *(uint32_t*)h->mv_cache [list][scan8[7 ]+1]=
  603.             *(uint32_t*)h->mv_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewher else)
  604.             *(uint32_t*)h->mv_cache [list][scan8[4 ]]=
  605.             *(uint32_t*)h->mv_cache [list][scan8[12]]= 0;
  606.             if( h->pps.cabac ) {
  607.                 /* XXX beurk, Load mvd */
  608.                 if(IS_INTER(topleft_type)){
  609.                     const int b_xy = h->mb2b_xy[topleft_xy] + 3 + 3*h->b_stride;
  610.                     *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy];
  611.                 }else{
  612.                     *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 - 1*8]= 0;
  613.                 }
  614.                 if(IS_INTER(top_type)){
  615.                     const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
  616.                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 0];
  617.                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 1];
  618.                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 2];
  619.                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 3];
  620.                 }else{
  621.                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 0 - 1*8]= 
  622.                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 1 - 1*8]= 
  623.                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 2 - 1*8]= 
  624.                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 3 - 1*8]= 0;
  625.                 }
  626.                 if(IS_INTER(left_type[0])){
  627.                     const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
  628.                     *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 0*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[0]];
  629.                     *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[1]];
  630.                 }else{
  631.                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 0*8]=
  632.                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 1*8]= 0;
  633.                 }
  634.                 if(IS_INTER(left_type[1])){
  635.                     const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
  636.                     *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 2*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[2]];
  637.                     *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 + 3*8]= *(uint32_t*)h->mvd_table[list][b_xy + h->b_stride*left_block[3]];
  638.                 }else{
  639.                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 2*8]=
  640.                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 3*8]= 0;
  641.                 }
  642.                 *(uint32_t*)h->mvd_cache [list][scan8[5 ]+1]=
  643.                 *(uint32_t*)h->mvd_cache [list][scan8[7 ]+1]=
  644.                 *(uint32_t*)h->mvd_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewher else)
  645.                 *(uint32_t*)h->mvd_cache [list][scan8[4 ]]=
  646.                 *(uint32_t*)h->mvd_cache [list][scan8[12]]= 0;
  647.             }
  648.         }
  649. //FIXME
  650.     }
  651. #endif
  652. }
  653. static inline void write_back_intra_pred_mode(H264Context *h){
  654.     MpegEncContext * const s = &h->s;
  655.     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  656.     h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1];
  657.     h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2];
  658.     h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3];
  659.     h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4];
  660.     h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4];
  661.     h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4];
  662.     h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4];
  663. }
  664. /**
  665.  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
  666.  */
  667. static inline int check_intra4x4_pred_mode(H264Context *h){
  668.     MpegEncContext * const s = &h->s;
  669.     static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0};
  670.     static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED};
  671.     int i;
  672.     
  673.     if(!(h->top_samples_available&0x8000)){
  674.         for(i=0; i<4; i++){
  675.             int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ];
  676.             if(status<0){
  677.                 av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra4x4 mode %d at %d %dn", status, s->mb_x, s->mb_y);
  678.                 return -1;
  679.             } else if(status){
  680.                 h->intra4x4_pred_mode_cache[scan8[0] + i]= status;
  681.             }
  682.         }
  683.     }
  684.     
  685.     if(!(h->left_samples_available&0x8000)){
  686.         for(i=0; i<4; i++){
  687.             int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ];
  688.             if(status<0){
  689.                 av_log(h->s.avctx, AV_LOG_ERROR, "left block unavailable for requested intra4x4 mode %d at %d %dn", status, s->mb_x, s->mb_y);
  690.                 return -1;
  691.             } else if(status){
  692.                 h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status;
  693.             }
  694.         }
  695.     }
  696.     return 0;
  697. } //FIXME cleanup like next
  698. /**
  699.  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
  700.  */
  701. static inline int check_intra_pred_mode(H264Context *h, int mode){
  702.     MpegEncContext * const s = &h->s;
  703.     static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};
  704.     static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};
  705.     
  706.     if(!(h->top_samples_available&0x8000)){
  707.         mode= top[ mode ];
  708.         if(mode<0){
  709.             av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra mode at %d %dn", s->mb_x, s->mb_y);
  710.             return -1;
  711.         }
  712.     }
  713.     
  714.     if(!(h->left_samples_available&0x8000)){
  715.         mode= left[ mode ];
  716.         if(mode<0){
  717.             av_log(h->s.avctx, AV_LOG_ERROR, "left block unavailable for requested intra mode at %d %dn", s->mb_x, s->mb_y);
  718.             return -1;
  719.         } 
  720.     }
  721.     return mode;
  722. }
  723. /**
  724.  * gets the predicted intra4x4 prediction mode.
  725.  */
  726. static inline int pred_intra_mode(H264Context *h, int n){
  727.     const int index8= scan8[n];
  728.     const int left= h->intra4x4_pred_mode_cache[index8 - 1];
  729.     const int top = h->intra4x4_pred_mode_cache[index8 - 8];
  730.     const int min= FFMIN(left, top);
  731.     tprintf("mode:%d %d min:%dn", left ,top, min);
  732.     if(min<0) return DC_PRED;
  733.     else      return min;
  734. }
  735. static inline void write_back_non_zero_count(H264Context *h){
  736.     MpegEncContext * const s = &h->s;
  737.     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  738.     h->non_zero_count[mb_xy][0]= h->non_zero_count_cache[4+8*4];
  739.     h->non_zero_count[mb_xy][1]= h->non_zero_count_cache[5+8*4];
  740.     h->non_zero_count[mb_xy][2]= h->non_zero_count_cache[6+8*4];
  741.     h->non_zero_count[mb_xy][3]= h->non_zero_count_cache[7+8*4];
  742.     h->non_zero_count[mb_xy][4]= h->non_zero_count_cache[7+8*3];
  743.     h->non_zero_count[mb_xy][5]= h->non_zero_count_cache[7+8*2];
  744.     h->non_zero_count[mb_xy][6]= h->non_zero_count_cache[7+8*1];
  745.     
  746.     h->non_zero_count[mb_xy][7]= h->non_zero_count_cache[1+8*2];
  747.     h->non_zero_count[mb_xy][8]= h->non_zero_count_cache[2+8*2];
  748.     h->non_zero_count[mb_xy][9]= h->non_zero_count_cache[2+8*1];
  749.     h->non_zero_count[mb_xy][10]=h->non_zero_count_cache[1+8*5];
  750.     h->non_zero_count[mb_xy][11]=h->non_zero_count_cache[2+8*5];
  751.     h->non_zero_count[mb_xy][12]=h->non_zero_count_cache[2+8*4];
  752. }
  753. /**
  754.  * gets the predicted number of non zero coefficients.
  755.  * @param n block index
  756.  */
  757. static inline int pred_non_zero_count(H264Context *h, int n){
  758.     const int index8= scan8[n];
  759.     const int left= h->non_zero_count_cache[index8 - 1];
  760.     const int top = h->non_zero_count_cache[index8 - 8];
  761.     int i= left + top;
  762.     
  763.     if(i<64) i= (i+1)>>1;
  764.     tprintf("pred_nnz L%X T%X n%d s%d P%Xn", left, top, n, scan8[n], i&31);
  765.     return i&31;
  766. }
  767. static inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width){
  768.     const int topright_ref= h->ref_cache[list][ i - 8 + part_width ];
  769.     if(topright_ref != PART_NOT_AVAILABLE){
  770.         *C= h->mv_cache[list][ i - 8 + part_width ];
  771.         return topright_ref;
  772.     }else{
  773.         tprintf("topright MV not availablen");
  774.         *C= h->mv_cache[list][ i - 8 - 1 ];
  775.         return h->ref_cache[list][ i - 8 - 1 ];
  776.     }
  777. }
  778. /**
  779.  * gets the predicted MV.
  780.  * @param n the block index
  781.  * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
  782.  * @param mx the x component of the predicted motion vector
  783.  * @param my the y component of the predicted motion vector
  784.  */
  785. static inline void pred_motion(H264Context * const h, int n, int part_width, int list, int ref, int * const mx, int * const my){
  786.     const int index8= scan8[n];
  787.     const int top_ref=      h->ref_cache[list][ index8 - 8 ];
  788.     const int left_ref=     h->ref_cache[list][ index8 - 1 ];
  789.     const int16_t * const A= h->mv_cache[list][ index8 - 1 ];
  790.     const int16_t * const B= h->mv_cache[list][ index8 - 8 ];
  791.     const int16_t * C;
  792.     int diagonal_ref, match_count;
  793.     assert(part_width==1 || part_width==2 || part_width==4);
  794. /* mv_cache
  795.   B . . A T T T T 
  796.   U . . L . . , .
  797.   U . . L . . . .
  798.   U . . L . . , .
  799.   . . . L . . . .
  800. */
  801.     diagonal_ref= fetch_diagonal_mv(h, &C, index8, list, part_width);
  802.     match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref);
  803.     if(match_count > 1){ //most common
  804.         *mx= mid_pred(A[0], B[0], C[0]);
  805.         *my= mid_pred(A[1], B[1], C[1]);
  806.     }else if(match_count==1){
  807.         if(left_ref==ref){
  808.             *mx= A[0];
  809.             *my= A[1];        
  810.         }else if(top_ref==ref){
  811.             *mx= B[0];
  812.             *my= B[1];        
  813.         }else{
  814.             *mx= C[0];
  815.             *my= C[1];        
  816.         }
  817.     }else{
  818.         if(top_ref == PART_NOT_AVAILABLE && diagonal_ref == PART_NOT_AVAILABLE && left_ref != PART_NOT_AVAILABLE){
  819.             *mx= A[0];
  820.             *my= A[1];        
  821.         }else{
  822.             *mx= mid_pred(A[0], B[0], C[0]);
  823.             *my= mid_pred(A[1], B[1], C[1]);
  824.         }
  825.     }
  826.         
  827.     tprintf("pred_motion (%2d %2d %2d) (%2d %2d %2d) (%2d %2d %2d) -> (%2d %2d %2d) at %2d %2d %d list %dn", top_ref, B[0], B[1],                    diagonal_ref, C[0], C[1], left_ref, A[0], A[1], ref, *mx, *my, h->s.mb_x, h->s.mb_y, n, list);
  828. }
  829. /**
  830.  * gets the directionally predicted 16x8 MV.
  831.  * @param n the block index
  832.  * @param mx the x component of the predicted motion vector
  833.  * @param my the y component of the predicted motion vector
  834.  */
  835. static inline void pred_16x8_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
  836.     if(n==0){
  837.         const int top_ref=      h->ref_cache[list][ scan8[0] - 8 ];
  838.         const int16_t * const B= h->mv_cache[list][ scan8[0] - 8 ];
  839.         tprintf("pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d", top_ref, B[0], B[1], h->s.mb_x, h->s.mb_y, n, list);
  840.         
  841.         if(top_ref == ref){
  842.             *mx= B[0];
  843.             *my= B[1];
  844.             return;
  845.         }
  846.     }else{
  847.         const int left_ref=     h->ref_cache[list][ scan8[8] - 1 ];
  848.         const int16_t * const A= h->mv_cache[list][ scan8[8] - 1 ];
  849.         
  850.         tprintf("pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list);
  851.         if(left_ref == ref){
  852.             *mx= A[0];
  853.             *my= A[1];
  854.             return;
  855.         }
  856.     }
  857.     //RARE
  858.     pred_motion(h, n, 4, list, ref, mx, my);
  859. }
  860. /**
  861.  * gets the directionally predicted 8x16 MV.
  862.  * @param n the block index
  863.  * @param mx the x component of the predicted motion vector
  864.  * @param my the y component of the predicted motion vector
  865.  */
  866. static inline void pred_8x16_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
  867.     if(n==0){
  868.         const int left_ref=      h->ref_cache[list][ scan8[0] - 1 ];
  869.         const int16_t * const A=  h->mv_cache[list][ scan8[0] - 1 ];
  870.         
  871.         tprintf("pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list);
  872.         if(left_ref == ref){
  873.             *mx= A[0];
  874.             *my= A[1];
  875.             return;
  876.         }
  877.     }else{
  878.         const int16_t * C;
  879.         int diagonal_ref;
  880.         diagonal_ref= fetch_diagonal_mv(h, &C, scan8[4], list, 2);
  881.         
  882.         tprintf("pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d", diagonal_ref, C[0], C[1], h->s.mb_x, h->s.mb_y, n, list);
  883.         if(diagonal_ref == ref){ 
  884.             *mx= C[0];
  885.             *my= C[1];
  886.             return;
  887.         }
  888.     }
  889.     //RARE
  890.     pred_motion(h, n, 2, list, ref, mx, my);
  891. }
  892. static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my){
  893.     const int top_ref = h->ref_cache[0][ scan8[0] - 8 ];
  894.     const int left_ref= h->ref_cache[0][ scan8[0] - 1 ];
  895.     tprintf("pred_pskip: (%d) (%d) at %2d %2d", top_ref, left_ref, h->s.mb_x, h->s.mb_y);
  896.     if(top_ref == PART_NOT_AVAILABLE || left_ref == PART_NOT_AVAILABLE
  897.        || (top_ref == 0  && *(uint32_t*)h->mv_cache[0][ scan8[0] - 8 ] == 0)
  898.        || (left_ref == 0 && *(uint32_t*)h->mv_cache[0][ scan8[0] - 1 ] == 0)){
  899.        
  900.         *mx = *my = 0;
  901.         return;
  902.     }
  903.         
  904.     pred_motion(h, 0, 4, 0, 0, mx, my);
  905.     return;
  906. }
  907. static inline void write_back_motion(H264Context *h, int mb_type){
  908.     MpegEncContext * const s = &h->s;
  909.     const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
  910.     const int b8_xy= 2*s->mb_x + 2*s->mb_y*h->b8_stride;
  911.     int list;
  912.     for(list=0; list<2; list++){
  913.         int y;
  914.         if((!IS_8X8(mb_type)) && !USES_LIST(mb_type, list)){
  915.             if(1){ //FIXME skip or never read if mb_type doesnt use it
  916.                 for(y=0; y<4; y++){
  917.                     *(uint64_t*)s->current_picture.motion_val[list][b_xy + 0 + y*h->b_stride]=
  918.                     *(uint64_t*)s->current_picture.motion_val[list][b_xy + 2 + y*h->b_stride]= 0;
  919.                 }
  920.                 if( h->pps.cabac ) {
  921.                     /* FIXME needed ? */
  922.                     for(y=0; y<4; y++){
  923.                         *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]=
  924.                         *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= 0;
  925.                     }
  926.                 }
  927.                 for(y=0; y<2; y++){
  928.                     *(uint16_t*)s->current_picture.motion_val[list][b8_xy + y*h->b8_stride]= (LIST_NOT_USED&0xFF)*0x0101;
  929.                 }
  930.             }
  931.             continue; //FIXME direct mode ...
  932.         }
  933.         
  934.         for(y=0; y<4; y++){
  935.             *(uint64_t*)s->current_picture.motion_val[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mv_cache[list][scan8[0]+0 + 8*y];
  936.             *(uint64_t*)s->current_picture.motion_val[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mv_cache[list][scan8[0]+2 + 8*y];
  937.         }
  938.         if( h->pps.cabac ) {
  939.             for(y=0; y<4; y++){
  940.                 *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+0 + 8*y];
  941.                 *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+2 + 8*y];
  942.             }
  943.         }
  944.         for(y=0; y<2; y++){
  945.             s->current_picture.ref_index[list][b8_xy + 0 + y*h->b8_stride]= h->ref_cache[list][scan8[0]+0 + 16*y];
  946.             s->current_picture.ref_index[list][b8_xy + 1 + y*h->b8_stride]= h->ref_cache[list][scan8[0]+2 + 16*y];
  947.         }
  948.     }
  949. }
  950. /**
  951.  * Decodes a network abstraction layer unit.
  952.  * @param consumed is the number of bytes used as input
  953.  * @param length is the length of the array
  954.  * @param dst_length is the number of decoded bytes FIXME here or a decode rbsp ttailing?
  955.  * @returns decoded bytes, might be src+1 if no escapes 
  956.  */
  957. static uint8_t *decode_nal(H264Context *h, uint8_t *src, int *dst_length, int *consumed, int length){
  958.     int i, si, di;
  959.     uint8_t *dst;
  960. //    src[0]&0x80; //forbidden bit
  961.     h->nal_ref_idc= src[0]>>5;
  962.     h->nal_unit_type= src[0]&0x1F;
  963.     src++; length--;
  964. #if 0    
  965.     for(i=0; i<length; i++)
  966.         printf("%2X ", src[i]);
  967. #endif
  968.     for(i=0; i+1<length; i+=2){
  969.         if(src[i]) continue;
  970.         if(i>0 && src[i-1]==0) i--;
  971.         if(i+2<length && src[i+1]==0 && src[i+2]<=3){
  972.             if(src[i+2]!=3){
  973.                 /* startcode, so we must be past the end */
  974.                 length=i;
  975.             }
  976.             break;
  977.         }
  978.     }
  979.     if(i>=length-1){ //no escaped 0
  980.         *dst_length= length;
  981.         *consumed= length+1; //+1 for the header
  982.         return src; 
  983.     }
  984.     h->rbsp_buffer= av_fast_realloc(h->rbsp_buffer, &h->rbsp_buffer_size, length);
  985.     dst= h->rbsp_buffer;
  986. //printf("deoding escn");
  987.     si=di=0;
  988.     while(si<length){ 
  989.         //remove escapes (very rare 1:2^22)
  990.         if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){
  991.             if(src[si+2]==3){ //escape
  992.                 dst[di++]= 0;
  993.                 dst[di++]= 0;
  994.                 si+=3;
  995.                 continue;
  996.             }else //next start code
  997.                 break;
  998.         }
  999.         dst[di++]= src[si++];
  1000.     }
  1001.     *dst_length= di;
  1002.     *consumed= si + 1;//+1 for the header
  1003. //FIXME store exact number of bits in the getbitcontext (its needed for decoding)
  1004.     return dst;
  1005. }
  1006. //#if 0 //Del by ty
  1007. /**
  1008.  * @param src the data which should be escaped
  1009.  * @param dst the target buffer, dst+1 == src is allowed as a special case
  1010.  * @param length the length of the src data
  1011.  * @param dst_length the length of the dst array
  1012.  * @returns length of escaped data in bytes or -1 if an error occured
  1013.  */
  1014. static int encode_nal(H264Context *h, uint8_t *dst, uint8_t *src, int length, int dst_length){
  1015.     int i, escape_count, si, di;
  1016.     uint8_t *temp;
  1017.     
  1018.     assert(length>=0);
  1019.     assert(dst_length>0);
  1020.     
  1021.     dst[0]= (h->nal_ref_idc<<5) + h->nal_unit_type;
  1022.     if(length==0) return 1;
  1023.     escape_count= 0;
  1024.     for(i=0; i<length; i+=2){
  1025.         if(src[i]) continue;
  1026.         if(i>0 && src[i-1]==0) 
  1027.             i--;
  1028.         if(i+2<length && src[i+1]==0 && src[i+2]<=3){
  1029.             escape_count++;
  1030.             i+=2;
  1031.         }
  1032.     }
  1033.     
  1034.     if(escape_count==0){ 
  1035.         if(dst+1 != src)
  1036.             memcpy(dst+1, src, length);
  1037.         return length + 1;
  1038.     }
  1039.     
  1040.     if(length + escape_count + 1> dst_length)
  1041.         return -1;
  1042.     //this should be damn rare (hopefully)
  1043.     h->rbsp_buffer= av_fast_realloc(h->rbsp_buffer, &h->rbsp_buffer_size, length + escape_count);
  1044.     temp= h->rbsp_buffer;
  1045. //printf("encoding escn");
  1046.     
  1047.     si= 0;
  1048.     di= 0;
  1049.     while(si < length){
  1050.         if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){
  1051.             temp[di++]= 0; si++;
  1052.             temp[di++]= 0; si++;
  1053.             temp[di++]= 3; 
  1054.             temp[di++]= src[si++];
  1055.         }
  1056.         else
  1057.             temp[di++]= src[si++];
  1058.     }
  1059.     memcpy(dst+1, temp, length+escape_count);
  1060.     
  1061.     assert(di == length+escape_count);
  1062.     
  1063.     return di + 1;
  1064. }
  1065. /**
  1066.  * write 1,10,100,1000,... for alignment, yes its exactly inverse to mpeg4
  1067.  */
  1068. static void encode_rbsp_trailing(PutBitContext *pb){
  1069.     int length;
  1070.     put_bits(pb, 1, 1);
  1071.     length= (-put_bits_count(pb))&7;
  1072.     if(length) put_bits(pb, length, 0);
  1073. }
  1074. //#endif //Del by ty
  1075. /**
  1076.  * identifies the exact end of the bitstream
  1077.  * @return the length of the trailing, or 0 if damaged
  1078.  */
  1079. static int decode_rbsp_trailing(uint8_t *src){
  1080.     int v= *src;
  1081.     int r;
  1082.     tprintf("rbsp trailing %Xn", v);
  1083.     for(r=1; r<9; r++){
  1084.         if(v&1) return r;
  1085.         v>>=1;
  1086.     }
  1087.     return 0;
  1088. }
  1089. /**
  1090.  * idct tranforms the 16 dc values and dequantize them.
  1091.  * @param qp quantization parameter
  1092.  */
  1093. static void h264_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
  1094.     const int qmul= dequant_coeff[qp][0];
  1095. #define stride 16
  1096.     int i;
  1097.     int temp[16]; //FIXME check if this is a good idea
  1098.     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
  1099.     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
  1100. //memset(block, 64, 2*256);
  1101. //return;
  1102.     for(i=0; i<4; i++){
  1103.         const int offset= y_offset[i];
  1104.         const int z0= block[offset+stride*0] + block[offset+stride*4];
  1105.         const int z1= block[offset+stride*0] - block[offset+stride*4];
  1106.         const int z2= block[offset+stride*1] - block[offset+stride*5];
  1107.         const int z3= block[offset+stride*1] + block[offset+stride*5];
  1108.         temp[4*i+0]= z0+z3;
  1109.         temp[4*i+1]= z1+z2;
  1110.         temp[4*i+2]= z1-z2;
  1111.         temp[4*i+3]= z0-z3;
  1112.     }
  1113.     for(i=0; i<4; i++){
  1114.         const int offset= x_offset[i];
  1115.         const int z0= temp[4*0+i] + temp[4*2+i];
  1116.         const int z1= temp[4*0+i] - temp[4*2+i];
  1117.         const int z2= temp[4*1+i] - temp[4*3+i];
  1118.         const int z3= temp[4*1+i] + temp[4*3+i];
  1119.         block[stride*0 +offset]= ((z0 + z3)*qmul + 2)>>2; //FIXME think about merging this into decode_resdual
  1120.         block[stride*2 +offset]= ((z1 + z2)*qmul + 2)>>2;
  1121.         block[stride*8 +offset]= ((z1 - z2)*qmul + 2)>>2;
  1122.         block[stride*10+offset]= ((z0 - z3)*qmul + 2)>>2;
  1123.     }
  1124. }
  1125. #if 0
  1126. /**
  1127.  * dct tranforms the 16 dc values.
  1128.  * @param qp quantization parameter ??? FIXME
  1129.  */
  1130. static void h264_luma_dc_dct_c(DCTELEM *block/*, int qp*/){
  1131. //    const int qmul= dequant_coeff[qp][0];
  1132.     int i;
  1133.     int temp[16]; //FIXME check if this is a good idea
  1134.     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
  1135.     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
  1136.     for(i=0; i<4; i++){
  1137.         const int offset= y_offset[i];
  1138.         const int z0= block[offset+stride*0] + block[offset+stride*4];
  1139.         const int z1= block[offset+stride*0] - block[offset+stride*4];
  1140.         const int z2= block[offset+stride*1] - block[offset+stride*5];
  1141.         const int z3= block[offset+stride*1] + block[offset+stride*5];
  1142.         temp[4*i+0]= z0+z3;
  1143.         temp[4*i+1]= z1+z2;
  1144.         temp[4*i+2]= z1-z2;
  1145.         temp[4*i+3]= z0-z3;
  1146.     }
  1147.     for(i=0; i<4; i++){
  1148.         const int offset= x_offset[i];
  1149.         const int z0= temp[4*0+i] + temp[4*2+i];
  1150.         const int z1= temp[4*0+i] - temp[4*2+i];
  1151.         const int z2= temp[4*1+i] - temp[4*3+i];
  1152.         const int z3= temp[4*1+i] + temp[4*3+i];
  1153.         block[stride*0 +offset]= (z0 + z3)>>1;
  1154.         block[stride*2 +offset]= (z1 + z2)>>1;
  1155.         block[stride*8 +offset]= (z1 - z2)>>1;
  1156.         block[stride*10+offset]= (z0 - z3)>>1;
  1157.     }
  1158. }
  1159. #endif
  1160. #undef xStride
  1161. #undef stride
  1162. static void chroma_dc_dequant_idct_c(DCTELEM *block, int qp){
  1163.     const int qmul= dequant_coeff[qp][0];
  1164.     const int stride= 16*2;
  1165.     const int xStride= 16;
  1166.     int a,b,c,d,e;
  1167.     a= block[stride*0 + xStride*0];
  1168.     b= block[stride*0 + xStride*1];
  1169.     c= block[stride*1 + xStride*0];
  1170.     d= block[stride*1 + xStride*1];
  1171.     e= a-b;
  1172.     a= a+b;
  1173.     b= c-d;
  1174.     c= c+d;
  1175.     block[stride*0 + xStride*0]= ((a+c)*qmul + 0)>>1;
  1176.     block[stride*0 + xStride*1]= ((e+b)*qmul + 0)>>1;
  1177.     block[stride*1 + xStride*0]= ((a-c)*qmul + 0)>>1;
  1178.     block[stride*1 + xStride*1]= ((e-b)*qmul + 0)>>1;
  1179. }
  1180. #if 0
  1181. static void chroma_dc_dct_c(DCTELEM *block){
  1182.     const int stride= 16*2;
  1183.     const int xStride= 16;
  1184.     int a,b,c,d,e;
  1185.     a= block[stride*0 + xStride*0];
  1186.     b= block[stride*0 + xStride*1];
  1187.     c= block[stride*1 + xStride*0];
  1188.     d= block[stride*1 + xStride*1];
  1189.     e= a-b;
  1190.     a= a+b;
  1191.     b= c-d;
  1192.     c= c+d;
  1193.     block[stride*0 + xStride*0]= (a+c);
  1194.     block[stride*0 + xStride*1]= (e+b);
  1195.     block[stride*1 + xStride*0]= (a-c);
  1196.     block[stride*1 + xStride*1]= (e-b);
  1197. }
  1198. #endif
  1199. /**
  1200.  * gets the chroma qp.
  1201.  */
  1202. static inline int get_chroma_qp(H264Context *h, int qscale){
  1203.     
  1204.     return chroma_qp[clip(qscale + h->pps.chroma_qp_index_offset, 0, 51)];
  1205. }
  1206. /**
  1207.  *
  1208.  */
  1209. static void h264_add_idct_c(uint8_t *dst, DCTELEM *block, int stride){
  1210.     int i;
  1211.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1212.     block[0] += 32;
  1213.     for(i=0; i<4; i++){
  1214.         const int z0=  block[0 + 4*i]     +  block[2 + 4*i];
  1215.         const int z1=  block[0 + 4*i]     -  block[2 + 4*i];
  1216.         const int z2= (block[1 + 4*i]>>1) -  block[3 + 4*i];
  1217.         const int z3=  block[1 + 4*i]     + (block[3 + 4*i]>>1);
  1218.         block[0 + 4*i]= z0 + z3;
  1219.         block[1 + 4*i]= z1 + z2;
  1220.         block[2 + 4*i]= z1 - z2;
  1221.         block[3 + 4*i]= z0 - z3;
  1222.     }
  1223.     for(i=0; i<4; i++){
  1224.         const int z0=  block[i + 4*0]     +  block[i + 4*2];
  1225.         const int z1=  block[i + 4*0]     -  block[i + 4*2];
  1226.         const int z2= (block[i + 4*1]>>1) -  block[i + 4*3];
  1227.         const int z3=  block[i + 4*1]     + (block[i + 4*3]>>1);
  1228.         dst[i + 0*stride]= cm[ dst[i + 0*stride] + ((z0 + z3) >> 6) ];
  1229.         dst[i + 1*stride]= cm[ dst[i + 1*stride] + ((z1 + z2) >> 6) ];
  1230.         dst[i + 2*stride]= cm[ dst[i + 2*stride] + ((z1 - z2) >> 6) ];
  1231.         dst[i + 3*stride]= cm[ dst[i + 3*stride] + ((z0 - z3) >> 6) ];
  1232.     }
  1233. }
  1234. //#if 0 //Del by ty
  1235. static void h264_diff_dct_c(DCTELEM *block, uint8_t *src1, uint8_t *src2, int stride){
  1236.     int i;
  1237.     //FIXME try int temp instead of block
  1238.     
  1239.     for(i=0; i<4; i++){
  1240.         const int d0= src1[0 + i*stride] - src2[0 + i*stride];
  1241.         const int d1= src1[1 + i*stride] - src2[1 + i*stride];
  1242.         const int d2= src1[2 + i*stride] - src2[2 + i*stride];
  1243.         const int d3= src1[3 + i*stride] - src2[3 + i*stride];
  1244.         const int z0= d0 + d3;
  1245.         const int z3= d0 - d3;
  1246.         const int z1= d1 + d2;
  1247.         const int z2= d1 - d2;
  1248.         
  1249.         block[0 + 4*i]=   z0 +   z1;
  1250.         block[1 + 4*i]= 2*z3 +   z2;
  1251.         block[2 + 4*i]=   z0 -   z1;
  1252.         block[3 + 4*i]=   z3 - 2*z2;
  1253.     }    
  1254.     for(i=0; i<4; i++){
  1255.         const int z0= block[0*4 + i] + block[3*4 + i];
  1256.         const int z3= block[0*4 + i] - block[3*4 + i];
  1257.         const int z1= block[1*4 + i] + block[2*4 + i];
  1258.         const int z2= block[1*4 + i] - block[2*4 + i];
  1259.         
  1260.         block[0*4 + i]=   z0 +   z1;
  1261.         block[1*4 + i]= 2*z3 +   z2;
  1262.         block[2*4 + i]=   z0 -   z1;
  1263.         block[3*4 + i]=   z3 - 2*z2;
  1264.     }
  1265. }
  1266. //#endif //Del by ty
  1267. //FIXME need to check that this doesnt overflow signed 32 bit for low qp, iam not sure, its very close
  1268. //FIXME check that gcc inlines this (and optimizes intra & seperate_dc stuff away)
  1269. static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale, int intra, int seperate_dc){
  1270.     int i;
  1271.     const int * const quant_table= quant_coeff[qscale];
  1272.     const int bias= intra ? (1<<QUANT_SHIFT)/3 : (1<<QUANT_SHIFT)/6;
  1273.     const unsigned int threshold1= (1<<QUANT_SHIFT) - bias - 1;
  1274.     const unsigned int threshold2= (threshold1<<1);
  1275.     int last_non_zero;
  1276.     if(seperate_dc){
  1277.         if(qscale<=18){
  1278.             //avoid overflows
  1279.             const int dc_bias= intra ? (1<<(QUANT_SHIFT-2))/3 : (1<<(QUANT_SHIFT-2))/6;
  1280.             const unsigned int dc_threshold1= (1<<(QUANT_SHIFT-2)) - dc_bias - 1;
  1281.             const unsigned int dc_threshold2= (dc_threshold1<<1);
  1282.             int level= block[0]*quant_coeff[qscale+18][0];
  1283.             if(((unsigned)(level+dc_threshold1))>dc_threshold2){
  1284.                 if(level>0){
  1285.                     level= (dc_bias + level)>>(QUANT_SHIFT-2);
  1286.                     block[0]= level;
  1287.                 }else{
  1288.                     level= (dc_bias - level)>>(QUANT_SHIFT-2);
  1289.                     block[0]= -level;
  1290.                 }
  1291. //                last_non_zero = i;
  1292.             }else{
  1293.                 block[0]=0;
  1294.             }
  1295.         }else{
  1296.             const int dc_bias= intra ? (1<<(QUANT_SHIFT+1))/3 : (1<<(QUANT_SHIFT+1))/6;
  1297.             const unsigned int dc_threshold1= (1<<(QUANT_SHIFT+1)) - dc_bias - 1;
  1298.             const unsigned int dc_threshold2= (dc_threshold1<<1);
  1299.             int level= block[0]*quant_table[0];
  1300.             if(((unsigned)(level+dc_threshold1))>dc_threshold2){
  1301.                 if(level>0){
  1302.                     level= (dc_bias + level)>>(QUANT_SHIFT+1);
  1303.                     block[0]= level;
  1304.                 }else{
  1305.                     level= (dc_bias - level)>>(QUANT_SHIFT+1);
  1306.                     block[0]= -level;
  1307.                 }
  1308. //                last_non_zero = i;
  1309.             }else{
  1310.                 block[0]=0;
  1311.             }
  1312.         }
  1313.         last_non_zero= 0;
  1314.         i=1;
  1315.     }else{
  1316.         last_non_zero= -1;
  1317.         i=0;
  1318.     }
  1319.     for(; i<16; i++){
  1320.         const int j= scantable[i];
  1321.         int level= block[j]*quant_table[j];
  1322. //        if(   bias+level >= (1<<(QMAT_SHIFT - 3))
  1323. //           || bias-level >= (1<<(QMAT_SHIFT - 3))){
  1324.         if(((unsigned)(level+threshold1))>threshold2){
  1325.             if(level>0){
  1326.                 level= (bias + level)>>QUANT_SHIFT;
  1327.                 block[j]= level;
  1328.             }else{
  1329.                 level= (bias - level)>>QUANT_SHIFT;
  1330.                 block[j]= -level;
  1331.             }
  1332.             last_non_zero = i;
  1333.         }else{
  1334.             block[j]=0;
  1335.         }
  1336.     }
  1337.     return last_non_zero;
  1338. }
  1339. static void pred4x4_vertical_c(uint8_t *src, uint8_t *topright, int stride){
  1340.     const uint32_t a= ((uint32_t*)(src-stride))[0];
  1341.     ((uint32_t*)(src+0*stride))[0]= a;
  1342.     ((uint32_t*)(src+1*stride))[0]= a;
  1343.     ((uint32_t*)(src+2*stride))[0]= a;
  1344.     ((uint32_t*)(src+3*stride))[0]= a;
  1345. }
  1346. static void pred4x4_horizontal_c(uint8_t *src, uint8_t *topright, int stride){
  1347.     ((uint32_t*)(src+0*stride))[0]= src[-1+0*stride]*0x01010101;
  1348.     ((uint32_t*)(src+1*stride))[0]= src[-1+1*stride]*0x01010101;
  1349.     ((uint32_t*)(src+2*stride))[0]= src[-1+2*stride]*0x01010101;
  1350.     ((uint32_t*)(src+3*stride))[0]= src[-1+3*stride]*0x01010101;
  1351. }
  1352. static void pred4x4_dc_c(uint8_t *src, uint8_t *topright, int stride){
  1353.     const int dc= (  src[-stride] + src[1-stride] + src[2-stride] + src[3-stride]
  1354.                    + src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 4) >>3;
  1355.     
  1356.     ((uint32_t*)(src+0*stride))[0]= 
  1357.     ((uint32_t*)(src+1*stride))[0]= 
  1358.     ((uint32_t*)(src+2*stride))[0]= 
  1359.     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
  1360. }
  1361. static void pred4x4_left_dc_c(uint8_t *src, uint8_t *topright, int stride){
  1362.     const int dc= (  src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 2) >>2;
  1363.     
  1364.     ((uint32_t*)(src+0*stride))[0]= 
  1365.     ((uint32_t*)(src+1*stride))[0]= 
  1366.     ((uint32_t*)(src+2*stride))[0]= 
  1367.     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
  1368. }
  1369. static void pred4x4_top_dc_c(uint8_t *src, uint8_t *topright, int stride){
  1370.     const int dc= (  src[-stride] + src[1-stride] + src[2-stride] + src[3-stride] + 2) >>2;
  1371.     
  1372.     ((uint32_t*)(src+0*stride))[0]= 
  1373.     ((uint32_t*)(src+1*stride))[0]= 
  1374.     ((uint32_t*)(src+2*stride))[0]= 
  1375.     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
  1376. }
  1377. static void pred4x4_128_dc_c(uint8_t *src, uint8_t *topright, int stride){
  1378.     ((uint32_t*)(src+0*stride))[0]= 
  1379.     ((uint32_t*)(src+1*stride))[0]= 
  1380.     ((uint32_t*)(src+2*stride))[0]= 
  1381.     ((uint32_t*)(src+3*stride))[0]= 128U*0x01010101U;
  1382. }
  1383. #define LOAD_TOP_RIGHT_EDGE
  1384.     const int t4= topright[0];
  1385.     const int t5= topright[1];
  1386.     const int t6= topright[2];
  1387.     const int t7= topright[3];
  1388. #define LOAD_LEFT_EDGE
  1389.     const int l0= src[-1+0*stride];
  1390.     const int l1= src[-1+1*stride];
  1391.     const int l2= src[-1+2*stride];
  1392.     const int l3= src[-1+3*stride];
  1393. #define LOAD_TOP_EDGE
  1394.     const int t0= src[ 0-1*stride];
  1395.     const int t1= src[ 1-1*stride];
  1396.     const int t2= src[ 2-1*stride];
  1397.     const int t3= src[ 3-1*stride];
  1398. static void pred4x4_down_right_c(uint8_t *src, uint8_t *topright, int stride){
  1399.     const int lt= src[-1-1*stride];
  1400.     LOAD_TOP_EDGE
  1401.     LOAD_LEFT_EDGE
  1402.     src[0+3*stride]=(l3 + 2*l2 + l1 + 2)>>2; 
  1403.     src[0+2*stride]=
  1404.     src[1+3*stride]=(l2 + 2*l1 + l0 + 2)>>2; 
  1405.     src[0+1*stride]=
  1406.     src[1+2*stride]=
  1407.     src[2+3*stride]=(l1 + 2*l0 + lt + 2)>>2; 
  1408.     src[0+0*stride]=
  1409.     src[1+1*stride]=
  1410.     src[2+2*stride]=
  1411.     src[3+3*stride]=(l0 + 2*lt + t0 + 2)>>2; 
  1412.     src[1+0*stride]=
  1413.     src[2+1*stride]=
  1414.     src[3+2*stride]=(lt + 2*t0 + t1 + 2)>>2;
  1415.     src[2+0*stride]=
  1416.     src[3+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
  1417.     src[3+0*stride]=(t1 + 2*t2 + t3 + 2)>>2;
  1418. }
  1419. static void pred4x4_down_left_c(uint8_t *src, uint8_t *topright, int stride){
  1420.     LOAD_TOP_EDGE    
  1421.     LOAD_TOP_RIGHT_EDGE    
  1422. //    LOAD_LEFT_EDGE    
  1423.     src[0+0*stride]=(t0 + t2 + 2*t1 + 2)>>2;
  1424.     src[1+0*stride]=
  1425.     src[0+1*stride]=(t1 + t3 + 2*t2 + 2)>>2;
  1426.     src[2+0*stride]=
  1427.     src[1+1*stride]=
  1428.     src[0+2*stride]=(t2 + t4 + 2*t3 + 2)>>2;
  1429.     src[3+0*stride]=
  1430.     src[2+1*stride]=
  1431.     src[1+2*stride]=
  1432.     src[0+3*stride]=(t3 + t5 + 2*t4 + 2)>>2;
  1433.     src[3+1*stride]=
  1434.     src[2+2*stride]=
  1435.     src[1+3*stride]=(t4 + t6 + 2*t5 + 2)>>2;
  1436.     src[3+2*stride]=
  1437.     src[2+3*stride]=(t5 + t7 + 2*t6 + 2)>>2;
  1438.     src[3+3*stride]=(t6 + 3*t7 + 2)>>2;
  1439. }
  1440. static void pred4x4_vertical_right_c(uint8_t *src, uint8_t *topright, int stride){
  1441.     const int lt= src[-1-1*stride];
  1442.     LOAD_TOP_EDGE    
  1443.     LOAD_LEFT_EDGE    
  1444. //    const __attribute__((unused)) int unu= l3;
  1445.     const int unu= l3;
  1446.     src[0+0*stride]=
  1447.     src[1+2*stride]=(lt + t0 + 1)>>1;
  1448.     src[1+0*stride]=
  1449.     src[2+2*stride]=(t0 + t1 + 1)>>1;
  1450.     src[2+0*stride]=
  1451.     src[3+2*stride]=(t1 + t2 + 1)>>1;
  1452.     src[3+0*stride]=(t2 + t3 + 1)>>1;
  1453.     src[0+1*stride]=
  1454.     src[1+3*stride]=(l0 + 2*lt + t0 + 2)>>2;
  1455.     src[1+1*stride]=
  1456.     src[2+3*stride]=(lt + 2*t0 + t1 + 2)>>2;
  1457.     src[2+1*stride]=
  1458.     src[3+3*stride]=(t0 + 2*t1 + t2 + 2)>>2;
  1459.     src[3+1*stride]=(t1 + 2*t2 + t3 + 2)>>2;
  1460.     src[0+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
  1461.     src[0+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
  1462. }
  1463. static void pred4x4_vertical_left_c(uint8_t *src, uint8_t *topright, int stride){
  1464.     LOAD_TOP_EDGE    
  1465.     LOAD_TOP_RIGHT_EDGE    
  1466. //    const __attribute__((unused)) int unu= t7;
  1467.     const int unu= t7;
  1468.     src[0+0*stride]=(t0 + t1 + 1)>>1;
  1469.     src[1+0*stride]=
  1470.     src[0+2*stride]=(t1 + t2 + 1)>>1;
  1471.     src[2+0*stride]=
  1472.     src[1+2*stride]=(t2 + t3 + 1)>>1;
  1473.     src[3+0*stride]=
  1474.     src[2+2*stride]=(t3 + t4+ 1)>>1;
  1475.     src[3+2*stride]=(t4 + t5+ 1)>>1;
  1476.     src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
  1477.     src[1+1*stride]=
  1478.     src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
  1479.     src[2+1*stride]=
  1480.     src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
  1481.     src[3+1*stride]=
  1482.     src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
  1483.     src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
  1484. }
  1485. static void pred4x4_horizontal_up_c(uint8_t *src, uint8_t *topright, int stride){
  1486.     LOAD_LEFT_EDGE    
  1487.     src[0+0*stride]=(l0 + l1 + 1)>>1;
  1488.     src[1+0*stride]=(l0 + 2*l1 + l2 + 2)>>2;
  1489.     src[2+0*stride]=
  1490.     src[0+1*stride]=(l1 + l2 + 1)>>1;
  1491.     src[3+0*stride]=
  1492.     src[1+1*stride]=(l1 + 2*l2 + l3 + 2)>>2;
  1493.     src[2+1*stride]=
  1494.     src[0+2*stride]=(l2 + l3 + 1)>>1;
  1495.     src[3+1*stride]=
  1496.     src[1+2*stride]=(l2 + 2*l3 + l3 + 2)>>2;
  1497.     src[3+2*stride]=
  1498.     src[1+3*stride]=
  1499.     src[0+3*stride]=
  1500.     src[2+2*stride]=
  1501.     src[2+3*stride]=
  1502.     src[3+3*stride]=l3;
  1503. }
  1504.     
  1505. static void pred4x4_horizontal_down_c(uint8_t *src, uint8_t *topright, int stride){
  1506.     const int lt= src[-1-1*stride];
  1507.     LOAD_TOP_EDGE    
  1508.     LOAD_LEFT_EDGE    
  1509. //    const __attribute__((unused)) int unu= t3;
  1510.     const int unu= t3;
  1511.     src[0+0*stride]=
  1512.     src[2+1*stride]=(lt + l0 + 1)>>1;
  1513.     src[1+0*stride]=
  1514.     src[3+1*stride]=(l0 + 2*lt + t0 + 2)>>2;
  1515.     src[2+0*stride]=(lt + 2*t0 + t1 + 2)>>2;
  1516.     src[3+0*stride]=(t0 + 2*t1 + t2 + 2)>>2;
  1517.     src[0+1*stride]=
  1518.     src[2+2*stride]=(l0 + l1 + 1)>>1;
  1519.     src[1+1*stride]=
  1520.     src[3+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
  1521.     src[0+2*stride]=
  1522.     src[2+3*stride]=(l1 + l2+ 1)>>1;
  1523.     src[1+2*stride]=
  1524.     src[3+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
  1525.     src[0+3*stride]=(l2 + l3 + 1)>>1;
  1526.     src[1+3*stride]=(l1 + 2*l2 + l3 + 2)>>2;
  1527. }
  1528. static void pred16x16_vertical_c(uint8_t *src, int stride){
  1529.     int i;
  1530.     const uint32_t a= ((uint32_t*)(src-stride))[0];
  1531.     const uint32_t b= ((uint32_t*)(src-stride))[1];
  1532.     const uint32_t c= ((uint32_t*)(src-stride))[2];
  1533.     const uint32_t d= ((uint32_t*)(src-stride))[3];
  1534.     
  1535.     for(i=0; i<16; i++){
  1536.         ((uint32_t*)(src+i*stride))[0]= a;
  1537.         ((uint32_t*)(src+i*stride))[1]= b;
  1538.         ((uint32_t*)(src+i*stride))[2]= c;
  1539.         ((uint32_t*)(src+i*stride))[3]= d;
  1540.     }
  1541. }
  1542. static void pred16x16_horizontal_c(uint8_t *src, int stride){
  1543.     int i;
  1544.     for(i=0; i<16; i++){
  1545.         ((uint32_t*)(src+i*stride))[0]=
  1546.         ((uint32_t*)(src+i*stride))[1]=
  1547.         ((uint32_t*)(src+i*stride))[2]=
  1548.         ((uint32_t*)(src+i*stride))[3]= src[-1+i*stride]*0x01010101;
  1549.     }
  1550. }
  1551. static void pred16x16_dc_c(uint8_t *src, int stride){
  1552.     int i, dc=0;
  1553.     for(i=0;i<16; i++){
  1554.         dc+= src[-1+i*stride];
  1555.     }
  1556.     
  1557.     for(i=0;i<16; i++){
  1558.         dc+= src[i-stride];
  1559.     }
  1560.     dc= 0x01010101*((dc + 16)>>5);
  1561.     for(i=0; i<16; i++){
  1562.         ((uint32_t*)(src+i*stride))[0]=
  1563.         ((uint32_t*)(src+i*stride))[1]=
  1564.         ((uint32_t*)(src+i*stride))[2]=
  1565.         ((uint32_t*)(src+i*stride))[3]= dc;
  1566.     }
  1567. }
  1568. static void pred16x16_left_dc_c(uint8_t *src, int stride){
  1569.     int i, dc=0;
  1570.     for(i=0;i<16; i++){
  1571.         dc+= src[-1+i*stride];
  1572.     }
  1573.     
  1574.     dc= 0x01010101*((dc + 8)>>4);
  1575.     for(i=0; i<16; i++){
  1576.         ((uint32_t*)(src+i*stride))[0]=
  1577.         ((uint32_t*)(src+i*stride))[1]=
  1578.         ((uint32_t*)(src+i*stride))[2]=
  1579.         ((uint32_t*)(src+i*stride))[3]= dc;
  1580.     }
  1581. }
  1582. static void pred16x16_top_dc_c(uint8_t *src, int stride){
  1583.     int i, dc=0;
  1584.     for(i=0;i<16; i++){
  1585.         dc+= src[i-stride];
  1586.     }
  1587.     dc= 0x01010101*((dc + 8)>>4);
  1588.     for(i=0; i<16; i++){
  1589.         ((uint32_t*)(src+i*stride))[0]=
  1590.         ((uint32_t*)(src+i*stride))[1]=
  1591.         ((uint32_t*)(src+i*stride))[2]=
  1592.         ((uint32_t*)(src+i*stride))[3]= dc;
  1593.     }
  1594. }
  1595. static void pred16x16_128_dc_c(uint8_t *src, int stride){
  1596.     int i;
  1597.     for(i=0; i<16; i++){
  1598.         ((uint32_t*)(src+i*stride))[0]=
  1599.         ((uint32_t*)(src+i*stride))[1]=
  1600.         ((uint32_t*)(src+i*stride))[2]=
  1601.         ((uint32_t*)(src+i*stride))[3]= 0x01010101U*128U;
  1602.     }
  1603. }
  1604. static inline void pred16x16_plane_compat_c(uint8_t *src, int stride, const int svq3){
  1605.   int i, j, k;
  1606.   int a;
  1607.   uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1608.   const uint8_t * const src0 = src+7-stride;
  1609.   const uint8_t *src1 = src+8*stride-1;
  1610.   const uint8_t *src2 = src1-2*stride;      // == src+6*stride-1;
  1611.   int H = src0[1] - src0[-1];
  1612.   int V = src1[0] - src2[ 0];
  1613.   for(k=2; k<=8; ++k) {
  1614.     src1 += stride; src2 -= stride;
  1615.     H += k*(src0[k] - src0[-k]);
  1616.     V += k*(src1[0] - src2[ 0]);
  1617.   }
  1618.   if(svq3){
  1619.     H = ( 5*(H/4) ) / 16;
  1620.     V = ( 5*(V/4) ) / 16;
  1621.     /* required for 100% accuracy */
  1622.     i = H; H = V; V = i;
  1623.   }else{
  1624.     H = ( 5*H+32 ) >> 6;
  1625.     V = ( 5*V+32 ) >> 6;
  1626.   }
  1627.   a = 16*(src1[0] + src2[16] + 1) - 7*(V+H);
  1628.   for(j=16; j>0; --j) {
  1629.     int b = a;
  1630.     a += V;
  1631.     for(i=-16; i<0; i+=4) {
  1632.       src[16+i] = cm[ (b    ) >> 5 ];
  1633.       src[17+i] = cm[ (b+  H) >> 5 ];
  1634.       src[18+i] = cm[ (b+2*H) >> 5 ];
  1635.       src[19+i] = cm[ (b+3*H) >> 5 ];
  1636.       b += 4*H;
  1637.     }
  1638.     src += stride;
  1639.   }
  1640. }
  1641. static void pred16x16_plane_c(uint8_t *src, int stride){
  1642.     pred16x16_plane_compat_c(src, stride, 0);
  1643. }
  1644. static void pred8x8_vertical_c(uint8_t *src, int stride){
  1645.     int i;
  1646.     const uint32_t a= ((uint32_t*)(src-stride))[0];
  1647.     const uint32_t b= ((uint32_t*)(src-stride))[1];
  1648.     
  1649.     for(i=0; i<8; i++){
  1650.         ((uint32_t*)(src+i*stride))[0]= a;
  1651.         ((uint32_t*)(src+i*stride))[1]= b;
  1652.     }
  1653. }
  1654. static void pred8x8_horizontal_c(uint8_t *src, int stride){
  1655.     int i;
  1656.     for(i=0; i<8; i++){
  1657.         ((uint32_t*)(src+i*stride))[0]=
  1658.         ((uint32_t*)(src+i*stride))[1]= src[-1+i*stride]*0x01010101;
  1659.     }
  1660. }
  1661. static void pred8x8_128_dc_c(uint8_t *src, int stride){
  1662.     int i;
  1663.     for(i=0; i<4; i++){
  1664.         ((uint32_t*)(src+i*stride))[0]= 
  1665.         ((uint32_t*)(src+i*stride))[1]= 0x01010101U*128U;
  1666.     }
  1667.     for(i=4; i<8; i++){
  1668.         ((uint32_t*)(src+i*stride))[0]= 
  1669.         ((uint32_t*)(src+i*stride))[1]= 0x01010101U*128U;
  1670.     }
  1671. }
  1672. static void pred8x8_left_dc_c(uint8_t *src, int stride){
  1673.     int i;
  1674.     int dc0, dc2;
  1675.     dc0=dc2=0;
  1676.     for(i=0;i<4; i++){
  1677.         dc0+= src[-1+i*stride];
  1678.         dc2+= src[-1+(i+4)*stride];
  1679.     }
  1680.     dc0= 0x01010101*((dc0 + 2)>>2);
  1681.     dc2= 0x01010101*((dc2 + 2)>>2);
  1682.     for(i=0; i<4; i++){
  1683.         ((uint32_t*)(src+i*stride))[0]=
  1684.         ((uint32_t*)(src+i*stride))[1]= dc0;
  1685.     }
  1686.     for(i=4; i<8; i++){
  1687.         ((uint32_t*)(src+i*stride))[0]=
  1688.         ((uint32_t*)(src+i*stride))[1]= dc2;
  1689.     }
  1690. }
  1691. static void pred8x8_top_dc_c(uint8_t *src, int stride){
  1692.     int i;
  1693.     int dc0, dc1;
  1694.     dc0=dc1=0;
  1695.     for(i=0;i<4; i++){
  1696.         dc0+= src[i-stride];
  1697.         dc1+= src[4+i-stride];
  1698.     }
  1699.     dc0= 0x01010101*((dc0 + 2)>>2);
  1700.     dc1= 0x01010101*((dc1 + 2)>>2);
  1701.     for(i=0; i<4; i++){
  1702.         ((uint32_t*)(src+i*stride))[0]= dc0;
  1703.         ((uint32_t*)(src+i*stride))[1]= dc1;
  1704.     }
  1705.     for(i=4; i<8; i++){
  1706.         ((uint32_t*)(src+i*stride))[0]= dc0;
  1707.         ((uint32_t*)(src+i*stride))[1]= dc1;
  1708.     }
  1709. }
  1710. static void pred8x8_dc_c(uint8_t *src, int stride){
  1711.     int i;
  1712.     int dc0, dc1, dc2, dc3;
  1713.     dc0=dc1=dc2=0;
  1714.     for(i=0;i<4; i++){
  1715.         dc0+= src[-1+i*stride] + src[i-stride];
  1716.         dc1+= src[4+i-stride];
  1717.         dc2+= src[-1+(i+4)*stride];
  1718.     }
  1719.     dc3= 0x01010101*((dc1 + dc2 + 4)>>3);
  1720.     dc0= 0x01010101*((dc0 + 4)>>3);
  1721.     dc1= 0x01010101*((dc1 + 2)>>2);
  1722.     dc2= 0x01010101*((dc2 + 2)>>2);
  1723.     for(i=0; i<4; i++){
  1724.         ((uint32_t*)(src+i*stride))[0]= dc0;
  1725.         ((uint32_t*)(src+i*stride))[1]= dc1;
  1726.     }
  1727.     for(i=4; i<8; i++){
  1728.         ((uint32_t*)(src+i*stride))[0]= dc2;
  1729.         ((uint32_t*)(src+i*stride))[1]= dc3;
  1730.     }
  1731. }
  1732. static void pred8x8_plane_c(uint8_t *src, int stride){
  1733.   int j, k;
  1734.   int a;
  1735.   uint8_t *cm = cropTbl + MAX_NEG_CROP;
  1736.   const uint8_t * const src0 = src+3-stride;
  1737.   const uint8_t *src1 = src+4*stride-1;
  1738.   const uint8_t *src2 = src1-2*stride;      // == src+2*stride-1;
  1739.   int H = src0[1] - src0[-1];
  1740.   int V = src1[0] - src2[ 0];
  1741.   for(k=2; k<=4; ++k) {
  1742.     src1 += stride; src2 -= stride;
  1743.     H += k*(src0[k] - src0[-k]);
  1744.     V += k*(src1[0] - src2[ 0]);
  1745.   }
  1746.   H = ( 17*H+16 ) >> 5;
  1747.   V = ( 17*V+16 ) >> 5;
  1748.   a = 16*(src1[0] + src2[8]+1) - 3*(V+H);
  1749.   for(j=8; j>0; --j) {
  1750.     int b = a;
  1751.     a += V;
  1752.     src[0] = cm[ (b    ) >> 5 ];
  1753.     src[1] = cm[ (b+  H) >> 5 ];
  1754.     src[2] = cm[ (b+2*H) >> 5 ];
  1755.     src[3] = cm[ (b+3*H) >> 5 ];
  1756.     src[4] = cm[ (b+4*H) >> 5 ];
  1757.     src[5] = cm[ (b+5*H) >> 5 ];
  1758.     src[6] = cm[ (b+6*H) >> 5 ];
  1759.     src[7] = cm[ (b+7*H) >> 5 ];
  1760.     src += stride;
  1761.   }
  1762. }
  1763. static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list,
  1764.                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
  1765.                            int src_x_offset, int src_y_offset,
  1766.                            qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op){
  1767.     MpegEncContext * const s = &h->s;
  1768.     const int mx= h->mv_cache[list][ scan8[n] ][0] + src_x_offset*8;
  1769.     const int my= h->mv_cache[list][ scan8[n] ][1] + src_y_offset*8;
  1770.     const int luma_xy= (mx&3) + ((my&3)<<2);
  1771.     uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*s->linesize;
  1772.     uint8_t * src_cb= pic->data[1] + (mx>>3) + (my>>3)*s->uvlinesize;
  1773.     uint8_t * src_cr= pic->data[2] + (mx>>3) + (my>>3)*s->uvlinesize;
  1774.     int extra_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; //FIXME increase edge?, IMHO not worth it
  1775.     int extra_height= extra_width;
  1776.     int emu=0;
  1777.     const int full_mx= mx>>2;
  1778.     const int full_my= my>>2;
  1779.     
  1780.     assert(pic->data[0]);
  1781.     
  1782.     if(mx&7) extra_width -= 3;
  1783.     if(my&7) extra_height -= 3;
  1784.     
  1785.     if(   full_mx < 0-extra_width 
  1786.        || full_my < 0-extra_height 
  1787.        || full_mx + 16/*FIXME*/ > s->width + extra_width 
  1788.        || full_my + 16/*FIXME*/ > s->height + extra_height){
  1789.         ff_emulated_edge_mc(s->edge_emu_buffer, src_y - 2 - 2*s->linesize, s->linesize, 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, s->width, s->height);
  1790.             src_y= s->edge_emu_buffer + 2 + 2*s->linesize;
  1791.         emu=1;
  1792.     }
  1793.     
  1794.     qpix_op[luma_xy](dest_y, src_y, s->linesize); //FIXME try variable height perhaps?
  1795.     if(!square){
  1796.         qpix_op[luma_xy](dest_y + delta, src_y + delta, s->linesize);
  1797.     }
  1798.     
  1799.     if(s->flags&CODEC_FLAG_GRAY) return;
  1800.     
  1801.     if(emu){
  1802.         ff_emulated_edge_mc(s->edge_emu_buffer, src_cb, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1);
  1803.             src_cb= s->edge_emu_buffer;
  1804.     }
  1805.     chroma_op(dest_cb, src_cb, s->uvlinesize, chroma_height, mx&7, my&7);
  1806.     if(emu){
  1807.         ff_emulated_edge_mc(s->edge_emu_buffer, src_cr, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1);
  1808.             src_cr= s->edge_emu_buffer;
  1809.     }
  1810.     chroma_op(dest_cr, src_cr, s->uvlinesize, chroma_height, mx&7, my&7);
  1811. }
  1812. static inline void mc_part(H264Context *h, int n, int square, int chroma_height, int delta,
  1813.                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
  1814.                            int x_offset, int y_offset,
  1815.                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
  1816.                            qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg,
  1817.                            int list0, int list1){
  1818.     MpegEncContext * const s = &h->s;
  1819.     qpel_mc_func *qpix_op=  qpix_put;
  1820.     h264_chroma_mc_func chroma_op= chroma_put;
  1821.     
  1822.     dest_y  += 2*x_offset + 2*y_offset*s->  linesize;
  1823.     dest_cb +=   x_offset +   y_offset*s->uvlinesize;
  1824.     dest_cr +=   x_offset +   y_offset*s->uvlinesize;
  1825.     x_offset += 8*s->mb_x;
  1826.     y_offset += 8*s->mb_y;
  1827.     
  1828.     if(list0){
  1829.         Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ];
  1830.         mc_dir_part(h, ref, n, square, chroma_height, delta, 0,
  1831.                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1832.                            qpix_op, chroma_op);
  1833.         qpix_op=  qpix_avg;
  1834.         chroma_op= chroma_avg;
  1835.     }
  1836.     if(list1){
  1837.         Picture *ref= &h->ref_list[1][ h->ref_cache[1][ scan8[n] ] ];
  1838.         mc_dir_part(h, ref, n, square, chroma_height, delta, 1,
  1839.                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1840.                            qpix_op, chroma_op);
  1841.     }
  1842. }
  1843. static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
  1844.                       qpel_mc_func (*qpix_put)[16], h264_chroma_mc_func (*chroma_put),
  1845.                       qpel_mc_func (*qpix_avg)[16], h264_chroma_mc_func (*chroma_avg)){
  1846.     MpegEncContext * const s = &h->s;
  1847.     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
  1848.     const int mb_type= s->current_picture.mb_type[mb_xy];
  1849.     
  1850.     assert(IS_INTER(mb_type));
  1851.     
  1852.     if(IS_16X16(mb_type)){
  1853.         mc_part(h, 0, 1, 8, 0, dest_y, dest_cb, dest_cr, 0, 0,
  1854.                 qpix_put[0], chroma_put[0], qpix_avg[0], chroma_avg[0],
  1855.                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
  1856.     }else if(IS_16X8(mb_type)){
  1857.         mc_part(h, 0, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 0,
  1858.                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
  1859.                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
  1860.         mc_part(h, 8, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 4,
  1861.                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
  1862.                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
  1863.     }else if(IS_8X16(mb_type)){
  1864.         mc_part(h, 0, 0, 8, 8*s->linesize, dest_y, dest_cb, dest_cr, 0, 0,
  1865.                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
  1866.                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
  1867.         mc_part(h, 4, 0, 8, 8*s->linesize, dest_y, dest_cb, dest_cr, 4, 0,
  1868.                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
  1869.                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
  1870.     }else{
  1871.         int i;
  1872.         
  1873.         assert(IS_8X8(mb_type));
  1874.         for(i=0; i<4; i++){
  1875.             const int sub_mb_type= h->sub_mb_type[i];
  1876.             const int n= 4*i;
  1877.             int x_offset= (i&1)<<2;
  1878.             int y_offset= (i&2)<<1;
  1879.             if(IS_SUB_8X8(sub_mb_type)){
  1880.                 mc_part(h, n, 1, 4, 0, dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1881.                     qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
  1882.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1883.             }else if(IS_SUB_8X4(sub_mb_type)){
  1884.                 mc_part(h, n  , 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1885.                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
  1886.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1887.                 mc_part(h, n+2, 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset+2,
  1888.                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
  1889.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1890.             }else if(IS_SUB_4X8(sub_mb_type)){
  1891.                 mc_part(h, n  , 0, 4, 4*s->linesize, dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1892.                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
  1893.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1894.                 mc_part(h, n+1, 0, 4, 4*s->linesize, dest_y, dest_cb, dest_cr, x_offset+2, y_offset,
  1895.                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
  1896.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1897.             }else{
  1898.                 int j;
  1899.                 assert(IS_SUB_4X4(sub_mb_type));
  1900.                 for(j=0; j<4; j++){
  1901.                     int sub_x_offset= x_offset + 2*(j&1);
  1902.                     int sub_y_offset= y_offset +   (j&2);
  1903.                     mc_part(h, n+j, 1, 2, 0, dest_y, dest_cb, dest_cr, sub_x_offset, sub_y_offset,
  1904.                         qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
  1905.                         IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1906.                 }
  1907.             }
  1908.         }
  1909.     }
  1910. }
  1911. static void decode_init_vlc(H264Context *h){
  1912.     static int done = 0;
  1913.     if (!done) {
  1914.         int i;
  1915.         done = 1;
  1916.         init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5, 
  1917.                  &chroma_dc_coeff_token_len [0], 1, 1,
  1918.                  &chroma_dc_coeff_token_bits[0], 1, 1);
  1919.         for(i=0; i<4; i++){
  1920.             init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17, 
  1921.                      &coeff_token_len [i][0], 1, 1,
  1922.                      &coeff_token_bits[i][0], 1, 1);
  1923.         }
  1924.         for(i=0; i<3; i++){
  1925.             init_vlc(&chroma_dc_total_zeros_vlc[i], CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
  1926.                      &chroma_dc_total_zeros_len [i][0], 1, 1,
  1927.                      &chroma_dc_total_zeros_bits[i][0], 1, 1);
  1928.         }
  1929.         for(i=0; i<15; i++){
  1930.             init_vlc(&total_zeros_vlc[i], TOTAL_ZEROS_VLC_BITS, 16, 
  1931.                      &total_zeros_len [i][0], 1, 1,
  1932.                      &total_zeros_bits[i][0], 1, 1);
  1933.         }
  1934.         for(i=0; i<6; i++){
  1935.             init_vlc(&run_vlc[i], RUN_VLC_BITS, 7, 
  1936.                      &run_len [i][0], 1, 1,
  1937.                      &run_bits[i][0], 1, 1);
  1938.         }
  1939.         init_vlc(&run7_vlc, RUN7_VLC_BITS, 16, 
  1940.                  &run_len [6][0], 1, 1,
  1941.                  &run_bits[6][0], 1, 1);
  1942.     }
  1943. }
  1944. /**
  1945.  * Sets the intra prediction function pointers.
  1946.  */
  1947. static void init_pred_ptrs(H264Context *h){
  1948. //    MpegEncContext * const s = &h->s;
  1949.     h->pred4x4[VERT_PRED           ]= pred4x4_vertical_c;
  1950.     h->pred4x4[HOR_PRED            ]= pred4x4_horizontal_c;
  1951.     h->pred4x4[DC_PRED             ]= pred4x4_dc_c;
  1952.     h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_c;
  1953.     h->pred4x4[DIAG_DOWN_RIGHT_PRED]= pred4x4_down_right_c;
  1954.     h->pred4x4[VERT_RIGHT_PRED     ]= pred4x4_vertical_right_c;
  1955.     h->pred4x4[HOR_DOWN_PRED       ]= pred4x4_horizontal_down_c;
  1956.     h->pred4x4[VERT_LEFT_PRED      ]= pred4x4_vertical_left_c;
  1957.     h->pred4x4[HOR_UP_PRED         ]= pred4x4_horizontal_up_c;
  1958.     h->pred4x4[LEFT_DC_PRED        ]= pred4x4_left_dc_c;
  1959.     h->pred4x4[TOP_DC_PRED         ]= pred4x4_top_dc_c;
  1960.     h->pred4x4[DC_128_PRED         ]= pred4x4_128_dc_c;
  1961.     h->pred8x8[DC_PRED8x8     ]= pred8x8_dc_c;
  1962.     h->pred8x8[VERT_PRED8x8   ]= pred8x8_vertical_c;
  1963.     h->pred8x8[HOR_PRED8x8    ]= pred8x8_horizontal_c;
  1964.     h->pred8x8[PLANE_PRED8x8  ]= pred8x8_plane_c;
  1965.     h->pred8x8[LEFT_DC_PRED8x8]= pred8x8_left_dc_c;
  1966.     h->pred8x8[TOP_DC_PRED8x8 ]= pred8x8_top_dc_c;
  1967.     h->pred8x8[DC_128_PRED8x8 ]= pred8x8_128_dc_c;
  1968.     h->pred16x16[DC_PRED8x8     ]= pred16x16_dc_c;
  1969.     h->pred16x16[VERT_PRED8x8   ]= pred16x16_vertical_c;
  1970.     h->pred16x16[HOR_PRED8x8    ]= pred16x16_horizontal_c;
  1971.     h->pred16x16[PLANE_PRED8x8  ]= pred16x16_plane_c;
  1972.     h->pred16x16[LEFT_DC_PRED8x8]= pred16x16_left_dc_c;
  1973.     h->pred16x16[TOP_DC_PRED8x8 ]= pred16x16_top_dc_c;
  1974.     h->pred16x16[DC_128_PRED8x8 ]= pred16x16_128_dc_c;
  1975. }
  1976. static void free_tables(H264Context *h){
  1977.     av_freep(&h->intra4x4_pred_mode);
  1978.     av_freep(&h->chroma_pred_mode_table);
  1979.     av_freep(&h->cbp_table);
  1980.     av_freep(&h->mvd_table[0]);
  1981.     av_freep(&h->mvd_table[1]);
  1982.     av_freep(&h->non_zero_count);
  1983.     av_freep(&h->slice_table_base);
  1984.     av_freep(&h->top_border);
  1985.     h->slice_table= NULL;
  1986.     av_freep(&h->mb2b_xy);
  1987.     av_freep(&h->mb2b8_xy);
  1988. }
  1989. /**
  1990.  * allocates tables.
  1991.  * needs widzh/height
  1992.  */
  1993. static int alloc_tables(H264Context *h){
  1994.     MpegEncContext * const s = &h->s;
  1995.     const int big_mb_num= s->mb_stride * (s->mb_height+1);
  1996.     int x,y;
  1997.     CHECKED_ALLOCZ(h->intra4x4_pred_mode, big_mb_num * 8  * sizeof(uint8_t))
  1998.     CHECKED_ALLOCZ(h->non_zero_count    , big_mb_num * 16 * sizeof(uint8_t))
  1999.     CHECKED_ALLOCZ(h->slice_table_base  , big_mb_num * sizeof(uint8_t))
  2000.     CHECKED_ALLOCZ(h->top_border       , s->mb_width * (16+8+8) * sizeof(uint8_t))
  2001.     if( h->pps.cabac ) {
  2002.         CHECKED_ALLOCZ(h->chroma_pred_mode_table, big_mb_num * sizeof(uint8_t))
  2003.         CHECKED_ALLOCZ(h->cbp_table, big_mb_num * sizeof(uint16_t))
  2004.         CHECKED_ALLOCZ(h->mvd_table[0], 32*big_mb_num * sizeof(uint16_t));
  2005.         CHECKED_ALLOCZ(h->mvd_table[1], 32*big_mb_num * sizeof(uint16_t));
  2006.     }
  2007.     memset(h->slice_table_base, -1, big_mb_num  * sizeof(uint8_t));
  2008.     h->slice_table= h->slice_table_base + s->mb_stride + 1;
  2009.     CHECKED_ALLOCZ(h->mb2b_xy  , big_mb_num * sizeof(uint16_t));
  2010.     CHECKED_ALLOCZ(h->mb2b8_xy , big_mb_num * sizeof(uint16_t));
  2011.     for(y=0; y<s->mb_height; y++){
  2012.         for(x=0; x<s->mb_width; x++){
  2013.             const int mb_xy= x + y*s->mb_stride;
  2014.             const int b_xy = 4*x + 4*y*h->b_stride;
  2015.             const int b8_xy= 2*x + 2*y*h->b8_stride;
  2016.         
  2017.             h->mb2b_xy [mb_xy]= b_xy;
  2018.             h->mb2b8_xy[mb_xy]= b8_xy;
  2019.         }
  2020.     }
  2021.     
  2022.     return 0;
  2023. fail:
  2024.     free_tables(h);
  2025.     return -1;
  2026. }
  2027. static void common_init(H264Context *h){
  2028.     MpegEncContext * const s = &h->s;
  2029.     s->width = s->avctx->width;
  2030.     s->height = s->avctx->height;
  2031.     s->codec_id= s->avctx->codec->id;
  2032.     
  2033.     init_pred_ptrs(h);
  2034.     s->unrestricted_mv=1;
  2035.     s->decode=1; //FIXME
  2036. }
  2037. static int decode_init(AVCodecContext *avctx){
  2038.     H264Context *h= avctx->priv_data;
  2039.     MpegEncContext * const s = &h->s;
  2040.     MPV_decode_defaults(s);
  2041.     
  2042.     s->avctx = avctx;
  2043.     common_init(h);
  2044.     s->out_format = FMT_H264;
  2045.     s->workaround_bugs= avctx->workaround_bugs;
  2046.     // set defaults
  2047. //    s->decode_mb= ff_h263_decode_mb;
  2048.     s->low_delay= 1;
  2049.     avctx->pix_fmt= PIX_FMT_YUV420P;
  2050.     decode_init_vlc(h);
  2051.     
  2052.     return 0;
  2053. }
  2054. static void frame_start(H264Context *h){
  2055.     MpegEncContext * const s = &h->s;
  2056.     int i;
  2057.     MPV_frame_start(s, s->avctx);
  2058.     ff_er_frame_start(s);
  2059.     h->mmco_index=0;
  2060.     assert(s->linesize && s->uvlinesize);
  2061.     for(i=0; i<16; i++){
  2062.         h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3);
  2063.         h->chroma_subblock_offset[i]= 2*((scan8[i] - scan8[0])&7) + 2*s->uvlinesize*((scan8[i] - scan8[0])>>3);
  2064.     }
  2065.     for(i=0; i<4; i++){
  2066.         h->block_offset[16+i]=
  2067.         h->block_offset[20+i]= 4*((scan8[i] - scan8[0])&7) + 4*s->uvlinesize*((scan8[i] - scan8[0])>>3);
  2068.     }
  2069. //    s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1;
  2070. }
  2071. static inline void backup_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize){
  2072.     MpegEncContext * const s = &h->s;
  2073.     int i;
  2074.     
  2075.     src_y  -=   linesize;
  2076.     src_cb -= uvlinesize;
  2077.     src_cr -= uvlinesize;
  2078.     h->left_border[0]= h->top_border[s->mb_x][15];
  2079.     for(i=1; i<17; i++){
  2080.         h->left_border[i]= src_y[15+i*  linesize];
  2081.     }
  2082.     
  2083.     *(uint64_t*)(h->top_border[s->mb_x]+0)= *(uint64_t*)(src_y +  16*linesize);
  2084.     *(uint64_t*)(h->top_border[s->mb_x]+8)= *(uint64_t*)(src_y +8+16*linesize);
  2085.     if(!(s->flags&CODEC_FLAG_GRAY)){
  2086.         h->left_border[17  ]= h->top_border[s->mb_x][16+7];
  2087.         h->left_border[17+9]= h->top_border[s->mb_x][24+7];
  2088.         for(i=1; i<9; i++){
  2089.             h->left_border[i+17  ]= src_cb[7+i*uvlinesize];
  2090.             h->left_border[i+17+9]= src_cr[7+i*uvlinesize];
  2091.         }
  2092.         *(uint64_t*)(h->top_border[s->mb_x]+16)= *(uint64_t*)(src_cb+8*uvlinesize);
  2093.         *(uint64_t*)(h->top_border[s->mb_x]+24)= *(uint64_t*)(src_cr+8*uvlinesize);
  2094.     }
  2095. }
  2096. static inline void xchg_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int xchg){
  2097.     MpegEncContext * const s = &h->s;
  2098.     int temp8, i;
  2099.     uint64_t temp64;
  2100.     src_y  -=   linesize + 1;
  2101.     src_cb -= uvlinesize + 1;
  2102.     src_cr -= uvlinesize + 1;
  2103. #define XCHG(a,b,t,xchg)
  2104. t= a;
  2105. if(xchg)
  2106.     a= b;
  2107. b= t;
  2108.     
  2109.     for(i=0; i<17; i++){
  2110.         XCHG(h->left_border[i     ], src_y [i*  linesize], temp8, xchg);
  2111.     }
  2112.     
  2113.     XCHG(*(uint64_t*)(h->top_border[s->mb_x]+0), *(uint64_t*)(src_y +1), temp64, xchg);
  2114.     XCHG(*(uint64_t*)(h->top_border[s->mb_x]+8), *(uint64_t*)(src_y +9), temp64, 1);
  2115.     if(!(s->flags&CODEC_FLAG_GRAY)){
  2116.         for(i=0; i<9; i++){
  2117.             XCHG(h->left_border[i+17  ], src_cb[i*uvlinesize], temp8, xchg);
  2118.             XCHG(h->left_border[i+17+9], src_cr[i*uvlinesize], temp8, xchg);
  2119.         }
  2120.         XCHG(*(uint64_t*)(h->top_border[s->mb_x]+16), *(uint64_t*)(src_cb+1), temp64, 1);
  2121.         XCHG(*(uint64_t*)(h->top_border[s->mb_x]+24), *(uint64_t*)(src_cr+1), temp64, 1);
  2122.     }
  2123. }
  2124. static void hl_decode_mb(H264Context *h){
  2125.     MpegEncContext * const s = &h->s;
  2126.     const int mb_x= s->mb_x;
  2127.     const int mb_y= s->mb_y;
  2128.     const int mb_xy= mb_x + mb_y*s->mb_stride;
  2129.     const int mb_type= s->current_picture.mb_type[mb_xy];
  2130.     uint8_t  *dest_y, *dest_cb, *dest_cr;
  2131.     int linesize, uvlinesize /*dct_offset*/;
  2132.     int i;
  2133.     if(!s->decode)
  2134.         return;
  2135.     if(s->mb_skiped){
  2136.     }
  2137.     dest_y  = s->current_picture.data[0] + (mb_y * 16* s->linesize  ) + mb_x * 16;
  2138.     dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
  2139.     dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
  2140.     if (h->mb_field_decoding_flag) {
  2141.         linesize = s->linesize * 2;
  2142.         uvlinesize = s->uvlinesize * 2;
  2143.         if(mb_y&1){ //FIXME move out of this func?
  2144.             dest_y -= s->linesize*15;
  2145.             dest_cb-= s->linesize*7;
  2146.             dest_cr-= s->linesize*7;
  2147.         }
  2148.     } else {
  2149.         linesize = s->linesize;
  2150.         uvlinesize = s->uvlinesize;
  2151. //        dct_offset = s->linesize * 16;
  2152.     }
  2153.     if(IS_INTRA(mb_type)){
  2154.         if(h->deblocking_filter)
  2155.             xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 1);
  2156.         if(!(s->flags&CODEC_FLAG_GRAY)){
  2157.             h->pred8x8[ h->chroma_pred_mode ](dest_cb, uvlinesize);
  2158.             h->pred8x8[ h->chroma_pred_mode ](dest_cr, uvlinesize);
  2159.         }
  2160.         if(IS_INTRA4x4(mb_type)){
  2161.             if(!s->encoding){
  2162.                 for(i=0; i<16; i++){
  2163.                     uint8_t * const ptr= dest_y + h->block_offset[i];
  2164.                     uint8_t *topright= ptr + 4 - linesize;
  2165.                     const int topright_avail= (h->topright_samples_available<<i)&0x8000;
  2166.                     const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
  2167.                     int tr;
  2168.                     if(!topright_avail){
  2169.                         tr= ptr[3 - linesize]*0x01010101;
  2170.                         topright= (uint8_t*) &tr;
  2171.                     }else if(i==5 && h->deblocking_filter){
  2172.                         tr= *(uint32_t*)h->top_border[mb_x+1];
  2173.                         topright= (uint8_t*) &tr;
  2174.                     }
  2175.                     h->pred4x4[ dir ](ptr, topright, linesize);
  2176.                     if(h->non_zero_count_cache[ scan8[i] ]){
  2177.                         if(s->codec_id == CODEC_ID_H264)
  2178.                             h264_add_idct_c(ptr, h->mb + i*16, linesize);
  2179.                         else
  2180.                             svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0);
  2181.                     }
  2182.                 }
  2183.             }
  2184.         }else{
  2185.             h->pred16x16[ h->intra16x16_pred_mode ](dest_y , linesize);
  2186.             if(s->codec_id == CODEC_ID_H264)
  2187.                 h264_luma_dc_dequant_idct_c(h->mb, s->qscale);
  2188.             else
  2189.                 svq3_luma_dc_dequant_idct_c(h->mb, s->qscale);
  2190.         }
  2191.         if(h->deblocking_filter)
  2192.             xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 0);
  2193.     }else if(s->codec_id == CODEC_ID_H264){
  2194.         hl_motion(h, dest_y, dest_cb, dest_cr,
  2195.                   s->dsp.put_h264_qpel_pixels_tab, s->dsp.put_h264_chroma_pixels_tab, 
  2196.                   s->dsp.avg_h264_qpel_pixels_tab, s->dsp.avg_h264_chroma_pixels_tab);
  2197.     }
  2198.     if(!IS_INTRA4x4(mb_type)){
  2199.         if(s->codec_id == CODEC_ID_H264){
  2200.             for(i=0; i<16; i++){
  2201.                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ //FIXME benchmark weird rule, & below
  2202.                     uint8_t * const ptr= dest_y + h->block_offset[i];
  2203.                     h264_add_idct_c(ptr, h->mb + i*16, linesize);
  2204.                 }
  2205.             }
  2206.         }else{
  2207.             for(i=0; i<16; i++){
  2208.                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ //FIXME benchmark weird rule, & below
  2209.                     uint8_t * const ptr= dest_y + h->block_offset[i];
  2210.                     svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, IS_INTRA(mb_type) ? 1 : 0);
  2211.                 }
  2212.             }
  2213.         }
  2214.     }
  2215.     if(!(s->flags&CODEC_FLAG_GRAY)){
  2216.         chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp);
  2217.         chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp);
  2218.         if(s->codec_id == CODEC_ID_H264){
  2219.             for(i=16; i<16+4; i++){
  2220.                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
  2221.                     uint8_t * const ptr= dest_cb + h->block_offset[i];
  2222.                     h264_add_idct_c(ptr, h->mb + i*16, uvlinesize);
  2223.                 }
  2224.             }
  2225.             for(i=20; i<20+4; i++){
  2226.                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
  2227.                     uint8_t * const ptr= dest_cr + h->block_offset[i];
  2228.                     h264_add_idct_c(ptr, h->mb + i*16, uvlinesize);
  2229.                 }
  2230.             }
  2231.         }else{
  2232.             for(i=16; i<16+4; i++){
  2233.                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
  2234.                     uint8_t * const ptr= dest_cb + h->block_offset[i];
  2235.                     svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2);
  2236.                 }
  2237.             }
  2238.             for(i=20; i<20+4; i++){
  2239.                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
  2240.                     uint8_t * const ptr= dest_cr + h->block_offset[i];
  2241.                     svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2);
  2242.                 }
  2243.             }
  2244.         }
  2245.     }
  2246.     if(h->deblocking_filter) {
  2247.         backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize);
  2248.         filter_mb(h, mb_x, mb_y, dest_y, dest_cb, dest_cr);
  2249.     }
  2250. }
  2251. //AS by ty
  2252. static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
  2253.     const int qmul= svq3_dequant_coeff[qp];
  2254. #define stride 16
  2255.     int i;
  2256.     int temp[16];
  2257.     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
  2258.     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
  2259.     for(i=0; i<4; i++){
  2260.         const int offset= y_offset[i];
  2261.         const int z0= 13*(block[offset+stride*0] +    block[offset+stride*4]);
  2262.         const int z1= 13*(block[offset+stride*0] -    block[offset+stride*4]);
  2263.         const int z2=  7* block[offset+stride*1] - 17*block[offset+stride*5];
  2264.         const int z3= 17* block[offset+stride*1] +  7*block[offset+stride*5];
  2265.         temp[4*i+0]= z0+z3;
  2266.         temp[4*i+1]= z1+z2;
  2267.         temp[4*i+2]= z1-z2;
  2268.         temp[4*i+3]= z0-z3;
  2269.     }
  2270.     for(i=0; i<4; i++){
  2271.         const int offset= x_offset[i];
  2272.         const int z0= 13*(temp[4*0+i] +    temp[4*2+i]);
  2273.         const int z1= 13*(temp[4*0+i] -    temp[4*2+i]);
  2274.         const int z2=  7* temp[4*1+i] - 17*temp[4*3+i];
  2275.         const int z3= 17* temp[4*1+i] +  7*temp[4*3+i];
  2276.         block[stride*0 +offset]= ((z0 + z3)*qmul + 0x80000)>>20;
  2277.         block[stride*2 +offset]= ((z1 + z2)*qmul + 0x80000)>>20;
  2278.         block[stride*8 +offset]= ((z1 - z2)*qmul + 0x80000)>>20;
  2279.         block[stride*10+offset]= ((z0 - z3)*qmul + 0x80000)>>20;
  2280.     }
  2281. }
  2282. #undef stride
  2283. static void svq3_add_idct_c (uint8_t *dst, DCTELEM *block, int stride, int qp, int dc){
  2284.     const int qmul= svq3_dequant_coeff[qp];
  2285.     int i;
  2286.     uint8_t *cm = cropTbl + MAX_NEG_CROP;
  2287.     if (dc) {
  2288.         dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
  2289.         block[0] = 0;
  2290.     }
  2291.     for (i=0; i < 4; i++) {
  2292.         const int z0= 13*(block[0 + 4*i] +    block[2 + 4*i]);
  2293.         const int z1= 13*(block[0 + 4*i] -    block[2 + 4*i]);
  2294.         const int z2=  7* block[1 + 4*i] - 17*block[3 + 4*i];
  2295.         const int z3= 17* block[1 + 4*i] +  7*block[3 + 4*i];
  2296.         block[0 + 4*i]= z0 + z3;
  2297.         block[1 + 4*i]= z1 + z2;
  2298.         block[2 + 4*i]= z1 - z2;
  2299.         block[3 + 4*i]= z0 - z3;
  2300.     }
  2301.     for (i=0; i < 4; i++) {
  2302.         const int z0= 13*(block[i + 4*0] +    block[i + 4*2]);
  2303.         const int z1= 13*(block[i + 4*0] -    block[i + 4*2]);
  2304.         const int z2=  7* block[i + 4*1] - 17*block[i + 4*3];
  2305.         const int z3= 17* block[i + 4*1] +  7*block[i + 4*3];
  2306.         const int rr= (dc + 0x80000);
  2307.         dst[i + stride*0]= cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
  2308.         dst[i + stride*1]= cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
  2309.         dst[i + stride*2]= cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
  2310.         dst[i + stride*3]= cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
  2311.     }
  2312. }
  2313. //AE by ty
  2314. /**
  2315.  * fills the default_ref_list.
  2316.  */
  2317. static int fill_default_ref_list(H264Context *h){
  2318.     MpegEncContext * const s = &h->s;
  2319.     int i;
  2320.     Picture sorted_short_ref[16];
  2321.     
  2322.     if(h->slice_type==B_TYPE){
  2323.         int out_i;
  2324.         int limit= -1;
  2325.         for(out_i=0; out_i<h->short_ref_count; out_i++){
  2326.             int best_i=-1;
  2327.             int best_poc=-1;
  2328.             for(i=0; i<h->short_ref_count; i++){
  2329.                 const int poc= h->short_ref[i]->poc;
  2330.                 if(poc > limit && poc < best_poc){
  2331.                     best_poc= poc;
  2332.                     best_i= i;
  2333.                 }
  2334.             }
  2335.             
  2336.             assert(best_i != -1);
  2337.             
  2338.             limit= best_poc;
  2339.             sorted_short_ref[out_i]= *h->short_ref[best_i];
  2340.         }
  2341.     }
  2342.     if(s->picture_structure == PICT_FRAME){
  2343.         if(h->slice_type==B_TYPE){
  2344.             const int current_poc= s->current_picture_ptr->poc;
  2345.             int list;
  2346.             for(list=0; list<2; list++){
  2347.                 int index=0;
  2348.                 for(i=0; i<h->short_ref_count && index < h->ref_count[list]; i++){
  2349.                     const int i2= list ? h->short_ref_count - i - 1 : i;
  2350.                     const int poc= sorted_short_ref[i2].poc;
  2351.                     
  2352.                     if(sorted_short_ref[i2].reference != 3) continue; //FIXME refernce field shit
  2353.                     if((list==1 && poc > current_poc) || (list==0 && poc < current_poc)){
  2354.                         h->default_ref_list[list][index  ]= sorted_short_ref[i2];
  2355.                         h->default_ref_list[list][index++].pic_id= sorted_short_ref[i2].frame_num;
  2356.                     }
  2357.                 }
  2358.                 for(i=0; i<h->long_ref_count && index < h->ref_count[ list ]; i++){
  2359.                     if(h->long_ref[i]->reference != 3) continue;
  2360.                     h->default_ref_list[ list ][index  ]= *h->long_ref[i];
  2361.                     h->default_ref_list[ list ][index++].pic_id= i;;
  2362.                 }
  2363.                 
  2364.                 if(h->long_ref_count > 1 && h->short_ref_count==0){
  2365.                     Picture temp= h->default_ref_list[1][0];
  2366.                     h->default_ref_list[1][0] = h->default_ref_list[1][1];
  2367.                     h->default_ref_list[1][0] = temp;
  2368.                 }
  2369.                 if(index < h->ref_count[ list ])
  2370.                     memset(&h->default_ref_list[list][index], 0, sizeof(Picture)*(h->ref_count[ list ] - index));
  2371.             }
  2372.         }else{
  2373.             int index=0;
  2374.             for(i=0; i<h->short_ref_count && index < h->ref_count[0]; i++){
  2375.                 if(h->short_ref[i]->reference != 3) continue; //FIXME refernce field shit
  2376.                 h->default_ref_list[0][index  ]= *h->short_ref[i];
  2377.                 h->default_ref_list[0][index++].pic_id= h->short_ref[i]->frame_num;
  2378.             }
  2379.             for(i=0; i<h->long_ref_count && index < h->ref_count[0]; i++){
  2380.                 if(h->long_ref[i]->reference != 3) continue;
  2381.                 h->default_ref_list[0][index  ]= *h->long_ref[i];
  2382.                 h->default_ref_list[0][index++].pic_id= i;;
  2383.             }
  2384.             if(index < h->ref_count[0])
  2385.                 memset(&h->default_ref_list[0][index], 0, sizeof(Picture)*(h->ref_count[0] - index));
  2386.         }
  2387.     }else{ //FIELD
  2388.         if(h->slice_type==B_TYPE){
  2389.         }else{
  2390.             //FIXME second field balh
  2391.         }
  2392.     }
  2393.     return 0;
  2394. }
  2395. static int decode_ref_pic_list_reordering(H264Context *h){
  2396.     MpegEncContext * const s = &h->s;
  2397.     int list;
  2398.     
  2399.     if(h->slice_type==I_TYPE || h->slice_type==SI_TYPE) return 0; //FIXME move beofre func
  2400.     
  2401.     for(list=0; list<2; list++){
  2402.         memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]);
  2403.         if(get_bits1(&s->gb)){
  2404.             int pred= h->curr_pic_num;
  2405.             int index;
  2406.             for(index=0; ; index++){
  2407.                 int reordering_of_pic_nums_idc= get_ue_golomb(&s->gb);
  2408.                 int pic_id;
  2409.                 int i;
  2410.                 
  2411.                 
  2412.                 if(index >= h->ref_count[list]){
  2413.                     av_log(h->s.avctx, AV_LOG_ERROR, "reference count overflown");
  2414.                     return -1;
  2415.                 }
  2416.                 
  2417.                 if(reordering_of_pic_nums_idc<3){
  2418.                     if(reordering_of_pic_nums_idc<2){
  2419.                         const int abs_diff_pic_num= get_ue_golomb(&s->gb) + 1;
  2420.                         if(abs_diff_pic_num >= h->max_pic_num){
  2421.                             av_log(h->s.avctx, AV_LOG_ERROR, "abs_diff_pic_num overflown");
  2422.                             return -1;
  2423.                         }
  2424.                         if(reordering_of_pic_nums_idc == 0) pred-= abs_diff_pic_num;
  2425.                         else                                pred+= abs_diff_pic_num;
  2426.                         pred &= h->max_pic_num - 1;
  2427.                     
  2428.                         for(i= h->ref_count[list]-1; i>=index; i--){
  2429.                             if(h->ref_list[list][i].pic_id == pred && h->ref_list[list][i].long_ref==0)
  2430.                                 break;
  2431.                         }
  2432.                     }else{
  2433.                         pic_id= get_ue_golomb(&s->gb); //long_term_pic_idx
  2434.                         for(i= h->ref_count[list]-1; i>=index; i--){
  2435.                             if(h->ref_list[list][i].pic_id == pic_id && h->ref_list[list][i].long_ref==1)
  2436.                                 break;
  2437.                         }
  2438.                     }
  2439.                     if(i < index){
  2440.                         av_log(h->s.avctx, AV_LOG_ERROR, "reference picture missing during reordern");
  2441.                         memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME
  2442.                     }else if(i > index){
  2443.                         Picture tmp= h->ref_list[list][i];
  2444.                         for(; i>index; i--){
  2445.                             h->ref_list[list][i]= h->ref_list[list][i-1];
  2446.                         }
  2447.                         h->ref_list[list][index]= tmp;
  2448.                     }
  2449.                 }else if(reordering_of_pic_nums_idc==3) 
  2450.                     break;
  2451.                 else{
  2452.                     av_log(h->s.avctx, AV_LOG_ERROR, "illegal reordering_of_pic_nums_idcn");
  2453.                     return -1;
  2454.                 }
  2455.             }
  2456.         }
  2457.         if(h->slice_type!=B_TYPE) break;
  2458.     }
  2459.     return 0;    
  2460. }
  2461. static int pred_weight_table(H264Context *h){
  2462.     MpegEncContext * const s = &h->s;
  2463.     int list, i;
  2464.     
  2465.     h->luma_log2_weight_denom= get_ue_golomb(&s->gb);
  2466.     h->chroma_log2_weight_denom= get_ue_golomb(&s->gb);
  2467.     for(list=0; list<2; list++){
  2468.         for(i=0; i<h->ref_count[list]; i++){
  2469.             int luma_weight_flag, chroma_weight_flag;
  2470.             
  2471.             luma_weight_flag= get_bits1(&s->gb);
  2472.             if(luma_weight_flag){
  2473.                 h->luma_weight[list][i]= get_se_golomb(&s->gb);
  2474.                 h->luma_offset[list][i]= get_se_golomb(&s->gb);
  2475.             }
  2476.             chroma_weight_flag= get_bits1(&s->gb);
  2477.             if(chroma_weight_flag){
  2478.                 int j;
  2479.                 for(j=0; j<2; j++){
  2480.                     h->chroma_weight[list][i][j]= get_se_golomb(&s->gb);
  2481.                     h->chroma_offset[list][i][j]= get_se_golomb(&s->gb);
  2482.                 }
  2483.             }
  2484.         }
  2485.         if(h->slice_type != B_TYPE) break;
  2486.     }
  2487.     return 0;
  2488. }
  2489. /**
  2490.  * instantaneos decoder refresh.
  2491.  */
  2492. static void idr(H264Context *h){
  2493.     int i;
  2494.     for(i=0; i<h->long_ref_count; i++){
  2495.         h->long_ref[i]->reference=0;
  2496.         h->long_ref[i]= NULL;
  2497.     }
  2498.     h->long_ref_count=0;
  2499.     for(i=0; i<h->short_ref_count; i++){
  2500.         h->short_ref[i]->reference=0;
  2501.         h->short_ref[i]= NULL;
  2502.     }
  2503.     h->short_ref_count=0;
  2504. }
  2505. /**
  2506.  *
  2507.  * @return the removed picture or NULL if an error occures
  2508.  */
  2509. static Picture * remove_short(H264Context *h, int frame_num){
  2510.     MpegEncContext * const s = &h->s;
  2511.     int i;
  2512.     
  2513.     if(s->avctx->debug&FF_DEBUG_MMCO)
  2514.         av_log(h->s.avctx, AV_LOG_DEBUG, "remove short %d count %dn", frame_num, h->short_ref_count);
  2515.     
  2516.     for(i=0; i<h->short_ref_count; i++){
  2517.         Picture *pic= h->short_ref[i];
  2518.         if(s->avctx->debug&FF_DEBUG_MMCO)
  2519.             av_log(h->s.avctx, AV_LOG_DEBUG, "%d %d %pn", i, pic->frame_num, pic);
  2520.         if(pic->frame_num == frame_num){
  2521.             h->short_ref[i]= NULL;
  2522.             memmove(&h->short_ref[i], &h->short_ref[i+1], (h->short_ref_count - i - 1)*sizeof(Picture*));
  2523.             h->short_ref_count--;
  2524.             return pic;
  2525.         }
  2526.     }
  2527.     return NULL;
  2528. }
  2529. /**
  2530.  *
  2531.  * @return the removed picture or NULL if an error occures
  2532.  */
  2533. static Picture * remove_long(H264Context *h, int i){
  2534.     Picture *pic;
  2535.     if(i >= h->long_ref_count) return NULL;
  2536.     pic= h->long_ref[i];
  2537.     if(pic==NULL) return NULL;
  2538.     
  2539.     h->long_ref[i]= NULL;
  2540.     memmove(&h->long_ref[i], &h->long_ref[i+1], (h->long_ref_count - i - 1)*sizeof(Picture*));
  2541.     h->long_ref_count--;
  2542.     return pic;
  2543. }
  2544. /**
  2545.  * Executes the reference picture marking (memory management control operations).
  2546.  */
  2547. static int execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
  2548.     MpegEncContext * const s = &h->s;
  2549.     int i;
  2550.     int current_is_long=0;
  2551.     Picture *pic;
  2552.     
  2553.     if((s->avctx->debug&FF_DEBUG_MMCO) && mmco_count==0)
  2554.         av_log(h->s.avctx, AV_LOG_DEBUG, "no mmco heren");
  2555.         
  2556.     for(i=0; i<mmco_count; i++){
  2557.         if(s->avctx->debug&FF_DEBUG_MMCO)
  2558.             av_log(h->s.avctx, AV_LOG_DEBUG, "mmco:%d %d %dn", h->mmco[i].opcode, h->mmco[i].short_frame_num, h->mmco[i].long_index);
  2559.         switch(mmco[i].opcode){
  2560.         case MMCO_SHORT2UNUSED:
  2561.             pic= remove_short(h, mmco[i].short_frame_num);
  2562.             if(pic==NULL) return -1;
  2563.             pic->reference= 0;
  2564.             break;
  2565.         case MMCO_SHORT2LONG:
  2566.             pic= remove_long(h, mmco[i].long_index);
  2567.             if(pic) pic->reference=0;
  2568.             
  2569.             h->long_ref[ mmco[i].long_index ]= remove_short(h, mmco[i].short_frame_num);
  2570.             h->long_ref[ mmco[i].long_index ]->long_ref=1;
  2571.             break;
  2572.         case MMCO_LONG2UNUSED:
  2573.             pic= remove_long(h, mmco[i].long_index);
  2574.             if(pic==NULL) return -1;
  2575.             pic->reference= 0;
  2576.             break;
  2577.         case MMCO_LONG:
  2578.             pic= remove_long(h, mmco[i].long_index);
  2579.             if(pic) pic->reference=0;
  2580.             
  2581.             h->long_ref[ mmco[i].long_index ]= s->current_picture_ptr;
  2582.             h->long_ref[ mmco[i].long_index ]->long_ref=1;
  2583.             h->long_ref_count++;
  2584.             
  2585.             current_is_long=1;
  2586.             break;
  2587.         case MMCO_SET_MAX_LONG:
  2588.             assert(mmco[i].long_index <= 16);
  2589.             while(mmco[i].long_index < h->long_ref_count){
  2590.                 pic= remove_long(h, mmco[i].long_index);
  2591.                 pic->reference=0;
  2592.             }
  2593.             while(mmco[i].long_index > h->long_ref_count){
  2594.                 h->long_ref[ h->long_ref_count++ ]= NULL;
  2595.             }
  2596.             break;
  2597.         case MMCO_RESET:
  2598.             while(h->short_ref_count){
  2599.                 pic= remove_short(h, h->short_ref[0]->frame_num);
  2600.                 pic->reference=0;
  2601.             }
  2602.             while(h->long_ref_count){
  2603.                 pic= remove_long(h, h->long_ref_count-1);
  2604.                 pic->reference=0;
  2605.             }
  2606.             break;
  2607.         default: assert(0);
  2608.         }
  2609.     }
  2610.     
  2611.     if(!current_is_long){
  2612.         pic= remove_short(h, s->current_picture_ptr->frame_num);
  2613.         if(pic){
  2614.             pic->reference=0;
  2615.             av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term buffer state detectedn");
  2616.         }
  2617.         
  2618.         if(h->short_ref_count)
  2619.             memmove(&h->short_ref[1], &h->short_ref[0], h->short_ref_count*sizeof(Picture*));
  2620.         h->short_ref[0]= s->current_picture_ptr;
  2621.         h->short_ref[0]->long_ref=0;
  2622.         h->short_ref_count++;
  2623.     }
  2624.     
  2625.     return 0; 
  2626. }
  2627. static int decode_ref_pic_marking(H264Context *h){
  2628.     MpegEncContext * const s = &h->s;
  2629.     int i;
  2630.     
  2631.     if(h->nal_unit_type == NAL_IDR_SLICE){ //FIXME fields
  2632.         s->broken_link= get_bits1(&s->gb) -1;
  2633.         h->mmco[0].long_index= get_bits1(&s->gb) - 1; // current_long_term_idx
  2634.         if(h->mmco[0].long_index == -1)
  2635.             h->mmco_index= 0;
  2636.         else{
  2637.             h->mmco[0].opcode= MMCO_LONG;
  2638.             h->mmco_index= 1;
  2639.         } 
  2640.     }else{
  2641.         if(get_bits1(&s->gb)){ // adaptive_ref_pic_marking_mode_flag
  2642.             for(i= h->mmco_index; i<MAX_MMCO_COUNT; i++) { 
  2643.                 MMCOOpcode opcode= get_ue_golomb(&s->gb);;
  2644.                 h->mmco[i].opcode= opcode;
  2645.                 if(opcode==MMCO_SHORT2UNUSED || opcode==MMCO_SHORT2LONG){
  2646.                     h->mmco[i].short_frame_num= (h->frame_num - get_ue_golomb(&s->gb) - 1) & ((1<<h->sps.log2_max_frame_num)-1); //FIXME fields
  2647. /*                    if(h->mmco[i].short_frame_num >= h->short_ref_count || h->short_ref[ h->mmco[i].short_frame_num ] == NULL){
  2648.                         fprintf(stderr, "illegal short ref in memory management control operation %dn", mmco);
  2649.                         return -1;
  2650.                     }*/
  2651.                 }
  2652.                 if(opcode==MMCO_SHORT2LONG || opcode==MMCO_LONG2UNUSED || opcode==MMCO_LONG || opcode==MMCO_SET_MAX_LONG){
  2653.                     h->mmco[i].long_index= get_ue_golomb(&s->gb);
  2654.                     if(/*h->mmco[i].long_index >= h->long_ref_count || h->long_ref[ h->mmco[i].long_index ] == NULL*/ h->mmco[i].long_index >= 16){
  2655.                         av_log(h->s.avctx, AV_LOG_ERROR, "illegal long ref in memory management control operation %dn", opcode);
  2656.                         return -1;
  2657.                     }
  2658.                 }
  2659.                     
  2660.                 if(opcode > MMCO_LONG){
  2661.                     av_log(h->s.avctx, AV_LOG_ERROR, "illegal memory management control operation %dn", opcode);
  2662.                     return -1;
  2663.                 }
  2664.             }
  2665.             h->mmco_index= i;
  2666.         }else{
  2667.             assert(h->long_ref_count + h->short_ref_count <= h->sps.ref_frame_count);
  2668.             if(h->long_ref_count + h->short_ref_count == h->sps.ref_frame_count){ //FIXME fields
  2669.                 h->mmco[0].opcode= MMCO_SHORT2UNUSED;
  2670.                 h->mmco[0].short_frame_num= h->short_ref[ h->short_ref_count - 1 ]->frame_num;
  2671.                 h->mmco_index= 1;
  2672.             }else
  2673.                 h->mmco_index= 0;
  2674.         }
  2675.     }
  2676.     
  2677.     return 0; 
  2678. }
  2679. static int init_poc(H264Context *h){
  2680.     MpegEncContext * const s = &h->s;
  2681.     const int max_frame_num= 1<<h->sps.log2_max_frame_num;
  2682.     int field_poc[2];
  2683.     if(h->nal_unit_type == NAL_IDR_SLICE){
  2684.         h->frame_num_offset= 0;
  2685.     }else{
  2686.         if(h->frame_num < h->prev_frame_num)
  2687.             h->frame_num_offset= h->prev_frame_num_offset + max_frame_num;
  2688.         else
  2689.             h->frame_num_offset= h->prev_frame_num_offset;
  2690.     }
  2691.     if(h->sps.poc_type==0){
  2692.         const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb;
  2693.         if     (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2)
  2694.             h->poc_msb = h->prev_poc_msb + max_poc_lsb;
  2695.         else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2)
  2696.             h->poc_msb = h->prev_poc_msb - max_poc_lsb;
  2697.         else
  2698.             h->poc_msb = h->prev_poc_msb;
  2699. //printf("poc: %d %dn", h->poc_msb, h->poc_lsb);
  2700.         field_poc[0] = 
  2701.         field_poc[1] = h->poc_msb + h->poc_lsb;
  2702.         if(s->picture_structure == PICT_FRAME) 
  2703.             field_poc[1] += h->delta_poc_bottom;
  2704.     }else if(h->sps.poc_type==1){
  2705.         int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc;
  2706.         int i;
  2707.         if(h->sps.poc_cycle_length != 0)
  2708.             abs_frame_num = h->frame_num_offset + h->frame_num;
  2709.         else
  2710.             abs_frame_num = 0;