h264.c
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:321k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

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