]> git.sesse.net Git - ffmpeg/blob - libavcodec/h264_ps.c
g723.1dec: Make postfilter user switchable
[ffmpeg] / libavcodec / h264_ps.c
1 /*
2  * H.26L/H.264/AVC/JVT/14496-10/... parameter set decoding
3  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file
24  * H.264 / AVC / MPEG4 part10 parameter set decoding.
25  * @author Michael Niedermayer <michaelni@gmx.at>
26  */
27
28 #include "libavutil/imgutils.h"
29 #include "internal.h"
30 #include "dsputil.h"
31 #include "avcodec.h"
32 #include "h264.h"
33 #include "h264data.h" //FIXME FIXME FIXME (just for zigzag_scan)
34 #include "golomb.h"
35
36
37 //#undef NDEBUG
38 #include <assert.h>
39
40 static const AVRational pixel_aspect[17]={
41  {0, 1},
42  {1, 1},
43  {12, 11},
44  {10, 11},
45  {16, 11},
46  {40, 33},
47  {24, 11},
48  {20, 11},
49  {32, 11},
50  {80, 33},
51  {18, 11},
52  {15, 11},
53  {64, 33},
54  {160,99},
55  {4, 3},
56  {3, 2},
57  {2, 1},
58 };
59
60 #define QP(qP,depth) ( (qP)+6*((depth)-8) )
61
62 #define CHROMA_QP_TABLE_END(d) \
63      QP(0,d),  QP(1,d),  QP(2,d),  QP(3,d),  QP(4,d),  QP(5,d),\
64      QP(6,d),  QP(7,d),  QP(8,d),  QP(9,d), QP(10,d), QP(11,d),\
65     QP(12,d), QP(13,d), QP(14,d), QP(15,d), QP(16,d), QP(17,d),\
66     QP(18,d), QP(19,d), QP(20,d), QP(21,d), QP(22,d), QP(23,d),\
67     QP(24,d), QP(25,d), QP(26,d), QP(27,d), QP(28,d), QP(29,d),\
68     QP(29,d), QP(30,d), QP(31,d), QP(32,d), QP(32,d), QP(33,d),\
69     QP(34,d), QP(34,d), QP(35,d), QP(35,d), QP(36,d), QP(36,d),\
70     QP(37,d), QP(37,d), QP(37,d), QP(38,d), QP(38,d), QP(38,d),\
71     QP(39,d), QP(39,d), QP(39,d), QP(39,d)
72
73 const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM+1] = {
74     {
75         CHROMA_QP_TABLE_END(8)
76     },
77     {
78         0, 1, 2, 3, 4, 5,
79         CHROMA_QP_TABLE_END(9)
80     },
81     {
82         0, 1, 2, 3,  4,  5,
83         6, 7, 8, 9, 10, 11,
84         CHROMA_QP_TABLE_END(10)
85     },
86     {
87         0,  1, 2, 3,  4,  5,
88         6,  7, 8, 9, 10, 11,
89         12,13,14,15, 16, 17,
90         CHROMA_QP_TABLE_END(11)
91     },
92     {
93         0,  1, 2, 3,  4,  5,
94         6,  7, 8, 9, 10, 11,
95         12,13,14,15, 16, 17,
96         18,19,20,21, 22, 23,
97         CHROMA_QP_TABLE_END(12)
98     },
99     {
100         0,  1, 2, 3,  4,  5,
101         6,  7, 8, 9, 10, 11,
102         12,13,14,15, 16, 17,
103         18,19,20,21, 22, 23,
104         24,25,26,27, 28, 29,
105         CHROMA_QP_TABLE_END(13)
106     },
107     {
108         0,  1, 2, 3,  4,  5,
109         6,  7, 8, 9, 10, 11,
110         12,13,14,15, 16, 17,
111         18,19,20,21, 22, 23,
112         24,25,26,27, 28, 29,
113         30,31,32,33, 34, 35,
114         CHROMA_QP_TABLE_END(14)
115     },
116 };
117
118 static const uint8_t default_scaling4[2][16]={
119 {   6,13,20,28,
120    13,20,28,32,
121    20,28,32,37,
122    28,32,37,42
123 },{
124    10,14,20,24,
125    14,20,24,27,
126    20,24,27,30,
127    24,27,30,34
128 }};
129
130 static const uint8_t default_scaling8[2][64]={
131 {   6,10,13,16,18,23,25,27,
132    10,11,16,18,23,25,27,29,
133    13,16,18,23,25,27,29,31,
134    16,18,23,25,27,29,31,33,
135    18,23,25,27,29,31,33,36,
136    23,25,27,29,31,33,36,38,
137    25,27,29,31,33,36,38,40,
138    27,29,31,33,36,38,40,42
139 },{
140     9,13,15,17,19,21,22,24,
141    13,13,17,19,21,22,24,25,
142    15,17,19,21,22,24,25,27,
143    17,19,21,22,24,25,27,28,
144    19,21,22,24,25,27,28,30,
145    21,22,24,25,27,28,30,32,
146    22,24,25,27,28,30,32,33,
147    24,25,27,28,30,32,33,35
148 }};
149
150 static inline int decode_hrd_parameters(H264Context *h, SPS *sps){
151     MpegEncContext * const s = &h->s;
152     int cpb_count, i;
153     cpb_count = get_ue_golomb_31(&s->gb) + 1;
154
155     if(cpb_count > 32U){
156         av_log(h->s.avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
157         return -1;
158     }
159
160     get_bits(&s->gb, 4); /* bit_rate_scale */
161     get_bits(&s->gb, 4); /* cpb_size_scale */
162     for(i=0; i<cpb_count; i++){
163         get_ue_golomb_long(&s->gb); /* bit_rate_value_minus1 */
164         get_ue_golomb_long(&s->gb); /* cpb_size_value_minus1 */
165         get_bits1(&s->gb);     /* cbr_flag */
166     }
167     sps->initial_cpb_removal_delay_length = get_bits(&s->gb, 5) + 1;
168     sps->cpb_removal_delay_length = get_bits(&s->gb, 5) + 1;
169     sps->dpb_output_delay_length = get_bits(&s->gb, 5) + 1;
170     sps->time_offset_length = get_bits(&s->gb, 5);
171     sps->cpb_cnt = cpb_count;
172     return 0;
173 }
174
175 static inline int decode_vui_parameters(H264Context *h, SPS *sps){
176     MpegEncContext * const s = &h->s;
177     int aspect_ratio_info_present_flag;
178     unsigned int aspect_ratio_idc;
179
180     aspect_ratio_info_present_flag= get_bits1(&s->gb);
181
182     if( aspect_ratio_info_present_flag ) {
183         aspect_ratio_idc= get_bits(&s->gb, 8);
184         if( aspect_ratio_idc == EXTENDED_SAR ) {
185             sps->sar.num= get_bits(&s->gb, 16);
186             sps->sar.den= get_bits(&s->gb, 16);
187         }else if(aspect_ratio_idc < FF_ARRAY_ELEMS(pixel_aspect)){
188             sps->sar=  pixel_aspect[aspect_ratio_idc];
189         }else{
190             av_log(h->s.avctx, AV_LOG_ERROR, "illegal aspect ratio\n");
191             return -1;
192         }
193     }else{
194         sps->sar.num=
195         sps->sar.den= 0;
196     }
197 //            s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
198
199     if(get_bits1(&s->gb)){      /* overscan_info_present_flag */
200         get_bits1(&s->gb);      /* overscan_appropriate_flag */
201     }
202
203     sps->video_signal_type_present_flag = get_bits1(&s->gb);
204     if(sps->video_signal_type_present_flag){
205         get_bits(&s->gb, 3);    /* video_format */
206         sps->full_range = get_bits1(&s->gb); /* video_full_range_flag */
207
208         sps->colour_description_present_flag = get_bits1(&s->gb);
209         if(sps->colour_description_present_flag){
210             sps->color_primaries = get_bits(&s->gb, 8); /* colour_primaries */
211             sps->color_trc       = get_bits(&s->gb, 8); /* transfer_characteristics */
212             sps->colorspace      = get_bits(&s->gb, 8); /* matrix_coefficients */
213             if (sps->color_primaries >= AVCOL_PRI_NB)
214                 sps->color_primaries  = AVCOL_PRI_UNSPECIFIED;
215             if (sps->color_trc >= AVCOL_TRC_NB)
216                 sps->color_trc  = AVCOL_TRC_UNSPECIFIED;
217             if (sps->colorspace >= AVCOL_SPC_NB)
218                 sps->colorspace  = AVCOL_SPC_UNSPECIFIED;
219         }
220     }
221
222     if(get_bits1(&s->gb)){      /* chroma_location_info_present_flag */
223         s->avctx->chroma_sample_location = get_ue_golomb(&s->gb)+1;  /* chroma_sample_location_type_top_field */
224         get_ue_golomb(&s->gb);  /* chroma_sample_location_type_bottom_field */
225     }
226
227     sps->timing_info_present_flag = get_bits1(&s->gb);
228     if(sps->timing_info_present_flag){
229         sps->num_units_in_tick = get_bits_long(&s->gb, 32);
230         sps->time_scale = get_bits_long(&s->gb, 32);
231         if(!sps->num_units_in_tick || !sps->time_scale){
232             av_log(h->s.avctx, AV_LOG_ERROR, "time_scale/num_units_in_tick invalid or unsupported (%d/%d)\n", sps->time_scale, sps->num_units_in_tick);
233             return -1;
234         }
235         sps->fixed_frame_rate_flag = get_bits1(&s->gb);
236     }
237
238     sps->nal_hrd_parameters_present_flag = get_bits1(&s->gb);
239     if(sps->nal_hrd_parameters_present_flag)
240         if(decode_hrd_parameters(h, sps) < 0)
241             return -1;
242     sps->vcl_hrd_parameters_present_flag = get_bits1(&s->gb);
243     if(sps->vcl_hrd_parameters_present_flag)
244         if(decode_hrd_parameters(h, sps) < 0)
245             return -1;
246     if(sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag)
247         get_bits1(&s->gb);     /* low_delay_hrd_flag */
248     sps->pic_struct_present_flag = get_bits1(&s->gb);
249     if(!get_bits_left(&s->gb))
250         return 0;
251     sps->bitstream_restriction_flag = get_bits1(&s->gb);
252     if(sps->bitstream_restriction_flag){
253         get_bits1(&s->gb);     /* motion_vectors_over_pic_boundaries_flag */
254         get_ue_golomb(&s->gb); /* max_bytes_per_pic_denom */
255         get_ue_golomb(&s->gb); /* max_bits_per_mb_denom */
256         get_ue_golomb(&s->gb); /* log2_max_mv_length_horizontal */
257         get_ue_golomb(&s->gb); /* log2_max_mv_length_vertical */
258         sps->num_reorder_frames= get_ue_golomb(&s->gb);
259         get_ue_golomb(&s->gb); /*max_dec_frame_buffering*/
260
261         if (get_bits_left(&s->gb) < 0) {
262             sps->num_reorder_frames=0;
263             sps->bitstream_restriction_flag= 0;
264         }
265
266         if(sps->num_reorder_frames > 16U /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){
267             av_log(h->s.avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps->num_reorder_frames);
268             return -1;
269         }
270     }
271
272     if (get_bits_left(&s->gb) < 0) {
273         av_log(h->s.avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", -get_bits_left(&s->gb));
274         return AVERROR_INVALIDDATA;
275     }
276
277     return 0;
278 }
279
280 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size,
281                                 const uint8_t *jvt_list, const uint8_t *fallback_list){
282     MpegEncContext * const s = &h->s;
283     int i, last = 8, next = 8;
284     const uint8_t *scan = size == 16 ? zigzag_scan : ff_zigzag_direct;
285     if(!get_bits1(&s->gb)) /* matrix not written, we use the predicted one */
286         memcpy(factors, fallback_list, size*sizeof(uint8_t));
287     else
288     for(i=0;i<size;i++){
289         if(next)
290             next = (last + get_se_golomb(&s->gb)) & 0xff;
291         if(!i && !next){ /* matrix not written, we use the preset one */
292             memcpy(factors, jvt_list, size*sizeof(uint8_t));
293             break;
294         }
295         last = factors[scan[i]] = next ? next : last;
296     }
297 }
298
299 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
300                                    uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
301     MpegEncContext * const s = &h->s;
302     int fallback_sps = !is_sps && sps->scaling_matrix_present;
303     const uint8_t *fallback[4] = {
304         fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
305         fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
306         fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
307         fallback_sps ? sps->scaling_matrix8[3] : default_scaling8[1]
308     };
309     if(get_bits1(&s->gb)){
310         sps->scaling_matrix_present |= is_sps;
311         decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y
312         decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr
313         decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb
314         decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y
315         decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr
316         decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
317         if(is_sps || pps->transform_8x8_mode){
318             decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]);  // Intra, Y
319             decode_scaling_list(h,scaling_matrix8[3],64,default_scaling8[1],fallback[3]);  // Inter, Y
320             if(sps->chroma_format_idc == 3){
321                 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[0],scaling_matrix8[0]);  // Intra, Cr
322                 decode_scaling_list(h,scaling_matrix8[4],64,default_scaling8[1],scaling_matrix8[3]);  // Inter, Cr
323                 decode_scaling_list(h,scaling_matrix8[2],64,default_scaling8[0],scaling_matrix8[1]);  // Intra, Cb
324                 decode_scaling_list(h,scaling_matrix8[5],64,default_scaling8[1],scaling_matrix8[4]);  // Inter, Cb
325             }
326         }
327     }
328 }
329
330 int ff_h264_decode_seq_parameter_set(H264Context *h){
331     MpegEncContext * const s = &h->s;
332     int profile_idc, level_idc, constraint_set_flags = 0;
333     unsigned int sps_id;
334     int i;
335     SPS *sps;
336
337     profile_idc= get_bits(&s->gb, 8);
338     constraint_set_flags |= get_bits1(&s->gb) << 0;   //constraint_set0_flag
339     constraint_set_flags |= get_bits1(&s->gb) << 1;   //constraint_set1_flag
340     constraint_set_flags |= get_bits1(&s->gb) << 2;   //constraint_set2_flag
341     constraint_set_flags |= get_bits1(&s->gb) << 3;   //constraint_set3_flag
342     constraint_set_flags |= get_bits1(&s->gb) << 4;   //constraint_set4_flag
343     constraint_set_flags |= get_bits1(&s->gb) << 5;   //constraint_set5_flag
344     get_bits(&s->gb, 2); // reserved
345     level_idc= get_bits(&s->gb, 8);
346     sps_id= get_ue_golomb_31(&s->gb);
347
348     if(sps_id >= MAX_SPS_COUNT) {
349         av_log(h->s.avctx, AV_LOG_ERROR, "sps_id (%d) out of range\n", sps_id);
350         return -1;
351     }
352     sps= av_mallocz(sizeof(SPS));
353     if(sps == NULL)
354         return -1;
355
356     sps->time_offset_length = 24;
357     sps->profile_idc= profile_idc;
358     sps->constraint_set_flags = constraint_set_flags;
359     sps->level_idc= level_idc;
360     sps->full_range = -1;
361
362     memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4));
363     memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8));
364     sps->scaling_matrix_present = 0;
365     sps->colorspace = 2; //AVCOL_SPC_UNSPECIFIED
366
367     if(sps->profile_idc == 100 || sps->profile_idc == 110 ||
368        sps->profile_idc == 122 || sps->profile_idc == 244 || sps->profile_idc ==  44 ||
369        sps->profile_idc ==  83 || sps->profile_idc ==  86 || sps->profile_idc == 118 ||
370        sps->profile_idc == 128 ) {
371         sps->chroma_format_idc= get_ue_golomb_31(&s->gb);
372         if (sps->chroma_format_idc > 3U) {
373             av_log(h->s.avctx, AV_LOG_ERROR, "chroma_format_idc %d is illegal\n", sps->chroma_format_idc);
374             goto fail;
375         } else if(sps->chroma_format_idc == 3) {
376             sps->residual_color_transform_flag = get_bits1(&s->gb);
377             if(sps->residual_color_transform_flag) {
378                 av_log(h->s.avctx, AV_LOG_ERROR, "separate color planes are not supported\n");
379                 goto fail;
380             }
381         }
382         sps->bit_depth_luma   = get_ue_golomb(&s->gb) + 8;
383         sps->bit_depth_chroma = get_ue_golomb(&s->gb) + 8;
384         if (sps->bit_depth_luma > 14U || sps->bit_depth_chroma > 14U) {
385             av_log(h->s.avctx, AV_LOG_ERROR, "illegal bit depth value (%d, %d)\n",
386                    sps->bit_depth_luma, sps->bit_depth_chroma);
387             goto fail;
388         }
389         sps->transform_bypass = get_bits1(&s->gb);
390         decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
391     }else{
392         sps->chroma_format_idc= 1;
393         sps->bit_depth_luma   = 8;
394         sps->bit_depth_chroma = 8;
395     }
396
397     sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4;
398     if (sps->log2_max_frame_num < 4 || sps->log2_max_frame_num > 16) {
399         av_log(h->s.avctx, AV_LOG_ERROR, "illegal log2_max_frame_num %d\n",
400                sps->log2_max_frame_num);
401         goto fail;
402     }
403
404     sps->poc_type= get_ue_golomb_31(&s->gb);
405
406     if(sps->poc_type == 0){ //FIXME #define
407         unsigned t = get_ue_golomb(&s->gb);
408         if(t>12){
409             av_log(h->s.avctx, AV_LOG_ERROR, "log2_max_poc_lsb (%d) is out of range\n", t);
410             goto fail;
411         }
412         sps->log2_max_poc_lsb= t + 4;
413     } else if(sps->poc_type == 1){//FIXME #define
414         sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
415         sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
416         sps->offset_for_top_to_bottom_field= get_se_golomb(&s->gb);
417         sps->poc_cycle_length                = get_ue_golomb(&s->gb);
418
419         if((unsigned)sps->poc_cycle_length >= FF_ARRAY_ELEMS(sps->offset_for_ref_frame)){
420             av_log(h->s.avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps->poc_cycle_length);
421             goto fail;
422         }
423
424         for(i=0; i<sps->poc_cycle_length; i++)
425             sps->offset_for_ref_frame[i]= get_se_golomb(&s->gb);
426     }else if(sps->poc_type != 2){
427         av_log(h->s.avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
428         goto fail;
429     }
430
431     sps->ref_frame_count= get_ue_golomb_31(&s->gb);
432     if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count > 16U){
433         av_log(h->s.avctx, AV_LOG_ERROR, "too many reference frames\n");
434         goto fail;
435     }
436     sps->gaps_in_frame_num_allowed_flag= get_bits1(&s->gb);
437     sps->mb_width = get_ue_golomb(&s->gb) + 1;
438     sps->mb_height= get_ue_golomb(&s->gb) + 1;
439     if((unsigned)sps->mb_width >= INT_MAX/16 || (unsigned)sps->mb_height >= INT_MAX/16 ||
440        av_image_check_size(16*sps->mb_width, 16*sps->mb_height, 0, h->s.avctx)){
441         av_log(h->s.avctx, AV_LOG_ERROR, "mb_width/height overflow\n");
442         goto fail;
443     }
444
445     sps->frame_mbs_only_flag= get_bits1(&s->gb);
446     if(!sps->frame_mbs_only_flag)
447         sps->mb_aff= get_bits1(&s->gb);
448     else
449         sps->mb_aff= 0;
450
451     sps->direct_8x8_inference_flag= get_bits1(&s->gb);
452
453 #ifndef ALLOW_INTERLACE
454     if(sps->mb_aff)
455         av_log(h->s.avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n");
456 #endif
457     sps->crop= get_bits1(&s->gb);
458     if(sps->crop){
459         int crop_vertical_limit   = sps->chroma_format_idc  & 2 ? 16 : 8;
460         int crop_horizontal_limit = sps->chroma_format_idc == 3 ? 16 : 8;
461         sps->crop_left  = get_ue_golomb(&s->gb);
462         sps->crop_right = get_ue_golomb(&s->gb);
463         sps->crop_top   = get_ue_golomb(&s->gb);
464         sps->crop_bottom= get_ue_golomb(&s->gb);
465         if(sps->crop_left || sps->crop_top){
466             av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ... (left: %d, top: %d)\n", sps->crop_left, sps->crop_top);
467         }
468         if(sps->crop_right >= crop_horizontal_limit || sps->crop_bottom >= crop_vertical_limit){
469             av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, cropping disabled (right: %d, bottom: %d)\n", sps->crop_right, sps->crop_bottom);
470         /* It is very unlikely that partial cropping will make anybody happy.
471          * Not cropping at all fixes for example playback of Sisvel 3D streams
472          * in applications supporting Sisvel 3D. */
473         sps->crop_left  =
474         sps->crop_right =
475         sps->crop_top   =
476         sps->crop_bottom= 0;
477         }
478     }else{
479         sps->crop_left  =
480         sps->crop_right =
481         sps->crop_top   =
482         sps->crop_bottom= 0;
483     }
484
485     sps->vui_parameters_present_flag= get_bits1(&s->gb);
486     if( sps->vui_parameters_present_flag )
487         if (decode_vui_parameters(h, sps) < 0)
488             goto fail;
489
490     if(!sps->sar.den)
491         sps->sar.den= 1;
492
493     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
494         av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s %d/%d b%d\n",
495                sps_id, sps->profile_idc, sps->level_idc,
496                sps->poc_type,
497                sps->ref_frame_count,
498                sps->mb_width, sps->mb_height,
499                sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
500                sps->direct_8x8_inference_flag ? "8B8" : "",
501                sps->crop_left, sps->crop_right,
502                sps->crop_top, sps->crop_bottom,
503                sps->vui_parameters_present_flag ? "VUI" : "",
504                ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc],
505                sps->timing_info_present_flag ? sps->num_units_in_tick : 0,
506                sps->timing_info_present_flag ? sps->time_scale : 0,
507                sps->bit_depth_luma
508                );
509     }
510
511     av_free(h->sps_buffers[sps_id]);
512     h->sps_buffers[sps_id]= sps;
513     h->sps = *sps;
514     return 0;
515 fail:
516     av_free(sps);
517     return -1;
518 }
519
520 static void
521 build_qp_table(PPS *pps, int t, int index, const int depth)
522 {
523     int i;
524     const int max_qp = 51 + 6*(depth-8);
525     for(i = 0; i < max_qp+1; i++)
526         pps->chroma_qp_table[t][i] = ff_h264_chroma_qp[depth-8][av_clip(i + index, 0, max_qp)];
527 }
528
529 static int more_rbsp_data_in_pps(H264Context *h, PPS *pps)
530 {
531     const SPS *sps = h->sps_buffers[pps->sps_id];
532     int profile_idc = sps->profile_idc;
533
534     if ((profile_idc == 66 || profile_idc == 77 ||
535          profile_idc == 88) && (sps->constraint_set_flags & 7)) {
536         av_log(h->s.avctx, AV_LOG_VERBOSE,
537                "Current profile doesn't provide more RBSP data in PPS, skipping\n");
538         return 0;
539     }
540
541     return 1;
542 }
543
544 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
545     MpegEncContext * const s = &h->s;
546     unsigned int pps_id= get_ue_golomb(&s->gb);
547     PPS *pps;
548     const int qp_bd_offset = 6*(h->sps.bit_depth_luma-8);
549     int bits_left;
550
551     if(pps_id >= MAX_PPS_COUNT) {
552         av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id);
553         return -1;
554     } else if (h->sps.bit_depth_luma > 14) {
555         av_log(h->s.avctx, AV_LOG_ERROR, "Invalid luma bit depth=%d\n", h->sps.bit_depth_luma);
556         return AVERROR_INVALIDDATA;
557     } else if (h->sps.bit_depth_luma == 11 || h->sps.bit_depth_luma == 13) {
558         av_log(h->s.avctx, AV_LOG_ERROR, "Unimplemented luma bit depth=%d\n", h->sps.bit_depth_luma);
559         return AVERROR_PATCHWELCOME;
560     }
561
562     pps= av_mallocz(sizeof(PPS));
563     if(pps == NULL)
564         return -1;
565     pps->sps_id= get_ue_golomb_31(&s->gb);
566     if((unsigned)pps->sps_id>=MAX_SPS_COUNT || h->sps_buffers[pps->sps_id] == NULL){
567         av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of range\n");
568         goto fail;
569     }
570
571     pps->cabac= get_bits1(&s->gb);
572     pps->pic_order_present= get_bits1(&s->gb);
573     pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
574     if(pps->slice_group_count > 1 ){
575         pps->mb_slice_group_map_type= get_ue_golomb(&s->gb);
576         av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n");
577         switch(pps->mb_slice_group_map_type){
578         case 0:
579 #if 0
580 |   for( i = 0; i <= num_slice_groups_minus1; i++ ) |   |        |
581 |    run_length[ i ]                                |1  |ue(v)   |
582 #endif
583             break;
584         case 2:
585 #if 0
586 |   for( i = 0; i < num_slice_groups_minus1; i++ )  |   |        |
587 |{                                                  |   |        |
588 |    top_left_mb[ i ]                               |1  |ue(v)   |
589 |    bottom_right_mb[ i ]                           |1  |ue(v)   |
590 |   }                                               |   |        |
591 #endif
592             break;
593         case 3:
594         case 4:
595         case 5:
596 #if 0
597 |   slice_group_change_direction_flag               |1  |u(1)    |
598 |   slice_group_change_rate_minus1                  |1  |ue(v)   |
599 #endif
600             break;
601         case 6:
602 #if 0
603 |   slice_group_id_cnt_minus1                       |1  |ue(v)   |
604 |   for( i = 0; i <= slice_group_id_cnt_minus1; i++ |   |        |
605 |)                                                  |   |        |
606 |    slice_group_id[ i ]                            |1  |u(v)    |
607 #endif
608             break;
609         }
610     }
611     pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
612     pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
613     if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){
614         av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)\n");
615         goto fail;
616     }
617
618     pps->weighted_pred= get_bits1(&s->gb);
619     pps->weighted_bipred_idc= get_bits(&s->gb, 2);
620     pps->init_qp= get_se_golomb(&s->gb) + 26 + qp_bd_offset;
621     pps->init_qs= get_se_golomb(&s->gb) + 26 + qp_bd_offset;
622     pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb);
623     pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
624     pps->constrained_intra_pred= get_bits1(&s->gb);
625     pps->redundant_pic_cnt_present = get_bits1(&s->gb);
626
627     pps->transform_8x8_mode= 0;
628     h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit
629     memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4));
630     memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8));
631
632     bits_left = bit_length - get_bits_count(&s->gb);
633     if(bits_left > 0 && more_rbsp_data_in_pps(h, pps)){
634         pps->transform_8x8_mode= get_bits1(&s->gb);
635         decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
636         pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset
637     } else {
638         pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0];
639     }
640
641     build_qp_table(pps, 0, pps->chroma_qp_index_offset[0], h->sps.bit_depth_luma);
642     build_qp_table(pps, 1, pps->chroma_qp_index_offset[1], h->sps.bit_depth_luma);
643     if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1])
644         pps->chroma_qp_diff= 1;
645
646     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
647         av_log(h->s.avctx, AV_LOG_DEBUG, "pps:%u sps:%u %s slice_groups:%d ref:%d/%d %s qp:%d/%d/%d/%d %s %s %s %s\n",
648                pps_id, pps->sps_id,
649                pps->cabac ? "CABAC" : "CAVLC",
650                pps->slice_group_count,
651                pps->ref_count[0], pps->ref_count[1],
652                pps->weighted_pred ? "weighted" : "",
653                pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1],
654                pps->deblocking_filter_parameters_present ? "LPAR" : "",
655                pps->constrained_intra_pred ? "CONSTR" : "",
656                pps->redundant_pic_cnt_present ? "REDU" : "",
657                pps->transform_8x8_mode ? "8x8DCT" : ""
658                );
659     }
660
661     av_free(h->pps_buffers[pps_id]);
662     h->pps_buffers[pps_id]= pps;
663     return 0;
664 fail:
665     av_free(pps);
666     return -1;
667 }