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