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