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