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