4xm: check the return value of read_huffman_tables().
[FFMpeg-mirror/mplayer-patches.git] / libavcodec / h264_ps.c
blobe35dab21d32c679f8f900f2764774ef0b97a4423
1 /*
2 * H.26L/H.264/AVC/JVT/14496-10/... parameter set decoding
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /**
23 * @file
24 * H.264 / AVC / MPEG4 part10 parameter set decoding.
25 * @author Michael Niedermayer <michaelni@gmx.at>
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"
37 //#undef NDEBUG
38 #include <assert.h>
40 #define MAX_LOG2_MAX_FRAME_NUM (12 + 4)
41 #define MIN_LOG2_MAX_FRAME_NUM 4
43 static const AVRational pixel_aspect[17]={
44 {0, 1},
45 {1, 1},
46 {12, 11},
47 {10, 11},
48 {16, 11},
49 {40, 33},
50 {24, 11},
51 {20, 11},
52 {32, 11},
53 {80, 33},
54 {18, 11},
55 {15, 11},
56 {64, 33},
57 {160,99},
58 {4, 3},
59 {3, 2},
60 {2, 1},
63 #define QP(qP,depth) ( (qP)+6*((depth)-8) )
65 #define CHROMA_QP_TABLE_END(d) \
66 QP(0,d), QP(1,d), QP(2,d), QP(3,d), QP(4,d), QP(5,d),\
67 QP(6,d), QP(7,d), QP(8,d), QP(9,d), QP(10,d), QP(11,d),\
68 QP(12,d), QP(13,d), QP(14,d), QP(15,d), QP(16,d), QP(17,d),\
69 QP(18,d), QP(19,d), QP(20,d), QP(21,d), QP(22,d), QP(23,d),\
70 QP(24,d), QP(25,d), QP(26,d), QP(27,d), QP(28,d), QP(29,d),\
71 QP(29,d), QP(30,d), QP(31,d), QP(32,d), QP(32,d), QP(33,d),\
72 QP(34,d), QP(34,d), QP(35,d), QP(35,d), QP(36,d), QP(36,d),\
73 QP(37,d), QP(37,d), QP(37,d), QP(38,d), QP(38,d), QP(38,d),\
74 QP(39,d), QP(39,d), QP(39,d), QP(39,d)
76 const uint8_t ff_h264_chroma_qp[3][QP_MAX_NUM+1] = {
78 CHROMA_QP_TABLE_END(8)
81 0, 1, 2, 3, 4, 5,
82 CHROMA_QP_TABLE_END(9)
85 0, 1, 2, 3, 4, 5,
86 6, 7, 8, 9, 10, 11,
87 CHROMA_QP_TABLE_END(10)
91 static const uint8_t default_scaling4[2][16]={
92 { 6,13,20,28,
93 13,20,28,32,
94 20,28,32,37,
95 28,32,37,42
96 },{
97 10,14,20,24,
98 14,20,24,27,
99 20,24,27,30,
100 24,27,30,34
103 static const uint8_t default_scaling8[2][64]={
104 { 6,10,13,16,18,23,25,27,
105 10,11,16,18,23,25,27,29,
106 13,16,18,23,25,27,29,31,
107 16,18,23,25,27,29,31,33,
108 18,23,25,27,29,31,33,36,
109 23,25,27,29,31,33,36,38,
110 25,27,29,31,33,36,38,40,
111 27,29,31,33,36,38,40,42
113 9,13,15,17,19,21,22,24,
114 13,13,17,19,21,22,24,25,
115 15,17,19,21,22,24,25,27,
116 17,19,21,22,24,25,27,28,
117 19,21,22,24,25,27,28,30,
118 21,22,24,25,27,28,30,32,
119 22,24,25,27,28,30,32,33,
120 24,25,27,28,30,32,33,35
123 static inline int decode_hrd_parameters(H264Context *h, SPS *sps){
124 int cpb_count, i;
125 cpb_count = get_ue_golomb_31(&h->gb) + 1;
127 if(cpb_count > 32U){
128 av_log(h->avctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count);
129 return -1;
132 get_bits(&h->gb, 4); /* bit_rate_scale */
133 get_bits(&h->gb, 4); /* cpb_size_scale */
134 for(i=0; i<cpb_count; i++){
135 get_ue_golomb_long(&h->gb); /* bit_rate_value_minus1 */
136 get_ue_golomb_long(&h->gb); /* cpb_size_value_minus1 */
137 get_bits1(&h->gb); /* cbr_flag */
139 sps->initial_cpb_removal_delay_length = get_bits(&h->gb, 5) + 1;
140 sps->cpb_removal_delay_length = get_bits(&h->gb, 5) + 1;
141 sps->dpb_output_delay_length = get_bits(&h->gb, 5) + 1;
142 sps->time_offset_length = get_bits(&h->gb, 5);
143 sps->cpb_cnt = cpb_count;
144 return 0;
147 static inline int decode_vui_parameters(H264Context *h, SPS *sps){
148 int aspect_ratio_info_present_flag;
149 unsigned int aspect_ratio_idc;
151 aspect_ratio_info_present_flag= get_bits1(&h->gb);
153 if( aspect_ratio_info_present_flag ) {
154 aspect_ratio_idc= get_bits(&h->gb, 8);
155 if( aspect_ratio_idc == EXTENDED_SAR ) {
156 sps->sar.num= get_bits(&h->gb, 16);
157 sps->sar.den= get_bits(&h->gb, 16);
158 }else if(aspect_ratio_idc < FF_ARRAY_ELEMS(pixel_aspect)){
159 sps->sar= pixel_aspect[aspect_ratio_idc];
160 }else{
161 av_log(h->avctx, AV_LOG_ERROR, "illegal aspect ratio\n");
162 return -1;
164 }else{
165 sps->sar.num=
166 sps->sar.den= 0;
168 // s->avctx->aspect_ratio= sar_width*s->width / (float)(s->height*sar_height);
170 if(get_bits1(&h->gb)){ /* overscan_info_present_flag */
171 get_bits1(&h->gb); /* overscan_appropriate_flag */
174 sps->video_signal_type_present_flag = get_bits1(&h->gb);
175 if(sps->video_signal_type_present_flag){
176 get_bits(&h->gb, 3); /* video_format */
177 sps->full_range = get_bits1(&h->gb); /* video_full_range_flag */
179 sps->colour_description_present_flag = get_bits1(&h->gb);
180 if(sps->colour_description_present_flag){
181 sps->color_primaries = get_bits(&h->gb, 8); /* colour_primaries */
182 sps->color_trc = get_bits(&h->gb, 8); /* transfer_characteristics */
183 sps->colorspace = get_bits(&h->gb, 8); /* matrix_coefficients */
184 if (sps->color_primaries >= AVCOL_PRI_NB)
185 sps->color_primaries = AVCOL_PRI_UNSPECIFIED;
186 if (sps->color_trc >= AVCOL_TRC_NB)
187 sps->color_trc = AVCOL_TRC_UNSPECIFIED;
188 if (sps->colorspace >= AVCOL_SPC_NB)
189 sps->colorspace = AVCOL_SPC_UNSPECIFIED;
193 if(get_bits1(&h->gb)){ /* chroma_location_info_present_flag */
194 h->avctx->chroma_sample_location = get_ue_golomb(&h->gb)+1; /* chroma_sample_location_type_top_field */
195 get_ue_golomb(&h->gb); /* chroma_sample_location_type_bottom_field */
198 sps->timing_info_present_flag = get_bits1(&h->gb);
199 if(sps->timing_info_present_flag){
200 sps->num_units_in_tick = get_bits_long(&h->gb, 32);
201 sps->time_scale = get_bits_long(&h->gb, 32);
202 if(!sps->num_units_in_tick || !sps->time_scale){
203 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);
204 return -1;
206 sps->fixed_frame_rate_flag = get_bits1(&h->gb);
209 sps->nal_hrd_parameters_present_flag = get_bits1(&h->gb);
210 if(sps->nal_hrd_parameters_present_flag)
211 if(decode_hrd_parameters(h, sps) < 0)
212 return -1;
213 sps->vcl_hrd_parameters_present_flag = get_bits1(&h->gb);
214 if(sps->vcl_hrd_parameters_present_flag)
215 if(decode_hrd_parameters(h, sps) < 0)
216 return -1;
217 if(sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag)
218 get_bits1(&h->gb); /* low_delay_hrd_flag */
219 sps->pic_struct_present_flag = get_bits1(&h->gb);
221 sps->bitstream_restriction_flag = get_bits1(&h->gb);
222 if(sps->bitstream_restriction_flag){
223 get_bits1(&h->gb); /* motion_vectors_over_pic_boundaries_flag */
224 get_ue_golomb(&h->gb); /* max_bytes_per_pic_denom */
225 get_ue_golomb(&h->gb); /* max_bits_per_mb_denom */
226 get_ue_golomb(&h->gb); /* log2_max_mv_length_horizontal */
227 get_ue_golomb(&h->gb); /* log2_max_mv_length_vertical */
228 sps->num_reorder_frames= get_ue_golomb(&h->gb);
229 get_ue_golomb(&h->gb); /*max_dec_frame_buffering*/
231 if (get_bits_left(&h->gb) < 0) {
232 sps->num_reorder_frames=0;
233 sps->bitstream_restriction_flag= 0;
236 if(sps->num_reorder_frames > 16U /*max_dec_frame_buffering || max_dec_frame_buffering > 16*/){
237 av_log(h->avctx, AV_LOG_ERROR, "illegal num_reorder_frames %d\n", sps->num_reorder_frames);
238 return -1;
241 if (get_bits_left(&h->gb) < 0) {
242 av_log(h->avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", -get_bits_left(&h->gb));
243 return AVERROR_INVALIDDATA;
246 return 0;
249 static void decode_scaling_list(H264Context *h, uint8_t *factors, int size,
250 const uint8_t *jvt_list, const uint8_t *fallback_list){
251 int i, last = 8, next = 8;
252 const uint8_t *scan = size == 16 ? zigzag_scan : ff_zigzag_direct;
253 if(!get_bits1(&h->gb)) /* matrix not written, we use the predicted one */
254 memcpy(factors, fallback_list, size*sizeof(uint8_t));
255 else
256 for(i=0;i<size;i++){
257 if(next)
258 next = (last + get_se_golomb(&h->gb)) & 0xff;
259 if(!i && !next){ /* matrix not written, we use the preset one */
260 memcpy(factors, jvt_list, size*sizeof(uint8_t));
261 break;
263 last = factors[scan[i]] = next ? next : last;
267 static void decode_scaling_matrices(H264Context *h, SPS *sps, PPS *pps, int is_sps,
268 uint8_t (*scaling_matrix4)[16], uint8_t (*scaling_matrix8)[64]){
269 int fallback_sps = !is_sps && sps->scaling_matrix_present;
270 const uint8_t *fallback[4] = {
271 fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0],
272 fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1],
273 fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0],
274 fallback_sps ? sps->scaling_matrix8[3] : default_scaling8[1]
276 if(get_bits1(&h->gb)){
277 sps->scaling_matrix_present |= is_sps;
278 decode_scaling_list(h,scaling_matrix4[0],16,default_scaling4[0],fallback[0]); // Intra, Y
279 decode_scaling_list(h,scaling_matrix4[1],16,default_scaling4[0],scaling_matrix4[0]); // Intra, Cr
280 decode_scaling_list(h,scaling_matrix4[2],16,default_scaling4[0],scaling_matrix4[1]); // Intra, Cb
281 decode_scaling_list(h,scaling_matrix4[3],16,default_scaling4[1],fallback[1]); // Inter, Y
282 decode_scaling_list(h,scaling_matrix4[4],16,default_scaling4[1],scaling_matrix4[3]); // Inter, Cr
283 decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
284 if(is_sps || pps->transform_8x8_mode){
285 decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]); // Intra, Y
286 if(sps->chroma_format_idc == 3){
287 decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[0],scaling_matrix8[0]); // Intra, Cr
288 decode_scaling_list(h,scaling_matrix8[2],64,default_scaling8[0],scaling_matrix8[1]); // Intra, Cb
290 decode_scaling_list(h,scaling_matrix8[3],64,default_scaling8[1],fallback[3]); // Inter, Y
291 if(sps->chroma_format_idc == 3){
292 decode_scaling_list(h,scaling_matrix8[4],64,default_scaling8[1],scaling_matrix8[3]); // Inter, Cr
293 decode_scaling_list(h,scaling_matrix8[5],64,default_scaling8[1],scaling_matrix8[4]); // Inter, Cb
299 int ff_h264_decode_seq_parameter_set(H264Context *h){
300 int profile_idc, level_idc, constraint_set_flags = 0;
301 unsigned int sps_id;
302 int i, log2_max_frame_num_minus4;
303 SPS *sps;
305 profile_idc= get_bits(&h->gb, 8);
306 constraint_set_flags |= get_bits1(&h->gb) << 0; //constraint_set0_flag
307 constraint_set_flags |= get_bits1(&h->gb) << 1; //constraint_set1_flag
308 constraint_set_flags |= get_bits1(&h->gb) << 2; //constraint_set2_flag
309 constraint_set_flags |= get_bits1(&h->gb) << 3; //constraint_set3_flag
310 get_bits(&h->gb, 4); // reserved
311 level_idc= get_bits(&h->gb, 8);
312 sps_id= get_ue_golomb_31(&h->gb);
314 if(sps_id >= MAX_SPS_COUNT) {
315 av_log(h->avctx, AV_LOG_ERROR, "sps_id (%d) out of range\n", sps_id);
316 return -1;
318 sps= av_mallocz(sizeof(SPS));
319 if(sps == NULL)
320 return -1;
322 sps->time_offset_length = 24;
323 sps->profile_idc= profile_idc;
324 sps->constraint_set_flags = constraint_set_flags;
325 sps->level_idc= level_idc;
327 memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4));
328 memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8));
329 sps->scaling_matrix_present = 0;
331 if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
332 sps->profile_idc == 122 || sps->profile_idc == 244 ||
333 sps->profile_idc == 44 || sps->profile_idc == 83 ||
334 sps->profile_idc == 86 || sps->profile_idc == 118 ||
335 sps->profile_idc == 128 || sps->profile_idc == 144) {
336 sps->chroma_format_idc= get_ue_golomb_31(&h->gb);
337 if(sps->chroma_format_idc > 3) {
338 av_log(h->avctx, AV_LOG_ERROR, "chroma_format_idc (%u) out of range\n", sps->chroma_format_idc);
339 goto fail;
340 } else if(sps->chroma_format_idc == 3) {
341 sps->residual_color_transform_flag = get_bits1(&h->gb);
343 sps->bit_depth_luma = get_ue_golomb(&h->gb) + 8;
344 sps->bit_depth_chroma = get_ue_golomb(&h->gb) + 8;
345 sps->transform_bypass = get_bits1(&h->gb);
346 decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
347 }else{
348 sps->chroma_format_idc= 1;
349 sps->bit_depth_luma = 8;
350 sps->bit_depth_chroma = 8;
353 log2_max_frame_num_minus4 = get_ue_golomb(&h->gb);
354 if (log2_max_frame_num_minus4 < MIN_LOG2_MAX_FRAME_NUM - 4 ||
355 log2_max_frame_num_minus4 > MAX_LOG2_MAX_FRAME_NUM - 4) {
356 av_log(h->avctx, AV_LOG_ERROR,
357 "log2_max_frame_num_minus4 out of range (0-12): %d\n",
358 log2_max_frame_num_minus4);
359 goto fail;
361 sps->log2_max_frame_num = log2_max_frame_num_minus4 + 4;
363 sps->poc_type= get_ue_golomb_31(&h->gb);
365 if(sps->poc_type == 0){ //FIXME #define
366 sps->log2_max_poc_lsb= get_ue_golomb(&h->gb) + 4;
367 } else if(sps->poc_type == 1){//FIXME #define
368 sps->delta_pic_order_always_zero_flag= get_bits1(&h->gb);
369 sps->offset_for_non_ref_pic= get_se_golomb(&h->gb);
370 sps->offset_for_top_to_bottom_field= get_se_golomb(&h->gb);
371 sps->poc_cycle_length = get_ue_golomb(&h->gb);
373 if((unsigned)sps->poc_cycle_length >= FF_ARRAY_ELEMS(sps->offset_for_ref_frame)){
374 av_log(h->avctx, AV_LOG_ERROR, "poc_cycle_length overflow %u\n", sps->poc_cycle_length);
375 goto fail;
378 for(i=0; i<sps->poc_cycle_length; i++)
379 sps->offset_for_ref_frame[i]= get_se_golomb(&h->gb);
380 }else if(sps->poc_type != 2){
381 av_log(h->avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type);
382 goto fail;
385 sps->ref_frame_count= get_ue_golomb_31(&h->gb);
386 if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count >= 32U){
387 av_log(h->avctx, AV_LOG_ERROR, "too many reference frames\n");
388 goto fail;
390 sps->gaps_in_frame_num_allowed_flag= get_bits1(&h->gb);
391 sps->mb_width = get_ue_golomb(&h->gb) + 1;
392 sps->mb_height= get_ue_golomb(&h->gb) + 1;
393 if((unsigned)sps->mb_width >= INT_MAX/16 || (unsigned)sps->mb_height >= INT_MAX/16 ||
394 av_image_check_size(16*sps->mb_width, 16*sps->mb_height, 0, h->avctx)){
395 av_log(h->avctx, AV_LOG_ERROR, "mb_width/height overflow\n");
396 goto fail;
399 sps->frame_mbs_only_flag= get_bits1(&h->gb);
400 if(!sps->frame_mbs_only_flag)
401 sps->mb_aff= get_bits1(&h->gb);
402 else
403 sps->mb_aff= 0;
405 sps->direct_8x8_inference_flag= get_bits1(&h->gb);
406 if(!sps->frame_mbs_only_flag && !sps->direct_8x8_inference_flag){
407 av_log(h->avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n");
408 goto fail;
411 #ifndef ALLOW_INTERLACE
412 if(sps->mb_aff)
413 av_log(h->avctx, AV_LOG_ERROR, "MBAFF support not included; enable it at compile-time.\n");
414 #endif
415 sps->crop= get_bits1(&h->gb);
416 if(sps->crop){
417 int crop_vertical_limit = sps->chroma_format_idc & 2 ? 16 : 8;
418 int crop_horizontal_limit = sps->chroma_format_idc == 3 ? 16 : 8;
419 sps->crop_left = get_ue_golomb(&h->gb);
420 sps->crop_right = get_ue_golomb(&h->gb);
421 sps->crop_top = get_ue_golomb(&h->gb);
422 sps->crop_bottom= get_ue_golomb(&h->gb);
423 if (h->avctx->flags2 & CODEC_FLAG2_IGNORE_CROP) {
424 av_log(h->avctx, AV_LOG_DEBUG,
425 "discarding sps cropping, "
426 "original values are l:%u r:%u t:%u b:%u\n",
427 sps->crop_left,
428 sps->crop_right,
429 sps->crop_top,
430 sps->crop_bottom);
432 sps->crop_left =
433 sps->crop_right =
434 sps->crop_top =
435 sps->crop_bottom = 0;
437 if(sps->crop_left || sps->crop_top){
438 av_log(h->avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n");
440 if(sps->crop_right >= crop_horizontal_limit || sps->crop_bottom >= crop_vertical_limit){
441 av_log(h->avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n");
443 }else{
444 sps->crop_left =
445 sps->crop_right =
446 sps->crop_top =
447 sps->crop_bottom= 0;
450 sps->vui_parameters_present_flag= get_bits1(&h->gb);
451 if( sps->vui_parameters_present_flag )
452 if (decode_vui_parameters(h, sps) < 0)
453 goto fail;
455 if(!sps->sar.den)
456 sps->sar.den= 1;
458 if(h->avctx->debug&FF_DEBUG_PICT_INFO){
459 static const char csp[4][5] = { "Gray", "420", "422", "444" };
460 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\n",
461 sps_id, sps->profile_idc, sps->level_idc,
462 sps->poc_type,
463 sps->ref_frame_count,
464 sps->mb_width, sps->mb_height,
465 sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"),
466 sps->direct_8x8_inference_flag ? "8B8" : "",
467 sps->crop_left, sps->crop_right,
468 sps->crop_top, sps->crop_bottom,
469 sps->vui_parameters_present_flag ? "VUI" : "",
470 csp[sps->chroma_format_idc],
471 sps->timing_info_present_flag ? sps->num_units_in_tick : 0,
472 sps->timing_info_present_flag ? sps->time_scale : 0
475 sps->new = 1;
477 av_free(h->sps_buffers[sps_id]);
478 h->sps_buffers[sps_id] = sps;
479 h->sps = *sps;
480 h->current_sps_id = sps_id;
482 return 0;
483 fail:
484 av_free(sps);
485 return -1;
488 static void
489 build_qp_table(PPS *pps, int t, int index, const int depth)
491 int i;
492 const int max_qp = 51 + 6*(depth-8);
493 for(i = 0; i < max_qp+1; i++)
494 pps->chroma_qp_table[t][i] = ff_h264_chroma_qp[depth-8][av_clip(i + index, 0, max_qp)];
497 int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
498 unsigned int pps_id= get_ue_golomb(&h->gb);
499 PPS *pps;
500 const int qp_bd_offset = 6*(h->sps.bit_depth_luma-8);
501 int bits_left;
503 if(pps_id >= MAX_PPS_COUNT) {
504 av_log(h->avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id);
505 return -1;
506 } else if (h->sps.bit_depth_luma > 10) {
507 av_log(h->avctx, AV_LOG_ERROR, "Unimplemented luma bit depth=%d (max=10)\n", h->sps.bit_depth_luma);
508 return AVERROR_PATCHWELCOME;
511 pps= av_mallocz(sizeof(PPS));
512 if(pps == NULL)
513 return -1;
514 pps->sps_id= get_ue_golomb_31(&h->gb);
515 if((unsigned)pps->sps_id>=MAX_SPS_COUNT || h->sps_buffers[pps->sps_id] == NULL){
516 av_log(h->avctx, AV_LOG_ERROR, "sps_id out of range\n");
517 goto fail;
520 pps->cabac= get_bits1(&h->gb);
521 pps->pic_order_present= get_bits1(&h->gb);
522 pps->slice_group_count= get_ue_golomb(&h->gb) + 1;
523 if(pps->slice_group_count > 1 ){
524 pps->mb_slice_group_map_type= get_ue_golomb(&h->gb);
525 av_log(h->avctx, AV_LOG_ERROR, "FMO not supported\n");
526 switch(pps->mb_slice_group_map_type){
527 case 0:
528 #if 0
529 | for( i = 0; i <= num_slice_groups_minus1; i++ ) | | |
530 | run_length[ i ] |1 |ue(v) |
531 #endif
532 break;
533 case 2:
534 #if 0
535 | for( i = 0; i < num_slice_groups_minus1; i++ ) | | |
536 |{ | | |
537 | top_left_mb[ i ] |1 |ue(v) |
538 | bottom_right_mb[ i ] |1 |ue(v) |
539 | } | | |
540 #endif
541 break;
542 case 3:
543 case 4:
544 case 5:
545 #if 0
546 | slice_group_change_direction_flag |1 |u(1) |
547 | slice_group_change_rate_minus1 |1 |ue(v) |
548 #endif
549 break;
550 case 6:
551 #if 0
552 | slice_group_id_cnt_minus1 |1 |ue(v) |
553 | for( i = 0; i <= slice_group_id_cnt_minus1; i++ | | |
554 |) | | |
555 | slice_group_id[ i ] |1 |u(v) |
556 #endif
557 break;
560 pps->ref_count[0]= get_ue_golomb(&h->gb) + 1;
561 pps->ref_count[1]= get_ue_golomb(&h->gb) + 1;
562 if(pps->ref_count[0]-1 > 32-1 || pps->ref_count[1]-1 > 32-1){
563 av_log(h->avctx, AV_LOG_ERROR, "reference overflow (pps)\n");
564 goto fail;
567 pps->weighted_pred= get_bits1(&h->gb);
568 pps->weighted_bipred_idc= get_bits(&h->gb, 2);
569 pps->init_qp= get_se_golomb(&h->gb) + 26 + qp_bd_offset;
570 pps->init_qs= get_se_golomb(&h->gb) + 26 + qp_bd_offset;
571 pps->chroma_qp_index_offset[0]= get_se_golomb(&h->gb);
572 pps->deblocking_filter_parameters_present= get_bits1(&h->gb);
573 pps->constrained_intra_pred= get_bits1(&h->gb);
574 pps->redundant_pic_cnt_present = get_bits1(&h->gb);
576 pps->transform_8x8_mode= 0;
577 h->dequant_coeff_pps= -1; //contents of sps/pps can change even if id doesn't, so reinit
578 memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4));
579 memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8));
581 bits_left = bit_length - get_bits_count(&h->gb);
582 if (bits_left && (bits_left > 8 ||
583 show_bits(&h->gb, bits_left) != 1 << (bits_left - 1))) {
584 pps->transform_8x8_mode= get_bits1(&h->gb);
585 decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
586 pps->chroma_qp_index_offset[1]= get_se_golomb(&h->gb); //second_chroma_qp_index_offset
587 } else {
588 pps->chroma_qp_index_offset[1]= pps->chroma_qp_index_offset[0];
591 build_qp_table(pps, 0, pps->chroma_qp_index_offset[0], h->sps.bit_depth_luma);
592 build_qp_table(pps, 1, pps->chroma_qp_index_offset[1], h->sps.bit_depth_luma);
593 if(pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1])
594 pps->chroma_qp_diff= 1;
596 if(h->avctx->debug&FF_DEBUG_PICT_INFO){
597 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",
598 pps_id, pps->sps_id,
599 pps->cabac ? "CABAC" : "CAVLC",
600 pps->slice_group_count,
601 pps->ref_count[0], pps->ref_count[1],
602 pps->weighted_pred ? "weighted" : "",
603 pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1],
604 pps->deblocking_filter_parameters_present ? "LPAR" : "",
605 pps->constrained_intra_pred ? "CONSTR" : "",
606 pps->redundant_pic_cnt_present ? "REDU" : "",
607 pps->transform_8x8_mode ? "8x8DCT" : ""
611 av_free(h->pps_buffers[pps_id]);
612 h->pps_buffers[pps_id]= pps;
613 return 0;
614 fail:
615 av_free(pps);
616 return -1;