1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka *
3*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD
4*437bfbebSnyanmisaka *
5*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License");
6*437bfbebSnyanmisaka * you may not use this file except in compliance with the License.
7*437bfbebSnyanmisaka * You may obtain a copy of the License at
8*437bfbebSnyanmisaka *
9*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0
10*437bfbebSnyanmisaka *
11*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software
12*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS,
13*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*437bfbebSnyanmisaka * See the License for the specific language governing permissions and
15*437bfbebSnyanmisaka * limitations under the License.
16*437bfbebSnyanmisaka */
17*437bfbebSnyanmisaka
18*437bfbebSnyanmisaka /*
19*437bfbebSnyanmisaka * @file h265d_sei.c
20*437bfbebSnyanmisaka * @brief
21*437bfbebSnyanmisaka * @author csy(csy@rock-chips.com)
22*437bfbebSnyanmisaka
23*437bfbebSnyanmisaka * @version 1.0.0
24*437bfbebSnyanmisaka * @history
25*437bfbebSnyanmisaka * 2015.7.15 : Create
26*437bfbebSnyanmisaka */
27*437bfbebSnyanmisaka
28*437bfbebSnyanmisaka #define MODULE_TAG "h265d_sei"
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka #include "mpp_bitread.h"
31*437bfbebSnyanmisaka #include "h265d_parser.h"
32*437bfbebSnyanmisaka #include "rk_hdr_meta_com.h"
33*437bfbebSnyanmisaka #include "h2645d_sei.h"
34*437bfbebSnyanmisaka
35*437bfbebSnyanmisaka
decode_nal_sei_decoded_picture_hash(BitReadCtx_t * gb)36*437bfbebSnyanmisaka static RK_S32 decode_nal_sei_decoded_picture_hash(BitReadCtx_t *gb)
37*437bfbebSnyanmisaka {
38*437bfbebSnyanmisaka RK_S32 cIdx, i;
39*437bfbebSnyanmisaka RK_U8 hash_type;
40*437bfbebSnyanmisaka READ_BITS(gb, 8, &hash_type);
41*437bfbebSnyanmisaka
42*437bfbebSnyanmisaka for (cIdx = 0; cIdx < 3/*((s->sps->chroma_format_idc == 0) ? 1 : 3)*/; cIdx++) {
43*437bfbebSnyanmisaka if (hash_type == 0) {
44*437bfbebSnyanmisaka //s->is_md5 = 1;
45*437bfbebSnyanmisaka for (i = 0; i < 16; i++)
46*437bfbebSnyanmisaka SKIP_BITS(gb, 8);
47*437bfbebSnyanmisaka } else if (hash_type == 1) {
48*437bfbebSnyanmisaka SKIP_BITS(gb, 16);
49*437bfbebSnyanmisaka } else if (hash_type == 2) {
50*437bfbebSnyanmisaka SKIP_BITS(gb, 32);
51*437bfbebSnyanmisaka }
52*437bfbebSnyanmisaka }
53*437bfbebSnyanmisaka return 0;
54*437bfbebSnyanmisaka __BITREAD_ERR:
55*437bfbebSnyanmisaka return MPP_ERR_STREAM;
56*437bfbebSnyanmisaka }
57*437bfbebSnyanmisaka
decode_nal_sei_frame_packing_arrangement(HEVCContext * s,BitReadCtx_t * gb)58*437bfbebSnyanmisaka static RK_S32 decode_nal_sei_frame_packing_arrangement(HEVCContext *s, BitReadCtx_t *gb)
59*437bfbebSnyanmisaka {
60*437bfbebSnyanmisaka RK_S32 value = 0;
61*437bfbebSnyanmisaka
62*437bfbebSnyanmisaka READ_UE(gb, &value); // frame_packing_arrangement_id
63*437bfbebSnyanmisaka READ_ONEBIT(gb, &value);
64*437bfbebSnyanmisaka s->sei_frame_packing_present = !value;
65*437bfbebSnyanmisaka
66*437bfbebSnyanmisaka if (s->sei_frame_packing_present) {
67*437bfbebSnyanmisaka READ_BITS(gb, 7, &s->frame_packing_arrangement_type);
68*437bfbebSnyanmisaka READ_ONEBIT(gb, &s->quincunx_subsampling);
69*437bfbebSnyanmisaka READ_BITS(gb, 6, &s->content_interpretation_type);
70*437bfbebSnyanmisaka
71*437bfbebSnyanmisaka // the following skips spatial_flipping_flag frame0_flipped_flag
72*437bfbebSnyanmisaka // field_views_flag current_frame_is_frame0_flag
73*437bfbebSnyanmisaka // frame0_self_contained_flag frame1_self_contained_flag
74*437bfbebSnyanmisaka SKIP_BITS(gb, 6);
75*437bfbebSnyanmisaka
76*437bfbebSnyanmisaka if (!s->quincunx_subsampling && s->frame_packing_arrangement_type != 5)
77*437bfbebSnyanmisaka SKIP_BITS(gb, 16); // frame[01]_grid_position_[xy]
78*437bfbebSnyanmisaka SKIP_BITS(gb, 8); // frame_packing_arrangement_reserved_byte
79*437bfbebSnyanmisaka SKIP_BITS(gb, 1); // frame_packing_arrangement_persistance_flag
80*437bfbebSnyanmisaka }
81*437bfbebSnyanmisaka SKIP_BITS(gb, 1); // upsampled_aspect_ratio_flag
82*437bfbebSnyanmisaka return 0;
83*437bfbebSnyanmisaka __BITREAD_ERR:
84*437bfbebSnyanmisaka return MPP_ERR_STREAM;
85*437bfbebSnyanmisaka }
86*437bfbebSnyanmisaka
decode_pic_timing(HEVCContext * s,BitReadCtx_t * gb)87*437bfbebSnyanmisaka static RK_S32 decode_pic_timing(HEVCContext *s, BitReadCtx_t *gb)
88*437bfbebSnyanmisaka {
89*437bfbebSnyanmisaka HEVCSPS *sps;
90*437bfbebSnyanmisaka
91*437bfbebSnyanmisaka if (!s->sps_list[s->active_seq_parameter_set_id])
92*437bfbebSnyanmisaka return MPP_ERR_NOMEM;
93*437bfbebSnyanmisaka sps = (HEVCSPS*)s->sps_list[s->active_seq_parameter_set_id];
94*437bfbebSnyanmisaka s->picture_struct = MPP_PICTURE_STRUCTURE_UNKNOWN;
95*437bfbebSnyanmisaka if (sps->vui.frame_field_info_present_flag) {
96*437bfbebSnyanmisaka READ_BITS(gb, 4, &s->picture_struct);
97*437bfbebSnyanmisaka switch (s->picture_struct) {
98*437bfbebSnyanmisaka case 0 : s->picture_struct = MPP_PICTURE_STRUCTURE_FRAME; h265d_dbg(H265D_DBG_SEI, "(progressive) frame \n"); break;
99*437bfbebSnyanmisaka case 1 : s->picture_struct = MPP_PICTURE_STRUCTURE_TOP_FIELD; h265d_dbg(H265D_DBG_SEI, "top field\n"); break;
100*437bfbebSnyanmisaka case 2 : s->picture_struct = MPP_PICTURE_STRUCTURE_BOTTOM_FIELD; h265d_dbg(H265D_DBG_SEI, "bottom field\n"); break;
101*437bfbebSnyanmisaka case 3 : s->picture_struct = MPP_PICTURE_STRUCTURE_FRAME; h265d_dbg(H265D_DBG_SEI, "top field, bottom field, in that order\n"); break;
102*437bfbebSnyanmisaka case 4 : s->picture_struct = MPP_PICTURE_STRUCTURE_FRAME; h265d_dbg(H265D_DBG_SEI, "bottom field, top field, in that order\n"); break;
103*437bfbebSnyanmisaka case 5 : s->picture_struct = MPP_PICTURE_STRUCTURE_FRAME; h265d_dbg(H265D_DBG_SEI, "top field, bottom field, top field repeated, in that order\n"); break;
104*437bfbebSnyanmisaka case 6 : s->picture_struct = MPP_PICTURE_STRUCTURE_FRAME; h265d_dbg(H265D_DBG_SEI, "bottom field, top field, bottom field repeated, in that order\n"); break;
105*437bfbebSnyanmisaka case 7 : s->picture_struct = MPP_PICTURE_STRUCTURE_FRAME; h265d_dbg(H265D_DBG_SEI, "frame doubling\n"); break;
106*437bfbebSnyanmisaka case 8 : s->picture_struct = MPP_PICTURE_STRUCTURE_FRAME; h265d_dbg(H265D_DBG_SEI, "frame tripling\n"); break;
107*437bfbebSnyanmisaka case 9 : s->picture_struct = MPP_PICTURE_STRUCTURE_TOP_FIELD; h265d_dbg(H265D_DBG_SEI, "top field paired with previous bottom field in output order\n"); break;
108*437bfbebSnyanmisaka case 10 : s->picture_struct = MPP_PICTURE_STRUCTURE_BOTTOM_FIELD; h265d_dbg(H265D_DBG_SEI, "bottom field paired with previous top field in output order\n"); break;
109*437bfbebSnyanmisaka case 11 : s->picture_struct = MPP_PICTURE_STRUCTURE_TOP_FIELD; h265d_dbg(H265D_DBG_SEI, "top field paired with next bottom field in output order\n"); break;
110*437bfbebSnyanmisaka case 12 : s->picture_struct = MPP_PICTURE_STRUCTURE_BOTTOM_FIELD; h265d_dbg(H265D_DBG_SEI, "bottom field paired with next top field in output order\n"); break;
111*437bfbebSnyanmisaka }
112*437bfbebSnyanmisaka SKIP_BITS(gb, 2); // source_scan_type
113*437bfbebSnyanmisaka SKIP_BITS(gb, 1); // duplicate_flag
114*437bfbebSnyanmisaka }
115*437bfbebSnyanmisaka return 0;
116*437bfbebSnyanmisaka __BITREAD_ERR:
117*437bfbebSnyanmisaka return MPP_ERR_STREAM;
118*437bfbebSnyanmisaka }
119*437bfbebSnyanmisaka
active_parameter_sets(HEVCContext * s,BitReadCtx_t * gb)120*437bfbebSnyanmisaka static RK_S32 active_parameter_sets(HEVCContext *s, BitReadCtx_t *gb)
121*437bfbebSnyanmisaka {
122*437bfbebSnyanmisaka RK_S32 num_sps_ids_minus1;
123*437bfbebSnyanmisaka RK_S32 i, value;
124*437bfbebSnyanmisaka RK_U32 active_seq_parameter_set_id;
125*437bfbebSnyanmisaka
126*437bfbebSnyanmisaka SKIP_BITS(gb, 4); // active_video_parameter_set_id
127*437bfbebSnyanmisaka SKIP_BITS(gb, 1); // self_contained_cvs_flag
128*437bfbebSnyanmisaka SKIP_BITS(gb, 1); // num_sps_ids_minus1
129*437bfbebSnyanmisaka READ_UE(gb, &num_sps_ids_minus1); // num_sps_ids_minus1
130*437bfbebSnyanmisaka
131*437bfbebSnyanmisaka READ_UE(gb, &active_seq_parameter_set_id);
132*437bfbebSnyanmisaka if (active_seq_parameter_set_id >= MAX_SPS_COUNT) {
133*437bfbebSnyanmisaka mpp_err( "active_parameter_set_id %d invalid\n", active_seq_parameter_set_id);
134*437bfbebSnyanmisaka return MPP_ERR_STREAM;
135*437bfbebSnyanmisaka }
136*437bfbebSnyanmisaka s->active_seq_parameter_set_id = active_seq_parameter_set_id;
137*437bfbebSnyanmisaka
138*437bfbebSnyanmisaka for (i = 1; i <= num_sps_ids_minus1; i++)
139*437bfbebSnyanmisaka READ_UE(gb, &value); // active_seq_parameter_set_id[i]
140*437bfbebSnyanmisaka
141*437bfbebSnyanmisaka return 0;
142*437bfbebSnyanmisaka __BITREAD_ERR:
143*437bfbebSnyanmisaka return MPP_ERR_STREAM;
144*437bfbebSnyanmisaka }
145*437bfbebSnyanmisaka
mastering_display_colour_volume(HEVCContext * s,BitReadCtx_t * gb)146*437bfbebSnyanmisaka static RK_S32 mastering_display_colour_volume(HEVCContext *s, BitReadCtx_t *gb)
147*437bfbebSnyanmisaka {
148*437bfbebSnyanmisaka RK_S32 i = 0;
149*437bfbebSnyanmisaka RK_U16 value = 0;
150*437bfbebSnyanmisaka RK_U32 lum = 0;
151*437bfbebSnyanmisaka
152*437bfbebSnyanmisaka for (i = 0; i < 3; i++) {
153*437bfbebSnyanmisaka READ_BITS(gb, 16, &value);
154*437bfbebSnyanmisaka s->mastering_display.display_primaries[i][0] = value;
155*437bfbebSnyanmisaka READ_BITS(gb, 16, &value);
156*437bfbebSnyanmisaka s->mastering_display.display_primaries[i][1] = value;
157*437bfbebSnyanmisaka }
158*437bfbebSnyanmisaka READ_BITS(gb, 16, &value);
159*437bfbebSnyanmisaka s->mastering_display.white_point[0] = value;
160*437bfbebSnyanmisaka READ_BITS(gb, 16, &value);
161*437bfbebSnyanmisaka s->mastering_display.white_point[1] = value;
162*437bfbebSnyanmisaka mpp_read_longbits(gb, 32, &lum);
163*437bfbebSnyanmisaka s->mastering_display.max_luminance = lum;
164*437bfbebSnyanmisaka mpp_read_longbits(gb, 32, &lum);
165*437bfbebSnyanmisaka s->mastering_display.min_luminance = lum;
166*437bfbebSnyanmisaka
167*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "dis_prim [%d %d] [%d %d] [%d %d] white point %d %d luminance %d %d\n",
168*437bfbebSnyanmisaka s->mastering_display.display_primaries[0][0],
169*437bfbebSnyanmisaka s->mastering_display.display_primaries[0][1],
170*437bfbebSnyanmisaka s->mastering_display.display_primaries[1][0],
171*437bfbebSnyanmisaka s->mastering_display.display_primaries[1][1],
172*437bfbebSnyanmisaka s->mastering_display.display_primaries[2][0],
173*437bfbebSnyanmisaka s->mastering_display.display_primaries[2][1],
174*437bfbebSnyanmisaka s->mastering_display.white_point[0],
175*437bfbebSnyanmisaka s->mastering_display.white_point[1],
176*437bfbebSnyanmisaka s->mastering_display.max_luminance,
177*437bfbebSnyanmisaka s->mastering_display.min_luminance);
178*437bfbebSnyanmisaka
179*437bfbebSnyanmisaka return 0;
180*437bfbebSnyanmisaka
181*437bfbebSnyanmisaka __BITREAD_ERR:
182*437bfbebSnyanmisaka return MPP_ERR_STREAM;
183*437bfbebSnyanmisaka }
184*437bfbebSnyanmisaka
content_light_info(HEVCContext * s,BitReadCtx_t * gb)185*437bfbebSnyanmisaka static RK_S32 content_light_info(HEVCContext *s, BitReadCtx_t *gb)
186*437bfbebSnyanmisaka {
187*437bfbebSnyanmisaka RK_U32 value = 0;
188*437bfbebSnyanmisaka mpp_read_longbits(gb, 16, &value);
189*437bfbebSnyanmisaka s->content_light.MaxCLL = value;
190*437bfbebSnyanmisaka mpp_read_longbits(gb, 16, &value);
191*437bfbebSnyanmisaka s->content_light.MaxFALL = value;
192*437bfbebSnyanmisaka return 0;
193*437bfbebSnyanmisaka }
194*437bfbebSnyanmisaka
colour_remapping_info(BitReadCtx_t * gb)195*437bfbebSnyanmisaka static RK_S32 colour_remapping_info(BitReadCtx_t *gb)
196*437bfbebSnyanmisaka {
197*437bfbebSnyanmisaka RK_U32 i = 0, j = 0;
198*437bfbebSnyanmisaka RK_U32 value = 0;
199*437bfbebSnyanmisaka RK_U32 in_bit_depth = 0;
200*437bfbebSnyanmisaka RK_U32 out_bit_depth = 0;
201*437bfbebSnyanmisaka
202*437bfbebSnyanmisaka READ_UE(gb, &value); //colour_remap ID
203*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); //colour_remap_cancel_flag
204*437bfbebSnyanmisaka if (!value) {
205*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); //colour_remap_persistence_flag
206*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); //colour_remap_video_signal_info_present_flag
207*437bfbebSnyanmisaka if (value) {
208*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); //colour_remap_full_rang_flag
209*437bfbebSnyanmisaka READ_BITS(gb, 8, &value); //colour_remap_primaries
210*437bfbebSnyanmisaka READ_BITS(gb, 8, &value); //colour_remap_transfer_function
211*437bfbebSnyanmisaka READ_BITS(gb, 8, &value); //colour_remap_matries_coefficients
212*437bfbebSnyanmisaka }
213*437bfbebSnyanmisaka
214*437bfbebSnyanmisaka READ_BITS(gb, 8, &in_bit_depth); //colour_remap_input_bit_depth
215*437bfbebSnyanmisaka READ_BITS(gb, 8, &out_bit_depth); //colour_remap_bit_depth
216*437bfbebSnyanmisaka for (i = 0; i < 3; i++) {
217*437bfbebSnyanmisaka RK_U32 pre_lut_num_val_minus1 = 0;
218*437bfbebSnyanmisaka RK_U32 in_bit = ((in_bit_depth + 7) >> 3) << 3;
219*437bfbebSnyanmisaka RK_U32 out_bit = ((out_bit_depth + 7) >> 3) << 3;
220*437bfbebSnyanmisaka READ_BITS(gb, 8, &pre_lut_num_val_minus1); //pre_lut_num_val_minus1
221*437bfbebSnyanmisaka if (pre_lut_num_val_minus1 > 0) {
222*437bfbebSnyanmisaka for (j = 0; j <= pre_lut_num_val_minus1; j++) {
223*437bfbebSnyanmisaka READ_BITS(gb, in_bit, &value); //pre_lut_coded_value
224*437bfbebSnyanmisaka READ_BITS(gb, out_bit, &value); //pre_lut_target_value
225*437bfbebSnyanmisaka }
226*437bfbebSnyanmisaka }
227*437bfbebSnyanmisaka }
228*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); //colour_remap_matrix_present_flag
229*437bfbebSnyanmisaka if (value) {
230*437bfbebSnyanmisaka READ_BITS(gb, 4, &value); //log2_matrix_denom
231*437bfbebSnyanmisaka for (i = 0; i < 3; i++) {
232*437bfbebSnyanmisaka for (j = 0; j < 3; j++)
233*437bfbebSnyanmisaka READ_SE(gb, &value); //colour_remap_coeffs
234*437bfbebSnyanmisaka }
235*437bfbebSnyanmisaka }
236*437bfbebSnyanmisaka for (i = 0; i < 3; i++) {
237*437bfbebSnyanmisaka RK_U32 post_lut_num_val_minus1 = 0;
238*437bfbebSnyanmisaka RK_U32 in_bit = ((in_bit_depth + 7) >> 3) << 3;
239*437bfbebSnyanmisaka RK_U32 out_bit = ((out_bit_depth + 7) >> 3) << 3;
240*437bfbebSnyanmisaka READ_BITS(gb, 8, &post_lut_num_val_minus1); //post_lut_num_val_minus1
241*437bfbebSnyanmisaka if (post_lut_num_val_minus1 > 0) {
242*437bfbebSnyanmisaka for (j = 0; j <= post_lut_num_val_minus1; j++) {
243*437bfbebSnyanmisaka READ_BITS(gb, in_bit, &value); //post_lut_coded_value
244*437bfbebSnyanmisaka READ_BITS(gb, out_bit, &value); //post_lut_target_value
245*437bfbebSnyanmisaka }
246*437bfbebSnyanmisaka }
247*437bfbebSnyanmisaka }
248*437bfbebSnyanmisaka
249*437bfbebSnyanmisaka }
250*437bfbebSnyanmisaka
251*437bfbebSnyanmisaka return MPP_OK;
252*437bfbebSnyanmisaka __BITREAD_ERR:
253*437bfbebSnyanmisaka return MPP_ERR_STREAM;
254*437bfbebSnyanmisaka }
255*437bfbebSnyanmisaka
tone_mapping_info(BitReadCtx_t * gb)256*437bfbebSnyanmisaka static RK_S32 tone_mapping_info(BitReadCtx_t *gb)
257*437bfbebSnyanmisaka {
258*437bfbebSnyanmisaka RK_U32 i = 0;
259*437bfbebSnyanmisaka RK_U32 value = 0;
260*437bfbebSnyanmisaka RK_U32 codec_bit_depth = 0;
261*437bfbebSnyanmisaka RK_U32 target_bit_depth = 0;
262*437bfbebSnyanmisaka
263*437bfbebSnyanmisaka READ_UE(gb, &value); //tone_map ID
264*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); //tone_map_cancel_flag
265*437bfbebSnyanmisaka if (!value) {
266*437bfbebSnyanmisaka RK_U32 tone_map_model_id;
267*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); //tone_map_persistence_flag
268*437bfbebSnyanmisaka READ_BITS(gb, 8, &codec_bit_depth); //coded_data_bit_depth
269*437bfbebSnyanmisaka READ_BITS(gb, 8, &target_bit_depth); //target_bit_depth
270*437bfbebSnyanmisaka READ_UE(gb, &tone_map_model_id); //tone_map_model_id
271*437bfbebSnyanmisaka switch (tone_map_model_id) {
272*437bfbebSnyanmisaka case 0: {
273*437bfbebSnyanmisaka mpp_read_longbits(gb, 32, &value); //min_value
274*437bfbebSnyanmisaka mpp_read_longbits(gb, 32, &value); //max_value
275*437bfbebSnyanmisaka break;
276*437bfbebSnyanmisaka }
277*437bfbebSnyanmisaka case 1: {
278*437bfbebSnyanmisaka mpp_read_longbits(gb, 32, &value); //sigmoid_midpoint
279*437bfbebSnyanmisaka mpp_read_longbits(gb, 32, &value); //sigmoid_width
280*437bfbebSnyanmisaka break;
281*437bfbebSnyanmisaka }
282*437bfbebSnyanmisaka case 2: {
283*437bfbebSnyanmisaka RK_U32 in_bit = ((codec_bit_depth + 7) >> 3) << 3;
284*437bfbebSnyanmisaka for (i = 0; i < (RK_U32)(1 << target_bit_depth); i++) {
285*437bfbebSnyanmisaka READ_BITS(gb, in_bit, &value);
286*437bfbebSnyanmisaka }
287*437bfbebSnyanmisaka break;
288*437bfbebSnyanmisaka }
289*437bfbebSnyanmisaka case 3: {
290*437bfbebSnyanmisaka RK_U32 num_pivots;
291*437bfbebSnyanmisaka RK_U32 in_bit = ((codec_bit_depth + 7) >> 3) << 3;
292*437bfbebSnyanmisaka RK_U32 out_bit = ((target_bit_depth + 7) >> 3) << 3;
293*437bfbebSnyanmisaka READ_BITS(gb, 16, &num_pivots); //num_pivots
294*437bfbebSnyanmisaka for (i = 0; i < num_pivots; i++) {
295*437bfbebSnyanmisaka READ_BITS(gb, in_bit, &value);
296*437bfbebSnyanmisaka READ_BITS(gb, out_bit, &value);
297*437bfbebSnyanmisaka }
298*437bfbebSnyanmisaka break;
299*437bfbebSnyanmisaka }
300*437bfbebSnyanmisaka case 4: {
301*437bfbebSnyanmisaka RK_U32 camera_iso_speed_idc;
302*437bfbebSnyanmisaka RK_U32 exposure_index_idc;
303*437bfbebSnyanmisaka READ_BITS(gb, 8, &camera_iso_speed_idc);
304*437bfbebSnyanmisaka if (camera_iso_speed_idc == 255) {
305*437bfbebSnyanmisaka mpp_read_longbits(gb, 32, &value); //camera_iso_speed_value
306*437bfbebSnyanmisaka
307*437bfbebSnyanmisaka }
308*437bfbebSnyanmisaka READ_BITS(gb, 8, &exposure_index_idc);
309*437bfbebSnyanmisaka if (exposure_index_idc == 255) {
310*437bfbebSnyanmisaka mpp_read_longbits(gb, 32, &value); //exposure_index_value
311*437bfbebSnyanmisaka }
312*437bfbebSnyanmisaka READ_ONEBIT(gb, &value); //exposure_compensation_value_sign_flag
313*437bfbebSnyanmisaka READ_BITS(gb, 16, &value); //exposure_compensation_value_numerator
314*437bfbebSnyanmisaka READ_BITS(gb, 16, &value); //exposure_compensation_value_denom_idc
315*437bfbebSnyanmisaka READ_BITS_LONG(gb, 32, &value); //ref_screen_luminance_white
316*437bfbebSnyanmisaka READ_BITS_LONG(gb, 32, &value); //extended_range_white_level
317*437bfbebSnyanmisaka READ_BITS(gb, 16, &value); //nominal_black_level_code_value
318*437bfbebSnyanmisaka READ_BITS(gb, 16, &value); //nominal_white_level_code_value
319*437bfbebSnyanmisaka READ_BITS(gb, 16, &value); //extended_white_level_code_value
320*437bfbebSnyanmisaka break;
321*437bfbebSnyanmisaka }
322*437bfbebSnyanmisaka default:
323*437bfbebSnyanmisaka break;
324*437bfbebSnyanmisaka }
325*437bfbebSnyanmisaka }
326*437bfbebSnyanmisaka
327*437bfbebSnyanmisaka return MPP_OK;
328*437bfbebSnyanmisaka __BITREAD_ERR:
329*437bfbebSnyanmisaka return MPP_ERR_STREAM;
330*437bfbebSnyanmisaka }
331*437bfbebSnyanmisaka
vivid_display_info(HEVCContext * s,BitReadCtx_t * gb,RK_U32 size)332*437bfbebSnyanmisaka static RK_S32 vivid_display_info(HEVCContext *s, BitReadCtx_t *gb, RK_U32 size)
333*437bfbebSnyanmisaka {
334*437bfbebSnyanmisaka if (gb)
335*437bfbebSnyanmisaka mpp_hevc_fill_dynamic_meta(s, gb->data_, size, HDRVIVID);
336*437bfbebSnyanmisaka return 0;
337*437bfbebSnyanmisaka }
338*437bfbebSnyanmisaka
hdr10plus_dynamic_data(HEVCContext * s,BitReadCtx_t * gb,RK_U32 size)339*437bfbebSnyanmisaka static RK_S32 hdr10plus_dynamic_data(HEVCContext *s, BitReadCtx_t *gb, RK_U32 size)
340*437bfbebSnyanmisaka {
341*437bfbebSnyanmisaka if (gb)
342*437bfbebSnyanmisaka mpp_hevc_fill_dynamic_meta(s, gb->data_, size, HDR10PLUS);
343*437bfbebSnyanmisaka return 0;
344*437bfbebSnyanmisaka }
345*437bfbebSnyanmisaka
user_data_registered_itu_t_t35(HEVCContext * s,BitReadCtx_t * gb,int size)346*437bfbebSnyanmisaka static RK_S32 user_data_registered_itu_t_t35(HEVCContext *s, BitReadCtx_t *gb, int size)
347*437bfbebSnyanmisaka {
348*437bfbebSnyanmisaka RK_S32 country_code, provider_code;
349*437bfbebSnyanmisaka RK_U16 provider_oriented_code;
350*437bfbebSnyanmisaka
351*437bfbebSnyanmisaka if (size < 3)
352*437bfbebSnyanmisaka return 0;
353*437bfbebSnyanmisaka
354*437bfbebSnyanmisaka READ_BITS(gb, 8, &country_code);
355*437bfbebSnyanmisaka if (country_code == 0xFF) {
356*437bfbebSnyanmisaka if (size < 1)
357*437bfbebSnyanmisaka return 0;
358*437bfbebSnyanmisaka
359*437bfbebSnyanmisaka SKIP_BITS(gb, 8);
360*437bfbebSnyanmisaka }
361*437bfbebSnyanmisaka
362*437bfbebSnyanmisaka /* usa country_code or china country_code */
363*437bfbebSnyanmisaka if (country_code != 0xB5 && country_code != 0x26) {
364*437bfbebSnyanmisaka mpp_log("Unsupported User Data Registered ITU-T T35 SEI message (country_code = %d)", country_code);
365*437bfbebSnyanmisaka return MPP_ERR_STREAM;
366*437bfbebSnyanmisaka }
367*437bfbebSnyanmisaka
368*437bfbebSnyanmisaka READ_BITS(gb, 16, &provider_code);
369*437bfbebSnyanmisaka READ_BITS(gb, 16, &provider_oriented_code);
370*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "country_code=%d provider_code=%d terminal_provider_code %d\n",
371*437bfbebSnyanmisaka country_code, provider_code, provider_oriented_code);
372*437bfbebSnyanmisaka switch (provider_code) {
373*437bfbebSnyanmisaka case 0x4: {/* cuva provider_code is 0x4 */
374*437bfbebSnyanmisaka vivid_display_info(s, gb, mpp_get_bits_left(gb) >> 3);
375*437bfbebSnyanmisaka } break;
376*437bfbebSnyanmisaka case 0x3c: {/* smpte2094_40 provider_code is 0x3c*/
377*437bfbebSnyanmisaka const RK_U16 smpte2094_40_provider_oriented_code = 0x0001;
378*437bfbebSnyanmisaka const RK_U8 smpte2094_40_application_identifier = 0x04;
379*437bfbebSnyanmisaka RK_U8 application_identifier;
380*437bfbebSnyanmisaka
381*437bfbebSnyanmisaka READ_BITS(gb, 8, &application_identifier);
382*437bfbebSnyanmisaka /* hdr10plus priverder_oriented_code is 0x0001, application_identifier is 0x04 */
383*437bfbebSnyanmisaka if (provider_oriented_code == smpte2094_40_provider_oriented_code &&
384*437bfbebSnyanmisaka application_identifier == smpte2094_40_application_identifier)
385*437bfbebSnyanmisaka hdr10plus_dynamic_data(s, gb, mpp_get_bits_left(gb) >> 3);
386*437bfbebSnyanmisaka } break;
387*437bfbebSnyanmisaka default:
388*437bfbebSnyanmisaka break;
389*437bfbebSnyanmisaka }
390*437bfbebSnyanmisaka
391*437bfbebSnyanmisaka return 0;
392*437bfbebSnyanmisaka
393*437bfbebSnyanmisaka __BITREAD_ERR:
394*437bfbebSnyanmisaka return MPP_ERR_STREAM;
395*437bfbebSnyanmisaka }
396*437bfbebSnyanmisaka
decode_nal_sei_alternative_transfer(HEVCContext * s,BitReadCtx_t * gb)397*437bfbebSnyanmisaka static RK_S32 decode_nal_sei_alternative_transfer(HEVCContext *s, BitReadCtx_t *gb)
398*437bfbebSnyanmisaka {
399*437bfbebSnyanmisaka HEVCSEIAlternativeTransfer *alternative_transfer = &s->alternative_transfer;
400*437bfbebSnyanmisaka RK_S32 val;
401*437bfbebSnyanmisaka
402*437bfbebSnyanmisaka READ_BITS(gb, 8, &val);
403*437bfbebSnyanmisaka alternative_transfer->present = 1;
404*437bfbebSnyanmisaka alternative_transfer->preferred_transfer_characteristics = val;
405*437bfbebSnyanmisaka s->is_hdr = 1;
406*437bfbebSnyanmisaka return 0;
407*437bfbebSnyanmisaka __BITREAD_ERR:
408*437bfbebSnyanmisaka return MPP_ERR_STREAM;
409*437bfbebSnyanmisaka }
410*437bfbebSnyanmisaka
decode_recovery_point(BitReadCtx_t * gb,HEVCContext * s)411*437bfbebSnyanmisaka MPP_RET decode_recovery_point(BitReadCtx_t *gb, HEVCContext *s)
412*437bfbebSnyanmisaka {
413*437bfbebSnyanmisaka RK_S32 val = -1;
414*437bfbebSnyanmisaka
415*437bfbebSnyanmisaka READ_SE(gb, &val);
416*437bfbebSnyanmisaka if (val > 32767 || val < -32767) {
417*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "recovery_poc_cnt %d, is out of range");
418*437bfbebSnyanmisaka return MPP_ERR_STREAM;
419*437bfbebSnyanmisaka }
420*437bfbebSnyanmisaka
421*437bfbebSnyanmisaka memset(&s->recovery, 0, sizeof(RecoveryPoint));
422*437bfbebSnyanmisaka s->recovery.valid_flag = 1;
423*437bfbebSnyanmisaka s->recovery.recovery_frame_cnt = val;
424*437bfbebSnyanmisaka
425*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "Recovery point: poc_cnt %d", s->recovery.recovery_frame_cnt);
426*437bfbebSnyanmisaka return MPP_OK;
427*437bfbebSnyanmisaka __BITREAD_ERR:
428*437bfbebSnyanmisaka return MPP_ERR_STREAM;
429*437bfbebSnyanmisaka }
430*437bfbebSnyanmisaka
mpp_hevc_decode_nal_sei(HEVCContext * s)431*437bfbebSnyanmisaka MPP_RET mpp_hevc_decode_nal_sei(HEVCContext *s)
432*437bfbebSnyanmisaka {
433*437bfbebSnyanmisaka MPP_RET ret = MPP_OK;
434*437bfbebSnyanmisaka BitReadCtx_t *gb = &s->HEVClc->gb;
435*437bfbebSnyanmisaka
436*437bfbebSnyanmisaka RK_S32 payload_type = 0;
437*437bfbebSnyanmisaka RK_S32 payload_size = 0;
438*437bfbebSnyanmisaka RK_S32 byte = 0xFF;
439*437bfbebSnyanmisaka RK_S32 i = 0;
440*437bfbebSnyanmisaka BitReadCtx_t payload_bitctx;
441*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "Decoding SEI\n");
442*437bfbebSnyanmisaka
443*437bfbebSnyanmisaka do {
444*437bfbebSnyanmisaka payload_type = 0;
445*437bfbebSnyanmisaka payload_size = 0;
446*437bfbebSnyanmisaka byte = 0xFF;
447*437bfbebSnyanmisaka while (byte == 0xFF) {
448*437bfbebSnyanmisaka if (gb->bytes_left_ < 2 || payload_type > INT_MAX - 255) {
449*437bfbebSnyanmisaka mpp_err("parse payload_type error: byte_left %d payload_type %d\n",
450*437bfbebSnyanmisaka gb->bytes_left_, payload_type);
451*437bfbebSnyanmisaka return MPP_ERR_STREAM;
452*437bfbebSnyanmisaka }
453*437bfbebSnyanmisaka
454*437bfbebSnyanmisaka READ_BITS(gb, 8, &byte);
455*437bfbebSnyanmisaka payload_type += byte;
456*437bfbebSnyanmisaka }
457*437bfbebSnyanmisaka byte = 0xFF;
458*437bfbebSnyanmisaka while (byte == 0xFF) {
459*437bfbebSnyanmisaka if ((RK_S32)gb->bytes_left_ < payload_size + 1) {
460*437bfbebSnyanmisaka mpp_err("parse payload_size error: byte_left %d payload_size %d\n",
461*437bfbebSnyanmisaka gb->bytes_left_, payload_size + 1);
462*437bfbebSnyanmisaka return MPP_ERR_STREAM;
463*437bfbebSnyanmisaka }
464*437bfbebSnyanmisaka
465*437bfbebSnyanmisaka READ_BITS(gb, 8, &byte);
466*437bfbebSnyanmisaka payload_size += byte;
467*437bfbebSnyanmisaka }
468*437bfbebSnyanmisaka
469*437bfbebSnyanmisaka if ((RK_S32)gb->bytes_left_ < payload_size) {
470*437bfbebSnyanmisaka mpp_err("parse payload_size error: byte_left %d payload_size %d\n",
471*437bfbebSnyanmisaka gb->bytes_left_, payload_size);
472*437bfbebSnyanmisaka return MPP_ERR_STREAM;
473*437bfbebSnyanmisaka }
474*437bfbebSnyanmisaka
475*437bfbebSnyanmisaka memset(&payload_bitctx, 0, sizeof(payload_bitctx));
476*437bfbebSnyanmisaka mpp_set_bitread_ctx(&payload_bitctx, s->HEVClc->gb.data_, payload_size);
477*437bfbebSnyanmisaka mpp_set_bitread_pseudo_code_type(&payload_bitctx, PSEUDO_CODE_H264_H265_SEI);
478*437bfbebSnyanmisaka
479*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "s->nal_unit_type %d payload_type %d payload_size %d\n", s->nal_unit_type, payload_type, payload_size);
480*437bfbebSnyanmisaka
481*437bfbebSnyanmisaka if (s->nal_unit_type == NAL_SEI_PREFIX) {
482*437bfbebSnyanmisaka if (payload_type == 256 /*&& s->decode_checksum_sei*/) {
483*437bfbebSnyanmisaka ret = decode_nal_sei_decoded_picture_hash(&payload_bitctx);
484*437bfbebSnyanmisaka } else if (payload_type == 45) {
485*437bfbebSnyanmisaka ret = decode_nal_sei_frame_packing_arrangement(s, &payload_bitctx);
486*437bfbebSnyanmisaka } else if (payload_type == 1) {
487*437bfbebSnyanmisaka ret = decode_pic_timing(s, &payload_bitctx);
488*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "Skipped PREFIX SEI %d\n", payload_type);
489*437bfbebSnyanmisaka } else if (payload_type == 4) {
490*437bfbebSnyanmisaka ret = user_data_registered_itu_t_t35(s, &payload_bitctx, payload_size);
491*437bfbebSnyanmisaka } else if (payload_type == 5) {
492*437bfbebSnyanmisaka ret = check_encoder_sei_info(&payload_bitctx, payload_size, &s->deny_flag);
493*437bfbebSnyanmisaka
494*437bfbebSnyanmisaka if (s->deny_flag)
495*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "Bitstream is encoded by special encoder.");
496*437bfbebSnyanmisaka } else if (payload_type == 129) {
497*437bfbebSnyanmisaka ret = active_parameter_sets(s, &payload_bitctx);
498*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "Skipped PREFIX SEI %d\n", payload_type);
499*437bfbebSnyanmisaka } else if (payload_type == 137) {
500*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "mastering_display_colour_volume in\n");
501*437bfbebSnyanmisaka ret = mastering_display_colour_volume(s, &payload_bitctx);
502*437bfbebSnyanmisaka s->is_hdr = 1;
503*437bfbebSnyanmisaka } else if (payload_type == 144) {
504*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "content_light_info in\n");
505*437bfbebSnyanmisaka ret = content_light_info(s, &payload_bitctx);
506*437bfbebSnyanmisaka } else if (payload_type == 143) {
507*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "colour_remapping_info in\n");
508*437bfbebSnyanmisaka ret = colour_remapping_info(&payload_bitctx);
509*437bfbebSnyanmisaka } else if (payload_type == 23) {
510*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "tone_mapping_info in\n");
511*437bfbebSnyanmisaka ret = tone_mapping_info(&payload_bitctx);
512*437bfbebSnyanmisaka } else if (payload_type == 6) {
513*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "recovery point in\n");
514*437bfbebSnyanmisaka s->max_ra = INT_MIN;
515*437bfbebSnyanmisaka ret = decode_recovery_point(&payload_bitctx, s);
516*437bfbebSnyanmisaka } else if (payload_type == 147) {
517*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "alternative_transfer in\n");
518*437bfbebSnyanmisaka ret = decode_nal_sei_alternative_transfer(s, &payload_bitctx);
519*437bfbebSnyanmisaka } else {
520*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "Skipped PREFIX SEI %d\n", payload_type);
521*437bfbebSnyanmisaka }
522*437bfbebSnyanmisaka } else { /* nal_unit_type == NAL_SEI_SUFFIX */
523*437bfbebSnyanmisaka if (payload_type == 132 /* && s->decode_checksum_sei */)
524*437bfbebSnyanmisaka ret = decode_nal_sei_decoded_picture_hash(&payload_bitctx);
525*437bfbebSnyanmisaka else {
526*437bfbebSnyanmisaka h265d_dbg(H265D_DBG_SEI, "Skipped SUFFIX SEI %d\n", payload_type);
527*437bfbebSnyanmisaka }
528*437bfbebSnyanmisaka }
529*437bfbebSnyanmisaka
530*437bfbebSnyanmisaka for (i = 0; i < payload_size; i++)
531*437bfbebSnyanmisaka SKIP_BITS(gb, 8);
532*437bfbebSnyanmisaka
533*437bfbebSnyanmisaka if (ret)
534*437bfbebSnyanmisaka return ret;
535*437bfbebSnyanmisaka } while (gb->bytes_left_ > 1 && gb->data_[0] != 0x80);
536*437bfbebSnyanmisaka
537*437bfbebSnyanmisaka return ret;
538*437bfbebSnyanmisaka
539*437bfbebSnyanmisaka __BITREAD_ERR:
540*437bfbebSnyanmisaka return MPP_ERR_STREAM;
541*437bfbebSnyanmisaka }
542