/src/vlc/contrib/contrib-build/bpg/libavcodec/hevc_ps.c
Line | Count | Source |
1 | | /* |
2 | | * HEVC Parameter Set decoding |
3 | | * |
4 | | * Copyright (C) 2012 - 2103 Guillaume Martres |
5 | | * Copyright (C) 2012 - 2103 Mickael Raulet |
6 | | * Copyright (C) 2012 - 2013 Gildas Cocherel |
7 | | * Copyright (C) 2013 Vittorio Giovara |
8 | | * |
9 | | * This file is part of FFmpeg. |
10 | | * |
11 | | * FFmpeg is free software; you can redistribute it and/or |
12 | | * modify it under the terms of the GNU Lesser General Public |
13 | | * License as published by the Free Software Foundation; either |
14 | | * version 2.1 of the License, or (at your option) any later version. |
15 | | * |
16 | | * FFmpeg is distributed in the hope that it will be useful, |
17 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
19 | | * Lesser General Public License for more details. |
20 | | * |
21 | | * You should have received a copy of the GNU Lesser General Public |
22 | | * License along with FFmpeg; if not, write to the Free Software |
23 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
24 | | */ |
25 | | |
26 | | #include "libavutil/imgutils.h" |
27 | | #include "golomb.h" |
28 | | #include "hevc.h" |
29 | | |
30 | | static const uint8_t default_scaling_list_intra[] = { |
31 | | 16, 16, 16, 16, 17, 18, 21, 24, |
32 | | 16, 16, 16, 16, 17, 19, 22, 25, |
33 | | 16, 16, 17, 18, 20, 22, 25, 29, |
34 | | 16, 16, 18, 21, 24, 27, 31, 36, |
35 | | 17, 17, 20, 24, 30, 35, 41, 47, |
36 | | 18, 19, 22, 27, 35, 44, 54, 65, |
37 | | 21, 22, 25, 31, 41, 54, 70, 88, |
38 | | 24, 25, 29, 36, 47, 65, 88, 115 |
39 | | }; |
40 | | |
41 | | static const uint8_t default_scaling_list_inter[] = { |
42 | | 16, 16, 16, 16, 17, 18, 20, 24, |
43 | | 16, 16, 16, 17, 18, 20, 24, 25, |
44 | | 16, 16, 17, 18, 20, 24, 25, 28, |
45 | | 16, 17, 18, 20, 24, 25, 28, 33, |
46 | | 17, 18, 20, 24, 25, 28, 33, 41, |
47 | | 18, 20, 24, 25, 28, 33, 41, 54, |
48 | | 20, 24, 25, 28, 33, 41, 54, 71, |
49 | | 24, 25, 28, 33, 41, 54, 71, 91 |
50 | | }; |
51 | | |
52 | | #ifdef USE_PRED |
53 | | int ff_hevc_decode_short_term_rps(HEVCContext *s, ShortTermRPS *rps, |
54 | | const HEVCSPS *sps, int is_slice_header) |
55 | 0 | { |
56 | 0 | HEVCLocalContext *lc = s->HEVClc; |
57 | 0 | uint8_t rps_predict = 0; |
58 | 0 | int delta_poc; |
59 | 0 | int k0 = 0; |
60 | 0 | int k1 = 0; |
61 | 0 | int k = 0; |
62 | 0 | int i; |
63 | |
|
64 | 0 | GetBitContext *gb = &lc->gb; |
65 | |
|
66 | 0 | if (rps != sps->st_rps && sps->nb_st_rps) |
67 | 0 | rps_predict = get_bits1(gb); |
68 | |
|
69 | 0 | if (rps_predict) { |
70 | 0 | const ShortTermRPS *rps_ridx; |
71 | 0 | int delta_rps; |
72 | 0 | unsigned abs_delta_rps; |
73 | 0 | uint8_t use_delta_flag = 0; |
74 | 0 | uint8_t delta_rps_sign; |
75 | |
|
76 | 0 | if (is_slice_header) { |
77 | 0 | unsigned int delta_idx = get_ue_golomb_long(gb) + 1; |
78 | 0 | if (delta_idx > sps->nb_st_rps) { |
79 | 0 | av_log(s->avctx, AV_LOG_ERROR, |
80 | 0 | "Invalid value of delta_idx in slice header RPS: %d > %d.\n", |
81 | 0 | delta_idx, sps->nb_st_rps); |
82 | 0 | return AVERROR_INVALIDDATA; |
83 | 0 | } |
84 | 0 | rps_ridx = &sps->st_rps[sps->nb_st_rps - delta_idx]; |
85 | 0 | } else |
86 | 0 | rps_ridx = &sps->st_rps[rps - sps->st_rps - 1]; |
87 | | |
88 | 0 | delta_rps_sign = get_bits1(gb); |
89 | 0 | abs_delta_rps = get_ue_golomb_long(gb) + 1; |
90 | 0 | if (abs_delta_rps < 1 || abs_delta_rps > 32768) { |
91 | 0 | av_log(s->avctx, AV_LOG_ERROR, |
92 | 0 | "Invalid value of abs_delta_rps: %d\n", |
93 | 0 | abs_delta_rps); |
94 | 0 | return AVERROR_INVALIDDATA; |
95 | 0 | } |
96 | 0 | delta_rps = (1 - (delta_rps_sign << 1)) * abs_delta_rps; |
97 | 0 | for (i = 0; i <= rps_ridx->num_delta_pocs; i++) { |
98 | 0 | int used = rps->used[k] = get_bits1(gb); |
99 | |
|
100 | 0 | if (!used) |
101 | 0 | use_delta_flag = get_bits1(gb); |
102 | |
|
103 | 0 | if (used || use_delta_flag) { |
104 | 0 | if (i < rps_ridx->num_delta_pocs) |
105 | 0 | delta_poc = delta_rps + rps_ridx->delta_poc[i]; |
106 | 0 | else |
107 | 0 | delta_poc = delta_rps; |
108 | 0 | rps->delta_poc[k] = delta_poc; |
109 | 0 | if (delta_poc < 0) |
110 | 0 | k0++; |
111 | 0 | else |
112 | 0 | k1++; |
113 | 0 | k++; |
114 | 0 | } |
115 | 0 | } |
116 | |
|
117 | 0 | rps->num_delta_pocs = k; |
118 | 0 | rps->num_negative_pics = k0; |
119 | | // sort in increasing order (smallest first) |
120 | 0 | if (rps->num_delta_pocs != 0) { |
121 | 0 | int used, tmp; |
122 | 0 | for (i = 1; i < rps->num_delta_pocs; i++) { |
123 | 0 | delta_poc = rps->delta_poc[i]; |
124 | 0 | used = rps->used[i]; |
125 | 0 | for (k = i - 1; k >= 0; k--) { |
126 | 0 | tmp = rps->delta_poc[k]; |
127 | 0 | if (delta_poc < tmp) { |
128 | 0 | rps->delta_poc[k + 1] = tmp; |
129 | 0 | rps->used[k + 1] = rps->used[k]; |
130 | 0 | rps->delta_poc[k] = delta_poc; |
131 | 0 | rps->used[k] = used; |
132 | 0 | } |
133 | 0 | } |
134 | 0 | } |
135 | 0 | } |
136 | 0 | if ((rps->num_negative_pics >> 1) != 0) { |
137 | 0 | int used; |
138 | 0 | k = rps->num_negative_pics - 1; |
139 | | // flip the negative values to largest first |
140 | 0 | for (i = 0; i < rps->num_negative_pics >> 1; i++) { |
141 | 0 | delta_poc = rps->delta_poc[i]; |
142 | 0 | used = rps->used[i]; |
143 | 0 | rps->delta_poc[i] = rps->delta_poc[k]; |
144 | 0 | rps->used[i] = rps->used[k]; |
145 | 0 | rps->delta_poc[k] = delta_poc; |
146 | 0 | rps->used[k] = used; |
147 | 0 | k--; |
148 | 0 | } |
149 | 0 | } |
150 | 0 | } else { |
151 | 0 | unsigned int prev, nb_positive_pics; |
152 | 0 | rps->num_negative_pics = get_ue_golomb_long(gb); |
153 | 0 | nb_positive_pics = get_ue_golomb_long(gb); |
154 | |
|
155 | 0 | if (rps->num_negative_pics >= MAX_REFS || |
156 | 0 | nb_positive_pics >= MAX_REFS) { |
157 | 0 | av_log(s->avctx, AV_LOG_ERROR, "Too many refs in a short term RPS.\n"); |
158 | 0 | return AVERROR_INVALIDDATA; |
159 | 0 | } |
160 | | |
161 | 0 | rps->num_delta_pocs = rps->num_negative_pics + nb_positive_pics; |
162 | 0 | if (rps->num_delta_pocs) { |
163 | 0 | prev = 0; |
164 | 0 | for (i = 0; i < rps->num_negative_pics; i++) { |
165 | 0 | delta_poc = get_ue_golomb_long(gb) + 1; |
166 | 0 | prev -= delta_poc; |
167 | 0 | rps->delta_poc[i] = prev; |
168 | 0 | rps->used[i] = get_bits1(gb); |
169 | 0 | } |
170 | 0 | prev = 0; |
171 | 0 | for (i = 0; i < nb_positive_pics; i++) { |
172 | 0 | delta_poc = get_ue_golomb_long(gb) + 1; |
173 | 0 | prev += delta_poc; |
174 | 0 | rps->delta_poc[rps->num_negative_pics + i] = prev; |
175 | 0 | rps->used[rps->num_negative_pics + i] = get_bits1(gb); |
176 | 0 | } |
177 | 0 | } |
178 | 0 | } |
179 | 0 | return 0; |
180 | 0 | } |
181 | | #endif |
182 | | |
183 | | #ifndef USE_MSPS |
184 | | static const AVRational vui_sar[] = { |
185 | | { 0, 1 }, |
186 | | { 1, 1 }, |
187 | | { 12, 11 }, |
188 | | { 10, 11 }, |
189 | | { 16, 11 }, |
190 | | { 40, 33 }, |
191 | | { 24, 11 }, |
192 | | { 20, 11 }, |
193 | | { 32, 11 }, |
194 | | { 80, 33 }, |
195 | | { 18, 11 }, |
196 | | { 15, 11 }, |
197 | | { 64, 33 }, |
198 | | { 160, 99 }, |
199 | | { 4, 3 }, |
200 | | { 3, 2 }, |
201 | | { 2, 1 }, |
202 | | }; |
203 | | |
204 | | static int decode_profile_tier_level(HEVCContext *s, PTLCommon *ptl) |
205 | | { |
206 | | int i; |
207 | | HEVCLocalContext *lc = s->HEVClc; |
208 | | GetBitContext *gb = &lc->gb; |
209 | | |
210 | | if (get_bits_left(gb) < 2+1+5 + 32 + 4 + 16 + 16 + 12) |
211 | | return -1; |
212 | | |
213 | | ptl->profile_space = get_bits(gb, 2); |
214 | | ptl->tier_flag = get_bits1(gb); |
215 | | ptl->profile_idc = get_bits(gb, 5); |
216 | | if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN) |
217 | | av_log(s->avctx, AV_LOG_DEBUG, "Main profile bitstream\n"); |
218 | | else if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN_10) |
219 | | av_log(s->avctx, AV_LOG_DEBUG, "Main 10 profile bitstream\n"); |
220 | | else if (ptl->profile_idc == FF_PROFILE_HEVC_MAIN_STILL_PICTURE) |
221 | | av_log(s->avctx, AV_LOG_DEBUG, "Main Still Picture profile bitstream\n"); |
222 | | else if (ptl->profile_idc == FF_PROFILE_HEVC_REXT) |
223 | | av_log(s->avctx, AV_LOG_DEBUG, "Range Extension profile bitstream\n"); |
224 | | else |
225 | | av_log(s->avctx, AV_LOG_WARNING, "Unknown HEVC profile: %d\n", ptl->profile_idc); |
226 | | |
227 | | for (i = 0; i < 32; i++) |
228 | | ptl->profile_compatibility_flag[i] = get_bits1(gb); |
229 | | ptl->progressive_source_flag = get_bits1(gb); |
230 | | ptl->interlaced_source_flag = get_bits1(gb); |
231 | | ptl->non_packed_constraint_flag = get_bits1(gb); |
232 | | ptl->frame_only_constraint_flag = get_bits1(gb); |
233 | | |
234 | | skip_bits(gb, 16); // XXX_reserved_zero_44bits[0..15] |
235 | | skip_bits(gb, 16); // XXX_reserved_zero_44bits[16..31] |
236 | | skip_bits(gb, 12); // XXX_reserved_zero_44bits[32..43] |
237 | | |
238 | | return 0; |
239 | | } |
240 | | |
241 | | static int parse_ptl(HEVCContext *s, PTL *ptl, int max_num_sub_layers) |
242 | | { |
243 | | int i; |
244 | | HEVCLocalContext *lc = s->HEVClc; |
245 | | GetBitContext *gb = &lc->gb; |
246 | | if (decode_profile_tier_level(s, &ptl->general_ptl) < 0 || |
247 | | get_bits_left(gb) < 8 + 8*2) { |
248 | | av_log(s->avctx, AV_LOG_ERROR, "PTL information too short\n"); |
249 | | return -1; |
250 | | } |
251 | | |
252 | | ptl->general_ptl.level_idc = get_bits(gb, 8); |
253 | | |
254 | | for (i = 0; i < max_num_sub_layers - 1; i++) { |
255 | | ptl->sub_layer_profile_present_flag[i] = get_bits1(gb); |
256 | | ptl->sub_layer_level_present_flag[i] = get_bits1(gb); |
257 | | } |
258 | | |
259 | | if (max_num_sub_layers - 1> 0) |
260 | | for (i = max_num_sub_layers - 1; i < 8; i++) |
261 | | skip_bits(gb, 2); // reserved_zero_2bits[i] |
262 | | for (i = 0; i < max_num_sub_layers - 1; i++) { |
263 | | if (ptl->sub_layer_profile_present_flag[i] && |
264 | | decode_profile_tier_level(s, &ptl->sub_layer_ptl[i]) < 0) { |
265 | | av_log(s->avctx, AV_LOG_ERROR, |
266 | | "PTL information for sublayer %i too short\n", i); |
267 | | return -1; |
268 | | } |
269 | | if (ptl->sub_layer_level_present_flag[i]) { |
270 | | if (get_bits_left(gb) < 8) { |
271 | | av_log(s->avctx, AV_LOG_ERROR, |
272 | | "Not enough data for sublayer %i level_idc\n", i); |
273 | | return -1; |
274 | | } else |
275 | | ptl->sub_layer_ptl[i].level_idc = get_bits(gb, 8); |
276 | | } |
277 | | } |
278 | | |
279 | | return 0; |
280 | | } |
281 | | |
282 | | static void decode_sublayer_hrd(HEVCContext *s, unsigned int nb_cpb, |
283 | | int subpic_params_present) |
284 | | { |
285 | | GetBitContext *gb = &s->HEVClc->gb; |
286 | | int i; |
287 | | |
288 | | for (i = 0; i < nb_cpb; i++) { |
289 | | get_ue_golomb_long(gb); // bit_rate_value_minus1 |
290 | | get_ue_golomb_long(gb); // cpb_size_value_minus1 |
291 | | |
292 | | if (subpic_params_present) { |
293 | | get_ue_golomb_long(gb); // cpb_size_du_value_minus1 |
294 | | get_ue_golomb_long(gb); // bit_rate_du_value_minus1 |
295 | | } |
296 | | skip_bits1(gb); // cbr_flag |
297 | | } |
298 | | } |
299 | | |
300 | | static int decode_hrd(HEVCContext *s, int common_inf_present, |
301 | | int max_sublayers) |
302 | | { |
303 | | GetBitContext *gb = &s->HEVClc->gb; |
304 | | int nal_params_present = 0, vcl_params_present = 0; |
305 | | int subpic_params_present = 0; |
306 | | int i; |
307 | | |
308 | | if (common_inf_present) { |
309 | | nal_params_present = get_bits1(gb); |
310 | | vcl_params_present = get_bits1(gb); |
311 | | |
312 | | if (nal_params_present || vcl_params_present) { |
313 | | subpic_params_present = get_bits1(gb); |
314 | | |
315 | | if (subpic_params_present) { |
316 | | skip_bits(gb, 8); // tick_divisor_minus2 |
317 | | skip_bits(gb, 5); // du_cpb_removal_delay_increment_length_minus1 |
318 | | skip_bits(gb, 1); // sub_pic_cpb_params_in_pic_timing_sei_flag |
319 | | skip_bits(gb, 5); // dpb_output_delay_du_length_minus1 |
320 | | } |
321 | | |
322 | | skip_bits(gb, 4); // bit_rate_scale |
323 | | skip_bits(gb, 4); // cpb_size_scale |
324 | | |
325 | | if (subpic_params_present) |
326 | | skip_bits(gb, 4); // cpb_size_du_scale |
327 | | |
328 | | skip_bits(gb, 5); // initial_cpb_removal_delay_length_minus1 |
329 | | skip_bits(gb, 5); // au_cpb_removal_delay_length_minus1 |
330 | | skip_bits(gb, 5); // dpb_output_delay_length_minus1 |
331 | | } |
332 | | } |
333 | | |
334 | | for (i = 0; i < max_sublayers; i++) { |
335 | | int low_delay = 0; |
336 | | unsigned int nb_cpb = 1; |
337 | | int fixed_rate = get_bits1(gb); |
338 | | |
339 | | if (!fixed_rate) |
340 | | fixed_rate = get_bits1(gb); |
341 | | |
342 | | if (fixed_rate) |
343 | | get_ue_golomb_long(gb); // elemental_duration_in_tc_minus1 |
344 | | else |
345 | | low_delay = get_bits1(gb); |
346 | | |
347 | | if (!low_delay) { |
348 | | nb_cpb = get_ue_golomb_long(gb) + 1; |
349 | | if (nb_cpb < 1 || nb_cpb > 32) { |
350 | | av_log(s->avctx, AV_LOG_ERROR, "nb_cpb %d invalid\n", nb_cpb); |
351 | | return AVERROR_INVALIDDATA; |
352 | | } |
353 | | } |
354 | | |
355 | | if (nal_params_present) |
356 | | decode_sublayer_hrd(s, nb_cpb, subpic_params_present); |
357 | | if (vcl_params_present) |
358 | | decode_sublayer_hrd(s, nb_cpb, subpic_params_present); |
359 | | } |
360 | | return 0; |
361 | | } |
362 | | #endif /* !USE_MSPS */ |
363 | | |
364 | | #ifdef USE_MSPS |
365 | | static int create_dummy_vps(HEVCContext *s) |
366 | 0 | { |
367 | 0 | int i; |
368 | 0 | int vps_id = 0; |
369 | 0 | HEVCVPS *vps; |
370 | 0 | AVBufferRef *vps_buf = av_buffer_allocz(sizeof(*vps)); |
371 | |
|
372 | 0 | if (!vps_buf) |
373 | 0 | return AVERROR(ENOMEM); |
374 | 0 | vps = (HEVCVPS*)vps_buf->data; |
375 | |
|
376 | 0 | vps_id = 0; |
377 | 0 | vps->vps_max_layers = 1; |
378 | 0 | vps->vps_max_sub_layers = 1; |
379 | 0 | vps->vps_temporal_id_nesting_flag = 0; |
380 | |
|
381 | 0 | vps->vps_sub_layer_ordering_info_present_flag = 1; |
382 | |
|
383 | 0 | i = vps->vps_sub_layer_ordering_info_present_flag ? 0 : vps->vps_max_sub_layers - 1; |
384 | 0 | for (; i < vps->vps_max_sub_layers; i++) { |
385 | 0 | vps->vps_max_dec_pic_buffering[i] = 1; |
386 | 0 | vps->vps_num_reorder_pics[i] = 0; |
387 | 0 | vps->vps_max_latency_increase[i] = -1; |
388 | 0 | } |
389 | |
|
390 | 0 | vps->vps_max_layer_id = 0; |
391 | 0 | vps->vps_num_layer_sets = 1; |
392 | |
|
393 | 0 | vps->vps_timing_info_present_flag = 0; |
394 | 0 | av_buffer_unref(&s->vps_list[vps_id]); |
395 | 0 | s->vps_list[vps_id] = vps_buf; |
396 | 0 | return 0; |
397 | 0 | } |
398 | | #else |
399 | | int ff_hevc_decode_nal_vps(HEVCContext *s) |
400 | | { |
401 | | int i,j; |
402 | | GetBitContext *gb = &s->HEVClc->gb; |
403 | | int vps_id = 0; |
404 | | HEVCVPS *vps; |
405 | | AVBufferRef *vps_buf = av_buffer_allocz(sizeof(*vps)); |
406 | | |
407 | | if (!vps_buf) |
408 | | return AVERROR(ENOMEM); |
409 | | vps = (HEVCVPS*)vps_buf->data; |
410 | | |
411 | | av_log(s->avctx, AV_LOG_DEBUG, "Decoding VPS\n"); |
412 | | |
413 | | vps_id = get_bits(gb, 4); |
414 | | if (vps_id >= MAX_VPS_COUNT) { |
415 | | av_log(s->avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", vps_id); |
416 | | goto err; |
417 | | } |
418 | | |
419 | | if (get_bits(gb, 2) != 3) { // vps_reserved_three_2bits |
420 | | av_log(s->avctx, AV_LOG_ERROR, "vps_reserved_three_2bits is not three\n"); |
421 | | goto err; |
422 | | } |
423 | | |
424 | | vps->vps_max_layers = get_bits(gb, 6) + 1; |
425 | | vps->vps_max_sub_layers = get_bits(gb, 3) + 1; |
426 | | vps->vps_temporal_id_nesting_flag = get_bits1(gb); |
427 | | |
428 | | if (get_bits(gb, 16) != 0xffff) { // vps_reserved_ffff_16bits |
429 | | av_log(s->avctx, AV_LOG_ERROR, "vps_reserved_ffff_16bits is not 0xffff\n"); |
430 | | goto err; |
431 | | } |
432 | | |
433 | | if (vps->vps_max_sub_layers > MAX_SUB_LAYERS) { |
434 | | av_log(s->avctx, AV_LOG_ERROR, "vps_max_sub_layers out of range: %d\n", |
435 | | vps->vps_max_sub_layers); |
436 | | goto err; |
437 | | } |
438 | | |
439 | | if (parse_ptl(s, &vps->ptl, vps->vps_max_sub_layers) < 0) |
440 | | goto err; |
441 | | |
442 | | vps->vps_sub_layer_ordering_info_present_flag = get_bits1(gb); |
443 | | |
444 | | i = vps->vps_sub_layer_ordering_info_present_flag ? 0 : vps->vps_max_sub_layers - 1; |
445 | | for (; i < vps->vps_max_sub_layers; i++) { |
446 | | vps->vps_max_dec_pic_buffering[i] = get_ue_golomb_long(gb) + 1; |
447 | | vps->vps_num_reorder_pics[i] = get_ue_golomb_long(gb); |
448 | | vps->vps_max_latency_increase[i] = get_ue_golomb_long(gb) - 1; |
449 | | |
450 | | if (vps->vps_max_dec_pic_buffering[i] > MAX_DPB_SIZE || !vps->vps_max_dec_pic_buffering[i]) { |
451 | | av_log(s->avctx, AV_LOG_ERROR, "vps_max_dec_pic_buffering_minus1 out of range: %d\n", |
452 | | vps->vps_max_dec_pic_buffering[i] - 1); |
453 | | goto err; |
454 | | } |
455 | | if (vps->vps_num_reorder_pics[i] > vps->vps_max_dec_pic_buffering[i] - 1) { |
456 | | av_log(s->avctx, AV_LOG_WARNING, "vps_max_num_reorder_pics out of range: %d\n", |
457 | | vps->vps_num_reorder_pics[i]); |
458 | | if (s->avctx->err_recognition & AV_EF_EXPLODE) |
459 | | goto err; |
460 | | } |
461 | | } |
462 | | |
463 | | vps->vps_max_layer_id = get_bits(gb, 6); |
464 | | vps->vps_num_layer_sets = get_ue_golomb_long(gb) + 1; |
465 | | if ((vps->vps_num_layer_sets - 1LL) * (vps->vps_max_layer_id + 1LL) > get_bits_left(gb)) { |
466 | | av_log(s->avctx, AV_LOG_ERROR, "too many layer_id_included_flags\n"); |
467 | | goto err; |
468 | | } |
469 | | |
470 | | for (i = 1; i < vps->vps_num_layer_sets; i++) |
471 | | for (j = 0; j <= vps->vps_max_layer_id; j++) |
472 | | skip_bits(gb, 1); // layer_id_included_flag[i][j] |
473 | | |
474 | | vps->vps_timing_info_present_flag = get_bits1(gb); |
475 | | if (vps->vps_timing_info_present_flag) { |
476 | | vps->vps_num_units_in_tick = get_bits_long(gb, 32); |
477 | | vps->vps_time_scale = get_bits_long(gb, 32); |
478 | | vps->vps_poc_proportional_to_timing_flag = get_bits1(gb); |
479 | | if (vps->vps_poc_proportional_to_timing_flag) |
480 | | vps->vps_num_ticks_poc_diff_one = get_ue_golomb_long(gb) + 1; |
481 | | vps->vps_num_hrd_parameters = get_ue_golomb_long(gb); |
482 | | for (i = 0; i < vps->vps_num_hrd_parameters; i++) { |
483 | | int common_inf_present = 1; |
484 | | |
485 | | get_ue_golomb_long(gb); // hrd_layer_set_idx |
486 | | if (i) |
487 | | common_inf_present = get_bits1(gb); |
488 | | decode_hrd(s, common_inf_present, vps->vps_max_sub_layers); |
489 | | } |
490 | | } |
491 | | get_bits1(gb); /* vps_extension_flag */ |
492 | | |
493 | | if (get_bits_left(gb) < 0) { |
494 | | av_log(s->avctx, AV_LOG_ERROR, |
495 | | "Overread VPS by %d bits\n", -get_bits_left(gb)); |
496 | | goto err; |
497 | | } |
498 | | |
499 | | av_buffer_unref(&s->vps_list[vps_id]); |
500 | | s->vps_list[vps_id] = vps_buf; |
501 | | return 0; |
502 | | |
503 | | err: |
504 | | av_buffer_unref(&vps_buf); |
505 | | return AVERROR_INVALIDDATA; |
506 | | } |
507 | | #endif |
508 | | |
509 | | #ifndef USE_MSPS |
510 | | static void decode_vui(HEVCContext *s, HEVCSPS *sps) |
511 | | { |
512 | | VUI *vui = &sps->vui; |
513 | | GetBitContext *gb = &s->HEVClc->gb; |
514 | | GetBitContext backup; |
515 | | int sar_present, alt = 0; |
516 | | |
517 | | av_log(s->avctx, AV_LOG_DEBUG, "Decoding VUI\n"); |
518 | | |
519 | | sar_present = get_bits1(gb); |
520 | | if (sar_present) { |
521 | | uint8_t sar_idx = get_bits(gb, 8); |
522 | | if (sar_idx < FF_ARRAY_ELEMS(vui_sar)) |
523 | | vui->sar = vui_sar[sar_idx]; |
524 | | else if (sar_idx == 255) { |
525 | | vui->sar.num = get_bits(gb, 16); |
526 | | vui->sar.den = get_bits(gb, 16); |
527 | | } else |
528 | | av_log(s->avctx, AV_LOG_WARNING, |
529 | | "Unknown SAR index: %u.\n", sar_idx); |
530 | | } |
531 | | |
532 | | vui->overscan_info_present_flag = get_bits1(gb); |
533 | | if (vui->overscan_info_present_flag) |
534 | | vui->overscan_appropriate_flag = get_bits1(gb); |
535 | | |
536 | | vui->video_signal_type_present_flag = get_bits1(gb); |
537 | | if (vui->video_signal_type_present_flag) { |
538 | | vui->video_format = get_bits(gb, 3); |
539 | | vui->video_full_range_flag = get_bits1(gb); |
540 | | vui->colour_description_present_flag = get_bits1(gb); |
541 | | if (vui->video_full_range_flag && sps->pix_fmt == AV_PIX_FMT_YUV420P) |
542 | | sps->pix_fmt = AV_PIX_FMT_YUVJ420P; |
543 | | if (vui->colour_description_present_flag) { |
544 | | vui->colour_primaries = get_bits(gb, 8); |
545 | | vui->transfer_characteristic = get_bits(gb, 8); |
546 | | vui->matrix_coeffs = get_bits(gb, 8); |
547 | | |
548 | | // Set invalid values to "unspecified" |
549 | | if (vui->colour_primaries >= AVCOL_PRI_NB) |
550 | | vui->colour_primaries = AVCOL_PRI_UNSPECIFIED; |
551 | | if (vui->transfer_characteristic >= AVCOL_TRC_NB) |
552 | | vui->transfer_characteristic = AVCOL_TRC_UNSPECIFIED; |
553 | | if (vui->matrix_coeffs >= AVCOL_SPC_NB) |
554 | | vui->matrix_coeffs = AVCOL_SPC_UNSPECIFIED; |
555 | | } |
556 | | } |
557 | | |
558 | | vui->chroma_loc_info_present_flag = get_bits1(gb); |
559 | | if (vui->chroma_loc_info_present_flag) { |
560 | | vui->chroma_sample_loc_type_top_field = get_ue_golomb_long(gb); |
561 | | vui->chroma_sample_loc_type_bottom_field = get_ue_golomb_long(gb); |
562 | | } |
563 | | |
564 | | vui->neutra_chroma_indication_flag = get_bits1(gb); |
565 | | vui->field_seq_flag = get_bits1(gb); |
566 | | vui->frame_field_info_present_flag = get_bits1(gb); |
567 | | |
568 | | if (get_bits_left(gb) >= 68 && show_bits_long(gb, 21) == 0x100000) { |
569 | | vui->default_display_window_flag = 0; |
570 | | av_log(s->avctx, AV_LOG_WARNING, "Invalid default display window\n"); |
571 | | } else |
572 | | vui->default_display_window_flag = get_bits1(gb); |
573 | | // Backup context in case an alternate header is detected |
574 | | memcpy(&backup, gb, sizeof(backup)); |
575 | | |
576 | | if (vui->default_display_window_flag) { |
577 | | //TODO: * 2 is only valid for 420 |
578 | | vui->def_disp_win.left_offset = get_ue_golomb_long(gb) * 2; |
579 | | vui->def_disp_win.right_offset = get_ue_golomb_long(gb) * 2; |
580 | | vui->def_disp_win.top_offset = get_ue_golomb_long(gb) * 2; |
581 | | vui->def_disp_win.bottom_offset = get_ue_golomb_long(gb) * 2; |
582 | | |
583 | | if (s->apply_defdispwin && |
584 | | s->avctx->flags2 & CODEC_FLAG2_IGNORE_CROP) { |
585 | | av_log(s->avctx, AV_LOG_DEBUG, |
586 | | "discarding vui default display window, " |
587 | | "original values are l:%u r:%u t:%u b:%u\n", |
588 | | vui->def_disp_win.left_offset, |
589 | | vui->def_disp_win.right_offset, |
590 | | vui->def_disp_win.top_offset, |
591 | | vui->def_disp_win.bottom_offset); |
592 | | |
593 | | vui->def_disp_win.left_offset = |
594 | | vui->def_disp_win.right_offset = |
595 | | vui->def_disp_win.top_offset = |
596 | | vui->def_disp_win.bottom_offset = 0; |
597 | | } |
598 | | } |
599 | | |
600 | | vui->vui_timing_info_present_flag = get_bits1(gb); |
601 | | |
602 | | if (vui->vui_timing_info_present_flag) { |
603 | | if( get_bits_left(gb) < 66) { |
604 | | // The alternate syntax seem to have timing info located |
605 | | // at where def_disp_win is normally located |
606 | | av_log(s->avctx, AV_LOG_WARNING, |
607 | | "Strange VUI timing information, retrying...\n"); |
608 | | vui->default_display_window_flag = 0; |
609 | | memset(&vui->def_disp_win, 0, sizeof(vui->def_disp_win)); |
610 | | memcpy(gb, &backup, sizeof(backup)); |
611 | | alt = 1; |
612 | | } |
613 | | vui->vui_num_units_in_tick = get_bits_long(gb, 32); |
614 | | vui->vui_time_scale = get_bits_long(gb, 32); |
615 | | if (alt) { |
616 | | av_log(s->avctx, AV_LOG_INFO, "Retry got %i/%i fps\n", |
617 | | vui->vui_time_scale, vui->vui_num_units_in_tick); |
618 | | } |
619 | | vui->vui_poc_proportional_to_timing_flag = get_bits1(gb); |
620 | | if (vui->vui_poc_proportional_to_timing_flag) |
621 | | vui->vui_num_ticks_poc_diff_one_minus1 = get_ue_golomb_long(gb); |
622 | | vui->vui_hrd_parameters_present_flag = get_bits1(gb); |
623 | | if (vui->vui_hrd_parameters_present_flag) |
624 | | decode_hrd(s, 1, sps->max_sub_layers); |
625 | | } |
626 | | |
627 | | vui->bitstream_restriction_flag = get_bits1(gb); |
628 | | if (vui->bitstream_restriction_flag) { |
629 | | vui->tiles_fixed_structure_flag = get_bits1(gb); |
630 | | vui->motion_vectors_over_pic_boundaries_flag = get_bits1(gb); |
631 | | vui->restricted_ref_pic_lists_flag = get_bits1(gb); |
632 | | vui->min_spatial_segmentation_idc = get_ue_golomb_long(gb); |
633 | | vui->max_bytes_per_pic_denom = get_ue_golomb_long(gb); |
634 | | vui->max_bits_per_min_cu_denom = get_ue_golomb_long(gb); |
635 | | vui->log2_max_mv_length_horizontal = get_ue_golomb_long(gb); |
636 | | vui->log2_max_mv_length_vertical = get_ue_golomb_long(gb); |
637 | | } |
638 | | } |
639 | | #endif /* !USE_MSPS */ |
640 | | |
641 | | static void set_default_scaling_list_data(ScalingList *sl) |
642 | 0 | { |
643 | 0 | int matrixId; |
644 | |
|
645 | 0 | for (matrixId = 0; matrixId < 6; matrixId++) { |
646 | | // 4x4 default is 16 |
647 | 0 | memset(sl->sl[0][matrixId], 16, 16); |
648 | 0 | sl->sl_dc[0][matrixId] = 16; // default for 16x16 |
649 | 0 | sl->sl_dc[1][matrixId] = 16; // default for 32x32 |
650 | 0 | } |
651 | 0 | memcpy(sl->sl[1][0], default_scaling_list_intra, 64); |
652 | 0 | memcpy(sl->sl[1][1], default_scaling_list_intra, 64); |
653 | 0 | memcpy(sl->sl[1][2], default_scaling_list_intra, 64); |
654 | 0 | memcpy(sl->sl[1][3], default_scaling_list_inter, 64); |
655 | 0 | memcpy(sl->sl[1][4], default_scaling_list_inter, 64); |
656 | 0 | memcpy(sl->sl[1][5], default_scaling_list_inter, 64); |
657 | 0 | memcpy(sl->sl[2][0], default_scaling_list_intra, 64); |
658 | 0 | memcpy(sl->sl[2][1], default_scaling_list_intra, 64); |
659 | 0 | memcpy(sl->sl[2][2], default_scaling_list_intra, 64); |
660 | 0 | memcpy(sl->sl[2][3], default_scaling_list_inter, 64); |
661 | 0 | memcpy(sl->sl[2][4], default_scaling_list_inter, 64); |
662 | 0 | memcpy(sl->sl[2][5], default_scaling_list_inter, 64); |
663 | 0 | memcpy(sl->sl[3][0], default_scaling_list_intra, 64); |
664 | 0 | memcpy(sl->sl[3][1], default_scaling_list_intra, 64); |
665 | 0 | memcpy(sl->sl[3][2], default_scaling_list_intra, 64); |
666 | 0 | memcpy(sl->sl[3][3], default_scaling_list_inter, 64); |
667 | 0 | memcpy(sl->sl[3][4], default_scaling_list_inter, 64); |
668 | 0 | memcpy(sl->sl[3][5], default_scaling_list_inter, 64); |
669 | 0 | } |
670 | | |
671 | | static int scaling_list_data(HEVCContext *s, ScalingList *sl, HEVCSPS *sps) |
672 | 0 | { |
673 | 0 | GetBitContext *gb = &s->HEVClc->gb; |
674 | 0 | uint8_t scaling_list_pred_mode_flag; |
675 | 0 | int32_t scaling_list_dc_coef[2][6]; |
676 | 0 | int size_id, matrix_id, pos; |
677 | 0 | int i; |
678 | |
|
679 | 0 | for (size_id = 0; size_id < 4; size_id++) |
680 | 0 | for (matrix_id = 0; matrix_id < 6; matrix_id += ((size_id == 3) ? 3 : 1)) { |
681 | 0 | scaling_list_pred_mode_flag = get_bits1(gb); |
682 | 0 | if (!scaling_list_pred_mode_flag) { |
683 | 0 | unsigned int delta = get_ue_golomb_long(gb); |
684 | | /* Only need to handle non-zero delta. Zero means default, |
685 | | * which should already be in the arrays. */ |
686 | 0 | if (delta) { |
687 | | // Copy from previous array. |
688 | 0 | if (matrix_id < delta) { |
689 | 0 | av_log(s->avctx, AV_LOG_ERROR, |
690 | 0 | "Invalid delta in scaling list data: %d.\n", delta); |
691 | 0 | return AVERROR_INVALIDDATA; |
692 | 0 | } |
693 | | |
694 | 0 | memcpy(sl->sl[size_id][matrix_id], |
695 | 0 | sl->sl[size_id][matrix_id - delta], |
696 | 0 | size_id > 0 ? 64 : 16); |
697 | 0 | if (size_id > 1) |
698 | 0 | sl->sl_dc[size_id - 2][matrix_id] = sl->sl_dc[size_id - 2][matrix_id - delta]; |
699 | 0 | } |
700 | 0 | } else { |
701 | 0 | int next_coef, coef_num; |
702 | 0 | int32_t scaling_list_delta_coef; |
703 | |
|
704 | 0 | next_coef = 8; |
705 | 0 | coef_num = FFMIN(64, 1 << (4 + (size_id << 1))); |
706 | 0 | if (size_id > 1) { |
707 | 0 | scaling_list_dc_coef[size_id - 2][matrix_id] = get_se_golomb(gb) + 8; |
708 | 0 | next_coef = scaling_list_dc_coef[size_id - 2][matrix_id]; |
709 | 0 | sl->sl_dc[size_id - 2][matrix_id] = next_coef; |
710 | 0 | } |
711 | 0 | for (i = 0; i < coef_num; i++) { |
712 | 0 | if (size_id == 0) |
713 | 0 | pos = 4 * ff_hevc_diag_scan4x4_y[i] + |
714 | 0 | ff_hevc_diag_scan4x4_x[i]; |
715 | 0 | else |
716 | 0 | pos = 8 * ff_hevc_diag_scan8x8_y[i] + |
717 | 0 | ff_hevc_diag_scan8x8_x[i]; |
718 | |
|
719 | 0 | scaling_list_delta_coef = get_se_golomb(gb); |
720 | 0 | next_coef = (next_coef + scaling_list_delta_coef + 256) % 256; |
721 | 0 | sl->sl[size_id][matrix_id][pos] = next_coef; |
722 | 0 | } |
723 | 0 | } |
724 | 0 | } |
725 | | |
726 | 0 | if (sps->chroma_format_idc == 3) { |
727 | 0 | for (i = 0; i < 64; i++) { |
728 | 0 | sl->sl[3][1][i] = sl->sl[2][1][i]; |
729 | 0 | sl->sl[3][2][i] = sl->sl[2][2][i]; |
730 | 0 | sl->sl[3][4][i] = sl->sl[2][4][i]; |
731 | 0 | sl->sl[3][5][i] = sl->sl[2][5][i]; |
732 | 0 | } |
733 | 0 | sl->sl_dc[1][1] = sl->sl_dc[0][1]; |
734 | 0 | sl->sl_dc[1][2] = sl->sl_dc[0][2]; |
735 | 0 | sl->sl_dc[1][4] = sl->sl_dc[0][4]; |
736 | 0 | sl->sl_dc[1][5] = sl->sl_dc[0][5]; |
737 | 0 | } |
738 | | |
739 | |
|
740 | 0 | return 0; |
741 | 0 | } |
742 | | |
743 | | int ff_hevc_decode_nal_sps(HEVCContext *s) |
744 | 0 | { |
745 | 0 | const AVPixFmtDescriptor *desc; |
746 | 0 | GetBitContext *gb = &s->HEVClc->gb; |
747 | 0 | int ret = 0; |
748 | 0 | unsigned int sps_id = 0; |
749 | 0 | int log2_diff_max_min_transform_block_size; |
750 | | #ifndef USE_MSPS |
751 | | int bit_depth_chroma, start, vui_present, sublayer_ordering_info; |
752 | | #endif |
753 | 0 | int i; |
754 | |
|
755 | 0 | HEVCSPS *sps; |
756 | 0 | AVBufferRef *sps_buf = av_buffer_allocz(sizeof(*sps)); |
757 | |
|
758 | 0 | if (!sps_buf) |
759 | 0 | return AVERROR(ENOMEM); |
760 | 0 | sps = (HEVCSPS*)sps_buf->data; |
761 | |
|
762 | 0 | av_log(s->avctx, AV_LOG_DEBUG, "Decoding SPS\n"); |
763 | | |
764 | | // Coded parameters |
765 | 0 | #ifdef USE_MSPS |
766 | 0 | ret = create_dummy_vps(s); |
767 | 0 | if (ret < 0) |
768 | 0 | return ret; |
769 | 0 | sps->vps_id = 0; |
770 | 0 | sps->max_sub_layers = 1; |
771 | |
|
772 | 0 | sps_id = 0; |
773 | |
|
774 | 0 | sps->chroma_format_idc = get_bits(gb, 8); |
775 | 0 | if (sps->chroma_format_idc > 3) { |
776 | 0 | ret = AVERROR_INVALIDDATA; |
777 | 0 | goto err; |
778 | 0 | } |
779 | 0 | sps->separate_colour_plane_flag = 0; |
780 | | |
781 | 0 | sps->width = get_bits_long(gb, 32); |
782 | 0 | sps->height = get_bits_long(gb, 32); |
783 | 0 | if ((ret = av_image_check_size(sps->width, |
784 | 0 | sps->height, 0, s->avctx)) < 0) |
785 | 0 | goto err; |
786 | 0 | sps->bit_depth = get_bits(gb, 8) + 8; |
787 | |
|
788 | 0 | #ifdef USE_VAR_BIT_DEPTH |
789 | | /* Note: in order to simplify the code we always use 16 bit pixfmt */ |
790 | 0 | switch(sps->chroma_format_idc) { |
791 | 0 | case 0: |
792 | 0 | sps->pix_fmt = AV_PIX_FMT_GRAY16; |
793 | 0 | break; |
794 | 0 | case 1: |
795 | 0 | sps->pix_fmt = AV_PIX_FMT_YUV420P16; |
796 | 0 | break; |
797 | 0 | case 2: |
798 | 0 | sps->pix_fmt = AV_PIX_FMT_YUV422P16; |
799 | 0 | break; |
800 | 0 | default: |
801 | 0 | case 3: |
802 | 0 | sps->pix_fmt = AV_PIX_FMT_YUV444P16; |
803 | 0 | break; |
804 | 0 | } |
805 | 0 | sps->pixel_shift = 1; |
806 | | #else |
807 | | if (sps->bit_depth != 8) { |
808 | | ret = AVERROR_INVALIDDATA; |
809 | | goto err; |
810 | | } |
811 | | |
812 | | switch(sps->chroma_format_idc) { |
813 | | case 0: |
814 | | sps->pix_fmt = AV_PIX_FMT_GRAY8; |
815 | | break; |
816 | | case 1: |
817 | | sps->pix_fmt = AV_PIX_FMT_YUV420P; |
818 | | break; |
819 | | case 2: |
820 | | sps->pix_fmt = AV_PIX_FMT_YUV422P; |
821 | | break; |
822 | | default: |
823 | | case 3: |
824 | | sps->pix_fmt = AV_PIX_FMT_YUV444P; |
825 | | break; |
826 | | } |
827 | | sps->pixel_shift = 0; |
828 | | #endif /* !USE_VAR_BIT_DEPTH */ |
829 | |
|
830 | | #else |
831 | | sps->vps_id = get_bits(gb, 4); |
832 | | if (sps->vps_id >= MAX_VPS_COUNT) { |
833 | | av_log(s->avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", sps->vps_id); |
834 | | ret = AVERROR_INVALIDDATA; |
835 | | goto err; |
836 | | } |
837 | | if (!s->vps_list[sps->vps_id]) { |
838 | | av_log(s->avctx, AV_LOG_ERROR, "VPS %d does not exist\n", |
839 | | sps->vps_id); |
840 | | ret = AVERROR_INVALIDDATA; |
841 | | goto err; |
842 | | } |
843 | | |
844 | | sps->max_sub_layers = get_bits(gb, 3) + 1; |
845 | | if (sps->max_sub_layers > MAX_SUB_LAYERS) { |
846 | | av_log(s->avctx, AV_LOG_ERROR, "sps_max_sub_layers out of range: %d\n", |
847 | | sps->max_sub_layers); |
848 | | ret = AVERROR_INVALIDDATA; |
849 | | goto err; |
850 | | } |
851 | | |
852 | | skip_bits1(gb); // temporal_id_nesting_flag |
853 | | |
854 | | if (parse_ptl(s, &sps->ptl, sps->max_sub_layers) < 0) |
855 | | goto err; |
856 | | |
857 | | sps_id = get_ue_golomb_long(gb); |
858 | | if (sps_id >= MAX_SPS_COUNT) { |
859 | | av_log(s->avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", sps_id); |
860 | | ret = AVERROR_INVALIDDATA; |
861 | | goto err; |
862 | | } |
863 | | |
864 | | sps->chroma_format_idc = get_ue_golomb_long(gb); |
865 | | if (!(sps->chroma_format_idc == 1 || sps->chroma_format_idc == 2 || sps->chroma_format_idc == 3 || sps->chroma_format_idc == 0)) { |
866 | | avpriv_report_missing_feature(s->avctx, "chroma_format_idc != {0, 1, 2, 3}\n"); |
867 | | ret = AVERROR_PATCHWELCOME; |
868 | | goto err; |
869 | | } |
870 | | |
871 | | if (sps->chroma_format_idc == 3) |
872 | | sps->separate_colour_plane_flag = get_bits1(gb); |
873 | | |
874 | | if (sps->separate_colour_plane_flag) { |
875 | | sps->chroma_format_idc = 0; |
876 | | avpriv_report_missing_feature(s->avctx, "separate_colour_plane_flag = 1\n"); |
877 | | ret = AVERROR_PATCHWELCOME; |
878 | | goto err; |
879 | | } |
880 | | |
881 | | sps->width = get_ue_golomb_long(gb); |
882 | | sps->height = get_ue_golomb_long(gb); |
883 | | if ((ret = av_image_check_size(sps->width, |
884 | | sps->height, 0, s->avctx)) < 0) |
885 | | goto err; |
886 | | |
887 | | if (get_bits1(gb)) { // pic_conformance_flag |
888 | | int hshift, vshift; |
889 | | switch(sps->chroma_format_idc) { |
890 | | default: |
891 | | case 0: |
892 | | case 3: |
893 | | hshift = vshift = 0; |
894 | | break; |
895 | | case 1: |
896 | | hshift = vshift = 1; |
897 | | break; |
898 | | case 2: |
899 | | hshift = 1; |
900 | | vshift = 0; |
901 | | break; |
902 | | } |
903 | | sps->pic_conf_win.left_offset = get_ue_golomb_long(gb) << hshift; |
904 | | sps->pic_conf_win.right_offset = get_ue_golomb_long(gb) << hshift; |
905 | | sps->pic_conf_win.top_offset = get_ue_golomb_long(gb) << vshift; |
906 | | sps->pic_conf_win.bottom_offset = get_ue_golomb_long(gb) << vshift; |
907 | | |
908 | | if (s->avctx->flags2 & CODEC_FLAG2_IGNORE_CROP) { |
909 | | av_log(s->avctx, AV_LOG_DEBUG, |
910 | | "discarding sps conformance window, " |
911 | | "original values are l:%u r:%u t:%u b:%u\n", |
912 | | sps->pic_conf_win.left_offset, |
913 | | sps->pic_conf_win.right_offset, |
914 | | sps->pic_conf_win.top_offset, |
915 | | sps->pic_conf_win.bottom_offset); |
916 | | |
917 | | sps->pic_conf_win.left_offset = |
918 | | sps->pic_conf_win.right_offset = |
919 | | sps->pic_conf_win.top_offset = |
920 | | sps->pic_conf_win.bottom_offset = 0; |
921 | | } |
922 | | sps->output_window = sps->pic_conf_win; |
923 | | } |
924 | | |
925 | | sps->bit_depth = get_ue_golomb_long(gb) + 8; |
926 | | bit_depth_chroma = get_ue_golomb_long(gb) + 8; |
927 | | if (bit_depth_chroma != sps->bit_depth && sps->chroma_format_idc != 0) { |
928 | | av_log(s->avctx, AV_LOG_ERROR, |
929 | | "Luma bit depth (%d) is different from chroma bit depth (%d), " |
930 | | "this is unsupported.\n", |
931 | | sps->bit_depth, bit_depth_chroma); |
932 | | ret = AVERROR_INVALIDDATA; |
933 | | goto err; |
934 | | } |
935 | | switch (sps->bit_depth) { |
936 | | case 8: |
937 | | if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P; |
938 | | if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P; |
939 | | if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P; |
940 | | break; |
941 | | case 9: |
942 | | if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P9; |
943 | | if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P9; |
944 | | if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P9; |
945 | | break; |
946 | | case 10: |
947 | | if (sps->chroma_format_idc == 0) { |
948 | | if (sps->separate_colour_plane_flag) |
949 | | goto format_not_supported; |
950 | | sps->pix_fmt = AV_PIX_FMT_GRAY16; /* XXX: should have gray10 */ |
951 | | } |
952 | | if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P10; |
953 | | if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P10; |
954 | | if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P10; |
955 | | break; |
956 | | case 12: |
957 | | if (sps->chroma_format_idc == 1) sps->pix_fmt = AV_PIX_FMT_YUV420P12; |
958 | | if (sps->chroma_format_idc == 2) sps->pix_fmt = AV_PIX_FMT_YUV422P12; |
959 | | if (sps->chroma_format_idc == 3) sps->pix_fmt = AV_PIX_FMT_YUV444P12; |
960 | | break; |
961 | | default: |
962 | | format_not_supported: |
963 | | av_log(s->avctx, AV_LOG_ERROR, |
964 | | "4:2:0, 4:2:2, 4:4:4 supports are currently specified for 8, 10 and 12 bits.\n"); |
965 | | ret = AVERROR_PATCHWELCOME; |
966 | | goto err; |
967 | | } |
968 | | sps->pixel_shift = sps->bit_depth > 8; |
969 | | #endif /* USE_MSPS */ |
970 | |
|
971 | 0 | desc = av_pix_fmt_desc_get(sps->pix_fmt); |
972 | 0 | if (!desc) { |
973 | 0 | ret = AVERROR(EINVAL); |
974 | 0 | goto err; |
975 | 0 | } |
976 | | |
977 | 0 | sps->hshift[0] = sps->vshift[0] = 0; |
978 | 0 | sps->hshift[2] = sps->hshift[1] = desc->log2_chroma_w; |
979 | 0 | sps->vshift[2] = sps->vshift[1] = desc->log2_chroma_h; |
980 | | |
981 | |
|
982 | 0 | #ifdef USE_MSPS |
983 | 0 | sps->log2_max_poc_lsb = 8; /* not used for intra */ |
984 | 0 | for (i = 0; i < sps->max_sub_layers; i++) { |
985 | 0 | sps->temporal_layer[i].max_dec_pic_buffering = 1; |
986 | 0 | sps->temporal_layer[i].num_reorder_pics = 0; |
987 | 0 | sps->temporal_layer[i].max_latency_increase = -1; |
988 | 0 | } |
989 | 0 | sps->log2_min_cb_size = get_ue_golomb_long(gb) + 3; |
990 | | /* update the width & heigth to be a multiple of min_cb_size */ |
991 | 0 | { |
992 | 0 | int m; |
993 | 0 | m = (1 << sps->log2_min_cb_size) - 1; |
994 | 0 | sps->width = (sps->width + m) & ~m; |
995 | 0 | sps->height = (sps->height + m) & ~m; |
996 | 0 | } |
997 | | #else |
998 | | sps->log2_max_poc_lsb = get_ue_golomb_long(gb) + 4; |
999 | | if (sps->log2_max_poc_lsb > 16) { |
1000 | | av_log(s->avctx, AV_LOG_ERROR, "log2_max_pic_order_cnt_lsb_minus4 out range: %d\n", |
1001 | | sps->log2_max_poc_lsb - 4); |
1002 | | ret = AVERROR_INVALIDDATA; |
1003 | | goto err; |
1004 | | } |
1005 | | |
1006 | | sublayer_ordering_info = get_bits1(gb); |
1007 | | start = sublayer_ordering_info ? 0 : sps->max_sub_layers - 1; |
1008 | | for (i = start; i < sps->max_sub_layers; i++) { |
1009 | | sps->temporal_layer[i].max_dec_pic_buffering = get_ue_golomb_long(gb) + 1; |
1010 | | sps->temporal_layer[i].num_reorder_pics = get_ue_golomb_long(gb); |
1011 | | sps->temporal_layer[i].max_latency_increase = get_ue_golomb_long(gb) - 1; |
1012 | | if (sps->temporal_layer[i].max_dec_pic_buffering > MAX_DPB_SIZE) { |
1013 | | av_log(s->avctx, AV_LOG_ERROR, "sps_max_dec_pic_buffering_minus1 out of range: %d\n", |
1014 | | sps->temporal_layer[i].max_dec_pic_buffering - 1); |
1015 | | ret = AVERROR_INVALIDDATA; |
1016 | | goto err; |
1017 | | } |
1018 | | if (sps->temporal_layer[i].num_reorder_pics > sps->temporal_layer[i].max_dec_pic_buffering - 1) { |
1019 | | av_log(s->avctx, AV_LOG_WARNING, "sps_max_num_reorder_pics out of range: %d\n", |
1020 | | sps->temporal_layer[i].num_reorder_pics); |
1021 | | if (s->avctx->err_recognition & AV_EF_EXPLODE || |
1022 | | sps->temporal_layer[i].num_reorder_pics > MAX_DPB_SIZE - 1) { |
1023 | | ret = AVERROR_INVALIDDATA; |
1024 | | goto err; |
1025 | | } |
1026 | | sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[i].num_reorder_pics + 1; |
1027 | | } |
1028 | | } |
1029 | | |
1030 | | if (!sublayer_ordering_info) { |
1031 | | for (i = 0; i < start; i++) { |
1032 | | sps->temporal_layer[i].max_dec_pic_buffering = sps->temporal_layer[start].max_dec_pic_buffering; |
1033 | | sps->temporal_layer[i].num_reorder_pics = sps->temporal_layer[start].num_reorder_pics; |
1034 | | sps->temporal_layer[i].max_latency_increase = sps->temporal_layer[start].max_latency_increase; |
1035 | | } |
1036 | | } |
1037 | | sps->log2_min_cb_size = get_ue_golomb_long(gb) + 3; |
1038 | | #endif |
1039 | 0 | sps->log2_diff_max_min_coding_block_size = get_ue_golomb_long(gb); |
1040 | 0 | sps->log2_min_tb_size = get_ue_golomb_long(gb) + 2; |
1041 | 0 | log2_diff_max_min_transform_block_size = get_ue_golomb_long(gb); |
1042 | 0 | sps->log2_max_trafo_size = log2_diff_max_min_transform_block_size + |
1043 | 0 | sps->log2_min_tb_size; |
1044 | 0 | if (sps->log2_min_tb_size >= sps->log2_min_cb_size) { |
1045 | 0 | av_log(s->avctx, AV_LOG_ERROR, "Invalid value for log2_min_tb_size"); |
1046 | 0 | ret = AVERROR_INVALIDDATA; |
1047 | 0 | goto err; |
1048 | 0 | } |
1049 | 0 | #ifdef USE_MSPS |
1050 | 0 | sps->max_transform_hierarchy_depth_intra = get_ue_golomb_long(gb); |
1051 | 0 | sps->max_transform_hierarchy_depth_inter = |
1052 | 0 | sps->max_transform_hierarchy_depth_intra; /* not used for intra */ |
1053 | 0 | sps->amp_enabled_flag = 1; /* not used for intra */ |
1054 | | #else |
1055 | | sps->max_transform_hierarchy_depth_inter = get_ue_golomb_long(gb); |
1056 | | sps->max_transform_hierarchy_depth_intra = get_ue_golomb_long(gb); |
1057 | | |
1058 | | sps->scaling_list_enable_flag = get_bits1(gb); |
1059 | | if (sps->scaling_list_enable_flag) { |
1060 | | #ifdef USE_FULL |
1061 | | set_default_scaling_list_data(&sps->scaling_list); |
1062 | | |
1063 | | if (get_bits1(gb)) { |
1064 | | ret = scaling_list_data(s, &sps->scaling_list, sps); |
1065 | | if (ret < 0) |
1066 | | goto err; |
1067 | | } |
1068 | | #else |
1069 | | abort(); |
1070 | | #endif |
1071 | | } |
1072 | | sps->amp_enabled_flag = get_bits1(gb); |
1073 | | #endif |
1074 | |
|
1075 | 0 | sps->sao_enabled = get_bits1(gb); |
1076 | |
|
1077 | 0 | sps->pcm_enabled_flag = get_bits1(gb); |
1078 | 0 | if (sps->pcm_enabled_flag) { |
1079 | 0 | sps->pcm.bit_depth = get_bits(gb, 4) + 1; |
1080 | 0 | sps->pcm.bit_depth_chroma = get_bits(gb, 4) + 1; |
1081 | 0 | sps->pcm.log2_min_pcm_cb_size = get_ue_golomb_long(gb) + 3; |
1082 | 0 | sps->pcm.log2_max_pcm_cb_size = sps->pcm.log2_min_pcm_cb_size + |
1083 | 0 | get_ue_golomb_long(gb); |
1084 | 0 | if (sps->pcm.bit_depth > sps->bit_depth) { |
1085 | 0 | av_log(s->avctx, AV_LOG_ERROR, |
1086 | 0 | "PCM bit depth (%d) is greater than normal bit depth (%d)\n", |
1087 | 0 | sps->pcm.bit_depth, sps->bit_depth); |
1088 | 0 | ret = AVERROR_INVALIDDATA; |
1089 | 0 | goto err; |
1090 | 0 | } |
1091 | | |
1092 | 0 | sps->pcm.loop_filter_disable_flag = get_bits1(gb); |
1093 | 0 | } |
1094 | | |
1095 | 0 | #ifdef USE_MSPS |
1096 | 0 | sps->nb_st_rps = 0; /* not used for intra */ |
1097 | 0 | sps->long_term_ref_pics_present_flag = 0; /* not used for intra */ |
1098 | 0 | sps->sps_temporal_mvp_enabled_flag = 1; /* not used for intra */ |
1099 | 0 | sps->sps_strong_intra_smoothing_enable_flag = get_bits1(gb); |
1100 | 0 | sps->vui.sar = (AVRational){0, 1}; |
1101 | | #else |
1102 | | sps->nb_st_rps = get_ue_golomb_long(gb); |
1103 | | if (sps->nb_st_rps > MAX_SHORT_TERM_RPS_COUNT) { |
1104 | | av_log(s->avctx, AV_LOG_ERROR, "Too many short term RPS: %d.\n", |
1105 | | sps->nb_st_rps); |
1106 | | ret = AVERROR_INVALIDDATA; |
1107 | | goto err; |
1108 | | } |
1109 | | for (i = 0; i < sps->nb_st_rps; i++) { |
1110 | | if ((ret = ff_hevc_decode_short_term_rps(s, &sps->st_rps[i], |
1111 | | sps, 0)) < 0) |
1112 | | goto err; |
1113 | | } |
1114 | | |
1115 | | sps->long_term_ref_pics_present_flag = get_bits1(gb); |
1116 | | if (sps->long_term_ref_pics_present_flag) { |
1117 | | sps->num_long_term_ref_pics_sps = get_ue_golomb_long(gb); |
1118 | | for (i = 0; i < sps->num_long_term_ref_pics_sps; i++) { |
1119 | | sps->lt_ref_pic_poc_lsb_sps[i] = get_bits(gb, sps->log2_max_poc_lsb); |
1120 | | sps->used_by_curr_pic_lt_sps_flag[i] = get_bits1(gb); |
1121 | | } |
1122 | | } |
1123 | | |
1124 | | sps->sps_temporal_mvp_enabled_flag = get_bits1(gb); |
1125 | | sps->sps_strong_intra_smoothing_enable_flag = get_bits1(gb); |
1126 | | sps->vui.sar = (AVRational){0, 1}; |
1127 | | vui_present = get_bits1(gb); |
1128 | | if (vui_present) |
1129 | | decode_vui(s, sps); |
1130 | | #endif |
1131 | |
|
1132 | 0 | if (get_bits1(gb)) { // sps_extension_flag |
1133 | 0 | int sps_extension_flag[1]; |
1134 | 0 | for (i = 0; i < 1; i++) |
1135 | 0 | sps_extension_flag[i] = get_bits1(gb); |
1136 | 0 | skip_bits(gb, 7); //sps_extension_7bits = get_bits(gb, 7); |
1137 | 0 | if (sps_extension_flag[0]) { |
1138 | 0 | int extended_precision_processing_flag; |
1139 | 0 | int high_precision_offsets_enabled_flag; |
1140 | 0 | int cabac_bypass_alignment_enabled_flag; |
1141 | |
|
1142 | 0 | sps->transform_skip_rotation_enabled_flag = get_bits1(gb); |
1143 | 0 | sps->transform_skip_context_enabled_flag = get_bits1(gb); |
1144 | 0 | sps->implicit_rdpcm_enabled_flag = get_bits1(gb); |
1145 | 0 | sps->explicit_rdpcm_enabled_flag = get_bits1(gb); |
1146 | |
|
1147 | 0 | extended_precision_processing_flag = get_bits1(gb); |
1148 | 0 | if (extended_precision_processing_flag) |
1149 | 0 | av_log(s->avctx, AV_LOG_WARNING, |
1150 | 0 | "extended_precision_processing_flag not yet implemented\n"); |
1151 | |
|
1152 | 0 | sps->intra_smoothing_disabled_flag = get_bits1(gb); |
1153 | 0 | high_precision_offsets_enabled_flag = get_bits1(gb); |
1154 | 0 | if (high_precision_offsets_enabled_flag) |
1155 | 0 | av_log(s->avctx, AV_LOG_WARNING, |
1156 | 0 | "high_precision_offsets_enabled_flag not yet implemented\n"); |
1157 | |
|
1158 | 0 | sps->persistent_rice_adaptation_enabled_flag = get_bits1(gb); |
1159 | |
|
1160 | 0 | cabac_bypass_alignment_enabled_flag = get_bits1(gb); |
1161 | 0 | if (cabac_bypass_alignment_enabled_flag) |
1162 | 0 | av_log(s->avctx, AV_LOG_WARNING, |
1163 | 0 | "cabac_bypass_alignment_enabled_flag not yet implemented\n"); |
1164 | 0 | } |
1165 | 0 | } |
1166 | 0 | #ifdef USE_MSPS |
1167 | 0 | sps->output_width = sps->width; |
1168 | 0 | sps->output_height = sps->height; |
1169 | | #else |
1170 | | if (s->apply_defdispwin) { |
1171 | | sps->output_window.left_offset += sps->vui.def_disp_win.left_offset; |
1172 | | sps->output_window.right_offset += sps->vui.def_disp_win.right_offset; |
1173 | | sps->output_window.top_offset += sps->vui.def_disp_win.top_offset; |
1174 | | sps->output_window.bottom_offset += sps->vui.def_disp_win.bottom_offset; |
1175 | | } |
1176 | | if (sps->output_window.left_offset & (0x1F >> (sps->pixel_shift)) && |
1177 | | !(s->avctx->flags & CODEC_FLAG_UNALIGNED)) { |
1178 | | sps->output_window.left_offset &= ~(0x1F >> (sps->pixel_shift)); |
1179 | | av_log(s->avctx, AV_LOG_WARNING, "Reducing left output window to %d " |
1180 | | "chroma samples to preserve alignment.\n", |
1181 | | sps->output_window.left_offset); |
1182 | | } |
1183 | | sps->output_width = sps->width - |
1184 | | (sps->output_window.left_offset + sps->output_window.right_offset); |
1185 | | sps->output_height = sps->height - |
1186 | | (sps->output_window.top_offset + sps->output_window.bottom_offset); |
1187 | | if (sps->output_width <= 0 || sps->output_height <= 0) { |
1188 | | av_log(s->avctx, AV_LOG_WARNING, "Invalid visible frame dimensions: %dx%d.\n", |
1189 | | sps->output_width, sps->output_height); |
1190 | | if (s->avctx->err_recognition & AV_EF_EXPLODE) { |
1191 | | ret = AVERROR_INVALIDDATA; |
1192 | | goto err; |
1193 | | } |
1194 | | av_log(s->avctx, AV_LOG_WARNING, |
1195 | | "Displaying the whole video surface.\n"); |
1196 | | sps->pic_conf_win.left_offset = |
1197 | | sps->pic_conf_win.right_offset = |
1198 | | sps->pic_conf_win.top_offset = |
1199 | | sps->pic_conf_win.bottom_offset = 0; |
1200 | | sps->output_width = sps->width; |
1201 | | sps->output_height = sps->height; |
1202 | | } |
1203 | | #endif |
1204 | | |
1205 | | // Inferred parameters |
1206 | 0 | sps->log2_ctb_size = sps->log2_min_cb_size + |
1207 | 0 | sps->log2_diff_max_min_coding_block_size; |
1208 | 0 | sps->log2_min_pu_size = sps->log2_min_cb_size - 1; |
1209 | |
|
1210 | 0 | sps->ctb_width = (sps->width + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size; |
1211 | 0 | sps->ctb_height = (sps->height + (1 << sps->log2_ctb_size) - 1) >> sps->log2_ctb_size; |
1212 | 0 | sps->ctb_size = sps->ctb_width * sps->ctb_height; |
1213 | |
|
1214 | 0 | sps->min_cb_width = sps->width >> sps->log2_min_cb_size; |
1215 | 0 | sps->min_cb_height = sps->height >> sps->log2_min_cb_size; |
1216 | 0 | sps->min_tb_width = sps->width >> sps->log2_min_tb_size; |
1217 | 0 | sps->min_tb_height = sps->height >> sps->log2_min_tb_size; |
1218 | 0 | sps->min_pu_width = sps->width >> sps->log2_min_pu_size; |
1219 | 0 | sps->min_pu_height = sps->height >> sps->log2_min_pu_size; |
1220 | 0 | sps->tb_mask = (1 << (sps->log2_ctb_size - sps->log2_min_tb_size)) - 1; |
1221 | |
|
1222 | 0 | sps->qp_bd_offset = 6 * (sps->bit_depth - 8); |
1223 | |
|
1224 | 0 | if (sps->width & ((1 << sps->log2_min_cb_size) - 1) || |
1225 | 0 | sps->height & ((1 << sps->log2_min_cb_size) - 1)) { |
1226 | 0 | av_log(s->avctx, AV_LOG_ERROR, "Invalid coded frame dimensions.\n"); |
1227 | 0 | goto err; |
1228 | 0 | } |
1229 | | |
1230 | 0 | if (sps->log2_ctb_size > MAX_LOG2_CTB_SIZE) { |
1231 | 0 | av_log(s->avctx, AV_LOG_ERROR, "CTB size out of range: 2^%d\n", sps->log2_ctb_size); |
1232 | 0 | goto err; |
1233 | 0 | } |
1234 | 0 | if (sps->max_transform_hierarchy_depth_inter > sps->log2_ctb_size - sps->log2_min_tb_size) { |
1235 | 0 | av_log(s->avctx, AV_LOG_ERROR, "max_transform_hierarchy_depth_inter out of range: %d\n", |
1236 | 0 | sps->max_transform_hierarchy_depth_inter); |
1237 | 0 | goto err; |
1238 | 0 | } |
1239 | 0 | if (sps->max_transform_hierarchy_depth_intra > sps->log2_ctb_size - sps->log2_min_tb_size) { |
1240 | 0 | av_log(s->avctx, AV_LOG_ERROR, "max_transform_hierarchy_depth_intra out of range: %d\n", |
1241 | 0 | sps->max_transform_hierarchy_depth_intra); |
1242 | 0 | goto err; |
1243 | 0 | } |
1244 | 0 | if (sps->log2_max_trafo_size > FFMIN(sps->log2_ctb_size, 5)) { |
1245 | 0 | av_log(s->avctx, AV_LOG_ERROR, |
1246 | 0 | "max transform block size out of range: %d\n", |
1247 | 0 | sps->log2_max_trafo_size); |
1248 | 0 | goto err; |
1249 | 0 | } |
1250 | | |
1251 | 0 | if (get_bits_left(gb) < 0) { |
1252 | 0 | av_log(s->avctx, AV_LOG_ERROR, |
1253 | 0 | "Overread SPS by %d bits\n", -get_bits_left(gb)); |
1254 | 0 | goto err; |
1255 | 0 | } |
1256 | | |
1257 | 0 | if (s->avctx->debug & FF_DEBUG_BITSTREAM) { |
1258 | 0 | av_log(s->avctx, AV_LOG_DEBUG, |
1259 | 0 | "Parsed SPS: id %d; coded wxh: %dx%d; " |
1260 | 0 | "cropped wxh: %dx%d; pix_fmt: %s.\n", |
1261 | 0 | sps_id, sps->width, sps->height, |
1262 | 0 | sps->output_width, sps->output_height, |
1263 | | #ifdef USE_FULL |
1264 | | av_get_pix_fmt_name(sps->pix_fmt) |
1265 | | #else |
1266 | 0 | "?" |
1267 | 0 | #endif |
1268 | 0 | ); |
1269 | 0 | } |
1270 | | |
1271 | | /* check if this is a repeat of an already parsed SPS, then keep the |
1272 | | * original one. |
1273 | | * otherwise drop all PPSes that depend on it */ |
1274 | 0 | if (s->sps_list[sps_id] && |
1275 | 0 | !memcmp(s->sps_list[sps_id]->data, sps_buf->data, sps_buf->size)) { |
1276 | 0 | av_buffer_unref(&sps_buf); |
1277 | 0 | } else { |
1278 | 0 | for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) { |
1279 | 0 | if (s->pps_list[i] && ((HEVCPPS*)s->pps_list[i]->data)->sps_id == sps_id) |
1280 | 0 | av_buffer_unref(&s->pps_list[i]); |
1281 | 0 | } |
1282 | 0 | if (s->sps_list[sps_id] && s->sps == (HEVCSPS*)s->sps_list[sps_id]->data) { |
1283 | 0 | av_buffer_unref(&s->current_sps); |
1284 | 0 | s->current_sps = av_buffer_ref(s->sps_list[sps_id]); |
1285 | 0 | if (!s->current_sps) |
1286 | 0 | s->sps = NULL; |
1287 | 0 | } |
1288 | 0 | av_buffer_unref(&s->sps_list[sps_id]); |
1289 | 0 | s->sps_list[sps_id] = sps_buf; |
1290 | 0 | } |
1291 | |
|
1292 | 0 | return 0; |
1293 | | |
1294 | 0 | err: |
1295 | 0 | av_buffer_unref(&sps_buf); |
1296 | 0 | return ret; |
1297 | 0 | } |
1298 | | |
1299 | | static void hevc_pps_free(void *opaque, uint8_t *data) |
1300 | 0 | { |
1301 | 0 | HEVCPPS *pps = (HEVCPPS*)data; |
1302 | |
|
1303 | 0 | av_freep(&pps->column_width); |
1304 | 0 | av_freep(&pps->row_height); |
1305 | 0 | av_freep(&pps->col_bd); |
1306 | 0 | av_freep(&pps->row_bd); |
1307 | 0 | av_freep(&pps->col_idxX); |
1308 | 0 | av_freep(&pps->ctb_addr_rs_to_ts); |
1309 | 0 | av_freep(&pps->ctb_addr_ts_to_rs); |
1310 | 0 | av_freep(&pps->tile_pos_rs); |
1311 | 0 | av_freep(&pps->tile_id); |
1312 | 0 | av_freep(&pps->min_tb_addr_zs_tab); |
1313 | |
|
1314 | 0 | av_freep(&pps); |
1315 | 0 | } |
1316 | | |
1317 | 0 | static int pps_range_extensions(HEVCContext *s, HEVCPPS *pps, HEVCSPS *sps) { |
1318 | 0 | GetBitContext *gb = &s->HEVClc->gb; |
1319 | 0 | int i; |
1320 | |
|
1321 | 0 | if (pps->transform_skip_enabled_flag) { |
1322 | 0 | pps->log2_max_transform_skip_block_size = get_ue_golomb_long(gb) + 2; |
1323 | 0 | } |
1324 | 0 | pps->cross_component_prediction_enabled_flag = get_bits1(gb); |
1325 | 0 | pps->chroma_qp_offset_list_enabled_flag = get_bits1(gb); |
1326 | 0 | if (pps->chroma_qp_offset_list_enabled_flag) { |
1327 | 0 | pps->diff_cu_chroma_qp_offset_depth = get_ue_golomb_long(gb); |
1328 | 0 | pps->chroma_qp_offset_list_len_minus1 = get_ue_golomb_long(gb); |
1329 | 0 | if (pps->chroma_qp_offset_list_len_minus1 && pps->chroma_qp_offset_list_len_minus1 >= 5) { |
1330 | 0 | av_log(s->avctx, AV_LOG_ERROR, |
1331 | 0 | "chroma_qp_offset_list_len_minus1 shall be in the range [0, 5].\n"); |
1332 | 0 | return AVERROR_INVALIDDATA; |
1333 | 0 | } |
1334 | 0 | for (i = 0; i <= pps->chroma_qp_offset_list_len_minus1; i++) { |
1335 | 0 | pps->cb_qp_offset_list[i] = get_se_golomb_long(gb); |
1336 | 0 | if (pps->cb_qp_offset_list[i]) { |
1337 | 0 | av_log(s->avctx, AV_LOG_WARNING, |
1338 | 0 | "cb_qp_offset_list not tested yet.\n"); |
1339 | 0 | } |
1340 | 0 | pps->cr_qp_offset_list[i] = get_se_golomb_long(gb); |
1341 | 0 | if (pps->cr_qp_offset_list[i]) { |
1342 | 0 | av_log(s->avctx, AV_LOG_WARNING, |
1343 | 0 | "cb_qp_offset_list not tested yet.\n"); |
1344 | 0 | } |
1345 | 0 | } |
1346 | 0 | } |
1347 | 0 | pps->log2_sao_offset_scale_luma = get_ue_golomb_long(gb); |
1348 | 0 | pps->log2_sao_offset_scale_chroma = get_ue_golomb_long(gb); |
1349 | |
|
1350 | 0 | return(0); |
1351 | 0 | } |
1352 | | |
1353 | | int ff_hevc_decode_nal_pps(HEVCContext *s) |
1354 | 0 | { |
1355 | 0 | GetBitContext *gb = &s->HEVClc->gb; |
1356 | 0 | HEVCSPS *sps = NULL; |
1357 | 0 | int pic_area_in_ctbs; |
1358 | 0 | int log2_diff_ctb_min_tb_size; |
1359 | 0 | int i, j, x, y, ctb_addr_rs, tile_id; |
1360 | 0 | int ret = 0; |
1361 | 0 | unsigned int pps_id = 0; |
1362 | |
|
1363 | 0 | AVBufferRef *pps_buf; |
1364 | 0 | HEVCPPS *pps = av_mallocz(sizeof(*pps)); |
1365 | |
|
1366 | 0 | if (!pps) |
1367 | 0 | return AVERROR(ENOMEM); |
1368 | | |
1369 | 0 | pps_buf = av_buffer_create((uint8_t *)pps, sizeof(*pps), |
1370 | 0 | hevc_pps_free, NULL, 0); |
1371 | 0 | if (!pps_buf) { |
1372 | 0 | av_freep(&pps); |
1373 | 0 | return AVERROR(ENOMEM); |
1374 | 0 | } |
1375 | | |
1376 | 0 | av_log(s->avctx, AV_LOG_DEBUG, "Decoding PPS\n"); |
1377 | | |
1378 | | // Default values |
1379 | 0 | pps->loop_filter_across_tiles_enabled_flag = 1; |
1380 | 0 | pps->num_tile_columns = 1; |
1381 | 0 | pps->num_tile_rows = 1; |
1382 | 0 | pps->uniform_spacing_flag = 1; |
1383 | 0 | pps->disable_dbf = 0; |
1384 | 0 | pps->beta_offset = 0; |
1385 | 0 | pps->tc_offset = 0; |
1386 | 0 | pps->log2_max_transform_skip_block_size = 2; |
1387 | | |
1388 | | // Coded parameters |
1389 | 0 | pps_id = get_ue_golomb_long(gb); |
1390 | 0 | if (pps_id >= MAX_PPS_COUNT) { |
1391 | 0 | av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id); |
1392 | 0 | ret = AVERROR_INVALIDDATA; |
1393 | 0 | goto err; |
1394 | 0 | } |
1395 | 0 | pps->sps_id = get_ue_golomb_long(gb); |
1396 | 0 | if (pps->sps_id >= MAX_SPS_COUNT) { |
1397 | 0 | av_log(s->avctx, AV_LOG_ERROR, "SPS id out of range: %d\n", pps->sps_id); |
1398 | 0 | ret = AVERROR_INVALIDDATA; |
1399 | 0 | goto err; |
1400 | 0 | } |
1401 | 0 | if (!s->sps_list[pps->sps_id]) { |
1402 | 0 | av_log(s->avctx, AV_LOG_ERROR, "SPS %u does not exist.\n", pps->sps_id); |
1403 | 0 | ret = AVERROR_INVALIDDATA; |
1404 | 0 | goto err; |
1405 | 0 | } |
1406 | 0 | sps = (HEVCSPS *)s->sps_list[pps->sps_id]->data; |
1407 | |
|
1408 | 0 | pps->dependent_slice_segments_enabled_flag = get_bits1(gb); |
1409 | 0 | pps->output_flag_present_flag = get_bits1(gb); |
1410 | 0 | pps->num_extra_slice_header_bits = get_bits(gb, 3); |
1411 | |
|
1412 | 0 | pps->sign_data_hiding_flag = get_bits1(gb); |
1413 | |
|
1414 | 0 | pps->cabac_init_present_flag = get_bits1(gb); |
1415 | |
|
1416 | 0 | pps->num_ref_idx_l0_default_active = get_ue_golomb_long(gb) + 1; |
1417 | 0 | pps->num_ref_idx_l1_default_active = get_ue_golomb_long(gb) + 1; |
1418 | |
|
1419 | 0 | pps->pic_init_qp_minus26 = get_se_golomb(gb); |
1420 | |
|
1421 | 0 | pps->constrained_intra_pred_flag = get_bits1(gb); |
1422 | 0 | pps->transform_skip_enabled_flag = get_bits1(gb); |
1423 | |
|
1424 | 0 | pps->cu_qp_delta_enabled_flag = get_bits1(gb); |
1425 | 0 | pps->diff_cu_qp_delta_depth = 0; |
1426 | 0 | if (pps->cu_qp_delta_enabled_flag) |
1427 | 0 | pps->diff_cu_qp_delta_depth = get_ue_golomb_long(gb); |
1428 | |
|
1429 | 0 | pps->cb_qp_offset = get_se_golomb(gb); |
1430 | 0 | if (pps->cb_qp_offset < -12 || pps->cb_qp_offset > 12) { |
1431 | 0 | av_log(s->avctx, AV_LOG_ERROR, "pps_cb_qp_offset out of range: %d\n", |
1432 | 0 | pps->cb_qp_offset); |
1433 | 0 | ret = AVERROR_INVALIDDATA; |
1434 | 0 | goto err; |
1435 | 0 | } |
1436 | 0 | pps->cr_qp_offset = get_se_golomb(gb); |
1437 | 0 | if (pps->cr_qp_offset < -12 || pps->cr_qp_offset > 12) { |
1438 | 0 | av_log(s->avctx, AV_LOG_ERROR, "pps_cr_qp_offset out of range: %d\n", |
1439 | 0 | pps->cr_qp_offset); |
1440 | 0 | ret = AVERROR_INVALIDDATA; |
1441 | 0 | goto err; |
1442 | 0 | } |
1443 | 0 | pps->pic_slice_level_chroma_qp_offsets_present_flag = get_bits1(gb); |
1444 | |
|
1445 | 0 | pps->weighted_pred_flag = get_bits1(gb); |
1446 | 0 | pps->weighted_bipred_flag = get_bits1(gb); |
1447 | |
|
1448 | 0 | pps->transquant_bypass_enable_flag = get_bits1(gb); |
1449 | 0 | pps->tiles_enabled_flag = get_bits1(gb); |
1450 | 0 | pps->entropy_coding_sync_enabled_flag = get_bits1(gb); |
1451 | |
|
1452 | 0 | if (pps->tiles_enabled_flag) { |
1453 | 0 | pps->num_tile_columns = get_ue_golomb_long(gb) + 1; |
1454 | 0 | pps->num_tile_rows = get_ue_golomb_long(gb) + 1; |
1455 | 0 | if (pps->num_tile_columns == 0 || |
1456 | 0 | pps->num_tile_columns >= sps->width) { |
1457 | 0 | av_log(s->avctx, AV_LOG_ERROR, "num_tile_columns_minus1 out of range: %d\n", |
1458 | 0 | pps->num_tile_columns - 1); |
1459 | 0 | ret = AVERROR_INVALIDDATA; |
1460 | 0 | goto err; |
1461 | 0 | } |
1462 | 0 | if (pps->num_tile_rows == 0 || |
1463 | 0 | pps->num_tile_rows >= sps->height) { |
1464 | 0 | av_log(s->avctx, AV_LOG_ERROR, "num_tile_rows_minus1 out of range: %d\n", |
1465 | 0 | pps->num_tile_rows - 1); |
1466 | 0 | ret = AVERROR_INVALIDDATA; |
1467 | 0 | goto err; |
1468 | 0 | } |
1469 | | |
1470 | 0 | pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width)); |
1471 | 0 | pps->row_height = av_malloc_array(pps->num_tile_rows, sizeof(*pps->row_height)); |
1472 | 0 | if (!pps->column_width || !pps->row_height) { |
1473 | 0 | ret = AVERROR(ENOMEM); |
1474 | 0 | goto err; |
1475 | 0 | } |
1476 | | |
1477 | 0 | pps->uniform_spacing_flag = get_bits1(gb); |
1478 | 0 | if (!pps->uniform_spacing_flag) { |
1479 | 0 | uint64_t sum = 0; |
1480 | 0 | for (i = 0; i < pps->num_tile_columns - 1; i++) { |
1481 | 0 | pps->column_width[i] = get_ue_golomb_long(gb) + 1; |
1482 | 0 | sum += pps->column_width[i]; |
1483 | 0 | } |
1484 | 0 | if (sum >= sps->ctb_width) { |
1485 | 0 | av_log(s->avctx, AV_LOG_ERROR, "Invalid tile widths.\n"); |
1486 | 0 | ret = AVERROR_INVALIDDATA; |
1487 | 0 | goto err; |
1488 | 0 | } |
1489 | 0 | pps->column_width[pps->num_tile_columns - 1] = sps->ctb_width - sum; |
1490 | |
|
1491 | 0 | sum = 0; |
1492 | 0 | for (i = 0; i < pps->num_tile_rows - 1; i++) { |
1493 | 0 | pps->row_height[i] = get_ue_golomb_long(gb) + 1; |
1494 | 0 | sum += pps->row_height[i]; |
1495 | 0 | } |
1496 | 0 | if (sum >= sps->ctb_height) { |
1497 | 0 | av_log(s->avctx, AV_LOG_ERROR, "Invalid tile heights.\n"); |
1498 | 0 | ret = AVERROR_INVALIDDATA; |
1499 | 0 | goto err; |
1500 | 0 | } |
1501 | 0 | pps->row_height[pps->num_tile_rows - 1] = sps->ctb_height - sum; |
1502 | 0 | } |
1503 | 0 | pps->loop_filter_across_tiles_enabled_flag = get_bits1(gb); |
1504 | 0 | } |
1505 | | |
1506 | 0 | pps->seq_loop_filter_across_slices_enabled_flag = get_bits1(gb); |
1507 | |
|
1508 | 0 | pps->deblocking_filter_control_present_flag = get_bits1(gb); |
1509 | 0 | if (pps->deblocking_filter_control_present_flag) { |
1510 | 0 | pps->deblocking_filter_override_enabled_flag = get_bits1(gb); |
1511 | 0 | pps->disable_dbf = get_bits1(gb); |
1512 | 0 | if (!pps->disable_dbf) { |
1513 | 0 | pps->beta_offset = get_se_golomb(gb) * 2; |
1514 | 0 | pps->tc_offset = get_se_golomb(gb) * 2; |
1515 | 0 | if (pps->beta_offset/2 < -6 || pps->beta_offset/2 > 6) { |
1516 | 0 | av_log(s->avctx, AV_LOG_ERROR, "pps_beta_offset_div2 out of range: %d\n", |
1517 | 0 | pps->beta_offset/2); |
1518 | 0 | ret = AVERROR_INVALIDDATA; |
1519 | 0 | goto err; |
1520 | 0 | } |
1521 | 0 | if (pps->tc_offset/2 < -6 || pps->tc_offset/2 > 6) { |
1522 | 0 | av_log(s->avctx, AV_LOG_ERROR, "pps_tc_offset_div2 out of range: %d\n", |
1523 | 0 | pps->tc_offset/2); |
1524 | 0 | ret = AVERROR_INVALIDDATA; |
1525 | 0 | goto err; |
1526 | 0 | } |
1527 | 0 | } |
1528 | 0 | } |
1529 | | |
1530 | 0 | pps->scaling_list_data_present_flag = get_bits1(gb); |
1531 | 0 | if (pps->scaling_list_data_present_flag) { |
1532 | 0 | set_default_scaling_list_data(&pps->scaling_list); |
1533 | 0 | ret = scaling_list_data(s, &pps->scaling_list, sps); |
1534 | 0 | if (ret < 0) |
1535 | 0 | goto err; |
1536 | 0 | } |
1537 | 0 | pps->lists_modification_present_flag = get_bits1(gb); |
1538 | 0 | pps->log2_parallel_merge_level = get_ue_golomb_long(gb) + 2; |
1539 | 0 | if (pps->log2_parallel_merge_level > sps->log2_ctb_size) { |
1540 | 0 | av_log(s->avctx, AV_LOG_ERROR, "log2_parallel_merge_level_minus2 out of range: %d\n", |
1541 | 0 | pps->log2_parallel_merge_level - 2); |
1542 | 0 | ret = AVERROR_INVALIDDATA; |
1543 | 0 | goto err; |
1544 | 0 | } |
1545 | | |
1546 | 0 | pps->slice_header_extension_present_flag = get_bits1(gb); |
1547 | |
|
1548 | 0 | if (get_bits1(gb)) { // pps_extension_present_flag |
1549 | 0 | int pps_range_extensions_flag = get_bits1(gb); |
1550 | 0 | /* int pps_extension_7bits = */ get_bits(gb, 7); |
1551 | 0 | if ( |
1552 | | #ifndef USE_MSPS |
1553 | | /* XXX: check if testing the profile is correct */ |
1554 | | sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_REXT && |
1555 | | #endif |
1556 | 0 | pps_range_extensions_flag) { |
1557 | 0 | pps_range_extensions(s, pps, sps); |
1558 | 0 | } |
1559 | 0 | } |
1560 | | |
1561 | | // Inferred parameters |
1562 | 0 | pps->col_bd = av_malloc_array(pps->num_tile_columns + 1, sizeof(*pps->col_bd)); |
1563 | 0 | pps->row_bd = av_malloc_array(pps->num_tile_rows + 1, sizeof(*pps->row_bd)); |
1564 | 0 | pps->col_idxX = av_malloc_array(sps->ctb_width, sizeof(*pps->col_idxX)); |
1565 | 0 | if (!pps->col_bd || !pps->row_bd || !pps->col_idxX) { |
1566 | 0 | ret = AVERROR(ENOMEM); |
1567 | 0 | goto err; |
1568 | 0 | } |
1569 | | |
1570 | 0 | if (pps->uniform_spacing_flag) { |
1571 | 0 | if (!pps->column_width) { |
1572 | 0 | pps->column_width = av_malloc_array(pps->num_tile_columns, sizeof(*pps->column_width)); |
1573 | 0 | pps->row_height = av_malloc_array(pps->num_tile_rows, sizeof(*pps->row_height)); |
1574 | 0 | } |
1575 | 0 | if (!pps->column_width || !pps->row_height) { |
1576 | 0 | ret = AVERROR(ENOMEM); |
1577 | 0 | goto err; |
1578 | 0 | } |
1579 | | |
1580 | 0 | for (i = 0; i < pps->num_tile_columns; i++) { |
1581 | 0 | pps->column_width[i] = ((i + 1) * sps->ctb_width) / pps->num_tile_columns - |
1582 | 0 | (i * sps->ctb_width) / pps->num_tile_columns; |
1583 | 0 | } |
1584 | |
|
1585 | 0 | for (i = 0; i < pps->num_tile_rows; i++) { |
1586 | 0 | pps->row_height[i] = ((i + 1) * sps->ctb_height) / pps->num_tile_rows - |
1587 | 0 | (i * sps->ctb_height) / pps->num_tile_rows; |
1588 | 0 | } |
1589 | 0 | } |
1590 | | |
1591 | 0 | pps->col_bd[0] = 0; |
1592 | 0 | for (i = 0; i < pps->num_tile_columns; i++) |
1593 | 0 | pps->col_bd[i + 1] = pps->col_bd[i] + pps->column_width[i]; |
1594 | |
|
1595 | 0 | pps->row_bd[0] = 0; |
1596 | 0 | for (i = 0; i < pps->num_tile_rows; i++) |
1597 | 0 | pps->row_bd[i + 1] = pps->row_bd[i] + pps->row_height[i]; |
1598 | |
|
1599 | 0 | for (i = 0, j = 0; i < sps->ctb_width; i++) { |
1600 | 0 | if (i > pps->col_bd[j]) |
1601 | 0 | j++; |
1602 | 0 | pps->col_idxX[i] = j; |
1603 | 0 | } |
1604 | | |
1605 | | /** |
1606 | | * 6.5 |
1607 | | */ |
1608 | 0 | pic_area_in_ctbs = sps->ctb_width * sps->ctb_height; |
1609 | |
|
1610 | 0 | pps->ctb_addr_rs_to_ts = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->ctb_addr_rs_to_ts)); |
1611 | 0 | pps->ctb_addr_ts_to_rs = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->ctb_addr_ts_to_rs)); |
1612 | 0 | pps->tile_id = av_malloc_array(pic_area_in_ctbs, sizeof(*pps->tile_id)); |
1613 | 0 | pps->min_tb_addr_zs_tab = av_malloc_array((sps->tb_mask+2) * (sps->tb_mask+2), sizeof(*pps->min_tb_addr_zs_tab)); |
1614 | 0 | if (!pps->ctb_addr_rs_to_ts || !pps->ctb_addr_ts_to_rs || |
1615 | 0 | !pps->tile_id || !pps->min_tb_addr_zs_tab) { |
1616 | 0 | ret = AVERROR(ENOMEM); |
1617 | 0 | goto err; |
1618 | 0 | } |
1619 | | |
1620 | 0 | for (ctb_addr_rs = 0; ctb_addr_rs < pic_area_in_ctbs; ctb_addr_rs++) { |
1621 | 0 | int tb_x = ctb_addr_rs % sps->ctb_width; |
1622 | 0 | int tb_y = ctb_addr_rs / sps->ctb_width; |
1623 | 0 | int tile_x = 0; |
1624 | 0 | int tile_y = 0; |
1625 | 0 | int val = 0; |
1626 | |
|
1627 | 0 | for (i = 0; i < pps->num_tile_columns; i++) { |
1628 | 0 | if (tb_x < pps->col_bd[i + 1]) { |
1629 | 0 | tile_x = i; |
1630 | 0 | break; |
1631 | 0 | } |
1632 | 0 | } |
1633 | |
|
1634 | 0 | for (i = 0; i < pps->num_tile_rows; i++) { |
1635 | 0 | if (tb_y < pps->row_bd[i + 1]) { |
1636 | 0 | tile_y = i; |
1637 | 0 | break; |
1638 | 0 | } |
1639 | 0 | } |
1640 | |
|
1641 | 0 | for (i = 0; i < tile_x; i++) |
1642 | 0 | val += pps->row_height[tile_y] * pps->column_width[i]; |
1643 | 0 | for (i = 0; i < tile_y; i++) |
1644 | 0 | val += sps->ctb_width * pps->row_height[i]; |
1645 | |
|
1646 | 0 | val += (tb_y - pps->row_bd[tile_y]) * pps->column_width[tile_x] + |
1647 | 0 | tb_x - pps->col_bd[tile_x]; |
1648 | |
|
1649 | 0 | pps->ctb_addr_rs_to_ts[ctb_addr_rs] = val; |
1650 | 0 | pps->ctb_addr_ts_to_rs[val] = ctb_addr_rs; |
1651 | 0 | } |
1652 | |
|
1653 | 0 | for (j = 0, tile_id = 0; j < pps->num_tile_rows; j++) |
1654 | 0 | for (i = 0; i < pps->num_tile_columns; i++, tile_id++) |
1655 | 0 | for (y = pps->row_bd[j]; y < pps->row_bd[j + 1]; y++) |
1656 | 0 | for (x = pps->col_bd[i]; x < pps->col_bd[i + 1]; x++) |
1657 | 0 | pps->tile_id[pps->ctb_addr_rs_to_ts[y * sps->ctb_width + x]] = tile_id; |
1658 | |
|
1659 | 0 | pps->tile_pos_rs = av_malloc_array(tile_id, sizeof(*pps->tile_pos_rs)); |
1660 | 0 | if (!pps->tile_pos_rs) { |
1661 | 0 | ret = AVERROR(ENOMEM); |
1662 | 0 | goto err; |
1663 | 0 | } |
1664 | | |
1665 | 0 | for (j = 0; j < pps->num_tile_rows; j++) |
1666 | 0 | for (i = 0; i < pps->num_tile_columns; i++) |
1667 | 0 | pps->tile_pos_rs[j * pps->num_tile_columns + i] = pps->row_bd[j] * sps->ctb_width + pps->col_bd[i]; |
1668 | |
|
1669 | 0 | log2_diff_ctb_min_tb_size = sps->log2_ctb_size - sps->log2_min_tb_size; |
1670 | 0 | pps->min_tb_addr_zs = &pps->min_tb_addr_zs_tab[1*(sps->tb_mask+2)+1]; |
1671 | 0 | for (y = 0; y < sps->tb_mask+2; y++) { |
1672 | 0 | pps->min_tb_addr_zs_tab[y*(sps->tb_mask+2)] = -1; |
1673 | 0 | pps->min_tb_addr_zs_tab[y] = -1; |
1674 | 0 | } |
1675 | 0 | for (y = 0; y < sps->tb_mask+1; y++) { |
1676 | 0 | for (x = 0; x < sps->tb_mask+1; x++) { |
1677 | 0 | int tb_x = x >> log2_diff_ctb_min_tb_size; |
1678 | 0 | int tb_y = y >> log2_diff_ctb_min_tb_size; |
1679 | 0 | int ctb_addr_rs = sps->ctb_width * tb_y + tb_x; |
1680 | 0 | int val = pps->ctb_addr_rs_to_ts[ctb_addr_rs] << |
1681 | 0 | (log2_diff_ctb_min_tb_size * 2); |
1682 | 0 | for (i = 0; i < log2_diff_ctb_min_tb_size; i++) { |
1683 | 0 | int m = 1 << i; |
1684 | 0 | val += (m & x ? m * m : 0) + (m & y ? 2 * m * m : 0); |
1685 | 0 | } |
1686 | 0 | pps->min_tb_addr_zs[y * (sps->tb_mask+2) + x] = val; |
1687 | 0 | } |
1688 | 0 | } |
1689 | |
|
1690 | 0 | if (get_bits_left(gb) < 0) { |
1691 | 0 | av_log(s->avctx, AV_LOG_ERROR, |
1692 | 0 | "Overread PPS by %d bits\n", -get_bits_left(gb)); |
1693 | 0 | goto err; |
1694 | 0 | } |
1695 | | |
1696 | 0 | av_buffer_unref(&s->pps_list[pps_id]); |
1697 | 0 | s->pps_list[pps_id] = pps_buf; |
1698 | |
|
1699 | 0 | return 0; |
1700 | | |
1701 | 0 | err: |
1702 | 0 | av_buffer_unref(&pps_buf); |
1703 | 0 | return ret; |
1704 | 0 | } |