1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker * ih264e_sei.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * This file contains function definitions related to SEI NAL's header encoding
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker * ittiam
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker * - ih264e_put_sei_mdcv_params
34*495ae853SAndroid Build Coastguard Worker * - ih264e_put_sei_cll_params
35*495ae853SAndroid Build Coastguard Worker * - ih264e_put_sei_ave_params
36*495ae853SAndroid Build Coastguard Worker * - ih264e_put_sei_ccv_params
37*495ae853SAndroid Build Coastguard Worker * - ih264e_put_sei_msg
38*495ae853SAndroid Build Coastguard Worker * - ih264e_put_sei_sii_params
39*495ae853SAndroid Build Coastguard Worker *
40*495ae853SAndroid Build Coastguard Worker * @remarks
41*495ae853SAndroid Build Coastguard Worker * None
42*495ae853SAndroid Build Coastguard Worker *
43*495ae853SAndroid Build Coastguard Worker *******************************************************************************
44*495ae853SAndroid Build Coastguard Worker */
45*495ae853SAndroid Build Coastguard Worker
46*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
47*495ae853SAndroid Build Coastguard Worker /* File Includes */
48*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
49*495ae853SAndroid Build Coastguard Worker
50*495ae853SAndroid Build Coastguard Worker /* System include files */
51*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
52*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
53*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
54*495ae853SAndroid Build Coastguard Worker #include <string.h>
55*495ae853SAndroid Build Coastguard Worker #include <assert.h>
56*495ae853SAndroid Build Coastguard Worker
57*495ae853SAndroid Build Coastguard Worker /* User include files */
58*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
59*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
60*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
62*495ae853SAndroid Build Coastguard Worker #include "ih264_platform_macros.h"
63*495ae853SAndroid Build Coastguard Worker #include "ih264e_trace.h"
64*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
65*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
66*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
68*495ae853SAndroid Build Coastguard Worker #include "ih264_cabac_tables.h"
69*495ae853SAndroid Build Coastguard Worker #include "ih264e_cabac_structs.h"
70*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
71*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
72*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
73*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
74*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h"
75*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
76*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
77*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
78*495ae853SAndroid Build Coastguard Worker #include "ih264_inter_pred_filters.h"
79*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
80*495ae853SAndroid Build Coastguard Worker #include "ih264e_structs.h"
81*495ae853SAndroid Build Coastguard Worker #include "ih264e_encode_header.h"
82*495ae853SAndroid Build Coastguard Worker #include "ih264e_sei.h"
83*495ae853SAndroid Build Coastguard Worker
84*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
85*495ae853SAndroid Build Coastguard Worker /* Function Definitions */
86*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
87*495ae853SAndroid Build Coastguard Worker
88*495ae853SAndroid Build Coastguard Worker /**
89*495ae853SAndroid Build Coastguard Worker ******************************************************************************
90*495ae853SAndroid Build Coastguard Worker *
91*495ae853SAndroid Build Coastguard Worker * @brief Generates Mastering Display Color Volume (Supplemental Enhancement Information )
92*495ae853SAndroid Build Coastguard Worker *
93*495ae853SAndroid Build Coastguard Worker * @par Description
94*495ae853SAndroid Build Coastguard Worker * Parse Supplemental Enhancement Information
95*495ae853SAndroid Build Coastguard Worker *
96*495ae853SAndroid Build Coastguard Worker * @param[in] ps_bitstrm
97*495ae853SAndroid Build Coastguard Worker * pointer to bitstream context (handle)
98*495ae853SAndroid Build Coastguard Worker *
99*495ae853SAndroid Build Coastguard Worker * @param[in] ps_sei_mdcv
100*495ae853SAndroid Build Coastguard Worker * pointer to structure containing mdcv SEI data
101*495ae853SAndroid Build Coastguard Worker *
102*495ae853SAndroid Build Coastguard Worker * @return success or failure error code
103*495ae853SAndroid Build Coastguard Worker *
104*495ae853SAndroid Build Coastguard Worker ******************************************************************************
105*495ae853SAndroid Build Coastguard Worker */
ih264e_put_sei_mdcv_params(sei_mdcv_params_t * ps_sei_mdcv,bitstrm_t * ps_bitstrm)106*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_sei_mdcv_params(sei_mdcv_params_t *ps_sei_mdcv,
107*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstrm)
108*495ae853SAndroid Build Coastguard Worker {
109*495ae853SAndroid Build Coastguard Worker WORD32 return_status = IH264E_SUCCESS;
110*495ae853SAndroid Build Coastguard Worker UWORD8 u1_payload_size = 0;
111*495ae853SAndroid Build Coastguard Worker UWORD32 u4_count;
112*495ae853SAndroid Build Coastguard Worker
113*495ae853SAndroid Build Coastguard Worker if(ps_sei_mdcv == NULL)
114*495ae853SAndroid Build Coastguard Worker {
115*495ae853SAndroid Build Coastguard Worker return IH264E_FAIL;
116*495ae853SAndroid Build Coastguard Worker }
117*495ae853SAndroid Build Coastguard Worker
118*495ae853SAndroid Build Coastguard Worker u1_payload_size += (NUM_SEI_MDCV_PRIMARIES * 2); /* display primaries x */
119*495ae853SAndroid Build Coastguard Worker u1_payload_size += (NUM_SEI_MDCV_PRIMARIES * 2); /* display primaries y */
120*495ae853SAndroid Build Coastguard Worker u1_payload_size += 2; /* white point x */
121*495ae853SAndroid Build Coastguard Worker u1_payload_size += 2; /* white point y */
122*495ae853SAndroid Build Coastguard Worker u1_payload_size += 4; /* max display mastering luminance */
123*495ae853SAndroid Build Coastguard Worker u1_payload_size += 4; /* min display mastering luminance */
124*495ae853SAndroid Build Coastguard Worker
125*495ae853SAndroid Build Coastguard Worker /************************************************************************/
126*495ae853SAndroid Build Coastguard Worker /* PayloadSize : This is the size of the payload in bytes */
127*495ae853SAndroid Build Coastguard Worker /************************************************************************/
128*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status, "u1_payload_size");
129*495ae853SAndroid Build Coastguard Worker
130*495ae853SAndroid Build Coastguard Worker /*******************************************************************************/
131*495ae853SAndroid Build Coastguard Worker /* Put the mastering display color volume SEI parameters into the bitstream. */
132*495ae853SAndroid Build Coastguard Worker /*******************************************************************************/
133*495ae853SAndroid Build Coastguard Worker
134*495ae853SAndroid Build Coastguard Worker /* display primaries x */
135*495ae853SAndroid Build Coastguard Worker for(u4_count = 0; u4_count < NUM_SEI_MDCV_PRIMARIES; u4_count++)
136*495ae853SAndroid Build Coastguard Worker {
137*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_mdcv->au2_display_primaries_x[u4_count], 16,
138*495ae853SAndroid Build Coastguard Worker return_status, "u2_display_primaries_x");
139*495ae853SAndroid Build Coastguard Worker
140*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_mdcv->au2_display_primaries_y[u4_count], 16,
141*495ae853SAndroid Build Coastguard Worker return_status, "u2_display_primaries_y");
142*495ae853SAndroid Build Coastguard Worker }
143*495ae853SAndroid Build Coastguard Worker
144*495ae853SAndroid Build Coastguard Worker /* white point x */
145*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_mdcv->u2_white_point_x, 16, return_status, "u2_white point x");
146*495ae853SAndroid Build Coastguard Worker
147*495ae853SAndroid Build Coastguard Worker /* white point y */
148*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_mdcv->u2_white_point_y, 16, return_status, "u2_white point y");
149*495ae853SAndroid Build Coastguard Worker
150*495ae853SAndroid Build Coastguard Worker /* max display mastering luminance */
151*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_mdcv->u4_max_display_mastering_luminance, 32,
152*495ae853SAndroid Build Coastguard Worker return_status, "u4_max_display_mastering_luminance");
153*495ae853SAndroid Build Coastguard Worker
154*495ae853SAndroid Build Coastguard Worker /* min display mastering luminance */
155*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_mdcv->u4_min_display_mastering_luminance, 32,
156*495ae853SAndroid Build Coastguard Worker return_status, "u4_max_display_mastering_luminance");
157*495ae853SAndroid Build Coastguard Worker
158*495ae853SAndroid Build Coastguard Worker return (return_status);
159*495ae853SAndroid Build Coastguard Worker }
160*495ae853SAndroid Build Coastguard Worker
161*495ae853SAndroid Build Coastguard Worker /**
162*495ae853SAndroid Build Coastguard Worker ******************************************************************************
163*495ae853SAndroid Build Coastguard Worker *
164*495ae853SAndroid Build Coastguard Worker * @brief Stores content light level info in bitstream
165*495ae853SAndroid Build Coastguard Worker *
166*495ae853SAndroid Build Coastguard Worker * @par Description
167*495ae853SAndroid Build Coastguard Worker * Parse Supplemental Enhancement Information
168*495ae853SAndroid Build Coastguard Worker *
169*495ae853SAndroid Build Coastguard Worker * @param[in] ps_bitstrm
170*495ae853SAndroid Build Coastguard Worker * pointer to bitstream context (handle)
171*495ae853SAndroid Build Coastguard Worker *
172*495ae853SAndroid Build Coastguard Worker * @param[in] ps_sei_cll
173*495ae853SAndroid Build Coastguard Worker * Pinter to structure containing cll sei params
174*495ae853SAndroid Build Coastguard Worker *
175*495ae853SAndroid Build Coastguard Worker * @return success or failure error code
176*495ae853SAndroid Build Coastguard Worker *
177*495ae853SAndroid Build Coastguard Worker ******************************************************************************
178*495ae853SAndroid Build Coastguard Worker */
ih264e_put_sei_cll_params(sei_cll_params_t * ps_sei_cll,bitstrm_t * ps_bitstrm)179*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_sei_cll_params(sei_cll_params_t *ps_sei_cll,
180*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstrm)
181*495ae853SAndroid Build Coastguard Worker {
182*495ae853SAndroid Build Coastguard Worker WORD32 return_status = IH264E_SUCCESS;
183*495ae853SAndroid Build Coastguard Worker UWORD8 u1_payload_size = 0;
184*495ae853SAndroid Build Coastguard Worker
185*495ae853SAndroid Build Coastguard Worker if(ps_sei_cll == NULL)
186*495ae853SAndroid Build Coastguard Worker {
187*495ae853SAndroid Build Coastguard Worker return IH264E_FAIL;
188*495ae853SAndroid Build Coastguard Worker }
189*495ae853SAndroid Build Coastguard Worker
190*495ae853SAndroid Build Coastguard Worker u1_payload_size += 2; /* max pic average light level */
191*495ae853SAndroid Build Coastguard Worker u1_payload_size += 2; /* max content light level */
192*495ae853SAndroid Build Coastguard Worker
193*495ae853SAndroid Build Coastguard Worker /************************************************************************/
194*495ae853SAndroid Build Coastguard Worker /* PayloadSize : This is the size of the payload in bytes */
195*495ae853SAndroid Build Coastguard Worker /************************************************************************/
196*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status, "u1_payload_size");
197*495ae853SAndroid Build Coastguard Worker
198*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_cll->u2_max_content_light_level, 16,
199*495ae853SAndroid Build Coastguard Worker return_status, "u2_max_content_light_level");
200*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_cll->u2_max_pic_average_light_level, 16,
201*495ae853SAndroid Build Coastguard Worker return_status, "u2_max_pic_average_light_level");
202*495ae853SAndroid Build Coastguard Worker
203*495ae853SAndroid Build Coastguard Worker return (return_status);
204*495ae853SAndroid Build Coastguard Worker }
205*495ae853SAndroid Build Coastguard Worker
206*495ae853SAndroid Build Coastguard Worker /**
207*495ae853SAndroid Build Coastguard Worker ******************************************************************************
208*495ae853SAndroid Build Coastguard Worker *
209*495ae853SAndroid Build Coastguard Worker * @brief Stores ambient viewing environment info in bitstream
210*495ae853SAndroid Build Coastguard Worker *
211*495ae853SAndroid Build Coastguard Worker * @par Description
212*495ae853SAndroid Build Coastguard Worker * Parse Supplemental Enhancement Information
213*495ae853SAndroid Build Coastguard Worker *
214*495ae853SAndroid Build Coastguard Worker * @param[in] ps_bitstrm
215*495ae853SAndroid Build Coastguard Worker * pointer to bitstream context (handle)
216*495ae853SAndroid Build Coastguard Worker *
217*495ae853SAndroid Build Coastguard Worker * @param[in] ps_sei_ave
218*495ae853SAndroid Build Coastguard Worker * pointer to ambient viewing environment info
219*495ae853SAndroid Build Coastguard Worker *
220*495ae853SAndroid Build Coastguard Worker * @return success or failure error code
221*495ae853SAndroid Build Coastguard Worker *
222*495ae853SAndroid Build Coastguard Worker ******************************************************************************
223*495ae853SAndroid Build Coastguard Worker */
ih264e_put_sei_ave_params(sei_ave_params_t * ps_sei_ave,bitstrm_t * ps_bitstrm)224*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_sei_ave_params(sei_ave_params_t *ps_sei_ave,
225*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstrm)
226*495ae853SAndroid Build Coastguard Worker {
227*495ae853SAndroid Build Coastguard Worker WORD32 return_status = IH264E_SUCCESS;
228*495ae853SAndroid Build Coastguard Worker UWORD8 u1_payload_size = 0;
229*495ae853SAndroid Build Coastguard Worker
230*495ae853SAndroid Build Coastguard Worker if(ps_sei_ave == NULL)
231*495ae853SAndroid Build Coastguard Worker {
232*495ae853SAndroid Build Coastguard Worker return IH264E_FAIL;
233*495ae853SAndroid Build Coastguard Worker }
234*495ae853SAndroid Build Coastguard Worker
235*495ae853SAndroid Build Coastguard Worker u1_payload_size += 4; /* ambient illuminance */
236*495ae853SAndroid Build Coastguard Worker u1_payload_size += 2; /* ambient light x */
237*495ae853SAndroid Build Coastguard Worker u1_payload_size += 2; /* ambient light y */
238*495ae853SAndroid Build Coastguard Worker
239*495ae853SAndroid Build Coastguard Worker /************************************************************************/
240*495ae853SAndroid Build Coastguard Worker /* PayloadSize : This is the size of the payload in bytes */
241*495ae853SAndroid Build Coastguard Worker /************************************************************************/
242*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, u1_payload_size, 8, return_status, "u1_payload_size");
243*495ae853SAndroid Build Coastguard Worker
244*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ave->u4_ambient_illuminance, 32,
245*495ae853SAndroid Build Coastguard Worker return_status, "u4_ambient_illuminance");
246*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ave->u2_ambient_light_x, 16,
247*495ae853SAndroid Build Coastguard Worker return_status, "u2_ambient_light_x");
248*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ave->u2_ambient_light_y, 16,
249*495ae853SAndroid Build Coastguard Worker return_status, "u2_ambient_light_y");
250*495ae853SAndroid Build Coastguard Worker
251*495ae853SAndroid Build Coastguard Worker return (return_status);
252*495ae853SAndroid Build Coastguard Worker }
253*495ae853SAndroid Build Coastguard Worker
254*495ae853SAndroid Build Coastguard Worker /**
255*495ae853SAndroid Build Coastguard Worker ******************************************************************************
256*495ae853SAndroid Build Coastguard Worker *
257*495ae853SAndroid Build Coastguard Worker * @brief Generates Content Color Volume info (Supplemental Enhancement Information )
258*495ae853SAndroid Build Coastguard Worker *
259*495ae853SAndroid Build Coastguard Worker * @par Description
260*495ae853SAndroid Build Coastguard Worker * Parse Supplemental Enhancement Information
261*495ae853SAndroid Build Coastguard Worker *
262*495ae853SAndroid Build Coastguard Worker * @param[in] ps_bitstrm
263*495ae853SAndroid Build Coastguard Worker * pointer to bitstream context (handle)
264*495ae853SAndroid Build Coastguard Worker *
265*495ae853SAndroid Build Coastguard Worker * @param[in] ps_sei_ccv
266*495ae853SAndroid Build Coastguard Worker * pointer to structure containing CCV SEI data
267*495ae853SAndroid Build Coastguard Worker *
268*495ae853SAndroid Build Coastguard Worker * @return success or failure error code
269*495ae853SAndroid Build Coastguard Worker *
270*495ae853SAndroid Build Coastguard Worker ******************************************************************************
271*495ae853SAndroid Build Coastguard Worker */
ih264e_put_sei_ccv_params(sei_ccv_params_t * ps_sei_ccv,bitstrm_t * ps_bitstrm)272*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_sei_ccv_params(sei_ccv_params_t *ps_sei_ccv,
273*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstrm)
274*495ae853SAndroid Build Coastguard Worker {
275*495ae853SAndroid Build Coastguard Worker WORD32 return_status = IH264E_SUCCESS;
276*495ae853SAndroid Build Coastguard Worker UWORD16 u2_payload_bits = 0;
277*495ae853SAndroid Build Coastguard Worker UWORD8 u1_payload_bytes = 0;
278*495ae853SAndroid Build Coastguard Worker UWORD32 u4_count;
279*495ae853SAndroid Build Coastguard Worker
280*495ae853SAndroid Build Coastguard Worker if(ps_sei_ccv == NULL)
281*495ae853SAndroid Build Coastguard Worker {
282*495ae853SAndroid Build Coastguard Worker return IH264E_FAIL;
283*495ae853SAndroid Build Coastguard Worker }
284*495ae853SAndroid Build Coastguard Worker
285*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 1; /* ccv cancel flag */
286*495ae853SAndroid Build Coastguard Worker if(0 == (UWORD32)ps_sei_ccv->u1_ccv_cancel_flag)
287*495ae853SAndroid Build Coastguard Worker {
288*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 1; /* ccv persistence flag */
289*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 1; /* ccv primaries present flag */
290*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 1; /* ccv min luminance value present flag */
291*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 1; /* ccv max luminance value present flag */
292*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 1; /* ccv avg luminance value present flag */
293*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 2; /* ccv reserved zero 2bits */
294*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_primaries_present_flag)
295*495ae853SAndroid Build Coastguard Worker {
296*495ae853SAndroid Build Coastguard Worker u2_payload_bits += (NUM_SEI_CCV_PRIMARIES * 32); /* ccv primaries x[ c ] */
297*495ae853SAndroid Build Coastguard Worker u2_payload_bits += (NUM_SEI_CCV_PRIMARIES * 32); /* ccv primaries y[ c ] */
298*495ae853SAndroid Build Coastguard Worker }
299*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_min_luminance_value_present_flag)
300*495ae853SAndroid Build Coastguard Worker {
301*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 32; /* ccv min luminance value */
302*495ae853SAndroid Build Coastguard Worker }
303*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_max_luminance_value_present_flag)
304*495ae853SAndroid Build Coastguard Worker {
305*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 32; /* ccv max luminance value */
306*495ae853SAndroid Build Coastguard Worker }
307*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_avg_luminance_value_present_flag)
308*495ae853SAndroid Build Coastguard Worker {
309*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 32; /* ccv avg luminance value */
310*495ae853SAndroid Build Coastguard Worker }
311*495ae853SAndroid Build Coastguard Worker }
312*495ae853SAndroid Build Coastguard Worker
313*495ae853SAndroid Build Coastguard Worker u1_payload_bytes = (UWORD8)((u2_payload_bits + 7) >> 3);
314*495ae853SAndroid Build Coastguard Worker /************************************************************************/
315*495ae853SAndroid Build Coastguard Worker /* PayloadSize : This is the size of the payload in bytes */
316*495ae853SAndroid Build Coastguard Worker /************************************************************************/
317*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, u1_payload_bytes, 8, return_status, "u1_payload_bytes");
318*495ae853SAndroid Build Coastguard Worker
319*495ae853SAndroid Build Coastguard Worker /*******************************************************************************/
320*495ae853SAndroid Build Coastguard Worker /* Put the Content Color Volume SEI parameters into the bitstream. */
321*495ae853SAndroid Build Coastguard Worker /*******************************************************************************/
322*495ae853SAndroid Build Coastguard Worker
323*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u1_ccv_cancel_flag, 1,
324*495ae853SAndroid Build Coastguard Worker return_status, "u1_ccv_cancel_flag");
325*495ae853SAndroid Build Coastguard Worker
326*495ae853SAndroid Build Coastguard Worker if(0 == ps_sei_ccv->u1_ccv_cancel_flag)
327*495ae853SAndroid Build Coastguard Worker {
328*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u1_ccv_persistence_flag, 1,
329*495ae853SAndroid Build Coastguard Worker return_status, "u1_ccv_persistence_flag");
330*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u1_ccv_primaries_present_flag, 1,
331*495ae853SAndroid Build Coastguard Worker return_status, "u1_ccv_primaries_present_flag");
332*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u1_ccv_min_luminance_value_present_flag, 1,
333*495ae853SAndroid Build Coastguard Worker return_status, "u1_ccv_min_luminance_value_present_flag");
334*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u1_ccv_max_luminance_value_present_flag, 1,
335*495ae853SAndroid Build Coastguard Worker return_status, "u1_ccv_max_luminance_value_present_flag");
336*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u1_ccv_avg_luminance_value_present_flag, 1,
337*495ae853SAndroid Build Coastguard Worker return_status, "u1_ccv_avg_luminance_value_present_flag");
338*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u1_ccv_reserved_zero_2bits, 2,
339*495ae853SAndroid Build Coastguard Worker return_status, "u1_ccv_reserved_zero_2bits");
340*495ae853SAndroid Build Coastguard Worker
341*495ae853SAndroid Build Coastguard Worker /* ccv primaries */
342*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_primaries_present_flag)
343*495ae853SAndroid Build Coastguard Worker {
344*495ae853SAndroid Build Coastguard Worker for(u4_count = 0; u4_count < NUM_SEI_CCV_PRIMARIES; u4_count++)
345*495ae853SAndroid Build Coastguard Worker {
346*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->ai4_ccv_primaries_x[u4_count], 32,
347*495ae853SAndroid Build Coastguard Worker return_status, "i4_ccv_primaries_x");
348*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->ai4_ccv_primaries_y[u4_count], 32,
349*495ae853SAndroid Build Coastguard Worker return_status, "i4_ccv_primaries_y");
350*495ae853SAndroid Build Coastguard Worker }
351*495ae853SAndroid Build Coastguard Worker }
352*495ae853SAndroid Build Coastguard Worker
353*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_min_luminance_value_present_flag)
354*495ae853SAndroid Build Coastguard Worker {
355*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u4_ccv_min_luminance_value, 32,
356*495ae853SAndroid Build Coastguard Worker return_status, "u4_ccv_min_luminance_value");
357*495ae853SAndroid Build Coastguard Worker }
358*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_max_luminance_value_present_flag)
359*495ae853SAndroid Build Coastguard Worker {
360*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u4_ccv_max_luminance_value, 32,
361*495ae853SAndroid Build Coastguard Worker return_status, "u4_ccv_max_luminance_value");
362*495ae853SAndroid Build Coastguard Worker }
363*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_ccv->u1_ccv_avg_luminance_value_present_flag)
364*495ae853SAndroid Build Coastguard Worker {
365*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_ccv->u4_ccv_avg_luminance_value, 32,
366*495ae853SAndroid Build Coastguard Worker return_status, "u4_ccv_avg_luminance_value");
367*495ae853SAndroid Build Coastguard Worker }
368*495ae853SAndroid Build Coastguard Worker }
369*495ae853SAndroid Build Coastguard Worker
370*495ae853SAndroid Build Coastguard Worker return (return_status);
371*495ae853SAndroid Build Coastguard Worker }
372*495ae853SAndroid Build Coastguard Worker
373*495ae853SAndroid Build Coastguard Worker /**
374*495ae853SAndroid Build Coastguard Worker ******************************************************************************
375*495ae853SAndroid Build Coastguard Worker *
376*495ae853SAndroid Build Coastguard Worker * @brief Signal shutter interval info in the bitstream
377*495ae853SAndroid Build Coastguard Worker *
378*495ae853SAndroid Build Coastguard Worker * @par Description
379*495ae853SAndroid Build Coastguard Worker * Parse Supplemental Enhancement Information
380*495ae853SAndroid Build Coastguard Worker *
381*495ae853SAndroid Build Coastguard Worker * @param[in] ps_bitstrm
382*495ae853SAndroid Build Coastguard Worker * pointer to bitstream context (handle)
383*495ae853SAndroid Build Coastguard Worker *
384*495ae853SAndroid Build Coastguard Worker * @param[in] ps_sei_sii
385*495ae853SAndroid Build Coastguard Worker * pointer to shutter interval info
386*495ae853SAndroid Build Coastguard Worker *
387*495ae853SAndroid Build Coastguard Worker * @return success or failure error code
388*495ae853SAndroid Build Coastguard Worker *
389*495ae853SAndroid Build Coastguard Worker ******************************************************************************
390*495ae853SAndroid Build Coastguard Worker */
ih264e_put_sei_sii_params(sei_sii_params_t * ps_sei_sii,bitstrm_t * ps_bitstrm)391*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_sei_sii_params(sei_sii_params_t *ps_sei_sii, bitstrm_t *ps_bitstrm)
392*495ae853SAndroid Build Coastguard Worker {
393*495ae853SAndroid Build Coastguard Worker WORD32 return_status = IH264E_SUCCESS;
394*495ae853SAndroid Build Coastguard Worker UWORD16 u2_payload_bits = 0;
395*495ae853SAndroid Build Coastguard Worker UWORD8 u1_payload_bytes = 0;
396*495ae853SAndroid Build Coastguard Worker
397*495ae853SAndroid Build Coastguard Worker if(ps_sei_sii == NULL)
398*495ae853SAndroid Build Coastguard Worker {
399*495ae853SAndroid Build Coastguard Worker return IH264E_FAIL;
400*495ae853SAndroid Build Coastguard Worker }
401*495ae853SAndroid Build Coastguard Worker
402*495ae853SAndroid Build Coastguard Worker if(0 == ps_sei_sii->u4_sii_sub_layer_idx)
403*495ae853SAndroid Build Coastguard Worker {
404*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 1; /* shutter interval info present flag */
405*495ae853SAndroid Build Coastguard Worker
406*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_sii->u1_shutter_interval_info_present_flag)
407*495ae853SAndroid Build Coastguard Worker {
408*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 32; /* sii time scale */
409*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 1; /* fixed shutter interval within cvs flag */
410*495ae853SAndroid Build Coastguard Worker
411*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_sii->u1_fixed_shutter_interval_within_cvs_flag)
412*495ae853SAndroid Build Coastguard Worker {
413*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 32; /* sii num units in shutter interval */
414*495ae853SAndroid Build Coastguard Worker }
415*495ae853SAndroid Build Coastguard Worker else
416*495ae853SAndroid Build Coastguard Worker {
417*495ae853SAndroid Build Coastguard Worker int sizeofSubLayer;
418*495ae853SAndroid Build Coastguard Worker u2_payload_bits += 3; /* sii max sub layers minus1 */
419*495ae853SAndroid Build Coastguard Worker sizeofSubLayer =
420*495ae853SAndroid Build Coastguard Worker sizeof(ps_sei_sii->au4_sub_layer_num_units_in_shutter_interval) /
421*495ae853SAndroid Build Coastguard Worker sizeof(ps_sei_sii->au4_sub_layer_num_units_in_shutter_interval[0]);
422*495ae853SAndroid Build Coastguard Worker u2_payload_bits +=
423*495ae853SAndroid Build Coastguard Worker 32 * sizeofSubLayer; /* sii sub layer num units in shutter interval */
424*495ae853SAndroid Build Coastguard Worker }
425*495ae853SAndroid Build Coastguard Worker }
426*495ae853SAndroid Build Coastguard Worker }
427*495ae853SAndroid Build Coastguard Worker
428*495ae853SAndroid Build Coastguard Worker u1_payload_bytes = (UWORD8) ((u2_payload_bits + 7) >> 3);
429*495ae853SAndroid Build Coastguard Worker /************************************************************************/
430*495ae853SAndroid Build Coastguard Worker /* PayloadSize : This is the size of the payload in bytes */
431*495ae853SAndroid Build Coastguard Worker /************************************************************************/
432*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, u1_payload_bytes, 8, return_status, "u1_payload_bytes");
433*495ae853SAndroid Build Coastguard Worker
434*495ae853SAndroid Build Coastguard Worker /*******************************************************************************/
435*495ae853SAndroid Build Coastguard Worker /* Put the Shutter Interval Info SEI parameters into the bitstream. */
436*495ae853SAndroid Build Coastguard Worker /*******************************************************************************/
437*495ae853SAndroid Build Coastguard Worker
438*495ae853SAndroid Build Coastguard Worker PUT_BITS_UEV(ps_bitstrm, ps_sei_sii->u4_sii_sub_layer_idx, return_status,
439*495ae853SAndroid Build Coastguard Worker "u4_sii_sub_layer_idx");
440*495ae853SAndroid Build Coastguard Worker
441*495ae853SAndroid Build Coastguard Worker if(0 == ps_sei_sii->u4_sii_sub_layer_idx)
442*495ae853SAndroid Build Coastguard Worker {
443*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_sii->u1_shutter_interval_info_present_flag, 1, return_status,
444*495ae853SAndroid Build Coastguard Worker "u1_shutter_interval_info_present_flag");
445*495ae853SAndroid Build Coastguard Worker
446*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_sii->u1_shutter_interval_info_present_flag)
447*495ae853SAndroid Build Coastguard Worker {
448*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_sii->u4_sii_time_scale, 32, return_status,
449*495ae853SAndroid Build Coastguard Worker "u4_sii_time_scale");
450*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_sii->u1_fixed_shutter_interval_within_cvs_flag, 1,
451*495ae853SAndroid Build Coastguard Worker return_status, "u1_fixed_shutter_interval_within_cvs_flag");
452*495ae853SAndroid Build Coastguard Worker
453*495ae853SAndroid Build Coastguard Worker if(1 == ps_sei_sii->u1_fixed_shutter_interval_within_cvs_flag)
454*495ae853SAndroid Build Coastguard Worker {
455*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_sii->u4_sii_num_units_in_shutter_interval, 32,
456*495ae853SAndroid Build Coastguard Worker return_status, "u4_sii_num_units_in_shutter_interval");
457*495ae853SAndroid Build Coastguard Worker }
458*495ae853SAndroid Build Coastguard Worker else
459*495ae853SAndroid Build Coastguard Worker {
460*495ae853SAndroid Build Coastguard Worker int i;
461*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_sii->u1_sii_max_sub_layers_minus1, 3, return_status,
462*495ae853SAndroid Build Coastguard Worker "u1_sii_max_sub_layers_minus1");
463*495ae853SAndroid Build Coastguard Worker
464*495ae853SAndroid Build Coastguard Worker for(i = 0; i <= ps_sei_sii->u1_sii_max_sub_layers_minus1; i++)
465*495ae853SAndroid Build Coastguard Worker {
466*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, ps_sei_sii->au4_sub_layer_num_units_in_shutter_interval[i],
467*495ae853SAndroid Build Coastguard Worker 32, return_status, "au4_sub_layer_num_units_in_shutter_interval[i]");
468*495ae853SAndroid Build Coastguard Worker }
469*495ae853SAndroid Build Coastguard Worker }
470*495ae853SAndroid Build Coastguard Worker }
471*495ae853SAndroid Build Coastguard Worker }
472*495ae853SAndroid Build Coastguard Worker return (return_status);
473*495ae853SAndroid Build Coastguard Worker }
474*495ae853SAndroid Build Coastguard Worker
475*495ae853SAndroid Build Coastguard Worker /**
476*495ae853SAndroid Build Coastguard Worker ******************************************************************************
477*495ae853SAndroid Build Coastguard Worker *
478*495ae853SAndroid Build Coastguard Worker * @brief Generates SEI (Supplemental Enhancement Information )
479*495ae853SAndroid Build Coastguard Worker *
480*495ae853SAndroid Build Coastguard Worker * @par Description
481*495ae853SAndroid Build Coastguard Worker * Parse Supplemental Enhancement Information
482*495ae853SAndroid Build Coastguard Worker *
483*495ae853SAndroid Build Coastguard Worker * @param[in] e_payload_type
484*495ae853SAndroid Build Coastguard Worker * Determines the type of SEI msg
485*495ae853SAndroid Build Coastguard Worker *
486*495ae853SAndroid Build Coastguard Worker * @param[in] ps_bitstrm
487*495ae853SAndroid Build Coastguard Worker * pointer to bitstream context (handle)
488*495ae853SAndroid Build Coastguard Worker *
489*495ae853SAndroid Build Coastguard Worker * @param[in] ps_sei_params
490*495ae853SAndroid Build Coastguard Worker * pointer to structure containing SEI data
491*495ae853SAndroid Build Coastguard Worker * buffer period, recovery point, picture timing
492*495ae853SAndroid Build Coastguard Worker *
493*495ae853SAndroid Build Coastguard Worker * @return success or failure error code
494*495ae853SAndroid Build Coastguard Worker *
495*495ae853SAndroid Build Coastguard Worker ******************************************************************************
496*495ae853SAndroid Build Coastguard Worker */
ih264e_put_sei_msg(IH264_SEI_TYPE e_payload_type,sei_params_t * ps_sei_params,bitstrm_t * ps_bitstrm)497*495ae853SAndroid Build Coastguard Worker IH264E_ERROR_T ih264e_put_sei_msg(IH264_SEI_TYPE e_payload_type,
498*495ae853SAndroid Build Coastguard Worker sei_params_t *ps_sei_params,
499*495ae853SAndroid Build Coastguard Worker bitstrm_t *ps_bitstrm)
500*495ae853SAndroid Build Coastguard Worker {
501*495ae853SAndroid Build Coastguard Worker WORD32 return_status = IH264E_SUCCESS;
502*495ae853SAndroid Build Coastguard Worker
503*495ae853SAndroid Build Coastguard Worker /************************************************************************/
504*495ae853SAndroid Build Coastguard Worker /* PayloadType : Send in the SEI type in the stream */
505*495ae853SAndroid Build Coastguard Worker /************************************************************************/
506*495ae853SAndroid Build Coastguard Worker
507*495ae853SAndroid Build Coastguard Worker UWORD32 u4_payload_type = e_payload_type;
508*495ae853SAndroid Build Coastguard Worker
509*495ae853SAndroid Build Coastguard Worker while(u4_payload_type > 0xFF)
510*495ae853SAndroid Build Coastguard Worker {
511*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, 0xFF, 8, return_status, "payload");
512*495ae853SAndroid Build Coastguard Worker u4_payload_type -= 0xFF;
513*495ae853SAndroid Build Coastguard Worker }
514*495ae853SAndroid Build Coastguard Worker
515*495ae853SAndroid Build Coastguard Worker PUT_BITS(ps_bitstrm, (UWORD32)u4_payload_type, 8, return_status, "e_payload_type");
516*495ae853SAndroid Build Coastguard Worker
517*495ae853SAndroid Build Coastguard Worker switch(e_payload_type)
518*495ae853SAndroid Build Coastguard Worker {
519*495ae853SAndroid Build Coastguard Worker case IH264_SEI_MASTERING_DISP_COL_VOL :
520*495ae853SAndroid Build Coastguard Worker return_status = ih264e_put_sei_mdcv_params(&(ps_sei_params->s_sei_mdcv_params),
521*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
522*495ae853SAndroid Build Coastguard Worker break;
523*495ae853SAndroid Build Coastguard Worker
524*495ae853SAndroid Build Coastguard Worker case IH264_SEI_CONTENT_LIGHT_LEVEL_DATA :
525*495ae853SAndroid Build Coastguard Worker return_status = ih264e_put_sei_cll_params(&(ps_sei_params->s_sei_cll_params),
526*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
527*495ae853SAndroid Build Coastguard Worker break;
528*495ae853SAndroid Build Coastguard Worker
529*495ae853SAndroid Build Coastguard Worker case IH264_SEI_AMBIENT_VIEWING_ENVIRONMENT :
530*495ae853SAndroid Build Coastguard Worker return_status = ih264e_put_sei_ave_params(&(ps_sei_params->s_sei_ave_params),
531*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
532*495ae853SAndroid Build Coastguard Worker break;
533*495ae853SAndroid Build Coastguard Worker
534*495ae853SAndroid Build Coastguard Worker case IH264_SEI_CONTENT_COLOR_VOLUME :
535*495ae853SAndroid Build Coastguard Worker return_status = ih264e_put_sei_ccv_params(&(ps_sei_params->s_sei_ccv_params),
536*495ae853SAndroid Build Coastguard Worker ps_bitstrm);
537*495ae853SAndroid Build Coastguard Worker break;
538*495ae853SAndroid Build Coastguard Worker
539*495ae853SAndroid Build Coastguard Worker case IH264_SEI_SHUTTER_INTERVAL_INFO:
540*495ae853SAndroid Build Coastguard Worker return_status = ih264e_put_sei_sii_params(&(ps_sei_params->s_sei_sii_params), ps_bitstrm);
541*495ae853SAndroid Build Coastguard Worker
542*495ae853SAndroid Build Coastguard Worker break;
543*495ae853SAndroid Build Coastguard Worker
544*495ae853SAndroid Build Coastguard Worker default :
545*495ae853SAndroid Build Coastguard Worker return_status = IH264E_FAIL;
546*495ae853SAndroid Build Coastguard Worker }
547*495ae853SAndroid Build Coastguard Worker
548*495ae853SAndroid Build Coastguard Worker /* rbsp trailing bits */
549*495ae853SAndroid Build Coastguard Worker if((IH264E_SUCCESS == return_status) && (ps_bitstrm->i4_bits_left_in_cw & 0x7))
550*495ae853SAndroid Build Coastguard Worker return_status = ih264e_put_rbsp_trailing_bits(ps_bitstrm);
551*495ae853SAndroid Build Coastguard Worker
552*495ae853SAndroid Build Coastguard Worker return(return_status);
553*495ae853SAndroid Build Coastguard Worker }
554*495ae853SAndroid Build Coastguard Worker
555*495ae853SAndroid Build Coastguard Worker
556