]> git.sesse.net Git - ffmpeg/blob - libavcodec/h264_ps.c
ffv1dec: add code to support frame threading with gop=1 ffv1
[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 "avcodec.h"
31 #include "h264.h"
32 #include "h264data.h" //FIXME FIXME FIXME (just for zigzag_scan)
33 #include "golomb.h"
34
35
36 //#undef NDEBUG
37 #include <assert.h>
38
39 #define MAX_LOG2_MAX_FRAME_NUM    (12 + 4)
40 #define MIN_LOG2_MAX_FRAME_NUM    4
41
42 static const AVRational pixel_aspect[17]={
43  {0, 1},
44  {1, 1},
45  {12, 11},
46  {10, 11},
47  {16, 11},
48  {40, 33},
49  {24, 11},
50  {20, 11},
51  {32, 11},
52  {80, 33},
53  {18, 11},
54  {15, 11},
55  {64, 33},
56  {160,99},
57  {4, 3},
58  {3, 2},
59  {2, 1},
60 };
61
62 #define QP(qP,depth) ( (qP)+6*((depth)-8) )
63
64 #define CHROMA_QP_TABLE_END(d) \
65      QP(0,d),  QP(1,d),  QP(2,d),  QP(3,d),  QP(4,d),  QP(5,d),\
66      QP(6,d),  QP(7,d),  QP(8,d),  QP(9,d), QP(10,d), QP(11,d),\
67     QP(12,d), QP(13,d), QP(14,d), QP(15,d), QP(16,d), QP(17,d),\
68     QP(18,d), QP(19,d), QP(20,d), QP(21,d), QP(22,d), QP(23,d),\
69     QP(24,d), QP(25,d), QP(26,d), QP(27,d), QP(28,d), QP(29,d),\
70     QP(29,d), QP(30,d), QP(31,d), QP(32,d), QP(32,d), QP(33,d),\
71     QP(34,d), QP(34,d), QP(35,d), QP(35,d), QP(36,d), QP(36,d),\
72     QP(37,d), QP(37,d), QP(37,d), QP(38,d), QP(38,d), QP(38,d),\
73     QP(39,d), QP(39,d), QP(39,d), QP(39,d)
74
75 const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM+1] = {
76     {
77         CHROMA_QP_TABLE_END(8)
78     },
79     {
80         0, 1, 2, 3, 4, 5,
81         CHROMA_QP_TABLE_END(9)
82     },
83     {
84         0, 1, 2, 3,  4,  5,
85         6, 7, 8, 9, 10, 11,
86         CHROMA_QP_TABLE_END(10)
87     },
88     {
89         0,  1, 2, 3,  4,  5,
90         6,  7, 8, 9, 10, 11,
91         12,13,14,15, 16, 17,
92         CHROMA_QP_TABLE_END(11)
93     },
94     {
95         0,  1, 2, 3,  4,  5,
96         6,  7, 8, 9, 10, 11,
97         12,13,14,15, 16, 17,
98         18,19,20,21, 22, 23,
99         CHROMA_QP_TABLE_END(12)
100     },
101     {
102         0,  1, 2, 3,  4,  5,
103         6,  7, 8, 9, 10, 11,
104         12,13,14,15, 16, 17,
105         18,19,20,21, 22, 23,
106         24,25,26,27, 28, 29,
107         CHROMA_QP_TABLE_END(13)
108     },
109     {
110         0,  1, 2, 3,  4,  5,
111         6,  7, 8, 9, 10, 11,
112         12,13,14,15, 16, 17,
113         18,19,20,21, 22, 23,
114         24,25,26,27, 28, 29,
115         30,31,32,33, 34, 35,
116         CHROMA_QP_TABLE_END(14)
117     },
118 };
119
120 static const uint8_t default_scaling4[2][16]={
121 {   6,13,20,28,
122    13,20,28,32,
123    20,28,32,37,
124    28,32,37,42
125 },{
126    10,14,20,24,
127    14,20,24,27,
128    20,24,27,30,
129    24,27,30,34
130 }};
131
132 static const uint8_t default_scaling8[2][64]={
133 {   6,10,13,16,18,23,25,27,
134    10,11,16,18,23,25,27,29,
135    13,16,18,23,25,27,29,31,
136    16,18,23,25,27,29,31,33,
137    18,23,25,27,29,31,33,36,
138    23,25,27,29,31,33,36,38,
139    25,27,29,31,33,36,38,40,
140    27,29,31,33,36,38,40,42
141 },{
142     9,13,15,17,19,21,22,24,
143    13,13,17,19,21,22,24,25,
144    15,17,19,21,22,24,25,27,
145    17,19,21,22,24,25,27,28,
146    19,21,22,24,25,27,28,30,
147    21,22,24,25,27,28,30,32,
148    22,24,25,27,28,30,32,33,
149    24,25,27,28,30,32,33,35
150 }};
151
152 static inline int decode_hrd_parameters(H264Context *h, SPS *sps){
153     int cpb_count, i;
154     cpb_count = get_ue_golomb_31(&h->gb) + 1;
155
156     if(cpb_count > 32U){
157         av_log(h->avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
158         return -1;
159     }
160
161     get_bits(&h->gb, 4); /* bit_rate_scale */
162     get_bits(&h->gb, 4); /* cpb_size_scale */
163     for(i=0; i<cpb_count; i++){
164         get_ue_golomb_long(&h->gb); /* bit_rate_value_minus1 */
165         get_ue_golomb_long(&h->gb); /* cpb_size_value_minus1 */
166         get_bits1(&h->gb);     /* cbr_flag */
167     }
168     sps->initial_cpb_removal_delay_length = get_bits(&h->gb, 5) + 1;
169     sps->cpb_removal_delay_length = get_bits(&h->gb, 5) + 1;
170     sps->dpb_output_delay_length = get_bits(&h->gb, 5) + 1;
171     sps->time_offset_length = get_bits(&h->gb, 5);
172     sps->cpb_cnt = cpb_count;
173     return 0;
174 }
175
176 static inline int decode_vui_parameters(H264Context *h, SPS *sps){
177     int aspect_ratio_info_present_flag;
178     unsigned int aspect_ratio_idc;
179
180     aspect_ratio_info_present_flag= get_bits1(&h->gb);
181
182     if( aspect_ratio_info_present_flag ) {
183         aspect_ratio_idc= get_bits(&h->gb, 8);
184         if( aspect_ratio_idc == EXTENDED_SAR ) {
185             sps->sar.num= get_bits(&h->gb, 16);
186             sps->sar.den= get_bits(&h->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->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(&h->gb)){      /* overscan_info_present_flag */
200         get_bits1(&h->gb);      /* overscan_appropriate_flag */
201     }
202
203     sps->video_signal_type_present_flag = get_bits1(&h->gb);
204     if(sps->video_signal_type_present_flag){
205         get_bits(&h->gb, 3);    /* video_format */
206         sps->full_range = get_bits1(&h->gb); /* video_full_range_flag */
207
208         sps->colour_description_present_flag = get_bits1(&h->gb);
209         if(sps->colour_description_present_flag){
210             sps->color_primaries = get_bits(&h->gb, 8); /* colour_primaries */
211             sps->color_trc       = get_bits(&h->gb, 8); /* transfer_characteristics */
212             sps->colorspace      = get_bits(&h->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(&h->gb)){      /* chroma_location_info_present_flag */
223         h->avctx->chroma_sample_location = get_ue_golomb(&h->gb)+1;  /* chroma_sample_location_type_top_field */
224         get_ue_golomb(&h->gb);  /* chroma_sample_location_type_bottom_field */
225     }
226
227     sps->timing_info_present_flag = get_bits1(&h->gb);
228     if(sps->timing_info_present_flag){
229         sps->num_units_in_tick = get_bits_long(&h->gb, 32);
230         sps->time_scale = get_bits_long(&h->gb, 32);
231         if(!sps->num_units_in_tick || !sps->time_scale){
232             av_log(h->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(&h->gb);
236     }
237
238     sps->nal_hrd_parameters_present_flag = get_bits1(&h->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(&h->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(&h->gb);     /* low_delay_hrd_flag */
248     sps->pic_struct_present_flag = get_bits1(&h->gb);
249     if(!get_bits_left(&h->gb))
250         return 0;
251     sps->bitstream_restriction_flag = get_bits1(&h->gb);
252     if(sps->bitstream_restriction_flag){
253         get_bits1(&h->gb);     /* motion_vectors_over_pic_boundaries_flag */
254         get_ue_golomb(&h->gb); /* max_bytes_per_pic_denom */
255         get_ue_golomb(&h->gb); /* max_bits_per_mb_denom */
256         get_ue_golomb(&h->gb); /* log2_max_mv_length_horizontal */
257         get_ue_golomb(&h->gb); /* log2_max_mv_length_vertical */
258         sps->num_reorder_frames= get_ue_golomb(&h->gb);
259         get_ue_golomb(&h->gb); /*max_dec_frame_buffering*/
260
261         if (get_bits_left(&h->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->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(&h->gb) < 0) {
273         av_log(h->avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", -get_bits_left(&h->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     int i, last = 8, next = 8;
283     const uint8_t *scan = size == 16 ? zigzag_scan : ff_zigzag_direct;
284     if(!get_bits1(&h->gb)) /* matrix not written, we use the predicted one */
285         memcpy(factors, fallback_list, size*sizeof(uint8_t));
286     else
287     for(i=0;i<size;i++){
288         if(next)
289             next = (last + get_se_golomb(&h->gb)) & 0xff;
290         if(!i && !next){ /* matrix not written, we use the preset one */
291             memcpy(factors, jvt_list, size*sizeof(uint8_t));
292             break;
293         }
294         last = factors[scan[i]] = next ? next : last;
295     }
296 }
297
298 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
299                                    uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
300     int fallback_sps = !is_sps && sps->scaling_matrix_present;
301     const uint8_t *fallback[4] = {
302         fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
303         fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
304         fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
305         fallback_sps ? sps->scaling_matrix8[3] : default_scaling8[1]
306     };
307     if(get_bits1(&h->gb)){
308         sps->scaling_matrix_present |= is_sps;
309         decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y
310         decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr
311         decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb
312         decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y
313         decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr
314         decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
315         if(is_sps || pps->transform_8x8_mode){
316             decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]);  // Intra, Y
317             decode_scaling_list(h,scaling_matrix8[3],64,default_scaling8[1],fallback[3]);  // Inter, Y
318             if(sps->chroma_format_idc == 3){
319                 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[0],scaling_matrix8[0]);  // Intra, Cr
320                 decode_scaling_list(h,scaling_matrix8[4],64,default_scaling8[1],scaling_matrix8[3]);  // Inter, Cr
321                 decode_scaling_list(h,scaling_matrix8[2],64,default_scaling8[0],scaling_matrix8[1]);  // Intra, Cb
322                 decode_scaling_list(h,scaling_matrix8[5],64,default_scaling8[1],scaling_matrix8[4]);  // Inter, Cb
323             }
324         }
325     }
326 }
327
328 int ff_h264_decode_seq_parameter_set(H264Context *h){
329     int profile_idc, level_idc, constraint_set_flags = 0;
330     unsigned int sps_id;
331     int i, log2_max_frame_num_minus4;
332     SPS *sps;
333
334     profile_idc= get_bits(&h->gb, 8);
335     constraint_set_flags |= get_bits1(&h->gb) << 0;   //constraint_set0_flag
336     constraint_set_flags |= get_bits1(&h->gb) << 1;   //constraint_set1_flag
337     constraint_set_flags |= get_bits1(&h->gb) << 2;   //constraint_set2_flag
338     constraint_set_flags |= get_bits1(&h->gb) << 3;   //constraint_set3_flag
339     constraint_set_flags |= get_bits1(&h->gb) << 4;   //constraint_set4_flag
340     constraint_set_flags |= get_bits1(&h->gb) << 5;   //constraint_set5_flag
341     get_bits(&h->gb, 2); // reserved
342     level_idc= get_bits(&h->gb, 8);
343     sps_id= get_ue_golomb_31(&h->gb);
344
345     if(sps_id >= MAX_SPS_COUNT) {
346         av_log(h->avctx, AV_LOG_ERROR, "sps_id (%d) out of range\n", sps_id);
347         return -1;
348     }
349     sps= av_mallocz(sizeof(SPS));
350     if(sps == NULL)
351         return -1;
352
353     sps->time_offset_length = 24;
354     sps->profile_idc= profile_idc;
355     sps->constraint_set_flags = constraint_set_flags;
356     sps->level_idc= level_idc;
357     sps->full_range = -1;
358
359     memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4));
360     memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8));
361     sps->scaling_matrix_present = 0;
362     sps->colorspace = 2; //AVCOL_SPC_UNSPECIFIED
363
364     if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
365         sps->profile_idc == 122 || sps->profile_idc == 244 ||
366         sps->profile_idc ==  44 || sps->profile_idc ==  83 ||
367         sps->profile_idc ==  86 || sps->profile_idc == 118 ||
368         sps->profile_idc == 128 || sps->profile_idc == 144) {
369         sps->chroma_format_idc= get_ue_golomb_31(&h->gb);
370         if (sps->chroma_format_idc > 3U) {
371             av_log(h->avctx, AV_LOG_ERROR, "chroma_format_idc %d is illegal\n", sps->chroma_format_idc);
372             goto fail;
373         } else if(sps->chroma_format_idc == 3) {
374             sps->residual_color_transform_flag = get_bits1(&h->gb);
375             if(sps->residual_color_transform_flag) {
376                 av_log(h->avctx, AV_LOG_ERROR, "separate color planes are not supported\n");
377                 goto fail;
378             }
379         }
380         sps->bit_depth_luma   = get_ue_golomb(&h->gb) + 8;
381         sps->bit_depth_chroma = get_ue_golomb(&h->gb) + 8;
382         if (sps->bit_depth_luma > 14U || sps->bit_depth_chroma > 14U || sps->bit_depth_luma != sps->bit_depth_chroma) {
383             av_log(h->avctx, AV_LOG_ERROR, "illegal bit depth value (%d, %d)\n",
384                    sps->bit_depth_luma, sps->bit_depth_chroma);
385             goto fail;
386         }
387         sps->transform_bypass = get_bits1(&h->gb);
388         decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
389     }else{
390         sps->chroma_format_idc= 1;
391         sps->bit_depth_luma   = 8;
392         sps->bit_depth_chroma = 8;
393     }
394
395     log2_max_frame_num_minus4 = get_ue_golomb(&h->gb);
396     if (log2_max_frame_num_minus4 < MIN_LOG2_MAX_FRAME_NUM - 4 ||
397         log2_max_frame_num_minus4 > MAX_LOG2_MAX_FRAME_NUM - 4) {
398         av_log(h->avctx, AV_LOG_ERROR,
399                "log2_max_frame_num_minus4 out of range (0-12): %d\n",
400                log2_max_frame_num_minus4);
401         goto fail;
402     }
403     sps->log2_max_frame_num = log2_max_frame_num_minus4 + 4;
404
405     sps->poc_type= get_ue_golomb_31(&h->gb);
406
407     if(sps->poc_type == 0){ //FIXME #define
408         unsigned t = get_ue_golomb(&h->gb);
409         if(t>12){
410             av_log(h->avctx, AV_LOG_ERROR, "log2_max_poc_lsb (%d) is out of range\n", t);
411             goto fail;
412         }
413         sps->log2_max_poc_lsb= t + 4;
414     } else if(sps->poc_type == 1){//FIXME #define
415         sps->delta_pic_order_always_zero_flag= get_bits1(&h->gb);
416         sps->offset_for_non_ref_pic= get_se_golomb(&h->gb);
417         sps->offset_for_top_to_bottom_field= get_se_golomb(&h->gb);
418         sps->poc_cycle_length                = get_ue_golomb(&h->gb);
419
420         if((unsigned)sps->poc_cycle_length >= FF_ARRAY_ELEMS(sps->offset_for_ref_frame)){
421             av_log(h->avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps->poc_cycle_length);
422             goto fail;
423         }
424
425         for(i=0; i<sps->poc_cycle_length; i++)
426             sps->offset_for_ref_frame[i]= get_se_golomb(&h->gb);
427     }else if(sps->poc_type != 2){
428         av_log(h->avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
429         goto fail;
430     }
431
432     sps->ref_frame_count= get_ue_golomb_31(&h->gb);
433     if (h->avctx->codec_tag == MKTAG('S', 'M', 'V', '2'))
434         sps->ref_frame_count= FFMAX(2, sps->ref_frame_count);
435     if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count > 16U){
436         av_log(h->avctx, AV_LOG_ERROR, "too many reference frames\n");
437         goto fail;
438     }
439     sps->gaps_in_frame_num_allowed_flag= get_bits1(&h->gb);
440     sps->mb_width = get_ue_golomb(&h->gb) + 1;
441     sps->mb_height= get_ue_golomb(&h->gb) + 1;
442     if((unsigned)sps->mb_width >= INT_MAX/16 || (unsigned)sps->mb_height >= INT_MAX/16 ||
443        av_image_check_size(16*sps->mb_width, 16*sps->mb_height, 0, h->avctx)){
444         av_log(h->avctx, AV_LOG_ERROR, "mb_width/height overflow\n");
445         goto fail;
446     }
447
448     sps->frame_mbs_only_flag= get_bits1(&h->gb);
449     if(!sps->frame_mbs_only_flag)
450         sps->mb_aff= get_bits1(&h->gb);
451     else
452         sps->mb_aff= 0;
453
454     sps->direct_8x8_inference_flag= get_bits1(&h->gb);
455
456 #ifndef ALLOW_INTERLACE
457     if(sps->mb_aff)
458         av_log(h->avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n");
459 #endif
460     sps->crop= get_bits1(&h->gb);
461     if(sps->crop){
462         int crop_left   = get_ue_golomb(&h->gb);
463         int crop_right  = get_ue_golomb(&h->gb);
464         int crop_top    = get_ue_golomb(&h->gb);
465         int crop_bottom = get_ue_golomb(&h->gb);
466
467         if (h->avctx->flags2 & CODEC_FLAG2_IGNORE_CROP) {
468             av_log(h->avctx, AV_LOG_DEBUG, "discarding sps cropping, original "
469                    "values are l:%u r:%u t:%u b:%u\n", crop_left, crop_right,
470                    crop_top, crop_bottom);
471
472             sps->crop_left   =
473             sps->crop_right  =
474             sps->crop_top    =
475             sps->crop_bottom = 0;
476         } else {
477             int vsub = (sps->chroma_format_idc == 1) ? 1 : 0;
478             int hsub = (sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2) ? 1 : 0;
479             int step_x = 1 << hsub;
480             int step_y = (2 - sps->frame_mbs_only_flag) << vsub;
481
482             if (crop_left & (0x1F >> (sps->bit_depth_luma > 8)) &&
483                 !(h->avctx->flags & CODEC_FLAG_UNALIGNED)) {
484                 crop_left &= ~(0x1F >> (sps->bit_depth_luma > 8));
485                 av_log(h->avctx, AV_LOG_WARNING, "Reducing left cropping to %d "
486                        "chroma samples to preserve alignment.\n",
487                        crop_left);
488             }
489
490             sps->crop_left   = crop_left   * step_x;
491             sps->crop_right  = crop_right  * step_x;
492             sps->crop_top    = crop_top    * step_y;
493             sps->crop_bottom = crop_bottom * step_y;
494         }
495     }else{
496         sps->crop_left  =
497         sps->crop_right =
498         sps->crop_top   =
499         sps->crop_bottom= 0;
500         sps->crop = 0;
501     }
502
503     sps->vui_parameters_present_flag= get_bits1(&h->gb);
504     if( sps->vui_parameters_present_flag )
505         if (decode_vui_parameters(h, sps) < 0)
506             goto fail;
507
508     if(!sps->sar.den)
509         sps->sar.den= 1;
510
511     if(h->avctx->debug&FF_DEBUG_PICT_INFO){
512         static const char csp[4][5] = { "Gray", "420", "422", "444" };
513         av_log(h->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",
514                sps_id, sps->profile_idc, sps->level_idc,
515                sps->poc_type,
516                sps->ref_frame_count,
517                sps->mb_width, sps->mb_height,
518                sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
519                sps->direct_8x8_inference_flag ? "8B8" : "",
520                sps->crop_left, sps->crop_right,
521                sps->crop_top, sps->crop_bottom,
522                sps->vui_parameters_present_flag ? "VUI" : "",
523                csp[sps->chroma_format_idc],
524                sps->timing_info_present_flag ? sps->num_units_in_tick : 0,
525                sps->timing_info_present_flag ? sps->time_scale : 0,
526                sps->bit_depth_luma,
527                h->sps.bitstream_restriction_flag ? sps->num_reorder_frames : -1
528                );
529     }
530     sps->new = 1;
531
532     av_free(h->sps_buffers[sps_id]);
533     h->sps_buffers[sps_id] = sps;
534     h->sps                 = *sps;
535     h->current_sps_id      = sps_id;
536
537     return 0;
538 fail:
539     av_free(sps);
540     return -1;
541 }
542
543 static void
544 build_qp_table(PPS *pps, int t, int index, const int depth)
545 {
546     int i;
547     const int max_qp = 51 + 6*(depth-8);
548     for(i = 0; i < max_qp+1; i++)
549         pps->chroma_qp_table[t][i] = ff_h264_chroma_qp[depth-8][av_clip(i + index, 0, max_qp)];
550 }
551
552 static int more_rbsp_data_in_pps(H264Context *h, PPS *pps)
553 {
554     const SPS *sps = h->sps_buffers[pps->sps_id];
555     int profile_idc = sps->profile_idc;
556
557     if ((profile_idc == 66 || profile_idc == 77 ||
558          profile_idc == 88) && (sps->constraint_set_flags & 7)) {
559         av_log(h->avctx, AV_LOG_VERBOSE,
560                "Current profile doesn't provide more RBSP data in PPS, skipping\n");
561         return 0;
562     }
563
564     return 1;
565 }
566
567 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
568     unsigned int pps_id= get_ue_golomb(&h->gb);
569     PPS *pps;
570     const int qp_bd_offset = 6*(h->sps.bit_depth_luma-8);
571     int bits_left;
572
573     if(pps_id >= MAX_PPS_COUNT) {
574         av_log(h->avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id);
575         return -1;
576     } else if (h->sps.bit_depth_luma > 14) {
577         av_log(h->avctx, AV_LOG_ERROR, "Invalid luma bit depth=%d\n", h->sps.bit_depth_luma);
578         return AVERROR_INVALIDDATA;
579     } else if (h->sps.bit_depth_luma == 11 || h->sps.bit_depth_luma == 13) {
580         av_log(h->avctx, AV_LOG_ERROR, "Unimplemented luma bit depth=%d\n", h->sps.bit_depth_luma);
581         return AVERROR_PATCHWELCOME;
582     }
583
584     pps= av_mallocz(sizeof(PPS));
585     if(pps == NULL)
586         return -1;
587     pps->sps_id= get_ue_golomb_31(&h->gb);
588     if((unsigned)pps->sps_id>=MAX_SPS_COUNT || h->sps_buffers[pps->sps_id] == NULL){
589         av_log(h->avctx, AV_LOG_ERROR, "sps_id out of range\n");
590         goto fail;
591     }
592
593     pps->cabac= get_bits1(&h->gb);
594     pps->pic_order_present= get_bits1(&h->gb);
595     pps->slice_group_count= get_ue_golomb(&h->gb) + 1;
596     if(pps->slice_group_count > 1 ){
597         pps->mb_slice_group_map_type= get_ue_golomb(&h->gb);
598         av_log(h->avctx, AV_LOG_ERROR, "FMO not supported\n");
599         switch(pps->mb_slice_group_map_type){
600         case 0:
601 #if 0
602 |   for( i = 0; i <= num_slice_groups_minus1; i++ ) |   |        |
603 |    run_length[ i ]                                |1  |ue(v)   |
604 #endif
605             break;
606         case 2:
607 #if 0
608 |   for( i = 0; i < num_slice_groups_minus1; i++ )  |   |        |
609 |{                                                  |   |        |
610 |    top_left_mb[ i ]                               |1  |ue(v)   |
611 |    bottom_right_mb[ i ]                           |1  |ue(v)   |
612 |   }                                               |   |        |
613 #endif
614             break;
615         case 3:
616         case 4:
617         case 5:
618 #if 0
619 |   slice_group_change_direction_flag               |1  |u(1)    |
620 |   slice_group_change_rate_minus1                  |1  |ue(v)   |
621 #endif
622             break;
623         case 6:
624 #if 0
625 |   slice_group_id_cnt_minus1                       |1  |ue(v)   |
626 |   for( i = 0; i <= slice_group_id_cnt_minus1; i++ |   |        |
627 |)                                                  |   |        |
628 |    slice_group_id[ i ]                            |1  |u(v)    |
629 #endif
630             break;
631         }
632     }
633     pps->ref_count[0]= get_ue_golomb(&h->gb) + 1;
634     pps->ref_count[1]= get_ue_golomb(&h->gb) + 1;
635     if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){
636         av_log(h->avctx, AV_LOG_ERROR, "reference overflow (pps)\n");
637         goto fail;
638     }
639
640     pps->weighted_pred= get_bits1(&h->gb);
641     pps->weighted_bipred_idc= get_bits(&h->gb, 2);
642     pps->init_qp= get_se_golomb(&h->gb) + 26 + qp_bd_offset;
643     pps->init_qs= get_se_golomb(&h->gb) + 26 + qp_bd_offset;
644     pps->chroma_qp_index_offset[0]= get_se_golomb(&h->gb);
645     pps->deblocking_filter_parameters_present= get_bits1(&h->gb);
646     pps->constrained_intra_pred= get_bits1(&h->gb);
647     pps->redundant_pic_cnt_present = get_bits1(&h->gb);
648
649     pps->transform_8x8_mode= 0;
650     h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit
651     memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4));
652     memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8));
653
654     bits_left = bit_length - get_bits_count(&h->gb);
655     if(bits_left > 0 && more_rbsp_data_in_pps(h, pps)){
656         pps->transform_8x8_mode= get_bits1(&h->gb);
657         decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
658         pps->chroma_qp_index_offset[1]= get_se_golomb(&h->gb); //second_chroma_qp_index_offset
659     } else {
660         pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0];
661     }
662
663     build_qp_table(pps, 0, pps->chroma_qp_index_offset[0], h->sps.bit_depth_luma);
664     build_qp_table(pps, 1, pps->chroma_qp_index_offset[1], h->sps.bit_depth_luma);
665     if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1])
666         pps->chroma_qp_diff= 1;
667
668     if(h->avctx->debug&FF_DEBUG_PICT_INFO){
669         av_log(h->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",
670                pps_id, pps->sps_id,
671                pps->cabac ? "CABAC" : "CAVLC",
672                pps->slice_group_count,
673                pps->ref_count[0], pps->ref_count[1],
674                pps->weighted_pred ? "weighted" : "",
675                pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1],
676                pps->deblocking_filter_parameters_present ? "LPAR" : "",
677                pps->constrained_intra_pred ? "CONSTR" : "",
678                pps->redundant_pic_cnt_present ? "REDU" : "",
679                pps->transform_8x8_mode ? "8x8DCT" : ""
680                );
681     }
682
683     av_free(h->pps_buffers[pps_id]);
684     h->pps_buffers[pps_id]= pps;
685     return 0;
686 fail:
687     av_free(pps);
688     return -1;
689 }