]> git.sesse.net Git - ffmpeg/blob - libavcodec/h264.c
some checks to avoid segfault
[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 #undef NDEBUG
35 #include <assert.h>
36
37 #define interlaced_dct interlaced_dct_is_a_bad_name
38 #define mb_intra mb_intra_isnt_initalized_see_mb_type
39
40 #define LUMA_DC_BLOCK_INDEX   25
41 #define CHROMA_DC_BLOCK_INDEX 26
42
43 #define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
44 #define COEFF_TOKEN_VLC_BITS           8
45 #define TOTAL_ZEROS_VLC_BITS           9
46 #define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
47 #define RUN_VLC_BITS                   3
48 #define RUN7_VLC_BITS                  6
49
50 #define MAX_SPS_COUNT 32
51 #define MAX_PPS_COUNT 256
52
53 #define MAX_MMCO_COUNT 66
54
55 /**
56  * Sequence parameter set
57  */
58 typedef struct SPS{
59     
60     int profile_idc;
61     int level_idc;
62     int multiple_slice_groups;         ///< more_than_one_slice_group_allowed_flag
63     int arbitrary_slice_order;         ///< arbitrary_slice_order_allowed_flag
64     int redundant_slices;              ///< redundant_slices_allowed_flag
65     int log2_max_frame_num;            ///< log2_max_frame_num_minus4 + 4
66     int poc_type;                      ///< pic_order_cnt_type
67     int log2_max_poc_lsb;              ///< log2_max_pic_order_cnt_lsb_minus4
68     int delta_pic_order_always_zero_flag;
69     int offset_for_non_ref_pic;
70     int offset_for_top_to_bottom_field;
71     int poc_cycle_length;              ///< num_ref_frames_in_pic_order_cnt_cycle
72     int ref_frame_count;               ///< num_ref_frames
73     int required_frame_num_update_behaviour_flag;
74     int mb_width;                      ///< frame_width_in_mbs_minus1 + 1
75     int mb_height;                     ///< frame_height_in_mbs_minus1 + 1
76     int frame_mbs_only_flag;
77     int mb_aff;                        ///<mb_adaptive_frame_field_flag
78     int direct_8x8_inference_flag;
79     int vui_parameters_present_flag;
80     int sar_width;
81     int sar_height;
82     short offset_for_ref_frame[256]; //FIXME dyn aloc?
83 }SPS;
84
85 /**
86  * Picture parameter set
87  */
88 typedef struct PPS{
89     int sps_id;
90     int cabac;                  ///< entropy_coding_mode_flag
91     int pic_order_present;      ///< pic_order_present_flag
92     int slice_group_count;      ///< num_slice_groups_minus1 + 1
93     int mb_slice_group_map_type;
94     int ref_count[2];           ///< num_ref_idx_l0/1_active_minus1 + 1
95     int weighted_pred;          ///< weighted_pred_flag
96     int weighted_bipred_idc;
97     int init_qp;                ///< pic_init_qp_minus26 + 26
98     int init_qs;                ///< pic_init_qs_minus26 + 26
99     int chroma_qp_index_offset;
100     int deblocking_filter_parameters_present; ///< deblocking_filter_parameters_present_flag
101     int constrained_intra_pred; ///< constrained_intra_pred_flag
102     int redundant_pic_cnt_present; ///< redundant_pic_cnt_present_flag
103     int crop;                   ///< frame_cropping_flag
104     int crop_left;              ///< frame_cropping_rect_left_offset
105     int crop_right;             ///< frame_cropping_rect_right_offset
106     int crop_top;               ///< frame_cropping_rect_top_offset
107     int crop_bottom;            ///< frame_cropping_rect_bottom_offset
108 }PPS;
109
110 /**
111  * Memory management control operation opcode.
112  */
113 typedef enum MMCOOpcode{
114     MMCO_END=0,
115     MMCO_SHORT2UNUSED,
116     MMCO_LONG2UNUSED,
117     MMCO_SHORT2LONG,
118     MMCO_SET_MAX_LONG,
119     MMCO_RESET, 
120     MMCO_LONG,
121 } MMCOOpcode;
122
123 /**
124  * Memory management control operation.
125  */
126 typedef struct MMCO{
127     MMCOOpcode opcode;
128     int short_frame_num;
129     int long_index;
130 } MMCO;
131
132 /**
133  * H264Context
134  */
135 typedef struct H264Context{
136     MpegEncContext s;
137     int nal_ref_idc;    
138     int nal_unit_type;
139 #define NAL_SLICE               1
140 #define NAL_DPA                 2
141 #define NAL_DPB                 3
142 #define NAL_DPC                 4
143 #define NAL_IDR_SLICE           5
144 #define NAL_SEI                 6
145 #define NAL_SPS                 7
146 #define NAL_PPS                 8
147 #define NAL_PICTURE_DELIMITER   9
148 #define NAL_FILTER_DATA         10
149     uint8_t *rbsp_buffer;
150     int rbsp_buffer_size;
151
152     int mb_stride; ///< stride of some mb tables
153
154     int chroma_qp; //QPc
155
156     int prev_mb_skiped; //FIXME remove (IMHO not used)
157
158     //prediction stuff
159     int chroma_pred_mode;
160     int intra16x16_pred_mode;
161     
162     int8_t intra4x4_pred_mode_cache[5*8];
163     int8_t (*intra4x4_pred_mode)[8];
164     void (*pred4x4  [9+3])(uint8_t *src, uint8_t *topright, int stride);//FIXME move to dsp?
165     void (*pred8x8  [4+3])(uint8_t *src, int stride);
166     void (*pred16x16[4+3])(uint8_t *src, int stride);
167     unsigned int topleft_samples_available;
168     unsigned int top_samples_available;
169     unsigned int topright_samples_available;
170     unsigned int left_samples_available;
171
172     /**
173      * non zero coeff count cache.
174      * is 64 if not available.
175      */
176     uint8_t non_zero_count_cache[6*8];
177     uint8_t (*non_zero_count)[16];
178
179     /**
180      * Motion vector cache.
181      */
182     int16_t mv_cache[2][5*8][2];
183     int8_t ref_cache[2][5*8];
184 #define LIST_NOT_USED -1 //FIXME rename?
185 #define PART_NOT_AVAILABLE -2
186     
187     /**
188      * is 1 if the specific list MV&references are set to 0,0,-2.
189      */
190     int mv_cache_clean[2];
191
192     int block_offset[16+8];
193     int chroma_subblock_offset[16]; //FIXME remove
194     
195     uint16_t *mb2b_xy; //FIXME are these 4 a good idea?
196     uint16_t *mb2b8_xy;
197     int b_stride;
198     int b8_stride;
199
200     SPS sps_buffer[MAX_SPS_COUNT];
201     SPS sps; ///< current sps
202     
203     PPS pps_buffer[MAX_PPS_COUNT];
204     /**
205      * current pps
206      */
207     PPS pps; //FIXME move tp Picture perhaps? (->no) do we need that?
208
209     int slice_num;
210     uint8_t *slice_table_base;
211     uint8_t *slice_table;      ///< slice_table_base + mb_stride + 1
212     int slice_type;
213     int slice_type_fixed;
214     
215     //interlacing specific flags
216     int mb_field_decoding_flag;
217     
218     int sub_mb_type[4];
219     
220     //POC stuff
221     int poc_lsb;
222     int poc_msb;
223     int delta_poc_bottom;
224     int delta_poc[2];
225     int frame_num;
226     int prev_poc_msb;             ///< poc_msb of the last reference pic for POC type 0
227     int prev_poc_lsb;             ///< poc_lsb of the last reference pic for POC type 0
228     int frame_num_offset;         ///< for POC type 2
229     int prev_frame_num_offset;    ///< for POC type 2
230     int prev_frame_num;           ///< frame_num of the last pic for POC type 1/2
231
232     /**
233      * frame_num for frames or 2*frame_num for field pics.
234      */
235     int curr_pic_num;
236     
237     /**
238      * max_frame_num or 2*max_frame_num for field pics.
239      */
240     int max_pic_num;
241
242     //Weighted pred stuff
243     int luma_log2_weight_denom;
244     int chroma_log2_weight_denom;
245     int luma_weight[2][16];
246     int luma_offset[2][16];
247     int chroma_weight[2][16][2];
248     int chroma_offset[2][16][2];
249    
250     //deblock
251     int disable_deblocking_filter_idc;
252     int slice_alpha_c0_offset_div2;
253     int slice_beta_offset_div2;
254      
255     int redundant_pic_count;
256     
257     int direct_spatial_mv_pred;
258
259     /**
260      * num_ref_idx_l0/1_active_minus1 + 1
261      */
262     int ref_count[2];// FIXME split for AFF
263     Picture *short_ref[16];
264     Picture *long_ref[16];
265     Picture default_ref_list[2][32];
266     Picture ref_list[2][32]; //FIXME size?
267     Picture field_ref_list[2][32]; //FIXME size?
268     
269     /**
270      * memory management control operations buffer.
271      */
272     MMCO mmco[MAX_MMCO_COUNT];
273     int mmco_index;
274     
275     int long_ref_count;  ///< number of actual long term references
276     int short_ref_count; ///< number of actual short term references
277     
278     //data partitioning
279     GetBitContext intra_gb;
280     GetBitContext inter_gb;
281     GetBitContext *intra_gb_ptr;
282     GetBitContext *inter_gb_ptr;
283     
284     DCTELEM mb[16*24] __align8;
285 }H264Context;
286
287 static VLC coeff_token_vlc[4];
288 static VLC chroma_dc_coeff_token_vlc;
289
290 static VLC total_zeros_vlc[15];
291 static VLC chroma_dc_total_zeros_vlc[3];
292
293 static VLC run_vlc[6];
294 static VLC run7_vlc;
295
296 /**
297  * fill a rectangle.
298  * @param h height of the recatangle, should be a constant
299  * @param w width of the recatangle, should be a constant
300  * @param size the size of val (1 or 4), should be a constant
301  */
302 static inline void fill_rectangle(void *p, int w, int h, int stride, uint32_t val, int size){ //FIXME ensure this IS inlined
303     assert(size==1 || size==4);
304     
305     w      *= size;
306     stride *= size;
307     
308 //FIXME check what gcc generates for 64 bit on x86 and possible write a 32 bit ver of it
309     if(w==2 && h==2){
310         *(uint16_t*)(p + 0)=
311         *(uint16_t*)(p + stride)= size==4 ? val : val*0x0101;
312     }else if(w==2 && h==4){
313         *(uint16_t*)(p + 0*stride)=
314         *(uint16_t*)(p + 1*stride)=
315         *(uint16_t*)(p + 2*stride)=
316         *(uint16_t*)(p + 3*stride)= size==4 ? val : val*0x0101;
317     }else if(w==4 && h==2){
318         *(uint32_t*)(p + 0*stride)=
319         *(uint32_t*)(p + 1*stride)= size==4 ? val : val*0x01010101;
320     }else if(w==4 && h==4){
321         *(uint32_t*)(p + 0*stride)=
322         *(uint32_t*)(p + 1*stride)=
323         *(uint32_t*)(p + 2*stride)=
324         *(uint32_t*)(p + 3*stride)= size==4 ? val : val*0x01010101;
325     }else if(w==8 && h==1){
326         *(uint32_t*)(p + 0)=
327         *(uint32_t*)(p + 4)= size==4 ? val : val*0x01010101;
328     }else if(w==8 && h==2){
329         *(uint32_t*)(p + 0 + 0*stride)=
330         *(uint32_t*)(p + 4 + 0*stride)=
331         *(uint32_t*)(p + 0 + 1*stride)=
332         *(uint32_t*)(p + 4 + 1*stride)=  size==4 ? val : val*0x01010101;
333     }else if(w==8 && h==4){
334         *(uint64_t*)(p + 0*stride)=
335         *(uint64_t*)(p + 1*stride)=
336         *(uint64_t*)(p + 2*stride)=
337         *(uint64_t*)(p + 3*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
338     }else if(w==16 && h==2){
339         *(uint64_t*)(p + 0+0*stride)=
340         *(uint64_t*)(p + 8+0*stride)=
341         *(uint64_t*)(p + 0+1*stride)=
342         *(uint64_t*)(p + 8+1*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
343     }else if(w==16 && h==4){
344         *(uint64_t*)(p + 0+0*stride)=
345         *(uint64_t*)(p + 8+0*stride)=
346         *(uint64_t*)(p + 0+1*stride)=
347         *(uint64_t*)(p + 8+1*stride)=
348         *(uint64_t*)(p + 0+2*stride)=
349         *(uint64_t*)(p + 8+2*stride)=
350         *(uint64_t*)(p + 0+3*stride)=
351         *(uint64_t*)(p + 8+3*stride)= size==4 ? val*0x0100000001ULL : val*0x0101010101010101ULL;
352     }else
353         assert(0);
354 }
355
356 static inline void fill_caches(H264Context *h, int mb_type){
357     MpegEncContext * const s = &h->s;
358     const int mb_xy= s->mb_x + s->mb_y*h->mb_stride;
359     int topleft_xy, top_xy, topright_xy, left_xy[2];
360     int topleft_type, top_type, topright_type, left_type[2];
361     int left_block[4];
362     int i;
363
364     //wow what a mess, why didnt they simplify the interlacing&intra stuff, i cant imagine that these complex rules are worth it 
365     
366     if(h->sps.mb_aff){
367     //FIXME
368     }else{
369         topleft_xy = mb_xy-1 - h->mb_stride;
370         top_xy     = mb_xy   - h->mb_stride;
371         topright_xy= mb_xy+1 - h->mb_stride;
372         left_xy[0]   = mb_xy-1;
373         left_xy[1]   = mb_xy-1;
374         left_block[0]= 0;
375         left_block[1]= 1;
376         left_block[2]= 2;
377         left_block[3]= 3;
378     }
379
380     topleft_type = h->slice_table[topleft_xy ] == h->slice_num ? s->current_picture.mb_type[topleft_xy] : 0;
381     top_type     = h->slice_table[top_xy     ] == h->slice_num ? s->current_picture.mb_type[top_xy]     : 0;
382     topright_type= h->slice_table[topright_xy] == h->slice_num ? s->current_picture.mb_type[topright_xy]: 0;
383     left_type[0] = h->slice_table[left_xy[0] ] == h->slice_num ? s->current_picture.mb_type[left_xy[0]] : 0;
384     left_type[1] = h->slice_table[left_xy[1] ] == h->slice_num ? s->current_picture.mb_type[left_xy[1]] : 0;
385
386     if(IS_INTRA(mb_type)){
387         h->topleft_samples_available= 
388         h->top_samples_available= 
389         h->left_samples_available= 0xFFFF;
390         h->topright_samples_available= 0xEEEA;
391
392         if(!IS_INTRA(top_type) && (top_type==0 || h->pps.constrained_intra_pred)){
393             h->topleft_samples_available= 0xB3FF;
394             h->top_samples_available= 0x33FF;
395             h->topright_samples_available= 0x26EA;
396         }
397         for(i=0; i<2; i++){
398             if(!IS_INTRA(left_type[i]) && (left_type[i]==0 || h->pps.constrained_intra_pred)){
399                 h->topleft_samples_available&= 0xDF5F;
400                 h->left_samples_available&= 0x5F5F;
401             }
402         }
403         
404         if(!IS_INTRA(topleft_type) && (topleft_type==0 || h->pps.constrained_intra_pred))
405             h->topleft_samples_available&= 0x7FFF;
406         
407         if(!IS_INTRA(topright_type) && (topright_type==0 || h->pps.constrained_intra_pred))
408             h->topright_samples_available&= 0xFBFF;
409     
410         if(IS_INTRA4x4(mb_type)){
411             if(IS_INTRA4x4(top_type)){
412                 h->intra4x4_pred_mode_cache[4+8*0]= h->intra4x4_pred_mode[top_xy][4];
413                 h->intra4x4_pred_mode_cache[5+8*0]= h->intra4x4_pred_mode[top_xy][5];
414                 h->intra4x4_pred_mode_cache[6+8*0]= h->intra4x4_pred_mode[top_xy][6];
415                 h->intra4x4_pred_mode_cache[7+8*0]= h->intra4x4_pred_mode[top_xy][3];
416             }else{
417                 int pred;
418                 if(IS_INTRA16x16(top_type) || (IS_INTER(top_type) && !h->pps.constrained_intra_pred))
419                     pred= 2;
420                 else{
421                     pred= -1;
422                 }
423                 h->intra4x4_pred_mode_cache[4+8*0]=
424                 h->intra4x4_pred_mode_cache[5+8*0]=
425                 h->intra4x4_pred_mode_cache[6+8*0]=
426                 h->intra4x4_pred_mode_cache[7+8*0]= pred;
427             }
428             for(i=0; i<2; i++){
429                 if(IS_INTRA4x4(left_type[i])){
430                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[0+2*i]];
431                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= h->intra4x4_pred_mode[left_xy[i]][left_block[1+2*i]];
432                 }else{
433                     int pred;
434                     if(IS_INTRA16x16(left_type[i]) || (IS_INTER(left_type[i]) && !h->pps.constrained_intra_pred))
435                         pred= 2;
436                     else{
437                         pred= -1;
438                     }
439                     h->intra4x4_pred_mode_cache[3+8*1 + 2*8*i]=
440                     h->intra4x4_pred_mode_cache[3+8*2 + 2*8*i]= pred;
441                 }
442             }
443         }
444     }
445     
446     
447 /*
448 0 . T T. T T T T 
449 1 L . .L . . . . 
450 2 L . .L . . . . 
451 3 . T TL . . . . 
452 4 L . .L . . . . 
453 5 L . .. . . . . 
454 */
455 //FIXME constraint_intra_pred & partitioning & nnz (lets hope this is just a typo in the spec)
456     if(top_type){
457         h->non_zero_count_cache[4+8*0]= h->non_zero_count[top_xy][0];
458         h->non_zero_count_cache[5+8*0]= h->non_zero_count[top_xy][1];
459         h->non_zero_count_cache[6+8*0]= h->non_zero_count[top_xy][2];
460         h->non_zero_count_cache[7+8*0]= h->non_zero_count[top_xy][3];
461     
462         h->non_zero_count_cache[1+8*0]= h->non_zero_count[top_xy][7];
463         h->non_zero_count_cache[2+8*0]= h->non_zero_count[top_xy][8];
464     
465         h->non_zero_count_cache[1+8*3]= h->non_zero_count[top_xy][10];
466         h->non_zero_count_cache[2+8*3]= h->non_zero_count[top_xy][11];
467     }else{
468         h->non_zero_count_cache[4+8*0]=      
469         h->non_zero_count_cache[5+8*0]=
470         h->non_zero_count_cache[6+8*0]=
471         h->non_zero_count_cache[7+8*0]=
472     
473         h->non_zero_count_cache[1+8*0]=
474         h->non_zero_count_cache[2+8*0]=
475     
476         h->non_zero_count_cache[1+8*3]=
477         h->non_zero_count_cache[2+8*3]= 64;
478     }
479     
480     if(left_type[0]){
481         h->non_zero_count_cache[3+8*1]= h->non_zero_count[left_xy[0]][6];
482         h->non_zero_count_cache[3+8*2]= h->non_zero_count[left_xy[0]][5];
483         h->non_zero_count_cache[0+8*1]= h->non_zero_count[left_xy[0]][9]; //FIXME left_block
484         h->non_zero_count_cache[0+8*4]= h->non_zero_count[left_xy[0]][12];
485     }else{
486         h->non_zero_count_cache[3+8*1]= 
487         h->non_zero_count_cache[3+8*2]= 
488         h->non_zero_count_cache[0+8*1]= 
489         h->non_zero_count_cache[0+8*4]= 64;
490     }
491     
492     if(left_type[1]){
493         h->non_zero_count_cache[3+8*3]= h->non_zero_count[left_xy[1]][4];
494         h->non_zero_count_cache[3+8*4]= h->non_zero_count[left_xy[1]][3];
495         h->non_zero_count_cache[0+8*2]= h->non_zero_count[left_xy[1]][8];
496         h->non_zero_count_cache[0+8*5]= h->non_zero_count[left_xy[1]][11];
497     }else{
498         h->non_zero_count_cache[3+8*3]= 
499         h->non_zero_count_cache[3+8*4]= 
500         h->non_zero_count_cache[0+8*2]= 
501         h->non_zero_count_cache[0+8*5]= 64;
502     }
503     
504 #if 1
505     if(IS_INTER(mb_type)){
506         int list;
507         for(list=0; list<2; list++){
508             if((!IS_8X8(mb_type)) && !USES_LIST(mb_type, list)){
509                 /*if(!h->mv_cache_clean[list]){
510                     memset(h->mv_cache [list],  0, 8*5*2*sizeof(int16_t)); //FIXME clean only input? clean at all?
511                     memset(h->ref_cache[list], PART_NOT_AVAILABLE, 8*5*sizeof(int8_t));
512                     h->mv_cache_clean[list]= 1;
513                 }*/
514                 continue; //FIXME direct mode ...
515             }
516             h->mv_cache_clean[list]= 0;
517             
518             if(IS_INTER(topleft_type)){
519                 const int b_xy = h->mb2b_xy[topleft_xy] + 3 + 3*h->b_stride;
520                 const int b8_xy= h->mb2b8_xy[topleft_xy] + 1 + h->b8_stride;
521                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
522                 h->ref_cache[list][scan8[0] - 1 - 1*8]= s->current_picture.ref_index[list][b8_xy];
523             }else{
524                 *(uint32_t*)h->mv_cache[list][scan8[0] - 1 - 1*8]= 0;
525                 h->ref_cache[list][scan8[0] - 1 - 1*8]= topleft_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
526             }
527             
528             if(IS_INTER(top_type)){
529                 const int b_xy= h->mb2b_xy[top_xy] + 3*h->b_stride;
530                 const int b8_xy= h->mb2b8_xy[top_xy] + h->b8_stride;
531                 *(uint32_t*)h->mv_cache[list][scan8[0] + 0 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 0];
532                 *(uint32_t*)h->mv_cache[list][scan8[0] + 1 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 1];
533                 *(uint32_t*)h->mv_cache[list][scan8[0] + 2 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 2];
534                 *(uint32_t*)h->mv_cache[list][scan8[0] + 3 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy + 3];
535                 h->ref_cache[list][scan8[0] + 0 - 1*8]=
536                 h->ref_cache[list][scan8[0] + 1 - 1*8]= s->current_picture.ref_index[list][b8_xy + 0];
537                 h->ref_cache[list][scan8[0] + 2 - 1*8]=
538                 h->ref_cache[list][scan8[0] + 3 - 1*8]= s->current_picture.ref_index[list][b8_xy + 1];
539             }else{
540                 *(uint32_t*)h->mv_cache [list][scan8[0] + 0 - 1*8]= 
541                 *(uint32_t*)h->mv_cache [list][scan8[0] + 1 - 1*8]= 
542                 *(uint32_t*)h->mv_cache [list][scan8[0] + 2 - 1*8]= 
543                 *(uint32_t*)h->mv_cache [list][scan8[0] + 3 - 1*8]= 0;
544                 *(uint32_t*)&h->ref_cache[list][scan8[0] + 0 - 1*8]= ((top_type ? LIST_NOT_USED : PART_NOT_AVAILABLE)&0xFF)*0x01010101;
545             }
546
547             if(IS_INTER(topright_type)){
548                 const int b_xy= h->mb2b_xy[topright_xy] + 3*h->b_stride;
549                 const int b8_xy= h->mb2b8_xy[topright_xy] + h->b8_stride;
550                 *(uint32_t*)h->mv_cache[list][scan8[0] + 4 - 1*8]= *(uint32_t*)s->current_picture.motion_val[list][b_xy];
551                 h->ref_cache[list][scan8[0] + 4 - 1*8]= s->current_picture.ref_index[list][b8_xy];
552             }else{
553                 *(uint32_t*)h->mv_cache [list][scan8[0] + 4 - 1*8]= 0;
554                 h->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
555             }
556             
557             //FIXME unify cleanup or sth
558             if(IS_INTER(left_type[0])){
559                 const int b_xy= h->mb2b_xy[left_xy[0]] + 3;
560                 const int b8_xy= h->mb2b8_xy[left_xy[0]] + 1;
561                 *(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]];
562                 *(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]];
563                 h->ref_cache[list][scan8[0] - 1 + 0*8]= 
564                 h->ref_cache[list][scan8[0] - 1 + 1*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[0]>>1)];
565             }else{
566                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 0*8]=
567                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 1*8]= 0;
568                 h->ref_cache[list][scan8[0] - 1 + 0*8]=
569                 h->ref_cache[list][scan8[0] - 1 + 1*8]= left_type[0] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
570             }
571             
572             if(IS_INTER(left_type[1])){
573                 const int b_xy= h->mb2b_xy[left_xy[1]] + 3;
574                 const int b8_xy= h->mb2b8_xy[left_xy[1]] + 1;
575                 *(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]];
576                 *(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]];
577                 h->ref_cache[list][scan8[0] - 1 + 2*8]= 
578                 h->ref_cache[list][scan8[0] - 1 + 3*8]= s->current_picture.ref_index[list][b8_xy + h->b8_stride*(left_block[2]>>1)];
579             }else{
580                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 2*8]=
581                 *(uint32_t*)h->mv_cache [list][scan8[0] - 1 + 3*8]= 0;
582                 h->ref_cache[list][scan8[0] - 1 + 2*8]=
583                 h->ref_cache[list][scan8[0] - 1 + 3*8]= left_type[0] ? LIST_NOT_USED : PART_NOT_AVAILABLE;
584             }
585
586             h->ref_cache[list][scan8[5 ]+1] = 
587             h->ref_cache[list][scan8[7 ]+1] = 
588             h->ref_cache[list][scan8[13]+1] =  //FIXME remove past 3 (init somewher else)
589             h->ref_cache[list][scan8[4 ]] = 
590             h->ref_cache[list][scan8[12]] = PART_NOT_AVAILABLE;
591             *(uint32_t*)h->mv_cache [list][scan8[5 ]+1]=
592             *(uint32_t*)h->mv_cache [list][scan8[7 ]+1]=
593             *(uint32_t*)h->mv_cache [list][scan8[13]+1]= //FIXME remove past 3 (init somewher else)
594             *(uint32_t*)h->mv_cache [list][scan8[4 ]]=
595             *(uint32_t*)h->mv_cache [list][scan8[12]]= 0;
596         }
597 //FIXME
598
599     }
600 #endif
601 }
602
603 static inline void write_back_intra_pred_mode(H264Context *h){
604     MpegEncContext * const s = &h->s;
605     const int mb_xy= s->mb_x + s->mb_y*h->mb_stride;
606
607     h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1];
608     h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2];
609     h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3];
610     h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4];
611     h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4];
612     h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4];
613     h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4];
614 }
615
616 /**
617  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
618  */
619 static inline int check_intra4x4_pred_mode(H264Context *h){
620     MpegEncContext * const s = &h->s;
621     static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0};
622     static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_PRED};
623     int i;
624     
625     if(!(h->top_samples_available&0x8000)){
626         for(i=0; i<4; i++){
627             int status= top[ h->intra4x4_pred_mode_cache[scan8[0] + i] ];
628             if(status<0){
629                 fprintf(stderr, "top block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y);
630                 return -1;
631             } else if(status){
632                 h->intra4x4_pred_mode_cache[scan8[0] + i]= status;
633             }
634         }
635     }
636     
637     if(!(h->left_samples_available&0x8000)){
638         for(i=0; i<4; i++){
639             int status= left[ h->intra4x4_pred_mode_cache[scan8[0] + 8*i] ];
640             if(status<0){
641                 fprintf(stderr, "left block unavailable for requested intra4x4 mode %d at %d %d\n", status, s->mb_x, s->mb_y);
642                 return -1;
643             } else if(status){
644                 h->intra4x4_pred_mode_cache[scan8[0] + 8*i]= status;
645             }
646         }
647     }
648
649     return 0;
650 } //FIXME cleanup like next
651
652 /**
653  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
654  */
655 static inline int check_intra_pred_mode(H264Context *h, int mode){
656     MpegEncContext * const s = &h->s;
657     static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};
658     static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};
659     
660     if(!(h->top_samples_available&0x8000)){
661         mode= top[ mode ];
662         if(mode<0){
663             fprintf(stderr, "top block unavailable for requested intra mode at %d %d\n", s->mb_x, s->mb_y);
664             return -1;
665         }
666     }
667     
668     if(!(h->left_samples_available&0x8000)){
669         mode= left[ mode ];
670         if(mode<0){
671             fprintf(stderr, "left block unavailable for requested intra mode at %d %d\n", s->mb_x, s->mb_y);
672             return -1;
673         } 
674     }
675
676     return mode;
677 }
678
679 /**
680  * gets the predicted intra4x4 prediction mode.
681  */
682 static inline int pred_intra_mode(H264Context *h, int n){
683     const int index8= scan8[n];
684     const int left= h->intra4x4_pred_mode_cache[index8 - 1];
685     const int top = h->intra4x4_pred_mode_cache[index8 - 8];
686     const int min= FFMIN(left, top);
687
688     tprintf("mode:%d %d min:%d\n", left ,top, min);
689
690     if(min<0) return DC_PRED;
691     else      return min;
692 }
693
694 static inline void write_back_non_zero_count(H264Context *h){
695     MpegEncContext * const s = &h->s;
696     const int mb_xy= s->mb_x + s->mb_y*h->mb_stride;
697
698     h->non_zero_count[mb_xy][0]= h->non_zero_count_cache[4+8*4];
699     h->non_zero_count[mb_xy][1]= h->non_zero_count_cache[5+8*4];
700     h->non_zero_count[mb_xy][2]= h->non_zero_count_cache[6+8*4];
701     h->non_zero_count[mb_xy][3]= h->non_zero_count_cache[7+8*4];
702     h->non_zero_count[mb_xy][4]= h->non_zero_count_cache[7+8*3];
703     h->non_zero_count[mb_xy][5]= h->non_zero_count_cache[7+8*2];
704     h->non_zero_count[mb_xy][6]= h->non_zero_count_cache[7+8*1];
705     
706     h->non_zero_count[mb_xy][7]= h->non_zero_count_cache[1+8*2];
707     h->non_zero_count[mb_xy][8]= h->non_zero_count_cache[2+8*2];
708     h->non_zero_count[mb_xy][9]= h->non_zero_count_cache[2+8*1];
709
710     h->non_zero_count[mb_xy][10]=h->non_zero_count_cache[1+8*5];
711     h->non_zero_count[mb_xy][11]=h->non_zero_count_cache[2+8*5];
712     h->non_zero_count[mb_xy][12]=h->non_zero_count_cache[2+8*4];
713 }
714
715 /**
716  * gets the predicted number of non zero coefficients.
717  * @param n block index
718  */
719 static inline int pred_non_zero_count(H264Context *h, int n){
720     const int index8= scan8[n];
721     const int left= h->non_zero_count_cache[index8 - 1];
722     const int top = h->non_zero_count_cache[index8 - 8];
723     int i= left + top;
724     
725     if(i<64) i= (i+1)>>1;
726
727     tprintf("pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31);
728
729     return i&31;
730 }
731
732 static inline int fetch_diagonal_mv(H264Context *h, const int16_t **C, int i, int list, int part_width){
733     const int topright_ref= h->ref_cache[list][ i - 8 + part_width ];
734
735     if(topright_ref != PART_NOT_AVAILABLE){
736         *C= h->mv_cache[list][ i - 8 + part_width ];
737         return topright_ref;
738     }else{
739         tprintf("topright MV not available\n");
740
741         *C= h->mv_cache[list][ i - 8 - 1 ];
742         return h->ref_cache[list][ i - 8 - 1 ];
743     }
744 }
745
746 /**
747  * gets the predicted MV.
748  * @param n the block index
749  * @param part_width the width of the partition (4, 8,16) -> (1, 2, 4)
750  * @param mx the x component of the predicted motion vector
751  * @param my the y component of the predicted motion vector
752  */
753 static inline void pred_motion(H264Context * const h, int n, int part_width, int list, int ref, int * const mx, int * const my){
754     MpegEncContext * const s = &h->s;
755     const int index8= scan8[n];
756     const int top_ref=      h->ref_cache[list][ index8 - 8 ];
757     const int left_ref=     h->ref_cache[list][ index8 - 1 ];
758     const int16_t * const A= h->mv_cache[list][ index8 - 1 ];
759     const int16_t * const B= h->mv_cache[list][ index8 - 8 ];
760     const int16_t * C;
761     int diagonal_ref, match_count;
762
763     assert(part_width==1 || part_width==2 || part_width==4);
764
765 /* mv_cache
766   B . . A T T T T 
767   U . . L . . , .
768   U . . L . . . .
769   U . . L . . , .
770   . . . L . . . .
771 */
772
773     diagonal_ref= fetch_diagonal_mv(h, &C, index8, list, part_width);
774     match_count= (diagonal_ref==ref) + (top_ref==ref) + (left_ref==ref);
775     
776     if(match_count > 1){ //most common
777         *mx= mid_pred(A[0], B[0], C[0]);
778         *my= mid_pred(A[1], B[1], C[1]);
779     }else if(match_count==1){
780         if(left_ref==ref){
781             *mx= A[0];
782             *my= A[1];        
783         }else if(top_ref==ref){
784             *mx= B[0];
785             *my= B[1];        
786         }else{
787             *mx= C[0];
788             *my= C[1];        
789         }
790     }else{
791         if(top_ref == PART_NOT_AVAILABLE && diagonal_ref == PART_NOT_AVAILABLE && left_ref != PART_NOT_AVAILABLE){
792             *mx= A[0];
793             *my= A[1];        
794         }else{
795             *mx= mid_pred(A[0], B[0], C[0]);
796             *my= mid_pred(A[1], B[1], C[1]);
797         }
798     }
799         
800     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, s->mb_x, s->mb_y, n, list);
801 }
802
803 /**
804  * gets the directionally predicted 16x8 MV.
805  * @param n the block index
806  * @param mx the x component of the predicted motion vector
807  * @param my the y component of the predicted motion vector
808  */
809 static inline void pred_16x8_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
810     MpegEncContext * const s = &h->s;
811     if(n==0){
812         const int top_ref=      h->ref_cache[list][ scan8[0] - 8 ];
813         const int16_t * const B= h->mv_cache[list][ scan8[0] - 8 ];
814
815         tprintf("pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d", top_ref, B[0], B[1], s->mb_x, s->mb_y, n, list);
816         
817         if(top_ref == ref){
818             *mx= B[0];
819             *my= B[1];
820             return;
821         }
822     }else{
823         const int left_ref=     h->ref_cache[list][ scan8[8] - 1 ];
824         const int16_t * const A= h->mv_cache[list][ scan8[8] - 1 ];
825         
826         tprintf("pred_16x8: (%2d %2d %2d) at %2d %2d %d list %d", left_ref, A[0], A[1], s->mb_x, s->mb_y, n, list);
827
828         if(left_ref == ref){
829             *mx= A[0];
830             *my= A[1];
831             return;
832         }
833     }
834
835     //RARE
836     pred_motion(h, n, 4, list, ref, mx, my);
837 }
838
839 /**
840  * gets the directionally predicted 8x16 MV.
841  * @param n the block index
842  * @param mx the x component of the predicted motion vector
843  * @param my the y component of the predicted motion vector
844  */
845 static inline void pred_8x16_motion(H264Context * const h, int n, int list, int ref, int * const mx, int * const my){
846     MpegEncContext * const s = &h->s;
847     if(n==0){
848         const int left_ref=      h->ref_cache[list][ scan8[0] - 1 ];
849         const int16_t * const A=  h->mv_cache[list][ scan8[0] - 1 ];
850         
851         tprintf("pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d", left_ref, A[0], A[1], s->mb_x, s->mb_y, n, list);
852
853         if(left_ref == ref){
854             *mx= A[0];
855             *my= A[1];
856             return;
857         }
858     }else{
859         const int16_t * C;
860         int diagonal_ref;
861
862         diagonal_ref= fetch_diagonal_mv(h, &C, scan8[4], list, 2);
863         
864         tprintf("pred_8x16: (%2d %2d %2d) at %2d %2d %d list %d", diagonal_ref, C[0], C[1], s->mb_x, s->mb_y, n, list);
865
866         if(diagonal_ref == ref){ 
867             *mx= C[0];
868             *my= C[1];
869             return;
870         }
871     }
872
873     //RARE
874     pred_motion(h, n, 2, list, ref, mx, my);
875 }
876
877 static inline void pred_pskip_motion(H264Context * const h, int * const mx, int * const my){
878     MpegEncContext * const s = &h->s;
879     const int top_ref = h->ref_cache[0][ scan8[0] - 8 ];
880     const int left_ref= h->ref_cache[0][ scan8[0] - 1 ];
881
882     tprintf("pred_pskip: (%d) (%d) at %2d %2d", top_ref, left_ref, s->mb_x, s->mb_y);
883
884     if(top_ref == PART_NOT_AVAILABLE || left_ref == PART_NOT_AVAILABLE
885        || (top_ref == 0  && *(uint32_t*)h->mv_cache[0][ scan8[0] - 8 ] == 0)
886        || (left_ref == 0 && *(uint32_t*)h->mv_cache[0][ scan8[0] - 1 ] == 0)){
887        
888         *mx = *my = 0;
889         return;
890     }
891         
892     pred_motion(h, 0, 4, 0, 0, mx, my);
893
894     return;
895 }
896
897 static inline void write_back_motion(H264Context *h, int mb_type){
898     MpegEncContext * const s = &h->s;
899     const int mb_xy= s->mb_x + s->mb_y*h->mb_stride;
900     const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
901     const int b8_xy= 2*s->mb_x + 2*s->mb_y*h->b8_stride;
902     int list;
903
904     for(list=0; list<2; list++){
905         int y;
906         if((!IS_8X8(mb_type)) && !USES_LIST(mb_type, list)){
907             if(1){ //FIXME skip or never read if mb_type doesnt use it
908                 for(y=0; y<4; y++){
909                     *(uint64_t*)s->current_picture.motion_val[list][b_xy + 0 + y*h->b_stride]=
910                     *(uint64_t*)s->current_picture.motion_val[list][b_xy + 2 + y*h->b_stride]= 0;
911                 }
912                 for(y=0; y<2; y++){
913                     *(uint16_t*)s->current_picture.motion_val[list][b8_xy + y*h->b8_stride]= (LIST_NOT_USED&0xFF)*0x0101;
914                 }
915             }
916             continue; //FIXME direct mode ...
917         }
918         
919         for(y=0; y<4; y++){
920             *(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];
921             *(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];
922         }
923         for(y=0; y<2; y++){
924             s->current_picture.ref_index[list][b8_xy + 0 + y*h->b8_stride]= h->ref_cache[list][scan8[0]+0 + 16*y];
925             s->current_picture.ref_index[list][b8_xy + 1 + y*h->b8_stride]= h->ref_cache[list][scan8[0]+2 + 16*y];
926         }
927     }
928 }
929
930 /**
931  * Decodes a network abstraction layer unit.
932  * @param consumed is the number of bytes used as input
933  * @param length is the length of the array
934  * @param dst_length is the number of decoded bytes FIXME here or a decode rbsp ttailing?
935  * @returns decoded bytes, might be src+1 if no escapes 
936  */
937 static uint8_t *decode_nal(H264Context *h, uint8_t *src, int *dst_length, int *consumed, int length){
938     int i, si, di;
939     uint8_t *dst;
940
941 //    src[0]&0x80;              //forbidden bit
942     h->nal_ref_idc= src[0]>>5;
943     h->nal_unit_type= src[0]&0x1F;
944
945     src++; length--;
946 #if 0    
947     for(i=0; i<length; i++)
948         printf("%2X ", src[i]);
949 #endif
950     for(i=0; i+1<length; i+=2){
951         if(src[i]) continue;
952         if(i>0 && src[i-1]==0) i--;
953         if(i+2<length && src[i+1]==0 && src[i+2]<=3){
954             if(src[i+2]!=3){
955                 /* startcode, so we must be past the end */
956                 length=i;
957             }
958             break;
959         }
960     }
961
962     if(i>=length-1){ //no escaped 0
963         *dst_length= length;
964         *consumed= length+1; //+1 for the header
965         return src; 
966     }
967
968     h->rbsp_buffer= av_fast_realloc(h->rbsp_buffer, &h->rbsp_buffer_size, length);
969     dst= h->rbsp_buffer;
970
971 //printf("deoding esc\n");
972     si=di=0;
973     while(si<length){ 
974         //remove escapes (very rare 1:2^22)
975         if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){
976             if(src[si+2]==3){ //escape
977                 dst[di++]= 0;
978                 dst[di++]= 0;
979                 si+=3;
980             }else //next start code
981                 break;
982         }
983
984         dst[di++]= src[si++];
985     }
986
987     *dst_length= di;
988     *consumed= si + 1;//+1 for the header
989 //FIXME store exact number of bits in the getbitcontext (its needed for decoding)
990     return dst;
991 }
992
993 /**
994  * @param src the data which should be escaped
995  * @param dst the target buffer, dst+1 == src is allowed as a special case
996  * @param length the length of the src data
997  * @param dst_length the length of the dst array
998  * @returns length of escaped data in bytes or -1 if an error occured
999  */
1000 static int encode_nal(H264Context *h, uint8_t *dst, uint8_t *src, int length, int dst_length){
1001     int i, escape_count, si, di;
1002     uint8_t *temp;
1003     
1004     assert(length>=0);
1005     assert(dst_length>0);
1006     
1007     dst[0]= (h->nal_ref_idc<<5) + h->nal_unit_type;
1008
1009     if(length==0) return 1;
1010
1011     escape_count= 0;
1012     for(i=0; i<length; i+=2){
1013         if(src[i]) continue;
1014         if(i>0 && src[i-1]==0) 
1015             i--;
1016         if(i+2<length && src[i+1]==0 && src[i+2]<=3){
1017             escape_count++;
1018             i+=2;
1019         }
1020     }
1021     
1022     if(escape_count==0){ 
1023         if(dst+1 != src)
1024             memcpy(dst+1, src, length);
1025         return length + 1;
1026     }
1027     
1028     if(length + escape_count + 1> dst_length)
1029         return -1;
1030
1031     //this should be damn rare (hopefully)
1032
1033     h->rbsp_buffer= av_fast_realloc(h->rbsp_buffer, &h->rbsp_buffer_size, length + escape_count);
1034     temp= h->rbsp_buffer;
1035 //printf("encoding esc\n");
1036     
1037     si= 0;
1038     di= 0;
1039     while(si < length){
1040         if(si+2<length && src[si]==0 && src[si+1]==0 && src[si+2]<=3){
1041             temp[di++]= 0; si++;
1042             temp[di++]= 0; si++;
1043             temp[di++]= 3; 
1044             temp[di++]= src[si++];
1045         }
1046         else
1047             temp[di++]= src[si++];
1048     }
1049     memcpy(dst+1, temp, length+escape_count);
1050     
1051     assert(di == length+escape_count);
1052     
1053     return di + 1;
1054 }
1055
1056 /**
1057  * write 1,10,100,1000,... for alignment, yes its exactly inverse to mpeg4
1058  */
1059 static void encode_rbsp_trailing(PutBitContext *pb){
1060     int length;
1061     put_bits(pb, 1, 1);
1062     length= (-get_bit_count(pb))&7;
1063     if(length) put_bits(pb, length, 0);
1064 }
1065
1066 /**
1067  * identifies the exact end of the bitstream
1068  * @return the length of the trailing, or 0 if damaged
1069  */
1070 static int decode_rbsp_trailing(uint8_t *src){
1071     int v= *src;
1072     int r;
1073
1074     tprintf("rbsp trailing %X\n", v);
1075
1076     for(r=1; r<9; r++){
1077         if(v&1) return r;
1078         v>>=1;
1079     }
1080     return 0;
1081 }
1082
1083 /**
1084  * idct tranforms the 16 dc values and dequantize them.
1085  * @param qp quantization parameter
1086  */
1087 static void h264_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
1088     const int qmul= dequant_coeff[qp][0];
1089 #define stride 16
1090     int i;
1091     int temp[16]; //FIXME check if this is a good idea
1092     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
1093     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
1094
1095 //memset(block, 64, 2*256);
1096 //return;
1097     for(i=0; i<4; i++){
1098         const int offset= y_offset[i];
1099         const int z0= block[offset+stride*0] + block[offset+stride*4];
1100         const int z1= block[offset+stride*0] - block[offset+stride*4];
1101         const int z2= block[offset+stride*1] - block[offset+stride*5];
1102         const int z3= block[offset+stride*1] + block[offset+stride*5];
1103
1104         temp[4*i+0]= z0+z3;
1105         temp[4*i+1]= z1+z2;
1106         temp[4*i+2]= z1-z2;
1107         temp[4*i+3]= z0-z3;
1108     }
1109
1110     for(i=0; i<4; i++){
1111         const int offset= x_offset[i];
1112         const int z0= temp[4*0+i] + temp[4*2+i];
1113         const int z1= temp[4*0+i] - temp[4*2+i];
1114         const int z2= temp[4*1+i] - temp[4*3+i];
1115         const int z3= temp[4*1+i] + temp[4*3+i];
1116
1117         block[stride*0 +offset]= ((z0 + z3)*qmul + 2)>>2; //FIXME think about merging this into decode_resdual
1118         block[stride*2 +offset]= ((z1 + z2)*qmul + 2)>>2;
1119         block[stride*8 +offset]= ((z1 - z2)*qmul + 2)>>2;
1120         block[stride*10+offset]= ((z0 - z3)*qmul + 2)>>2;
1121     }
1122 }
1123
1124 /**
1125  * dct tranforms the 16 dc values.
1126  * @param qp quantization parameter ??? FIXME
1127  */
1128 static void h264_luma_dc_dct_c(DCTELEM *block/*, int qp*/){
1129 //    const int qmul= dequant_coeff[qp][0];
1130     int i;
1131     int temp[16]; //FIXME check if this is a good idea
1132     static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
1133     static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
1134
1135     for(i=0; i<4; i++){
1136         const int offset= y_offset[i];
1137         const int z0= block[offset+stride*0] + block[offset+stride*4];
1138         const int z1= block[offset+stride*0] - block[offset+stride*4];
1139         const int z2= block[offset+stride*1] - block[offset+stride*5];
1140         const int z3= block[offset+stride*1] + block[offset+stride*5];
1141
1142         temp[4*i+0]= z0+z3;
1143         temp[4*i+1]= z1+z2;
1144         temp[4*i+2]= z1-z2;
1145         temp[4*i+3]= z0-z3;
1146     }
1147
1148     for(i=0; i<4; i++){
1149         const int offset= x_offset[i];
1150         const int z0= temp[4*0+i] + temp[4*2+i];
1151         const int z1= temp[4*0+i] - temp[4*2+i];
1152         const int z2= temp[4*1+i] - temp[4*3+i];
1153         const int z3= temp[4*1+i] + temp[4*3+i];
1154
1155         block[stride*0 +offset]= (z0 + z3)>>1;
1156         block[stride*2 +offset]= (z1 + z2)>>1;
1157         block[stride*8 +offset]= (z1 - z2)>>1;
1158         block[stride*10+offset]= (z0 - z3)>>1;
1159     }
1160 }
1161 #undef xStride
1162 #undef stride
1163
1164 static void chroma_dc_dequant_idct_c(DCTELEM *block, int qp){
1165     const int qmul= dequant_coeff[qp][0];
1166     const int stride= 16*2;
1167     const int xStride= 16;
1168     int a,b,c,d,e;
1169
1170     a= block[stride*0 + xStride*0];
1171     b= block[stride*0 + xStride*1];
1172     c= block[stride*1 + xStride*0];
1173     d= block[stride*1 + xStride*1];
1174
1175     e= a-b;
1176     a= a+b;
1177     b= c-d;
1178     c= c+d;
1179
1180     block[stride*0 + xStride*0]= ((a+c)*qmul + 0)>>1;
1181     block[stride*0 + xStride*1]= ((e+b)*qmul + 0)>>1;
1182     block[stride*1 + xStride*0]= ((a-c)*qmul + 0)>>1;
1183     block[stride*1 + xStride*1]= ((e-b)*qmul + 0)>>1;
1184 }
1185
1186 static void chroma_dc_dct_c(DCTELEM *block){
1187     const int stride= 16*2;
1188     const int xStride= 16;
1189     int a,b,c,d,e;
1190
1191     a= block[stride*0 + xStride*0];
1192     b= block[stride*0 + xStride*1];
1193     c= block[stride*1 + xStride*0];
1194     d= block[stride*1 + xStride*1];
1195
1196     e= a-b;
1197     a= a+b;
1198     b= c-d;
1199     c= c+d;
1200
1201     block[stride*0 + xStride*0]= (a+c);
1202     block[stride*0 + xStride*1]= (e+b);
1203     block[stride*1 + xStride*0]= (a-c);
1204     block[stride*1 + xStride*1]= (e-b);
1205 }
1206
1207 /**
1208  * gets the chroma qp.
1209  */
1210 static inline int get_chroma_qp(H264Context *h, int qscale){
1211     
1212     return chroma_qp[clip(qscale + h->pps.chroma_qp_index_offset, 0, 51)];
1213 }
1214
1215
1216 /**
1217  *
1218  */
1219 static void h264_add_idct_c(uint8_t *dst, DCTELEM *block, int stride){
1220     int i;
1221     uint8_t *cm = cropTbl + MAX_NEG_CROP;
1222
1223     block[0] += 32;
1224 #if 1
1225     for(i=0; i<4; i++){
1226         const int z0=  block[i + 4*0]     +  block[i + 4*2];
1227         const int z1=  block[i + 4*0]     -  block[i + 4*2];
1228         const int z2= (block[i + 4*1]>>1) -  block[i + 4*3];
1229         const int z3=  block[i + 4*1]     + (block[i + 4*3]>>1);
1230
1231         block[i + 4*0]= z0 + z3;
1232         block[i + 4*1]= z1 + z2;
1233         block[i + 4*2]= z1 - z2;
1234         block[i + 4*3]= z0 - z3;
1235     }
1236
1237     for(i=0; i<4; i++){
1238         const int z0=  block[0 + 4*i]     +  block[2 + 4*i];
1239         const int z1=  block[0 + 4*i]     -  block[2 + 4*i];
1240         const int z2= (block[1 + 4*i]>>1) -  block[3 + 4*i];
1241         const int z3=  block[1 + 4*i]     + (block[3 + 4*i]>>1);
1242
1243         dst[0 + i*stride]= cm[ dst[0 + i*stride] + ((z0 + z3) >> 6) ];
1244         dst[1 + i*stride]= cm[ dst[1 + i*stride] + ((z1 + z2) >> 6) ];
1245         dst[2 + i*stride]= cm[ dst[2 + i*stride] + ((z1 - z2) >> 6) ];
1246         dst[3 + i*stride]= cm[ dst[3 + i*stride] + ((z0 - z3) >> 6) ];
1247     }
1248 #else
1249     for(i=0; i<4; i++){
1250         const int z0=  block[0 + 4*i]     +  block[2 + 4*i];
1251         const int z1=  block[0 + 4*i]     -  block[2 + 4*i];
1252         const int z2= (block[1 + 4*i]>>1) -  block[3 + 4*i];
1253         const int z3=  block[1 + 4*i]     + (block[3 + 4*i]>>1);
1254
1255         block[0 + 4*i]= z0 + z3;
1256         block[1 + 4*i]= z1 + z2;
1257         block[2 + 4*i]= z1 - z2;
1258         block[3 + 4*i]= z0 - z3;
1259     }
1260
1261     for(i=0; i<4; i++){
1262         const int z0=  block[i + 4*0]     +  block[i + 4*2];
1263         const int z1=  block[i + 4*0]     -  block[i + 4*2];
1264         const int z2= (block[i + 4*1]>>1) -  block[i + 4*3];
1265         const int z3=  block[i + 4*1]     + (block[i + 4*3]>>1);
1266
1267         dst[i + 0*stride]= cm[ dst[i + 0*stride] + ((z0 + z3) >> 6) ];
1268         dst[i + 1*stride]= cm[ dst[i + 1*stride] + ((z1 + z2) >> 6) ];
1269         dst[i + 2*stride]= cm[ dst[i + 2*stride] + ((z1 - z2) >> 6) ];
1270         dst[i + 3*stride]= cm[ dst[i + 3*stride] + ((z0 - z3) >> 6) ];
1271     }
1272 #endif
1273 }
1274
1275 static void h264_diff_dct_c(DCTELEM *block, uint8_t *src1, uint8_t *src2, int stride){
1276     int i;
1277     //FIXME try int temp instead of block
1278     
1279     for(i=0; i<4; i++){
1280         const int d0= src1[0 + i*stride] - src2[0 + i*stride];
1281         const int d1= src1[1 + i*stride] - src2[1 + i*stride];
1282         const int d2= src1[2 + i*stride] - src2[2 + i*stride];
1283         const int d3= src1[3 + i*stride] - src2[3 + i*stride];
1284         const int z0= d0 + d3;
1285         const int z3= d0 - d3;
1286         const int z1= d1 + d2;
1287         const int z2= d1 - d2;
1288         
1289         block[0 + 4*i]=   z0 +   z1;
1290         block[1 + 4*i]= 2*z3 +   z2;
1291         block[2 + 4*i]=   z0 -   z1;
1292         block[3 + 4*i]=   z3 - 2*z2;
1293     }    
1294
1295     for(i=0; i<4; i++){
1296         const int z0= block[0*4 + i] + block[3*4 + i];
1297         const int z3= block[0*4 + i] - block[3*4 + i];
1298         const int z1= block[1*4 + i] + block[2*4 + i];
1299         const int z2= block[1*4 + i] - block[2*4 + i];
1300         
1301         block[0*4 + i]=   z0 +   z1;
1302         block[1*4 + i]= 2*z3 +   z2;
1303         block[2*4 + i]=   z0 -   z1;
1304         block[3*4 + i]=   z3 - 2*z2;
1305     }
1306 }
1307
1308 //FIXME need to check that this doesnt overflow signed 32 bit for low qp, iam not sure, its very close
1309 //FIXME check that gcc inlines this (and optimizes intra & seperate_dc stuff away)
1310 static inline int quantize_c(DCTELEM *block, uint8_t *scantable, int qscale, int intra, int seperate_dc){
1311     int i;
1312     const int * const quant_table= quant_coeff[qscale];
1313     const int bias= intra ? (1<<QUANT_SHIFT)/3 : (1<<QUANT_SHIFT)/6;
1314     const unsigned int threshold1= (1<<QUANT_SHIFT) - bias - 1;
1315     const unsigned int threshold2= (threshold1<<1);
1316     int last_non_zero;
1317
1318     if(seperate_dc){
1319         if(qscale<=18){
1320             //avoid overflows
1321             const int dc_bias= intra ? (1<<(QUANT_SHIFT-2))/3 : (1<<(QUANT_SHIFT-2))/6;
1322             const unsigned int dc_threshold1= (1<<(QUANT_SHIFT-2)) - dc_bias - 1;
1323             const unsigned int dc_threshold2= (dc_threshold1<<1);
1324
1325             int level= block[0]*quant_coeff[qscale+18][0];
1326             if(((unsigned)(level+dc_threshold1))>dc_threshold2){
1327                 if(level>0){
1328                     level= (dc_bias + level)>>(QUANT_SHIFT-2);
1329                     block[0]= level;
1330                 }else{
1331                     level= (dc_bias - level)>>(QUANT_SHIFT-2);
1332                     block[0]= -level;
1333                 }
1334 //                last_non_zero = i;
1335             }else{
1336                 block[0]=0;
1337             }
1338         }else{
1339             const int dc_bias= intra ? (1<<(QUANT_SHIFT+1))/3 : (1<<(QUANT_SHIFT+1))/6;
1340             const unsigned int dc_threshold1= (1<<(QUANT_SHIFT+1)) - dc_bias - 1;
1341             const unsigned int dc_threshold2= (dc_threshold1<<1);
1342
1343             int level= block[0]*quant_table[0];
1344             if(((unsigned)(level+dc_threshold1))>dc_threshold2){
1345                 if(level>0){
1346                     level= (dc_bias + level)>>(QUANT_SHIFT+1);
1347                     block[0]= level;
1348                 }else{
1349                     level= (dc_bias - level)>>(QUANT_SHIFT+1);
1350                     block[0]= -level;
1351                 }
1352 //                last_non_zero = i;
1353             }else{
1354                 block[0]=0;
1355             }
1356         }
1357         last_non_zero= 0;
1358         i=1;
1359     }else{
1360         last_non_zero= -1;
1361         i=0;
1362     }
1363
1364     for(; i<16; i++){
1365         const int j= scantable[i];
1366         int level= block[j]*quant_table[j];
1367
1368 //        if(   bias+level >= (1<<(QMAT_SHIFT - 3))
1369 //           || bias-level >= (1<<(QMAT_SHIFT - 3))){
1370         if(((unsigned)(level+threshold1))>threshold2){
1371             if(level>0){
1372                 level= (bias + level)>>QUANT_SHIFT;
1373                 block[j]= level;
1374             }else{
1375                 level= (bias - level)>>QUANT_SHIFT;
1376                 block[j]= -level;
1377             }
1378             last_non_zero = i;
1379         }else{
1380             block[j]=0;
1381         }
1382     }
1383
1384     return last_non_zero;
1385 }
1386
1387 static void pred4x4_vertical_c(uint8_t *src, uint8_t *topright, int stride){
1388     const uint32_t a= ((uint32_t*)(src-stride))[0];
1389     ((uint32_t*)(src+0*stride))[0]= a;
1390     ((uint32_t*)(src+1*stride))[0]= a;
1391     ((uint32_t*)(src+2*stride))[0]= a;
1392     ((uint32_t*)(src+3*stride))[0]= a;
1393 }
1394
1395 static void pred4x4_horizontal_c(uint8_t *src, uint8_t *topright, int stride){
1396     ((uint32_t*)(src+0*stride))[0]= src[-1+0*stride]*0x01010101;
1397     ((uint32_t*)(src+1*stride))[0]= src[-1+1*stride]*0x01010101;
1398     ((uint32_t*)(src+2*stride))[0]= src[-1+2*stride]*0x01010101;
1399     ((uint32_t*)(src+3*stride))[0]= src[-1+3*stride]*0x01010101;
1400 }
1401
1402 static void pred4x4_dc_c(uint8_t *src, uint8_t *topright, int stride){
1403     const int dc= (  src[-stride] + src[1-stride] + src[2-stride] + src[3-stride]
1404                    + src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 4) >>3;
1405     
1406     ((uint32_t*)(src+0*stride))[0]= 
1407     ((uint32_t*)(src+1*stride))[0]= 
1408     ((uint32_t*)(src+2*stride))[0]= 
1409     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
1410 }
1411
1412 static void pred4x4_left_dc_c(uint8_t *src, uint8_t *topright, int stride){
1413     const int dc= (  src[-1+0*stride] + src[-1+1*stride] + src[-1+2*stride] + src[-1+3*stride] + 2) >>2;
1414     
1415     ((uint32_t*)(src+0*stride))[0]= 
1416     ((uint32_t*)(src+1*stride))[0]= 
1417     ((uint32_t*)(src+2*stride))[0]= 
1418     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
1419 }
1420
1421 static void pred4x4_top_dc_c(uint8_t *src, uint8_t *topright, int stride){
1422     const int dc= (  src[-stride] + src[1-stride] + src[2-stride] + src[3-stride] + 2) >>2;
1423     
1424     ((uint32_t*)(src+0*stride))[0]= 
1425     ((uint32_t*)(src+1*stride))[0]= 
1426     ((uint32_t*)(src+2*stride))[0]= 
1427     ((uint32_t*)(src+3*stride))[0]= dc* 0x01010101; 
1428 }
1429
1430 static void pred4x4_128_dc_c(uint8_t *src, uint8_t *topright, int stride){
1431     ((uint32_t*)(src+0*stride))[0]= 
1432     ((uint32_t*)(src+1*stride))[0]= 
1433     ((uint32_t*)(src+2*stride))[0]= 
1434     ((uint32_t*)(src+3*stride))[0]= 128U*0x01010101U;
1435 }
1436
1437
1438 #define LOAD_TOP_RIGHT_EDGE\
1439     const int t4= topright[0];\
1440     const int t5= topright[1];\
1441     const int t6= topright[2];\
1442     const int t7= topright[3];\
1443
1444 #define LOAD_LEFT_EDGE\
1445     const int l0= src[-1+0*stride];\
1446     const int l1= src[-1+1*stride];\
1447     const int l2= src[-1+2*stride];\
1448     const int l3= src[-1+3*stride];\
1449
1450 #define LOAD_TOP_EDGE\
1451     const int t0= src[ 0-1*stride];\
1452     const int t1= src[ 1-1*stride];\
1453     const int t2= src[ 2-1*stride];\
1454     const int t3= src[ 3-1*stride];\
1455
1456 static void pred4x4_down_right_c(uint8_t *src, uint8_t *topright, int stride){
1457     const int lt= src[-1-1*stride];
1458     LOAD_TOP_EDGE
1459     LOAD_LEFT_EDGE
1460
1461     src[0+3*stride]=(l3 + 2*l2 + l1 + 2)>>2; 
1462     src[0+2*stride]=
1463     src[1+3*stride]=(l2 + 2*l1 + l0 + 2)>>2; 
1464     src[0+1*stride]=
1465     src[1+2*stride]=
1466     src[2+3*stride]=(l1 + 2*l0 + lt + 2)>>2; 
1467     src[0+0*stride]=
1468     src[1+1*stride]=
1469     src[2+2*stride]=
1470     src[3+3*stride]=(l0 + 2*lt + t0 + 2)>>2; 
1471     src[1+0*stride]=
1472     src[2+1*stride]=
1473     src[3+2*stride]=(lt + 2*t0 + t1 + 2)>>2;
1474     src[2+0*stride]=
1475     src[3+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
1476     src[3+0*stride]=(t1 + 2*t2 + t3 + 2)>>2;
1477 };
1478
1479 static void pred4x4_down_left_c(uint8_t *src, uint8_t *topright, int stride){
1480     LOAD_TOP_EDGE    
1481     LOAD_TOP_RIGHT_EDGE    
1482 //    LOAD_LEFT_EDGE    
1483
1484     src[0+0*stride]=(t0 + t2 + 2*t1 + 2)>>2;
1485     src[1+0*stride]=
1486     src[0+1*stride]=(t1 + t3 + 2*t2 + 2)>>2;
1487     src[2+0*stride]=
1488     src[1+1*stride]=
1489     src[0+2*stride]=(t2 + t4 + 2*t3 + 2)>>2;
1490     src[3+0*stride]=
1491     src[2+1*stride]=
1492     src[1+2*stride]=
1493     src[0+3*stride]=(t3 + t5 + 2*t4 + 2)>>2;
1494     src[3+1*stride]=
1495     src[2+2*stride]=
1496     src[1+3*stride]=(t4 + t6 + 2*t5 + 2)>>2;
1497     src[3+2*stride]=
1498     src[2+3*stride]=(t5 + t7 + 2*t6 + 2)>>2;
1499     src[3+3*stride]=(t6 + 3*t7 + 2)>>2;
1500 };
1501
1502 static void pred4x4_vertical_right_c(uint8_t *src, uint8_t *topright, int stride){
1503     const int lt= src[-1-1*stride];
1504     LOAD_TOP_EDGE    
1505     LOAD_LEFT_EDGE    
1506     const __attribute__((unused)) int unu= l3;
1507
1508     src[0+0*stride]=
1509     src[1+2*stride]=(lt + t0 + 1)>>1;
1510     src[1+0*stride]=
1511     src[2+2*stride]=(t0 + t1 + 1)>>1;
1512     src[2+0*stride]=
1513     src[3+2*stride]=(t1 + t2 + 1)>>1;
1514     src[3+0*stride]=(t2 + t3 + 1)>>1;
1515     src[0+1*stride]=
1516     src[1+3*stride]=(l0 + 2*lt + t0 + 2)>>2;
1517     src[1+1*stride]=
1518     src[2+3*stride]=(lt + 2*t0 + t1 + 2)>>2;
1519     src[2+1*stride]=
1520     src[3+3*stride]=(t0 + 2*t1 + t2 + 2)>>2;
1521     src[3+1*stride]=(t1 + 2*t2 + t3 + 2)>>2;
1522     src[0+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
1523     src[0+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
1524 };
1525
1526 static void pred4x4_vertical_left_c(uint8_t *src, uint8_t *topright, int stride){
1527     LOAD_TOP_EDGE    
1528     LOAD_TOP_RIGHT_EDGE    
1529     const __attribute__((unused)) int unu= t7;
1530
1531     src[0+0*stride]=(t0 + t1 + 1)>>1;
1532     src[1+0*stride]=
1533     src[0+2*stride]=(t1 + t2 + 1)>>1;
1534     src[2+0*stride]=
1535     src[1+2*stride]=(t2 + t3 + 1)>>1;
1536     src[3+0*stride]=
1537     src[2+2*stride]=(t3 + t4+ 1)>>1;
1538     src[3+2*stride]=(t4 + t5+ 1)>>1;
1539     src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
1540     src[1+1*stride]=
1541     src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
1542     src[2+1*stride]=
1543     src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
1544     src[3+1*stride]=
1545     src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
1546     src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
1547 };
1548
1549 static void pred4x4_horizontal_up_c(uint8_t *src, uint8_t *topright, int stride){
1550     LOAD_LEFT_EDGE    
1551
1552     src[0+0*stride]=(l0 + l1 + 1)>>1;
1553     src[1+0*stride]=(l0 + 2*l1 + l2 + 2)>>2;
1554     src[2+0*stride]=
1555     src[0+1*stride]=(l1 + l2 + 1)>>1;
1556     src[3+0*stride]=
1557     src[1+1*stride]=(l1 + 2*l2 + l3 + 2)>>2;
1558     src[2+1*stride]=
1559     src[0+2*stride]=(l2 + l3 + 1)>>1;
1560     src[3+1*stride]=
1561     src[1+2*stride]=(l2 + 2*l3 + l3 + 2)>>2;
1562     src[3+2*stride]=
1563     src[1+3*stride]=
1564     src[0+3*stride]=
1565     src[2+2*stride]=
1566     src[2+3*stride]=
1567     src[3+3*stride]=l3;
1568 };
1569     
1570 static void pred4x4_horizontal_down_c(uint8_t *src, uint8_t *topright, int stride){
1571     const int lt= src[-1-1*stride];
1572     LOAD_TOP_EDGE    
1573     LOAD_LEFT_EDGE    
1574     const __attribute__((unused)) int unu= t3;
1575
1576     src[0+0*stride]=
1577     src[2+1*stride]=(lt + l0 + 1)>>1;
1578     src[1+0*stride]=
1579     src[3+1*stride]=(l0 + 2*lt + t0 + 2)>>2;
1580     src[2+0*stride]=(lt + 2*t0 + t1 + 2)>>2;
1581     src[3+0*stride]=(t0 + 2*t1 + t2 + 2)>>2;
1582     src[0+1*stride]=
1583     src[2+2*stride]=(l0 + l1 + 1)>>1;
1584     src[1+1*stride]=
1585     src[3+2*stride]=(lt + 2*l0 + l1 + 2)>>2;
1586     src[0+2*stride]=
1587     src[2+3*stride]=(l1 + l2+ 1)>>1;
1588     src[1+2*stride]=
1589     src[3+3*stride]=(l0 + 2*l1 + l2 + 2)>>2;
1590     src[0+3*stride]=(l2 + l3 + 1)>>1;
1591     src[1+3*stride]=(l1 + 2*l2 + l3 + 2)>>2;
1592 };
1593
1594 static void pred16x16_vertical_c(uint8_t *src, int stride){
1595     int i;
1596     const uint32_t a= ((uint32_t*)(src-stride))[0];
1597     const uint32_t b= ((uint32_t*)(src-stride))[1];
1598     const uint32_t c= ((uint32_t*)(src-stride))[2];
1599     const uint32_t d= ((uint32_t*)(src-stride))[3];
1600     
1601     for(i=0; i<16; i++){
1602         ((uint32_t*)(src+i*stride))[0]= a;
1603         ((uint32_t*)(src+i*stride))[1]= b;
1604         ((uint32_t*)(src+i*stride))[2]= c;
1605         ((uint32_t*)(src+i*stride))[3]= d;
1606     }
1607 }
1608
1609 static void pred16x16_horizontal_c(uint8_t *src, int stride){
1610     int i;
1611
1612     for(i=0; i<16; i++){
1613         ((uint32_t*)(src+i*stride))[0]=
1614         ((uint32_t*)(src+i*stride))[1]=
1615         ((uint32_t*)(src+i*stride))[2]=
1616         ((uint32_t*)(src+i*stride))[3]= src[-1+i*stride]*0x01010101;
1617     }
1618 }
1619
1620 static void pred16x16_dc_c(uint8_t *src, int stride){
1621     int i, dc=0;
1622
1623     for(i=0;i<16; i++){
1624         dc+= src[-1+i*stride];
1625     }
1626     
1627     for(i=0;i<16; i++){
1628         dc+= src[i-stride];
1629     }
1630
1631     dc= 0x01010101*((dc + 16)>>5);
1632
1633     for(i=0; i<16; i++){
1634         ((uint32_t*)(src+i*stride))[0]=
1635         ((uint32_t*)(src+i*stride))[1]=
1636         ((uint32_t*)(src+i*stride))[2]=
1637         ((uint32_t*)(src+i*stride))[3]= dc;
1638     }
1639 }
1640
1641 static void pred16x16_left_dc_c(uint8_t *src, int stride){
1642     int i, dc=0;
1643
1644     for(i=0;i<16; i++){
1645         dc+= src[-1+i*stride];
1646     }
1647     
1648     dc= 0x01010101*((dc + 8)>>4);
1649
1650     for(i=0; i<16; i++){
1651         ((uint32_t*)(src+i*stride))[0]=
1652         ((uint32_t*)(src+i*stride))[1]=
1653         ((uint32_t*)(src+i*stride))[2]=
1654         ((uint32_t*)(src+i*stride))[3]= dc;
1655     }
1656 }
1657
1658 static void pred16x16_top_dc_c(uint8_t *src, int stride){
1659     int i, dc=0;
1660
1661     for(i=0;i<16; i++){
1662         dc+= src[i-stride];
1663     }
1664     dc= 0x01010101*((dc + 8)>>4);
1665
1666     for(i=0; i<16; i++){
1667         ((uint32_t*)(src+i*stride))[0]=
1668         ((uint32_t*)(src+i*stride))[1]=
1669         ((uint32_t*)(src+i*stride))[2]=
1670         ((uint32_t*)(src+i*stride))[3]= dc;
1671     }
1672 }
1673
1674 static void pred16x16_128_dc_c(uint8_t *src, int stride){
1675     int i;
1676
1677     for(i=0; i<16; i++){
1678         ((uint32_t*)(src+i*stride))[0]=
1679         ((uint32_t*)(src+i*stride))[1]=
1680         ((uint32_t*)(src+i*stride))[2]=
1681         ((uint32_t*)(src+i*stride))[3]= 0x01010101U*128U;
1682     }
1683 }
1684
1685 static void pred16x16_plane_c(uint8_t *src, int stride){
1686     uint8_t *cm = cropTbl + MAX_NEG_CROP;
1687     int i, dx, dy, dc;
1688     int temp[16];
1689     
1690     dc= 16*(src[15-stride] + src[-1+15*stride]);
1691     
1692     dx=dy=0;
1693     for(i=1; i<9; i++){
1694         dx += i*(src[7+i-stride] - src[7-i-stride]);
1695         dy += i*(src[-1+(7+i)*stride] - src[-1+(7-i)*stride]);
1696     }
1697     dx= (5*dx+32)>>6;
1698     dy= (5*dy+32)>>6;
1699     
1700     dc += 16;
1701
1702     //FIXME modifiy dc,dx,dy to avoid -7
1703     
1704     for(i=0; i<16; i++)
1705         temp[i]= dx*(i-7) + dc;
1706     
1707     if(   (dc - ABS(dx)*8 - ABS(dy)*8)>>5 < 0
1708        || (dc + ABS(dx)*8 + ABS(dy)*8)>>5 > 255){
1709     
1710         for(i=0; i<16; i++){
1711             int j;
1712             for(j=0; j<16; j++)
1713                 src[j + i*stride]= cm[ (temp[j] + dy*(i-7))>>5 ];
1714         }
1715     }else{
1716         for(i=0; i<16; i++){
1717             int j;
1718             for(j=0; j<16; j++)
1719                 src[j + i*stride]= (temp[j] + dy*(i-7))>>5;
1720         }
1721     }
1722 }
1723
1724 static void pred8x8_vertical_c(uint8_t *src, int stride){
1725     int i;
1726     const uint32_t a= ((uint32_t*)(src-stride))[0];
1727     const uint32_t b= ((uint32_t*)(src-stride))[1];
1728     
1729     for(i=0; i<8; i++){
1730         ((uint32_t*)(src+i*stride))[0]= a;
1731         ((uint32_t*)(src+i*stride))[1]= b;
1732     }
1733 }
1734
1735 static void pred8x8_horizontal_c(uint8_t *src, int stride){
1736     int i;
1737
1738     for(i=0; i<8; i++){
1739         ((uint32_t*)(src+i*stride))[0]=
1740         ((uint32_t*)(src+i*stride))[1]= src[-1+i*stride]*0x01010101;
1741     }
1742 }
1743
1744 static void pred8x8_128_dc_c(uint8_t *src, int stride){
1745     int i;
1746
1747     for(i=0; i<4; i++){
1748         ((uint32_t*)(src+i*stride))[0]= 
1749         ((uint32_t*)(src+i*stride))[1]= 0x01010101U*128U;
1750     }
1751     for(i=4; i<8; i++){
1752         ((uint32_t*)(src+i*stride))[0]= 
1753         ((uint32_t*)(src+i*stride))[1]= 0x01010101U*128U;
1754     }
1755 }
1756
1757 static void pred8x8_left_dc_c(uint8_t *src, int stride){
1758     int i;
1759     int dc0, dc2;
1760
1761     dc0=dc2=0;
1762     for(i=0;i<4; i++){
1763         dc0+= src[-1+i*stride];
1764         dc2+= src[-1+(i+4)*stride];
1765     }
1766     dc0= 0x01010101*((dc0 + 2)>>2);
1767     dc2= 0x01010101*((dc2 + 2)>>2);
1768
1769     for(i=0; i<4; i++){
1770         ((uint32_t*)(src+i*stride))[0]=
1771         ((uint32_t*)(src+i*stride))[1]= dc0;
1772     }
1773     for(i=4; i<8; i++){
1774         ((uint32_t*)(src+i*stride))[0]=
1775         ((uint32_t*)(src+i*stride))[1]= dc2;
1776     }
1777 }
1778
1779 static void pred8x8_top_dc_c(uint8_t *src, int stride){
1780     int i;
1781     int dc0, dc1;
1782
1783     dc0=dc1=0;
1784     for(i=0;i<4; i++){
1785         dc0+= src[i-stride];
1786         dc1+= src[4+i-stride];
1787     }
1788     dc0= 0x01010101*((dc0 + 2)>>2);
1789     dc1= 0x01010101*((dc1 + 2)>>2);
1790
1791     for(i=0; i<4; i++){
1792         ((uint32_t*)(src+i*stride))[0]= dc0;
1793         ((uint32_t*)(src+i*stride))[1]= dc1;
1794     }
1795     for(i=4; i<8; i++){
1796         ((uint32_t*)(src+i*stride))[0]= dc0;
1797         ((uint32_t*)(src+i*stride))[1]= dc1;
1798     }
1799 }
1800
1801
1802 static void pred8x8_dc_c(uint8_t *src, int stride){
1803     int i;
1804     int dc0, dc1, dc2, dc3;
1805
1806     dc0=dc1=dc2=0;
1807     for(i=0;i<4; i++){
1808         dc0+= src[-1+i*stride] + src[i-stride];
1809         dc1+= src[4+i-stride];
1810         dc2+= src[-1+(i+4)*stride];
1811     }
1812     dc3= 0x01010101*((dc1 + dc2 + 4)>>3);
1813     dc0= 0x01010101*((dc0 + 4)>>3);
1814     dc1= 0x01010101*((dc1 + 2)>>2);
1815     dc2= 0x01010101*((dc2 + 2)>>2);
1816
1817     for(i=0; i<4; i++){
1818         ((uint32_t*)(src+i*stride))[0]= dc0;
1819         ((uint32_t*)(src+i*stride))[1]= dc1;
1820     }
1821     for(i=4; i<8; i++){
1822         ((uint32_t*)(src+i*stride))[0]= dc2;
1823         ((uint32_t*)(src+i*stride))[1]= dc3;
1824     }
1825 }
1826
1827 static void pred8x8_plane_c(uint8_t *src, int stride){
1828     uint8_t *cm = cropTbl + MAX_NEG_CROP;
1829     int i, dx, dy, dc;
1830     int temp[8];
1831
1832     dc= 16*(src[7-stride] + src[-1+7*stride]);
1833     
1834     dx=dy=0;
1835     for(i=1; i<5; i++){
1836         dx += i*(src[3+i-stride] - src[3-i-stride]);
1837         dy += i*(src[-1+(3+i)*stride] - src[-1+(3-i)*stride]);
1838     }
1839     dx= (17*dx+16)>>5;
1840     dy= (17*dy+16)>>5;
1841     
1842     dc += 16;
1843     
1844     //FIXME modifiy dc,dx,dy to avoid -3
1845     
1846     for(i=0; i<8; i++)
1847         temp[i]= dx*(i-3) + dc;
1848     
1849     if(   (dc - ABS(dx)*4 - ABS(dy)*4)>>5 < 0
1850        || (dc + ABS(dx)*4 + ABS(dy)*4)>>5 > 255){
1851     
1852         for(i=0; i<8; i++){
1853             int j;
1854             for(j=0; j<8; j++)
1855                 src[j + i*stride]= cm[ (temp[j] + dy*(i-3))>>5 ];
1856         }
1857     }else{
1858         for(i=0; i<8; i++){
1859             int j;
1860             for(j=0; j<8; j++)
1861                 src[j + i*stride]= (temp[j] + dy*(i-3))>>5;
1862         }
1863     }
1864 }
1865
1866 static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, int chroma_height, int delta, int list,
1867                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1868                            int src_x_offset, int src_y_offset,
1869                            qpel_mc_func *qpix_op, h264_chroma_mc_func chroma_op){
1870     MpegEncContext * const s = &h->s;
1871     const int mx= h->mv_cache[list][ scan8[n] ][0] + src_x_offset*8;
1872     const int my= h->mv_cache[list][ scan8[n] ][1] + src_y_offset*8;
1873     const int luma_xy= (mx&3) + ((my&3)<<2);
1874     uint8_t * src_y = pic->data[0] + (mx>>2) + (my>>2)*s->linesize;
1875     uint8_t * src_cb= pic->data[1] + (mx>>3) + (my>>3)*s->uvlinesize;
1876     uint8_t * src_cr= pic->data[2] + (mx>>3) + (my>>3)*s->uvlinesize;
1877     int extra_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; //FIXME increase edge?, IMHO not worth it
1878     int extra_height= extra_width;
1879     int emu=0;
1880     const int full_mx= mx>>2;
1881     const int full_my= my>>2;
1882     
1883     assert(pic->data[0]);
1884     
1885     if(mx&7) extra_width -= 3;
1886     if(my&7) extra_height -= 3;
1887     
1888     if(   full_mx < 0-extra_width 
1889        || full_my < 0-extra_height 
1890        || full_mx + 16/*FIXME*/ > s->width + extra_width 
1891        || full_my + 16/*FIXME*/ > s->height + extra_height){
1892         ff_emulated_edge_mc(s, src_y - 2 - 2*s->linesize, s->linesize, 16+5, 16+5/*FIXME*/, full_mx-2, full_my-2, s->width, s->height);
1893             src_y= s->edge_emu_buffer + 2 + 2*s->linesize;
1894         emu=1;
1895     }
1896     
1897     qpix_op[luma_xy](dest_y, src_y, s->linesize); //FIXME try variable height perhaps?
1898     if(!square){
1899         qpix_op[luma_xy](dest_y + delta, src_y + delta, s->linesize);
1900     }
1901     
1902     if(s->flags&CODEC_FLAG_GRAY) return;
1903     
1904     if(emu){
1905         ff_emulated_edge_mc(s, src_cb, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1);
1906             src_cb= s->edge_emu_buffer;
1907     }
1908     chroma_op(dest_cb, src_cb, s->uvlinesize, chroma_height, mx&7, my&7);
1909
1910     if(emu){
1911         ff_emulated_edge_mc(s, src_cr, s->uvlinesize, 9, 9/*FIXME*/, (mx>>3), (my>>3), s->width>>1, s->height>>1);
1912             src_cr= s->edge_emu_buffer;
1913     }
1914     chroma_op(dest_cr, src_cr, s->uvlinesize, chroma_height, mx&7, my&7);
1915 }
1916
1917 static inline void mc_part(H264Context *h, int n, int square, int chroma_height, int delta,
1918                            uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1919                            int x_offset, int y_offset,
1920                            qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_put,
1921                            qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_avg,
1922                            int list0, int list1){
1923     MpegEncContext * const s = &h->s;
1924     qpel_mc_func *qpix_op=  qpix_put;
1925     h264_chroma_mc_func chroma_op= chroma_put;
1926     
1927     dest_y  += 2*x_offset + 2*y_offset*s->  linesize;
1928     dest_cb +=   x_offset +   y_offset*s->uvlinesize;
1929     dest_cr +=   x_offset +   y_offset*s->uvlinesize;
1930     x_offset += 8*s->mb_x;
1931     y_offset += 8*s->mb_y;
1932     
1933     if(list0){
1934         Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ];
1935         mc_dir_part(h, ref, n, square, chroma_height, delta, 0,
1936                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
1937                            qpix_op, chroma_op);
1938
1939         qpix_op=  qpix_avg;
1940         chroma_op= chroma_avg;
1941     }
1942
1943     if(list1){
1944         Picture *ref= &h->ref_list[1][ h->ref_cache[1][ scan8[n] ] ];
1945         mc_dir_part(h, ref, n, square, chroma_height, delta, 1,
1946                            dest_y, dest_cb, dest_cr, x_offset, y_offset,
1947                            qpix_op, chroma_op);
1948     }
1949 }
1950
1951 static void hl_motion(H264Context *h, uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
1952                       qpel_mc_func (*qpix_put)[16], h264_chroma_mc_func (*chroma_put),
1953                       qpel_mc_func (*qpix_avg)[16], h264_chroma_mc_func (*chroma_avg)){
1954     MpegEncContext * const s = &h->s;
1955     const int mb_xy= s->mb_x + s->mb_y*h->mb_stride;
1956     const int mb_type= s->current_picture.mb_type[mb_xy];
1957     
1958     assert(IS_INTER(mb_type));
1959     
1960     if(IS_16X16(mb_type)){
1961         mc_part(h, 0, 1, 8, 0, dest_y, dest_cb, dest_cr, 0, 0,
1962                 qpix_put[0], chroma_put[0], qpix_avg[0], chroma_avg[0],
1963                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
1964     }else if(IS_16X8(mb_type)){
1965         mc_part(h, 0, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 0,
1966                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
1967                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
1968         mc_part(h, 8, 0, 4, 8, dest_y, dest_cb, dest_cr, 0, 4,
1969                 qpix_put[1], chroma_put[0], qpix_avg[1], chroma_avg[0],
1970                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
1971     }else if(IS_8X16(mb_type)){
1972         mc_part(h, 0, 0, 8, 8*s->linesize, dest_y, dest_cb, dest_cr, 0, 0,
1973                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
1974                 IS_DIR(mb_type, 0, 0), IS_DIR(mb_type, 0, 1));
1975         mc_part(h, 4, 0, 8, 8*s->linesize, dest_y, dest_cb, dest_cr, 4, 0,
1976                 qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
1977                 IS_DIR(mb_type, 1, 0), IS_DIR(mb_type, 1, 1));
1978     }else{
1979         int i;
1980         
1981         assert(IS_8X8(mb_type));
1982
1983         for(i=0; i<4; i++){
1984             const int sub_mb_type= h->sub_mb_type[i];
1985             const int n= 4*i;
1986             int x_offset= (i&1)<<2;
1987             int y_offset= (i&2)<<1;
1988
1989             if(IS_SUB_8X8(sub_mb_type)){
1990                 mc_part(h, n, 1, 4, 0, dest_y, dest_cb, dest_cr, x_offset, y_offset,
1991                     qpix_put[1], chroma_put[1], qpix_avg[1], chroma_avg[1],
1992                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
1993             }else if(IS_SUB_8X4(sub_mb_type)){
1994                 mc_part(h, n  , 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset,
1995                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
1996                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
1997                 mc_part(h, n+2, 0, 2, 4, dest_y, dest_cb, dest_cr, x_offset, y_offset+2,
1998                     qpix_put[2], chroma_put[1], qpix_avg[2], chroma_avg[1],
1999                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2000             }else if(IS_SUB_4X8(sub_mb_type)){
2001                 mc_part(h, n  , 0, 4, 4*s->linesize, dest_y, dest_cb, dest_cr, x_offset, y_offset,
2002                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
2003                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2004                 mc_part(h, n+1, 0, 4, 4*s->linesize, dest_y, dest_cb, dest_cr, x_offset+2, y_offset,
2005                     qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
2006                     IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2007             }else{
2008                 int j;
2009                 assert(IS_SUB_4X4(sub_mb_type));
2010                 for(j=0; j<4; j++){
2011                     int sub_x_offset= x_offset + 2*(j&1);
2012                     int sub_y_offset= y_offset +   (j&2);
2013                     mc_part(h, n+j, 1, 2, 0, dest_y, dest_cb, dest_cr, sub_x_offset, sub_y_offset,
2014                         qpix_put[2], chroma_put[2], qpix_avg[2], chroma_avg[2],
2015                         IS_DIR(sub_mb_type, 0, 0), IS_DIR(sub_mb_type, 0, 1));
2016                 }
2017             }
2018         }
2019     }
2020 }
2021
2022 static void decode_init_vlc(H264Context *h){
2023     static int done = 0;
2024
2025     if (!done) {
2026         int i;
2027         done = 1;
2028
2029         init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5, 
2030                  &chroma_dc_coeff_token_len [0], 1, 1,
2031                  &chroma_dc_coeff_token_bits[0], 1, 1);
2032
2033         for(i=0; i<4; i++){
2034             init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17, 
2035                      &coeff_token_len [i][0], 1, 1,
2036                      &coeff_token_bits[i][0], 1, 1);
2037         }
2038
2039         for(i=0; i<3; i++){
2040             init_vlc(&chroma_dc_total_zeros_vlc[i], CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
2041                      &chroma_dc_total_zeros_len [i][0], 1, 1,
2042                      &chroma_dc_total_zeros_bits[i][0], 1, 1);
2043         }
2044         for(i=0; i<15; i++){
2045             init_vlc(&total_zeros_vlc[i], TOTAL_ZEROS_VLC_BITS, 16, 
2046                      &total_zeros_len [i][0], 1, 1,
2047                      &total_zeros_bits[i][0], 1, 1);
2048         }
2049
2050         for(i=0; i<6; i++){
2051             init_vlc(&run_vlc[i], RUN_VLC_BITS, 7, 
2052                      &run_len [i][0], 1, 1,
2053                      &run_bits[i][0], 1, 1);
2054         }
2055         init_vlc(&run7_vlc, RUN7_VLC_BITS, 16, 
2056                  &run_len [6][0], 1, 1,
2057                  &run_bits[6][0], 1, 1);
2058     }
2059 }
2060
2061 /**
2062  * Sets the intra prediction function pointers.
2063  */
2064 static void init_pred_ptrs(H264Context *h){
2065 //    MpegEncContext * const s = &h->s;
2066
2067     h->pred4x4[VERT_PRED           ]= pred4x4_vertical_c;
2068     h->pred4x4[HOR_PRED            ]= pred4x4_horizontal_c;
2069     h->pred4x4[DC_PRED             ]= pred4x4_dc_c;
2070     h->pred4x4[DIAG_DOWN_LEFT_PRED ]= pred4x4_down_left_c;
2071     h->pred4x4[DIAG_DOWN_RIGHT_PRED]= pred4x4_down_right_c;
2072     h->pred4x4[VERT_RIGHT_PRED     ]= pred4x4_vertical_right_c;
2073     h->pred4x4[HOR_DOWN_PRED       ]= pred4x4_horizontal_down_c;
2074     h->pred4x4[VERT_LEFT_PRED      ]= pred4x4_vertical_left_c;
2075     h->pred4x4[HOR_UP_PRED         ]= pred4x4_horizontal_up_c;
2076     h->pred4x4[LEFT_DC_PRED        ]= pred4x4_left_dc_c;
2077     h->pred4x4[TOP_DC_PRED         ]= pred4x4_top_dc_c;
2078     h->pred4x4[DC_128_PRED         ]= pred4x4_128_dc_c;
2079
2080     h->pred8x8[DC_PRED8x8     ]= pred8x8_dc_c;
2081     h->pred8x8[VERT_PRED8x8   ]= pred8x8_vertical_c;
2082     h->pred8x8[HOR_PRED8x8    ]= pred8x8_horizontal_c;
2083     h->pred8x8[PLANE_PRED8x8  ]= pred8x8_plane_c;
2084     h->pred8x8[LEFT_DC_PRED8x8]= pred8x8_left_dc_c;
2085     h->pred8x8[TOP_DC_PRED8x8 ]= pred8x8_top_dc_c;
2086     h->pred8x8[DC_128_PRED8x8 ]= pred8x8_128_dc_c;
2087
2088     h->pred16x16[DC_PRED8x8     ]= pred16x16_dc_c;
2089     h->pred16x16[VERT_PRED8x8   ]= pred16x16_vertical_c;
2090     h->pred16x16[HOR_PRED8x8    ]= pred16x16_horizontal_c;
2091     h->pred16x16[PLANE_PRED8x8  ]= pred16x16_plane_c;
2092     h->pred16x16[LEFT_DC_PRED8x8]= pred16x16_left_dc_c;
2093     h->pred16x16[TOP_DC_PRED8x8 ]= pred16x16_top_dc_c;
2094     h->pred16x16[DC_128_PRED8x8 ]= pred16x16_128_dc_c;
2095 }
2096
2097 //FIXME factorize
2098 #define CHECKED_ALLOCZ(p, size)\
2099 {\
2100     p= av_mallocz(size);\
2101     if(p==NULL){\
2102         perror("malloc");\
2103         goto fail;\
2104     }\
2105 }
2106
2107 static void free_tables(H264Context *h){
2108     MpegEncContext * const s = &h->s;
2109
2110     av_freep(&h->intra4x4_pred_mode);
2111     av_freep(&h->non_zero_count);
2112     av_freep(&h->slice_table_base);
2113     h->slice_table= NULL;
2114     
2115     av_freep(&h->mb2b_xy);
2116     av_freep(&h->mb2b8_xy);
2117 }
2118
2119 /**
2120  * allocates tables.
2121  * needs widzh/height
2122  */
2123 static int alloc_tables(H264Context *h){
2124     MpegEncContext * const s = &h->s;
2125     const int big_mb_num= h->mb_stride * (s->mb_height+1);
2126     int x,y;
2127
2128     CHECKED_ALLOCZ(h->intra4x4_pred_mode, big_mb_num * 8  * sizeof(uint8_t))
2129     CHECKED_ALLOCZ(h->non_zero_count    , big_mb_num * 16 * sizeof(uint8_t))
2130     CHECKED_ALLOCZ(h->slice_table_base  , big_mb_num * sizeof(uint8_t))
2131
2132     memset(h->slice_table_base, -1, big_mb_num  * sizeof(uint8_t));
2133     h->slice_table= h->slice_table_base + h->mb_stride + 1;
2134
2135     CHECKED_ALLOCZ(h->mb2b_xy  , big_mb_num * sizeof(uint16_t));
2136     CHECKED_ALLOCZ(h->mb2b8_xy , big_mb_num * sizeof(uint16_t));
2137     for(y=0; y<s->mb_height; y++){
2138         for(x=0; x<s->mb_width; x++){
2139             const int mb_xy= x + y*h->mb_stride;
2140             const int b_xy = 4*x + 4*y*h->b_stride;
2141             const int b8_xy= 2*x + 2*y*h->b8_stride;
2142         
2143             h->mb2b_xy [mb_xy]= b_xy;
2144             h->mb2b8_xy[mb_xy]= b8_xy;
2145         }
2146     }
2147     
2148     return 0;
2149 fail:
2150     free_tables(h);
2151     return -1;
2152 }
2153
2154 static void common_init(H264Context *h){
2155     MpegEncContext * const s = &h->s;
2156     int i;
2157
2158     s->width = s->avctx->width;
2159     s->height = s->avctx->height;
2160     s->codec_id= s->avctx->codec->id;
2161     
2162     init_pred_ptrs(h);
2163
2164     s->decode=1; //FIXME
2165 }
2166
2167 static int decode_init(AVCodecContext *avctx){
2168     H264Context *h= avctx->priv_data;
2169     MpegEncContext * const s = &h->s;
2170
2171     s->avctx = avctx;
2172     common_init(h);
2173
2174     s->out_format = FMT_H264;
2175     s->workaround_bugs= avctx->workaround_bugs;
2176
2177     // set defaults
2178     s->progressive_sequence=1;
2179 //    s->decode_mb= ff_h263_decode_mb;
2180     s->low_delay= 1;
2181     avctx->pix_fmt= PIX_FMT_YUV420P;
2182
2183     decode_init_vlc(h);
2184     
2185     return 0;
2186 }
2187
2188 static void frame_start(H264Context *h){
2189     MpegEncContext * const s = &h->s;
2190     int i;
2191
2192     MPV_frame_start(s, s->avctx);
2193     ff_er_frame_start(s);
2194     h->mmco_index=0;
2195
2196     assert(s->linesize && s->uvlinesize);
2197
2198     for(i=0; i<16; i++){
2199         h->block_offset[i]= 4*((scan8[i] - scan8[0])&7) + 4*s->linesize*((scan8[i] - scan8[0])>>3);
2200         h->chroma_subblock_offset[i]= 2*((scan8[i] - scan8[0])&7) + 2*s->uvlinesize*((scan8[i] - scan8[0])>>3);
2201     }
2202     for(i=0; i<4; i++){
2203         h->block_offset[16+i]=
2204         h->block_offset[20+i]= 4*((scan8[i] - scan8[0])&7) + 4*s->uvlinesize*((scan8[i] - scan8[0])>>3);
2205     }
2206
2207 //    s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1;
2208 }
2209
2210 static void hl_decode_mb(H264Context *h){
2211     MpegEncContext * const s = &h->s;
2212     const int mb_x= s->mb_x;
2213     const int mb_y= s->mb_y;
2214     const int mb_xy= mb_x + mb_y*h->mb_stride;
2215     const int mb_type= s->current_picture.mb_type[mb_xy];
2216     uint8_t  *dest_y, *dest_cb, *dest_cr;
2217     int linesize, uvlinesize /*dct_offset*/;
2218     int i;
2219
2220     if(!s->decode)
2221         return;
2222
2223     if(s->mb_skiped){
2224     }
2225
2226     dest_y  = s->current_picture.data[0] + (mb_y * 16* s->linesize  ) + mb_x * 16;
2227     dest_cb = s->current_picture.data[1] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
2228     dest_cr = s->current_picture.data[2] + (mb_y * 8 * s->uvlinesize) + mb_x * 8;
2229
2230     if (h->mb_field_decoding_flag) {
2231         linesize = s->linesize * 2;
2232         uvlinesize = s->uvlinesize * 2;
2233         if(mb_y&1){ //FIXME move out of this func?
2234             dest_y -= s->linesize*15;
2235             dest_cb-= s->linesize*7;
2236             dest_cr-= s->linesize*7;
2237         }
2238     } else {
2239         linesize = s->linesize;
2240         uvlinesize = s->uvlinesize;
2241 //        dct_offset = s->linesize * 16;
2242     }
2243
2244     if(IS_INTRA(mb_type)){
2245         if(!(s->flags&CODEC_FLAG_GRAY)){
2246             h->pred8x8[ h->chroma_pred_mode ](dest_cb, uvlinesize);
2247             h->pred8x8[ h->chroma_pred_mode ](dest_cr, uvlinesize);
2248         }
2249
2250         if(IS_INTRA4x4(mb_type)){
2251             if(!s->encoding){
2252                 for(i=0; i<16; i++){
2253                     uint8_t * const ptr= dest_y + h->block_offset[i];
2254                     uint8_t *topright= ptr + 4 - linesize;
2255                     const int topright_avail= (h->topright_samples_available<<i)&0x8000;
2256                     const int dir= h->intra4x4_pred_mode_cache[ scan8[i] ];
2257                     int tr;
2258
2259                     if(!topright_avail){
2260                         tr= ptr[3 - linesize]*0x01010101;
2261                         topright= (uint8_t*) &tr;
2262                     }
2263
2264                     h->pred4x4[ dir ](ptr, topright, linesize);
2265                     if(h->non_zero_count_cache[ scan8[i] ])
2266                         h264_add_idct_c(ptr, h->mb + i*16, linesize);
2267                 }
2268             }
2269         }else{
2270             h->pred16x16[ h->intra16x16_pred_mode ](dest_y , linesize);
2271             h264_luma_dc_dequant_idct_c(h->mb, s->qscale);
2272         }
2273     }else{
2274         hl_motion(h, dest_y, dest_cb, dest_cr,
2275                   s->dsp.put_h264_qpel_pixels_tab, s->dsp.put_h264_chroma_pixels_tab, 
2276                   s->dsp.avg_h264_qpel_pixels_tab, s->dsp.avg_h264_chroma_pixels_tab);
2277     }
2278
2279
2280     if(!IS_INTRA4x4(mb_type)){
2281         for(i=0; i<16; i++){
2282             if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){ //FIXME benchmark weird rule, & below
2283                 uint8_t * const ptr= dest_y + h->block_offset[i];
2284                 h264_add_idct_c(ptr, h->mb + i*16, linesize);
2285             }
2286         }
2287     }
2288
2289     if(!(s->flags&CODEC_FLAG_GRAY)){
2290         chroma_dc_dequant_idct_c(h->mb + 16*16, h->chroma_qp);
2291         chroma_dc_dequant_idct_c(h->mb + 16*16+4*16, h->chroma_qp);
2292         for(i=16; i<16+4; i++){
2293             if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2294                 uint8_t * const ptr= dest_cb + h->block_offset[i];
2295                 h264_add_idct_c(ptr, h->mb + i*16, uvlinesize);
2296             }
2297         }
2298         for(i=20; i<20+4; i++){
2299             if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
2300                 uint8_t * const ptr= dest_cr + h->block_offset[i];
2301                 h264_add_idct_c(ptr, h->mb + i*16, uvlinesize);
2302             }
2303         }
2304     }
2305 }
2306
2307 static void decode_mb_cabac(H264Context *h){
2308 //    MpegEncContext * const s = &h->s;
2309 }
2310
2311 /**
2312  * fills the default_ref_list.
2313  */
2314 static int fill_default_ref_list(H264Context *h){
2315     MpegEncContext * const s = &h->s;
2316     int i;
2317     Picture sorted_short_ref[16];
2318     
2319     if(h->slice_type==B_TYPE){
2320         int out_i;
2321         int limit= -1;
2322
2323         for(out_i=0; out_i<h->short_ref_count; out_i++){
2324             int best_i=-1;
2325             int best_poc=-1;
2326
2327             for(i=0; i<h->short_ref_count; i++){
2328                 const int poc= h->short_ref[i]->poc;
2329                 if(poc > limit && poc < best_poc){
2330                     best_poc= poc;
2331                     best_i= i;
2332                 }
2333             }
2334             
2335             assert(best_i != -1);
2336             
2337             limit= best_poc;
2338             sorted_short_ref[out_i]= *h->short_ref[best_i];
2339         }
2340     }
2341
2342     if(s->picture_structure == PICT_FRAME){
2343         if(h->slice_type==B_TYPE){
2344             const int current_poc= s->current_picture_ptr->poc;
2345             int list;
2346
2347             for(list=0; list<2; list++){
2348                 int index=0;
2349
2350                 for(i=0; i<h->short_ref_count && index < h->ref_count[list]; i++){
2351                     const int i2= list ? h->short_ref_count - i - 1 : i;
2352                     const int poc= sorted_short_ref[i2].poc;
2353                     
2354                     if(sorted_short_ref[i2].reference != 3) continue; //FIXME refernce field shit
2355
2356                     if((list==1 && poc > current_poc) || (list==0 && poc < current_poc)){
2357                         h->default_ref_list[list][index  ]= sorted_short_ref[i2];
2358                         h->default_ref_list[list][index++].pic_id= sorted_short_ref[i2].frame_num;
2359                     }
2360                 }
2361
2362                 for(i=0; i<h->long_ref_count && index < h->ref_count[ list ]; i++){
2363                     if(h->long_ref[i]->reference != 3) continue;
2364
2365                     h->default_ref_list[ list ][index  ]= *h->long_ref[i];
2366                     h->default_ref_list[ list ][index++].pic_id= i;;
2367                 }
2368                 
2369                 if(h->long_ref_count > 1 && h->short_ref_count==0){
2370                     Picture temp= h->default_ref_list[1][0];
2371                     h->default_ref_list[1][0] = h->default_ref_list[1][1];
2372                     h->default_ref_list[1][0] = temp;
2373                 }
2374
2375                 if(index < h->ref_count[ list ])
2376                     memset(&h->default_ref_list[list][index], 0, sizeof(Picture)*(h->ref_count[ list ] - index));
2377             }
2378         }else{
2379             int index=0;
2380             for(i=0; i<h->short_ref_count && index < h->ref_count[0]; i++){
2381                 if(h->short_ref[i]->reference != 3) continue; //FIXME refernce field shit
2382                 h->default_ref_list[0][index  ]= *h->short_ref[i];
2383                 h->default_ref_list[0][index++].pic_id= h->short_ref[i]->frame_num;
2384             }
2385             for(i=0; i<h->long_ref_count && index < h->ref_count[0]; i++){
2386                 if(h->long_ref[i]->reference != 3) continue;
2387                 h->default_ref_list[0][index  ]= *h->long_ref[i];
2388                 h->default_ref_list[0][index++].pic_id= i;;
2389             }
2390             if(index < h->ref_count[0])
2391                 memset(&h->default_ref_list[0][index], 0, sizeof(Picture)*(h->ref_count[0] - index));
2392         }
2393     }else{ //FIELD
2394         if(h->slice_type==B_TYPE){
2395         }else{
2396             //FIXME second field balh
2397         }
2398     }
2399     return 0;
2400 }
2401
2402 static int decode_ref_pic_list_reordering(H264Context *h){
2403     MpegEncContext * const s = &h->s;
2404     int list;
2405     
2406     if(h->slice_type==I_TYPE || h->slice_type==SI_TYPE) return 0; //FIXME move beofre func
2407     
2408     for(list=0; list<2; list++){
2409         memcpy(h->ref_list[list], h->default_ref_list[list], sizeof(Picture)*h->ref_count[list]);
2410
2411         if(get_bits1(&s->gb)){
2412             int pred= h->curr_pic_num;
2413             int index;
2414
2415             for(index=0; ; index++){
2416                 int reordering_of_pic_nums_idc= get_ue_golomb(&s->gb);
2417                 int pic_id;
2418                 int i;
2419                 
2420                 
2421                 if(index >= h->ref_count[list]){
2422                     fprintf(stderr, "reference count overflow\n");
2423                     return -1;
2424                 }
2425                 
2426                 if(reordering_of_pic_nums_idc<3){
2427                     if(reordering_of_pic_nums_idc<2){
2428                         const int abs_diff_pic_num= get_ue_golomb(&s->gb) + 1;
2429
2430                         if(abs_diff_pic_num >= h->max_pic_num){
2431                             fprintf(stderr, "abs_diff_pic_num overflow\n");
2432                             return -1;
2433                         }
2434
2435                         if(reordering_of_pic_nums_idc == 0) pred-= abs_diff_pic_num;
2436                         else                                pred+= abs_diff_pic_num;
2437                         pred &= h->max_pic_num - 1;
2438                     
2439                         for(i= h->ref_count[list]-1; i>=index; i--){
2440                             if(h->ref_list[list][i].pic_id == pred && h->ref_list[list][i].long_ref==0)
2441                                 break;
2442                         }
2443                     }else{
2444                         pic_id= get_ue_golomb(&s->gb); //long_term_pic_idx
2445
2446                         for(i= h->ref_count[list]-1; i>=index; i--){
2447                             if(h->ref_list[list][i].pic_id == pic_id && h->ref_list[list][i].long_ref==1)
2448                                 break;
2449                         }
2450                     }
2451
2452                     if(i < index){
2453                         fprintf(stderr, "reference picture missing during reorder\n");
2454                         memset(&h->ref_list[list][index], 0, sizeof(Picture)); //FIXME
2455                     }else if(i > index){
2456                         Picture tmp= h->ref_list[list][i];
2457                         for(; i>index; i--){
2458                             h->ref_list[list][i]= h->ref_list[list][i-1];
2459                         }
2460                         h->ref_list[list][index]= tmp;
2461                     }
2462                 }else if(reordering_of_pic_nums_idc==3) 
2463                     break;
2464                 else{
2465                     fprintf(stderr, "illegal reordering_of_pic_nums_idc\n");
2466                     return -1;
2467                 }
2468             }
2469         }
2470
2471         if(h->slice_type!=B_TYPE) break;
2472     }
2473     return 0;    
2474 }
2475
2476 static int pred_weight_table(H264Context *h){
2477     MpegEncContext * const s = &h->s;
2478     int list, i;
2479     
2480     h->luma_log2_weight_denom= get_ue_golomb(&s->gb);
2481     h->chroma_log2_weight_denom= get_ue_golomb(&s->gb);
2482
2483     for(list=0; list<2; list++){
2484         for(i=0; i<h->ref_count[list]; i++){
2485             int luma_weight_flag, chroma_weight_flag;
2486             
2487             luma_weight_flag= get_bits1(&s->gb);
2488             if(luma_weight_flag){
2489                 h->luma_weight[list][i]= get_se_golomb(&s->gb);
2490                 h->luma_offset[list][i]= get_se_golomb(&s->gb);
2491             }
2492
2493             chroma_weight_flag= get_bits1(&s->gb);
2494             if(chroma_weight_flag){
2495                 int j;
2496                 for(j=0; j<2; j++){
2497                     h->chroma_weight[list][i][j]= get_se_golomb(&s->gb);
2498                     h->chroma_offset[list][i][j]= get_se_golomb(&s->gb);
2499                 }
2500             }
2501         }
2502         if(h->slice_type != B_TYPE) break;
2503     }
2504     return 0;
2505 }
2506
2507 /**
2508  * instantaneos decoder refresh.
2509  */
2510 static void idr(H264Context *h){
2511     int i;
2512
2513     for(i=0; i<h->long_ref_count; i++){
2514         h->long_ref[i]->reference=0;
2515         h->long_ref[i]= NULL;
2516     }
2517     h->long_ref_count=0;
2518
2519     for(i=0; i<h->short_ref_count; i++){
2520         h->short_ref[i]->reference=0;
2521         h->short_ref[i]= NULL;
2522     }
2523     h->short_ref_count=0;
2524 }
2525
2526 /**
2527  *
2528  * @return the removed picture or NULL if an error occures
2529  */
2530 static Picture * remove_short(H264Context *h, int frame_num){
2531     MpegEncContext * const s = &h->s;
2532     int i;
2533     
2534     if(s->avctx->debug&FF_DEBUG_MMCO)
2535         printf("remove short %d count %d\n", frame_num, h->short_ref_count);
2536     
2537     for(i=0; i<h->short_ref_count; i++){
2538         Picture *pic= h->short_ref[i];
2539         if(s->avctx->debug&FF_DEBUG_MMCO)
2540             printf("%d %d %X\n", i, pic->frame_num, (int)pic);
2541         if(pic->frame_num == frame_num){
2542             h->short_ref[i]= NULL;
2543             memmove(&h->short_ref[i], &h->short_ref[i+1], (h->short_ref_count - i - 1)*sizeof(Picture*));
2544             h->short_ref_count--;
2545             return pic;
2546         }
2547     }
2548     return NULL;
2549 }
2550
2551 /**
2552  *
2553  * @return the removed picture or NULL if an error occures
2554  */
2555 static Picture * remove_long(H264Context *h, int i){
2556     Picture *pic;
2557
2558     if(i >= h->long_ref_count) return NULL;
2559     pic= h->long_ref[i];
2560     if(pic==NULL) return NULL;
2561     
2562     h->long_ref[i]= NULL;
2563     memmove(&h->long_ref[i], &h->long_ref[i+1], (h->long_ref_count - i - 1)*sizeof(Picture*));
2564     h->long_ref_count--;
2565
2566     return pic;
2567 }
2568
2569 /**
2570  * Executes the reference picture marking (memory management control operations).
2571  */
2572 static int execute_ref_pic_marking(H264Context *h, MMCO *mmco, int mmco_count){
2573     MpegEncContext * const s = &h->s;
2574     int i;
2575     int current_is_long=0;
2576     Picture *pic;
2577     
2578     if((s->avctx->debug&FF_DEBUG_MMCO) && mmco_count==0)
2579         printf("no mmco here\n");
2580         
2581     for(i=0; i<mmco_count; i++){
2582         if(s->avctx->debug&FF_DEBUG_MMCO)
2583             printf("mmco:%d %d %d\n", h->mmco[i].opcode, h->mmco[i].short_frame_num, h->mmco[i].long_index);
2584
2585         switch(mmco[i].opcode){
2586         case MMCO_SHORT2UNUSED:
2587             pic= remove_short(h, mmco[i].short_frame_num);
2588             if(pic==NULL) return -1;
2589             pic->reference= 0;
2590             break;
2591         case MMCO_SHORT2LONG:
2592             pic= remove_long(h, mmco[i].long_index);
2593             if(pic) pic->reference=0;
2594             
2595             h->long_ref[ mmco[i].long_index ]= remove_short(h, mmco[i].short_frame_num);
2596             h->long_ref[ mmco[i].long_index ]->long_ref=1;
2597             break;
2598         case MMCO_LONG2UNUSED:
2599             pic= remove_long(h, mmco[i].long_index);
2600             if(pic==NULL) return -1;
2601             pic->reference= 0;
2602             break;
2603         case MMCO_LONG:
2604             pic= remove_long(h, mmco[i].long_index);
2605             if(pic) pic->reference=0;
2606             
2607             h->long_ref[ mmco[i].long_index ]= s->current_picture_ptr;
2608             h->long_ref[ mmco[i].long_index ]->long_ref=1;
2609             h->long_ref_count++;
2610             
2611             current_is_long=1;
2612             break;
2613         case MMCO_SET_MAX_LONG:
2614             assert(mmco[i].long_index <= 16);
2615             while(mmco[i].long_index < h->long_ref_count){
2616                 pic= remove_long(h, mmco[i].long_index);
2617                 pic->reference=0;
2618             }
2619             while(mmco[i].long_index > h->long_ref_count){
2620                 h->long_ref[ h->long_ref_count++ ]= NULL;
2621             }
2622             break;
2623         case MMCO_RESET:
2624             while(h->short_ref_count){
2625                 pic= remove_short(h, h->short_ref[0]->frame_num);
2626                 pic->reference=0;
2627             }
2628             while(h->long_ref_count){
2629                 pic= remove_long(h, h->long_ref_count-1);
2630                 pic->reference=0;
2631             }
2632             break;
2633         default: assert(0);
2634         }
2635     }
2636     
2637     if(!current_is_long){
2638         pic= remove_short(h, s->current_picture_ptr->frame_num);
2639         if(pic){
2640             pic->reference=0;
2641             fprintf(stderr, "illegal short term buffer state detected\n");
2642         }
2643         
2644         if(h->short_ref_count)
2645             memmove(&h->short_ref[1], &h->short_ref[0], h->short_ref_count*sizeof(Picture*));
2646
2647         h->short_ref[0]= s->current_picture_ptr;
2648         h->short_ref[0]->long_ref=0;
2649         h->short_ref_count++;
2650     }
2651     
2652     return 0; 
2653 }
2654
2655 static int decode_ref_pic_marking(H264Context *h){
2656     MpegEncContext * const s = &h->s;
2657     int i;
2658     
2659     if(h->nal_unit_type == NAL_IDR_SLICE){ //FIXME fields
2660         s->broken_link= get_bits1(&s->gb) -1;
2661         h->mmco[0].long_index= get_bits1(&s->gb) - 1; // current_long_term_idx
2662         if(h->mmco[0].long_index == -1)
2663             h->mmco_index= 0;
2664         else{
2665             h->mmco[0].opcode= MMCO_LONG;
2666             h->mmco_index= 1;
2667         } 
2668     }else{
2669         if(get_bits1(&s->gb)){ // adaptive_ref_pic_marking_mode_flag
2670             for(i= h->mmco_index; i<MAX_MMCO_COUNT; i++) { 
2671                 MMCOOpcode opcode= get_ue_golomb(&s->gb);;
2672
2673                 h->mmco[i].opcode= opcode;
2674                 if(opcode==MMCO_SHORT2UNUSED || opcode==MMCO_SHORT2LONG){
2675                     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
2676 /*                    if(h->mmco[i].short_frame_num >= h->short_ref_count || h->short_ref[ h->mmco[i].short_frame_num ] == NULL){
2677                         fprintf(stderr, "illegal short ref in memory management control operation %d\n", mmco);
2678                         return -1;
2679                     }*/
2680                 }
2681                 if(opcode==MMCO_SHORT2LONG || opcode==MMCO_LONG2UNUSED || opcode==MMCO_LONG || opcode==MMCO_SET_MAX_LONG){
2682                     h->mmco[i].long_index= get_ue_golomb(&s->gb);
2683                     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){
2684                         fprintf(stderr, "illegal long ref in memory management control operation %d\n", opcode);
2685                         return -1;
2686                     }
2687                 }
2688                     
2689                 if(opcode > MMCO_LONG){
2690                     fprintf(stderr, "illegal memory management control operation %d\n", opcode);
2691                     return -1;
2692                 }
2693             }
2694             h->mmco_index= i;
2695         }else{
2696             assert(h->long_ref_count + h->short_ref_count <= h->sps.ref_frame_count);
2697
2698             if(h->long_ref_count + h->short_ref_count == h->sps.ref_frame_count){ //FIXME fields
2699                 h->mmco[0].opcode= MMCO_SHORT2UNUSED;
2700                 h->mmco[0].short_frame_num= h->short_ref[ h->short_ref_count - 1 ]->frame_num;
2701                 h->mmco_index= 1;
2702             }else
2703                 h->mmco_index= 0;
2704         }
2705     }
2706     
2707     return 0; 
2708 }
2709
2710 static int init_poc(H264Context *h){
2711     MpegEncContext * const s = &h->s;
2712     const int max_frame_num= 1<<h->sps.log2_max_frame_num;
2713     int field_poc[2];
2714
2715     if(h->nal_unit_type == NAL_IDR_SLICE){
2716         h->frame_num_offset= 0;
2717     }else{
2718         if(h->frame_num < h->prev_frame_num)
2719             h->frame_num_offset= h->prev_frame_num_offset + max_frame_num;
2720         else
2721             h->frame_num_offset= h->prev_frame_num_offset;
2722     }
2723
2724     if(h->sps.poc_type==0){
2725         const int max_poc_lsb= 1<<h->sps.log2_max_poc_lsb;
2726
2727         if     (h->poc_lsb < h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb >= max_poc_lsb/2)
2728             h->poc_msb = h->prev_poc_msb + max_poc_lsb;
2729         else if(h->poc_lsb > h->prev_poc_lsb && h->prev_poc_lsb - h->poc_lsb < -max_poc_lsb/2)
2730             h->poc_msb = h->prev_poc_msb - max_poc_lsb;
2731         else
2732             h->poc_msb = h->prev_poc_msb;
2733 //printf("poc: %d %d\n", h->poc_msb, h->poc_lsb);
2734         field_poc[0] = 
2735         field_poc[1] = h->poc_msb + h->poc_lsb;
2736         if(s->picture_structure == PICT_FRAME) 
2737             field_poc[1] += h->delta_poc_bottom;
2738     }else if(h->sps.poc_type==1){
2739         int abs_frame_num, expected_delta_per_poc_cycle, expectedpoc;
2740         int i;
2741
2742         if(h->sps.poc_cycle_length != 0)
2743             abs_frame_num = h->frame_num_offset + h->frame_num;
2744         else
2745             abs_frame_num = 0;
2746
2747         if(h->nal_ref_idc==0 && abs_frame_num > 0)
2748             abs_frame_num--;
2749             
2750         expected_delta_per_poc_cycle = 0;
2751         for(i=0; i < h->sps.poc_cycle_length; i++)
2752             expected_delta_per_poc_cycle += h->sps.offset_for_ref_frame[ i ]; //FIXME integrate during sps parse
2753
2754         if(abs_frame_num > 0){
2755             int poc_cycle_cnt          = (abs_frame_num - 1) / h->sps.poc_cycle_length;
2756             int frame_num_in_poc_cycle = (abs_frame_num - 1) % h->sps.poc_cycle_length;
2757
2758             expectedpoc = poc_cycle_cnt * expected_delta_per_poc_cycle;
2759             for(i = 0; i <= frame_num_in_poc_cycle; i++)
2760                 expectedpoc = expectedpoc + h->sps.offset_for_ref_frame[ i ];
2761         } else
2762             expectedpoc = 0;
2763
2764         if(h->nal_ref_idc == 0) 
2765             expectedpoc = expectedpoc + h->sps.offset_for_non_ref_pic;
2766         
2767         field_poc[0] = expectedpoc + h->delta_poc[0];
2768         field_poc[1] = field_poc[0] + h->sps.offset_for_top_to_bottom_field;
2769
2770         if(s->picture_structure == PICT_FRAME)
2771             field_poc[1] += h->delta_poc[1];
2772     }else{
2773         int poc;
2774         if(h->nal_unit_type == NAL_IDR_SLICE){
2775             poc= 0;
2776         }else{
2777             if(h->nal_ref_idc) poc= 2*(h->frame_num_offset + h->frame_num);
2778             else               poc= 2*(h->frame_num_offset + h->frame_num) - 1;
2779         }
2780         field_poc[0]= poc;
2781         field_poc[1]= poc;
2782     }
2783     
2784     if(s->picture_structure != PICT_BOTTOM_FIELD)
2785         s->current_picture_ptr->field_poc[0]= field_poc[0];
2786     if(s->picture_structure != PICT_TOP_FIELD)
2787         s->current_picture_ptr->field_poc[1]= field_poc[1];
2788     if(s->picture_structure == PICT_FRAME) // FIXME field pix?
2789         s->current_picture_ptr->poc= FFMIN(field_poc[0], field_poc[1]);
2790
2791     return 0;
2792 }
2793
2794 /**
2795  * decodes a slice header.
2796  * this will allso call MPV_common_init() and frame_start() as needed
2797  */
2798 static int decode_slice_header(H264Context *h){
2799     MpegEncContext * const s = &h->s;
2800     int first_mb_in_slice, pps_id;
2801     int num_ref_idx_active_override_flag;
2802     static const uint8_t slice_type_map[5]= {P_TYPE, B_TYPE, I_TYPE, SP_TYPE, SI_TYPE};
2803     float new_aspect;
2804
2805     s->current_picture.reference= h->nal_ref_idc != 0;
2806
2807     first_mb_in_slice= get_ue_golomb(&s->gb);
2808
2809     h->slice_type= get_ue_golomb(&s->gb);
2810     if(h->slice_type > 9){
2811         fprintf(stderr, "slice type too large (%d) at %d %d\n", h->slice_type, s->mb_x, s->mb_y);
2812     }
2813     if(h->slice_type > 4){
2814         h->slice_type -= 5;
2815         h->slice_type_fixed=1;
2816     }else
2817         h->slice_type_fixed=0;
2818     
2819     h->slice_type= slice_type_map[ h->slice_type ];
2820     
2821     s->pict_type= h->slice_type; // to make a few old func happy, its wrong though
2822         
2823     pps_id= get_ue_golomb(&s->gb);
2824     if(pps_id>255){
2825         fprintf(stderr, "pps_id out of range\n");
2826         return -1;
2827     }
2828     h->pps= h->pps_buffer[pps_id];
2829     if(h->pps.slice_group_count == 0){
2830         fprintf(stderr, "non existing PPS referenced\n");
2831         return -1;
2832     }
2833
2834     h->sps= h->sps_buffer[ h->pps.sps_id ];
2835     if(h->sps.log2_max_frame_num == 0){
2836         fprintf(stderr, "non existing SPS referenced\n");
2837         return -1;
2838     }
2839     
2840     s->mb_width= h->sps.mb_width;
2841     s->mb_height= h->sps.mb_height;
2842     h->mb_stride= s->mb_width + 1;
2843     
2844     h->b_stride=  s->mb_width*4;
2845     h->b8_stride= s->mb_width*2;
2846
2847     s->mb_x = first_mb_in_slice % s->mb_width;
2848     s->mb_y = first_mb_in_slice / s->mb_width; //FIXME AFFW
2849     
2850     s->width = 16*s->mb_width - 2*(h->pps.crop_left + h->pps.crop_right );
2851     if(h->sps.frame_mbs_only_flag)
2852         s->height= 16*s->mb_height - 2*(h->pps.crop_top  + h->pps.crop_bottom);
2853     else
2854         s->height= 16*s->mb_height - 4*(h->pps.crop_top  + h->pps.crop_bottom); //FIXME recheck
2855     
2856     if(h->pps.crop_left || h->pps.crop_top){
2857         fprintf(stderr, "insane croping not completly supported, this could look slightly wrong ...\n");
2858     }
2859
2860     if(s->aspected_height) //FIXME emms at end of slice ?
2861         new_aspect= h->sps.sar_width*s->width / (float)(s->height*h->sps.sar_height);
2862     else
2863         new_aspect=0;
2864
2865     if (s->context_initialized 
2866         && (   s->width != s->avctx->width || s->height != s->avctx->height 
2867             || ABS(new_aspect - s->avctx->aspect_ratio) > 0.001)) {
2868         free_tables(h);
2869         MPV_common_end(s);
2870     }
2871     if (!s->context_initialized) {
2872         if (MPV_common_init(s) < 0)
2873             return -1;
2874
2875         alloc_tables(h);
2876
2877         s->avctx->width = s->width;
2878         s->avctx->height = s->height;
2879         s->avctx->aspect_ratio= new_aspect;
2880     }
2881
2882     if(first_mb_in_slice == 0){
2883         frame_start(h);
2884     }
2885
2886     s->current_picture_ptr->frame_num= //FIXME frame_num cleanup
2887     h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num);
2888
2889     if(h->sps.frame_mbs_only_flag){
2890         s->picture_structure= PICT_FRAME;
2891     }else{
2892         if(get_bits1(&s->gb)) //field_pic_flag
2893             s->picture_structure= PICT_TOP_FIELD + get_bits1(&s->gb); //bottom_field_flag
2894         else
2895             s->picture_structure= PICT_FRAME;
2896     }
2897
2898     if(s->picture_structure==PICT_FRAME){
2899         h->curr_pic_num=   h->frame_num;
2900         h->max_pic_num= 1<< h->sps.log2_max_frame_num;
2901     }else{
2902         h->curr_pic_num= 2*h->frame_num;
2903         h->max_pic_num= 1<<(h->sps.log2_max_frame_num + 1);
2904     }
2905         
2906     if(h->nal_unit_type == NAL_IDR_SLICE){
2907         int idr_pic_id= get_ue_golomb(&s->gb);
2908     }
2909    
2910     if(h->sps.poc_type==0){
2911         h->poc_lsb= get_bits(&s->gb, h->sps.log2_max_poc_lsb);
2912         
2913         if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME){
2914             h->delta_poc_bottom= get_se_golomb(&s->gb);
2915         }
2916     }
2917     
2918     if(h->sps.poc_type==1 && !h->sps.delta_pic_order_always_zero_flag){
2919         h->delta_poc[0]= get_se_golomb(&s->gb);
2920         
2921         if(h->pps.pic_order_present==1 && s->picture_structure==PICT_FRAME)
2922             h->delta_poc[1]= get_se_golomb(&s->gb);
2923     }
2924     
2925     init_poc(h);
2926     
2927     if(h->pps.redundant_pic_cnt_present){
2928         h->redundant_pic_count= get_ue_golomb(&s->gb);
2929     }
2930
2931     //set defaults, might be overriden a few line later
2932     h->ref_count[0]= h->pps.ref_count[0];
2933     h->ref_count[1]= h->pps.ref_count[1];
2934
2935     if(h->slice_type == P_TYPE || h->slice_type == SP_TYPE || h->slice_type == B_TYPE){
2936         if(h->slice_type == B_TYPE){
2937             h->direct_spatial_mv_pred= get_bits1(&s->gb);
2938         }
2939         num_ref_idx_active_override_flag= get_bits1(&s->gb);
2940     
2941         if(num_ref_idx_active_override_flag){
2942             h->ref_count[0]= get_ue_golomb(&s->gb) + 1;
2943             if(h->slice_type==B_TYPE)
2944                 h->ref_count[1]= get_ue_golomb(&s->gb) + 1;
2945
2946             if(h->ref_count[0] > 32 || h->ref_count[1] > 32){
2947                 fprintf(stderr, "reference overflow\n");
2948                 return -1;
2949             }
2950         }
2951     }
2952
2953     if(first_mb_in_slice == 0){
2954         fill_default_ref_list(h);
2955     }
2956
2957     decode_ref_pic_list_reordering(h);
2958
2959     if(   (h->pps.weighted_pred          && (h->slice_type == P_TYPE || h->slice_type == SP_TYPE )) 
2960        || (h->pps.weighted_bipred_idc==1 && h->slice_type==B_TYPE ) )
2961         pred_weight_table(h);
2962     
2963     if(s->current_picture.reference)
2964         decode_ref_pic_marking(h);
2965     //FIXME CABAC stuff
2966
2967     s->qscale = h->pps.init_qp + get_se_golomb(&s->gb); //slice_qp_delta
2968     //FIXME qscale / qp ... stuff
2969     if(h->slice_type == SP_TYPE){
2970         int sp_for_switch_flag= get_bits1(&s->gb);
2971     }
2972     if(h->slice_type==SP_TYPE || h->slice_type == SI_TYPE){
2973         int slice_qs_delta= get_se_golomb(&s->gb);
2974     }
2975
2976     if( h->pps.deblocking_filter_parameters_present ) {
2977         h->disable_deblocking_filter_idc= get_ue_golomb(&s->gb);
2978         if( h->disable_deblocking_filter_idc  !=  1 ) {
2979             h->slice_alpha_c0_offset_div2= get_se_golomb(&s->gb);
2980             h->slice_beta_offset_div2= get_se_golomb(&s->gb);
2981         }
2982     }else
2983         h->disable_deblocking_filter_idc= 0;
2984
2985 #if 0 //FMO
2986     if( h->pps.num_slice_groups > 1  && h->pps.mb_slice_group_map_type >= 3 && h->pps.mb_slice_group_map_type <= 5)
2987         slice_group_change_cycle= get_bits(&s->gb, ?);
2988 #endif
2989
2990     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
2991         printf("mb:%d %c pps:%d frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%d\n", 
2992                first_mb_in_slice, 
2993                ff_get_pict_type_char(h->slice_type),
2994                pps_id, h->frame_num,
2995                s->current_picture_ptr->field_poc[0], s->current_picture_ptr->field_poc[1],
2996                h->ref_count[0], h->ref_count[1],
2997                s->qscale,
2998                h->disable_deblocking_filter_idc
2999                );
3000     }
3001
3002     return 0;
3003 }
3004
3005 /**
3006  *
3007  */
3008 static inline int get_level_prefix(GetBitContext *gb){
3009     unsigned int buf;
3010     int log;
3011     
3012     OPEN_READER(re, gb);
3013     UPDATE_CACHE(re, gb);
3014     buf=GET_CACHE(re, gb);
3015     
3016     log= 32 - av_log2(buf);
3017 #ifdef TRACE
3018     print_bin(buf>>(32-log), log);
3019     printf("%5d %2d %3d lpr @%5d in %s get_level_prefix\n", buf>>(32-log), log, log-1, get_bits_count(gb), __FILE__);
3020 #endif
3021
3022     LAST_SKIP_BITS(re, gb, log);
3023     CLOSE_READER(re, gb);
3024
3025     return log-1;
3026 }
3027
3028 /**
3029  * decodes a residual block.
3030  * @param n block index
3031  * @param scantable scantable
3032  * @param max_coeff number of coefficients in the block
3033  * @return <0 if an error occured
3034  */
3035 static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, int n, const uint8_t *scantable, int qp, int max_coeff){
3036     MpegEncContext * const s = &h->s;
3037     const uint16_t *qmul= dequant_coeff[qp];
3038     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};
3039     int level[16], run[16];
3040     int suffix_length, zeros_left, coeff_num, coeff_token, total_coeff, i, trailing_ones;
3041
3042     //FIXME put trailing_onex into the context
3043
3044     if(n == CHROMA_DC_BLOCK_INDEX){
3045         coeff_token= get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1);
3046         total_coeff= coeff_token>>2;
3047     }else{    
3048         if(n == LUMA_DC_BLOCK_INDEX){
3049             total_coeff= pred_non_zero_count(h, 0);
3050             coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
3051             total_coeff= coeff_token>>2;
3052         }else{
3053             total_coeff= pred_non_zero_count(h, n);
3054             coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
3055             total_coeff= coeff_token>>2;
3056             h->non_zero_count_cache[ scan8[n] ]= total_coeff;
3057         }
3058     }
3059
3060     //FIXME set last_non_zero?
3061
3062     if(total_coeff==0)
3063         return 0;
3064         
3065     trailing_ones= coeff_token&3;
3066     tprintf("trailing:%d, total:%d\n", trailing_ones, total_coeff);
3067     assert(total_coeff<=16);
3068     
3069     for(i=0; i<trailing_ones; i++){
3070         level[i]= 1 - 2*get_bits1(gb);
3071     }
3072
3073     suffix_length= total_coeff > 10 && trailing_ones < 3;
3074
3075     for(; i<total_coeff; i++){
3076         const int prefix= get_level_prefix(gb);
3077         int level_code, mask;
3078
3079         if(prefix<14){ //FIXME try to build a large unified VLC table for all this
3080             if(suffix_length)
3081                 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
3082             else
3083                 level_code= (prefix<<suffix_length); //part
3084         }else if(prefix==14){
3085             if(suffix_length)
3086                 level_code= (prefix<<suffix_length) + get_bits(gb, suffix_length); //part
3087             else
3088                 level_code= prefix + get_bits(gb, 4); //part
3089         }else if(prefix==15){
3090             level_code= (prefix<<suffix_length) + get_bits(gb, 12); //part
3091             if(suffix_length==0) level_code+=15; //FIXME doesnt make (much)sense
3092         }else{
3093             fprintf(stderr, "prefix too large at %d %d\n", s->mb_x, s->mb_y);
3094             return -1;
3095         }
3096
3097         if(i==trailing_ones && i<3) level_code+= 2; //FIXME split first iteration
3098
3099         mask= -(level_code&1);
3100         level[i]= (((2+level_code)>>1) ^ mask) - mask;
3101
3102         if(suffix_length==0) suffix_length=1; //FIXME split first iteration
3103
3104 #if 1
3105         if(ABS(level[i]) > (3<<(suffix_length-1)) && suffix_length<6) suffix_length++;
3106 #else        
3107         if((2+level_code)>>1) > (3<<(suffix_length-1)) && suffix_length<6) suffix_length++;
3108         ? == prefix > 2 or sth
3109 #endif
3110         tprintf("level: %d suffix_length:%d\n", level[i], suffix_length);
3111     }
3112
3113     if(total_coeff == max_coeff)
3114         zeros_left=0;
3115     else{
3116         if(n == CHROMA_DC_BLOCK_INDEX)
3117             zeros_left= get_vlc2(gb, chroma_dc_total_zeros_vlc[ total_coeff-1 ].table, CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1);
3118         else
3119             zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff-1 ].table, TOTAL_ZEROS_VLC_BITS, 1);
3120     }
3121     
3122     for(i=0; i<total_coeff-1; i++){
3123         if(zeros_left <=0)
3124             break;
3125         else if(zeros_left < 7){
3126             run[i]= get_vlc2(gb, run_vlc[zeros_left-1].table, RUN_VLC_BITS, 1);
3127         }else{
3128             run[i]= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2);
3129         }
3130         zeros_left -= run[i];
3131     }
3132
3133     if(zeros_left<0){
3134         fprintf(stderr, "negative number of zero coeffs at %d %d\n", s->mb_x, s->mb_y);
3135         return -1;
3136     }
3137     
3138     for(; i<total_coeff-1; i++){
3139         run[i]= 0;
3140     }
3141
3142     run[i]= zeros_left;
3143
3144     coeff_num=-1;
3145     if(n > 24){
3146         for(i=total_coeff-1; i>=0; i--){ //FIXME merge into rundecode?
3147             int j;
3148
3149             coeff_num += run[i] + 1; //FIXME add 1 earlier ?
3150             j= scantable[ coeff_num ];
3151
3152             block[j]= level[i];
3153         }
3154     }else{
3155         for(i=total_coeff-1; i>=0; i--){ //FIXME merge into  rundecode?
3156             int j;
3157
3158             coeff_num += run[i] + 1; //FIXME add 1 earlier ?
3159             j= scantable[ coeff_num ];
3160
3161             block[j]= level[i] * qmul[j];
3162 //            printf("%d %d  ", block[j], qmul[j]);
3163         }
3164     }
3165     return 0;
3166 }
3167
3168 /**
3169  * decodes a macroblock
3170  * @returns 0 if ok, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
3171  */
3172 static int decode_mb(H264Context *h){
3173     MpegEncContext * const s = &h->s;
3174     const int mb_xy= s->mb_x + s->mb_y*h->mb_stride;
3175     int mb_type, partition_count, cbp;
3176
3177     memset(h->mb, 0, sizeof(int16_t)*24*16); //FIXME avoid if allready clear (move after skip handlong?
3178
3179     tprintf("pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
3180
3181     if(h->slice_type != I_TYPE && h->slice_type != SI_TYPE){
3182         if(s->mb_skip_run==-1)
3183             s->mb_skip_run= get_ue_golomb(&s->gb);
3184         
3185         if (s->mb_skip_run--) {
3186             int i, mx, my;
3187             /* skip mb */
3188 #if 0 //FIXME
3189             for(i=0;i<6;i++)
3190                 s->block_last_index[i] = -1;
3191          s->mv_type = MV_TYPE_16X16;
3192             /* if P type, zero motion vector is implied */
3193             s->mv_dir = MV_DIR_FORWARD;
3194             s->mb_skiped = 1;
3195 #endif
3196 //FIXME b frame
3197             mb_type= MB_TYPE_16x16|MB_TYPE_P0L0|MB_TYPE_P1L0;
3198
3199             memset(h->non_zero_count[mb_xy], 0, 16);
3200             memset(h->non_zero_count_cache + 8, 0, 8*5); //FIXME ugly, remove pfui
3201
3202             if(h->sps.mb_aff && s->mb_skip_run==0 && (s->mb_y&1)==0){
3203                 h->mb_field_decoding_flag= get_bits1(&s->gb);
3204             }
3205
3206             if(h->mb_field_decoding_flag)
3207                 mb_type|= MB_TYPE_INTERLACED;
3208             
3209             fill_caches(h, mb_type); //FIXME check what is needed and what not ...
3210             pred_pskip_motion(h, &mx, &my);
3211             fill_rectangle(&h->ref_cache[0][scan8[0]], 4, 4, 8, 0, 1);
3212             fill_rectangle(  h->mv_cache[0][scan8[0]], 4, 4, 8, (mx&0xFFFF)+(my<<16), 4);
3213             write_back_motion(h, mb_type);
3214
3215             s->current_picture.mb_type[mb_xy]= mb_type; //FIXME SKIP type
3216             h->slice_table[ mb_xy ]= h->slice_num;
3217
3218             h->prev_mb_skiped= 1;
3219             return 0;
3220         }
3221     }
3222     if(h->sps.mb_aff /* && !field pic FIXME needed? */){
3223         if((s->mb_y&1)==0)
3224             h->mb_field_decoding_flag = get_bits1(&s->gb);
3225     }else
3226         h->mb_field_decoding_flag=0; //FIXME som ed note ?!
3227     
3228     h->prev_mb_skiped= 0;
3229     
3230     mb_type= get_ue_golomb(&s->gb);
3231     if(h->slice_type == B_TYPE){
3232         if(mb_type < 23){
3233             partition_count= b_mb_type_info[mb_type].partition_count;
3234             mb_type=         b_mb_type_info[mb_type].type;
3235         }else{
3236             mb_type -= 23;
3237             goto decode_intra_mb;
3238         }
3239     }else if(h->slice_type == P_TYPE /*|| h->slice_type == SP_TYPE */){
3240         if(mb_type < 5){
3241             partition_count= p_mb_type_info[mb_type].partition_count;
3242             mb_type=         p_mb_type_info[mb_type].type;
3243         }else{
3244             mb_type -= 5;
3245             goto decode_intra_mb;
3246         }
3247     }else{
3248        assert(h->slice_type == I_TYPE);
3249 decode_intra_mb:
3250         if(mb_type > 25){
3251             fprintf(stderr, "mb_type %d in %c slice to large at %d %d\n", mb_type, ff_get_pict_type_char(h->slice_type), s->mb_x, s->mb_y);
3252             return -1;
3253         }
3254         partition_count=0;
3255         cbp= i_mb_type_info[mb_type].cbp;
3256         h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
3257         mb_type= i_mb_type_info[mb_type].type;
3258     }
3259
3260     if(h->mb_field_decoding_flag)
3261         mb_type |= MB_TYPE_INTERLACED;
3262
3263     s->current_picture.mb_type[mb_xy]= mb_type;
3264     h->slice_table[ mb_xy ]= h->slice_num;
3265     
3266     if(IS_INTRA_PCM(mb_type)){
3267         const uint8_t *ptr;
3268         int x, y, i;
3269         
3270         // we assume these blocks are very rare so we dont optimize it
3271         align_get_bits(&s->gb);
3272         
3273         ptr= s->gb.buffer + get_bits_count(&s->gb);
3274     
3275         for(y=0; y<16; y++){
3276             const int index= 4*(y&3) + 64*(y>>2);
3277             for(x=0; x<16; x++){
3278                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
3279             }
3280         }
3281         for(y=0; y<8; y++){
3282             const int index= 256 + 4*(y&3) + 32*(y>>2);
3283             for(x=0; x<8; x++){
3284                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
3285             }
3286         }
3287         for(y=0; y<8; y++){
3288             const int index= 256 + 64 + 4*(y&3) + 32*(y>>2);
3289             for(x=0; x<8; x++){
3290                 h->mb[index + (x&3) + 16*(x>>2)]= *(ptr++);
3291             }
3292         }
3293     
3294         skip_bits(&s->gb, 384); //FIXME check /fix the bitstream readers
3295         
3296         memset(h->non_zero_count[mb_xy], 16, 16);
3297         
3298         return 0;
3299     }
3300         
3301     fill_caches(h, mb_type);
3302
3303     //mb_pred
3304     if(IS_INTRA(mb_type)){
3305 //            init_top_left_availability(h);
3306             if(IS_INTRA4x4(mb_type)){
3307                 int i;
3308
3309 //                fill_intra4x4_pred_table(h);
3310                 for(i=0; i<16; i++){
3311                     const int mode_coded= !get_bits1(&s->gb);
3312                     const int predicted_mode=  pred_intra_mode(h, i);
3313                     int mode;
3314
3315                     if(mode_coded){
3316                         const int rem_mode= get_bits(&s->gb, 3);
3317                         if(rem_mode<predicted_mode)
3318                             mode= rem_mode;
3319                         else
3320                             mode= rem_mode + 1;
3321                     }else{
3322                         mode= predicted_mode;
3323                     }
3324                     
3325                     h->intra4x4_pred_mode_cache[ scan8[i] ] = mode;
3326                 }
3327                 write_back_intra_pred_mode(h);
3328                 if( check_intra4x4_pred_mode(h) < 0)
3329                     return -1;
3330             }else{
3331                 h->intra16x16_pred_mode= check_intra_pred_mode(h, h->intra16x16_pred_mode);
3332                 if(h->intra16x16_pred_mode < 0)
3333                     return -1;
3334             }
3335             h->chroma_pred_mode= get_ue_golomb(&s->gb);
3336
3337             h->chroma_pred_mode= check_intra_pred_mode(h, h->chroma_pred_mode);
3338             if(h->chroma_pred_mode < 0)
3339                 return -1;
3340     }else if(partition_count==4){
3341         int i, j, sub_partition_count[4], list, ref[2][4];
3342         
3343         if(h->slice_type == B_TYPE){
3344             for(i=0; i<4; i++){
3345                 h->sub_mb_type[i]= get_ue_golomb(&s->gb);
3346                 if(h->sub_mb_type[i] >=13){
3347                     fprintf(stderr, "B sub_mb_type %d out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y);
3348                     return -1;
3349                 }
3350                 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
3351                 h->sub_mb_type[i]=      b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
3352             }
3353         }else{
3354             assert(h->slice_type == P_TYPE || h->slice_type == SP_TYPE); //FIXME SP correct ?
3355             for(i=0; i<4; i++){
3356                 h->sub_mb_type[i]= get_ue_golomb(&s->gb);
3357                 if(h->sub_mb_type[i] >=4){
3358                     fprintf(stderr, "P sub_mb_type %d out of range at %d %d\n", h->sub_mb_type[i], s->mb_x, s->mb_y);
3359                     return -1;
3360                 }
3361                 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
3362                 h->sub_mb_type[i]=      p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
3363             }
3364         }
3365         
3366         for(list=0; list<2; list++){
3367             const int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list];
3368             if(ref_count == 0) continue;
3369             for(i=0; i<4; i++){
3370                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
3371                     ref[list][i] = get_te0_golomb(&s->gb, ref_count); //FIXME init to 0 before and skip?
3372                 }else{
3373                  //FIXME
3374                     ref[list][i] = -1;
3375                 }
3376             }
3377         }
3378         
3379         for(list=0; list<2; list++){
3380             const int ref_count= IS_REF0(mb_type) ? 1 : h->ref_count[list];
3381             if(ref_count == 0) continue;
3382
3383             for(i=0; i<4; i++){
3384                 h->ref_cache[list][ scan8[4*i]   ]=h->ref_cache[list][ scan8[4*i]+1 ]=
3385                 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
3386
3387                 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
3388                     const int sub_mb_type= h->sub_mb_type[i];
3389                     const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
3390                     for(j=0; j<sub_partition_count[i]; j++){
3391                         int mx, my;
3392                         const int index= 4*i + block_width*j;
3393                         int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
3394                         pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mx, &my);
3395                         mx += get_se_golomb(&s->gb);
3396                         my += get_se_golomb(&s->gb);
3397                         tprintf("final mv:%d %d\n", mx, my);
3398
3399                         if(IS_SUB_8X8(sub_mb_type)){
3400                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]= 
3401                             mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
3402                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]= 
3403                             mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
3404                         }else if(IS_SUB_8X4(sub_mb_type)){
3405                             mv_cache[ 0 ][0]= mv_cache[ 1 ][0]= mx;
3406                             mv_cache[ 0 ][1]= mv_cache[ 1 ][1]= my;
3407                         }else if(IS_SUB_4X8(sub_mb_type)){
3408                             mv_cache[ 0 ][0]= mv_cache[ 8 ][0]= mx;
3409                             mv_cache[ 0 ][1]= mv_cache[ 8 ][1]= my;
3410                         }else{
3411                             assert(IS_SUB_4X4(sub_mb_type));
3412                             mv_cache[ 0 ][0]= mx;
3413                             mv_cache[ 0 ][1]= my;
3414                         }
3415                     }
3416                 }else{
3417                     uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
3418                     p[0] = p[1]=
3419                     p[8] = p[9]= 0;
3420                 }
3421             }
3422         }
3423     }else if(!IS_DIRECT(mb_type)){
3424         int list, mx, my, i;
3425          //FIXME we should set ref_idx_l? to 0 if we use that later ...
3426         if(IS_16X16(mb_type)){
3427             for(list=0; list<2; list++){
3428                 if(h->ref_count[0]>0){
3429                     if(IS_DIR(mb_type, 0, list)){
3430                         const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
3431                         fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
3432                     }
3433                 }
3434             }
3435             for(list=0; list<2; list++){
3436                 if(IS_DIR(mb_type, 0, list)){
3437                     pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mx, &my);
3438                     mx += get_se_golomb(&s->gb);
3439                     my += get_se_golomb(&s->gb);
3440                     tprintf("final mv:%d %d\n", mx, my);
3441
3442                     fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, (mx&0xFFFF) + (my<<16), 4);
3443                 }
3444             }
3445         }
3446         else if(IS_16X8(mb_type)){
3447             for(list=0; list<2; list++){
3448                 if(h->ref_count[list]>0){
3449                     for(i=0; i<2; i++){
3450                         if(IS_DIR(mb_type, i, list)){
3451                             const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
3452                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
3453                         }
3454                     }
3455                 }
3456             }
3457             for(list=0; list<2; list++){
3458                 for(i=0; i<2; i++){
3459                     if(IS_DIR(mb_type, i, list)){
3460                         pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mx, &my);
3461                         mx += get_se_golomb(&s->gb);
3462                         my += get_se_golomb(&s->gb);
3463                         tprintf("final mv:%d %d\n", mx, my);
3464
3465                         fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (mx&0xFFFF) + (my<<16), 4);
3466                     }
3467                 }
3468             }
3469         }else{
3470             assert(IS_8X16(mb_type));
3471             for(list=0; list<2; list++){
3472                 if(h->ref_count[list]>0){
3473                     for(i=0; i<2; i++){
3474                         if(IS_DIR(mb_type, i, list)){ //FIXME optimize
3475                             const int val= get_te0_golomb(&s->gb, h->ref_count[list]);
3476                             fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
3477                         }
3478                     }
3479                 }
3480             }
3481             for(list=0; list<2; list++){
3482                 for(i=0; i<2; i++){
3483                     if(IS_DIR(mb_type, i, list)){
3484                         pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
3485                         mx += get_se_golomb(&s->gb);
3486                         my += get_se_golomb(&s->gb);
3487                         tprintf("final mv:%d %d\n", mx, my);
3488
3489                         fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (mx&0xFFFF) + (my<<16), 4);
3490                     }
3491                 }
3492             }
3493         }
3494     }
3495     
3496     if(IS_INTER(mb_type))
3497         write_back_motion(h, mb_type);
3498     
3499     if(!IS_INTRA16x16(mb_type)){
3500         cbp= get_ue_golomb(&s->gb);
3501         if(cbp > 47){
3502             fprintf(stderr, "cbp too large (%d) at %d %d\n", cbp, s->mb_x, s->mb_y);
3503             return -1;
3504         }
3505         
3506         if(IS_INTRA4x4(mb_type))
3507             cbp= golomb_to_intra4x4_cbp[cbp];
3508         else
3509             cbp= golomb_to_inter_cbp[cbp];
3510     }
3511
3512     if(cbp || IS_INTRA16x16(mb_type)){
3513         int i8x8, i4x4, chroma_idx;
3514         int chroma_qp, dquant;
3515         GetBitContext *gb= IS_INTRA(mb_type) ? h->intra_gb_ptr : h->inter_gb_ptr;
3516         const uint8_t *scan, *dc_scan;
3517         
3518 //        fill_non_zero_count_cache(h);
3519
3520         if(IS_INTERLACED(mb_type)){
3521             scan= field_scan;
3522             dc_scan= luma_dc_field_scan;
3523         }else{
3524             scan= zigzag_scan;
3525             dc_scan= luma_dc_zigzag_scan;
3526         }
3527
3528         dquant= get_se_golomb(&s->gb);
3529
3530         if( dquant > 25 || dquant < -26 ){
3531             fprintf(stderr, "dquant out of range (%d) at %d %d\n", dquant, s->mb_x, s->mb_y);
3532             return -1;
3533         }
3534         
3535         s->qscale += dquant;
3536         if(((unsigned)s->qscale) > 51){
3537             if(s->qscale<0) s->qscale+= 52;
3538             else            s->qscale-= 52;
3539         }
3540         
3541         h->chroma_qp= chroma_qp= get_chroma_qp(h, s->qscale);
3542         if(IS_INTRA16x16(mb_type)){
3543             if( decode_residual(h, h->intra_gb_ptr, h->mb, LUMA_DC_BLOCK_INDEX, dc_scan, s->qscale, 16) < 0){
3544                 return -1; //FIXME continue if partotioned and other retirn -1 too
3545             }
3546
3547             assert((cbp&15) == 0 || (cbp&15) == 15);
3548
3549             if(cbp&15){
3550                 for(i8x8=0; i8x8<4; i8x8++){
3551                     for(i4x4=0; i4x4<4; i4x4++){
3552                         const int index= i4x4 + 4*i8x8;
3553                         if( decode_residual(h, h->intra_gb_ptr, h->mb + 16*index, index, scan + 1, s->qscale, 15) < 0 ){
3554                             return -1;
3555                         }
3556                     }
3557                 }
3558             }else{
3559                 memset(&h->non_zero_count_cache[8], 0, 8*4); //FIXME stupid & slow
3560             }
3561         }else{
3562             for(i8x8=0; i8x8<4; i8x8++){
3563                 if(cbp & (1<<i8x8)){
3564                     for(i4x4=0; i4x4<4; i4x4++){
3565                         const int index= i4x4 + 4*i8x8;
3566                         
3567                         if( decode_residual(h, gb, h->mb + 16*index, index, scan, s->qscale, 16) <0 ){
3568                             return -1;
3569                         }
3570                     }
3571                 }else{
3572                     uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
3573                     nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
3574                 }
3575             }
3576         }
3577         
3578         if(cbp&0x30){
3579             for(chroma_idx=0; chroma_idx<2; chroma_idx++)
3580                 if( decode_residual(h, gb, h->mb + 256 + 16*4*chroma_idx, CHROMA_DC_BLOCK_INDEX, chroma_dc_scan, chroma_qp, 4) < 0){
3581                     return -1;
3582                 }
3583         }
3584
3585         if(cbp&0x20){
3586             for(chroma_idx=0; chroma_idx<2; chroma_idx++){
3587                 for(i4x4=0; i4x4<4; i4x4++){
3588                     const int index= 16 + 4*chroma_idx + i4x4;
3589                     if( decode_residual(h, gb, h->mb + 16*index, index, scan + 1, chroma_qp, 15) < 0){
3590                         return -1;
3591                     }
3592                 }
3593             }
3594         }else{
3595             uint8_t * const nnz= &h->non_zero_count_cache[0];
3596             nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
3597             nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
3598         }
3599     }else{
3600         memset(&h->non_zero_count_cache[8], 0, 8*5);
3601     }
3602     write_back_non_zero_count(h);
3603
3604     return 0;
3605 }
3606
3607 static int decode_slice(H264Context *h){
3608     MpegEncContext * const s = &h->s;
3609     const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
3610
3611     s->mb_skip_run= -1;
3612     
3613 #if 1
3614     for(;;){
3615         int ret= decode_mb(h);
3616             
3617         hl_decode_mb(h);
3618         
3619         if(ret>=0 && h->sps.mb_aff){ //FIXME optimal? or let mb_decode decode 16x32 ?
3620             s->mb_y++;
3621             ret= decode_mb(h);
3622             
3623             hl_decode_mb(h);
3624             s->mb_y--;
3625         }
3626
3627         if(ret<0){
3628             fprintf(stderr, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
3629             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);
3630
3631             return -1;
3632         }
3633         
3634         if(++s->mb_x >= s->mb_width){
3635             s->mb_x=0;
3636             ff_draw_horiz_band(s, 16*s->mb_y, 16);
3637             if(++s->mb_y >= s->mb_height){
3638                 tprintf("slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
3639
3640                 if(get_bits_count(&s->gb) == s->gb.size_in_bits){
3641                     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);
3642
3643                     return 0;
3644                 }else{
3645                     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);
3646
3647                     return -1;
3648                 }
3649             }
3650         }
3651         
3652         if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->mb_skip_run<=0){
3653             if(get_bits_count(&s->gb) == s->gb.size_in_bits){
3654                 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);
3655
3656                 return 0;
3657             }else{
3658                 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);
3659
3660                 return -1;
3661             }
3662         }
3663     }
3664 #endif
3665 #if 0
3666     for(;s->mb_y < s->mb_height; s->mb_y++){
3667         for(;s->mb_x < s->mb_width; s->mb_x++){
3668             int ret= decode_mb(h);
3669             
3670             hl_decode_mb(h);
3671
3672             if(ret<0){
3673                 fprintf(stderr, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
3674                 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);
3675
3676                 return -1;
3677             }
3678         
3679             if(++s->mb_x >= s->mb_width){
3680                 s->mb_x=0;
3681                 if(++s->mb_y >= s->mb_height){
3682                     if(get_bits_count(s->gb) == s->gb.size_in_bits){
3683                         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);
3684
3685                         return 0;
3686                     }else{
3687                         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);
3688
3689                         return -1;
3690                     }
3691                 }
3692             }
3693         
3694             if(get_bits_count(s->?gb) >= s->gb?.size_in_bits){
3695                 if(get_bits_count(s->gb) == s->gb.size_in_bits){
3696                     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);
3697
3698                     return 0;
3699                 }else{
3700                     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);
3701
3702                     return -1;
3703                 }
3704             }
3705         }
3706         s->mb_x=0;
3707         ff_draw_horiz_band(s, 16*s->mb_y, 16);
3708     }
3709 #endif
3710     return -1; //not reached
3711 }
3712
3713 static inline int decode_vui_parameters(H264Context *h, SPS *sps){
3714     MpegEncContext * const s = &h->s;
3715     int aspect_ratio_info_present_flag, aspect_ratio_idc;
3716
3717     aspect_ratio_info_present_flag= get_bits1(&s->gb);
3718     
3719     if( aspect_ratio_info_present_flag ) {
3720         aspect_ratio_idc= get_bits(&s->gb, 8);
3721         if( aspect_ratio_idc == EXTENDED_SAR ) {
3722             sps->sar_width= get_bits(&s->gb, 16);
3723             sps->sar_height= get_bits(&s->gb, 16);
3724         }else if(aspect_ratio_idc < 16){
3725             sps->sar_width=  pixel_aspect[aspect_ratio_idc][0];
3726             sps->sar_height= pixel_aspect[aspect_ratio_idc][1];
3727         }else{
3728             fprintf(stderr, "illegal aspect ratio\n");
3729             return -1;
3730         }
3731     }else{
3732         sps->sar_width= 
3733         sps->sar_height= 0;
3734     }
3735 //            s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
3736 #if 0
3737 | overscan_info_present_flag                        |0  |u(1)    |
3738 | if( overscan_info_present_flag )                  |   |        |
3739 |  overscan_appropriate_flag                        |0  |u(1)    |
3740 | video_signal_type_present_flag                    |0  |u(1)    |
3741 | if( video_signal_type_present_flag ) {            |   |        |
3742 |  video_format                                     |0  |u(3)    |
3743 |  video_full_range_flag                            |0  |u(1)    |
3744 |  colour_description_present_flag                  |0  |u(1)    |
3745 |  if( colour_description_present_flag ) {          |   |        |
3746 |   colour_primaries                                |0  |u(8)    |
3747 |   transfer_characteristics                        |0  |u(8)    |
3748 |   matrix_coefficients                             |0  |u(8)    |
3749 |  }                                                |   |        |
3750 | }                                                 |   |        |
3751 | chroma_location_info_present_flag                 |0  |u(1)    |
3752 | if ( chroma_location_info_present_flag ) {        |   |        |
3753 |  chroma_sample_location_type_top_field            |0  |ue(v)   |
3754 |  chroma_sample_location_type_bottom_field         |0  |ue(v)   |
3755 | }                                                 |   |        |
3756 | timing_info_present_flag                          |0  |u(1)    |
3757 | if( timing_info_present_flag ) {                  |   |        |
3758 |  num_units_in_tick                                |0  |u(32)   |
3759 |  time_scale                                       |0  |u(32)   |
3760 |  fixed_frame_rate_flag                            |0  |u(1)    |
3761 | }                                                 |   |        |
3762 | nal_hrd_parameters_present_flag                   |0  |u(1)    |
3763 | if( nal_hrd_parameters_present_flag  = =  1)      |   |        |
3764 |  hrd_parameters( )                                |   |        |
3765 | vcl_hrd_parameters_present_flag                   |0  |u(1)    |
3766 | if( vcl_hrd_parameters_present_flag  = =  1)      |   |        |
3767 |  hrd_parameters( )                                |   |        |
3768 | if( ( nal_hrd_parameters_present_flag  = =  1  | ||   |        |
3769 |                                                   |   |        |
3770 |( vcl_hrd_parameters_present_flag  = =  1 ) )      |   |        |
3771 |  low_delay_hrd_flag                               |0  |u(1)    |
3772 | bitstream_restriction_flag                        |0  |u(1)    |
3773 | if( bitstream_restriction_flag ) {                |0  |u(1)    |
3774 |  motion_vectors_over_pic_boundaries_flag          |0  |u(1)    |
3775 |  max_bytes_per_pic_denom                          |0  |ue(v)   |
3776 |  max_bits_per_mb_denom                            |0  |ue(v)   |
3777 |  log2_max_mv_length_horizontal                    |0  |ue(v)   |
3778 |  log2_max_mv_length_vertical                      |0  |ue(v)   |
3779 |  num_reorder_frames                               |0  |ue(v)   |
3780 |  max_dec_frame_buffering                          |0  |ue(v)   |
3781 | }                                                 |   |        |
3782 |}                                                  |   |        |
3783 #endif
3784     return 0;
3785 }
3786
3787 static inline int decode_seq_parameter_set(H264Context *h){
3788     MpegEncContext * const s = &h->s;
3789     int profile_idc, level_idc, multiple_slice_groups, arbitrary_slice_order, redundant_slices;
3790     int sps_id, i;
3791     SPS *sps;
3792     
3793     profile_idc= get_bits(&s->gb, 8);
3794     level_idc= get_bits(&s->gb, 8);
3795     multiple_slice_groups= get_bits1(&s->gb);
3796     arbitrary_slice_order= get_bits1(&s->gb);
3797     redundant_slices= get_bits1(&s->gb);
3798     
3799     sps_id= get_ue_golomb(&s->gb);
3800     
3801     sps= &h->sps_buffer[ sps_id ];
3802     
3803     sps->profile_idc= profile_idc;
3804     sps->level_idc= level_idc;
3805     sps->multiple_slice_groups= multiple_slice_groups;
3806     sps->arbitrary_slice_order= arbitrary_slice_order;
3807     sps->redundant_slices= redundant_slices;
3808     
3809     sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4;
3810
3811     sps->poc_type= get_ue_golomb(&s->gb);
3812     
3813     if(sps->poc_type == 0){ //FIXME #define
3814         sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
3815     } else if(sps->poc_type == 1){//FIXME #define
3816         sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
3817         sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
3818         sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb);
3819         sps->poc_cycle_length= get_ue_golomb(&s->gb);
3820         
3821         for(i=0; i<sps->poc_cycle_length; i++)
3822             sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb);
3823     }
3824     if(sps->poc_type > 2){
3825         fprintf(stderr, "illegal POC type %d\n", sps->poc_type);
3826         return -1;
3827     }
3828
3829     sps->ref_frame_count= get_ue_golomb(&s->gb);
3830     sps->required_frame_num_update_behaviour_flag= get_bits1(&s->gb);
3831     sps->mb_width= get_ue_golomb(&s->gb) + 1;
3832     sps->mb_height= get_ue_golomb(&s->gb) + 1;
3833     sps->frame_mbs_only_flag= get_bits1(&s->gb);
3834     if(!sps->frame_mbs_only_flag)
3835         sps->mb_aff= get_bits1(&s->gb);
3836     else
3837         sps->mb_aff= 0;
3838
3839     sps->direct_8x8_inference_flag= get_bits1(&s->gb);
3840
3841     sps->vui_parameters_present_flag= get_bits1(&s->gb);
3842     if( sps->vui_parameters_present_flag )
3843         decode_vui_parameters(h, sps);
3844     
3845     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
3846         printf("sps:%d profile:%d/%d poc:%d ref:%d %dx%d %s %s %s\n", 
3847                sps_id, sps->profile_idc, sps->level_idc,
3848                sps->poc_type,
3849                sps->ref_frame_count,
3850                sps->mb_width, sps->mb_height,
3851                sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
3852                sps->direct_8x8_inference_flag ? "8B8" : "",
3853                sps->vui_parameters_present_flag ? "VUI" : ""
3854                );
3855     }
3856     return 0;
3857 }
3858
3859 static inline int decode_picture_parameter_set(H264Context *h){
3860     MpegEncContext * const s = &h->s;
3861     int pps_id= get_ue_golomb(&s->gb);
3862     PPS *pps= &h->pps_buffer[pps_id];
3863     
3864     pps->sps_id= get_ue_golomb(&s->gb);
3865     pps->cabac= get_bits1(&s->gb);
3866     pps->pic_order_present= get_bits1(&s->gb);
3867     pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
3868     if(pps->slice_group_count > 1 ){
3869         pps->mb_slice_group_map_type= get_ue_golomb(&s->gb);
3870 fprintf(stderr, "FMO not supported\n");
3871         switch(pps->mb_slice_group_map_type){
3872         case 0:
3873 #if 0
3874 |   for( i = 0; i <= num_slice_groups_minus1; i++ ) |   |        |
3875 |    run_length[ i ]                                |1  |ue(v)   |
3876 #endif
3877             break;
3878         case 2:
3879 #if 0
3880 |   for( i = 0; i < num_slice_groups_minus1; i++ )  |   |        |
3881 |{                                                  |   |        |
3882 |    top_left_mb[ i ]                               |1  |ue(v)   |
3883 |    bottom_right_mb[ i ]                           |1  |ue(v)   |
3884 |   }                                               |   |        |
3885 #endif
3886             break;
3887         case 3:
3888         case 4:
3889         case 5:
3890 #if 0
3891 |   slice_group_change_direction_flag               |1  |u(1)    |
3892 |   slice_group_change_rate_minus1                  |1  |ue(v)   |
3893 #endif
3894             break;
3895         case 6:
3896 #if 0
3897 |   slice_group_id_cnt_minus1                       |1  |ue(v)   |
3898 |   for( i = 0; i <= slice_group_id_cnt_minus1; i++ |   |        |
3899 |)                                                  |   |        |
3900 |    slice_group_id[ i ]                            |1  |u(v)    |
3901 #endif
3902         }
3903     }
3904     pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
3905     pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
3906     if(pps->ref_count[0] > 32 || pps->ref_count[1] > 32){
3907         fprintf(stderr, "reference overflow (pps)\n");
3908         return -1;
3909     }
3910     
3911     pps->weighted_pred= get_bits1(&s->gb);
3912     pps->weighted_bipred_idc= get_bits(&s->gb, 2);
3913     pps->init_qp= get_se_golomb(&s->gb) + 26;
3914     pps->init_qs= get_se_golomb(&s->gb) + 26;
3915     pps->chroma_qp_index_offset= get_se_golomb(&s->gb);
3916     pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
3917     pps->constrained_intra_pred= get_bits1(&s->gb);
3918     pps->redundant_pic_cnt_present = get_bits1(&s->gb);
3919     pps->crop= get_bits1(&s->gb);
3920     if(pps->crop){
3921         pps->crop_left  = get_ue_golomb(&s->gb);
3922         pps->crop_right = get_ue_golomb(&s->gb);
3923         pps->crop_top   = get_ue_golomb(&s->gb);
3924         pps->crop_bottom= get_ue_golomb(&s->gb);
3925     }else{
3926         pps->crop_left  = 
3927         pps->crop_right = 
3928         pps->crop_top   = 
3929         pps->crop_bottom= 0;
3930     }
3931     
3932     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
3933         printf("pps:%d sps:%d %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d %s %s %s crop:%d/%d/%d/%d\n", 
3934                pps_id, pps->sps_id,
3935                pps->cabac ? "CABAC" : "CAVLC",
3936                pps->slice_group_count,
3937                pps->ref_count[0], pps->ref_count[1],
3938                pps->weighted_pred ? "weighted" : "",
3939                pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset,
3940                pps->deblocking_filter_parameters_present ? "LPAR" : "",
3941                pps->constrained_intra_pred ? "CONSTR" : "",
3942                pps->redundant_pic_cnt_present ? "REDU" : "",
3943                pps->crop_left, pps->crop_right, 
3944                pps->crop_top, pps->crop_bottom
3945                );
3946     }
3947     
3948     return 0;
3949 }
3950
3951 /**
3952  * finds the end of the current frame in the bitstream.
3953  * @return the position of the first byte of the next frame, or -1
3954  */
3955 static int find_frame_end(MpegEncContext *s, uint8_t *buf, int buf_size){
3956     ParseContext *pc= &s->parse_context;
3957     int last_addr, i;
3958     uint32_t state;
3959 //printf("first %02X%02X%02X%02X\n", buf[0], buf[1],buf[2],buf[3]);
3960 //    mb_addr= pc->mb_addr - 1;
3961     state= pc->state;
3962     //FIXME this will fail with slices
3963     for(i=0; i<buf_size; i++){
3964         state= (state<<8) | buf[i];
3965         if((state&0xFFFFFF1F) == 0x101 || (state&0xFFFFFF1F) == 0x102 || (state&0xFFFFFF1F) == 0x105){
3966             if(pc->frame_start_found){
3967                 pc->state=-1; 
3968                 pc->frame_start_found= 0;
3969                 return i-3;
3970             }
3971             pc->frame_start_found= 1;
3972         }
3973     }
3974     
3975     pc->state= state;
3976     return -1;
3977 }
3978
3979 static int decode_nal_units(H264Context *h, uint8_t *buf, int buf_size){
3980     MpegEncContext * const s = &h->s;
3981     AVCodecContext * const avctx= s->avctx;
3982     int buf_index=0;
3983     int i;
3984 #if 0    
3985     for(i=0; i<32; i++){
3986         printf("%X ", buf[i]);
3987     }
3988 #endif
3989     for(;;){
3990         int consumed;
3991         int dst_length;
3992         int bit_length;
3993         uint8_t *ptr;
3994         
3995         // start code prefix search
3996         for(; buf_index + 3 < buf_size; buf_index++){
3997             // this should allways succeed in the first iteration
3998             if(buf[buf_index] == 0 && buf[buf_index+1] == 0 && buf[buf_index+2] == 1)
3999                 break;
4000         }
4001         
4002         if(buf_index+3 >= buf_size) break;
4003         
4004         buf_index+=3;
4005         
4006         ptr= decode_nal(h, buf + buf_index, &dst_length, &consumed, buf_size - buf_index);
4007         if(ptr[dst_length - 1] == 0) dst_length--;
4008         bit_length= 8*dst_length - decode_rbsp_trailing(ptr + dst_length - 1);
4009
4010         if(s->avctx->debug&FF_DEBUG_STARTCODE){
4011             printf("NAL %d at %d length %d\n", h->nal_unit_type, buf_index, dst_length);
4012         }
4013         
4014         buf_index += consumed;
4015
4016         if(h->nal_ref_idc < s->hurry_up)
4017             continue;
4018         
4019         switch(h->nal_unit_type){
4020         case NAL_IDR_SLICE:
4021             idr(h); //FIXME ensure we dont loose some frames if there is reordering
4022         case NAL_SLICE:
4023             init_get_bits(&s->gb, ptr, bit_length);
4024             h->intra_gb_ptr=
4025             h->inter_gb_ptr= &s->gb;
4026             s->data_partitioning = 0;
4027             
4028             if(decode_slice_header(h) < 0) return -1;
4029             if(h->redundant_pic_count==0)
4030                 decode_slice(h);
4031             break;
4032         case NAL_DPA:
4033             init_get_bits(&s->gb, ptr, bit_length);
4034             h->intra_gb_ptr=
4035             h->inter_gb_ptr= NULL;
4036             s->data_partitioning = 1;
4037             
4038             if(decode_slice_header(h) < 0) return -1;
4039             break;
4040         case NAL_DPB:
4041             init_get_bits(&h->intra_gb, ptr, bit_length);
4042             h->intra_gb_ptr= &h->intra_gb;
4043             break;
4044         case NAL_DPC:
4045             init_get_bits(&h->inter_gb, ptr, bit_length);
4046             h->inter_gb_ptr= &h->inter_gb;
4047
4048             if(h->redundant_pic_count==0 && h->intra_gb_ptr && s->data_partitioning)
4049                 decode_slice(h);
4050             break;
4051         case NAL_SEI:
4052             break;
4053         case NAL_SPS:
4054             init_get_bits(&s->gb, ptr, bit_length);
4055             decode_seq_parameter_set(h);
4056             
4057             if(s->flags& CODEC_FLAG_LOW_DELAY)
4058                 s->low_delay=1;
4059       
4060             avctx->has_b_frames= !s->low_delay;
4061             break;
4062         case NAL_PPS:
4063             init_get_bits(&s->gb, ptr, bit_length);
4064             
4065             decode_picture_parameter_set(h);
4066
4067             break;
4068         case NAL_PICTURE_DELIMITER:
4069             break;
4070         case NAL_FILTER_DATA:
4071             break;
4072         }        
4073
4074         //FIXME move after where irt is set
4075         s->current_picture.pict_type= s->pict_type;
4076         s->current_picture.key_frame= s->pict_type == I_TYPE;
4077     }
4078     
4079     if(!s->current_picture_ptr) return buf_index; //no frame
4080     
4081     h->prev_frame_num_offset= h->frame_num_offset;
4082     h->prev_frame_num= h->frame_num;
4083     if(s->current_picture_ptr->reference){
4084         h->prev_poc_msb= h->poc_msb;
4085         h->prev_poc_lsb= h->poc_lsb;
4086     }
4087     if(s->current_picture_ptr->reference)
4088         execute_ref_pic_marking(h, h->mmco, h->mmco_index);
4089     else
4090         assert(h->mmco_index==0);
4091
4092     ff_er_frame_end(s);
4093     MPV_frame_end(s);
4094
4095     return buf_index;
4096 }
4097
4098 /**
4099  * retunrs the number of bytes consumed for building the current frame
4100  */
4101 static int get_consumed_bytes(MpegEncContext *s, int pos, int buf_size){
4102     if(s->flags&CODEC_FLAG_TRUNCATED){
4103         pos -= s->parse_context.last_index;
4104         if(pos<0) pos=0; // FIXME remove (uneeded?)
4105         
4106         return pos;
4107     }else{
4108         if(pos==0) pos=1; //avoid infinite loops (i doubt thats needed but ...)
4109         if(pos+10>buf_size) pos=buf_size; // oops ;)
4110
4111         return pos;
4112     }
4113 }
4114
4115 static int decode_frame(AVCodecContext *avctx, 
4116                              void *data, int *data_size,
4117                              uint8_t *buf, int buf_size)
4118 {
4119     H264Context *h = avctx->priv_data;
4120     MpegEncContext *s = &h->s;
4121     AVFrame *pict = data; 
4122     float new_aspect;
4123     int buf_index;
4124     
4125     s->flags= avctx->flags;
4126
4127     *data_size = 0;
4128    
4129    /* no supplementary picture */
4130     if (buf_size == 0) {
4131         return 0;
4132     }
4133     
4134     if(s->flags&CODEC_FLAG_TRUNCATED){
4135         int next= find_frame_end(s, buf, buf_size);
4136         
4137         if( ff_combine_frame(s, next, &buf, &buf_size) < 0 )
4138             return buf_size;
4139 //printf("next:%d buf_size:%d last_index:%d\n", next, buf_size, s->parse_context.last_index);
4140     }
4141
4142     if(s->avctx->extradata_size && s->picture_number==0){
4143         if(0 < decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) ) 
4144             return -1;
4145     }
4146
4147     buf_index=decode_nal_units(h, buf, buf_size);
4148     if(buf_index < 0) 
4149         return -1;
4150
4151     //FIXME do something with unavailable reference frames    
4152  
4153 //    if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_index, buf_size);
4154 #if 0
4155     if(s->pict_type==B_TYPE || s->low_delay){
4156         *pict= *(AVFrame*)&s->current_picture;
4157     } else {
4158         *pict= *(AVFrame*)&s->last_picture;
4159     }
4160 #endif
4161     if(!s->current_picture_ptr){
4162         fprintf(stderr, "error, NO frame\n");
4163         return -1;
4164     }
4165
4166     *pict= *(AVFrame*)&s->current_picture; //FIXME 
4167     assert(pict->data[0]);
4168 //printf("out %d\n", (int)pict->data[0]);
4169 #if 0 //?
4170
4171     /* Return the Picture timestamp as the frame number */
4172     /* we substract 1 because it is added on utils.c    */
4173     avctx->frame_number = s->picture_number - 1;
4174 #endif
4175 #if 0
4176     /* dont output the last pic after seeking */
4177     if(s->last_picture_ptr || s->low_delay)
4178     //Note this isnt a issue as a IDR pic should flush teh buffers
4179 #endif
4180         *data_size = sizeof(AVFrame);
4181     return get_consumed_bytes(s, buf_index, buf_size);
4182 }
4183 #if 0
4184 static inline void fill_mb_avail(H264Context *h){
4185     MpegEncContext * const s = &h->s;
4186     const int mb_xy= s->mb_x + s->mb_y*h->mb_stride;
4187
4188     if(s->mb_y){
4189         h->mb_avail[0]= s->mb_x                 && h->slice_table[mb_xy - h->mb_stride - 1] == h->slice_num;
4190         h->mb_avail[1]=                            h->slice_table[mb_xy - h->mb_stride    ] == h->slice_num;
4191         h->mb_avail[2]= s->mb_x+1 < s->mb_width && h->slice_table[mb_xy - h->mb_stride + 1] == h->slice_num;
4192     }else{
4193         h->mb_avail[0]=
4194         h->mb_avail[1]=
4195         h->mb_avail[2]= 0;
4196     }
4197     h->mb_avail[3]= s->mb_x && h->slice_table[mb_xy - 1] == h->slice_num;
4198     h->mb_avail[4]= 1; //FIXME move out
4199     h->mb_avail[5]= 0; //FIXME move out
4200 }
4201 #endif
4202
4203 #if 0 //selftest
4204 #define COUNT 8000
4205 #define SIZE (COUNT*40)
4206 int main(){
4207     int i;
4208     uint8_t temp[SIZE];
4209     PutBitContext pb;
4210     GetBitContext gb;
4211 //    int int_temp[10000];
4212     DSPContext dsp;
4213     AVCodecContext avctx;
4214     
4215     dsputil_init(&dsp, &avctx);
4216
4217     init_put_bits(&pb, temp, SIZE, NULL, NULL);
4218     printf("testing unsigned exp golomb\n");
4219     for(i=0; i<COUNT; i++){
4220         START_TIMER
4221         set_ue_golomb(&pb, i);
4222         STOP_TIMER("set_ue_golomb");
4223     }
4224     flush_put_bits(&pb);
4225     
4226     init_get_bits(&gb, temp, 8*SIZE);
4227     for(i=0; i<COUNT; i++){
4228         int j, s;
4229         
4230         s= show_bits(&gb, 24);
4231         
4232         START_TIMER
4233         j= get_ue_golomb(&gb);
4234         if(j != i){
4235             printf("missmatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s);
4236 //            return -1;
4237         }
4238         STOP_TIMER("get_ue_golomb");
4239     }
4240     
4241     
4242     init_put_bits(&pb, temp, SIZE, NULL, NULL);
4243     printf("testing signed exp golomb\n");
4244     for(i=0; i<COUNT; i++){
4245         START_TIMER
4246         set_se_golomb(&pb, i - COUNT/2);
4247         STOP_TIMER("set_se_golomb");
4248     }
4249     flush_put_bits(&pb);
4250     
4251     init_get_bits(&gb, temp, 8*SIZE);
4252     for(i=0; i<COUNT; i++){
4253         int j, s;
4254         
4255         s= show_bits(&gb, 24);
4256         
4257         START_TIMER
4258         j= get_se_golomb(&gb);
4259         if(j != i - COUNT/2){
4260             printf("missmatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s);
4261 //            return -1;
4262         }
4263         STOP_TIMER("get_se_golomb");
4264     }
4265
4266     printf("testing 4x4 (I)DCT\n");
4267     
4268     DCTELEM block[16];
4269     uint8_t src[16], ref[16];
4270     uint64_t error= 0, max_error=0;
4271
4272     for(i=0; i<COUNT; i++){
4273         int j;
4274 //        printf("%d %d %d\n", r1, r2, (r2-r1)*16);
4275         for(j=0; j<16; j++){
4276             ref[j]= random()%255;
4277             src[j]= random()%255;
4278         }
4279
4280         h264_diff_dct_c(block, src, ref, 4);
4281         
4282         //normalize
4283         for(j=0; j<16; j++){
4284 //            printf("%d ", block[j]);
4285             block[j]= block[j]*4;
4286             if(j&1) block[j]= (block[j]*4 + 2)/5;
4287             if(j&4) block[j]= (block[j]*4 + 2)/5;
4288         }
4289 //        printf("\n");
4290         
4291         h264_add_idct_c(ref, block, 4);
4292 /*        for(j=0; j<16; j++){
4293             printf("%d ", ref[j]);
4294         }
4295         printf("\n");*/
4296             
4297         for(j=0; j<16; j++){
4298             int diff= ABS(src[j] - ref[j]);
4299             
4300             error+= diff*diff;
4301             max_error= FFMAX(max_error, diff);
4302         }
4303     }
4304     printf("error=%f max_error=%d\n", ((float)error)/COUNT/16, (int)max_error );
4305 #if 0
4306     printf("testing quantizer\n");
4307     for(qp=0; qp<52; qp++){
4308         for(i=0; i<16; i++)
4309             src1_block[i]= src2_block[i]= random()%255;
4310         
4311     }
4312 #endif
4313     printf("Testing NAL layer\n");
4314     
4315     uint8_t bitstream[COUNT];
4316     uint8_t nal[COUNT*2];
4317     H264Context h;
4318     memset(&h, 0, sizeof(H264Context));
4319     
4320     for(i=0; i<COUNT; i++){
4321         int zeros= i;
4322         int nal_length;
4323         int consumed;
4324         int out_length;
4325         uint8_t *out;
4326         int j;
4327         
4328         for(j=0; j<COUNT; j++){
4329             bitstream[j]= (random() % 255) + 1;
4330         }
4331         
4332         for(j=0; j<zeros; j++){
4333             int pos= random() % COUNT;
4334             while(bitstream[pos] == 0){
4335                 pos++;
4336                 pos %= COUNT;
4337             }
4338             bitstream[pos]=0;
4339         }
4340         
4341         START_TIMER
4342         
4343         nal_length= encode_nal(&h, nal, bitstream, COUNT, COUNT*2);
4344         if(nal_length<0){
4345             printf("encoding failed\n");
4346             return -1;
4347         }
4348         
4349         out= decode_nal(&h, nal, &out_length, &consumed, nal_length);
4350
4351         STOP_TIMER("NAL")
4352         
4353         if(out_length != COUNT){
4354             printf("incorrect length %d %d\n", out_length, COUNT);
4355             return -1;
4356         }
4357         
4358         if(consumed != nal_length){
4359             printf("incorrect consumed length %d %d\n", nal_length, consumed);
4360             return -1;
4361         }
4362         
4363         if(memcmp(bitstream, out, COUNT)){
4364             printf("missmatch\n");
4365             return -1;
4366         }
4367     }
4368     
4369     printf("Testing RBSP\n");
4370     
4371     
4372     return 0;
4373 }
4374 #endif
4375
4376
4377 static int decode_end(AVCodecContext *avctx)
4378 {
4379     H264Context *h = avctx->priv_data;
4380     MpegEncContext *s = &h->s;
4381     
4382     free_tables(h); //FIXME cleanup init stuff perhaps
4383     MPV_common_end(s);
4384
4385 //    memset(h, 0, sizeof(H264Context));
4386         
4387     return 0;
4388 }
4389
4390
4391 AVCodec h264_decoder = {
4392     "h264",
4393     CODEC_TYPE_VIDEO,
4394     CODEC_ID_H264,
4395     sizeof(H264Context),
4396     decode_init,
4397     NULL,
4398     decode_end,
4399     decode_frame,
4400     /*CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | */CODEC_CAP_TRUNCATED,
4401 };
4402