h264.c
上传用户:jylinhe
上传日期:2022-07-11
资源大小:334k
文件大小:325k
源码类别:

多媒体编程

开发平台:

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 file is part of FFmpeg.
  6.  *
  7.  * FFmpeg is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Lesser General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2.1 of the License, or (at your option) any later version.
  11.  *
  12.  * FFmpeg is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * Lesser General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Lesser General Public
  18.  * License along with FFmpeg; if not, write to the Free Software
  19.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20.  */
  21. /**
  22.  * @file h264.c
  23.  * H.264 / AVC / MPEG4 part10 codec.
  24.  * @author Michael Niedermayer <michaelni@gmx.at>
  25.  */
  26. #include "dsputil.h"
  27. #include "internal.h"
  28. //#include "avcodec.h"
  29. #include "mpegvideo.h"
  30. #include "h264.h"
  31. #include "h264data.h"
  32. //#include "h264_parser.h"
  33. #include "golomb.h"
  34. #include "rectangle.h"
  35. //#include "vdpau_internal.h"
  36. #include "cabac.h"
  37. #include "yuv420argb.h"
  38. #include "ffh264.h"
  39. #ifdef ARCH_X86
  40. #include "x86/h264_i386.h"
  41. #endif
  42. //#undef NDEBUG
  43. #include <assert.h>
  44. /**
  45.  * Value of Picture.reference when Picture is not a reference picture, but
  46.  * is held for delayed output.
  47.  */
  48. #define DELAYED_PIC_REF 4
  49. static VLC coeff_token_vlc[4];
  50. static VLC_TYPE coeff_token_vlc_tables[520+332+280+256][2];
  51. static const int coeff_token_vlc_tables_size[4]={520,332,280,256};
  52. static VLC chroma_dc_coeff_token_vlc;
  53. static VLC_TYPE chroma_dc_coeff_token_vlc_table[256][2];
  54. static const int chroma_dc_coeff_token_vlc_table_size = 256;
  55. static VLC total_zeros_vlc[15];
  56. static VLC_TYPE total_zeros_vlc_tables[15][512][2];
  57. static const int total_zeros_vlc_tables_size = 512;
  58. static VLC chroma_dc_total_zeros_vlc[3];
  59. static VLC_TYPE chroma_dc_total_zeros_vlc_tables[3][8][2];
  60. static const int chroma_dc_total_zeros_vlc_tables_size = 8;
  61. static VLC run_vlc[6];
  62. static VLC_TYPE run_vlc_tables[6][8][2];
  63. static const int run_vlc_tables_size = 8;
  64. static VLC run7_vlc;
  65. static VLC_TYPE run7_vlc_table[96][2];
  66. static const int run7_vlc_table_size = 96;
  67. static int mmx_detect = 0;
  68. extern void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp);
  69. extern void svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc);
  70. static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize);
  71. static void filter_mb_fast( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize);
  72. static Picture * remove_long(H264Context *h, int i, int ref_mask);
  73. uint32_t pack16to32(int a, int b)
  74. {
  75. #ifdef WORDS_BIGENDIAN
  76.    return (b&0xFFFF) + (a<<16);
  77. #else
  78.    return (a&0xFFFF) + (b<<16);
  79. #endif
  80. }
  81. static const uint8_t rem6[52]={
  82. 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
  83. };
  84. static const uint8_t div6[52]={
  85. 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
  86. };
  87. static const int left_block_options[4][8]={
  88.     {0,1,2,3,7,10,8,11},
  89.     {2,2,3,3,8,11,8,11},
  90.     {0,0,1,1,7,10,7,10},
  91.     {0,2,0,2,7,10,7,10}
  92. };
  93. const uint8_t ff_log2_tab[256]={
  94.         0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
  95.         5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
  96.         6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  97.         6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
  98.         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  99.         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  100.         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
  101.         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
  102. };
  103. #define LEVEL_TAB_BITS 8
  104. static int8_t cavlc_level_tab[7][1<<LEVEL_TAB_BITS][2];
  105. static void fill_caches(H264Context *h, int mb_type, int for_deblock){
  106.     MpegEncContext * const s = &h->s;
  107.     const int mb_xy= h->mb_xy;
  108.     int topleft_xy, top_xy, topright_xy, left_xy[2];
  109.     int topleft_type, top_type, topright_type, left_type[2];
  110.     const int * left_block;
  111.     int topleft_partition= -1;
  112.     int i;
  113.     top_xy     = mb_xy  - (s->mb_stride << FIELD_PICTURE);
  114.     //FIXME deblocking could skip the intra and nnz parts.
  115.     if(for_deblock && (h->slice_num == 1 || h->slice_table[mb_xy] == h->slice_table[top_xy]) && !FRAME_MBAFF)
  116.         return;
  117.     /* Wow, what a mess, why didn't they simplify the interlacing & intra
  118.      * stuff, I can't imagine that these complex rules are worth it. */
  119.     topleft_xy = top_xy - 1;
  120.     topright_xy= top_xy + 1;
  121.     left_xy[1] = left_xy[0] = mb_xy-1;
  122.     left_block = left_block_options[0];
  123.     if(FRAME_MBAFF){
  124.         const int pair_xy          = s->mb_x     + (s->mb_y & ~1)*s->mb_stride;
  125.         const int top_pair_xy      = pair_xy     - s->mb_stride;
  126.         const int topleft_pair_xy  = top_pair_xy - 1;
  127.         const int topright_pair_xy = top_pair_xy + 1;
  128.         const int topleft_mb_field_flag  = IS_INTERLACED(s->current_picture.mb_type[topleft_pair_xy]);
  129.         const int top_mb_field_flag      = IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]);
  130.         const int topright_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[topright_pair_xy]);
  131.         const int left_mb_field_flag     = IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]);
  132.         const int curr_mb_field_flag     = IS_INTERLACED(mb_type);
  133.         const int bottom = (s->mb_y & 1);
  134.         tprintf(s->avctx, "fill_caches: curr_mb_field_flag:%d, left_mb_field_flag:%d, topleft_mb_field_flag:%d, top_mb_field_flag:%d, topright_mb_field_flag:%dn", curr_mb_field_flag, left_mb_field_flag, topleft_mb_field_flag, top_mb_field_flag, topright_mb_field_flag);
  135.         if (curr_mb_field_flag && (bottom || top_mb_field_flag)){
  136.             top_xy -= s->mb_stride;
  137.         }
  138.         if (curr_mb_field_flag && (bottom || topleft_mb_field_flag)){
  139.             topleft_xy -= s->mb_stride;
  140.         } else if(bottom && !curr_mb_field_flag && left_mb_field_flag) {
  141.             topleft_xy += s->mb_stride;
  142.             // take top left mv from the middle of the mb, as opposed to all other modes which use the bottom right partition
  143.             topleft_partition = 0;
  144.         }
  145.         if (curr_mb_field_flag && (bottom || topright_mb_field_flag)){
  146.             topright_xy -= s->mb_stride;
  147.         }
  148.         if (left_mb_field_flag != curr_mb_field_flag) {
  149.             left_xy[1] = left_xy[0] = pair_xy - 1;
  150.             if (curr_mb_field_flag) {
  151.                 left_xy[1] += s->mb_stride;
  152.                 left_block = left_block_options[3];
  153.             } else {
  154.                 left_block= left_block_options[2 - bottom];
  155.             }
  156.         }
  157.     }
  158.     h->top_mb_xy = top_xy;
  159.     h->left_mb_xy[0] = left_xy[0];
  160.     h->left_mb_xy[1] = left_xy[1];
  161.     if(for_deblock){
  162.         topleft_type = 0;
  163.         topright_type = 0;
  164.         top_type     = h->slice_table[top_xy     ] < 0xFFFF ? s->current_picture.mb_type[top_xy]     : 0;
  165.         left_type[0] = h->slice_table[left_xy[0] ] < 0xFFFF ? s->current_picture.mb_type[left_xy[0]] : 0;
  166.         left_type[1] = h->slice_table[left_xy[1] ] < 0xFFFF ? s->current_picture.mb_type[left_xy[1]] : 0;
  167.         if(MB_MBAFF && !IS_INTRA(mb_type)){
  168.             int list;
  169.             for(list=0; list<h->list_count; list++){
  170.                 //These values where changed for ease of performing MC, we need to change them back
  171.                 //FIXME maybe we can make MC and loop filter use the same values or prevent
  172.                 //the MC code from changing ref_cache and rather use a temporary array.
  173.                 if(USES_LIST(mb_type,list)){
  174.                     int8_t *ref = &s->current_picture.ref_index[list][h->mb2b8_xy[mb_xy]];
  175.                     *(uint32_t*)&h->ref_cache[list][scan8[ 0]] =
  176.                     *(uint32_t*)&h->ref_cache[list][scan8[ 2]] = (pack16to32(ref[0],ref[1])&0x00FF00FF)*0x0101;
  177.                     ref += h->b8_stride;
  178.                     *(uint32_t*)&h->ref_cache[list][scan8[ 8]] =
  179.                     *(uint32_t*)&h->ref_cache[list][scan8[10]] = (pack16to32(ref[0],ref[1])&0x00FF00FF)*0x0101;
  180.                 }
  181.             }
  182.         }
  183.     }else{
  184.         topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0;
  185.         top_type     = h->slice_table[top_xy     ] == h->slice_num ? s->current_picture.mb_type[top_xy]     : 0;
  186.         topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0;
  187.         left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0;
  188.         left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0;
  189.     if(IS_INTRA(mb_type)){
  190.         int type_mask= h->pps.constrained_intra_pred ? IS_INTRA(-1) : -1;
  191.         h->topleft_samples_available=
  192.         h->top_samples_available=
  193.         h->left_samples_available= 0xFFFF;
  194.         h->topright_samples_available= 0xEEEA;
  195.         if(!(top_type & type_mask)){
  196.             h->topleft_samples_available= 0xB3FF;
  197.             h->top_samples_available= 0x33FF;
  198.             h->topright_samples_available= 0x26EA;
  199.         }
  200.         if(IS_INTERLACED(mb_type) != IS_INTERLACED(left_type[0])){
  201.             if(IS_INTERLACED(mb_type)){
  202.                 if(!(left_type[0] & type_mask)){
  203.                     h->topleft_samples_available&= 0xDFFF;
  204.                     h->left_samples_available&= 0x5FFF;
  205.                 }
  206.                 if(!(left_type[1] & type_mask)){
  207.                     h->topleft_samples_available&= 0xFF5F;
  208.                     h->left_samples_available&= 0xFF5F;
  209.                 }
  210.             }else{
  211.                 int left_typei = h->slice_table[left_xy[0] + s->mb_stride ] == h->slice_num
  212.                                 ? s->current_picture.mb_type[left_xy[0] + s->mb_stride] : 0;
  213.                 assert(left_xy[0] == left_xy[1]);
  214.                 if(!((left_typei & type_mask) && (left_type[0] & type_mask))){
  215.                     h->topleft_samples_available&= 0xDF5F;
  216.                     h->left_samples_available&= 0x5F5F;
  217.                 }
  218.             }
  219.         }else{
  220.             if(!(left_type[0] & type_mask)){
  221.                 h->topleft_samples_available&= 0xDF5F;
  222.                 h->left_samples_available&= 0x5F5F;
  223.             }
  224.         }
  225.         if(!(topleft_type & type_mask))
  226.             h->topleft_samples_available&= 0x7FFF;
  227.         if(!(topright_type & type_mask))
  228.             h->topright_samples_available&= 0xFBFF;
  229.         if(IS_INTRA4x4(mb_type)){
  230.             if(IS_INTRA4x4(top_type)){
  231.                 h->intra4x4_pred_mode_cache[4+8*0]= h->intra4x4_pred_mode[top_xy][4];
  232.                 h->intra4x4_pred_mode_cache[5+8*0]= h->intra4x4_pred_mode[top_xy][5];
  233.                 h->intra4x4_pred_mode_cache[6+8*0]= h->intra4x4_pred_mode[top_xy][6];
  234.                 h->intra4x4_pred_mode_cache[7+8*0]= h->intra4x4_pred_mode[top_xy][3];
  235.             }else{
  236.                 int pred;
  237.                 if(!(top_type & type_mask))
  238.                     pred= -1;
  239.                 else{
  240.                     pred= 2;
  241.                 }
  242.                 h->intra4x4_pred_mode_cache[4+8*0]=
  243.                 h->intra4x4_pred_mode_cache[5+8*0]=
  244.                 h->intra4x4_pred_mode_cache[6+8*0]=
  245.                 h->intra4x4_pred_mode_cache[7+8*0]= pred;
  246.             }
  247.             for(i=0; i<2; i++){
  248.                 if(IS_INTRA4x4(left_type[i])){
  249.                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+2*i]];
  250.                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+2*i]];
  251.                 }else{
  252.                     int pred;
  253.                     if(!(left_type[i] & type_mask))
  254.                         pred= -1;
  255.                     else{
  256.                         pred= 2;
  257.                     }
  258.                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]=
  259.                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= pred;
  260.                 }
  261.             }
  262.         }
  263.     }
  264.     }
  265. /*
  266. 0 . T T. T T T T
  267. 1 L . .L . . . .
  268. 2 L . .L . . . .
  269. 3 . T TL . . . .
  270. 4 L . .L . . . .
  271. 5 L . .. . . . .
  272. */
  273. //FIXME constraint_intra_pred & partitioning & nnz (let us hope this is just a typo in the spec)
  274.     if(top_type){
  275.         h->non_zero_count_cache[4+8*0]= h->non_zero_count[top_xy][4];
  276.         h->non_zero_count_cache[5+8*0]= h->non_zero_count[top_xy][5];
  277.         h->non_zero_count_cache[6+8*0]= h->non_zero_count[top_xy][6];
  278.         h->non_zero_count_cache[7+8*0]= h->non_zero_count[top_xy][3];
  279.         h->non_zero_count_cache[1+8*0]= h->non_zero_count[top_xy][9];
  280.         h->non_zero_count_cache[2+8*0]= h->non_zero_count[top_xy][8];
  281.         h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][12];
  282.         h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11];
  283.     }else{
  284.         h->non_zero_count_cache[4+8*0]=
  285.         h->non_zero_count_cache[5+8*0]=
  286.         h->non_zero_count_cache[6+8*0]=
  287.         h->non_zero_count_cache[7+8*0]=
  288.         h->non_zero_count_cache[1+8*0]=
  289.         h->non_zero_count_cache[2+8*0]=
  290.         h->non_zero_count_cache[1+8*3]=
  291.         h->non_zero_count_cache[2+8*3]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64;
  292.     }
  293.     for (i=0; i<2; i++) {
  294.         if(left_type[i]){
  295.             h->non_zero_count_cache[3+8*1 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[0+2*i]];
  296.             h->non_zero_count_cache[3+8*2 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[1+2*i]];
  297.             h->non_zero_count_cache[0+8*1 +   8*i]= h->non_zero_count[left_xy[i]][left_block[4+2*i]];
  298.             h->non_zero_count_cache[0+8*4 +   8*i]= h->non_zero_count[left_xy[i]][left_block[5+2*i]];
  299.         }else{
  300.             h->non_zero_count_cache[3+8*1 + 2*8*i]=
  301.             h->non_zero_count_cache[3+8*2 + 2*8*i]=
  302.             h->non_zero_count_cache[0+8*1 +   8*i]=
  303.             h->non_zero_count_cache[0+8*4 +   8*i]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64;
  304.         }
  305.     }
  306.     if( h->pps.cabac ) {
  307.         // top_cbp
  308.         if(top_type) {
  309.             h->top_cbp = h->cbp_table[top_xy];
  310.         } else if(IS_INTRA(mb_type)) {
  311.             h->top_cbp = 0x1C0;
  312.         } else {
  313.             h->top_cbp = 0;
  314.         }
  315.         // left_cbp
  316.         if (left_type[0]) {
  317.             h->left_cbp = h->cbp_table[left_xy[0]] & 0x1f0;
  318.         } else if(IS_INTRA(mb_type)) {
  319.             h->left_cbp = 0x1C0;
  320.         } else {
  321.             h->left_cbp = 0;
  322.         }
  323.         if (left_type[0]) {
  324.             h->left_cbp |= ((h->cbp_table[left_xy[0]]>>((left_block[0]&(~1))+1))&0x1) << 1;
  325.         }
  326.         if (left_type[1]) {
  327.             h->left_cbp |= ((h->cbp_table[left_xy[1]]>>((left_block[2]&(~1))+1))&0x1) << 3;
  328.         }
  329.     }
  330. #if 1
  331.     if(IS_INTER(mb_type) || IS_DIRECT(mb_type)){
  332.         int list;
  333.         for(list=0; list<h->list_count; list++){
  334.             if(!USES_LIST(mb_type, list) && !IS_DIRECT(mb_type) && !h->deblocking_filter){
  335.                 /*if(!h->mv_cache_clean[list]){
  336.                     memset(h->mv_cache [list],  0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all?
  337.                     memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t));
  338.                     h->mv_cache_clean[list]= 1;
  339.                 }*/
  340.                 continue;
  341.             }
  342.             h->mv_cache_clean[list]= 0;
  343.             if(USES_LIST(top_type, list)){
  344.                 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
  345.                 const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride;
  346.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0];
  347.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1];
  348.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2];
  349.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3];
  350.                 h->ref_cache[list][scan8[0] + 0 - 1*8]=
  351.                 h->ref_cache[list][scan8[0] + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0];
  352.                 h->ref_cache[list][scan8[0] + 2 - 1*8]=
  353.                 h->ref_cache[list][scan8[0] + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1];
  354.             }else{
  355.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 0 - 1*8]=
  356.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 1 - 1*8]=
  357.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 2 - 1*8]=
  358.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 3 - 1*8]= 0;
  359.                 *(uint32_t*)&h->ref_cache[list][scan8[0] + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101;
  360.             }
  361.             for(i=0; i<2; i++){
  362.                 int cache_idx = scan8[0] - 1 + i*2*8;
  363.                 if(USES_LIST(left_type[i], list)){
  364.                     const int b_xy= h->mb2b_xy[left_xy[i]] + 3;
  365.                     const int b8_xy= h->mb2b8_xy[left_xy[i]] + 1;
  366.                     *(uint32_t*)h->mv_cache[list][cache_idx  ]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0+i*2]];
  367.                     *(uint32_t*)h->mv_cache[list][cache_idx+8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1+i*2]];
  368.                     h->ref_cache[list][cache_idx  ]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0+i*2]>>1)];
  369.                     h->ref_cache[list][cache_idx+8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[1+i*2]>>1)];
  370.                 }else{
  371.                     *(uint32_t*)h->mv_cache [list][cache_idx  ]=
  372.                     *(uint32_t*)h->mv_cache [list][cache_idx+8]= 0;
  373.                     h->ref_cache[list][cache_idx  ]=
  374.                     h->ref_cache[list][cache_idx+8]= left_type[i] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
  375.                 }
  376.             }
  377.             if(for_deblock || ((IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred) && !FRAME_MBAFF))
  378.                 continue;
  379.             if(USES_LIST(topleft_type, list)){
  380.                 const int b_xy = h->mb2b_xy[topleft_xy] + 3 + h->b_stride + (topleft_partition & 2*h->b_stride);
  381.                 const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + (topleft_partition & h->b8_stride);
  382.                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
  383.                 h->ref_cache[list][scan8[0] - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy];
  384.             }else{
  385.                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= 0;
  386.                 h->ref_cache[list][scan8[0] - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
  387.             }
  388.             if(USES_LIST(topright_type, list)){
  389.                 const int b_xy= h->mb2b_xy[topright_xy] + 3*h->b_stride;
  390.                 const int b8_xy= h->mb2b8_xy[topright_xy] + h->b8_stride;
  391.                 *(uint32_t*)h->mv_cache[list][scan8[0] + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
  392.                 h->ref_cache[list][scan8[0] + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy];
  393.             }else{
  394.                 *(uint32_t*)h->mv_cache [list][scan8[0] + 4 - 1*8]= 0;
  395.                 h->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
  396.             }
  397.             if((IS_SKIP(mb_type) || IS_DIRECT(mb_type)) && !FRAME_MBAFF)
  398.                 continue;
  399.             h->ref_cache[list][scan8[5 ]+1] =
  400.             h->ref_cache[list][scan8[7 ]+1] =
  401.             h->ref_cache[list][scan8[13]+1] =  //FIXME remove past 3 (init somewhere else)
  402.             h->ref_cache[list][scan8[4 ]] =
  403.             h->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE;
  404.             *(uint32_t*)h->mv_cache [list][scan8[5 ]+1]=
  405.             *(uint32_t*)h->mv_cache [list][scan8[7 ]+1]=
  406.             *(uint32_t*)h->mv_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else)
  407.             *(uint32_t*)h->mv_cache [list][scan8[4 ]]=
  408.             *(uint32_t*)h->mv_cache [list][scan8[12]]= 0;
  409.             if( h->pps.cabac ) {
  410.                 /* XXX beurk, Load mvd */
  411.                 if(USES_LIST(top_type, list)){
  412.                     const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
  413.                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 0];
  414.                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 1];
  415.                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 2];
  416.                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 3];
  417.                 }else{
  418.                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 0 - 1*8]=
  419.                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 1 - 1*8]=
  420.                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 2 - 1*8]=
  421.                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 3 - 1*8]= 0;
  422.                 }
  423.                 if(USES_LIST(left_type[0], list)){
  424.                     const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
  425.                     *(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]];
  426.                     *(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]];
  427.                 }else{
  428.                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 0*8]=
  429.                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 1*8]= 0;
  430.                 }
  431.                 if(USES_LIST(left_type[1], list)){
  432.                     const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
  433.                     *(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]];
  434.                     *(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]];
  435.                 }else{
  436.                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 2*8]=
  437.                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 3*8]= 0;
  438.                 }
  439.                 *(uint32_t*)h->mvd_cache [list][scan8[5 ]+1]=
  440.                 *(uint32_t*)h->mvd_cache [list][scan8[7 ]+1]=
  441.                 *(uint32_t*)h->mvd_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else)
  442.                 *(uint32_t*)h->mvd_cache [list][scan8[4 ]]=
  443.                 *(uint32_t*)h->mvd_cache [list][scan8[12]]= 0;
  444.                 if(h->slice_type_nos == FF_B_TYPE){
  445.                     fill_rectangle(&h->direct_cache[scan8[0]], 4, 4, 8, 0, 1);
  446.                     if(IS_DIRECT(top_type)){
  447.                         *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0x01010101;
  448.                     }else if(IS_8X8(top_type)){
  449.                         int b8_xy = h->mb2b8_xy[top_xy] + h->b8_stride;
  450.                         h->direct_cache[scan8[0] + 0 - 1*8]= h->direct_table[b8_xy];
  451.                         h->direct_cache[scan8[0] + 2 - 1*8]= h->direct_table[b8_xy + 1];
  452.                     }else{
  453.                         *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0;
  454.                     }
  455.                     if(IS_DIRECT(left_type[0]))
  456.                         h->direct_cache[scan8[0] - 1 + 0*8]= 1;
  457.                     else if(IS_8X8(left_type[0]))
  458.                         h->direct_cache[scan8[0] - 1 + 0*8]= h->direct_table[h->mb2b8_xy[left_xy[0]] + 1 + h->b8_stride*(left_block[0]>>1)];
  459.                     else
  460.                         h->direct_cache[scan8[0] - 1 + 0*8]= 0;
  461.                     if(IS_DIRECT(left_type[1]))
  462.                         h->direct_cache[scan8[0] - 1 + 2*8]= 1;
  463.                     else if(IS_8X8(left_type[1]))
  464.                         h->direct_cache[scan8[0] - 1 + 2*8]= h->direct_table[h->mb2b8_xy[left_xy[1]] + 1 + h->b8_stride*(left_block[2]>>1)];
  465.                     else
  466.                         h->direct_cache[scan8[0] - 1 + 2*8]= 0;
  467.                 }
  468.             }
  469.             if(FRAME_MBAFF){
  470. #define MAP_MVS
  471.                     MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)
  472.                     MAP_F2F(scan8[0] + 0 - 1*8, top_type)
  473.                     MAP_F2F(scan8[0] + 1 - 1*8, top_type)
  474.                     MAP_F2F(scan8[0] + 2 - 1*8, top_type)
  475.                     MAP_F2F(scan8[0] + 3 - 1*8, top_type)
  476.                     MAP_F2F(scan8[0] + 4 - 1*8, topright_type)
  477.                     MAP_F2F(scan8[0] - 1 + 0*8, left_type[0])
  478.                     MAP_F2F(scan8[0] - 1 + 1*8, left_type[0])
  479.                     MAP_F2F(scan8[0] - 1 + 2*8, left_type[1])
  480.                     MAP_F2F(scan8[0] - 1 + 3*8, left_type[1])
  481.                 if(MB_FIELD){
  482. #define MAP_F2F(idx, mb_type)
  483.                     if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){
  484.                         h->ref_cache[list][idx] <<= 1;
  485.                         h->mv_cache[list][idx][1] /= 2;
  486.                         h->mvd_cache[list][idx][1] /= 2;
  487.                     }
  488.                     MAP_MVS
  489. #undef MAP_F2F
  490.                 }else{
  491. #define MAP_F2F(idx, mb_type)
  492.                     if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){
  493.                         h->ref_cache[list][idx] >>= 1;
  494.                         h->mv_cache[list][idx][1] <<= 1;
  495.                         h->mvd_cache[list][idx][1] <<= 1;
  496.                     }
  497.                     MAP_MVS
  498. #undef MAP_F2F
  499.                 }
  500.             }
  501.         }
  502.     }
  503. #endif
  504.     h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[0]);
  505. }
  506. void write_back_intra_pred_mode(H264Context *h)
  507. {
  508.     const int mb_xy= h->mb_xy;
  509.     h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1];
  510.     h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2];
  511.     h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3];
  512.     h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4];
  513.     h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4];
  514.     h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4];
  515.     h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4];
  516. }
  517. /**
  518.  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
  519.  */
  520. int check_intra4x4_pred_mode(H264Context *h)
  521. {
  522.     MpegEncContext * const s = &h->s;
  523.     static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0};
  524.     static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED};
  525.     int i;
  526.     if(!(h->top_samples_available&0x8000)){
  527.         for(i=0; i<4; i++){
  528.             int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ];
  529.             if(status<0){
  530.                 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);
  531.                 return -1;
  532.             } else if(status){
  533.                 h->intra4x4_pred_mode_cache[scan8[0] + i]= status;
  534.             }
  535.         }
  536.     }
  537.     if((h->left_samples_available&0x8888)!=0x8888){
  538.         static const int mask[4]={0x8000,0x2000,0x80,0x20};
  539.         for(i=0; i<4; i++){
  540.             if(!(h->left_samples_available&mask[i])){
  541.                 int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ];
  542.                 if(status<0){
  543.                     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);
  544.                     return -1;
  545.                 } else if(status){
  546.                     h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status;
  547.                 }
  548.             }
  549.         }
  550.     }
  551.     return 0;
  552. } //FIXME cleanup like next
  553. /**
  554.  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
  555.  */
  556. int check_intra_pred_mode(H264Context *h, int mode)
  557. {
  558.     MpegEncContext * const s = &h->s;
  559.     static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};
  560.     static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};
  561.     if(mode > 6U) {
  562.         av_log(h->s.avctx, AV_LOG_ERROR, "out of range intra chroma pred mode at %d %dn", s->mb_x, s->mb_y);
  563.         return -1;
  564.     }
  565.     if(!(h->top_samples_available&0x8000)){
  566.         mode= top[ mode ];
  567.         if(mode<0){
  568.             av_log(h->s.avctx, AV_LOG_ERROR, "top block unavailable for requested intra mode at %d %dn", s->mb_x, s->mb_y);
  569.             return -1;
  570.         }
  571.     }
  572.     if((h->left_samples_available&0x8080) != 0x8080){
  573.         mode= left[ mode ];
  574.         if(h->left_samples_available&0x8080){ //mad cow disease mode, aka MBAFF + constrained_intra_pred
  575.             mode= ALZHEIMER_DC_L0T_PRED8x8 + (!(h->left_samples_available&0x8000)) + 2*(mode == DC_128_PRED8x8);
  576.         }
  577.         if(mode<0){
  578.             av_log(h->s.avctx, AV_LOG_ERROR, "left block unavailable for requested intra mode at %d %dn", s->mb_x, s->mb_y);
  579.             return -1;
  580.         }
  581.     }
  582.     return mode;
  583. }
  584. /**
  585.  * gets the predicted intra4x4 prediction mode.
  586.  */
  587. static inline int pred_intra_mode(H264Context *h, int n){
  588.     const int index8= scan8[n];
  589.     const int left= h->intra4x4_pred_mode_cache[index8 - 1];
  590.     const int top = h->intra4x4_pred_mode_cache[index8 - 8];
  591.     const int min= FFMIN(left, top);
  592.     tprintf(h->s.avctx, "mode:%d %d min:%dn", left ,top, min);
  593.     if(min<0) return DC_PRED;
  594.     else      return min;
  595. }
  596. static inline void write_back_non_zero_count(H264Context *h){
  597.     const int mb_xy= h->mb_xy;
  598.     h->non_zero_count[mb_xy][0]= h->non_zero_count_cache[7+8*1];
  599.     h->non_zero_count[mb_xy][1]= h->non_zero_count_cache[7+8*2];
  600.     h->non_zero_count[mb_xy][2]= h->non_zero_count_cache[7+8*3];
  601.     h->non_zero_count[mb_xy][3]= h->non_zero_count_cache[7+8*4];
  602.     h->non_zero_count[mb_xy][4]= h->non_zero_count_cache[4+8*4];
  603.     h->non_zero_count[mb_xy][5]= h->non_zero_count_cache[5+8*4];
  604.     h->non_zero_count[mb_xy][6]= h->non_zero_count_cache[6+8*4];
  605.     h->non_zero_count[mb_xy][9]= h->non_zero_count_cache[1+8*2];
  606.     h->non_zero_count[mb_xy][8]= h->non_zero_count_cache[2+8*2];
  607.     h->non_zero_count[mb_xy][7]= h->non_zero_count_cache[2+8*1];
  608.     h->non_zero_count[mb_xy][12]=h->non_zero_count_cache[1+8*5];
  609.     h->non_zero_count[mb_xy][11]=h->non_zero_count_cache[2+8*5];
  610.     h->non_zero_count[mb_xy][10]=h->non_zero_count_cache[2+8*4];
  611. }
  612. /**
  613.  * gets the predicted number of non-zero coefficients.
  614.  * @param n block index
  615.  */
  616. static inline int pred_non_zero_count(H264Context *h, int n){
  617.     const int index8= scan8[n];
  618.     const int left= h->non_zero_count_cache[index8 - 1];
  619.     const int top = h->non_zero_count_cache[index8 - 8];
  620.     int i= left + top;
  621.     if(i<64) i= (i+1)>>1;
  622.     tprintf(h->s.avctx, "pred_nnz L%X T%X n%d s%d P%Xn", left, top, n, scan8[n], i&31);
  623.     return i&31;
  624. }
  625. static inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width){
  626.     const int topright_ref= h->ref_cache[list][ i - 8 + part_width ];
  627.     MpegEncContext *s = &h->s;
  628.     /* there is no consistent mapping of mvs to neighboring locations that will
  629.      * make mbaff happy, so we can't move all this logic to fill_caches */
  630.     if(FRAME_MBAFF){
  631.         const uint32_t *mb_types = s->current_picture_ptr->mb_type;
  632.         const int16_t *mv;
  633.         *(uint32_t*)h->mv_cache[list][scan8[0]-2] = 0;
  634.         *C = h->mv_cache[list][scan8[0]-2];
  635.         if(!MB_FIELD
  636.            && (s->mb_y&1) && i < scan8[0]+8 && topright_ref != PART_NOT_AVAILABLE){
  637.             int topright_xy = s->mb_x + (s->mb_y-1)*s->mb_stride + (i == scan8[0]+3);
  638.             if(IS_INTERLACED(mb_types[topright_xy])){
  639. #define SET_DIAG_MV(MV_OP, REF_OP, X4, Y4)
  640.                 const int x4 = X4, y4 = Y4;
  641.                 const int mb_type = mb_types[(x4>>2)+(y4>>2)*s->mb_stride];
  642.                 if(!USES_LIST(mb_type,list))
  643.                     return LIST_NOT_USED;
  644.                 mv = s->current_picture_ptr->motion_val[list][x4 + y4*h->b_stride];
  645.                 h->mv_cache[list][scan8[0]-2][0] = mv[0];
  646.                 h->mv_cache[list][scan8[0]-2][1] = mv[1] MV_OP;
  647.                 return s->current_picture_ptr->ref_index[list][(x4>>1) + (y4>>1)*h->b8_stride] REF_OP;
  648.                 SET_DIAG_MV(*2, >>1, s->mb_x*4+(i&7)-4+part_width, s->mb_y*4-1);
  649.             }
  650.         }
  651.         if(topright_ref == PART_NOT_AVAILABLE
  652.            && ((s->mb_y&1) || i >= scan8[0]+8) && (i&7)==4
  653.            && h->ref_cache[list][scan8[0]-1] != PART_NOT_AVAILABLE){
  654.             if(!MB_FIELD
  655.                && IS_INTERLACED(mb_types[h->left_mb_xy[0]])){
  656.                 SET_DIAG_MV(*2, >>1, s->mb_x*4-1, (s->mb_y|1)*4+(s->mb_y&1)*2+(i>>4)-1);
  657.             }
  658.             if(MB_FIELD
  659.                && !IS_INTERLACED(mb_types[h->left_mb_xy[0]])
  660.                && i >= scan8[0]+8){
  661.                 // left shift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's OK.
  662.                 SET_DIAG_MV(/2, <<1, s->mb_x*4-1, (s->mb_y&~1)*4 - 1 + ((i-scan8[0])>>3)*2);
  663.             }
  664.         }
  665. #undef SET_DIAG_MV
  666.     }
  667.     if(topright_ref != PART_NOT_AVAILABLE){
  668.         *C= h->mv_cache[list][ i - 8 + part_width ];
  669.         return topright_ref;
  670.     }else{
  671.         tprintf(s->avctx, "topright MV not availablen");
  672.         *C= h->mv_cache[list][ i - 8 - 1 ];
  673.         return h->ref_cache[list][ i - 8 - 1 ];
  674.     }
  675. }
  676. /**
  677.  * gets the predicted MV.
  678.  * @param n the block index
  679.  * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
  680.  * @param mx the x component of the predicted motion vector
  681.  * @param my the y component of the predicted motion vector
  682.  */
  683. void pred_motion(H264Context * const h, int n, int part_width, int list, int ref, int * const mx, int * const my)
  684. {
  685.     const int index8= scan8[n];
  686.     const int top_ref=      h->ref_cache[list][ index8 - 8 ];
  687.     const int left_ref=     h->ref_cache[list][ index8 - 1 ];
  688.     const int16_t * const A= h->mv_cache[list][ index8 - 1 ];
  689.     const int16_t * const B= h->mv_cache[list][ index8 - 8 ];
  690.     const int16_t * C;
  691.     int diagonal_ref, match_count;
  692.     assert(part_width==1 || part_width==2 || part_width==4);
  693. /* mv_cache
  694.   B . . A T T T T
  695.   U . . L . . , .
  696.   U . . L . . . .
  697.   U . . L . . , .
  698.   . . . L . . . .
  699. */
  700.     diagonal_ref= fetch_diagonal_mv(h, &C, index8, list, part_width);
  701.     match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref);
  702.     tprintf(h->s.avctx, "pred_motion match_count=%dn", match_count);
  703.     if(match_count > 1){ //most common
  704.         *mx= mid_pred(A[0], B[0], C[0]);
  705.         *my= mid_pred(A[1], B[1], C[1]);
  706.     }else if(match_count==1){
  707.         if(left_ref==ref){
  708.             *mx= A[0];
  709.             *my= A[1];
  710.         }else if(top_ref==ref){
  711.             *mx= B[0];
  712.             *my= B[1];
  713.         }else{
  714.             *mx= C[0];
  715.             *my= C[1];
  716.         }
  717.     }else{
  718.         if(top_ref == PART_NOT_AVAILABLE && diagonal_ref == PART_NOT_AVAILABLE && left_ref != PART_NOT_AVAILABLE){
  719.             *mx= A[0];
  720.             *my= A[1];
  721.         }else{
  722.             *mx= mid_pred(A[0], B[0], C[0]);
  723.             *my= mid_pred(A[1], B[1], C[1]);
  724.         }
  725.     }
  726.     tprintf(h->s.avctx, "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);
  727. }
  728. /**
  729.  * gets the directionally predicted 16x8 MV.
  730.  * @param n the block index
  731.  * @param mx the x component of the predicted motion vector
  732.  * @param my the y component of the predicted motion vector
  733.  */
  734. static inline void pred_16x8_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
  735.     if(n==0){
  736.         const int top_ref=      h->ref_cache[list][ scan8[0] - 8 ];
  737.         const int16_t * const B= h->mv_cache[list][ scan8[0] - 8 ];
  738.         tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %dn", top_ref, B[0], B[1], h->s.mb_x, h->s.mb_y, n, list);
  739.         if(top_ref == ref){
  740.             *mx= B[0];
  741.             *my= B[1];
  742.             return;
  743.         }
  744.     }else{
  745.         const int left_ref=     h->ref_cache[list][ scan8[8] - 1 ];
  746.         const int16_t * const A= h->mv_cache[list][ scan8[8] - 1 ];
  747.         tprintf(h->s.avctx, "pred_16x8: (%2d %2d %2d) at %2d %2d %d list %dn", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list);
  748.         if(left_ref == ref){
  749.             *mx= A[0];
  750.             *my= A[1];
  751.             return;
  752.         }
  753.     }
  754.     //RARE
  755.     pred_motion(h, n, 4, list, ref, mx, my);
  756. }
  757. /**
  758.  * gets the directionally predicted 8x16 MV.
  759.  * @param n the block index
  760.  * @param mx the x component of the predicted motion vector
  761.  * @param my the y component of the predicted motion vector
  762.  */
  763. static inline void pred_8x16_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
  764.     if(n==0){
  765.         const int left_ref=      h->ref_cache[list][ scan8[0] - 1 ];
  766.         const int16_t * const A=  h->mv_cache[list][ scan8[0] - 1 ];
  767.         tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %dn", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list);
  768.         if(left_ref == ref){
  769.             *mx= A[0];
  770.             *my= A[1];
  771.             return;
  772.         }
  773.     }else{
  774.         const int16_t * C;
  775.         int diagonal_ref;
  776.         diagonal_ref= fetch_diagonal_mv(h, &C, scan8[4], list, 2);
  777.         tprintf(h->s.avctx, "pred_8x16: (%2d %2d %2d) at %2d %2d %d list %dn", diagonal_ref, C[0], C[1], h->s.mb_x, h->s.mb_y, n, list);
  778.         if(diagonal_ref == ref){
  779.             *mx= C[0];
  780.             *my= C[1];
  781.             return;
  782.         }
  783.     }
  784.     //RARE
  785.     pred_motion(h, n, 2, list, ref, mx, my);
  786. }
  787. static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my){
  788.     const int top_ref = h->ref_cache[0][ scan8[0] - 8 ];
  789.     const int left_ref= h->ref_cache[0][ scan8[0] - 1 ];
  790.     tprintf(h->s.avctx, "pred_pskip: (%d) (%d) at %2d %2dn", top_ref, left_ref, h->s.mb_x, h->s.mb_y);
  791.     if(top_ref == PART_NOT_AVAILABLE || left_ref == PART_NOT_AVAILABLE
  792.        || !( top_ref | *(uint32_t*)h->mv_cache[0][ scan8[0] - 8 ])
  793.        || !(left_ref | *(uint32_t*)h->mv_cache[0][ scan8[0] - 1 ])){
  794.         *mx = *my = 0;
  795.         return;
  796.     }
  797.     pred_motion(h, 0, 4, 0, 0, mx, my);
  798.     return;
  799. }
  800. static int get_scale_factor(H264Context * const h, int poc, int poc1, int i){
  801.     int poc0 = h->ref_list[0][i].poc;
  802.     int td = av_clip(poc1 - poc0, -128, 127);
  803.     if(td == 0 || h->ref_list[0][i].long_ref){
  804.         return 256;
  805.     }else{
  806.         int tb = av_clip(poc - poc0, -128, 127);
  807.         int tx = (16384 + (FFABS(td) >> 1)) / td;
  808.         return av_clip((tb*tx + 32) >> 6, -1024, 1023);
  809.     }
  810. }
  811. static inline void direct_dist_scale_factor(H264Context * const h){
  812.     MpegEncContext * const s = &h->s;
  813.     const int poc = h->s.current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ];
  814.     const int poc1 = h->ref_list[1][0].poc;
  815.     int i, field;
  816.     for(field=0; field<2; field++){
  817.         const int poc  = h->s.current_picture_ptr->field_poc[field];
  818.         const int poc1 = h->ref_list[1][0].field_poc[field];
  819.         for(i=0; i < 2*h->ref_count[0]; i++)
  820.             h->dist_scale_factor_field[field][i^field] = get_scale_factor(h, poc, poc1, i+16);
  821.     }
  822.     for(i=0; i<h->ref_count[0]; i++){
  823.         h->dist_scale_factor[i] = get_scale_factor(h, poc, poc1, i);
  824.     }
  825. }
  826. static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field, int colfield, int mbafi){
  827.     MpegEncContext * const s = &h->s;
  828.     Picture * const ref1 = &h->ref_list[1][0];
  829.     int j, old_ref, rfield;
  830.     int start= mbafi ? 16                      : 0;
  831.     int end  = mbafi ? 16+2*h->ref_count[list] : h->ref_count[list];
  832.     int interl= mbafi || s->picture_structure != PICT_FRAME;
  833.     /* bogus; fills in for missing frames */
  834.     memset(map[list], 0, sizeof(map[list]));
  835.     for(rfield=0; rfield<2; rfield++){
  836.         for(old_ref=0; old_ref<ref1->ref_count[colfield][list]; old_ref++){
  837.             int poc = ref1->ref_poc[colfield][list][old_ref];
  838.             if     (!interl)
  839.                 poc |= 3;
  840.             else if( interl && (poc&3) == 3) //FIXME store all MBAFF references so this isnt needed
  841.                 poc= (poc&~3) + rfield + 1;
  842.             for(j=start; j<end; j++){
  843.                 if(4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3) == poc){
  844.                     int cur_ref= mbafi ? (j-16)^field : j;
  845.                     map[list][2*old_ref + (rfield^field) + 16] = cur_ref;
  846.                     if(rfield == field)
  847.                         map[list][old_ref] = cur_ref;
  848.                     break;
  849.                 }
  850.             }
  851.         }
  852.     }
  853. }
  854. static inline void direct_ref_list_init(H264Context * const h){
  855.     MpegEncContext * const s = &h->s;
  856.     Picture * const ref1 = &h->ref_list[1][0];
  857.     Picture * const cur = s->current_picture_ptr;
  858.     int list, j, field;
  859.     int sidx= (s->picture_structure&1)^1;
  860.     int ref1sidx= (ref1->reference&1)^1;
  861.     for(list=0; list<2; list++){
  862.         cur->ref_count[sidx][list] = h->ref_count[list];
  863.         for(j=0; j<h->ref_count[list]; j++)
  864.             cur->ref_poc[sidx][list][j] = 4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3);
  865.     }
  866.     if(s->picture_structure == PICT_FRAME){
  867.         memcpy(cur->ref_count[1], cur->ref_count[0], sizeof(cur->ref_count[0]));
  868.         memcpy(cur->ref_poc  [1], cur->ref_poc  [0], sizeof(cur->ref_poc  [0]));
  869.     }
  870.     cur->mbaff= FRAME_MBAFF;
  871.     if(cur->pict_type != FF_B_TYPE || h->direct_spatial_mv_pred)
  872.         return;
  873.     for(list=0; list<2; list++){
  874.         fill_colmap(h, h->map_col_to_list0, list, sidx, ref1sidx, 0);
  875.         for(field=0; field<2; field++)
  876.             fill_colmap(h, h->map_col_to_list0_field[field], list, field, field, 1);
  877.     }
  878. }
  879. static inline void pred_direct_motion(H264Context * const h, int *mb_type){
  880.     MpegEncContext * const s = &h->s;
  881.     int b8_stride = h->b8_stride;
  882.     int b4_stride = h->b_stride;
  883.     int mb_xy = h->mb_xy;
  884.     int mb_type_col[2];
  885.     int16_t (*l1mv0)[2], (*l1mv1)[2];
  886.     const int8_t *l1ref0, *l1ref1;
  887.     const int is_b8x8 = IS_8X8(*mb_type);
  888.     unsigned int sub_mb_type;
  889.     int i8, i4;
  890. #define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM)
  891.     if(IS_INTERLACED(h->ref_list[1][0].mb_type[mb_xy])){ // AFL/AFR/FR/FL -> AFL/FL
  892.         if(!IS_INTERLACED(*mb_type)){                    //     AFR/FR    -> AFL/FL
  893.             int cur_poc = s->current_picture_ptr->poc;
  894.             int *col_poc = h->ref_list[1]->field_poc;
  895.             int col_parity = FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc);
  896.             mb_xy= s->mb_x + ((s->mb_y&~1) + col_parity)*s->mb_stride;
  897.             b8_stride = 0;
  898.         }else if(!(s->picture_structure & h->ref_list[1][0].reference) && !h->ref_list[1][0].mbaff){// FL -> FL & differ parity
  899.             int fieldoff= 2*(h->ref_list[1][0].reference)-3;
  900.             mb_xy += s->mb_stride*fieldoff;
  901.         }
  902.         goto single_col;
  903.     }else{                                               // AFL/AFR/FR/FL -> AFR/FR
  904.         if(IS_INTERLACED(*mb_type)){                     // AFL       /FL -> AFR/FR
  905.             mb_xy= s->mb_x + (s->mb_y&~1)*s->mb_stride;
  906.             mb_type_col[0] = h->ref_list[1][0].mb_type[mb_xy];
  907.             mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy + s->mb_stride];
  908.             b8_stride *= 3;
  909.             b4_stride *= 6;
  910.             //FIXME IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag
  911.             if(    (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)
  912.                 && (mb_type_col[1] & MB_TYPE_16x16_OR_INTRA)
  913.                 && !is_b8x8){
  914.                 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
  915.                 *mb_type   |= MB_TYPE_16x8 |MB_TYPE_L0L1|MB_TYPE_DIRECT2; /* B_16x8 */
  916.             }else{
  917.                 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
  918.                 *mb_type   |= MB_TYPE_8x8|MB_TYPE_L0L1;
  919.             }
  920.         }else{                                           //     AFR/FR    -> AFR/FR
  921. single_col:
  922.             mb_type_col[0] =
  923.             mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy];
  924.             if(IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag){
  925.                 /* FIXME save sub mb types from previous frames (or derive from MVs)
  926.                 * so we know exactly what block size to use */
  927.                 sub_mb_type = MB_TYPE_8x8|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_4x4 */
  928.                 *mb_type   |= MB_TYPE_8x8|MB_TYPE_L0L1;
  929.             }else if(!is_b8x8 && (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)){
  930.                 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
  931.                 *mb_type   |= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_16x16 */
  932.             }else{
  933.                 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
  934.                 *mb_type   |= MB_TYPE_8x8|MB_TYPE_L0L1;
  935.             }
  936.         }
  937.     }
  938.     l1mv0  = &h->ref_list[1][0].motion_val[0][h->mb2b_xy [mb_xy]];
  939.     l1mv1  = &h->ref_list[1][0].motion_val[1][h->mb2b_xy [mb_xy]];
  940.     l1ref0 = &h->ref_list[1][0].ref_index [0][h->mb2b8_xy[mb_xy]];
  941.     l1ref1 = &h->ref_list[1][0].ref_index [1][h->mb2b8_xy[mb_xy]];
  942.     if(!b8_stride){
  943.         if(s->mb_y&1){
  944.             l1ref0 += h->b8_stride;
  945.             l1ref1 += h->b8_stride;
  946.             l1mv0  +=  2*b4_stride;
  947.             l1mv1  +=  2*b4_stride;
  948.         }
  949.     }
  950.     if(h->direct_spatial_mv_pred){
  951.         int ref[2];
  952.         int mv[2][2];
  953.         int list;
  954.         /* FIXME interlacing + spatial direct uses wrong colocated block positions */
  955.         /* ref = min(neighbors) */
  956.         for(list=0; list<2; list++){
  957.             int refa = h->ref_cache[list][scan8[0] - 1];
  958.             int refb = h->ref_cache[list][scan8[0] - 8];
  959.             int refc = h->ref_cache[list][scan8[0] - 8 + 4];
  960.             if(refc == PART_NOT_AVAILABLE)
  961.                 refc = h->ref_cache[list][scan8[0] - 8 - 1];
  962.             ref[list] = FFMIN3((unsigned)refa, (unsigned)refb, (unsigned)refc);
  963.             if(ref[list] < 0)
  964.                 ref[list] = -1;
  965.         }
  966.         if(ref[0] < 0 && ref[1] < 0){
  967.             ref[0] = ref[1] = 0;
  968.             mv[0][0] = mv[0][1] =
  969.             mv[1][0] = mv[1][1] = 0;
  970.         }else{
  971.             for(list=0; list<2; list++){
  972.                 if(ref[list] >= 0)
  973.                     pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]);
  974.                 else
  975.                     mv[list][0] = mv[list][1] = 0;
  976.             }
  977.         }
  978.         if(ref[1] < 0){
  979.             if(!is_b8x8)
  980.                 *mb_type &= ~MB_TYPE_L1;
  981.             sub_mb_type &= ~MB_TYPE_L1;
  982.         }else if(ref[0] < 0){
  983.             if(!is_b8x8)
  984.                 *mb_type &= ~MB_TYPE_L0;
  985.             sub_mb_type &= ~MB_TYPE_L0;
  986.         }
  987.         if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){
  988.             for(i8=0; i8<4; i8++){
  989.                 int x8 = i8&1;
  990.                 int y8 = i8>>1;
  991.                 int xy8 = x8+y8*b8_stride;
  992.                 int xy4 = 3*x8+y8*b4_stride;
  993.                 int a=0, b=0;
  994.                 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
  995.                     continue;
  996.                 h->sub_mb_type[i8] = sub_mb_type;
  997.                 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1);
  998.                 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1);
  999.                 if(!IS_INTRA(mb_type_col[y8])
  1000.                    && (   (l1ref0[xy8] == 0 && FFABS(l1mv0[xy4][0]) <= 1 && FFABS(l1mv0[xy4][1]) <= 1)
  1001.                        || (l1ref0[xy8]  < 0 && l1ref1[xy8] == 0 && FFABS(l1mv1[xy4][0]) <= 1 && FFABS(l1mv1[xy4][1]) <= 1))){
  1002.                     if(ref[0] > 0)
  1003.                         a= pack16to32(mv[0][0],mv[0][1]);
  1004.                     if(ref[1] > 0)
  1005.                         b= pack16to32(mv[1][0],mv[1][1]);
  1006.                 }else{
  1007.                     a= pack16to32(mv[0][0],mv[0][1]);
  1008.                     b= pack16to32(mv[1][0],mv[1][1]);
  1009.                 }
  1010.                 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, a, 4);
  1011.                 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, b, 4);
  1012.             }
  1013.         }else if(IS_16X16(*mb_type)){
  1014.             int a=0, b=0;
  1015.             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, (uint8_t)ref[0], 1);
  1016.             fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, (uint8_t)ref[1], 1);
  1017.             if(!IS_INTRA(mb_type_col[0])
  1018.                && (   (l1ref0[0] == 0 && FFABS(l1mv0[0][0]) <= 1 && FFABS(l1mv0[0][1]) <= 1)
  1019.                    || (l1ref0[0]  < 0 && l1ref1[0] == 0 && FFABS(l1mv1[0][0]) <= 1 && FFABS(l1mv1[0][1]) <= 1
  1020.                        && (h->x264_build>33 || !h->x264_build)))){
  1021.                 if(ref[0] > 0)
  1022.                     a= pack16to32(mv[0][0],mv[0][1]);
  1023.                 if(ref[1] > 0)
  1024.                     b= pack16to32(mv[1][0],mv[1][1]);
  1025.             }else{
  1026.                 a= pack16to32(mv[0][0],mv[0][1]);
  1027.                 b= pack16to32(mv[1][0],mv[1][1]);
  1028.             }
  1029.             fill_rectangle(&h->mv_cache[0][scan8[0]], 4, 4, 8, a, 4);
  1030.             fill_rectangle(&h->mv_cache[1][scan8[0]], 4, 4, 8, b, 4);
  1031.         }else{
  1032.             for(i8=0; i8<4; i8++){
  1033.                 const int x8 = i8&1;
  1034.                 const int y8 = i8>>1;
  1035.                 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
  1036.                     continue;
  1037.                 h->sub_mb_type[i8] = sub_mb_type;
  1038.                 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mv[0][0],mv[0][1]), 4);
  1039.                 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mv[1][0],mv[1][1]), 4);
  1040.                 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1);
  1041.                 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1);
  1042.                 /* col_zero_flag */
  1043.                 if(!IS_INTRA(mb_type_col[0]) && (   l1ref0[x8 + y8*b8_stride] == 0
  1044.                                               || (l1ref0[x8 + y8*b8_stride] < 0 && l1ref1[x8 + y8*b8_stride] == 0
  1045.                                                   && (h->x264_build>33 || !h->x264_build)))){
  1046.                     int16_t (*l1mv)[2]= l1ref0[x8 + y8*b8_stride] == 0 ? l1mv0 : l1mv1;
  1047.                     if(IS_SUB_8X8(sub_mb_type)){
  1048.                         const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride];
  1049.                         if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){
  1050.                             if(ref[0] == 0)
  1051.                                 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
  1052.                             if(ref[1] == 0)
  1053.                                 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
  1054.                         }
  1055.                     }else
  1056.                     for(i4=0; i4<4; i4++){
  1057.                         const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride];
  1058.                         if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){
  1059.                             if(ref[0] == 0)
  1060.                                 *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0;
  1061.                             if(ref[1] == 0)
  1062.                                 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = 0;
  1063.                         }
  1064.                     }
  1065.                 }
  1066.             }
  1067.         }
  1068.     }else{ /* direct temporal mv pred */
  1069.         const int *map_col_to_list0[2] = {h->map_col_to_list0[0], h->map_col_to_list0[1]};
  1070.         const int *dist_scale_factor = h->dist_scale_factor;
  1071.         int ref_offset= 0;
  1072.         if(FRAME_MBAFF && IS_INTERLACED(*mb_type)){
  1073.             map_col_to_list0[0] = h->map_col_to_list0_field[s->mb_y&1][0];
  1074.             map_col_to_list0[1] = h->map_col_to_list0_field[s->mb_y&1][1];
  1075.             dist_scale_factor   =h->dist_scale_factor_field[s->mb_y&1];
  1076.         }
  1077.         if(h->ref_list[1][0].mbaff && IS_INTERLACED(mb_type_col[0]))
  1078.             ref_offset += 16;
  1079.         if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){
  1080.             /* FIXME assumes direct_8x8_inference == 1 */
  1081.             int y_shift  = 2*!IS_INTERLACED(*mb_type);
  1082.             for(i8=0; i8<4; i8++){
  1083.                 const int x8 = i8&1;
  1084.                 const int y8 = i8>>1;
  1085.                 int ref0, scale;
  1086.                 int16_t (*l1mv)[2]= l1mv0;
  1087.                 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
  1088.                     continue;
  1089.                 h->sub_mb_type[i8] = sub_mb_type;
  1090.                 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1);
  1091.                 if(IS_INTRA(mb_type_col[y8])){
  1092.                     fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1);
  1093.                     fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
  1094.                     fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
  1095.                     continue;
  1096.                 }
  1097.                 ref0 = l1ref0[x8 + y8*b8_stride];
  1098.                 if(ref0 >= 0)
  1099.                     ref0 = map_col_to_list0[0][ref0 + ref_offset];
  1100.                 else{
  1101.                     ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset];
  1102.                     l1mv= l1mv1;
  1103.                 }
  1104.                 scale = dist_scale_factor[ref0];
  1105.                 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1);
  1106.                 {
  1107.                     const int16_t *mv_col = l1mv[x8*3 + y8*b4_stride];
  1108.                     int my_col = (mv_col[1]<<y_shift)/2;
  1109.                     int mx = (scale * mv_col[0] + 128) >> 8;
  1110.                     int my = (scale * my_col + 128) >> 8;
  1111.                     fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4);
  1112.                     fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-my_col), 4);
  1113.                 }
  1114.             }
  1115.             return;
  1116.         }
  1117.         /* one-to-one mv scaling */
  1118.         if(IS_16X16(*mb_type)){
  1119.             int ref, mv0, mv1;
  1120.             fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, 0, 1);
  1121.             if(IS_INTRA(mb_type_col[0])){
  1122.                 ref=mv0=mv1=0;
  1123.             }else{
  1124.                 const int ref0 = l1ref0[0] >= 0 ? map_col_to_list0[0][l1ref0[0] + ref_offset]
  1125.                                                 : map_col_to_list0[1][l1ref1[0] + ref_offset];
  1126.                 const int scale = dist_scale_factor[ref0];
  1127.                 const int16_t *mv_col = l1ref0[0] >= 0 ? l1mv0[0] : l1mv1[0];
  1128.                 int mv_l0[2];
  1129.                 mv_l0[0] = (scale * mv_col[0] + 128) >> 8;
  1130.                 mv_l0[1] = (scale * mv_col[1] + 128) >> 8;
  1131.                 ref= ref0;
  1132.                 mv0= pack16to32(mv_l0[0],mv_l0[1]);
  1133.                 mv1= pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]);
  1134.             }
  1135.             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1);
  1136.             fill_rectangle(&h-> mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4);
  1137.             fill_rectangle(&h-> mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4);
  1138.         }else{
  1139.             for(i8=0; i8<4; i8++){
  1140.                 const int x8 = i8&1;
  1141.                 const int y8 = i8>>1;
  1142.                 int ref0, scale;
  1143.                 int16_t (*l1mv)[2]= l1mv0;
  1144.                 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
  1145.                     continue;
  1146.                 h->sub_mb_type[i8] = sub_mb_type;
  1147.                 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1);
  1148.                 if(IS_INTRA(mb_type_col[0])){
  1149.                     fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1);
  1150.                     fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
  1151.                     fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
  1152.                     continue;
  1153.                 }
  1154.                 ref0 = l1ref0[x8 + y8*b8_stride] + ref_offset;
  1155.                 if(ref0 >= 0)
  1156.                     ref0 = map_col_to_list0[0][ref0];
  1157.                 else{
  1158.                     ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride] + ref_offset];
  1159.                     l1mv= l1mv1;
  1160.                 }
  1161.                 scale = dist_scale_factor[ref0];
  1162.                 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1);
  1163.                 if(IS_SUB_8X8(sub_mb_type)){
  1164.                     const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride];
  1165.                     int mx = (scale * mv_col[0] + 128) >> 8;
  1166.                     int my = (scale * mv_col[1] + 128) >> 8;
  1167.                     fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4);
  1168.                     fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-mv_col[1]), 4);
  1169.                 }else
  1170.                 for(i4=0; i4<4; i4++){
  1171.                     const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride];
  1172.                     int16_t *mv_l0 = h->mv_cache[0][scan8[i8*4+i4]];
  1173.                     mv_l0[0] = (scale * mv_col[0] + 128) >> 8;
  1174.                     mv_l0[1] = (scale * mv_col[1] + 128) >> 8;
  1175.                     *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] =
  1176.                         pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]);
  1177.                 }
  1178.             }
  1179.         }
  1180.     }
  1181. }
  1182. static inline void write_back_motion(H264Context *h, int mb_type){
  1183.     MpegEncContext * const s = &h->s;
  1184.     const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
  1185.     const int b8_xy= 2*s->mb_x + 2*s->mb_y*h->b8_stride;
  1186.     int list;
  1187.     if(!USES_LIST(mb_type, 0))
  1188.         fill_rectangle(&s->current_picture.ref_index[0][b8_xy], 2, 2, h->b8_stride, (uint8_t)LIST_NOT_USED, 1);
  1189.     for(list=0; list<h->list_count; list++){
  1190.         int y;
  1191.         if(!USES_LIST(mb_type, list))
  1192.             continue;
  1193.         for(y=0; y<4; y++){
  1194.             *(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];
  1195.             *(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];
  1196.         }
  1197.         if( h->pps.cabac ) {
  1198.             if(IS_SKIP(mb_type))
  1199.                 fill_rectangle(h->mvd_table[list][b_xy], 4, 4, h->b_stride, 0, 4);
  1200.             else
  1201.             for(y=0; y<4; y++){
  1202.                 *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+0 + 8*y];
  1203.                 *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+2 + 8*y];
  1204.             }
  1205.         }
  1206.         {
  1207.             int8_t *ref_index = &s->current_picture.ref_index[list][b8_xy];
  1208.             ref_index[0+0*h->b8_stride]= h->ref_cache[list][scan8[0]];
  1209.             ref_index[1+0*h->b8_stride]= h->ref_cache[list][scan8[4]];
  1210.             ref_index[0+1*h->b8_stride]= h->ref_cache[list][scan8[8]];
  1211.             ref_index[1+1*h->b8_stride]= h->ref_cache[list][scan8[12]];
  1212.         }
  1213.     }
  1214.     if(h->slice_type_nos == FF_B_TYPE && h->pps.cabac){
  1215.         if(IS_8X8(mb_type)){
  1216.             uint8_t *direct_table = &h->direct_table[b8_xy];
  1217.             direct_table[1+0*h->b8_stride] = IS_DIRECT(h->sub_mb_type[1]) ? 1 : 0;
  1218.             direct_table[0+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[2]) ? 1 : 0;
  1219.             direct_table[1+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[3]) ? 1 : 0;
  1220.         }
  1221.     }
  1222. }
  1223. /**
  1224.  * Decodes a network abstraction layer unit.
  1225.  * @param consumed is the number of bytes used as input
  1226.  * @param length is the length of the array
  1227.  * @param dst_length is the number of decoded bytes FIXME here or a decode rbsp tailing?
  1228.  * @returns decoded bytes, might be src+1 if no escapes
  1229.  */
  1230. static const uint8_t *decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){
  1231.     int i, si, di;
  1232.     uint8_t *dst;
  1233.     int bufidx;
  1234. //    src[0]&0x80;                //forbidden bit
  1235.     h->nal_ref_idc= src[0]>>5;
  1236.     h->nal_unit_type= src[0]&0x1F;
  1237.     src++; length--;
  1238. #if 0
  1239.     for(i=0; i<length; i++)
  1240.         printf("%2X ", src[i]);
  1241. #endif
  1242. #ifdef HAVE_FAST_UNALIGNED
  1243. # ifdef HAVE_FAST_64BIT
  1244. #   define RS 7
  1245.     for(i=0; i+1<length; i+=9){
  1246.         if(!((~*(uint64_t*)(src+i) & (*(uint64_t*)(src+i) - 0x0100010001000101ULL)) & 0x8000800080008080ULL))
  1247. # else
  1248. #   define RS 3
  1249.     for(i=0; i+1<length; i+=5){
  1250.         if(!((~*(uint32_t*)(src+i) & (*(uint32_t*)(src+i) - 0x01000101U)) & 0x80008080U))
  1251. # endif
  1252.             continue;
  1253.         if(i>0 && !src[i]) i--;
  1254.         while(src[i]) i++;
  1255. #else
  1256. #   define RS 0
  1257.     for(i=0; i+1<length; i+=2){
  1258.         if(src[i]) continue;
  1259.         if(i>0 && src[i-1]==0) i--;
  1260. #endif
  1261.         if(i+2<length && src[i+1]==0 && src[i+2]<=3){
  1262.             if(src[i+2]!=3){
  1263.                 /* startcode, so we must be past the end */
  1264.                 length=i;
  1265.             }
  1266.             break;
  1267.         }
  1268.         i-= RS;
  1269.     }
  1270.     if(i>=length-1){ //no escaped 0
  1271.         *dst_length= length;
  1272.         *consumed= length+1; //+1 for the header
  1273.         return src;
  1274.     }
  1275.     bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data
  1276.     h->rbsp_buffer[bufidx]= av_fast_realloc(h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE);
  1277.     dst= h->rbsp_buffer[bufidx];
  1278.     if (dst == NULL){
  1279.         return NULL;
  1280.     }
  1281. //printf("decoding escn");
  1282.     memcpy(dst, src, i);
  1283.     si=di=i;
  1284.     while(si+2<length){
  1285.         //remove escapes (very rare 1:2^22)
  1286.         if(src[si+2]>3){
  1287.             dst[di++]= src[si++];
  1288.             dst[di++]= src[si++];
  1289.         }else if(src[si]==0 && src[si+1]==0){
  1290.             if(src[si+2]==3){ //escape
  1291.                 dst[di++]= 0;
  1292.                 dst[di++]= 0;
  1293.                 si+=3;
  1294.                 continue;
  1295.             }else //next start code
  1296.                 goto nsc;
  1297.         }
  1298.         dst[di++]= src[si++];
  1299.     }
  1300.     while(si<length)
  1301.         dst[di++]= src[si++];
  1302. nsc:
  1303.     memset(dst+di, 0, FF_INPUT_BUFFER_PADDING_SIZE);
  1304.     *dst_length= di;
  1305.     *consumed= si + 1;//+1 for the header
  1306. //FIXME store exact number of bits in the getbitcontext (it is needed for decoding)
  1307.     return dst;
  1308. }
  1309. /**
  1310.  * identifies the exact end of the bitstream
  1311.  * @return the length of the trailing, or 0 if damaged
  1312.  */
  1313. static int decode_rbsp_trailing(H264Context *h, const uint8_t *src){
  1314.     int v= *src;
  1315.     int r;
  1316.     tprintf(h->s.avctx, "rbsp trailing %Xn", v);
  1317.     for(r=1; r<9; r++){
  1318.         if(v&1) return r;
  1319.         v>>=1;
  1320.     }
  1321.     return 0;
  1322. }
  1323. /**
  1324.  * IDCT transforms the 16 dc values and dequantizes them.
  1325.  * @param qp quantization parameter
  1326.  */
  1327. static void h264_luma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){
  1328. #define stride 16
  1329.     int i;
  1330.     int temp[16]; //FIXME check if this is a good idea
  1331.     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
  1332.     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
  1333. //memset(block, 64, 2*256);
  1334. //return;
  1335.     for(i=0; i<4; i++){
  1336.         const int offset= y_offset[i];
  1337.         const int z0= block[offset+stride*0] + block[offset+stride*4];
  1338.         const int z1= block[offset+stride*0] - block[offset+stride*4];
  1339.         const int z2= block[offset+stride*1] - block[offset+stride*5];
  1340.         const int z3= block[offset+stride*1] + block[offset+stride*5];
  1341.         temp[4*i+0]= z0+z3;
  1342.         temp[4*i+1]= z1+z2;
  1343.         temp[4*i+2]= z1-z2;
  1344.         temp[4*i+3]= z0-z3;
  1345.     }
  1346.     for(i=0; i<4; i++){
  1347.         const int offset= x_offset[i];
  1348.         const int z0= temp[4*0+i] + temp[4*2+i];
  1349.         const int z1= temp[4*0+i] - temp[4*2+i];
  1350.         const int z2= temp[4*1+i] - temp[4*3+i];
  1351.         const int z3= temp[4*1+i] + temp[4*3+i];
  1352.         block[stride*0 +offset]= ((((z0 + z3)*qmul + 128 ) >> 8)); //FIXME think about merging this into decode_residual
  1353.         block[stride*2 +offset]= ((((z1 + z2)*qmul + 128 ) >> 8));
  1354.         block[stride*8 +offset]= ((((z1 - z2)*qmul + 128 ) >> 8));
  1355.         block[stride*10+offset]= ((((z0 - z3)*qmul + 128 ) >> 8));
  1356.     }
  1357. }
  1358. #if 0
  1359. /**
  1360.  * DCT transforms the 16 dc values.
  1361.  * @param qp quantization parameter ??? FIXME
  1362.  */
  1363. static void h264_luma_dc_dct_c(DCTELEM *block/*, int qp*/){
  1364. //    const int qmul= dequant_coeff[qp][0];
  1365.     int i;
  1366.     int temp[16]; //FIXME check if this is a good idea
  1367.     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
  1368.     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
  1369.     for(i=0; i<4; i++){
  1370.         const int offset= y_offset[i];
  1371.         const int z0= block[offset+stride*0] + block[offset+stride*4];
  1372.         const int z1= block[offset+stride*0] - block[offset+stride*4];
  1373.         const int z2= block[offset+stride*1] - block[offset+stride*5];
  1374.         const int z3= block[offset+stride*1] + block[offset+stride*5];
  1375.         temp[4*i+0]= z0+z3;
  1376.         temp[4*i+1]= z1+z2;
  1377.         temp[4*i+2]= z1-z2;
  1378.         temp[4*i+3]= z0-z3;
  1379.     }
  1380.     for(i=0; i<4; i++){
  1381.         const int offset= x_offset[i];
  1382.         const int z0= temp[4*0+i] + temp[4*2+i];
  1383.         const int z1= temp[4*0+i] - temp[4*2+i];
  1384.         const int z2= temp[4*1+i] - temp[4*3+i];
  1385.         const int z3= temp[4*1+i] + temp[4*3+i];
  1386.         block[stride*0 +offset]= (z0 + z3)>>1;
  1387.         block[stride*2 +offset]= (z1 + z2)>>1;
  1388.         block[stride*8 +offset]= (z1 - z2)>>1;
  1389.         block[stride*10+offset]= (z0 - z3)>>1;
  1390.     }
  1391. }
  1392. #endif
  1393. #undef xStride
  1394. #undef stride
  1395. static void chroma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){
  1396.     const int stride= 16*2;
  1397.     const int xStride= 16;
  1398.     int a,b,c,d,e;
  1399.     a= block[stride*0 + xStride*0];
  1400.     b= block[stride*0 + xStride*1];
  1401.     c= block[stride*1 + xStride*0];
  1402.     d= block[stride*1 + xStride*1];
  1403.     e= a-b;
  1404.     a= a+b;
  1405.     b= c-d;
  1406.     c= c+d;
  1407.     block[stride*0 + xStride*0]= ((a+c)*qmul) >> 7;
  1408.     block[stride*0 + xStride*1]= ((e+b)*qmul) >> 7;
  1409.     block[stride*1 + xStride*0]= ((a-c)*qmul) >> 7;
  1410.     block[stride*1 + xStride*1]= ((e-b)*qmul) >> 7;
  1411. }
  1412. #if 0
  1413. static void chroma_dc_dct_c(DCTELEM *block){
  1414.     const int stride= 16*2;
  1415.     const int xStride= 16;
  1416.     int a,b,c,d,e;
  1417.     a= block[stride*0 + xStride*0];
  1418.     b= block[stride*0 + xStride*1];
  1419.     c= block[stride*1 + xStride*0];
  1420.     d= block[stride*1 + xStride*1];
  1421.     e= a-b;
  1422.     a= a+b;
  1423.     b= c-d;
  1424.     c= c+d;
  1425.     block[stride*0 + xStride*0]= (a+c);
  1426.     block[stride*0 + xStride*1]= (e+b);
  1427.     block[stride*1 + xStride*0]= (a-c);
  1428.     block[stride*1 + xStride*1]= (e-b);
  1429. }
  1430. #endif
  1431. /**
  1432.  * gets the chroma qp.
  1433.  */
  1434. static inline int get_chroma_qp(H264Context *h, int t, int qscale){
  1435.     return h->pps.chroma_qp_table[t][qscale];
  1436. }
  1437. static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list,
  1438.                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
  1439.                            int src_x_offset, int src_y_offset,
  1440.                            qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op){
  1441.     MpegEncContext * const s = &h->s;
  1442.     const int mx= h->mv_cache[list][ scan8[n] ][0] + src_x_offset*8;
  1443.     int my=       h->mv_cache[list][ scan8[n] ][1] + src_y_offset*8;
  1444.     const int luma_xy= (mx&3) + ((my&3)<<2);
  1445.     uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*h->mb_linesize;
  1446.     uint8_t * src_cb, * src_cr;
  1447.     int extra_width= h->emu_edge_width;
  1448.     int extra_height= h->emu_edge_height;
  1449.     int emu=0;
  1450.     const int full_mx= mx>>2;
  1451.     const int full_my= my>>2;
  1452.     const int pic_width  = 16*s->mb_width;
  1453.     const int pic_height = 16*s->mb_height >> MB_FIELD;
  1454.     if(mx&7) extra_width -= 3;
  1455.     if(my&7) extra_height -= 3;
  1456.     if(   full_mx < 0-extra_width
  1457.        || full_my < 0-extra_height
  1458.        || full_mx + 16/*FIXME*/ > pic_width + extra_width
  1459.        || full_my + 16/*FIXME*/ > pic_height + extra_height){
  1460.         ff_emulated_edge_mc(s->edge_emu_buffer, src_y - 2 - 2*h->mb_linesize, h->mb_linesize, 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, pic_width, pic_height);
  1461.             src_y= s->edge_emu_buffer + 2 + 2*h->mb_linesize;
  1462.         emu=1;
  1463.     }
  1464.     qpix_op[luma_xy](dest_y, src_y, h->mb_linesize); //FIXME try variable height perhaps?
  1465.     if(!square){
  1466.         qpix_op[luma_xy](dest_y + delta, src_y + delta, h->mb_linesize);
  1467.     }
  1468.     if(ENABLE_GRAY && s->flags&CODEC_FLAG_GRAY) return;
  1469.     if(MB_FIELD){
  1470.         // chroma offset when predicting from a field of opposite parity
  1471.         my += 2 * ((s->mb_y & 1) - (pic->reference - 1));
  1472.         emu |= (my>>3) < 0 || (my>>3) + 8 >= (pic_height>>1);
  1473.     }
  1474.     src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->mb_uvlinesize;
  1475.     src_cr= pic->data[2] + (mx>>3) + (my>>3)*h->mb_uvlinesize;
  1476.     if(emu){
  1477.         ff_emulated_edge_mc(s->edge_emu_buffer, src_cb, h->mb_uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1);
  1478.             src_cb= s->edge_emu_buffer;
  1479.     }
  1480.     chroma_op(dest_cb, src_cb, h->mb_uvlinesize, chroma_height, mx&7, my&7);
  1481.     if(emu){
  1482.         ff_emulated_edge_mc(s->edge_emu_buffer, src_cr, h->mb_uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), pic_width>>1, pic_height>>1);
  1483.             src_cr= s->edge_emu_buffer;
  1484.     }
  1485.     chroma_op(dest_cr, src_cr, h->mb_uvlinesize, chroma_height, mx&7, my&7);
  1486. }
  1487. static inline void mc_part_std(H264Context *h, int n, int square, int chroma_height, int delta,
  1488.                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
  1489.                            int x_offset, int y_offset,
  1490.                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
  1491.                            qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg,
  1492.                            int list0, int list1){
  1493.     MpegEncContext * const s = &h->s;
  1494.     qpel_mc_func *qpix_op=  qpix_put;
  1495.     h264_chroma_mc_func chroma_op= chroma_put;
  1496.     dest_y  += 2*x_offset + 2*y_offset*h->  mb_linesize;
  1497.     dest_cb +=   x_offset +   y_offset*h->mb_uvlinesize;
  1498.     dest_cr +=   x_offset +   y_offset*h->mb_uvlinesize;
  1499.     x_offset += 8*s->mb_x;
  1500.     y_offset += 8*(s->mb_y >> MB_FIELD);
  1501.     if(list0){
  1502.         Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ];
  1503.         mc_dir_part(h, ref, n, square, chroma_height, delta, 0,
  1504.                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1505.                            qpix_op, chroma_op);
  1506.         qpix_op=  qpix_avg;
  1507.         chroma_op= chroma_avg;
  1508.     }
  1509.     if(list1){
  1510.         Picture *ref= &h->ref_list[1][ h->ref_cache[1][ scan8[n] ] ];
  1511.         mc_dir_part(h, ref, n, square, chroma_height, delta, 1,
  1512.                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1513.                            qpix_op, chroma_op);
  1514.     }
  1515. }
  1516. static inline void mc_part_weighted(H264Context *h, int n, int square, int chroma_height, int delta,
  1517.                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
  1518.                            int x_offset, int y_offset,
  1519.                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
  1520.                            h264_weight_func luma_weight_op, h264_weight_func chroma_weight_op,
  1521.                            h264_biweight_func luma_weight_avg, h264_biweight_func chroma_weight_avg,
  1522.                            int list0, int list1){
  1523.     MpegEncContext * const s = &h->s;
  1524.     dest_y  += 2*x_offset + 2*y_offset*h->  mb_linesize;
  1525.     dest_cb +=   x_offset +   y_offset*h->mb_uvlinesize;
  1526.     dest_cr +=   x_offset +   y_offset*h->mb_uvlinesize;
  1527.     x_offset += 8*s->mb_x;
  1528.     y_offset += 8*(s->mb_y >> MB_FIELD);
  1529.     if(list0 && list1){
  1530.         /* don't optimize for luma-only case, since B-frames usually
  1531.          * use implicit weights => chroma too. */
  1532.         uint8_t *tmp_cb = s->obmc_scratchpad;
  1533.         uint8_t *tmp_cr = s->obmc_scratchpad + 8;
  1534.         uint8_t *tmp_y  = s->obmc_scratchpad + 8*h->mb_uvlinesize;
  1535.         int refn0 = h->ref_cache[0][ scan8[n] ];
  1536.         int refn1 = h->ref_cache[1][ scan8[n] ];
  1537.         mc_dir_part(h, &h->ref_list[0][refn0], n, square, chroma_height, delta, 0,
  1538.                     dest_y, dest_cb, dest_cr,
  1539.                     x_offset, y_offset, qpix_put, chroma_put);
  1540.         mc_dir_part(h, &h->ref_list[1][refn1], n, square, chroma_height, delta, 1,
  1541.                     tmp_y, tmp_cb, tmp_cr,
  1542.                     x_offset, y_offset, qpix_put, chroma_put);
  1543.         if(h->use_weight == 2){
  1544.             int weight0 = h->implicit_weight[refn0][refn1];
  1545.             int weight1 = 64 - weight0;
  1546.             luma_weight_avg(  dest_y,  tmp_y,  h->  mb_linesize, 5, weight0, weight1, 0);
  1547.             chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, weight1, 0);
  1548.             chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, weight1, 0);
  1549.         }else{
  1550.             luma_weight_avg(dest_y, tmp_y, h->mb_linesize, h->luma_log2_weight_denom,
  1551.                             h->luma_weight[0][refn0], h->luma_weight[1][refn1],
  1552.                             h->luma_offset[0][refn0] + h->luma_offset[1][refn1]);
  1553.             chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom,
  1554.                             h->chroma_weight[0][refn0][0], h->chroma_weight[1][refn1][0],
  1555.                             h->chroma_offset[0][refn0][0] + h->chroma_offset[1][refn1][0]);
  1556.             chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom,
  1557.                             h->chroma_weight[0][refn0][1], h->chroma_weight[1][refn1][1],
  1558.                             h->chroma_offset[0][refn0][1] + h->chroma_offset[1][refn1][1]);
  1559.         }
  1560.     }else{
  1561.         int list = list1 ? 1 : 0;
  1562.         int refn = h->ref_cache[list][ scan8[n] ];
  1563.         Picture *ref= &h->ref_list[list][refn];
  1564.         mc_dir_part(h, ref, n, square, chroma_height, delta, list,
  1565.                     dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1566.                     qpix_put, chroma_put);
  1567.         luma_weight_op(dest_y, h->mb_linesize, h->luma_log2_weight_denom,
  1568.                        h->luma_weight[list][refn], h->luma_offset[list][refn]);
  1569.         if(h->use_weight_chroma){
  1570.             chroma_weight_op(dest_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom,
  1571.                              h->chroma_weight[list][refn][0], h->chroma_offset[list][refn][0]);
  1572.             chroma_weight_op(dest_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom,
  1573.                              h->chroma_weight[list][refn][1], h->chroma_offset[list][refn][1]);
  1574.         }
  1575.     }
  1576. }
  1577. static inline void mc_part(H264Context *h, int n, int square, int chroma_height, int delta,
  1578.                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
  1579.                            int x_offset, int y_offset,
  1580.                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
  1581.                            qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg,
  1582.                            h264_weight_func *weight_op, h264_biweight_func *weight_avg,
  1583.                            int list0, int list1){
  1584.     if((h->use_weight==2 && list0 && list1
  1585.         && (h->implicit_weight[ h->ref_cache[0][scan8[n]] ][ h->ref_cache[1][scan8[n]] ] != 32))
  1586.        || h->use_weight==1)
  1587.         mc_part_weighted(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr,
  1588.                          x_offset, y_offset, qpix_put, chroma_put,
  1589.                          weight_op[0], weight_op[3], weight_avg[0], weight_avg[3], list0, list1);
  1590.     else
  1591.         mc_part_std(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr,
  1592.                     x_offset, y_offset, qpix_put, chroma_put, qpix_avg, chroma_avg, list0, list1);
  1593. }
  1594. static inline void prefetch_motion(H264Context *h, int list){
  1595.     /* fetch pixels for estimated mv 4 macroblocks ahead
  1596.      * optimized for 64byte cache lines */
  1597.     MpegEncContext * const s = &h->s;
  1598.     const int refn = h->ref_cache[list][scan8[0]];
  1599.     if(refn >= 0){
  1600.         const int mx= (h->mv_cache[list][scan8[0]][0]>>2) + 16*s->mb_x + 8;
  1601.         const int my= (h->mv_cache[list][scan8[0]][1]>>2) + 16*s->mb_y;
  1602.         uint8_t **src= h->ref_list[list][refn].data;
  1603.         int off= mx + (my + (s->mb_x&3)*4)*h->mb_linesize + 64;
  1604.         s->dsp.prefetch(src[0]+off, s->linesize, 4);
  1605.         off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64;
  1606.         s->dsp.prefetch(src[1]+off, src[2]-src[1], 2);
  1607.     }
  1608. }
  1609. static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
  1610.                       qpel_mc_func (*qpix_put)[16], h264_chroma_mc_func (*chroma_put),
  1611.                       qpel_mc_func (*qpix_avg)[16], h264_chroma_mc_func (*chroma_avg),
  1612.                       h264_weight_func *weight_op, h264_biweight_func *weight_avg){
  1613.     MpegEncContext * const s = &h->s;
  1614.     const int mb_xy= h->mb_xy;
  1615.     const int mb_type= s->current_picture.mb_type[mb_xy];
  1616.     assert(IS_INTER(mb_type));
  1617.     prefetch_motion(h, 0);
  1618.     if(IS_16X16(mb_type)){
  1619.         mc_part(h, 0, 1, 8, 0, dest_y, dest_cb, dest_cr, 0, 0,
  1620.                 qpix_put[0], chroma_put[0], qpix_avg[0], chroma_avg[0],
  1621.                 &weight_op[0], &weight_avg[0],
  1622.                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
  1623.     }else if(IS_16X8(mb_type)){
  1624.         mc_part(h, 0, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 0,
  1625.                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
  1626.                 &weight_op[1], &weight_avg[1],
  1627.                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
  1628.         mc_part(h, 8, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 4,
  1629.                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
  1630.                 &weight_op[1], &weight_avg[1],
  1631.                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
  1632.     }else if(IS_8X16(mb_type)){
  1633.         mc_part(h, 0, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 0, 0,
  1634.                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
  1635.                 &weight_op[2], &weight_avg[2],
  1636.                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
  1637.         mc_part(h, 4, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 4, 0,
  1638.                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
  1639.                 &weight_op[2], &weight_avg[2],
  1640.                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
  1641.     }else{
  1642.         int i;
  1643.         assert(IS_8X8(mb_type));
  1644.         for(i=0; i<4; i++){
  1645.             const int sub_mb_type= h->sub_mb_type[i];
  1646.             const int n= 4*i;
  1647.             int x_offset= (i&1)<<2;
  1648.             int y_offset= (i&2)<<1;
  1649.             if(IS_SUB_8X8(sub_mb_type)){
  1650.                 mc_part(h, n, 1, 4, 0, dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1651.                     qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
  1652.                     &weight_op[3], &weight_avg[3],
  1653.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1654.             }else if(IS_SUB_8X4(sub_mb_type)){
  1655.                 mc_part(h, n  , 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1656.                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
  1657.                     &weight_op[4], &weight_avg[4],
  1658.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1659.                 mc_part(h, n+2, 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset+2,
  1660.                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
  1661.                     &weight_op[4], &weight_avg[4],
  1662.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1663.             }else if(IS_SUB_4X8(sub_mb_type)){
  1664.                 mc_part(h, n  , 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset, y_offset,
  1665.                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
  1666.                     &weight_op[5], &weight_avg[5],
  1667.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1668.                 mc_part(h, n+1, 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset+2, y_offset,
  1669.                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
  1670.                     &weight_op[5], &weight_avg[5],
  1671.                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1672.             }else{
  1673.                 int j;
  1674.                 assert(IS_SUB_4X4(sub_mb_type));
  1675.                 for(j=0; j<4; j++){
  1676.                     int sub_x_offset= x_offset + 2*(j&1);
  1677.                     int sub_y_offset= y_offset +   (j&2);
  1678.                     mc_part(h, n+j, 1, 2, 0, dest_y, dest_cb, dest_cr, sub_x_offset, sub_y_offset,
  1679.                         qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
  1680.                         &weight_op[6], &weight_avg[6],
  1681.                         IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
  1682.                 }
  1683.             }
  1684.         }
  1685.     }
  1686.     prefetch_motion(h, 1);
  1687. }
  1688. static av_cold void init_cavlc_level_tab(void){
  1689.     int suffix_length, mask;
  1690.     unsigned int i;
  1691.     for(suffix_length=0; suffix_length<7; suffix_length++){
  1692.         for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
  1693.             int prefix= LEVEL_TAB_BITS - av_log2(2*i);
  1694.             int level_code= (prefix<<suffix_length) + (i>>(LEVEL_TAB_BITS-prefix-1-suffix_length)) - (1<<suffix_length);
  1695.             mask= -(level_code&1);
  1696.             level_code= (((2+level_code)>>1) ^ mask) - mask;
  1697.             if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
  1698.                 cavlc_level_tab[suffix_length][i][0]= level_code;
  1699.                 cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
  1700.             }else if(prefix + 1 <= LEVEL_TAB_BITS){
  1701.                 cavlc_level_tab[suffix_length][i][0]= prefix+100;
  1702.                 cavlc_level_tab[suffix_length][i][1]= prefix + 1;
  1703.             }else{
  1704.                 cavlc_level_tab[suffix_length][i][0]= LEVEL_TAB_BITS+100;
  1705.                 cavlc_level_tab[suffix_length][i][1]= LEVEL_TAB_BITS;
  1706.             }
  1707.         }
  1708.     }
  1709. }
  1710. static av_cold void decode_init_vlc(void){
  1711.     static int done = 0;
  1712.     if (!done) {
  1713.         int i;
  1714.         int offset;
  1715.         done = 1;
  1716.         chroma_dc_coeff_token_vlc.table = chroma_dc_coeff_token_vlc_table;
  1717.         chroma_dc_coeff_token_vlc.table_allocated = chroma_dc_coeff_token_vlc_table_size;
  1718.         init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5,
  1719.                  &chroma_dc_coeff_token_len [0], 1, 1,
  1720.                  &chroma_dc_coeff_token_bits[0], 1, 1,
  1721.                  INIT_VLC_USE_NEW_STATIC);
  1722.         offset = 0;
  1723.         for(i=0; i<4; i++){
  1724.             coeff_token_vlc[i].table = coeff_token_vlc_tables+offset;
  1725.             coeff_token_vlc[i].table_allocated = coeff_token_vlc_tables_size[i];
  1726.             init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17,
  1727.                      &coeff_token_len [i][0], 1, 1,
  1728.                      &coeff_token_bits[i][0], 1, 1,
  1729.                      INIT_VLC_USE_NEW_STATIC);
  1730.             offset += coeff_token_vlc_tables_size[i];
  1731.         }
  1732.         /*
  1733.          * This is a one time safety check to make sure that
  1734.          * the packed static coeff_token_vlc table sizes
  1735.          * were initialized correctly.
  1736.          */
  1737.         assert(offset == FF_ARRAY_ELEMS(coeff_token_vlc_tables));
  1738.         for(i=0; i<3; i++){
  1739.             chroma_dc_total_zeros_vlc[i].table = chroma_dc_total_zeros_vlc_tables[i];
  1740.             chroma_dc_total_zeros_vlc[i].table_allocated = chroma_dc_total_zeros_vlc_tables_size;
  1741.             init_vlc(&chroma_dc_total_zeros_vlc[i],
  1742.                      CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
  1743.                      &chroma_dc_total_zeros_len [i][0], 1, 1,
  1744.                      &chroma_dc_total_zeros_bits[i][0], 1, 1,
  1745.                      INIT_VLC_USE_NEW_STATIC);
  1746.         }
  1747.         for(i=0; i<15; i++){
  1748.             total_zeros_vlc[i].table = total_zeros_vlc_tables[i];
  1749.             total_zeros_vlc[i].table_allocated = total_zeros_vlc_tables_size;
  1750.             init_vlc(&total_zeros_vlc[i],
  1751.                      TOTAL_ZEROS_VLC_BITS, 16,
  1752.                      &total_zeros_len [i][0], 1, 1,
  1753.                      &total_zeros_bits[i][0], 1, 1,
  1754.                      INIT_VLC_USE_NEW_STATIC);
  1755.         }
  1756.         for(i=0; i<6; i++){
  1757.             run_vlc[i].table = run_vlc_tables[i];
  1758.             run_vlc[i].table_allocated = run_vlc_tables_size;
  1759.             init_vlc(&run_vlc[i],
  1760.                      RUN_VLC_BITS, 7,
  1761.                      &run_len [i][0], 1, 1,
  1762.                      &run_bits[i][0], 1, 1,
  1763.                      INIT_VLC_USE_NEW_STATIC);
  1764.         }
  1765.         run7_vlc.table = run7_vlc_table,
  1766.         run7_vlc.table_allocated = run7_vlc_table_size;
  1767.         init_vlc(&run7_vlc, RUN7_VLC_BITS, 16,
  1768.                  &run_len [6][0], 1, 1,
  1769.                  &run_bits[6][0], 1, 1,
  1770.                  INIT_VLC_USE_NEW_STATIC);
  1771.         init_cavlc_level_tab();
  1772.     }
  1773. }
  1774. static void free_tables(H264Context *h){
  1775.     int i;
  1776.     H264Context *hx;
  1777.     av_freep(&h->intra4x4_pred_mode);
  1778.     av_freep(&h->chroma_pred_mode_table);
  1779.     av_freep(&h->cbp_table);
  1780.     av_freep(&h->mvd_table[0]);
  1781.     av_freep(&h->mvd_table[1]);
  1782.     av_freep(&h->direct_table);
  1783.     av_freep(&h->non_zero_count);
  1784.     av_freep(&h->slice_table_base);
  1785.     h->slice_table= NULL;
  1786.     av_freep(&h->mb2b_xy);
  1787.     av_freep(&h->mb2b8_xy);
  1788.     for(i = 0; i < h->s.avctx->thread_count; i++) {
  1789.         hx = h->thread_context[i];
  1790.         if(!hx) continue;
  1791.         av_freep(&hx->top_borders[1]);
  1792.         av_freep(&hx->top_borders[0]);
  1793.         av_freep(&hx->s.obmc_scratchpad);
  1794.     }
  1795. }
  1796. static void init_dequant8_coeff_table(H264Context *h){
  1797.     int i,q,x;
  1798.     const int transpose = (h->s.dsp.h264_idct8_add != ff_h264_idct8_add_c); //FIXME ugly
  1799.     h->dequant8_coeff[0] = h->dequant8_buffer[0];
  1800.     h->dequant8_coeff[1] = h->dequant8_buffer[1];
  1801.     for(i=0; i<2; i++ ){
  1802.         if(i && !memcmp(h->pps.scaling_matrix8[0], h->pps.scaling_matrix8[1], 64*sizeof(uint8_t))){
  1803.             h->dequant8_coeff[1] = h->dequant8_buffer[0];
  1804.             break;
  1805.         }
  1806.         for(q=0; q<52; q++){
  1807.             int shift = div6[q];
  1808.             int idx = rem6[q];
  1809.             for(x=0; x<64; x++)
  1810.                 h->dequant8_coeff[i][q][transpose ? (x>>3)|((x&7)<<3) : x] =
  1811.                     ((uint32_t)dequant8_coeff_init[idx][ dequant8_coeff_init_scan[((x>>1)&12) | (x&3)] ] *
  1812.                     h->pps.scaling_matrix8[i][x]) << shift;
  1813.         }
  1814.     }
  1815. }
  1816. static void init_dequant4_coeff_table(H264Context *h){
  1817.     int i,j,q,x;
  1818.     const int transpose = (h->s.dsp.h264_idct_add != ff_h264_idct_add_c); //FIXME ugly
  1819.     for(i=0; i<6; i++ ){
  1820.         h->dequant4_coeff[i] = h->dequant4_buffer[i];
  1821.         for(j=0; j<i; j++){
  1822.             if(!memcmp(h->pps.scaling_matrix4[j], h->pps.scaling_matrix4[i], 16*sizeof(uint8_t))){
  1823.                 h->dequant4_coeff[i] = h->dequant4_buffer[j];
  1824.                 break;
  1825.             }
  1826.         }
  1827.         if(j<i)
  1828.             continue;
  1829.         for(q=0; q<52; q++){
  1830.             int shift = div6[q] + 2;
  1831.             int idx = rem6[q];
  1832.             for(x=0; x<16; x++)
  1833.                 h->dequant4_coeff[i][q][transpose ? (x>>2)|((x<<2)&0xF) : x] =
  1834.                     ((uint32_t)dequant4_coeff_init[idx][(x&1) + ((x>>2)&1)] *
  1835.                     h->pps.scaling_matrix4[i][x]) << shift;
  1836.         }
  1837.     }
  1838. }
  1839. static void init_dequant_tables(H264Context *h){
  1840.     int i,x;
  1841.     init_dequant4_coeff_table(h);
  1842.     if(h->pps.transform_8x8_mode)
  1843.         init_dequant8_coeff_table(h);
  1844.     if(h->sps.transform_bypass){
  1845.         for(i=0; i<6; i++)
  1846.             for(x=0; x<16; x++)
  1847.                 h->dequant4_coeff[i][0][x] = 1<<6;
  1848.         if(h->pps.transform_8x8_mode)
  1849.             for(i=0; i<2; i++)
  1850.                 for(x=0; x<64; x++)
  1851.                     h->dequant8_coeff[i][0][x] = 1<<6;
  1852.     }
  1853. }
  1854. /**
  1855.  * allocates tables.
  1856.  * needs width/height
  1857.  */
  1858. int alloc_tables(H264Context *h)
  1859. {
  1860.     MpegEncContext * const s = &h->s;
  1861.     const int big_mb_num= s->mb_stride * (s->mb_height+1);
  1862.     int x,y;
  1863.     CHECKED_ALLOCZ(h->intra4x4_pred_mode, big_mb_num * 8  * sizeof(uint8_t))
  1864.     CHECKED_ALLOCZ(h->non_zero_count    , big_mb_num * 16 * sizeof(uint8_t))
  1865.     CHECKED_ALLOCZ(h->slice_table_base  , (big_mb_num+s->mb_stride) * sizeof(*h->slice_table_base))
  1866.     CHECKED_ALLOCZ(h->cbp_table, big_mb_num * sizeof(uint16_t))
  1867.     CHECKED_ALLOCZ(h->chroma_pred_mode_table, big_mb_num * sizeof(uint8_t))
  1868.     CHECKED_ALLOCZ(h->mvd_table[0], 32*big_mb_num * sizeof(uint16_t));
  1869.     CHECKED_ALLOCZ(h->mvd_table[1], 32*big_mb_num * sizeof(uint16_t));
  1870.     CHECKED_ALLOCZ(h->direct_table, 32*big_mb_num * sizeof(uint8_t));
  1871.     memset(h->slice_table_base, -1, (big_mb_num+s->mb_stride)  * sizeof(*h->slice_table_base));
  1872.     h->slice_table= h->slice_table_base + s->mb_stride*2 + 1;
  1873.     CHECKED_ALLOCZ(h->mb2b_xy  , big_mb_num * sizeof(uint32_t));
  1874.     CHECKED_ALLOCZ(h->mb2b8_xy , big_mb_num * sizeof(uint32_t));
  1875.     for(y=0; y<s->mb_height; y++){
  1876.         for(x=0; x<s->mb_width; x++){
  1877.             const int mb_xy= x + y*s->mb_stride;
  1878.             const int b_xy = 4*x + 4*y*h->b_stride;
  1879.             const int b8_xy= 2*x + 2*y*h->b8_stride;
  1880.             h->mb2b_xy [mb_xy]= b_xy;
  1881.             h->mb2b8_xy[mb_xy]= b8_xy;
  1882.         }
  1883.     }
  1884.     s->obmc_scratchpad = NULL;
  1885.     if(!h->dequant4_coeff[0])
  1886.         init_dequant_tables(h);
  1887.     return 0;
  1888. fail:
  1889.     free_tables(h);
  1890.     return -1;
  1891. }
  1892. /**
  1893.  * Mimic alloc_tables(), but for every context thread.
  1894.  */
  1895. static void clone_tables(H264Context *dst, H264Context *src){
  1896.     dst->intra4x4_pred_mode       = src->intra4x4_pred_mode;
  1897.     dst->non_zero_count           = src->non_zero_count;
  1898.     dst->slice_table              = src->slice_table;
  1899.     dst->cbp_table                = src->cbp_table;
  1900.     dst->mb2b_xy                  = src->mb2b_xy;
  1901.     dst->mb2b8_xy                 = src->mb2b8_xy;
  1902.     dst->chroma_pred_mode_table   = src->chroma_pred_mode_table;
  1903.     dst->mvd_table[0]             = src->mvd_table[0];
  1904.     dst->mvd_table[1]             = src->mvd_table[1];
  1905.     dst->direct_table             = src->direct_table;
  1906.     dst->s.obmc_scratchpad = NULL;
  1907.     ff_h264_pred_init(&dst->hpc, src->s.codec_id);
  1908. }
  1909. /**
  1910.  * Init context
  1911.  * Allocate buffers which are not shared amongst multiple threads.
  1912.  */
  1913. static int context_init(H264Context *h){
  1914.     CHECKED_ALLOCZ(h->top_borders[0], h->s.mb_width * (16+8+8) * sizeof(uint8_t))
  1915.     CHECKED_ALLOCZ(h->top_borders[1], h->s.mb_width * (16+8+8) * sizeof(uint8_t))
  1916.     return 0;
  1917. fail:
  1918.     return -1; // free_tables will clean up for us
  1919. }
  1920. static av_cold void common_init(H264Context *h){
  1921.     MpegEncContext * const s = &h->s;
  1922.     s->width = s->avctx->width;
  1923.     s->height = s->avctx->height;
  1924.     s->codec_id= s->avctx->codec->id;
  1925.     ff_h264_pred_init(&h->hpc, s->codec_id);
  1926.     h->dequant_coeff_pps= -1;
  1927.     s->unrestricted_mv=1;
  1928.     s->decode=1; //FIXME
  1929.     dsputil_init(&s->dsp, s->avctx); // needed so that idct permutation is known early
  1930.     memset(h->pps.scaling_matrix4, 16, 6*16*sizeof(uint8_t));
  1931.     memset(h->pps.scaling_matrix8, 16, 2*64*sizeof(uint8_t));
  1932. }
  1933. int decode_init(AVCodecContext *avctx)
  1934. {
  1935.     H264Context *h= avctx->priv_data;
  1936.     MpegEncContext * const s = &h->s;
  1937.     MPV_decode_defaults(s);
  1938.     s->avctx = avctx;
  1939.     common_init(h);
  1940.     s->out_format = FMT_H264;
  1941.     s->workaround_bugs= avctx->workaround_bugs;
  1942.     // set defaults
  1943. //    s->decode_mb= ff_h263_decode_mb;
  1944.     s->quarter_sample = 1;
  1945.     s->low_delay= 1;
  1946.     if(avctx->codec_id == CODEC_ID_SVQ3)
  1947.         avctx->pix_fmt= PIX_FMT_YUVJ420P;
  1948.     else if(avctx->codec_id == CODEC_ID_H264_VDPAU)
  1949.         avctx->pix_fmt= PIX_FMT_VDPAU_H264;
  1950.     else
  1951.         avctx->pix_fmt= PIX_FMT_YUV420P;
  1952.     decode_init_vlc();
  1953.     if(avctx->extradata_size > 0 && avctx->extradata &&
  1954.        *(char *)avctx->extradata == 1){
  1955.         h->is_avc = 1;
  1956.         h->got_avcC = 0;
  1957.     } else {
  1958.         h->is_avc = 0;
  1959.     }
  1960.     h->thread_context[0] = h;
  1961.     h->outputed_poc = INT_MIN;
  1962.     h->prev_poc_msb= 1<<16;
  1963.     return 0;
  1964. }
  1965. int frame_start(H264Context *h)
  1966. {
  1967.     MpegEncContext * const s = &h->s;
  1968.     int i;
  1969.     if(MPV_frame_start(s, s->avctx) < 0)
  1970.         return -1;
  1971.     ff_er_frame_start(s);
  1972.     /*
  1973.      * MPV_frame_start uses pict_type to derive key_frame.
  1974.      * This is incorrect for H.264; IDR markings must be used.
  1975.      * Zero here; IDR markings per slice in frame or fields are ORed in later.
  1976.      * See decode_nal_units().
  1977.      */
  1978.     s->current_picture_ptr->key_frame= 0;
  1979.     assert(s->linesize && s->uvlinesize);
  1980.     for(i=0; i<16; i++){
  1981.         h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3);
  1982.         h->block_offset[24+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->linesize*((scan8[i] - scan8[0])>>3);
  1983.     }
  1984.     for(i=0; i<4; i++){
  1985.         h->block_offset[16+i]=
  1986.         h->block_offset[20+i]= 4*((scan8[i] - scan8[0])&7) + 4*s->uvlinesize*((scan8[i] - scan8[0])>>3);
  1987.         h->block_offset[24+16+i]=
  1988.         h->block_offset[24+20+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->uvlinesize*((scan8[i] - scan8[0])>>3);
  1989.     }
  1990.     /* can't be in alloc_tables because linesize isn't known there.
  1991.      * FIXME: redo bipred weight to not require extra buffer? */
  1992.     for(i = 0; i < s->avctx->thread_count; i++)
  1993.         if(!h->thread_context[i]->s.obmc_scratchpad)
  1994.             h->thread_context[i]->s.obmc_scratchpad = av_malloc(16*2*s->linesize + 8*2*s->uvlinesize);
  1995.     /* some macroblocks will be accessed before they're available */
  1996.     if(FRAME_MBAFF || s->avctx->thread_count > 1)
  1997.         memset(h->slice_table, -1, (s->mb_height*s->mb_stride-1) * sizeof(*h->slice_table));
  1998. //    s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1;
  1999.     // We mark the current picture as non-reference after allocating it, so
  2000.     // that if we break out due to an error it can be released automatically
  2001.     // in the next MPV_frame_start().
  2002.     // SVQ3 as well as most other codecs have only last/next/current and thus
  2003.     // get released even with set reference, besides SVQ3 and others do not
  2004.     // mark frames as reference later "naturally".
  2005.     if(s->codec_id != CODEC_ID_SVQ3)
  2006.         s->current_picture_ptr->reference= 0;
  2007.     s->current_picture_ptr->field_poc[0]=
  2008.     s->current_picture_ptr->field_poc[1]= INT_MAX;
  2009.     assert(s->current_picture_ptr->long_ref==0);
  2010.     return 0;
  2011. }
  2012. static inline void backup_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int simple){
  2013.     MpegEncContext * const s = &h->s;
  2014.     int i;
  2015.     int step    = 1;
  2016.     int offset  = 1;
  2017.     int uvoffset= 1;
  2018.     int top_idx = 1;
  2019.     int skiplast= 0;
  2020.     src_y  -=   linesize;
  2021.     src_cb -= uvlinesize;
  2022.     src_cr -= uvlinesize;
  2023.     if(!simple && FRAME_MBAFF){
  2024.         if(s->mb_y&1){
  2025.             offset  = MB_MBAFF ? 1 : 17;
  2026.             uvoffset= MB_MBAFF ? 1 : 9;
  2027.             if(!MB_MBAFF){
  2028.                 *(uint64_t*)(h->top_borders[0][s->mb_x]+ 0)= *(uint64_t*)(src_y +  15*linesize);
  2029.                 *(uint64_t*)(h->top_borders[0][s->mb_x]+ 8)= *(uint64_t*)(src_y +8+15*linesize);
  2030.                 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
  2031.                     *(uint64_t*)(h->top_borders[0][s->mb_x]+16)= *(uint64_t*)(src_cb+7*uvlinesize);
  2032.                     *(uint64_t*)(h->top_borders[0][s->mb_x]+24)= *(uint64_t*)(src_cr+7*uvlinesize);
  2033.                 }
  2034.             }
  2035.         }else{
  2036.             if(!MB_MBAFF){
  2037.                 h->left_border[0]= h->top_borders[0][s->mb_x][15];
  2038.                 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
  2039.                     h->left_border[34   ]= h->top_borders[0][s->mb_x][16+7  ];
  2040.                     h->left_border[34+18]= h->top_borders[0][s->mb_x][16+8+7];
  2041.                 }
  2042.                 skiplast= 1;
  2043.             }
  2044.             offset  =
  2045.             uvoffset=
  2046.             top_idx = MB_MBAFF ? 0 : 1;
  2047.         }
  2048.         step= MB_MBAFF ? 2 : 1;
  2049.     }
  2050.     // There are two lines saved, the line above the the top macroblock of a pair,
  2051.     // and the line above the bottom macroblock
  2052.     h->left_border[offset]= h->top_borders[top_idx][s->mb_x][15];
  2053.     for(i=1; i<17 - skiplast; i++){
  2054.         h->left_border[offset+i*step]= src_y[15+i*  linesize];
  2055.     }
  2056.     *(uint64_t*)(h->top_borders[top_idx][s->mb_x]+0)= *(uint64_t*)(src_y +  16*linesize);
  2057.     *(uint64_t*)(h->top_borders[top_idx][s->mb_x]+8)= *(uint64_t*)(src_y +8+16*linesize);
  2058.     if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
  2059.         h->left_border[uvoffset+34   ]= h->top_borders[top_idx][s->mb_x][16+7];
  2060.         h->left_border[uvoffset+34+18]= h->top_borders[top_idx][s->mb_x][24+7];
  2061.         for(i=1; i<9 - skiplast; i++){
  2062.             h->left_border[uvoffset+34   +i*step]= src_cb[7+i*uvlinesize];
  2063.             h->left_border[uvoffset+34+18+i*step]= src_cr[7+i*uvlinesize];
  2064.         }
  2065.         *(uint64_t*)(h->top_borders[top_idx][s->mb_x]+16)= *(uint64_t*)(src_cb+8*uvlinesize);
  2066.         *(uint64_t*)(h->top_borders[top_idx][s->mb_x]+24)= *(uint64_t*)(src_cr+8*uvlinesize);
  2067.     }
  2068. }
  2069. 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, int simple){
  2070.     MpegEncContext * const s = &h->s;
  2071.     int temp8, i;
  2072.     uint64_t temp64;
  2073.     int deblock_left;
  2074.     int deblock_top;
  2075.     int mb_xy;
  2076.     int step    = 1;
  2077.     int offset  = 1;
  2078.     int uvoffset= 1;
  2079.     int top_idx = 1;
  2080.     if(!simple && FRAME_MBAFF){
  2081.         if(s->mb_y&1){
  2082.             offset  = MB_MBAFF ? 1 : 17;
  2083.             uvoffset= MB_MBAFF ? 1 : 9;
  2084.         }else{
  2085.             offset  =
  2086.             uvoffset=
  2087.             top_idx = MB_MBAFF ? 0 : 1;
  2088.         }
  2089.         step= MB_MBAFF ? 2 : 1;
  2090.     }
  2091.     if(h->deblocking_filter == 2) {
  2092.         mb_xy = h->mb_xy;
  2093.         deblock_left = h->slice_table[mb_xy] == h->slice_table[mb_xy - 1];
  2094.         deblock_top  = h->slice_table[mb_xy] == h->slice_table[h->top_mb_xy];
  2095.     } else {
  2096.         deblock_left = (s->mb_x > 0);
  2097.         deblock_top =  (s->mb_y > !!MB_FIELD);
  2098.     }
  2099.     src_y  -=   linesize + 1;
  2100.     src_cb -= uvlinesize + 1;
  2101.     src_cr -= uvlinesize + 1;
  2102. #define XCHG(a,b,t,xchg)
  2103. t= a;
  2104. if(xchg)
  2105.     a= b;
  2106. b= t;
  2107.     if(deblock_left){
  2108.         for(i = !deblock_top; i<16; i++){
  2109.             XCHG(h->left_border[offset+i*step], src_y [i*  linesize], temp8, xchg);
  2110.         }
  2111.         XCHG(h->left_border[offset+i*step], src_y [i*  linesize], temp8, 1);
  2112.     }
  2113.     if(deblock_top){
  2114.         XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+0), *(uint64_t*)(src_y +1), temp64, xchg);
  2115.         XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+8), *(uint64_t*)(src_y +9), temp64, 1);
  2116.         if(s->mb_x+1 < s->mb_width){
  2117.             XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x+1]), *(uint64_t*)(src_y +17), temp64, 1);
  2118.         }
  2119.     }
  2120.     if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
  2121.         if(deblock_left){
  2122.             for(i = !deblock_top; i<8; i++){
  2123.                 XCHG(h->left_border[uvoffset+34   +i*step], src_cb[i*uvlinesize], temp8, xchg);
  2124.                 XCHG(h->left_border[uvoffset+34+18+i*step], src_cr[i*uvlinesize], temp8, xchg);
  2125.             }
  2126.             XCHG(h->left_border[uvoffset+34   +i*step], src_cb[i*uvlinesize], temp8, 1);
  2127.             XCHG(h->left_border[uvoffset+34+18+i*step], src_cr[i*uvlinesize], temp8, 1);
  2128.         }
  2129.         if(deblock_top){
  2130.             XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+16), *(uint64_t*)(src_cb+1), temp64, 1);
  2131.             XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+24), *(uint64_t*)(src_cr+1), temp64, 1);
  2132.         }
  2133.     }
  2134. }
  2135. static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple){
  2136.     MpegEncContext * const s = &h->s;
  2137.     const int mb_x= s->mb_x;
  2138.     const int mb_y= s->mb_y;
  2139.     const int mb_xy= h->mb_xy;
  2140.     const int mb_type= s->current_picture.mb_type[mb_xy];
  2141.     uint8_t  *dest_y, *dest_cb, *dest_cr;
  2142.     int linesize, uvlinesize /*dct_offset*/;
  2143.     int i;
  2144.     int *block_offset = &h->block_offset[0];
  2145.     const int transform_bypass = !simple && (s->qscale == 0 && h->sps.transform_bypass);
  2146.     /* is_h264 should always be true if SVQ3 is disabled. */
  2147.     const int is_h264 = !ENABLE_SVQ3_DECODER || simple || s->codec_id == CODEC_ID_H264;
  2148.     void (*idct_add)(uint8_t *dst, DCTELEM *block, int stride);
  2149.     void (*idct_dc_add)(uint8_t *dst, DCTELEM *block, int stride);
  2150.     dest_y  = s->current_picture.data[0] + (mb_x + mb_y * s->linesize  ) * 16;
  2151.     dest_cb = s->current_picture.data[1] + (mb_x + mb_y * s->uvlinesize) * 8;
  2152.     dest_cr = s->current_picture.data[2] + (mb_x + mb_y * s->uvlinesize) * 8;
  2153.     s->dsp.prefetch(dest_y + (s->mb_x&3)*4*s->linesize + 64, s->linesize, 4);
  2154.     s->dsp.prefetch(dest_cb + (s->mb_x&7)*s->uvlinesize + 64, dest_cr - dest_cb, 2);
  2155.     if (!simple && MB_FIELD) {
  2156.         linesize   = h->mb_linesize   = s->linesize * 2;
  2157.         uvlinesize = h->mb_uvlinesize = s->uvlinesize * 2;
  2158.         block_offset = &h->block_offset[24];
  2159.         if(mb_y&1){ //FIXME move out of this function?
  2160.             dest_y -= s->linesize*15;
  2161.             dest_cb-= s->uvlinesize*7;
  2162.             dest_cr-= s->uvlinesize*7;
  2163.         }
  2164.         if(FRAME_MBAFF) {
  2165.             int list;
  2166.             for(list=0; list<h->list_count; list++){
  2167.                 if(!USES_LIST(mb_type, list))
  2168.                     continue;
  2169.                 if(IS_16X16(mb_type)){
  2170.                     int8_t *ref = &h->ref_cache[list][scan8[0]];
  2171.                     fill_rectangle(ref, 4, 4, 8, (16+*ref)^(s->mb_y&1), 1);
  2172.                 }else{
  2173.                     for(i=0; i<16; i+=4){
  2174.                         int ref = h->ref_cache[list][scan8[i]];
  2175.                         if(ref >= 0)
  2176.                             fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, 8, (16+ref)^(s->mb_y&1), 1);
  2177.                     }
  2178.                 }
  2179.             }
  2180.         }
  2181.     } else {
  2182.         linesize   = h->mb_linesize   = s->linesize;
  2183.         uvlinesize = h->mb_uvlinesize = s->uvlinesize;
  2184. //        dct_offset = s->linesize * 16;
  2185.     }
  2186.     if (!simple && IS_INTRA_PCM(mb_type)) {
  2187.         for (i=0; i<16; i++) {
  2188.             memcpy(dest_y + i*  linesize, h->mb       + i*8, 16);
  2189.         }
  2190.         for (i=0; i<8; i++) {
  2191.             memcpy(dest_cb+ i*uvlinesize, h->mb + 128 + i*4,  8);
  2192.             memcpy(dest_cr+ i*uvlinesize, h->mb + 160 + i*4,  8);
  2193.         }
  2194.     } else {
  2195.         if(IS_INTRA(mb_type)){
  2196.             if(h->deblocking_filter)
  2197.                 xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 1, simple);
  2198.             if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
  2199.                 h->hpc.pred8x8[ h->chroma_pred_mode ](dest_cb, uvlinesize);
  2200.                 h->hpc.pred8x8[ h->chroma_pred_mode ](dest_cr, uvlinesize);
  2201.             }
  2202.             if(IS_INTRA4x4(mb_type)){
  2203.                 if(simple || !s->encoding){
  2204.                     if(IS_8x8DCT(mb_type)){
  2205.                         if(transform_bypass){
  2206.                             idct_dc_add =
  2207.                             idct_add    = s->dsp.add_pixels8;
  2208.                         }else{
  2209.                             idct_dc_add = s->dsp.h264_idct8_dc_add;
  2210.                             idct_add    = s->dsp.h264_idct8_add;
  2211.                         }
  2212.                         for(i=0; i<16; i+=4){
  2213.                             uint8_t * const ptr= dest_y + block_offset[i];
  2214.                             const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
  2215.                             if(transform_bypass && h->sps.profile_idc==244 && dir<=1){
  2216.                                 h->hpc.pred8x8l_add[dir](ptr, h->mb + i*16, linesize);
  2217.                             }else{
  2218.                                 const int nnz = h->non_zero_count_cache[ scan8[i] ];
  2219.                                 h->hpc.pred8x8l[ dir ](ptr, (h->topleft_samples_available<<i)&0x8000,
  2220.                                                             (h->topright_samples_available<<i)&0x4000, linesize);
  2221.                                 if(nnz){
  2222.                                     if(nnz == 1 && h->mb[i*16])
  2223.                                         idct_dc_add(ptr, h->mb + i*16, linesize);
  2224.                                     else
  2225.                                         idct_add   (ptr, h->mb + i*16, linesize);
  2226.                                 }
  2227.                             }
  2228.                         }
  2229.                     }else{
  2230.                         if(transform_bypass){
  2231.                             idct_dc_add =
  2232.                             idct_add    = s->dsp.add_pixels4;
  2233.                         }else{
  2234.                             idct_dc_add = s->dsp.h264_idct_dc_add;
  2235.                             idct_add    = s->dsp.h264_idct_add;
  2236.                         }
  2237.                         for(i=0; i<16; i++){
  2238.                             uint8_t * const ptr= dest_y + block_offset[i];
  2239.                             const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
  2240.                             if(transform_bypass && h->sps.profile_idc==244 && dir<=1){
  2241.                                 h->hpc.pred4x4_add[dir](ptr, h->mb + i*16, linesize);
  2242.                             }else{
  2243.                                 uint8_t *topright;
  2244.                                 int nnz, tr;
  2245.                                 if(dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED){
  2246.                                     const int topright_avail= (h->topright_samples_available<<i)&0x8000;
  2247.                                     assert(mb_y || linesize <= block_offset[i]);
  2248.                                     if(!topright_avail){
  2249.                                         tr= ptr[3 - linesize]*0x01010101;
  2250.                                         topright= (uint8_t*) &tr;
  2251.                                     }else
  2252.                                         topright= ptr + 4 - linesize;
  2253.                                 }else
  2254.                                     topright= NULL;
  2255.                                 h->hpc.pred4x4[ dir ](ptr, topright, linesize);
  2256.                                 nnz = h->non_zero_count_cache[ scan8[i] ];
  2257.                                 if(nnz)
  2258. {
  2259.                                     if(is_h264)
  2260. {
  2261.                                         if(nnz == 1 && h->mb[i*16])
  2262.                                             idct_dc_add(ptr, h->mb + i*16, linesize);
  2263.                                         else
  2264.                                             idct_add   (ptr, h->mb + i*16, linesize);
  2265.                                     }
  2266. //else
  2267.                                     //    svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0);
  2268.                                 }
  2269.                             }
  2270.                         }
  2271.                     }
  2272.                 }
  2273.             }
  2274. else
  2275. {
  2276.                 h->hpc.pred16x16[ h->intra16x16_pred_mode ](dest_y , linesize);
  2277.                 if(is_h264)
  2278. {
  2279.                     if(!transform_bypass)
  2280.                         h264_luma_dc_dequant_idct_c(h->mb, s->qscale, h->dequant4_coeff[0][s->qscale][0]);
  2281.                 }
  2282. //else
  2283.                 //    svq3_luma_dc_dequant_idct_c(h->mb, s->qscale);
  2284.             }
  2285.             if(h->deblocking_filter)
  2286.                 xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 0, simple);
  2287.         }
  2288. else if(is_h264)
  2289. {
  2290.             hl_motion(h, dest_y, dest_cb, dest_cr,
  2291.                       s->me.qpel_put, s->dsp.put_h264_chroma_pixels_tab,
  2292.                       s->me.qpel_avg, s->dsp.avg_h264_chroma_pixels_tab,
  2293.                       s->dsp.weight_h264_pixels_tab, s->dsp.biweight_h264_pixels_tab);
  2294.         }
  2295.         if(!IS_INTRA4x4(mb_type))
  2296. {
  2297.             if(is_h264)
  2298. {
  2299.                 if(IS_INTRA16x16(mb_type)){
  2300.                     if(transform_bypass){
  2301.                         if(h->sps.profile_idc==244 && (h->intra16x16_pred_mode==VERT_PRED8x8 || h->intra16x16_pred_mode==HOR_PRED8x8)){
  2302.                             h->hpc.pred16x16_add[h->intra16x16_pred_mode](dest_y, block_offset, h->mb, linesize);
  2303.                         }else{
  2304.                             for(i=0; i<16; i++){
  2305.                                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16])
  2306.                                     s->dsp.add_pixels4(dest_y + block_offset[i], h->mb + i*16, linesize);
  2307.                             }
  2308.                         }
  2309.                     }else{
  2310.                          s->dsp.h264_idct_add16intra(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache);
  2311.                     }
  2312.                 }else if(h->cbp&15){
  2313.                     if(transform_bypass){
  2314.                         const int di = IS_8x8DCT(mb_type) ? 4 : 1;
  2315.                         idct_add= IS_8x8DCT(mb_type) ? s->dsp.add_pixels8 : s->dsp.add_pixels4;
  2316.                         for(i=0; i<16; i+=di){
  2317.                             if(h->non_zero_count_cache[ scan8[i] ]){
  2318.                                 idct_add(dest_y + block_offset[i], h->mb + i*16, linesize);
  2319.                             }
  2320.                         }
  2321.                     }else{
  2322.                         if(IS_8x8DCT(mb_type)){
  2323.                             s->dsp.h264_idct8_add4(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache);
  2324.                         }else{
  2325.                             s->dsp.h264_idct_add16(dest_y, block_offset, h->mb, linesize, h->non_zero_count_cache);
  2326.                         }
  2327.                     }
  2328.                 }
  2329.             }
  2330. /*else
  2331. {
  2332.                 for(i=0; i<16; i++)
  2333. {
  2334.                     if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16])
  2335. { //FIXME benchmark weird rule, & below
  2336.                         uint8_t * const ptr= dest_y + block_offset[i];
  2337.                         svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, IS_INTRA(mb_type) ? 1 : 0);
  2338.                     }
  2339.                 }
  2340.             }*/
  2341.         }
  2342.         if((simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)) && (h->cbp&0x30)){
  2343.             uint8_t *dest[2] = {dest_cb, dest_cr};
  2344.             if(transform_bypass){
  2345.                 if(IS_INTRA(mb_type) && h->sps.profile_idc==244 && (h->chroma_pred_mode==VERT_PRED8x8 || h->chroma_pred_mode==HOR_PRED8x8)){
  2346.                     h->hpc.pred8x8_add[h->chroma_pred_mode](dest[0], block_offset + 16, h->mb + 16*16, uvlinesize);
  2347.                     h->hpc.pred8x8_add[h->chroma_pred_mode](dest[1], block_offset + 20, h->mb + 20*16, uvlinesize);
  2348.                 }else{
  2349.                     idct_add = s->dsp.add_pixels4;
  2350.                     for(i=16; i<16+8; i++){
  2351.                         if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16])
  2352.                             idct_add   (dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
  2353.                     }
  2354.                 }
  2355.             }
  2356. else
  2357. {
  2358.                 chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp[0], h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]);
  2359.                 chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp[1], h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]);
  2360.                 if(is_h264)
  2361. {
  2362.                     idct_add = s->dsp.h264_idct_add;
  2363.                     idct_dc_add = s->dsp.h264_idct_dc_add;
  2364.                     for(i=16; i<16+8; i++){
  2365.                         if(h->non_zero_count_cache[ scan8[i] ])
  2366.                             idct_add   (dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
  2367.                         else if(h->mb[i*16])
  2368.                             idct_dc_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
  2369.                     }
  2370.                 }
  2371. /*else
  2372. {
  2373.                     for(i=16; i<16+8; i++)
  2374. {
  2375.                         if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
  2376.                             uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i];
  2377.                             svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2);
  2378.                         }
  2379.                     }
  2380.                 }*/
  2381.             }
  2382.         }
  2383.     }
  2384.     if(h->cbp || IS_INTRA(mb_type))
  2385.         s->dsp.clear_blocks(h->mb);
  2386.     if(h->deblocking_filter) {
  2387.         backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, simple);
  2388.         fill_caches(h, mb_type, 1); //FIXME don't fill stuff which isn't used by filter_mb
  2389.         h->chroma_qp[0] = get_chroma_qp(h, 0, s->current_picture.qscale_table[mb_xy]);
  2390.         h->chroma_qp[1] = get_chroma_qp(h, 1, s->current_picture.qscale_table[mb_xy]);
  2391.         if (!simple && FRAME_MBAFF) {
  2392.             filter_mb     (h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize);
  2393.         } else {
  2394.             filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize);
  2395.         }
  2396.     }
  2397. }
  2398. /**
  2399.  * Process a macroblock; this case avoids checks for expensive uncommon cases.
  2400.  */
  2401. static void hl_decode_mb_simple(H264Context *h){
  2402.     hl_decode_mb_internal(h, 1);
  2403. }
  2404. /**
  2405.  * Process a macroblock; this handles edge cases, such as interlacing.
  2406.  */
  2407. static void av_noinline hl_decode_mb_complex(H264Context *h){
  2408.     hl_decode_mb_internal(h, 0);
  2409. }
  2410. void hl_decode_mb(H264Context *h)
  2411. {
  2412.     MpegEncContext * const s = &h->s;
  2413.     const int mb_xy= h->mb_xy;
  2414.     const int mb_type= s->current_picture.mb_type[mb_xy];
  2415.     int is_complex = ENABLE_SMALL || h->is_complex || IS_INTRA_PCM(mb_type) || s->qscale == 0;
  2416.     if(ENABLE_H264_ENCODER && !s->decode)
  2417.         return;
  2418.     if (is_complex)
  2419.         hl_decode_mb_complex(h);
  2420.     else hl_decode_mb_simple(h);
  2421. }
  2422. static void pic_as_field(Picture *pic, const int parity){
  2423.     int i;
  2424.     for (i = 0; i < 4; ++i) {
  2425.         if (parity == PICT_BOTTOM_FIELD)
  2426.             pic->data[i] += pic->linesize[i];
  2427.         pic->reference = parity;
  2428.         pic->linesize[i] *= 2;
  2429.     }
  2430.     pic->poc= pic->field_poc[parity == PICT_BOTTOM_FIELD];
  2431. }
  2432. static int split_field_copy(Picture *dest, Picture *src,
  2433.                             int parity, int id_add){
  2434.     int match = !!(src->reference & parity);
  2435.     if (match) {
  2436.         *dest = *src;
  2437.         if(parity != PICT_FRAME){
  2438.             pic_as_field(dest, parity);
  2439.             dest->pic_id *= 2;
  2440.             dest->pic_id += id_add;
  2441.         }
  2442.     }
  2443.     return match;
  2444. }
  2445. static int build_def_list(Picture *def, Picture **in, int len, int is_long, int sel){
  2446.     int i[2]={0};
  2447.     int index=0;
  2448.     while(i[0]<len || i[1]<len){
  2449.         while(i[0]<len && !(in[ i[0] ] && (in[ i[0] ]->reference & sel)))
  2450.             i[0]++;
  2451.         while(i[1]<len && !(in[ i[1] ] && (in[ i[1] ]->reference & (sel^3))))
  2452.             i[1]++;
  2453.         if(i[0] < len){
  2454.             in[ i[0] ]->pic_id= is_long ? i[0] : in[ i[0] ]->frame_num;
  2455.             split_field_copy(&def[index++], in[ i[0]++ ], sel  , 1);
  2456.         }