xref: /rockchip-linux_mpp/mpp/codec/dec/h265/h265d_sei.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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