1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * H.26L/H.264/AVC/JVT/14496-10/... parameter set decoding 3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * H.264 / AVC / MPEG-4 part10 parameter set decoding. 25cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at> 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include <inttypes.h> 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include "libavutil/imgutils.h" 31cabdff1aSopenharmony_ci#include "mathops.h" 32cabdff1aSopenharmony_ci#include "avcodec.h" 33cabdff1aSopenharmony_ci#include "h264data.h" 34cabdff1aSopenharmony_ci#include "h264_ps.h" 35cabdff1aSopenharmony_ci#include "golomb.h" 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_ci#define MIN_LOG2_MAX_FRAME_NUM 4 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci#define EXTENDED_SAR 255 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_cistatic const uint8_t default_scaling4[2][16] = { 42cabdff1aSopenharmony_ci { 6, 13, 20, 28, 13, 20, 28, 32, 43cabdff1aSopenharmony_ci 20, 28, 32, 37, 28, 32, 37, 42 }, 44cabdff1aSopenharmony_ci { 10, 14, 20, 24, 14, 20, 24, 27, 45cabdff1aSopenharmony_ci 20, 24, 27, 30, 24, 27, 30, 34 } 46cabdff1aSopenharmony_ci}; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_cistatic const uint8_t default_scaling8[2][64] = { 49cabdff1aSopenharmony_ci { 6, 10, 13, 16, 18, 23, 25, 27, 50cabdff1aSopenharmony_ci 10, 11, 16, 18, 23, 25, 27, 29, 51cabdff1aSopenharmony_ci 13, 16, 18, 23, 25, 27, 29, 31, 52cabdff1aSopenharmony_ci 16, 18, 23, 25, 27, 29, 31, 33, 53cabdff1aSopenharmony_ci 18, 23, 25, 27, 29, 31, 33, 36, 54cabdff1aSopenharmony_ci 23, 25, 27, 29, 31, 33, 36, 38, 55cabdff1aSopenharmony_ci 25, 27, 29, 31, 33, 36, 38, 40, 56cabdff1aSopenharmony_ci 27, 29, 31, 33, 36, 38, 40, 42 }, 57cabdff1aSopenharmony_ci { 9, 13, 15, 17, 19, 21, 22, 24, 58cabdff1aSopenharmony_ci 13, 13, 17, 19, 21, 22, 24, 25, 59cabdff1aSopenharmony_ci 15, 17, 19, 21, 22, 24, 25, 27, 60cabdff1aSopenharmony_ci 17, 19, 21, 22, 24, 25, 27, 28, 61cabdff1aSopenharmony_ci 19, 21, 22, 24, 25, 27, 28, 30, 62cabdff1aSopenharmony_ci 21, 22, 24, 25, 27, 28, 30, 32, 63cabdff1aSopenharmony_ci 22, 24, 25, 27, 28, 30, 32, 33, 64cabdff1aSopenharmony_ci 24, 25, 27, 28, 30, 32, 33, 35 } 65cabdff1aSopenharmony_ci}; 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci/* maximum number of MBs in the DPB for a given level */ 68cabdff1aSopenharmony_cistatic const int level_max_dpb_mbs[][2] = { 69cabdff1aSopenharmony_ci { 10, 396 }, 70cabdff1aSopenharmony_ci { 11, 900 }, 71cabdff1aSopenharmony_ci { 12, 2376 }, 72cabdff1aSopenharmony_ci { 13, 2376 }, 73cabdff1aSopenharmony_ci { 20, 2376 }, 74cabdff1aSopenharmony_ci { 21, 4752 }, 75cabdff1aSopenharmony_ci { 22, 8100 }, 76cabdff1aSopenharmony_ci { 30, 8100 }, 77cabdff1aSopenharmony_ci { 31, 18000 }, 78cabdff1aSopenharmony_ci { 32, 20480 }, 79cabdff1aSopenharmony_ci { 40, 32768 }, 80cabdff1aSopenharmony_ci { 41, 32768 }, 81cabdff1aSopenharmony_ci { 42, 34816 }, 82cabdff1aSopenharmony_ci { 50, 110400 }, 83cabdff1aSopenharmony_ci { 51, 184320 }, 84cabdff1aSopenharmony_ci { 52, 184320 }, 85cabdff1aSopenharmony_ci}; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_cistatic void remove_pps(H264ParamSets *s, int id) 88cabdff1aSopenharmony_ci{ 89cabdff1aSopenharmony_ci av_buffer_unref(&s->pps_list[id]); 90cabdff1aSopenharmony_ci} 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_cistatic void remove_sps(H264ParamSets *s, int id) 93cabdff1aSopenharmony_ci{ 94cabdff1aSopenharmony_ci#if 0 95cabdff1aSopenharmony_ci int i; 96cabdff1aSopenharmony_ci if (s->sps_list[id]) { 97cabdff1aSopenharmony_ci /* drop all PPS that depend on this SPS */ 98cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) 99cabdff1aSopenharmony_ci if (s->pps_list[i] && ((PPS*)s->pps_list[i]->data)->sps_id == id) 100cabdff1aSopenharmony_ci remove_pps(s, i); 101cabdff1aSopenharmony_ci } 102cabdff1aSopenharmony_ci#endif 103cabdff1aSopenharmony_ci av_buffer_unref(&s->sps_list[id]); 104cabdff1aSopenharmony_ci} 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_cistatic inline int decode_hrd_parameters(GetBitContext *gb, void *logctx, 107cabdff1aSopenharmony_ci SPS *sps) 108cabdff1aSopenharmony_ci{ 109cabdff1aSopenharmony_ci int cpb_count, i; 110cabdff1aSopenharmony_ci cpb_count = get_ue_golomb_31(gb) + 1; 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci if (cpb_count > 32U) { 113cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_ERROR, "cpb_count %d invalid\n", cpb_count); 114cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 115cabdff1aSopenharmony_ci } 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ci get_bits(gb, 4); /* bit_rate_scale */ 118cabdff1aSopenharmony_ci get_bits(gb, 4); /* cpb_size_scale */ 119cabdff1aSopenharmony_ci for (i = 0; i < cpb_count; i++) { 120cabdff1aSopenharmony_ci get_ue_golomb_long(gb); /* bit_rate_value_minus1 */ 121cabdff1aSopenharmony_ci get_ue_golomb_long(gb); /* cpb_size_value_minus1 */ 122cabdff1aSopenharmony_ci get_bits1(gb); /* cbr_flag */ 123cabdff1aSopenharmony_ci } 124cabdff1aSopenharmony_ci sps->initial_cpb_removal_delay_length = get_bits(gb, 5) + 1; 125cabdff1aSopenharmony_ci sps->cpb_removal_delay_length = get_bits(gb, 5) + 1; 126cabdff1aSopenharmony_ci sps->dpb_output_delay_length = get_bits(gb, 5) + 1; 127cabdff1aSopenharmony_ci sps->time_offset_length = get_bits(gb, 5); 128cabdff1aSopenharmony_ci sps->cpb_cnt = cpb_count; 129cabdff1aSopenharmony_ci return 0; 130cabdff1aSopenharmony_ci} 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_cistatic inline int decode_vui_parameters(GetBitContext *gb, void *logctx, 133cabdff1aSopenharmony_ci SPS *sps) 134cabdff1aSopenharmony_ci{ 135cabdff1aSopenharmony_ci int aspect_ratio_info_present_flag; 136cabdff1aSopenharmony_ci unsigned int aspect_ratio_idc; 137cabdff1aSopenharmony_ci 138cabdff1aSopenharmony_ci aspect_ratio_info_present_flag = get_bits1(gb); 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci if (aspect_ratio_info_present_flag) { 141cabdff1aSopenharmony_ci aspect_ratio_idc = get_bits(gb, 8); 142cabdff1aSopenharmony_ci if (aspect_ratio_idc == EXTENDED_SAR) { 143cabdff1aSopenharmony_ci sps->sar.num = get_bits(gb, 16); 144cabdff1aSopenharmony_ci sps->sar.den = get_bits(gb, 16); 145cabdff1aSopenharmony_ci } else if (aspect_ratio_idc < FF_ARRAY_ELEMS(ff_h264_pixel_aspect)) { 146cabdff1aSopenharmony_ci sps->sar = ff_h264_pixel_aspect[aspect_ratio_idc]; 147cabdff1aSopenharmony_ci } else { 148cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_ERROR, "illegal aspect ratio\n"); 149cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 150cabdff1aSopenharmony_ci } 151cabdff1aSopenharmony_ci } else { 152cabdff1aSopenharmony_ci sps->sar.num = 153cabdff1aSopenharmony_ci sps->sar.den = 0; 154cabdff1aSopenharmony_ci } 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci if (get_bits1(gb)) /* overscan_info_present_flag */ 157cabdff1aSopenharmony_ci get_bits1(gb); /* overscan_appropriate_flag */ 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci sps->video_signal_type_present_flag = get_bits1(gb); 160cabdff1aSopenharmony_ci if (sps->video_signal_type_present_flag) { 161cabdff1aSopenharmony_ci get_bits(gb, 3); /* video_format */ 162cabdff1aSopenharmony_ci sps->full_range = get_bits1(gb); /* video_full_range_flag */ 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci sps->colour_description_present_flag = get_bits1(gb); 165cabdff1aSopenharmony_ci if (sps->colour_description_present_flag) { 166cabdff1aSopenharmony_ci sps->color_primaries = get_bits(gb, 8); /* colour_primaries */ 167cabdff1aSopenharmony_ci sps->color_trc = get_bits(gb, 8); /* transfer_characteristics */ 168cabdff1aSopenharmony_ci sps->colorspace = get_bits(gb, 8); /* matrix_coefficients */ 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci // Set invalid values to "unspecified" 171cabdff1aSopenharmony_ci if (!av_color_primaries_name(sps->color_primaries)) 172cabdff1aSopenharmony_ci sps->color_primaries = AVCOL_PRI_UNSPECIFIED; 173cabdff1aSopenharmony_ci if (!av_color_transfer_name(sps->color_trc)) 174cabdff1aSopenharmony_ci sps->color_trc = AVCOL_TRC_UNSPECIFIED; 175cabdff1aSopenharmony_ci if (!av_color_space_name(sps->colorspace)) 176cabdff1aSopenharmony_ci sps->colorspace = AVCOL_SPC_UNSPECIFIED; 177cabdff1aSopenharmony_ci } 178cabdff1aSopenharmony_ci } 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ci /* chroma_location_info_present_flag */ 181cabdff1aSopenharmony_ci if (get_bits1(gb)) { 182cabdff1aSopenharmony_ci /* chroma_sample_location_type_top_field */ 183cabdff1aSopenharmony_ci sps->chroma_location = get_ue_golomb_31(gb) + 1; 184cabdff1aSopenharmony_ci get_ue_golomb_31(gb); /* chroma_sample_location_type_bottom_field */ 185cabdff1aSopenharmony_ci } else 186cabdff1aSopenharmony_ci sps->chroma_location = AVCHROMA_LOC_LEFT; 187cabdff1aSopenharmony_ci 188cabdff1aSopenharmony_ci if (show_bits1(gb) && get_bits_left(gb) < 10) { 189cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_WARNING, "Truncated VUI (%d)\n", get_bits_left(gb)); 190cabdff1aSopenharmony_ci return 0; 191cabdff1aSopenharmony_ci } 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci sps->timing_info_present_flag = get_bits1(gb); 194cabdff1aSopenharmony_ci if (sps->timing_info_present_flag) { 195cabdff1aSopenharmony_ci unsigned num_units_in_tick = get_bits_long(gb, 32); 196cabdff1aSopenharmony_ci unsigned time_scale = get_bits_long(gb, 32); 197cabdff1aSopenharmony_ci if (!num_units_in_tick || !time_scale) { 198cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_ERROR, 199cabdff1aSopenharmony_ci "time_scale/num_units_in_tick invalid or unsupported (%u/%u)\n", 200cabdff1aSopenharmony_ci time_scale, num_units_in_tick); 201cabdff1aSopenharmony_ci sps->timing_info_present_flag = 0; 202cabdff1aSopenharmony_ci } else { 203cabdff1aSopenharmony_ci sps->num_units_in_tick = num_units_in_tick; 204cabdff1aSopenharmony_ci sps->time_scale = time_scale; 205cabdff1aSopenharmony_ci } 206cabdff1aSopenharmony_ci sps->fixed_frame_rate_flag = get_bits1(gb); 207cabdff1aSopenharmony_ci } 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci sps->nal_hrd_parameters_present_flag = get_bits1(gb); 210cabdff1aSopenharmony_ci if (sps->nal_hrd_parameters_present_flag) 211cabdff1aSopenharmony_ci if (decode_hrd_parameters(gb, logctx, sps) < 0) 212cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 213cabdff1aSopenharmony_ci sps->vcl_hrd_parameters_present_flag = get_bits1(gb); 214cabdff1aSopenharmony_ci if (sps->vcl_hrd_parameters_present_flag) 215cabdff1aSopenharmony_ci if (decode_hrd_parameters(gb, logctx, sps) < 0) 216cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 217cabdff1aSopenharmony_ci if (sps->nal_hrd_parameters_present_flag || 218cabdff1aSopenharmony_ci sps->vcl_hrd_parameters_present_flag) 219cabdff1aSopenharmony_ci get_bits1(gb); /* low_delay_hrd_flag */ 220cabdff1aSopenharmony_ci sps->pic_struct_present_flag = get_bits1(gb); 221cabdff1aSopenharmony_ci if (!get_bits_left(gb)) 222cabdff1aSopenharmony_ci return 0; 223cabdff1aSopenharmony_ci sps->bitstream_restriction_flag = get_bits1(gb); 224cabdff1aSopenharmony_ci if (sps->bitstream_restriction_flag) { 225cabdff1aSopenharmony_ci get_bits1(gb); /* motion_vectors_over_pic_boundaries_flag */ 226cabdff1aSopenharmony_ci get_ue_golomb_31(gb); /* max_bytes_per_pic_denom */ 227cabdff1aSopenharmony_ci get_ue_golomb_31(gb); /* max_bits_per_mb_denom */ 228cabdff1aSopenharmony_ci get_ue_golomb_31(gb); /* log2_max_mv_length_horizontal */ 229cabdff1aSopenharmony_ci get_ue_golomb_31(gb); /* log2_max_mv_length_vertical */ 230cabdff1aSopenharmony_ci sps->num_reorder_frames = get_ue_golomb_31(gb); 231cabdff1aSopenharmony_ci get_ue_golomb_31(gb); /*max_dec_frame_buffering*/ 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_ci if (get_bits_left(gb) < 0) { 234cabdff1aSopenharmony_ci sps->num_reorder_frames = 0; 235cabdff1aSopenharmony_ci sps->bitstream_restriction_flag = 0; 236cabdff1aSopenharmony_ci } 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci if (sps->num_reorder_frames > 16U 239cabdff1aSopenharmony_ci /* max_dec_frame_buffering || max_dec_frame_buffering > 16 */) { 240cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_ERROR, 241cabdff1aSopenharmony_ci "Clipping illegal num_reorder_frames %d\n", 242cabdff1aSopenharmony_ci sps->num_reorder_frames); 243cabdff1aSopenharmony_ci sps->num_reorder_frames = 16; 244cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 245cabdff1aSopenharmony_ci } 246cabdff1aSopenharmony_ci } 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci return 0; 249cabdff1aSopenharmony_ci} 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_cistatic int decode_scaling_list(GetBitContext *gb, uint8_t *factors, int size, 252cabdff1aSopenharmony_ci const uint8_t *jvt_list, 253cabdff1aSopenharmony_ci const uint8_t *fallback_list) 254cabdff1aSopenharmony_ci{ 255cabdff1aSopenharmony_ci int i, last = 8, next = 8; 256cabdff1aSopenharmony_ci const uint8_t *scan = size == 16 ? ff_zigzag_scan : ff_zigzag_direct; 257cabdff1aSopenharmony_ci if (!get_bits1(gb)) /* matrix not written, we use the predicted one */ 258cabdff1aSopenharmony_ci memcpy(factors, fallback_list, size * sizeof(uint8_t)); 259cabdff1aSopenharmony_ci else 260cabdff1aSopenharmony_ci for (i = 0; i < size; i++) { 261cabdff1aSopenharmony_ci if (next) { 262cabdff1aSopenharmony_ci int v = get_se_golomb(gb); 263cabdff1aSopenharmony_ci if (v < -128 || v > 127) { 264cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "delta scale %d is invalid\n", v); 265cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 266cabdff1aSopenharmony_ci } 267cabdff1aSopenharmony_ci next = (last + v) & 0xff; 268cabdff1aSopenharmony_ci } 269cabdff1aSopenharmony_ci if (!i && !next) { /* matrix not written, we use the preset one */ 270cabdff1aSopenharmony_ci memcpy(factors, jvt_list, size * sizeof(uint8_t)); 271cabdff1aSopenharmony_ci break; 272cabdff1aSopenharmony_ci } 273cabdff1aSopenharmony_ci last = factors[scan[i]] = next ? next : last; 274cabdff1aSopenharmony_ci } 275cabdff1aSopenharmony_ci return 0; 276cabdff1aSopenharmony_ci} 277cabdff1aSopenharmony_ci 278cabdff1aSopenharmony_ci/* returns non zero if the provided SPS scaling matrix has been filled */ 279cabdff1aSopenharmony_cistatic int decode_scaling_matrices(GetBitContext *gb, const SPS *sps, 280cabdff1aSopenharmony_ci const PPS *pps, int is_sps, 281cabdff1aSopenharmony_ci uint8_t(*scaling_matrix4)[16], 282cabdff1aSopenharmony_ci uint8_t(*scaling_matrix8)[64]) 283cabdff1aSopenharmony_ci{ 284cabdff1aSopenharmony_ci int fallback_sps = !is_sps && sps->scaling_matrix_present; 285cabdff1aSopenharmony_ci const uint8_t *fallback[4] = { 286cabdff1aSopenharmony_ci fallback_sps ? sps->scaling_matrix4[0] : default_scaling4[0], 287cabdff1aSopenharmony_ci fallback_sps ? sps->scaling_matrix4[3] : default_scaling4[1], 288cabdff1aSopenharmony_ci fallback_sps ? sps->scaling_matrix8[0] : default_scaling8[0], 289cabdff1aSopenharmony_ci fallback_sps ? sps->scaling_matrix8[3] : default_scaling8[1] 290cabdff1aSopenharmony_ci }; 291cabdff1aSopenharmony_ci int ret = 0; 292cabdff1aSopenharmony_ci if (get_bits1(gb)) { 293cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix4[0], 16, default_scaling4[0], fallback[0]); // Intra, Y 294cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix4[1], 16, default_scaling4[0], scaling_matrix4[0]); // Intra, Cr 295cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix4[2], 16, default_scaling4[0], scaling_matrix4[1]); // Intra, Cb 296cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix4[3], 16, default_scaling4[1], fallback[1]); // Inter, Y 297cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix4[4], 16, default_scaling4[1], scaling_matrix4[3]); // Inter, Cr 298cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix4[5], 16, default_scaling4[1], scaling_matrix4[4]); // Inter, Cb 299cabdff1aSopenharmony_ci if (is_sps || pps->transform_8x8_mode) { 300cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix8[0], 64, default_scaling8[0], fallback[2]); // Intra, Y 301cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix8[3], 64, default_scaling8[1], fallback[3]); // Inter, Y 302cabdff1aSopenharmony_ci if (sps->chroma_format_idc == 3) { 303cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix8[1], 64, default_scaling8[0], scaling_matrix8[0]); // Intra, Cr 304cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix8[4], 64, default_scaling8[1], scaling_matrix8[3]); // Inter, Cr 305cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix8[2], 64, default_scaling8[0], scaling_matrix8[1]); // Intra, Cb 306cabdff1aSopenharmony_ci ret |= decode_scaling_list(gb, scaling_matrix8[5], 64, default_scaling8[1], scaling_matrix8[4]); // Inter, Cb 307cabdff1aSopenharmony_ci } 308cabdff1aSopenharmony_ci } 309cabdff1aSopenharmony_ci if (!ret) 310cabdff1aSopenharmony_ci ret = is_sps; 311cabdff1aSopenharmony_ci } 312cabdff1aSopenharmony_ci 313cabdff1aSopenharmony_ci return ret; 314cabdff1aSopenharmony_ci} 315cabdff1aSopenharmony_ci 316cabdff1aSopenharmony_civoid ff_h264_ps_uninit(H264ParamSets *ps) 317cabdff1aSopenharmony_ci{ 318cabdff1aSopenharmony_ci int i; 319cabdff1aSopenharmony_ci 320cabdff1aSopenharmony_ci for (i = 0; i < MAX_SPS_COUNT; i++) 321cabdff1aSopenharmony_ci av_buffer_unref(&ps->sps_list[i]); 322cabdff1aSopenharmony_ci 323cabdff1aSopenharmony_ci for (i = 0; i < MAX_PPS_COUNT; i++) 324cabdff1aSopenharmony_ci av_buffer_unref(&ps->pps_list[i]); 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci av_buffer_unref(&ps->pps_ref); 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_ci ps->pps = NULL; 329cabdff1aSopenharmony_ci ps->sps = NULL; 330cabdff1aSopenharmony_ci} 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ciint ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx, 333cabdff1aSopenharmony_ci H264ParamSets *ps, int ignore_truncation) 334cabdff1aSopenharmony_ci{ 335cabdff1aSopenharmony_ci AVBufferRef *sps_buf; 336cabdff1aSopenharmony_ci int profile_idc, level_idc, constraint_set_flags = 0; 337cabdff1aSopenharmony_ci unsigned int sps_id; 338cabdff1aSopenharmony_ci int i, log2_max_frame_num_minus4; 339cabdff1aSopenharmony_ci SPS *sps; 340cabdff1aSopenharmony_ci int ret; 341cabdff1aSopenharmony_ci 342cabdff1aSopenharmony_ci sps_buf = av_buffer_allocz(sizeof(*sps)); 343cabdff1aSopenharmony_ci if (!sps_buf) 344cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 345cabdff1aSopenharmony_ci sps = (SPS*)sps_buf->data; 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci sps->data_size = gb->buffer_end - gb->buffer; 348cabdff1aSopenharmony_ci if (sps->data_size > sizeof(sps->data)) { 349cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "Truncating likely oversized SPS\n"); 350cabdff1aSopenharmony_ci sps->data_size = sizeof(sps->data); 351cabdff1aSopenharmony_ci } 352cabdff1aSopenharmony_ci memcpy(sps->data, gb->buffer, sps->data_size); 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci // Re-add the removed stop bit (may be used by hwaccels). 355cabdff1aSopenharmony_ci if (!(gb->size_in_bits & 7) && sps->data_size < sizeof(sps->data)) 356cabdff1aSopenharmony_ci sps->data[sps->data_size++] = 0x80; 357cabdff1aSopenharmony_ci 358cabdff1aSopenharmony_ci profile_idc = get_bits(gb, 8); 359cabdff1aSopenharmony_ci constraint_set_flags |= get_bits1(gb) << 0; // constraint_set0_flag 360cabdff1aSopenharmony_ci constraint_set_flags |= get_bits1(gb) << 1; // constraint_set1_flag 361cabdff1aSopenharmony_ci constraint_set_flags |= get_bits1(gb) << 2; // constraint_set2_flag 362cabdff1aSopenharmony_ci constraint_set_flags |= get_bits1(gb) << 3; // constraint_set3_flag 363cabdff1aSopenharmony_ci constraint_set_flags |= get_bits1(gb) << 4; // constraint_set4_flag 364cabdff1aSopenharmony_ci constraint_set_flags |= get_bits1(gb) << 5; // constraint_set5_flag 365cabdff1aSopenharmony_ci skip_bits(gb, 2); // reserved_zero_2bits 366cabdff1aSopenharmony_ci level_idc = get_bits(gb, 8); 367cabdff1aSopenharmony_ci sps_id = get_ue_golomb_31(gb); 368cabdff1aSopenharmony_ci 369cabdff1aSopenharmony_ci if (sps_id >= MAX_SPS_COUNT) { 370cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "sps_id %u out of range\n", sps_id); 371cabdff1aSopenharmony_ci goto fail; 372cabdff1aSopenharmony_ci } 373cabdff1aSopenharmony_ci 374cabdff1aSopenharmony_ci sps->sps_id = sps_id; 375cabdff1aSopenharmony_ci sps->time_offset_length = 24; 376cabdff1aSopenharmony_ci sps->profile_idc = profile_idc; 377cabdff1aSopenharmony_ci sps->constraint_set_flags = constraint_set_flags; 378cabdff1aSopenharmony_ci sps->level_idc = level_idc; 379cabdff1aSopenharmony_ci sps->full_range = -1; 380cabdff1aSopenharmony_ci 381cabdff1aSopenharmony_ci memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4)); 382cabdff1aSopenharmony_ci memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8)); 383cabdff1aSopenharmony_ci sps->scaling_matrix_present = 0; 384cabdff1aSopenharmony_ci sps->colorspace = 2; //AVCOL_SPC_UNSPECIFIED 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_ci if (sps->profile_idc == 100 || // High profile 387cabdff1aSopenharmony_ci sps->profile_idc == 110 || // High10 profile 388cabdff1aSopenharmony_ci sps->profile_idc == 122 || // High422 profile 389cabdff1aSopenharmony_ci sps->profile_idc == 244 || // High444 Predictive profile 390cabdff1aSopenharmony_ci sps->profile_idc == 44 || // Cavlc444 profile 391cabdff1aSopenharmony_ci sps->profile_idc == 83 || // Scalable Constrained High profile (SVC) 392cabdff1aSopenharmony_ci sps->profile_idc == 86 || // Scalable High Intra profile (SVC) 393cabdff1aSopenharmony_ci sps->profile_idc == 118 || // Stereo High profile (MVC) 394cabdff1aSopenharmony_ci sps->profile_idc == 128 || // Multiview High profile (MVC) 395cabdff1aSopenharmony_ci sps->profile_idc == 138 || // Multiview Depth High profile (MVCD) 396cabdff1aSopenharmony_ci sps->profile_idc == 144) { // old High444 profile 397cabdff1aSopenharmony_ci sps->chroma_format_idc = get_ue_golomb_31(gb); 398cabdff1aSopenharmony_ci if (sps->chroma_format_idc > 3U) { 399cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "chroma_format_idc %u", 400cabdff1aSopenharmony_ci sps->chroma_format_idc); 401cabdff1aSopenharmony_ci goto fail; 402cabdff1aSopenharmony_ci } else if (sps->chroma_format_idc == 3) { 403cabdff1aSopenharmony_ci sps->residual_color_transform_flag = get_bits1(gb); 404cabdff1aSopenharmony_ci if (sps->residual_color_transform_flag) { 405cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "separate color planes are not supported\n"); 406cabdff1aSopenharmony_ci goto fail; 407cabdff1aSopenharmony_ci } 408cabdff1aSopenharmony_ci } 409cabdff1aSopenharmony_ci sps->bit_depth_luma = get_ue_golomb_31(gb) + 8; 410cabdff1aSopenharmony_ci sps->bit_depth_chroma = get_ue_golomb_31(gb) + 8; 411cabdff1aSopenharmony_ci if (sps->bit_depth_chroma != sps->bit_depth_luma) { 412cabdff1aSopenharmony_ci avpriv_request_sample(avctx, 413cabdff1aSopenharmony_ci "Different chroma and luma bit depth"); 414cabdff1aSopenharmony_ci goto fail; 415cabdff1aSopenharmony_ci } 416cabdff1aSopenharmony_ci if (sps->bit_depth_luma < 8 || sps->bit_depth_luma > 14 || 417cabdff1aSopenharmony_ci sps->bit_depth_chroma < 8 || sps->bit_depth_chroma > 14) { 418cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "illegal bit depth value (%d, %d)\n", 419cabdff1aSopenharmony_ci sps->bit_depth_luma, sps->bit_depth_chroma); 420cabdff1aSopenharmony_ci goto fail; 421cabdff1aSopenharmony_ci } 422cabdff1aSopenharmony_ci sps->transform_bypass = get_bits1(gb); 423cabdff1aSopenharmony_ci ret = decode_scaling_matrices(gb, sps, NULL, 1, 424cabdff1aSopenharmony_ci sps->scaling_matrix4, sps->scaling_matrix8); 425cabdff1aSopenharmony_ci if (ret < 0) 426cabdff1aSopenharmony_ci goto fail; 427cabdff1aSopenharmony_ci sps->scaling_matrix_present |= ret; 428cabdff1aSopenharmony_ci } else { 429cabdff1aSopenharmony_ci sps->chroma_format_idc = 1; 430cabdff1aSopenharmony_ci sps->bit_depth_luma = 8; 431cabdff1aSopenharmony_ci sps->bit_depth_chroma = 8; 432cabdff1aSopenharmony_ci } 433cabdff1aSopenharmony_ci 434cabdff1aSopenharmony_ci log2_max_frame_num_minus4 = get_ue_golomb_31(gb); 435cabdff1aSopenharmony_ci if (log2_max_frame_num_minus4 < MIN_LOG2_MAX_FRAME_NUM - 4 || 436cabdff1aSopenharmony_ci log2_max_frame_num_minus4 > MAX_LOG2_MAX_FRAME_NUM - 4) { 437cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 438cabdff1aSopenharmony_ci "log2_max_frame_num_minus4 out of range (0-12): %d\n", 439cabdff1aSopenharmony_ci log2_max_frame_num_minus4); 440cabdff1aSopenharmony_ci goto fail; 441cabdff1aSopenharmony_ci } 442cabdff1aSopenharmony_ci sps->log2_max_frame_num = log2_max_frame_num_minus4 + 4; 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_ci sps->poc_type = get_ue_golomb_31(gb); 445cabdff1aSopenharmony_ci 446cabdff1aSopenharmony_ci if (sps->poc_type == 0) { // FIXME #define 447cabdff1aSopenharmony_ci unsigned t = get_ue_golomb_31(gb); 448cabdff1aSopenharmony_ci if (t>12) { 449cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "log2_max_poc_lsb (%d) is out of range\n", t); 450cabdff1aSopenharmony_ci goto fail; 451cabdff1aSopenharmony_ci } 452cabdff1aSopenharmony_ci sps->log2_max_poc_lsb = t + 4; 453cabdff1aSopenharmony_ci } else if (sps->poc_type == 1) { // FIXME #define 454cabdff1aSopenharmony_ci sps->delta_pic_order_always_zero_flag = get_bits1(gb); 455cabdff1aSopenharmony_ci sps->offset_for_non_ref_pic = get_se_golomb_long(gb); 456cabdff1aSopenharmony_ci sps->offset_for_top_to_bottom_field = get_se_golomb_long(gb); 457cabdff1aSopenharmony_ci 458cabdff1aSopenharmony_ci if ( sps->offset_for_non_ref_pic == INT32_MIN 459cabdff1aSopenharmony_ci || sps->offset_for_top_to_bottom_field == INT32_MIN 460cabdff1aSopenharmony_ci ) { 461cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 462cabdff1aSopenharmony_ci "offset_for_non_ref_pic or offset_for_top_to_bottom_field is out of range\n"); 463cabdff1aSopenharmony_ci goto fail; 464cabdff1aSopenharmony_ci } 465cabdff1aSopenharmony_ci 466cabdff1aSopenharmony_ci sps->poc_cycle_length = get_ue_golomb(gb); 467cabdff1aSopenharmony_ci 468cabdff1aSopenharmony_ci if ((unsigned)sps->poc_cycle_length >= 469cabdff1aSopenharmony_ci FF_ARRAY_ELEMS(sps->offset_for_ref_frame)) { 470cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 471cabdff1aSopenharmony_ci "poc_cycle_length overflow %d\n", sps->poc_cycle_length); 472cabdff1aSopenharmony_ci goto fail; 473cabdff1aSopenharmony_ci } 474cabdff1aSopenharmony_ci 475cabdff1aSopenharmony_ci for (i = 0; i < sps->poc_cycle_length; i++) { 476cabdff1aSopenharmony_ci sps->offset_for_ref_frame[i] = get_se_golomb_long(gb); 477cabdff1aSopenharmony_ci if (sps->offset_for_ref_frame[i] == INT32_MIN) { 478cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 479cabdff1aSopenharmony_ci "offset_for_ref_frame is out of range\n"); 480cabdff1aSopenharmony_ci goto fail; 481cabdff1aSopenharmony_ci } 482cabdff1aSopenharmony_ci } 483cabdff1aSopenharmony_ci } else if (sps->poc_type != 2) { 484cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "illegal POC type %d\n", sps->poc_type); 485cabdff1aSopenharmony_ci goto fail; 486cabdff1aSopenharmony_ci } 487cabdff1aSopenharmony_ci 488cabdff1aSopenharmony_ci sps->ref_frame_count = get_ue_golomb_31(gb); 489cabdff1aSopenharmony_ci if (avctx->codec_tag == MKTAG('S', 'M', 'V', '2')) 490cabdff1aSopenharmony_ci sps->ref_frame_count = FFMAX(2, sps->ref_frame_count); 491cabdff1aSopenharmony_ci if (sps->ref_frame_count > H264_MAX_DPB_FRAMES) { 492cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 493cabdff1aSopenharmony_ci "too many reference frames %d\n", sps->ref_frame_count); 494cabdff1aSopenharmony_ci goto fail; 495cabdff1aSopenharmony_ci } 496cabdff1aSopenharmony_ci sps->gaps_in_frame_num_allowed_flag = get_bits1(gb); 497cabdff1aSopenharmony_ci sps->mb_width = get_ue_golomb(gb) + 1; 498cabdff1aSopenharmony_ci sps->mb_height = get_ue_golomb(gb) + 1; 499cabdff1aSopenharmony_ci 500cabdff1aSopenharmony_ci sps->frame_mbs_only_flag = get_bits1(gb); 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ci if (sps->mb_height >= INT_MAX / 2U) { 503cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "height overflow\n"); 504cabdff1aSopenharmony_ci goto fail; 505cabdff1aSopenharmony_ci } 506cabdff1aSopenharmony_ci sps->mb_height *= 2 - sps->frame_mbs_only_flag; 507cabdff1aSopenharmony_ci 508cabdff1aSopenharmony_ci if (!sps->frame_mbs_only_flag) 509cabdff1aSopenharmony_ci sps->mb_aff = get_bits1(gb); 510cabdff1aSopenharmony_ci else 511cabdff1aSopenharmony_ci sps->mb_aff = 0; 512cabdff1aSopenharmony_ci 513cabdff1aSopenharmony_ci if ((unsigned)sps->mb_width >= INT_MAX / 16 || 514cabdff1aSopenharmony_ci (unsigned)sps->mb_height >= INT_MAX / 16 || 515cabdff1aSopenharmony_ci av_image_check_size(16 * sps->mb_width, 516cabdff1aSopenharmony_ci 16 * sps->mb_height, 0, avctx)) { 517cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "mb_width/height overflow\n"); 518cabdff1aSopenharmony_ci goto fail; 519cabdff1aSopenharmony_ci } 520cabdff1aSopenharmony_ci 521cabdff1aSopenharmony_ci sps->direct_8x8_inference_flag = get_bits1(gb); 522cabdff1aSopenharmony_ci 523cabdff1aSopenharmony_ci sps->crop = get_bits1(gb); 524cabdff1aSopenharmony_ci if (sps->crop) { 525cabdff1aSopenharmony_ci unsigned int crop_left = get_ue_golomb(gb); 526cabdff1aSopenharmony_ci unsigned int crop_right = get_ue_golomb(gb); 527cabdff1aSopenharmony_ci unsigned int crop_top = get_ue_golomb(gb); 528cabdff1aSopenharmony_ci unsigned int crop_bottom = get_ue_golomb(gb); 529cabdff1aSopenharmony_ci int width = 16 * sps->mb_width; 530cabdff1aSopenharmony_ci int height = 16 * sps->mb_height; 531cabdff1aSopenharmony_ci 532cabdff1aSopenharmony_ci if (avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) { 533cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "discarding sps cropping, original " 534cabdff1aSopenharmony_ci "values are l:%d r:%d t:%d b:%d\n", 535cabdff1aSopenharmony_ci crop_left, crop_right, crop_top, crop_bottom); 536cabdff1aSopenharmony_ci 537cabdff1aSopenharmony_ci sps->crop_left = 538cabdff1aSopenharmony_ci sps->crop_right = 539cabdff1aSopenharmony_ci sps->crop_top = 540cabdff1aSopenharmony_ci sps->crop_bottom = 0; 541cabdff1aSopenharmony_ci } else { 542cabdff1aSopenharmony_ci int vsub = (sps->chroma_format_idc == 1) ? 1 : 0; 543cabdff1aSopenharmony_ci int hsub = (sps->chroma_format_idc == 1 || 544cabdff1aSopenharmony_ci sps->chroma_format_idc == 2) ? 1 : 0; 545cabdff1aSopenharmony_ci int step_x = 1 << hsub; 546cabdff1aSopenharmony_ci int step_y = (2 - sps->frame_mbs_only_flag) << vsub; 547cabdff1aSopenharmony_ci 548cabdff1aSopenharmony_ci if (crop_left > (unsigned)INT_MAX / 4 / step_x || 549cabdff1aSopenharmony_ci crop_right > (unsigned)INT_MAX / 4 / step_x || 550cabdff1aSopenharmony_ci crop_top > (unsigned)INT_MAX / 4 / step_y || 551cabdff1aSopenharmony_ci crop_bottom> (unsigned)INT_MAX / 4 / step_y || 552cabdff1aSopenharmony_ci (crop_left + crop_right ) * step_x >= width || 553cabdff1aSopenharmony_ci (crop_top + crop_bottom) * step_y >= height 554cabdff1aSopenharmony_ci ) { 555cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "crop values invalid %d %d %d %d / %d %d\n", crop_left, crop_right, crop_top, crop_bottom, width, height); 556cabdff1aSopenharmony_ci goto fail; 557cabdff1aSopenharmony_ci } 558cabdff1aSopenharmony_ci 559cabdff1aSopenharmony_ci sps->crop_left = crop_left * step_x; 560cabdff1aSopenharmony_ci sps->crop_right = crop_right * step_x; 561cabdff1aSopenharmony_ci sps->crop_top = crop_top * step_y; 562cabdff1aSopenharmony_ci sps->crop_bottom = crop_bottom * step_y; 563cabdff1aSopenharmony_ci } 564cabdff1aSopenharmony_ci } else { 565cabdff1aSopenharmony_ci sps->crop_left = 566cabdff1aSopenharmony_ci sps->crop_right = 567cabdff1aSopenharmony_ci sps->crop_top = 568cabdff1aSopenharmony_ci sps->crop_bottom = 569cabdff1aSopenharmony_ci sps->crop = 0; 570cabdff1aSopenharmony_ci } 571cabdff1aSopenharmony_ci 572cabdff1aSopenharmony_ci sps->vui_parameters_present_flag = get_bits1(gb); 573cabdff1aSopenharmony_ci if (sps->vui_parameters_present_flag) { 574cabdff1aSopenharmony_ci int ret = decode_vui_parameters(gb, avctx, sps); 575cabdff1aSopenharmony_ci if (ret < 0) 576cabdff1aSopenharmony_ci goto fail; 577cabdff1aSopenharmony_ci } 578cabdff1aSopenharmony_ci 579cabdff1aSopenharmony_ci if (get_bits_left(gb) < 0) { 580cabdff1aSopenharmony_ci av_log_once(avctx, ignore_truncation ? AV_LOG_WARNING : AV_LOG_ERROR, AV_LOG_DEBUG, 581cabdff1aSopenharmony_ci &ps->overread_warning_printed[sps->vui_parameters_present_flag], 582cabdff1aSopenharmony_ci "Overread %s by %d bits\n", sps->vui_parameters_present_flag ? "VUI" : "SPS", -get_bits_left(gb)); 583cabdff1aSopenharmony_ci if (!ignore_truncation) 584cabdff1aSopenharmony_ci goto fail; 585cabdff1aSopenharmony_ci } 586cabdff1aSopenharmony_ci 587cabdff1aSopenharmony_ci /* if the maximum delay is not stored in the SPS, derive it based on the 588cabdff1aSopenharmony_ci * level */ 589cabdff1aSopenharmony_ci if (!sps->bitstream_restriction_flag && 590cabdff1aSopenharmony_ci (sps->ref_frame_count || avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT)) { 591cabdff1aSopenharmony_ci sps->num_reorder_frames = H264_MAX_DPB_FRAMES - 1; 592cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(level_max_dpb_mbs); i++) { 593cabdff1aSopenharmony_ci if (level_max_dpb_mbs[i][0] == sps->level_idc) { 594cabdff1aSopenharmony_ci sps->num_reorder_frames = FFMIN(level_max_dpb_mbs[i][1] / (sps->mb_width * sps->mb_height), 595cabdff1aSopenharmony_ci sps->num_reorder_frames); 596cabdff1aSopenharmony_ci break; 597cabdff1aSopenharmony_ci } 598cabdff1aSopenharmony_ci } 599cabdff1aSopenharmony_ci } 600cabdff1aSopenharmony_ci 601cabdff1aSopenharmony_ci if (!sps->sar.den) 602cabdff1aSopenharmony_ci sps->sar.den = 1; 603cabdff1aSopenharmony_ci 604cabdff1aSopenharmony_ci if (avctx->debug & FF_DEBUG_PICT_INFO) { 605cabdff1aSopenharmony_ci static const char csp[4][5] = { "Gray", "420", "422", "444" }; 606cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, 607cabdff1aSopenharmony_ci "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%u/%u/%u/%u %s %s %"PRId32"/%"PRId32" b%d reo:%d\n", 608cabdff1aSopenharmony_ci sps_id, sps->profile_idc, sps->level_idc, 609cabdff1aSopenharmony_ci sps->poc_type, 610cabdff1aSopenharmony_ci sps->ref_frame_count, 611cabdff1aSopenharmony_ci sps->mb_width, sps->mb_height, 612cabdff1aSopenharmony_ci sps->frame_mbs_only_flag ? "FRM" : (sps->mb_aff ? "MB-AFF" : "PIC-AFF"), 613cabdff1aSopenharmony_ci sps->direct_8x8_inference_flag ? "8B8" : "", 614cabdff1aSopenharmony_ci sps->crop_left, sps->crop_right, 615cabdff1aSopenharmony_ci sps->crop_top, sps->crop_bottom, 616cabdff1aSopenharmony_ci sps->vui_parameters_present_flag ? "VUI" : "", 617cabdff1aSopenharmony_ci csp[sps->chroma_format_idc], 618cabdff1aSopenharmony_ci sps->timing_info_present_flag ? sps->num_units_in_tick : 0, 619cabdff1aSopenharmony_ci sps->timing_info_present_flag ? sps->time_scale : 0, 620cabdff1aSopenharmony_ci sps->bit_depth_luma, 621cabdff1aSopenharmony_ci sps->bitstream_restriction_flag ? sps->num_reorder_frames : -1 622cabdff1aSopenharmony_ci ); 623cabdff1aSopenharmony_ci } 624cabdff1aSopenharmony_ci 625cabdff1aSopenharmony_ci /* check if this is a repeat of an already parsed SPS, then keep the 626cabdff1aSopenharmony_ci * original one. 627cabdff1aSopenharmony_ci * otherwise drop all PPSes that depend on it */ 628cabdff1aSopenharmony_ci if (ps->sps_list[sps_id] && 629cabdff1aSopenharmony_ci !memcmp(ps->sps_list[sps_id]->data, sps_buf->data, sps_buf->size)) { 630cabdff1aSopenharmony_ci av_buffer_unref(&sps_buf); 631cabdff1aSopenharmony_ci } else { 632cabdff1aSopenharmony_ci remove_sps(ps, sps_id); 633cabdff1aSopenharmony_ci ps->sps_list[sps_id] = sps_buf; 634cabdff1aSopenharmony_ci } 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_ci return 0; 637cabdff1aSopenharmony_ci 638cabdff1aSopenharmony_cifail: 639cabdff1aSopenharmony_ci av_buffer_unref(&sps_buf); 640cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 641cabdff1aSopenharmony_ci} 642cabdff1aSopenharmony_ci 643cabdff1aSopenharmony_cistatic void init_dequant8_coeff_table(PPS *pps, const SPS *sps) 644cabdff1aSopenharmony_ci{ 645cabdff1aSopenharmony_ci int i, j, q, x; 646cabdff1aSopenharmony_ci const int max_qp = 51 + 6 * (sps->bit_depth_luma - 8); 647cabdff1aSopenharmony_ci 648cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 649cabdff1aSopenharmony_ci pps->dequant8_coeff[i] = pps->dequant8_buffer[i]; 650cabdff1aSopenharmony_ci for (j = 0; j < i; j++) 651cabdff1aSopenharmony_ci if (!memcmp(pps->scaling_matrix8[j], pps->scaling_matrix8[i], 652cabdff1aSopenharmony_ci 64 * sizeof(uint8_t))) { 653cabdff1aSopenharmony_ci pps->dequant8_coeff[i] = pps->dequant8_buffer[j]; 654cabdff1aSopenharmony_ci break; 655cabdff1aSopenharmony_ci } 656cabdff1aSopenharmony_ci if (j < i) 657cabdff1aSopenharmony_ci continue; 658cabdff1aSopenharmony_ci 659cabdff1aSopenharmony_ci for (q = 0; q < max_qp + 1; q++) { 660cabdff1aSopenharmony_ci int shift = ff_h264_quant_div6[q]; 661cabdff1aSopenharmony_ci int idx = ff_h264_quant_rem6[q]; 662cabdff1aSopenharmony_ci for (x = 0; x < 64; x++) 663cabdff1aSopenharmony_ci pps->dequant8_coeff[i][q][(x >> 3) | ((x & 7) << 3)] = 664cabdff1aSopenharmony_ci ((uint32_t)ff_h264_dequant8_coeff_init[idx][ff_h264_dequant8_coeff_init_scan[((x >> 1) & 12) | (x & 3)]] * 665cabdff1aSopenharmony_ci pps->scaling_matrix8[i][x]) << shift; 666cabdff1aSopenharmony_ci } 667cabdff1aSopenharmony_ci } 668cabdff1aSopenharmony_ci} 669cabdff1aSopenharmony_ci 670cabdff1aSopenharmony_cistatic void init_dequant4_coeff_table(PPS *pps, const SPS *sps) 671cabdff1aSopenharmony_ci{ 672cabdff1aSopenharmony_ci int i, j, q, x; 673cabdff1aSopenharmony_ci const int max_qp = 51 + 6 * (sps->bit_depth_luma - 8); 674cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 675cabdff1aSopenharmony_ci pps->dequant4_coeff[i] = pps->dequant4_buffer[i]; 676cabdff1aSopenharmony_ci for (j = 0; j < i; j++) 677cabdff1aSopenharmony_ci if (!memcmp(pps->scaling_matrix4[j], pps->scaling_matrix4[i], 678cabdff1aSopenharmony_ci 16 * sizeof(uint8_t))) { 679cabdff1aSopenharmony_ci pps->dequant4_coeff[i] = pps->dequant4_buffer[j]; 680cabdff1aSopenharmony_ci break; 681cabdff1aSopenharmony_ci } 682cabdff1aSopenharmony_ci if (j < i) 683cabdff1aSopenharmony_ci continue; 684cabdff1aSopenharmony_ci 685cabdff1aSopenharmony_ci for (q = 0; q < max_qp + 1; q++) { 686cabdff1aSopenharmony_ci int shift = ff_h264_quant_div6[q] + 2; 687cabdff1aSopenharmony_ci int idx = ff_h264_quant_rem6[q]; 688cabdff1aSopenharmony_ci for (x = 0; x < 16; x++) 689cabdff1aSopenharmony_ci pps->dequant4_coeff[i][q][(x >> 2) | ((x << 2) & 0xF)] = 690cabdff1aSopenharmony_ci ((uint32_t)ff_h264_dequant4_coeff_init[idx][(x & 1) + ((x >> 2) & 1)] * 691cabdff1aSopenharmony_ci pps->scaling_matrix4[i][x]) << shift; 692cabdff1aSopenharmony_ci } 693cabdff1aSopenharmony_ci } 694cabdff1aSopenharmony_ci} 695cabdff1aSopenharmony_ci 696cabdff1aSopenharmony_cistatic void init_dequant_tables(PPS *pps, const SPS *sps) 697cabdff1aSopenharmony_ci{ 698cabdff1aSopenharmony_ci int i, x; 699cabdff1aSopenharmony_ci init_dequant4_coeff_table(pps, sps); 700cabdff1aSopenharmony_ci memset(pps->dequant8_coeff, 0, sizeof(pps->dequant8_coeff)); 701cabdff1aSopenharmony_ci 702cabdff1aSopenharmony_ci if (pps->transform_8x8_mode) 703cabdff1aSopenharmony_ci init_dequant8_coeff_table(pps, sps); 704cabdff1aSopenharmony_ci if (sps->transform_bypass) { 705cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) 706cabdff1aSopenharmony_ci for (x = 0; x < 16; x++) 707cabdff1aSopenharmony_ci pps->dequant4_coeff[i][0][x] = 1 << 6; 708cabdff1aSopenharmony_ci if (pps->transform_8x8_mode) 709cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) 710cabdff1aSopenharmony_ci for (x = 0; x < 64; x++) 711cabdff1aSopenharmony_ci pps->dequant8_coeff[i][0][x] = 1 << 6; 712cabdff1aSopenharmony_ci } 713cabdff1aSopenharmony_ci} 714cabdff1aSopenharmony_ci 715cabdff1aSopenharmony_cistatic void build_qp_table(PPS *pps, int t, int index, const int depth) 716cabdff1aSopenharmony_ci{ 717cabdff1aSopenharmony_ci int i; 718cabdff1aSopenharmony_ci const int max_qp = 51 + 6 * (depth - 8); 719cabdff1aSopenharmony_ci for (i = 0; i < max_qp + 1; i++) 720cabdff1aSopenharmony_ci pps->chroma_qp_table[t][i] = 721cabdff1aSopenharmony_ci ff_h264_chroma_qp[depth - 8][av_clip(i + index, 0, max_qp)]; 722cabdff1aSopenharmony_ci} 723cabdff1aSopenharmony_ci 724cabdff1aSopenharmony_cistatic int more_rbsp_data_in_pps(const SPS *sps, void *logctx) 725cabdff1aSopenharmony_ci{ 726cabdff1aSopenharmony_ci int profile_idc = sps->profile_idc; 727cabdff1aSopenharmony_ci 728cabdff1aSopenharmony_ci if ((profile_idc == 66 || profile_idc == 77 || 729cabdff1aSopenharmony_ci profile_idc == 88) && (sps->constraint_set_flags & 7)) { 730cabdff1aSopenharmony_ci av_log(logctx, AV_LOG_VERBOSE, 731cabdff1aSopenharmony_ci "Current profile doesn't provide more RBSP data in PPS, skipping\n"); 732cabdff1aSopenharmony_ci return 0; 733cabdff1aSopenharmony_ci } 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci return 1; 736cabdff1aSopenharmony_ci} 737cabdff1aSopenharmony_ci 738cabdff1aSopenharmony_cistatic void pps_free(void *opaque, uint8_t *data) 739cabdff1aSopenharmony_ci{ 740cabdff1aSopenharmony_ci PPS *pps = (PPS*)data; 741cabdff1aSopenharmony_ci 742cabdff1aSopenharmony_ci av_buffer_unref(&pps->sps_ref); 743cabdff1aSopenharmony_ci 744cabdff1aSopenharmony_ci av_freep(&data); 745cabdff1aSopenharmony_ci} 746cabdff1aSopenharmony_ci 747cabdff1aSopenharmony_ciint ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avctx, 748cabdff1aSopenharmony_ci H264ParamSets *ps, int bit_length) 749cabdff1aSopenharmony_ci{ 750cabdff1aSopenharmony_ci AVBufferRef *pps_buf; 751cabdff1aSopenharmony_ci const SPS *sps; 752cabdff1aSopenharmony_ci unsigned int pps_id = get_ue_golomb(gb); 753cabdff1aSopenharmony_ci PPS *pps; 754cabdff1aSopenharmony_ci int qp_bd_offset; 755cabdff1aSopenharmony_ci int bits_left; 756cabdff1aSopenharmony_ci int ret; 757cabdff1aSopenharmony_ci 758cabdff1aSopenharmony_ci if (pps_id >= MAX_PPS_COUNT) { 759cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "pps_id %u out of range\n", pps_id); 760cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 761cabdff1aSopenharmony_ci } 762cabdff1aSopenharmony_ci 763cabdff1aSopenharmony_ci pps = av_mallocz(sizeof(*pps)); 764cabdff1aSopenharmony_ci if (!pps) 765cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 766cabdff1aSopenharmony_ci pps_buf = av_buffer_create((uint8_t*)pps, sizeof(*pps), 767cabdff1aSopenharmony_ci pps_free, NULL, 0); 768cabdff1aSopenharmony_ci if (!pps_buf) { 769cabdff1aSopenharmony_ci av_freep(&pps); 770cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 771cabdff1aSopenharmony_ci } 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_ci pps->data_size = gb->buffer_end - gb->buffer; 774cabdff1aSopenharmony_ci if (pps->data_size > sizeof(pps->data)) { 775cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "Truncating likely oversized PPS " 776cabdff1aSopenharmony_ci "(%"SIZE_SPECIFIER" > %"SIZE_SPECIFIER")\n", 777cabdff1aSopenharmony_ci pps->data_size, sizeof(pps->data)); 778cabdff1aSopenharmony_ci pps->data_size = sizeof(pps->data); 779cabdff1aSopenharmony_ci } 780cabdff1aSopenharmony_ci memcpy(pps->data, gb->buffer, pps->data_size); 781cabdff1aSopenharmony_ci 782cabdff1aSopenharmony_ci // Re-add the removed stop bit (may be used by hwaccels). 783cabdff1aSopenharmony_ci if (!(bit_length & 7) && pps->data_size < sizeof(pps->data)) 784cabdff1aSopenharmony_ci pps->data[pps->data_size++] = 0x80; 785cabdff1aSopenharmony_ci 786cabdff1aSopenharmony_ci pps->sps_id = get_ue_golomb_31(gb); 787cabdff1aSopenharmony_ci if ((unsigned)pps->sps_id >= MAX_SPS_COUNT || 788cabdff1aSopenharmony_ci !ps->sps_list[pps->sps_id]) { 789cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "sps_id %u out of range\n", pps->sps_id); 790cabdff1aSopenharmony_ci ret = AVERROR_INVALIDDATA; 791cabdff1aSopenharmony_ci goto fail; 792cabdff1aSopenharmony_ci } 793cabdff1aSopenharmony_ci pps->sps_ref = av_buffer_ref(ps->sps_list[pps->sps_id]); 794cabdff1aSopenharmony_ci if (!pps->sps_ref) { 795cabdff1aSopenharmony_ci ret = AVERROR(ENOMEM); 796cabdff1aSopenharmony_ci goto fail; 797cabdff1aSopenharmony_ci } 798cabdff1aSopenharmony_ci pps->sps = (const SPS*)pps->sps_ref->data; 799cabdff1aSopenharmony_ci sps = pps->sps; 800cabdff1aSopenharmony_ci 801cabdff1aSopenharmony_ci if (sps->bit_depth_luma > 14) { 802cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 803cabdff1aSopenharmony_ci "Invalid luma bit depth=%d\n", 804cabdff1aSopenharmony_ci sps->bit_depth_luma); 805cabdff1aSopenharmony_ci ret = AVERROR_INVALIDDATA; 806cabdff1aSopenharmony_ci goto fail; 807cabdff1aSopenharmony_ci } else if (sps->bit_depth_luma == 11 || sps->bit_depth_luma == 13) { 808cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, 809cabdff1aSopenharmony_ci "Unimplemented luma bit depth=%d", 810cabdff1aSopenharmony_ci sps->bit_depth_luma); 811cabdff1aSopenharmony_ci ret = AVERROR_PATCHWELCOME; 812cabdff1aSopenharmony_ci goto fail; 813cabdff1aSopenharmony_ci } 814cabdff1aSopenharmony_ci 815cabdff1aSopenharmony_ci pps->cabac = get_bits1(gb); 816cabdff1aSopenharmony_ci pps->pic_order_present = get_bits1(gb); 817cabdff1aSopenharmony_ci pps->slice_group_count = get_ue_golomb(gb) + 1; 818cabdff1aSopenharmony_ci if (pps->slice_group_count > 1) { 819cabdff1aSopenharmony_ci pps->mb_slice_group_map_type = get_ue_golomb(gb); 820cabdff1aSopenharmony_ci avpriv_report_missing_feature(avctx, "FMO"); 821cabdff1aSopenharmony_ci ret = AVERROR_PATCHWELCOME; 822cabdff1aSopenharmony_ci goto fail; 823cabdff1aSopenharmony_ci } 824cabdff1aSopenharmony_ci pps->ref_count[0] = get_ue_golomb(gb) + 1; 825cabdff1aSopenharmony_ci pps->ref_count[1] = get_ue_golomb(gb) + 1; 826cabdff1aSopenharmony_ci if (pps->ref_count[0] - 1 > 32 - 1 || pps->ref_count[1] - 1 > 32 - 1) { 827cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "reference overflow (pps)\n"); 828cabdff1aSopenharmony_ci ret = AVERROR_INVALIDDATA; 829cabdff1aSopenharmony_ci goto fail; 830cabdff1aSopenharmony_ci } 831cabdff1aSopenharmony_ci 832cabdff1aSopenharmony_ci qp_bd_offset = 6 * (sps->bit_depth_luma - 8); 833cabdff1aSopenharmony_ci 834cabdff1aSopenharmony_ci pps->weighted_pred = get_bits1(gb); 835cabdff1aSopenharmony_ci pps->weighted_bipred_idc = get_bits(gb, 2); 836cabdff1aSopenharmony_ci pps->init_qp = get_se_golomb(gb) + 26U + qp_bd_offset; 837cabdff1aSopenharmony_ci pps->init_qs = get_se_golomb(gb) + 26U + qp_bd_offset; 838cabdff1aSopenharmony_ci pps->chroma_qp_index_offset[0] = get_se_golomb(gb); 839cabdff1aSopenharmony_ci if (pps->chroma_qp_index_offset[0] < -12 || pps->chroma_qp_index_offset[0] > 12) { 840cabdff1aSopenharmony_ci ret = AVERROR_INVALIDDATA; 841cabdff1aSopenharmony_ci goto fail; 842cabdff1aSopenharmony_ci } 843cabdff1aSopenharmony_ci 844cabdff1aSopenharmony_ci pps->deblocking_filter_parameters_present = get_bits1(gb); 845cabdff1aSopenharmony_ci pps->constrained_intra_pred = get_bits1(gb); 846cabdff1aSopenharmony_ci pps->redundant_pic_cnt_present = get_bits1(gb); 847cabdff1aSopenharmony_ci 848cabdff1aSopenharmony_ci pps->transform_8x8_mode = 0; 849cabdff1aSopenharmony_ci memcpy(pps->scaling_matrix4, sps->scaling_matrix4, 850cabdff1aSopenharmony_ci sizeof(pps->scaling_matrix4)); 851cabdff1aSopenharmony_ci memcpy(pps->scaling_matrix8, sps->scaling_matrix8, 852cabdff1aSopenharmony_ci sizeof(pps->scaling_matrix8)); 853cabdff1aSopenharmony_ci 854cabdff1aSopenharmony_ci bits_left = bit_length - get_bits_count(gb); 855cabdff1aSopenharmony_ci if (bits_left > 0 && more_rbsp_data_in_pps(sps, avctx)) { 856cabdff1aSopenharmony_ci pps->transform_8x8_mode = get_bits1(gb); 857cabdff1aSopenharmony_ci ret = decode_scaling_matrices(gb, sps, pps, 0, 858cabdff1aSopenharmony_ci pps->scaling_matrix4, pps->scaling_matrix8); 859cabdff1aSopenharmony_ci if (ret < 0) 860cabdff1aSopenharmony_ci goto fail; 861cabdff1aSopenharmony_ci // second_chroma_qp_index_offset 862cabdff1aSopenharmony_ci pps->chroma_qp_index_offset[1] = get_se_golomb(gb); 863cabdff1aSopenharmony_ci if (pps->chroma_qp_index_offset[1] < -12 || pps->chroma_qp_index_offset[1] > 12) { 864cabdff1aSopenharmony_ci ret = AVERROR_INVALIDDATA; 865cabdff1aSopenharmony_ci goto fail; 866cabdff1aSopenharmony_ci } 867cabdff1aSopenharmony_ci } else { 868cabdff1aSopenharmony_ci pps->chroma_qp_index_offset[1] = pps->chroma_qp_index_offset[0]; 869cabdff1aSopenharmony_ci } 870cabdff1aSopenharmony_ci 871cabdff1aSopenharmony_ci build_qp_table(pps, 0, pps->chroma_qp_index_offset[0], 872cabdff1aSopenharmony_ci sps->bit_depth_luma); 873cabdff1aSopenharmony_ci build_qp_table(pps, 1, pps->chroma_qp_index_offset[1], 874cabdff1aSopenharmony_ci sps->bit_depth_luma); 875cabdff1aSopenharmony_ci 876cabdff1aSopenharmony_ci init_dequant_tables(pps, sps); 877cabdff1aSopenharmony_ci 878cabdff1aSopenharmony_ci if (pps->chroma_qp_index_offset[0] != pps->chroma_qp_index_offset[1]) 879cabdff1aSopenharmony_ci pps->chroma_qp_diff = 1; 880cabdff1aSopenharmony_ci 881cabdff1aSopenharmony_ci if (avctx->debug & FF_DEBUG_PICT_INFO) { 882cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, 883cabdff1aSopenharmony_ci "pps:%u sps:%u %s slice_groups:%d ref:%u/%u %s qp:%d/%d/%d/%d %s %s %s %s\n", 884cabdff1aSopenharmony_ci pps_id, pps->sps_id, 885cabdff1aSopenharmony_ci pps->cabac ? "CABAC" : "CAVLC", 886cabdff1aSopenharmony_ci pps->slice_group_count, 887cabdff1aSopenharmony_ci pps->ref_count[0], pps->ref_count[1], 888cabdff1aSopenharmony_ci pps->weighted_pred ? "weighted" : "", 889cabdff1aSopenharmony_ci pps->init_qp, pps->init_qs, pps->chroma_qp_index_offset[0], pps->chroma_qp_index_offset[1], 890cabdff1aSopenharmony_ci pps->deblocking_filter_parameters_present ? "LPAR" : "", 891cabdff1aSopenharmony_ci pps->constrained_intra_pred ? "CONSTR" : "", 892cabdff1aSopenharmony_ci pps->redundant_pic_cnt_present ? "REDU" : "", 893cabdff1aSopenharmony_ci pps->transform_8x8_mode ? "8x8DCT" : ""); 894cabdff1aSopenharmony_ci } 895cabdff1aSopenharmony_ci 896cabdff1aSopenharmony_ci remove_pps(ps, pps_id); 897cabdff1aSopenharmony_ci ps->pps_list[pps_id] = pps_buf; 898cabdff1aSopenharmony_ci 899cabdff1aSopenharmony_ci return 0; 900cabdff1aSopenharmony_ci 901cabdff1aSopenharmony_cifail: 902cabdff1aSopenharmony_ci av_buffer_unref(&pps_buf); 903cabdff1aSopenharmony_ci return ret; 904cabdff1aSopenharmony_ci} 905