]> git.sesse.net Git - ffmpeg/blob - libavcodec/h264.c
Remove a few more lines of unneeded code in fill_caches() for MBAFF.
[ffmpeg] / 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
37 #include "cabac.h"
38 #ifdef ARCH_X86
39 #include "i386/h264_i386.h"
40 #endif
41
42 //#undef NDEBUG
43 #include <assert.h>
44
45 /**
46  * Value of Picture.reference when Picture is not a reference picture, but
47  * is held for delayed output.
48  */
49 #define DELAYED_PIC_REF 4
50
51 static VLC coeff_token_vlc[4];
52 static VLC_TYPE coeff_token_vlc_tables[520+332+280+256][2];
53 static const int coeff_token_vlc_tables_size[4]={520,332,280,256};
54
55 static VLC chroma_dc_coeff_token_vlc;
56 static VLC_TYPE chroma_dc_coeff_token_vlc_table[256][2];
57 static const int chroma_dc_coeff_token_vlc_table_size = 256;
58
59 static VLC total_zeros_vlc[15];
60 static VLC_TYPE total_zeros_vlc_tables[15][512][2];
61 static const int total_zeros_vlc_tables_size = 512;
62
63 static VLC chroma_dc_total_zeros_vlc[3];
64 static VLC_TYPE chroma_dc_total_zeros_vlc_tables[3][8][2];
65 static const int chroma_dc_total_zeros_vlc_tables_size = 8;
66
67 static VLC run_vlc[6];
68 static VLC_TYPE run_vlc_tables[6][8][2];
69 static const int run_vlc_tables_size = 8;
70
71 static VLC run7_vlc;
72 static VLC_TYPE run7_vlc_table[96][2];
73 static const int run7_vlc_table_size = 96;
74
75 static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp);
76 static void svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc);
77 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);
78 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);
79 static Picture * remove_long(H264Context *h, int i, int ref_mask);
80
81 static av_always_inline uint32_t pack16to32(int a, int b){
82 #ifdef WORDS_BIGENDIAN
83    return (b&0xFFFF) + (a<<16);
84 #else
85    return (a&0xFFFF) + (b<<16);
86 #endif
87 }
88
89 const uint8_t ff_rem6[52]={
90 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,
91 };
92
93 const uint8_t ff_div6[52]={
94 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,
95 };
96
97 static const int left_block_options[4][8]={
98     {0,1,2,3,7,10,8,11},
99     {2,2,3,3,8,11,8,11},
100     {0,0,1,1,7,10,7,10},
101     {0,2,0,2,7,10,7,10}
102 };
103
104 static void fill_caches(H264Context *h, int mb_type, int for_deblock){
105     MpegEncContext * const s = &h->s;
106     const int mb_xy= h->mb_xy;
107     int topleft_xy, top_xy, topright_xy, left_xy[2];
108     int topleft_type, top_type, topright_type, left_type[2];
109     int * left_block;
110     int topleft_partition= -1;
111     int i;
112
113     top_xy     = mb_xy  - (s->mb_stride << FIELD_PICTURE);
114
115     //FIXME deblocking could skip the intra and nnz parts.
116     if(for_deblock && (h->slice_num == 1 || h->slice_table[mb_xy] == h->slice_table[top_xy]) && !FRAME_MBAFF)
117         return;
118
119     /* Wow, what a mess, why didn't they simplify the interlacing & intra
120      * stuff, I can't imagine that these complex rules are worth it. */
121
122     topleft_xy = top_xy - 1;
123     topright_xy= top_xy + 1;
124     left_xy[1] = left_xy[0] = mb_xy-1;
125     left_block = left_block_options[0];
126     if(FRAME_MBAFF){
127         const int pair_xy          = s->mb_x     + (s->mb_y & ~1)*s->mb_stride;
128         const int top_pair_xy      = pair_xy     - s->mb_stride;
129         const int topleft_pair_xy  = top_pair_xy - 1;
130         const int topright_pair_xy = top_pair_xy + 1;
131         const int topleft_mb_frame_flag  = !IS_INTERLACED(s->current_picture.mb_type[topleft_pair_xy]);
132         const int top_mb_frame_flag      = !IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]);
133         const int topright_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[topright_pair_xy]);
134         const int left_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]);
135         const int curr_mb_frame_flag = !IS_INTERLACED(mb_type);
136         const int bottom = (s->mb_y & 1);
137         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);
138         if (bottom
139                 ? !curr_mb_frame_flag // bottom macroblock
140                 : (!curr_mb_frame_flag && !top_mb_frame_flag) // top macroblock
141                 ) {
142             top_xy -= s->mb_stride;
143         }
144         if (bottom
145                 ? !curr_mb_frame_flag // bottom macroblock
146                 : (!curr_mb_frame_flag && !topleft_mb_frame_flag) // top macroblock
147                 ) {
148             topleft_xy -= s->mb_stride;
149         } else if(bottom && curr_mb_frame_flag && !left_mb_frame_flag) {
150             topleft_xy += s->mb_stride;
151             // take top left mv from the middle of the mb, as opposed to all other modes which use the bottom right partition
152             topleft_partition = 0;
153         }
154         if (bottom
155                 ? !curr_mb_frame_flag // bottom macroblock
156                 : (!curr_mb_frame_flag && !topright_mb_frame_flag) // top macroblock
157                 ) {
158             topright_xy -= s->mb_stride;
159         }
160         if (left_mb_frame_flag != curr_mb_frame_flag) {
161             left_xy[1] = left_xy[0] = pair_xy - 1;
162             if (curr_mb_frame_flag) {
163                 if (bottom) {
164                     left_block = left_block_options[1];
165                 } else {
166                     left_block= left_block_options[2];
167                 }
168             } else {
169                 left_xy[1] += s->mb_stride;
170                 left_block = left_block_options[3];
171             }
172         }
173     }
174
175     h->top_mb_xy = top_xy;
176     h->left_mb_xy[0] = left_xy[0];
177     h->left_mb_xy[1] = left_xy[1];
178     if(for_deblock){
179         topleft_type = 0;
180         topright_type = 0;
181         top_type     = h->slice_table[top_xy     ] < 255 ? s->current_picture.mb_type[top_xy]     : 0;
182         left_type[0] = h->slice_table[left_xy[0] ] < 255 ? s->current_picture.mb_type[left_xy[0]] : 0;
183         left_type[1] = h->slice_table[left_xy[1] ] < 255 ? s->current_picture.mb_type[left_xy[1]] : 0;
184
185         if(MB_MBAFF && !IS_INTRA(mb_type)){
186             int list;
187             for(list=0; list<h->list_count; list++){
188                 //These values where changed for ease of performing MC, we need to change them back
189                 //FIXME maybe we can make MC and loop filter use the same values or prevent
190                 //the MC code from changing ref_cache and rather use a temporary array.
191                 if(USES_LIST(mb_type,list)){
192                     int8_t *ref = &s->current_picture.ref_index[list][h->mb2b8_xy[mb_xy]];
193                     *(uint32_t*)&h->ref_cache[list][scan8[ 0]] =
194                     *(uint32_t*)&h->ref_cache[list][scan8[ 2]] = pack16to32(ref[0],ref[1])*0x0101;
195                     ref += h->b8_stride;
196                     *(uint32_t*)&h->ref_cache[list][scan8[ 8]] =
197                     *(uint32_t*)&h->ref_cache[list][scan8[10]] = pack16to32(ref[0],ref[1])*0x0101;
198                 }
199             }
200         }
201     }else{
202         topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0;
203         top_type     = h->slice_table[top_xy     ] == h->slice_num ? s->current_picture.mb_type[top_xy]     : 0;
204         topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0;
205         left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0;
206         left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0;
207     }
208
209     if(IS_INTRA(mb_type)){
210         h->topleft_samples_available=
211         h->top_samples_available=
212         h->left_samples_available= 0xFFFF;
213         h->topright_samples_available= 0xEEEA;
214
215         if(!IS_INTRA(top_type) && (top_type==0 || h->pps.constrained_intra_pred)){
216             h->topleft_samples_available= 0xB3FF;
217             h->top_samples_available= 0x33FF;
218             h->topright_samples_available= 0x26EA;
219         }
220         for(i=0; i<2; i++){
221             if(!IS_INTRA(left_type[i]) && (left_type[i]==0 || h->pps.constrained_intra_pred)){
222                 h->topleft_samples_available&= 0xDF5F;
223                 h->left_samples_available&= 0x5F5F;
224             }
225         }
226
227         if(!IS_INTRA(topleft_type) && (topleft_type==0 || h->pps.constrained_intra_pred))
228             h->topleft_samples_available&= 0x7FFF;
229
230         if(!IS_INTRA(topright_type) && (topright_type==0 || h->pps.constrained_intra_pred))
231             h->topright_samples_available&= 0xFBFF;
232
233         if(IS_INTRA4x4(mb_type)){
234             if(IS_INTRA4x4(top_type)){
235                 h->intra4x4_pred_mode_cache[4+8*0]= h->intra4x4_pred_mode[top_xy][4];
236                 h->intra4x4_pred_mode_cache[5+8*0]= h->intra4x4_pred_mode[top_xy][5];
237                 h->intra4x4_pred_mode_cache[6+8*0]= h->intra4x4_pred_mode[top_xy][6];
238                 h->intra4x4_pred_mode_cache[7+8*0]= h->intra4x4_pred_mode[top_xy][3];
239             }else{
240                 int pred;
241                 if(!top_type || (IS_INTER(top_type) && h->pps.constrained_intra_pred))
242                     pred= -1;
243                 else{
244                     pred= 2;
245                 }
246                 h->intra4x4_pred_mode_cache[4+8*0]=
247                 h->intra4x4_pred_mode_cache[5+8*0]=
248                 h->intra4x4_pred_mode_cache[6+8*0]=
249                 h->intra4x4_pred_mode_cache[7+8*0]= pred;
250             }
251             for(i=0; i<2; i++){
252                 if(IS_INTRA4x4(left_type[i])){
253                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+2*i]];
254                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+2*i]];
255                 }else{
256                     int pred;
257                     if(!left_type[i] || (IS_INTER(left_type[i]) && h->pps.constrained_intra_pred))
258                         pred= -1;
259                     else{
260                         pred= 2;
261                     }
262                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]=
263                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= pred;
264                 }
265             }
266         }
267     }
268
269
270 /*
271 0 . T T. T T T T
272 1 L . .L . . . .
273 2 L . .L . . . .
274 3 . T TL . . . .
275 4 L . .L . . . .
276 5 L . .. . . . .
277 */
278 //FIXME constraint_intra_pred & partitioning & nnz (let us hope this is just a typo in the spec)
279     if(top_type){
280         h->non_zero_count_cache[4+8*0]= h->non_zero_count[top_xy][4];
281         h->non_zero_count_cache[5+8*0]= h->non_zero_count[top_xy][5];
282         h->non_zero_count_cache[6+8*0]= h->non_zero_count[top_xy][6];
283         h->non_zero_count_cache[7+8*0]= h->non_zero_count[top_xy][3];
284
285         h->non_zero_count_cache[1+8*0]= h->non_zero_count[top_xy][9];
286         h->non_zero_count_cache[2+8*0]= h->non_zero_count[top_xy][8];
287
288         h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][12];
289         h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11];
290
291     }else{
292         h->non_zero_count_cache[4+8*0]=
293         h->non_zero_count_cache[5+8*0]=
294         h->non_zero_count_cache[6+8*0]=
295         h->non_zero_count_cache[7+8*0]=
296
297         h->non_zero_count_cache[1+8*0]=
298         h->non_zero_count_cache[2+8*0]=
299
300         h->non_zero_count_cache[1+8*3]=
301         h->non_zero_count_cache[2+8*3]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64;
302
303     }
304
305     for (i=0; i<2; i++) {
306         if(left_type[i]){
307             h->non_zero_count_cache[3+8*1 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[0+2*i]];
308             h->non_zero_count_cache[3+8*2 + 2*8*i]= h->non_zero_count[left_xy[i]][left_block[1+2*i]];
309             h->non_zero_count_cache[0+8*1 +   8*i]= h->non_zero_count[left_xy[i]][left_block[4+2*i]];
310             h->non_zero_count_cache[0+8*4 +   8*i]= h->non_zero_count[left_xy[i]][left_block[5+2*i]];
311         }else{
312             h->non_zero_count_cache[3+8*1 + 2*8*i]=
313             h->non_zero_count_cache[3+8*2 + 2*8*i]=
314             h->non_zero_count_cache[0+8*1 +   8*i]=
315             h->non_zero_count_cache[0+8*4 +   8*i]= h->pps.cabac && !IS_INTRA(mb_type) ? 0 : 64;
316         }
317     }
318
319     if( h->pps.cabac ) {
320         // top_cbp
321         if(top_type) {
322             h->top_cbp = h->cbp_table[top_xy];
323         } else if(IS_INTRA(mb_type)) {
324             h->top_cbp = 0x1C0;
325         } else {
326             h->top_cbp = 0;
327         }
328         // left_cbp
329         if (left_type[0]) {
330             h->left_cbp = h->cbp_table[left_xy[0]] & 0x1f0;
331         } else if(IS_INTRA(mb_type)) {
332             h->left_cbp = 0x1C0;
333         } else {
334             h->left_cbp = 0;
335         }
336         if (left_type[0]) {
337             h->left_cbp |= ((h->cbp_table[left_xy[0]]>>((left_block[0]&(~1))+1))&0x1) << 1;
338         }
339         if (left_type[1]) {
340             h->left_cbp |= ((h->cbp_table[left_xy[1]]>>((left_block[2]&(~1))+1))&0x1) << 3;
341         }
342     }
343
344 #if 1
345     if(IS_INTER(mb_type) || IS_DIRECT(mb_type)){
346         int list;
347         for(list=0; list<h->list_count; list++){
348             if(!USES_LIST(mb_type, list) && !IS_DIRECT(mb_type) && !h->deblocking_filter){
349                 /*if(!h->mv_cache_clean[list]){
350                     memset(h->mv_cache [list],  0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all?
351                     memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t));
352                     h->mv_cache_clean[list]= 1;
353                 }*/
354                 continue;
355             }
356             h->mv_cache_clean[list]= 0;
357
358             if(USES_LIST(top_type, list)){
359                 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
360                 const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride;
361                 *(uint32_t*)h->mv_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0];
362                 *(uint32_t*)h->mv_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1];
363                 *(uint32_t*)h->mv_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2];
364                 *(uint32_t*)h->mv_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3];
365                 h->ref_cache[list][scan8[0] + 0 - 1*8]=
366                 h->ref_cache[list][scan8[0] + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0];
367                 h->ref_cache[list][scan8[0] + 2 - 1*8]=
368                 h->ref_cache[list][scan8[0] + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1];
369             }else{
370                 *(uint32_t*)h->mv_cache [list][scan8[0] + 0 - 1*8]=
371                 *(uint32_t*)h->mv_cache [list][scan8[0] + 1 - 1*8]=
372                 *(uint32_t*)h->mv_cache [list][scan8[0] + 2 - 1*8]=
373                 *(uint32_t*)h->mv_cache [list][scan8[0] + 3 - 1*8]= 0;
374                 *(uint32_t*)&h->ref_cache[list][scan8[0] + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101;
375             }
376
377             for(i=0; i<2; i++){
378                 int cache_idx = scan8[0] - 1 + i*2*8;
379                 if(USES_LIST(left_type[i], list)){
380                     const int b_xy= h->mb2b_xy[left_xy[i]] + 3;
381                     const int b8_xy= h->mb2b8_xy[left_xy[i]] + 1;
382                     *(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]];
383                     *(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]];
384                     h->ref_cache[list][cache_idx  ]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0+i*2]>>1)];
385                     h->ref_cache[list][cache_idx+8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[1+i*2]>>1)];
386                 }else{
387                     *(uint32_t*)h->mv_cache [list][cache_idx  ]=
388                     *(uint32_t*)h->mv_cache [list][cache_idx+8]= 0;
389                     h->ref_cache[list][cache_idx  ]=
390                     h->ref_cache[list][cache_idx+8]= left_type[i] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
391                 }
392             }
393
394             if(for_deblock || ((IS_DIRECT(mb_type) && !h->direct_spatial_mv_pred) && !FRAME_MBAFF))
395                 continue;
396
397             if(USES_LIST(topleft_type, list)){
398                 const int b_xy = h->mb2b_xy[topleft_xy] + 3 + h->b_stride + (topleft_partition & 2*h->b_stride);
399                 const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + (topleft_partition & h->b8_stride);
400                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
401                 h->ref_cache[list][scan8[0] - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy];
402             }else{
403                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= 0;
404                 h->ref_cache[list][scan8[0] - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
405             }
406
407             if(USES_LIST(topright_type, list)){
408                 const int b_xy= h->mb2b_xy[topright_xy] + 3*h->b_stride;
409                 const int b8_xy= h->mb2b8_xy[topright_xy] + h->b8_stride;
410                 *(uint32_t*)h->mv_cache[list][scan8[0] + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
411                 h->ref_cache[list][scan8[0] + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy];
412             }else{
413                 *(uint32_t*)h->mv_cache [list][scan8[0] + 4 - 1*8]= 0;
414                 h->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
415             }
416
417             if((IS_SKIP(mb_type) || IS_DIRECT(mb_type)) && !FRAME_MBAFF)
418                 continue;
419
420             h->ref_cache[list][scan8[5 ]+1] =
421             h->ref_cache[list][scan8[7 ]+1] =
422             h->ref_cache[list][scan8[13]+1] =  //FIXME remove past 3 (init somewhere else)
423             h->ref_cache[list][scan8[4 ]] =
424             h->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE;
425             *(uint32_t*)h->mv_cache [list][scan8[5 ]+1]=
426             *(uint32_t*)h->mv_cache [list][scan8[7 ]+1]=
427             *(uint32_t*)h->mv_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else)
428             *(uint32_t*)h->mv_cache [list][scan8[4 ]]=
429             *(uint32_t*)h->mv_cache [list][scan8[12]]= 0;
430
431             if( h->pps.cabac ) {
432                 /* XXX beurk, Load mvd */
433                 if(USES_LIST(top_type, list)){
434                     const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
435                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 0];
436                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 1];
437                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 2];
438                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 3];
439                 }else{
440                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 0 - 1*8]=
441                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 1 - 1*8]=
442                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 2 - 1*8]=
443                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 3 - 1*8]= 0;
444                 }
445                 if(USES_LIST(left_type[0], list)){
446                     const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
447                     *(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]];
448                     *(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]];
449                 }else{
450                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 0*8]=
451                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 1*8]= 0;
452                 }
453                 if(USES_LIST(left_type[1], list)){
454                     const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
455                     *(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]];
456                     *(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]];
457                 }else{
458                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 2*8]=
459                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 3*8]= 0;
460                 }
461                 *(uint32_t*)h->mvd_cache [list][scan8[5 ]+1]=
462                 *(uint32_t*)h->mvd_cache [list][scan8[7 ]+1]=
463                 *(uint32_t*)h->mvd_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewhere else)
464                 *(uint32_t*)h->mvd_cache [list][scan8[4 ]]=
465                 *(uint32_t*)h->mvd_cache [list][scan8[12]]= 0;
466
467                 if(h->slice_type_nos == FF_B_TYPE){
468                     fill_rectangle(&h->direct_cache[scan8[0]], 4, 4, 8, 0, 1);
469
470                     if(IS_DIRECT(top_type)){
471                         *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0x01010101;
472                     }else if(IS_8X8(top_type)){
473                         int b8_xy = h->mb2b8_xy[top_xy] + h->b8_stride;
474                         h->direct_cache[scan8[0] + 0 - 1*8]= h->direct_table[b8_xy];
475                         h->direct_cache[scan8[0] + 2 - 1*8]= h->direct_table[b8_xy + 1];
476                     }else{
477                         *(uint32_t*)&h->direct_cache[scan8[0] - 1*8]= 0;
478                     }
479
480                     if(IS_DIRECT(left_type[0]))
481                         h->direct_cache[scan8[0] - 1 + 0*8]= 1;
482                     else if(IS_8X8(left_type[0]))
483                         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)];
484                     else
485                         h->direct_cache[scan8[0] - 1 + 0*8]= 0;
486
487                     if(IS_DIRECT(left_type[1]))
488                         h->direct_cache[scan8[0] - 1 + 2*8]= 1;
489                     else if(IS_8X8(left_type[1]))
490                         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)];
491                     else
492                         h->direct_cache[scan8[0] - 1 + 2*8]= 0;
493                 }
494             }
495
496             if(FRAME_MBAFF){
497 #define MAP_MVS\
498                     MAP_F2F(scan8[0] - 1 - 1*8, topleft_type)\
499                     MAP_F2F(scan8[0] + 0 - 1*8, top_type)\
500                     MAP_F2F(scan8[0] + 1 - 1*8, top_type)\
501                     MAP_F2F(scan8[0] + 2 - 1*8, top_type)\
502                     MAP_F2F(scan8[0] + 3 - 1*8, top_type)\
503                     MAP_F2F(scan8[0] + 4 - 1*8, topright_type)\
504                     MAP_F2F(scan8[0] - 1 + 0*8, left_type[0])\
505                     MAP_F2F(scan8[0] - 1 + 1*8, left_type[0])\
506                     MAP_F2F(scan8[0] - 1 + 2*8, left_type[1])\
507                     MAP_F2F(scan8[0] - 1 + 3*8, left_type[1])
508                 if(MB_FIELD){
509 #define MAP_F2F(idx, mb_type)\
510                     if(!IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
511                         h->ref_cache[list][idx] <<= 1;\
512                         h->mv_cache[list][idx][1] /= 2;\
513                         h->mvd_cache[list][idx][1] /= 2;\
514                     }
515                     MAP_MVS
516 #undef MAP_F2F
517                 }else{
518 #define MAP_F2F(idx, mb_type)\
519                     if(IS_INTERLACED(mb_type) && h->ref_cache[list][idx] >= 0){\
520                         h->ref_cache[list][idx] >>= 1;\
521                         h->mv_cache[list][idx][1] <<= 1;\
522                         h->mvd_cache[list][idx][1] <<= 1;\
523                     }
524                     MAP_MVS
525 #undef MAP_F2F
526                 }
527             }
528         }
529     }
530 #endif
531
532     h->neighbor_transform_size= !!IS_8x8DCT(top_type) + !!IS_8x8DCT(left_type[0]);
533 }
534
535 static inline void write_back_intra_pred_mode(H264Context *h){
536     const int mb_xy= h->mb_xy;
537
538     h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1];
539     h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2];
540     h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3];
541     h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4];
542     h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4];
543     h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4];
544     h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4];
545 }
546
547 /**
548  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
549  */
550 static inline int check_intra4x4_pred_mode(H264Context *h){
551     MpegEncContext * const s = &h->s;
552     static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0};
553     static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED};
554     int i;
555
556     if(!(h->top_samples_available&0x8000)){
557         for(i=0; i<4; i++){
558             int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ];
559             if(status<0){
560                 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);
561                 return -1;
562             } else if(status){
563                 h->intra4x4_pred_mode_cache[scan8[0] + i]= status;
564             }
565         }
566     }
567
568     if(!(h->left_samples_available&0x8000)){
569         for(i=0; i<4; i++){
570             int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ];
571             if(status<0){
572                 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);
573                 return -1;
574             } else if(status){
575                 h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status;
576             }
577         }
578     }
579
580     return 0;
581 } //FIXME cleanup like next
582
583 /**
584  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
585  */
586 static inline int check_intra_pred_mode(H264Context *h, int mode){
587     MpegEncContext * const s = &h->s;
588     static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};
589     static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};
590
591     if(mode > 6U) {
592         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);
593         return -1;
594     }
595
596     if(!(h->top_samples_available&0x8000)){
597         mode= top[ mode ];
598         if(mode<0){
599             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);
600             return -1;
601         }
602     }
603
604     if(!(h->left_samples_available&0x8000)){
605         mode= left[ mode ];
606         if(mode<0){
607             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);
608             return -1;
609         }
610     }
611
612     return mode;
613 }
614
615 /**
616  * gets the predicted intra4x4 prediction mode.
617  */
618 static inline int pred_intra_mode(H264Context *h, int n){
619     const int index8= scan8[n];
620     const int left= h->intra4x4_pred_mode_cache[index8 - 1];
621     const int top = h->intra4x4_pred_mode_cache[index8 - 8];
622     const int min= FFMIN(left, top);
623
624     tprintf(h->s.avctx, "mode:%d %d min:%d\n", left ,top, min);
625
626     if(min<0) return DC_PRED;
627     else      return min;
628 }
629
630 static inline void write_back_non_zero_count(H264Context *h){
631     const int mb_xy= h->mb_xy;
632
633     h->non_zero_count[mb_xy][0]= h->non_zero_count_cache[7+8*1];
634     h->non_zero_count[mb_xy][1]= h->non_zero_count_cache[7+8*2];
635     h->non_zero_count[mb_xy][2]= h->non_zero_count_cache[7+8*3];
636     h->non_zero_count[mb_xy][3]= h->non_zero_count_cache[7+8*4];
637     h->non_zero_count[mb_xy][4]= h->non_zero_count_cache[4+8*4];
638     h->non_zero_count[mb_xy][5]= h->non_zero_count_cache[5+8*4];
639     h->non_zero_count[mb_xy][6]= h->non_zero_count_cache[6+8*4];
640
641     h->non_zero_count[mb_xy][9]= h->non_zero_count_cache[1+8*2];
642     h->non_zero_count[mb_xy][8]= h->non_zero_count_cache[2+8*2];
643     h->non_zero_count[mb_xy][7]= h->non_zero_count_cache[2+8*1];
644
645     h->non_zero_count[mb_xy][12]=h->non_zero_count_cache[1+8*5];
646     h->non_zero_count[mb_xy][11]=h->non_zero_count_cache[2+8*5];
647     h->non_zero_count[mb_xy][10]=h->non_zero_count_cache[2+8*4];
648 }
649
650 /**
651  * gets the predicted number of non-zero coefficients.
652  * @param n block index
653  */
654 static inline int pred_non_zero_count(H264Context *h, int n){
655     const int index8= scan8[n];
656     const int left= h->non_zero_count_cache[index8 - 1];
657     const int top = h->non_zero_count_cache[index8 - 8];
658     int i= left + top;
659
660     if(i<64) i= (i+1)>>1;
661
662     tprintf(h->s.avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31);
663
664     return i&31;
665 }
666
667 static inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width){
668     const int topright_ref= h->ref_cache[list][ i - 8 + part_width ];
669     MpegEncContext *s = &h->s;
670
671     /* there is no consistent mapping of mvs to neighboring locations that will
672      * make mbaff happy, so we can't move all this logic to fill_caches */
673     if(FRAME_MBAFF){
674         const uint32_t *mb_types = s->current_picture_ptr->mb_type;
675         const int16_t *mv;
676         *(uint32_t*)h->mv_cache[list][scan8[0]-2] = 0;
677         *C = h->mv_cache[list][scan8[0]-2];
678
679         if(!MB_FIELD
680            && (s->mb_y&1) && i < scan8[0]+8 && topright_ref != PART_NOT_AVAILABLE){
681             int topright_xy = s->mb_x + (s->mb_y-1)*s->mb_stride + (i == scan8[0]+3);
682             if(IS_INTERLACED(mb_types[topright_xy])){
683 #define SET_DIAG_MV(MV_OP, REF_OP, X4, Y4)\
684                 const int x4 = X4, y4 = Y4;\
685                 const int mb_type = mb_types[(x4>>2)+(y4>>2)*s->mb_stride];\
686                 if(!USES_LIST(mb_type,list))\
687                     return LIST_NOT_USED;\
688                 mv = s->current_picture_ptr->motion_val[list][x4 + y4*h->b_stride];\
689                 h->mv_cache[list][scan8[0]-2][0] = mv[0];\
690                 h->mv_cache[list][scan8[0]-2][1] = mv[1] MV_OP;\
691                 return s->current_picture_ptr->ref_index[list][(x4>>1) + (y4>>1)*h->b8_stride] REF_OP;
692
693                 SET_DIAG_MV(*2, >>1, s->mb_x*4+(i&7)-4+part_width, s->mb_y*4-1);
694             }
695         }
696         if(topright_ref == PART_NOT_AVAILABLE
697            && ((s->mb_y&1) || i >= scan8[0]+8) && (i&7)==4
698            && h->ref_cache[list][scan8[0]-1] != PART_NOT_AVAILABLE){
699             if(!MB_FIELD
700                && IS_INTERLACED(mb_types[h->left_mb_xy[0]])){
701                 SET_DIAG_MV(*2, >>1, s->mb_x*4-1, (s->mb_y|1)*4+(s->mb_y&1)*2+(i>>4)-1);
702             }
703             if(MB_FIELD
704                && !IS_INTERLACED(mb_types[h->left_mb_xy[0]])
705                && i >= scan8[0]+8){
706                 // left shift will turn LIST_NOT_USED into PART_NOT_AVAILABLE, but that's OK.
707                 SET_DIAG_MV(/2, <<1, s->mb_x*4-1, (s->mb_y&~1)*4 - 1 + ((i-scan8[0])>>3)*2);
708             }
709         }
710 #undef SET_DIAG_MV
711     }
712
713     if(topright_ref != PART_NOT_AVAILABLE){
714         *C= h->mv_cache[list][ i - 8 + part_width ];
715         return topright_ref;
716     }else{
717         tprintf(s->avctx, "topright MV not available\n");
718
719         *C= h->mv_cache[list][ i - 8 - 1 ];
720         return h->ref_cache[list][ i - 8 - 1 ];
721     }
722 }
723
724 /**
725  * gets the predicted MV.
726  * @param n the block index
727  * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
728  * @param mx the x component of the predicted motion vector
729  * @param my the y component of the predicted motion vector
730  */
731 static inline void pred_motion(H264Context * const h, int n, int part_width, int list, int ref, int * const mx, int * const my){
732     const int index8= scan8[n];
733     const int top_ref=      h->ref_cache[list][ index8 - 8 ];
734     const int left_ref=     h->ref_cache[list][ index8 - 1 ];
735     const int16_t * const A= h->mv_cache[list][ index8 - 1 ];
736     const int16_t * const B= h->mv_cache[list][ index8 - 8 ];
737     const int16_t * C;
738     int diagonal_ref, match_count;
739
740     assert(part_width==1 || part_width==2 || part_width==4);
741
742 /* mv_cache
743   B . . A T T T T
744   U . . L . . , .
745   U . . L . . . .
746   U . . L . . , .
747   . . . L . . . .
748 */
749
750     diagonal_ref= fetch_diagonal_mv(h, &C, index8, list, part_width);
751     match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref);
752     tprintf(h->s.avctx, "pred_motion match_count=%d\n", match_count);
753     if(match_count > 1){ //most common
754         *mx= mid_pred(A[0], B[0], C[0]);
755         *my= mid_pred(A[1], B[1], C[1]);
756     }else if(match_count==1){
757         if(left_ref==ref){
758             *mx= A[0];
759             *my= A[1];
760         }else if(top_ref==ref){
761             *mx= B[0];
762             *my= B[1];
763         }else{
764             *mx= C[0];
765             *my= C[1];
766         }
767     }else{
768         if(top_ref == PART_NOT_AVAILABLE && diagonal_ref == PART_NOT_AVAILABLE && left_ref != PART_NOT_AVAILABLE){
769             *mx= A[0];
770             *my= A[1];
771         }else{
772             *mx= mid_pred(A[0], B[0], C[0]);
773             *my= mid_pred(A[1], B[1], C[1]);
774         }
775     }
776
777     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);
778 }
779
780 /**
781  * gets the directionally predicted 16x8 MV.
782  * @param n the block index
783  * @param mx the x component of the predicted motion vector
784  * @param my the y component of the predicted motion vector
785  */
786 static inline void pred_16x8_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
787     if(n==0){
788         const int top_ref=      h->ref_cache[list][ scan8[0] - 8 ];
789         const int16_t * const B= h->mv_cache[list][ scan8[0] - 8 ];
790
791         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);
792
793         if(top_ref == ref){
794             *mx= B[0];
795             *my= B[1];
796             return;
797         }
798     }else{
799         const int left_ref=     h->ref_cache[list][ scan8[8] - 1 ];
800         const int16_t * const A= h->mv_cache[list][ scan8[8] - 1 ];
801
802         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);
803
804         if(left_ref == ref){
805             *mx= A[0];
806             *my= A[1];
807             return;
808         }
809     }
810
811     //RARE
812     pred_motion(h, n, 4, list, ref, mx, my);
813 }
814
815 /**
816  * gets the directionally predicted 8x16 MV.
817  * @param n the block index
818  * @param mx the x component of the predicted motion vector
819  * @param my the y component of the predicted motion vector
820  */
821 static inline void pred_8x16_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
822     if(n==0){
823         const int left_ref=      h->ref_cache[list][ scan8[0] - 1 ];
824         const int16_t * const A=  h->mv_cache[list][ scan8[0] - 1 ];
825
826         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);
827
828         if(left_ref == ref){
829             *mx= A[0];
830             *my= A[1];
831             return;
832         }
833     }else{
834         const int16_t * C;
835         int diagonal_ref;
836
837         diagonal_ref= fetch_diagonal_mv(h, &C, scan8[4], list, 2);
838
839         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);
840
841         if(diagonal_ref == ref){
842             *mx= C[0];
843             *my= C[1];
844             return;
845         }
846     }
847
848     //RARE
849     pred_motion(h, n, 2, list, ref, mx, my);
850 }
851
852 static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my){
853     const int top_ref = h->ref_cache[0][ scan8[0] - 8 ];
854     const int left_ref= h->ref_cache[0][ scan8[0] - 1 ];
855
856     tprintf(h->s.avctx, "pred_pskip: (%d) (%d) at %2d %2d\n", top_ref, left_ref, h->s.mb_x, h->s.mb_y);
857
858     if(top_ref == PART_NOT_AVAILABLE || left_ref == PART_NOT_AVAILABLE
859        || (top_ref == 0  && *(uint32_t*)h->mv_cache[0][ scan8[0] - 8 ] == 0)
860        || (left_ref == 0 && *(uint32_t*)h->mv_cache[0][ scan8[0] - 1 ] == 0)){
861
862         *mx = *my = 0;
863         return;
864     }
865
866     pred_motion(h, 0, 4, 0, 0, mx, my);
867
868     return;
869 }
870
871 static inline void direct_dist_scale_factor(H264Context * const h){
872     MpegEncContext * const s = &h->s;
873     const int poc = h->s.current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ];
874     const int poc1 = h->ref_list[1][0].poc;
875     int i;
876     for(i=0; i<h->ref_count[0]; i++){
877         int poc0 = h->ref_list[0][i].poc;
878         int td = av_clip(poc1 - poc0, -128, 127);
879         if(td == 0 || h->ref_list[0][i].long_ref){
880             h->dist_scale_factor[i] = 256;
881         }else{
882             int tb = av_clip(poc - poc0, -128, 127);
883             int tx = (16384 + (FFABS(td) >> 1)) / td;
884             h->dist_scale_factor[i] = av_clip((tb*tx + 32) >> 6, -1024, 1023);
885         }
886     }
887     if(FRAME_MBAFF){
888         for(i=0; i<h->ref_count[0]; i++){
889             h->dist_scale_factor_field[2*i] =
890             h->dist_scale_factor_field[2*i+1] = h->dist_scale_factor[i];
891         }
892     }
893 }
894 static inline void direct_ref_list_init(H264Context * const h){
895     MpegEncContext * const s = &h->s;
896     Picture * const ref1 = &h->ref_list[1][0];
897     Picture * const cur = s->current_picture_ptr;
898     int list, i, j;
899     int sidx= s->picture_structure&1;
900     int ref1sidx= ref1->reference&1;
901     for(list=0; list<2; list++){
902         cur->ref_count[sidx][list] = h->ref_count[list];
903         for(j=0; j<h->ref_count[list]; j++)
904             cur->ref_poc[sidx][list][j] = 4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3);
905     }
906     if(s->picture_structure == PICT_FRAME){
907         memcpy(cur->ref_count[0], cur->ref_count[1], sizeof(cur->ref_count[0]));
908         memcpy(cur->ref_poc  [0], cur->ref_poc  [1], sizeof(cur->ref_poc  [0]));
909     }
910     if(cur->pict_type != FF_B_TYPE || h->direct_spatial_mv_pred)
911         return;
912     for(list=0; list<2; list++){
913         for(i=0; i<ref1->ref_count[ref1sidx][list]; i++){
914             int poc = ref1->ref_poc[ref1sidx][list][i];
915             if(((poc&3) == 3) != (s->picture_structure == PICT_FRAME))
916                 poc= (poc&~3) + s->picture_structure;
917             h->map_col_to_list0[list][i] = 0; /* bogus; fills in for missing frames */
918             for(j=0; j<h->ref_count[list]; j++)
919                 if(4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3) == poc){
920                     h->map_col_to_list0[list][i] = j;
921                     break;
922                 }
923         }
924     }
925     if(FRAME_MBAFF){
926         for(list=0; list<2; list++){
927             for(i=0; i<ref1->ref_count[ref1sidx][list]; i++){
928                 j = h->map_col_to_list0[list][i];
929                 h->map_col_to_list0_field[list][2*i] = 2*j;
930                 h->map_col_to_list0_field[list][2*i+1] = 2*j+1;
931             }
932         }
933     }
934 }
935
936 static inline void pred_direct_motion(H264Context * const h, int *mb_type){
937     MpegEncContext * const s = &h->s;
938     int b8_stride = h->b8_stride;
939     int b4_stride = h->b_stride;
940     int mb_xy = h->mb_xy;
941     int mb_type_col[2];
942     const int16_t (*l1mv0)[2], (*l1mv1)[2];
943     const int8_t *l1ref0, *l1ref1;
944     const int is_b8x8 = IS_8X8(*mb_type);
945     unsigned int sub_mb_type;
946     int i8, i4;
947
948 #define MB_TYPE_16x16_OR_INTRA (MB_TYPE_16x16|MB_TYPE_INTRA4x4|MB_TYPE_INTRA16x16|MB_TYPE_INTRA_PCM)
949
950     if(IS_INTERLACED(h->ref_list[1][0].mb_type[mb_xy])){ // AFL/AFR/FR/FL -> AFL/FL
951         if(h->ref_list[1][0].reference == PICT_FRAME){   // AFL/AFR/FR/FL -> AFL
952             if(!IS_INTERLACED(*mb_type)){                //     AFR/FR    -> AFL
953                 int cur_poc = s->current_picture_ptr->poc;
954                 int *col_poc = h->ref_list[1]->field_poc;
955                 int col_parity = FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc);
956                 mb_xy= s->mb_x + ((s->mb_y&~1) + col_parity)*s->mb_stride;
957                 b8_stride = 0;
958             }
959         }else if(!(s->picture_structure & h->ref_list[1][0].reference)){// FL -> FL & differ parity
960             int fieldoff= 2*(h->ref_list[1][0].reference)-3;
961             mb_xy += s->mb_stride*fieldoff;
962         }
963         goto single_col;
964     }else{                                               // AFL/AFR/FR/FL -> AFR/FR
965         if(IS_INTERLACED(*mb_type)){                     // AFL       /FL -> AFR/FR
966             mb_xy= s->mb_x + (s->mb_y&~1)*s->mb_stride;
967             mb_type_col[0] = h->ref_list[1][0].mb_type[mb_xy];
968             mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy + s->mb_stride];
969             b8_stride *= 3;
970             b4_stride *= 6;
971             //FIXME IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag
972             if(    (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)
973                 && (mb_type_col[1] & MB_TYPE_16x16_OR_INTRA)
974                 && !is_b8x8){
975                 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
976                 *mb_type   |= MB_TYPE_16x8 |MB_TYPE_L0L1|MB_TYPE_DIRECT2; /* B_16x8 */
977             }else{
978                 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
979                 *mb_type   |= MB_TYPE_8x8|MB_TYPE_L0L1;
980             }
981         }else{                                           //     AFR/FR    -> AFR/FR
982 single_col:
983             mb_type_col[0] =
984             mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy];
985             if(IS_8X8(mb_type_col[0]) && !h->sps.direct_8x8_inference_flag){
986                 /* FIXME save sub mb types from previous frames (or derive from MVs)
987                 * so we know exactly what block size to use */
988                 sub_mb_type = MB_TYPE_8x8|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_4x4 */
989                 *mb_type   |= MB_TYPE_8x8|MB_TYPE_L0L1;
990             }else if(!is_b8x8 && (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)){
991                 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
992                 *mb_type   |= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_16x16 */
993             }else{
994                 sub_mb_type = MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
995                 *mb_type   |= MB_TYPE_8x8|MB_TYPE_L0L1;
996             }
997         }
998     }
999
1000     l1mv0  = &h->ref_list[1][0].motion_val[0][h->mb2b_xy [mb_xy]];
1001     l1mv1  = &h->ref_list[1][0].motion_val[1][h->mb2b_xy [mb_xy]];
1002     l1ref0 = &h->ref_list[1][0].ref_index [0][h->mb2b8_xy[mb_xy]];
1003     l1ref1 = &h->ref_list[1][0].ref_index [1][h->mb2b8_xy[mb_xy]];
1004     if(!b8_stride){
1005         if(s->mb_y&1){
1006             l1ref0 += h->b8_stride;
1007             l1ref1 += h->b8_stride;
1008             l1mv0  +=  2*b4_stride;
1009             l1mv1  +=  2*b4_stride;
1010         }
1011     }
1012
1013     if(h->direct_spatial_mv_pred){
1014         int ref[2];
1015         int mv[2][2];
1016         int list;
1017
1018         /* FIXME interlacing + spatial direct uses wrong colocated block positions */
1019
1020         /* ref = min(neighbors) */
1021         for(list=0; list<2; list++){
1022             int refa = h->ref_cache[list][scan8[0] - 1];
1023             int refb = h->ref_cache[list][scan8[0] - 8];
1024             int refc = h->ref_cache[list][scan8[0] - 8 + 4];
1025             if(refc == PART_NOT_AVAILABLE)
1026                 refc = h->ref_cache[list][scan8[0] - 8 - 1];
1027             ref[list] = FFMIN3((unsigned)refa, (unsigned)refb, (unsigned)refc);
1028             if(ref[list] < 0)
1029                 ref[list] = -1;
1030         }
1031
1032         if(ref[0] < 0 && ref[1] < 0){
1033             ref[0] = ref[1] = 0;
1034             mv[0][0] = mv[0][1] =
1035             mv[1][0] = mv[1][1] = 0;
1036         }else{
1037             for(list=0; list<2; list++){
1038                 if(ref[list] >= 0)
1039                     pred_motion(h, 0, 4, list, ref[list], &mv[list][0], &mv[list][1]);
1040                 else
1041                     mv[list][0] = mv[list][1] = 0;
1042             }
1043         }
1044
1045         if(ref[1] < 0){
1046             if(!is_b8x8)
1047                 *mb_type &= ~MB_TYPE_L1;
1048             sub_mb_type &= ~MB_TYPE_L1;
1049         }else if(ref[0] < 0){
1050             if(!is_b8x8)
1051                 *mb_type &= ~MB_TYPE_L0;
1052             sub_mb_type &= ~MB_TYPE_L0;
1053         }
1054
1055         if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){
1056             for(i8=0; i8<4; i8++){
1057                 int x8 = i8&1;
1058                 int y8 = i8>>1;
1059                 int xy8 = x8+y8*b8_stride;
1060                 int xy4 = 3*x8+y8*b4_stride;
1061                 int a=0, b=0;
1062
1063                 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
1064                     continue;
1065                 h->sub_mb_type[i8] = sub_mb_type;
1066
1067                 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1);
1068                 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1);
1069                 if(!IS_INTRA(mb_type_col[y8])
1070                    && (   (l1ref0[xy8] == 0 && FFABS(l1mv0[xy4][0]) <= 1 && FFABS(l1mv0[xy4][1]) <= 1)
1071                        || (l1ref0[xy8]  < 0 && l1ref1[xy8] == 0 && FFABS(l1mv1[xy4][0]) <= 1 && FFABS(l1mv1[xy4][1]) <= 1))){
1072                     if(ref[0] > 0)
1073                         a= pack16to32(mv[0][0],mv[0][1]);
1074                     if(ref[1] > 0)
1075                         b= pack16to32(mv[1][0],mv[1][1]);
1076                 }else{
1077                     a= pack16to32(mv[0][0],mv[0][1]);
1078                     b= pack16to32(mv[1][0],mv[1][1]);
1079                 }
1080                 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, a, 4);
1081                 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, b, 4);
1082             }
1083         }else if(IS_16X16(*mb_type)){
1084             int a=0, b=0;
1085
1086             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, (uint8_t)ref[0], 1);
1087             fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, (uint8_t)ref[1], 1);
1088             if(!IS_INTRA(mb_type_col[0])
1089                && (   (l1ref0[0] == 0 && FFABS(l1mv0[0][0]) <= 1 && FFABS(l1mv0[0][1]) <= 1)
1090                    || (l1ref0[0]  < 0 && l1ref1[0] == 0 && FFABS(l1mv1[0][0]) <= 1 && FFABS(l1mv1[0][1]) <= 1
1091                        && (h->x264_build>33 || !h->x264_build)))){
1092                 if(ref[0] > 0)
1093                     a= pack16to32(mv[0][0],mv[0][1]);
1094                 if(ref[1] > 0)
1095                     b= pack16to32(mv[1][0],mv[1][1]);
1096             }else{
1097                 a= pack16to32(mv[0][0],mv[0][1]);
1098                 b= pack16to32(mv[1][0],mv[1][1]);
1099             }
1100             fill_rectangle(&h->mv_cache[0][scan8[0]], 4, 4, 8, a, 4);
1101             fill_rectangle(&h->mv_cache[1][scan8[0]], 4, 4, 8, b, 4);
1102         }else{
1103             for(i8=0; i8<4; i8++){
1104                 const int x8 = i8&1;
1105                 const int y8 = i8>>1;
1106
1107                 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
1108                     continue;
1109                 h->sub_mb_type[i8] = sub_mb_type;
1110
1111                 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mv[0][0],mv[0][1]), 4);
1112                 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mv[1][0],mv[1][1]), 4);
1113                 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[0], 1);
1114                 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, (uint8_t)ref[1], 1);
1115
1116                 /* col_zero_flag */
1117                 if(!IS_INTRA(mb_type_col[0]) && (   l1ref0[x8 + y8*b8_stride] == 0
1118                                               || (l1ref0[x8 + y8*b8_stride] < 0 && l1ref1[x8 + y8*b8_stride] == 0
1119                                                   && (h->x264_build>33 || !h->x264_build)))){
1120                     const int16_t (*l1mv)[2]= l1ref0[x8 + y8*b8_stride] == 0 ? l1mv0 : l1mv1;
1121                     if(IS_SUB_8X8(sub_mb_type)){
1122                         const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride];
1123                         if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){
1124                             if(ref[0] == 0)
1125                                 fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
1126                             if(ref[1] == 0)
1127                                 fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
1128                         }
1129                     }else
1130                     for(i4=0; i4<4; i4++){
1131                         const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride];
1132                         if(FFABS(mv_col[0]) <= 1 && FFABS(mv_col[1]) <= 1){
1133                             if(ref[0] == 0)
1134                                 *(uint32_t*)h->mv_cache[0][scan8[i8*4+i4]] = 0;
1135                             if(ref[1] == 0)
1136                                 *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] = 0;
1137                         }
1138                     }
1139                 }
1140             }
1141         }
1142     }else{ /* direct temporal mv pred */
1143         const int *map_col_to_list0[2] = {h->map_col_to_list0[0], h->map_col_to_list0[1]};
1144         const int *dist_scale_factor = h->dist_scale_factor;
1145
1146         if(FRAME_MBAFF && IS_INTERLACED(*mb_type)){
1147             map_col_to_list0[0] = h->map_col_to_list0_field[0];
1148             map_col_to_list0[1] = h->map_col_to_list0_field[1];
1149             dist_scale_factor = h->dist_scale_factor_field;
1150         }
1151         if(IS_INTERLACED(*mb_type) != IS_INTERLACED(mb_type_col[0])){
1152             /* FIXME assumes direct_8x8_inference == 1 */
1153             int y_shift  = 2*!IS_INTERLACED(*mb_type);
1154             int ref_shift= FRAME_MBAFF ? y_shift : 1;
1155
1156             for(i8=0; i8<4; i8++){
1157                 const int x8 = i8&1;
1158                 const int y8 = i8>>1;
1159                 int ref0, scale;
1160                 const int16_t (*l1mv)[2]= l1mv0;
1161
1162                 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
1163                     continue;
1164                 h->sub_mb_type[i8] = sub_mb_type;
1165
1166                 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1);
1167                 if(IS_INTRA(mb_type_col[y8])){
1168                     fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1);
1169                     fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
1170                     fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
1171                     continue;
1172                 }
1173
1174                 ref0 = l1ref0[x8 + y8*b8_stride];
1175                 if(ref0 >= 0)
1176                     ref0 = map_col_to_list0[0][ref0*2>>ref_shift];
1177                 else{
1178                     ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride]*2>>ref_shift];
1179                     l1mv= l1mv1;
1180                 }
1181                 scale = dist_scale_factor[ref0];
1182                 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1);
1183
1184                 {
1185                     const int16_t *mv_col = l1mv[x8*3 + y8*b4_stride];
1186                     int my_col = (mv_col[1]<<y_shift)/2;
1187                     int mx = (scale * mv_col[0] + 128) >> 8;
1188                     int my = (scale * my_col + 128) >> 8;
1189                     fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4);
1190                     fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-my_col), 4);
1191                 }
1192             }
1193             return;
1194         }
1195
1196         /* one-to-one mv scaling */
1197
1198         if(IS_16X16(*mb_type)){
1199             int ref, mv0, mv1;
1200
1201             fill_rectangle(&h->ref_cache[1][scan8[0]], 4, 4, 8, 0, 1);
1202             if(IS_INTRA(mb_type_col[0])){
1203                 ref=mv0=mv1=0;
1204             }else{
1205                 const int ref0 = l1ref0[0] >= 0 ? map_col_to_list0[0][l1ref0[0]]
1206                                                 : map_col_to_list0[1][l1ref1[0]];
1207                 const int scale = dist_scale_factor[ref0];
1208                 const int16_t *mv_col = l1ref0[0] >= 0 ? l1mv0[0] : l1mv1[0];
1209                 int mv_l0[2];
1210                 mv_l0[0] = (scale * mv_col[0] + 128) >> 8;
1211                 mv_l0[1] = (scale * mv_col[1] + 128) >> 8;
1212                 ref= ref0;
1213                 mv0= pack16to32(mv_l0[0],mv_l0[1]);
1214                 mv1= pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]);
1215             }
1216             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, ref, 1);
1217             fill_rectangle(&h-> mv_cache[0][scan8[0]], 4, 4, 8, mv0, 4);
1218             fill_rectangle(&h-> mv_cache[1][scan8[0]], 4, 4, 8, mv1, 4);
1219         }else{
1220             for(i8=0; i8<4; i8++){
1221                 const int x8 = i8&1;
1222                 const int y8 = i8>>1;
1223                 int ref0, scale;
1224                 const int16_t (*l1mv)[2]= l1mv0;
1225
1226                 if(is_b8x8 && !IS_DIRECT(h->sub_mb_type[i8]))
1227                     continue;
1228                 h->sub_mb_type[i8] = sub_mb_type;
1229                 fill_rectangle(&h->ref_cache[1][scan8[i8*4]], 2, 2, 8, 0, 1);
1230                 if(IS_INTRA(mb_type_col[0])){
1231                     fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, 0, 1);
1232                     fill_rectangle(&h-> mv_cache[0][scan8[i8*4]], 2, 2, 8, 0, 4);
1233                     fill_rectangle(&h-> mv_cache[1][scan8[i8*4]], 2, 2, 8, 0, 4);
1234                     continue;
1235                 }
1236
1237                 ref0 = l1ref0[x8 + y8*b8_stride];
1238                 if(ref0 >= 0)
1239                     ref0 = map_col_to_list0[0][ref0];
1240                 else{
1241                     ref0 = map_col_to_list0[1][l1ref1[x8 + y8*b8_stride]];
1242                     l1mv= l1mv1;
1243                 }
1244                 scale = dist_scale_factor[ref0];
1245
1246                 fill_rectangle(&h->ref_cache[0][scan8[i8*4]], 2, 2, 8, ref0, 1);
1247                 if(IS_SUB_8X8(sub_mb_type)){
1248                     const int16_t *mv_col = l1mv[x8*3 + y8*3*b4_stride];
1249                     int mx = (scale * mv_col[0] + 128) >> 8;
1250                     int my = (scale * mv_col[1] + 128) >> 8;
1251                     fill_rectangle(&h->mv_cache[0][scan8[i8*4]], 2, 2, 8, pack16to32(mx,my), 4);
1252                     fill_rectangle(&h->mv_cache[1][scan8[i8*4]], 2, 2, 8, pack16to32(mx-mv_col[0],my-mv_col[1]), 4);
1253                 }else
1254                 for(i4=0; i4<4; i4++){
1255                     const int16_t *mv_col = l1mv[x8*2 + (i4&1) + (y8*2 + (i4>>1))*b4_stride];
1256                     int16_t *mv_l0 = h->mv_cache[0][scan8[i8*4+i4]];
1257                     mv_l0[0] = (scale * mv_col[0] + 128) >> 8;
1258                     mv_l0[1] = (scale * mv_col[1] + 128) >> 8;
1259                     *(uint32_t*)h->mv_cache[1][scan8[i8*4+i4]] =
1260                         pack16to32(mv_l0[0]-mv_col[0],mv_l0[1]-mv_col[1]);
1261                 }
1262             }
1263         }
1264     }
1265 }
1266
1267 static inline void write_back_motion(H264Context *h, int mb_type){
1268     MpegEncContext * const s = &h->s;
1269     const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
1270     const int b8_xy= 2*s->mb_x + 2*s->mb_y*h->b8_stride;
1271     int list;
1272
1273     if(!USES_LIST(mb_type, 0))
1274         fill_rectangle(&s->current_picture.ref_index[0][b8_xy], 2, 2, h->b8_stride, (uint8_t)LIST_NOT_USED, 1);
1275
1276     for(list=0; list<h->list_count; list++){
1277         int y;
1278         if(!USES_LIST(mb_type, list))
1279             continue;
1280
1281         for(y=0; y<4; y++){
1282             *(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];
1283             *(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];
1284         }
1285         if( h->pps.cabac ) {
1286             if(IS_SKIP(mb_type))
1287                 fill_rectangle(h->mvd_table[list][b_xy], 4, 4, h->b_stride, 0, 4);
1288             else
1289             for(y=0; y<4; y++){
1290                 *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+0 + 8*y];
1291                 *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+2 + 8*y];
1292             }
1293         }
1294
1295         {
1296             int8_t *ref_index = &s->current_picture.ref_index[list][b8_xy];
1297             ref_index[0+0*h->b8_stride]= h->ref_cache[list][scan8[0]];
1298             ref_index[1+0*h->b8_stride]= h->ref_cache[list][scan8[4]];
1299             ref_index[0+1*h->b8_stride]= h->ref_cache[list][scan8[8]];
1300             ref_index[1+1*h->b8_stride]= h->ref_cache[list][scan8[12]];
1301         }
1302     }
1303
1304     if(h->slice_type_nos == FF_B_TYPE && h->pps.cabac){
1305         if(IS_8X8(mb_type)){
1306             uint8_t *direct_table = &h->direct_table[b8_xy];
1307             direct_table[1+0*h->b8_stride] = IS_DIRECT(h->sub_mb_type[1]) ? 1 : 0;
1308             direct_table[0+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[2]) ? 1 : 0;
1309             direct_table[1+1*h->b8_stride] = IS_DIRECT(h->sub_mb_type[3]) ? 1 : 0;
1310         }
1311     }
1312 }
1313
1314 /**
1315  * Decodes a network abstraction layer unit.
1316  * @param consumed is the number of bytes used as input
1317  * @param length is the length of the array
1318  * @param dst_length is the number of decoded bytes FIXME here or a decode rbsp tailing?
1319  * @returns decoded bytes, might be src+1 if no escapes
1320  */
1321 static const uint8_t *decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){
1322     int i, si, di;
1323     uint8_t *dst;
1324     int bufidx;
1325
1326 //    src[0]&0x80;                //forbidden bit
1327     h->nal_ref_idc= src[0]>>5;
1328     h->nal_unit_type= src[0]&0x1F;
1329
1330     src++; length--;
1331 #if 0
1332     for(i=0; i<length; i++)
1333         printf("%2X ", src[i]);
1334 #endif
1335     for(i=0; i+1<length; i+=2){
1336         if(src[i]) continue;
1337         if(i>0 && src[i-1]==0) i--;
1338         if(i+2<length && src[i+1]==0 && src[i+2]<=3){
1339             if(src[i+2]!=3){
1340                 /* startcode, so we must be past the end */
1341                 length=i;
1342             }
1343             break;
1344         }
1345     }
1346
1347     if(i>=length-1){ //no escaped 0
1348         *dst_length= length;
1349         *consumed= length+1; //+1 for the header
1350         return src;
1351     }
1352
1353     bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data
1354     h->rbsp_buffer[bufidx]= av_fast_realloc(h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length);
1355     dst= h->rbsp_buffer[bufidx];
1356
1357     if (dst == NULL){
1358         return NULL;
1359     }
1360
1361 //printf("decoding esc\n");
1362     si=di=0;
1363     while(si<length){
1364         //remove escapes (very rare 1:2^22)
1365         if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){
1366             if(src[si+2]==3){ //escape
1367                 dst[di++]= 0;
1368                 dst[di++]= 0;
1369                 si+=3;
1370                 continue;
1371             }else //next start code
1372                 break;
1373         }
1374
1375         dst[di++]= src[si++];
1376     }
1377
1378     *dst_length= di;
1379     *consumed= si + 1;//+1 for the header
1380 //FIXME store exact number of bits in the getbitcontext (it is needed for decoding)
1381     return dst;
1382 }
1383
1384 /**
1385  * identifies the exact end of the bitstream
1386  * @return the length of the trailing, or 0 if damaged
1387  */
1388 static int decode_rbsp_trailing(H264Context *h, const uint8_t *src){
1389     int v= *src;
1390     int r;
1391
1392     tprintf(h->s.avctx, "rbsp trailing %X\n", v);
1393
1394     for(r=1; r<9; r++){
1395         if(v&1) return r;
1396         v>>=1;
1397     }
1398     return 0;
1399 }
1400
1401 /**
1402  * IDCT transforms the 16 dc values and dequantizes them.
1403  * @param qp quantization parameter
1404  */
1405 static void h264_luma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){
1406 #define stride 16
1407     int i;
1408     int temp[16]; //FIXME check if this is a good idea
1409     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
1410     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
1411
1412 //memset(block, 64, 2*256);
1413 //return;
1414     for(i=0; i<4; i++){
1415         const int offset= y_offset[i];
1416         const int z0= block[offset+stride*0] + block[offset+stride*4];
1417         const int z1= block[offset+stride*0] - block[offset+stride*4];
1418         const int z2= block[offset+stride*1] - block[offset+stride*5];
1419         const int z3= block[offset+stride*1] + block[offset+stride*5];
1420
1421         temp[4*i+0]= z0+z3;
1422         temp[4*i+1]= z1+z2;
1423         temp[4*i+2]= z1-z2;
1424         temp[4*i+3]= z0-z3;
1425     }
1426
1427     for(i=0; i<4; i++){
1428         const int offset= x_offset[i];
1429         const int z0= temp[4*0+i] + temp[4*2+i];
1430         const int z1= temp[4*0+i] - temp[4*2+i];
1431         const int z2= temp[4*1+i] - temp[4*3+i];
1432         const int z3= temp[4*1+i] + temp[4*3+i];
1433
1434         block[stride*0 +offset]= ((((z0 + z3)*qmul + 128 ) >> 8)); //FIXME think about merging this into decode_residual
1435         block[stride*2 +offset]= ((((z1 + z2)*qmul + 128 ) >> 8));
1436         block[stride*8 +offset]= ((((z1 - z2)*qmul + 128 ) >> 8));
1437         block[stride*10+offset]= ((((z0 - z3)*qmul + 128 ) >> 8));
1438     }
1439 }
1440
1441 #if 0
1442 /**
1443  * DCT transforms the 16 dc values.
1444  * @param qp quantization parameter ??? FIXME
1445  */
1446 static void h264_luma_dc_dct_c(DCTELEM *block/*, int qp*/){
1447 //    const int qmul= dequant_coeff[qp][0];
1448     int i;
1449     int temp[16]; //FIXME check if this is a good idea
1450     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
1451     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
1452
1453     for(i=0; i<4; i++){
1454         const int offset= y_offset[i];
1455         const int z0= block[offset+stride*0] + block[offset+stride*4];
1456         const int z1= block[offset+stride*0] - block[offset+stride*4];
1457         const int z2= block[offset+stride*1] - block[offset+stride*5];
1458         const int z3= block[offset+stride*1] + block[offset+stride*5];
1459
1460         temp[4*i+0]= z0+z3;
1461         temp[4*i+1]= z1+z2;
1462         temp[4*i+2]= z1-z2;
1463         temp[4*i+3]= z0-z3;
1464     }
1465
1466     for(i=0; i<4; i++){
1467         const int offset= x_offset[i];
1468         const int z0= temp[4*0+i] + temp[4*2+i];
1469         const int z1= temp[4*0+i] - temp[4*2+i];
1470         const int z2= temp[4*1+i] - temp[4*3+i];
1471         const int z3= temp[4*1+i] + temp[4*3+i];
1472
1473         block[stride*0 +offset]= (z0 + z3)>>1;
1474         block[stride*2 +offset]= (z1 + z2)>>1;
1475         block[stride*8 +offset]= (z1 - z2)>>1;
1476         block[stride*10+offset]= (z0 - z3)>>1;
1477     }
1478 }
1479 #endif
1480
1481 #undef xStride
1482 #undef stride
1483
1484 static void chroma_dc_dequant_idct_c(DCTELEM *block, int qp, int qmul){
1485     const int stride= 16*2;
1486     const int xStride= 16;
1487     int a,b,c,d,e;
1488
1489     a= block[stride*0 + xStride*0];
1490     b= block[stride*0 + xStride*1];
1491     c= block[stride*1 + xStride*0];
1492     d= block[stride*1 + xStride*1];
1493
1494     e= a-b;
1495     a= a+b;
1496     b= c-d;
1497     c= c+d;
1498
1499     block[stride*0 + xStride*0]= ((a+c)*qmul) >> 7;
1500     block[stride*0 + xStride*1]= ((e+b)*qmul) >> 7;
1501     block[stride*1 + xStride*0]= ((a-c)*qmul) >> 7;
1502     block[stride*1 + xStride*1]= ((e-b)*qmul) >> 7;
1503 }
1504
1505 #if 0
1506 static void chroma_dc_dct_c(DCTELEM *block){
1507     const int stride= 16*2;
1508     const int xStride= 16;
1509     int a,b,c,d,e;
1510
1511     a= block[stride*0 + xStride*0];
1512     b= block[stride*0 + xStride*1];
1513     c= block[stride*1 + xStride*0];
1514     d= block[stride*1 + xStride*1];
1515
1516     e= a-b;
1517     a= a+b;
1518     b= c-d;
1519     c= c+d;
1520
1521     block[stride*0 + xStride*0]= (a+c);
1522     block[stride*0 + xStride*1]= (e+b);
1523     block[stride*1 + xStride*0]= (a-c);
1524     block[stride*1 + xStride*1]= (e-b);
1525 }
1526 #endif
1527
1528 /**
1529  * gets the chroma qp.
1530  */
1531 static inline int get_chroma_qp(H264Context *h, int t, int qscale){
1532     return h->pps.chroma_qp_table[t][qscale];
1533 }
1534
1535 //FIXME need to check that this does not overflow signed 32 bit for low qp, I am not sure, it's very close
1536 //FIXME check that gcc inlines this (and optimizes intra & separate_dc stuff away)
1537 static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale, int intra, int separate_dc){
1538     int i;
1539     const int * const quant_table= quant_coeff[qscale];
1540     const int bias= intra ? (1<<QUANT_SHIFT)/3 : (1<<QUANT_SHIFT)/6;
1541     const unsigned int threshold1= (1<<QUANT_SHIFT) - bias - 1;
1542     const unsigned int threshold2= (threshold1<<1);
1543     int last_non_zero;
1544
1545     if(separate_dc){
1546         if(qscale<=18){
1547             //avoid overflows
1548             const int dc_bias= intra ? (1<<(QUANT_SHIFT-2))/3 : (1<<(QUANT_SHIFT-2))/6;
1549             const unsigned int dc_threshold1= (1<<(QUANT_SHIFT-2)) - dc_bias - 1;
1550             const unsigned int dc_threshold2= (dc_threshold1<<1);
1551
1552             int level= block[0]*quant_coeff[qscale+18][0];
1553             if(((unsigned)(level+dc_threshold1))>dc_threshold2){
1554                 if(level>0){
1555                     level= (dc_bias + level)>>(QUANT_SHIFT-2);
1556                     block[0]= level;
1557                 }else{
1558                     level= (dc_bias - level)>>(QUANT_SHIFT-2);
1559                     block[0]= -level;
1560                 }
1561 //                last_non_zero = i;
1562             }else{
1563                 block[0]=0;
1564             }
1565         }else{
1566             const int dc_bias= intra ? (1<<(QUANT_SHIFT+1))/3 : (1<<(QUANT_SHIFT+1))/6;
1567             const unsigned int dc_threshold1= (1<<(QUANT_SHIFT+1)) - dc_bias - 1;
1568             const unsigned int dc_threshold2= (dc_threshold1<<1);
1569
1570             int level= block[0]*quant_table[0];
1571             if(((unsigned)(level+dc_threshold1))>dc_threshold2){
1572                 if(level>0){
1573                     level= (dc_bias + level)>>(QUANT_SHIFT+1);
1574                     block[0]= level;
1575                 }else{
1576                     level= (dc_bias - level)>>(QUANT_SHIFT+1);
1577                     block[0]= -level;
1578                 }
1579 //                last_non_zero = i;
1580             }else{
1581                 block[0]=0;
1582             }
1583         }
1584         last_non_zero= 0;
1585         i=1;
1586     }else{
1587         last_non_zero= -1;
1588         i=0;
1589     }
1590
1591     for(; i<16; i++){
1592         const int j= scantable[i];
1593         int level= block[j]*quant_table[j];
1594
1595 //        if(   bias+level >= (1<<(QMAT_SHIFT - 3))
1596 //           || bias-level >= (1<<(QMAT_SHIFT - 3))){
1597         if(((unsigned)(level+threshold1))>threshold2){
1598             if(level>0){
1599                 level= (bias + level)>>QUANT_SHIFT;
1600                 block[j]= level;
1601             }else{
1602                 level= (bias - level)>>QUANT_SHIFT;
1603                 block[j]= -level;
1604             }
1605             last_non_zero = i;
1606         }else{
1607             block[j]=0;
1608         }
1609     }
1610
1611     return last_non_zero;
1612 }
1613
1614 static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list,
1615                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1616                            int src_x_offset, int src_y_offset,
1617                            qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op){
1618     MpegEncContext * const s = &h->s;
1619     const int mx= h->mv_cache[list][ scan8[n] ][0] + src_x_offset*8;
1620     int my=       h->mv_cache[list][ scan8[n] ][1] + src_y_offset*8;
1621     const int luma_xy= (mx&3) + ((my&3)<<2);
1622     uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*h->mb_linesize;
1623     uint8_t * src_cb, * src_cr;
1624     int extra_width= h->emu_edge_width;
1625     int extra_height= h->emu_edge_height;
1626     int emu=0;
1627     const int full_mx= mx>>2;
1628     const int full_my= my>>2;
1629     const int pic_width  = 16*s->mb_width;
1630     const int pic_height = 16*s->mb_height >> MB_FIELD;
1631
1632     if(!pic->data[0]) //FIXME this is unacceptable, some sensible error concealment must be done for missing reference frames
1633         return;
1634
1635     if(mx&7) extra_width -= 3;
1636     if(my&7) extra_height -= 3;
1637
1638     if(   full_mx < 0-extra_width
1639        || full_my < 0-extra_height
1640        || full_mx + 16/*FIXME*/ > pic_width + extra_width
1641        || full_my + 16/*FIXME*/ > pic_height + extra_height){
1642         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);
1643             src_y= s->edge_emu_buffer + 2 + 2*h->mb_linesize;
1644         emu=1;
1645     }
1646
1647     qpix_op[luma_xy](dest_y, src_y, h->mb_linesize); //FIXME try variable height perhaps?
1648     if(!square){
1649         qpix_op[luma_xy](dest_y + delta, src_y + delta, h->mb_linesize);
1650     }
1651
1652     if(ENABLE_GRAY && s->flags&CODEC_FLAG_GRAY) return;
1653
1654     if(MB_FIELD){
1655         // chroma offset when predicting from a field of opposite parity
1656         my += 2 * ((s->mb_y & 1) - (pic->reference - 1));
1657         emu |= (my>>3) < 0 || (my>>3) + 8 >= (pic_height>>1);
1658     }
1659     src_cb= pic->data[1] + (mx>>3) + (my>>3)*h->mb_uvlinesize;
1660     src_cr= pic->data[2] + (mx>>3) + (my>>3)*h->mb_uvlinesize;
1661
1662     if(emu){
1663         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);
1664             src_cb= s->edge_emu_buffer;
1665     }
1666     chroma_op(dest_cb, src_cb, h->mb_uvlinesize, chroma_height, mx&7, my&7);
1667
1668     if(emu){
1669         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);
1670             src_cr= s->edge_emu_buffer;
1671     }
1672     chroma_op(dest_cr, src_cr, h->mb_uvlinesize, chroma_height, mx&7, my&7);
1673 }
1674
1675 static inline void mc_part_std(H264Context *h, int n, int square, int chroma_height, int delta,
1676                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1677                            int x_offset, int y_offset,
1678                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
1679                            qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg,
1680                            int list0, int list1){
1681     MpegEncContext * const s = &h->s;
1682     qpel_mc_func *qpix_op=  qpix_put;
1683     h264_chroma_mc_func chroma_op= chroma_put;
1684
1685     dest_y  += 2*x_offset + 2*y_offset*h->  mb_linesize;
1686     dest_cb +=   x_offset +   y_offset*h->mb_uvlinesize;
1687     dest_cr +=   x_offset +   y_offset*h->mb_uvlinesize;
1688     x_offset += 8*s->mb_x;
1689     y_offset += 8*(s->mb_y >> MB_FIELD);
1690
1691     if(list0){
1692         Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ];
1693         mc_dir_part(h, ref, n, square, chroma_height, delta, 0,
1694                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
1695                            qpix_op, chroma_op);
1696
1697         qpix_op=  qpix_avg;
1698         chroma_op= chroma_avg;
1699     }
1700
1701     if(list1){
1702         Picture *ref= &h->ref_list[1][ h->ref_cache[1][ scan8[n] ] ];
1703         mc_dir_part(h, ref, n, square, chroma_height, delta, 1,
1704                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
1705                            qpix_op, chroma_op);
1706     }
1707 }
1708
1709 static inline void mc_part_weighted(H264Context *h, int n, int square, int chroma_height, int delta,
1710                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1711                            int x_offset, int y_offset,
1712                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
1713                            h264_weight_func luma_weight_op, h264_weight_func chroma_weight_op,
1714                            h264_biweight_func luma_weight_avg, h264_biweight_func chroma_weight_avg,
1715                            int list0, int list1){
1716     MpegEncContext * const s = &h->s;
1717
1718     dest_y  += 2*x_offset + 2*y_offset*h->  mb_linesize;
1719     dest_cb +=   x_offset +   y_offset*h->mb_uvlinesize;
1720     dest_cr +=   x_offset +   y_offset*h->mb_uvlinesize;
1721     x_offset += 8*s->mb_x;
1722     y_offset += 8*(s->mb_y >> MB_FIELD);
1723
1724     if(list0 && list1){
1725         /* don't optimize for luma-only case, since B-frames usually
1726          * use implicit weights => chroma too. */
1727         uint8_t *tmp_cb = s->obmc_scratchpad;
1728         uint8_t *tmp_cr = s->obmc_scratchpad + 8;
1729         uint8_t *tmp_y  = s->obmc_scratchpad + 8*h->mb_uvlinesize;
1730         int refn0 = h->ref_cache[0][ scan8[n] ];
1731         int refn1 = h->ref_cache[1][ scan8[n] ];
1732
1733         mc_dir_part(h, &h->ref_list[0][refn0], n, square, chroma_height, delta, 0,
1734                     dest_y, dest_cb, dest_cr,
1735                     x_offset, y_offset, qpix_put, chroma_put);
1736         mc_dir_part(h, &h->ref_list[1][refn1], n, square, chroma_height, delta, 1,
1737                     tmp_y, tmp_cb, tmp_cr,
1738                     x_offset, y_offset, qpix_put, chroma_put);
1739
1740         if(h->use_weight == 2){
1741             int weight0 = h->implicit_weight[refn0][refn1];
1742             int weight1 = 64 - weight0;
1743             luma_weight_avg(  dest_y,  tmp_y,  h->  mb_linesize, 5, weight0, weight1, 0);
1744             chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, weight1, 0);
1745             chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, weight1, 0);
1746         }else{
1747             luma_weight_avg(dest_y, tmp_y, h->mb_linesize, h->luma_log2_weight_denom,
1748                             h->luma_weight[0][refn0], h->luma_weight[1][refn1],
1749                             h->luma_offset[0][refn0] + h->luma_offset[1][refn1]);
1750             chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom,
1751                             h->chroma_weight[0][refn0][0], h->chroma_weight[1][refn1][0],
1752                             h->chroma_offset[0][refn0][0] + h->chroma_offset[1][refn1][0]);
1753             chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom,
1754                             h->chroma_weight[0][refn0][1], h->chroma_weight[1][refn1][1],
1755                             h->chroma_offset[0][refn0][1] + h->chroma_offset[1][refn1][1]);
1756         }
1757     }else{
1758         int list = list1 ? 1 : 0;
1759         int refn = h->ref_cache[list][ scan8[n] ];
1760         Picture *ref= &h->ref_list[list][refn];
1761         mc_dir_part(h, ref, n, square, chroma_height, delta, list,
1762                     dest_y, dest_cb, dest_cr, x_offset, y_offset,
1763                     qpix_put, chroma_put);
1764
1765         luma_weight_op(dest_y, h->mb_linesize, h->luma_log2_weight_denom,
1766                        h->luma_weight[list][refn], h->luma_offset[list][refn]);
1767         if(h->use_weight_chroma){
1768             chroma_weight_op(dest_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom,
1769                              h->chroma_weight[list][refn][0], h->chroma_offset[list][refn][0]);
1770             chroma_weight_op(dest_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom,
1771                              h->chroma_weight[list][refn][1], h->chroma_offset[list][refn][1]);
1772         }
1773     }
1774 }
1775
1776 static inline void mc_part(H264Context *h, int n, int square, int chroma_height, int delta,
1777                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1778                            int x_offset, int y_offset,
1779                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
1780                            qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg,
1781                            h264_weight_func *weight_op, h264_biweight_func *weight_avg,
1782                            int list0, int list1){
1783     if((h->use_weight==2 && list0 && list1
1784         && (h->implicit_weight[ h->ref_cache[0][scan8[n]] ][ h->ref_cache[1][scan8[n]] ] != 32))
1785        || h->use_weight==1)
1786         mc_part_weighted(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr,
1787                          x_offset, y_offset, qpix_put, chroma_put,
1788                          weight_op[0], weight_op[3], weight_avg[0], weight_avg[3], list0, list1);
1789     else
1790         mc_part_std(h, n, square, chroma_height, delta, dest_y, dest_cb, dest_cr,
1791                     x_offset, y_offset, qpix_put, chroma_put, qpix_avg, chroma_avg, list0, list1);
1792 }
1793
1794 static inline void prefetch_motion(H264Context *h, int list){
1795     /* fetch pixels for estimated mv 4 macroblocks ahead
1796      * optimized for 64byte cache lines */
1797     MpegEncContext * const s = &h->s;
1798     const int refn = h->ref_cache[list][scan8[0]];
1799     if(refn >= 0){
1800         const int mx= (h->mv_cache[list][scan8[0]][0]>>2) + 16*s->mb_x + 8;
1801         const int my= (h->mv_cache[list][scan8[0]][1]>>2) + 16*s->mb_y;
1802         uint8_t **src= h->ref_list[list][refn].data;
1803         int off= mx + (my + (s->mb_x&3)*4)*h->mb_linesize + 64;
1804         s->dsp.prefetch(src[0]+off, s->linesize, 4);
1805         off= (mx>>1) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + 64;
1806         s->dsp.prefetch(src[1]+off, src[2]-src[1], 2);
1807     }
1808 }
1809
1810 static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1811                       qpel_mc_func (*qpix_put)[16], h264_chroma_mc_func (*chroma_put),
1812                       qpel_mc_func (*qpix_avg)[16], h264_chroma_mc_func (*chroma_avg),
1813                       h264_weight_func *weight_op, h264_biweight_func *weight_avg){
1814     MpegEncContext * const s = &h->s;
1815     const int mb_xy= h->mb_xy;
1816     const int mb_type= s->current_picture.mb_type[mb_xy];
1817
1818     assert(IS_INTER(mb_type));
1819
1820     prefetch_motion(h, 0);
1821
1822     if(IS_16X16(mb_type)){
1823         mc_part(h, 0, 1, 8, 0, dest_y, dest_cb, dest_cr, 0, 0,
1824                 qpix_put[0], chroma_put[0], qpix_avg[0], chroma_avg[0],
1825                 &weight_op[0], &weight_avg[0],
1826                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
1827     }else if(IS_16X8(mb_type)){
1828         mc_part(h, 0, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 0,
1829                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
1830                 &weight_op[1], &weight_avg[1],
1831                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
1832         mc_part(h, 8, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 4,
1833                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
1834                 &weight_op[1], &weight_avg[1],
1835                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
1836     }else if(IS_8X16(mb_type)){
1837         mc_part(h, 0, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 0, 0,
1838                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
1839                 &weight_op[2], &weight_avg[2],
1840                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
1841         mc_part(h, 4, 0, 8, 8*h->mb_linesize, dest_y, dest_cb, dest_cr, 4, 0,
1842                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
1843                 &weight_op[2], &weight_avg[2],
1844                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
1845     }else{
1846         int i;
1847
1848         assert(IS_8X8(mb_type));
1849
1850         for(i=0; i<4; i++){
1851             const int sub_mb_type= h->sub_mb_type[i];
1852             const int n= 4*i;
1853             int x_offset= (i&1)<<2;
1854             int y_offset= (i&2)<<1;
1855
1856             if(IS_SUB_8X8(sub_mb_type)){
1857                 mc_part(h, n, 1, 4, 0, dest_y, dest_cb, dest_cr, x_offset, y_offset,
1858                     qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
1859                     &weight_op[3], &weight_avg[3],
1860                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
1861             }else if(IS_SUB_8X4(sub_mb_type)){
1862                 mc_part(h, n  , 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset,
1863                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
1864                     &weight_op[4], &weight_avg[4],
1865                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
1866                 mc_part(h, n+2, 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset+2,
1867                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
1868                     &weight_op[4], &weight_avg[4],
1869                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
1870             }else if(IS_SUB_4X8(sub_mb_type)){
1871                 mc_part(h, n  , 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset, y_offset,
1872                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
1873                     &weight_op[5], &weight_avg[5],
1874                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
1875                 mc_part(h, n+1, 0, 4, 4*h->mb_linesize, dest_y, dest_cb, dest_cr, x_offset+2, y_offset,
1876                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
1877                     &weight_op[5], &weight_avg[5],
1878                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
1879             }else{
1880                 int j;
1881                 assert(IS_SUB_4X4(sub_mb_type));
1882                 for(j=0; j<4; j++){
1883                     int sub_x_offset= x_offset + 2*(j&1);
1884                     int sub_y_offset= y_offset +   (j&2);
1885                     mc_part(h, n+j, 1, 2, 0, dest_y, dest_cb, dest_cr, sub_x_offset, sub_y_offset,
1886                         qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
1887                         &weight_op[6], &weight_avg[6],
1888                         IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
1889                 }
1890             }
1891         }
1892     }
1893
1894     prefetch_motion(h, 1);
1895 }
1896
1897 static av_cold void decode_init_vlc(void){
1898     static int done = 0;
1899
1900     if (!done) {
1901         int i;
1902         int offset;
1903         done = 1;
1904
1905         chroma_dc_coeff_token_vlc.table = chroma_dc_coeff_token_vlc_table;
1906         chroma_dc_coeff_token_vlc.table_allocated = chroma_dc_coeff_token_vlc_table_size;
1907         init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5,
1908                  &chroma_dc_coeff_token_len [0], 1, 1,
1909                  &chroma_dc_coeff_token_bits[0], 1, 1,
1910                  INIT_VLC_USE_NEW_STATIC);
1911
1912         offset = 0;
1913         for(i=0; i<4; i++){
1914             coeff_token_vlc[i].table = coeff_token_vlc_tables+offset;
1915             coeff_token_vlc[i].table_allocated = coeff_token_vlc_tables_size[i];
1916             init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17,
1917                      &coeff_token_len [i][0], 1, 1,
1918                      &coeff_token_bits[i][0], 1, 1,
1919                      INIT_VLC_USE_NEW_STATIC);
1920             offset += coeff_token_vlc_tables_size[i];
1921         }
1922         /*
1923          * This is a one time safety check to make sure that
1924          * the packed static coeff_token_vlc table sizes
1925          * were initialized correctly.
1926          */
1927         assert(offset == sizeof(coeff_token_vlc_tables)/(sizeof(VLC_TYPE)*2));
1928
1929         for(i=0; i<3; i++){
1930             chroma_dc_total_zeros_vlc[i].table = chroma_dc_total_zeros_vlc_tables[i];
1931             chroma_dc_total_zeros_vlc[i].table_allocated = chroma_dc_total_zeros_vlc_tables_size;
1932             init_vlc(&chroma_dc_total_zeros_vlc[i],
1933                      CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
1934                      &chroma_dc_total_zeros_len [i][0], 1, 1,
1935                      &chroma_dc_total_zeros_bits[i][0], 1, 1,
1936                      INIT_VLC_USE_NEW_STATIC);
1937         }
1938         for(i=0; i<15; i++){
1939             total_zeros_vlc[i].table = total_zeros_vlc_tables[i];
1940             total_zeros_vlc[i].table_allocated = total_zeros_vlc_tables_size;
1941             init_vlc(&total_zeros_vlc[i],
1942                      TOTAL_ZEROS_VLC_BITS, 16,
1943                      &total_zeros_len [i][0], 1, 1,
1944                      &total_zeros_bits[i][0], 1, 1,
1945                      INIT_VLC_USE_NEW_STATIC);
1946         }
1947
1948         for(i=0; i<6; i++){
1949             run_vlc[i].table = run_vlc_tables[i];
1950             run_vlc[i].table_allocated = run_vlc_tables_size;
1951             init_vlc(&run_vlc[i],
1952                      RUN_VLC_BITS, 7,
1953                      &run_len [i][0], 1, 1,
1954                      &run_bits[i][0], 1, 1,
1955                      INIT_VLC_USE_NEW_STATIC);
1956         }
1957         run7_vlc.table = run7_vlc_table,
1958         run7_vlc.table_allocated = run7_vlc_table_size;
1959         init_vlc(&run7_vlc, RUN7_VLC_BITS, 16,
1960                  &run_len [6][0], 1, 1,
1961                  &run_bits[6][0], 1, 1,
1962                  INIT_VLC_USE_NEW_STATIC);
1963     }
1964 }
1965
1966 static void free_tables(H264Context *h){
1967     int i;
1968     H264Context *hx;
1969     av_freep(&h->intra4x4_pred_mode);
1970     av_freep(&h->chroma_pred_mode_table);
1971     av_freep(&h->cbp_table);
1972     av_freep(&h->mvd_table[0]);
1973     av_freep(&h->mvd_table[1]);
1974     av_freep(&h->direct_table);
1975     av_freep(&h->non_zero_count);
1976     av_freep(&h->slice_table_base);
1977     h->slice_table= NULL;
1978
1979     av_freep(&h->mb2b_xy);
1980     av_freep(&h->mb2b8_xy);
1981
1982     for(i = 0; i < MAX_SPS_COUNT; i++)
1983         av_freep(h->sps_buffers + i);
1984
1985     for(i = 0; i < MAX_PPS_COUNT; i++)
1986         av_freep(h->pps_buffers + i);
1987
1988     for(i = 0; i < h->s.avctx->thread_count; i++) {
1989         hx = h->thread_context[i];
1990         if(!hx) continue;
1991         av_freep(&hx->top_borders[1]);
1992         av_freep(&hx->top_borders[0]);
1993         av_freep(&hx->s.obmc_scratchpad);
1994     }
1995 }
1996
1997 static void init_dequant8_coeff_table(H264Context *h){
1998     int i,q,x;
1999     const int transpose = (h->s.dsp.h264_idct8_add != ff_h264_idct8_add_c); //FIXME ugly
2000     h->dequant8_coeff[0] = h->dequant8_buffer[0];
2001     h->dequant8_coeff[1] = h->dequant8_buffer[1];
2002
2003     for(i=0; i<2; i++ ){
2004         if(i && !memcmp(h->pps.scaling_matrix8[0], h->pps.scaling_matrix8[1], 64*sizeof(uint8_t))){
2005             h->dequant8_coeff[1] = h->dequant8_buffer[0];
2006             break;
2007         }
2008
2009         for(q=0; q<52; q++){
2010             int shift = ff_div6[q];
2011             int idx = ff_rem6[q];
2012             for(x=0; x<64; x++)
2013                 h->dequant8_coeff[i][q][transpose ? (x>>3)|((x&7)<<3) : x] =
2014                     ((uint32_t)dequant8_coeff_init[idx][ dequant8_coeff_init_scan[((x>>1)&12) | (x&3)] ] *
2015                     h->pps.scaling_matrix8[i][x]) << shift;
2016         }
2017     }
2018 }
2019
2020 static void init_dequant4_coeff_table(H264Context *h){
2021     int i,j,q,x;
2022     const int transpose = (h->s.dsp.h264_idct_add != ff_h264_idct_add_c); //FIXME ugly
2023     for(i=0; i<6; i++ ){
2024         h->dequant4_coeff[i] = h->dequant4_buffer[i];
2025         for(j=0; j<i; j++){
2026             if(!memcmp(h->pps.scaling_matrix4[j], h->pps.scaling_matrix4[i], 16*sizeof(uint8_t))){
2027                 h->dequant4_coeff[i] = h->dequant4_buffer[j];
2028                 break;
2029             }
2030         }
2031         if(j<i)
2032             continue;
2033
2034         for(q=0; q<52; q++){
2035             int shift = ff_div6[q] + 2;
2036             int idx = ff_rem6[q];
2037             for(x=0; x<16; x++)
2038                 h->dequant4_coeff[i][q][transpose ? (x>>2)|((x<<2)&0xF) : x] =
2039                     ((uint32_t)dequant4_coeff_init[idx][(x&1) + ((x>>2)&1)] *
2040                     h->pps.scaling_matrix4[i][x]) << shift;
2041         }
2042     }
2043 }
2044
2045 static void init_dequant_tables(H264Context *h){
2046     int i,x;
2047     init_dequant4_coeff_table(h);
2048     if(h->pps.transform_8x8_mode)
2049         init_dequant8_coeff_table(h);
2050     if(h->sps.transform_bypass){
2051         for(i=0; i<6; i++)
2052             for(x=0; x<16; x++)
2053                 h->dequant4_coeff[i][0][x] = 1<<6;
2054         if(h->pps.transform_8x8_mode)
2055             for(i=0; i<2; i++)
2056                 for(x=0; x<64; x++)
2057                     h->dequant8_coeff[i][0][x] = 1<<6;
2058     }
2059 }
2060
2061
2062 /**
2063  * allocates tables.
2064  * needs width/height
2065  */
2066 static int alloc_tables(H264Context *h){
2067     MpegEncContext * const s = &h->s;
2068     const int big_mb_num= s->mb_stride * (s->mb_height+1);
2069     int x,y;
2070
2071     CHECKED_ALLOCZ(h->intra4x4_pred_mode, big_mb_num * 8  * sizeof(uint8_t))
2072
2073     CHECKED_ALLOCZ(h->non_zero_count    , big_mb_num * 16 * sizeof(uint8_t))
2074     CHECKED_ALLOCZ(h->slice_table_base  , (big_mb_num+s->mb_stride) * sizeof(uint8_t))
2075     CHECKED_ALLOCZ(h->cbp_table, big_mb_num * sizeof(uint16_t))
2076
2077     CHECKED_ALLOCZ(h->chroma_pred_mode_table, big_mb_num * sizeof(uint8_t))
2078     CHECKED_ALLOCZ(h->mvd_table[0], 32*big_mb_num * sizeof(uint16_t));
2079     CHECKED_ALLOCZ(h->mvd_table[1], 32*big_mb_num * sizeof(uint16_t));
2080     CHECKED_ALLOCZ(h->direct_table, 32*big_mb_num * sizeof(uint8_t));
2081
2082     memset(h->slice_table_base, -1, (big_mb_num+s->mb_stride)  * sizeof(uint8_t));
2083     h->slice_table= h->slice_table_base + s->mb_stride*2 + 1;
2084
2085     CHECKED_ALLOCZ(h->mb2b_xy  , big_mb_num * sizeof(uint32_t));
2086     CHECKED_ALLOCZ(h->mb2b8_xy , big_mb_num * sizeof(uint32_t));
2087     for(y=0; y<s->mb_height; y++){
2088         for(x=0; x<s->mb_width; x++){
2089             const int mb_xy= x + y*s->mb_stride;
2090             const int b_xy = 4*x + 4*y*h->b_stride;
2091             const int b8_xy= 2*x + 2*y*h->b8_stride;
2092
2093             h->mb2b_xy [mb_xy]= b_xy;
2094             h->mb2b8_xy[mb_xy]= b8_xy;
2095         }
2096     }
2097
2098     s->obmc_scratchpad = NULL;
2099
2100     if(!h->dequant4_coeff[0])
2101         init_dequant_tables(h);
2102
2103     return 0;
2104 fail:
2105     free_tables(h);
2106     return -1;
2107 }
2108
2109 /**
2110  * Mimic alloc_tables(), but for every context thread.
2111  */
2112 static void clone_tables(H264Context *dst, H264Context *src){
2113     dst->intra4x4_pred_mode       = src->intra4x4_pred_mode;
2114     dst->non_zero_count           = src->non_zero_count;
2115     dst->slice_table              = src->slice_table;
2116     dst->cbp_table                = src->cbp_table;
2117     dst->mb2b_xy                  = src->mb2b_xy;
2118     dst->mb2b8_xy                 = src->mb2b8_xy;
2119     dst->chroma_pred_mode_table   = src->chroma_pred_mode_table;
2120     dst->mvd_table[0]             = src->mvd_table[0];
2121     dst->mvd_table[1]             = src->mvd_table[1];
2122     dst->direct_table             = src->direct_table;
2123
2124     dst->s.obmc_scratchpad = NULL;
2125     ff_h264_pred_init(&dst->hpc, src->s.codec_id);
2126 }
2127
2128 /**
2129  * Init context
2130  * Allocate buffers which are not shared amongst multiple threads.
2131  */
2132 static int context_init(H264Context *h){
2133     CHECKED_ALLOCZ(h->top_borders[0], h->s.mb_width * (16+8+8) * sizeof(uint8_t))
2134     CHECKED_ALLOCZ(h->top_borders[1], h->s.mb_width * (16+8+8) * sizeof(uint8_t))
2135
2136     return 0;
2137 fail:
2138     return -1; // free_tables will clean up for us
2139 }
2140
2141 static av_cold void common_init(H264Context *h){
2142     MpegEncContext * const s = &h->s;
2143
2144     s->width = s->avctx->width;
2145     s->height = s->avctx->height;
2146     s->codec_id= s->avctx->codec->id;
2147
2148     ff_h264_pred_init(&h->hpc, s->codec_id);
2149
2150     h->dequant_coeff_pps= -1;
2151     s->unrestricted_mv=1;
2152     s->decode=1; //FIXME
2153
2154     memset(h->pps.scaling_matrix4, 16, 6*16*sizeof(uint8_t));
2155     memset(h->pps.scaling_matrix8, 16, 2*64*sizeof(uint8_t));
2156 }
2157
2158 static av_cold int decode_init(AVCodecContext *avctx){
2159     H264Context *h= avctx->priv_data;
2160     MpegEncContext * const s = &h->s;
2161
2162     MPV_decode_defaults(s);
2163
2164     s->avctx = avctx;
2165     common_init(h);
2166
2167     s->out_format = FMT_H264;
2168     s->workaround_bugs= avctx->workaround_bugs;
2169
2170     // set defaults
2171 //    s->decode_mb= ff_h263_decode_mb;
2172     s->quarter_sample = 1;
2173     s->low_delay= 1;
2174
2175     if(avctx->codec_id == CODEC_ID_SVQ3)
2176         avctx->pix_fmt= PIX_FMT_YUVJ420P;
2177     else
2178         avctx->pix_fmt= PIX_FMT_YUV420P;
2179
2180     decode_init_vlc();
2181
2182     if(avctx->extradata_size > 0 && avctx->extradata &&
2183        *(char *)avctx->extradata == 1){
2184         h->is_avc = 1;
2185         h->got_avcC = 0;
2186     } else {
2187         h->is_avc = 0;
2188     }
2189
2190     h->thread_context[0] = h;
2191     h->outputed_poc = INT_MIN;
2192     return 0;
2193 }
2194
2195 static int frame_start(H264Context *h){
2196     MpegEncContext * const s = &h->s;
2197     int i;
2198
2199     if(MPV_frame_start(s, s->avctx) < 0)
2200         return -1;
2201     ff_er_frame_start(s);
2202     /*
2203      * MPV_frame_start uses pict_type to derive key_frame.
2204      * This is incorrect for H.264; IDR markings must be used.
2205      * Zero here; IDR markings per slice in frame or fields are ORed in later.
2206      * See decode_nal_units().
2207      */
2208     s->current_picture_ptr->key_frame= 0;
2209
2210     assert(s->linesize && s->uvlinesize);
2211
2212     for(i=0; i<16; i++){
2213         h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3);
2214         h->block_offset[24+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->linesize*((scan8[i] - scan8[0])>>3);
2215     }
2216     for(i=0; i<4; i++){
2217         h->block_offset[16+i]=
2218         h->block_offset[20+i]= 4*((scan8[i] - scan8[0])&7) + 4*s->uvlinesize*((scan8[i] - scan8[0])>>3);
2219         h->block_offset[24+16+i]=
2220         h->block_offset[24+20+i]= 4*((scan8[i] - scan8[0])&7) + 8*s->uvlinesize*((scan8[i] - scan8[0])>>3);
2221     }
2222
2223     /* can't be in alloc_tables because linesize isn't known there.
2224      * FIXME: redo bipred weight to not require extra buffer? */
2225     for(i = 0; i < s->avctx->thread_count; i++)
2226         if(!h->thread_context[i]->s.obmc_scratchpad)
2227             h->thread_context[i]->s.obmc_scratchpad = av_malloc(16*2*s->linesize + 8*2*s->uvlinesize);
2228
2229     /* some macroblocks will be accessed before they're available */
2230     if(FRAME_MBAFF || s->avctx->thread_count > 1)
2231         memset(h->slice_table, -1, (s->mb_height*s->mb_stride-1) * sizeof(uint8_t));
2232
2233 //    s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1;
2234
2235     // We mark the current picture as non-reference after allocating it, so
2236     // that if we break out due to an error it can be released automatically
2237     // in the next MPV_frame_start().
2238     // SVQ3 as well as most other codecs have only last/next/current and thus
2239     // get released even with set reference, besides SVQ3 and others do not
2240     // mark frames as reference later "naturally".
2241     if(s->codec_id != CODEC_ID_SVQ3)
2242         s->current_picture_ptr->reference= 0;
2243
2244     s->current_picture_ptr->field_poc[0]=
2245     s->current_picture_ptr->field_poc[1]= INT_MAX;
2246     assert(s->current_picture_ptr->long_ref==0);
2247
2248     return 0;
2249 }
2250
2251 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){
2252     MpegEncContext * const s = &h->s;
2253     int i;
2254     int step    = 1;
2255     int offset  = 1;
2256     int uvoffset= 1;
2257     int top_idx = 1;
2258     int skiplast= 0;
2259
2260     src_y  -=   linesize;
2261     src_cb -= uvlinesize;
2262     src_cr -= uvlinesize;
2263
2264     if(!simple && FRAME_MBAFF){
2265         if(s->mb_y&1){
2266             offset  = MB_MBAFF ? 1 : 17;
2267             uvoffset= MB_MBAFF ? 1 : 9;
2268             if(!MB_MBAFF){
2269                 *(uint64_t*)(h->top_borders[0][s->mb_x]+ 0)= *(uint64_t*)(src_y +  15*linesize);
2270                 *(uint64_t*)(h->top_borders[0][s->mb_x]+ 8)= *(uint64_t*)(src_y +8+15*linesize);
2271                 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2272                     *(uint64_t*)(h->top_borders[0][s->mb_x]+16)= *(uint64_t*)(src_cb+7*uvlinesize);
2273                     *(uint64_t*)(h->top_borders[0][s->mb_x]+24)= *(uint64_t*)(src_cr+7*uvlinesize);
2274                 }
2275             }
2276         }else{
2277             if(!MB_MBAFF){
2278                 h->left_border[0]= h->top_borders[0][s->mb_x][15];
2279                 if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2280                     h->left_border[34   ]= h->top_borders[0][s->mb_x][16+7  ];
2281                     h->left_border[34+18]= h->top_borders[0][s->mb_x][16+8+7];
2282                 }
2283                 skiplast= 1;
2284             }
2285             offset  =
2286             uvoffset=
2287             top_idx = MB_MBAFF ? 0 : 1;
2288         }
2289         step= MB_MBAFF ? 2 : 1;
2290     }
2291
2292     // There are two lines saved, the line above the the top macroblock of a pair,
2293     // and the line above the bottom macroblock
2294     h->left_border[offset]= h->top_borders[top_idx][s->mb_x][15];
2295     for(i=1; i<17 - skiplast; i++){
2296         h->left_border[offset+i*step]= src_y[15+i*  linesize];
2297     }
2298
2299     *(uint64_t*)(h->top_borders[top_idx][s->mb_x]+0)= *(uint64_t*)(src_y +  16*linesize);
2300     *(uint64_t*)(h->top_borders[top_idx][s->mb_x]+8)= *(uint64_t*)(src_y +8+16*linesize);
2301
2302     if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2303         h->left_border[uvoffset+34   ]= h->top_borders[top_idx][s->mb_x][16+7];
2304         h->left_border[uvoffset+34+18]= h->top_borders[top_idx][s->mb_x][24+7];
2305         for(i=1; i<9 - skiplast; i++){
2306             h->left_border[uvoffset+34   +i*step]= src_cb[7+i*uvlinesize];
2307             h->left_border[uvoffset+34+18+i*step]= src_cr[7+i*uvlinesize];
2308         }
2309         *(uint64_t*)(h->top_borders[top_idx][s->mb_x]+16)= *(uint64_t*)(src_cb+8*uvlinesize);
2310         *(uint64_t*)(h->top_borders[top_idx][s->mb_x]+24)= *(uint64_t*)(src_cr+8*uvlinesize);
2311     }
2312 }
2313
2314 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){
2315     MpegEncContext * const s = &h->s;
2316     int temp8, i;
2317     uint64_t temp64;
2318     int deblock_left;
2319     int deblock_top;
2320     int mb_xy;
2321     int step    = 1;
2322     int offset  = 1;
2323     int uvoffset= 1;
2324     int top_idx = 1;
2325
2326     if(!simple && FRAME_MBAFF){
2327         if(s->mb_y&1){
2328             offset  = MB_MBAFF ? 1 : 17;
2329             uvoffset= MB_MBAFF ? 1 : 9;
2330         }else{
2331             offset  =
2332             uvoffset=
2333             top_idx = MB_MBAFF ? 0 : 1;
2334         }
2335         step= MB_MBAFF ? 2 : 1;
2336     }
2337
2338     if(h->deblocking_filter == 2) {
2339         mb_xy = h->mb_xy;
2340         deblock_left = h->slice_table[mb_xy] == h->slice_table[mb_xy - 1];
2341         deblock_top  = h->slice_table[mb_xy] == h->slice_table[h->top_mb_xy];
2342     } else {
2343         deblock_left = (s->mb_x > 0);
2344         deblock_top =  (s->mb_y > 0);
2345     }
2346
2347     src_y  -=   linesize + 1;
2348     src_cb -= uvlinesize + 1;
2349     src_cr -= uvlinesize + 1;
2350
2351 #define XCHG(a,b,t,xchg)\
2352 t= a;\
2353 if(xchg)\
2354     a= b;\
2355 b= t;
2356
2357     if(deblock_left){
2358         for(i = !deblock_top; i<16; i++){
2359             XCHG(h->left_border[offset+i*step], src_y [i*  linesize], temp8, xchg);
2360         }
2361         XCHG(h->left_border[offset+i*step], src_y [i*  linesize], temp8, 1);
2362     }
2363
2364     if(deblock_top){
2365         XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+0), *(uint64_t*)(src_y +1), temp64, xchg);
2366         XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+8), *(uint64_t*)(src_y +9), temp64, 1);
2367         if(s->mb_x+1 < s->mb_width){
2368             XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x+1]), *(uint64_t*)(src_y +17), temp64, 1);
2369         }
2370     }
2371
2372     if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2373         if(deblock_left){
2374             for(i = !deblock_top; i<8; i++){
2375                 XCHG(h->left_border[uvoffset+34   +i*step], src_cb[i*uvlinesize], temp8, xchg);
2376                 XCHG(h->left_border[uvoffset+34+18+i*step], src_cr[i*uvlinesize], temp8, xchg);
2377             }
2378             XCHG(h->left_border[uvoffset+34   +i*step], src_cb[i*uvlinesize], temp8, 1);
2379             XCHG(h->left_border[uvoffset+34+18+i*step], src_cr[i*uvlinesize], temp8, 1);
2380         }
2381         if(deblock_top){
2382             XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+16), *(uint64_t*)(src_cb+1), temp64, 1);
2383             XCHG(*(uint64_t*)(h->top_borders[top_idx][s->mb_x]+24), *(uint64_t*)(src_cr+1), temp64, 1);
2384         }
2385     }
2386 }
2387
2388 static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple){
2389     MpegEncContext * const s = &h->s;
2390     const int mb_x= s->mb_x;
2391     const int mb_y= s->mb_y;
2392     const int mb_xy= h->mb_xy;
2393     const int mb_type= s->current_picture.mb_type[mb_xy];
2394     uint8_t  *dest_y, *dest_cb, *dest_cr;
2395     int linesize, uvlinesize /*dct_offset*/;
2396     int i;
2397     int *block_offset = &h->block_offset[0];
2398     const unsigned int bottom = mb_y & 1;
2399     const int transform_bypass = (s->qscale == 0 && h->sps.transform_bypass), is_h264 = (simple || s->codec_id == CODEC_ID_H264);
2400     void (*idct_add)(uint8_t *dst, DCTELEM *block, int stride);
2401     void (*idct_dc_add)(uint8_t *dst, DCTELEM *block, int stride);
2402
2403     dest_y  = s->current_picture.data[0] + (mb_y * 16* s->linesize  ) + mb_x * 16;
2404     dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
2405     dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
2406
2407     s->dsp.prefetch(dest_y + (s->mb_x&3)*4*s->linesize + 64, s->linesize, 4);
2408     s->dsp.prefetch(dest_cb + (s->mb_x&7)*s->uvlinesize + 64, dest_cr - dest_cb, 2);
2409
2410     if (!simple && MB_FIELD) {
2411         linesize   = h->mb_linesize   = s->linesize * 2;
2412         uvlinesize = h->mb_uvlinesize = s->uvlinesize * 2;
2413         block_offset = &h->block_offset[24];
2414         if(mb_y&1){ //FIXME move out of this function?
2415             dest_y -= s->linesize*15;
2416             dest_cb-= s->uvlinesize*7;
2417             dest_cr-= s->uvlinesize*7;
2418         }
2419         if(FRAME_MBAFF) {
2420             int list;
2421             for(list=0; list<h->list_count; list++){
2422                 if(!USES_LIST(mb_type, list))
2423                     continue;
2424                 if(IS_16X16(mb_type)){
2425                     int8_t *ref = &h->ref_cache[list][scan8[0]];
2426                     fill_rectangle(ref, 4, 4, 8, (16+*ref)^(s->mb_y&1), 1);
2427                 }else{
2428                     for(i=0; i<16; i+=4){
2429                         //FIXME can refs be smaller than 8x8 when !direct_8x8_inference ?
2430                         int ref = h->ref_cache[list][scan8[i]];
2431                         if(ref >= 0)
2432                             fill_rectangle(&h->ref_cache[list][scan8[i]], 2, 2, 8, (16+ref)^(s->mb_y&1), 1);
2433                     }
2434                 }
2435             }
2436         }
2437     } else {
2438         linesize   = h->mb_linesize   = s->linesize;
2439         uvlinesize = h->mb_uvlinesize = s->uvlinesize;
2440 //        dct_offset = s->linesize * 16;
2441     }
2442
2443     if(transform_bypass){
2444         idct_dc_add =
2445         idct_add = IS_8x8DCT(mb_type) ? s->dsp.add_pixels8 : s->dsp.add_pixels4;
2446     }else if(IS_8x8DCT(mb_type)){
2447         idct_dc_add = s->dsp.h264_idct8_dc_add;
2448         idct_add = s->dsp.h264_idct8_add;
2449     }else{
2450         idct_dc_add = s->dsp.h264_idct_dc_add;
2451         idct_add = s->dsp.h264_idct_add;
2452     }
2453
2454     if (!simple && IS_INTRA_PCM(mb_type)) {
2455         for (i=0; i<16; i++) {
2456             memcpy(dest_y + i*  linesize, h->mb       + i*8, 16);
2457         }
2458         for (i=0; i<8; i++) {
2459             memcpy(dest_cb+ i*uvlinesize, h->mb + 128 + i*4,  8);
2460             memcpy(dest_cr+ i*uvlinesize, h->mb + 160 + i*4,  8);
2461         }
2462     } else {
2463         if(IS_INTRA(mb_type)){
2464             if(h->deblocking_filter)
2465                 xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 1, simple);
2466
2467             if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2468                 h->hpc.pred8x8[ h->chroma_pred_mode ](dest_cb, uvlinesize);
2469                 h->hpc.pred8x8[ h->chroma_pred_mode ](dest_cr, uvlinesize);
2470             }
2471
2472             if(IS_INTRA4x4(mb_type)){
2473                 if(simple || !s->encoding){
2474                     if(IS_8x8DCT(mb_type)){
2475                         for(i=0; i<16; i+=4){
2476                             uint8_t * const ptr= dest_y + block_offset[i];
2477                             const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
2478                             const int nnz = h->non_zero_count_cache[ scan8[i] ];
2479                             h->hpc.pred8x8l[ dir ](ptr, (h->topleft_samples_available<<i)&0x8000,
2480                                                    (h->topright_samples_available<<i)&0x4000, linesize);
2481                             if(nnz){
2482                                 if(nnz == 1 && h->mb[i*16])
2483                                     idct_dc_add(ptr, h->mb + i*16, linesize);
2484                                 else
2485                                     idct_add(ptr, h->mb + i*16, linesize);
2486                             }
2487                         }
2488                     }else
2489                     for(i=0; i<16; i++){
2490                         uint8_t * const ptr= dest_y + block_offset[i];
2491                         uint8_t *topright;
2492                         const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
2493                         int nnz, tr;
2494
2495                         if(dir == DIAG_DOWN_LEFT_PRED || dir == VERT_LEFT_PRED){
2496                             const int topright_avail= (h->topright_samples_available<<i)&0x8000;
2497                             assert(mb_y || linesize <= block_offset[i]);
2498                             if(!topright_avail){
2499                                 tr= ptr[3 - linesize]*0x01010101;
2500                                 topright= (uint8_t*) &tr;
2501                             }else
2502                                 topright= ptr + 4 - linesize;
2503                         }else
2504                             topright= NULL;
2505
2506                         h->hpc.pred4x4[ dir ](ptr, topright, linesize);
2507                         nnz = h->non_zero_count_cache[ scan8[i] ];
2508                         if(nnz){
2509                             if(is_h264){
2510                                 if(nnz == 1 && h->mb[i*16])
2511                                     idct_dc_add(ptr, h->mb + i*16, linesize);
2512                                 else
2513                                     idct_add(ptr, h->mb + i*16, linesize);
2514                             }else
2515                                 svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0);
2516                         }
2517                     }
2518                 }
2519             }else{
2520                 h->hpc.pred16x16[ h->intra16x16_pred_mode ](dest_y , linesize);
2521                 if(is_h264){
2522                     if(!transform_bypass)
2523                         h264_luma_dc_dequant_idct_c(h->mb, s->qscale, h->dequant4_coeff[0][s->qscale][0]);
2524                 }else
2525                     svq3_luma_dc_dequant_idct_c(h->mb, s->qscale);
2526             }
2527             if(h->deblocking_filter)
2528                 xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 0, simple);
2529         }else if(is_h264){
2530             hl_motion(h, dest_y, dest_cb, dest_cr,
2531                       s->me.qpel_put, s->dsp.put_h264_chroma_pixels_tab,
2532                       s->me.qpel_avg, s->dsp.avg_h264_chroma_pixels_tab,
2533                       s->dsp.weight_h264_pixels_tab, s->dsp.biweight_h264_pixels_tab);
2534         }
2535
2536
2537         if(!IS_INTRA4x4(mb_type)){
2538             if(is_h264){
2539                 if(IS_INTRA16x16(mb_type)){
2540                     for(i=0; i<16; i++){
2541                         if(h->non_zero_count_cache[ scan8[i] ])
2542                             idct_add(dest_y + block_offset[i], h->mb + i*16, linesize);
2543                         else if(h->mb[i*16])
2544                             idct_dc_add(dest_y + block_offset[i], h->mb + i*16, linesize);
2545                     }
2546                 }else{
2547                     const int di = IS_8x8DCT(mb_type) ? 4 : 1;
2548                     for(i=0; i<16; i+=di){
2549                         int nnz = h->non_zero_count_cache[ scan8[i] ];
2550                         if(nnz){
2551                             if(nnz==1 && h->mb[i*16])
2552                                 idct_dc_add(dest_y + block_offset[i], h->mb + i*16, linesize);
2553                             else
2554                                 idct_add(dest_y + block_offset[i], h->mb + i*16, linesize);
2555                         }
2556                     }
2557                 }
2558             }else{
2559                 for(i=0; i<16; i++){
2560                     if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ //FIXME benchmark weird rule, & below
2561                         uint8_t * const ptr= dest_y + block_offset[i];
2562                         svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, IS_INTRA(mb_type) ? 1 : 0);
2563                     }
2564                 }
2565             }
2566         }
2567
2568         if(simple || !ENABLE_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
2569             uint8_t *dest[2] = {dest_cb, dest_cr};
2570             if(transform_bypass){
2571                 idct_add = idct_dc_add = s->dsp.add_pixels4;
2572             }else{
2573                 idct_add = s->dsp.h264_idct_add;
2574                 idct_dc_add = s->dsp.h264_idct_dc_add;
2575                 chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp[0], h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]);
2576                 chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp[1], h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]);
2577             }
2578             if(is_h264){
2579                 for(i=16; i<16+8; i++){
2580                     if(h->non_zero_count_cache[ scan8[i] ])
2581                         idct_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
2582                     else if(h->mb[i*16])
2583                         idct_dc_add(dest[(i&4)>>2] + block_offset[i], h->mb + i*16, uvlinesize);
2584                 }
2585             }else{
2586                 for(i=16; i<16+8; i++){
2587                     if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2588                         uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i];
2589                         svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2);
2590                     }
2591                 }
2592             }
2593         }
2594     }
2595     if(h->deblocking_filter) {
2596         backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, simple);
2597         fill_caches(h, mb_type, 1); //FIXME don't fill stuff which isn't used by filter_mb
2598         h->chroma_qp[0] = get_chroma_qp(h, 0, s->current_picture.qscale_table[mb_xy]);
2599         h->chroma_qp[1] = get_chroma_qp(h, 1, s->current_picture.qscale_table[mb_xy]);
2600         if (!simple && FRAME_MBAFF) {
2601             filter_mb     (h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize);
2602         } else {
2603             filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize);
2604         }
2605     }
2606 }
2607
2608 /**
2609  * Process a macroblock; this case avoids checks for expensive uncommon cases.
2610  */
2611 static void hl_decode_mb_simple(H264Context *h){
2612     hl_decode_mb_internal(h, 1);
2613 }
2614
2615 /**
2616  * Process a macroblock; this handles edge cases, such as interlacing.
2617  */
2618 static void av_noinline hl_decode_mb_complex(H264Context *h){
2619     hl_decode_mb_internal(h, 0);
2620 }
2621
2622 static void hl_decode_mb(H264Context *h){
2623     MpegEncContext * const s = &h->s;
2624     const int mb_xy= h->mb_xy;
2625     const int mb_type= s->current_picture.mb_type[mb_xy];
2626     int is_complex = FRAME_MBAFF || MB_FIELD || IS_INTRA_PCM(mb_type) || s->codec_id != CODEC_ID_H264 ||
2627                     (ENABLE_GRAY && (s->flags&CODEC_FLAG_GRAY)) || (ENABLE_H264_ENCODER && s->encoding) || ENABLE_SMALL;
2628
2629     if(ENABLE_H264_ENCODER && !s->decode)
2630         return;
2631
2632     if (is_complex)
2633         hl_decode_mb_complex(h);
2634     else hl_decode_mb_simple(h);
2635 }
2636
2637 static void pic_as_field(Picture *pic, const int parity){
2638     int i;
2639     for (i = 0; i < 4; ++i) {
2640         if (parity == PICT_BOTTOM_FIELD)
2641             pic->data[i] += pic->linesize[i];
2642         pic->reference = parity;
2643         pic->linesize[i] *= 2;
2644     }
2645     pic->poc= pic->field_poc[parity == PICT_BOTTOM_FIELD];
2646 }
2647
2648 static int split_field_copy(Picture *dest, Picture *src,
2649                             int parity, int id_add){
2650     int match = !!(src->reference & parity);
2651
2652     if (match) {
2653         *dest = *src;
2654         if(parity != PICT_FRAME){
2655             pic_as_field(dest, parity);
2656             dest->pic_id *= 2;
2657             dest->pic_id += id_add;
2658         }
2659     }
2660
2661     return match;
2662 }
2663
2664 static int build_def_list(Picture *def, Picture **in, int len, int is_long, int sel){
2665     int i[2]={0};
2666     int index=0;
2667
2668     while(i[0]<len || i[1]<len){
2669         while(i[0]<len && !(in[ i[0] ] && (in[ i[0] ]->reference & sel)))
2670             i[0]++;
2671         while(i[1]<len && !(in[ i[1] ] && (in[ i[1] ]->reference & (sel^3))))
2672             i[1]++;
2673         if(i[0] < len){
2674             in[ i[0] ]->pic_id= is_long ? i[0] : in[ i[0] ]->frame_num;
2675             split_field_copy(&def[index++], in[ i[0]++ ], sel  , 1);
2676         }
2677         if(i[1] < len){
2678             in[ i[1] ]->pic_id= is_long ? i[1] : in[ i[1] ]->frame_num;
2679             split_field_copy(&def[index++], in[ i[1]++ ], sel^3, 0);
2680         }
2681     }
2682
2683     return index;
2684 }
2685
2686 static int add_sorted(Picture **sorted, Picture **src, int len, int limit, int dir){
2687     int i, best_poc;
2688     int out_i= 0;
2689
2690     for(;;){
2691         best_poc= dir ? INT_MIN : INT_MAX;
2692
2693         for(i=0; i<len; i++){
2694             const int poc= src[i]->poc;
2695             if(((poc > limit) ^ dir) && ((poc < best_poc) ^ dir)){
2696                 best_poc= poc;
2697                 sorted[out_i]= src[i];
2698             }
2699         }
2700         if(best_poc == (dir ? INT_MIN : INT_MAX))
2701             break;
2702         limit= sorted[out_i++]->poc - dir;
2703     }
2704     return out_i;
2705 }
2706
2707 /**
2708  * fills the default_ref_list.
2709  */
2710 static int fill_default_ref_list(H264Context *h){
2711     MpegEncContext * const s = &h->s;
2712     int i, len;
2713
2714     if(h->slice_type_nos==FF_B_TYPE){
2715         Picture *sorted[32];
2716         int cur_poc, list;
2717         int lens[2];
2718
2719         if(FIELD_PICTURE)
2720             cur_poc= s->current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ];
2721         else
2722             cur_poc= s->current_picture_ptr->poc;
2723
2724         for(list= 0; list<2; list++){
2725             len= add_sorted(sorted    , h->short_ref, h->short_ref_count, cur_poc, 1^list);
2726             len+=add_sorted(sorted+len, h->short_ref, h->short_ref_count, cur_poc, 0^list);
2727             assert(len<=32);
2728             len= build_def_list(h->default_ref_list[list]    , sorted     , len, 0, s->picture_structure);
2729             len+=build_def_list(h->default_ref_list[list]+len, h->long_ref, 16 , 1, s->picture_structure);
2730             assert(len<=32);
2731
2732             if(len < h->ref_count[list])
2733                 memset(&h->default_ref_list[list][len], 0, sizeof(Picture)*(h->ref_count[list] - len));
2734             lens[list]= len;
2735         }
2736
2737         if(lens[0] == lens[1] && lens[1] > 1){
2738             for(i=0; h->default_ref_list[0][i].data[0] == h->default_ref_list[1][i].data[0] && i<lens[0]; i++);
2739             if(i == lens[0])
2740                 FFSWAP(Picture, h->default_ref_list[1][0], h->default_ref_list[1][1]);
2741         }
2742     }else{
2743         len = build_def_list(h->default_ref_list[0]    , h->short_ref, h->short_ref_count, 0, s->picture_structure);
2744         len+= build_def_list(h->default_ref_list[0]+len, h-> long_ref, 16                , 1, s->picture_structure);
2745         assert(len <= 32);
2746         if(len < h->ref_count[0])
2747             memset(&h->default_ref_list[0][len], 0, sizeof(Picture)*(h->ref_count[0] - len));
2748     }
2749 #ifdef TRACE
2750     for (i=0; i<h->ref_count[0]; i++) {
2751         tprintf(h->s.avctx, "List0: %s fn:%d 0x%p\n", (h->default_ref_list[0][i].long_ref ? "LT" : "ST"), h->default_ref_list[0][i].pic_id, h->default_ref_list[0][i].data[0]);
2752     }
2753     if(h->slice_type_nos==FF_B_TYPE){
2754         for (i=0; i<h->ref_count[1]; i++) {
2755             tprintf(h->s.avctx, "List1: %s fn:%d 0x%p\n", (h->default_ref_list[1][i].long_ref ? "LT" : "ST"), h->default_ref_list[1][i].pic_id, h->default_ref_list[1][i].data[0]);
2756         }
2757     }
2758 #endif
2759     return 0;
2760 }
2761
2762 static void print_short_term(H264Context *h);
2763 static void print_long_term(H264Context *h);
2764
2765 /**
2766  * Extract structure information about the picture described by pic_num in
2767  * the current decoding context (frame or field). Note that pic_num is
2768  * picture number without wrapping (so, 0<=pic_num<max_pic_num).
2769  * @param pic_num picture number for which to extract structure information
2770  * @param structure one of PICT_XXX describing structure of picture
2771  *                      with pic_num
2772  * @return frame number (short term) or long term index of picture
2773  *         described by pic_num
2774  */
2775 static int pic_num_extract(H264Context *h, int pic_num, int *structure){
2776     MpegEncContext * const s = &h->s;
2777
2778     *structure = s->picture_structure;
2779     if(FIELD_PICTURE){
2780         if (!(pic_num & 1))
2781             /* opposite field */
2782             *structure ^= PICT_FRAME;
2783         pic_num >>= 1;
2784     }
2785
2786     return pic_num;
2787 }
2788
2789 static int decode_ref_pic_list_reordering(H264Context *h){
2790     MpegEncContext * const s = &h->s;
2791     int list, index, pic_structure;
2792
2793     print_short_term(h);
2794     print_long_term(h);
2795
2796     for(list=0; list<h->list_count; list++){
2797         memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]);
2798
2799         if(get_bits1(&s->gb)){
2800             int pred= h->curr_pic_num;
2801
2802             for(index=0; ; index++){
2803                 unsigned int reordering_of_pic_nums_idc= get_ue_golomb(&s->gb);
2804                 unsigned int pic_id;
2805                 int i;
2806                 Picture *ref = NULL;
2807
2808                 if(reordering_of_pic_nums_idc==3)
2809                     break;
2810
2811                 if(index >= h->ref_count[list]){
2812                     av_log(h->s.avctx, AV_LOG_ERROR, "reference count overflow\n");
2813                     return -1;
2814                 }
2815
2816                 if(reordering_of_pic_nums_idc<3){
2817                     if(reordering_of_pic_nums_idc<2){
2818                         const unsigned int abs_diff_pic_num= get_ue_golomb(&s->gb) + 1;
2819                         int frame_num;
2820
2821                         if(abs_diff_pic_num > h->max_pic_num){
2822                             av_log(h->s.avctx, AV_LOG_ERROR, "abs_diff_pic_num overflow\n");
2823                             return -1;
2824                         }
2825
2826                         if(reordering_of_pic_nums_idc == 0) pred-= abs_diff_pic_num;
2827                         else                                pred+= abs_diff_pic_num;
2828                         pred &= h->max_pic_num - 1;
2829
2830                         frame_num = pic_num_extract(h, pred, &pic_structure);
2831
2832                         for(i= h->short_ref_count-1; i>=0; i--){
2833                             ref = h->short_ref[i];
2834                             assert(ref->reference);
2835                             assert(!ref->long_ref);
2836                             if(
2837                                    ref->frame_num == frame_num &&
2838                                    (ref->reference & pic_structure)
2839                               )
2840                                 break;
2841                         }
2842                         if(i>=0)
2843                             ref->pic_id= pred;
2844                     }else{
2845                         int long_idx;
2846                         pic_id= get_ue_golomb(&s->gb); //long_term_pic_idx
2847
2848                         long_idx= pic_num_extract(h, pic_id, &pic_structure);
2849
2850                         if(long_idx>31){
2851                             av_log(h->s.avctx, AV_LOG_ERROR, "long_term_pic_idx overflow\n");
2852                             return -1;
2853                         }
2854                         ref = h->long_ref[long_idx];
2855                         assert(!(ref && !ref->reference));
2856                         if(ref && (ref->reference & pic_structure)){
2857                             ref->pic_id= pic_id;
2858                             assert(ref->long_ref);
2859                             i=0;
2860                         }else{
2861                             i=-1;
2862                         }
2863                     }
2864
2865                     if (i < 0) {
2866                         av_log(h->s.avctx, AV_LOG_ERROR, "reference picture missing during reorder\n");
2867                         memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME
2868                     } else {
2869                         for(i=index; i+1<h->ref_count[list]; i++){
2870                             if(ref->long_ref == h->ref_list[list][i].long_ref && ref->pic_id == h->ref_list[list][i].pic_id)
2871                                 break;
2872                         }
2873                         for(; i > index; i--){
2874                             h->ref_list[list][i]= h->ref_list[list][i-1];
2875                         }
2876                         h->ref_list[list][index]= *ref;
2877                         if (FIELD_PICTURE){
2878                             pic_as_field(&h->ref_list[list][index], pic_structure);
2879                         }
2880                     }
2881                 }else{
2882                     av_log(h->s.avctx, AV_LOG_ERROR, "illegal reordering_of_pic_nums_idc\n");
2883                     return -1;
2884                 }
2885             }
2886         }
2887     }
2888     for(list=0; list<h->list_count; list++){
2889         for(index= 0; index < h->ref_count[list]; index++){
2890             if(!h->ref_list[list][index].data[0]){
2891                 av_log(h->s.avctx, AV_LOG_ERROR, "Missing reference picture\n");
2892                 h->ref_list[list][index]= s->current_picture; //FIXME this is not a sensible solution
2893             }
2894         }
2895     }
2896
2897     if(h->slice_type_nos==FF_B_TYPE && !h->direct_spatial_mv_pred)
2898         direct_dist_scale_factor(h);
2899     direct_ref_list_init(h);
2900     return 0;
2901 }
2902
2903 static void fill_mbaff_ref_list(H264Context *h){
2904     int list, i, j;
2905     for(list=0; list<2; list++){ //FIXME try list_count
2906         for(i=0; i<h->ref_count[list]; i++){
2907             Picture *frame = &h->ref_list[list][i];
2908             Picture *field = &h->ref_list[list][16+2*i];
2909             field[0] = *frame;
2910             for(j=0; j<3; j++)
2911                 field[0].linesize[j] <<= 1;
2912             field[0].reference = PICT_TOP_FIELD;
2913             field[1] = field[0];
2914             for(j=0; j<3; j++)
2915                 field[1].data[j] += frame->linesize[j];
2916             field[1].reference = PICT_BOTTOM_FIELD;
2917
2918             h->luma_weight[list][16+2*i] = h->luma_weight[list][16+2*i+1] = h->luma_weight[list][i];
2919             h->luma_offset[list][16+2*i] = h->luma_offset[list][16+2*i+1] = h->luma_offset[list][i];
2920             for(j=0; j<2; j++){
2921                 h->chroma_weight[list][16+2*i][j] = h->chroma_weight[list][16+2*i+1][j] = h->chroma_weight[list][i][j];
2922                 h->chroma_offset[list][16+2*i][j] = h->chroma_offset[list][16+2*i+1][j] = h->chroma_offset[list][i][j];
2923             }
2924         }
2925     }
2926     for(j=0; j<h->ref_count[1]; j++){
2927         for(i=0; i<h->ref_count[0]; i++)
2928             h->implicit_weight[j][16+2*i] = h->implicit_weight[j][16+2*i+1] = h->implicit_weight[j][i];
2929         memcpy(h->implicit_weight[16+2*j],   h->implicit_weight[j], sizeof(*h->implicit_weight));
2930         memcpy(h->implicit_weight[16+2*j+1], h->implicit_weight[j], sizeof(*h->implicit_weight));
2931     }
2932 }
2933
2934 static int pred_weight_table(H264Context *h){
2935     MpegEncContext * const s = &h->s;
2936     int list, i;
2937     int luma_def, chroma_def;
2938
2939     h->use_weight= 0;
2940     h->use_weight_chroma= 0;
2941     h->luma_log2_weight_denom= get_ue_golomb(&s->gb);
2942     h->chroma_log2_weight_denom= get_ue_golomb(&s->gb);
2943     luma_def = 1<<h->luma_log2_weight_denom;
2944     chroma_def = 1<<h->chroma_log2_weight_denom;
2945
2946     for(list=0; list<2; list++){
2947         for(i=0; i<h->ref_count[list]; i++){
2948             int luma_weight_flag, chroma_weight_flag;
2949
2950             luma_weight_flag= get_bits1(&s->gb);
2951             if(luma_weight_flag){
2952                 h->luma_weight[list][i]= get_se_golomb(&s->gb);
2953                 h->luma_offset[list][i]= get_se_golomb(&s->gb);
2954                 if(   h->luma_weight[list][i] != luma_def
2955                    || h->luma_offset[list][i] != 0)
2956                     h->use_weight= 1;
2957             }else{
2958                 h->luma_weight[list][i]= luma_def;
2959                 h->luma_offset[list][i]= 0;
2960             }
2961
2962             if(CHROMA){
2963                 chroma_weight_flag= get_bits1(&s->gb);
2964                 if(chroma_weight_flag){
2965                     int j;
2966                     for(j=0; j<2; j++){
2967                         h->chroma_weight[list][i][j]= get_se_golomb(&s->gb);
2968                         h->chroma_offset[list][i][j]= get_se_golomb(&s->gb);
2969                         if(   h->chroma_weight[list][i][j] != chroma_def
2970                         || h->chroma_offset[list][i][j] != 0)
2971                             h->use_weight_chroma= 1;
2972                     }
2973                 }else{
2974                     int j;
2975                     for(j=0; j<2; j++){
2976                         h->chroma_weight[list][i][j]= chroma_def;
2977                         h->chroma_offset[list][i][j]= 0;
2978                     }
2979                 }
2980             }
2981         }
2982         if(h->slice_type_nos != FF_B_TYPE) break;
2983     }
2984     h->use_weight= h->use_weight || h->use_weight_chroma;
2985     return 0;
2986 }
2987
2988 static void implicit_weight_table(H264Context *h){
2989     MpegEncContext * const s = &h->s;
2990     int ref0, ref1;
2991     int cur_poc = s->current_picture_ptr->poc;
2992
2993     if(   h->ref_count[0] == 1 && h->ref_count[1] == 1
2994        && h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2*cur_poc){
2995         h->use_weight= 0;
2996         h->use_weight_chroma= 0;
2997         return;
2998     }
2999
3000     h->use_weight= 2;
3001     h->use_weight_chroma= 2;
3002     h->luma_log2_weight_denom= 5;
3003     h->chroma_log2_weight_denom= 5;
3004
3005     for(ref0=0; ref0 < h->ref_count[0]; ref0++){
3006         int poc0 = h->ref_list[0][ref0].poc;
3007         for(ref1=0; ref1 < h->ref_count[1]; ref1++){
3008             int poc1 = h->ref_list[1][ref1].poc;
3009             int td = av_clip(poc1 - poc0, -128, 127);
3010             if(td){
3011                 int tb = av_clip(cur_poc - poc0, -128, 127);
3012                 int tx = (16384 + (FFABS(td) >> 1)) / td;
3013                 int dist_scale_factor = av_clip((tb*tx + 32) >> 6, -1024, 1023) >> 2;
3014                 if(dist_scale_factor < -64 || dist_scale_factor > 128)
3015                     h->implicit_weight[ref0][ref1] = 32;
3016                 else
3017                     h->implicit_weight[ref0][ref1] = 64 - dist_scale_factor;
3018             }else
3019                 h->implicit_weight[ref0][ref1] = 32;
3020         }
3021     }
3022 }
3023
3024 /**
3025  * Mark a picture as no longer needed for reference. The refmask
3026  * argument allows unreferencing of individual fields or the whole frame.
3027  * If the picture becomes entirely unreferenced, but is being held for
3028  * display purposes, it is marked as such.
3029  * @param refmask mask of fields to unreference; the mask is bitwise
3030  *                anded with the reference marking of pic
3031  * @return non-zero if pic becomes entirely unreferenced (except possibly
3032  *         for display purposes) zero if one of the fields remains in
3033  *         reference
3034  */
3035 static inline int unreference_pic(H264Context *h, Picture *pic, int refmask){
3036     int i;
3037     if (pic->reference &= refmask) {
3038         return 0;
3039     } else {
3040         for(i = 0; h->delayed_pic[i]; i++)
3041             if(pic == h->delayed_pic[i]){
3042                 pic->reference=DELAYED_PIC_REF;
3043                 break;
3044             }
3045         return 1;
3046     }
3047 }
3048
3049 /**
3050  * instantaneous decoder refresh.
3051  */
3052 static void idr(H264Context *h){
3053     int i;
3054
3055     for(i=0; i<16; i++){
3056         remove_long(h, i, 0);
3057     }
3058     assert(h->long_ref_count==0);
3059
3060     for(i=0; i<h->short_ref_count; i++){
3061         unreference_pic(h, h->short_ref[i], 0);
3062         h->short_ref[i]= NULL;
3063     }
3064     h->short_ref_count=0;
3065     h->prev_frame_num= 0;
3066     h->prev_frame_num_offset= 0;
3067     h->prev_poc_msb=
3068     h->prev_poc_lsb= 0;
3069 }
3070
3071 /* forget old pics after a seek */
3072 static void flush_dpb(AVCodecContext *avctx){
3073     H264Context *h= avctx->priv_data;
3074     int i;
3075     for(i=0; i<MAX_DELAYED_PIC_COUNT; i++) {
3076         if(h->delayed_pic[i])
3077             h->delayed_pic[i]->reference= 0;
3078         h->delayed_pic[i]= NULL;
3079     }
3080     h->outputed_poc= INT_MIN;
3081     idr(h);
3082     if(h->s.current_picture_ptr)
3083         h->s.current_picture_ptr->reference= 0;
3084     h->s.first_field= 0;
3085     ff_mpeg_flush(avctx);
3086 }
3087
3088 /**
3089  * Find a Picture in the short term reference list by frame number.
3090  * @param frame_num frame number to search for
3091  * @param idx the index into h->short_ref where returned picture is found
3092  *            undefined if no picture found.
3093  * @return pointer to the found picture, or NULL if no pic with the provided
3094  *                 frame number is found
3095  */
3096 static Picture * find_short(H264Context *h, int frame_num, int *idx){
3097     MpegEncContext * const s = &h->s;
3098     int i;
3099
3100     for(i=0; i<h->short_ref_count; i++){
3101         Picture *pic= h->short_ref[i];
3102         if(s->avctx->debug&FF_DEBUG_MMCO)
3103             av_log(h->s.avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic);
3104         if(pic->frame_num == frame_num) {
3105             *idx = i;
3106             return pic;
3107         }
3108     }
3109     return NULL;
3110 }
3111
3112 /**
3113  * Remove a picture from the short term reference list by its index in
3114  * that list.  This does no checking on the provided index; it is assumed
3115  * to be valid. Other list entries are shifted down.
3116  * @param i index into h->short_ref of picture to remove.
3117  */
3118 static void remove_short_at_index(H264Context *h, int i){
3119     assert(i >= 0 && i < h->short_ref_count);
3120     h->short_ref[i]= NULL;
3121     if (--h->short_ref_count)
3122         memmove(&h->short_ref[i], &h->short_ref[i+1], (h->short_ref_count - i)*sizeof(Picture*));
3123 }
3124
3125 /**
3126  *
3127  * @return the removed picture or NULL if an error occurs
3128  */
3129 static Picture * remove_short(H264Context *h, int frame_num, int ref_mask){
3130     MpegEncContext * const s = &h->s;
3131     Picture *pic;
3132     int i;
3133
3134     if(s->avctx->debug&FF_DEBUG_MMCO)
3135         av_log(h->s.avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count);
3136
3137     pic = find_short(h, frame_num, &i);
3138     if (pic){
3139         if(unreference_pic(h, pic, ref_mask))
3140         remove_short_at_index(h, i);
3141     }
3142
3143     return pic;
3144 }
3145
3146 /**
3147  * Remove a picture from the long term reference list by its index in
3148  * that list.
3149  * @return the removed picture or NULL if an error occurs
3150  */
3151 static Picture * remove_long(H264Context *h, int i, int ref_mask){
3152     Picture *pic;
3153
3154     pic= h->long_ref[i];
3155     if (pic){
3156         if(unreference_pic(h, pic, ref_mask)){
3157             assert(h->long_ref[i]->long_ref == 1);
3158             h->long_ref[i]->long_ref= 0;
3159             h->long_ref[i]= NULL;
3160             h->long_ref_count--;
3161         }
3162     }
3163
3164     return pic;
3165 }
3166
3167 /**
3168  * print short term list
3169  */
3170 static void print_short_term(H264Context *h) {
3171     uint32_t i;
3172     if(h->s.avctx->debug&FF_DEBUG_MMCO) {
3173         av_log(h->s.avctx, AV_LOG_DEBUG, "short term list:\n");
3174         for(i=0; i<h->short_ref_count; i++){
3175             Picture *pic= h->short_ref[i];
3176             av_log(h->s.avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n", i, pic->frame_num, pic->poc, pic->data[0]);
3177         }
3178     }
3179 }
3180
3181 /**
3182  * print long term list
3183  */
3184 static void print_long_term(H264Context *h) {
3185     uint32_t i;
3186     if(h->s.avctx->debug&FF_DEBUG_MMCO) {
3187         av_log(h->s.avctx, AV_LOG_DEBUG, "long term list:\n");
3188         for(i = 0; i < 16; i++){
3189             Picture *pic= h->long_ref[i];
3190             if (pic) {
3191                 av_log(h->s.avctx, AV_LOG_DEBUG, "%d fn:%d poc:%d %p\n", i, pic->frame_num, pic->poc, pic->data[0]);
3192             }
3193         }
3194     }
3195 }
3196
3197 /**
3198  * Executes the reference picture marking (memory management control operations).
3199  */
3200 static int execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
3201     MpegEncContext * const s = &h->s;
3202     int i, j;
3203     int current_ref_assigned=0;
3204     Picture *pic;
3205
3206     if((s->avctx->debug&FF_DEBUG_MMCO) && mmco_count==0)
3207         av_log(h->s.avctx, AV_LOG_DEBUG, "no mmco here\n");
3208
3209     for(i=0; i<mmco_count; i++){
3210         int structure, frame_num;
3211         if(s->avctx->debug&FF_DEBUG_MMCO)
3212             av_log(h->s.avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode, h->mmco[i].short_pic_num, h->mmco[i].long_arg);
3213
3214         if(   mmco[i].opcode == MMCO_SHORT2UNUSED
3215            || mmco[i].opcode == MMCO_SHORT2LONG){
3216             frame_num = pic_num_extract(h, mmco[i].short_pic_num, &structure);
3217             pic = find_short(h, frame_num, &j);
3218             if(!pic){
3219                 if(mmco[i].opcode != MMCO_SHORT2LONG || !h->long_ref[mmco[i].long_arg]
3220                    || h->long_ref[mmco[i].long_arg]->frame_num != frame_num)
3221                 av_log(h->s.avctx, AV_LOG_ERROR, "mmco: unref short failure\n");
3222                 continue;
3223             }
3224         }
3225
3226         switch(mmco[i].opcode){
3227         case MMCO_SHORT2UNUSED:
3228             if(s->avctx->debug&FF_DEBUG_MMCO)
3229                 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref short %d count %d\n", h->mmco[i].short_pic_num, h->short_ref_count);
3230             remove_short(h, frame_num, structure ^ PICT_FRAME);
3231             break;
3232         case MMCO_SHORT2LONG:
3233                 if (h->long_ref[mmco[i].long_arg] != pic)
3234                     remove_long(h, mmco[i].long_arg, 0);
3235
3236                 remove_short_at_index(h, j);
3237                 h->long_ref[ mmco[i].long_arg ]= pic;
3238                 if (h->long_ref[ mmco[i].long_arg ]){
3239                     h->long_ref[ mmco[i].long_arg ]->long_ref=1;
3240                     h->long_ref_count++;
3241                 }
3242             break;
3243         case MMCO_LONG2UNUSED:
3244             j = pic_num_extract(h, mmco[i].long_arg, &structure);
3245             pic = h->long_ref[j];
3246             if (pic) {
3247                 remove_long(h, j, structure ^ PICT_FRAME);
3248             } else if(s->avctx->debug&FF_DEBUG_MMCO)
3249                 av_log(h->s.avctx, AV_LOG_DEBUG, "mmco: unref long failure\n");
3250             break;
3251         case MMCO_LONG:
3252                     // Comment below left from previous code as it is an interresting note.
3253                     /* First field in pair is in short term list or
3254                      * at a different long term index.
3255                      * This is not allowed; see 7.4.3.3, notes 2 and 3.
3256                      * Report the problem and keep the pair where it is,
3257                      * and mark this field valid.
3258                      */
3259
3260             if (h->long_ref[mmco[i].long_arg] != s->current_picture_ptr) {
3261                 remove_long(h, mmco[i].long_arg, 0);
3262
3263                 h->long_ref[ mmco[i].long_arg ]= s->current_picture_ptr;
3264                 h->long_ref[ mmco[i].long_arg ]->long_ref=1;
3265                 h->long_ref_count++;
3266             }
3267
3268             s->current_picture_ptr->reference |= s->picture_structure;
3269             current_ref_assigned=1;
3270             break;
3271         case MMCO_SET_MAX_LONG:
3272             assert(mmco[i].long_arg <= 16);
3273             // just remove the long term which index is greater than new max
3274             for(j = mmco[i].long_arg; j<16; j++){
3275                 remove_long(h, j, 0);
3276             }
3277             break;
3278         case MMCO_RESET:
3279             while(h->short_ref_count){
3280                 remove_short(h, h->short_ref[0]->frame_num, 0);
3281             }
3282             for(j = 0; j < 16; j++) {
3283                 remove_long(h, j, 0);
3284             }
3285             s->current_picture_ptr->poc=
3286             s->current_picture_ptr->field_poc[0]=
3287             s->current_picture_ptr->field_poc[1]=
3288             h->poc_lsb=
3289             h->poc_msb=
3290             h->frame_num=
3291             s->current_picture_ptr->frame_num= 0;
3292             break;
3293         default: assert(0);
3294         }
3295     }
3296
3297     if (!current_ref_assigned) {
3298         /* Second field of complementary field pair; the first field of
3299          * which is already referenced. If short referenced, it
3300          * should be first entry in short_ref. If not, it must exist
3301          * in long_ref; trying to put it on the short list here is an
3302          * error in the encoded bit stream (ref: 7.4.3.3, NOTE 2 and 3).
3303          */
3304         if (h->short_ref_count && h->short_ref[0] == s->current_picture_ptr) {
3305             /* Just mark the second field valid */
3306             s->current_picture_ptr->reference = PICT_FRAME;
3307         } else if (s->current_picture_ptr->long_ref) {
3308             av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term reference "
3309                                              "assignment for second field "
3310                                              "in complementary field pair "
3311                                              "(first field is long term)\n");
3312         } else {
3313             pic= remove_short(h, s->current_picture_ptr->frame_num, 0);
3314             if(pic){
3315                 av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n");
3316             }
3317
3318             if(h->short_ref_count)
3319                 memmove(&h->short_ref[1], &h->short_ref[0], h->short_ref_count*sizeof(Picture*));
3320
3321             h->short_ref[0]= s->current_picture_ptr;
3322             h->short_ref_count++;
3323             s->current_picture_ptr->reference |= s->picture_structure;
3324         }
3325     }
3326
3327     if (h->long_ref_count + h->short_ref_count > h->sps.ref_frame_count){
3328
3329         /* We have too many reference frames, probably due to corrupted
3330          * stream. Need to discard one frame. Prevents overrun of the
3331          * short_ref and long_ref buffers.
3332          */
3333         av_log(h->s.avctx, AV_LOG_ERROR,
3334                "number of reference frames exceeds max (probably "
3335                "corrupt input), discarding one\n");
3336
3337         if (h->long_ref_count && !h->short_ref_count) {
3338             for (i = 0; i < 16; ++i)
3339                 if (h->long_ref[i])
3340                     break;
3341
3342             assert(i < 16);
3343             remove_long(h, i, 0);
3344         } else {
3345             pic = h->short_ref[h->short_ref_count - 1];
3346             remove_short(h, pic->frame_num, 0);
3347         }
3348     }
3349
3350     print_short_term(h);
3351     print_long_term(h);
3352     return 0;
3353 }
3354
3355 static int decode_ref_pic_marking(H264Context *h, GetBitContext *gb){
3356     MpegEncContext * const s = &h->s;
3357     int i;
3358
3359     h->mmco_index= 0;
3360     if(h->nal_unit_type == NAL_IDR_SLICE){ //FIXME fields
3361         s->broken_link= get_bits1(gb) -1;
3362         if(get_bits1(gb)){
3363             h->mmco[0].opcode= MMCO_LONG;
3364             h->mmco[0].long_arg= 0;
3365             h->mmco_index= 1;
3366         }
3367     }else{
3368         if(get_bits1(gb)){ // adaptive_ref_pic_marking_mode_flag
3369             for(i= 0; i<MAX_MMCO_COUNT; i++) {
3370                 MMCOOpcode opcode= get_ue_golomb(gb);
3371
3372                 h->mmco[i].opcode= opcode;
3373                 if(opcode==MMCO_SHORT2UNUSED || opcode==MMCO_SHORT2LONG){
3374                     h->mmco[i].short_pic_num= (h->curr_pic_num - get_ue_golomb(gb) - 1) & (h->max_pic_num - 1);
3375 /*                    if(h->mmco[i].short_pic_num >= h->short_ref_count || h->short_ref[ h->mmco[i].short_pic_num ] == NULL){
3376                         av_log(s->avctx, AV_LOG_ERROR, "illegal short ref in memory management control operation %d\n", mmco);
3377                         return -1;
3378                     }*/
3379                 }
3380                 if(opcode==MMCO_SHORT2LONG || opcode==MMCO_LONG2UNUSED || opcode==MMCO_LONG || opcode==MMCO_SET_MAX_LONG){
3381                     unsigned int long_arg= get_ue_golomb(gb);
3382                     if(long_arg >= 32 || (long_arg >= 16 && !(opcode == MMCO_LONG2UNUSED && FIELD_PICTURE))){
3383                         av_log(h->s.avctx, AV_LOG_ERROR, "illegal long ref in memory management control operation %d\n", opcode);
3384                         return -1;
3385                     }
3386                     h->mmco[i].long_arg= long_arg;
3387                 }
3388
3389                 if(opcode > (unsigned)MMCO_LONG){
3390                     av_log(h->s.avctx, AV_LOG_ERROR, "illegal memory management control operation %d\n", opcode);
3391                     return -1;
3392                 }
3393                 if(opcode == MMCO_END)
3394                     break;
3395             }
3396             h->mmco_index= i;
3397         }else{
3398             assert(h->long_ref_count + h->short_ref_count <= h->sps.ref_frame_count);
3399
3400             if(h->short_ref_count && h->long_ref_count + h->short_ref_count == h->sps.ref_frame_count &&
3401                     !(FIELD_PICTURE && !s->first_field && s->current_picture_ptr->reference)) {
3402                 h->mmco[0].opcode= MMCO_SHORT2UNUSED;
3403                 h->mmco[0].short_pic_num= h->short_ref[ h->short_ref_count - 1 ]->frame_num;
3404                 h->mmco_index= 1;
3405                 if (FIELD_PICTURE) {
3406                     h->mmco[0].short_pic_num *= 2;
3407                     h->mmco[1].opcode= MMCO_SHORT2UNUSED;
3408                     h->mmco[1].short_pic_num= h->mmco[0].short_pic_num + 1;
3409                     h->mmco_index= 2;
3410                 }
3411             }
3412         }
3413     }
3414
3415     return 0;
3416 }
3417
3418 static int init_poc(H264Context *h){
3419     MpegEncContext * const s = &h->s;
3420     const int max_frame_num= 1<<h->sps.log2_max_frame_num;
3421     int field_poc[2];
3422     Picture *cur = s->current_picture_ptr;
3423
3424     h->frame_num_offset= h->prev_frame_num_offset;
3425     if(h->frame_num < h->prev_frame_num)
3426         h->frame_num_offset += max_frame_num;
3427
3428     if(h->sps.poc_type==0){
3429         const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb;
3430
3431         if     (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2)
3432             h->poc_msb = h->prev_poc_msb + max_poc_lsb;
3433         else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2)
3434             h->poc_msb = h->prev_poc_msb - max_poc_lsb;
3435         else
3436             h->poc_msb = h->prev_poc_msb;
3437 //printf("poc: %d %d\n", h->poc_msb, h->poc_lsb);
3438         field_poc[0] =
3439         field_poc[1] = h->poc_msb + h->poc_lsb;
3440         if(s->picture_structure == PICT_FRAME)
3441             field_poc[1] += h->delta_poc_bottom;
3442     }else if(h->sps.poc_type==1){
3443         int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc;
3444         int i;
3445
3446         if(h->sps.poc_cycle_length != 0)
3447             abs_frame_num = h->frame_num_offset + h->frame_num;
3448         else
3449             abs_frame_num = 0;
3450
3451         if(h->nal_ref_idc==0 && abs_frame_num > 0)
3452             abs_frame_num--;
3453
3454         expected_delta_per_poc_cycle = 0;
3455         for(i=0; i < h->sps.poc_cycle_length; i++)
3456             expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[ i ]; //FIXME integrate during sps parse
3457
3458         if(abs_frame_num > 0){
3459             int poc_cycle_cnt          = (abs_frame_num - 1) / h->sps.poc_cycle_length;
3460             int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length;
3461
3462             expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle;
3463             for(i = 0; i <= frame_num_in_poc_cycle; i++)
3464                 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[ i ];
3465         } else
3466             expectedpoc = 0;
3467
3468         if(h->nal_ref_idc == 0)
3469             expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic;
3470
3471         field_poc[0] = expectedpoc + h->delta_poc[0];
3472         field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field;
3473
3474         if(s->picture_structure == PICT_FRAME)
3475             field_poc[1] += h->delta_poc[1];
3476     }else{
3477         int poc= 2*(h->frame_num_offset + h->frame_num);
3478
3479         if(!h->nal_ref_idc)
3480             poc--;
3481
3482         field_poc[0]= poc;
3483         field_poc[1]= poc;
3484     }
3485
3486     if(s->picture_structure != PICT_BOTTOM_FIELD)
3487         s->current_picture_ptr->field_poc[0]= field_poc[0];
3488     if(s->picture_structure != PICT_TOP_FIELD)
3489         s->current_picture_ptr->field_poc[1]= field_poc[1];
3490     cur->poc= FFMIN(cur->field_poc[0], cur->field_poc[1]);
3491
3492     return 0;
3493 }
3494
3495
3496 /**
3497  * initialize scan tables
3498  */
3499 static void init_scan_tables(H264Context *h){
3500     MpegEncContext * const s = &h->s;
3501     int i;
3502     if(s->dsp.h264_idct_add == ff_h264_idct_add_c){ //FIXME little ugly
3503         memcpy(h->zigzag_scan, zigzag_scan, 16*sizeof(uint8_t));
3504         memcpy(h-> field_scan,  field_scan, 16*sizeof(uint8_t));
3505     }else{
3506         for(i=0; i<16; i++){
3507 #define T(x) (x>>2) | ((x<<2) & 0xF)
3508             h->zigzag_scan[i] = T(zigzag_scan[i]);
3509             h-> field_scan[i] = T( field_scan[i]);
3510 #undef T
3511         }
3512     }
3513     if(s->dsp.h264_idct8_add == ff_h264_idct8_add_c){
3514         memcpy(h->zigzag_scan8x8,       zigzag_scan8x8,       64*sizeof(uint8_t));
3515         memcpy(h->zigzag_scan8x8_cavlc, zigzag_scan8x8_cavlc, 64*sizeof(uint8_t));
3516         memcpy(h->field_scan8x8,        field_scan8x8,        64*sizeof(uint8_t));
3517         memcpy(h->field_scan8x8_cavlc,  field_scan8x8_cavlc,  64*sizeof(uint8_t));
3518     }else{
3519         for(i=0; i<64; i++){
3520 #define T(x) (x>>3) | ((x&7)<<3)
3521             h->zigzag_scan8x8[i]       = T(zigzag_scan8x8[i]);
3522             h->zigzag_scan8x8_cavlc[i] = T(zigzag_scan8x8_cavlc[i]);
3523             h->field_scan8x8[i]        = T(field_scan8x8[i]);
3524             h->field_scan8x8_cavlc[i]  = T(field_scan8x8_cavlc[i]);
3525 #undef T
3526         }
3527     }
3528     if(h->sps.transform_bypass){ //FIXME same ugly
3529         h->zigzag_scan_q0          = zigzag_scan;
3530         h->zigzag_scan8x8_q0       = zigzag_scan8x8;
3531         h->zigzag_scan8x8_cavlc_q0 = zigzag_scan8x8_cavlc;
3532         h->field_scan_q0           = field_scan;
3533         h->field_scan8x8_q0        = field_scan8x8;
3534         h->field_scan8x8_cavlc_q0  = field_scan8x8_cavlc;
3535     }else{
3536         h->zigzag_scan_q0          = h->zigzag_scan;
3537         h->zigzag_scan8x8_q0       = h->zigzag_scan8x8;
3538         h->zigzag_scan8x8_cavlc_q0 = h->zigzag_scan8x8_cavlc;
3539         h->field_scan_q0           = h->field_scan;
3540         h->field_scan8x8_q0        = h->field_scan8x8;
3541         h->field_scan8x8_cavlc_q0  = h->field_scan8x8_cavlc;
3542     }
3543 }
3544
3545 /**
3546  * Replicates H264 "master" context to thread contexts.
3547  */
3548 static void clone_slice(H264Context *dst, H264Context *src)
3549 {
3550     memcpy(dst->block_offset,     src->block_offset, sizeof(dst->block_offset));
3551     dst->s.current_picture_ptr  = src->s.current_picture_ptr;
3552     dst->s.current_picture      = src->s.current_picture;
3553     dst->s.linesize             = src->s.linesize;
3554     dst->s.uvlinesize           = src->s.uvlinesize;
3555     dst->s.first_field          = src->s.first_field;
3556
3557     dst->prev_poc_msb           = src->prev_poc_msb;
3558     dst->prev_poc_lsb           = src->prev_poc_lsb;
3559     dst->prev_frame_num_offset  = src->prev_frame_num_offset;
3560     dst->prev_frame_num         = src->prev_frame_num;
3561     dst->short_ref_count        = src->short_ref_count;
3562
3563     memcpy(dst->short_ref,        src->short_ref,        sizeof(dst->short_ref));
3564     memcpy(dst->long_ref,         src->long_ref,         sizeof(dst->long_ref));
3565     memcpy(dst->default_ref_list, src->default_ref_list, sizeof(dst->default_ref_list));
3566     memcpy(dst->ref_list,         src->ref_list,         sizeof(dst->ref_list));
3567
3568     memcpy(dst->dequant4_coeff,   src->dequant4_coeff,   sizeof(src->dequant4_coeff));
3569     memcpy(dst->dequant8_coeff,   src->dequant8_coeff,   sizeof(src->dequant8_coeff));
3570 }
3571
3572 /**
3573  * decodes a slice header.
3574  * This will also call MPV_common_init() and frame_start() as needed.
3575  *
3576  * @param h h264context
3577  * @param h0 h264 master context (differs from 'h' when doing sliced based parallel decoding)
3578  *
3579  * @return 0 if okay, <0 if an error occurred, 1 if decoding must not be multithreaded
3580  */
3581 static int decode_slice_header(H264Context *h, H264Context *h0){
3582     MpegEncContext * const s = &h->s;
3583     MpegEncContext * const s0 = &h0->s;
3584     unsigned int first_mb_in_slice;
3585     unsigned int pps_id;
3586     int num_ref_idx_active_override_flag;
3587     static const uint8_t slice_type_map[5]= {FF_P_TYPE, FF_B_TYPE, FF_I_TYPE, FF_SP_TYPE, FF_SI_TYPE};
3588     unsigned int slice_type, tmp, i, j;
3589     int default_ref_list_done = 0;
3590     int last_pic_structure;
3591
3592     s->dropable= h->nal_ref_idc == 0;
3593
3594     if((s->avctx->flags2 & CODEC_FLAG2_FAST) && !h->nal_ref_idc){
3595         s->me.qpel_put= s->dsp.put_2tap_qpel_pixels_tab;
3596         s->me.qpel_avg= s->dsp.avg_2tap_qpel_pixels_tab;
3597     }else{
3598         s->me.qpel_put= s->dsp.put_h264_qpel_pixels_tab;
3599         s->me.qpel_avg= s->dsp.avg_h264_qpel_pixels_tab;
3600     }
3601
3602     first_mb_in_slice= get_ue_golomb(&s->gb);
3603
3604     if((s->flags2 & CODEC_FLAG2_CHUNKS) && first_mb_in_slice == 0){
3605         h0->current_slice = 0;
3606         if (!s0->first_field)
3607             s->current_picture_ptr= NULL;
3608     }
3609
3610     slice_type= get_ue_golomb(&s->gb);
3611     if(slice_type > 9){
3612         av_log(h->s.avctx, AV_LOG_ERROR, "slice type too large (%d) at %d %d\n", h->slice_type, s->mb_x, s->mb_y);
3613         return -1;
3614     }
3615     if(slice_type > 4){
3616         slice_type -= 5;
3617         h->slice_type_fixed=1;
3618     }else
3619         h->slice_type_fixed=0;
3620
3621     slice_type= slice_type_map[ slice_type ];
3622     if (slice_type == FF_I_TYPE
3623         || (h0->current_slice != 0 && slice_type == h0->last_slice_type) ) {
3624         default_ref_list_done = 1;
3625     }
3626     h->slice_type= slice_type;
3627     h->slice_type_nos= slice_type & 3;
3628
3629     s->pict_type= h->slice_type; // to make a few old functions happy, it's wrong though
3630     if (s->pict_type == FF_B_TYPE && s0->last_picture_ptr == NULL) {
3631         av_log(h->s.avctx, AV_LOG_ERROR,
3632                "B picture before any references, skipping\n");
3633         return -1;
3634     }
3635
3636     pps_id= get_ue_golomb(&s->gb);
3637     if(pps_id>=MAX_PPS_COUNT){
3638         av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n");
3639         return -1;
3640     }
3641     if(!h0->pps_buffers[pps_id]) {
3642         av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS referenced\n");
3643         return -1;
3644     }
3645     h->pps= *h0->pps_buffers[pps_id];
3646
3647     if(!h0->sps_buffers[h->pps.sps_id]) {
3648         av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS referenced\n");
3649         return -1;
3650     }
3651     h->sps = *h0->sps_buffers[h->pps.sps_id];
3652
3653     if(h == h0 && h->dequant_coeff_pps != pps_id){
3654         h->dequant_coeff_pps = pps_id;
3655         init_dequant_tables(h);
3656     }
3657
3658     s->mb_width= h->sps.mb_width;
3659     s->mb_height= h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag);
3660
3661     h->b_stride=  s->mb_width*4;
3662     h->b8_stride= s->mb_width*2;
3663
3664     s->width = 16*s->mb_width - 2*FFMIN(h->sps.crop_right, 7);
3665     if(h->sps.frame_mbs_only_flag)
3666         s->height= 16*s->mb_height - 2*FFMIN(h->sps.crop_bottom, 7);
3667     else
3668         s->height= 16*s->mb_height - 4*FFMIN(h->sps.crop_bottom, 3);
3669
3670     if (s->context_initialized
3671         && (   s->width != s->avctx->width || s->height != s->avctx->height)) {
3672         if(h != h0)
3673             return -1;   // width / height changed during parallelized decoding
3674         free_tables(h);
3675         MPV_common_end(s);
3676     }
3677     if (!s->context_initialized) {
3678         if(h != h0)
3679             return -1;  // we cant (re-)initialize context during parallel decoding
3680         if (MPV_common_init(s) < 0)
3681             return -1;
3682         s->first_field = 0;
3683
3684         init_scan_tables(h);
3685         alloc_tables(h);
3686
3687         for(i = 1; i < s->avctx->thread_count; i++) {
3688             H264Context *c;
3689             c = h->thread_context[i] = av_malloc(sizeof(H264Context));
3690             memcpy(c, h->s.thread_context[i], sizeof(MpegEncContext));
3691             memset(&c->s + 1, 0, sizeof(H264Context) - sizeof(MpegEncContext));
3692             c->sps = h->sps;
3693             c->pps = h->pps;
3694             init_scan_tables(c);
3695             clone_tables(c, h);
3696         }
3697
3698         for(i = 0; i < s->avctx->thread_count; i++)
3699             if(context_init(h->thread_context[i]) < 0)
3700                 return -1;
3701
3702         s->avctx->width = s->width;
3703         s->avctx->height = s->height;
3704         s->avctx->sample_aspect_ratio= h->sps.sar;
3705         if(!s->avctx->sample_aspect_ratio.den)
3706             s->avctx->sample_aspect_ratio.den = 1;
3707
3708         if(h->sps.timing_info_present_flag){
3709             s->avctx->time_base= (AVRational){h->sps.num_units_in_tick * 2, h->sps.time_scale};
3710             if(h->x264_build > 0 && h->x264_build < 44)
3711                 s->avctx->time_base.den *= 2;
3712             av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den,
3713                       s->avctx->time_base.num, s->avctx->time_base.den, 1<<30);
3714         }
3715     }
3716
3717     h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num);
3718
3719     h->mb_mbaff = 0;
3720     h->mb_aff_frame = 0;
3721     last_pic_structure = s0->picture_structure;
3722     if(h->sps.frame_mbs_only_flag){
3723         s->picture_structure= PICT_FRAME;
3724     }else{
3725         if(get_bits1(&s->gb)) { //field_pic_flag
3726             s->picture_structure= PICT_TOP_FIELD + get_bits1(&s->gb); //bottom_field_flag
3727         } else {
3728             s->picture_structure= PICT_FRAME;
3729             h->mb_aff_frame = h->sps.mb_aff;
3730         }
3731     }
3732     h->mb_field_decoding_flag= s->picture_structure != PICT_FRAME;
3733
3734     if(h0->current_slice == 0){
3735         while(h->frame_num !=  h->prev_frame_num &&
3736               h->frame_num != (h->prev_frame_num+1)%(1<<h->sps.log2_max_frame_num)){
3737             av_log(NULL, AV_LOG_DEBUG, "Frame num gap %d %d\n", h->frame_num, h->prev_frame_num);
3738             frame_start(h);
3739             h->prev_frame_num++;
3740             h->prev_frame_num %= 1<<h->sps.log2_max_frame_num;
3741             s->current_picture_ptr->frame_num= h->prev_frame_num;
3742             execute_ref_pic_marking(h, NULL, 0);
3743         }
3744
3745         /* See if we have a decoded first field looking for a pair... */
3746         if (s0->first_field) {
3747             assert(s0->current_picture_ptr);
3748             assert(s0->current_picture_ptr->data[0]);
3749             assert(s0->current_picture_ptr->reference != DELAYED_PIC_REF);
3750
3751             /* figure out if we have a complementary field pair */
3752             if (!FIELD_PICTURE || s->picture_structure == last_pic_structure) {
3753                 /*
3754                  * Previous field is unmatched. Don't display it, but let it
3755                  * remain for reference if marked as such.
3756                  */
3757                 s0->current_picture_ptr = NULL;
3758                 s0->first_field = FIELD_PICTURE;
3759
3760             } else {
3761                 if (h->nal_ref_idc &&
3762                         s0->current_picture_ptr->reference &&
3763                         s0->current_picture_ptr->frame_num != h->frame_num) {
3764                     /*
3765                      * This and previous field were reference, but had
3766                      * different frame_nums. Consider this field first in
3767                      * pair. Throw away previous field except for reference
3768                      * purposes.
3769                      */
3770                     s0->first_field = 1;
3771                     s0->current_picture_ptr = NULL;
3772
3773                 } else {
3774                     /* Second field in complementary pair */
3775                     s0->first_field = 0;
3776                 }
3777             }
3778
3779         } else {
3780             /* Frame or first field in a potentially complementary pair */
3781             assert(!s0->current_picture_ptr);
3782             s0->first_field = FIELD_PICTURE;
3783         }
3784
3785         if((!FIELD_PICTURE || s0->first_field) && frame_start(h) < 0) {
3786             s0->first_field = 0;
3787             return -1;
3788         }
3789     }
3790     if(h != h0)
3791         clone_slice(h, h0);
3792
3793     s->current_picture_ptr->frame_num= h->frame_num; //FIXME frame_num cleanup
3794
3795     assert(s->mb_num == s->mb_width * s->mb_height);
3796     if(first_mb_in_slice << FIELD_OR_MBAFF_PICTURE >= s->mb_num ||
3797        first_mb_in_slice                    >= s->mb_num){
3798         av_log(h->s.avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n");
3799         return -1;
3800     }
3801     s->resync_mb_x = s->mb_x = first_mb_in_slice % s->mb_width;
3802     s->resync_mb_y = s->mb_y = (first_mb_in_slice / s->mb_width) << FIELD_OR_MBAFF_PICTURE;
3803     if (s->picture_structure == PICT_BOTTOM_FIELD)
3804         s->resync_mb_y = s->mb_y = s->mb_y + 1;
3805     assert(s->mb_y < s->mb_height);
3806
3807     if(s->picture_structure==PICT_FRAME){
3808         h->curr_pic_num=   h->frame_num;
3809         h->max_pic_num= 1<< h->sps.log2_max_frame_num;
3810     }else{
3811         h->curr_pic_num= 2*h->frame_num + 1;
3812         h->max_pic_num= 1<<(h->sps.log2_max_frame_num + 1);
3813     }
3814
3815     if(h->nal_unit_type == NAL_IDR_SLICE){
3816         get_ue_golomb(&s->gb); /* idr_pic_id */
3817     }
3818
3819     if(h->sps.poc_type==0){
3820         h->poc_lsb= get_bits(&s->gb, h->sps.log2_max_poc_lsb);
3821
3822         if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME){
3823             h->delta_poc_bottom= get_se_golomb(&s->gb);
3824         }
3825     }
3826
3827     if(h->sps.poc_type==1 && !h->sps.delta_pic_order_always_zero_flag){
3828         h->delta_poc[0]= get_se_golomb(&s->gb);
3829
3830         if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME)
3831             h->delta_poc[1]= get_se_golomb(&s->gb);
3832     }
3833
3834     init_poc(h);
3835
3836     if(h->pps.redundant_pic_cnt_present){
3837         h->redundant_pic_count= get_ue_golomb(&s->gb);
3838     }
3839
3840     //set defaults, might be overridden a few lines later
3841     h->ref_count[0]= h->pps.ref_count[0];
3842     h->ref_count[1]= h->pps.ref_count[1];
3843
3844     if(h->slice_type_nos != FF_I_TYPE){
3845         if(h->slice_type_nos == FF_B_TYPE){
3846             h->direct_spatial_mv_pred= get_bits1(&s->gb);
3847         }
3848         num_ref_idx_active_override_flag= get_bits1(&s->gb);
3849
3850         if(num_ref_idx_active_override_flag){
3851             h->ref_count[0]= get_ue_golomb(&s->gb) + 1;
3852             if(h->slice_type_nos==FF_B_TYPE)
3853                 h->ref_count[1]= get_ue_golomb(&s->gb) + 1;
3854
3855             if(h->ref_count[0]-1 > 32-1 || h->ref_count[1]-1 > 32-1){
3856                 av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow\n");
3857                 h->ref_count[0]= h->ref_count[1]= 1;
3858                 return -1;
3859             }
3860         }
3861         if(h->slice_type_nos == FF_B_TYPE)
3862             h->list_count= 2;
3863         else
3864             h->list_count= 1;
3865     }else
3866         h->list_count= 0;
3867
3868     if(!default_ref_list_done){
3869         fill_default_ref_list(h);
3870     }
3871
3872     if(h->slice_type_nos!=FF_I_TYPE && decode_ref_pic_list_reordering(h) < 0)
3873         return -1;
3874
3875     if(   (h->pps.weighted_pred          && h->slice_type_nos == FF_P_TYPE )
3876        ||  (h->pps.weighted_bipred_idc==1 && h->slice_type_nos== FF_B_TYPE ) )
3877         pred_weight_table(h);
3878     else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE)
3879         implicit_weight_table(h);
3880     else
3881         h->use_weight = 0;
3882
3883     if(h->nal_ref_idc)
3884         decode_ref_pic_marking(h0, &s->gb);
3885
3886     if(FRAME_MBAFF)
3887         fill_mbaff_ref_list(h);
3888
3889     if( h->slice_type_nos != FF_I_TYPE && h->pps.cabac ){
3890         tmp = get_ue_golomb(&s->gb);
3891         if(tmp > 2){
3892             av_log(s->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n");
3893             return -1;
3894         }
3895         h->cabac_init_idc= tmp;
3896     }
3897
3898     h->last_qscale_diff = 0;
3899     tmp = h->pps.init_qp + get_se_golomb(&s->gb);
3900     if(tmp>51){
3901         av_log(s->avctx, AV_LOG_ERROR, "QP %u out of range\n", tmp);
3902         return -1;
3903     }
3904     s->qscale= tmp;
3905     h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
3906     h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
3907     //FIXME qscale / qp ... stuff
3908     if(h->slice_type == FF_SP_TYPE){
3909         get_bits1(&s->gb); /* sp_for_switch_flag */
3910     }
3911     if(h->slice_type==FF_SP_TYPE || h->slice_type == FF_SI_TYPE){
3912         get_se_golomb(&s->gb); /* slice_qs_delta */
3913     }
3914
3915     h->deblocking_filter = 1;
3916     h->slice_alpha_c0_offset = 0;
3917     h->slice_beta_offset = 0;
3918     if( h->pps.deblocking_filter_parameters_present ) {
3919         tmp= get_ue_golomb(&s->gb);
3920         if(tmp > 2){
3921             av_log(s->avctx, AV_LOG_ERROR, "deblocking_filter_idc %u out of range\n", tmp);
3922             return -1;
3923         }
3924         h->deblocking_filter= tmp;
3925         if(h->deblocking_filter < 2)
3926             h->deblocking_filter^= 1; // 1<->0
3927
3928         if( h->deblocking_filter ) {
3929             h->slice_alpha_c0_offset = get_se_golomb(&s->gb) << 1;
3930             h->slice_beta_offset = get_se_golomb(&s->gb) << 1;
3931         }
3932     }
3933
3934     if(   s->avctx->skip_loop_filter >= AVDISCARD_ALL
3935        ||(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY && h->slice_type_nos != FF_I_TYPE)
3936        ||(s->avctx->skip_loop_filter >= AVDISCARD_BIDIR  && h->slice_type_nos == FF_B_TYPE)
3937        ||(s->avctx->skip_loop_filter >= AVDISCARD_NONREF && h->nal_ref_idc == 0))
3938         h->deblocking_filter= 0;
3939
3940     if(h->deblocking_filter == 1 && h0->max_contexts > 1) {
3941         if(s->avctx->flags2 & CODEC_FLAG2_FAST) {
3942             /* Cheat slightly for speed:
3943                Do not bother to deblock across slices. */
3944             h->deblocking_filter = 2;
3945         } else {
3946             h0->max_contexts = 1;
3947             if(!h0->single_decode_warning) {
3948                 av_log(s->avctx, AV_LOG_INFO, "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n");
3949                 h0->single_decode_warning = 1;
3950             }
3951             if(h != h0)
3952                 return 1; // deblocking switched inside frame
3953         }
3954     }
3955
3956 #if 0 //FMO
3957     if( h->pps.num_slice_groups > 1  && h->pps.mb_slice_group_map_type >= 3 && h->pps.mb_slice_group_map_type <= 5)
3958         slice_group_change_cycle= get_bits(&s->gb, ?);
3959 #endif
3960
3961     h0->last_slice_type = slice_type;
3962     h->slice_num = ++h0->current_slice;
3963
3964     for(j=0; j<2; j++){
3965         int *ref2frm= h->ref2frm[h->slice_num&15][j];
3966         ref2frm[0]=
3967         ref2frm[1]= -1;
3968         for(i=0; i<16; i++)
3969             ref2frm[i+2]= 4*h->ref_list[j][i].frame_num
3970                           +(h->ref_list[j][i].reference&3);
3971         ref2frm[18+0]=
3972         ref2frm[18+1]= -1;
3973         for(i=16; i<48; i++)
3974             ref2frm[i+4]= 4*h->ref_list[j][i].frame_num
3975                           +(h->ref_list[j][i].reference&3);
3976     }
3977
3978     h->emu_edge_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16;
3979     h->emu_edge_height= (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width;
3980
3981     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
3982         av_log(h->s.avctx, AV_LOG_DEBUG, "slice:%d %s mb:%d %c pps:%u frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%d:%d:%d weight:%d%s %s\n",
3983                h->slice_num,
3984                (s->picture_structure==PICT_FRAME ? "F" : s->picture_structure==PICT_TOP_FIELD ? "T" : "B"),
3985                first_mb_in_slice,
3986                av_get_pict_type_char(h->slice_type),
3987                pps_id, h->frame_num,
3988                s->current_picture_ptr->field_poc[0], s->current_picture_ptr->field_poc[1],
3989                h->ref_count[0], h->ref_count[1],
3990                s->qscale,
3991                h->deblocking_filter, h->slice_alpha_c0_offset/2, h->slice_beta_offset/2,
3992                h->use_weight,
3993                h->use_weight==1 && h->use_weight_chroma ? "c" : "",
3994                h->slice_type == FF_B_TYPE ? (h->direct_spatial_mv_pred ? "SPAT" : "TEMP") : ""
3995                );
3996     }
3997
3998     return 0;
3999 }
4000
4001 /**
4002  *
4003  */
4004 static inline int get_level_prefix(GetBitContext *gb){
4005     unsigned int buf;
4006     int log;
4007
4008     OPEN_READER(re, gb);
4009     UPDATE_CACHE(re, gb);
4010     buf=GET_CACHE(re, gb);
4011
4012     log= 32 - av_log2(buf);
4013 #ifdef TRACE
4014     print_bin(buf>>(32-log), log);
4015     av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d lpr @%5d in %s get_level_prefix\n", buf>>(32-log), log, log-1, get_bits_count(gb), __FILE__);
4016 #endif
4017
4018     LAST_SKIP_BITS(re, gb, log);
4019     CLOSE_READER(re, gb);
4020
4021     return log-1;
4022 }
4023
4024 static inline int get_dct8x8_allowed(H264Context *h){
4025     int i;
4026     for(i=0; i<4; i++){
4027         if(!IS_SUB_8X8(h->sub_mb_type[i])
4028            || (!h->sps.direct_8x8_inference_flag && IS_DIRECT(h->sub_mb_type[i])))
4029             return 0;
4030     }
4031     return 1;
4032 }
4033
4034 /**
4035  * decodes a residual block.
4036  * @param n block index
4037  * @param scantable scantable
4038  * @param max_coeff number of coefficients in the block
4039  * @return <0 if an error occurred
4040  */
4041 static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff){
4042     MpegEncContext * const s = &h->s;
4043     static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3};
4044     int level[16];
4045     int zeros_left, coeff_num, coeff_token, total_coeff, i, j, trailing_ones, run_before;
4046
4047     //FIXME put trailing_onex into the context
4048
4049     if(n == CHROMA_DC_BLOCK_INDEX){
4050         coeff_token= get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1);
4051         total_coeff= coeff_token>>2;
4052     }else{
4053         if(n == LUMA_DC_BLOCK_INDEX){
4054             total_coeff= pred_non_zero_count(h, 0);
4055             coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
4056             total_coeff= coeff_token>>2;
4057         }else{
4058             total_coeff= pred_non_zero_count(h, n);
4059             coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
4060             total_coeff= coeff_token>>2;
4061             h->non_zero_count_cache[ scan8[n] ]= total_coeff;
4062         }
4063     }
4064
4065     //FIXME set last_non_zero?
4066
4067     if(total_coeff==0)
4068         return 0;
4069     if(total_coeff > (unsigned)max_coeff) {
4070         av_log(h->s.avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", s->mb_x, s->mb_y, total_coeff);
4071         return -1;
4072     }
4073
4074     trailing_ones= coeff_token&3;
4075     tprintf(h->s.avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff);
4076     assert(total_coeff<=16);
4077
4078     for(i=0; i<trailing_ones; i++){
4079         level[i]= 1 - 2*get_bits1(gb);
4080     }
4081
4082     if(i<total_coeff) {
4083         int level_code, mask;
4084         int suffix_length = total_coeff > 10 && trailing_ones < 3;
4085         int prefix= get_level_prefix(gb);
4086
4087         //first coefficient has suffix_length equal to 0 or 1
4088         if(prefix<14){ //FIXME try to build a large unified VLC table for all this
4089             if(suffix_length)
4090                 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
4091             else
4092                 level_code= (prefix<<suffix_length); //part
4093         }else if(prefix==14){
4094             if(suffix_length)
4095                 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
4096             else
4097                 level_code= prefix + get_bits(gb, 4); //part
4098         }else{
4099             level_code= (15<<suffix_length) + get_bits(gb, prefix-3); //part
4100             if(suffix_length==0) level_code+=15; //FIXME doesn't make (much)sense
4101             if(prefix>=16)
4102                 level_code += (1<<(prefix-3))-4096;
4103         }
4104
4105         if(trailing_ones < 3) level_code += 2;
4106
4107         suffix_length = 1;
4108         if(level_code > 5)
4109             suffix_length++;
4110         mask= -(level_code&1);
4111         level[i]= (((2+level_code)>>1) ^ mask) - mask;
4112         i++;
4113
4114         //remaining coefficients have suffix_length > 0
4115         for(;i<total_coeff;i++) {
4116             static const int suffix_limit[7] = {0,5,11,23,47,95,INT_MAX };
4117             prefix = get_level_prefix(gb);
4118             if(prefix<15){
4119                 level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
4120             }else{
4121                 level_code = (15<<suffix_length) + get_bits(gb, prefix-3);
4122                 if(prefix>=16)
4123                     level_code += (1<<(prefix-3))-4096;
4124             }
4125             mask= -(level_code&1);
4126             level[i]= (((2+level_code)>>1) ^ mask) - mask;
4127             if(level_code > suffix_limit[suffix_length])
4128                 suffix_length++;
4129         }
4130     }
4131
4132     if(total_coeff == max_coeff)
4133         zeros_left=0;
4134     else{
4135         if(n == CHROMA_DC_BLOCK_INDEX)
4136             zeros_left= get_vlc2(gb, chroma_dc_total_zeros_vlc[ total_coeff-1 ].table, CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1);
4137         else
4138             zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff-1 ].table, TOTAL_ZEROS_VLC_BITS, 1);
4139     }
4140
4141     coeff_num = zeros_left + total_coeff - 1;
4142     j = scantable[coeff_num];
4143     if(n > 24){
4144         block[j] = level[0];
4145         for(i=1;i<total_coeff;i++) {
4146             if(zeros_left <= 0)
4147                 run_before = 0;
4148             else if(zeros_left < 7){
4149                 run_before= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1);
4150             }else{
4151                 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2);
4152             }
4153             zeros_left -= run_before;
4154             coeff_num -= 1 + run_before;
4155             j= scantable[ coeff_num ];
4156
4157             block[j]= level[i];
4158         }
4159     }else{
4160         block[j] = (level[0] * qmul[j] + 32)>>6;
4161         for(i=1;i<total_coeff;i++) {
4162             if(zeros_left <= 0)
4163                 run_before = 0;
4164             else if(zeros_left < 7){
4165                 run_before= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1);
4166             }else{
4167                 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2);
4168             }
4169             zeros_left -= run_before;
4170             coeff_num -= 1 + run_before;
4171             j= scantable[ coeff_num ];
4172
4173             block[j]= (level[i] * qmul[j] + 32)>>6;
4174         }
4175     }
4176
4177     if(zeros_left<0){
4178         av_log(h->s.avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", s->mb_x, s->mb_y);
4179         return -1;
4180     }
4181
4182     return 0;
4183 }
4184
4185 static void predict_field_decoding_flag(H264Context *h){
4186     MpegEncContext * const s = &h->s;
4187     const int mb_xy= h->mb_xy;
4188     int mb_type = (h->slice_table[mb_xy-1] == h->slice_num)
4189                 ? s->current_picture.mb_type[mb_xy-1]
4190                 : (h->slice_table[mb_xy-s->mb_stride] == h->slice_num)
4191                 ? s->current_picture.mb_type[mb_xy-s->mb_stride]
4192                 : 0;
4193     h->mb_mbaff = h->mb_field_decoding_flag = IS_INTERLACED(mb_type) ? 1 : 0;
4194 }
4195
4196 /**
4197  * decodes a P_SKIP or B_SKIP macroblock
4198  */
4199 static void decode_mb_skip(H264Context *h){
4200     MpegEncContext * const s = &h->s;
4201     const int mb_xy= h->mb_xy;
4202     int mb_type=0;
4203
4204     memset(h->non_zero_count[mb_xy], 0, 16);
4205     memset(h->non_zero_count_cache + 8, 0, 8*5); //FIXME ugly, remove pfui
4206
4207     if(MB_FIELD)
4208         mb_type|= MB_TYPE_INTERLACED;
4209
4210     if( h->slice_type_nos == FF_B_TYPE )
4211     {
4212         // just for fill_caches. pred_direct_motion will set the real mb_type
4213         mb_type|= MB_TYPE_P0L0|MB_TYPE_P0L1|MB_TYPE_DIRECT2|MB_TYPE_SKIP;
4214
4215         fill_caches(h, mb_type, 0); //FIXME check what is needed and what not ...
4216         pred_direct_motion(h, &mb_type);
4217         mb_type|= MB_TYPE_SKIP;
4218     }
4219     else
4220     {
4221         int mx, my;
4222         mb_type|= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0|MB_TYPE_SKIP;
4223
4224         fill_caches(h, mb_type, 0); //FIXME check what is needed and what not ...
4225         pred_pskip_motion(h, &mx, &my);
4226         fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1);
4227         fill_rectangle(  h->mv_cache[0][scan8[0]], 4, 4, 8, pack16to32(mx,my), 4);
4228     }
4229
4230     write_back_motion(h, mb_type);
4231     s->current_picture.mb_type[mb_xy]= mb_type;
4232     s->current_picture.qscale_table[mb_xy]= s->qscale;
4233     h->slice_table[ mb_xy ]= h->slice_num;
4234     h->prev_mb_skipped= 1;
4235 }
4236
4237 /**
4238  * decodes a macroblock
4239  * @returns 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
4240  */
4241 static int decode_mb_cavlc(H264Context *h){
4242     MpegEncContext * const s = &h->s;
4243     int mb_xy;
4244     int partition_count;
4245     unsigned int mb_type, cbp;
4246     int dct8x8_allowed= h->pps.transform_8x8_mode;
4247
4248     mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
4249
4250     s->dsp.clear_blocks(h->mb); //FIXME avoid if already clear (move after skip handlong?
4251
4252     tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
4253     cbp = 0; /* avoid warning. FIXME: find a solution without slowing
4254                 down the code */
4255     if(h->slice_type_nos != FF_I_TYPE){
4256         if(s->mb_skip_run==-1)
4257             s->mb_skip_run= get_ue_golomb(&s->gb);
4258
4259         if (s->mb_skip_run--) {
4260             if(FRAME_MBAFF && (s->mb_y&1) == 0){
4261                 if(s->mb_skip_run==0)
4262                     h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb);
4263                 else
4264                     predict_field_decoding_flag(h);
4265             }
4266             decode_mb_skip(h);
4267             return 0;
4268         }
4269     }
4270     if(FRAME_MBAFF){
4271         if( (s->mb_y&1) == 0 )
4272             h->mb_mbaff = h->mb_field_decoding_flag = get_bits1(&s->gb);
4273     }
4274
4275     h->prev_mb_skipped= 0;
4276
4277     mb_type= get_ue_golomb(&s->gb);
4278     if(h->slice_type_nos == FF_B_TYPE){
4279         if(mb_type < 23){
4280             partition_count= b_mb_type_info[mb_type].partition_count;
4281             mb_type=         b_mb_type_info[mb_type].type;
4282         }else{
4283             mb_type -= 23;
4284             goto decode_intra_mb;
4285         }
4286     }else if(h->slice_type_nos == FF_P_TYPE){
4287         if(mb_type < 5){
4288             partition_count= p_mb_type_info[mb_type].partition_count;
4289             mb_type=         p_mb_type_info[mb_type].type;
4290         }else{
4291             mb_type -= 5;
4292             goto decode_intra_mb;
4293         }
4294     }else{
4295        assert(h->slice_type_nos == FF_I_TYPE);
4296         if(h->slice_type == FF_SI_TYPE && mb_type)
4297             mb_type--;
4298 decode_intra_mb:
4299         if(mb_type > 25){
4300             av_log(h->s.avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_pict_type_char(h->slice_type), s->mb_x, s->mb_y);
4301             return -1;
4302         }
4303         partition_count=0;
4304         cbp= i_mb_type_info[mb_type].cbp;
4305         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
4306         mb_type= i_mb_type_info[mb_type].type;
4307     }
4308
4309     if(MB_FIELD)
4310         mb_type |= MB_TYPE_INTERLACED;
4311
4312     h->slice_table[ mb_xy ]= h->slice_num;
4313
4314     if(IS_INTRA_PCM(mb_type)){
4315         unsigned int x;
4316
4317         // We assume these blocks are very rare so we do not optimize it.
4318         align_get_bits(&s->gb);
4319
4320         // The pixels are stored in the same order as levels in h->mb array.
4321         for(x=0; x < (CHROMA ? 384 : 256); x++){
4322             ((uint8_t*)h->mb)[x]= get_bits(&s->gb, 8);
4323         }
4324
4325         // In deblocking, the quantizer is 0
4326         s->current_picture.qscale_table[mb_xy]= 0;
4327         // All coeffs are present
4328         memset(h->non_zero_count[mb_xy], 16, 16);
4329
4330         s->current_picture.mb_type[mb_xy]= mb_type;
4331         return 0;
4332     }
4333
4334     if(MB_MBAFF){
4335         h->ref_count[0] <<= 1;
4336         h->ref_count[1] <<= 1;
4337     }
4338
4339     fill_caches(h, mb_type, 0);
4340
4341     //mb_pred
4342     if(IS_INTRA(mb_type)){
4343         int pred_mode;
4344 //            init_top_left_availability(h);
4345         if(IS_INTRA4x4(mb_type)){
4346             int i;
4347             int di = 1;
4348             if(dct8x8_allowed && get_bits1(&s->gb)){
4349                 mb_type |= MB_TYPE_8x8DCT;
4350                 di = 4;
4351             }
4352
4353 //                fill_intra4x4_pred_table(h);
4354             for(i=0; i<16; i+=di){
4355                 int mode= pred_intra_mode(h, i);
4356
4357                 if(!get_bits1(&s->gb)){
4358                     const int rem_mode= get_bits(&s->gb, 3);
4359                     mode = rem_mode + (rem_mode >= mode);
4360                 }
4361
4362                 if(di==4)
4363                     fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
4364                 else
4365                     h->intra4x4_pred_mode_cache[ scan8[i] ] = mode;
4366             }
4367             write_back_intra_pred_mode(h);
4368             if( check_intra4x4_pred_mode(h) < 0)
4369                 return -1;
4370         }else{
4371             h->intra16x16_pred_mode= check_intra_pred_mode(h, h->intra16x16_pred_mode);
4372             if(h->intra16x16_pred_mode < 0)
4373                 return -1;
4374         }
4375         if(CHROMA){
4376             pred_mode= check_intra_pred_mode(h, get_ue_golomb(&s->gb));
4377             if(pred_mode < 0)
4378                 return -1;
4379             h->chroma_pred_mode= pred_mode;
4380         }
4381     }else if(partition_count==4){
4382         int i, j, sub_partition_count[4], list, ref[2][4];
4383
4384         if(h->slice_type_nos == FF_B_TYPE){
4385             for(i=0; i<4; i++){
4386                 h->sub_mb_type[i]= get_ue_golomb(&s->gb);
4387                 if(h->sub_mb_type[i] >=13){
4388                     av_log(h->s.avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y);
4389                     return -1;
4390                 }
4391                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
4392                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
4393             }
4394             if(   IS_DIRECT(h->sub_mb_type[0]) || IS_DIRECT(h->sub_mb_type[1])
4395                || IS_DIRECT(h->sub_mb_type[2]) || IS_DIRECT(h->sub_mb_type[3])) {
4396                 pred_direct_motion(h, &mb_type);
4397                 h->ref_cache[0][scan8[4]] =
4398                 h->ref_cache[1][scan8[4]] =
4399                 h->ref_cache[0][scan8[12]] =
4400                 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
4401             }
4402         }else{
4403             assert(h->slice_type_nos == FF_P_TYPE); //FIXME SP correct ?
4404             for(i=0; i<4; i++){
4405                 h->sub_mb_type[i]= get_ue_golomb(&s->gb);
4406                 if(h->sub_mb_type[i] >=4){
4407                     av_log(h->s.avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y);
4408                     return -1;
4409                 }
4410                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
4411                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
4412             }
4413         }
4414
4415         for(list=0; list<h->list_count; list++){
4416             int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list];
4417             for(i=0; i<4; i++){
4418                 if(IS_DIRECT(h->sub_mb_type[i])) continue;
4419                 if(IS_DIR(h->sub_mb_type[i], 0, list)){
4420                     unsigned int tmp = get_te0_golomb(&s->gb, ref_count); //FIXME init to 0 before and skip?
4421                     if(tmp>=ref_count){
4422                         av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp);
4423                         return -1;
4424                     }
4425                     ref[list][i]= tmp;
4426                 }else{
4427                  //FIXME
4428                     ref[list][i] = -1;
4429                 }
4430             }
4431         }
4432
4433         if(dct8x8_allowed)
4434             dct8x8_allowed = get_dct8x8_allowed(h);
4435
4436         for(list=0; list<h->list_count; list++){
4437             for(i=0; i<4; i++){
4438                 if(IS_DIRECT(h->sub_mb_type[i])) {
4439                     h->ref_cache[list][ scan8[4*i] ] = h->ref_cache[list][ scan8[4*i]+1 ];
4440                     continue;
4441                 }
4442                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ]=
4443                 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
4444
4445                 if(IS_DIR(h->sub_mb_type[i], 0, list)){
4446                     const int sub_mb_type= h->sub_mb_type[i];
4447                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
4448                     for(j=0; j<sub_partition_count[i]; j++){
4449                         int mx, my;
4450                         const int index= 4*i + block_width*j;
4451                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
4452                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
4453                         mx += get_se_golomb(&s->gb);
4454                         my += get_se_golomb(&s->gb);
4455                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
4456
4457                         if(IS_SUB_8X8(sub_mb_type)){
4458                             mv_cache[ 1 ][0]=
4459                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
4460                             mv_cache[ 1 ][1]=
4461                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
4462                         }else if(IS_SUB_8X4(sub_mb_type)){
4463                             mv_cache[ 1 ][0]= mx;
4464                             mv_cache[ 1 ][1]= my;
4465                         }else if(IS_SUB_4X8(sub_mb_type)){
4466                             mv_cache[ 8 ][0]= mx;
4467                             mv_cache[ 8 ][1]= my;
4468                         }
4469                         mv_cache[ 0 ][0]= mx;
4470                         mv_cache[ 0 ][1]= my;
4471                     }
4472                 }else{
4473                     uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
4474                     p[0] = p[1]=
4475                     p[8] = p[9]= 0;
4476                 }
4477             }
4478         }
4479     }else if(IS_DIRECT(mb_type)){
4480         pred_direct_motion(h, &mb_type);
4481         dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
4482     }else{
4483         int list, mx, my, i;
4484          //FIXME we should set ref_idx_l? to 0 if we use that later ...
4485         if(IS_16X16(mb_type)){
4486             for(list=0; list<h->list_count; list++){
4487                     unsigned int val;
4488                     if(IS_DIR(mb_type, 0, list)){
4489                         val= get_te0_golomb(&s->gb, h->ref_count[list]);
4490                         if(val >= h->ref_count[list]){
4491                             av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
4492                             return -1;
4493                         }
4494                     }else
4495                         val= LIST_NOT_USED&0xFF;
4496                     fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
4497             }
4498             for(list=0; list<h->list_count; list++){
4499                 unsigned int val;
4500                 if(IS_DIR(mb_type, 0, list)){
4501                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
4502                     mx += get_se_golomb(&s->gb);
4503                     my += get_se_golomb(&s->gb);
4504                     tprintf(s->avctx, "final mv:%d %d\n", mx, my);
4505
4506                     val= pack16to32(mx,my);
4507                 }else
4508                     val=0;
4509                 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, val, 4);
4510             }
4511         }
4512         else if(IS_16X8(mb_type)){
4513             for(list=0; list<h->list_count; list++){
4514                     for(i=0; i<2; i++){
4515                         unsigned int val;
4516                         if(IS_DIR(mb_type, i, list)){
4517                             val= get_te0_golomb(&s->gb, h->ref_count[list]);
4518                             if(val >= h->ref_count[list]){
4519                                 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
4520                                 return -1;
4521                             }
4522                         }else
4523                             val= LIST_NOT_USED&0xFF;
4524                         fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
4525                     }
4526             }
4527             for(list=0; list<h->list_count; list++){
4528                 for(i=0; i<2; i++){
4529                     unsigned int val;
4530                     if(IS_DIR(mb_type, i, list)){
4531                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
4532                         mx += get_se_golomb(&s->gb);
4533                         my += get_se_golomb(&s->gb);
4534                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
4535
4536                         val= pack16to32(mx,my);
4537                     }else
4538                         val=0;
4539                     fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4);
4540                 }
4541             }
4542         }else{
4543             assert(IS_8X16(mb_type));
4544             for(list=0; list<h->list_count; list++){
4545                     for(i=0; i<2; i++){
4546                         unsigned int val;
4547                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
4548                             val= get_te0_golomb(&s->gb, h->ref_count[list]);
4549                             if(val >= h->ref_count[list]){
4550                                 av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
4551                                 return -1;
4552                             }
4553                         }else
4554                             val= LIST_NOT_USED&0xFF;
4555                         fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
4556                     }
4557             }
4558             for(list=0; list<h->list_count; list++){
4559                 for(i=0; i<2; i++){
4560                     unsigned int val;
4561                     if(IS_DIR(mb_type, i, list)){
4562                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
4563                         mx += get_se_golomb(&s->gb);
4564                         my += get_se_golomb(&s->gb);
4565                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
4566
4567                         val= pack16to32(mx,my);
4568                     }else
4569                         val=0;
4570                     fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4);
4571                 }
4572             }
4573         }
4574     }
4575
4576     if(IS_INTER(mb_type))
4577         write_back_motion(h, mb_type);
4578
4579     if(!IS_INTRA16x16(mb_type)){
4580         cbp= get_ue_golomb(&s->gb);
4581         if(cbp > 47){
4582             av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, s->mb_x, s->mb_y);
4583             return -1;
4584         }
4585
4586         if(CHROMA){
4587             if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp[cbp];
4588             else                     cbp= golomb_to_inter_cbp   [cbp];
4589         }else{
4590             if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp_gray[cbp];
4591             else                     cbp= golomb_to_inter_cbp_gray[cbp];
4592         }
4593     }
4594     h->cbp = cbp;
4595
4596     if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){
4597         if(get_bits1(&s->gb)){
4598             mb_type |= MB_TYPE_8x8DCT;
4599             h->cbp_table[mb_xy]= cbp;
4600         }
4601     }
4602     s->current_picture.mb_type[mb_xy]= mb_type;
4603
4604     if(cbp || IS_INTRA16x16(mb_type)){
4605         int i8x8, i4x4, chroma_idx;
4606         int dquant;
4607         GetBitContext *gb= IS_INTRA(mb_type) ? h->intra_gb_ptr : h->inter_gb_ptr;
4608         const uint8_t *scan, *scan8x8, *dc_scan;
4609
4610 //        fill_non_zero_count_cache(h);
4611
4612         if(IS_INTERLACED(mb_type)){
4613             scan8x8= s->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0;
4614             scan= s->qscale ? h->field_scan : h->field_scan_q0;
4615             dc_scan= luma_dc_field_scan;
4616         }else{
4617             scan8x8= s->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0;
4618             scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
4619             dc_scan= luma_dc_zigzag_scan;
4620         }
4621
4622         dquant= get_se_golomb(&s->gb);
4623
4624         if( dquant > 25 || dquant < -26 ){
4625             av_log(h->s.avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, s->mb_x, s->mb_y);
4626             return -1;
4627         }
4628
4629         s->qscale += dquant;
4630         if(((unsigned)s->qscale) > 51){
4631             if(s->qscale<0) s->qscale+= 52;
4632             else            s->qscale-= 52;
4633         }
4634
4635         h->chroma_qp[0]= get_chroma_qp(h, 0, s->qscale);
4636         h->chroma_qp[1]= get_chroma_qp(h, 1, s->qscale);
4637         if(IS_INTRA16x16(mb_type)){
4638             if( decode_residual(h, h->intra_gb_ptr, h->mb, LUMA_DC_BLOCK_INDEX, dc_scan, h->dequant4_coeff[0][s->qscale], 16) < 0){
4639                 return -1; //FIXME continue if partitioned and other return -1 too
4640             }
4641
4642             assert((cbp&15) == 0 || (cbp&15) == 15);
4643
4644             if(cbp&15){
4645                 for(i8x8=0; i8x8<4; i8x8++){
4646                     for(i4x4=0; i4x4<4; i4x4++){
4647                         const int index= i4x4 + 4*i8x8;
4648                         if( decode_residual(h, h->intra_gb_ptr, h->mb + 16*index, index, scan + 1, h->dequant4_coeff[0][s->qscale], 15) < 0 ){
4649                             return -1;
4650                         }
4651                     }
4652                 }
4653             }else{
4654                 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
4655             }
4656         }else{
4657             for(i8x8=0; i8x8<4; i8x8++){
4658                 if(cbp & (1<<i8x8)){
4659                     if(IS_8x8DCT(mb_type)){
4660                         DCTELEM *buf = &h->mb[64*i8x8];
4661                         uint8_t *nnz;
4662                         for(i4x4=0; i4x4<4; i4x4++){
4663                             if( decode_residual(h, gb, buf, i4x4+4*i8x8, scan8x8+16*i4x4,
4664                                                 h->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][s->qscale], 16) <0 )
4665                                 return -1;
4666                         }
4667                         nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
4668                         nnz[0] += nnz[1] + nnz[8] + nnz[9];
4669                     }else{
4670                         for(i4x4=0; i4x4<4; i4x4++){
4671                             const int index= i4x4 + 4*i8x8;
4672
4673                             if( decode_residual(h, gb, h->mb + 16*index, index, scan, h->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][s->qscale], 16) <0 ){
4674                                 return -1;
4675                             }
4676                         }
4677                     }
4678                 }else{
4679                     uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
4680                     nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
4681                 }
4682             }
4683         }
4684
4685         if(cbp&0x30){
4686             for(chroma_idx=0; chroma_idx<2; chroma_idx++)
4687                 if( decode_residual(h, gb, h->mb + 256 + 16*4*chroma_idx, CHROMA_DC_BLOCK_INDEX, chroma_dc_scan, NULL, 4) < 0){
4688                     return -1;
4689                 }
4690         }
4691
4692         if(cbp&0x20){
4693             for(chroma_idx=0; chroma_idx<2; chroma_idx++){
4694                 const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]];
4695                 for(i4x4=0; i4x4<4; i4x4++){
4696                     const int index= 16 + 4*chroma_idx + i4x4;
4697                     if( decode_residual(h, gb, h->mb + 16*index, index, scan + 1, qmul, 15) < 0){
4698                         return -1;
4699                     }
4700                 }
4701             }
4702         }else{
4703             uint8_t * const nnz= &h->non_zero_count_cache[0];
4704             nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
4705             nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
4706         }
4707     }else{
4708         uint8_t * const nnz= &h->non_zero_count_cache[0];
4709         fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1);
4710         nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
4711         nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
4712     }
4713     s->current_picture.qscale_table[mb_xy]= s->qscale;
4714     write_back_non_zero_count(h);
4715
4716     if(MB_MBAFF){
4717         h->ref_count[0] >>= 1;
4718         h->ref_count[1] >>= 1;
4719     }
4720
4721     return 0;
4722 }
4723
4724 static int decode_cabac_field_decoding_flag(H264Context *h) {
4725     MpegEncContext * const s = &h->s;
4726     const int mb_x = s->mb_x;
4727     const int mb_y = s->mb_y & ~1;
4728     const int mba_xy = mb_x - 1 +  mb_y   *s->mb_stride;
4729     const int mbb_xy = mb_x     + (mb_y-2)*s->mb_stride;
4730
4731     unsigned int ctx = 0;
4732
4733     if( h->slice_table[mba_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) ) {
4734         ctx += 1;
4735     }
4736     if( h->slice_table[mbb_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) ) {
4737         ctx += 1;
4738     }
4739
4740     return get_cabac_noinline( &h->cabac, &h->cabac_state[70 + ctx] );
4741 }
4742
4743 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) {
4744     uint8_t *state= &h->cabac_state[ctx_base];
4745     int mb_type;
4746
4747     if(intra_slice){
4748         MpegEncContext * const s = &h->s;
4749         const int mba_xy = h->left_mb_xy[0];
4750         const int mbb_xy = h->top_mb_xy;
4751         int ctx=0;
4752         if( h->slice_table[mba_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mba_xy] ) )
4753             ctx++;
4754         if( h->slice_table[mbb_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mbb_xy] ) )
4755             ctx++;
4756         if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
4757             return 0;   /* I4x4 */
4758         state += 2;
4759     }else{
4760         if( get_cabac_noinline( &h->cabac, &state[0] ) == 0 )
4761             return 0;   /* I4x4 */
4762     }
4763
4764     if( get_cabac_terminate( &h->cabac ) )
4765         return 25;  /* PCM */
4766
4767     mb_type = 1; /* I16x16 */
4768     mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
4769     if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
4770         mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
4771     mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
4772     mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
4773     return mb_type;
4774 }
4775
4776 static int decode_cabac_mb_type( H264Context *h ) {
4777     MpegEncContext * const s = &h->s;
4778
4779     if( h->slice_type_nos == FF_I_TYPE ) {
4780         return decode_cabac_intra_mb_type(h, 3, 1);
4781     } else if( h->slice_type_nos == FF_P_TYPE ) {
4782         if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
4783             /* P-type */
4784             if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
4785                 /* P_L0_D16x16, P_8x8 */
4786                 return 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
4787             } else {
4788                 /* P_L0_D8x16, P_L0_D16x8 */
4789                 return 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
4790             }
4791         } else {
4792             return decode_cabac_intra_mb_type(h, 17, 0) + 5;
4793         }
4794     } else if( h->slice_type_nos == FF_B_TYPE ) {
4795         const int mba_xy = h->left_mb_xy[0];
4796         const int mbb_xy = h->top_mb_xy;
4797         int ctx = 0;
4798         int bits;
4799
4800         if( h->slice_table[mba_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mba_xy] ) )
4801             ctx++;
4802         if( h->slice_table[mbb_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mbb_xy] ) )
4803             ctx++;
4804
4805         if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) )
4806             return 0; /* B_Direct_16x16 */
4807
4808         if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
4809             return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
4810         }
4811
4812         bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
4813         bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
4814         bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
4815         bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
4816         if( bits < 8 )
4817             return bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
4818         else if( bits == 13 ) {
4819             return decode_cabac_intra_mb_type(h, 32, 0) + 23;
4820         } else if( bits == 14 )
4821             return 11; /* B_L1_L0_8x16 */
4822         else if( bits == 15 )
4823             return 22; /* B_8x8 */
4824
4825         bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
4826         return bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
4827     } else {
4828         /* TODO SI/SP frames? */
4829         return -1;
4830     }
4831 }
4832
4833 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
4834     MpegEncContext * const s = &h->s;
4835     int mba_xy, mbb_xy;
4836     int ctx = 0;
4837
4838     if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches?
4839         int mb_xy = mb_x + (mb_y&~1)*s->mb_stride;
4840         mba_xy = mb_xy - 1;
4841         if( (mb_y&1)
4842             && h->slice_table[mba_xy] == h->slice_num
4843             && MB_FIELD == !!IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) )
4844             mba_xy += s->mb_stride;
4845         if( MB_FIELD ){
4846             mbb_xy = mb_xy - s->mb_stride;
4847             if( !(mb_y&1)
4848                 && h->slice_table[mbb_xy] == h->slice_num
4849                 && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) )
4850                 mbb_xy -= s->mb_stride;
4851         }else
4852             mbb_xy = mb_x + (mb_y-1)*s->mb_stride;
4853     }else{
4854         int mb_xy = h->mb_xy;
4855         mba_xy = mb_xy - 1;
4856         mbb_xy = mb_xy - (s->mb_stride << FIELD_PICTURE);
4857     }
4858
4859     if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mba_xy] ))
4860         ctx++;
4861     if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mbb_xy] ))
4862         ctx++;
4863
4864     if( h->slice_type_nos == FF_B_TYPE )
4865         ctx += 13;
4866     return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] );
4867 }
4868
4869 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
4870     int mode = 0;
4871
4872     if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
4873         return pred_mode;
4874
4875     mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
4876     mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
4877     mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
4878
4879     if( mode >= pred_mode )
4880         return mode + 1;
4881     else
4882         return mode;
4883 }
4884
4885 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
4886     const int mba_xy = h->left_mb_xy[0];
4887     const int mbb_xy = h->top_mb_xy;
4888
4889     int ctx = 0;
4890
4891     /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
4892     if( h->slice_table[mba_xy] == h->slice_num && h->chroma_pred_mode_table[mba_xy] != 0 )
4893         ctx++;
4894
4895     if( h->slice_table[mbb_xy] == h->slice_num && h->chroma_pred_mode_table[mbb_xy] != 0 )
4896         ctx++;
4897
4898     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
4899         return 0;
4900
4901     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
4902         return 1;
4903     if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
4904         return 2;
4905     else
4906         return 3;
4907 }
4908
4909 static int decode_cabac_mb_cbp_luma( H264Context *h) {
4910     int cbp_b, cbp_a, ctx, cbp = 0;
4911
4912     cbp_a = h->slice_table[h->left_mb_xy[0]] == h->slice_num ? h->left_cbp : -1;
4913     cbp_b = h->slice_table[h->top_mb_xy]     == h->slice_num ? h->top_cbp  : -1;
4914
4915     ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
4916     cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
4917     ctx = !(cbp   & 0x01) + 2 * !(cbp_b & 0x08);
4918     cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
4919     ctx = !(cbp_a & 0x08) + 2 * !(cbp   & 0x01);
4920     cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
4921     ctx = !(cbp   & 0x04) + 2 * !(cbp   & 0x02);
4922     cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
4923     return cbp;
4924 }
4925 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
4926     int ctx;
4927     int cbp_a, cbp_b;
4928
4929     cbp_a = (h->left_cbp>>4)&0x03;
4930     cbp_b = (h-> top_cbp>>4)&0x03;
4931
4932     ctx = 0;
4933     if( cbp_a > 0 ) ctx++;
4934     if( cbp_b > 0 ) ctx += 2;
4935     if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
4936         return 0;
4937
4938     ctx = 4;
4939     if( cbp_a == 2 ) ctx++;
4940     if( cbp_b == 2 ) ctx += 2;
4941     return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
4942 }
4943 static int decode_cabac_mb_dqp( H264Context *h) {
4944     int   ctx = 0;
4945     int   val = 0;
4946
4947     if( h->last_qscale_diff != 0 )
4948         ctx++;
4949
4950     while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
4951         if( ctx < 2 )
4952             ctx = 2;
4953         else
4954             ctx = 3;
4955         val++;
4956         if(val > 102) //prevent infinite loop
4957             return INT_MIN;
4958     }
4959
4960     if( val&0x01 )
4961         return (val + 1)/2;
4962     else
4963         return -(val + 1)/2;
4964 }
4965 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
4966     if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
4967         return 0;   /* 8x8 */
4968     if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
4969         return 1;   /* 8x4 */
4970     if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
4971         return 2;   /* 4x8 */
4972     return 3;       /* 4x4 */
4973 }
4974 static int decode_cabac_b_mb_sub_type( H264Context *h ) {
4975     int type;
4976     if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
4977         return 0;   /* B_Direct_8x8 */
4978     if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
4979         return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
4980     type = 3;
4981     if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
4982         if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
4983             return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
4984         type += 4;
4985     }
4986     type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
4987     type +=   get_cabac( &h->cabac, &h->cabac_state[39] );
4988     return type;
4989 }
4990
4991 static inline int decode_cabac_mb_transform_size( H264Context *h ) {
4992     return get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
4993 }
4994
4995 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
4996     int refa = h->ref_cache[list][scan8[n] - 1];
4997     int refb = h->ref_cache[list][scan8[n] - 8];
4998     int ref  = 0;
4999     int ctx  = 0;
5000
5001     if( h->slice_type_nos == FF_B_TYPE) {
5002         if( refa > 0 && !h->direct_cache[scan8[n] - 1] )
5003             ctx++;
5004         if( refb > 0 && !h->direct_cache[scan8[n] - 8] )
5005             ctx += 2;
5006     } else {
5007         if( refa > 0 )
5008             ctx++;
5009         if( refb > 0 )
5010             ctx += 2;
5011     }
5012
5013     while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
5014         ref++;
5015         if( ctx < 4 )
5016             ctx = 4;
5017         else
5018             ctx = 5;
5019         if(ref >= 32 /*h->ref_list[list]*/){
5020             av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_ref\n");
5021             return 0; //FIXME we should return -1 and check the return everywhere
5022         }
5023     }
5024     return ref;
5025 }
5026
5027 static int decode_cabac_mb_mvd( H264Context *h, int list, int n, int l ) {
5028     int amvd = abs( h->mvd_cache[list][scan8[n] - 1][l] ) +
5029                abs( h->mvd_cache[list][scan8[n] - 8][l] );
5030     int ctxbase = (l == 0) ? 40 : 47;
5031     int ctx, mvd;
5032
5033     if( amvd < 3 )
5034         ctx = 0;
5035     else if( amvd > 32 )
5036         ctx = 2;
5037     else
5038         ctx = 1;
5039
5040     if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+ctx]))
5041         return 0;
5042
5043     mvd= 1;
5044     ctx= 3;
5045     while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase+ctx] ) ) {
5046         mvd++;
5047         if( ctx < 6 )
5048             ctx++;
5049     }
5050
5051     if( mvd >= 9 ) {
5052         int k = 3;
5053         while( get_cabac_bypass( &h->cabac ) ) {
5054             mvd += 1 << k;
5055             k++;
5056             if(k>24){
5057                 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
5058                 return INT_MIN;
5059             }
5060         }
5061         while( k-- ) {
5062             if( get_cabac_bypass( &h->cabac ) )
5063                 mvd += 1 << k;
5064         }
5065     }
5066     return get_cabac_bypass_sign( &h->cabac, -mvd );
5067 }
5068
5069 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int is_dc ) {
5070     int nza, nzb;
5071     int ctx = 0;
5072
5073     if( is_dc ) {
5074         if( cat == 0 ) {
5075             nza = h->left_cbp&0x100;
5076             nzb = h-> top_cbp&0x100;
5077         } else {
5078             nza = (h->left_cbp>>(6+idx))&0x01;
5079             nzb = (h-> top_cbp>>(6+idx))&0x01;
5080         }
5081     } else {
5082         if( cat == 4 ) {
5083             nza = h->non_zero_count_cache[scan8[16+idx] - 1];
5084             nzb = h->non_zero_count_cache[scan8[16+idx] - 8];
5085         } else {
5086             assert(cat == 1 || cat == 2);
5087             nza = h->non_zero_count_cache[scan8[idx] - 1];
5088             nzb = h->non_zero_count_cache[scan8[idx] - 8];
5089         }
5090     }
5091
5092     if( nza > 0 )
5093         ctx++;
5094
5095     if( nzb > 0 )
5096         ctx += 2;
5097
5098     return ctx + 4 * cat;
5099 }
5100
5101 DECLARE_ASM_CONST(1, uint8_t, last_coeff_flag_offset_8x8[63]) = {
5102     0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5103     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
5104     3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
5105     5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
5106 };
5107
5108 static av_always_inline void decode_cabac_residual_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff, int is_dc ) {
5109     static const int significant_coeff_flag_offset[2][6] = {
5110       { 105+0, 105+15, 105+29, 105+44, 105+47, 402 },
5111       { 277+0, 277+15, 277+29, 277+44, 277+47, 436 }
5112     };
5113     static const int last_coeff_flag_offset[2][6] = {
5114       { 166+0, 166+15, 166+29, 166+44, 166+47, 417 },
5115       { 338+0, 338+15, 338+29, 338+44, 338+47, 451 }
5116     };
5117     static const int coeff_abs_level_m1_offset[6] = {
5118         227+0, 227+10, 227+20, 227+30, 227+39, 426
5119     };
5120     static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
5121       { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
5122         4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
5123         7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
5124        12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
5125       { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
5126         6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
5127         9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
5128         9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
5129     };
5130     /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
5131      * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
5132      * map node ctx => cabac ctx for level=1 */
5133     static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
5134     /* map node ctx => cabac ctx for level>1 */
5135     static const uint8_t coeff_abs_levelgt1_ctx[8] = { 5, 5, 5, 5, 6, 7, 8, 9 };
5136     static const uint8_t coeff_abs_level_transition[2][8] = {
5137     /* update node ctx after decoding a level=1 */
5138         { 1, 2, 3, 3, 4, 5, 6, 7 },
5139     /* update node ctx after decoding a level>1 */
5140         { 4, 4, 4, 4, 5, 6, 7, 7 }
5141     };
5142
5143     int index[64];
5144
5145     int av_unused last;
5146     int coeff_count = 0;
5147     int node_ctx = 0;
5148
5149     uint8_t *significant_coeff_ctx_base;
5150     uint8_t *last_coeff_ctx_base;
5151     uint8_t *abs_level_m1_ctx_base;
5152
5153 #ifndef ARCH_X86
5154 #define CABAC_ON_STACK
5155 #endif
5156 #ifdef CABAC_ON_STACK
5157 #define CC &cc
5158     CABACContext cc;
5159     cc.range     = h->cabac.range;
5160     cc.low       = h->cabac.low;
5161     cc.bytestream= h->cabac.bytestream;
5162 #else
5163 #define CC &h->cabac
5164 #endif
5165
5166
5167     /* cat: 0-> DC 16x16  n = 0
5168      *      1-> AC 16x16  n = luma4x4idx
5169      *      2-> Luma4x4   n = luma4x4idx
5170      *      3-> DC Chroma n = iCbCr
5171      *      4-> AC Chroma n = 4 * iCbCr + chroma4x4idx
5172      *      5-> Luma8x8   n = 4 * luma8x8idx
5173      */
5174
5175     /* read coded block flag */
5176     if( is_dc || cat != 5 ) {
5177         if( get_cabac( CC, &h->cabac_state[85 + get_cabac_cbf_ctx( h, cat, n, is_dc ) ] ) == 0 ) {
5178             if( !is_dc ) {
5179                 if( cat == 4 )
5180                     h->non_zero_count_cache[scan8[16+n]] = 0;
5181                 else
5182                     h->non_zero_count_cache[scan8[n]] = 0;
5183             }
5184
5185 #ifdef CABAC_ON_STACK
5186             h->cabac.range     = cc.range     ;
5187             h->cabac.low       = cc.low       ;
5188             h->cabac.bytestream= cc.bytestream;
5189 #endif
5190             return;
5191         }
5192     }
5193
5194     significant_coeff_ctx_base = h->cabac_state
5195         + significant_coeff_flag_offset[MB_FIELD][cat];
5196     last_coeff_ctx_base = h->cabac_state
5197         + last_coeff_flag_offset[MB_FIELD][cat];
5198     abs_level_m1_ctx_base = h->cabac_state
5199         + coeff_abs_level_m1_offset[cat];
5200
5201     if( !is_dc && cat == 5 ) {
5202 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
5203         for(last= 0; last < coefs; last++) { \
5204             uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
5205             if( get_cabac( CC, sig_ctx )) { \
5206                 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
5207                 index[coeff_count++] = last; \
5208                 if( get_cabac( CC, last_ctx ) ) { \
5209                     last= max_coeff; \
5210                     break; \
5211                 } \
5212             } \
5213         }\
5214         if( last == max_coeff -1 ) {\
5215             index[coeff_count++] = last;\
5216         }
5217         const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
5218 #if defined(ARCH_X86) && defined(HAVE_7REGS) && defined(HAVE_EBX_AVAILABLE) && !defined(BROKEN_RELOCATIONS)
5219         coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, sig_off);
5220     } else {
5221         coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index);
5222 #else
5223         DECODE_SIGNIFICANCE( 63, sig_off[last], last_coeff_flag_offset_8x8[last] );
5224     } else {
5225         DECODE_SIGNIFICANCE( max_coeff - 1, last, last );
5226 #endif
5227     }
5228     assert(coeff_count > 0);
5229
5230     if( is_dc ) {
5231         if( cat == 0 )
5232             h->cbp_table[h->mb_xy] |= 0x100;
5233         else
5234             h->cbp_table[h->mb_xy] |= 0x40 << n;
5235     } else {
5236         if( cat == 5 )
5237             fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
5238         else if( cat == 4 )
5239             h->non_zero_count_cache[scan8[16+n]] = coeff_count;
5240         else {
5241             assert( cat == 1 || cat == 2 );
5242             h->non_zero_count_cache[scan8[n]] = coeff_count;
5243         }
5244     }
5245
5246     do {
5247         uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base;
5248
5249         int j= scantable[index[--coeff_count]];
5250
5251         if( get_cabac( CC, ctx ) == 0 ) {
5252             node_ctx = coeff_abs_level_transition[0][node_ctx];
5253             if( is_dc ) {
5254                 block[j] = get_cabac_bypass_sign( CC, -1);
5255             }else{
5256                 block[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6;
5257             }
5258         } else {
5259             int coeff_abs = 2;
5260             ctx = coeff_abs_levelgt1_ctx[node_ctx] + abs_level_m1_ctx_base;
5261             node_ctx = coeff_abs_level_transition[1][node_ctx];
5262
5263             while( coeff_abs < 15 && get_cabac( CC, ctx ) ) {
5264                 coeff_abs++;
5265             }
5266
5267             if( coeff_abs >= 15 ) {
5268                 int j = 0;
5269                 while( get_cabac_bypass( CC ) ) {
5270                     j++;
5271                 }
5272
5273                 coeff_abs=1;
5274                 while( j-- ) {
5275                     coeff_abs += coeff_abs + get_cabac_bypass( CC );
5276                 }
5277                 coeff_abs+= 14;
5278             }
5279
5280             if( is_dc ) {
5281                 block[j] = get_cabac_bypass_sign( CC, -coeff_abs );
5282             }else{
5283                 block[j] = (get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32) >> 6;
5284             }
5285         }
5286     } while( coeff_count );
5287 #ifdef CABAC_ON_STACK
5288             h->cabac.range     = cc.range     ;
5289             h->cabac.low       = cc.low       ;
5290             h->cabac.bytestream= cc.bytestream;
5291 #endif
5292
5293 }
5294
5295 #ifndef CONFIG_SMALL
5296 static void decode_cabac_residual_dc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
5297     decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 1);
5298 }
5299
5300 static void decode_cabac_residual_nondc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
5301     decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 0);
5302 }
5303 #endif
5304
5305 static void decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
5306 #ifdef CONFIG_SMALL
5307     decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, cat == 0 || cat == 3);
5308 #else
5309     if( cat == 0 || cat == 3 ) decode_cabac_residual_dc(h, block, cat, n, scantable, qmul, max_coeff);
5310     else decode_cabac_residual_nondc(h, block, cat, n, scantable, qmul, max_coeff);
5311 #endif
5312 }
5313
5314 static inline void compute_mb_neighbors(H264Context *h)
5315 {
5316     MpegEncContext * const s = &h->s;
5317     const int mb_xy  = h->mb_xy;
5318     h->top_mb_xy     = mb_xy - s->mb_stride;
5319     h->left_mb_xy[0] = mb_xy - 1;
5320     if(FRAME_MBAFF){
5321         const int pair_xy          = s->mb_x     + (s->mb_y & ~1)*s->mb_stride;
5322         const int top_pair_xy      = pair_xy     - s->mb_stride;
5323         const int top_mb_frame_flag      = !IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]);
5324         const int left_mb_frame_flag = !IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]);
5325         const int curr_mb_frame_flag = !MB_FIELD;
5326         const int bottom = (s->mb_y & 1);
5327         if (bottom
5328                 ? !curr_mb_frame_flag // bottom macroblock
5329                 : (!curr_mb_frame_flag && !top_mb_frame_flag) // top macroblock
5330                 ) {
5331             h->top_mb_xy -= s->mb_stride;
5332         }
5333         if (left_mb_frame_flag != curr_mb_frame_flag) {
5334             h->left_mb_xy[0] = pair_xy - 1;
5335         }
5336     } else if (FIELD_PICTURE) {
5337         h->top_mb_xy -= s->mb_stride;
5338     }
5339     return;
5340 }
5341
5342 /**
5343  * decodes a macroblock
5344  * @returns 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
5345  */
5346 static int decode_mb_cabac(H264Context *h) {
5347     MpegEncContext * const s = &h->s;
5348     int mb_xy;
5349     int mb_type, partition_count, cbp = 0;
5350     int dct8x8_allowed= h->pps.transform_8x8_mode;
5351
5352     mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
5353
5354     s->dsp.clear_blocks(h->mb); //FIXME avoid if already clear (move after skip handlong?)
5355
5356     tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
5357     if( h->slice_type_nos != FF_I_TYPE ) {
5358         int skip;
5359         /* a skipped mb needs the aff flag from the following mb */
5360         if( FRAME_MBAFF && s->mb_x==0 && (s->mb_y&1)==0 )
5361             predict_field_decoding_flag(h);
5362         if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped )
5363             skip = h->next_mb_skipped;
5364         else
5365             skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y );
5366         /* read skip flags */
5367         if( skip ) {
5368             if( FRAME_MBAFF && (s->mb_y&1)==0 ){
5369                 s->current_picture.mb_type[mb_xy] = MB_TYPE_SKIP;
5370                 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 );
5371                 if(h->next_mb_skipped)
5372                     predict_field_decoding_flag(h);
5373                 else
5374                     h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
5375             }
5376
5377             decode_mb_skip(h);
5378
5379             h->cbp_table[mb_xy] = 0;
5380             h->chroma_pred_mode_table[mb_xy] = 0;
5381             h->last_qscale_diff = 0;
5382
5383             return 0;
5384
5385         }
5386     }
5387     if(FRAME_MBAFF){
5388         if( (s->mb_y&1) == 0 )
5389             h->mb_mbaff =
5390             h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
5391     }
5392
5393     h->prev_mb_skipped = 0;
5394
5395     compute_mb_neighbors(h);
5396     if( ( mb_type = decode_cabac_mb_type( h ) ) < 0 ) {
5397         av_log( h->s.avctx, AV_LOG_ERROR, "decode_cabac_mb_type failed\n" );
5398         return -1;
5399     }
5400
5401     if( h->slice_type_nos == FF_B_TYPE ) {
5402         if( mb_type < 23 ){
5403             partition_count= b_mb_type_info[mb_type].partition_count;
5404             mb_type=         b_mb_type_info[mb_type].type;
5405         }else{
5406             mb_type -= 23;
5407             goto decode_intra_mb;
5408         }
5409     } else if( h->slice_type_nos == FF_P_TYPE ) {
5410         if( mb_type < 5) {
5411             partition_count= p_mb_type_info[mb_type].partition_count;
5412             mb_type=         p_mb_type_info[mb_type].type;
5413         } else {
5414             mb_type -= 5;
5415             goto decode_intra_mb;
5416         }
5417     } else {
5418         if(h->slice_type == FF_SI_TYPE && mb_type)
5419             mb_type--;
5420         assert(h->slice_type_nos == FF_I_TYPE);
5421 decode_intra_mb:
5422         partition_count = 0;
5423         cbp= i_mb_type_info[mb_type].cbp;
5424         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
5425         mb_type= i_mb_type_info[mb_type].type;
5426     }
5427     if(MB_FIELD)
5428         mb_type |= MB_TYPE_INTERLACED;
5429
5430     h->slice_table[ mb_xy ]= h->slice_num;
5431
5432     if(IS_INTRA_PCM(mb_type)) {
5433         const uint8_t *ptr;
5434
5435         // We assume these blocks are very rare so we do not optimize it.
5436         // FIXME The two following lines get the bitstream position in the cabac
5437         // decode, I think it should be done by a function in cabac.h (or cabac.c).
5438         ptr= h->cabac.bytestream;
5439         if(h->cabac.low&0x1) ptr--;
5440         if(CABAC_BITS==16){
5441             if(h->cabac.low&0x1FF) ptr--;
5442         }
5443
5444         // The pixels are stored in the same order as levels in h->mb array.
5445         memcpy(h->mb, ptr, 256); ptr+=256;
5446         if(CHROMA){
5447             memcpy(h->mb+128, ptr, 128); ptr+=128;
5448         }
5449
5450         ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
5451
5452         // All blocks are present
5453         h->cbp_table[mb_xy] = 0x1ef;
5454         h->chroma_pred_mode_table[mb_xy] = 0;
5455         // In deblocking, the quantizer is 0
5456         s->current_picture.qscale_table[mb_xy]= 0;
5457         // All coeffs are present
5458         memset(h->non_zero_count[mb_xy], 16, 16);
5459         s->current_picture.mb_type[mb_xy]= mb_type;
5460         h->last_qscale_diff = 0;
5461         return 0;
5462     }
5463
5464     if(MB_MBAFF){
5465         h->ref_count[0] <<= 1;
5466         h->ref_count[1] <<= 1;
5467     }
5468
5469     fill_caches(h, mb_type, 0);
5470
5471     if( IS_INTRA( mb_type ) ) {
5472         int i, pred_mode;
5473         if( IS_INTRA4x4( mb_type ) ) {
5474             if( dct8x8_allowed && decode_cabac_mb_transform_size( h ) ) {
5475                 mb_type |= MB_TYPE_8x8DCT;
5476                 for( i = 0; i < 16; i+=4 ) {
5477                     int pred = pred_intra_mode( h, i );
5478                     int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
5479                     fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
5480                 }
5481             } else {
5482                 for( i = 0; i < 16; i++ ) {
5483                     int pred = pred_intra_mode( h, i );
5484                     h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
5485
5486                 //av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%d\n", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] );
5487                 }
5488             }
5489             write_back_intra_pred_mode(h);
5490             if( check_intra4x4_pred_mode(h) < 0 ) return -1;
5491         } else {
5492             h->intra16x16_pred_mode= check_intra_pred_mode( h, h->intra16x16_pred_mode );
5493             if( h->intra16x16_pred_mode < 0 ) return -1;
5494         }
5495         if(CHROMA){
5496             h->chroma_pred_mode_table[mb_xy] =
5497             pred_mode                        = decode_cabac_mb_chroma_pre_mode( h );
5498
5499             pred_mode= check_intra_pred_mode( h, pred_mode );
5500             if( pred_mode < 0 ) return -1;
5501             h->chroma_pred_mode= pred_mode;
5502         }
5503     } else if( partition_count == 4 ) {
5504         int i, j, sub_partition_count[4], list, ref[2][4];
5505
5506         if( h->slice_type_nos == FF_B_TYPE ) {
5507             for( i = 0; i < 4; i++ ) {
5508                 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
5509                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
5510                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
5511             }
5512             if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
5513                           h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
5514                 pred_direct_motion(h, &mb_type);
5515                 h->ref_cache[0][scan8[4]] =
5516                 h->ref_cache[1][scan8[4]] =
5517                 h->ref_cache[0][scan8[12]] =
5518                 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
5519                 if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) {
5520                     for( i = 0; i < 4; i++ )
5521                         if( IS_DIRECT(h->sub_mb_type[i]) )
5522                             fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, 1, 1 );
5523                 }
5524             }
5525         } else {
5526             for( i = 0; i < 4; i++ ) {
5527                 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
5528                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
5529                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
5530             }
5531         }
5532
5533         for( list = 0; list < h->list_count; list++ ) {
5534                 for( i = 0; i < 4; i++ ) {
5535                     if(IS_DIRECT(h->sub_mb_type[i])) continue;
5536                     if(IS_DIR(h->sub_mb_type[i], 0, list)){
5537                         if( h->ref_count[list] > 1 )
5538                             ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
5539                         else
5540                             ref[list][i] = 0;
5541                     } else {
5542                         ref[list][i] = -1;
5543                     }
5544                                                        h->ref_cache[list][ scan8[4*i]+1 ]=
5545                     h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
5546                 }
5547         }
5548
5549         if(dct8x8_allowed)
5550             dct8x8_allowed = get_dct8x8_allowed(h);
5551
5552         for(list=0; list<h->list_count; list++){
5553             for(i=0; i<4; i++){
5554                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ];
5555                 if(IS_DIRECT(h->sub_mb_type[i])){
5556                     fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 4);
5557                     continue;
5558                 }
5559
5560                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
5561                     const int sub_mb_type= h->sub_mb_type[i];
5562                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
5563                     for(j=0; j<sub_partition_count[i]; j++){
5564                         int mpx, mpy;
5565                         int mx, my;
5566                         const int index= 4*i + block_width*j;
5567                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
5568                         int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
5569                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mpx, &mpy);
5570
5571                         mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 );
5572                         my = mpy + decode_cabac_mb_mvd( h, list, index, 1 );
5573                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
5574
5575                         if(IS_SUB_8X8(sub_mb_type)){
5576                             mv_cache[ 1 ][0]=
5577                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
5578                             mv_cache[ 1 ][1]=
5579                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
5580
5581                             mvd_cache[ 1 ][0]=
5582                             mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx;
5583                             mvd_cache[ 1 ][1]=
5584                             mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy;
5585                         }else if(IS_SUB_8X4(sub_mb_type)){
5586                             mv_cache[ 1 ][0]= mx;
5587                             mv_cache[ 1 ][1]= my;
5588
5589                             mvd_cache[ 1 ][0]= mx - mpx;
5590                             mvd_cache[ 1 ][1]= my - mpy;
5591                         }else if(IS_SUB_4X8(sub_mb_type)){
5592                             mv_cache[ 8 ][0]= mx;
5593                             mv_cache[ 8 ][1]= my;
5594
5595                             mvd_cache[ 8 ][0]= mx - mpx;
5596                             mvd_cache[ 8 ][1]= my - mpy;
5597                         }
5598                         mv_cache[ 0 ][0]= mx;
5599                         mv_cache[ 0 ][1]= my;
5600
5601                         mvd_cache[ 0 ][0]= mx - mpx;
5602                         mvd_cache[ 0 ][1]= my - mpy;
5603                     }
5604                 }else{
5605                     uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
5606                     uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][0];
5607                     p[0] = p[1] = p[8] = p[9] = 0;
5608                     pd[0]= pd[1]= pd[8]= pd[9]= 0;
5609                 }
5610             }
5611         }
5612     } else if( IS_DIRECT(mb_type) ) {
5613         pred_direct_motion(h, &mb_type);
5614         fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4);
5615         fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4);
5616         dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
5617     } else {
5618         int list, mx, my, i, mpx, mpy;
5619         if(IS_16X16(mb_type)){
5620             for(list=0; list<h->list_count; list++){
5621                 if(IS_DIR(mb_type, 0, list)){
5622                         const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0;
5623                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
5624                 }else
5625                     fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); //FIXME factorize and the other fill_rect below too
5626             }
5627             for(list=0; list<h->list_count; list++){
5628                 if(IS_DIR(mb_type, 0, list)){
5629                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy);
5630
5631                     mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 );
5632                     my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 );
5633                     tprintf(s->avctx, "final mv:%d %d\n", mx, my);
5634
5635                     fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
5636                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
5637                 }else
5638                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4);
5639             }
5640         }
5641         else if(IS_16X8(mb_type)){
5642             for(list=0; list<h->list_count; list++){
5643                     for(i=0; i<2; i++){
5644                         if(IS_DIR(mb_type, i, list)){
5645                             const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 8*i ) : 0;
5646                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
5647                         }else
5648                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
5649                     }
5650             }
5651             for(list=0; list<h->list_count; list++){
5652                 for(i=0; i<2; i++){
5653                     if(IS_DIR(mb_type, i, list)){
5654                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mpx, &mpy);
5655                         mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 );
5656                         my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 );
5657                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
5658
5659                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4);
5660                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
5661                     }else{
5662                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
5663                         fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
5664                     }
5665                 }
5666             }
5667         }else{
5668             assert(IS_8X16(mb_type));
5669             for(list=0; list<h->list_count; list++){
5670                     for(i=0; i<2; i++){
5671                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
5672                             const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 4*i ) : 0;
5673                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
5674                         }else
5675                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
5676                     }
5677             }
5678             for(list=0; list<h->list_count; list++){
5679                 for(i=0; i<2; i++){
5680                     if(IS_DIR(mb_type, i, list)){
5681                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mpx, &mpy);
5682                         mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 );
5683                         my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 );
5684
5685                         tprintf(s->avctx, "final mv:%d %d\n", mx, my);
5686                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
5687                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
5688                     }else{
5689                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
5690                         fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
5691                     }
5692                 }
5693             }
5694         }
5695     }
5696
5697    if( IS_INTER( mb_type ) ) {
5698         h->chroma_pred_mode_table[mb_xy] = 0;
5699         write_back_motion( h, mb_type );
5700    }
5701
5702     if( !IS_INTRA16x16( mb_type ) ) {
5703         cbp  = decode_cabac_mb_cbp_luma( h );
5704         if(CHROMA)
5705             cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
5706     }
5707
5708     h->cbp_table[mb_xy] = h->cbp = cbp;
5709
5710     if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
5711         if( decode_cabac_mb_transform_size( h ) )
5712             mb_type |= MB_TYPE_8x8DCT;
5713     }
5714     s->current_picture.mb_type[mb_xy]= mb_type;
5715
5716     if( cbp || IS_INTRA16x16( mb_type ) ) {
5717         const uint8_t *scan, *scan8x8, *dc_scan;
5718         const uint32_t *qmul;
5719         int dqp;
5720
5721         if(IS_INTERLACED(mb_type)){
5722             scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
5723             scan= s->qscale ? h->field_scan : h->field_scan_q0;
5724             dc_scan= luma_dc_field_scan;
5725         }else{
5726             scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
5727             scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
5728             dc_scan= luma_dc_zigzag_scan;
5729         }
5730
5731         h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h );
5732         if( dqp == INT_MIN ){
5733             av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
5734             return -1;
5735         }
5736         s->qscale += dqp;
5737         if(((unsigned)s->qscale) > 51){
5738             if(s->qscale<0) s->qscale+= 52;
5739             else            s->qscale-= 52;
5740         }
5741         h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
5742         h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
5743
5744         if( IS_INTRA16x16( mb_type ) ) {
5745             int i;
5746             //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
5747             decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16);
5748
5749             if( cbp&15 ) {
5750                 qmul = h->dequant4_coeff[0][s->qscale];
5751                 for( i = 0; i < 16; i++ ) {
5752                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", i );
5753                     decode_cabac_residual(h, h->mb + 16*i, 1, i, scan + 1, qmul, 15);
5754                 }
5755             } else {
5756                 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
5757             }
5758         } else {
5759             int i8x8, i4x4;
5760             for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
5761                 if( cbp & (1<<i8x8) ) {
5762                     if( IS_8x8DCT(mb_type) ) {
5763                         decode_cabac_residual(h, h->mb + 64*i8x8, 5, 4*i8x8,
5764                             scan8x8, h->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][s->qscale], 64);
5765                     } else {
5766                         qmul = h->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][s->qscale];
5767                         for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
5768                             const int index = 4*i8x8 + i4x4;
5769                             //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %d\n", index );
5770 //START_TIMER
5771                             decode_cabac_residual(h, h->mb + 16*index, 2, index, scan, qmul, 16);
5772 //STOP_TIMER("decode_residual")
5773                         }
5774                     }
5775                 } else {
5776                     uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
5777                     nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
5778                 }
5779             }
5780         }
5781
5782         if( cbp&0x30 ){
5783             int c;
5784             for( c = 0; c < 2; c++ ) {
5785                 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
5786                 decode_cabac_residual(h, h->mb + 256 + 16*4*c, 3, c, chroma_dc_scan, NULL, 4);
5787             }
5788         }
5789
5790         if( cbp&0x20 ) {
5791             int c, i;
5792             for( c = 0; c < 2; c++ ) {
5793                 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
5794                 for( i = 0; i < 4; i++ ) {
5795                     const int index = 16 + 4 * c + i;
5796                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 );
5797                     decode_cabac_residual(h, h->mb + 16*index, 4, index - 16, scan + 1, qmul, 15);
5798                 }
5799             }
5800         } else {
5801             uint8_t * const nnz= &h->non_zero_count_cache[0];
5802             nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
5803             nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
5804         }
5805     } else {
5806         uint8_t * const nnz= &h->non_zero_count_cache[0];
5807         fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1);
5808         nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
5809         nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
5810         h->last_qscale_diff = 0;
5811     }
5812
5813     s->current_picture.qscale_table[mb_xy]= s->qscale;
5814     write_back_non_zero_count(h);
5815
5816     if(MB_MBAFF){
5817         h->ref_count[0] >>= 1;
5818         h->ref_count[1] >>= 1;
5819     }
5820
5821     return 0;
5822 }
5823
5824
5825 static void filter_mb_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
5826     int i, d;
5827     const int index_a = qp + h->slice_alpha_c0_offset;
5828     const int alpha = (alpha_table+52)[index_a];
5829     const int beta  = (beta_table+52)[qp + h->slice_beta_offset];
5830
5831     if( bS[0] < 4 ) {
5832         int8_t tc[4];
5833         for(i=0; i<4; i++)
5834             tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
5835         h->s.dsp.h264_h_loop_filter_luma(pix, stride, alpha, beta, tc);
5836     } else {
5837         /* 16px edge length, because bS=4 is triggered by being at
5838          * the edge of an intra MB, so all 4 bS are the same */
5839             for( d = 0; d < 16; d++ ) {
5840                 const int p0 = pix[-1];
5841                 const int p1 = pix[-2];
5842                 const int p2 = pix[-3];
5843
5844                 const int q0 = pix[0];
5845                 const int q1 = pix[1];
5846                 const int q2 = pix[2];
5847
5848                 if( FFABS( p0 - q0 ) < alpha &&
5849                     FFABS( p1 - p0 ) < beta &&
5850                     FFABS( q1 - q0 ) < beta ) {
5851
5852                     if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
5853                         if( FFABS( p2 - p0 ) < beta)
5854                         {
5855                             const int p3 = pix[-4];
5856                             /* p0', p1', p2' */
5857                             pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
5858                             pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
5859                             pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
5860                         } else {
5861                             /* p0' */
5862                             pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
5863                         }
5864                         if( FFABS( q2 - q0 ) < beta)
5865                         {
5866                             const int q3 = pix[3];
5867                             /* q0', q1', q2' */
5868                             pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
5869                             pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
5870                             pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
5871                         } else {
5872                             /* q0' */
5873                             pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
5874                         }
5875                     }else{
5876                         /* p0', q0' */
5877                         pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
5878                         pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
5879                     }
5880                     tprintf(h->s.avctx, "filter_mb_edgev i:%d d:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, p2, p1, p0, q0, q1, q2, pix[-2], pix[-1], pix[0], pix[1]);
5881                 }
5882                 pix += stride;
5883             }
5884     }
5885 }
5886 static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
5887     int i;
5888     const int index_a = qp + h->slice_alpha_c0_offset;
5889     const int alpha = (alpha_table+52)[index_a];
5890     const int beta  = (beta_table+52)[qp + h->slice_beta_offset];
5891
5892     if( bS[0] < 4 ) {
5893         int8_t tc[4];
5894         for(i=0; i<4; i++)
5895             tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0;
5896         h->s.dsp.h264_h_loop_filter_chroma(pix, stride, alpha, beta, tc);
5897     } else {
5898         h->s.dsp.h264_h_loop_filter_chroma_intra(pix, stride, alpha, beta);
5899     }
5900 }
5901
5902 static void filter_mb_mbaff_edgev( H264Context *h, uint8_t *pix, int stride, int16_t bS[8], int qp[2] ) {
5903     int i;
5904     for( i = 0; i < 16; i++, pix += stride) {
5905         int index_a;
5906         int alpha;
5907         int beta;
5908
5909         int qp_index;
5910         int bS_index = (i >> 1);
5911         if (!MB_FIELD) {
5912             bS_index &= ~1;
5913             bS_index |= (i & 1);
5914         }
5915
5916         if( bS[bS_index] == 0 ) {
5917             continue;
5918         }
5919
5920         qp_index = MB_FIELD ? (i >> 3) : (i & 1);
5921         index_a = qp[qp_index] + h->slice_alpha_c0_offset;
5922         alpha = (alpha_table+52)[index_a];
5923         beta  = (beta_table+52)[qp[qp_index] + h->slice_beta_offset];
5924
5925         if( bS[bS_index] < 4 ) {
5926             const int tc0 = (tc0_table+52)[index_a][bS[bS_index] - 1];
5927             const int p0 = pix[-1];
5928             const int p1 = pix[-2];
5929             const int p2 = pix[-3];
5930             const int q0 = pix[0];
5931             const int q1 = pix[1];
5932             const int q2 = pix[2];
5933
5934             if( FFABS( p0 - q0 ) < alpha &&
5935                 FFABS( p1 - p0 ) < beta &&
5936                 FFABS( q1 - q0 ) < beta ) {
5937                 int tc = tc0;
5938                 int i_delta;
5939
5940                 if( FFABS( p2 - p0 ) < beta ) {
5941                     pix[-2] = p1 + av_clip( ( p2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( p1 << 1 ) ) >> 1, -tc0, tc0 );
5942                     tc++;
5943                 }
5944                 if( FFABS( q2 - q0 ) < beta ) {
5945                     pix[1] = q1 + av_clip( ( q2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( q1 << 1 ) ) >> 1, -tc0, tc0 );
5946                     tc++;
5947                 }
5948
5949                 i_delta = av_clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
5950                 pix[-1] = av_clip_uint8( p0 + i_delta );    /* p0' */
5951                 pix[0]  = av_clip_uint8( q0 - i_delta );    /* q0' */
5952                 tprintf(h->s.avctx, "filter_mb_mbaff_edgev i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d, tc:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, tc, bS[bS_index], pix[-3], p1, p0, q0, q1, pix[2], p1, pix[-1], pix[0], q1);
5953             }
5954         }else{
5955             const int p0 = pix[-1];
5956             const int p1 = pix[-2];
5957             const int p2 = pix[-3];
5958
5959             const int q0 = pix[0];
5960             const int q1 = pix[1];
5961             const int q2 = pix[2];
5962
5963             if( FFABS( p0 - q0 ) < alpha &&
5964                 FFABS( p1 - p0 ) < beta &&
5965                 FFABS( q1 - q0 ) < beta ) {
5966
5967                 if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
5968                     if( FFABS( p2 - p0 ) < beta)
5969                     {
5970                         const int p3 = pix[-4];
5971                         /* p0', p1', p2' */
5972                         pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
5973                         pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
5974                         pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
5975                     } else {
5976                         /* p0' */
5977                         pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
5978                     }
5979                     if( FFABS( q2 - q0 ) < beta)
5980                     {
5981                         const int q3 = pix[3];
5982                         /* q0', q1', q2' */
5983                         pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
5984                         pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
5985                         pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
5986                     } else {
5987                         /* q0' */
5988                         pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
5989                     }
5990                 }else{
5991                     /* p0', q0' */
5992                     pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
5993                     pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
5994                 }
5995                 tprintf(h->s.avctx, "filter_mb_mbaff_edgev i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, p2, p1, p0, q0, q1, q2, pix[-3], pix[-2], pix[-1], pix[0], pix[1], pix[2]);
5996             }
5997         }
5998     }
5999 }
6000 static void filter_mb_mbaff_edgecv( H264Context *h, uint8_t *pix, int stride, int16_t bS[8], int qp[2] ) {
6001     int i;
6002     for( i = 0; i < 8; i++, pix += stride) {
6003         int index_a;
6004         int alpha;
6005         int beta;
6006
6007         int qp_index;
6008         int bS_index = i;
6009
6010         if( bS[bS_index] == 0 ) {
6011             continue;
6012         }
6013
6014         qp_index = MB_FIELD ? (i >> 2) : (i & 1);
6015         index_a = qp[qp_index] + h->slice_alpha_c0_offset;
6016         alpha = (alpha_table+52)[index_a];
6017         beta  = (beta_table+52)[qp[qp_index] + h->slice_beta_offset];
6018
6019         if( bS[bS_index] < 4 ) {
6020             const int tc = (tc0_table+52)[index_a][bS[bS_index] - 1] + 1;
6021             const int p0 = pix[-1];
6022             const int p1 = pix[-2];
6023             const int q0 = pix[0];
6024             const int q1 = pix[1];
6025
6026             if( FFABS( p0 - q0 ) < alpha &&
6027                 FFABS( p1 - p0 ) < beta &&
6028                 FFABS( q1 - q0 ) < beta ) {
6029                 const int i_delta = av_clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
6030
6031                 pix[-1] = av_clip_uint8( p0 + i_delta );    /* p0' */
6032                 pix[0]  = av_clip_uint8( q0 - i_delta );    /* q0' */
6033                 tprintf(h->s.avctx, "filter_mb_mbaff_edgecv i:%d, qp:%d, indexA:%d, alpha:%d, beta:%d, tc:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, qp[qp_index], index_a, alpha, beta, tc, bS[bS_index], pix[-3], p1, p0, q0, q1, pix[2], p1, pix[-1], pix[0], q1);
6034             }
6035         }else{
6036             const int p0 = pix[-1];
6037             const int p1 = pix[-2];
6038             const int q0 = pix[0];
6039             const int q1 = pix[1];
6040
6041             if( FFABS( p0 - q0 ) < alpha &&
6042                 FFABS( p1 - p0 ) < beta &&
6043                 FFABS( q1 - q0 ) < beta ) {
6044
6045                 pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;   /* p0' */
6046                 pix[0]  = ( 2*q1 + q0 + p1 + 2 ) >> 2;   /* q0' */
6047                 tprintf(h->s.avctx, "filter_mb_mbaff_edgecv i:%d\n# bS:4 -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x, %02x, %02x]\n", i, pix[-3], p1, p0, q0, q1, pix[2], pix[-3], pix[-2], pix[-1], pix[0], pix[1], pix[2]);
6048             }
6049         }
6050     }
6051 }
6052
6053 static void filter_mb_edgeh( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
6054     int i, d;
6055     const int index_a = qp + h->slice_alpha_c0_offset;
6056     const int alpha = (alpha_table+52)[index_a];
6057     const int beta  = (beta_table+52)[qp + h->slice_beta_offset];
6058     const int pix_next  = stride;
6059
6060     if( bS[0] < 4 ) {
6061         int8_t tc[4];
6062         for(i=0; i<4; i++)
6063             tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] : -1;
6064         h->s.dsp.h264_v_loop_filter_luma(pix, stride, alpha, beta, tc);
6065     } else {
6066         /* 16px edge length, see filter_mb_edgev */
6067             for( d = 0; d < 16; d++ ) {
6068                 const int p0 = pix[-1*pix_next];
6069                 const int p1 = pix[-2*pix_next];
6070                 const int p2 = pix[-3*pix_next];
6071                 const int q0 = pix[0];
6072                 const int q1 = pix[1*pix_next];
6073                 const int q2 = pix[2*pix_next];
6074
6075                 if( FFABS( p0 - q0 ) < alpha &&
6076                     FFABS( p1 - p0 ) < beta &&
6077                     FFABS( q1 - q0 ) < beta ) {
6078
6079                     const int p3 = pix[-4*pix_next];
6080                     const int q3 = pix[ 3*pix_next];
6081
6082                     if(FFABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
6083                         if( FFABS( p2 - p0 ) < beta) {
6084                             /* p0', p1', p2' */
6085                             pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
6086                             pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
6087                             pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
6088                         } else {
6089                             /* p0' */
6090                             pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
6091                         }
6092                         if( FFABS( q2 - q0 ) < beta) {
6093                             /* q0', q1', q2' */
6094                             pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
6095                             pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
6096                             pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
6097                         } else {
6098                             /* q0' */
6099                             pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
6100                         }
6101                     }else{
6102                         /* p0', q0' */
6103                         pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
6104                         pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
6105                     }
6106                     tprintf(h->s.avctx, "filter_mb_edgeh i:%d d:%d, qp:%d, indexA:%d, alpha:%d, beta:%d\n# bS:%d -> [%02x, %02x, %02x, %02x, %02x, %02x] =>[%02x, %02x, %02x, %02x]\n", i, d, qp, index_a, alpha, beta, bS[i], p2, p1, p0, q0, q1, q2, pix[-2*pix_next], pix[-pix_next], pix[0], pix[pix_next]);
6107                 }
6108                 pix++;
6109             }
6110     }
6111 }
6112
6113 static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int16_t bS[4], int qp ) {
6114     int i;
6115     const int index_a = qp + h->slice_alpha_c0_offset;
6116     const int alpha = (alpha_table+52)[index_a];
6117     const int beta  = (beta_table+52)[qp + h->slice_beta_offset];
6118
6119     if( bS[0] < 4 ) {
6120         int8_t tc[4];
6121         for(i=0; i<4; i++)
6122             tc[i] = bS[i] ? (tc0_table+52)[index_a][bS[i] - 1] + 1 : 0;
6123         h->s.dsp.h264_v_loop_filter_chroma(pix, stride, alpha, beta, tc);
6124     } else {
6125         h->s.dsp.h264_v_loop_filter_chroma_intra(pix, stride, alpha, beta);
6126     }
6127 }
6128
6129 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) {
6130     MpegEncContext * const s = &h->s;
6131     int mb_y_firstrow = s->picture_structure == PICT_BOTTOM_FIELD;
6132     int mb_xy, mb_type;
6133     int qp, qp0, qp1, qpc, qpc0, qpc1, qp_thresh;
6134
6135     mb_xy = h->mb_xy;
6136
6137     if(mb_x==0 || mb_y==mb_y_firstrow || !s->dsp.h264_loop_filter_strength || h->pps.chroma_qp_diff ||
6138 1 ||
6139        (h->deblocking_filter == 2 && (h->slice_table[mb_xy] != h->slice_table[h->top_mb_xy] ||
6140                                       h->slice_table[mb_xy] != h->slice_table[mb_xy - 1]))) {
6141         filter_mb(h, mb_x, mb_y, img_y, img_cb, img_cr, linesize, uvlinesize);
6142         return;
6143     }
6144     assert(!FRAME_MBAFF);
6145
6146     mb_type = s->current_picture.mb_type[mb_xy];
6147     qp = s->current_picture.qscale_table[mb_xy];
6148     qp0 = s->current_picture.qscale_table[mb_xy-1];
6149     qp1 = s->current_picture.qscale_table[h->top_mb_xy];
6150     qpc = get_chroma_qp( h, 0, qp );
6151     qpc0 = get_chroma_qp( h, 0, qp0 );
6152     qpc1 = get_chroma_qp( h, 0, qp1 );
6153     qp0 = (qp + qp0 + 1) >> 1;
6154     qp1 = (qp + qp1 + 1) >> 1;
6155     qpc0 = (qpc + qpc0 + 1) >> 1;
6156     qpc1 = (qpc + qpc1 + 1) >> 1;
6157     qp_thresh = 15 - h->slice_alpha_c0_offset;
6158     if(qp <= qp_thresh && qp0 <= qp_thresh && qp1 <= qp_thresh &&
6159        qpc <= qp_thresh && qpc0 <= qp_thresh && qpc1 <= qp_thresh)
6160         return;
6161
6162     if( IS_INTRA(mb_type) ) {
6163         int16_t bS4[4] = {4,4,4,4};
6164         int16_t bS3[4] = {3,3,3,3};
6165         int16_t *bSH = FIELD_PICTURE ? bS3 : bS4;
6166         if( IS_8x8DCT(mb_type) ) {
6167             filter_mb_edgev( h, &img_y[4*0], linesize, bS4, qp0 );
6168             filter_mb_edgev( h, &img_y[4*2], linesize, bS3, qp );
6169             filter_mb_edgeh( h, &img_y[4*0*linesize], linesize, bSH, qp1 );
6170             filter_mb_edgeh( h, &img_y[4*2*linesize], linesize, bS3, qp );
6171         } else {
6172             filter_mb_edgev( h, &img_y[4*0], linesize, bS4, qp0 );
6173             filter_mb_edgev( h, &img_y[4*1], linesize, bS3, qp );
6174             filter_mb_edgev( h, &img_y[4*2], linesize, bS3, qp );
6175             filter_mb_edgev( h, &img_y[4*3], linesize, bS3, qp );
6176             filter_mb_edgeh( h, &img_y[4*0*linesize], linesize, bSH, qp1 );
6177             filter_mb_edgeh( h, &img_y[4*1*linesize], linesize, bS3, qp );
6178             filter_mb_edgeh( h, &img_y[4*2*linesize], linesize, bS3, qp );
6179             filter_mb_edgeh( h, &img_y[4*3*linesize], linesize, bS3, qp );
6180         }
6181         filter_mb_edgecv( h, &img_cb[2*0], uvlinesize, bS4, qpc0 );
6182         filter_mb_edgecv( h, &img_cb[2*2], uvlinesize, bS3, qpc );
6183         filter_mb_edgecv( h, &img_cr[2*0], uvlinesize, bS4, qpc0 );
6184         filter_mb_edgecv( h, &img_cr[2*2], uvlinesize, bS3, qpc );
6185         filter_mb_edgech( h, &img_cb[2*0*uvlinesize], uvlinesize, bSH, qpc1 );
6186         filter_mb_edgech( h, &img_cb[2*2*uvlinesize], uvlinesize, bS3, qpc );
6187         filter_mb_edgech( h, &img_cr[2*0*uvlinesize], uvlinesize, bSH, qpc1 );
6188         filter_mb_edgech( h, &img_cr[2*2*uvlinesize], uvlinesize, bS3, qpc );
6189         return;
6190     } else {
6191         DECLARE_ALIGNED_8(int16_t, bS[2][4][4]);
6192         uint64_t (*bSv)[4] = (uint64_t(*)[4])bS;
6193         int edges;
6194         if( IS_8x8DCT(mb_type) && (h->cbp&7) == 7 ) {
6195             edges = 4;
6196             bSv[0][0] = bSv[0][2] = bSv[1][0] = bSv[1][2] = 0x0002000200020002ULL;
6197         } else {
6198             int mask_edge1 = (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16)) ? 3 :
6199                              (mb_type & MB_TYPE_16x8) ? 1 : 0;
6200             int mask_edge0 = (mb_type & (MB_TYPE_16x16 | MB_TYPE_8x16))
6201                              && (s->current_picture.mb_type[mb_xy-1] & (MB_TYPE_16x16 | MB_TYPE_8x16))
6202                              ? 3 : 0;
6203             int step = IS_8x8DCT(mb_type) ? 2 : 1;
6204             edges = (mb_type & MB_TYPE_16x16) && !(h->cbp & 15) ? 1 : 4;
6205             s->dsp.h264_loop_filter_strength( bS, h->non_zero_count_cache, h->ref_cache, h->mv_cache,
6206                                               (h->slice_type_nos == FF_B_TYPE), edges, step, mask_edge0, mask_edge1, FIELD_PICTURE);
6207         }
6208         if( IS_INTRA(s->current_picture.mb_type[mb_xy-1]) )
6209             bSv[0][0] = 0x0004000400040004ULL;
6210         if( IS_INTRA(s->current_picture.mb_type[h->top_mb_xy]) )
6211             bSv[1][0] = FIELD_PICTURE ? 0x0003000300030003ULL : 0x0004000400040004ULL;
6212
6213 #define FILTER(hv,dir,edge)\
6214         if(bSv[dir][edge]) {\
6215             filter_mb_edge##hv( h, &img_y[4*edge*(dir?linesize:1)], linesize, bS[dir][edge], edge ? qp : qp##dir );\
6216             if(!(edge&1)) {\
6217                 filter_mb_edgec##hv( h, &img_cb[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir );\
6218                 filter_mb_edgec##hv( h, &img_cr[2*edge*(dir?uvlinesize:1)], uvlinesize, bS[dir][edge], edge ? qpc : qpc##dir );\
6219             }\
6220         }
6221         if( edges == 1 ) {
6222             FILTER(v,0,0);
6223             FILTER(h,1,0);
6224         } else if( IS_8x8DCT(mb_type) ) {
6225             FILTER(v,0,0);
6226             FILTER(v,0,2);
6227             FILTER(h,1,0);
6228             FILTER(h,1,2);
6229         } else {
6230             FILTER(v,0,0);
6231             FILTER(v,0,1);
6232             FILTER(v,0,2);
6233             FILTER(v,0,3);
6234             FILTER(h,1,0);
6235             FILTER(h,1,1);
6236             FILTER(h,1,2);
6237             FILTER(h,1,3);
6238         }
6239 #undef FILTER
6240     }
6241 }
6242
6243 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) {
6244     MpegEncContext * const s = &h->s;
6245     const int mb_xy= mb_x + mb_y*s->mb_stride;
6246     const int mb_type = s->current_picture.mb_type[mb_xy];
6247     const int mvy_limit = IS_INTERLACED(mb_type) ? 2 : 4;
6248     int first_vertical_edge_done = 0;
6249     int dir;
6250
6251     //for sufficiently low qp, filtering wouldn't do anything
6252     //this is a conservative estimate: could also check beta_offset and more accurate chroma_qp
6253     if(!FRAME_MBAFF){
6254         int qp_thresh = 15 - h->slice_alpha_c0_offset - FFMAX3(0, h->pps.chroma_qp_index_offset[0], h->pps.chroma_qp_index_offset[1]);
6255         int qp = s->current_picture.qscale_table[mb_xy];
6256         if(qp <= qp_thresh
6257            && (mb_x == 0 || ((qp + s->current_picture.qscale_table[mb_xy-1] + 1)>>1) <= qp_thresh)
6258            && (mb_y == 0 || ((qp + s->current_picture.qscale_table[h->top_mb_xy] + 1)>>1) <= qp_thresh)){
6259             return;
6260         }
6261     }
6262
6263     // CAVLC 8x8dct requires NNZ values for residual decoding that differ from what the loop filter needs
6264     if(!h->pps.cabac && h->pps.transform_8x8_mode){
6265         int top_type, left_type[2];
6266         top_type     = s->current_picture.mb_type[h->top_mb_xy]    ;
6267         left_type[0] = s->current_picture.mb_type[h->left_mb_xy[0]];
6268         left_type[1] = s->current_picture.mb_type[h->left_mb_xy[1]];
6269
6270         if(IS_8x8DCT(top_type)){
6271             h->non_zero_count_cache[4+8*0]=
6272             h->non_zero_count_cache[5+8*0]= h->cbp_table[h->top_mb_xy] & 4;
6273             h->non_zero_count_cache[6+8*0]=
6274             h->non_zero_count_cache[7+8*0]= h->cbp_table[h->top_mb_xy] & 8;
6275         }
6276         if(IS_8x8DCT(left_type[0])){
6277             h->non_zero_count_cache[3+8*1]=
6278             h->non_zero_count_cache[3+8*2]= h->cbp_table[h->left_mb_xy[0]]&2; //FIXME check MBAFF
6279         }
6280         if(IS_8x8DCT(left_type[1])){
6281             h->non_zero_count_cache[3+8*3]=
6282             h->non_zero_count_cache[3+8*4]= h->cbp_table[h->left_mb_xy[1]]&8; //FIXME check MBAFF
6283         }
6284
6285         if(IS_8x8DCT(mb_type)){
6286             h->non_zero_count_cache[scan8[0   ]]= h->non_zero_count_cache[scan8[1   ]]=
6287             h->non_zero_count_cache[scan8[2   ]]= h->non_zero_count_cache[scan8[3   ]]= h->cbp_table[mb_xy] & 1;
6288
6289             h->non_zero_count_cache[scan8[0+ 4]]= h->non_zero_count_cache[scan8[1+ 4]]=
6290             h->non_zero_count_cache[scan8[2+ 4]]= h->non_zero_count_cache[scan8[3+ 4]]= h->cbp_table[mb_xy] & 2;
6291
6292             h->non_zero_count_cache[scan8[0+ 8]]= h->non_zero_count_cache[scan8[1+ 8]]=
6293             h->non_zero_count_cache[scan8[2+ 8]]= h->non_zero_count_cache[scan8[3+ 8]]= h->cbp_table[mb_xy] & 4;
6294
6295             h->non_zero_count_cache[scan8[0+12]]= h->non_zero_count_cache[scan8[1+12]]=
6296             h->non_zero_count_cache[scan8[2+12]]= h->non_zero_count_cache[scan8[3+12]]= h->cbp_table[mb_xy] & 8;
6297         }
6298     }
6299
6300     if (FRAME_MBAFF
6301             // left mb is in picture
6302             && h->slice_table[mb_xy-1] != 255
6303             // and current and left pair do not have the same interlaced type
6304             && (IS_INTERLACED(mb_type) != IS_INTERLACED(s->current_picture.mb_type[mb_xy-1]))
6305             // and left mb is in the same slice if deblocking_filter == 2
6306             && (h->deblocking_filter!=2 || h->slice_table[mb_xy-1] == h->slice_table[mb_xy])) {
6307         /* First vertical edge is different in MBAFF frames
6308          * There are 8 different bS to compute and 2 different Qp
6309          */
6310         const int pair_xy = mb_x + (mb_y&~1)*s->mb_stride;
6311         const int left_mb_xy[2] = { pair_xy-1, pair_xy-1+s->mb_stride };
6312         int16_t bS[8];
6313         int qp[2];
6314         int bqp[2];
6315         int rqp[2];
6316         int mb_qp, mbn0_qp, mbn1_qp;
6317         int i;
6318         first_vertical_edge_done = 1;
6319
6320         if( IS_INTRA(mb_type) )
6321             bS[0] = bS[1] = bS[2] = bS[3] = bS[4] = bS[5] = bS[6] = bS[7] = 4;
6322         else {
6323             for( i = 0; i < 8; i++ ) {
6324                 int mbn_xy = MB_FIELD ? left_mb_xy[i>>2] : left_mb_xy[i&1];
6325
6326                 if( IS_INTRA( s->current_picture.mb_type[mbn_xy] ) )
6327                     bS[i] = 4;
6328                 else if( h->non_zero_count_cache[12+8*(i>>1)] != 0 ||
6329                          /* FIXME: with 8x8dct + cavlc, should check cbp instead of nnz */
6330                          h->non_zero_count[mbn_xy][MB_FIELD ? i&3 : (i>>2)+(mb_y&1)*2] )
6331                     bS[i] = 2;
6332                 else
6333                     bS[i] = 1;
6334             }
6335         }
6336
6337         mb_qp = s->current_picture.qscale_table[mb_xy];
6338         mbn0_qp = s->current_picture.qscale_table[left_mb_xy[0]];
6339         mbn1_qp = s->current_picture.qscale_table[left_mb_xy[1]];
6340         qp[0] = ( mb_qp + mbn0_qp + 1 ) >> 1;
6341         bqp[0] = ( get_chroma_qp( h, 0, mb_qp ) +
6342                    get_chroma_qp( h, 0, mbn0_qp ) + 1 ) >> 1;
6343         rqp[0] = ( get_chroma_qp( h, 1, mb_qp ) +
6344                    get_chroma_qp( h, 1, mbn0_qp ) + 1 ) >> 1;
6345         qp[1] = ( mb_qp + mbn1_qp + 1 ) >> 1;
6346         bqp[1] = ( get_chroma_qp( h, 0, mb_qp ) +
6347                    get_chroma_qp( h, 0, mbn1_qp ) + 1 ) >> 1;
6348         rqp[1] = ( get_chroma_qp( h, 1, mb_qp ) +
6349                    get_chroma_qp( h, 1, mbn1_qp ) + 1 ) >> 1;
6350
6351         /* Filter edge */
6352         tprintf(s->avctx, "filter mb:%d/%d MBAFF, QPy:%d/%d, QPb:%d/%d QPr:%d/%d ls:%d uvls:%d", mb_x, mb_y, qp[0], qp[1], bqp[0], bqp[1], rqp[0], rqp[1], linesize, uvlinesize);
6353         { int i; for (i = 0; i < 8; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); }
6354         filter_mb_mbaff_edgev ( h, &img_y [0], linesize,   bS, qp );
6355         filter_mb_mbaff_edgecv( h, &img_cb[0], uvlinesize, bS, bqp );
6356         filter_mb_mbaff_edgecv( h, &img_cr[0], uvlinesize, bS, rqp );
6357     }
6358     /* dir : 0 -> vertical edge, 1 -> horizontal edge */
6359     for( dir = 0; dir < 2; dir++ )
6360     {
6361         int edge;
6362         const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy;
6363         const int mbm_type = s->current_picture.mb_type[mbm_xy];
6364         int (*ref2frm) [64] = h->ref2frm[ h->slice_num          &15 ][0] + (MB_MBAFF ? 20 : 2);
6365         int (*ref2frmm)[64] = h->ref2frm[ h->slice_table[mbm_xy]&15 ][0] + (MB_MBAFF ? 20 : 2);
6366         int start = h->slice_table[mbm_xy] == 255 ? 1 : 0;
6367
6368         const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP))
6369                                   == (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4;
6370         // how often to recheck mv-based bS when iterating between edges
6371         const int mask_edge = (mb_type & (MB_TYPE_16x16 | (MB_TYPE_16x8 << dir))) ? 3 :
6372                               (mb_type & (MB_TYPE_8x16 >> dir)) ? 1 : 0;
6373         // how often to recheck mv-based bS when iterating along each edge
6374         const int mask_par0 = mb_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir));
6375
6376         if (first_vertical_edge_done) {
6377             start = 1;
6378             first_vertical_edge_done = 0;
6379         }
6380
6381         if (h->deblocking_filter==2 && h->slice_table[mbm_xy] != h->slice_table[mb_xy])
6382             start = 1;
6383
6384         if (FRAME_MBAFF && (dir == 1) && ((mb_y&1) == 0) && start == 0
6385             && !IS_INTERLACED(mb_type)
6386             && IS_INTERLACED(mbm_type)
6387             ) {
6388             // This is a special case in the norm where the filtering must
6389             // be done twice (one each of the field) even if we are in a
6390             // frame macroblock.
6391             //
6392             static const int nnz_idx[4] = {4,5,6,3};
6393             unsigned int tmp_linesize   = 2 *   linesize;
6394             unsigned int tmp_uvlinesize = 2 * uvlinesize;
6395             int mbn_xy = mb_xy - 2 * s->mb_stride;
6396             int qp;
6397             int i, j;
6398             int16_t bS[4];
6399
6400             for(j=0; j<2; j++, mbn_xy += s->mb_stride){
6401                 if( IS_INTRA(mb_type) ||
6402                     IS_INTRA(s->current_picture.mb_type[mbn_xy]) ) {
6403                     bS[0] = bS[1] = bS[2] = bS[3] = 3;
6404                 } else {
6405                     const uint8_t *mbn_nnz = h->non_zero_count[mbn_xy];
6406                     for( i = 0; i < 4; i++ ) {
6407                         if( h->non_zero_count_cache[scan8[0]+i] != 0 ||
6408                             mbn_nnz[nnz_idx[i]] != 0 )
6409                             bS[i] = 2;
6410                         else
6411                             bS[i] = 1;
6412                     }
6413                 }
6414                 // Do not use s->qscale as luma quantizer because it has not the same
6415                 // value in IPCM macroblocks.
6416                 qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
6417                 tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, tmp_linesize, tmp_uvlinesize);
6418                 { int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); }
6419                 filter_mb_edgeh( h, &img_y[j*linesize], tmp_linesize, bS, qp );
6420                 filter_mb_edgech( h, &img_cb[j*uvlinesize], tmp_uvlinesize, bS,
6421                                   ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6422                 filter_mb_edgech( h, &img_cr[j*uvlinesize], tmp_uvlinesize, bS,
6423                                   ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6424             }
6425
6426             start = 1;
6427         }
6428
6429         /* Calculate bS */
6430         for( edge = start; edge < edges; edge++ ) {
6431             /* mbn_xy: neighbor macroblock */
6432             const int mbn_xy = edge > 0 ? mb_xy : mbm_xy;
6433             const int mbn_type = s->current_picture.mb_type[mbn_xy];
6434             int (*ref2frmn)[64] = edge > 0 ? ref2frm : ref2frmm;
6435             int16_t bS[4];
6436             int qp;
6437
6438             if( (edge&1) && IS_8x8DCT(mb_type) )
6439                 continue;
6440
6441             if( IS_INTRA(mb_type) ||
6442                 IS_INTRA(mbn_type) ) {
6443                 int value;
6444                 if (edge == 0) {
6445                     if (   (!IS_INTERLACED(mb_type) && !IS_INTERLACED(mbm_type))
6446                         || ((FRAME_MBAFF || (s->picture_structure != PICT_FRAME)) && (dir == 0))
6447                     ) {
6448                         value = 4;
6449                     } else {
6450                         value = 3;
6451                     }
6452                 } else {
6453                     value = 3;
6454                 }
6455                 bS[0] = bS[1] = bS[2] = bS[3] = value;
6456             } else {
6457                 int i, l;
6458                 int mv_done;
6459
6460                 if( edge & mask_edge ) {
6461                     bS[0] = bS[1] = bS[2] = bS[3] = 0;
6462                     mv_done = 1;
6463                 }
6464                 else if( FRAME_MBAFF && IS_INTERLACED(mb_type ^ mbn_type)) {
6465                     bS[0] = bS[1] = bS[2] = bS[3] = 1;
6466                     mv_done = 1;
6467                 }
6468                 else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) {
6469                     int b_idx= 8 + 4 + edge * (dir ? 8:1);
6470                     int bn_idx= b_idx - (dir ? 8:1);
6471                     int v = 0;
6472
6473                     for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) {
6474                         v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] ||
6475                              FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 ||
6476                              FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit;
6477                     }
6478
6479                     if(h->slice_type_nos == FF_B_TYPE && v){
6480                         v=0;
6481                         for( l = 0; !v && l < 2; l++ ) {
6482                             int ln= 1-l;
6483                             v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] ||
6484                                 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 ||
6485                                 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit;
6486                         }
6487                     }
6488
6489                     bS[0] = bS[1] = bS[2] = bS[3] = v;
6490                     mv_done = 1;
6491                 }
6492                 else
6493                     mv_done = 0;
6494
6495                 for( i = 0; i < 4; i++ ) {
6496                     int x = dir == 0 ? edge : i;
6497                     int y = dir == 0 ? i    : edge;
6498                     int b_idx= 8 + 4 + x + 8*y;
6499                     int bn_idx= b_idx - (dir ? 8:1);
6500
6501                     if( h->non_zero_count_cache[b_idx] != 0 ||
6502                         h->non_zero_count_cache[bn_idx] != 0 ) {
6503                         bS[i] = 2;
6504                     }
6505                     else if(!mv_done)
6506                     {
6507                         bS[i] = 0;
6508                         for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) {
6509                             if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] ||
6510                                 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 ||
6511                                 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) {
6512                                 bS[i] = 1;
6513                                 break;
6514                             }
6515                         }
6516
6517                         if(h->slice_type_nos == FF_B_TYPE && bS[i]){
6518                             bS[i] = 0;
6519                             for( l = 0; l < 2; l++ ) {
6520                                 int ln= 1-l;
6521                                 if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] ||
6522                                     FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 ||
6523                                     FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) {
6524                                     bS[i] = 1;
6525                                     break;
6526                                 }
6527                             }
6528                         }
6529                     }
6530                 }
6531
6532                 if(bS[0]+bS[1]+bS[2]+bS[3] == 0)
6533                     continue;
6534             }
6535
6536             /* Filter edge */
6537             // Do not use s->qscale as luma quantizer because it has not the same
6538             // value in IPCM macroblocks.
6539             qp = ( s->current_picture.qscale_table[mb_xy] + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
6540             //tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d, QPc:%d, QPcn:%d\n", mb_x, mb_y, dir, edge, qp, h->chroma_qp, s->current_picture.qscale_table[mbn_xy]);
6541             tprintf(s->avctx, "filter mb:%d/%d dir:%d edge:%d, QPy:%d ls:%d uvls:%d", mb_x, mb_y, dir, edge, qp, linesize, uvlinesize);
6542             { int i; for (i = 0; i < 4; i++) tprintf(s->avctx, " bS[%d]:%d", i, bS[i]); tprintf(s->avctx, "\n"); }
6543             if( dir == 0 ) {
6544                 filter_mb_edgev( h, &img_y[4*edge], linesize, bS, qp );
6545                 if( (edge&1) == 0 ) {
6546                     filter_mb_edgecv( h, &img_cb[2*edge], uvlinesize, bS,
6547                                       ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6548                     filter_mb_edgecv( h, &img_cr[2*edge], uvlinesize, bS,
6549                                       ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6550                 }
6551             } else {
6552                 filter_mb_edgeh( h, &img_y[4*edge*linesize], linesize, bS, qp );
6553                 if( (edge&1) == 0 ) {
6554                     filter_mb_edgech( h, &img_cb[2*edge*uvlinesize], uvlinesize, bS,
6555                                       ( h->chroma_qp[0] + get_chroma_qp( h, 0, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6556                     filter_mb_edgech( h, &img_cr[2*edge*uvlinesize], uvlinesize, bS,
6557                                       ( h->chroma_qp[1] + get_chroma_qp( h, 1, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1);
6558                 }
6559             }
6560         }
6561     }
6562 }
6563
6564 static int decode_slice(struct AVCodecContext *avctx, H264Context *h){
6565     MpegEncContext * const s = &h->s;
6566     const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
6567
6568     s->mb_skip_run= -1;
6569
6570     if( h->pps.cabac ) {
6571         int i;
6572
6573         /* realign */
6574         align_get_bits( &s->gb );
6575
6576         /* init cabac */
6577         ff_init_cabac_states( &h->cabac);
6578         ff_init_cabac_decoder( &h->cabac,
6579                                s->gb.buffer + get_bits_count(&s->gb)/8,
6580                                ( s->gb.size_in_bits - get_bits_count(&s->gb) + 7)/8);
6581         /* calculate pre-state */
6582         for( i= 0; i < 460; i++ ) {
6583             int pre;
6584             if( h->slice_type_nos == FF_I_TYPE )
6585                 pre = av_clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cabac_context_init_I[i][1], 1, 126 );
6586             else
6587                 pre = av_clip( ((cabac_context_init_PB[h->cabac_init_idc][i][0] * s->qscale) >>4 ) + cabac_context_init_PB[h->cabac_init_idc][i][1], 1, 126 );
6588
6589             if( pre <= 63 )
6590                 h->cabac_state[i] = 2 * ( 63 - pre ) + 0;
6591             else
6592                 h->cabac_state[i] = 2 * ( pre - 64 ) + 1;
6593         }
6594
6595         for(;;){
6596 //START_TIMER
6597             int ret = decode_mb_cabac(h);
6598             int eos;
6599 //STOP_TIMER("decode_mb_cabac")
6600
6601             if(ret>=0) hl_decode_mb(h);
6602
6603             if( ret >= 0 && FRAME_MBAFF ) { //FIXME optimal? or let mb_decode decode 16x32 ?
6604                 s->mb_y++;
6605
6606                 if(ret>=0) ret = decode_mb_cabac(h);
6607
6608                 if(ret>=0) hl_decode_mb(h);
6609                 s->mb_y--;
6610             }
6611             eos = get_cabac_terminate( &h->cabac );
6612
6613             if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) {
6614                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d, bytestream (%td)\n", s->mb_x, s->mb_y, h->cabac.bytestream_end - h->cabac.bytestream);
6615                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
6616                 return -1;
6617             }
6618
6619             if( ++s->mb_x >= s->mb_width ) {
6620                 s->mb_x = 0;
6621                 ff_draw_horiz_band(s, 16*s->mb_y, 16);
6622                 ++s->mb_y;
6623                 if(FIELD_OR_MBAFF_PICTURE) {
6624                     ++s->mb_y;
6625                 }
6626             }
6627
6628             if( eos || s->mb_y >= s->mb_height ) {
6629                 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
6630                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
6631                 return 0;
6632             }
6633         }
6634
6635     } else {
6636         for(;;){
6637             int ret = decode_mb_cavlc(h);
6638
6639             if(ret>=0) hl_decode_mb(h);
6640
6641             if(ret>=0 && FRAME_MBAFF){ //FIXME optimal? or let mb_decode decode 16x32 ?
6642                 s->mb_y++;
6643                 ret = decode_mb_cavlc(h);
6644
6645                 if(ret>=0) hl_decode_mb(h);
6646                 s->mb_y--;
6647             }
6648
6649             if(ret<0){
6650                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
6651                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
6652
6653                 return -1;
6654             }
6655
6656             if(++s->mb_x >= s->mb_width){
6657                 s->mb_x=0;
6658                 ff_draw_horiz_band(s, 16*s->mb_y, 16);
6659                 ++s->mb_y;
6660                 if(FIELD_OR_MBAFF_PICTURE) {
6661                     ++s->mb_y;
6662                 }
6663                 if(s->mb_y >= s->mb_height){
6664                     tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
6665
6666                     if(get_bits_count(&s->gb) == s->gb.size_in_bits ) {
6667                         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
6668
6669                         return 0;
6670                     }else{
6671                         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
6672
6673                         return -1;
6674                     }
6675                 }
6676             }
6677
6678             if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){
6679                 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
6680                 if(get_bits_count(&s->gb) == s->gb.size_in_bits ){
6681                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
6682
6683                     return 0;
6684                 }else{
6685                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
6686
6687                     return -1;
6688                 }
6689             }
6690         }
6691     }
6692
6693 #if 0
6694     for(;s->mb_y < s->mb_height; s->mb_y++){
6695         for(;s->mb_x < s->mb_width; s->mb_x++){
6696             int ret= decode_mb(h);
6697
6698             hl_decode_mb(h);
6699
6700             if(ret<0){
6701                 av_log(s->avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
6702                 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
6703
6704                 return -1;
6705             }
6706
6707             if(++s->mb_x >= s->mb_width){
6708                 s->mb_x=0;
6709                 if(++s->mb_y >= s->mb_height){
6710                     if(get_bits_count(s->gb) == s->gb.size_in_bits){
6711                         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
6712
6713                         return 0;
6714                     }else{
6715                         ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
6716
6717                         return -1;
6718                     }
6719                 }
6720             }
6721
6722             if(get_bits_count(s->?gb) >= s->gb?.size_in_bits){
6723                 if(get_bits_count(s->gb) == s->gb.size_in_bits){
6724                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
6725
6726                     return 0;
6727                 }else{
6728                     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
6729
6730                     return -1;
6731                 }
6732             }
6733         }
6734         s->mb_x=0;
6735         ff_draw_horiz_band(s, 16*s->mb_y, 16);
6736     }
6737 #endif
6738     return -1; //not reached
6739 }
6740
6741 static int decode_unregistered_user_data(H264Context *h, int size){
6742     MpegEncContext * const s = &h->s;
6743     uint8_t user_data[16+256];
6744     int e, build, i;
6745
6746     if(size<16)
6747         return -1;
6748
6749     for(i=0; i<sizeof(user_data)-1 && i<size; i++){
6750         user_data[i]= get_bits(&s->gb, 8);
6751     }
6752
6753     user_data[i]= 0;
6754     e= sscanf(user_data+16, "x264 - core %d"/*%s - H.264/MPEG-4 AVC codec - Copyleft 2005 - http://www.videolan.org/x264.html*/, &build);
6755     if(e==1 && build>=0)
6756         h->x264_build= build;
6757
6758     if(s->avctx->debug & FF_DEBUG_BUGS)
6759         av_log(s->avctx, AV_LOG_DEBUG, "user data:\"%s\"\n", user_data+16);
6760
6761     for(; i<size; i++)
6762         skip_bits(&s->gb, 8);
6763
6764     return 0;
6765 }
6766
6767 static int decode_sei(H264Context *h){
6768     MpegEncContext * const s = &h->s;
6769
6770     while(get_bits_count(&s->gb) + 16 < s->gb.size_in_bits){
6771         int size, type;
6772
6773         type=0;
6774         do{
6775             type+= show_bits(&s->gb, 8);
6776         }while(get_bits(&s->gb, 8) == 255);
6777
6778         size=0;
6779         do{
6780             size+= show_bits(&s->gb, 8);
6781         }while(get_bits(&s->gb, 8) == 255);
6782
6783         switch(type){
6784         case 5:
6785             if(decode_unregistered_user_data(h, size) < 0)
6786                 return -1;
6787             break;
6788         default:
6789             skip_bits(&s->gb, 8*size);
6790         }
6791
6792         //FIXME check bits here
6793         align_get_bits(&s->gb);
6794     }
6795
6796     return 0;
6797 }
6798
6799 static inline void decode_hrd_parameters(H264Context *h, SPS *sps){
6800     MpegEncContext * const s = &h->s;
6801     int cpb_count, i;
6802     cpb_count = get_ue_golomb(&s->gb) + 1;
6803     get_bits(&s->gb, 4); /* bit_rate_scale */
6804     get_bits(&s->gb, 4); /* cpb_size_scale */
6805     for(i=0; i<cpb_count; i++){
6806         get_ue_golomb(&s->gb); /* bit_rate_value_minus1 */
6807         get_ue_golomb(&s->gb); /* cpb_size_value_minus1 */
6808         get_bits1(&s->gb);     /* cbr_flag */
6809     }
6810     get_bits(&s->gb, 5); /* initial_cpb_removal_delay_length_minus1 */
6811     get_bits(&s->gb, 5); /* cpb_removal_delay_length_minus1 */
6812     get_bits(&s->gb, 5); /* dpb_output_delay_length_minus1 */
6813     get_bits(&s->gb, 5); /* time_offset_length */
6814 }
6815
6816 static inline int decode_vui_parameters(H264Context *h, SPS *sps){
6817     MpegEncContext * const s = &h->s;
6818     int aspect_ratio_info_present_flag;
6819     unsigned int aspect_ratio_idc;
6820     int nal_hrd_parameters_present_flag, vcl_hrd_parameters_present_flag;
6821
6822     aspect_ratio_info_present_flag= get_bits1(&s->gb);
6823
6824     if( aspect_ratio_info_present_flag ) {
6825         aspect_ratio_idc= get_bits(&s->gb, 8);
6826         if( aspect_ratio_idc == EXTENDED_SAR ) {
6827             sps->sar.num= get_bits(&s->gb, 16);
6828             sps->sar.den= get_bits(&s->gb, 16);
6829         }else if(aspect_ratio_idc < sizeof(pixel_aspect)/sizeof(*pixel_aspect)){
6830             sps->sar=  pixel_aspect[aspect_ratio_idc];
6831         }else{
6832             av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n");
6833             return -1;
6834         }
6835     }else{
6836         sps->sar.num=
6837         sps->sar.den= 0;
6838     }
6839 //            s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
6840
6841     if(get_bits1(&s->gb)){      /* overscan_info_present_flag */
6842         get_bits1(&s->gb);      /* overscan_appropriate_flag */
6843     }
6844
6845     if(get_bits1(&s->gb)){      /* video_signal_type_present_flag */
6846         get_bits(&s->gb, 3);    /* video_format */
6847         get_bits1(&s->gb);      /* video_full_range_flag */
6848         if(get_bits1(&s->gb)){  /* colour_description_present_flag */
6849             get_bits(&s->gb, 8); /* colour_primaries */
6850             get_bits(&s->gb, 8); /* transfer_characteristics */
6851             get_bits(&s->gb, 8); /* matrix_coefficients */
6852         }
6853     }
6854
6855     if(get_bits1(&s->gb)){      /* chroma_location_info_present_flag */
6856         get_ue_golomb(&s->gb);  /* chroma_sample_location_type_top_field */
6857         get_ue_golomb(&s->gb);  /* chroma_sample_location_type_bottom_field */
6858     }
6859
6860     sps->timing_info_present_flag = get_bits1(&s->gb);
6861     if(sps->timing_info_present_flag){
6862         sps->num_units_in_tick = get_bits_long(&s->gb, 32);
6863         sps->time_scale = get_bits_long(&s->gb, 32);
6864         sps->fixed_frame_rate_flag = get_bits1(&s->gb);
6865     }
6866
6867     nal_hrd_parameters_present_flag = get_bits1(&s->gb);
6868     if(nal_hrd_parameters_present_flag)
6869         decode_hrd_parameters(h, sps);
6870     vcl_hrd_parameters_present_flag = get_bits1(&s->gb);
6871     if(vcl_hrd_parameters_present_flag)
6872         decode_hrd_parameters(h, sps);
6873     if(nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag)
6874         get_bits1(&s->gb);     /* low_delay_hrd_flag */
6875     get_bits1(&s->gb);         /* pic_struct_present_flag */
6876
6877     sps->bitstream_restriction_flag = get_bits1(&s->gb);
6878     if(sps->bitstream_restriction_flag){
6879         unsigned int num_reorder_frames;
6880         get_bits1(&s->gb);     /* motion_vectors_over_pic_boundaries_flag */
6881         get_ue_golomb(&s->gb); /* max_bytes_per_pic_denom */
6882         get_ue_golomb(&s->gb); /* max_bits_per_mb_denom */
6883         get_ue_golomb(&s->gb); /* log2_max_mv_length_horizontal */
6884         get_ue_golomb(&s->gb); /* log2_max_mv_length_vertical */
6885         num_reorder_frames= get_ue_golomb(&s->gb);
6886         get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/
6887
6888         if(num_reorder_frames > 16 /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){
6889             av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", num_reorder_frames);
6890             return -1;
6891         }
6892
6893         sps->num_reorder_frames= num_reorder_frames;
6894     }
6895
6896     return 0;
6897 }
6898
6899 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size,
6900                                 const uint8_t *jvt_list, const uint8_t *fallback_list){
6901     MpegEncContext * const s = &h->s;
6902     int i, last = 8, next = 8;
6903     const uint8_t *scan = size == 16 ? zigzag_scan : zigzag_scan8x8;
6904     if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */
6905         memcpy(factors, fallback_list, size*sizeof(uint8_t));
6906     else
6907     for(i=0;i<size;i++){
6908         if(next)
6909             next = (last + get_se_golomb(&s->gb)) & 0xff;
6910         if(!i && !next){ /* matrix not written, we use the preset one */
6911             memcpy(factors, jvt_list, size*sizeof(uint8_t));
6912             break;
6913         }
6914         last = factors[scan[i]] = next ? next : last;
6915     }
6916 }
6917
6918 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
6919                                    uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
6920     MpegEncContext * const s = &h->s;
6921     int fallback_sps = !is_sps && sps->scaling_matrix_present;
6922     const uint8_t *fallback[4] = {
6923         fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
6924         fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
6925         fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
6926         fallback_sps ? sps->scaling_matrix8[1] : default_scaling8[1]
6927     };
6928     if(get_bits1(&s->gb)){
6929         sps->scaling_matrix_present |= is_sps;
6930         decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y
6931         decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr
6932         decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb
6933         decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y
6934         decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr
6935         decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
6936         if(is_sps || pps->transform_8x8_mode){
6937             decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]);  // Intra, Y
6938             decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[1],fallback[3]);  // Inter, Y
6939         }
6940     } else if(fallback_sps) {
6941         memcpy(scaling_matrix4, sps->scaling_matrix4, 6*16*sizeof(uint8_t));
6942         memcpy(scaling_matrix8, sps->scaling_matrix8, 2*64*sizeof(uint8_t));
6943     }
6944 }
6945
6946 /**
6947  * Returns and optionally allocates SPS / PPS structures in the supplied array 'vec'
6948  */
6949 static void *
6950 alloc_parameter_set(H264Context *h, void **vec, const unsigned int id, const unsigned int max,
6951                     const size_t size, const char *name)
6952 {
6953     if(id>=max) {
6954         av_log(h->s.avctx, AV_LOG_ERROR, "%s_id (%d) out of range\n", name, id);
6955         return NULL;
6956     }
6957
6958     if(!vec[id]) {
6959         vec[id] = av_mallocz(size);
6960         if(vec[id] == NULL)
6961             av_log(h->s.avctx, AV_LOG_ERROR, "cannot allocate memory for %s\n", name);
6962     }
6963     return vec[id];
6964 }
6965
6966 static inline int decode_seq_parameter_set(H264Context *h){
6967     MpegEncContext * const s = &h->s;
6968     int profile_idc, level_idc;
6969     unsigned int sps_id, tmp, mb_width, mb_height;
6970     int i;
6971     SPS *sps;
6972
6973     profile_idc= get_bits(&s->gb, 8);
6974     get_bits1(&s->gb);   //constraint_set0_flag
6975     get_bits1(&s->gb);   //constraint_set1_flag
6976     get_bits1(&s->gb);   //constraint_set2_flag
6977     get_bits1(&s->gb);   //constraint_set3_flag
6978     get_bits(&s->gb, 4); // reserved
6979     level_idc= get_bits(&s->gb, 8);
6980     sps_id= get_ue_golomb(&s->gb);
6981
6982     sps = alloc_parameter_set(h, (void **)h->sps_buffers, sps_id, MAX_SPS_COUNT, sizeof(SPS), "sps");
6983     if(sps == NULL)
6984         return -1;
6985
6986     sps->profile_idc= profile_idc;
6987     sps->level_idc= level_idc;
6988
6989     if(sps->profile_idc >= 100){ //high profile
6990         sps->chroma_format_idc= get_ue_golomb(&s->gb);
6991         if(sps->chroma_format_idc == 3)
6992             get_bits1(&s->gb);  //residual_color_transform_flag
6993         get_ue_golomb(&s->gb);  //bit_depth_luma_minus8
6994         get_ue_golomb(&s->gb);  //bit_depth_chroma_minus8
6995         sps->transform_bypass = get_bits1(&s->gb);
6996         decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
6997     }else{
6998         sps->scaling_matrix_present = 0;
6999         sps->chroma_format_idc= 1;
7000     }
7001
7002     sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4;
7003     sps->poc_type= get_ue_golomb(&s->gb);
7004
7005     if(sps->poc_type == 0){ //FIXME #define
7006         sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
7007     } else if(sps->poc_type == 1){//FIXME #define
7008         sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
7009         sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
7010         sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb);
7011         tmp= get_ue_golomb(&s->gb);
7012
7013         if(tmp >= sizeof(sps->offset_for_ref_frame) / sizeof(sps->offset_for_ref_frame[0])){
7014             av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", tmp);
7015             return -1;
7016         }
7017         sps->poc_cycle_length= tmp;
7018
7019         for(i=0; i<sps->poc_cycle_length; i++)
7020             sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb);
7021     }else if(sps->poc_type != 2){
7022         av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
7023         return -1;
7024     }
7025
7026     tmp= get_ue_golomb(&s->gb);
7027     if(tmp > MAX_PICTURE_COUNT-2 || tmp >= 32){
7028         av_log(h->s.avctx, AV_LOG_ERROR, "too many reference frames\n");
7029         return -1;
7030     }
7031     sps->ref_frame_count= tmp;
7032     sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb);
7033     mb_width= get_ue_golomb(&s->gb) + 1;
7034     mb_height= get_ue_golomb(&s->gb) + 1;
7035     if(mb_width >= INT_MAX/16 || mb_height >= INT_MAX/16 ||
7036        avcodec_check_dimensions(NULL, 16*mb_width, 16*mb_height)){
7037         av_log(h->s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n");
7038         return -1;
7039     }
7040     sps->mb_width = mb_width;
7041     sps->mb_height= mb_height;
7042
7043     sps->frame_mbs_only_flag= get_bits1(&s->gb);
7044     if(!sps->frame_mbs_only_flag)
7045         sps->mb_aff= get_bits1(&s->gb);
7046     else
7047         sps->mb_aff= 0;
7048
7049     sps->direct_8x8_inference_flag= get_bits1(&s->gb);
7050
7051 #ifndef ALLOW_INTERLACE
7052     if(sps->mb_aff)
7053         av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n");
7054 #endif
7055     if(!sps->direct_8x8_inference_flag && sps->mb_aff)
7056         av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF + !direct_8x8_inference is not implemented\n");
7057
7058     sps->crop= get_bits1(&s->gb);
7059     if(sps->crop){
7060         sps->crop_left  = get_ue_golomb(&s->gb);
7061         sps->crop_right = get_ue_golomb(&s->gb);
7062         sps->crop_top   = get_ue_golomb(&s->gb);
7063         sps->crop_bottom= get_ue_golomb(&s->gb);
7064         if(sps->crop_left || sps->crop_top){
7065             av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n");
7066         }
7067         if(sps->crop_right >= 8 || sps->crop_bottom >= (8>> !h->sps.frame_mbs_only_flag)){
7068             av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n");
7069         }
7070     }else{
7071         sps->crop_left  =
7072         sps->crop_right =
7073         sps->crop_top   =
7074         sps->crop_bottom= 0;
7075     }
7076
7077     sps->vui_parameters_present_flag= get_bits1(&s->gb);
7078     if( sps->vui_parameters_present_flag )
7079         decode_vui_parameters(h, sps);
7080
7081     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
7082         av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s\n",
7083                sps_id, sps->profile_idc, sps->level_idc,
7084                sps->poc_type,
7085                sps->ref_frame_count,
7086                sps->mb_width, sps->mb_height,
7087                sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
7088                sps->direct_8x8_inference_flag ? "8B8" : "",
7089                sps->crop_left, sps->crop_right,
7090                sps->crop_top, sps->crop_bottom,
7091                sps->vui_parameters_present_flag ? "VUI" : "",
7092                ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc]
7093                );
7094     }
7095     return 0;
7096 }
7097
7098 static void
7099 build_qp_table(PPS *pps, int t, int index)
7100 {
7101     int i;
7102     for(i = 0; i < 52; i++)
7103         pps->chroma_qp_table[t][i] = chroma_qp[av_clip(i + index, 0, 51)];
7104 }
7105
7106 static inline int decode_picture_parameter_set(H264Context *h, int bit_length){
7107     MpegEncContext * const s = &h->s;
7108     unsigned int tmp, pps_id= get_ue_golomb(&s->gb);
7109     PPS *pps;
7110
7111     pps = alloc_parameter_set(h, (void **)h->pps_buffers, pps_id, MAX_PPS_COUNT, sizeof(PPS), "pps");
7112     if(pps == NULL)
7113         return -1;
7114
7115     tmp= get_ue_golomb(&s->gb);
7116     if(tmp>=MAX_SPS_COUNT || h->sps_buffers[tmp] == NULL){
7117         av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of range\n");
7118         return -1;
7119     }
7120     pps->sps_id= tmp;
7121
7122     pps->cabac= get_bits1(&s->gb);
7123     pps->pic_order_present= get_bits1(&s->gb);
7124     pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
7125     if(pps->slice_group_count > 1 ){
7126         pps->mb_slice_group_map_type= get_ue_golomb(&s->gb);
7127         av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n");
7128         switch(pps->mb_slice_group_map_type){
7129         case 0:
7130 #if 0
7131 |   for( i = 0; i <= num_slice_groups_minus1; i++ ) |   |        |
7132 |    run_length[ i ]                                |1  |ue(v)   |
7133 #endif
7134             break;
7135         case 2:
7136 #if 0
7137 |   for( i = 0; i < num_slice_groups_minus1; i++ )  |   |        |
7138 |{                                                  |   |        |
7139 |    top_left_mb[ i ]                               |1  |ue(v)   |
7140 |    bottom_right_mb[ i ]                           |1  |ue(v)   |
7141 |   }                                               |   |        |
7142 #endif
7143             break;
7144         case 3:
7145         case 4:
7146         case 5:
7147 #if 0
7148 |   slice_group_change_direction_flag               |1  |u(1)    |
7149 |   slice_group_change_rate_minus1                  |1  |ue(v)   |
7150 #endif
7151             break;
7152         case 6:
7153 #if 0
7154 |   slice_group_id_cnt_minus1                       |1  |ue(v)   |
7155 |   for( i = 0; i <= slice_group_id_cnt_minus1; i++ |   |        |
7156 |)                                                  |   |        |
7157 |    slice_group_id[ i ]                            |1  |u(v)    |
7158 #endif
7159             break;
7160         }
7161     }
7162     pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
7163     pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
7164     if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){
7165         av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)\n");
7166         pps->ref_count[0]= pps->ref_count[1]= 1;
7167         return -1;
7168     }
7169
7170     pps->weighted_pred= get_bits1(&s->gb);
7171     pps->weighted_bipred_idc= get_bits(&s->gb, 2);
7172     pps->init_qp= get_se_golomb(&s->gb) + 26;
7173     pps->init_qs= get_se_golomb(&s->gb) + 26;
7174     pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb);
7175     pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
7176     pps->constrained_intra_pred= get_bits1(&s->gb);
7177     pps->redundant_pic_cnt_present = get_bits1(&s->gb);
7178
7179     pps->transform_8x8_mode= 0;
7180     h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit
7181     memset(pps->scaling_matrix4, 16, 6*16*sizeof(uint8_t));
7182     memset(pps->scaling_matrix8, 16, 2*64*sizeof(uint8_t));
7183
7184     if(get_bits_count(&s->gb) < bit_length){
7185         pps->transform_8x8_mode= get_bits1(&s->gb);
7186         decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
7187         pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset
7188     } else {
7189         pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0];
7190     }
7191
7192     build_qp_table(pps, 0, pps->chroma_qp_index_offset[0]);
7193     build_qp_table(pps, 1, pps->chroma_qp_index_offset[1]);
7194     if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1])
7195         h->pps.chroma_qp_diff= 1;
7196
7197     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
7198         av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%u sps:%u %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d/%d %s %s %s %s\n",
7199                pps_id, pps->sps_id,
7200                pps->cabac ? "CABAC" : "CAVLC",
7201                pps->slice_group_count,
7202                pps->ref_count[0], pps->ref_count[1],
7203                pps->weighted_pred ? "weighted" : "",
7204                pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1],
7205                pps->deblocking_filter_parameters_present ? "LPAR" : "",
7206                pps->constrained_intra_pred ? "CONSTR" : "",
7207                pps->redundant_pic_cnt_present ? "REDU" : "",
7208                pps->transform_8x8_mode ? "8x8DCT" : ""
7209                );
7210     }
7211
7212     return 0;
7213 }
7214
7215 /**
7216  * Call decode_slice() for each context.
7217  *
7218  * @param h h264 master context
7219  * @param context_count number of contexts to execute
7220  */
7221 static void execute_decode_slices(H264Context *h, int context_count){
7222     MpegEncContext * const s = &h->s;
7223     AVCodecContext * const avctx= s->avctx;
7224     H264Context *hx;
7225     int i;
7226
7227     if(context_count == 1) {
7228         decode_slice(avctx, h);
7229     } else {
7230         for(i = 1; i < context_count; i++) {
7231             hx = h->thread_context[i];
7232             hx->s.error_resilience = avctx->error_resilience;
7233             hx->s.error_count = 0;
7234         }
7235
7236         avctx->execute(avctx, (void *)decode_slice,
7237                        (void **)h->thread_context, NULL, context_count);
7238
7239         /* pull back stuff from slices to master context */
7240         hx = h->thread_context[context_count - 1];
7241         s->mb_x = hx->s.mb_x;
7242         s->mb_y = hx->s.mb_y;
7243         s->dropable = hx->s.dropable;
7244         s->picture_structure = hx->s.picture_structure;
7245         for(i = 1; i < context_count; i++)
7246             h->s.error_count += h->thread_context[i]->s.error_count;
7247     }
7248 }
7249
7250
7251 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
7252     MpegEncContext * const s = &h->s;
7253     AVCodecContext * const avctx= s->avctx;
7254     int buf_index=0;
7255     H264Context *hx; ///< thread context
7256     int context_count = 0;
7257
7258     h->max_contexts = avctx->thread_count;
7259 #if 0
7260     int i;
7261     for(i=0; i<50; i++){
7262         av_log(NULL, AV_LOG_ERROR,"%02X ", buf[i]);
7263     }
7264 #endif
7265     if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){
7266         h->current_slice = 0;
7267         if (!s->first_field)
7268             s->current_picture_ptr= NULL;
7269     }
7270
7271     for(;;){
7272         int consumed;
7273         int dst_length;
7274         int bit_length;
7275         const uint8_t *ptr;
7276         int i, nalsize = 0;
7277         int err;
7278
7279         if(h->is_avc) {
7280             if(buf_index >= buf_size) break;
7281             nalsize = 0;
7282             for(i = 0; i < h->nal_length_size; i++)
7283                 nalsize = (nalsize << 8) | buf[buf_index++];
7284             if(nalsize <= 1 || (nalsize+buf_index > buf_size)){
7285                 if(nalsize == 1){
7286                     buf_index++;
7287                     continue;
7288                 }else{
7289                     av_log(h->s.avctx, AV_LOG_ERROR, "AVC: nal size %d\n", nalsize);
7290                     break;
7291                 }
7292             }
7293         } else {
7294             // start code prefix search
7295             for(; buf_index + 3 < buf_size; buf_index++){
7296                 // This should always succeed in the first iteration.
7297                 if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1)
7298                     break;
7299             }
7300
7301             if(buf_index+3 >= buf_size) break;
7302
7303             buf_index+=3;
7304         }
7305
7306         hx = h->thread_context[context_count];
7307
7308         ptr= decode_nal(hx, buf + buf_index, &dst_length, &consumed, h->is_avc ? nalsize : buf_size - buf_index);
7309         if (ptr==NULL || dst_length < 0){
7310             return -1;
7311         }
7312         while(ptr[dst_length - 1] == 0 && dst_length > 0)
7313             dst_length--;
7314         bit_length= !dst_length ? 0 : (8*dst_length - decode_rbsp_trailing(h, ptr + dst_length - 1));
7315
7316         if(s->avctx->debug&FF_DEBUG_STARTCODE){
7317             av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d at %d/%d length %d\n", hx->nal_unit_type, buf_index, buf_size, dst_length);
7318         }
7319
7320         if (h->is_avc && (nalsize != consumed)){
7321             av_log(h->s.avctx, AV_LOG_ERROR, "AVC: Consumed only %d bytes instead of %d\n", consumed, nalsize);
7322             consumed= nalsize;
7323         }
7324
7325         buf_index += consumed;
7326
7327         if(  (s->hurry_up == 1 && h->nal_ref_idc  == 0) //FIXME do not discard SEI id
7328            ||(avctx->skip_frame >= AVDISCARD_NONREF && h->nal_ref_idc  == 0))
7329             continue;
7330
7331       again:
7332         err = 0;
7333         switch(hx->nal_unit_type){
7334         case NAL_IDR_SLICE:
7335             if (h->nal_unit_type != NAL_IDR_SLICE) {
7336                 av_log(h->s.avctx, AV_LOG_ERROR, "Invalid mix of idr and non-idr slices");
7337                 return -1;
7338             }
7339             idr(h); //FIXME ensure we don't loose some frames if there is reordering
7340         case NAL_SLICE:
7341             init_get_bits(&hx->s.gb, ptr, bit_length);
7342             hx->intra_gb_ptr=
7343             hx->inter_gb_ptr= &hx->s.gb;
7344             hx->s.data_partitioning = 0;
7345
7346             if((err = decode_slice_header(hx, h)))
7347                break;
7348
7349             s->current_picture_ptr->key_frame|= (hx->nal_unit_type == NAL_IDR_SLICE);
7350             if(hx->redundant_pic_count==0 && hx->s.hurry_up < 5
7351                && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc)
7352                && (avctx->skip_frame < AVDISCARD_BIDIR  || hx->slice_type_nos!=FF_B_TYPE)
7353                && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type_nos==FF_I_TYPE)
7354                && avctx->skip_frame < AVDISCARD_ALL)
7355                 context_count++;
7356             break;
7357         case NAL_DPA:
7358             init_get_bits(&hx->s.gb, ptr, bit_length);
7359             hx->intra_gb_ptr=
7360             hx->inter_gb_ptr= NULL;
7361             hx->s.data_partitioning = 1;
7362
7363             err = decode_slice_header(hx, h);
7364             break;
7365         case NAL_DPB:
7366             init_get_bits(&hx->intra_gb, ptr, bit_length);
7367             hx->intra_gb_ptr= &hx->intra_gb;
7368             break;
7369         case NAL_DPC:
7370             init_get_bits(&hx->inter_gb, ptr, bit_length);
7371             hx->inter_gb_ptr= &hx->inter_gb;
7372
7373             if(hx->redundant_pic_count==0 && hx->intra_gb_ptr && hx->s.data_partitioning
7374                && s->context_initialized
7375                && s->hurry_up < 5
7376                && (avctx->skip_frame < AVDISCARD_NONREF || hx->nal_ref_idc)
7377                && (avctx->skip_frame < AVDISCARD_BIDIR  || hx->slice_type_nos!=FF_B_TYPE)
7378                && (avctx->skip_frame < AVDISCARD_NONKEY || hx->slice_type_nos==FF_I_TYPE)
7379                && avctx->skip_frame < AVDISCARD_ALL)
7380                 context_count++;
7381             break;
7382         case NAL_SEI:
7383             init_get_bits(&s->gb, ptr, bit_length);
7384             decode_sei(h);
7385             break;
7386         case NAL_SPS:
7387             init_get_bits(&s->gb, ptr, bit_length);
7388             decode_seq_parameter_set(h);
7389
7390             if(s->flags& CODEC_FLAG_LOW_DELAY)
7391                 s->low_delay=1;
7392
7393             if(avctx->has_b_frames < 2)
7394                 avctx->has_b_frames= !s->low_delay;
7395             break;
7396         case NAL_PPS:
7397             init_get_bits(&s->gb, ptr, bit_length);
7398
7399             decode_picture_parameter_set(h, bit_length);
7400
7401             break;
7402         case NAL_AUD:
7403         case NAL_END_SEQUENCE:
7404         case NAL_END_STREAM:
7405         case NAL_FILLER_DATA:
7406         case NAL_SPS_EXT:
7407         case NAL_AUXILIARY_SLICE:
7408             break;
7409         default:
7410             av_log(avctx, AV_LOG_DEBUG, "Unknown NAL code: %d (%d bits)\n", h->nal_unit_type, bit_length);
7411         }
7412
7413         if(context_count == h->max_contexts) {
7414             execute_decode_slices(h, context_count);
7415             context_count = 0;
7416         }
7417
7418         if (err < 0)
7419             av_log(h->s.avctx, AV_LOG_ERROR, "decode_slice_header error\n");
7420         else if(err == 1) {
7421             /* Slice could not be decoded in parallel mode, copy down
7422              * NAL unit stuff to context 0 and restart. Note that
7423              * rbsp_buffer is not transferred, but since we no longer
7424              * run in parallel mode this should not be an issue. */
7425             h->nal_unit_type = hx->nal_unit_type;
7426             h->nal_ref_idc   = hx->nal_ref_idc;
7427             hx = h;
7428             goto again;
7429         }
7430     }
7431     if(context_count)
7432         execute_decode_slices(h, context_count);
7433     return buf_index;
7434 }
7435
7436 /**
7437  * returns the number of bytes consumed for building the current frame
7438  */
7439 static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){
7440         if(pos==0) pos=1; //avoid infinite loops (i doubt that is needed but ...)
7441         if(pos+10>buf_size) pos=buf_size; // oops ;)
7442
7443         return pos;
7444 }
7445
7446 static int decode_frame(AVCodecContext *avctx,
7447                              void *data, int *data_size,
7448                              const uint8_t *buf, int buf_size)
7449 {
7450     H264Context *h = avctx->priv_data;
7451     MpegEncContext *s = &h->s;
7452     AVFrame *pict = data;
7453     int buf_index;
7454
7455     s->flags= avctx->flags;
7456     s->flags2= avctx->flags2;
7457
7458    /* end of stream, output what is still in the buffers */
7459     if (buf_size == 0) {
7460         Picture *out;
7461         int i, out_idx;
7462
7463 //FIXME factorize this with the output code below
7464         out = h->delayed_pic[0];
7465         out_idx = 0;
7466         for(i=1; h->delayed_pic[i] && h->delayed_pic[i]->poc; i++)
7467             if(h->delayed_pic[i]->poc < out->poc){
7468                 out = h->delayed_pic[i];
7469                 out_idx = i;
7470             }
7471
7472         for(i=out_idx; h->delayed_pic[i]; i++)
7473             h->delayed_pic[i] = h->delayed_pic[i+1];
7474
7475         if(out){
7476             *data_size = sizeof(AVFrame);
7477             *pict= *(AVFrame*)out;
7478         }
7479
7480         return 0;
7481     }
7482
7483     if(h->is_avc && !h->got_avcC) {
7484         int i, cnt, nalsize;
7485         unsigned char *p = avctx->extradata;
7486         if(avctx->extradata_size < 7) {
7487             av_log(avctx, AV_LOG_ERROR, "avcC too short\n");
7488             return -1;
7489         }
7490         if(*p != 1) {
7491             av_log(avctx, AV_LOG_ERROR, "Unknown avcC version %d\n", *p);
7492             return -1;
7493         }
7494         /* sps and pps in the avcC always have length coded with 2 bytes,
7495            so put a fake nal_length_size = 2 while parsing them */
7496         h->nal_length_size = 2;
7497         // Decode sps from avcC
7498         cnt = *(p+5) & 0x1f; // Number of sps
7499         p += 6;
7500         for (i = 0; i < cnt; i++) {
7501             nalsize = AV_RB16(p) + 2;
7502             if(decode_nal_units(h, p, nalsize) < 0) {
7503                 av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n", i);
7504                 return -1;
7505             }
7506             p += nalsize;
7507         }
7508         // Decode pps from avcC
7509         cnt = *(p++); // Number of pps
7510         for (i = 0; i < cnt; i++) {
7511             nalsize = AV_RB16(p) + 2;
7512             if(decode_nal_units(h, p, nalsize)  != nalsize) {
7513                 av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n", i);
7514                 return -1;
7515             }
7516             p += nalsize;
7517         }
7518         // Now store right nal length size, that will be use to parse all other nals
7519         h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1;
7520         // Do not reparse avcC
7521         h->got_avcC = 1;
7522     }
7523
7524     if(avctx->frame_number==0 && !h->is_avc && s->avctx->extradata_size){
7525         if(decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) < 0)
7526             return -1;
7527     }
7528
7529     buf_index=decode_nal_units(h, buf, buf_size);
7530     if(buf_index < 0)
7531         return -1;
7532
7533     if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){
7534         if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0;
7535         av_log(avctx, AV_LOG_ERROR, "no frame!\n");
7536         return -1;
7537     }
7538
7539     if(!(s->flags2 & CODEC_FLAG2_CHUNKS) || (s->mb_y >= s->mb_height && s->mb_height)){
7540         Picture *out = s->current_picture_ptr;
7541         Picture *cur = s->current_picture_ptr;
7542         int i, pics, cross_idr, out_of_order, out_idx;
7543
7544         s->mb_y= 0;
7545
7546         s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264;
7547         s->current_picture_ptr->pict_type= s->pict_type;
7548
7549         if(!s->dropable) {
7550             execute_ref_pic_marking(h, h->mmco, h->mmco_index);
7551             h->prev_poc_msb= h->poc_msb;
7552             h->prev_poc_lsb= h->poc_lsb;
7553         }
7554         h->prev_frame_num_offset= h->frame_num_offset;
7555         h->prev_frame_num= h->frame_num;
7556
7557         /*
7558          * FIXME: Error handling code does not seem to support interlaced
7559          * when slices span multiple rows
7560          * The ff_er_add_slice calls don't work right for bottom
7561          * fields; they cause massive erroneous error concealing
7562          * Error marking covers both fields (top and bottom).
7563          * This causes a mismatched s->error_count
7564          * and a bad error table. Further, the error count goes to
7565          * INT_MAX when called for bottom field, because mb_y is
7566          * past end by one (callers fault) and resync_mb_y != 0
7567          * causes problems for the first MB line, too.
7568          */
7569         if (!FIELD_PICTURE)
7570             ff_er_frame_end(s);
7571
7572         MPV_frame_end(s);
7573
7574         if (cur->field_poc[0]==INT_MAX || cur->field_poc[1]==INT_MAX) {
7575             /* Wait for second field. */
7576             *data_size = 0;
7577
7578         } else {
7579             cur->interlaced_frame = FIELD_OR_MBAFF_PICTURE;
7580             /* Derive top_field_first from field pocs. */
7581             cur->top_field_first = cur->field_poc[0] < cur->field_poc[1];
7582
7583         //FIXME do something with unavailable reference frames
7584
7585             /* Sort B-frames into display order */
7586
7587             if(h->sps.bitstream_restriction_flag
7588                && s->avctx->has_b_frames < h->sps.num_reorder_frames){
7589                 s->avctx->has_b_frames = h->sps.num_reorder_frames;
7590                 s->low_delay = 0;
7591             }
7592
7593             if(   s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT
7594                && !h->sps.bitstream_restriction_flag){
7595                 s->avctx->has_b_frames= MAX_DELAYED_PIC_COUNT;
7596                 s->low_delay= 0;
7597             }
7598
7599             pics = 0;
7600             while(h->delayed_pic[pics]) pics++;
7601
7602             assert(pics <= MAX_DELAYED_PIC_COUNT);
7603
7604             h->delayed_pic[pics++] = cur;
7605             if(cur->reference == 0)
7606                 cur->reference = DELAYED_PIC_REF;
7607
7608             out = h->delayed_pic[0];
7609             out_idx = 0;
7610             for(i=1; h->delayed_pic[i] && h->delayed_pic[i]->poc; i++)
7611                 if(h->delayed_pic[i]->poc < out->poc){
7612                     out = h->delayed_pic[i];
7613                     out_idx = i;
7614                 }
7615             cross_idr = !h->delayed_pic[0]->poc || !!h->delayed_pic[i];
7616
7617             out_of_order = !cross_idr && out->poc < h->outputed_poc;
7618
7619             if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames)
7620                 { }
7621             else if((out_of_order && pics-1 == s->avctx->has_b_frames && s->avctx->has_b_frames < MAX_DELAYED_PIC_COUNT)
7622                || (s->low_delay &&
7623                 ((!cross_idr && out->poc > h->outputed_poc + 2)
7624                  || cur->pict_type == FF_B_TYPE)))
7625             {
7626                 s->low_delay = 0;
7627                 s->avctx->has_b_frames++;
7628             }
7629
7630             if(out_of_order || pics > s->avctx->has_b_frames){
7631                 out->reference &= ~DELAYED_PIC_REF;
7632                 for(i=out_idx; h->delayed_pic[i]; i++)
7633                     h->delayed_pic[i] = h->delayed_pic[i+1];
7634             }
7635             if(!out_of_order && pics > s->avctx->has_b_frames){
7636                 *data_size = sizeof(AVFrame);
7637
7638                 h->outputed_poc = out->poc;
7639                 *pict= *(AVFrame*)out;
7640             }else{
7641                 av_log(avctx, AV_LOG_DEBUG, "no picture\n");
7642             }
7643         }
7644     }
7645
7646     assert(pict->data[0] || !*data_size);
7647     ff_print_debug_info(s, pict);
7648 //printf("out %d\n", (int)pict->data[0]);
7649 #if 0 //?
7650
7651     /* Return the Picture timestamp as the frame number */
7652     /* we subtract 1 because it is added on utils.c     */
7653     avctx->frame_number = s->picture_number - 1;
7654 #endif
7655     return get_consumed_bytes(s, buf_index, buf_size);
7656 }
7657 #if 0
7658 static inline void fill_mb_avail(H264Context *h){
7659     MpegEncContext * const s = &h->s;
7660     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
7661
7662     if(s->mb_y){
7663         h->mb_avail[0]= s->mb_x                 && h->slice_table[mb_xy - s->mb_stride - 1] == h->slice_num;
7664         h->mb_avail[1]=                            h->slice_table[mb_xy - s->mb_stride    ] == h->slice_num;
7665         h->mb_avail[2]= s->mb_x+1 < s->mb_width && h->slice_table[mb_xy - s->mb_stride + 1] == h->slice_num;
7666     }else{
7667         h->mb_avail[0]=
7668         h->mb_avail[1]=
7669         h->mb_avail[2]= 0;
7670     }
7671     h->mb_avail[3]= s->mb_x && h->slice_table[mb_xy - 1] == h->slice_num;
7672     h->mb_avail[4]= 1; //FIXME move out
7673     h->mb_avail[5]= 0; //FIXME move out
7674 }
7675 #endif
7676
7677 #ifdef TEST
7678 #undef printf
7679 #undef random
7680 #define COUNT 8000
7681 #define SIZE (COUNT*40)
7682 int main(void){
7683     int i;
7684     uint8_t temp[SIZE];
7685     PutBitContext pb;
7686     GetBitContext gb;
7687 //    int int_temp[10000];
7688     DSPContext dsp;
7689     AVCodecContext avctx;
7690
7691     dsputil_init(&dsp, &avctx);
7692
7693     init_put_bits(&pb, temp, SIZE);
7694     printf("testing unsigned exp golomb\n");
7695     for(i=0; i<COUNT; i++){
7696         START_TIMER
7697         set_ue_golomb(&pb, i);
7698         STOP_TIMER("set_ue_golomb");
7699     }
7700     flush_put_bits(&pb);
7701
7702     init_get_bits(&gb, temp, 8*SIZE);
7703     for(i=0; i<COUNT; i++){
7704         int j, s;
7705
7706         s= show_bits(&gb, 24);
7707
7708         START_TIMER
7709         j= get_ue_golomb(&gb);
7710         if(j != i){
7711             printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s);
7712 //            return -1;
7713         }
7714         STOP_TIMER("get_ue_golomb");
7715     }
7716
7717
7718     init_put_bits(&pb, temp, SIZE);
7719     printf("testing signed exp golomb\n");
7720     for(i=0; i<COUNT; i++){
7721         START_TIMER
7722         set_se_golomb(&pb, i - COUNT/2);
7723         STOP_TIMER("set_se_golomb");
7724     }
7725     flush_put_bits(&pb);
7726
7727     init_get_bits(&gb, temp, 8*SIZE);
7728     for(i=0; i<COUNT; i++){
7729         int j, s;
7730
7731         s= show_bits(&gb, 24);
7732
7733         START_TIMER
7734         j= get_se_golomb(&gb);
7735         if(j != i - COUNT/2){
7736             printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s);
7737 //            return -1;
7738         }
7739         STOP_TIMER("get_se_golomb");
7740     }
7741
7742 #if 0
7743     printf("testing 4x4 (I)DCT\n");
7744
7745     DCTELEM block[16];
7746     uint8_t src[16], ref[16];
7747     uint64_t error= 0, max_error=0;
7748
7749     for(i=0; i<COUNT; i++){
7750         int j;
7751 //        printf("%d %d %d\n", r1, r2, (r2-r1)*16);
7752         for(j=0; j<16; j++){
7753             ref[j]= random()%255;
7754             src[j]= random()%255;
7755         }
7756
7757         h264_diff_dct_c(block, src, ref, 4);
7758
7759         //normalize
7760         for(j=0; j<16; j++){
7761 //            printf("%d ", block[j]);
7762             block[j]= block[j]*4;
7763             if(j&1) block[j]= (block[j]*4 + 2)/5;
7764             if(j&4) block[j]= (block[j]*4 + 2)/5;
7765         }
7766 //        printf("\n");
7767
7768         s->dsp.h264_idct_add(ref, block, 4);
7769 /*        for(j=0; j<16; j++){
7770             printf("%d ", ref[j]);
7771         }
7772         printf("\n");*/
7773
7774         for(j=0; j<16; j++){
7775             int diff= FFABS(src[j] - ref[j]);
7776
7777             error+= diff*diff;
7778             max_error= FFMAX(max_error, diff);
7779         }
7780     }
7781     printf("error=%f max_error=%d\n", ((float)error)/COUNT/16, (int)max_error );
7782     printf("testing quantizer\n");
7783     for(qp=0; qp<52; qp++){
7784         for(i=0; i<16; i++)
7785             src1_block[i]= src2_block[i]= random()%255;
7786
7787     }
7788     printf("Testing NAL layer\n");
7789
7790     uint8_t bitstream[COUNT];
7791     uint8_t nal[COUNT*2];
7792     H264Context h;
7793     memset(&h, 0, sizeof(H264Context));
7794
7795     for(i=0; i<COUNT; i++){
7796         int zeros= i;
7797         int nal_length;
7798         int consumed;
7799         int out_length;
7800         uint8_t *out;
7801         int j;
7802
7803         for(j=0; j<COUNT; j++){
7804             bitstream[j]= (random() % 255) + 1;
7805         }
7806
7807         for(j=0; j<zeros; j++){
7808             int pos= random() % COUNT;
7809             while(bitstream[pos] == 0){
7810                 pos++;
7811                 pos %= COUNT;
7812             }
7813             bitstream[pos]=0;
7814         }
7815
7816         START_TIMER
7817
7818         nal_length= encode_nal(&h, nal, bitstream, COUNT, COUNT*2);
7819         if(nal_length<0){
7820             printf("encoding failed\n");
7821             return -1;
7822         }
7823
7824         out= decode_nal(&h, nal, &out_length, &consumed, nal_length);
7825
7826         STOP_TIMER("NAL")
7827
7828         if(out_length != COUNT){
7829             printf("incorrect length %d %d\n", out_length, COUNT);
7830             return -1;
7831         }
7832
7833         if(consumed != nal_length){
7834             printf("incorrect consumed length %d %d\n", nal_length, consumed);
7835             return -1;
7836         }
7837
7838         if(memcmp(bitstream, out, COUNT)){
7839             printf("mismatch\n");
7840             return -1;
7841         }
7842     }
7843 #endif
7844
7845     printf("Testing RBSP\n");
7846
7847
7848     return 0;
7849 }
7850 #endif /* TEST */
7851
7852
7853 static av_cold int decode_end(AVCodecContext *avctx)
7854 {
7855     H264Context *h = avctx->priv_data;
7856     MpegEncContext *s = &h->s;
7857
7858     av_freep(&h->rbsp_buffer[0]);
7859     av_freep(&h->rbsp_buffer[1]);
7860     free_tables(h); //FIXME cleanup init stuff perhaps
7861     MPV_common_end(s);
7862
7863 //    memset(h, 0, sizeof(H264Context));
7864
7865     return 0;
7866 }
7867
7868
7869 AVCodec h264_decoder = {
7870     "h264",
7871     CODEC_TYPE_VIDEO,
7872     CODEC_ID_H264,
7873     sizeof(H264Context),
7874     decode_init,
7875     NULL,
7876     decode_end,
7877     decode_frame,
7878     /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_DELAY,
7879     .flush= flush_dpb,
7880     .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
7881 };
7882
7883 #include "svq3.c"