]> git.sesse.net Git - ffmpeg/blob - libavcodec/h264_ps.c
cavsdec: check dimensions being valid.
[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         static const char csp[4][5] = { "Gray", "420", "422", "444" };
495         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 reo:%d\n",
496                sps_id, sps->profile_idc, sps->level_idc,
497                sps->poc_type,
498                sps->ref_frame_count,
499                sps->mb_width, sps->mb_height,
500                sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
501                sps->direct_8x8_inference_flag ? "8B8" : "",
502                sps->crop_left, sps->crop_right,
503                sps->crop_top, sps->crop_bottom,
504                sps->vui_parameters_present_flag ? "VUI" : "",
505                csp[sps->chroma_format_idc],
506                sps->timing_info_present_flag ? sps->num_units_in_tick : 0,
507                sps->timing_info_present_flag ? sps->time_scale : 0,
508                sps->bit_depth_luma,
509                h->sps.bitstream_restriction_flag ? sps->num_reorder_frames : -1
510                );
511     }
512
513     av_free(h->sps_buffers[sps_id]);
514     h->sps_buffers[sps_id]= sps;
515     h->sps = *sps;
516     return 0;
517 fail:
518     av_free(sps);
519     return -1;
520 }
521
522 static void
523 build_qp_table(PPS *pps, int t, int index, const int depth)
524 {
525     int i;
526     const int max_qp = 51 + 6*(depth-8);
527     for(i = 0; i < max_qp+1; i++)
528         pps->chroma_qp_table[t][i] = ff_h264_chroma_qp[depth-8][av_clip(i + index, 0, max_qp)];
529 }
530
531 static int more_rbsp_data_in_pps(H264Context *h, PPS *pps)
532 {
533     const SPS *sps = h->sps_buffers[pps->sps_id];
534     int profile_idc = sps->profile_idc;
535
536     if ((profile_idc == 66 || profile_idc == 77 ||
537          profile_idc == 88) && (sps->constraint_set_flags & 7)) {
538         av_log(h->s.avctx, AV_LOG_VERBOSE,
539                "Current profile doesn't provide more RBSP data in PPS, skipping\n");
540         return 0;
541     }
542
543     return 1;
544 }
545
546 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
547     MpegEncContext * const s = &h->s;
548     unsigned int pps_id= get_ue_golomb(&s->gb);
549     PPS *pps;
550     const int qp_bd_offset = 6*(h->sps.bit_depth_luma-8);
551     int bits_left;
552
553     if(pps_id >= MAX_PPS_COUNT) {
554         av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id);
555         return -1;
556     } else if (h->sps.bit_depth_luma > 14) {
557         av_log(h->s.avctx, AV_LOG_ERROR, "Invalid luma bit depth=%d\n", h->sps.bit_depth_luma);
558         return AVERROR_INVALIDDATA;
559     } else if (h->sps.bit_depth_luma == 11 || h->sps.bit_depth_luma == 13) {
560         av_log(h->s.avctx, AV_LOG_ERROR, "Unimplemented luma bit depth=%d\n", h->sps.bit_depth_luma);
561         return AVERROR_PATCHWELCOME;
562     }
563
564     pps= av_mallocz(sizeof(PPS));
565     if(pps == NULL)
566         return -1;
567     pps->sps_id= get_ue_golomb_31(&s->gb);
568     if((unsigned)pps->sps_id>=MAX_SPS_COUNT || h->sps_buffers[pps->sps_id] == NULL){
569         av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of range\n");
570         goto fail;
571     }
572
573     pps->cabac= get_bits1(&s->gb);
574     pps->pic_order_present= get_bits1(&s->gb);
575     pps->slice_group_count= get_ue_golomb(&s->gb) + 1;
576     if(pps->slice_group_count > 1 ){
577         pps->mb_slice_group_map_type= get_ue_golomb(&s->gb);
578         av_log(h->s.avctx, AV_LOG_ERROR, "FMO not supported\n");
579         switch(pps->mb_slice_group_map_type){
580         case 0:
581 #if 0
582 |   for( i = 0; i <= num_slice_groups_minus1; i++ ) |   |        |
583 |    run_length[ i ]                                |1  |ue(v)   |
584 #endif
585             break;
586         case 2:
587 #if 0
588 |   for( i = 0; i < num_slice_groups_minus1; i++ )  |   |        |
589 |{                                                  |   |        |
590 |    top_left_mb[ i ]                               |1  |ue(v)   |
591 |    bottom_right_mb[ i ]                           |1  |ue(v)   |
592 |   }                                               |   |        |
593 #endif
594             break;
595         case 3:
596         case 4:
597         case 5:
598 #if 0
599 |   slice_group_change_direction_flag               |1  |u(1)    |
600 |   slice_group_change_rate_minus1                  |1  |ue(v)   |
601 #endif
602             break;
603         case 6:
604 #if 0
605 |   slice_group_id_cnt_minus1                       |1  |ue(v)   |
606 |   for( i = 0; i <= slice_group_id_cnt_minus1; i++ |   |        |
607 |)                                                  |   |        |
608 |    slice_group_id[ i ]                            |1  |u(v)    |
609 #endif
610             break;
611         }
612     }
613     pps->ref_count[0]= get_ue_golomb(&s->gb) + 1;
614     pps->ref_count[1]= get_ue_golomb(&s->gb) + 1;
615     if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){
616         av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow (pps)\n");
617         goto fail;
618     }
619
620     pps->weighted_pred= get_bits1(&s->gb);
621     pps->weighted_bipred_idc= get_bits(&s->gb, 2);
622     pps->init_qp= get_se_golomb(&s->gb) + 26 + qp_bd_offset;
623     pps->init_qs= get_se_golomb(&s->gb) + 26 + qp_bd_offset;
624     pps->chroma_qp_index_offset[0]= get_se_golomb(&s->gb);
625     pps->deblocking_filter_parameters_present= get_bits1(&s->gb);
626     pps->constrained_intra_pred= get_bits1(&s->gb);
627     pps->redundant_pic_cnt_present = get_bits1(&s->gb);
628
629     pps->transform_8x8_mode= 0;
630     h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit
631     memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4));
632     memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8));
633
634     bits_left = bit_length - get_bits_count(&s->gb);
635     if(bits_left > 0 && more_rbsp_data_in_pps(h, pps)){
636         pps->transform_8x8_mode= get_bits1(&s->gb);
637         decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
638         pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset
639     } else {
640         pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0];
641     }
642
643     build_qp_table(pps, 0, pps->chroma_qp_index_offset[0], h->sps.bit_depth_luma);
644     build_qp_table(pps, 1, pps->chroma_qp_index_offset[1], h->sps.bit_depth_luma);
645     if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1])
646         pps->chroma_qp_diff= 1;
647
648     if(s->avctx->debug&FF_DEBUG_PICT_INFO){
649         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",
650                pps_id, pps->sps_id,
651                pps->cabac ? "CABAC" : "CAVLC",
652                pps->slice_group_count,
653                pps->ref_count[0], pps->ref_count[1],
654                pps->weighted_pred ? "weighted" : "",
655                pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1],
656                pps->deblocking_filter_parameters_present ? "LPAR" : "",
657                pps->constrained_intra_pred ? "CONSTR" : "",
658                pps->redundant_pic_cnt_present ? "REDU" : "",
659                pps->transform_8x8_mode ? "8x8DCT" : ""
660                );
661     }
662
663     av_free(h->pps_buffers[pps_id]);
664     h->pps_buffers[pps_id]= pps;
665     return 0;
666 fail:
667     av_free(pps);
668     return -1;
669 }