]> git.sesse.net Git - ffmpeg/blob - libavcodec/h264.c
data_size = 0 cleanup
[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 library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  *
19  */
20  
21 /**
22  * @file h264.c
23  * H.264 / AVC / MPEG4 part10 codec.
24  * @author Michael Niedermayer <michaelni@gmx.at>
25  */
26
27 #include "common.h"
28 #include "dsputil.h"
29 #include "avcodec.h"
30 #include "mpegvideo.h"
31 #include "h264data.h"
32 #include "golomb.h"
33
34 #include "cabac.h"
35
36 #undef NDEBUG
37 #include <assert.h>
38
39 #define interlaced_dct interlaced_dct_is_a_bad_name
40 #define mb_intra mb_intra_isnt_initalized_see_mb_type
41
42 #define LUMA_DC_BLOCK_INDEX   25
43 #define CHROMA_DC_BLOCK_INDEX 26
44
45 #define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
46 #define COEFF_TOKEN_VLC_BITS           8
47 #define TOTAL_ZEROS_VLC_BITS           9
48 #define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
49 #define RUN_VLC_BITS                   3
50 #define RUN7_VLC_BITS                  6
51
52 #define MAX_SPS_COUNT 32
53 #define MAX_PPS_COUNT 256
54
55 #define MAX_MMCO_COUNT 66
56
57 /**
58  * Sequence parameter set
59  */
60 typedef struct SPS{
61     
62     int profile_idc;
63     int level_idc;
64     int log2_max_frame_num;            ///< log2_max_frame_num_minus4 + 4
65     int poc_type;                      ///< pic_order_cnt_type
66     int log2_max_poc_lsb;              ///< log2_max_pic_order_cnt_lsb_minus4
67     int delta_pic_order_always_zero_flag;
68     int offset_for_non_ref_pic;
69     int offset_for_top_to_bottom_field;
70     int poc_cycle_length;              ///< num_ref_frames_in_pic_order_cnt_cycle
71     int ref_frame_count;               ///< num_ref_frames
72     int gaps_in_frame_num_allowed_flag;
73     int mb_width;                      ///< frame_width_in_mbs_minus1 + 1
74     int mb_height;                     ///< frame_height_in_mbs_minus1 + 1
75     int frame_mbs_only_flag;
76     int mb_aff;                        ///<mb_adaptive_frame_field_flag
77     int direct_8x8_inference_flag;
78     int crop;                   ///< frame_cropping_flag
79     int crop_left;              ///< frame_cropping_rect_left_offset
80     int crop_right;             ///< frame_cropping_rect_right_offset
81     int crop_top;               ///< frame_cropping_rect_top_offset
82     int crop_bottom;            ///< frame_cropping_rect_bottom_offset
83     int vui_parameters_present_flag;
84     AVRational sar;
85     short offset_for_ref_frame[256]; //FIXME dyn aloc?
86 }SPS;
87
88 /**
89  * Picture parameter set
90  */
91 typedef struct PPS{
92     int sps_id;
93     int cabac;                  ///< entropy_coding_mode_flag
94     int pic_order_present;      ///< pic_order_present_flag
95     int slice_group_count;      ///< num_slice_groups_minus1 + 1
96     int mb_slice_group_map_type;
97     int ref_count[2];           ///< num_ref_idx_l0/1_active_minus1 + 1
98     int weighted_pred;          ///< weighted_pred_flag
99     int weighted_bipred_idc;
100     int init_qp;                ///< pic_init_qp_minus26 + 26
101     int init_qs;                ///< pic_init_qs_minus26 + 26
102     int chroma_qp_index_offset;
103     int deblocking_filter_parameters_present; ///< deblocking_filter_parameters_present_flag
104     int constrained_intra_pred; ///< constrained_intra_pred_flag
105     int redundant_pic_cnt_present; ///< redundant_pic_cnt_present_flag
106 }PPS;
107
108 /**
109  * Memory management control operation opcode.
110  */
111 typedef enum MMCOOpcode{
112     MMCO_END=0,
113     MMCO_SHORT2UNUSED,
114     MMCO_LONG2UNUSED,
115     MMCO_SHORT2LONG,
116     MMCO_SET_MAX_LONG,
117     MMCO_RESET, 
118     MMCO_LONG,
119 } MMCOOpcode;
120
121 /**
122  * Memory management control operation.
123  */
124 typedef struct MMCO{
125     MMCOOpcode opcode;
126     int short_frame_num;
127     int long_index;
128 } MMCO;
129
130 /**
131  * H264Context
132  */
133 typedef struct H264Context{
134     MpegEncContext s;
135     int nal_ref_idc;    
136     int nal_unit_type;
137 #define NAL_SLICE               1
138 #define NAL_DPA                 2
139 #define NAL_DPB                 3
140 #define NAL_DPC                 4
141 #define NAL_IDR_SLICE           5
142 #define NAL_SEI                 6
143 #define NAL_SPS                 7
144 #define NAL_PPS                 8
145 #define NAL_PICTURE_DELIMITER   9
146 #define NAL_FILTER_DATA         10
147     uint8_t *rbsp_buffer;
148     int rbsp_buffer_size;
149
150     int chroma_qp; //QPc
151
152     int prev_mb_skiped; //FIXME remove (IMHO not used)
153
154     //prediction stuff
155     int chroma_pred_mode;
156     int intra16x16_pred_mode;
157     
158     int8_t intra4x4_pred_mode_cache[5*8];
159     int8_t (*intra4x4_pred_mode)[8];
160     void (*pred4x4  [9+3])(uint8_t *src, uint8_t *topright, int stride);//FIXME move to dsp?
161     void (*pred8x8  [4+3])(uint8_t *src, int stride);
162     void (*pred16x16[4+3])(uint8_t *src, int stride);
163     unsigned int topleft_samples_available;
164     unsigned int top_samples_available;
165     unsigned int topright_samples_available;
166     unsigned int left_samples_available;
167     uint8_t (*top_border)[16+2*8];
168     uint8_t left_border[17+2*9];
169
170     /**
171      * non zero coeff count cache.
172      * is 64 if not available.
173      */
174     uint8_t non_zero_count_cache[6*8];
175     uint8_t (*non_zero_count)[16];
176
177     /**
178      * Motion vector cache.
179      */
180     int16_t mv_cache[2][5*8][2];
181     int8_t ref_cache[2][5*8];
182 #define LIST_NOT_USED -1 //FIXME rename?
183 #define PART_NOT_AVAILABLE -2
184     
185     /**
186      * is 1 if the specific list MV&references are set to 0,0,-2.
187      */
188     int mv_cache_clean[2];
189
190     int block_offset[16+8];
191     int chroma_subblock_offset[16]; //FIXME remove
192     
193     uint16_t *mb2b_xy; //FIXME are these 4 a good idea?
194     uint16_t *mb2b8_xy;
195     int b_stride;
196     int b8_stride;
197
198     int halfpel_flag;
199     int thirdpel_flag;
200
201     int unknown_svq3_flag;
202     int next_slice_index;
203
204     SPS sps_buffer[MAX_SPS_COUNT];
205     SPS sps; ///< current sps
206     
207     PPS pps_buffer[MAX_PPS_COUNT];
208     /**
209      * current pps
210      */
211     PPS pps; //FIXME move tp Picture perhaps? (->no) do we need that?
212
213     int slice_num;
214     uint8_t *slice_table_base;
215     uint8_t *slice_table;      ///< slice_table_base + mb_stride + 1
216     int slice_type;
217     int slice_type_fixed;
218     
219     //interlacing specific flags
220     int mb_field_decoding_flag;
221     
222     int sub_mb_type[4];
223     
224     //POC stuff
225     int poc_lsb;
226     int poc_msb;
227     int delta_poc_bottom;
228     int delta_poc[2];
229     int frame_num;
230     int prev_poc_msb;             ///< poc_msb of the last reference pic for POC type 0
231     int prev_poc_lsb;             ///< poc_lsb of the last reference pic for POC type 0
232     int frame_num_offset;         ///< for POC type 2
233     int prev_frame_num_offset;    ///< for POC type 2
234     int prev_frame_num;           ///< frame_num of the last pic for POC type 1/2
235
236     /**
237      * frame_num for frames or 2*frame_num for field pics.
238      */
239     int curr_pic_num;
240     
241     /**
242      * max_frame_num or 2*max_frame_num for field pics.
243      */
244     int max_pic_num;
245
246     //Weighted pred stuff
247     int luma_log2_weight_denom;
248     int chroma_log2_weight_denom;
249     int luma_weight[2][16];
250     int luma_offset[2][16];
251     int chroma_weight[2][16][2];
252     int chroma_offset[2][16][2];
253    
254     //deblock
255     int deblocking_filter;         ///< disable_deblocking_filter_idc with 1<->0 
256     int slice_alpha_c0_offset;
257     int slice_beta_offset;
258      
259     int redundant_pic_count;
260     
261     int direct_spatial_mv_pred;
262
263     /**
264      * num_ref_idx_l0/1_active_minus1 + 1
265      */
266     int ref_count[2];// FIXME split for AFF
267     Picture *short_ref[16];
268     Picture *long_ref[16];
269     Picture default_ref_list[2][32];
270     Picture ref_list[2][32]; //FIXME size?
271     Picture field_ref_list[2][32]; //FIXME size?
272     
273     /**
274      * memory management control operations buffer.
275      */
276     MMCO mmco[MAX_MMCO_COUNT];
277     int mmco_index;
278     
279     int long_ref_count;  ///< number of actual long term references
280     int short_ref_count; ///< number of actual short term references
281     
282     //data partitioning
283     GetBitContext intra_gb;
284     GetBitContext inter_gb;
285     GetBitContext *intra_gb_ptr;
286     GetBitContext *inter_gb_ptr;
287     
288     DCTELEM mb[16*24] __align8;
289
290     /**
291      * Cabac
292      */
293     CABACContext cabac;
294     uint8_t      cabac_state[399];
295     int          cabac_init_idc;
296
297     /* 0x100 -> non null luma_dc, 0x80/0x40 -> non null chroma_dc (cb/cr), 0x?0 -> chroma_cbp(0,1,2), 0x0? luma_cbp */
298     uint16_t     *cbp_table;
299     /* chroma_pred_mode for i4x4 or i16x16, else 0 */
300     uint8_t     *chroma_pred_mode_table;
301     int         last_qscale_diff;
302     int16_t     (*mvd_table[2])[2];
303     int16_t     mvd_cache[2][5*8][2];
304
305 }H264Context;
306
307 static VLC coeff_token_vlc[4];
308 static VLC chroma_dc_coeff_token_vlc;
309
310 static VLC total_zeros_vlc[15];
311 static VLC chroma_dc_total_zeros_vlc[3];
312
313 static VLC run_vlc[6];
314 static VLC run7_vlc;
315
316 static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp);
317 static void svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc);
318 static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr);
319
320 static inline uint32_t pack16to32(int a, int b){
321 #ifdef WORDS_BIGENDIAN
322    return (b&0xFFFF) + (a<<16);
323 #else
324    return (a&0xFFFF) + (b<<16);
325 #endif
326 }
327
328 /**
329  * fill a rectangle.
330  * @param h height of the recatangle, should be a constant
331  * @param w width of the recatangle, should be a constant
332  * @param size the size of val (1 or 4), should be a constant
333  */
334 static inline void fill_rectangle(void *vp, int w, int h, int stride, uint32_t val, int size){ //FIXME ensure this IS inlined
335     uint8_t *p= (uint8_t*)vp;
336     assert(size==1 || size==4);
337     
338     w      *= size;
339     stride *= size;
340     
341 //FIXME check what gcc generates for 64 bit on x86 and possible write a 32 bit ver of it
342     if(w==2 && h==2){
343         *(uint16_t*)(p + 0)=
344         *(uint16_t*)(p + stride)= size==4 ? val : val*0x0101;
345     }else if(w==2 && h==4){
346         *(uint16_t*)(p + 0*stride)=
347         *(uint16_t*)(p + 1*stride)=
348         *(uint16_t*)(p + 2*stride)=
349         *(uint16_t*)(p + 3*stride)= size==4 ? val : val*0x0101;
350     }else if(w==4 && h==1){
351         *(uint32_t*)(p + 0*stride)= size==4 ? val : val*0x01010101;
352     }else if(w==4 && h==2){
353         *(uint32_t*)(p + 0*stride)=
354         *(uint32_t*)(p + 1*stride)= size==4 ? val : val*0x01010101;
355     }else if(w==4 && h==4){
356         *(uint32_t*)(p + 0*stride)=
357         *(uint32_t*)(p + 1*stride)=
358         *(uint32_t*)(p + 2*stride)=
359         *(uint32_t*)(p + 3*stride)= size==4 ? val : val*0x01010101;
360     }else if(w==8 && h==1){
361         *(uint32_t*)(p + 0)=
362         *(uint32_t*)(p + 4)= size==4 ? val : val*0x01010101;
363     }else if(w==8 && h==2){
364         *(uint32_t*)(p + 0 + 0*stride)=
365         *(uint32_t*)(p + 4 + 0*stride)=
366         *(uint32_t*)(p + 0 + 1*stride)=
367         *(uint32_t*)(p + 4 + 1*stride)=  size==4 ? val : val*0x01010101;
368     }else if(w==8 && h==4){
369         *(uint64_t*)(p + 0*stride)=
370         *(uint64_t*)(p + 1*stride)=
371         *(uint64_t*)(p + 2*stride)=
372         *(uint64_t*)(p + 3*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
373     }else if(w==16 && h==2){
374         *(uint64_t*)(p + 0+0*stride)=
375         *(uint64_t*)(p + 8+0*stride)=
376         *(uint64_t*)(p + 0+1*stride)=
377         *(uint64_t*)(p + 8+1*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
378     }else if(w==16 && h==4){
379         *(uint64_t*)(p + 0+0*stride)=
380         *(uint64_t*)(p + 8+0*stride)=
381         *(uint64_t*)(p + 0+1*stride)=
382         *(uint64_t*)(p + 8+1*stride)=
383         *(uint64_t*)(p + 0+2*stride)=
384         *(uint64_t*)(p + 8+2*stride)=
385         *(uint64_t*)(p + 0+3*stride)=
386         *(uint64_t*)(p + 8+3*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
387     }else
388         assert(0);
389 }
390
391 static inline void fill_caches(H264Context *h, int mb_type){
392     MpegEncContext * const s = &h->s;
393     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
394     int topleft_xy, top_xy, topright_xy, left_xy[2];
395     int topleft_type, top_type, topright_type, left_type[2];
396     int left_block[4];
397     int i;
398
399     //wow what a mess, why didnt they simplify the interlacing&intra stuff, i cant imagine that these complex rules are worth it 
400     
401     if(h->sps.mb_aff){
402     //FIXME
403         topleft_xy = 0; /* avoid warning */
404         top_xy = 0; /* avoid warning */
405         topright_xy = 0; /* avoid warning */
406     }else{
407         topleft_xy = mb_xy-1 - s->mb_stride;
408         top_xy     = mb_xy   - s->mb_stride;
409         topright_xy= mb_xy+1 - s->mb_stride;
410         left_xy[0]   = mb_xy-1;
411         left_xy[1]   = mb_xy-1;
412         left_block[0]= 0;
413         left_block[1]= 1;
414         left_block[2]= 2;
415         left_block[3]= 3;
416     }
417
418     topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0;
419     top_type     = h->slice_table[top_xy     ] == h->slice_num ? s->current_picture.mb_type[top_xy]     : 0;
420     topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0;
421     left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0;
422     left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0;
423
424     if(IS_INTRA(mb_type)){
425         h->topleft_samples_available= 
426         h->top_samples_available= 
427         h->left_samples_available= 0xFFFF;
428         h->topright_samples_available= 0xEEEA;
429
430         if(!IS_INTRA(top_type) && (top_type==0 || h->pps.constrained_intra_pred)){
431             h->topleft_samples_available= 0xB3FF;
432             h->top_samples_available= 0x33FF;
433             h->topright_samples_available= 0x26EA;
434         }
435         for(i=0; i<2; i++){
436             if(!IS_INTRA(left_type[i]) && (left_type[i]==0 || h->pps.constrained_intra_pred)){
437                 h->topleft_samples_available&= 0xDF5F;
438                 h->left_samples_available&= 0x5F5F;
439             }
440         }
441         
442         if(!IS_INTRA(topleft_type) && (topleft_type==0 || h->pps.constrained_intra_pred))
443             h->topleft_samples_available&= 0x7FFF;
444         
445         if(!IS_INTRA(topright_type) && (topright_type==0 || h->pps.constrained_intra_pred))
446             h->topright_samples_available&= 0xFBFF;
447     
448         if(IS_INTRA4x4(mb_type)){
449             if(IS_INTRA4x4(top_type)){
450                 h->intra4x4_pred_mode_cache[4+8*0]= h->intra4x4_pred_mode[top_xy][4];
451                 h->intra4x4_pred_mode_cache[5+8*0]= h->intra4x4_pred_mode[top_xy][5];
452                 h->intra4x4_pred_mode_cache[6+8*0]= h->intra4x4_pred_mode[top_xy][6];
453                 h->intra4x4_pred_mode_cache[7+8*0]= h->intra4x4_pred_mode[top_xy][3];
454             }else{
455                 int pred;
456                 if(IS_INTRA16x16(top_type) || (IS_INTER(top_type) && !h->pps.constrained_intra_pred))
457                     pred= 2;
458                 else{
459                     pred= -1;
460                 }
461                 h->intra4x4_pred_mode_cache[4+8*0]=
462                 h->intra4x4_pred_mode_cache[5+8*0]=
463                 h->intra4x4_pred_mode_cache[6+8*0]=
464                 h->intra4x4_pred_mode_cache[7+8*0]= pred;
465             }
466             for(i=0; i<2; i++){
467                 if(IS_INTRA4x4(left_type[i])){
468                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+2*i]];
469                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+2*i]];
470                 }else{
471                     int pred;
472                     if(IS_INTRA16x16(left_type[i]) || (IS_INTER(left_type[i]) && !h->pps.constrained_intra_pred))
473                         pred= 2;
474                     else{
475                         pred= -1;
476                     }
477                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]=
478                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= pred;
479                 }
480             }
481         }
482     }
483     
484     
485 /*
486 0 . T T. T T T T 
487 1 L . .L . . . . 
488 2 L . .L . . . . 
489 3 . T TL . . . . 
490 4 L . .L . . . . 
491 5 L . .. . . . . 
492 */
493 //FIXME constraint_intra_pred & partitioning & nnz (lets hope this is just a typo in the spec)
494     if(top_type){
495         h->non_zero_count_cache[4+8*0]= h->non_zero_count[top_xy][0];
496         h->non_zero_count_cache[5+8*0]= h->non_zero_count[top_xy][1];
497         h->non_zero_count_cache[6+8*0]= h->non_zero_count[top_xy][2];
498         h->non_zero_count_cache[7+8*0]= h->non_zero_count[top_xy][3];
499     
500         h->non_zero_count_cache[1+8*0]= h->non_zero_count[top_xy][7];
501         h->non_zero_count_cache[2+8*0]= h->non_zero_count[top_xy][8];
502     
503         h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][10];
504         h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11];
505     }else{
506         h->non_zero_count_cache[4+8*0]=      
507         h->non_zero_count_cache[5+8*0]=
508         h->non_zero_count_cache[6+8*0]=
509         h->non_zero_count_cache[7+8*0]=
510     
511         h->non_zero_count_cache[1+8*0]=
512         h->non_zero_count_cache[2+8*0]=
513     
514         h->non_zero_count_cache[1+8*3]=
515         h->non_zero_count_cache[2+8*3]= 64;
516     }
517     
518     if(left_type[0]){
519         h->non_zero_count_cache[3+8*1]= h->non_zero_count[left_xy[0]][6];
520         h->non_zero_count_cache[3+8*2]= h->non_zero_count[left_xy[0]][5];
521         h->non_zero_count_cache[0+8*1]= h->non_zero_count[left_xy[0]][9]; //FIXME left_block
522         h->non_zero_count_cache[0+8*4]= h->non_zero_count[left_xy[0]][12];
523     }else{
524         h->non_zero_count_cache[3+8*1]= 
525         h->non_zero_count_cache[3+8*2]= 
526         h->non_zero_count_cache[0+8*1]= 
527         h->non_zero_count_cache[0+8*4]= 64;
528     }
529     
530     if(left_type[1]){
531         h->non_zero_count_cache[3+8*3]= h->non_zero_count[left_xy[1]][4];
532         h->non_zero_count_cache[3+8*4]= h->non_zero_count[left_xy[1]][3];
533         h->non_zero_count_cache[0+8*2]= h->non_zero_count[left_xy[1]][8];
534         h->non_zero_count_cache[0+8*5]= h->non_zero_count[left_xy[1]][11];
535     }else{
536         h->non_zero_count_cache[3+8*3]= 
537         h->non_zero_count_cache[3+8*4]= 
538         h->non_zero_count_cache[0+8*2]= 
539         h->non_zero_count_cache[0+8*5]= 64;
540     }
541     
542 #if 1
543     if(IS_INTER(mb_type)){
544         int list;
545         for(list=0; list<2; list++){
546             if((!IS_8X8(mb_type)) && !USES_LIST(mb_type, list)){
547                 /*if(!h->mv_cache_clean[list]){
548                     memset(h->mv_cache [list],  0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all?
549                     memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t));
550                     h->mv_cache_clean[list]= 1;
551                 }*/
552                 continue; //FIXME direct mode ...
553             }
554             h->mv_cache_clean[list]= 0;
555             
556             if(IS_INTER(topleft_type)){
557                 const int b_xy = h->mb2b_xy[topleft_xy] + 3 + 3*h->b_stride;
558                 const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + h->b8_stride;
559                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
560                 h->ref_cache[list][scan8[0] - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy];
561             }else{
562                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= 0;
563                 h->ref_cache[list][scan8[0] - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
564             }
565             
566             if(IS_INTER(top_type)){
567                 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
568                 const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride;
569                 *(uint32_t*)h->mv_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0];
570                 *(uint32_t*)h->mv_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1];
571                 *(uint32_t*)h->mv_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2];
572                 *(uint32_t*)h->mv_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3];
573                 h->ref_cache[list][scan8[0] + 0 - 1*8]=
574                 h->ref_cache[list][scan8[0] + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0];
575                 h->ref_cache[list][scan8[0] + 2 - 1*8]=
576                 h->ref_cache[list][scan8[0] + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1];
577             }else{
578                 *(uint32_t*)h->mv_cache [list][scan8[0] + 0 - 1*8]= 
579                 *(uint32_t*)h->mv_cache [list][scan8[0] + 1 - 1*8]= 
580                 *(uint32_t*)h->mv_cache [list][scan8[0] + 2 - 1*8]= 
581                 *(uint32_t*)h->mv_cache [list][scan8[0] + 3 - 1*8]= 0;
582                 *(uint32_t*)&h->ref_cache[list][scan8[0] + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101;
583             }
584
585             if(IS_INTER(topright_type)){
586                 const int b_xy= h->mb2b_xy[topright_xy] + 3*h->b_stride;
587                 const int b8_xy= h->mb2b8_xy[topright_xy] + h->b8_stride;
588                 *(uint32_t*)h->mv_cache[list][scan8[0] + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
589                 h->ref_cache[list][scan8[0] + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy];
590             }else{
591                 *(uint32_t*)h->mv_cache [list][scan8[0] + 4 - 1*8]= 0;
592                 h->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
593             }
594             
595             //FIXME unify cleanup or sth
596             if(IS_INTER(left_type[0])){
597                 const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
598                 const int b8_xy= h->mb2b8_xy[left_xy[0]] + 1;
599                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 + 0*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[0]];
600                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 + 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[1]];
601                 h->ref_cache[list][scan8[0] - 1 + 0*8]= 
602                 h->ref_cache[list][scan8[0] - 1 + 1*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0]>>1)];
603             }else{
604                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 0*8]=
605                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 1*8]= 0;
606                 h->ref_cache[list][scan8[0] - 1 + 0*8]=
607                 h->ref_cache[list][scan8[0] - 1 + 1*8]= left_type[0] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
608             }
609             
610             if(IS_INTER(left_type[1])){
611                 const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
612                 const int b8_xy= h->mb2b8_xy[left_xy[1]] + 1;
613                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 + 2*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[2]];
614                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 + 3*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + h->b_stride*left_block[3]];
615                 h->ref_cache[list][scan8[0] - 1 + 2*8]= 
616                 h->ref_cache[list][scan8[0] - 1 + 3*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[2]>>1)];
617             }else{
618                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 2*8]=
619                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 3*8]= 0;
620                 h->ref_cache[list][scan8[0] - 1 + 2*8]=
621                 h->ref_cache[list][scan8[0] - 1 + 3*8]= left_type[0] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
622             }
623
624             h->ref_cache[list][scan8[5 ]+1] = 
625             h->ref_cache[list][scan8[7 ]+1] = 
626             h->ref_cache[list][scan8[13]+1] =  //FIXME remove past 3 (init somewher else)
627             h->ref_cache[list][scan8[4 ]] = 
628             h->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE;
629             *(uint32_t*)h->mv_cache [list][scan8[5 ]+1]=
630             *(uint32_t*)h->mv_cache [list][scan8[7 ]+1]=
631             *(uint32_t*)h->mv_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewher else)
632             *(uint32_t*)h->mv_cache [list][scan8[4 ]]=
633             *(uint32_t*)h->mv_cache [list][scan8[12]]= 0;
634
635             if( h->pps.cabac ) {
636                 /* XXX beurk, Load mvd */
637                 if(IS_INTER(topleft_type)){
638                     const int b_xy = h->mb2b_xy[topleft_xy] + 3 + 3*h->b_stride;
639                     *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy];
640                 }else{
641                     *(uint32_t*)h->mvd_cache[list][scan8[0] - 1 - 1*8]= 0;
642                 }
643
644                 if(IS_INTER(top_type)){
645                     const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
646                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 0];
647                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 1];
648                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 2];
649                     *(uint32_t*)h->mvd_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)h->mvd_table[list][b_xy + 3];
650                 }else{
651                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 0 - 1*8]= 
652                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 1 - 1*8]= 
653                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 2 - 1*8]= 
654                     *(uint32_t*)h->mvd_cache [list][scan8[0] + 3 - 1*8]= 0;
655                 }
656                 if(IS_INTER(left_type[0])){
657                     const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
658                     *(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]];
659                     *(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]];
660                 }else{
661                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 0*8]=
662                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 1*8]= 0;
663                 }
664                 if(IS_INTER(left_type[1])){
665                     const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
666                     *(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]];
667                     *(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]];
668                 }else{
669                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 2*8]=
670                     *(uint32_t*)h->mvd_cache [list][scan8[0] - 1 + 3*8]= 0;
671                 }
672                 *(uint32_t*)h->mvd_cache [list][scan8[5 ]+1]=
673                 *(uint32_t*)h->mvd_cache [list][scan8[7 ]+1]=
674                 *(uint32_t*)h->mvd_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewher else)
675                 *(uint32_t*)h->mvd_cache [list][scan8[4 ]]=
676                 *(uint32_t*)h->mvd_cache [list][scan8[12]]= 0;
677             }
678         }
679 //FIXME
680     }
681 #endif
682 }
683
684 static inline void write_back_intra_pred_mode(H264Context *h){
685     MpegEncContext * const s = &h->s;
686     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
687
688     h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1];
689     h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2];
690     h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3];
691     h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4];
692     h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4];
693     h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4];
694     h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4];
695 }
696
697 /**
698  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
699  */
700 static inline int check_intra4x4_pred_mode(H264Context *h){
701     MpegEncContext * const s = &h->s;
702     static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0};
703     static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED};
704     int i;
705     
706     if(!(h->top_samples_available&0x8000)){
707         for(i=0; i<4; i++){
708             int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ];
709             if(status<0){
710                 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);
711                 return -1;
712             } else if(status){
713                 h->intra4x4_pred_mode_cache[scan8[0] + i]= status;
714             }
715         }
716     }
717     
718     if(!(h->left_samples_available&0x8000)){
719         for(i=0; i<4; i++){
720             int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ];
721             if(status<0){
722                 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);
723                 return -1;
724             } else if(status){
725                 h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status;
726             }
727         }
728     }
729
730     return 0;
731 } //FIXME cleanup like next
732
733 /**
734  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
735  */
736 static inline int check_intra_pred_mode(H264Context *h, int mode){
737     MpegEncContext * const s = &h->s;
738     static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};
739     static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};
740     
741     if(!(h->top_samples_available&0x8000)){
742         mode= top[ mode ];
743         if(mode<0){
744             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);
745             return -1;
746         }
747     }
748     
749     if(!(h->left_samples_available&0x8000)){
750         mode= left[ mode ];
751         if(mode<0){
752             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);
753             return -1;
754         } 
755     }
756
757     return mode;
758 }
759
760 /**
761  * gets the predicted intra4x4 prediction mode.
762  */
763 static inline int pred_intra_mode(H264Context *h, int n){
764     const int index8= scan8[n];
765     const int left= h->intra4x4_pred_mode_cache[index8 - 1];
766     const int top = h->intra4x4_pred_mode_cache[index8 - 8];
767     const int min= FFMIN(left, top);
768
769     tprintf("mode:%d %d min:%d\n", left ,top, min);
770
771     if(min<0) return DC_PRED;
772     else      return min;
773 }
774
775 static inline void write_back_non_zero_count(H264Context *h){
776     MpegEncContext * const s = &h->s;
777     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
778
779     h->non_zero_count[mb_xy][0]= h->non_zero_count_cache[4+8*4];
780     h->non_zero_count[mb_xy][1]= h->non_zero_count_cache[5+8*4];
781     h->non_zero_count[mb_xy][2]= h->non_zero_count_cache[6+8*4];
782     h->non_zero_count[mb_xy][3]= h->non_zero_count_cache[7+8*4];
783     h->non_zero_count[mb_xy][4]= h->non_zero_count_cache[7+8*3];
784     h->non_zero_count[mb_xy][5]= h->non_zero_count_cache[7+8*2];
785     h->non_zero_count[mb_xy][6]= h->non_zero_count_cache[7+8*1];
786     
787     h->non_zero_count[mb_xy][7]= h->non_zero_count_cache[1+8*2];
788     h->non_zero_count[mb_xy][8]= h->non_zero_count_cache[2+8*2];
789     h->non_zero_count[mb_xy][9]= h->non_zero_count_cache[2+8*1];
790
791     h->non_zero_count[mb_xy][10]=h->non_zero_count_cache[1+8*5];
792     h->non_zero_count[mb_xy][11]=h->non_zero_count_cache[2+8*5];
793     h->non_zero_count[mb_xy][12]=h->non_zero_count_cache[2+8*4];
794 }
795
796 /**
797  * gets the predicted number of non zero coefficients.
798  * @param n block index
799  */
800 static inline int pred_non_zero_count(H264Context *h, int n){
801     const int index8= scan8[n];
802     const int left= h->non_zero_count_cache[index8 - 1];
803     const int top = h->non_zero_count_cache[index8 - 8];
804     int i= left + top;
805     
806     if(i<64) i= (i+1)>>1;
807
808     tprintf("pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31);
809
810     return i&31;
811 }
812
813 static inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width){
814     const int topright_ref= h->ref_cache[list][ i - 8 + part_width ];
815
816     if(topright_ref != PART_NOT_AVAILABLE){
817         *C= h->mv_cache[list][ i - 8 + part_width ];
818         return topright_ref;
819     }else{
820         tprintf("topright MV not available\n");
821
822         *C= h->mv_cache[list][ i - 8 - 1 ];
823         return h->ref_cache[list][ i - 8 - 1 ];
824     }
825 }
826
827 /**
828  * gets the predicted MV.
829  * @param n the block index
830  * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
831  * @param mx the x component of the predicted motion vector
832  * @param my the y component of the predicted motion vector
833  */
834 static inline void pred_motion(H264Context * const h, int n, int part_width, int list, int ref, int * const mx, int * const my){
835     const int index8= scan8[n];
836     const int top_ref=      h->ref_cache[list][ index8 - 8 ];
837     const int left_ref=     h->ref_cache[list][ index8 - 1 ];
838     const int16_t * const A= h->mv_cache[list][ index8 - 1 ];
839     const int16_t * const B= h->mv_cache[list][ index8 - 8 ];
840     const int16_t * C;
841     int diagonal_ref, match_count;
842
843     assert(part_width==1 || part_width==2 || part_width==4);
844
845 /* mv_cache
846   B . . A T T T T 
847   U . . L . . , .
848   U . . L . . . .
849   U . . L . . , .
850   . . . L . . . .
851 */
852
853     diagonal_ref= fetch_diagonal_mv(h, &C, index8, list, part_width);
854     match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref);
855     if(match_count > 1){ //most common
856         *mx= mid_pred(A[0], B[0], C[0]);
857         *my= mid_pred(A[1], B[1], C[1]);
858     }else if(match_count==1){
859         if(left_ref==ref){
860             *mx= A[0];
861             *my= A[1];        
862         }else if(top_ref==ref){
863             *mx= B[0];
864             *my= B[1];        
865         }else{
866             *mx= C[0];
867             *my= C[1];        
868         }
869     }else{
870         if(top_ref == PART_NOT_AVAILABLE && diagonal_ref == PART_NOT_AVAILABLE && left_ref != PART_NOT_AVAILABLE){
871             *mx= A[0];
872             *my= A[1];        
873         }else{
874             *mx= mid_pred(A[0], B[0], C[0]);
875             *my= mid_pred(A[1], B[1], C[1]);
876         }
877     }
878         
879     tprintf("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);
880 }
881
882 /**
883  * gets the directionally predicted 16x8 MV.
884  * @param n the block index
885  * @param mx the x component of the predicted motion vector
886  * @param my the y component of the predicted motion vector
887  */
888 static inline void pred_16x8_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
889     if(n==0){
890         const int top_ref=      h->ref_cache[list][ scan8[0] - 8 ];
891         const int16_t * const B= h->mv_cache[list][ scan8[0] - 8 ];
892
893         tprintf("pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d", top_ref, B[0], B[1], h->s.mb_x, h->s.mb_y, n, list);
894         
895         if(top_ref == ref){
896             *mx= B[0];
897             *my= B[1];
898             return;
899         }
900     }else{
901         const int left_ref=     h->ref_cache[list][ scan8[8] - 1 ];
902         const int16_t * const A= h->mv_cache[list][ scan8[8] - 1 ];
903         
904         tprintf("pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list);
905
906         if(left_ref == ref){
907             *mx= A[0];
908             *my= A[1];
909             return;
910         }
911     }
912
913     //RARE
914     pred_motion(h, n, 4, list, ref, mx, my);
915 }
916
917 /**
918  * gets the directionally predicted 8x16 MV.
919  * @param n the block index
920  * @param mx the x component of the predicted motion vector
921  * @param my the y component of the predicted motion vector
922  */
923 static inline void pred_8x16_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
924     if(n==0){
925         const int left_ref=      h->ref_cache[list][ scan8[0] - 1 ];
926         const int16_t * const A=  h->mv_cache[list][ scan8[0] - 1 ];
927         
928         tprintf("pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d", left_ref, A[0], A[1], h->s.mb_x, h->s.mb_y, n, list);
929
930         if(left_ref == ref){
931             *mx= A[0];
932             *my= A[1];
933             return;
934         }
935     }else{
936         const int16_t * C;
937         int diagonal_ref;
938
939         diagonal_ref= fetch_diagonal_mv(h, &C, scan8[4], list, 2);
940         
941         tprintf("pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d", diagonal_ref, C[0], C[1], h->s.mb_x, h->s.mb_y, n, list);
942
943         if(diagonal_ref == ref){ 
944             *mx= C[0];
945             *my= C[1];
946             return;
947         }
948     }
949
950     //RARE
951     pred_motion(h, n, 2, list, ref, mx, my);
952 }
953
954 static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my){
955     const int top_ref = h->ref_cache[0][ scan8[0] - 8 ];
956     const int left_ref= h->ref_cache[0][ scan8[0] - 1 ];
957
958     tprintf("pred_pskip: (%d) (%d) at %2d %2d", top_ref, left_ref, h->s.mb_x, h->s.mb_y);
959
960     if(top_ref == PART_NOT_AVAILABLE || left_ref == PART_NOT_AVAILABLE
961        || (top_ref == 0  && *(uint32_t*)h->mv_cache[0][ scan8[0] - 8 ] == 0)
962        || (left_ref == 0 && *(uint32_t*)h->mv_cache[0][ scan8[0] - 1 ] == 0)){
963        
964         *mx = *my = 0;
965         return;
966     }
967         
968     pred_motion(h, 0, 4, 0, 0, mx, my);
969
970     return;
971 }
972
973 static inline void write_back_motion(H264Context *h, int mb_type){
974     MpegEncContext * const s = &h->s;
975     const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
976     const int b8_xy= 2*s->mb_x + 2*s->mb_y*h->b8_stride;
977     int list;
978
979     for(list=0; list<2; list++){
980         int y;
981         if((!IS_8X8(mb_type)) && !USES_LIST(mb_type, list)){
982             if(1){ //FIXME skip or never read if mb_type doesnt use it
983                 for(y=0; y<4; y++){
984                     *(uint64_t*)s->current_picture.motion_val[list][b_xy + 0 + y*h->b_stride]=
985                     *(uint64_t*)s->current_picture.motion_val[list][b_xy + 2 + y*h->b_stride]= 0;
986                 }
987                 if( h->pps.cabac ) {
988                     /* FIXME needed ? */
989                     for(y=0; y<4; y++){
990                         *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]=
991                         *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= 0;
992                     }
993                 }
994                 for(y=0; y<2; y++){
995                     *(uint16_t*)s->current_picture.motion_val[list][b8_xy + y*h->b8_stride]= (LIST_NOT_USED&0xFF)*0x0101;
996                 }
997             }
998             continue; //FIXME direct mode ...
999         }
1000         
1001         for(y=0; y<4; y++){
1002             *(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];
1003             *(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];
1004         }
1005         if( h->pps.cabac ) {
1006             for(y=0; y<4; y++){
1007                 *(uint64_t*)h->mvd_table[list][b_xy + 0 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+0 + 8*y];
1008                 *(uint64_t*)h->mvd_table[list][b_xy + 2 + y*h->b_stride]= *(uint64_t*)h->mvd_cache[list][scan8[0]+2 + 8*y];
1009             }
1010         }
1011         for(y=0; y<2; y++){
1012             s->current_picture.ref_index[list][b8_xy + 0 + y*h->b8_stride]= h->ref_cache[list][scan8[0]+0 + 16*y];
1013             s->current_picture.ref_index[list][b8_xy + 1 + y*h->b8_stride]= h->ref_cache[list][scan8[0]+2 + 16*y];
1014         }
1015     }
1016 }
1017
1018 /**
1019  * Decodes a network abstraction layer unit.
1020  * @param consumed is the number of bytes used as input
1021  * @param length is the length of the array
1022  * @param dst_length is the number of decoded bytes FIXME here or a decode rbsp ttailing?
1023  * @returns decoded bytes, might be src+1 if no escapes 
1024  */
1025 static uint8_t *decode_nal(H264Context *h, uint8_t *src, int *dst_length, int *consumed, int length){
1026     int i, si, di;
1027     uint8_t *dst;
1028
1029 //    src[0]&0x80;              //forbidden bit
1030     h->nal_ref_idc= src[0]>>5;
1031     h->nal_unit_type= src[0]&0x1F;
1032
1033     src++; length--;
1034 #if 0    
1035     for(i=0; i<length; i++)
1036         printf("%2X ", src[i]);
1037 #endif
1038     for(i=0; i+1<length; i+=2){
1039         if(src[i]) continue;
1040         if(i>0 && src[i-1]==0) i--;
1041         if(i+2<length && src[i+1]==0 && src[i+2]<=3){
1042             if(src[i+2]!=3){
1043                 /* startcode, so we must be past the end */
1044                 length=i;
1045             }
1046             break;
1047         }
1048     }
1049
1050     if(i>=length-1){ //no escaped 0
1051         *dst_length= length;
1052         *consumed= length+1; //+1 for the header
1053         return src; 
1054     }
1055
1056     h->rbsp_buffer= av_fast_realloc(h->rbsp_buffer, &h->rbsp_buffer_size, length);
1057     dst= h->rbsp_buffer;
1058
1059 //printf("deoding esc\n");
1060     si=di=0;
1061     while(si<length){ 
1062         //remove escapes (very rare 1:2^22)
1063         if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){
1064             if(src[si+2]==3){ //escape
1065                 dst[di++]= 0;
1066                 dst[di++]= 0;
1067                 si+=3;
1068                 continue;
1069             }else //next start code
1070                 break;
1071         }
1072
1073         dst[di++]= src[si++];
1074     }
1075
1076     *dst_length= di;
1077     *consumed= si + 1;//+1 for the header
1078 //FIXME store exact number of bits in the getbitcontext (its needed for decoding)
1079     return dst;
1080 }
1081
1082 #if 0
1083 /**
1084  * @param src the data which should be escaped
1085  * @param dst the target buffer, dst+1 == src is allowed as a special case
1086  * @param length the length of the src data
1087  * @param dst_length the length of the dst array
1088  * @returns length of escaped data in bytes or -1 if an error occured
1089  */
1090 static int encode_nal(H264Context *h, uint8_t *dst, uint8_t *src, int length, int dst_length){
1091     int i, escape_count, si, di;
1092     uint8_t *temp;
1093     
1094     assert(length>=0);
1095     assert(dst_length>0);
1096     
1097     dst[0]= (h->nal_ref_idc<<5) + h->nal_unit_type;
1098
1099     if(length==0) return 1;
1100
1101     escape_count= 0;
1102     for(i=0; i<length; i+=2){
1103         if(src[i]) continue;
1104         if(i>0 && src[i-1]==0) 
1105             i--;
1106         if(i+2<length && src[i+1]==0 && src[i+2]<=3){
1107             escape_count++;
1108             i+=2;
1109         }
1110     }
1111     
1112     if(escape_count==0){ 
1113         if(dst+1 != src)
1114             memcpy(dst+1, src, length);
1115         return length + 1;
1116     }
1117     
1118     if(length + escape_count + 1> dst_length)
1119         return -1;
1120
1121     //this should be damn rare (hopefully)
1122
1123     h->rbsp_buffer= av_fast_realloc(h->rbsp_buffer, &h->rbsp_buffer_size, length + escape_count);
1124     temp= h->rbsp_buffer;
1125 //printf("encoding esc\n");
1126     
1127     si= 0;
1128     di= 0;
1129     while(si < length){
1130         if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){
1131             temp[di++]= 0; si++;
1132             temp[di++]= 0; si++;
1133             temp[di++]= 3; 
1134             temp[di++]= src[si++];
1135         }
1136         else
1137             temp[di++]= src[si++];
1138     }
1139     memcpy(dst+1, temp, length+escape_count);
1140     
1141     assert(di == length+escape_count);
1142     
1143     return di + 1;
1144 }
1145
1146 /**
1147  * write 1,10,100,1000,... for alignment, yes its exactly inverse to mpeg4
1148  */
1149 static void encode_rbsp_trailing(PutBitContext *pb){
1150     int length;
1151     put_bits(pb, 1, 1);
1152     length= (-put_bits_count(pb))&7;
1153     if(length) put_bits(pb, length, 0);
1154 }
1155 #endif
1156
1157 /**
1158  * identifies the exact end of the bitstream
1159  * @return the length of the trailing, or 0 if damaged
1160  */
1161 static int decode_rbsp_trailing(uint8_t *src){
1162     int v= *src;
1163     int r;
1164
1165     tprintf("rbsp trailing %X\n", v);
1166
1167     for(r=1; r<9; r++){
1168         if(v&1) return r;
1169         v>>=1;
1170     }
1171     return 0;
1172 }
1173
1174 /**
1175  * idct tranforms the 16 dc values and dequantize them.
1176  * @param qp quantization parameter
1177  */
1178 static void h264_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
1179     const int qmul= dequant_coeff[qp][0];
1180 #define stride 16
1181     int i;
1182     int temp[16]; //FIXME check if this is a good idea
1183     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
1184     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
1185
1186 //memset(block, 64, 2*256);
1187 //return;
1188     for(i=0; i<4; i++){
1189         const int offset= y_offset[i];
1190         const int z0= block[offset+stride*0] + block[offset+stride*4];
1191         const int z1= block[offset+stride*0] - block[offset+stride*4];
1192         const int z2= block[offset+stride*1] - block[offset+stride*5];
1193         const int z3= block[offset+stride*1] + block[offset+stride*5];
1194
1195         temp[4*i+0]= z0+z3;
1196         temp[4*i+1]= z1+z2;
1197         temp[4*i+2]= z1-z2;
1198         temp[4*i+3]= z0-z3;
1199     }
1200
1201     for(i=0; i<4; i++){
1202         const int offset= x_offset[i];
1203         const int z0= temp[4*0+i] + temp[4*2+i];
1204         const int z1= temp[4*0+i] - temp[4*2+i];
1205         const int z2= temp[4*1+i] - temp[4*3+i];
1206         const int z3= temp[4*1+i] + temp[4*3+i];
1207
1208         block[stride*0 +offset]= ((z0 + z3)*qmul + 2)>>2; //FIXME think about merging this into decode_resdual
1209         block[stride*2 +offset]= ((z1 + z2)*qmul + 2)>>2;
1210         block[stride*8 +offset]= ((z1 - z2)*qmul + 2)>>2;
1211         block[stride*10+offset]= ((z0 - z3)*qmul + 2)>>2;
1212     }
1213 }
1214
1215 #if 0
1216 /**
1217  * dct tranforms the 16 dc values.
1218  * @param qp quantization parameter ??? FIXME
1219  */
1220 static void h264_luma_dc_dct_c(DCTELEM *block/*, int qp*/){
1221 //    const int qmul= dequant_coeff[qp][0];
1222     int i;
1223     int temp[16]; //FIXME check if this is a good idea
1224     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
1225     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
1226
1227     for(i=0; i<4; i++){
1228         const int offset= y_offset[i];
1229         const int z0= block[offset+stride*0] + block[offset+stride*4];
1230         const int z1= block[offset+stride*0] - block[offset+stride*4];
1231         const int z2= block[offset+stride*1] - block[offset+stride*5];
1232         const int z3= block[offset+stride*1] + block[offset+stride*5];
1233
1234         temp[4*i+0]= z0+z3;
1235         temp[4*i+1]= z1+z2;
1236         temp[4*i+2]= z1-z2;
1237         temp[4*i+3]= z0-z3;
1238     }
1239
1240     for(i=0; i<4; i++){
1241         const int offset= x_offset[i];
1242         const int z0= temp[4*0+i] + temp[4*2+i];
1243         const int z1= temp[4*0+i] - temp[4*2+i];
1244         const int z2= temp[4*1+i] - temp[4*3+i];
1245         const int z3= temp[4*1+i] + temp[4*3+i];
1246
1247         block[stride*0 +offset]= (z0 + z3)>>1;
1248         block[stride*2 +offset]= (z1 + z2)>>1;
1249         block[stride*8 +offset]= (z1 - z2)>>1;
1250         block[stride*10+offset]= (z0 - z3)>>1;
1251     }
1252 }
1253 #endif
1254
1255 #undef xStride
1256 #undef stride
1257
1258 static void chroma_dc_dequant_idct_c(DCTELEM *block, int qp){
1259     const int qmul= dequant_coeff[qp][0];
1260     const int stride= 16*2;
1261     const int xStride= 16;
1262     int a,b,c,d,e;
1263
1264     a= block[stride*0 + xStride*0];
1265     b= block[stride*0 + xStride*1];
1266     c= block[stride*1 + xStride*0];
1267     d= block[stride*1 + xStride*1];
1268
1269     e= a-b;
1270     a= a+b;
1271     b= c-d;
1272     c= c+d;
1273
1274     block[stride*0 + xStride*0]= ((a+c)*qmul + 0)>>1;
1275     block[stride*0 + xStride*1]= ((e+b)*qmul + 0)>>1;
1276     block[stride*1 + xStride*0]= ((a-c)*qmul + 0)>>1;
1277     block[stride*1 + xStride*1]= ((e-b)*qmul + 0)>>1;
1278 }
1279
1280 #if 0
1281 static void chroma_dc_dct_c(DCTELEM *block){
1282     const int stride= 16*2;
1283     const int xStride= 16;
1284     int a,b,c,d,e;
1285
1286     a= block[stride*0 + xStride*0];
1287     b= block[stride*0 + xStride*1];
1288     c= block[stride*1 + xStride*0];
1289     d= block[stride*1 + xStride*1];
1290
1291     e= a-b;
1292     a= a+b;
1293     b= c-d;
1294     c= c+d;
1295
1296     block[stride*0 + xStride*0]= (a+c);
1297     block[stride*0 + xStride*1]= (e+b);
1298     block[stride*1 + xStride*0]= (a-c);
1299     block[stride*1 + xStride*1]= (e-b);
1300 }
1301 #endif
1302
1303 /**
1304  * gets the chroma qp.
1305  */
1306 static inline int get_chroma_qp(H264Context *h, int qscale){
1307     
1308     return chroma_qp[clip(qscale + h->pps.chroma_qp_index_offset, 0, 51)];
1309 }
1310
1311
1312 /**
1313  *
1314  */
1315 static void h264_add_idct_c(uint8_t *dst, DCTELEM *block, int stride){
1316     int i;
1317     uint8_t *cm = cropTbl + MAX_NEG_CROP;
1318
1319     block[0] += 32;
1320
1321     for(i=0; i<4; i++){
1322         const int z0=  block[0 + 4*i]     +  block[2 + 4*i];
1323         const int z1=  block[0 + 4*i]     -  block[2 + 4*i];
1324         const int z2= (block[1 + 4*i]>>1) -  block[3 + 4*i];
1325         const int z3=  block[1 + 4*i]     + (block[3 + 4*i]>>1);
1326
1327         block[0 + 4*i]= z0 + z3;
1328         block[1 + 4*i]= z1 + z2;
1329         block[2 + 4*i]= z1 - z2;
1330         block[3 + 4*i]= z0 - z3;
1331     }
1332
1333     for(i=0; i<4; i++){
1334         const int z0=  block[i + 4*0]     +  block[i + 4*2];
1335         const int z1=  block[i + 4*0]     -  block[i + 4*2];
1336         const int z2= (block[i + 4*1]>>1) -  block[i + 4*3];
1337         const int z3=  block[i + 4*1]     + (block[i + 4*3]>>1);
1338
1339         dst[i + 0*stride]= cm[ dst[i + 0*stride] + ((z0 + z3) >> 6) ];
1340         dst[i + 1*stride]= cm[ dst[i + 1*stride] + ((z1 + z2) >> 6) ];
1341         dst[i + 2*stride]= cm[ dst[i + 2*stride] + ((z1 - z2) >> 6) ];
1342         dst[i + 3*stride]= cm[ dst[i + 3*stride] + ((z0 - z3) >> 6) ];
1343     }
1344 }
1345
1346 #if 0
1347 static void h264_diff_dct_c(DCTELEM *block, uint8_t *src1, uint8_t *src2, int stride){
1348     int i;
1349     //FIXME try int temp instead of block
1350     
1351     for(i=0; i<4; i++){
1352         const int d0= src1[0 + i*stride] - src2[0 + i*stride];
1353         const int d1= src1[1 + i*stride] - src2[1 + i*stride];
1354         const int d2= src1[2 + i*stride] - src2[2 + i*stride];
1355         const int d3= src1[3 + i*stride] - src2[3 + i*stride];
1356         const int z0= d0 + d3;
1357         const int z3= d0 - d3;
1358         const int z1= d1 + d2;
1359         const int z2= d1 - d2;
1360         
1361         block[0 + 4*i]=   z0 +   z1;
1362         block[1 + 4*i]= 2*z3 +   z2;
1363         block[2 + 4*i]=   z0 -   z1;
1364         block[3 + 4*i]=   z3 - 2*z2;
1365     }    
1366
1367     for(i=0; i<4; i++){
1368         const int z0= block[0*4 + i] + block[3*4 + i];
1369         const int z3= block[0*4 + i] - block[3*4 + i];
1370         const int z1= block[1*4 + i] + block[2*4 + i];
1371         const int z2= block[1*4 + i] - block[2*4 + i];
1372         
1373         block[0*4 + i]=   z0 +   z1;
1374         block[1*4 + i]= 2*z3 +   z2;
1375         block[2*4 + i]=   z0 -   z1;
1376         block[3*4 + i]=   z3 - 2*z2;
1377     }
1378 }
1379 #endif
1380
1381 //FIXME need to check that this doesnt overflow signed 32 bit for low qp, iam not sure, its very close
1382 //FIXME check that gcc inlines this (and optimizes intra & seperate_dc stuff away)
1383 static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale, int intra, int seperate_dc){
1384     int i;
1385     const int * const quant_table= quant_coeff[qscale];
1386     const int bias= intra ? (1<<QUANT_SHIFT)/3 : (1<<QUANT_SHIFT)/6;
1387     const unsigned int threshold1= (1<<QUANT_SHIFT) - bias - 1;
1388     const unsigned int threshold2= (threshold1<<1);
1389     int last_non_zero;
1390
1391     if(seperate_dc){
1392         if(qscale<=18){
1393             //avoid overflows
1394             const int dc_bias= intra ? (1<<(QUANT_SHIFT-2))/3 : (1<<(QUANT_SHIFT-2))/6;
1395             const unsigned int dc_threshold1= (1<<(QUANT_SHIFT-2)) - dc_bias - 1;
1396             const unsigned int dc_threshold2= (dc_threshold1<<1);
1397
1398             int level= block[0]*quant_coeff[qscale+18][0];
1399             if(((unsigned)(level+dc_threshold1))>dc_threshold2){
1400                 if(level>0){
1401                     level= (dc_bias + level)>>(QUANT_SHIFT-2);
1402                     block[0]= level;
1403                 }else{
1404                     level= (dc_bias - level)>>(QUANT_SHIFT-2);
1405                     block[0]= -level;
1406                 }
1407 //                last_non_zero = i;
1408             }else{
1409                 block[0]=0;
1410             }
1411         }else{
1412             const int dc_bias= intra ? (1<<(QUANT_SHIFT+1))/3 : (1<<(QUANT_SHIFT+1))/6;
1413             const unsigned int dc_threshold1= (1<<(QUANT_SHIFT+1)) - dc_bias - 1;
1414             const unsigned int dc_threshold2= (dc_threshold1<<1);
1415
1416             int level= block[0]*quant_table[0];
1417             if(((unsigned)(level+dc_threshold1))>dc_threshold2){
1418                 if(level>0){
1419                     level= (dc_bias + level)>>(QUANT_SHIFT+1);
1420                     block[0]= level;
1421                 }else{
1422                     level= (dc_bias - level)>>(QUANT_SHIFT+1);
1423                     block[0]= -level;
1424                 }
1425 //                last_non_zero = i;
1426             }else{
1427                 block[0]=0;
1428             }
1429         }
1430         last_non_zero= 0;
1431         i=1;
1432     }else{
1433         last_non_zero= -1;
1434         i=0;
1435     }
1436
1437     for(; i<16; i++){
1438         const int j= scantable[i];
1439         int level= block[j]*quant_table[j];
1440
1441 //        if(   bias+level >= (1<<(QMAT_SHIFT - 3))
1442 //           || bias-level >= (1<<(QMAT_SHIFT - 3))){
1443         if(((unsigned)(level+threshold1))>threshold2){
1444             if(level>0){
1445                 level= (bias + level)>>QUANT_SHIFT;
1446                 block[j]= level;
1447             }else{
1448                 level= (bias - level)>>QUANT_SHIFT;
1449                 block[j]= -level;
1450             }
1451             last_non_zero = i;
1452         }else{
1453             block[j]=0;
1454         }
1455     }
1456
1457     return last_non_zero;
1458 }
1459
1460 static void pred4x4_vertical_c(uint8_t *src, uint8_t *topright, int stride){
1461     const uint32_t a= ((uint32_t*)(src-stride))[0];
1462     ((uint32_t*)(src+0*stride))[0]= a;
1463     ((uint32_t*)(src+1*stride))[0]= a;
1464     ((uint32_t*)(src+2*stride))[0]= a;
1465     ((uint32_t*)(src+3*stride))[0]= a;
1466 }
1467
1468 static void pred4x4_horizontal_c(uint8_t *src, uint8_t *topright, int stride){
1469     ((uint32_t*)(src+0*stride))[0]= src[-1+0*stride]*0x01010101;
1470     ((uint32_t*)(src+1*stride))[0]= src[-1+1*stride]*0x01010101;
1471     ((uint32_t*)(src+2*stride))[0]= src[-1+2*stride]*0x01010101;
1472     ((uint32_t*)(src+3*stride))[0]= src[-1+3*stride]*0x01010101;
1473 }
1474
1475 static void pred4x4_dc_c(uint8_t *src, uint8_t *topright, int stride){
1476     const int dc= (  src[-stride] + src[1-stride] + src[2-stride] + src[3-stride]
1477                    + src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 4) >>3;
1478     
1479     ((uint32_t*)(src+0*stride))[0]= 
1480     ((uint32_t*)(src+1*stride))[0]= 
1481     ((uint32_t*)(src+2*stride))[0]= 
1482     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
1483 }
1484
1485 static void pred4x4_left_dc_c(uint8_t *src, uint8_t *topright, int stride){
1486     const int dc= (  src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 2) >>2;
1487     
1488     ((uint32_t*)(src+0*stride))[0]= 
1489     ((uint32_t*)(src+1*stride))[0]= 
1490     ((uint32_t*)(src+2*stride))[0]= 
1491     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
1492 }
1493
1494 static void pred4x4_top_dc_c(uint8_t *src, uint8_t *topright, int stride){
1495     const int dc= (  src[-stride] + src[1-stride] + src[2-stride] + src[3-stride] + 2) >>2;
1496     
1497     ((uint32_t*)(src+0*stride))[0]= 
1498     ((uint32_t*)(src+1*stride))[0]= 
1499     ((uint32_t*)(src+2*stride))[0]= 
1500     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
1501 }
1502
1503 static void pred4x4_128_dc_c(uint8_t *src, uint8_t *topright, int stride){
1504     ((uint32_t*)(src+0*stride))[0]= 
1505     ((uint32_t*)(src+1*stride))[0]= 
1506     ((uint32_t*)(src+2*stride))[0]= 
1507     ((uint32_t*)(src+3*stride))[0]= 128U*0x01010101U;
1508 }
1509
1510
1511 #define LOAD_TOP_RIGHT_EDGE\
1512     const int t4= topright[0];\
1513     const int t5= topright[1];\
1514     const int t6= topright[2];\
1515     const int t7= topright[3];\
1516
1517 #define LOAD_LEFT_EDGE\
1518     const int l0= src[-1+0*stride];\
1519     const int l1= src[-1+1*stride];\
1520     const int l2= src[-1+2*stride];\
1521     const int l3= src[-1+3*stride];\
1522
1523 #define LOAD_TOP_EDGE\
1524     const int t0= src[ 0-1*stride];\
1525     const int t1= src[ 1-1*stride];\
1526     const int t2= src[ 2-1*stride];\
1527     const int t3= src[ 3-1*stride];\
1528
1529 static void pred4x4_down_right_c(uint8_t *src, uint8_t *topright, int stride){
1530     const int lt= src[-1-1*stride];
1531     LOAD_TOP_EDGE
1532     LOAD_LEFT_EDGE
1533
1534     src[0+3*stride]=(l3 + 2*l2 + l1 + 2)>>2; 
1535     src[0+2*stride]=
1536     src[1+3*stride]=(l2 + 2*l1 + l0 + 2)>>2; 
1537     src[0+1*stride]=
1538     src[1+2*stride]=
1539     src[2+3*stride]=(l1 + 2*l0 + lt + 2)>>2; 
1540     src[0+0*stride]=
1541     src[1+1*stride]=
1542     src[2+2*stride]=
1543     src[3+3*stride]=(l0 + 2*lt + t0 + 2)>>2; 
1544     src[1+0*stride]=
1545     src[2+1*stride]=
1546     src[3+2*stride]=(lt + 2*t0 + t1 + 2)>>2;
1547     src[2+0*stride]=
1548     src[3+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
1549     src[3+0*stride]=(t1 + 2*t2 + t3 + 2)>>2;
1550 }
1551
1552 static void pred4x4_down_left_c(uint8_t *src, uint8_t *topright, int stride){
1553     LOAD_TOP_EDGE    
1554     LOAD_TOP_RIGHT_EDGE    
1555 //    LOAD_LEFT_EDGE    
1556
1557     src[0+0*stride]=(t0 + t2 + 2*t1 + 2)>>2;
1558     src[1+0*stride]=
1559     src[0+1*stride]=(t1 + t3 + 2*t2 + 2)>>2;
1560     src[2+0*stride]=
1561     src[1+1*stride]=
1562     src[0+2*stride]=(t2 + t4 + 2*t3 + 2)>>2;
1563     src[3+0*stride]=
1564     src[2+1*stride]=
1565     src[1+2*stride]=
1566     src[0+3*stride]=(t3 + t5 + 2*t4 + 2)>>2;
1567     src[3+1*stride]=
1568     src[2+2*stride]=
1569     src[1+3*stride]=(t4 + t6 + 2*t5 + 2)>>2;
1570     src[3+2*stride]=
1571     src[2+3*stride]=(t5 + t7 + 2*t6 + 2)>>2;
1572     src[3+3*stride]=(t6 + 3*t7 + 2)>>2;
1573 }
1574
1575 static void pred4x4_vertical_right_c(uint8_t *src, uint8_t *topright, int stride){
1576     const int lt= src[-1-1*stride];
1577     LOAD_TOP_EDGE    
1578     LOAD_LEFT_EDGE    
1579     const __attribute__((unused)) int unu= l3;
1580
1581     src[0+0*stride]=
1582     src[1+2*stride]=(lt + t0 + 1)>>1;
1583     src[1+0*stride]=
1584     src[2+2*stride]=(t0 + t1 + 1)>>1;
1585     src[2+0*stride]=
1586     src[3+2*stride]=(t1 + t2 + 1)>>1;
1587     src[3+0*stride]=(t2 + t3 + 1)>>1;
1588     src[0+1*stride]=
1589     src[1+3*stride]=(l0 + 2*lt + t0 + 2)>>2;
1590     src[1+1*stride]=
1591     src[2+3*stride]=(lt + 2*t0 + t1 + 2)>>2;
1592     src[2+1*stride]=
1593     src[3+3*stride]=(t0 + 2*t1 + t2 + 2)>>2;
1594     src[3+1*stride]=(t1 + 2*t2 + t3 + 2)>>2;
1595     src[0+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
1596     src[0+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
1597 }
1598
1599 static void pred4x4_vertical_left_c(uint8_t *src, uint8_t *topright, int stride){
1600     LOAD_TOP_EDGE    
1601     LOAD_TOP_RIGHT_EDGE    
1602     const __attribute__((unused)) int unu= t7;
1603
1604     src[0+0*stride]=(t0 + t1 + 1)>>1;
1605     src[1+0*stride]=
1606     src[0+2*stride]=(t1 + t2 + 1)>>1;
1607     src[2+0*stride]=
1608     src[1+2*stride]=(t2 + t3 + 1)>>1;
1609     src[3+0*stride]=
1610     src[2+2*stride]=(t3 + t4+ 1)>>1;
1611     src[3+2*stride]=(t4 + t5+ 1)>>1;
1612     src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
1613     src[1+1*stride]=
1614     src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
1615     src[2+1*stride]=
1616     src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
1617     src[3+1*stride]=
1618     src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
1619     src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
1620 }
1621
1622 static void pred4x4_horizontal_up_c(uint8_t *src, uint8_t *topright, int stride){
1623     LOAD_LEFT_EDGE    
1624
1625     src[0+0*stride]=(l0 + l1 + 1)>>1;
1626     src[1+0*stride]=(l0 + 2*l1 + l2 + 2)>>2;
1627     src[2+0*stride]=
1628     src[0+1*stride]=(l1 + l2 + 1)>>1;
1629     src[3+0*stride]=
1630     src[1+1*stride]=(l1 + 2*l2 + l3 + 2)>>2;
1631     src[2+1*stride]=
1632     src[0+2*stride]=(l2 + l3 + 1)>>1;
1633     src[3+1*stride]=
1634     src[1+2*stride]=(l2 + 2*l3 + l3 + 2)>>2;
1635     src[3+2*stride]=
1636     src[1+3*stride]=
1637     src[0+3*stride]=
1638     src[2+2*stride]=
1639     src[2+3*stride]=
1640     src[3+3*stride]=l3;
1641 }
1642     
1643 static void pred4x4_horizontal_down_c(uint8_t *src, uint8_t *topright, int stride){
1644     const int lt= src[-1-1*stride];
1645     LOAD_TOP_EDGE    
1646     LOAD_LEFT_EDGE    
1647     const __attribute__((unused)) int unu= t3;
1648
1649     src[0+0*stride]=
1650     src[2+1*stride]=(lt + l0 + 1)>>1;
1651     src[1+0*stride]=
1652     src[3+1*stride]=(l0 + 2*lt + t0 + 2)>>2;
1653     src[2+0*stride]=(lt + 2*t0 + t1 + 2)>>2;
1654     src[3+0*stride]=(t0 + 2*t1 + t2 + 2)>>2;
1655     src[0+1*stride]=
1656     src[2+2*stride]=(l0 + l1 + 1)>>1;
1657     src[1+1*stride]=
1658     src[3+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
1659     src[0+2*stride]=
1660     src[2+3*stride]=(l1 + l2+ 1)>>1;
1661     src[1+2*stride]=
1662     src[3+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
1663     src[0+3*stride]=(l2 + l3 + 1)>>1;
1664     src[1+3*stride]=(l1 + 2*l2 + l3 + 2)>>2;
1665 }
1666
1667 static void pred16x16_vertical_c(uint8_t *src, int stride){
1668     int i;
1669     const uint32_t a= ((uint32_t*)(src-stride))[0];
1670     const uint32_t b= ((uint32_t*)(src-stride))[1];
1671     const uint32_t c= ((uint32_t*)(src-stride))[2];
1672     const uint32_t d= ((uint32_t*)(src-stride))[3];
1673     
1674     for(i=0; i<16; i++){
1675         ((uint32_t*)(src+i*stride))[0]= a;
1676         ((uint32_t*)(src+i*stride))[1]= b;
1677         ((uint32_t*)(src+i*stride))[2]= c;
1678         ((uint32_t*)(src+i*stride))[3]= d;
1679     }
1680 }
1681
1682 static void pred16x16_horizontal_c(uint8_t *src, int stride){
1683     int i;
1684
1685     for(i=0; i<16; i++){
1686         ((uint32_t*)(src+i*stride))[0]=
1687         ((uint32_t*)(src+i*stride))[1]=
1688         ((uint32_t*)(src+i*stride))[2]=
1689         ((uint32_t*)(src+i*stride))[3]= src[-1+i*stride]*0x01010101;
1690     }
1691 }
1692
1693 static void pred16x16_dc_c(uint8_t *src, int stride){
1694     int i, dc=0;
1695
1696     for(i=0;i<16; i++){
1697         dc+= src[-1+i*stride];
1698     }
1699     
1700     for(i=0;i<16; i++){
1701         dc+= src[i-stride];
1702     }
1703
1704     dc= 0x01010101*((dc + 16)>>5);
1705
1706     for(i=0; i<16; i++){
1707         ((uint32_t*)(src+i*stride))[0]=
1708         ((uint32_t*)(src+i*stride))[1]=
1709         ((uint32_t*)(src+i*stride))[2]=
1710         ((uint32_t*)(src+i*stride))[3]= dc;
1711     }
1712 }
1713
1714 static void pred16x16_left_dc_c(uint8_t *src, int stride){
1715     int i, dc=0;
1716
1717     for(i=0;i<16; i++){
1718         dc+= src[-1+i*stride];
1719     }
1720     
1721     dc= 0x01010101*((dc + 8)>>4);
1722
1723     for(i=0; i<16; i++){
1724         ((uint32_t*)(src+i*stride))[0]=
1725         ((uint32_t*)(src+i*stride))[1]=
1726         ((uint32_t*)(src+i*stride))[2]=
1727         ((uint32_t*)(src+i*stride))[3]= dc;
1728     }
1729 }
1730
1731 static void pred16x16_top_dc_c(uint8_t *src, int stride){
1732     int i, dc=0;
1733
1734     for(i=0;i<16; i++){
1735         dc+= src[i-stride];
1736     }
1737     dc= 0x01010101*((dc + 8)>>4);
1738
1739     for(i=0; i<16; i++){
1740         ((uint32_t*)(src+i*stride))[0]=
1741         ((uint32_t*)(src+i*stride))[1]=
1742         ((uint32_t*)(src+i*stride))[2]=
1743         ((uint32_t*)(src+i*stride))[3]= dc;
1744     }
1745 }
1746
1747 static void pred16x16_128_dc_c(uint8_t *src, int stride){
1748     int i;
1749
1750     for(i=0; i<16; i++){
1751         ((uint32_t*)(src+i*stride))[0]=
1752         ((uint32_t*)(src+i*stride))[1]=
1753         ((uint32_t*)(src+i*stride))[2]=
1754         ((uint32_t*)(src+i*stride))[3]= 0x01010101U*128U;
1755     }
1756 }
1757
1758 static inline void pred16x16_plane_compat_c(uint8_t *src, int stride, const int svq3){
1759   int i, j, k;
1760   int a;
1761   uint8_t *cm = cropTbl + MAX_NEG_CROP;
1762   const uint8_t * const src0 = src+7-stride;
1763   const uint8_t *src1 = src+8*stride-1;
1764   const uint8_t *src2 = src1-2*stride;      // == src+6*stride-1;
1765   int H = src0[1] - src0[-1];
1766   int V = src1[0] - src2[ 0];
1767   for(k=2; k<=8; ++k) {
1768     src1 += stride; src2 -= stride;
1769     H += k*(src0[k] - src0[-k]);
1770     V += k*(src1[0] - src2[ 0]);
1771   }
1772   if(svq3){
1773     H = ( 5*(H/4) ) / 16;
1774     V = ( 5*(V/4) ) / 16;
1775
1776     /* required for 100% accuracy */
1777     i = H; H = V; V = i;
1778   }else{
1779     H = ( 5*H+32 ) >> 6;
1780     V = ( 5*V+32 ) >> 6;
1781   }
1782
1783   a = 16*(src1[0] + src2[16] + 1) - 7*(V+H);
1784   for(j=16; j>0; --j) {
1785     int b = a;
1786     a += V;
1787     for(i=-16; i<0; i+=4) {
1788       src[16+i] = cm[ (b    ) >> 5 ];
1789       src[17+i] = cm[ (b+  H) >> 5 ];
1790       src[18+i] = cm[ (b+2*H) >> 5 ];
1791       src[19+i] = cm[ (b+3*H) >> 5 ];
1792       b += 4*H;
1793     }
1794     src += stride;
1795   }
1796 }
1797
1798 static void pred16x16_plane_c(uint8_t *src, int stride){
1799     pred16x16_plane_compat_c(src, stride, 0);
1800 }
1801
1802 static void pred8x8_vertical_c(uint8_t *src, int stride){
1803     int i;
1804     const uint32_t a= ((uint32_t*)(src-stride))[0];
1805     const uint32_t b= ((uint32_t*)(src-stride))[1];
1806     
1807     for(i=0; i<8; i++){
1808         ((uint32_t*)(src+i*stride))[0]= a;
1809         ((uint32_t*)(src+i*stride))[1]= b;
1810     }
1811 }
1812
1813 static void pred8x8_horizontal_c(uint8_t *src, int stride){
1814     int i;
1815
1816     for(i=0; i<8; i++){
1817         ((uint32_t*)(src+i*stride))[0]=
1818         ((uint32_t*)(src+i*stride))[1]= src[-1+i*stride]*0x01010101;
1819     }
1820 }
1821
1822 static void pred8x8_128_dc_c(uint8_t *src, int stride){
1823     int i;
1824
1825     for(i=0; i<4; i++){
1826         ((uint32_t*)(src+i*stride))[0]= 
1827         ((uint32_t*)(src+i*stride))[1]= 0x01010101U*128U;
1828     }
1829     for(i=4; i<8; i++){
1830         ((uint32_t*)(src+i*stride))[0]= 
1831         ((uint32_t*)(src+i*stride))[1]= 0x01010101U*128U;
1832     }
1833 }
1834
1835 static void pred8x8_left_dc_c(uint8_t *src, int stride){
1836     int i;
1837     int dc0, dc2;
1838
1839     dc0=dc2=0;
1840     for(i=0;i<4; i++){
1841         dc0+= src[-1+i*stride];
1842         dc2+= src[-1+(i+4)*stride];
1843     }
1844     dc0= 0x01010101*((dc0 + 2)>>2);
1845     dc2= 0x01010101*((dc2 + 2)>>2);
1846
1847     for(i=0; i<4; i++){
1848         ((uint32_t*)(src+i*stride))[0]=
1849         ((uint32_t*)(src+i*stride))[1]= dc0;
1850     }
1851     for(i=4; i<8; i++){
1852         ((uint32_t*)(src+i*stride))[0]=
1853         ((uint32_t*)(src+i*stride))[1]= dc2;
1854     }
1855 }
1856
1857 static void pred8x8_top_dc_c(uint8_t *src, int stride){
1858     int i;
1859     int dc0, dc1;
1860
1861     dc0=dc1=0;
1862     for(i=0;i<4; i++){
1863         dc0+= src[i-stride];
1864         dc1+= src[4+i-stride];
1865     }
1866     dc0= 0x01010101*((dc0 + 2)>>2);
1867     dc1= 0x01010101*((dc1 + 2)>>2);
1868
1869     for(i=0; i<4; i++){
1870         ((uint32_t*)(src+i*stride))[0]= dc0;
1871         ((uint32_t*)(src+i*stride))[1]= dc1;
1872     }
1873     for(i=4; i<8; i++){
1874         ((uint32_t*)(src+i*stride))[0]= dc0;
1875         ((uint32_t*)(src+i*stride))[1]= dc1;
1876     }
1877 }
1878
1879
1880 static void pred8x8_dc_c(uint8_t *src, int stride){
1881     int i;
1882     int dc0, dc1, dc2, dc3;
1883
1884     dc0=dc1=dc2=0;
1885     for(i=0;i<4; i++){
1886         dc0+= src[-1+i*stride] + src[i-stride];
1887         dc1+= src[4+i-stride];
1888         dc2+= src[-1+(i+4)*stride];
1889     }
1890     dc3= 0x01010101*((dc1 + dc2 + 4)>>3);
1891     dc0= 0x01010101*((dc0 + 4)>>3);
1892     dc1= 0x01010101*((dc1 + 2)>>2);
1893     dc2= 0x01010101*((dc2 + 2)>>2);
1894
1895     for(i=0; i<4; i++){
1896         ((uint32_t*)(src+i*stride))[0]= dc0;
1897         ((uint32_t*)(src+i*stride))[1]= dc1;
1898     }
1899     for(i=4; i<8; i++){
1900         ((uint32_t*)(src+i*stride))[0]= dc2;
1901         ((uint32_t*)(src+i*stride))[1]= dc3;
1902     }
1903 }
1904
1905 static void pred8x8_plane_c(uint8_t *src, int stride){
1906   int j, k;
1907   int a;
1908   uint8_t *cm = cropTbl + MAX_NEG_CROP;
1909   const uint8_t * const src0 = src+3-stride;
1910   const uint8_t *src1 = src+4*stride-1;
1911   const uint8_t *src2 = src1-2*stride;      // == src+2*stride-1;
1912   int H = src0[1] - src0[-1];
1913   int V = src1[0] - src2[ 0];
1914   for(k=2; k<=4; ++k) {
1915     src1 += stride; src2 -= stride;
1916     H += k*(src0[k] - src0[-k]);
1917     V += k*(src1[0] - src2[ 0]);
1918   }
1919   H = ( 17*H+16 ) >> 5;
1920   V = ( 17*V+16 ) >> 5;
1921
1922   a = 16*(src1[0] + src2[8]+1) - 3*(V+H);
1923   for(j=8; j>0; --j) {
1924     int b = a;
1925     a += V;
1926     src[0] = cm[ (b    ) >> 5 ];
1927     src[1] = cm[ (b+  H) >> 5 ];
1928     src[2] = cm[ (b+2*H) >> 5 ];
1929     src[3] = cm[ (b+3*H) >> 5 ];
1930     src[4] = cm[ (b+4*H) >> 5 ];
1931     src[5] = cm[ (b+5*H) >> 5 ];
1932     src[6] = cm[ (b+6*H) >> 5 ];
1933     src[7] = cm[ (b+7*H) >> 5 ];
1934     src += stride;
1935   }
1936 }
1937
1938 static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list,
1939                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1940                            int src_x_offset, int src_y_offset,
1941                            qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op){
1942     MpegEncContext * const s = &h->s;
1943     const int mx= h->mv_cache[list][ scan8[n] ][0] + src_x_offset*8;
1944     const int my= h->mv_cache[list][ scan8[n] ][1] + src_y_offset*8;
1945     const int luma_xy= (mx&3) + ((my&3)<<2);
1946     uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*s->linesize;
1947     uint8_t * src_cb= pic->data[1] + (mx>>3) + (my>>3)*s->uvlinesize;
1948     uint8_t * src_cr= pic->data[2] + (mx>>3) + (my>>3)*s->uvlinesize;
1949     int extra_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; //FIXME increase edge?, IMHO not worth it
1950     int extra_height= extra_width;
1951     int emu=0;
1952     const int full_mx= mx>>2;
1953     const int full_my= my>>2;
1954     
1955     assert(pic->data[0]);
1956     
1957     if(mx&7) extra_width -= 3;
1958     if(my&7) extra_height -= 3;
1959     
1960     if(   full_mx < 0-extra_width 
1961        || full_my < 0-extra_height 
1962        || full_mx + 16/*FIXME*/ > s->width + extra_width 
1963        || full_my + 16/*FIXME*/ > s->height + extra_height){
1964         ff_emulated_edge_mc(s->edge_emu_buffer, src_y - 2 - 2*s->linesize, s->linesize, 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, s->width, s->height);
1965             src_y= s->edge_emu_buffer + 2 + 2*s->linesize;
1966         emu=1;
1967     }
1968     
1969     qpix_op[luma_xy](dest_y, src_y, s->linesize); //FIXME try variable height perhaps?
1970     if(!square){
1971         qpix_op[luma_xy](dest_y + delta, src_y + delta, s->linesize);
1972     }
1973     
1974     if(s->flags&CODEC_FLAG_GRAY) return;
1975     
1976     if(emu){
1977         ff_emulated_edge_mc(s->edge_emu_buffer, src_cb, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1);
1978             src_cb= s->edge_emu_buffer;
1979     }
1980     chroma_op(dest_cb, src_cb, s->uvlinesize, chroma_height, mx&7, my&7);
1981
1982     if(emu){
1983         ff_emulated_edge_mc(s->edge_emu_buffer, src_cr, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1);
1984             src_cr= s->edge_emu_buffer;
1985     }
1986     chroma_op(dest_cr, src_cr, s->uvlinesize, chroma_height, mx&7, my&7);
1987 }
1988
1989 static inline void mc_part(H264Context *h, int n, int square, int chroma_height, int delta,
1990                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1991                            int x_offset, int y_offset,
1992                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
1993                            qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg,
1994                            int list0, int list1){
1995     MpegEncContext * const s = &h->s;
1996     qpel_mc_func *qpix_op=  qpix_put;
1997     h264_chroma_mc_func chroma_op= chroma_put;
1998     
1999     dest_y  += 2*x_offset + 2*y_offset*s->  linesize;
2000     dest_cb +=   x_offset +   y_offset*s->uvlinesize;
2001     dest_cr +=   x_offset +   y_offset*s->uvlinesize;
2002     x_offset += 8*s->mb_x;
2003     y_offset += 8*s->mb_y;
2004     
2005     if(list0){
2006         Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ];
2007         mc_dir_part(h, ref, n, square, chroma_height, delta, 0,
2008                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
2009                            qpix_op, chroma_op);
2010
2011         qpix_op=  qpix_avg;
2012         chroma_op= chroma_avg;
2013     }
2014
2015     if(list1){
2016         Picture *ref= &h->ref_list[1][ h->ref_cache[1][ scan8[n] ] ];
2017         mc_dir_part(h, ref, n, square, chroma_height, delta, 1,
2018                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
2019                            qpix_op, chroma_op);
2020     }
2021 }
2022
2023 static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
2024                       qpel_mc_func (*qpix_put)[16], h264_chroma_mc_func (*chroma_put),
2025                       qpel_mc_func (*qpix_avg)[16], h264_chroma_mc_func (*chroma_avg)){
2026     MpegEncContext * const s = &h->s;
2027     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
2028     const int mb_type= s->current_picture.mb_type[mb_xy];
2029     
2030     assert(IS_INTER(mb_type));
2031     
2032     if(IS_16X16(mb_type)){
2033         mc_part(h, 0, 1, 8, 0, dest_y, dest_cb, dest_cr, 0, 0,
2034                 qpix_put[0], chroma_put[0], qpix_avg[0], chroma_avg[0],
2035                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
2036     }else if(IS_16X8(mb_type)){
2037         mc_part(h, 0, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 0,
2038                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
2039                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
2040         mc_part(h, 8, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 4,
2041                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
2042                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
2043     }else if(IS_8X16(mb_type)){
2044         mc_part(h, 0, 0, 8, 8*s->linesize, dest_y, dest_cb, dest_cr, 0, 0,
2045                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
2046                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
2047         mc_part(h, 4, 0, 8, 8*s->linesize, dest_y, dest_cb, dest_cr, 4, 0,
2048                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
2049                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
2050     }else{
2051         int i;
2052         
2053         assert(IS_8X8(mb_type));
2054
2055         for(i=0; i<4; i++){
2056             const int sub_mb_type= h->sub_mb_type[i];
2057             const int n= 4*i;
2058             int x_offset= (i&1)<<2;
2059             int y_offset= (i&2)<<1;
2060
2061             if(IS_SUB_8X8(sub_mb_type)){
2062                 mc_part(h, n, 1, 4, 0, dest_y, dest_cb, dest_cr, x_offset, y_offset,
2063                     qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
2064                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2065             }else if(IS_SUB_8X4(sub_mb_type)){
2066                 mc_part(h, n  , 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset,
2067                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
2068                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2069                 mc_part(h, n+2, 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset+2,
2070                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
2071                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2072             }else if(IS_SUB_4X8(sub_mb_type)){
2073                 mc_part(h, n  , 0, 4, 4*s->linesize, dest_y, dest_cb, dest_cr, x_offset, y_offset,
2074                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
2075                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2076                 mc_part(h, n+1, 0, 4, 4*s->linesize, dest_y, dest_cb, dest_cr, x_offset+2, y_offset,
2077                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
2078                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2079             }else{
2080                 int j;
2081                 assert(IS_SUB_4X4(sub_mb_type));
2082                 for(j=0; j<4; j++){
2083                     int sub_x_offset= x_offset + 2*(j&1);
2084                     int sub_y_offset= y_offset +   (j&2);
2085                     mc_part(h, n+j, 1, 2, 0, dest_y, dest_cb, dest_cr, sub_x_offset, sub_y_offset,
2086                         qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
2087                         IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2088                 }
2089             }
2090         }
2091     }
2092 }
2093
2094 static void decode_init_vlc(H264Context *h){
2095     static int done = 0;
2096
2097     if (!done) {
2098         int i;
2099         done = 1;
2100
2101         init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5, 
2102                  &chroma_dc_coeff_token_len [0], 1, 1,
2103                  &chroma_dc_coeff_token_bits[0], 1, 1);
2104
2105         for(i=0; i<4; i++){
2106             init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17, 
2107                      &coeff_token_len [i][0], 1, 1,
2108                      &coeff_token_bits[i][0], 1, 1);
2109         }
2110
2111         for(i=0; i<3; i++){
2112             init_vlc(&chroma_dc_total_zeros_vlc[i], CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
2113                      &chroma_dc_total_zeros_len [i][0], 1, 1,
2114                      &chroma_dc_total_zeros_bits[i][0], 1, 1);
2115         }
2116         for(i=0; i<15; i++){
2117             init_vlc(&total_zeros_vlc[i], TOTAL_ZEROS_VLC_BITS, 16, 
2118                      &total_zeros_len [i][0], 1, 1,
2119                      &total_zeros_bits[i][0], 1, 1);
2120         }
2121
2122         for(i=0; i<6; i++){
2123             init_vlc(&run_vlc[i], RUN_VLC_BITS, 7, 
2124                      &run_len [i][0], 1, 1,
2125                      &run_bits[i][0], 1, 1);
2126         }
2127         init_vlc(&run7_vlc, RUN7_VLC_BITS, 16, 
2128                  &run_len [6][0], 1, 1,
2129                  &run_bits[6][0], 1, 1);
2130     }
2131 }
2132
2133 /**
2134  * Sets the intra prediction function pointers.
2135  */
2136 static void init_pred_ptrs(H264Context *h){
2137 //    MpegEncContext * const s = &h->s;
2138
2139     h->pred4x4[VERT_PRED           ]= pred4x4_vertical_c;
2140     h->pred4x4[HOR_PRED            ]= pred4x4_horizontal_c;
2141     h->pred4x4[DC_PRED             ]= pred4x4_dc_c;
2142     h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_c;
2143     h->pred4x4[DIAG_DOWN_RIGHT_PRED]= pred4x4_down_right_c;
2144     h->pred4x4[VERT_RIGHT_PRED     ]= pred4x4_vertical_right_c;
2145     h->pred4x4[HOR_DOWN_PRED       ]= pred4x4_horizontal_down_c;
2146     h->pred4x4[VERT_LEFT_PRED      ]= pred4x4_vertical_left_c;
2147     h->pred4x4[HOR_UP_PRED         ]= pred4x4_horizontal_up_c;
2148     h->pred4x4[LEFT_DC_PRED        ]= pred4x4_left_dc_c;
2149     h->pred4x4[TOP_DC_PRED         ]= pred4x4_top_dc_c;
2150     h->pred4x4[DC_128_PRED         ]= pred4x4_128_dc_c;
2151
2152     h->pred8x8[DC_PRED8x8     ]= pred8x8_dc_c;
2153     h->pred8x8[VERT_PRED8x8   ]= pred8x8_vertical_c;
2154     h->pred8x8[HOR_PRED8x8    ]= pred8x8_horizontal_c;
2155     h->pred8x8[PLANE_PRED8x8  ]= pred8x8_plane_c;
2156     h->pred8x8[LEFT_DC_PRED8x8]= pred8x8_left_dc_c;
2157     h->pred8x8[TOP_DC_PRED8x8 ]= pred8x8_top_dc_c;
2158     h->pred8x8[DC_128_PRED8x8 ]= pred8x8_128_dc_c;
2159
2160     h->pred16x16[DC_PRED8x8     ]= pred16x16_dc_c;
2161     h->pred16x16[VERT_PRED8x8   ]= pred16x16_vertical_c;
2162     h->pred16x16[HOR_PRED8x8    ]= pred16x16_horizontal_c;
2163     h->pred16x16[PLANE_PRED8x8  ]= pred16x16_plane_c;
2164     h->pred16x16[LEFT_DC_PRED8x8]= pred16x16_left_dc_c;
2165     h->pred16x16[TOP_DC_PRED8x8 ]= pred16x16_top_dc_c;
2166     h->pred16x16[DC_128_PRED8x8 ]= pred16x16_128_dc_c;
2167 }
2168
2169 static void free_tables(H264Context *h){
2170     av_freep(&h->intra4x4_pred_mode);
2171     av_freep(&h->chroma_pred_mode_table);
2172     av_freep(&h->cbp_table);
2173     av_freep(&h->mvd_table[0]);
2174     av_freep(&h->mvd_table[1]);
2175     av_freep(&h->non_zero_count);
2176     av_freep(&h->slice_table_base);
2177     av_freep(&h->top_border);
2178     h->slice_table= NULL;
2179
2180     av_freep(&h->mb2b_xy);
2181     av_freep(&h->mb2b8_xy);
2182 }
2183
2184 /**
2185  * allocates tables.
2186  * needs widzh/height
2187  */
2188 static int alloc_tables(H264Context *h){
2189     MpegEncContext * const s = &h->s;
2190     const int big_mb_num= s->mb_stride * (s->mb_height+1);
2191     int x,y;
2192
2193     CHECKED_ALLOCZ(h->intra4x4_pred_mode, big_mb_num * 8  * sizeof(uint8_t))
2194
2195     CHECKED_ALLOCZ(h->non_zero_count    , big_mb_num * 16 * sizeof(uint8_t))
2196     CHECKED_ALLOCZ(h->slice_table_base  , big_mb_num * sizeof(uint8_t))
2197     CHECKED_ALLOCZ(h->top_border       , s->mb_width * (16+8+8) * sizeof(uint8_t))
2198
2199     if( h->pps.cabac ) {
2200         CHECKED_ALLOCZ(h->chroma_pred_mode_table, big_mb_num * sizeof(uint8_t))
2201         CHECKED_ALLOCZ(h->cbp_table, big_mb_num * sizeof(uint16_t))
2202         CHECKED_ALLOCZ(h->mvd_table[0], 32*big_mb_num * sizeof(uint16_t));
2203         CHECKED_ALLOCZ(h->mvd_table[1], 32*big_mb_num * sizeof(uint16_t));
2204     }
2205
2206     memset(h->slice_table_base, -1, big_mb_num  * sizeof(uint8_t));
2207     h->slice_table= h->slice_table_base + s->mb_stride + 1;
2208
2209     CHECKED_ALLOCZ(h->mb2b_xy  , big_mb_num * sizeof(uint16_t));
2210     CHECKED_ALLOCZ(h->mb2b8_xy , big_mb_num * sizeof(uint16_t));
2211     for(y=0; y<s->mb_height; y++){
2212         for(x=0; x<s->mb_width; x++){
2213             const int mb_xy= x + y*s->mb_stride;
2214             const int b_xy = 4*x + 4*y*h->b_stride;
2215             const int b8_xy= 2*x + 2*y*h->b8_stride;
2216         
2217             h->mb2b_xy [mb_xy]= b_xy;
2218             h->mb2b8_xy[mb_xy]= b8_xy;
2219         }
2220     }
2221     
2222     return 0;
2223 fail:
2224     free_tables(h);
2225     return -1;
2226 }
2227
2228 static void common_init(H264Context *h){
2229     MpegEncContext * const s = &h->s;
2230
2231     s->width = s->avctx->width;
2232     s->height = s->avctx->height;
2233     s->codec_id= s->avctx->codec->id;
2234     
2235     init_pred_ptrs(h);
2236
2237     s->unrestricted_mv=1;
2238     s->decode=1; //FIXME
2239 }
2240
2241 static int decode_init(AVCodecContext *avctx){
2242     H264Context *h= avctx->priv_data;
2243     MpegEncContext * const s = &h->s;
2244
2245     MPV_decode_defaults(s);
2246     
2247     s->avctx = avctx;
2248     common_init(h);
2249
2250     s->out_format = FMT_H264;
2251     s->workaround_bugs= avctx->workaround_bugs;
2252
2253     // set defaults
2254 //    s->decode_mb= ff_h263_decode_mb;
2255     s->low_delay= 1;
2256     avctx->pix_fmt= PIX_FMT_YUV420P;
2257
2258     decode_init_vlc(h);
2259     
2260     return 0;
2261 }
2262
2263 static void frame_start(H264Context *h){
2264     MpegEncContext * const s = &h->s;
2265     int i;
2266
2267     MPV_frame_start(s, s->avctx);
2268     ff_er_frame_start(s);
2269     h->mmco_index=0;
2270
2271     assert(s->linesize && s->uvlinesize);
2272
2273     for(i=0; i<16; i++){
2274         h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3);
2275         h->chroma_subblock_offset[i]= 2*((scan8[i] - scan8[0])&7) + 2*s->uvlinesize*((scan8[i] - scan8[0])>>3);
2276     }
2277     for(i=0; i<4; i++){
2278         h->block_offset[16+i]=
2279         h->block_offset[20+i]= 4*((scan8[i] - scan8[0])&7) + 4*s->uvlinesize*((scan8[i] - scan8[0])>>3);
2280     }
2281
2282 //    s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1;
2283 }
2284
2285 static inline void backup_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize){
2286     MpegEncContext * const s = &h->s;
2287     int i;
2288     
2289     src_y  -=   linesize;
2290     src_cb -= uvlinesize;
2291     src_cr -= uvlinesize;
2292
2293     h->left_border[0]= h->top_border[s->mb_x][15];
2294     for(i=1; i<17; i++){
2295         h->left_border[i]= src_y[15+i*  linesize];
2296     }
2297     
2298     *(uint64_t*)(h->top_border[s->mb_x]+0)= *(uint64_t*)(src_y +  16*linesize);
2299     *(uint64_t*)(h->top_border[s->mb_x]+8)= *(uint64_t*)(src_y +8+16*linesize);
2300
2301     if(!(s->flags&CODEC_FLAG_GRAY)){
2302         h->left_border[17  ]= h->top_border[s->mb_x][16+7];
2303         h->left_border[17+9]= h->top_border[s->mb_x][24+7];
2304         for(i=1; i<9; i++){
2305             h->left_border[i+17  ]= src_cb[7+i*uvlinesize];
2306             h->left_border[i+17+9]= src_cr[7+i*uvlinesize];
2307         }
2308         *(uint64_t*)(h->top_border[s->mb_x]+16)= *(uint64_t*)(src_cb+8*uvlinesize);
2309         *(uint64_t*)(h->top_border[s->mb_x]+24)= *(uint64_t*)(src_cr+8*uvlinesize);
2310     }
2311 }
2312
2313 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){
2314     MpegEncContext * const s = &h->s;
2315     int temp8, i;
2316     uint64_t temp64;
2317
2318     src_y  -=   linesize + 1;
2319     src_cb -= uvlinesize + 1;
2320     src_cr -= uvlinesize + 1;
2321
2322 #define XCHG(a,b,t,xchg)\
2323 t= a;\
2324 if(xchg)\
2325     a= b;\
2326 b= t;
2327     
2328     for(i=0; i<17; i++){
2329         XCHG(h->left_border[i     ], src_y [i*  linesize], temp8, xchg);
2330     }
2331     
2332     XCHG(*(uint64_t*)(h->top_border[s->mb_x]+0), *(uint64_t*)(src_y +1), temp64, xchg);
2333     XCHG(*(uint64_t*)(h->top_border[s->mb_x]+8), *(uint64_t*)(src_y +9), temp64, 1);
2334
2335     if(!(s->flags&CODEC_FLAG_GRAY)){
2336         for(i=0; i<9; i++){
2337             XCHG(h->left_border[i+17  ], src_cb[i*uvlinesize], temp8, xchg);
2338             XCHG(h->left_border[i+17+9], src_cr[i*uvlinesize], temp8, xchg);
2339         }
2340         XCHG(*(uint64_t*)(h->top_border[s->mb_x]+16), *(uint64_t*)(src_cb+1), temp64, 1);
2341         XCHG(*(uint64_t*)(h->top_border[s->mb_x]+24), *(uint64_t*)(src_cr+1), temp64, 1);
2342     }
2343 }
2344
2345 static void hl_decode_mb(H264Context *h){
2346     MpegEncContext * const s = &h->s;
2347     const int mb_x= s->mb_x;
2348     const int mb_y= s->mb_y;
2349     const int mb_xy= mb_x + mb_y*s->mb_stride;
2350     const int mb_type= s->current_picture.mb_type[mb_xy];
2351     uint8_t  *dest_y, *dest_cb, *dest_cr;
2352     int linesize, uvlinesize /*dct_offset*/;
2353     int i;
2354
2355     if(!s->decode)
2356         return;
2357
2358     if(s->mb_skiped){
2359     }
2360
2361     dest_y  = s->current_picture.data[0] + (mb_y * 16* s->linesize  ) + mb_x * 16;
2362     dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
2363     dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
2364
2365     if (h->mb_field_decoding_flag) {
2366         linesize = s->linesize * 2;
2367         uvlinesize = s->uvlinesize * 2;
2368         if(mb_y&1){ //FIXME move out of this func?
2369             dest_y -= s->linesize*15;
2370             dest_cb-= s->linesize*7;
2371             dest_cr-= s->linesize*7;
2372         }
2373     } else {
2374         linesize = s->linesize;
2375         uvlinesize = s->uvlinesize;
2376 //        dct_offset = s->linesize * 16;
2377     }
2378
2379     if(IS_INTRA(mb_type)){
2380         if(h->deblocking_filter)
2381             xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 1);
2382
2383         if(!(s->flags&CODEC_FLAG_GRAY)){
2384             h->pred8x8[ h->chroma_pred_mode ](dest_cb, uvlinesize);
2385             h->pred8x8[ h->chroma_pred_mode ](dest_cr, uvlinesize);
2386         }
2387
2388         if(IS_INTRA4x4(mb_type)){
2389             if(!s->encoding){
2390                 for(i=0; i<16; i++){
2391                     uint8_t * const ptr= dest_y + h->block_offset[i];
2392                     uint8_t *topright= ptr + 4 - linesize;
2393                     const int topright_avail= (h->topright_samples_available<<i)&0x8000;
2394                     const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
2395                     int tr;
2396
2397                     if(!topright_avail){
2398                         tr= ptr[3 - linesize]*0x01010101;
2399                         topright= (uint8_t*) &tr;
2400                     }else if(i==5 && h->deblocking_filter){
2401                         tr= *(uint32_t*)h->top_border[mb_x+1];
2402                         topright= (uint8_t*) &tr;
2403                     }
2404
2405                     h->pred4x4[ dir ](ptr, topright, linesize);
2406                     if(h->non_zero_count_cache[ scan8[i] ]){
2407                         if(s->codec_id == CODEC_ID_H264)
2408                             h264_add_idct_c(ptr, h->mb + i*16, linesize);
2409                         else
2410                             svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, 0);
2411                     }
2412                 }
2413             }
2414         }else{
2415             h->pred16x16[ h->intra16x16_pred_mode ](dest_y , linesize);
2416             if(s->codec_id == CODEC_ID_H264)
2417                 h264_luma_dc_dequant_idct_c(h->mb, s->qscale);
2418             else
2419                 svq3_luma_dc_dequant_idct_c(h->mb, s->qscale);
2420         }
2421         if(h->deblocking_filter)
2422             xchg_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, 0);
2423     }else if(s->codec_id == CODEC_ID_H264){
2424         hl_motion(h, dest_y, dest_cb, dest_cr,
2425                   s->dsp.put_h264_qpel_pixels_tab, s->dsp.put_h264_chroma_pixels_tab, 
2426                   s->dsp.avg_h264_qpel_pixels_tab, s->dsp.avg_h264_chroma_pixels_tab);
2427     }
2428
2429
2430     if(!IS_INTRA4x4(mb_type)){
2431         if(s->codec_id == CODEC_ID_H264){
2432             for(i=0; i<16; i++){
2433                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ //FIXME benchmark weird rule, & below
2434                     uint8_t * const ptr= dest_y + h->block_offset[i];
2435                     h264_add_idct_c(ptr, h->mb + i*16, linesize);
2436                 }
2437             }
2438         }else{
2439             for(i=0; i<16; i++){
2440                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ //FIXME benchmark weird rule, & below
2441                     uint8_t * const ptr= dest_y + h->block_offset[i];
2442                     svq3_add_idct_c(ptr, h->mb + i*16, linesize, s->qscale, IS_INTRA(mb_type) ? 1 : 0);
2443                 }
2444             }
2445         }
2446     }
2447
2448     if(!(s->flags&CODEC_FLAG_GRAY)){
2449         chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp);
2450         chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp);
2451         if(s->codec_id == CODEC_ID_H264){
2452             for(i=16; i<16+4; i++){
2453                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2454                     uint8_t * const ptr= dest_cb + h->block_offset[i];
2455                     h264_add_idct_c(ptr, h->mb + i*16, uvlinesize);
2456                 }
2457             }
2458             for(i=20; i<20+4; i++){
2459                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2460                     uint8_t * const ptr= dest_cr + h->block_offset[i];
2461                     h264_add_idct_c(ptr, h->mb + i*16, uvlinesize);
2462                 }
2463             }
2464         }else{
2465             for(i=16; i<16+4; i++){
2466                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2467                     uint8_t * const ptr= dest_cb + h->block_offset[i];
2468                     svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2);
2469                 }
2470             }
2471             for(i=20; i<20+4; i++){
2472                 if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2473                     uint8_t * const ptr= dest_cr + h->block_offset[i];
2474                     svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, chroma_qp[s->qscale + 12] - 12, 2);
2475                 }
2476             }
2477         }
2478     }
2479     if(h->deblocking_filter) {
2480         backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize);
2481         filter_mb(h, mb_x, mb_y, dest_y, dest_cb, dest_cr);
2482     }
2483 }
2484
2485 /**
2486  * fills the default_ref_list.
2487  */
2488 static int fill_default_ref_list(H264Context *h){
2489     MpegEncContext * const s = &h->s;
2490     int i;
2491     Picture sorted_short_ref[16];
2492     
2493     if(h->slice_type==B_TYPE){
2494         int out_i;
2495         int limit= -1;
2496
2497         for(out_i=0; out_i<h->short_ref_count; out_i++){
2498             int best_i=-1;
2499             int best_poc=-1;
2500
2501             for(i=0; i<h->short_ref_count; i++){
2502                 const int poc= h->short_ref[i]->poc;
2503                 if(poc > limit && poc < best_poc){
2504                     best_poc= poc;
2505                     best_i= i;
2506                 }
2507             }
2508             
2509             assert(best_i != -1);
2510             
2511             limit= best_poc;
2512             sorted_short_ref[out_i]= *h->short_ref[best_i];
2513         }
2514     }
2515
2516     if(s->picture_structure == PICT_FRAME){
2517         if(h->slice_type==B_TYPE){
2518             const int current_poc= s->current_picture_ptr->poc;
2519             int list;
2520
2521             for(list=0; list<2; list++){
2522                 int index=0;
2523
2524                 for(i=0; i<h->short_ref_count && index < h->ref_count[list]; i++){
2525                     const int i2= list ? h->short_ref_count - i - 1 : i;
2526                     const int poc= sorted_short_ref[i2].poc;
2527                     
2528                     if(sorted_short_ref[i2].reference != 3) continue; //FIXME refernce field shit
2529
2530                     if((list==1 && poc > current_poc) || (list==0 && poc < current_poc)){
2531                         h->default_ref_list[list][index  ]= sorted_short_ref[i2];
2532                         h->default_ref_list[list][index++].pic_id= sorted_short_ref[i2].frame_num;
2533                     }
2534                 }
2535
2536                 for(i=0; i<h->long_ref_count && index < h->ref_count[ list ]; i++){
2537                     if(h->long_ref[i]->reference != 3) continue;
2538
2539                     h->default_ref_list[ list ][index  ]= *h->long_ref[i];
2540                     h->default_ref_list[ list ][index++].pic_id= i;;
2541                 }
2542                 
2543                 if(h->long_ref_count > 1 && h->short_ref_count==0){
2544                     Picture temp= h->default_ref_list[1][0];
2545                     h->default_ref_list[1][0] = h->default_ref_list[1][1];
2546                     h->default_ref_list[1][0] = temp;
2547                 }
2548
2549                 if(index < h->ref_count[ list ])
2550                     memset(&h->default_ref_list[list][index], 0, sizeof(Picture)*(h->ref_count[ list ] - index));
2551             }
2552         }else{
2553             int index=0;
2554             for(i=0; i<h->short_ref_count && index < h->ref_count[0]; i++){
2555                 if(h->short_ref[i]->reference != 3) continue; //FIXME refernce field shit
2556                 h->default_ref_list[0][index  ]= *h->short_ref[i];
2557                 h->default_ref_list[0][index++].pic_id= h->short_ref[i]->frame_num;
2558             }
2559             for(i=0; i<h->long_ref_count && index < h->ref_count[0]; i++){
2560                 if(h->long_ref[i]->reference != 3) continue;
2561                 h->default_ref_list[0][index  ]= *h->long_ref[i];
2562                 h->default_ref_list[0][index++].pic_id= i;;
2563             }
2564             if(index < h->ref_count[0])
2565                 memset(&h->default_ref_list[0][index], 0, sizeof(Picture)*(h->ref_count[0] - index));
2566         }
2567     }else{ //FIELD
2568         if(h->slice_type==B_TYPE){
2569         }else{
2570             //FIXME second field balh
2571         }
2572     }
2573     return 0;
2574 }
2575
2576 static int decode_ref_pic_list_reordering(H264Context *h){
2577     MpegEncContext * const s = &h->s;
2578     int list;
2579     
2580     if(h->slice_type==I_TYPE || h->slice_type==SI_TYPE) return 0; //FIXME move beofre func
2581     
2582     for(list=0; list<2; list++){
2583         memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]);
2584
2585         if(get_bits1(&s->gb)){
2586             int pred= h->curr_pic_num;
2587             int index;
2588
2589             for(index=0; ; index++){
2590                 int reordering_of_pic_nums_idc= get_ue_golomb(&s->gb);
2591                 int pic_id;
2592                 int i;
2593                 
2594                 
2595                 if(index >= h->ref_count[list]){
2596                     av_log(h->s.avctx, AV_LOG_ERROR, "reference count overflow\n");
2597                     return -1;
2598                 }
2599                 
2600                 if(reordering_of_pic_nums_idc<3){
2601                     if(reordering_of_pic_nums_idc<2){
2602                         const int abs_diff_pic_num= get_ue_golomb(&s->gb) + 1;
2603
2604                         if(abs_diff_pic_num >= h->max_pic_num){
2605                             av_log(h->s.avctx, AV_LOG_ERROR, "abs_diff_pic_num overflow\n");
2606                             return -1;
2607                         }
2608
2609                         if(reordering_of_pic_nums_idc == 0) pred-= abs_diff_pic_num;
2610                         else                                pred+= abs_diff_pic_num;
2611                         pred &= h->max_pic_num - 1;
2612                     
2613                         for(i= h->ref_count[list]-1; i>=index; i--){
2614                             if(h->ref_list[list][i].pic_id == pred && h->ref_list[list][i].long_ref==0)
2615                                 break;
2616                         }
2617                     }else{
2618                         pic_id= get_ue_golomb(&s->gb); //long_term_pic_idx
2619
2620                         for(i= h->ref_count[list]-1; i>=index; i--){
2621                             if(h->ref_list[list][i].pic_id == pic_id && h->ref_list[list][i].long_ref==1)
2622                                 break;
2623                         }
2624                     }
2625
2626                     if(i < index){
2627                         av_log(h->s.avctx, AV_LOG_ERROR, "reference picture missing during reorder\n");
2628                         memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME
2629                     }else if(i > index){
2630                         Picture tmp= h->ref_list[list][i];
2631                         for(; i>index; i--){
2632                             h->ref_list[list][i]= h->ref_list[list][i-1];
2633                         }
2634                         h->ref_list[list][index]= tmp;
2635                     }
2636                 }else if(reordering_of_pic_nums_idc==3) 
2637                     break;
2638                 else{
2639                     av_log(h->s.avctx, AV_LOG_ERROR, "illegal reordering_of_pic_nums_idc\n");
2640                     return -1;
2641                 }
2642             }
2643         }
2644
2645         if(h->slice_type!=B_TYPE) break;
2646     }
2647     return 0;    
2648 }
2649
2650 static int pred_weight_table(H264Context *h){
2651     MpegEncContext * const s = &h->s;
2652     int list, i;
2653     
2654     h->luma_log2_weight_denom= get_ue_golomb(&s->gb);
2655     h->chroma_log2_weight_denom= get_ue_golomb(&s->gb);
2656
2657     for(list=0; list<2; list++){
2658         for(i=0; i<h->ref_count[list]; i++){
2659             int luma_weight_flag, chroma_weight_flag;
2660             
2661             luma_weight_flag= get_bits1(&s->gb);
2662             if(luma_weight_flag){
2663                 h->luma_weight[list][i]= get_se_golomb(&s->gb);
2664                 h->luma_offset[list][i]= get_se_golomb(&s->gb);
2665             }
2666
2667             chroma_weight_flag= get_bits1(&s->gb);
2668             if(chroma_weight_flag){
2669                 int j;
2670                 for(j=0; j<2; j++){
2671                     h->chroma_weight[list][i][j]= get_se_golomb(&s->gb);
2672                     h->chroma_offset[list][i][j]= get_se_golomb(&s->gb);
2673                 }
2674             }
2675         }
2676         if(h->slice_type != B_TYPE) break;
2677     }
2678     return 0;
2679 }
2680
2681 /**
2682  * instantaneos decoder refresh.
2683  */
2684 static void idr(H264Context *h){
2685     int i;
2686
2687     for(i=0; i<h->long_ref_count; i++){
2688         h->long_ref[i]->reference=0;
2689         h->long_ref[i]= NULL;
2690     }
2691     h->long_ref_count=0;
2692
2693     for(i=0; i<h->short_ref_count; i++){
2694         h->short_ref[i]->reference=0;
2695         h->short_ref[i]= NULL;
2696     }
2697     h->short_ref_count=0;
2698 }
2699
2700 /**
2701  *
2702  * @return the removed picture or NULL if an error occures
2703  */
2704 static Picture * remove_short(H264Context *h, int frame_num){
2705     MpegEncContext * const s = &h->s;
2706     int i;
2707     
2708     if(s->avctx->debug&FF_DEBUG_MMCO)
2709         av_log(h->s.avctx, AV_LOG_DEBUG, "remove short %d count %d\n", frame_num, h->short_ref_count);
2710     
2711     for(i=0; i<h->short_ref_count; i++){
2712         Picture *pic= h->short_ref[i];
2713         if(s->avctx->debug&FF_DEBUG_MMCO)
2714             av_log(h->s.avctx, AV_LOG_DEBUG, "%d %d %p\n", i, pic->frame_num, pic);
2715         if(pic->frame_num == frame_num){
2716             h->short_ref[i]= NULL;
2717             memmove(&h->short_ref[i], &h->short_ref[i+1], (h->short_ref_count - i - 1)*sizeof(Picture*));
2718             h->short_ref_count--;
2719             return pic;
2720         }
2721     }
2722     return NULL;
2723 }
2724
2725 /**
2726  *
2727  * @return the removed picture or NULL if an error occures
2728  */
2729 static Picture * remove_long(H264Context *h, int i){
2730     Picture *pic;
2731
2732     if(i >= h->long_ref_count) return NULL;
2733     pic= h->long_ref[i];
2734     if(pic==NULL) return NULL;
2735     
2736     h->long_ref[i]= NULL;
2737     memmove(&h->long_ref[i], &h->long_ref[i+1], (h->long_ref_count - i - 1)*sizeof(Picture*));
2738     h->long_ref_count--;
2739
2740     return pic;
2741 }
2742
2743 /**
2744  * Executes the reference picture marking (memory management control operations).
2745  */
2746 static int execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
2747     MpegEncContext * const s = &h->s;
2748     int i;
2749     int current_is_long=0;
2750     Picture *pic;
2751     
2752     if((s->avctx->debug&FF_DEBUG_MMCO) && mmco_count==0)
2753         av_log(h->s.avctx, AV_LOG_DEBUG, "no mmco here\n");
2754         
2755     for(i=0; i<mmco_count; i++){
2756         if(s->avctx->debug&FF_DEBUG_MMCO)
2757             av_log(h->s.avctx, AV_LOG_DEBUG, "mmco:%d %d %d\n", h->mmco[i].opcode, h->mmco[i].short_frame_num, h->mmco[i].long_index);
2758
2759         switch(mmco[i].opcode){
2760         case MMCO_SHORT2UNUSED:
2761             pic= remove_short(h, mmco[i].short_frame_num);
2762             if(pic==NULL) return -1;
2763             pic->reference= 0;
2764             break;
2765         case MMCO_SHORT2LONG:
2766             pic= remove_long(h, mmco[i].long_index);
2767             if(pic) pic->reference=0;
2768             
2769             h->long_ref[ mmco[i].long_index ]= remove_short(h, mmco[i].short_frame_num);
2770             h->long_ref[ mmco[i].long_index ]->long_ref=1;
2771             break;
2772         case MMCO_LONG2UNUSED:
2773             pic= remove_long(h, mmco[i].long_index);
2774             if(pic==NULL) return -1;
2775             pic->reference= 0;
2776             break;
2777         case MMCO_LONG:
2778             pic= remove_long(h, mmco[i].long_index);
2779             if(pic) pic->reference=0;
2780             
2781             h->long_ref[ mmco[i].long_index ]= s->current_picture_ptr;
2782             h->long_ref[ mmco[i].long_index ]->long_ref=1;
2783             h->long_ref_count++;
2784             
2785             current_is_long=1;
2786             break;
2787         case MMCO_SET_MAX_LONG:
2788             assert(mmco[i].long_index <= 16);
2789             while(mmco[i].long_index < h->long_ref_count){
2790                 pic= remove_long(h, mmco[i].long_index);
2791                 pic->reference=0;
2792             }
2793             while(mmco[i].long_index > h->long_ref_count){
2794                 h->long_ref[ h->long_ref_count++ ]= NULL;
2795             }
2796             break;
2797         case MMCO_RESET:
2798             while(h->short_ref_count){
2799                 pic= remove_short(h, h->short_ref[0]->frame_num);
2800                 pic->reference=0;
2801             }
2802             while(h->long_ref_count){
2803                 pic= remove_long(h, h->long_ref_count-1);
2804                 pic->reference=0;
2805             }
2806             break;
2807         default: assert(0);
2808         }
2809     }
2810     
2811     if(!current_is_long){
2812         pic= remove_short(h, s->current_picture_ptr->frame_num);
2813         if(pic){
2814             pic->reference=0;
2815             av_log(h->s.avctx, AV_LOG_ERROR, "illegal short term buffer state detected\n");
2816         }
2817         
2818         if(h->short_ref_count)
2819             memmove(&h->short_ref[1], &h->short_ref[0], h->short_ref_count*sizeof(Picture*));
2820
2821         h->short_ref[0]= s->current_picture_ptr;
2822         h->short_ref[0]->long_ref=0;
2823         h->short_ref_count++;
2824     }
2825     
2826     return 0; 
2827 }
2828
2829 static int decode_ref_pic_marking(H264Context *h){
2830     MpegEncContext * const s = &h->s;
2831     int i;
2832     
2833     if(h->nal_unit_type == NAL_IDR_SLICE){ //FIXME fields
2834         s->broken_link= get_bits1(&s->gb) -1;
2835         h->mmco[0].long_index= get_bits1(&s->gb) - 1; // current_long_term_idx
2836         if(h->mmco[0].long_index == -1)
2837             h->mmco_index= 0;
2838         else{
2839             h->mmco[0].opcode= MMCO_LONG;
2840             h->mmco_index= 1;
2841         } 
2842     }else{
2843         if(get_bits1(&s->gb)){ // adaptive_ref_pic_marking_mode_flag
2844             for(i= h->mmco_index; i<MAX_MMCO_COUNT; i++) { 
2845                 MMCOOpcode opcode= get_ue_golomb(&s->gb);;
2846
2847                 h->mmco[i].opcode= opcode;
2848                 if(opcode==MMCO_SHORT2UNUSED || opcode==MMCO_SHORT2LONG){
2849                     h->mmco[i].short_frame_num= (h->frame_num - get_ue_golomb(&s->gb) - 1) & ((1<<h->sps.log2_max_frame_num)-1); //FIXME fields
2850 /*                    if(h->mmco[i].short_frame_num >= h->short_ref_count || h->short_ref[ h->mmco[i].short_frame_num ] == NULL){
2851                         fprintf(stderr, "illegal short ref in memory management control operation %d\n", mmco);
2852                         return -1;
2853                     }*/
2854                 }
2855                 if(opcode==MMCO_SHORT2LONG || opcode==MMCO_LONG2UNUSED || opcode==MMCO_LONG || opcode==MMCO_SET_MAX_LONG){
2856                     h->mmco[i].long_index= get_ue_golomb(&s->gb);
2857                     if(/*h->mmco[i].long_index >= h->long_ref_count || h->long_ref[ h->mmco[i].long_index ] == NULL*/ h->mmco[i].long_index >= 16){
2858                         av_log(h->s.avctx, AV_LOG_ERROR, "illegal long ref in memory management control operation %d\n", opcode);
2859                         return -1;
2860                     }
2861                 }
2862                     
2863                 if(opcode > MMCO_LONG){
2864                     av_log(h->s.avctx, AV_LOG_ERROR, "illegal memory management control operation %d\n", opcode);
2865                     return -1;
2866                 }
2867             }
2868             h->mmco_index= i;
2869         }else{
2870             assert(h->long_ref_count + h->short_ref_count <= h->sps.ref_frame_count);
2871
2872             if(h->long_ref_count + h->short_ref_count == h->sps.ref_frame_count){ //FIXME fields
2873                 h->mmco[0].opcode= MMCO_SHORT2UNUSED;
2874                 h->mmco[0].short_frame_num= h->short_ref[ h->short_ref_count - 1 ]->frame_num;
2875                 h->mmco_index= 1;
2876             }else
2877                 h->mmco_index= 0;
2878         }
2879     }
2880     
2881     return 0; 
2882 }
2883
2884 static int init_poc(H264Context *h){
2885     MpegEncContext * const s = &h->s;
2886     const int max_frame_num= 1<<h->sps.log2_max_frame_num;
2887     int field_poc[2];
2888
2889     if(h->nal_unit_type == NAL_IDR_SLICE){
2890         h->frame_num_offset= 0;
2891     }else{
2892         if(h->frame_num < h->prev_frame_num)
2893             h->frame_num_offset= h->prev_frame_num_offset + max_frame_num;
2894         else
2895             h->frame_num_offset= h->prev_frame_num_offset;
2896     }
2897
2898     if(h->sps.poc_type==0){
2899         const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb;
2900
2901         if     (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2)
2902             h->poc_msb = h->prev_poc_msb + max_poc_lsb;
2903         else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2)
2904             h->poc_msb = h->prev_poc_msb - max_poc_lsb;
2905         else
2906             h->poc_msb = h->prev_poc_msb;
2907 //printf("poc: %d %d\n", h->poc_msb, h->poc_lsb);
2908         field_poc[0] = 
2909         field_poc[1] = h->poc_msb + h->poc_lsb;
2910         if(s->picture_structure == PICT_FRAME) 
2911             field_poc[1] += h->delta_poc_bottom;
2912     }else if(h->sps.poc_type==1){
2913         int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc;
2914         int i;
2915
2916         if(h->sps.poc_cycle_length != 0)
2917             abs_frame_num = h->frame_num_offset + h->frame_num;
2918         else
2919             abs_frame_num = 0;
2920
2921         if(h->nal_ref_idc==0 && abs_frame_num > 0)
2922             abs_frame_num--;
2923             
2924         expected_delta_per_poc_cycle = 0;
2925         for(i=0; i < h->sps.poc_cycle_length; i++)
2926             expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[ i ]; //FIXME integrate during sps parse
2927
2928         if(abs_frame_num > 0){
2929             int poc_cycle_cnt          = (abs_frame_num - 1) / h->sps.poc_cycle_length;
2930             int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length;
2931
2932             expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle;
2933             for(i = 0; i <= frame_num_in_poc_cycle; i++)
2934                 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[ i ];
2935         } else
2936             expectedpoc = 0;
2937
2938         if(h->nal_ref_idc == 0) 
2939             expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic;
2940         
2941         field_poc[0] = expectedpoc + h->delta_poc[0];
2942         field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field;
2943
2944         if(s->picture_structure == PICT_FRAME)
2945             field_poc[1] += h->delta_poc[1];
2946     }else{
2947         int poc;
2948         if(h->nal_unit_type == NAL_IDR_SLICE){
2949             poc= 0;
2950         }else{
2951             if(h->nal_ref_idc) poc= 2*(h->frame_num_offset + h->frame_num);
2952             else               poc= 2*(h->frame_num_offset + h->frame_num) - 1;
2953         }
2954         field_poc[0]= poc;
2955         field_poc[1]= poc;
2956     }
2957     
2958     if(s->picture_structure != PICT_BOTTOM_FIELD)
2959         s->current_picture_ptr->field_poc[0]= field_poc[0];
2960     if(s->picture_structure != PICT_TOP_FIELD)
2961         s->current_picture_ptr->field_poc[1]= field_poc[1];
2962     if(s->picture_structure == PICT_FRAME) // FIXME field pix?
2963         s->current_picture_ptr->poc= FFMIN(field_poc[0], field_poc[1]);
2964
2965     return 0;
2966 }
2967
2968 /**
2969  * decodes a slice header.
2970  * this will allso call MPV_common_init() and frame_start() as needed
2971  */
2972 static int decode_slice_header(H264Context *h){
2973     MpegEncContext * const s = &h->s;
2974     int first_mb_in_slice, pps_id;
2975     int num_ref_idx_active_override_flag;
2976     static const uint8_t slice_type_map[5]= {P_TYPE, B_TYPE, I_TYPE, SP_TYPE, SI_TYPE};
2977
2978     s->current_picture.reference= h->nal_ref_idc != 0;
2979
2980     first_mb_in_slice= get_ue_golomb(&s->gb);
2981
2982     h->slice_type= get_ue_golomb(&s->gb);
2983     if(h->slice_type > 9){
2984         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);
2985     }
2986     if(h->slice_type > 4){
2987         h->slice_type -= 5;
2988         h->slice_type_fixed=1;
2989     }else
2990         h->slice_type_fixed=0;
2991     
2992     h->slice_type= slice_type_map[ h->slice_type ];
2993     
2994     s->pict_type= h->slice_type; // to make a few old func happy, its wrong though
2995         
2996     pps_id= get_ue_golomb(&s->gb);
2997     if(pps_id>255){
2998         av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n");
2999         return -1;
3000     }
3001     h->pps= h->pps_buffer[pps_id];
3002     if(h->pps.slice_group_count == 0){
3003         av_log(h->s.avctx, AV_LOG_ERROR, "non existing PPS referenced\n");
3004         return -1;
3005     }
3006
3007     h->sps= h->sps_buffer[ h->pps.sps_id ];
3008     if(h->sps.log2_max_frame_num == 0){
3009         av_log(h->s.avctx, AV_LOG_ERROR, "non existing SPS referenced\n");
3010         return -1;
3011     }
3012     
3013     s->mb_width= h->sps.mb_width;
3014     s->mb_height= h->sps.mb_height;
3015     
3016     h->b_stride=  s->mb_width*4;
3017     h->b8_stride= s->mb_width*2;
3018
3019     s->mb_x = first_mb_in_slice % s->mb_width;
3020     s->mb_y = first_mb_in_slice / s->mb_width; //FIXME AFFW
3021     
3022     s->width = 16*s->mb_width - 2*(h->sps.crop_left + h->sps.crop_right );
3023     if(h->sps.frame_mbs_only_flag)
3024         s->height= 16*s->mb_height - 2*(h->sps.crop_top  + h->sps.crop_bottom);
3025     else
3026         s->height= 16*s->mb_height - 4*(h->sps.crop_top  + h->sps.crop_bottom); //FIXME recheck
3027     
3028     if (s->context_initialized 
3029         && (   s->width != s->avctx->width || s->height != s->avctx->height)) {
3030         free_tables(h);
3031         MPV_common_end(s);
3032     }
3033     if (!s->context_initialized) {
3034         if (MPV_common_init(s) < 0)
3035             return -1;
3036
3037         alloc_tables(h);
3038
3039         s->avctx->width = s->width;
3040         s->avctx->height = s->height;
3041         s->avctx->sample_aspect_ratio= h->sps.sar;
3042     }
3043
3044     if(first_mb_in_slice == 0){
3045         frame_start(h);
3046     }
3047
3048     s->current_picture_ptr->frame_num= //FIXME frame_num cleanup
3049     h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num);
3050
3051     if(h->sps.frame_mbs_only_flag){
3052         s->picture_structure= PICT_FRAME;
3053     }else{
3054         if(get_bits1(&s->gb)) //field_pic_flag
3055             s->picture_structure= PICT_TOP_FIELD + get_bits1(&s->gb); //bottom_field_flag
3056         else
3057             s->picture_structure= PICT_FRAME;
3058     }
3059
3060     if(s->picture_structure==PICT_FRAME){
3061         h->curr_pic_num=   h->frame_num;
3062         h->max_pic_num= 1<< h->sps.log2_max_frame_num;
3063     }else{
3064         h->curr_pic_num= 2*h->frame_num;
3065         h->max_pic_num= 1<<(h->sps.log2_max_frame_num + 1);
3066     }
3067         
3068     if(h->nal_unit_type == NAL_IDR_SLICE){
3069         get_ue_golomb(&s->gb); /* idr_pic_id */
3070     }
3071    
3072     if(h->sps.poc_type==0){
3073         h->poc_lsb= get_bits(&s->gb, h->sps.log2_max_poc_lsb);
3074         
3075         if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME){
3076             h->delta_poc_bottom= get_se_golomb(&s->gb);
3077         }
3078     }
3079     
3080     if(h->sps.poc_type==1 && !h->sps.delta_pic_order_always_zero_flag){
3081         h->delta_poc[0]= get_se_golomb(&s->gb);
3082         
3083         if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME)
3084             h->delta_poc[1]= get_se_golomb(&s->gb);
3085     }
3086     
3087     init_poc(h);
3088     
3089     if(h->pps.redundant_pic_cnt_present){
3090         h->redundant_pic_count= get_ue_golomb(&s->gb);
3091     }
3092
3093     //set defaults, might be overriden a few line later
3094     h->ref_count[0]= h->pps.ref_count[0];
3095     h->ref_count[1]= h->pps.ref_count[1];
3096
3097     if(h->slice_type == P_TYPE || h->slice_type == SP_TYPE || h->slice_type == B_TYPE){
3098         if(h->slice_type == B_TYPE){
3099             h->direct_spatial_mv_pred= get_bits1(&s->gb);
3100         }
3101         num_ref_idx_active_override_flag= get_bits1(&s->gb);
3102     
3103         if(num_ref_idx_active_override_flag){
3104             h->ref_count[0]= get_ue_golomb(&s->gb) + 1;
3105             if(h->slice_type==B_TYPE)
3106                 h->ref_count[1]= get_ue_golomb(&s->gb) + 1;
3107
3108             if(h->ref_count[0] > 32 || h->ref_count[1] > 32){
3109                 av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow\n");
3110                 return -1;
3111             }
3112         }
3113     }
3114
3115     if(first_mb_in_slice == 0){
3116         fill_default_ref_list(h);
3117     }
3118
3119     decode_ref_pic_list_reordering(h);
3120
3121     if(   (h->pps.weighted_pred          && (h->slice_type == P_TYPE || h->slice_type == SP_TYPE )) 
3122        || (h->pps.weighted_bipred_idc==1 && h->slice_type==B_TYPE ) )
3123         pred_weight_table(h);
3124     
3125     if(s->current_picture.reference)
3126         decode_ref_pic_marking(h);
3127
3128     if( h->slice_type != I_TYPE && h->slice_type != SI_TYPE && h->pps.cabac )
3129         h->cabac_init_idc = get_ue_golomb(&s->gb);
3130
3131     h->last_qscale_diff = 0;
3132     s->qscale = h->pps.init_qp + get_se_golomb(&s->gb);
3133     if(s->qscale<0 || s->qscale>51){
3134         av_log(s->avctx, AV_LOG_ERROR, "QP %d out of range\n", s->qscale);
3135         return -1;
3136     }
3137     //FIXME qscale / qp ... stuff
3138     if(h->slice_type == SP_TYPE){
3139         get_bits1(&s->gb); /* sp_for_switch_flag */
3140     }
3141     if(h->slice_type==SP_TYPE || h->slice_type == SI_TYPE){
3142         get_se_golomb(&s->gb); /* slice_qs_delta */
3143     }
3144
3145     h->deblocking_filter = 1;
3146     h->slice_alpha_c0_offset = 0;
3147     h->slice_beta_offset = 0;
3148     if( h->pps.deblocking_filter_parameters_present ) {
3149         h->deblocking_filter= get_ue_golomb(&s->gb);
3150         if(h->deblocking_filter < 2) 
3151             h->deblocking_filter^= 1; // 1<->0
3152
3153         if( h->deblocking_filter ) {
3154             h->slice_alpha_c0_offset = get_se_golomb(&s->gb) << 1;
3155             h->slice_beta_offset = get_se_golomb(&s->gb) << 1;
3156         }
3157     }
3158
3159 #if 0 //FMO
3160     if( h->pps.num_slice_groups > 1  && h->pps.mb_slice_group_map_type >= 3 && h->pps.mb_slice_group_map_type <= 5)
3161         slice_group_change_cycle= get_bits(&s->gb, ?);
3162 #endif
3163
3164     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
3165         av_log(h->s.avctx, AV_LOG_DEBUG, "mb:%d %c pps:%d frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%d\n", 
3166                first_mb_in_slice, 
3167                av_get_pict_type_char(h->slice_type),
3168                pps_id, h->frame_num,
3169                s->current_picture_ptr->field_poc[0], s->current_picture_ptr->field_poc[1],
3170                h->ref_count[0], h->ref_count[1],
3171                s->qscale,
3172                h->deblocking_filter
3173                );
3174     }
3175
3176     return 0;
3177 }
3178
3179 /**
3180  *
3181  */
3182 static inline int get_level_prefix(GetBitContext *gb){
3183     unsigned int buf;
3184     int log;
3185     
3186     OPEN_READER(re, gb);
3187     UPDATE_CACHE(re, gb);
3188     buf=GET_CACHE(re, gb);
3189     
3190     log= 32 - av_log2(buf);
3191 #ifdef TRACE
3192     print_bin(buf>>(32-log), log);
3193     printf("%5d %2d %3d lpr @%5d in %s get_level_prefix\n", buf>>(32-log), log, log-1, get_bits_count(gb), __FILE__);
3194 #endif
3195
3196     LAST_SKIP_BITS(re, gb, log);
3197     CLOSE_READER(re, gb);
3198
3199     return log-1;
3200 }
3201
3202 /**
3203  * decodes a residual block.
3204  * @param n block index
3205  * @param scantable scantable
3206  * @param max_coeff number of coefficients in the block
3207  * @return <0 if an error occured
3208  */
3209 static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, int n, const uint8_t *scantable, int qp, int max_coeff){
3210     MpegEncContext * const s = &h->s;
3211     const uint16_t *qmul= dequant_coeff[qp];
3212     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};
3213     int level[16], run[16];
3214     int suffix_length, zeros_left, coeff_num, coeff_token, total_coeff, i, trailing_ones;
3215
3216     //FIXME put trailing_onex into the context
3217
3218     if(n == CHROMA_DC_BLOCK_INDEX){
3219         coeff_token= get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1);
3220         total_coeff= coeff_token>>2;
3221     }else{    
3222         if(n == LUMA_DC_BLOCK_INDEX){
3223             total_coeff= pred_non_zero_count(h, 0);
3224             coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
3225             total_coeff= coeff_token>>2;
3226         }else{
3227             total_coeff= pred_non_zero_count(h, n);
3228             coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
3229             total_coeff= coeff_token>>2;
3230             h->non_zero_count_cache[ scan8[n] ]= total_coeff;
3231         }
3232     }
3233
3234     //FIXME set last_non_zero?
3235
3236     if(total_coeff==0)
3237         return 0;
3238         
3239     trailing_ones= coeff_token&3;
3240     tprintf("trailing:%d, total:%d\n", trailing_ones, total_coeff);
3241     assert(total_coeff<=16);
3242     
3243     for(i=0; i<trailing_ones; i++){
3244         level[i]= 1 - 2*get_bits1(gb);
3245     }
3246
3247     suffix_length= total_coeff > 10 && trailing_ones < 3;
3248
3249     for(; i<total_coeff; i++){
3250         const int prefix= get_level_prefix(gb);
3251         int level_code, mask;
3252
3253         if(prefix<14){ //FIXME try to build a large unified VLC table for all this
3254             if(suffix_length)
3255                 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
3256             else
3257                 level_code= (prefix<<suffix_length); //part
3258         }else if(prefix==14){
3259             if(suffix_length)
3260                 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
3261             else
3262                 level_code= prefix + get_bits(gb, 4); //part
3263         }else if(prefix==15){
3264             level_code= (prefix<<suffix_length) + get_bits(gb, 12); //part
3265             if(suffix_length==0) level_code+=15; //FIXME doesnt make (much)sense
3266         }else{
3267             av_log(h->s.avctx, AV_LOG_ERROR, "prefix too large at %d %d\n", s->mb_x, s->mb_y);
3268             return -1;
3269         }
3270
3271         if(i==trailing_ones && i<3) level_code+= 2; //FIXME split first iteration
3272
3273         mask= -(level_code&1);
3274         level[i]= (((2+level_code)>>1) ^ mask) - mask;
3275
3276         if(suffix_length==0) suffix_length=1; //FIXME split first iteration
3277
3278 #if 1
3279         if(ABS(level[i]) > (3<<(suffix_length-1)) && suffix_length<6) suffix_length++;
3280 #else        
3281         if((2+level_code)>>1) > (3<<(suffix_length-1)) && suffix_length<6) suffix_length++;
3282         /* ? == prefix > 2 or sth */
3283 #endif
3284         tprintf("level: %d suffix_length:%d\n", level[i], suffix_length);
3285     }
3286
3287     if(total_coeff == max_coeff)
3288         zeros_left=0;
3289     else{
3290         if(n == CHROMA_DC_BLOCK_INDEX)
3291             zeros_left= get_vlc2(gb, chroma_dc_total_zeros_vlc[ total_coeff-1 ].table, CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1);
3292         else
3293             zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff-1 ].table, TOTAL_ZEROS_VLC_BITS, 1);
3294     }
3295     
3296     for(i=0; i<total_coeff-1; i++){
3297         if(zeros_left <=0)
3298             break;
3299         else if(zeros_left < 7){
3300             run[i]= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1);
3301         }else{
3302             run[i]= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2);
3303         }
3304         zeros_left -= run[i];
3305     }
3306
3307     if(zeros_left<0){
3308         av_log(h->s.avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", s->mb_x, s->mb_y);
3309         return -1;
3310     }
3311     
3312     for(; i<total_coeff-1; i++){
3313         run[i]= 0;
3314     }
3315
3316     run[i]= zeros_left;
3317
3318     coeff_num=-1;
3319     if(n > 24){
3320         for(i=total_coeff-1; i>=0; i--){ //FIXME merge into rundecode?
3321             int j;
3322
3323             coeff_num += run[i] + 1; //FIXME add 1 earlier ?
3324             j= scantable[ coeff_num ];
3325
3326             block[j]= level[i];
3327         }
3328     }else{
3329         for(i=total_coeff-1; i>=0; i--){ //FIXME merge into  rundecode?
3330             int j;
3331
3332             coeff_num += run[i] + 1; //FIXME add 1 earlier ?
3333             j= scantable[ coeff_num ];
3334
3335             block[j]= level[i] * qmul[j];
3336 //            printf("%d %d  ", block[j], qmul[j]);
3337         }
3338     }
3339     return 0;
3340 }
3341
3342 /**
3343  * decodes a macroblock
3344  * @returns 0 if ok, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
3345  */
3346 static int decode_mb_cavlc(H264Context *h){
3347     MpegEncContext * const s = &h->s;
3348     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
3349     int mb_type, partition_count, cbp;
3350
3351     s->dsp.clear_blocks(h->mb); //FIXME avoid if allready clear (move after skip handlong?    
3352
3353     tprintf("pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
3354     cbp = 0; /* avoid warning. FIXME: find a solution without slowing
3355                 down the code */
3356     if(h->slice_type != I_TYPE && h->slice_type != SI_TYPE){
3357         if(s->mb_skip_run==-1)
3358             s->mb_skip_run= get_ue_golomb(&s->gb);
3359         
3360         if (s->mb_skip_run--) {
3361             int mx, my;
3362             /* skip mb */
3363 //FIXME b frame
3364             mb_type= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0;
3365
3366             memset(h->non_zero_count[mb_xy], 0, 16);
3367             memset(h->non_zero_count_cache + 8, 0, 8*5); //FIXME ugly, remove pfui
3368
3369             if(h->sps.mb_aff && s->mb_skip_run==0 && (s->mb_y&1)==0){
3370                 h->mb_field_decoding_flag= get_bits1(&s->gb);
3371             }
3372
3373             if(h->mb_field_decoding_flag)
3374                 mb_type|= MB_TYPE_INTERLACED;
3375             
3376             fill_caches(h, mb_type); //FIXME check what is needed and what not ...
3377             pred_pskip_motion(h, &mx, &my);
3378             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1);
3379             fill_rectangle(  h->mv_cache[0][scan8[0]], 4, 4, 8, pack16to32(mx,my), 4);
3380             write_back_motion(h, mb_type);
3381
3382             s->current_picture.mb_type[mb_xy]= mb_type; //FIXME SKIP type
3383             s->current_picture.qscale_table[mb_xy]= s->qscale;
3384             h->slice_table[ mb_xy ]= h->slice_num;
3385
3386             h->prev_mb_skiped= 1;
3387             return 0;
3388         }
3389     }
3390     if(h->sps.mb_aff /* && !field pic FIXME needed? */){
3391         if((s->mb_y&1)==0)
3392             h->mb_field_decoding_flag = get_bits1(&s->gb);
3393     }else
3394         h->mb_field_decoding_flag=0; //FIXME som ed note ?!
3395     
3396     h->prev_mb_skiped= 0;
3397     
3398     mb_type= get_ue_golomb(&s->gb);
3399     if(h->slice_type == B_TYPE){
3400         if(mb_type < 23){
3401             partition_count= b_mb_type_info[mb_type].partition_count;
3402             mb_type=         b_mb_type_info[mb_type].type;
3403         }else{
3404             mb_type -= 23;
3405             goto decode_intra_mb;
3406         }
3407     }else if(h->slice_type == P_TYPE /*|| h->slice_type == SP_TYPE */){
3408         if(mb_type < 5){
3409             partition_count= p_mb_type_info[mb_type].partition_count;
3410             mb_type=         p_mb_type_info[mb_type].type;
3411         }else{
3412             mb_type -= 5;
3413             goto decode_intra_mb;
3414         }
3415     }else{
3416        assert(h->slice_type == I_TYPE);
3417 decode_intra_mb:
3418         if(mb_type > 25){
3419             av_log(h->s.avctx, AV_LOG_ERROR, "mb_type %d in %c slice to large at %d %d\n", mb_type, av_get_pict_type_char(h->slice_type), s->mb_x, s->mb_y);
3420             return -1;
3421         }
3422         partition_count=0;
3423         cbp= i_mb_type_info[mb_type].cbp;
3424         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
3425         mb_type= i_mb_type_info[mb_type].type;
3426     }
3427
3428     if(h->mb_field_decoding_flag)
3429         mb_type |= MB_TYPE_INTERLACED;
3430
3431     s->current_picture.mb_type[mb_xy]= mb_type;
3432     h->slice_table[ mb_xy ]= h->slice_num;
3433     
3434     if(IS_INTRA_PCM(mb_type)){
3435         const uint8_t *ptr;
3436         int x, y;
3437         
3438         // we assume these blocks are very rare so we dont optimize it
3439         align_get_bits(&s->gb);
3440         
3441         ptr= s->gb.buffer + get_bits_count(&s->gb);
3442     
3443         for(y=0; y<16; y++){
3444             const int index= 4*(y&3) + 64*(y>>2);
3445             for(x=0; x<16; x++){
3446                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
3447             }
3448         }
3449         for(y=0; y<8; y++){
3450             const int index= 256 + 4*(y&3) + 32*(y>>2);
3451             for(x=0; x<8; x++){
3452                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
3453             }
3454         }
3455         for(y=0; y<8; y++){
3456             const int index= 256 + 64 + 4*(y&3) + 32*(y>>2);
3457             for(x=0; x<8; x++){
3458                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
3459             }
3460         }
3461     
3462         skip_bits(&s->gb, 384); //FIXME check /fix the bitstream readers
3463         
3464         //FIXME deblock filter, non_zero_count_cache init ...
3465         memset(h->non_zero_count[mb_xy], 16, 16);
3466         s->current_picture.qscale_table[mb_xy]= s->qscale;
3467         
3468         return 0;
3469     }
3470         
3471     fill_caches(h, mb_type);
3472
3473     //mb_pred
3474     if(IS_INTRA(mb_type)){
3475 //            init_top_left_availability(h);
3476             if(IS_INTRA4x4(mb_type)){
3477                 int i;
3478
3479 //                fill_intra4x4_pred_table(h);
3480                 for(i=0; i<16; i++){
3481                     const int mode_coded= !get_bits1(&s->gb);
3482                     const int predicted_mode=  pred_intra_mode(h, i);
3483                     int mode;
3484
3485                     if(mode_coded){
3486                         const int rem_mode= get_bits(&s->gb, 3);
3487                         if(rem_mode<predicted_mode)
3488                             mode= rem_mode;
3489                         else
3490                             mode= rem_mode + 1;
3491                     }else{
3492                         mode= predicted_mode;
3493                     }
3494                     
3495                     h->intra4x4_pred_mode_cache[ scan8[i] ] = mode;
3496                 }
3497                 write_back_intra_pred_mode(h);
3498                 if( check_intra4x4_pred_mode(h) < 0)
3499                     return -1;
3500             }else{
3501                 h->intra16x16_pred_mode= check_intra_pred_mode(h, h->intra16x16_pred_mode);
3502                 if(h->intra16x16_pred_mode < 0)
3503                     return -1;
3504             }
3505             h->chroma_pred_mode= get_ue_golomb(&s->gb);
3506
3507             h->chroma_pred_mode= check_intra_pred_mode(h, h->chroma_pred_mode);
3508             if(h->chroma_pred_mode < 0)
3509                 return -1;
3510     }else if(partition_count==4){
3511         int i, j, sub_partition_count[4], list, ref[2][4];
3512         
3513         if(h->slice_type == B_TYPE){
3514             for(i=0; i<4; i++){
3515                 h->sub_mb_type[i]= get_ue_golomb(&s->gb);
3516                 if(h->sub_mb_type[i] >=13){
3517                     av_log(h->s.avctx, AV_LOG_ERROR, "B sub_mb_type %d out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y);
3518                     return -1;
3519                 }
3520                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
3521                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
3522             }
3523         }else{
3524             assert(h->slice_type == P_TYPE || h->slice_type == SP_TYPE); //FIXME SP correct ?
3525             for(i=0; i<4; i++){
3526                 h->sub_mb_type[i]= get_ue_golomb(&s->gb);
3527                 if(h->sub_mb_type[i] >=4){
3528                     av_log(h->s.avctx, AV_LOG_ERROR, "P sub_mb_type %d out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y);
3529                     return -1;
3530                 }
3531                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
3532                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
3533             }
3534         }
3535         
3536         for(list=0; list<2; list++){
3537             const int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list];
3538             if(ref_count == 0) continue;
3539             for(i=0; i<4; i++){
3540                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
3541                     ref[list][i] = get_te0_golomb(&s->gb, ref_count); //FIXME init to 0 before and skip?
3542                 }else{
3543                  //FIXME
3544                     ref[list][i] = -1;
3545                 }
3546             }
3547         }
3548         
3549         for(list=0; list<2; list++){
3550             const int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list];
3551             if(ref_count == 0) continue;
3552
3553             for(i=0; i<4; i++){
3554                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ]=
3555                 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
3556
3557                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
3558                     const int sub_mb_type= h->sub_mb_type[i];
3559                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
3560                     for(j=0; j<sub_partition_count[i]; j++){
3561                         int mx, my;
3562                         const int index= 4*i + block_width*j;
3563                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
3564                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
3565                         mx += get_se_golomb(&s->gb);
3566                         my += get_se_golomb(&s->gb);
3567                         tprintf("final mv:%d %d\n", mx, my);
3568
3569                         if(IS_SUB_8X8(sub_mb_type)){
3570                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]= 
3571                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
3572                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]= 
3573                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
3574                         }else if(IS_SUB_8X4(sub_mb_type)){
3575                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]= mx;
3576                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]= my;
3577                         }else if(IS_SUB_4X8(sub_mb_type)){
3578                             mv_cache[ 0 ][0]= mv_cache[ 8 ][0]= mx;
3579                             mv_cache[ 0 ][1]= mv_cache[ 8 ][1]= my;
3580                         }else{
3581                             assert(IS_SUB_4X4(sub_mb_type));
3582                             mv_cache[ 0 ][0]= mx;
3583                             mv_cache[ 0 ][1]= my;
3584                         }
3585                     }
3586                 }else{
3587                     uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
3588                     p[0] = p[1]=
3589                     p[8] = p[9]= 0;
3590                 }
3591             }
3592         }
3593     }else if(!IS_DIRECT(mb_type)){
3594         int list, mx, my, i;
3595          //FIXME we should set ref_idx_l? to 0 if we use that later ...
3596         if(IS_16X16(mb_type)){
3597             for(list=0; list<2; list++){
3598                 if(h->ref_count[0]>0){
3599                     if(IS_DIR(mb_type, 0, list)){
3600                         const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
3601                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
3602                     }
3603                 }
3604             }
3605             for(list=0; list<2; list++){
3606                 if(IS_DIR(mb_type, 0, list)){
3607                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
3608                     mx += get_se_golomb(&s->gb);
3609                     my += get_se_golomb(&s->gb);
3610                     tprintf("final mv:%d %d\n", mx, my);
3611
3612                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
3613                 }
3614             }
3615         }
3616         else if(IS_16X8(mb_type)){
3617             for(list=0; list<2; list++){
3618                 if(h->ref_count[list]>0){
3619                     for(i=0; i<2; i++){
3620                         if(IS_DIR(mb_type, i, list)){
3621                             const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
3622                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
3623                         }
3624                     }
3625                 }
3626             }
3627             for(list=0; list<2; list++){
3628                 for(i=0; i<2; i++){
3629                     if(IS_DIR(mb_type, i, list)){
3630                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
3631                         mx += get_se_golomb(&s->gb);
3632                         my += get_se_golomb(&s->gb);
3633                         tprintf("final mv:%d %d\n", mx, my);
3634
3635                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
3636                     }
3637                 }
3638             }
3639         }else{
3640             assert(IS_8X16(mb_type));
3641             for(list=0; list<2; list++){
3642                 if(h->ref_count[list]>0){
3643                     for(i=0; i<2; i++){
3644                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
3645                             const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
3646                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
3647                         }
3648                     }
3649                 }
3650             }
3651             for(list=0; list<2; list++){
3652                 for(i=0; i<2; i++){
3653                     if(IS_DIR(mb_type, i, list)){
3654                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
3655                         mx += get_se_golomb(&s->gb);
3656                         my += get_se_golomb(&s->gb);
3657                         tprintf("final mv:%d %d\n", mx, my);
3658
3659                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
3660                     }
3661                 }
3662             }
3663         }
3664     }
3665     
3666     if(IS_INTER(mb_type))
3667         write_back_motion(h, mb_type);
3668     
3669     if(!IS_INTRA16x16(mb_type)){
3670         cbp= get_ue_golomb(&s->gb);
3671         if(cbp > 47){
3672             av_log(h->s.avctx, AV_LOG_ERROR, "cbp too large (%d) at %d %d\n", cbp, s->mb_x, s->mb_y);
3673             return -1;
3674         }
3675         
3676         if(IS_INTRA4x4(mb_type))
3677             cbp= golomb_to_intra4x4_cbp[cbp];
3678         else
3679             cbp= golomb_to_inter_cbp[cbp];
3680     }
3681
3682     if(cbp || IS_INTRA16x16(mb_type)){
3683         int i8x8, i4x4, chroma_idx;
3684         int chroma_qp, dquant;
3685         GetBitContext *gb= IS_INTRA(mb_type) ? h->intra_gb_ptr : h->inter_gb_ptr;
3686         const uint8_t *scan, *dc_scan;
3687         
3688 //        fill_non_zero_count_cache(h);
3689
3690         if(IS_INTERLACED(mb_type)){
3691             scan= field_scan;
3692             dc_scan= luma_dc_field_scan;
3693         }else{
3694             scan= zigzag_scan;
3695             dc_scan= luma_dc_zigzag_scan;
3696         }
3697
3698         dquant= get_se_golomb(&s->gb);
3699
3700         if( dquant > 25 || dquant < -26 ){
3701             av_log(h->s.avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, s->mb_x, s->mb_y);
3702             return -1;
3703         }
3704         
3705         s->qscale += dquant;
3706         if(((unsigned)s->qscale) > 51){
3707             if(s->qscale<0) s->qscale+= 52;
3708             else            s->qscale-= 52;
3709         }
3710         
3711         h->chroma_qp= chroma_qp= get_chroma_qp(h, s->qscale);
3712         if(IS_INTRA16x16(mb_type)){
3713             if( decode_residual(h, h->intra_gb_ptr, h->mb, LUMA_DC_BLOCK_INDEX, dc_scan, s->qscale, 16) < 0){
3714                 return -1; //FIXME continue if partotioned and other retirn -1 too
3715             }
3716
3717             assert((cbp&15) == 0 || (cbp&15) == 15);
3718
3719             if(cbp&15){
3720                 for(i8x8=0; i8x8<4; i8x8++){
3721                     for(i4x4=0; i4x4<4; i4x4++){
3722                         const int index= i4x4 + 4*i8x8;
3723                         if( decode_residual(h, h->intra_gb_ptr, h->mb + 16*index, index, scan + 1, s->qscale, 15) < 0 ){
3724                             return -1;
3725                         }
3726                     }
3727                 }
3728             }else{
3729                 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
3730             }
3731         }else{
3732             for(i8x8=0; i8x8<4; i8x8++){
3733                 if(cbp & (1<<i8x8)){
3734                     for(i4x4=0; i4x4<4; i4x4++){
3735                         const int index= i4x4 + 4*i8x8;
3736                         
3737                         if( decode_residual(h, gb, h->mb + 16*index, index, scan, s->qscale, 16) <0 ){
3738                             return -1;
3739                         }
3740                     }
3741                 }else{
3742                     uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
3743                     nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
3744                 }
3745             }
3746         }
3747         
3748         if(cbp&0x30){
3749             for(chroma_idx=0; chroma_idx<2; chroma_idx++)
3750                 if( decode_residual(h, gb, h->mb + 256 + 16*4*chroma_idx, CHROMA_DC_BLOCK_INDEX, chroma_dc_scan, chroma_qp, 4) < 0){
3751                     return -1;
3752                 }
3753         }
3754
3755         if(cbp&0x20){
3756             for(chroma_idx=0; chroma_idx<2; chroma_idx++){
3757                 for(i4x4=0; i4x4<4; i4x4++){
3758                     const int index= 16 + 4*chroma_idx + i4x4;
3759                     if( decode_residual(h, gb, h->mb + 16*index, index, scan + 1, chroma_qp, 15) < 0){
3760                         return -1;
3761                     }
3762                 }
3763             }
3764         }else{
3765             uint8_t * const nnz= &h->non_zero_count_cache[0];
3766             nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
3767             nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
3768         }
3769     }else{
3770         uint8_t * const nnz= &h->non_zero_count_cache[0];
3771         fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1);
3772         nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
3773         nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
3774     }
3775     s->current_picture.qscale_table[mb_xy]= s->qscale;
3776     write_back_non_zero_count(h);
3777
3778     return 0;
3779 }
3780
3781 static int decode_cabac_mb_type( H264Context *h ) {
3782     MpegEncContext * const s = &h->s;
3783
3784     if( h->slice_type == I_TYPE ) {
3785         const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
3786         int ctx = 0;
3787         int mb_type;
3788
3789         if( s->mb_x > 0 && !IS_INTRA4x4( s->current_picture.mb_type[mb_xy-1] ) )
3790             ctx++;
3791         if( s->mb_y > 0 && !IS_INTRA4x4( s->current_picture.mb_type[mb_xy-s->mb_stride] ) )
3792             ctx++;
3793
3794         if( get_cabac( &h->cabac, &h->cabac_state[3+ctx] ) == 0 )
3795             return 0;   /* I4x4 */
3796
3797         if( get_cabac_terminate( &h->cabac ) )
3798             return 25;  /* PCM */
3799
3800         mb_type = 1;    /* I16x16 */
3801         if( get_cabac( &h->cabac, &h->cabac_state[3+3] ) )
3802             mb_type += 12;  /* cbp_luma != 0 */
3803
3804         if( get_cabac( &h->cabac, &h->cabac_state[3+4] ) ) {
3805             if( get_cabac( &h->cabac, &h->cabac_state[3+5] ) )
3806                 mb_type += 4 * 2;   /* cbp_chroma == 2 */
3807             else
3808                 mb_type += 4 * 1;   /* cbp_chroma == 1 */
3809         }
3810         if( get_cabac( &h->cabac, &h->cabac_state[3+6] ) )
3811             mb_type += 2;
3812         if( get_cabac( &h->cabac, &h->cabac_state[3+7] ) )
3813             mb_type += 1;
3814         return mb_type;
3815
3816     } else if( h->slice_type == P_TYPE ) {
3817         if( get_cabac( &h->cabac, &h->cabac_state[14] ) == 0 ) {
3818             /* P-type */
3819             if( get_cabac( &h->cabac, &h->cabac_state[15] ) == 0 ) {
3820                 if( get_cabac( &h->cabac, &h->cabac_state[16] ) == 0 )
3821                     return 0; /* P_L0_D16x16; */
3822                 else
3823                     return 3; /* P_8x8; */
3824             } else {
3825                 if( get_cabac( &h->cabac, &h->cabac_state[17] ) == 0 )
3826                     return 2; /* P_L0_D8x16; */
3827                 else
3828                     return 1; /* P_L0_D16x8; */
3829             }
3830         } else {
3831             int mb_type;
3832             /* I-type */
3833             if( get_cabac( &h->cabac, &h->cabac_state[17] ) == 0 )
3834                 return 5+0; /* I_4x4 */
3835             if( get_cabac_terminate( &h->cabac ) )
3836                 return 5+25; /*I_PCM */
3837             mb_type = 5+1;    /* I16x16 */
3838             if( get_cabac( &h->cabac, &h->cabac_state[17+1] ) )
3839                 mb_type += 12;  /* cbp_luma != 0 */
3840
3841             if( get_cabac( &h->cabac, &h->cabac_state[17+2] ) ) {
3842                 if( get_cabac( &h->cabac, &h->cabac_state[17+2] ) )
3843                     mb_type += 4 * 2;   /* cbp_chroma == 2 */
3844                 else
3845                     mb_type += 4 * 1;   /* cbp_chroma == 1 */
3846             }
3847             if( get_cabac( &h->cabac, &h->cabac_state[17+3] ) )
3848                 mb_type += 2;
3849             if( get_cabac( &h->cabac, &h->cabac_state[17+3] ) )
3850                 mb_type += 1;
3851
3852             return mb_type;
3853         }
3854     } else {
3855         /* TODO do others frames types */
3856         return -1;
3857     }
3858 }
3859
3860 static int decode_cabac_mb_skip( H264Context *h) {
3861     MpegEncContext * const s = &h->s;
3862     const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
3863     const int mba_xy = mb_xy - 1;
3864     const int mbb_xy = mb_xy - s->mb_stride;
3865     int ctx = 0;
3866
3867     if( s->mb_x > 0 && !IS_SKIP( s->current_picture.mb_type[mba_xy] ) )
3868         ctx++;
3869     if( s->mb_y > 0 && !IS_SKIP( s->current_picture.mb_type[mbb_xy] ) )
3870         ctx++;
3871
3872     if( h->slice_type == P_TYPE || h->slice_type == SP_TYPE)
3873         return get_cabac( &h->cabac, &h->cabac_state[11+ctx] );
3874     else /* B-frame */
3875         return get_cabac( &h->cabac, &h->cabac_state[24+ctx] );
3876 }
3877
3878 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
3879     int mode = 0;
3880
3881     if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
3882         return pred_mode;
3883
3884     if( get_cabac( &h->cabac, &h->cabac_state[69] ) )
3885         mode += 1;
3886     if( get_cabac( &h->cabac, &h->cabac_state[69] ) )
3887         mode += 2;
3888     if( get_cabac( &h->cabac, &h->cabac_state[69] ) )
3889         mode += 4;
3890     if( mode >= pred_mode )
3891         return mode + 1;
3892     else
3893         return mode;
3894 }
3895
3896 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
3897     MpegEncContext * const s = &h->s;
3898     const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
3899     const int mba_xy = mb_xy - 1;
3900     const int mbb_xy = mb_xy - s->mb_stride;
3901
3902     int ctx = 0;
3903
3904     /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
3905     if( s->mb_x > 0 && h->chroma_pred_mode_table[mba_xy] != 0 )
3906         ctx++;
3907
3908     if( s->mb_y > 0 && h->chroma_pred_mode_table[mbb_xy] != 0 )
3909         ctx++;
3910
3911     if( get_cabac( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
3912         return 0;
3913
3914     if( get_cabac( &h->cabac, &h->cabac_state[64+3] ) == 0 )
3915         return 1;
3916     if( get_cabac( &h->cabac, &h->cabac_state[64+3] ) == 0 )
3917         return 2;
3918     else
3919         return 3;
3920 }
3921
3922 static const uint8_t block_idx_x[16] = {
3923     0, 1, 0, 1, 2, 3, 2, 3, 0, 1, 0, 1, 2, 3, 2, 3
3924 };
3925 static const uint8_t block_idx_y[16] = {
3926     0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3
3927 };
3928 static const uint8_t block_idx_xy[4][4] = {
3929     { 0, 2, 8,  10},
3930     { 1, 3, 9,  11},
3931     { 4, 6, 12, 14},
3932     { 5, 7, 13, 15}
3933 };
3934
3935 static int decode_cabac_mb_cbp_luma( H264Context *h) {
3936     MpegEncContext * const s = &h->s;
3937     const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
3938
3939     int cbp = 0;
3940     int i8x8;
3941
3942     h->cbp_table[mb_xy] = 0;  /* FIXME aaahahahah beurk */
3943
3944     for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
3945         int mba_xy = -1;
3946         int mbb_xy = -1;
3947         int x, y;
3948         int ctx = 0;
3949
3950         x = block_idx_x[4*i8x8];
3951         y = block_idx_y[4*i8x8];
3952
3953         if( x > 0 )
3954             mba_xy = mb_xy;
3955         else if( s->mb_x > 0 )
3956             mba_xy = mb_xy - 1;
3957
3958         if( y > 0 )
3959             mbb_xy = mb_xy;
3960         else if( s->mb_y > 0 )
3961             mbb_xy = mb_xy - s->mb_stride;
3962
3963         /* No need to test for skip as we put 0 for skip block */
3964         if( mba_xy >= 0 ) {
3965             int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
3966             if( ((h->cbp_table[mba_xy] >> i8x8a)&0x01) == 0 )
3967                 ctx++;
3968         }
3969
3970         if( mbb_xy >= 0 ) {
3971             int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
3972             if( ((h->cbp_table[mbb_xy] >> i8x8b)&0x01) == 0 )
3973                 ctx += 2;
3974         }
3975
3976         if( get_cabac( &h->cabac, &h->cabac_state[73 + ctx] ) ) {
3977             cbp |= 1 << i8x8;
3978             h->cbp_table[mb_xy] = cbp;  /* FIXME aaahahahah beurk */
3979         }
3980     }
3981     return cbp;
3982 }
3983 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
3984     MpegEncContext * const s = &h->s;
3985     const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
3986     int ctx;
3987     int cbp_a, cbp_b;
3988
3989     /* No need to test for skip */
3990     if( s->mb_x > 0 )
3991         cbp_a = (h->cbp_table[mb_xy-1]>>4)&0x03;
3992     else
3993         cbp_a = -1;
3994
3995     if( s->mb_y > 0 )
3996         cbp_b = (h->cbp_table[mb_xy-s->mb_stride]>>4)&0x03;
3997     else
3998         cbp_b = -1;
3999
4000     ctx = 0;
4001     if( cbp_a > 0 ) ctx++;
4002     if( cbp_b > 0 ) ctx += 2;
4003     if( get_cabac( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
4004         return 0;
4005
4006     ctx = 4;
4007     if( cbp_a == 2 ) ctx++;
4008     if( cbp_b == 2 ) ctx += 2;
4009     if( get_cabac( &h->cabac, &h->cabac_state[77 + ctx] ) )
4010         return 2;
4011     else
4012         return 1;
4013 }
4014 static int decode_cabac_mb_dqp( H264Context *h) {
4015     MpegEncContext * const s = &h->s;
4016     int mbn_xy;
4017     int   ctx = 0;
4018     int   val = 0;
4019
4020     if( s->mb_x > 0 )
4021         mbn_xy = s->mb_x + s->mb_y*s->mb_stride - 1;
4022     else
4023         mbn_xy = s->mb_width - 1 + (s->mb_y-1)*s->mb_stride;
4024
4025     if( mbn_xy >= 0 && h->last_qscale_diff != 0 && ( IS_INTRA16x16(s->current_picture.mb_type[mbn_xy] ) || (h->cbp_table[mbn_xy]&0x3f) ) )
4026         ctx++;
4027
4028     while( get_cabac( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
4029         if( ctx < 2 )
4030             ctx = 2;
4031         else
4032             ctx = 3;
4033         val++;
4034     }
4035
4036     if( val&0x01 )
4037         return (val + 1)/2;
4038     else
4039         return -(val + 1)/2;
4040 }
4041 static int decode_cabac_mb_sub_type( H264Context *h ) {
4042     if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
4043         return 0;   /* 8x8 */
4044     if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
4045         return 1;   /* 8x4 */
4046     if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
4047         return 2;   /* 4x8 */
4048     return 3;       /* 4x4 */
4049 }
4050
4051 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
4052     int refa = h->ref_cache[list][scan8[n] - 1];
4053     int refb = h->ref_cache[list][scan8[n] - 8];
4054     int ref  = 0;
4055     int ctx  = 0;
4056
4057     if( refa > 0 )
4058         ctx++;
4059     if( refb > 0 )
4060         ctx += 2;
4061
4062     while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
4063         ref++;
4064         if( ctx < 4 )
4065             ctx = 4;
4066         else
4067             ctx = 5;
4068     }
4069     return ref;
4070 }
4071
4072 static int decode_cabac_mb_mvd( H264Context *h, int list, int n, int l ) {
4073     int amvd = abs( h->mvd_cache[list][scan8[n] - 1][l] ) +
4074                abs( h->mvd_cache[list][scan8[n] - 8][l] );
4075     int ctxbase = (l == 0) ? 40 : 47;
4076     int ctx;
4077     int mvd = 0;
4078
4079     if( amvd < 3 )
4080         ctx = 0;
4081     else if( amvd > 32 )
4082         ctx = 2;
4083     else
4084         ctx = 1;
4085
4086     while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase+ctx] ) ) {
4087         mvd++;
4088         if( ctx < 3 )
4089             ctx = 3;
4090         else if( ctx < 6 )
4091             ctx++;
4092     }
4093
4094     if( mvd >= 9 ) {
4095         int k = 3;
4096         while( get_cabac_bypass( &h->cabac ) ) {
4097             mvd += 1 << k;
4098             k++;
4099         }
4100         while( k-- ) {
4101             if( get_cabac_bypass( &h->cabac ) )
4102                 mvd += 1 << k;
4103         }
4104     }
4105     if( mvd != 0 && get_cabac_bypass( &h->cabac ) )
4106         return -mvd;
4107     return mvd;
4108 }
4109
4110
4111 static int get_cabac_cbf_ctx( H264Context *h, int cat, int idx ) {
4112     MpegEncContext * const s = &h->s;
4113     const int mb_xy  = s->mb_x + s->mb_y*s->mb_stride;
4114     int mba_xy = -1;
4115     int mbb_xy = -1;
4116
4117     int nza = -1;
4118     int nzb = -1;
4119     int ctx = 0;
4120
4121     if( cat == 0 ) {
4122         if( s->mb_x > 0 ) {
4123             mba_xy = mb_xy - 1;
4124             if( IS_INTRA16x16(s->current_picture.mb_type[mba_xy] ) )
4125                     nza = h->cbp_table[mba_xy]&0x100;
4126         }
4127         if( s->mb_y > 0 ) {
4128             mbb_xy = mb_xy - s->mb_stride;
4129             if( IS_INTRA16x16(s->current_picture.mb_type[mbb_xy] ) )
4130                     nzb = h->cbp_table[mbb_xy]&0x100;
4131         }
4132     } else if( cat == 1 || cat == 2 ) {
4133         int i8x8a, i8x8b;
4134         int x, y;
4135
4136         x = block_idx_x[idx];
4137         y = block_idx_y[idx];
4138
4139         if( x > 0 )
4140             mba_xy = mb_xy;
4141         else if( s->mb_x > 0 )
4142             mba_xy = mb_xy - 1;
4143
4144         if( y > 0 )
4145             mbb_xy = mb_xy;
4146         else if( s->mb_y > 0 )
4147             mbb_xy = mb_xy - s->mb_stride;
4148
4149         /* No need to test for skip */
4150         if( mba_xy >= 0 ) {
4151             i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
4152
4153             if( !IS_INTRA_PCM(s->current_picture.mb_type[mba_xy] ) &&
4154                 ((h->cbp_table[mba_xy]&0x0f)>>i8x8a))
4155                 nza = h->non_zero_count_cache[scan8[idx] - 1];
4156         }
4157
4158         if( mbb_xy >= 0 ) {
4159             i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
4160
4161             if( !IS_INTRA_PCM(s->current_picture.mb_type[mbb_xy] ) &&
4162                 ((h->cbp_table[mbb_xy]&0x0f)>>i8x8b))
4163                 nzb = h->non_zero_count_cache[scan8[idx] - 8];
4164         }
4165     } else if( cat == 3 ) {
4166         if( s->mb_x > 0 ) {
4167             mba_xy = mb_xy - 1;
4168
4169             if( !IS_INTRA_PCM(s->current_picture.mb_type[mba_xy] ) &&
4170                 (h->cbp_table[mba_xy]&0x30) )
4171                 nza = (h->cbp_table[mba_xy]>>(6+idx))&0x01;
4172         }
4173         if( s->mb_y > 0 ) {
4174             mbb_xy = mb_xy - s->mb_stride;
4175
4176             if( !IS_INTRA_PCM(s->current_picture.mb_type[mbb_xy] ) &&
4177                 (h->cbp_table[mbb_xy]&0x30) )
4178                 nzb = (h->cbp_table[mbb_xy]>>(6+idx))&0x01;
4179         }
4180     } else if( cat == 4 ) {
4181         int idxc = idx % 4 ;
4182         if( idxc == 1 || idxc == 3 )
4183             mba_xy = mb_xy;
4184         else if( s->mb_x > 0 )
4185             mba_xy = mb_xy -1;
4186
4187         if( idxc == 2 || idxc == 3 )
4188             mbb_xy = mb_xy;
4189         else if( s->mb_y > 0 )
4190             mbb_xy = mb_xy - s->mb_stride;
4191
4192         if( mba_xy >= 0 &&
4193             !IS_INTRA_PCM(s->current_picture.mb_type[mba_xy] ) &&
4194             (h->cbp_table[mba_xy]&0x30) == 0x20 )
4195             nza = h->non_zero_count_cache[scan8[16+idx] - 1];
4196
4197         if( mbb_xy >= 0 &&
4198             !IS_INTRA_PCM(s->current_picture.mb_type[mbb_xy] ) &&
4199             (h->cbp_table[mbb_xy]&0x30) == 0x20 )
4200             nzb = h->non_zero_count_cache[scan8[16+idx] - 8];
4201     }
4202
4203     if( ( mba_xy < 0 && IS_INTRA( s->current_picture.mb_type[mb_xy] ) ) ||
4204         ( mba_xy >= 0 && IS_INTRA_PCM(s->current_picture.mb_type[mba_xy] ) ) ||
4205           nza > 0 )
4206         ctx++;
4207
4208     if( ( mbb_xy < 0 && IS_INTRA( s->current_picture.mb_type[mb_xy] ) ) ||
4209         ( mbb_xy >= 0 && IS_INTRA_PCM(s->current_picture.mb_type[mbb_xy] ) ) ||
4210           nzb > 0 )
4211         ctx += 2;
4212
4213     return ctx + 4 * cat;
4214 }
4215
4216 static int decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, int qp, int max_coeff) {
4217     const int mb_xy  = h->s.mb_x + h->s.mb_y*h->s.mb_stride;
4218     const uint16_t *qmul= dequant_coeff[qp];
4219     static const int significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
4220     static const int last_significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
4221     static const int coeff_abs_level_m1_offset[5] = { 0, 10, 20, 30, 39 };
4222
4223     int coeff[16];
4224
4225     int last = 0;
4226     int coeff_count = 0;
4227     int nz[16] = {0};
4228     int i;
4229
4230     int abslevel1 = 0;
4231     int abslevelgt1 = 0;
4232
4233     /* cat: 0-> DC 16x16  n = 0
4234      *      1-> AC 16x16  n = luma4x4idx
4235      *      2-> Luma4x4   n = luma4x4idx
4236      *      3-> DC Chroma n = iCbCr
4237      *      4-> AC Chroma n = 4 * iCbCr + chroma4x4idx
4238      */
4239
4240     /* read coded block flag */
4241     if( get_cabac( &h->cabac, &h->cabac_state[85 + get_cabac_cbf_ctx( h, cat, n ) ] ) == 0 ) {
4242         if( cat == 1 || cat == 2 )
4243             h->non_zero_count_cache[scan8[n]] = 0;
4244         else if( cat == 4 )
4245             h->non_zero_count_cache[scan8[16+n]] = 0;
4246
4247         return 0;
4248     }
4249
4250     while( last < max_coeff - 1 ) {
4251         int ctx = FFMIN( last, max_coeff - 2 );
4252
4253         if( get_cabac( &h->cabac, &h->cabac_state[105+significant_coeff_flag_offset[cat]+ctx] ) == 0 ) {
4254             nz[last++] = 0;
4255         }
4256         else {
4257             nz[last++] = 1;
4258             coeff_count++;
4259             if( get_cabac( &h->cabac, &h->cabac_state[166+last_significant_coeff_flag_offset[cat]+ctx] ) ) {
4260                 while( last < max_coeff ) {
4261                     nz[last++] = 0;
4262                 }
4263                 break;
4264             }
4265         }
4266     }
4267     if( last == max_coeff -1 ) {
4268         nz[last++] = 1;
4269         coeff_count++;
4270     }
4271
4272     if( cat == 0 && coeff_count > 0 )
4273         h->cbp_table[mb_xy] |= 0x100;
4274     else if( cat == 1 || cat == 2 )
4275         h->non_zero_count_cache[scan8[n]] = coeff_count;
4276     else if( cat == 3 && coeff_count > 0 )
4277         h->cbp_table[mb_xy] |= 0x40 << n;
4278     else if( cat == 4 )
4279         h->non_zero_count_cache[scan8[16+n]] = coeff_count;
4280
4281     for( i = coeff_count - 1; i >= 0; i-- ) {
4282         int coeff_abs_m1;
4283
4284         int ctx = (abslevelgt1 != 0 ? 0 : FFMIN( 4, abslevel1 + 1 )) + coeff_abs_level_m1_offset[cat];
4285
4286         if( get_cabac( &h->cabac, &h->cabac_state[227+ctx] ) == 0 ) {
4287             coeff_abs_m1 = 0;
4288         } else {
4289             coeff_abs_m1 = 1;
4290             ctx = 5 + FFMIN( 4, abslevelgt1 ) + coeff_abs_level_m1_offset[cat];
4291             while( coeff_abs_m1 < 14 && get_cabac( &h->cabac, &h->cabac_state[227+ctx] ) ) {
4292                 coeff_abs_m1++;
4293             }
4294         }
4295
4296         if( coeff_abs_m1 >= 14 ) {
4297             int j = 0;
4298             while( get_cabac_bypass( &h->cabac ) ) {
4299                 coeff_abs_m1 += 1 << j;
4300                 j++;
4301             }
4302
4303             while( j-- ) {
4304                 if( get_cabac_bypass( &h->cabac ) )
4305                     coeff_abs_m1 += 1 << j ;
4306             }
4307         }
4308         if( get_cabac_bypass( &h->cabac ) )
4309             coeff[i] = -1 *( coeff_abs_m1 + 1 );
4310         else
4311             coeff[i] = coeff_abs_m1 + 1;
4312
4313         if( coeff_abs_m1 == 0 )
4314             abslevel1++;
4315         else
4316             abslevelgt1++;
4317     }
4318
4319     if( cat == 0 || cat == 3 ) { /* DC */
4320         int j;
4321         for( i = 0, j = 0; j < coeff_count; i++ ) {
4322             if( nz[i] ) {
4323                 block[scantable[i]] = coeff[j];
4324
4325                 j++;
4326             }
4327         }
4328
4329     } else { /* AC */
4330         int j;
4331         for( i = 0, j = 0; j < coeff_count; i++ ) {
4332             if( nz[i] ) {
4333                 block[scantable[i]] = coeff[j] * qmul[scantable[i]];
4334
4335                 j++;
4336             }
4337         }
4338     }
4339     return 0;
4340 }
4341
4342 /**
4343  * decodes a macroblock
4344  * @returns 0 if ok, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
4345  */
4346 static int decode_mb_cabac(H264Context *h) {
4347     MpegEncContext * const s = &h->s;
4348     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
4349     int mb_type, partition_count, cbp = 0;
4350
4351     s->dsp.clear_blocks(h->mb); //FIXME avoid if allready clear (move after skip handlong?)
4352
4353     if( h->slice_type == B_TYPE ) {
4354         av_log( h->s.avctx, AV_LOG_ERROR, "B-frame not supported with CABAC\n" );
4355         return -1;
4356     }
4357     if( h->sps.mb_aff ) {
4358         av_log( h->s.avctx, AV_LOG_ERROR, "Fields not supported with CABAC\n" );
4359         return -1;
4360     }
4361
4362     if( h->slice_type != I_TYPE && h->slice_type != SI_TYPE ) {
4363         /* read skip flags */
4364         if( decode_cabac_mb_skip( h ) ) {
4365             int mx, my;
4366
4367             /* skip mb */
4368             mb_type= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0|MB_TYPE_SKIP;
4369
4370             memset(h->non_zero_count[mb_xy], 0, 16);
4371             memset(h->non_zero_count_cache + 8, 0, 8*5); //FIXME ugly, remove pfui
4372 #if 0
4373             if(h->sps.mb_aff && s->mb_skip_run==0 && (s->mb_y&1)==0){
4374                 h->mb_field_decoding_flag= get_bits1(&s->gb);
4375             }
4376             if(h->mb_field_decoding_flag)
4377                 mb_type|= MB_TYPE_INTERLACED;
4378 #endif
4379
4380             fill_caches(h, mb_type); //FIXME check what is needed and what not ...
4381             pred_pskip_motion(h, &mx, &my);
4382             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1);
4383             fill_rectangle(  h->mvd_cache[0][scan8[0]], 4, 4, 8, pack16to32(0,0), 4);
4384             fill_rectangle(  h->mv_cache[0][scan8[0]], 4, 4, 8, pack16to32(mx,my), 4);
4385             write_back_motion(h, mb_type);
4386
4387             s->current_picture.mb_type[mb_xy]= mb_type; //FIXME SKIP type
4388             s->current_picture.qscale_table[mb_xy]= s->qscale;
4389             h->slice_table[ mb_xy ]= h->slice_num;
4390             h->cbp_table[mb_xy] = 0;
4391             h->chroma_pred_mode_table[mb_xy] = 0;
4392             h->last_qscale_diff = 0;
4393
4394             h->prev_mb_skiped= 1;
4395
4396             return 0;
4397
4398         }
4399     }
4400     h->prev_mb_skiped = 0;
4401
4402     if( ( mb_type = decode_cabac_mb_type( h ) ) < 0 ) {
4403         av_log( h->s.avctx, AV_LOG_ERROR, "decode_cabac_mb_type failed\n" );
4404         return -1;
4405     }
4406
4407     if( h->slice_type == P_TYPE ) {
4408         if( mb_type < 5) {
4409             partition_count= p_mb_type_info[mb_type].partition_count;
4410             mb_type=         p_mb_type_info[mb_type].type;
4411         } else {
4412             mb_type -= 5;
4413             goto decode_intra_mb;
4414         }
4415     } else {
4416        assert(h->slice_type == I_TYPE);
4417 decode_intra_mb:
4418         partition_count = 0;
4419         cbp= i_mb_type_info[mb_type].cbp;
4420         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
4421         mb_type= i_mb_type_info[mb_type].type;
4422     }
4423 #if 0
4424     if(h->mb_field_decoding_flag)
4425         mb_type |= MB_TYPE_INTERLACED;
4426 #endif
4427
4428     s->current_picture.mb_type[mb_xy]= mb_type;
4429     h->slice_table[ mb_xy ]= h->slice_num;
4430
4431     if(IS_INTRA_PCM(mb_type)) {
4432         /* TODO */
4433         h->cbp_table[mb_xy] = 0xf +4*2;
4434         h->chroma_pred_mode_table[mb_xy] = 0;
4435         s->current_picture.qscale_table[mb_xy]= s->qscale;
4436         return -1;
4437     }
4438
4439     fill_caches(h, mb_type);
4440
4441     if( IS_INTRA( mb_type ) ) {
4442         if( IS_INTRA4x4( mb_type ) ) {
4443             int i;
4444             for( i = 0; i < 16; i++ ) {
4445                 int pred = pred_intra_mode( h, i );
4446                 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
4447
4448                 //av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%d\n", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] );
4449             }
4450             write_back_intra_pred_mode(h);
4451             if( check_intra4x4_pred_mode(h) < 0 ) return -1;
4452         } else {
4453             h->intra16x16_pred_mode= check_intra_pred_mode( h, h->intra16x16_pred_mode );
4454             if( h->intra16x16_pred_mode < 0 ) return -1;
4455         }
4456         h->chroma_pred_mode_table[mb_xy] =
4457             h->chroma_pred_mode          = decode_cabac_mb_chroma_pre_mode( h );
4458
4459         h->chroma_pred_mode= check_intra_pred_mode( h, h->chroma_pred_mode );
4460         if( h->chroma_pred_mode < 0 ) return -1;
4461     } else if( partition_count == 4 ) {
4462         int i, j, sub_partition_count[4], list, ref[2][4];
4463
4464         /* Only P-frame */
4465         for( i = 0; i < 4; i++ ) {
4466             h->sub_mb_type[i] = decode_cabac_mb_sub_type( h );
4467             sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
4468             h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
4469         }
4470
4471         for( list = 0; list < 2; list++ ) {
4472             if( h->ref_count[list] > 0 ) {
4473                 for( i = 0; i < 4; i++ ) {
4474                     if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
4475                         if( h->ref_count[list] > 1 )
4476                             ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
4477                         else
4478                             ref[list][i] = 0;
4479                     } else {
4480                         ref[list][i] = -1;
4481                     }
4482                     h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ]=
4483                     h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
4484                 }
4485             }
4486         }
4487
4488         for(list=0; list<2; list++){
4489
4490             for(i=0; i<4; i++){
4491                 //h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ]=
4492                 //h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
4493
4494                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
4495                     const int sub_mb_type= h->sub_mb_type[i];
4496                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
4497                     for(j=0; j<sub_partition_count[i]; j++){
4498                         int mpx, mpy;
4499                         int mx, my;
4500                         const int index= 4*i + block_width*j;
4501                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
4502                         int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
4503                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mpx, &mpy);
4504
4505                         mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 );
4506                         my = mpy + decode_cabac_mb_mvd( h, list, index, 1 );
4507                         tprintf("final mv:%d %d\n", mx, my);
4508
4509                         if(IS_SUB_8X8(sub_mb_type)){
4510                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]=
4511                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
4512                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]=
4513                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
4514
4515                             mvd_cache[ 0 ][0]= mvd_cache[ 1 ][0]=
4516                             mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx;
4517                             mvd_cache[ 0 ][1]= mvd_cache[ 1 ][1]=
4518                             mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy;
4519                         }else if(IS_SUB_8X4(sub_mb_type)){
4520                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]= mx;
4521                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]= my;
4522
4523                             mvd_cache[ 0 ][0]= mvd_cache[ 1 ][0]= mx- mpx;
4524                             mvd_cache[ 0 ][1]= mvd_cache[ 1 ][1]= my - mpy;
4525                         }else if(IS_SUB_4X8(sub_mb_type)){
4526                             mv_cache[ 0 ][0]= mv_cache[ 8 ][0]= mx;
4527                             mv_cache[ 0 ][1]= mv_cache[ 8 ][1]= my;
4528
4529                             mvd_cache[ 0 ][0]= mvd_cache[ 8 ][0]= mx - mpx;
4530                             mvd_cache[ 0 ][1]= mvd_cache[ 8 ][1]= my - mpy;
4531                         }else{
4532                             assert(IS_SUB_4X4(sub_mb_type));
4533                             mv_cache[ 0 ][0]= mx;
4534                             mv_cache[ 0 ][1]= my;
4535
4536                             mvd_cache[ 0 ][0]= mx - mpx;
4537                             mvd_cache[ 0 ][1]= my - mpy;
4538                         }
4539                     }
4540                 }else{
4541                     uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
4542                     uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][0];
4543                     p[0] = p[1] = p[8] = p[9] = 0;
4544                     pd[0]= pd[1]= pd[8]= pd[9]= 0;
4545                 }
4546             }
4547         }
4548     } else if( !IS_DIRECT(mb_type) ) {
4549         int list, mx, my, i, mpx, mpy;
4550         if(IS_16X16(mb_type)){
4551             for(list=0; list<2; list++){
4552                 if(IS_DIR(mb_type, 0, list)){
4553                     if(h->ref_count[list] > 0 ){
4554                         const int ref = h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 0 ) : 0;
4555                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
4556                     }
4557                 }
4558             }
4559             for(list=0; list<2; list++){
4560                 if(IS_DIR(mb_type, 0, list)){
4561                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy);
4562
4563                     mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 );
4564                     my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 );
4565                     tprintf("final mv:%d %d\n", mx, my);
4566
4567                     fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
4568                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
4569                 }
4570             }
4571         }
4572         else if(IS_16X8(mb_type)){
4573             for(list=0; list<2; list++){
4574                 if(h->ref_count[list]>0){
4575                     for(i=0; i<2; i++){
4576                         if(IS_DIR(mb_type, i, list)){
4577                             const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 8*i ) : 0;
4578                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
4579                         }
4580                     }
4581                 }
4582             }
4583             for(list=0; list<2; list++){
4584                 for(i=0; i<2; i++){
4585                     if(IS_DIR(mb_type, i, list)){
4586                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mpx, &mpy);
4587                         mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 );
4588                         my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 );
4589                         tprintf("final mv:%d %d\n", mx, my);
4590
4591                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4);
4592                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
4593                     }
4594                 }
4595             }
4596         }else{
4597             assert(IS_8X16(mb_type));
4598             for(list=0; list<2; list++){
4599                 if(h->ref_count[list]>0){
4600                     for(i=0; i<2; i++){
4601                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
4602                             const int ref= h->ref_count[list] > 1 ? decode_cabac_mb_ref( h, list, 4*i ) : 0;
4603                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
4604                         }
4605                     }
4606                 }
4607             }
4608             for(list=0; list<2; list++){
4609                 for(i=0; i<2; i++){
4610                     if(IS_DIR(mb_type, i, list)){
4611                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mpx, &mpy);
4612                         mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 );
4613                         my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 );
4614
4615                         tprintf("final mv:%d %d\n", mx, my);
4616                         fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
4617                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
4618                     }
4619                 }
4620             }
4621         }
4622     }
4623
4624    if( IS_INTER( mb_type ) ) {
4625         h->chroma_pred_mode_table[mb_xy] = 0;
4626         write_back_motion( h, mb_type );
4627    }
4628
4629     if( !IS_INTRA16x16( mb_type ) ) {
4630         cbp  = decode_cabac_mb_cbp_luma( h );
4631         cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
4632     }
4633
4634     h->cbp_table[mb_xy] = cbp;
4635
4636     if( cbp || IS_INTRA16x16( mb_type ) ) {
4637         const uint8_t *scan, *dc_scan;
4638         int dqp;
4639
4640         if(IS_INTERLACED(mb_type)){
4641             scan= field_scan;
4642             dc_scan= luma_dc_field_scan;
4643         }else{
4644             scan= zigzag_scan;
4645             dc_scan= luma_dc_zigzag_scan;
4646         }
4647
4648         h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h );
4649         s->qscale += dqp;
4650         if(((unsigned)s->qscale) > 51){
4651             if(s->qscale<0) s->qscale+= 52;
4652             else            s->qscale-= 52;
4653         }
4654         h->chroma_qp = get_chroma_qp(h, s->qscale);
4655
4656         if( IS_INTRA16x16( mb_type ) ) {
4657             int i;
4658             //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
4659             if( decode_cabac_residual( h, h->mb, 0, 0, dc_scan, s->qscale, 16) < 0)
4660                 return -1;
4661             if( cbp&15 ) {
4662                 for( i = 0; i < 16; i++ ) {
4663                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", i );
4664                     if( decode_cabac_residual(h, h->mb + 16*i, 1, i, scan + 1, s->qscale, 15) < 0 )
4665                         return -1;
4666                 }
4667             } else {
4668                 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
4669             }
4670         } else {
4671             int i8x8, i4x4;
4672             for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
4673                 if( cbp & (1<<i8x8) ) {
4674                     for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
4675                         const int index = 4*i8x8 + i4x4;
4676                         //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %d\n", index );
4677                         if( decode_cabac_residual(h, h->mb + 16*index, 2, index, scan, s->qscale, 16) < 0 )
4678                             return -1;
4679                     }
4680                 } else {
4681                     uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
4682                     nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
4683                 }
4684             }
4685         }
4686
4687         if( cbp&0x30 ){
4688             int c;
4689             for( c = 0; c < 2; c++ ) {
4690                 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
4691                 if( decode_cabac_residual(h, h->mb + 256 + 16*4*c, 3, c, chroma_dc_scan, h->chroma_qp, 4) < 0)
4692                     return -1;
4693             }
4694         }
4695
4696         if( cbp&0x20 ) {
4697             int c, i;
4698             for( c = 0; c < 2; c++ ) {
4699                 for( i = 0; i < 4; i++ ) {
4700                     const int index = 16 + 4 * c + i;
4701                     //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 );
4702                     if( decode_cabac_residual(h, h->mb + 16*index, 4, index - 16, scan + 1, h->chroma_qp, 15) < 0)
4703                         return -1;
4704                 }
4705             }
4706         } else {
4707             uint8_t * const nnz= &h->non_zero_count_cache[0];
4708             nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
4709             nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
4710         }
4711     } else {
4712         memset( &h->non_zero_count_cache[8], 0, 8*5 );
4713     }
4714
4715     s->current_picture.qscale_table[mb_xy]= s->qscale;
4716     write_back_non_zero_count(h);
4717
4718     return 0;
4719 }
4720
4721
4722 static void filter_mb_edgev( H264Context *h, uint8_t *pix, int stride, int bS[4], int qp ) {
4723     int i, d;
4724     const int index_a = clip( qp + h->slice_alpha_c0_offset, 0, 51 );
4725     const int alpha = alpha_table[index_a];
4726     const int beta  = beta_table[clip( qp + h->slice_beta_offset, 0, 51 )];
4727
4728     for( i = 0; i < 4; i++ ) {
4729         if( bS[i] == 0 ) {
4730             pix += 4 * stride;
4731             continue;
4732         }
4733
4734         if( bS[i] < 4 ) {
4735             const int tc0 = tc0_table[index_a][bS[i] - 1];
4736             /* 4px edge length */
4737             for( d = 0; d < 4; d++ ) {
4738                 const int p0 = pix[-1];
4739                 const int p1 = pix[-2];
4740                 const int p2 = pix[-3];
4741                 const int q0 = pix[0];
4742                 const int q1 = pix[1];
4743                 const int q2 = pix[2];
4744
4745                 if( ABS( p0 - q0 ) < alpha &&
4746                     ABS( p1 - p0 ) < beta &&
4747                     ABS( q1 - q0 ) < beta ) {
4748                     int tc = tc0;
4749                     int i_delta;
4750
4751                     if( ABS( p2 - p0 ) < beta ) {
4752                         pix[-2] = p1 + clip( ( p2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( p1 << 1 ) ) >> 1, -tc0, tc0 );
4753                         tc++;
4754                     }
4755                     if( ABS( q2 - q0 ) < beta ) {
4756                         pix[1] = q1 + clip( ( q2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( q1 << 1 ) ) >> 1, -tc0, tc0 );
4757                         tc++;
4758                     }
4759
4760                     i_delta = clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
4761                     pix[-1] = clip_uint8( p0 + i_delta );    /* p0' */
4762                     pix[0]  = clip_uint8( q0 - i_delta );    /* q0' */
4763                 }
4764                 pix += stride;
4765             }
4766         }else{
4767             /* 4px edge length */
4768             for( d = 0; d < 4; d++ ) {
4769                 const int p0 = pix[-1];
4770                 const int p1 = pix[-2];
4771                 const int p2 = pix[-3];
4772
4773                 const int q0 = pix[0];
4774                 const int q1 = pix[1];
4775                 const int q2 = pix[2];
4776
4777                 if( ABS( p0 - q0 ) < alpha &&
4778                     ABS( p1 - p0 ) < beta &&
4779                     ABS( q1 - q0 ) < beta ) {
4780
4781                     if(ABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
4782                         if( ABS( p2 - p0 ) < beta)
4783                         {
4784                             const int p3 = pix[-4];
4785                             /* p0', p1', p2' */
4786                             pix[-1] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
4787                             pix[-2] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
4788                             pix[-3] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
4789                         } else {
4790                             /* p0' */
4791                             pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
4792                         }
4793                         if( ABS( q2 - q0 ) < beta)
4794                         {
4795                             const int q3 = pix[3];
4796                             /* q0', q1', q2' */
4797                             pix[0] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
4798                             pix[1] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
4799                             pix[2] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
4800                         } else {
4801                             /* q0' */
4802                             pix[0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
4803                         }
4804                     }else{
4805                         /* p0', q0' */
4806                         pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
4807                         pix[ 0] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
4808                     }
4809                 }
4810                 pix += stride;
4811             }
4812         }
4813     }
4814 }
4815 static void filter_mb_edgecv( H264Context *h, uint8_t *pix, int stride, int bS[4], int qp ) {
4816     int i, d;
4817     const int index_a = clip( qp + h->slice_alpha_c0_offset, 0, 51 );
4818     const int alpha = alpha_table[index_a];
4819     const int beta  = beta_table[clip( qp + h->slice_beta_offset, 0, 51 )];
4820
4821     for( i = 0; i < 4; i++ ) {
4822         if( bS[i] == 0 ) {
4823             pix += 2 * stride;
4824             continue;
4825         }
4826
4827         if( bS[i] < 4 ) {
4828             const int tc = tc0_table[index_a][bS[i] - 1] + 1;
4829             /* 2px edge length (because we use same bS than the one for luma) */
4830             for( d = 0; d < 2; d++ ){
4831                 const int p0 = pix[-1];
4832                 const int p1 = pix[-2];
4833                 const int q0 = pix[0];
4834                 const int q1 = pix[1];
4835
4836                 if( ABS( p0 - q0 ) < alpha &&
4837                     ABS( p1 - p0 ) < beta &&
4838                     ABS( q1 - q0 ) < beta ) {
4839                     const int i_delta = clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
4840
4841                     pix[-1] = clip_uint8( p0 + i_delta );    /* p0' */
4842                     pix[0]  = clip_uint8( q0 - i_delta );    /* q0' */
4843                 }
4844                 pix += stride;
4845             }
4846         }else{
4847             /* 2px edge length (because we use same bS than the one for luma) */
4848             for( d = 0; d < 2; d++ ){
4849                 const int p0 = pix[-1];
4850                 const int p1 = pix[-2];
4851                 const int q0 = pix[0];
4852                 const int q1 = pix[1];
4853
4854                 if( ABS( p0 - q0 ) < alpha &&
4855                     ABS( p1 - p0 ) < beta &&
4856                     ABS( q1 - q0 ) < beta ) {
4857
4858                     pix[-1] = ( 2*p1 + p0 + q1 + 2 ) >> 2;   /* p0' */
4859                     pix[0]  = ( 2*q1 + q0 + p1 + 2 ) >> 2;   /* q0' */
4860                 }
4861                 pix += stride;
4862             }
4863         }
4864     }
4865 }
4866
4867 static void filter_mb_edgeh( H264Context *h, uint8_t *pix, int stride, int bS[4], int qp ) {
4868     int i, d;
4869     const int index_a = clip( qp + h->slice_alpha_c0_offset, 0, 51 );
4870     const int alpha = alpha_table[index_a];
4871     const int beta  = beta_table[clip( qp + h->slice_beta_offset, 0, 51 )];
4872     const int pix_next  = stride;
4873
4874     for( i = 0; i < 4; i++ ) {
4875         if( bS[i] == 0 ) {
4876             pix += 4;
4877             continue;
4878         }
4879
4880         if( bS[i] < 4 ) {
4881             const int tc0 = tc0_table[index_a][bS[i] - 1];
4882             /* 4px edge length */
4883             for( d = 0; d < 4; d++ ) {
4884                 const int p0 = pix[-1*pix_next];
4885                 const int p1 = pix[-2*pix_next];
4886                 const int p2 = pix[-3*pix_next];
4887                 const int q0 = pix[0];
4888                 const int q1 = pix[1*pix_next];
4889                 const int q2 = pix[2*pix_next];
4890
4891                 if( ABS( p0 - q0 ) < alpha &&
4892                     ABS( p1 - p0 ) < beta &&
4893                     ABS( q1 - q0 ) < beta ) {
4894
4895                     int tc = tc0;
4896                     int i_delta;
4897
4898                     if( ABS( p2 - p0 ) < beta ) {
4899                         pix[-2*pix_next] = p1 + clip( ( p2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( p1 << 1 ) ) >> 1, -tc0, tc0 );
4900                         tc++;
4901                     }
4902                     if( ABS( q2 - q0 ) < beta ) {
4903                         pix[pix_next] = q1 + clip( ( q2 + ( ( p0 + q0 + 1 ) >> 1 ) - ( q1 << 1 ) ) >> 1, -tc0, tc0 );
4904                         tc++;
4905                     }
4906
4907                     i_delta = clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
4908                     pix[-pix_next] = clip_uint8( p0 + i_delta );    /* p0' */
4909                     pix[0]         = clip_uint8( q0 - i_delta );    /* q0' */
4910                 }
4911                 pix++;
4912             }
4913         }else{
4914             /* 4px edge length */
4915             for( d = 0; d < 4; d++ ) {
4916                 const int p0 = pix[-1*pix_next];
4917                 const int p1 = pix[-2*pix_next];
4918                 const int p2 = pix[-3*pix_next];
4919                 const int q0 = pix[0];
4920                 const int q1 = pix[1*pix_next];
4921                 const int q2 = pix[2*pix_next];
4922
4923                 if( ABS( p0 - q0 ) < alpha &&
4924                     ABS( p1 - p0 ) < beta &&
4925                     ABS( q1 - q0 ) < beta ) {
4926
4927                     const int p3 = pix[-4*pix_next];
4928                     const int q3 = pix[ 3*pix_next];
4929
4930                     if(ABS( p0 - q0 ) < (( alpha >> 2 ) + 2 )){
4931                         if( ABS( p2 - p0 ) < beta) {
4932                             /* p0', p1', p2' */
4933                             pix[-1*pix_next] = ( p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 ) >> 3;
4934                             pix[-2*pix_next] = ( p2 + p1 + p0 + q0 + 2 ) >> 2;
4935                             pix[-3*pix_next] = ( 2*p3 + 3*p2 + p1 + p0 + q0 + 4 ) >> 3;
4936                         } else {
4937                             /* p0' */
4938                             pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
4939                         }
4940                         if( ABS( q2 - q0 ) < beta) {
4941                             /* q0', q1', q2' */
4942                             pix[0*pix_next] = ( p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 ) >> 3;
4943                             pix[1*pix_next] = ( p0 + q0 + q1 + q2 + 2 ) >> 2;
4944                             pix[2*pix_next] = ( 2*q3 + 3*q2 + q1 + q0 + p0 + 4 ) >> 3;
4945                         } else {
4946                             /* q0' */
4947                             pix[0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
4948                         }
4949                     }else{
4950                         /* p0', q0' */
4951                         pix[-1*pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;
4952                         pix[ 0*pix_next] = ( 2*q1 + q0 + p1 + 2 ) >> 2;
4953                     }
4954                 }
4955                 pix++;
4956             }
4957         }
4958     }
4959 }
4960
4961 static void filter_mb_edgech( H264Context *h, uint8_t *pix, int stride, int bS[4], int qp ) {
4962     int i, d;
4963     const int index_a = clip( qp + h->slice_alpha_c0_offset, 0, 51 );
4964     const int alpha = alpha_table[index_a];
4965     const int beta  = beta_table[clip( qp + h->slice_beta_offset, 0, 51 )];
4966     const int pix_next  = stride;
4967
4968     for( i = 0; i < 4; i++ )
4969     {
4970         if( bS[i] == 0 ) {
4971             pix += 2;
4972             continue;
4973         }
4974
4975         if( bS[i] < 4 ) {
4976             int tc = tc0_table[index_a][bS[i] - 1] + 1;
4977             /* 2px edge length (see deblocking_filter_edgecv) */
4978             for( d = 0; d < 2; d++ ) {
4979                 const int p0 = pix[-1*pix_next];
4980                 const int p1 = pix[-2*pix_next];
4981                 const int q0 = pix[0];
4982                 const int q1 = pix[1*pix_next];
4983
4984                 if( ABS( p0 - q0 ) < alpha &&
4985                     ABS( p1 - p0 ) < beta &&
4986                     ABS( q1 - q0 ) < beta ) {
4987
4988                     int i_delta = clip( (((q0 - p0 ) << 2) + (p1 - q1) + 4) >> 3, -tc, tc );
4989
4990                     pix[-pix_next] = clip_uint8( p0 + i_delta );    /* p0' */
4991                     pix[0]         = clip_uint8( q0 - i_delta );    /* q0' */
4992                 }
4993                 pix++;
4994             }
4995         }else{
4996             /* 2px edge length (see deblocking_filter_edgecv) */
4997             for( d = 0; d < 2; d++ ) {
4998                 const int p0 = pix[-1*pix_next];
4999                 const int p1 = pix[-2*pix_next];
5000                 const int q0 = pix[0];
5001                 const int q1 = pix[1*pix_next];
5002
5003                 if( ABS( p0 - q0 ) < alpha &&
5004                     ABS( p1 - p0 ) < beta &&
5005                     ABS( q1 - q0 ) < beta ) {
5006
5007                     pix[-pix_next] = ( 2*p1 + p0 + q1 + 2 ) >> 2;   /* p0' */
5008                     pix[0]         = ( 2*q1 + q0 + p1 + 2 ) >> 2;   /* q0' */
5009                 }
5010                 pix++;
5011             }
5012         }
5013     }
5014 }
5015
5016 static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr) {
5017     MpegEncContext * const s = &h->s;
5018     const int mb_xy= mb_x + mb_y*s->mb_stride;
5019     int linesize, uvlinesize;
5020     int dir;
5021
5022     /* FIXME Implement deblocking filter for field MB */
5023     if( h->sps.mb_aff ) {
5024         return;
5025     }
5026     linesize = s->linesize;
5027     uvlinesize = s->uvlinesize;
5028
5029     /* dir : 0 -> vertical edge, 1 -> horizontal edge */
5030     for( dir = 0; dir < 2; dir++ )
5031     {
5032         int start = 0;
5033         int edge;
5034
5035         /* test picture boundary */
5036         if( ( dir == 0 && mb_x == 0 ) || ( dir == 1 && mb_y == 0 ) ) {
5037             start = 1;
5038         }
5039         /* FIXME test slice boundary */
5040         if( h->deblocking_filter == 2 ) {
5041         }
5042
5043         /* Calculate bS */
5044         for( edge = start; edge < 4; edge++ ) {
5045             /* mbn_xy: neighbour macroblock (how that works for field ?) */
5046             int mbn_xy = edge > 0 ? mb_xy : ( dir == 0 ? mb_xy -1 : mb_xy - s->mb_stride );
5047             int bS[4];
5048             int qp;
5049
5050             if( IS_INTRA( s->current_picture.mb_type[mb_xy] ) ||
5051                 IS_INTRA( s->current_picture.mb_type[mbn_xy] ) ) {
5052                 bS[0] = bS[1] = bS[2] = bS[3] = ( edge == 0 ? 4 : 3 );
5053             } else {
5054                 int i;
5055                 for( i = 0; i < 4; i++ ) {
5056                     int x = dir == 0 ? edge : i;
5057                     int y = dir == 0 ? i    : edge;
5058                     int b_idx= 8 + 4 + x + 8*y;
5059                     int bn_idx= b_idx - (dir ? 8:1);
5060
5061                     if( h->non_zero_count_cache[b_idx] != 0 ||
5062                         h->non_zero_count_cache[bn_idx] != 0 ) {
5063                         bS[i] = 2;
5064                     }
5065                     else if( h->slice_type == P_TYPE ) {
5066                         if( h->ref_cache[0][b_idx] != h->ref_cache[0][bn_idx] ||
5067                             ABS( h->mv_cache[0][b_idx][0] - h->mv_cache[0][bn_idx][0] ) >= 4 ||
5068                             ABS( h->mv_cache[0][b_idx][1] - h->mv_cache[0][bn_idx][1] ) >= 4 )
5069                             bS[i] = 1;
5070                         else
5071                             bS[i] = 0;
5072                     }
5073                     else {
5074                         /* FIXME Add support for B frame */
5075                         return;
5076                     }
5077                 }
5078
5079                 if(bS[0]+bS[1]+bS[2]+bS[3] == 0)
5080                     continue;
5081             }
5082
5083             /* Filter edge */
5084             qp = ( s->qscale + s->current_picture.qscale_table[mbn_xy] + 1 ) >> 1;
5085             if( dir == 0 ) {
5086                 filter_mb_edgev( h, &img_y[4*edge], linesize, bS, qp );
5087                 if( (edge&1) == 0 ) {
5088                     int chroma_qp = ( h->chroma_qp +
5089                                       get_chroma_qp( h, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1;
5090                     filter_mb_edgecv( h, &img_cb[2*edge], uvlinesize, bS, chroma_qp );
5091                     filter_mb_edgecv( h, &img_cr[2*edge], uvlinesize, bS, chroma_qp );
5092                 }
5093             } else {
5094                 filter_mb_edgeh( h, &img_y[4*edge*linesize], linesize, bS, qp );
5095                 if( (edge&1) == 0 ) {
5096                     int chroma_qp = ( h->chroma_qp +
5097                                       get_chroma_qp( h, s->current_picture.qscale_table[mbn_xy] ) + 1 ) >> 1;
5098                     filter_mb_edgech( h, &img_cb[2*edge*uvlinesize], uvlinesize, bS, chroma_qp );
5099                     filter_mb_edgech( h, &img_cr[2*edge*uvlinesize], uvlinesize, bS, chroma_qp );
5100                 }
5101             }
5102         }
5103     }
5104 }
5105
5106 static int decode_slice(H264Context *h){
5107     MpegEncContext * const s = &h->s;
5108     const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
5109
5110     s->mb_skip_run= -1;
5111
5112     if( h->pps.cabac ) {
5113         int i;
5114
5115         /* realign */
5116         align_get_bits( &s->gb );
5117
5118         /* init cabac */
5119         ff_init_cabac_states( &h->cabac, ff_h264_lps_range, ff_h264_mps_state, ff_h264_lps_state, 64 );
5120         ff_init_cabac_decoder( &h->cabac,
5121                                s->gb.buffer + get_bits_count(&s->gb)/8,
5122                                ( s->gb.size_in_bits - get_bits_count(&s->gb) ) );
5123         /* calculate pre-state */
5124         for( i= 0; i < 399; i++ ) {
5125             int pre;
5126             if( h->slice_type == I_TYPE )
5127                 pre = clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cabac_context_init_I[i][1], 1, 126 );
5128             else
5129                 pre = 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 );
5130
5131             if( pre <= 63 )
5132                 h->cabac_state[i] = 2 * ( 63 - pre ) + 0;
5133             else
5134                 h->cabac_state[i] = 2 * ( pre - 64 ) + 1;
5135         }
5136
5137         for(;;){
5138             int ret = decode_mb_cabac(h);
5139             int eos = get_cabac_terminate( &h->cabac ); /* End of Slice flag */
5140
5141             hl_decode_mb(h);
5142
5143             /* XXX: useless as decode_mb_cabac it doesn't support that ... */
5144             if( ret >= 0 && h->sps.mb_aff ) { //FIXME optimal? or let mb_decode decode 16x32 ?
5145                 s->mb_y++;
5146
5147                 ret = decode_mb_cabac(h);
5148                 eos = get_cabac_terminate( &h->cabac );
5149
5150                 hl_decode_mb(h);
5151                 s->mb_y--;
5152             }
5153
5154             if( ret < 0 ) {
5155                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
5156                 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);
5157                 return -1;
5158             }
5159
5160             if( ++s->mb_x >= s->mb_width ) {
5161                 s->mb_x = 0;
5162                 ff_draw_horiz_band(s, 16*s->mb_y, 16);
5163                 if( ++s->mb_y >= s->mb_height ) {
5164                     tprintf("slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
5165                 }
5166             }
5167
5168             if( eos || s->mb_y >= s->mb_height ) {
5169                 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);
5170                 return 0;
5171             }
5172 #if 0
5173             /* TODO test over-reading in cabac code */
5174             else if( read too much in h->cabac ) {
5175                 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);
5176                 return -1;
5177             }
5178 #endif
5179         }
5180
5181     } else {
5182         for(;;){
5183             int ret = decode_mb_cavlc(h);
5184
5185             hl_decode_mb(h);
5186
5187             if(ret>=0 && h->sps.mb_aff){ //FIXME optimal? or let mb_decode decode 16x32 ?
5188                 s->mb_y++;
5189                 ret = decode_mb_cavlc(h);
5190
5191                 hl_decode_mb(h);
5192                 s->mb_y--;
5193             }
5194
5195             if(ret<0){
5196                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
5197                 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);
5198
5199                 return -1;
5200             }
5201
5202             if(++s->mb_x >= s->mb_width){
5203                 s->mb_x=0;
5204                 ff_draw_horiz_band(s, 16*s->mb_y, 16);
5205                 if(++s->mb_y >= s->mb_height){
5206                     tprintf("slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
5207
5208                     if(get_bits_count(&s->gb) == s->gb.size_in_bits ) {
5209                         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);
5210
5211                         return 0;
5212                     }else{
5213                         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);
5214
5215                         return -1;
5216                     }
5217                 }
5218             }
5219
5220             if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){
5221                 if(get_bits_count(&s->gb) == s->gb.size_in_bits ){
5222                     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);
5223
5224                     return 0;
5225                 }else{
5226                     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);
5227
5228                     return -1;
5229                 }
5230             }
5231         }
5232     }
5233
5234 #if 0
5235     for(;s->mb_y < s->mb_height; s->mb_y++){
5236         for(;s->mb_x < s->mb_width; s->mb_x++){
5237             int ret= decode_mb(h);
5238             
5239             hl_decode_mb(h);
5240
5241             if(ret<0){
5242                 fprintf(stderr, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
5243                 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);
5244
5245                 return -1;
5246             }
5247         
5248             if(++s->mb_x >= s->mb_width){
5249                 s->mb_x=0;
5250                 if(++s->mb_y >= s->mb_height){
5251                     if(get_bits_count(s->gb) == s->gb.size_in_bits){
5252                         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);
5253
5254                         return 0;
5255                     }else{
5256                         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);
5257
5258                         return -1;
5259                     }
5260                 }
5261             }
5262         
5263             if(get_bits_count(s->?gb) >= s->gb?.size_in_bits){
5264                 if(get_bits_count(s->gb) == s->gb.size_in_bits){
5265                     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);
5266
5267                     return 0;
5268                 }else{
5269                     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);
5270
5271                     return -1;
5272                 }
5273             }
5274         }
5275         s->mb_x=0;
5276         ff_draw_horiz_band(s, 16*s->mb_y, 16);
5277     }
5278 #endif
5279     return -1; //not reached
5280 }
5281
5282 static inline int decode_vui_parameters(H264Context *h, SPS *sps){
5283     MpegEncContext * const s = &h->s;
5284     int aspect_ratio_info_present_flag, aspect_ratio_idc;
5285
5286     aspect_ratio_info_present_flag= get_bits1(&s->gb);
5287     
5288     if( aspect_ratio_info_present_flag ) {
5289         aspect_ratio_idc= get_bits(&s->gb, 8);
5290         if( aspect_ratio_idc == EXTENDED_SAR ) {
5291             sps->sar.num= get_bits(&s->gb, 16);
5292             sps->sar.den= get_bits(&s->gb, 16);
5293         }else if(aspect_ratio_idc < 16){
5294             sps->sar=  pixel_aspect[aspect_ratio_idc];
5295         }else{
5296             av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n");
5297             return -1;
5298         }
5299     }else{
5300         sps->sar.num= 
5301         sps->sar.den= 0;
5302     }
5303 //            s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
5304 #if 0
5305 | overscan_info_present_flag                        |0  |u(1)    |
5306 | if( overscan_info_present_flag )                  |   |        |
5307 |  overscan_appropriate_flag                        |0  |u(1)    |
5308 | video_signal_type_present_flag                    |0  |u(1)    |
5309 | if( video_signal_type_present_flag ) {            |   |        |
5310 |  video_format                                     |0  |u(3)    |
5311 |  video_full_range_flag                            |0  |u(1)    |
5312 |  colour_description_present_flag                  |0  |u(1)    |
5313 |  if( colour_description_present_flag ) {          |   |        |
5314 |   colour_primaries                                |0  |u(8)    |
5315 |   transfer_characteristics                        |0  |u(8)    |
5316 |   matrix_coefficients                             |0  |u(8)    |
5317 |  }                                                |   |        |
5318 | }                                                 |   |        |
5319 | chroma_location_info_present_flag                 |0  |u(1)    |
5320 | if ( chroma_location_info_present_flag ) {        |   |        |
5321 |  chroma_sample_location_type_top_field            |0  |ue(v)   |
5322 |  chroma_sample_location_type_bottom_field         |0  |ue(v)   |
5323 | }                                                 |   |        |
5324 | timing_info_present_flag                          |0  |u(1)    |
5325 | if( timing_info_present_flag ) {                  |   |        |
5326 |  num_units_in_tick                                |0  |u(32)   |
5327 |  time_scale                                       |0  |u(32)   |
5328 |  fixed_frame_rate_flag                            |0  |u(1)    |
5329 | }                                                 |   |        |
5330 | nal_hrd_parameters_present_flag                   |0  |u(1)    |
5331 | if( nal_hrd_parameters_present_flag  = =  1)      |   |        |
5332 |  hrd_parameters( )                                |   |        |
5333 | vcl_hrd_parameters_present_flag                   |0  |u(1)    |
5334 | if( vcl_hrd_parameters_present_flag  = =  1)      |   |        |
5335 |  hrd_parameters( )                                |   |        |
5336 | if( ( nal_hrd_parameters_present_flag  = =  1  | ||   |        |
5337 |                                                   |   |        |
5338 |( vcl_hrd_parameters_present_flag  = =  1 ) )      |   |        |
5339 |  low_delay_hrd_flag                               |0  |u(1)    |
5340 | bitstream_restriction_flag                        |0  |u(1)    |
5341 | if( bitstream_restriction_flag ) {                |0  |u(1)    |
5342 |  motion_vectors_over_pic_boundaries_flag          |0  |u(1)    |
5343 |  max_bytes_per_pic_denom                          |0  |ue(v)   |
5344 |  max_bits_per_mb_denom                            |0  |ue(v)   |
5345 |  log2_max_mv_length_horizontal                    |0  |ue(v)   |
5346 |  log2_max_mv_length_vertical                      |0  |ue(v)   |
5347 |  num_reorder_frames                               |0  |ue(v)   |
5348 |  max_dec_frame_buffering                          |0  |ue(v)   |
5349 | }                                                 |   |        |
5350 |}                                                  |   |        |
5351 #endif
5352     return 0;
5353 }
5354
5355 static inline int decode_seq_parameter_set(H264Context *h){
5356     MpegEncContext * const s = &h->s;
5357     int profile_idc, level_idc;
5358     int sps_id, i;
5359     SPS *sps;
5360     
5361     profile_idc= get_bits(&s->gb, 8);
5362     get_bits1(&s->gb);   //constraint_set0_flag
5363     get_bits1(&s->gb);   //constraint_set1_flag
5364     get_bits1(&s->gb);   //constraint_set2_flag
5365     get_bits(&s->gb, 5); // reserved
5366     level_idc= get_bits(&s->gb, 8);
5367     sps_id= get_ue_golomb(&s->gb);
5368     
5369     sps= &h->sps_buffer[ sps_id ];
5370     sps->profile_idc= profile_idc;
5371     sps->level_idc= level_idc;
5372     
5373     sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4;
5374     sps->poc_type= get_ue_golomb(&s->gb);
5375     
5376     if(sps->poc_type == 0){ //FIXME #define
5377         sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
5378     } else if(sps->poc_type == 1){//FIXME #define
5379         sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
5380         sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
5381         sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb);
5382         sps->poc_cycle_length= get_ue_golomb(&s->gb);
5383         
5384         for(i=0; i<sps->poc_cycle_length; i++)
5385             sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb);
5386     }
5387     if(sps->poc_type > 2){
5388         av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
5389         return -1;
5390     }
5391
5392     sps->ref_frame_count= get_ue_golomb(&s->gb);
5393     sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb);
5394     sps->mb_width= get_ue_golomb(&s->gb) + 1;
5395     sps->mb_height= get_ue_golomb(&s->gb) + 1;
5396     sps->frame_mbs_only_flag= get_bits1(&s->gb);
5397     if(!sps->frame_mbs_only_flag)
5398         sps->mb_aff= get_bits1(&s->gb);
5399     else
5400         sps->mb_aff= 0;
5401
5402     sps->direct_8x8_inference_flag= get_bits1(&s->gb);
5403
5404     sps->crop= get_bits1(&s->gb);
5405     if(sps->crop){
5406         sps->crop_left  = get_ue_golomb(&s->gb);
5407         sps->crop_right = get_ue_golomb(&s->gb);
5408         sps->crop_top   = get_ue_golomb(&s->gb);
5409         sps->crop_bottom= get_ue_golomb(&s->gb);
5410         if(sps->crop_left || sps->crop_top){
5411             av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completly supported, this could look slightly wrong ...\n");
5412         }
5413     }else{
5414         sps->crop_left  = 
5415         sps->crop_right = 
5416         sps->crop_top   = 
5417         sps->crop_bottom= 0;
5418     }
5419
5420     sps->vui_parameters_present_flag= get_bits1(&s->gb);
5421     if( sps->vui_parameters_present_flag )
5422         decode_vui_parameters(h, sps);
5423     
5424     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5425         av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%d profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s\n", 
5426                sps_id, sps->profile_idc, sps->level_idc,
5427                sps->poc_type,
5428                sps->ref_frame_count,
5429                sps->mb_width, sps->mb_height,
5430                sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
5431                sps->direct_8x8_inference_flag ? "8B8" : "",
5432                sps->crop_left, sps->crop_right, 
5433                sps->crop_top, sps->crop_bottom, 
5434                sps->vui_parameters_present_flag ? "VUI" : ""
5435                );
5436     }
5437     return 0;
5438 }
5439
5440 static inline int decode_picture_parameter_set(H264Context *h){
5441     MpegEncContext * const s = &h->s;
5442     int pps_id= get_ue_golomb(&s->gb);
5443     PPS *pps= &h->pps_buffer[pps_id];
5444     
5445     pps->sps_id= get_ue_golomb(&s->gb);
5446     pps->cabac= get_bits1(&s->gb);
5447     pps->pic_order_present= get_bits1(&s->gb);
5448     pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
5449     if(pps->slice_group_count > 1 ){
5450         pps->mb_slice_group_map_type= get_ue_golomb(&s->gb);
5451         av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n");
5452         switch(pps->mb_slice_group_map_type){
5453         case 0:
5454 #if 0
5455 |   for( i = 0; i <= num_slice_groups_minus1; i++ ) |   |        |
5456 |    run_length[ i ]                                |1  |ue(v)   |
5457 #endif
5458             break;
5459         case 2:
5460 #if 0
5461 |   for( i = 0; i < num_slice_groups_minus1; i++ )  |   |        |
5462 |{                                                  |   |        |
5463 |    top_left_mb[ i ]                               |1  |ue(v)   |
5464 |    bottom_right_mb[ i ]                           |1  |ue(v)   |
5465 |   }                                               |   |        |
5466 #endif
5467             break;
5468         case 3:
5469         case 4:
5470         case 5:
5471 #if 0
5472 |   slice_group_change_direction_flag               |1  |u(1)    |
5473 |   slice_group_change_rate_minus1                  |1  |ue(v)   |
5474 #endif
5475             break;
5476         case 6:
5477 #if 0
5478 |   slice_group_id_cnt_minus1                       |1  |ue(v)   |
5479 |   for( i = 0; i <= slice_group_id_cnt_minus1; i++ |   |        |
5480 |)                                                  |   |        |
5481 |    slice_group_id[ i ]                            |1  |u(v)    |
5482 #endif
5483             break;
5484         }
5485     }
5486     pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
5487     pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
5488     if(pps->ref_count[0] > 32 || pps->ref_count[1] > 32){
5489         av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)\n");
5490         return -1;
5491     }
5492     
5493     pps->weighted_pred= get_bits1(&s->gb);
5494     pps->weighted_bipred_idc= get_bits(&s->gb, 2);
5495     pps->init_qp= get_se_golomb(&s->gb) + 26;
5496     pps->init_qs= get_se_golomb(&s->gb) + 26;
5497     pps->chroma_qp_index_offset= get_se_golomb(&s->gb);
5498     pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
5499     pps->constrained_intra_pred= get_bits1(&s->gb);
5500     pps->redundant_pic_cnt_present = get_bits1(&s->gb);
5501     
5502     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
5503         av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%d sps:%d %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d %s %s %s\n", 
5504                pps_id, pps->sps_id,
5505                pps->cabac ? "CABAC" : "CAVLC",
5506                pps->slice_group_count,
5507                pps->ref_count[0], pps->ref_count[1],
5508                pps->weighted_pred ? "weighted" : "",
5509                pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset,
5510                pps->deblocking_filter_parameters_present ? "LPAR" : "",
5511                pps->constrained_intra_pred ? "CONSTR" : "",
5512                pps->redundant_pic_cnt_present ? "REDU" : ""
5513                );
5514     }
5515     
5516     return 0;
5517 }
5518
5519 /**
5520  * finds the end of the current frame in the bitstream.
5521  * @return the position of the first byte of the next frame, or -1
5522  */
5523 static int find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){
5524     int i;
5525     uint32_t state;
5526 //printf("first %02X%02X%02X%02X\n", buf[0], buf[1],buf[2],buf[3]);
5527 //    mb_addr= pc->mb_addr - 1;
5528     state= pc->state;
5529     //FIXME this will fail with slices
5530     for(i=0; i<buf_size; i++){
5531         state= (state<<8) | buf[i];
5532         if((state&0xFFFFFF1F) == 0x101 || (state&0xFFFFFF1F) == 0x102 || (state&0xFFFFFF1F) == 0x105){
5533             if(pc->frame_start_found){
5534                 pc->state=-1; 
5535                 pc->frame_start_found= 0;
5536                 return i-3;
5537             }
5538             pc->frame_start_found= 1;
5539         }
5540     }
5541     
5542     pc->state= state;
5543     return END_NOT_FOUND;
5544 }
5545
5546 static int h264_parse(AVCodecParserContext *s,
5547                       AVCodecContext *avctx,
5548                       uint8_t **poutbuf, int *poutbuf_size, 
5549                       const uint8_t *buf, int buf_size)
5550 {
5551     ParseContext *pc = s->priv_data;
5552     int next;
5553     
5554     next= find_frame_end(pc, buf, buf_size);
5555
5556     if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
5557         *poutbuf = NULL;
5558         *poutbuf_size = 0;
5559         return buf_size;
5560     }
5561
5562     *poutbuf = (uint8_t *)buf;
5563     *poutbuf_size = buf_size;
5564     return next;
5565 }
5566
5567 static int decode_nal_units(H264Context *h, uint8_t *buf, int buf_size){
5568     MpegEncContext * const s = &h->s;
5569     AVCodecContext * const avctx= s->avctx;
5570     int buf_index=0;
5571 #if 0
5572     int i;
5573     for(i=0; i<32; i++){
5574         printf("%X ", buf[i]);
5575     }
5576 #endif
5577     for(;;){
5578         int consumed;
5579         int dst_length;
5580         int bit_length;
5581         uint8_t *ptr;
5582         
5583         // start code prefix search
5584         for(; buf_index + 3 < buf_size; buf_index++){
5585             // this should allways succeed in the first iteration
5586             if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1)
5587                 break;
5588         }
5589         
5590         if(buf_index+3 >= buf_size) break;
5591         
5592         buf_index+=3;
5593         
5594         ptr= decode_nal(h, buf + buf_index, &dst_length, &consumed, buf_size - buf_index);
5595         if(ptr[dst_length - 1] == 0) dst_length--;
5596         bit_length= 8*dst_length - decode_rbsp_trailing(ptr + dst_length - 1);
5597
5598         if(s->avctx->debug&FF_DEBUG_STARTCODE){
5599             av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d at %d length %d\n", h->nal_unit_type, buf_index, dst_length);
5600         }
5601         
5602         buf_index += consumed;
5603
5604         if( s->hurry_up == 1 && h->nal_ref_idc  == 0 )
5605             continue;
5606         
5607         switch(h->nal_unit_type){
5608         case NAL_IDR_SLICE:
5609             idr(h); //FIXME ensure we dont loose some frames if there is reordering
5610         case NAL_SLICE:
5611             init_get_bits(&s->gb, ptr, bit_length);
5612             h->intra_gb_ptr=
5613             h->inter_gb_ptr= &s->gb;
5614             s->data_partitioning = 0;
5615             
5616             if(decode_slice_header(h) < 0) return -1;
5617             if(h->redundant_pic_count==0 && s->hurry_up < 5 )
5618                 decode_slice(h);
5619             break;
5620         case NAL_DPA:
5621             init_get_bits(&s->gb, ptr, bit_length);
5622             h->intra_gb_ptr=
5623             h->inter_gb_ptr= NULL;
5624             s->data_partitioning = 1;
5625             
5626             if(decode_slice_header(h) < 0) return -1;
5627             break;
5628         case NAL_DPB:
5629             init_get_bits(&h->intra_gb, ptr, bit_length);
5630             h->intra_gb_ptr= &h->intra_gb;
5631             break;
5632         case NAL_DPC:
5633             init_get_bits(&h->inter_gb, ptr, bit_length);
5634             h->inter_gb_ptr= &h->inter_gb;
5635
5636             if(h->redundant_pic_count==0 && h->intra_gb_ptr && s->data_partitioning && s->hurry_up < 5 )
5637                 decode_slice(h);
5638             break;
5639         case NAL_SEI:
5640             break;
5641         case NAL_SPS:
5642             init_get_bits(&s->gb, ptr, bit_length);
5643             decode_seq_parameter_set(h);
5644             
5645             if(s->flags& CODEC_FLAG_LOW_DELAY)
5646                 s->low_delay=1;
5647       
5648             avctx->has_b_frames= !s->low_delay;
5649             break;
5650         case NAL_PPS:
5651             init_get_bits(&s->gb, ptr, bit_length);
5652             
5653             decode_picture_parameter_set(h);
5654
5655             break;
5656         case NAL_PICTURE_DELIMITER:
5657             break;
5658         case NAL_FILTER_DATA:
5659             break;
5660         }        
5661
5662         //FIXME move after where irt is set
5663         s->current_picture.pict_type= s->pict_type;
5664         s->current_picture.key_frame= s->pict_type == I_TYPE;
5665     }
5666     
5667     if(!s->current_picture_ptr) return buf_index; //no frame
5668     
5669     h->prev_frame_num_offset= h->frame_num_offset;
5670     h->prev_frame_num= h->frame_num;
5671     if(s->current_picture_ptr->reference){
5672         h->prev_poc_msb= h->poc_msb;
5673         h->prev_poc_lsb= h->poc_lsb;
5674     }
5675     if(s->current_picture_ptr->reference)
5676         execute_ref_pic_marking(h, h->mmco, h->mmco_index);
5677     else
5678         assert(h->mmco_index==0);
5679
5680     ff_er_frame_end(s);
5681
5682     MPV_frame_end(s);
5683
5684     return buf_index;
5685 }
5686
5687 /**
5688  * retunrs the number of bytes consumed for building the current frame
5689  */
5690 static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){
5691     if(s->flags&CODEC_FLAG_TRUNCATED){
5692         pos -= s->parse_context.last_index;
5693         if(pos<0) pos=0; // FIXME remove (uneeded?)
5694         
5695         return pos;
5696     }else{
5697         if(pos==0) pos=1; //avoid infinite loops (i doubt thats needed but ...)
5698         if(pos+10>buf_size) pos=buf_size; // oops ;)
5699
5700         return pos;
5701     }
5702 }
5703
5704 static int decode_frame(AVCodecContext *avctx, 
5705                              void *data, int *data_size,
5706                              uint8_t *buf, int buf_size)
5707 {
5708     H264Context *h = avctx->priv_data;
5709     MpegEncContext *s = &h->s;
5710     AVFrame *pict = data; 
5711     int buf_index;
5712     
5713     s->flags= avctx->flags;
5714     s->flags2= avctx->flags2;
5715
5716    /* no supplementary picture */
5717     if (buf_size == 0) {
5718         return 0;
5719     }
5720     
5721     if(s->flags&CODEC_FLAG_TRUNCATED){
5722         int next= find_frame_end(&s->parse_context, buf, buf_size);
5723         
5724         if( ff_combine_frame(&s->parse_context, next, &buf, &buf_size) < 0 )
5725             return buf_size;
5726 //printf("next:%d buf_size:%d last_index:%d\n", next, buf_size, s->parse_context.last_index);
5727     }
5728
5729     if(s->avctx->extradata_size && s->picture_number==0){
5730         if(0 < decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) ) 
5731             return -1;
5732     }
5733
5734     buf_index=decode_nal_units(h, buf, buf_size);
5735     if(buf_index < 0) 
5736         return -1;
5737
5738     //FIXME do something with unavailable reference frames    
5739  
5740 //    if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_index, buf_size);
5741 #if 0
5742     if(s->pict_type==B_TYPE || s->low_delay){
5743         *pict= *(AVFrame*)&s->current_picture;
5744     } else {
5745         *pict= *(AVFrame*)&s->last_picture;
5746     }
5747 #endif
5748     if(!s->current_picture_ptr){
5749         av_log(h->s.avctx, AV_LOG_DEBUG, "error, NO frame\n");
5750         return -1;
5751     }
5752
5753     *pict= *(AVFrame*)&s->current_picture; //FIXME 
5754     ff_print_debug_info(s, pict);
5755     assert(pict->data[0]);
5756 //printf("out %d\n", (int)pict->data[0]);
5757 #if 0 //?
5758
5759     /* Return the Picture timestamp as the frame number */
5760     /* we substract 1 because it is added on utils.c    */
5761     avctx->frame_number = s->picture_number - 1;
5762 #endif
5763 #if 0
5764     /* dont output the last pic after seeking */
5765     if(s->last_picture_ptr || s->low_delay)
5766     //Note this isnt a issue as a IDR pic should flush teh buffers
5767 #endif
5768         *data_size = sizeof(AVFrame);
5769     return get_consumed_bytes(s, buf_index, buf_size);
5770 }
5771 #if 0
5772 static inline void fill_mb_avail(H264Context *h){
5773     MpegEncContext * const s = &h->s;
5774     const int mb_xy= s->mb_x + s->mb_y*s->mb_stride;
5775
5776     if(s->mb_y){
5777         h->mb_avail[0]= s->mb_x                 && h->slice_table[mb_xy - s->mb_stride - 1] == h->slice_num;
5778         h->mb_avail[1]=                            h->slice_table[mb_xy - s->mb_stride    ] == h->slice_num;
5779         h->mb_avail[2]= s->mb_x+1 < s->mb_width && h->slice_table[mb_xy - s->mb_stride + 1] == h->slice_num;
5780     }else{
5781         h->mb_avail[0]=
5782         h->mb_avail[1]=
5783         h->mb_avail[2]= 0;
5784     }
5785     h->mb_avail[3]= s->mb_x && h->slice_table[mb_xy - 1] == h->slice_num;
5786     h->mb_avail[4]= 1; //FIXME move out
5787     h->mb_avail[5]= 0; //FIXME move out
5788 }
5789 #endif
5790
5791 #if 0 //selftest
5792 #define COUNT 8000
5793 #define SIZE (COUNT*40)
5794 int main(){
5795     int i;
5796     uint8_t temp[SIZE];
5797     PutBitContext pb;
5798     GetBitContext gb;
5799 //    int int_temp[10000];
5800     DSPContext dsp;
5801     AVCodecContext avctx;
5802     
5803     dsputil_init(&dsp, &avctx);
5804
5805     init_put_bits(&pb, temp, SIZE);
5806     printf("testing unsigned exp golomb\n");
5807     for(i=0; i<COUNT; i++){
5808         START_TIMER
5809         set_ue_golomb(&pb, i);
5810         STOP_TIMER("set_ue_golomb");
5811     }
5812     flush_put_bits(&pb);
5813     
5814     init_get_bits(&gb, temp, 8*SIZE);
5815     for(i=0; i<COUNT; i++){
5816         int j, s;
5817         
5818         s= show_bits(&gb, 24);
5819         
5820         START_TIMER
5821         j= get_ue_golomb(&gb);
5822         if(j != i){
5823             printf("missmatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s);
5824 //            return -1;
5825         }
5826         STOP_TIMER("get_ue_golomb");
5827     }
5828     
5829     
5830     init_put_bits(&pb, temp, SIZE);
5831     printf("testing signed exp golomb\n");
5832     for(i=0; i<COUNT; i++){
5833         START_TIMER
5834         set_se_golomb(&pb, i - COUNT/2);
5835         STOP_TIMER("set_se_golomb");
5836     }
5837     flush_put_bits(&pb);
5838     
5839     init_get_bits(&gb, temp, 8*SIZE);
5840     for(i=0; i<COUNT; i++){
5841         int j, s;
5842         
5843         s= show_bits(&gb, 24);
5844         
5845         START_TIMER
5846         j= get_se_golomb(&gb);
5847         if(j != i - COUNT/2){
5848             printf("missmatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s);
5849 //            return -1;
5850         }
5851         STOP_TIMER("get_se_golomb");
5852     }
5853
5854     printf("testing 4x4 (I)DCT\n");
5855     
5856     DCTELEM block[16];
5857     uint8_t src[16], ref[16];
5858     uint64_t error= 0, max_error=0;
5859
5860     for(i=0; i<COUNT; i++){
5861         int j;
5862 //        printf("%d %d %d\n", r1, r2, (r2-r1)*16);
5863         for(j=0; j<16; j++){
5864             ref[j]= random()%255;
5865             src[j]= random()%255;
5866         }
5867
5868         h264_diff_dct_c(block, src, ref, 4);
5869         
5870         //normalize
5871         for(j=0; j<16; j++){
5872 //            printf("%d ", block[j]);
5873             block[j]= block[j]*4;
5874             if(j&1) block[j]= (block[j]*4 + 2)/5;
5875             if(j&4) block[j]= (block[j]*4 + 2)/5;
5876         }
5877 //        printf("\n");
5878         
5879         h264_add_idct_c(ref, block, 4);
5880 /*        for(j=0; j<16; j++){
5881             printf("%d ", ref[j]);
5882         }
5883         printf("\n");*/
5884             
5885         for(j=0; j<16; j++){
5886             int diff= ABS(src[j] - ref[j]);
5887             
5888             error+= diff*diff;
5889             max_error= FFMAX(max_error, diff);
5890         }
5891     }
5892     printf("error=%f max_error=%d\n", ((float)error)/COUNT/16, (int)max_error );
5893 #if 0
5894     printf("testing quantizer\n");
5895     for(qp=0; qp<52; qp++){
5896         for(i=0; i<16; i++)
5897             src1_block[i]= src2_block[i]= random()%255;
5898         
5899     }
5900 #endif
5901     printf("Testing NAL layer\n");
5902     
5903     uint8_t bitstream[COUNT];
5904     uint8_t nal[COUNT*2];
5905     H264Context h;
5906     memset(&h, 0, sizeof(H264Context));
5907     
5908     for(i=0; i<COUNT; i++){
5909         int zeros= i;
5910         int nal_length;
5911         int consumed;
5912         int out_length;
5913         uint8_t *out;
5914         int j;
5915         
5916         for(j=0; j<COUNT; j++){
5917             bitstream[j]= (random() % 255) + 1;
5918         }
5919         
5920         for(j=0; j<zeros; j++){
5921             int pos= random() % COUNT;
5922             while(bitstream[pos] == 0){
5923                 pos++;
5924                 pos %= COUNT;
5925             }
5926             bitstream[pos]=0;
5927         }
5928         
5929         START_TIMER
5930         
5931         nal_length= encode_nal(&h, nal, bitstream, COUNT, COUNT*2);
5932         if(nal_length<0){
5933             printf("encoding failed\n");
5934             return -1;
5935         }
5936         
5937         out= decode_nal(&h, nal, &out_length, &consumed, nal_length);
5938
5939         STOP_TIMER("NAL")
5940         
5941         if(out_length != COUNT){
5942             printf("incorrect length %d %d\n", out_length, COUNT);
5943             return -1;
5944         }
5945         
5946         if(consumed != nal_length){
5947             printf("incorrect consumed length %d %d\n", nal_length, consumed);
5948             return -1;
5949         }
5950         
5951         if(memcmp(bitstream, out, COUNT)){
5952             printf("missmatch\n");
5953             return -1;
5954         }
5955     }
5956     
5957     printf("Testing RBSP\n");
5958     
5959     
5960     return 0;
5961 }
5962 #endif
5963
5964
5965 static int decode_end(AVCodecContext *avctx)
5966 {
5967     H264Context *h = avctx->priv_data;
5968     MpegEncContext *s = &h->s;
5969     
5970     free_tables(h); //FIXME cleanup init stuff perhaps
5971     MPV_common_end(s);
5972
5973 //    memset(h, 0, sizeof(H264Context));
5974         
5975     return 0;
5976 }
5977
5978
5979 AVCodec h264_decoder = {
5980     "h264",
5981     CODEC_TYPE_VIDEO,
5982     CODEC_ID_H264,
5983     sizeof(H264Context),
5984     decode_init,
5985     NULL,
5986     decode_end,
5987     decode_frame,
5988     /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
5989 };
5990
5991 AVCodecParser h264_parser = {
5992     { CODEC_ID_H264 },
5993     sizeof(ParseContext),
5994     NULL,
5995     h264_parse,
5996     ff_parse_close,
5997 };
5998
5999 #include "svq3.c"