xref: /aosp_15_r20/external/libavc/examples/avcenc/main.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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 *  main.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker *  sample test application
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 * @remarks
33*495ae853SAndroid Build Coastguard Worker *  none
34*495ae853SAndroid Build Coastguard Worker *
35*495ae853SAndroid Build Coastguard Worker *******************************************************************************
36*495ae853SAndroid Build Coastguard Worker */
37*495ae853SAndroid Build Coastguard Worker 
38*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
39*495ae853SAndroid Build Coastguard Worker /* File Includes                                                             */
40*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
41*495ae853SAndroid Build Coastguard Worker 
42*495ae853SAndroid Build Coastguard Worker /* System include files */
43*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
44*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
45*495ae853SAndroid Build Coastguard Worker #include <stddef.h>
46*495ae853SAndroid Build Coastguard Worker #include <assert.h>
47*495ae853SAndroid Build Coastguard Worker #include <string.h>
48*495ae853SAndroid Build Coastguard Worker #include <stdbool.h>
49*495ae853SAndroid Build Coastguard Worker 
50*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
51*495ae853SAndroid Build Coastguard Worker #include "windows.h"
52*495ae853SAndroid Build Coastguard Worker #else
53*495ae853SAndroid Build Coastguard Worker #include <sys/time.h>
54*495ae853SAndroid Build Coastguard Worker #endif
55*495ae853SAndroid Build Coastguard Worker 
56*495ae853SAndroid Build Coastguard Worker /* User include files */
57*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
58*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
59*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264e.h"
61*495ae853SAndroid Build Coastguard Worker #include "app.h"
62*495ae853SAndroid Build Coastguard Worker #include "psnr.h"
63*495ae853SAndroid Build Coastguard Worker 
64*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
65*495ae853SAndroid Build Coastguard Worker /* Enums                                                                     */
66*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
67*495ae853SAndroid Build Coastguard Worker typedef enum
68*495ae853SAndroid Build Coastguard Worker {
69*495ae853SAndroid Build Coastguard Worker     INVALID,
70*495ae853SAndroid Build Coastguard Worker     HELP,
71*495ae853SAndroid Build Coastguard Worker     INPUT_FILE,
72*495ae853SAndroid Build Coastguard Worker     OUTPUT_FILE,
73*495ae853SAndroid Build Coastguard Worker     RECON_FILE,
74*495ae853SAndroid Build Coastguard Worker     RECON_ENABLE,
75*495ae853SAndroid Build Coastguard Worker     CHKSUM_ENABLE,
76*495ae853SAndroid Build Coastguard Worker     CHKSUM_FILE,
77*495ae853SAndroid Build Coastguard Worker     INPUT_CHROMA_FORMAT,
78*495ae853SAndroid Build Coastguard Worker     RECON_CHROMA_FORMAT,
79*495ae853SAndroid Build Coastguard Worker     MAX_WD,
80*495ae853SAndroid Build Coastguard Worker     MAX_HT,
81*495ae853SAndroid Build Coastguard Worker     WD,
82*495ae853SAndroid Build Coastguard Worker     HT,
83*495ae853SAndroid Build Coastguard Worker     MAX_LEVEL,
84*495ae853SAndroid Build Coastguard Worker     ENC_SPEED,
85*495ae853SAndroid Build Coastguard Worker     ME_SPEED,
86*495ae853SAndroid Build Coastguard Worker     START_FRM,
87*495ae853SAndroid Build Coastguard Worker     NUM_FRMS,
88*495ae853SAndroid Build Coastguard Worker     MAX_FRAMERATE,
89*495ae853SAndroid Build Coastguard Worker     SRC_FRAMERATE,
90*495ae853SAndroid Build Coastguard Worker     TGT_FRAMERATE,
91*495ae853SAndroid Build Coastguard Worker     RC,
92*495ae853SAndroid Build Coastguard Worker     MAX_BITRATE,
93*495ae853SAndroid Build Coastguard Worker     BITRATE,
94*495ae853SAndroid Build Coastguard Worker     I_QP,
95*495ae853SAndroid Build Coastguard Worker     P_QP,
96*495ae853SAndroid Build Coastguard Worker     B_QP,
97*495ae853SAndroid Build Coastguard Worker     I_QP_MAX,
98*495ae853SAndroid Build Coastguard Worker     P_QP_MAX,
99*495ae853SAndroid Build Coastguard Worker     B_QP_MAX,
100*495ae853SAndroid Build Coastguard Worker     I_QP_MIN,
101*495ae853SAndroid Build Coastguard Worker     P_QP_MIN,
102*495ae853SAndroid Build Coastguard Worker     B_QP_MIN,
103*495ae853SAndroid Build Coastguard Worker     ENTROPY,
104*495ae853SAndroid Build Coastguard Worker     AIR,
105*495ae853SAndroid Build Coastguard Worker     AIR_REFRESH_PERIOD,
106*495ae853SAndroid Build Coastguard Worker     ARCH,
107*495ae853SAndroid Build Coastguard Worker     SOC,
108*495ae853SAndroid Build Coastguard Worker     NUMCORES,
109*495ae853SAndroid Build Coastguard Worker     PRE_ENC_ME,
110*495ae853SAndroid Build Coastguard Worker     PRE_ENC_IPE,
111*495ae853SAndroid Build Coastguard Worker     HPEL,
112*495ae853SAndroid Build Coastguard Worker     QPEL,
113*495ae853SAndroid Build Coastguard Worker     SRCH_RNG_X,
114*495ae853SAndroid Build Coastguard Worker     SRCH_RNG_Y,
115*495ae853SAndroid Build Coastguard Worker     I_INTERVAL,
116*495ae853SAndroid Build Coastguard Worker     IDR_INTERVAL,
117*495ae853SAndroid Build Coastguard Worker     CONSTRAINED_INTRA_PRED,
118*495ae853SAndroid Build Coastguard Worker     B_FRMS,
119*495ae853SAndroid Build Coastguard Worker     NUM_B_FRMS,
120*495ae853SAndroid Build Coastguard Worker     DISABLE_DBLK,
121*495ae853SAndroid Build Coastguard Worker     PROFILE,
122*495ae853SAndroid Build Coastguard Worker     FAST_SAD,
123*495ae853SAndroid Build Coastguard Worker     ALT_REF,
124*495ae853SAndroid Build Coastguard Worker     DISABLE_DEBLOCK_LEVEL,
125*495ae853SAndroid Build Coastguard Worker     PSNR,
126*495ae853SAndroid Build Coastguard Worker     SLICE_MODE,
127*495ae853SAndroid Build Coastguard Worker     SLICE_PARAM,
128*495ae853SAndroid Build Coastguard Worker     CONFIG,
129*495ae853SAndroid Build Coastguard Worker     LOOPBACK,
130*495ae853SAndroid Build Coastguard Worker     VBV_DELAY,
131*495ae853SAndroid Build Coastguard Worker     VBV_SIZE,
132*495ae853SAndroid Build Coastguard Worker     INTRA_4x4_ENABLE,
133*495ae853SAndroid Build Coastguard Worker     MB_INFO_FILE,
134*495ae853SAndroid Build Coastguard Worker     MB_INFO_TYPE,
135*495ae853SAndroid Build Coastguard Worker     PIC_INFO_FILE,
136*495ae853SAndroid Build Coastguard Worker     PIC_INFO_TYPE,
137*495ae853SAndroid Build Coastguard Worker } ARGUMENT_T;
138*495ae853SAndroid Build Coastguard Worker 
139*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
140*495ae853SAndroid Build Coastguard Worker /*  Structure definitions                                                    */
141*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
142*495ae853SAndroid Build Coastguard Worker 
143*495ae853SAndroid Build Coastguard Worker /**
144*495ae853SAndroid Build Coastguard Worker **************************************************************************
145*495ae853SAndroid Build Coastguard Worker * @brief argument mapping construct
146*495ae853SAndroid Build Coastguard Worker **************************************************************************
147*495ae853SAndroid Build Coastguard Worker */
148*495ae853SAndroid Build Coastguard Worker typedef struct
149*495ae853SAndroid Build Coastguard Worker {
150*495ae853SAndroid Build Coastguard Worker     CHAR argument_shortname[8];
151*495ae853SAndroid Build Coastguard Worker     CHAR argument_name[128];
152*495ae853SAndroid Build Coastguard Worker     ARGUMENT_T argument;
153*495ae853SAndroid Build Coastguard Worker     CHAR description[512];
154*495ae853SAndroid Build Coastguard Worker } argument_t;
155*495ae853SAndroid Build Coastguard Worker 
156*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
157*495ae853SAndroid Build Coastguard Worker /* Global definitions                                                        */
158*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
159*495ae853SAndroid Build Coastguard Worker 
160*495ae853SAndroid Build Coastguard Worker /**
161*495ae853SAndroid Build Coastguard Worker **************************************************************************
162*495ae853SAndroid Build Coastguard Worker * @brief list of supported arguments
163*495ae853SAndroid Build Coastguard Worker **************************************************************************
164*495ae853SAndroid Build Coastguard Worker */
165*495ae853SAndroid Build Coastguard Worker static const argument_t argument_mapping[] =
166*495ae853SAndroid Build Coastguard Worker {
167*495ae853SAndroid Build Coastguard Worker         { "--", "--help", HELP, "Print this help\n" },
168*495ae853SAndroid Build Coastguard Worker         { "-i", "--input", INPUT_FILE, "Input file\n" },
169*495ae853SAndroid Build Coastguard Worker         { "-o", "--output", OUTPUT_FILE, "Output file\n" },
170*495ae853SAndroid Build Coastguard Worker         { "--", "--recon_enable", RECON_ENABLE, "Recon enable flag\n" },
171*495ae853SAndroid Build Coastguard Worker         { "-r", "--recon", RECON_FILE, "Recon file \n" },
172*495ae853SAndroid Build Coastguard Worker         { "--", "--input_chroma_format", INPUT_CHROMA_FORMAT,
173*495ae853SAndroid Build Coastguard Worker                     "Input Chroma format Supported values YUV_420P, YUV_420SP_UV, YUV_420SP_VU\n" },
174*495ae853SAndroid Build Coastguard Worker         { "--", "--recon_chroma_format", RECON_CHROMA_FORMAT,
175*495ae853SAndroid Build Coastguard Worker                     "Recon Chroma format Supported values YUV_420P, YUV_420SP_UV, YUV_420SP_VU\n" },
176*495ae853SAndroid Build Coastguard Worker         { "-w", "--width", WD, "Width of input file\n" },
177*495ae853SAndroid Build Coastguard Worker         { "-h", "--height", HT, "Height of input file\n" },
178*495ae853SAndroid Build Coastguard Worker         { "--", "--start_frame", START_FRM, "Starting frame number\n" },
179*495ae853SAndroid Build Coastguard Worker         { "-f", "--num_frames", NUM_FRMS, "Number of frames to be encoded\n" },
180*495ae853SAndroid Build Coastguard Worker         { "--", "--rc", RC, "Rate control mode 0: Constant Qp, 1: Storage, 2: CBR non low delay \n" },
181*495ae853SAndroid Build Coastguard Worker         { "--", "--max_framerate", MAX_FRAMERATE, "Maximum frame rate \n" },
182*495ae853SAndroid Build Coastguard Worker         { "--", "--tgt_framerate", TGT_FRAMERATE, "Target frame rate \n" },
183*495ae853SAndroid Build Coastguard Worker         { "--", "--src_framerate", SRC_FRAMERATE, "Source frame rate \n" },
184*495ae853SAndroid Build Coastguard Worker         { "--", "--i_interval", I_INTERVAL, "Intra frame interval \n" },
185*495ae853SAndroid Build Coastguard Worker         { "--", "--idr_interval", IDR_INTERVAL, "IDR frame interval \n" },
186*495ae853SAndroid Build Coastguard Worker         { "--", "--constrained_intrapred", CONSTRAINED_INTRA_PRED, "Constrained IntraPrediction Flag \n" },
187*495ae853SAndroid Build Coastguard Worker         { "--", "--bframes", NUM_B_FRMS, "Maximum number of consecutive B frames \n" },
188*495ae853SAndroid Build Coastguard Worker         { "--", "--speed", ENC_SPEED, "Encoder speed preset 0 (slowest) and 100 (fastest)\n" },
189*495ae853SAndroid Build Coastguard Worker         { "--", "--me_speed", ME_SPEED, "Encoder speed preset 0 (slowest) and 100 (fastest)\n" },
190*495ae853SAndroid Build Coastguard Worker         { "--", "--fast_sad", FAST_SAD, "Flag for faster sad execution\n" },
191*495ae853SAndroid Build Coastguard Worker         { "--", "--alt_ref", ALT_REF , "Flag to enable alternate reference frames\n"},
192*495ae853SAndroid Build Coastguard Worker         { "--", "--hpel", HPEL, "Flag to enable/disable Quarter pel estimation \n" },
193*495ae853SAndroid Build Coastguard Worker         { "--", "--qpel", QPEL, "Flag to enable/disable Quarter pel estimation \n" },
194*495ae853SAndroid Build Coastguard Worker         { "--", "--disable_deblock_level", DISABLE_DEBLOCK_LEVEL,
195*495ae853SAndroid Build Coastguard Worker                    "Disable deblock level - 0 : Enables deblock completely, "
196*495ae853SAndroid Build Coastguard Worker                    "1: enables for I and 8th frame , 2: Enables for I only, "
197*495ae853SAndroid Build Coastguard Worker                    "3 : disables completely\n" },
198*495ae853SAndroid Build Coastguard Worker         { "--", "--search_range_x", SRCH_RNG_X, "Search range for X \n" },
199*495ae853SAndroid Build Coastguard Worker         { "--", "--search_range_y", SRCH_RNG_Y, "Search range for Y \n" },
200*495ae853SAndroid Build Coastguard Worker         { "--", "--psnr", PSNR, "Enable PSNR computation (Disable while benchmarking performance) \n" },
201*495ae853SAndroid Build Coastguard Worker         { "--", "--pre_enc_me", PRE_ENC_ME, "Flag to enable/disable Pre Enc Motion Estimation\n" },
202*495ae853SAndroid Build Coastguard Worker         { "--", "--pre_enc_ipe", PRE_ENC_IPE, "Flag to enable/disable Pre Enc Intra prediction Estimation\n" },
203*495ae853SAndroid Build Coastguard Worker         { "-n", "--num_cores", NUMCORES, "Number of cores to be used\n" },
204*495ae853SAndroid Build Coastguard Worker         { "--", "--adaptive_intra_refresh", AIR, "Adaptive Intra Refresh enable/disable\n"},
205*495ae853SAndroid Build Coastguard Worker         { "--", "--air_refresh_period", AIR_REFRESH_PERIOD,"adaptive intra refresh period\n"},
206*495ae853SAndroid Build Coastguard Worker         { "--", "--slice", SLICE_MODE, "Slice mode - 0 :No slice, 1: Bytes per slice, 2: MB/CTB per slice\n" },
207*495ae853SAndroid Build Coastguard Worker         { "--", "--slice_param", SLICE_PARAM, "Slice param value based on slice mode. Slice mode of 1 implies number of bytes per slice, 2 implies number of MBs/CTBs, for 0 value is neglected \n" },
208*495ae853SAndroid Build Coastguard Worker         { "--", "--max_wd", MAX_WD, "Maximum width (Default: 1920) \n" },
209*495ae853SAndroid Build Coastguard Worker         { "--", "--max_ht", MAX_HT, "Maximum height (Default: 1088)\n" },
210*495ae853SAndroid Build Coastguard Worker         { "--", "--max_level", MAX_LEVEL, "Maximum Level (Default: 50)\n" },
211*495ae853SAndroid Build Coastguard Worker         { "--", "--arch", ARCH, "Set Architecture. Supported values ARM_NONEON, ARM_A9Q, ARM_A7, ARM_A5, ARM_NEONINTR, X86_GENERIC, X86_SSSE3, X86_SSE4 \n" },
212*495ae853SAndroid Build Coastguard Worker         { "--", "--soc", SOC, "Set SOC. Supported values GENERIC\n" },
213*495ae853SAndroid Build Coastguard Worker         { "--", "--chksum", CHKSUM_FILE, "Save Check sum file for recon data\n" },
214*495ae853SAndroid Build Coastguard Worker         { "--", "--chksum_enable", CHKSUM_ENABLE, "Recon MD5 Checksum file\n"},
215*495ae853SAndroid Build Coastguard Worker         { "-c", "--config", CONFIG, "config file (Default: enc.cfg)\n" },
216*495ae853SAndroid Build Coastguard Worker         { "--", "--loopback", LOOPBACK, "Enable encoding in a loop\n" },
217*495ae853SAndroid Build Coastguard Worker         { "--", "--profile", PROFILE, "Profile mode: Supported values BASE, MAIN, HIGH\n" },
218*495ae853SAndroid Build Coastguard Worker         { "--", "--max_bitrate", MAX_BITRATE, "Max bitrate\n"},
219*495ae853SAndroid Build Coastguard Worker         { "--", "--bitrate", BITRATE, "Target bitrate\n"},
220*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_i", I_QP, "QP for I frames\n"},
221*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_p", P_QP, "QP for P frames\n"},
222*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_b", B_QP, "QP for B frames\n"},
223*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_i_max",I_QP_MAX, "Max QP for I frames\n"},
224*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_p_max", P_QP_MAX, "Max QP for P frames\n"},
225*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_b_max", B_QP_MAX, "Max QP for B frames\n"},
226*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_i_min", I_QP_MIN, "Min QP for I frames\n"},
227*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_p_min", P_QP_MIN, "Min QP for P frames\n"},
228*495ae853SAndroid Build Coastguard Worker         { "--", "--qp_b_min", B_QP_MIN, "Min QP for B frames\n"},
229*495ae853SAndroid Build Coastguard Worker         { "--", "--entropy", ENTROPY, "Entropy coding mode(0: CAVLC or 1: CABAC)\n"},
230*495ae853SAndroid Build Coastguard Worker         { "--", "--vbv_delay", VBV_DELAY, "VBV buffer delay\n"},
231*495ae853SAndroid Build Coastguard Worker         { "--", "--vbv_size", VBV_SIZE, "VBV buffer size\n"},
232*495ae853SAndroid Build Coastguard Worker         { "--", "--intra_4x4_enable", INTRA_4x4_ENABLE, "Intra 4x4 enable \n" },
233*495ae853SAndroid Build Coastguard Worker         { "--", "--mb_info_file", MB_INFO_FILE, "MB info file\n"},
234*495ae853SAndroid Build Coastguard Worker         { "--", "--mb_info_type", MB_INFO_TYPE, "MB info type\n"},
235*495ae853SAndroid Build Coastguard Worker         { "--", "--pic_info_file", PIC_INFO_FILE, "Pic info file\n"},
236*495ae853SAndroid Build Coastguard Worker         { "--", "--pic_info_type", PIC_INFO_TYPE, "Pic info type\n"},
237*495ae853SAndroid Build Coastguard Worker };
238*495ae853SAndroid Build Coastguard Worker 
239*495ae853SAndroid Build Coastguard Worker 
240*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
241*495ae853SAndroid Build Coastguard Worker /*  Function Definitions                                                     */
242*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
243*495ae853SAndroid Build Coastguard Worker 
244*495ae853SAndroid Build Coastguard Worker /**
245*495ae853SAndroid Build Coastguard Worker *******************************************************************************
246*495ae853SAndroid Build Coastguard Worker *
247*495ae853SAndroid Build Coastguard Worker * @brief Returns malloc data. Ideally should return aligned memory
248*495ae853SAndroid Build Coastguard Worker *
249*495ae853SAndroid Build Coastguard Worker * @param[in] alignment
250*495ae853SAndroid Build Coastguard Worker *  Alignment
251*495ae853SAndroid Build Coastguard Worker *
252*495ae853SAndroid Build Coastguard Worker * @param[in] size
253*495ae853SAndroid Build Coastguard Worker *  size
254*495ae853SAndroid Build Coastguard Worker *
255*495ae853SAndroid Build Coastguard Worker * @returns pointer to allocated memory
256*495ae853SAndroid Build Coastguard Worker *
257*495ae853SAndroid Build Coastguard Worker * @remarks none
258*495ae853SAndroid Build Coastguard Worker *
259*495ae853SAndroid Build Coastguard Worker *******************************************************************************
260*495ae853SAndroid Build Coastguard Worker */
261*495ae853SAndroid Build Coastguard Worker #if(defined X86) && (defined X86_MINGW)
262*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_malloc(WORD32 alignment,WORD32 size)263*495ae853SAndroid Build Coastguard Worker void * ih264a_aligned_malloc(WORD32 alignment, WORD32 size)
264*495ae853SAndroid Build Coastguard Worker {
265*495ae853SAndroid Build Coastguard Worker     return _aligned_malloc(size, alignment);
266*495ae853SAndroid Build Coastguard Worker }
267*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_free(void * pv_buf)268*495ae853SAndroid Build Coastguard Worker void ih264a_aligned_free(void *pv_buf)
269*495ae853SAndroid Build Coastguard Worker {
270*495ae853SAndroid Build Coastguard Worker     _aligned_free(pv_buf);
271*495ae853SAndroid Build Coastguard Worker     return;
272*495ae853SAndroid Build Coastguard Worker }
273*495ae853SAndroid Build Coastguard Worker 
274*495ae853SAndroid Build Coastguard Worker #elif IOS
275*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_malloc(WORD32 alignment,WORD32 size)276*495ae853SAndroid Build Coastguard Worker void * ih264a_aligned_malloc(WORD32 alignment, WORD32 size)
277*495ae853SAndroid Build Coastguard Worker {
278*495ae853SAndroid Build Coastguard Worker     return malloc(size);
279*495ae853SAndroid Build Coastguard Worker }
280*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_free(void * pv_buf)281*495ae853SAndroid Build Coastguard Worker void ih264a_aligned_free(void *pv_buf)
282*495ae853SAndroid Build Coastguard Worker {
283*495ae853SAndroid Build Coastguard Worker     free(pv_buf);
284*495ae853SAndroid Build Coastguard Worker     return;
285*495ae853SAndroid Build Coastguard Worker }
286*495ae853SAndroid Build Coastguard Worker 
287*495ae853SAndroid Build Coastguard Worker #else
288*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_malloc(WORD32 alignment,WORD32 size)289*495ae853SAndroid Build Coastguard Worker void * ih264a_aligned_malloc(WORD32 alignment, WORD32 size)
290*495ae853SAndroid Build Coastguard Worker {
291*495ae853SAndroid Build Coastguard Worker     void *buf = NULL;
292*495ae853SAndroid Build Coastguard Worker     if (0 != posix_memalign(&buf, alignment, size))
293*495ae853SAndroid Build Coastguard Worker     {
294*495ae853SAndroid Build Coastguard Worker         return NULL;
295*495ae853SAndroid Build Coastguard Worker     }
296*495ae853SAndroid Build Coastguard Worker     return buf;
297*495ae853SAndroid Build Coastguard Worker }
298*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_free(void * pv_buf)299*495ae853SAndroid Build Coastguard Worker void ih264a_aligned_free(void *pv_buf)
300*495ae853SAndroid Build Coastguard Worker {
301*495ae853SAndroid Build Coastguard Worker     free(pv_buf);
302*495ae853SAndroid Build Coastguard Worker     return;
303*495ae853SAndroid Build Coastguard Worker }
304*495ae853SAndroid Build Coastguard Worker 
305*495ae853SAndroid Build Coastguard Worker #endif
306*495ae853SAndroid Build Coastguard Worker 
307*495ae853SAndroid Build Coastguard Worker /**
308*495ae853SAndroid Build Coastguard Worker *******************************************************************************
309*495ae853SAndroid Build Coastguard Worker *
310*495ae853SAndroid Build Coastguard Worker * @brief handles unrecoverable errors. Prints error message to console and exits.
311*495ae853SAndroid Build Coastguard Worker *
312*495ae853SAndroid Build Coastguard Worker * @param[in] pc_err_message
313*495ae853SAndroid Build Coastguard Worker *  error message
314*495ae853SAndroid Build Coastguard Worker *
315*495ae853SAndroid Build Coastguard Worker * @returns none
316*495ae853SAndroid Build Coastguard Worker *
317*495ae853SAndroid Build Coastguard Worker *******************************************************************************
318*495ae853SAndroid Build Coastguard Worker */
codec_exit(CHAR * pc_err_message)319*495ae853SAndroid Build Coastguard Worker void codec_exit(CHAR *pc_err_message)
320*495ae853SAndroid Build Coastguard Worker {
321*495ae853SAndroid Build Coastguard Worker     printf("%s\n", pc_err_message);
322*495ae853SAndroid Build Coastguard Worker     exit(-1);
323*495ae853SAndroid Build Coastguard Worker }
324*495ae853SAndroid Build Coastguard Worker 
325*495ae853SAndroid Build Coastguard Worker /**
326*495ae853SAndroid Build Coastguard Worker *******************************************************************************
327*495ae853SAndroid Build Coastguard Worker *
328*495ae853SAndroid Build Coastguard Worker * @brief Maps input string to color format
329*495ae853SAndroid Build Coastguard Worker *
330*495ae853SAndroid Build Coastguard Worker * @param[in] value
331*495ae853SAndroid Build Coastguard Worker *  string
332*495ae853SAndroid Build Coastguard Worker *
333*495ae853SAndroid Build Coastguard Worker * @returns color format ID
334*495ae853SAndroid Build Coastguard Worker *
335*495ae853SAndroid Build Coastguard Worker * @remarks If the input string is not recognized, display a message and choose
336*495ae853SAndroid Build Coastguard Worker *  YUV420P as color format
337*495ae853SAndroid Build Coastguard Worker *
338*495ae853SAndroid Build Coastguard Worker *******************************************************************************
339*495ae853SAndroid Build Coastguard Worker */
get_chroma_fmt(CHAR * value)340*495ae853SAndroid Build Coastguard Worker IV_COLOR_FORMAT_T get_chroma_fmt(CHAR *value)
341*495ae853SAndroid Build Coastguard Worker {
342*495ae853SAndroid Build Coastguard Worker     IV_COLOR_FORMAT_T e_chroma_format = IV_YUV_420P;
343*495ae853SAndroid Build Coastguard Worker 
344*495ae853SAndroid Build Coastguard Worker     if((strcmp(value, "YUV_420P")) == 0)
345*495ae853SAndroid Build Coastguard Worker         e_chroma_format = IV_YUV_420P;
346*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "YUV_422ILE")) == 0)
347*495ae853SAndroid Build Coastguard Worker         e_chroma_format = IV_YUV_422ILE;
348*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "RGB_565")) == 0)
349*495ae853SAndroid Build Coastguard Worker         e_chroma_format = IV_RGB_565;
350*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "RGBA_8888")) == 0)
351*495ae853SAndroid Build Coastguard Worker         e_chroma_format = IV_RGBA_8888;
352*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "YUV_420SP_UV")) == 0)
353*495ae853SAndroid Build Coastguard Worker         e_chroma_format = IV_YUV_420SP_UV;
354*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "YUV_420SP_VU")) == 0)
355*495ae853SAndroid Build Coastguard Worker         e_chroma_format = IV_YUV_420SP_VU;
356*495ae853SAndroid Build Coastguard Worker     else
357*495ae853SAndroid Build Coastguard Worker         printf("\nInvalid colour format setting it to IV_YUV_420P\n");
358*495ae853SAndroid Build Coastguard Worker 
359*495ae853SAndroid Build Coastguard Worker     return e_chroma_format;
360*495ae853SAndroid Build Coastguard Worker }
361*495ae853SAndroid Build Coastguard Worker 
362*495ae853SAndroid Build Coastguard Worker /**
363*495ae853SAndroid Build Coastguard Worker *******************************************************************************
364*495ae853SAndroid Build Coastguard Worker *
365*495ae853SAndroid Build Coastguard Worker * @brief Maps input string to a speed preset
366*495ae853SAndroid Build Coastguard Worker *
367*495ae853SAndroid Build Coastguard Worker * @param[in] value
368*495ae853SAndroid Build Coastguard Worker *  string
369*495ae853SAndroid Build Coastguard Worker *
370*495ae853SAndroid Build Coastguard Worker * @returns speed preset ID
371*495ae853SAndroid Build Coastguard Worker *
372*495ae853SAndroid Build Coastguard Worker * @remarks If the input string is not recognized, display a message and choose
373*495ae853SAndroid Build Coastguard Worker *  IVE_FASTEST as speed preset
374*495ae853SAndroid Build Coastguard Worker *
375*495ae853SAndroid Build Coastguard Worker *******************************************************************************
376*495ae853SAndroid Build Coastguard Worker */
get_speed_preset(CHAR * value)377*495ae853SAndroid Build Coastguard Worker IVE_SPEED_CONFIG get_speed_preset(CHAR *value)
378*495ae853SAndroid Build Coastguard Worker {
379*495ae853SAndroid Build Coastguard Worker     IVE_SPEED_CONFIG e_enc_speed_preset = IVE_FASTEST;
380*495ae853SAndroid Build Coastguard Worker 
381*495ae853SAndroid Build Coastguard Worker     if((strcmp(value, "CONFIG")) == 0)
382*495ae853SAndroid Build Coastguard Worker         e_enc_speed_preset = IVE_CONFIG;
383*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "SLOWEST")) == 0)
384*495ae853SAndroid Build Coastguard Worker         e_enc_speed_preset = IVE_SLOWEST;
385*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "NORMAL")) == 0)
386*495ae853SAndroid Build Coastguard Worker         e_enc_speed_preset = IVE_NORMAL;
387*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "FAST")) == 0)
388*495ae853SAndroid Build Coastguard Worker           e_enc_speed_preset = IVE_FAST;
389*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "HIGH_SPEED")) == 0)
390*495ae853SAndroid Build Coastguard Worker         e_enc_speed_preset = IVE_HIGH_SPEED;
391*495ae853SAndroid Build Coastguard Worker     else if((strcmp(value, "FASTEST")) == 0)
392*495ae853SAndroid Build Coastguard Worker         e_enc_speed_preset = IVE_FASTEST;
393*495ae853SAndroid Build Coastguard Worker     else
394*495ae853SAndroid Build Coastguard Worker         printf("\nInvalid speed preset, setting it to IVE_FASTEST\n");
395*495ae853SAndroid Build Coastguard Worker 
396*495ae853SAndroid Build Coastguard Worker     return e_enc_speed_preset;
397*495ae853SAndroid Build Coastguard Worker }
398*495ae853SAndroid Build Coastguard Worker 
399*495ae853SAndroid Build Coastguard Worker /**
400*495ae853SAndroid Build Coastguard Worker *******************************************************************************
401*495ae853SAndroid Build Coastguard Worker * @brief prints application usage
402*495ae853SAndroid Build Coastguard Worker *******************************************************************************
403*495ae853SAndroid Build Coastguard Worker */
print_usage(void)404*495ae853SAndroid Build Coastguard Worker void print_usage(void)
405*495ae853SAndroid Build Coastguard Worker {
406*495ae853SAndroid Build Coastguard Worker     WORD32 i = 0;
407*495ae853SAndroid Build Coastguard Worker     WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
408*495ae853SAndroid Build Coastguard Worker 
409*495ae853SAndroid Build Coastguard Worker     printf("\nUsage:\n");
410*495ae853SAndroid Build Coastguard Worker     while(i < num_entries)
411*495ae853SAndroid Build Coastguard Worker     {
412*495ae853SAndroid Build Coastguard Worker         printf("%-32s\t %s", argument_mapping[i].argument_name,
413*495ae853SAndroid Build Coastguard Worker                argument_mapping[i].description);
414*495ae853SAndroid Build Coastguard Worker         i++;
415*495ae853SAndroid Build Coastguard Worker     }
416*495ae853SAndroid Build Coastguard Worker }
417*495ae853SAndroid Build Coastguard Worker 
418*495ae853SAndroid Build Coastguard Worker /**
419*495ae853SAndroid Build Coastguard Worker *******************************************************************************
420*495ae853SAndroid Build Coastguard Worker *
421*495ae853SAndroid Build Coastguard Worker * @brief Maps input string to a argument
422*495ae853SAndroid Build Coastguard Worker *
423*495ae853SAndroid Build Coastguard Worker * @param[in] value
424*495ae853SAndroid Build Coastguard Worker *  string
425*495ae853SAndroid Build Coastguard Worker *
426*495ae853SAndroid Build Coastguard Worker * @returns argument ID
427*495ae853SAndroid Build Coastguard Worker *
428*495ae853SAndroid Build Coastguard Worker * @remarks If the input string is not recognized, returns INVALID
429*495ae853SAndroid Build Coastguard Worker *
430*495ae853SAndroid Build Coastguard Worker *******************************************************************************
431*495ae853SAndroid Build Coastguard Worker */
get_argument(CHAR * name)432*495ae853SAndroid Build Coastguard Worker ARGUMENT_T get_argument(CHAR *name)
433*495ae853SAndroid Build Coastguard Worker {
434*495ae853SAndroid Build Coastguard Worker     WORD32 i;
435*495ae853SAndroid Build Coastguard Worker     WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
436*495ae853SAndroid Build Coastguard Worker 
437*495ae853SAndroid Build Coastguard Worker     for(i = 0;i < num_entries;i++)
438*495ae853SAndroid Build Coastguard Worker     {
439*495ae853SAndroid Build Coastguard Worker         if((0 == strcmp(argument_mapping[i].argument_name, name)) ||
440*495ae853SAndroid Build Coastguard Worker            ((0 == strcmp(argument_mapping[i].argument_shortname, name)) &&
441*495ae853SAndroid Build Coastguard Worker             (0 != strcmp(argument_mapping[i].argument_shortname, "--"))))
442*495ae853SAndroid Build Coastguard Worker         {
443*495ae853SAndroid Build Coastguard Worker             return argument_mapping[i].argument;
444*495ae853SAndroid Build Coastguard Worker         }
445*495ae853SAndroid Build Coastguard Worker     }
446*495ae853SAndroid Build Coastguard Worker     return INVALID;
447*495ae853SAndroid Build Coastguard Worker }
448*495ae853SAndroid Build Coastguard Worker 
449*495ae853SAndroid Build Coastguard Worker /**
450*495ae853SAndroid Build Coastguard Worker *******************************************************************************
451*495ae853SAndroid Build Coastguard Worker *
452*495ae853SAndroid Build Coastguard Worker * @brief Parse input argument
453*495ae853SAndroid Build Coastguard Worker *
454*495ae853SAndroid Build Coastguard Worker * @param[in] ps_app_ctxt
455*495ae853SAndroid Build Coastguard Worker *  pointer to application context
456*495ae853SAndroid Build Coastguard Worker *
457*495ae853SAndroid Build Coastguard Worker * @param[in] argument
458*495ae853SAndroid Build Coastguard Worker *  argument string
459*495ae853SAndroid Build Coastguard Worker *
460*495ae853SAndroid Build Coastguard Worker * @param[in] value
461*495ae853SAndroid Build Coastguard Worker *  value corresponding to the argument
462*495ae853SAndroid Build Coastguard Worker *
463*495ae853SAndroid Build Coastguard Worker * @returns none
464*495ae853SAndroid Build Coastguard Worker *
465*495ae853SAndroid Build Coastguard Worker * @remarks none
466*495ae853SAndroid Build Coastguard Worker *
467*495ae853SAndroid Build Coastguard Worker *******************************************************************************
468*495ae853SAndroid Build Coastguard Worker */
parse_argument(app_ctxt_t * ps_app_ctxt,CHAR * argument,CHAR * value)469*495ae853SAndroid Build Coastguard Worker void parse_argument(app_ctxt_t *ps_app_ctxt, CHAR *argument, CHAR *value)
470*495ae853SAndroid Build Coastguard Worker {
471*495ae853SAndroid Build Coastguard Worker     ARGUMENT_T arg = get_argument(argument);
472*495ae853SAndroid Build Coastguard Worker 
473*495ae853SAndroid Build Coastguard Worker     switch(arg)
474*495ae853SAndroid Build Coastguard Worker     {
475*495ae853SAndroid Build Coastguard Worker         case HELP:
476*495ae853SAndroid Build Coastguard Worker             print_usage();
477*495ae853SAndroid Build Coastguard Worker             exit(-1);
478*495ae853SAndroid Build Coastguard Worker             break;
479*495ae853SAndroid Build Coastguard Worker 
480*495ae853SAndroid Build Coastguard Worker         case SLICE_MODE:
481*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_slice_mode);
482*495ae853SAndroid Build Coastguard Worker             break;
483*495ae853SAndroid Build Coastguard Worker 
484*495ae853SAndroid Build Coastguard Worker         case SLICE_PARAM:
485*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_slice_param);
486*495ae853SAndroid Build Coastguard Worker             break;
487*495ae853SAndroid Build Coastguard Worker 
488*495ae853SAndroid Build Coastguard Worker         case INPUT_FILE:
489*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctxt->ac_ip_fname);
490*495ae853SAndroid Build Coastguard Worker             break;
491*495ae853SAndroid Build Coastguard Worker 
492*495ae853SAndroid Build Coastguard Worker         case OUTPUT_FILE:
493*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctxt->ac_op_fname);
494*495ae853SAndroid Build Coastguard Worker             break;
495*495ae853SAndroid Build Coastguard Worker 
496*495ae853SAndroid Build Coastguard Worker         case RECON_FILE:
497*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctxt->ac_recon_fname);
498*495ae853SAndroid Build Coastguard Worker             break;
499*495ae853SAndroid Build Coastguard Worker 
500*495ae853SAndroid Build Coastguard Worker         case RECON_ENABLE:
501*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_recon_enable);
502*495ae853SAndroid Build Coastguard Worker             break;
503*495ae853SAndroid Build Coastguard Worker 
504*495ae853SAndroid Build Coastguard Worker         case CHKSUM_FILE:
505*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctxt->ac_chksum_fname);
506*495ae853SAndroid Build Coastguard Worker             break;
507*495ae853SAndroid Build Coastguard Worker 
508*495ae853SAndroid Build Coastguard Worker         case CHKSUM_ENABLE:
509*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_chksum_enable);
510*495ae853SAndroid Build Coastguard Worker             break;
511*495ae853SAndroid Build Coastguard Worker 
512*495ae853SAndroid Build Coastguard Worker         case MB_INFO_FILE:
513*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctxt->ac_mb_info_fname);
514*495ae853SAndroid Build Coastguard Worker             break;
515*495ae853SAndroid Build Coastguard Worker 
516*495ae853SAndroid Build Coastguard Worker         case MB_INFO_TYPE:
517*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_mb_info_type);
518*495ae853SAndroid Build Coastguard Worker             break;
519*495ae853SAndroid Build Coastguard Worker 
520*495ae853SAndroid Build Coastguard Worker         case PIC_INFO_FILE:
521*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctxt->ac_pic_info_fname);
522*495ae853SAndroid Build Coastguard Worker             break;
523*495ae853SAndroid Build Coastguard Worker 
524*495ae853SAndroid Build Coastguard Worker         case PIC_INFO_TYPE:
525*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_pic_info_type);
526*495ae853SAndroid Build Coastguard Worker             break;
527*495ae853SAndroid Build Coastguard Worker 
528*495ae853SAndroid Build Coastguard Worker         case INPUT_CHROMA_FORMAT:
529*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->e_inp_color_fmt = get_chroma_fmt(value);
530*495ae853SAndroid Build Coastguard Worker             break;
531*495ae853SAndroid Build Coastguard Worker 
532*495ae853SAndroid Build Coastguard Worker         case RECON_CHROMA_FORMAT:
533*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->e_recon_color_fmt = get_chroma_fmt(value);
534*495ae853SAndroid Build Coastguard Worker             break;
535*495ae853SAndroid Build Coastguard Worker 
536*495ae853SAndroid Build Coastguard Worker         case MAX_WD:
537*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_max_wd);
538*495ae853SAndroid Build Coastguard Worker             break;
539*495ae853SAndroid Build Coastguard Worker 
540*495ae853SAndroid Build Coastguard Worker         case MAX_HT:
541*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_max_ht);
542*495ae853SAndroid Build Coastguard Worker             break;
543*495ae853SAndroid Build Coastguard Worker 
544*495ae853SAndroid Build Coastguard Worker         case WD:
545*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_wd);
546*495ae853SAndroid Build Coastguard Worker             break;
547*495ae853SAndroid Build Coastguard Worker 
548*495ae853SAndroid Build Coastguard Worker         case HT:
549*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_ht);
550*495ae853SAndroid Build Coastguard Worker             break;
551*495ae853SAndroid Build Coastguard Worker 
552*495ae853SAndroid Build Coastguard Worker         case MAX_LEVEL:
553*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_max_level);
554*495ae853SAndroid Build Coastguard Worker             break;
555*495ae853SAndroid Build Coastguard Worker 
556*495ae853SAndroid Build Coastguard Worker         case ENC_SPEED:
557*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_enc_speed = get_speed_preset(value);
558*495ae853SAndroid Build Coastguard Worker             break;
559*495ae853SAndroid Build Coastguard Worker 
560*495ae853SAndroid Build Coastguard Worker         case ME_SPEED:
561*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_me_speed);
562*495ae853SAndroid Build Coastguard Worker             break;
563*495ae853SAndroid Build Coastguard Worker 
564*495ae853SAndroid Build Coastguard Worker         case START_FRM:
565*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_start_frm);
566*495ae853SAndroid Build Coastguard Worker             break;
567*495ae853SAndroid Build Coastguard Worker 
568*495ae853SAndroid Build Coastguard Worker         case NUM_FRMS:
569*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_max_num_frms);
570*495ae853SAndroid Build Coastguard Worker             break;
571*495ae853SAndroid Build Coastguard Worker 
572*495ae853SAndroid Build Coastguard Worker         case MAX_FRAMERATE:
573*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_max_frame_rate);
574*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->u4_max_frame_rate <= 0)
575*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->u4_max_frame_rate = DEFAULT_MAX_FRAMERATE;
576*495ae853SAndroid Build Coastguard Worker             break;
577*495ae853SAndroid Build Coastguard Worker 
578*495ae853SAndroid Build Coastguard Worker         case SRC_FRAMERATE:
579*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_src_frame_rate);
580*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->u4_src_frame_rate <= 0)
581*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->u4_src_frame_rate = DEFAULT_SRC_FRAME_RATE;
582*495ae853SAndroid Build Coastguard Worker             break;
583*495ae853SAndroid Build Coastguard Worker 
584*495ae853SAndroid Build Coastguard Worker         case TGT_FRAMERATE:
585*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_tgt_frame_rate);
586*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->u4_tgt_frame_rate <= 0)
587*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->u4_tgt_frame_rate = DEFAULT_TGT_FRAME_RATE;
588*495ae853SAndroid Build Coastguard Worker             break;
589*495ae853SAndroid Build Coastguard Worker 
590*495ae853SAndroid Build Coastguard Worker         case RC:
591*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_rc);
592*495ae853SAndroid Build Coastguard Worker             break;
593*495ae853SAndroid Build Coastguard Worker 
594*495ae853SAndroid Build Coastguard Worker         case MAX_BITRATE:
595*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_max_bitrate);
596*495ae853SAndroid Build Coastguard Worker             break;
597*495ae853SAndroid Build Coastguard Worker 
598*495ae853SAndroid Build Coastguard Worker         case BITRATE:
599*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_bitrate);
600*495ae853SAndroid Build Coastguard Worker             break;
601*495ae853SAndroid Build Coastguard Worker 
602*495ae853SAndroid Build Coastguard Worker         case I_QP:
603*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_i_qp);
604*495ae853SAndroid Build Coastguard Worker             break;
605*495ae853SAndroid Build Coastguard Worker 
606*495ae853SAndroid Build Coastguard Worker         case I_QP_MAX:
607*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_i_qp_max);
608*495ae853SAndroid Build Coastguard Worker             break;
609*495ae853SAndroid Build Coastguard Worker 
610*495ae853SAndroid Build Coastguard Worker         case I_QP_MIN:
611*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_i_qp_min);
612*495ae853SAndroid Build Coastguard Worker             break;
613*495ae853SAndroid Build Coastguard Worker 
614*495ae853SAndroid Build Coastguard Worker         case P_QP:
615*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_p_qp);
616*495ae853SAndroid Build Coastguard Worker             break;
617*495ae853SAndroid Build Coastguard Worker 
618*495ae853SAndroid Build Coastguard Worker         case P_QP_MAX:
619*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_p_qp_max);
620*495ae853SAndroid Build Coastguard Worker             break;
621*495ae853SAndroid Build Coastguard Worker 
622*495ae853SAndroid Build Coastguard Worker         case P_QP_MIN:
623*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_p_qp_min);
624*495ae853SAndroid Build Coastguard Worker             break;
625*495ae853SAndroid Build Coastguard Worker 
626*495ae853SAndroid Build Coastguard Worker         case B_QP:
627*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_b_qp);
628*495ae853SAndroid Build Coastguard Worker             break;
629*495ae853SAndroid Build Coastguard Worker 
630*495ae853SAndroid Build Coastguard Worker         case B_QP_MAX:
631*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_b_qp_max);
632*495ae853SAndroid Build Coastguard Worker             break;
633*495ae853SAndroid Build Coastguard Worker 
634*495ae853SAndroid Build Coastguard Worker         case B_QP_MIN:
635*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_b_qp_min);
636*495ae853SAndroid Build Coastguard Worker             break;
637*495ae853SAndroid Build Coastguard Worker 
638*495ae853SAndroid Build Coastguard Worker         case ENTROPY:
639*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_entropy_coding_mode);
640*495ae853SAndroid Build Coastguard Worker             break;
641*495ae853SAndroid Build Coastguard Worker 
642*495ae853SAndroid Build Coastguard Worker         case AIR:
643*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_air);
644*495ae853SAndroid Build Coastguard Worker             break;
645*495ae853SAndroid Build Coastguard Worker 
646*495ae853SAndroid Build Coastguard Worker         case ARCH:
647*495ae853SAndroid Build Coastguard Worker             if((strcmp(value, "ARM_NONEON")) == 0)
648*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_NONEON;
649*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_A9Q")) == 0)
650*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_A9Q;
651*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_A7")) == 0)
652*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_A7;
653*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_A5")) == 0)
654*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_A5;
655*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_NEONINTR")) == 0)
656*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_NEONINTR;
657*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_GENERIC")) == 0)
658*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_X86_GENERIC;
659*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_SSSE3")) == 0)
660*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_X86_SSSE3;
661*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_SSE42")) == 0)
662*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_X86_SSE42;
663*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_A53")) == 0)
664*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_A53;
665*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_A57")) == 0)
666*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_A57;
667*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_V8_NEON")) == 0)
668*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_V8_NEON;
669*495ae853SAndroid Build Coastguard Worker             else
670*495ae853SAndroid Build Coastguard Worker             {
671*495ae853SAndroid Build Coastguard Worker                 printf("\nInvalid Arch. Setting it to ARM_A9Q\n");
672*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_arch = ARCH_ARM_A9Q;
673*495ae853SAndroid Build Coastguard Worker             }
674*495ae853SAndroid Build Coastguard Worker             break;
675*495ae853SAndroid Build Coastguard Worker 
676*495ae853SAndroid Build Coastguard Worker         case SOC:
677*495ae853SAndroid Build Coastguard Worker             if((strcmp(value, "GENERIC")) == 0)
678*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_soc = SOC_GENERIC;
679*495ae853SAndroid Build Coastguard Worker             else
680*495ae853SAndroid Build Coastguard Worker             {
681*495ae853SAndroid Build Coastguard Worker                 printf("\nInvalid SOC. Setting it to SOC_GENERIC\n");
682*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_soc = SOC_GENERIC;
683*495ae853SAndroid Build Coastguard Worker             }
684*495ae853SAndroid Build Coastguard Worker             break;
685*495ae853SAndroid Build Coastguard Worker 
686*495ae853SAndroid Build Coastguard Worker         case NUMCORES:
687*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_num_cores);
688*495ae853SAndroid Build Coastguard Worker             break;
689*495ae853SAndroid Build Coastguard Worker 
690*495ae853SAndroid Build Coastguard Worker         case LOOPBACK:
691*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_loopback);
692*495ae853SAndroid Build Coastguard Worker             break;
693*495ae853SAndroid Build Coastguard Worker 
694*495ae853SAndroid Build Coastguard Worker         case PRE_ENC_ME:
695*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_pre_enc_me);
696*495ae853SAndroid Build Coastguard Worker             break;
697*495ae853SAndroid Build Coastguard Worker 
698*495ae853SAndroid Build Coastguard Worker         case PRE_ENC_IPE:
699*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_pre_enc_ipe);
700*495ae853SAndroid Build Coastguard Worker             break;
701*495ae853SAndroid Build Coastguard Worker 
702*495ae853SAndroid Build Coastguard Worker         case HPEL:
703*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_hpel);
704*495ae853SAndroid Build Coastguard Worker             break;
705*495ae853SAndroid Build Coastguard Worker 
706*495ae853SAndroid Build Coastguard Worker         case QPEL:
707*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_qpel);
708*495ae853SAndroid Build Coastguard Worker             break;
709*495ae853SAndroid Build Coastguard Worker 
710*495ae853SAndroid Build Coastguard Worker         case SRCH_RNG_X:
711*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_srch_rng_x);
712*495ae853SAndroid Build Coastguard Worker             break;
713*495ae853SAndroid Build Coastguard Worker 
714*495ae853SAndroid Build Coastguard Worker         case SRCH_RNG_Y:
715*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_srch_rng_y);
716*495ae853SAndroid Build Coastguard Worker             break;
717*495ae853SAndroid Build Coastguard Worker 
718*495ae853SAndroid Build Coastguard Worker         case I_INTERVAL:
719*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_i_interval);
720*495ae853SAndroid Build Coastguard Worker             break;
721*495ae853SAndroid Build Coastguard Worker 
722*495ae853SAndroid Build Coastguard Worker         case IDR_INTERVAL:
723*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_idr_interval);
724*495ae853SAndroid Build Coastguard Worker             break;
725*495ae853SAndroid Build Coastguard Worker 
726*495ae853SAndroid Build Coastguard Worker         case CONSTRAINED_INTRA_PRED:
727*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_constrained_intra_pred);
728*495ae853SAndroid Build Coastguard Worker             break;
729*495ae853SAndroid Build Coastguard Worker 
730*495ae853SAndroid Build Coastguard Worker         case NUM_B_FRMS:
731*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_num_bframes);
732*495ae853SAndroid Build Coastguard Worker             break;
733*495ae853SAndroid Build Coastguard Worker 
734*495ae853SAndroid Build Coastguard Worker         case DISABLE_DEBLOCK_LEVEL:
735*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_disable_deblk_level);
736*495ae853SAndroid Build Coastguard Worker             break;
737*495ae853SAndroid Build Coastguard Worker 
738*495ae853SAndroid Build Coastguard Worker         case VBV_DELAY:
739*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_vbv_buffer_delay);
740*495ae853SAndroid Build Coastguard Worker             break;
741*495ae853SAndroid Build Coastguard Worker 
742*495ae853SAndroid Build Coastguard Worker         case VBV_SIZE:
743*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_vbv_buf_size);
744*495ae853SAndroid Build Coastguard Worker             break;
745*495ae853SAndroid Build Coastguard Worker 
746*495ae853SAndroid Build Coastguard Worker         case FAST_SAD:
747*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_enable_fast_sad);
748*495ae853SAndroid Build Coastguard Worker             break;
749*495ae853SAndroid Build Coastguard Worker 
750*495ae853SAndroid Build Coastguard Worker         case ALT_REF:
751*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_enable_alt_ref);
752*495ae853SAndroid Build Coastguard Worker             break;
753*495ae853SAndroid Build Coastguard Worker 
754*495ae853SAndroid Build Coastguard Worker         case AIR_REFRESH_PERIOD:
755*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_air_refresh_period);
756*495ae853SAndroid Build Coastguard Worker             break;
757*495ae853SAndroid Build Coastguard Worker 
758*495ae853SAndroid Build Coastguard Worker         case PROFILE:
759*495ae853SAndroid Build Coastguard Worker             if((strcmp(value, "BASE")) == 0)
760*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_profile = IV_PROFILE_BASE;
761*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "MAIN")) == 0)
762*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_profile = IV_PROFILE_MAIN;
763*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "HIGH")) == 0)
764*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_profile = IV_PROFILE_HIGH;
765*495ae853SAndroid Build Coastguard Worker             else
766*495ae853SAndroid Build Coastguard Worker             {
767*495ae853SAndroid Build Coastguard Worker                 printf("\nInvalid profile. Setting it to BASE\n");
768*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->e_profile = IV_PROFILE_BASE;
769*495ae853SAndroid Build Coastguard Worker             }
770*495ae853SAndroid Build Coastguard Worker             break;
771*495ae853SAndroid Build Coastguard Worker 
772*495ae853SAndroid Build Coastguard Worker         case PSNR:
773*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_psnr_enable);
774*495ae853SAndroid Build Coastguard Worker             break;
775*495ae853SAndroid Build Coastguard Worker 
776*495ae853SAndroid Build Coastguard Worker         case INTRA_4x4_ENABLE:
777*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctxt->u4_enable_intra_4x4);
778*495ae853SAndroid Build Coastguard Worker             break;
779*495ae853SAndroid Build Coastguard Worker 
780*495ae853SAndroid Build Coastguard Worker         case INVALID:
781*495ae853SAndroid Build Coastguard Worker         default:
782*495ae853SAndroid Build Coastguard Worker             printf("Ignoring argument :  %s\n", argument);
783*495ae853SAndroid Build Coastguard Worker             break;
784*495ae853SAndroid Build Coastguard Worker     }
785*495ae853SAndroid Build Coastguard Worker }
786*495ae853SAndroid Build Coastguard Worker 
787*495ae853SAndroid Build Coastguard Worker /**
788*495ae853SAndroid Build Coastguard Worker *******************************************************************************
789*495ae853SAndroid Build Coastguard Worker *
790*495ae853SAndroid Build Coastguard Worker * @brief Parse config file
791*495ae853SAndroid Build Coastguard Worker *
792*495ae853SAndroid Build Coastguard Worker * @param[in] ps_app_ctxt
793*495ae853SAndroid Build Coastguard Worker *  pointer to application context
794*495ae853SAndroid Build Coastguard Worker *
795*495ae853SAndroid Build Coastguard Worker * @param[in] fp_cfg
796*495ae853SAndroid Build Coastguard Worker *  config file pointer
797*495ae853SAndroid Build Coastguard Worker *
798*495ae853SAndroid Build Coastguard Worker * @returns none
799*495ae853SAndroid Build Coastguard Worker *
800*495ae853SAndroid Build Coastguard Worker * @remarks none
801*495ae853SAndroid Build Coastguard Worker *
802*495ae853SAndroid Build Coastguard Worker *******************************************************************************
803*495ae853SAndroid Build Coastguard Worker */
read_cfg_file(app_ctxt_t * ps_app_ctxt,FILE * fp_cfg)804*495ae853SAndroid Build Coastguard Worker void read_cfg_file(app_ctxt_t *ps_app_ctxt, FILE *fp_cfg)
805*495ae853SAndroid Build Coastguard Worker {
806*495ae853SAndroid Build Coastguard Worker     while(1)
807*495ae853SAndroid Build Coastguard Worker     {
808*495ae853SAndroid Build Coastguard Worker         CHAR line[STRLENGTH] = {'\0'};
809*495ae853SAndroid Build Coastguard Worker         CHAR argument[STRLENGTH] = {'\0'};
810*495ae853SAndroid Build Coastguard Worker         CHAR value[STRLENGTH];
811*495ae853SAndroid Build Coastguard Worker         CHAR description[STRLENGTH];
812*495ae853SAndroid Build Coastguard Worker 
813*495ae853SAndroid Build Coastguard Worker         if(NULL == fgets(line, STRLENGTH, fp_cfg)) return;
814*495ae853SAndroid Build Coastguard Worker 
815*495ae853SAndroid Build Coastguard Worker         /* split string on whitespace */
816*495ae853SAndroid Build Coastguard Worker         sscanf(line, "%s %s %s", argument, value, description);
817*495ae853SAndroid Build Coastguard Worker         if(argument[0] == '\0')
818*495ae853SAndroid Build Coastguard Worker             continue;
819*495ae853SAndroid Build Coastguard Worker 
820*495ae853SAndroid Build Coastguard Worker         parse_argument(ps_app_ctxt, argument, value);
821*495ae853SAndroid Build Coastguard Worker     }
822*495ae853SAndroid Build Coastguard Worker }
823*495ae853SAndroid Build Coastguard Worker 
824*495ae853SAndroid Build Coastguard Worker /**
825*495ae853SAndroid Build Coastguard Worker *******************************************************************************
826*495ae853SAndroid Build Coastguard Worker *
827*495ae853SAndroid Build Coastguard Worker * @brief handles unrecoverable errors. Prints error message to console and exits.
828*495ae853SAndroid Build Coastguard Worker *
829*495ae853SAndroid Build Coastguard Worker * @param[in] pc_err_message
830*495ae853SAndroid Build Coastguard Worker *  error message
831*495ae853SAndroid Build Coastguard Worker *
832*495ae853SAndroid Build Coastguard Worker * @returns none
833*495ae853SAndroid Build Coastguard Worker *
834*495ae853SAndroid Build Coastguard Worker * @remarks none
835*495ae853SAndroid Build Coastguard Worker *
836*495ae853SAndroid Build Coastguard Worker *******************************************************************************
837*495ae853SAndroid Build Coastguard Worker */
invalid_argument_exit(CHAR * pc_err_message)838*495ae853SAndroid Build Coastguard Worker void invalid_argument_exit(CHAR *pc_err_message)
839*495ae853SAndroid Build Coastguard Worker {
840*495ae853SAndroid Build Coastguard Worker     print_usage();
841*495ae853SAndroid Build Coastguard Worker     codec_exit(pc_err_message);
842*495ae853SAndroid Build Coastguard Worker }
843*495ae853SAndroid Build Coastguard Worker 
844*495ae853SAndroid Build Coastguard Worker /**
845*495ae853SAndroid Build Coastguard Worker *******************************************************************************
846*495ae853SAndroid Build Coastguard Worker *
847*495ae853SAndroid Build Coastguard Worker * @brief validate configured params
848*495ae853SAndroid Build Coastguard Worker *
849*495ae853SAndroid Build Coastguard Worker * @param[in] ps_app_ctxt
850*495ae853SAndroid Build Coastguard Worker *  pointer to application context
851*495ae853SAndroid Build Coastguard Worker *
852*495ae853SAndroid Build Coastguard Worker * @returns none
853*495ae853SAndroid Build Coastguard Worker *
854*495ae853SAndroid Build Coastguard Worker * @remarks none
855*495ae853SAndroid Build Coastguard Worker *
856*495ae853SAndroid Build Coastguard Worker *******************************************************************************
857*495ae853SAndroid Build Coastguard Worker */
validate_params(app_ctxt_t * ps_app_ctxt)858*495ae853SAndroid Build Coastguard Worker void validate_params(app_ctxt_t *ps_app_ctxt)
859*495ae853SAndroid Build Coastguard Worker {
860*495ae853SAndroid Build Coastguard Worker     CHAR ac_error[STRLENGTH];
861*495ae853SAndroid Build Coastguard Worker 
862*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctxt->ac_ip_fname[0] == '\0')
863*495ae853SAndroid Build Coastguard Worker     {
864*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit("Specify input file");
865*495ae853SAndroid Build Coastguard Worker     }
866*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctxt->ac_op_fname[0] == '\0')
867*495ae853SAndroid Build Coastguard Worker     {
868*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit("Specify output file");
869*495ae853SAndroid Build Coastguard Worker     }
870*495ae853SAndroid Build Coastguard Worker     if((1 == ps_app_ctxt->u4_recon_enable) && (ps_app_ctxt->ac_recon_fname[0] == '\0'))
871*495ae853SAndroid Build Coastguard Worker     {
872*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit("Specify recon file");
873*495ae853SAndroid Build Coastguard Worker     }
874*495ae853SAndroid Build Coastguard Worker     if((1 == ps_app_ctxt->u4_chksum_enable) && (ps_app_ctxt->ac_chksum_fname[0] == '\0'))
875*495ae853SAndroid Build Coastguard Worker     {
876*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit("Specify checksum file");
877*495ae853SAndroid Build Coastguard Worker     }
878*495ae853SAndroid Build Coastguard Worker     if(0 >= (WORD32)ps_app_ctxt->u4_wd)
879*495ae853SAndroid Build Coastguard Worker     {
880*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Invalid width: %d", ps_app_ctxt->u4_wd);
881*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit(ac_error);
882*495ae853SAndroid Build Coastguard Worker     }
883*495ae853SAndroid Build Coastguard Worker     if(0 >= (WORD32)ps_app_ctxt->u4_ht)
884*495ae853SAndroid Build Coastguard Worker     {
885*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Invalid height: %d", ps_app_ctxt->u4_ht);
886*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit(ac_error);
887*495ae853SAndroid Build Coastguard Worker     }
888*495ae853SAndroid Build Coastguard Worker     if(0 == (WORD32)ps_app_ctxt->u4_max_num_frms)
889*495ae853SAndroid Build Coastguard Worker     {
890*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Invalid number of frames to be encoded: %d", ps_app_ctxt->u4_max_num_frms);
891*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit(ac_error);
892*495ae853SAndroid Build Coastguard Worker     }
893*495ae853SAndroid Build Coastguard Worker }
894*495ae853SAndroid Build Coastguard Worker 
895*495ae853SAndroid Build Coastguard Worker /**
896*495ae853SAndroid Build Coastguard Worker *******************************************************************************
897*495ae853SAndroid Build Coastguard Worker *
898*495ae853SAndroid Build Coastguard Worker * @brief initialize default params
899*495ae853SAndroid Build Coastguard Worker *
900*495ae853SAndroid Build Coastguard Worker * @param[in] ps_app_ctxt
901*495ae853SAndroid Build Coastguard Worker *  pointer to application context
902*495ae853SAndroid Build Coastguard Worker *
903*495ae853SAndroid Build Coastguard Worker * @returns none
904*495ae853SAndroid Build Coastguard Worker *
905*495ae853SAndroid Build Coastguard Worker * @remarks none
906*495ae853SAndroid Build Coastguard Worker *
907*495ae853SAndroid Build Coastguard Worker *******************************************************************************
908*495ae853SAndroid Build Coastguard Worker */
init_default_params(app_ctxt_t * ps_app_ctxt)909*495ae853SAndroid Build Coastguard Worker void init_default_params(app_ctxt_t *ps_app_ctxt)
910*495ae853SAndroid Build Coastguard Worker {
911*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->ps_enc = NULL;
912*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->ps_mem_rec = NULL;
913*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_num_mem_rec = DEFAULT_MEM_REC_CNT;
914*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_recon_enable = DEFAULT_RECON_ENABLE;
915*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_chksum_enable = DEFAULT_CHKSUM_ENABLE;
916*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_mb_info_type = 0;
917*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_pic_info_type = 0;
918*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_mb_info_size = 0;
919*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_pic_info_size = 0;
920*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_start_frm = DEFAULT_START_FRM;
921*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_max_num_frms = DEFAULT_NUM_FRMS;
922*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_total_bytes = 0;
923*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_pics_cnt = 0;
924*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->e_inp_color_fmt = DEFAULT_INP_COLOR_FMT;
925*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->e_recon_color_fmt = DEFAULT_RECON_COLOR_FMT;
926*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->e_arch = ARCH_ARM_A9Q;
927*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->e_soc = SOC_GENERIC;
928*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->header_generated = 0;
929*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->pv_codec_obj = NULL;
930*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_num_cores = DEFAULT_NUM_CORES;
931*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_pre_enc_me = 0;
932*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_pre_enc_ipe = 0;
933*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->ac_ip_fname[0] = '\0';
934*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->ac_op_fname[0] = '\0';
935*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->ac_recon_fname[0] = '\0';
936*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->ac_chksum_fname[0] = '\0';
937*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->ac_mb_info_fname[0] = '\0';
938*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_ip = NULL;
939*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_op = NULL;
940*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_recon = NULL;
941*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_chksum = NULL;
942*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_psnr_ip = NULL;
943*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_mb_info = NULL;
944*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_pic_info = NULL;
945*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_loopback = DEFAULT_LOOPBACK;
946*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_max_frame_rate = DEFAULT_MAX_FRAMERATE;
947*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_src_frame_rate = DEFAULT_SRC_FRAME_RATE;
948*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_tgt_frame_rate = DEFAULT_TGT_FRAME_RATE;
949*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_max_wd = DEFAULT_MAX_WD;
950*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_max_ht = DEFAULT_MAX_HT;
951*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_max_level = DEFAULT_MAX_LEVEL;
952*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_strd = DEFAULT_STRIDE;
953*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_wd = DEFAULT_WD;
954*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_ht = DEFAULT_HT;
955*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_psnr_enable = DEFAULT_PSNR_ENABLE;
956*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_enc_speed = IVE_FASTEST;
957*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_me_speed = DEFAULT_ME_SPEED;
958*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_enable_fast_sad = DEFAULT_ENABLE_FAST_SAD;
959*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_enable_alt_ref = DEFAULT_ENABLE_ALT_REF;
960*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_rc = DEFAULT_RC;
961*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_max_bitrate = DEFAULT_MAX_BITRATE;
962*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_bitrate = DEFAULT_BITRATE;
963*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_i_qp = DEFAULT_I_QP;
964*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_i_qp_max = DEFAULT_QP_MAX;
965*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_i_qp_min = DEFAULT_QP_MIN;
966*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_p_qp = DEFAULT_P_QP;
967*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_p_qp_max = DEFAULT_QP_MAX;
968*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_p_qp_min = DEFAULT_QP_MIN;
969*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_b_qp = DEFAULT_B_QP;
970*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_b_qp_max = DEFAULT_QP_MAX;
971*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_b_qp_min = DEFAULT_QP_MIN;
972*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_air = DEFAULT_AIR;
973*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_air_refresh_period = DEFAULT_AIR_REFRESH_PERIOD;
974*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_srch_rng_x = DEFAULT_SRCH_RNG_X;
975*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_srch_rng_y = DEFAULT_SRCH_RNG_Y;
976*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_i_interval = DEFAULT_I_INTERVAL;
977*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_idr_interval = DEFAULT_IDR_INTERVAL;
978*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_constrained_intra_pred = DEFAULT_CONSTRAINED_INTRAPRED;
979*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_num_bframes = DEFAULT_NUM_BFRAMES;
980*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_disable_deblk_level = DEFAULT_DISABLE_DEBLK_LEVEL;
981*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_hpel = DEFAULT_HPEL;
982*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_qpel = DEFAULT_QPEL;
983*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_enable_intra_4x4 = DEFAULT_I4;
984*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->e_profile = DEFAULT_EPROFILE;
985*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_slice_mode = DEFAULT_SLICE_MODE;
986*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_slice_param = DEFAULT_SLICE_PARAM;
987*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_entropy_coding_mode = DEFAULT_ENTROPY_CODING_MODE;
988*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->pv_input_thread_handle = NULL;
989*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->pv_output_thread_handle = NULL;
990*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->pv_recon_thread_handle = NULL;
991*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->adbl_psnr[0] = 0.0;
992*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->adbl_psnr[1] = 0.0;
993*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->adbl_psnr[2] = 0.0;
994*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_psnr_cnt = 0;
995*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->pu1_psnr_buf = NULL;
996*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_psnr_buf_size = 0;
997*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_vbv_buffer_delay = 1000;
998*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_vbv_buf_size = 0;
999*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->avg_time = 0;
1000*495ae853SAndroid Build Coastguard Worker }
1001*495ae853SAndroid Build Coastguard Worker 
1002*495ae853SAndroid Build Coastguard Worker /**
1003*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1004*495ae853SAndroid Build Coastguard Worker * @brief configure input dimensions
1005*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1006*495ae853SAndroid Build Coastguard Worker */
set_dimensions(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1007*495ae853SAndroid Build Coastguard Worker void set_dimensions(app_ctxt_t *ps_app_ctxt,
1008*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_low,
1009*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_high)
1010*495ae853SAndroid Build Coastguard Worker {
1011*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_dimensions_ip_t s_frame_dimensions_ip;
1012*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_dimensions_op_t s_frame_dimensions_op;
1013*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1014*495ae853SAndroid Build Coastguard Worker 
1015*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_dimensions_ip_t);
1016*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1017*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_DIMENSIONS;
1018*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_wd = ps_app_ctxt->u4_wd;
1019*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_ht = ps_app_ctxt->u4_ht;
1020*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1021*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1022*495ae853SAndroid Build Coastguard Worker 
1023*495ae853SAndroid Build Coastguard Worker     s_frame_dimensions_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_dimensions_op_t);
1024*495ae853SAndroid Build Coastguard Worker 
1025*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_frame_dimensions_ip,
1026*495ae853SAndroid Build Coastguard Worker                                  &s_frame_dimensions_op);
1027*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1028*495ae853SAndroid Build Coastguard Worker     {
1029*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1030*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set frame dimensions = 0x%x\n",
1031*495ae853SAndroid Build Coastguard Worker                 s_frame_dimensions_op.s_ive_op.u4_error_code);
1032*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1033*495ae853SAndroid Build Coastguard Worker     }
1034*495ae853SAndroid Build Coastguard Worker }
1035*495ae853SAndroid Build Coastguard Worker 
1036*495ae853SAndroid Build Coastguard Worker /**
1037*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1038*495ae853SAndroid Build Coastguard Worker * @brief configure source & target framerates
1039*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1040*495ae853SAndroid Build Coastguard Worker */
set_frame_rate(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1041*495ae853SAndroid Build Coastguard Worker void set_frame_rate(app_ctxt_t *ps_app_ctxt,
1042*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_low,
1043*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_high)
1044*495ae853SAndroid Build Coastguard Worker {
1045*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_frame_rate_ip_t s_frame_rate_ip;
1046*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_frame_rate_op_t s_frame_rate_op;
1047*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1048*495ae853SAndroid Build Coastguard Worker 
1049*495ae853SAndroid Build Coastguard Worker     s_frame_rate_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_frame_rate_ip_t);
1050*495ae853SAndroid Build Coastguard Worker     s_frame_rate_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1051*495ae853SAndroid Build Coastguard Worker     s_frame_rate_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMERATE;
1052*495ae853SAndroid Build Coastguard Worker     s_frame_rate_ip.s_ive_ip.u4_src_frame_rate = ps_app_ctxt->u4_src_frame_rate;
1053*495ae853SAndroid Build Coastguard Worker     s_frame_rate_ip.s_ive_ip.u4_tgt_frame_rate = ps_app_ctxt->u4_tgt_frame_rate;
1054*495ae853SAndroid Build Coastguard Worker     s_frame_rate_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1055*495ae853SAndroid Build Coastguard Worker     s_frame_rate_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1056*495ae853SAndroid Build Coastguard Worker 
1057*495ae853SAndroid Build Coastguard Worker     s_frame_rate_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_frame_rate_op_t);
1058*495ae853SAndroid Build Coastguard Worker 
1059*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_frame_rate_ip,
1060*495ae853SAndroid Build Coastguard Worker                                  &s_frame_rate_op);
1061*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1062*495ae853SAndroid Build Coastguard Worker     {
1063*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1064*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set frame rate = 0x%x\n",
1065*495ae853SAndroid Build Coastguard Worker                 s_frame_rate_op.s_ive_op.u4_error_code);
1066*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1067*495ae853SAndroid Build Coastguard Worker     }
1068*495ae853SAndroid Build Coastguard Worker }
1069*495ae853SAndroid Build Coastguard Worker 
1070*495ae853SAndroid Build Coastguard Worker /**
1071*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1072*495ae853SAndroid Build Coastguard Worker * @brief configure IPE params
1073*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1074*495ae853SAndroid Build Coastguard Worker */
set_ipe_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1075*495ae853SAndroid Build Coastguard Worker void set_ipe_params(app_ctxt_t *ps_app_ctxt,
1076*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_low,
1077*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_high)
1078*495ae853SAndroid Build Coastguard Worker {
1079*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_ipe_params_ip_t s_ipe_params_ip;
1080*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_ipe_params_op_t s_ipe_params_op;
1081*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1082*495ae853SAndroid Build Coastguard Worker 
1083*495ae853SAndroid Build Coastguard Worker     s_ipe_params_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_ipe_params_ip_t);
1084*495ae853SAndroid Build Coastguard Worker     s_ipe_params_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1085*495ae853SAndroid Build Coastguard Worker     s_ipe_params_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_IPE_PARAMS;
1086*495ae853SAndroid Build Coastguard Worker     s_ipe_params_ip.s_ive_ip.u4_enable_intra_4x4 = ps_app_ctxt->u4_enable_intra_4x4;
1087*495ae853SAndroid Build Coastguard Worker     s_ipe_params_ip.s_ive_ip.u4_enc_speed_preset = ps_app_ctxt->u4_enc_speed;
1088*495ae853SAndroid Build Coastguard Worker     s_ipe_params_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1089*495ae853SAndroid Build Coastguard Worker     s_ipe_params_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1090*495ae853SAndroid Build Coastguard Worker     s_ipe_params_ip.s_ive_ip.u4_constrained_intra_pred = ps_app_ctxt->u4_constrained_intra_pred;
1091*495ae853SAndroid Build Coastguard Worker 
1092*495ae853SAndroid Build Coastguard Worker     s_ipe_params_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_ipe_params_op_t);
1093*495ae853SAndroid Build Coastguard Worker 
1094*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_ipe_params_ip,
1095*495ae853SAndroid Build Coastguard Worker                                  &s_ipe_params_op);
1096*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1097*495ae853SAndroid Build Coastguard Worker     {
1098*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1099*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set ipe params = 0x%x\n",
1100*495ae853SAndroid Build Coastguard Worker                 s_ipe_params_op.s_ive_op.u4_error_code);
1101*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1102*495ae853SAndroid Build Coastguard Worker     }
1103*495ae853SAndroid Build Coastguard Worker }
1104*495ae853SAndroid Build Coastguard Worker 
1105*495ae853SAndroid Build Coastguard Worker /**
1106*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1107*495ae853SAndroid Build Coastguard Worker * @brief configure bitrate
1108*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1109*495ae853SAndroid Build Coastguard Worker */
set_bit_rate(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1110*495ae853SAndroid Build Coastguard Worker void set_bit_rate(app_ctxt_t *ps_app_ctxt,
1111*495ae853SAndroid Build Coastguard Worker                   UWORD32 u4_timestamp_low,
1112*495ae853SAndroid Build Coastguard Worker                   UWORD32 u4_timestamp_high)
1113*495ae853SAndroid Build Coastguard Worker {
1114*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_bitrate_ip_t s_bitrate_ip;
1115*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_bitrate_op_t s_bitrate_op;
1116*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1117*495ae853SAndroid Build Coastguard Worker 
1118*495ae853SAndroid Build Coastguard Worker     s_bitrate_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_bitrate_ip_t);
1119*495ae853SAndroid Build Coastguard Worker     s_bitrate_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1120*495ae853SAndroid Build Coastguard Worker     s_bitrate_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_BITRATE;
1121*495ae853SAndroid Build Coastguard Worker     s_bitrate_ip.s_ive_ip.u4_target_bitrate = ps_app_ctxt->u4_bitrate;
1122*495ae853SAndroid Build Coastguard Worker     s_bitrate_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1123*495ae853SAndroid Build Coastguard Worker     s_bitrate_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1124*495ae853SAndroid Build Coastguard Worker 
1125*495ae853SAndroid Build Coastguard Worker     s_bitrate_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_bitrate_op_t);
1126*495ae853SAndroid Build Coastguard Worker 
1127*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_bitrate_ip,
1128*495ae853SAndroid Build Coastguard Worker                                  &s_bitrate_op);
1129*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1130*495ae853SAndroid Build Coastguard Worker     {
1131*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1132*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set bit rate = 0x%x\n",
1133*495ae853SAndroid Build Coastguard Worker                 s_bitrate_op.s_ive_op.u4_error_code);
1134*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1135*495ae853SAndroid Build Coastguard Worker     }
1136*495ae853SAndroid Build Coastguard Worker }
1137*495ae853SAndroid Build Coastguard Worker 
1138*495ae853SAndroid Build Coastguard Worker /**
1139*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1140*495ae853SAndroid Build Coastguard Worker * @brief configure frame type
1141*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1142*495ae853SAndroid Build Coastguard Worker */
set_frame_type(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high,IV_PICTURE_CODING_TYPE_T e_frame_type)1143*495ae853SAndroid Build Coastguard Worker void set_frame_type(app_ctxt_t *ps_app_ctxt,
1144*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_low,
1145*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_high,
1146*495ae853SAndroid Build Coastguard Worker                     IV_PICTURE_CODING_TYPE_T e_frame_type)
1147*495ae853SAndroid Build Coastguard Worker {
1148*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_frame_type_ip_t s_frame_type_ip;
1149*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_frame_type_op_t s_frame_type_op;
1150*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1151*495ae853SAndroid Build Coastguard Worker 
1152*495ae853SAndroid Build Coastguard Worker     s_frame_type_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_frame_type_ip_t);
1153*495ae853SAndroid Build Coastguard Worker     s_frame_type_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1154*495ae853SAndroid Build Coastguard Worker     s_frame_type_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMETYPE;
1155*495ae853SAndroid Build Coastguard Worker     s_frame_type_ip.s_ive_ip.e_frame_type = e_frame_type;
1156*495ae853SAndroid Build Coastguard Worker     s_frame_type_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1157*495ae853SAndroid Build Coastguard Worker     s_frame_type_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1158*495ae853SAndroid Build Coastguard Worker 
1159*495ae853SAndroid Build Coastguard Worker     s_frame_type_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_frame_type_op_t);
1160*495ae853SAndroid Build Coastguard Worker 
1161*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_frame_type_ip,
1162*495ae853SAndroid Build Coastguard Worker                                  &s_frame_type_op);
1163*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1164*495ae853SAndroid Build Coastguard Worker     {
1165*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1166*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set frame type = 0x%x\n",
1167*495ae853SAndroid Build Coastguard Worker                 s_frame_type_op.s_ive_op.u4_error_code);
1168*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1169*495ae853SAndroid Build Coastguard Worker     }
1170*495ae853SAndroid Build Coastguard Worker }
1171*495ae853SAndroid Build Coastguard Worker 
1172*495ae853SAndroid Build Coastguard Worker /**
1173*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1174*495ae853SAndroid Build Coastguard Worker * @brief configure qp
1175*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1176*495ae853SAndroid Build Coastguard Worker */
set_qp(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1177*495ae853SAndroid Build Coastguard Worker void set_qp(app_ctxt_t *ps_app_ctxt,
1178*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_timestamp_low,
1179*495ae853SAndroid Build Coastguard Worker             UWORD32 u4_timestamp_high)
1180*495ae853SAndroid Build Coastguard Worker {
1181*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_qp_ip_t s_qp_ip;
1182*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_qp_op_t s_qp_op;
1183*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1184*495ae853SAndroid Build Coastguard Worker 
1185*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_qp_ip_t);
1186*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1187*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_QP;
1188*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_i_qp = ps_app_ctxt->u4_i_qp;
1189*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_i_qp_max = ps_app_ctxt->u4_i_qp_max;
1190*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_i_qp_min = ps_app_ctxt->u4_i_qp_min;
1191*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_p_qp = ps_app_ctxt->u4_p_qp;
1192*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_p_qp_max = ps_app_ctxt->u4_p_qp_max;
1193*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_p_qp_min = ps_app_ctxt->u4_p_qp_min;
1194*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_b_qp = ps_app_ctxt->u4_b_qp;
1195*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_b_qp_max = ps_app_ctxt->u4_b_qp_max;
1196*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_b_qp_min = ps_app_ctxt->u4_b_qp_min;
1197*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1198*495ae853SAndroid Build Coastguard Worker     s_qp_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1199*495ae853SAndroid Build Coastguard Worker 
1200*495ae853SAndroid Build Coastguard Worker     s_qp_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_qp_op_t);
1201*495ae853SAndroid Build Coastguard Worker 
1202*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_qp_ip, &s_qp_op);
1203*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1204*495ae853SAndroid Build Coastguard Worker     {
1205*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1206*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set qp 0x%x\n",
1207*495ae853SAndroid Build Coastguard Worker                 s_qp_op.s_ive_op.u4_error_code);
1208*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1209*495ae853SAndroid Build Coastguard Worker     }
1210*495ae853SAndroid Build Coastguard Worker }
1211*495ae853SAndroid Build Coastguard Worker 
1212*495ae853SAndroid Build Coastguard Worker /**
1213*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1214*495ae853SAndroid Build Coastguard Worker * @brief configure encoder mode
1215*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1216*495ae853SAndroid Build Coastguard Worker */
set_enc_mode(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high,IVE_ENC_MODE_T e_enc_mode)1217*495ae853SAndroid Build Coastguard Worker void set_enc_mode(app_ctxt_t *ps_app_ctxt,
1218*495ae853SAndroid Build Coastguard Worker                   UWORD32 u4_timestamp_low,
1219*495ae853SAndroid Build Coastguard Worker                   UWORD32 u4_timestamp_high,
1220*495ae853SAndroid Build Coastguard Worker                   IVE_ENC_MODE_T e_enc_mode)
1221*495ae853SAndroid Build Coastguard Worker {
1222*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_enc_mode_ip_t s_enc_mode_ip;
1223*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_enc_mode_op_t s_enc_mode_op;
1224*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1225*495ae853SAndroid Build Coastguard Worker 
1226*495ae853SAndroid Build Coastguard Worker     s_enc_mode_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_enc_mode_ip_t);
1227*495ae853SAndroid Build Coastguard Worker     s_enc_mode_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1228*495ae853SAndroid Build Coastguard Worker     s_enc_mode_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_ENC_MODE;
1229*495ae853SAndroid Build Coastguard Worker     s_enc_mode_ip.s_ive_ip.e_enc_mode = e_enc_mode;
1230*495ae853SAndroid Build Coastguard Worker     s_enc_mode_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1231*495ae853SAndroid Build Coastguard Worker     s_enc_mode_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1232*495ae853SAndroid Build Coastguard Worker 
1233*495ae853SAndroid Build Coastguard Worker     s_enc_mode_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_enc_mode_op_t);
1234*495ae853SAndroid Build Coastguard Worker 
1235*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_enc_mode_ip,
1236*495ae853SAndroid Build Coastguard Worker                                  &s_enc_mode_op);
1237*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1238*495ae853SAndroid Build Coastguard Worker     {
1239*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1240*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set in header encode mode = 0x%x\n",
1241*495ae853SAndroid Build Coastguard Worker                 s_enc_mode_op.s_ive_op.u4_error_code);
1242*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1243*495ae853SAndroid Build Coastguard Worker     }
1244*495ae853SAndroid Build Coastguard Worker }
1245*495ae853SAndroid Build Coastguard Worker 
1246*495ae853SAndroid Build Coastguard Worker /**
1247*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1248*495ae853SAndroid Build Coastguard Worker * @brief configure vbv params
1249*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1250*495ae853SAndroid Build Coastguard Worker */
set_vbv_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1251*495ae853SAndroid Build Coastguard Worker void set_vbv_params(app_ctxt_t *ps_app_ctxt,
1252*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_low,
1253*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_high)
1254*495ae853SAndroid Build Coastguard Worker {
1255*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_vbv_params_ip_t s_vbv_ip;
1256*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_vbv_params_op_t s_vbv_op;
1257*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1258*495ae853SAndroid Build Coastguard Worker 
1259*495ae853SAndroid Build Coastguard Worker     s_vbv_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_vbv_params_ip_t);
1260*495ae853SAndroid Build Coastguard Worker     s_vbv_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1261*495ae853SAndroid Build Coastguard Worker     s_vbv_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_VBV_PARAMS;
1262*495ae853SAndroid Build Coastguard Worker     s_vbv_ip.s_ive_ip.u4_vbv_buffer_delay = ps_app_ctxt->u4_vbv_buffer_delay;
1263*495ae853SAndroid Build Coastguard Worker     s_vbv_ip.s_ive_ip.u4_vbv_buf_size = ps_app_ctxt->u4_vbv_buf_size;
1264*495ae853SAndroid Build Coastguard Worker     s_vbv_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1265*495ae853SAndroid Build Coastguard Worker     s_vbv_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1266*495ae853SAndroid Build Coastguard Worker 
1267*495ae853SAndroid Build Coastguard Worker     s_vbv_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_vbv_params_op_t);
1268*495ae853SAndroid Build Coastguard Worker 
1269*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_vbv_ip, &s_vbv_op);
1270*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1271*495ae853SAndroid Build Coastguard Worker     {
1272*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1273*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set VBC params = 0x%x\n",
1274*495ae853SAndroid Build Coastguard Worker                 s_vbv_op.s_ive_op.u4_error_code);
1275*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1276*495ae853SAndroid Build Coastguard Worker     }
1277*495ae853SAndroid Build Coastguard Worker }
1278*495ae853SAndroid Build Coastguard Worker 
1279*495ae853SAndroid Build Coastguard Worker /**
1280*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1281*495ae853SAndroid Build Coastguard Worker * @brief configure air params
1282*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1283*495ae853SAndroid Build Coastguard Worker */
set_air_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1284*495ae853SAndroid Build Coastguard Worker void set_air_params(app_ctxt_t *ps_app_ctxt,
1285*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_low,
1286*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_high)
1287*495ae853SAndroid Build Coastguard Worker {
1288*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_air_params_ip_t s_air_ip;
1289*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_air_params_op_t s_air_op;
1290*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1291*495ae853SAndroid Build Coastguard Worker 
1292*495ae853SAndroid Build Coastguard Worker     s_air_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_air_params_ip_t);
1293*495ae853SAndroid Build Coastguard Worker     s_air_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1294*495ae853SAndroid Build Coastguard Worker     s_air_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_AIR_PARAMS;
1295*495ae853SAndroid Build Coastguard Worker     s_air_ip.s_ive_ip.e_air_mode = ps_app_ctxt->u4_air;
1296*495ae853SAndroid Build Coastguard Worker     s_air_ip.s_ive_ip.u4_air_refresh_period = ps_app_ctxt->u4_air_refresh_period;
1297*495ae853SAndroid Build Coastguard Worker     s_air_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1298*495ae853SAndroid Build Coastguard Worker     s_air_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1299*495ae853SAndroid Build Coastguard Worker 
1300*495ae853SAndroid Build Coastguard Worker     s_air_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_air_params_op_t);
1301*495ae853SAndroid Build Coastguard Worker 
1302*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_air_ip, &s_air_op);
1303*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1304*495ae853SAndroid Build Coastguard Worker     {
1305*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1306*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set air params = 0x%x\n",
1307*495ae853SAndroid Build Coastguard Worker                 s_air_op.s_ive_op.u4_error_code);
1308*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1309*495ae853SAndroid Build Coastguard Worker     }
1310*495ae853SAndroid Build Coastguard Worker }
1311*495ae853SAndroid Build Coastguard Worker 
1312*495ae853SAndroid Build Coastguard Worker /**
1313*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1314*495ae853SAndroid Build Coastguard Worker * @brief configure me params
1315*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1316*495ae853SAndroid Build Coastguard Worker */
set_me_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1317*495ae853SAndroid Build Coastguard Worker void set_me_params(app_ctxt_t *ps_app_ctxt,
1318*495ae853SAndroid Build Coastguard Worker                    UWORD32 u4_timestamp_low,
1319*495ae853SAndroid Build Coastguard Worker                    UWORD32 u4_timestamp_high)
1320*495ae853SAndroid Build Coastguard Worker {
1321*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_me_params_ip_t s_me_params_ip;
1322*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_me_params_op_t s_me_params_op;
1323*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1324*495ae853SAndroid Build Coastguard Worker 
1325*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_me_params_ip_t);
1326*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1327*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_ME_PARAMS;
1328*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_me_speed_preset = ps_app_ctxt->u4_me_speed;
1329*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_enable_hpel = ps_app_ctxt->u4_hpel;
1330*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_enable_qpel = ps_app_ctxt->u4_qpel;
1331*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_enable_fast_sad = ps_app_ctxt->u4_enable_fast_sad;
1332*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_enable_alt_ref = ps_app_ctxt->u4_enable_alt_ref;
1333*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_srch_rng_x = ps_app_ctxt->u4_srch_rng_x;
1334*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_srch_rng_y = ps_app_ctxt->u4_srch_rng_y;
1335*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1336*495ae853SAndroid Build Coastguard Worker     s_me_params_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1337*495ae853SAndroid Build Coastguard Worker 
1338*495ae853SAndroid Build Coastguard Worker     s_me_params_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_me_params_op_t);
1339*495ae853SAndroid Build Coastguard Worker 
1340*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_me_params_ip,
1341*495ae853SAndroid Build Coastguard Worker                                  &s_me_params_op);
1342*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1343*495ae853SAndroid Build Coastguard Worker     {
1344*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1345*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set me params = 0x%x\n",
1346*495ae853SAndroid Build Coastguard Worker                 s_me_params_op.s_ive_op.u4_error_code);
1347*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1348*495ae853SAndroid Build Coastguard Worker     }
1349*495ae853SAndroid Build Coastguard Worker }
1350*495ae853SAndroid Build Coastguard Worker 
1351*495ae853SAndroid Build Coastguard Worker /**
1352*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1353*495ae853SAndroid Build Coastguard Worker * @brief configure gop params
1354*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1355*495ae853SAndroid Build Coastguard Worker */
set_gop_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1356*495ae853SAndroid Build Coastguard Worker void set_gop_params(app_ctxt_t *ps_app_ctxt,
1357*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_low,
1358*495ae853SAndroid Build Coastguard Worker                     UWORD32 u4_timestamp_high)
1359*495ae853SAndroid Build Coastguard Worker {
1360*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_gop_params_ip_t s_gop_params_ip;
1361*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_gop_params_op_t s_gop_params_op;
1362*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1363*495ae853SAndroid Build Coastguard Worker 
1364*495ae853SAndroid Build Coastguard Worker     s_gop_params_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_gop_params_ip_t);
1365*495ae853SAndroid Build Coastguard Worker     s_gop_params_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1366*495ae853SAndroid Build Coastguard Worker     s_gop_params_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_GOP_PARAMS;
1367*495ae853SAndroid Build Coastguard Worker     s_gop_params_ip.s_ive_ip.u4_i_frm_interval = ps_app_ctxt->u4_i_interval;
1368*495ae853SAndroid Build Coastguard Worker     s_gop_params_ip.s_ive_ip.u4_idr_frm_interval = ps_app_ctxt->u4_idr_interval;
1369*495ae853SAndroid Build Coastguard Worker     s_gop_params_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1370*495ae853SAndroid Build Coastguard Worker     s_gop_params_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1371*495ae853SAndroid Build Coastguard Worker 
1372*495ae853SAndroid Build Coastguard Worker     s_gop_params_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_gop_params_op_t);
1373*495ae853SAndroid Build Coastguard Worker 
1374*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_gop_params_ip,
1375*495ae853SAndroid Build Coastguard Worker                                       &s_gop_params_op);
1376*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1377*495ae853SAndroid Build Coastguard Worker     {
1378*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1379*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set GOP params = 0x%x\n",
1380*495ae853SAndroid Build Coastguard Worker                 s_gop_params_op.s_ive_op.u4_error_code);
1381*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1382*495ae853SAndroid Build Coastguard Worker     }
1383*495ae853SAndroid Build Coastguard Worker }
1384*495ae853SAndroid Build Coastguard Worker 
1385*495ae853SAndroid Build Coastguard Worker /**
1386*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1387*495ae853SAndroid Build Coastguard Worker * @brief configure profile params
1388*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1389*495ae853SAndroid Build Coastguard Worker */
set_profile_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1390*495ae853SAndroid Build Coastguard Worker void set_profile_params(app_ctxt_t *ps_app_ctxt,
1391*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_low,
1392*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_high)
1393*495ae853SAndroid Build Coastguard Worker {
1394*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_profile_params_ip_t s_profile_params_ip;
1395*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_profile_params_op_t s_profile_params_op;
1396*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1397*495ae853SAndroid Build Coastguard Worker 
1398*495ae853SAndroid Build Coastguard Worker     s_profile_params_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_profile_params_ip_t);
1399*495ae853SAndroid Build Coastguard Worker     s_profile_params_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1400*495ae853SAndroid Build Coastguard Worker     s_profile_params_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_PROFILE_PARAMS;
1401*495ae853SAndroid Build Coastguard Worker     s_profile_params_ip.s_ive_ip.e_profile = ps_app_ctxt->e_profile;
1402*495ae853SAndroid Build Coastguard Worker     s_profile_params_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1403*495ae853SAndroid Build Coastguard Worker     s_profile_params_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1404*495ae853SAndroid Build Coastguard Worker     s_profile_params_ip.s_ive_ip.u4_entropy_coding_mode = ps_app_ctxt->u4_entropy_coding_mode;
1405*495ae853SAndroid Build Coastguard Worker 
1406*495ae853SAndroid Build Coastguard Worker     s_profile_params_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_profile_params_op_t);
1407*495ae853SAndroid Build Coastguard Worker 
1408*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_profile_params_ip,
1409*495ae853SAndroid Build Coastguard Worker                                  &s_profile_params_op);
1410*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1411*495ae853SAndroid Build Coastguard Worker     {
1412*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1413*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set profile params = 0x%x\n",
1414*495ae853SAndroid Build Coastguard Worker                 s_profile_params_op.s_ive_op.u4_error_code);
1415*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1416*495ae853SAndroid Build Coastguard Worker     }
1417*495ae853SAndroid Build Coastguard Worker }
1418*495ae853SAndroid Build Coastguard Worker 
1419*495ae853SAndroid Build Coastguard Worker /**
1420*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1421*495ae853SAndroid Build Coastguard Worker * @brief configure deblock params
1422*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1423*495ae853SAndroid Build Coastguard Worker */
set_deblock_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1424*495ae853SAndroid Build Coastguard Worker void set_deblock_params(app_ctxt_t *ps_app_ctxt,
1425*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_low,
1426*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_high)
1427*495ae853SAndroid Build Coastguard Worker {
1428*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_deblock_params_ip_t s_deblock_params_ip;
1429*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_deblock_params_op_t s_deblock_params_op;
1430*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1431*495ae853SAndroid Build Coastguard Worker 
1432*495ae853SAndroid Build Coastguard Worker     s_deblock_params_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_deblock_params_ip_t);
1433*495ae853SAndroid Build Coastguard Worker     s_deblock_params_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1434*495ae853SAndroid Build Coastguard Worker     s_deblock_params_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_DEBLOCK_PARAMS;
1435*495ae853SAndroid Build Coastguard Worker     s_deblock_params_ip.s_ive_ip.u4_disable_deblock_level = ps_app_ctxt->u4_disable_deblk_level;
1436*495ae853SAndroid Build Coastguard Worker     s_deblock_params_ip.s_ive_ip.u4_timestamp_high = u4_timestamp_high;
1437*495ae853SAndroid Build Coastguard Worker     s_deblock_params_ip.s_ive_ip.u4_timestamp_low = u4_timestamp_low;
1438*495ae853SAndroid Build Coastguard Worker 
1439*495ae853SAndroid Build Coastguard Worker     s_deblock_params_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_deblock_params_op_t);
1440*495ae853SAndroid Build Coastguard Worker 
1441*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_deblock_params_ip,
1442*495ae853SAndroid Build Coastguard Worker                                  &s_deblock_params_op);
1443*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1444*495ae853SAndroid Build Coastguard Worker     {
1445*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1446*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to enable/disable deblock params = 0x%x\n",
1447*495ae853SAndroid Build Coastguard Worker                 s_deblock_params_op.s_ive_op.u4_error_code);
1448*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1449*495ae853SAndroid Build Coastguard Worker     }
1450*495ae853SAndroid Build Coastguard Worker }
1451*495ae853SAndroid Build Coastguard Worker 
1452*495ae853SAndroid Build Coastguard Worker /**
1453*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1454*495ae853SAndroid Build Coastguard Worker * @brief configure VUI params
1455*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1456*495ae853SAndroid Build Coastguard Worker */
set_vui_params(app_ctxt_t * ps_app_ctxt)1457*495ae853SAndroid Build Coastguard Worker void set_vui_params(app_ctxt_t *ps_app_ctxt)
1458*495ae853SAndroid Build Coastguard Worker {
1459*495ae853SAndroid Build Coastguard Worker     ih264e_vui_ip_t s_vui_params_ip;
1460*495ae853SAndroid Build Coastguard Worker     ih264e_vui_op_t s_vui_params_op;
1461*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1462*495ae853SAndroid Build Coastguard Worker 
1463*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u4_size = sizeof(ih264e_vui_ip_t);
1464*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1465*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_VUI_PARAMS;
1466*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_aspect_ratio_info_present_flag = 0;
1467*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_aspect_ratio_idc = 0;
1468*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u2_sar_width = 0;
1469*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u2_sar_height = 0;
1470*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_overscan_info_present_flag = 0;
1471*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_overscan_appropriate_flag = 0;
1472*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_video_signal_type_present_flag = 1;
1473*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_video_format = 0;
1474*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_video_full_range_flag = 0;
1475*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_colour_description_present_flag = 1;
1476*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_colour_primaries = 2;
1477*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_transfer_characteristics = 2;
1478*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_matrix_coefficients = 2;
1479*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_chroma_loc_info_present_flag = 0;
1480*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_chroma_sample_loc_type_top_field = 0;
1481*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_chroma_sample_loc_type_bottom_field = 0;
1482*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_vui_timing_info_present_flag = 0;
1483*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u4_vui_num_units_in_tick = 0;
1484*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u4_vui_time_scale = ps_app_ctxt->u4_tgt_frame_rate * 2000;
1485*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_fixed_frame_rate_flag = 0;
1486*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_nal_hrd_parameters_present_flag = 0;
1487*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_vcl_hrd_parameters_present_flag = 0;
1488*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_low_delay_hrd_flag = 0;
1489*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_pic_struct_present_flag = 0;
1490*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_bitstream_restriction_flag = 0;
1491*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_motion_vectors_over_pic_boundaries_flag = 0;
1492*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_max_bytes_per_pic_denom = 0;
1493*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_max_bits_per_mb_denom = 0;
1494*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_log2_max_mv_length_horizontal = 0;
1495*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_log2_max_mv_length_vertical = 0;
1496*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_num_reorder_frames = 0;
1497*495ae853SAndroid Build Coastguard Worker     s_vui_params_ip.u1_max_dec_frame_buffering = 0;
1498*495ae853SAndroid Build Coastguard Worker 
1499*495ae853SAndroid Build Coastguard Worker     s_vui_params_op.u4_size = sizeof(ih264e_vui_op_t);
1500*495ae853SAndroid Build Coastguard Worker 
1501*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_vui_params_ip,
1502*495ae853SAndroid Build Coastguard Worker                                  &s_vui_params_op);
1503*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1504*495ae853SAndroid Build Coastguard Worker     {
1505*495ae853SAndroid Build Coastguard Worker         CHAR ac_error[STRLENGTH];
1506*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to set vui params = 0x%x\n",
1507*495ae853SAndroid Build Coastguard Worker                 s_vui_params_op.u4_error_code);
1508*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
1509*495ae853SAndroid Build Coastguard Worker     }
1510*495ae853SAndroid Build Coastguard Worker     return;
1511*495ae853SAndroid Build Coastguard Worker }
1512*495ae853SAndroid Build Coastguard Worker 
set_sei_mdcv_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1513*495ae853SAndroid Build Coastguard Worker void set_sei_mdcv_params(app_ctxt_t *ps_app_ctxt,
1514*495ae853SAndroid Build Coastguard Worker                          UWORD32 u4_timestamp_low,
1515*495ae853SAndroid Build Coastguard Worker                          UWORD32 u4_timestamp_high)
1516*495ae853SAndroid Build Coastguard Worker {
1517*495ae853SAndroid Build Coastguard Worker     WORD32 i4_count;
1518*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1519*495ae853SAndroid Build Coastguard Worker 
1520*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_mdcv_params_ip_t s_sei_mdcv_params_ip;
1521*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_mdcv_params_op_t s_sei_mdcv_params_op;
1522*495ae853SAndroid Build Coastguard Worker 
1523*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1524*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_SEI_MDCV_PARAMS;
1525*495ae853SAndroid Build Coastguard Worker 
1526*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.u1_sei_mdcv_params_present_flag =
1527*495ae853SAndroid Build Coastguard Worker                                 (UWORD8)ps_app_ctxt->u4_sei_mdcv_params_present_flag;
1528*495ae853SAndroid Build Coastguard Worker 
1529*495ae853SAndroid Build Coastguard Worker     for(i4_count = 0; i4_count < NUM_SEI_MDCV_PRIMARIES; i4_count++)
1530*495ae853SAndroid Build Coastguard Worker     {
1531*495ae853SAndroid Build Coastguard Worker         s_sei_mdcv_params_ip.au2_display_primaries_x[i4_count] =
1532*495ae853SAndroid Build Coastguard Worker                                 (UWORD16)ps_app_ctxt->au4_display_primaries_x[i4_count];
1533*495ae853SAndroid Build Coastguard Worker         s_sei_mdcv_params_ip.au2_display_primaries_y[i4_count] =
1534*495ae853SAndroid Build Coastguard Worker                                 (UWORD16)ps_app_ctxt->au4_display_primaries_y[i4_count];
1535*495ae853SAndroid Build Coastguard Worker     }
1536*495ae853SAndroid Build Coastguard Worker 
1537*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.u2_white_point_x = (UWORD16)ps_app_ctxt->u4_white_point_x;
1538*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.u2_white_point_y = (UWORD16)ps_app_ctxt->u4_white_point_y;
1539*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.u4_max_display_mastering_luminance =
1540*495ae853SAndroid Build Coastguard Worker                                 ps_app_ctxt->u4_max_display_mastering_luminance;
1541*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.u4_min_display_mastering_luminance =
1542*495ae853SAndroid Build Coastguard Worker                                 ps_app_ctxt->u4_min_display_mastering_luminance;
1543*495ae853SAndroid Build Coastguard Worker 
1544*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.u4_timestamp_high  =   u4_timestamp_high;
1545*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.u4_timestamp_low   =   u4_timestamp_low;
1546*495ae853SAndroid Build Coastguard Worker 
1547*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_ip.u4_size = sizeof(ih264e_ctl_set_sei_mdcv_params_ip_t);
1548*495ae853SAndroid Build Coastguard Worker     s_sei_mdcv_params_op.u4_size = sizeof(ih264e_ctl_set_sei_mdcv_params_op_t);
1549*495ae853SAndroid Build Coastguard Worker 
1550*495ae853SAndroid Build Coastguard Worker     if((ps_app_ctxt->s_sei_mdcv_params.au2_display_primaries_x[0] !=
1551*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.au2_display_primaries_x[0]) ||
1552*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.au2_display_primaries_x[1] !=
1553*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.au2_display_primaries_x[1]) ||
1554*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.au2_display_primaries_x[2] !=
1555*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.au2_display_primaries_x[2]) ||
1556*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.au2_display_primaries_y[0] !=
1557*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.au2_display_primaries_y[0]) ||
1558*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.au2_display_primaries_y[1] !=
1559*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.au2_display_primaries_y[1]) ||
1560*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.au2_display_primaries_y[2] !=
1561*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.au2_display_primaries_y[2]) ||
1562*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.u2_white_point_x !=
1563*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.u2_white_point_x) ||
1564*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.u2_white_point_y !=
1565*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.u2_white_point_x) ||
1566*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.u4_max_display_mastering_luminance !=
1567*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.u4_max_display_mastering_luminance) ||
1568*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_mdcv_params.u4_min_display_mastering_luminance !=
1569*495ae853SAndroid Build Coastguard Worker                                 s_sei_mdcv_params_ip.u4_min_display_mastering_luminance))
1570*495ae853SAndroid Build Coastguard Worker     {
1571*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_sei_mdcv_params_ip,
1572*495ae853SAndroid Build Coastguard Worker                                      &s_sei_mdcv_params_op);
1573*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
1574*495ae853SAndroid Build Coastguard Worker         {
1575*495ae853SAndroid Build Coastguard Worker             printf("Unable to set sei mdcv params = 0x%x\n",
1576*495ae853SAndroid Build Coastguard Worker                     s_sei_mdcv_params_op.u4_error_code);
1577*495ae853SAndroid Build Coastguard Worker         }
1578*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->s_sei_mdcv_params = s_sei_mdcv_params_ip;
1579*495ae853SAndroid Build Coastguard Worker     }
1580*495ae853SAndroid Build Coastguard Worker     return;
1581*495ae853SAndroid Build Coastguard Worker }
1582*495ae853SAndroid Build Coastguard Worker 
set_sei_cll_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1583*495ae853SAndroid Build Coastguard Worker void set_sei_cll_params(app_ctxt_t *ps_app_ctxt,
1584*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_low,
1585*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_high)
1586*495ae853SAndroid Build Coastguard Worker {
1587*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1588*495ae853SAndroid Build Coastguard Worker 
1589*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_cll_params_ip_t s_sei_cll_params_ip;
1590*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_cll_params_op_t s_sei_cll_params_op;
1591*495ae853SAndroid Build Coastguard Worker 
1592*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1593*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_SEI_CLL_PARAMS;
1594*495ae853SAndroid Build Coastguard Worker 
1595*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_ip.u1_sei_cll_params_present_flag =
1596*495ae853SAndroid Build Coastguard Worker                                 (UWORD8)ps_app_ctxt->u4_sei_cll_params_present_flag;
1597*495ae853SAndroid Build Coastguard Worker 
1598*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_ip.u2_max_content_light_level =
1599*495ae853SAndroid Build Coastguard Worker                                 (UWORD16)ps_app_ctxt->u4_max_content_light_level;
1600*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_ip.u2_max_pic_average_light_level =
1601*495ae853SAndroid Build Coastguard Worker                                 (UWORD16)ps_app_ctxt->u4_max_pic_average_light_level;
1602*495ae853SAndroid Build Coastguard Worker 
1603*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_ip.u4_timestamp_high  = u4_timestamp_high;
1604*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_ip.u4_timestamp_low   = u4_timestamp_low;
1605*495ae853SAndroid Build Coastguard Worker 
1606*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_ip.u4_size = sizeof(ih264e_ctl_set_sei_cll_params_ip_t);
1607*495ae853SAndroid Build Coastguard Worker     s_sei_cll_params_op.u4_size = sizeof(ih264e_ctl_set_sei_cll_params_op_t);
1608*495ae853SAndroid Build Coastguard Worker 
1609*495ae853SAndroid Build Coastguard Worker     if((ps_app_ctxt->s_sei_cll_params.u2_max_content_light_level !=
1610*495ae853SAndroid Build Coastguard Worker                                 s_sei_cll_params_ip.u2_max_content_light_level) ||
1611*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_cll_params.u2_max_pic_average_light_level !=
1612*495ae853SAndroid Build Coastguard Worker                                 s_sei_cll_params_ip.u2_max_pic_average_light_level))
1613*495ae853SAndroid Build Coastguard Worker     {
1614*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_sei_cll_params_ip,
1615*495ae853SAndroid Build Coastguard Worker                                      &s_sei_cll_params_op);
1616*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
1617*495ae853SAndroid Build Coastguard Worker         {
1618*495ae853SAndroid Build Coastguard Worker             printf("Unable to set sei cll params = 0x%x\n",
1619*495ae853SAndroid Build Coastguard Worker                     s_sei_cll_params_op.u4_error_code);
1620*495ae853SAndroid Build Coastguard Worker         }
1621*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->s_sei_cll_params = s_sei_cll_params_ip;
1622*495ae853SAndroid Build Coastguard Worker     }
1623*495ae853SAndroid Build Coastguard Worker     return;
1624*495ae853SAndroid Build Coastguard Worker }
1625*495ae853SAndroid Build Coastguard Worker 
set_sei_ave_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1626*495ae853SAndroid Build Coastguard Worker void set_sei_ave_params(app_ctxt_t *ps_app_ctxt,
1627*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_low,
1628*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_high)
1629*495ae853SAndroid Build Coastguard Worker {
1630*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1631*495ae853SAndroid Build Coastguard Worker 
1632*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_ave_params_ip_t s_sei_ave_params_ip;
1633*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_ave_params_op_t s_sei_ave_params_op;
1634*495ae853SAndroid Build Coastguard Worker 
1635*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1636*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_SEI_AVE_PARAMS;
1637*495ae853SAndroid Build Coastguard Worker 
1638*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.u1_sei_ave_params_present_flag =
1639*495ae853SAndroid Build Coastguard Worker                                 (UWORD8)ps_app_ctxt->u4_sei_ave_params_present_flag;
1640*495ae853SAndroid Build Coastguard Worker 
1641*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.u4_ambient_illuminance = ps_app_ctxt->u4_ambient_illuminance;
1642*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.u2_ambient_light_x = (UWORD16)ps_app_ctxt->u4_ambient_light_x;
1643*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.u2_ambient_light_y = (UWORD16)ps_app_ctxt->u4_ambient_light_y;
1644*495ae853SAndroid Build Coastguard Worker 
1645*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.u4_timestamp_high  =   u4_timestamp_high;
1646*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.u4_timestamp_low   =   u4_timestamp_low;
1647*495ae853SAndroid Build Coastguard Worker 
1648*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_ip.u4_size = sizeof(ih264e_ctl_set_sei_ave_params_ip_t);
1649*495ae853SAndroid Build Coastguard Worker     s_sei_ave_params_op.u4_size = sizeof(ih264e_ctl_set_sei_ave_params_op_t);
1650*495ae853SAndroid Build Coastguard Worker 
1651*495ae853SAndroid Build Coastguard Worker     if((ps_app_ctxt->s_sei_ave_params.u4_ambient_illuminance !=
1652*495ae853SAndroid Build Coastguard Worker                                 s_sei_ave_params_ip.u4_ambient_illuminance) ||
1653*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_ave_params.u2_ambient_light_x !=
1654*495ae853SAndroid Build Coastguard Worker                                 s_sei_ave_params_ip.u2_ambient_light_x) ||
1655*495ae853SAndroid Build Coastguard Worker             (ps_app_ctxt->s_sei_ave_params.u2_ambient_light_y !=
1656*495ae853SAndroid Build Coastguard Worker                                 s_sei_ave_params_ip.u2_ambient_light_y))
1657*495ae853SAndroid Build Coastguard Worker     {
1658*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_sei_ave_params_ip,
1659*495ae853SAndroid Build Coastguard Worker                                  &s_sei_ave_params_op);
1660*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
1661*495ae853SAndroid Build Coastguard Worker         {
1662*495ae853SAndroid Build Coastguard Worker             printf("Unable to set sei ave params = 0x%x\n",
1663*495ae853SAndroid Build Coastguard Worker                     s_sei_ave_params_op.u4_error_code);
1664*495ae853SAndroid Build Coastguard Worker         }
1665*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->s_sei_ave_params = s_sei_ave_params_ip;
1666*495ae853SAndroid Build Coastguard Worker     }
1667*495ae853SAndroid Build Coastguard Worker     return;
1668*495ae853SAndroid Build Coastguard Worker }
1669*495ae853SAndroid Build Coastguard Worker 
set_sei_ccv_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1670*495ae853SAndroid Build Coastguard Worker void set_sei_ccv_params(app_ctxt_t *ps_app_ctxt,
1671*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_low,
1672*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_high)
1673*495ae853SAndroid Build Coastguard Worker {
1674*495ae853SAndroid Build Coastguard Worker     WORD32 i4_count;
1675*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1676*495ae853SAndroid Build Coastguard Worker 
1677*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_ccv_params_ip_t s_sei_ccv_params_ip;
1678*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_ccv_params_op_t s_sei_ccv_params_op;
1679*495ae853SAndroid Build Coastguard Worker 
1680*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1681*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_SEI_CCV_PARAMS;
1682*495ae853SAndroid Build Coastguard Worker 
1683*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u1_sei_ccv_params_present_flag =
1684*495ae853SAndroid Build Coastguard Worker                             (UWORD8)ps_app_ctxt->u4_sei_ccv_params_present_flag;
1685*495ae853SAndroid Build Coastguard Worker 
1686*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u1_ccv_cancel_flag = (UWORD8)ps_app_ctxt->u4_ccv_cancel_flag;
1687*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u1_ccv_persistence_flag =
1688*495ae853SAndroid Build Coastguard Worker                             (UWORD8)ps_app_ctxt->u4_ccv_persistence_flag;
1689*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u1_ccv_primaries_present_flag =
1690*495ae853SAndroid Build Coastguard Worker                             (UWORD8)ps_app_ctxt->u4_ccv_primaries_present_flag;
1691*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u1_ccv_min_luminance_value_present_flag =
1692*495ae853SAndroid Build Coastguard Worker                             (UWORD8)ps_app_ctxt->u4_ccv_min_luminance_value_present_flag;
1693*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u1_ccv_max_luminance_value_present_flag =
1694*495ae853SAndroid Build Coastguard Worker                             (UWORD8)ps_app_ctxt->u4_ccv_max_luminance_value_present_flag;
1695*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u1_ccv_avg_luminance_value_present_flag =
1696*495ae853SAndroid Build Coastguard Worker                             (UWORD8)ps_app_ctxt->u4_ccv_avg_luminance_value_present_flag;
1697*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u1_ccv_reserved_zero_2bits =
1698*495ae853SAndroid Build Coastguard Worker                             (UWORD8)ps_app_ctxt->u4_ccv_reserved_zero_2bits;
1699*495ae853SAndroid Build Coastguard Worker 
1700*495ae853SAndroid Build Coastguard Worker     for(i4_count = 0; i4_count < NUM_SEI_CCV_PRIMARIES; i4_count++)
1701*495ae853SAndroid Build Coastguard Worker     {
1702*495ae853SAndroid Build Coastguard Worker         s_sei_ccv_params_ip.ai4_ccv_primaries_x[i4_count] =
1703*495ae853SAndroid Build Coastguard Worker                             ps_app_ctxt->ai4_ccv_primaries_x[i4_count];
1704*495ae853SAndroid Build Coastguard Worker         s_sei_ccv_params_ip.ai4_ccv_primaries_y[i4_count] =
1705*495ae853SAndroid Build Coastguard Worker                             ps_app_ctxt->ai4_ccv_primaries_y[i4_count];
1706*495ae853SAndroid Build Coastguard Worker     }
1707*495ae853SAndroid Build Coastguard Worker 
1708*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u4_ccv_min_luminance_value = ps_app_ctxt->u4_ccv_min_luminance_value;
1709*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u4_ccv_max_luminance_value = ps_app_ctxt->u4_ccv_max_luminance_value;
1710*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u4_ccv_avg_luminance_value = ps_app_ctxt->u4_ccv_avg_luminance_value;
1711*495ae853SAndroid Build Coastguard Worker 
1712*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u4_timestamp_high  =   u4_timestamp_high;
1713*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u4_timestamp_low   =   u4_timestamp_low;
1714*495ae853SAndroid Build Coastguard Worker 
1715*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_ip.u4_size = sizeof(ih264e_ctl_set_sei_ccv_params_ip_t);
1716*495ae853SAndroid Build Coastguard Worker     s_sei_ccv_params_op.u4_size = sizeof(ih264e_ctl_set_sei_ccv_params_op_t);
1717*495ae853SAndroid Build Coastguard Worker 
1718*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_app_ctxt->ps_enc, &s_sei_ccv_params_ip,
1719*495ae853SAndroid Build Coastguard Worker                                  &s_sei_ccv_params_op);
1720*495ae853SAndroid Build Coastguard Worker     if(status != IV_SUCCESS)
1721*495ae853SAndroid Build Coastguard Worker     {
1722*495ae853SAndroid Build Coastguard Worker         printf("Unable to set sei ccv params = 0x%x\n",
1723*495ae853SAndroid Build Coastguard Worker                 s_sei_ccv_params_op.u4_error_code);
1724*495ae853SAndroid Build Coastguard Worker     }
1725*495ae853SAndroid Build Coastguard Worker     return;
1726*495ae853SAndroid Build Coastguard Worker }
1727*495ae853SAndroid Build Coastguard Worker 
set_sei_sii_params(app_ctxt_t * ps_app_ctxt,UWORD32 u4_timestamp_low,UWORD32 u4_timestamp_high)1728*495ae853SAndroid Build Coastguard Worker void set_sei_sii_params(app_ctxt_t *ps_app_ctxt, UWORD32 u4_timestamp_low,
1729*495ae853SAndroid Build Coastguard Worker                         UWORD32 u4_timestamp_high)
1730*495ae853SAndroid Build Coastguard Worker {
1731*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status;
1732*495ae853SAndroid Build Coastguard Worker     int i;
1733*495ae853SAndroid Build Coastguard Worker     bool au4_sub_layer_num_units_in_shutter_interval_flag = 0;
1734*495ae853SAndroid Build Coastguard Worker 
1735*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_sii_params_ip_t s_sei_sii_params_ip = {0};
1736*495ae853SAndroid Build Coastguard Worker     ih264e_ctl_set_sei_sii_params_op_t s_sei_sii_params_op = {0};
1737*495ae853SAndroid Build Coastguard Worker 
1738*495ae853SAndroid Build Coastguard Worker     s_sei_sii_params_ip.e_cmd = IVE_CMD_VIDEO_CTL;
1739*495ae853SAndroid Build Coastguard Worker     s_sei_sii_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_SEI_SII_PARAMS;
1740*495ae853SAndroid Build Coastguard Worker 
1741*495ae853SAndroid Build Coastguard Worker     s_sei_sii_params_ip.u4_sii_sub_layer_idx = ps_app_ctxt->u4_sii_sub_layer_idx;
1742*495ae853SAndroid Build Coastguard Worker 
1743*495ae853SAndroid Build Coastguard Worker     if(0 == s_sei_sii_params_ip.u4_sii_sub_layer_idx)
1744*495ae853SAndroid Build Coastguard Worker     {
1745*495ae853SAndroid Build Coastguard Worker         s_sei_sii_params_ip.u1_shutter_interval_info_present_flag =
1746*495ae853SAndroid Build Coastguard Worker             (UWORD8) ps_app_ctxt->u4_shutter_interval_info_present_flag;
1747*495ae853SAndroid Build Coastguard Worker 
1748*495ae853SAndroid Build Coastguard Worker         if(1 == s_sei_sii_params_ip.u1_shutter_interval_info_present_flag)
1749*495ae853SAndroid Build Coastguard Worker         {
1750*495ae853SAndroid Build Coastguard Worker             s_sei_sii_params_ip.u4_sii_time_scale = ps_app_ctxt->u4_sii_time_scale;
1751*495ae853SAndroid Build Coastguard Worker             s_sei_sii_params_ip.u1_fixed_shutter_interval_within_cvs_flag =
1752*495ae853SAndroid Build Coastguard Worker                 (UWORD8) ps_app_ctxt->u4_fixed_shutter_interval_within_cvs_flag;
1753*495ae853SAndroid Build Coastguard Worker 
1754*495ae853SAndroid Build Coastguard Worker             if(1 == s_sei_sii_params_ip.u1_fixed_shutter_interval_within_cvs_flag)
1755*495ae853SAndroid Build Coastguard Worker             {
1756*495ae853SAndroid Build Coastguard Worker                 s_sei_sii_params_ip.u4_sii_num_units_in_shutter_interval =
1757*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->u4_sii_num_units_in_shutter_interval;
1758*495ae853SAndroid Build Coastguard Worker             }
1759*495ae853SAndroid Build Coastguard Worker             else
1760*495ae853SAndroid Build Coastguard Worker             {
1761*495ae853SAndroid Build Coastguard Worker                 s_sei_sii_params_ip.u1_sii_max_sub_layers_minus1 =
1762*495ae853SAndroid Build Coastguard Worker                     (UWORD8) ps_app_ctxt->u4_sii_max_sub_layers_minus1;
1763*495ae853SAndroid Build Coastguard Worker 
1764*495ae853SAndroid Build Coastguard Worker                 for(i = 0; i <= s_sei_sii_params_ip.u1_sii_max_sub_layers_minus1; i++)
1765*495ae853SAndroid Build Coastguard Worker                 {
1766*495ae853SAndroid Build Coastguard Worker                     s_sei_sii_params_ip.au4_sub_layer_num_units_in_shutter_interval[i] =
1767*495ae853SAndroid Build Coastguard Worker                         ps_app_ctxt->au4_sub_layer_num_units_in_shutter_interval[i];
1768*495ae853SAndroid Build Coastguard Worker                 }
1769*495ae853SAndroid Build Coastguard Worker             }
1770*495ae853SAndroid Build Coastguard Worker         }
1771*495ae853SAndroid Build Coastguard Worker     }
1772*495ae853SAndroid Build Coastguard Worker 
1773*495ae853SAndroid Build Coastguard Worker     s_sei_sii_params_ip.u4_timestamp_high = u4_timestamp_high;
1774*495ae853SAndroid Build Coastguard Worker     s_sei_sii_params_ip.u4_timestamp_low = u4_timestamp_low;
1775*495ae853SAndroid Build Coastguard Worker 
1776*495ae853SAndroid Build Coastguard Worker     s_sei_sii_params_ip.u4_size = sizeof(ih264e_ctl_set_sei_sii_params_ip_t);
1777*495ae853SAndroid Build Coastguard Worker     s_sei_sii_params_op.u4_size = sizeof(ih264e_ctl_set_sei_sii_params_op_t);
1778*495ae853SAndroid Build Coastguard Worker 
1779*495ae853SAndroid Build Coastguard Worker     for(i = 0; i <= s_sei_sii_params_ip.u1_sii_max_sub_layers_minus1; i++)
1780*495ae853SAndroid Build Coastguard Worker     {
1781*495ae853SAndroid Build Coastguard Worker         au4_sub_layer_num_units_in_shutter_interval_flag =
1782*495ae853SAndroid Build Coastguard Worker             (au4_sub_layer_num_units_in_shutter_interval_flag ||
1783*495ae853SAndroid Build Coastguard Worker              (ps_app_ctxt->s_sei_sii_params.au4_sub_layer_num_units_in_shutter_interval[i] !=
1784*495ae853SAndroid Build Coastguard Worker               s_sei_sii_params_ip.au4_sub_layer_num_units_in_shutter_interval[i]));
1785*495ae853SAndroid Build Coastguard Worker     }
1786*495ae853SAndroid Build Coastguard Worker 
1787*495ae853SAndroid Build Coastguard Worker     if((ps_app_ctxt->s_sei_sii_params.u4_sii_sub_layer_idx !=
1788*495ae853SAndroid Build Coastguard Worker         s_sei_sii_params_ip.u4_sii_sub_layer_idx) ||
1789*495ae853SAndroid Build Coastguard Worker        (ps_app_ctxt->s_sei_sii_params.u1_shutter_interval_info_present_flag !=
1790*495ae853SAndroid Build Coastguard Worker         s_sei_sii_params_ip.u1_shutter_interval_info_present_flag) ||
1791*495ae853SAndroid Build Coastguard Worker        (ps_app_ctxt->s_sei_sii_params.u4_sii_time_scale != s_sei_sii_params_ip.u4_sii_time_scale) ||
1792*495ae853SAndroid Build Coastguard Worker        (ps_app_ctxt->s_sei_sii_params.u1_fixed_shutter_interval_within_cvs_flag !=
1793*495ae853SAndroid Build Coastguard Worker         s_sei_sii_params_ip.u1_fixed_shutter_interval_within_cvs_flag) ||
1794*495ae853SAndroid Build Coastguard Worker        (ps_app_ctxt->s_sei_sii_params.u4_sii_num_units_in_shutter_interval !=
1795*495ae853SAndroid Build Coastguard Worker         s_sei_sii_params_ip.u4_sii_num_units_in_shutter_interval) ||
1796*495ae853SAndroid Build Coastguard Worker        (ps_app_ctxt->s_sei_sii_params.u1_sii_max_sub_layers_minus1 !=
1797*495ae853SAndroid Build Coastguard Worker         s_sei_sii_params_ip.u1_sii_max_sub_layers_minus1) ||
1798*495ae853SAndroid Build Coastguard Worker        au4_sub_layer_num_units_in_shutter_interval_flag)
1799*495ae853SAndroid Build Coastguard Worker     {
1800*495ae853SAndroid Build Coastguard Worker         status =
1801*495ae853SAndroid Build Coastguard Worker             ih264e_api_function(ps_app_ctxt->ps_enc, &s_sei_sii_params_ip, &s_sei_sii_params_op);
1802*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
1803*495ae853SAndroid Build Coastguard Worker         {
1804*495ae853SAndroid Build Coastguard Worker             printf("Unable to set sei sii params = 0x%x\n", s_sei_sii_params_op.u4_error_code);
1805*495ae853SAndroid Build Coastguard Worker         }
1806*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->s_sei_sii_params = s_sei_sii_params_ip;
1807*495ae853SAndroid Build Coastguard Worker     }
1808*495ae853SAndroid Build Coastguard Worker     return;
1809*495ae853SAndroid Build Coastguard Worker }
1810*495ae853SAndroid Build Coastguard Worker 
1811*495ae853SAndroid Build Coastguard Worker /**
1812*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1813*495ae853SAndroid Build Coastguard Worker * @brief encode input
1814*495ae853SAndroid Build Coastguard Worker *******************************************************************************
1815*495ae853SAndroid Build Coastguard Worker */
synchronous_encode(iv_obj_t * ps_enc,app_ctxt_t * ps_app_ctxt)1816*495ae853SAndroid Build Coastguard Worker void synchronous_encode(iv_obj_t *ps_enc, app_ctxt_t *ps_app_ctxt)
1817*495ae853SAndroid Build Coastguard Worker {
1818*495ae853SAndroid Build Coastguard Worker #define PEAK_WINDOW_SIZE    8
1819*495ae853SAndroid Build Coastguard Worker     ih264e_video_encode_ip_t ih264e_video_encode_ip = {0};
1820*495ae853SAndroid Build Coastguard Worker     ih264e_video_encode_op_t ih264e_video_encode_op = {0};
1821*495ae853SAndroid Build Coastguard Worker 
1822*495ae853SAndroid Build Coastguard Worker     ive_video_encode_ip_t *ps_video_encode_ip = &ih264e_video_encode_ip.s_ive_ip;
1823*495ae853SAndroid Build Coastguard Worker     ive_video_encode_op_t *ps_video_encode_op = &ih264e_video_encode_op.s_ive_op;
1824*495ae853SAndroid Build Coastguard Worker 
1825*495ae853SAndroid Build Coastguard Worker     iv_raw_buf_t *ps_inp_raw_buf = &ps_video_encode_ip->s_inp_buf;
1826*495ae853SAndroid Build Coastguard Worker 
1827*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status = IV_SUCCESS;
1828*495ae853SAndroid Build Coastguard Worker 
1829*495ae853SAndroid Build Coastguard Worker     WORD32 i, is_last = 0, buff_size = 0, num_bytes = 0;
1830*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_total_time = 0;
1831*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_buf = NULL;
1832*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_timestamp_low = 0, u4_timestamp_high = 0;
1833*495ae853SAndroid Build Coastguard Worker     void *pv_mb_info = NULL, *pv_pic_info = NULL;
1834*495ae853SAndroid Build Coastguard Worker 
1835*495ae853SAndroid Build Coastguard Worker     TIMER curtime;
1836*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
1837*495ae853SAndroid Build Coastguard Worker     TIMER frequency;
1838*495ae853SAndroid Build Coastguard Worker #endif
1839*495ae853SAndroid Build Coastguard Worker     WORD32 peak_window[PEAK_WINDOW_SIZE] = {0};
1840*495ae853SAndroid Build Coastguard Worker     WORD32 peak_window_idx = 0;
1841*495ae853SAndroid Build Coastguard Worker     WORD32 peak_avg_max = 0, timetaken = 0;
1842*495ae853SAndroid Build Coastguard Worker     iv_raw_buf_t s_inp_buf, s_recon_buf;
1843*495ae853SAndroid Build Coastguard Worker     CHAR ac_error[STRLENGTH];
1844*495ae853SAndroid Build Coastguard Worker     WORD32 end_of_frames = 0;
1845*495ae853SAndroid Build Coastguard Worker     WORD32 i4_inp_done = 0;
1846*495ae853SAndroid Build Coastguard Worker 
1847*495ae853SAndroid Build Coastguard Worker     /* Allocate I/O Buffers */
1848*495ae853SAndroid Build Coastguard Worker     allocate_input(ps_app_ctxt);
1849*495ae853SAndroid Build Coastguard Worker     allocate_output(ps_app_ctxt);
1850*495ae853SAndroid Build Coastguard Worker     allocate_recon(ps_app_ctxt);
1851*495ae853SAndroid Build Coastguard Worker 
1852*495ae853SAndroid Build Coastguard Worker     /* init psnr ctxt */
1853*495ae853SAndroid Build Coastguard Worker     init_psnr(ps_app_ctxt);
1854*495ae853SAndroid Build Coastguard Worker 
1855*495ae853SAndroid Build Coastguard Worker     /* open file pointers */
1856*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_ip = fopen(ps_app_ctxt->ac_ip_fname, "rb");
1857*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_app_ctxt->fp_ip)
1858*495ae853SAndroid Build Coastguard Worker     {
1859*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to open input file for reading: %s",
1860*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->ac_ip_fname);
1861*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit(ac_error);
1862*495ae853SAndroid Build Coastguard Worker     }
1863*495ae853SAndroid Build Coastguard Worker 
1864*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->fp_op = fopen(ps_app_ctxt->ac_op_fname, "wb");
1865*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_app_ctxt->fp_op)
1866*495ae853SAndroid Build Coastguard Worker     {
1867*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Unable to open output file for writing: %s",
1868*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->ac_op_fname);
1869*495ae853SAndroid Build Coastguard Worker         invalid_argument_exit(ac_error);
1870*495ae853SAndroid Build Coastguard Worker     }
1871*495ae853SAndroid Build Coastguard Worker 
1872*495ae853SAndroid Build Coastguard Worker     if(1 == ps_app_ctxt->u4_recon_enable)
1873*495ae853SAndroid Build Coastguard Worker     {
1874*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->fp_recon = fopen(ps_app_ctxt->ac_recon_fname, "wb");
1875*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_app_ctxt->fp_recon)
1876*495ae853SAndroid Build Coastguard Worker         {
1877*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to open recon file for writing: %s",
1878*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->ac_recon_fname);
1879*495ae853SAndroid Build Coastguard Worker             invalid_argument_exit(ac_error);
1880*495ae853SAndroid Build Coastguard Worker         }
1881*495ae853SAndroid Build Coastguard Worker     }
1882*495ae853SAndroid Build Coastguard Worker 
1883*495ae853SAndroid Build Coastguard Worker     if(1 == ps_app_ctxt->u4_chksum_enable)
1884*495ae853SAndroid Build Coastguard Worker     {
1885*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->fp_chksum = fopen(ps_app_ctxt->ac_chksum_fname, "wb");
1886*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_app_ctxt->fp_chksum)
1887*495ae853SAndroid Build Coastguard Worker         {
1888*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to open checksum file for writing: %s",
1889*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->ac_chksum_fname);
1890*495ae853SAndroid Build Coastguard Worker             invalid_argument_exit(ac_error);
1891*495ae853SAndroid Build Coastguard Worker         }
1892*495ae853SAndroid Build Coastguard Worker     }
1893*495ae853SAndroid Build Coastguard Worker 
1894*495ae853SAndroid Build Coastguard Worker     /*
1895*495ae853SAndroid Build Coastguard Worker      * If PSNR is enabled, open input file again and hold a different file pointer
1896*495ae853SAndroid Build Coastguard Worker      * This makes it easy to compute PSNR without adding dependency between
1897*495ae853SAndroid Build Coastguard Worker      * input and recon threads
1898*495ae853SAndroid Build Coastguard Worker      */
1899*495ae853SAndroid Build Coastguard Worker     if(1 == ps_app_ctxt->u4_psnr_enable)
1900*495ae853SAndroid Build Coastguard Worker     {
1901*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->fp_psnr_ip = fopen(ps_app_ctxt->ac_ip_fname, "rb");
1902*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_app_ctxt->fp_psnr_ip)
1903*495ae853SAndroid Build Coastguard Worker         {
1904*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to open input file for reading: %s",
1905*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->ac_ip_fname);
1906*495ae853SAndroid Build Coastguard Worker             invalid_argument_exit(ac_error);
1907*495ae853SAndroid Build Coastguard Worker         }
1908*495ae853SAndroid Build Coastguard Worker     }
1909*495ae853SAndroid Build Coastguard Worker 
1910*495ae853SAndroid Build Coastguard Worker     if(0 != ps_app_ctxt->u4_mb_info_type)
1911*495ae853SAndroid Build Coastguard Worker     {
1912*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->fp_mb_info = fopen(ps_app_ctxt->ac_mb_info_fname, "rb");
1913*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_app_ctxt->fp_mb_info)
1914*495ae853SAndroid Build Coastguard Worker         {
1915*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to open MB info file for reading: %s",
1916*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->ac_mb_info_fname);
1917*495ae853SAndroid Build Coastguard Worker             invalid_argument_exit(ac_error);
1918*495ae853SAndroid Build Coastguard Worker         }
1919*495ae853SAndroid Build Coastguard Worker     }
1920*495ae853SAndroid Build Coastguard Worker 
1921*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctxt->u4_pic_info_type)
1922*495ae853SAndroid Build Coastguard Worker     {
1923*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->fp_pic_info = fopen(ps_app_ctxt->ac_pic_info_fname, "rb");
1924*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_app_ctxt->fp_pic_info)
1925*495ae853SAndroid Build Coastguard Worker         {
1926*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to open Pic info file for reading: %s",
1927*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->ac_pic_info_fname);
1928*495ae853SAndroid Build Coastguard Worker             invalid_argument_exit(ac_error);
1929*495ae853SAndroid Build Coastguard Worker         }
1930*495ae853SAndroid Build Coastguard Worker     }
1931*495ae853SAndroid Build Coastguard Worker 
1932*495ae853SAndroid Build Coastguard Worker     /*****************************************************************************/
1933*495ae853SAndroid Build Coastguard Worker     /*   Video control Set in Encode header mode                                 */
1934*495ae853SAndroid Build Coastguard Worker     /*****************************************************************************/
1935*495ae853SAndroid Build Coastguard Worker     set_enc_mode(ps_app_ctxt, -1, -1, IVE_ENC_MODE_HEADER);
1936*495ae853SAndroid Build Coastguard Worker 
1937*495ae853SAndroid Build Coastguard Worker     // Encode header
1938*495ae853SAndroid Build Coastguard Worker     memset(&ih264e_video_encode_ip, 0, sizeof(ih264e_video_encode_ip));
1939*495ae853SAndroid Build Coastguard Worker     memset(&ih264e_video_encode_op, 0, sizeof(ih264e_video_encode_op));
1940*495ae853SAndroid Build Coastguard Worker 
1941*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->u4_size = sizeof(ih264e_video_encode_ip_t);
1942*495ae853SAndroid Build Coastguard Worker     ps_video_encode_op->u4_size = sizeof(ih264e_video_encode_op_t);
1943*495ae853SAndroid Build Coastguard Worker 
1944*495ae853SAndroid Build Coastguard Worker     ps_inp_raw_buf->apv_bufs[0] = NULL;
1945*495ae853SAndroid Build Coastguard Worker     ps_inp_raw_buf->apv_bufs[1] = NULL;
1946*495ae853SAndroid Build Coastguard Worker     ps_inp_raw_buf->apv_bufs[2] = NULL;
1947*495ae853SAndroid Build Coastguard Worker 
1948*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE;
1949*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->pv_bufs = NULL;
1950*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->pv_mb_info = NULL;
1951*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->pv_pic_info = NULL;
1952*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->u4_pic_info_type = ps_app_ctxt->u4_pic_info_type;
1953*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->u4_is_last = 0;
1954*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->u4_mb_info_type = ps_app_ctxt->u4_mb_info_type;
1955*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->u4_pic_info_type = ps_app_ctxt->u4_pic_info_type;
1956*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->s_out_buf.pv_buf = ps_app_ctxt->as_output_buf[0].pu1_buf;
1957*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->s_out_buf.u4_bytes = 0;
1958*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->s_out_buf.u4_bufsize = ps_app_ctxt->as_output_buf[0].u4_buf_size;
1959*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->u4_timestamp_high = 0;
1960*495ae853SAndroid Build Coastguard Worker     ps_video_encode_ip->u4_timestamp_low = 0;
1961*495ae853SAndroid Build Coastguard Worker 
1962*495ae853SAndroid Build Coastguard Worker     status = ih264e_api_function(ps_enc, &ih264e_video_encode_ip, &ih264e_video_encode_op);
1963*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != status)
1964*495ae853SAndroid Build Coastguard Worker     {
1965*495ae853SAndroid Build Coastguard Worker         printf("Encode Header failed = 0x%x\n", ih264e_video_encode_op.s_ive_op.u4_error_code);
1966*495ae853SAndroid Build Coastguard Worker         return;
1967*495ae853SAndroid Build Coastguard Worker     }
1968*495ae853SAndroid Build Coastguard Worker 
1969*495ae853SAndroid Build Coastguard Worker     if(1 == ps_video_encode_op->output_present)
1970*495ae853SAndroid Build Coastguard Worker     {
1971*495ae853SAndroid Build Coastguard Worker         status = write_output(ps_app_ctxt->fp_op, (UWORD8 *) ps_video_encode_op->s_out_buf.pv_buf,
1972*495ae853SAndroid Build Coastguard Worker                               ps_video_encode_op->s_out_buf.u4_bytes);
1973*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS != status)
1974*495ae853SAndroid Build Coastguard Worker         {
1975*495ae853SAndroid Build Coastguard Worker             printf("Error: Unable to write to output file\n");
1976*495ae853SAndroid Build Coastguard Worker             return;
1977*495ae853SAndroid Build Coastguard Worker         }
1978*495ae853SAndroid Build Coastguard Worker     }
1979*495ae853SAndroid Build Coastguard Worker 
1980*495ae853SAndroid Build Coastguard Worker     /*****************************************************************************/
1981*495ae853SAndroid Build Coastguard Worker     /*   Video control Set in Encode picture mode                                */
1982*495ae853SAndroid Build Coastguard Worker     /*****************************************************************************/
1983*495ae853SAndroid Build Coastguard Worker     set_enc_mode(ps_app_ctxt, -1, -1, IVE_ENC_MODE_PICTURE);
1984*495ae853SAndroid Build Coastguard Worker 
1985*495ae853SAndroid Build Coastguard Worker     GETTIME(&ps_app_ctxt->enc_start_time);
1986*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->enc_last_time = ps_app_ctxt->enc_start_time;
1987*495ae853SAndroid Build Coastguard Worker 
1988*495ae853SAndroid Build Coastguard Worker     while(1)
1989*495ae853SAndroid Build Coastguard Worker     {
1990*495ae853SAndroid Build Coastguard Worker         IV_PICTURE_CODING_TYPE_T  e_frame_type;
1991*495ae853SAndroid Build Coastguard Worker         WORD32 i4_count;
1992*495ae853SAndroid Build Coastguard Worker 
1993*495ae853SAndroid Build Coastguard Worker         /* Default sei params values*/
1994*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->u4_sei_mdcv_params_present_flag = 1;
1995*495ae853SAndroid Build Coastguard Worker         if(1 == ps_app_ctxt->u4_sei_mdcv_params_present_flag)
1996*495ae853SAndroid Build Coastguard Worker         {
1997*495ae853SAndroid Build Coastguard Worker             for(i4_count = 0; i4_count < NUM_SEI_MDCV_PRIMARIES; i4_count++)
1998*495ae853SAndroid Build Coastguard Worker             {
1999*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->au4_display_primaries_x[i4_count] = 0;
2000*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->au4_display_primaries_y[i4_count] = 0;
2001*495ae853SAndroid Build Coastguard Worker             }
2002*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_white_point_x = 0;
2003*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_white_point_y = 0;
2004*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_max_display_mastering_luminance = DEFAULT_MAX_DISPLAY_MASTERING_LUMINANCE;
2005*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_min_display_mastering_luminance = DEFAULT_MIN_DISPLAY_MASTERING_LUMINANCE;
2006*495ae853SAndroid Build Coastguard Worker             set_sei_mdcv_params(ps_app_ctxt, u4_timestamp_low, u4_timestamp_high);
2007*495ae853SAndroid Build Coastguard Worker         }
2008*495ae853SAndroid Build Coastguard Worker 
2009*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->u4_sei_cll_params_present_flag = 1;
2010*495ae853SAndroid Build Coastguard Worker         if(1 == ps_app_ctxt->u4_sei_cll_params_present_flag)
2011*495ae853SAndroid Build Coastguard Worker         {
2012*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_max_content_light_level = 0;
2013*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_max_pic_average_light_level = 0;
2014*495ae853SAndroid Build Coastguard Worker             set_sei_cll_params(ps_app_ctxt, u4_timestamp_low, u4_timestamp_high);
2015*495ae853SAndroid Build Coastguard Worker         }
2016*495ae853SAndroid Build Coastguard Worker 
2017*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->u4_sei_ave_params_present_flag = 1;
2018*495ae853SAndroid Build Coastguard Worker         if(1 == ps_app_ctxt->u4_sei_ave_params_present_flag)
2019*495ae853SAndroid Build Coastguard Worker         {
2020*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ambient_illuminance = 1;
2021*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ambient_light_x = 0;
2022*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ambient_light_y = 0;
2023*495ae853SAndroid Build Coastguard Worker             set_sei_ave_params(ps_app_ctxt, u4_timestamp_low, u4_timestamp_high);
2024*495ae853SAndroid Build Coastguard Worker         }
2025*495ae853SAndroid Build Coastguard Worker 
2026*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->u4_sei_ccv_params_present_flag = 1;
2027*495ae853SAndroid Build Coastguard Worker         if(1 == ps_app_ctxt->u4_sei_ccv_params_present_flag)
2028*495ae853SAndroid Build Coastguard Worker         {
2029*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_cancel_flag = 0;
2030*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_persistence_flag = 1;
2031*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_primaries_present_flag = 1;
2032*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_min_luminance_value_present_flag = 1;
2033*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_max_luminance_value_present_flag = 1;
2034*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_avg_luminance_value_present_flag = 1;
2035*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_reserved_zero_2bits = 0;
2036*495ae853SAndroid Build Coastguard Worker             for(i4_count = 0; i4_count < NUM_SEI_CCV_PRIMARIES; i4_count++)
2037*495ae853SAndroid Build Coastguard Worker             {
2038*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->ai4_ccv_primaries_x[i4_count] = 1;
2039*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->ai4_ccv_primaries_y[i4_count] = 1;
2040*495ae853SAndroid Build Coastguard Worker             }
2041*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_min_luminance_value = 1;
2042*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_max_luminance_value = 1;
2043*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_ccv_avg_luminance_value = 1;
2044*495ae853SAndroid Build Coastguard Worker             set_sei_ccv_params(ps_app_ctxt, u4_timestamp_low, u4_timestamp_high);
2045*495ae853SAndroid Build Coastguard Worker         }
2046*495ae853SAndroid Build Coastguard Worker 
2047*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->u4_sii_sub_layer_idx = SII_SUB_LAYER_IDX;
2048*495ae853SAndroid Build Coastguard Worker 
2049*495ae853SAndroid Build Coastguard Worker         if(0 == ps_app_ctxt->u4_sii_sub_layer_idx)
2050*495ae853SAndroid Build Coastguard Worker         {
2051*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->u4_shutter_interval_info_present_flag = SHUTTER_INTERVAL_INFO_PRESENT_FLAG;
2052*495ae853SAndroid Build Coastguard Worker 
2053*495ae853SAndroid Build Coastguard Worker             if(1 == ps_app_ctxt->u4_shutter_interval_info_present_flag)
2054*495ae853SAndroid Build Coastguard Worker             {
2055*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->u4_sii_time_scale = SII_TIME_SCALE;
2056*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->u4_fixed_shutter_interval_within_cvs_flag =
2057*495ae853SAndroid Build Coastguard Worker                     FIXED_SHUTTER_INTERVAL_WITHIN_CVS_FLAG;
2058*495ae853SAndroid Build Coastguard Worker 
2059*495ae853SAndroid Build Coastguard Worker                 if(1 == ps_app_ctxt->u4_fixed_shutter_interval_within_cvs_flag)
2060*495ae853SAndroid Build Coastguard Worker                 {
2061*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->u4_sii_num_units_in_shutter_interval =
2062*495ae853SAndroid Build Coastguard Worker                         SII_NUM_UNITS_IN_SHUTTER_INTERVAL;
2063*495ae853SAndroid Build Coastguard Worker                 }
2064*495ae853SAndroid Build Coastguard Worker                 else
2065*495ae853SAndroid Build Coastguard Worker                 {
2066*495ae853SAndroid Build Coastguard Worker                     int i;
2067*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->u4_sii_max_sub_layers_minus1 = SII_MAX_SUB_LAYERS_MINUS1;
2068*495ae853SAndroid Build Coastguard Worker 
2069*495ae853SAndroid Build Coastguard Worker                     for(i = 0; i <= (int) ps_app_ctxt->u4_sii_max_sub_layers_minus1; i++)
2070*495ae853SAndroid Build Coastguard Worker                     {
2071*495ae853SAndroid Build Coastguard Worker                         ps_app_ctxt->au4_sub_layer_num_units_in_shutter_interval[i] =
2072*495ae853SAndroid Build Coastguard Worker                             SUB_LAYER_NUM_UNITS_IN_SHUTTER_INTERVAL_HFR;
2073*495ae853SAndroid Build Coastguard Worker                     }
2074*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->au4_sub_layer_num_units_in_shutter_interval
2075*495ae853SAndroid Build Coastguard Worker                         [ps_app_ctxt->u4_sii_max_sub_layers_minus1] =
2076*495ae853SAndroid Build Coastguard Worker                         SUB_LAYER_NUM_UNITS_IN_SHUTTER_INTERVAL_SFR;
2077*495ae853SAndroid Build Coastguard Worker                 }
2078*495ae853SAndroid Build Coastguard Worker             }
2079*495ae853SAndroid Build Coastguard Worker         }
2080*495ae853SAndroid Build Coastguard Worker         set_sei_sii_params(ps_app_ctxt, u4_timestamp_low, u4_timestamp_high);
2081*495ae853SAndroid Build Coastguard Worker 
2082*495ae853SAndroid Build Coastguard Worker         /* Input Initialization */
2083*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < DEFAULT_MAX_INPUT_BUFS; i++)
2084*495ae853SAndroid Build Coastguard Worker         {
2085*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->as_input_buf[i].u4_is_free)
2086*495ae853SAndroid Build Coastguard Worker             {
2087*495ae853SAndroid Build Coastguard Worker                 pu1_buf = ps_app_ctxt->as_input_buf[i].pu1_buf;
2088*495ae853SAndroid Build Coastguard Worker                 pv_mb_info = ps_app_ctxt->as_input_buf[i].pv_mb_info;
2089*495ae853SAndroid Build Coastguard Worker                 pv_pic_info = ps_app_ctxt->as_input_buf[i].pv_pic_info;
2090*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->as_input_buf[i].u4_is_free = 0;
2091*495ae853SAndroid Build Coastguard Worker                 break;
2092*495ae853SAndroid Build Coastguard Worker             }
2093*495ae853SAndroid Build Coastguard Worker         }
2094*495ae853SAndroid Build Coastguard Worker         if (i == DEFAULT_MAX_INPUT_BUFS)
2095*495ae853SAndroid Build Coastguard Worker         {
2096*495ae853SAndroid Build Coastguard Worker             printf("\n Unable to find a free input buffer!!");
2097*495ae853SAndroid Build Coastguard Worker             exit(0);
2098*495ae853SAndroid Build Coastguard Worker         }
2099*495ae853SAndroid Build Coastguard Worker 
2100*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->u4_size = sizeof(ih264e_video_encode_ip_t);
2101*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE;
2102*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->pv_bufs = pu1_buf;
2103*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->pv_mb_info = pv_mb_info;
2104*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->pv_pic_info = pv_pic_info;
2105*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->u4_pic_info_type = ps_app_ctxt->u4_pic_info_type;
2106*495ae853SAndroid Build Coastguard Worker 
2107*495ae853SAndroid Build Coastguard Worker         ps_video_encode_op->u4_size = sizeof(ih264e_video_encode_op_t);
2108*495ae853SAndroid Build Coastguard Worker 
2109*495ae853SAndroid Build Coastguard Worker         /*
2110*495ae853SAndroid Build Coastguard Worker          * Since the buffers are used for reading,
2111*495ae853SAndroid Build Coastguard Worker          * And after each row we have a stride we need to calculate
2112*495ae853SAndroid Build Coastguard Worker          * the luma size according to the stride
2113*495ae853SAndroid Build Coastguard Worker          */
2114*495ae853SAndroid Build Coastguard Worker         ps_inp_raw_buf->e_color_fmt = ps_app_ctxt->e_inp_color_fmt;
2115*495ae853SAndroid Build Coastguard Worker         if(IV_YUV_420SP_UV == ps_app_ctxt->e_inp_color_fmt
2116*495ae853SAndroid Build Coastguard Worker                         || IV_YUV_420SP_VU == ps_app_ctxt->e_inp_color_fmt)
2117*495ae853SAndroid Build Coastguard Worker         {
2118*495ae853SAndroid Build Coastguard Worker             /* init luma buffer */
2119*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
2120*495ae853SAndroid Build Coastguard Worker 
2121*495ae853SAndroid Build Coastguard Worker             /* init chroma buffer */
2122*495ae853SAndroid Build Coastguard Worker             pu1_buf += ps_app_ctxt->u4_strd * ps_app_ctxt->u4_ht;
2123*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[1] = pu1_buf;
2124*495ae853SAndroid Build Coastguard Worker 
2125*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_wd[0] = ps_app_ctxt->u4_wd;
2126*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_wd[1] = ps_app_ctxt->u4_wd;
2127*495ae853SAndroid Build Coastguard Worker 
2128*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_ht[0] = ps_app_ctxt->u4_ht;
2129*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_ht[1] = ps_app_ctxt->u4_ht / 2;
2130*495ae853SAndroid Build Coastguard Worker 
2131*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_strd[0] = ps_app_ctxt->u4_strd;
2132*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_strd[1] = ps_app_ctxt->u4_strd;
2133*495ae853SAndroid Build Coastguard Worker         }
2134*495ae853SAndroid Build Coastguard Worker         else if(IV_YUV_420P == ps_app_ctxt->e_inp_color_fmt)
2135*495ae853SAndroid Build Coastguard Worker         {
2136*495ae853SAndroid Build Coastguard Worker             /* init luma buffer */
2137*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
2138*495ae853SAndroid Build Coastguard Worker             pu1_buf += (ps_app_ctxt->u4_wd) * ps_app_ctxt->u4_ht;
2139*495ae853SAndroid Build Coastguard Worker 
2140*495ae853SAndroid Build Coastguard Worker             /* init chroma buffer U */
2141*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[1] = pu1_buf;
2142*495ae853SAndroid Build Coastguard Worker             pu1_buf += (ps_app_ctxt->u4_wd >> 1) * (ps_app_ctxt->u4_ht >> 1);
2143*495ae853SAndroid Build Coastguard Worker 
2144*495ae853SAndroid Build Coastguard Worker             /* init chroma buffer V */
2145*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[2] = pu1_buf;
2146*495ae853SAndroid Build Coastguard Worker 
2147*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_wd[0] = ps_app_ctxt->u4_wd;
2148*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_wd[1] = ps_app_ctxt->u4_wd / 2;
2149*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_wd[2] = ps_app_ctxt->u4_wd / 2;
2150*495ae853SAndroid Build Coastguard Worker 
2151*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_ht[0] = ps_app_ctxt->u4_ht;
2152*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_ht[1] = ps_app_ctxt->u4_ht / 2;
2153*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_ht[2] = ps_app_ctxt->u4_ht / 2;
2154*495ae853SAndroid Build Coastguard Worker 
2155*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_strd[0] = ps_app_ctxt->u4_strd;
2156*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_strd[1] = ps_app_ctxt->u4_strd / 2;
2157*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_strd[2] = ps_app_ctxt->u4_strd / 2;
2158*495ae853SAndroid Build Coastguard Worker 
2159*495ae853SAndroid Build Coastguard Worker         }
2160*495ae853SAndroid Build Coastguard Worker         else if(IV_YUV_422ILE == ps_app_ctxt->e_inp_color_fmt)
2161*495ae853SAndroid Build Coastguard Worker         {
2162*495ae853SAndroid Build Coastguard Worker             /* init luma buffer */
2163*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[0] = pu1_buf;
2164*495ae853SAndroid Build Coastguard Worker 
2165*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_wd[0] = ps_app_ctxt->u4_wd * 2;
2166*495ae853SAndroid Build Coastguard Worker 
2167*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_ht[0] = ps_app_ctxt->u4_ht;
2168*495ae853SAndroid Build Coastguard Worker 
2169*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->au4_strd[0] = ps_app_ctxt->u4_strd * 2;
2170*495ae853SAndroid Build Coastguard Worker         }
2171*495ae853SAndroid Build Coastguard Worker 
2172*495ae853SAndroid Build Coastguard Worker         /* Read input and other associated buffers */
2173*495ae853SAndroid Build Coastguard Worker         while(1)
2174*495ae853SAndroid Build Coastguard Worker         {
2175*495ae853SAndroid Build Coastguard Worker             IV_STATUS_T mb_info_status = IV_SUCCESS;
2176*495ae853SAndroid Build Coastguard Worker             IV_STATUS_T pic_info_status = IV_SUCCESS;
2177*495ae853SAndroid Build Coastguard Worker 
2178*495ae853SAndroid Build Coastguard Worker             status = read_input(ps_app_ctxt->fp_ip, ps_inp_raw_buf);
2179*495ae853SAndroid Build Coastguard Worker 
2180*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->u4_mb_info_type != 0)
2181*495ae853SAndroid Build Coastguard Worker             {
2182*495ae853SAndroid Build Coastguard Worker                 mb_info_status = read_mb_info(ps_app_ctxt, pv_mb_info);
2183*495ae853SAndroid Build Coastguard Worker             }
2184*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->u4_pic_info_type != 0)
2185*495ae853SAndroid Build Coastguard Worker             {
2186*495ae853SAndroid Build Coastguard Worker                 pic_info_status = read_pic_info(ps_app_ctxt, pv_pic_info);
2187*495ae853SAndroid Build Coastguard Worker             }
2188*495ae853SAndroid Build Coastguard Worker             if((IV_SUCCESS != status) || (IV_SUCCESS != mb_info_status)
2189*495ae853SAndroid Build Coastguard Worker                             || (IV_SUCCESS != pic_info_status))
2190*495ae853SAndroid Build Coastguard Worker             {
2191*495ae853SAndroid Build Coastguard Worker                 if(0 == ps_app_ctxt->u4_loopback)
2192*495ae853SAndroid Build Coastguard Worker                 {
2193*495ae853SAndroid Build Coastguard Worker                     is_last = 1;
2194*495ae853SAndroid Build Coastguard Worker                     break;
2195*495ae853SAndroid Build Coastguard Worker                 }
2196*495ae853SAndroid Build Coastguard Worker                 else
2197*495ae853SAndroid Build Coastguard Worker                 {
2198*495ae853SAndroid Build Coastguard Worker                     fseek(ps_app_ctxt->fp_ip, 0, SEEK_SET);
2199*495ae853SAndroid Build Coastguard Worker                 }
2200*495ae853SAndroid Build Coastguard Worker             }
2201*495ae853SAndroid Build Coastguard Worker             break;
2202*495ae853SAndroid Build Coastguard Worker         }
2203*495ae853SAndroid Build Coastguard Worker 
2204*495ae853SAndroid Build Coastguard Worker         /* Output Initialization */
2205*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < DEFAULT_MAX_OUTPUT_BUFS; i++)
2206*495ae853SAndroid Build Coastguard Worker         {
2207*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->as_output_buf[i].u4_is_free)
2208*495ae853SAndroid Build Coastguard Worker             {
2209*495ae853SAndroid Build Coastguard Worker                 pu1_buf = ps_app_ctxt->as_output_buf[i].pu1_buf;
2210*495ae853SAndroid Build Coastguard Worker                 buff_size = ps_app_ctxt->as_output_buf[i].u4_buf_size;
2211*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->as_output_buf[i].u4_is_free = 0;
2212*495ae853SAndroid Build Coastguard Worker                 break;
2213*495ae853SAndroid Build Coastguard Worker             }
2214*495ae853SAndroid Build Coastguard Worker         }
2215*495ae853SAndroid Build Coastguard Worker         if (i == DEFAULT_MAX_OUTPUT_BUFS)
2216*495ae853SAndroid Build Coastguard Worker         {
2217*495ae853SAndroid Build Coastguard Worker             printf("\n Unable to find a free output buffer!!");
2218*495ae853SAndroid Build Coastguard Worker             exit(0);
2219*495ae853SAndroid Build Coastguard Worker         }
2220*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->s_out_buf.pv_buf = pu1_buf;
2221*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->s_out_buf.u4_bytes = 0;
2222*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->s_out_buf.u4_bufsize = buff_size;
2223*495ae853SAndroid Build Coastguard Worker 
2224*495ae853SAndroid Build Coastguard Worker         /* Recon Initialization */
2225*495ae853SAndroid Build Coastguard Worker         init_raw_buf_descr(ps_app_ctxt, &s_recon_buf,
2226*495ae853SAndroid Build Coastguard Worker                            ps_app_ctxt->as_recon_buf[0].pu1_buf,
2227*495ae853SAndroid Build Coastguard Worker                            ps_app_ctxt->e_recon_color_fmt);
2228*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->s_recon_buf = s_recon_buf;
2229*495ae853SAndroid Build Coastguard Worker 
2230*495ae853SAndroid Build Coastguard Worker         if(ps_app_ctxt->u4_psnr_enable)
2231*495ae853SAndroid Build Coastguard Worker         {
2232*495ae853SAndroid Build Coastguard Worker             init_raw_buf_descr(ps_app_ctxt, &s_inp_buf,
2233*495ae853SAndroid Build Coastguard Worker                                ps_app_ctxt->pu1_psnr_buf,
2234*495ae853SAndroid Build Coastguard Worker                                ps_app_ctxt->e_inp_color_fmt);
2235*495ae853SAndroid Build Coastguard Worker         }
2236*495ae853SAndroid Build Coastguard Worker 
2237*495ae853SAndroid Build Coastguard Worker         if(0 == ps_app_ctxt->u4_loopback)
2238*495ae853SAndroid Build Coastguard Worker         {
2239*495ae853SAndroid Build Coastguard Worker             /* If input file is read completely and loopback is not enabled,
2240*495ae853SAndroid Build Coastguard Worker              *  then exit the loop */
2241*495ae853SAndroid Build Coastguard Worker             if(feof(ps_app_ctxt->fp_ip))
2242*495ae853SAndroid Build Coastguard Worker             {
2243*495ae853SAndroid Build Coastguard Worker                 is_last = 1;
2244*495ae853SAndroid Build Coastguard Worker             }
2245*495ae853SAndroid Build Coastguard Worker         }
2246*495ae853SAndroid Build Coastguard Worker 
2247*495ae853SAndroid Build Coastguard Worker         /* If last frame, send input null to get back encoded frames */
2248*495ae853SAndroid Build Coastguard Worker         if(is_last == 1 || ((ps_app_ctxt->u4_max_num_frms) <= u4_timestamp_low))
2249*495ae853SAndroid Build Coastguard Worker         {
2250*495ae853SAndroid Build Coastguard Worker             is_last = 1;
2251*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[0] = NULL;
2252*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[1] = NULL;
2253*495ae853SAndroid Build Coastguard Worker             ps_inp_raw_buf->apv_bufs[2] = NULL;
2254*495ae853SAndroid Build Coastguard Worker         }
2255*495ae853SAndroid Build Coastguard Worker 
2256*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->u4_is_last = is_last;
2257*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->u4_mb_info_type = ps_app_ctxt->u4_mb_info_type;
2258*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->u4_pic_info_type = ps_app_ctxt->u4_pic_info_type;
2259*495ae853SAndroid Build Coastguard Worker         ps_video_encode_op->s_out_buf.pv_buf = NULL;
2260*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->u4_timestamp_high = u4_timestamp_high;
2261*495ae853SAndroid Build Coastguard Worker         ps_video_encode_ip->u4_timestamp_low = u4_timestamp_low;
2262*495ae853SAndroid Build Coastguard Worker 
2263*495ae853SAndroid Build Coastguard Worker         GETTIME(&ps_app_ctxt->enc_last_time);
2264*495ae853SAndroid Build Coastguard Worker 
2265*495ae853SAndroid Build Coastguard Worker         /* encoder api call */
2266*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_enc, &ih264e_video_encode_ip,
2267*495ae853SAndroid Build Coastguard Worker                                      &ih264e_video_encode_op);
2268*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS != status)
2269*495ae853SAndroid Build Coastguard Worker         {
2270*495ae853SAndroid Build Coastguard Worker             printf("Encode Frame failed = 0x%x\n",
2271*495ae853SAndroid Build Coastguard Worker                    ih264e_video_encode_op.s_ive_op.u4_error_code);
2272*495ae853SAndroid Build Coastguard Worker             break;
2273*495ae853SAndroid Build Coastguard Worker         }
2274*495ae853SAndroid Build Coastguard Worker 
2275*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
2276*495ae853SAndroid Build Coastguard Worker         QueryPerformanceFrequency ( &frequency);
2277*495ae853SAndroid Build Coastguard Worker #endif
2278*495ae853SAndroid Build Coastguard Worker         GETTIME(&curtime);
2279*495ae853SAndroid Build Coastguard Worker         ELAPSEDTIME(ps_app_ctxt->enc_last_time, curtime, timetaken, frequency);
2280*495ae853SAndroid Build Coastguard Worker         ps_app_ctxt->enc_last_time = curtime;
2281*495ae853SAndroid Build Coastguard Worker 
2282*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
2283*495ae853SAndroid Build Coastguard Worker         {
2284*495ae853SAndroid Build Coastguard Worker             WORD32 peak_avg, id;
2285*495ae853SAndroid Build Coastguard Worker 
2286*495ae853SAndroid Build Coastguard Worker             u4_total_time += timetaken;
2287*495ae853SAndroid Build Coastguard Worker             peak_window[peak_window_idx++] = timetaken;
2288*495ae853SAndroid Build Coastguard Worker             if(peak_window_idx == PEAK_WINDOW_SIZE)
2289*495ae853SAndroid Build Coastguard Worker                 peak_window_idx = 0;
2290*495ae853SAndroid Build Coastguard Worker             peak_avg = 0;
2291*495ae853SAndroid Build Coastguard Worker             for(id = 0; id < PEAK_WINDOW_SIZE; id++)
2292*495ae853SAndroid Build Coastguard Worker             {
2293*495ae853SAndroid Build Coastguard Worker                 peak_avg += peak_window[id];
2294*495ae853SAndroid Build Coastguard Worker             }
2295*495ae853SAndroid Build Coastguard Worker             peak_avg /= PEAK_WINDOW_SIZE;
2296*495ae853SAndroid Build Coastguard Worker             if (peak_avg > peak_avg_max)
2297*495ae853SAndroid Build Coastguard Worker                 peak_avg_max = peak_avg;
2298*495ae853SAndroid Build Coastguard Worker         }
2299*495ae853SAndroid Build Coastguard Worker #endif
2300*495ae853SAndroid Build Coastguard Worker 
2301*495ae853SAndroid Build Coastguard Worker         /* Write Output */
2302*495ae853SAndroid Build Coastguard Worker         num_bytes = 0;
2303*495ae853SAndroid Build Coastguard Worker         if(1 == ps_video_encode_op->output_present)
2304*495ae853SAndroid Build Coastguard Worker         {
2305*495ae853SAndroid Build Coastguard Worker             num_bytes = ps_video_encode_op->s_out_buf.u4_bytes;
2306*495ae853SAndroid Build Coastguard Worker             buff_size = ps_video_encode_op->s_out_buf.u4_bufsize;
2307*495ae853SAndroid Build Coastguard Worker             pu1_buf = (UWORD8*)ps_video_encode_op->s_out_buf.pv_buf;
2308*495ae853SAndroid Build Coastguard Worker             status = write_output(ps_app_ctxt->fp_op, pu1_buf, num_bytes);
2309*495ae853SAndroid Build Coastguard Worker             if(IV_SUCCESS != status)
2310*495ae853SAndroid Build Coastguard Worker             {
2311*495ae853SAndroid Build Coastguard Worker                 printf("Error: Unable to write to output file\n");
2312*495ae853SAndroid Build Coastguard Worker                 break;
2313*495ae853SAndroid Build Coastguard Worker             }
2314*495ae853SAndroid Build Coastguard Worker         }
2315*495ae853SAndroid Build Coastguard Worker 
2316*495ae853SAndroid Build Coastguard Worker         /* free input bufer if codec returns a valid input buffer */
2317*495ae853SAndroid Build Coastguard Worker         if(ps_video_encode_op->s_inp_buf.apv_bufs[0])
2318*495ae853SAndroid Build Coastguard Worker         {
2319*495ae853SAndroid Build Coastguard Worker             /* Reuse of freed input buffer */
2320*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < DEFAULT_MAX_INPUT_BUFS; i++)
2321*495ae853SAndroid Build Coastguard Worker             {
2322*495ae853SAndroid Build Coastguard Worker                 if(ps_app_ctxt->as_input_buf[i].pu1_buf
2323*495ae853SAndroid Build Coastguard Worker                                 == ps_video_encode_op->s_inp_buf.apv_bufs[0])
2324*495ae853SAndroid Build Coastguard Worker                 {
2325*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->as_input_buf[i].u4_is_free = 1;
2326*495ae853SAndroid Build Coastguard Worker                     break;
2327*495ae853SAndroid Build Coastguard Worker                 }
2328*495ae853SAndroid Build Coastguard Worker             }
2329*495ae853SAndroid Build Coastguard Worker         }
2330*495ae853SAndroid Build Coastguard Worker 
2331*495ae853SAndroid Build Coastguard Worker         /* free output buffer if codec returns a valid output buffer */
2332*495ae853SAndroid Build Coastguard Worker         if(ps_video_encode_op->s_out_buf.pv_buf)
2333*495ae853SAndroid Build Coastguard Worker         {
2334*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < DEFAULT_MAX_OUTPUT_BUFS; i++)
2335*495ae853SAndroid Build Coastguard Worker             {
2336*495ae853SAndroid Build Coastguard Worker                 if(ps_app_ctxt->as_output_buf[i].pu1_buf
2337*495ae853SAndroid Build Coastguard Worker                                 == ps_video_encode_op->s_out_buf.pv_buf)
2338*495ae853SAndroid Build Coastguard Worker                 {
2339*495ae853SAndroid Build Coastguard Worker                     ps_app_ctxt->as_output_buf[i].u4_is_free = 1;
2340*495ae853SAndroid Build Coastguard Worker                     break;
2341*495ae853SAndroid Build Coastguard Worker                 }
2342*495ae853SAndroid Build Coastguard Worker             }
2343*495ae853SAndroid Build Coastguard Worker         }
2344*495ae853SAndroid Build Coastguard Worker 
2345*495ae853SAndroid Build Coastguard Worker         /* Print stats */
2346*495ae853SAndroid Build Coastguard Worker         {
2347*495ae853SAndroid Build Coastguard Worker             UWORD8 u1_pic_type[][5] = { "IDR", "I", "P", "B", "NA" };
2348*495ae853SAndroid Build Coastguard Worker             WORD32 lookup_idx = 0;
2349*495ae853SAndroid Build Coastguard Worker 
2350*495ae853SAndroid Build Coastguard Worker             switch(ih264e_video_encode_op.s_ive_op.u4_encoded_frame_type)
2351*495ae853SAndroid Build Coastguard Worker             {
2352*495ae853SAndroid Build Coastguard Worker                 case IV_IDR_FRAME:
2353*495ae853SAndroid Build Coastguard Worker                     lookup_idx = 0;
2354*495ae853SAndroid Build Coastguard Worker                     break;
2355*495ae853SAndroid Build Coastguard Worker                 case IV_I_FRAME:
2356*495ae853SAndroid Build Coastguard Worker                     lookup_idx = 1;
2357*495ae853SAndroid Build Coastguard Worker                     break;
2358*495ae853SAndroid Build Coastguard Worker                 case IV_P_FRAME:
2359*495ae853SAndroid Build Coastguard Worker                     lookup_idx = 2;
2360*495ae853SAndroid Build Coastguard Worker                     break;
2361*495ae853SAndroid Build Coastguard Worker                 case IV_B_FRAME:
2362*495ae853SAndroid Build Coastguard Worker                     lookup_idx = 3;
2363*495ae853SAndroid Build Coastguard Worker                     break;
2364*495ae853SAndroid Build Coastguard Worker                 case IV_NA_FRAME:
2365*495ae853SAndroid Build Coastguard Worker                     lookup_idx = 4;
2366*495ae853SAndroid Build Coastguard Worker                     break;
2367*495ae853SAndroid Build Coastguard Worker                 default:
2368*495ae853SAndroid Build Coastguard Worker                     break;
2369*495ae853SAndroid Build Coastguard Worker             }
2370*495ae853SAndroid Build Coastguard Worker 
2371*495ae853SAndroid Build Coastguard Worker             if(ih264e_video_encode_op.s_ive_op.u4_encoded_frame_type
2372*495ae853SAndroid Build Coastguard Worker                             != IV_NA_FRAME)
2373*495ae853SAndroid Build Coastguard Worker             {
2374*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->u4_pics_cnt++;
2375*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->avg_time = u4_total_time / ps_app_ctxt->u4_pics_cnt;
2376*495ae853SAndroid Build Coastguard Worker                 ps_app_ctxt->u4_total_bytes += num_bytes;
2377*495ae853SAndroid Build Coastguard Worker             }
2378*495ae853SAndroid Build Coastguard Worker 
2379*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->u4_psnr_enable == 0)
2380*495ae853SAndroid Build Coastguard Worker             {
2381*495ae853SAndroid Build Coastguard Worker                 printf("[%s] PicNum %4d Bytes Generated %6d TimeTaken(microsec): %6d AvgTime: %6d PeakAvgTimeMax: %6d\n",
2382*495ae853SAndroid Build Coastguard Worker                        u1_pic_type[lookup_idx], ps_app_ctxt->u4_pics_cnt,
2383*495ae853SAndroid Build Coastguard Worker                        num_bytes, timetaken, ps_app_ctxt->avg_time,
2384*495ae853SAndroid Build Coastguard Worker                        peak_avg_max);
2385*495ae853SAndroid Build Coastguard Worker             }
2386*495ae853SAndroid Build Coastguard Worker         }
2387*495ae853SAndroid Build Coastguard Worker 
2388*495ae853SAndroid Build Coastguard Worker 
2389*495ae853SAndroid Build Coastguard Worker         /* For psnr computation, we need to read the correct input frame and
2390*495ae853SAndroid Build Coastguard Worker          * compare with recon. The difficulty with doing it is that we only know
2391*495ae853SAndroid Build Coastguard Worker          * that the frame number of recon is monotonically increasing. There
2392*495ae853SAndroid Build Coastguard Worker          * may be gaps in the recon if any pre or post enc skip happens. There are
2393*495ae853SAndroid Build Coastguard Worker          * 3 senarios
2394*495ae853SAndroid Build Coastguard Worker          *  1) A frame is encoded -> returns the pic type
2395*495ae853SAndroid Build Coastguard Worker          *  2) A frame is not encoded -> Encoder is waiting, the frame may get
2396*495ae853SAndroid Build Coastguard Worker          *     encoded later
2397*495ae853SAndroid Build Coastguard Worker          *  3) A frame is not encoded -> A post enc or pre enc skip happend. The
2398*495ae853SAndroid Build Coastguard Worker          *     frame is not going to be encoded
2399*495ae853SAndroid Build Coastguard Worker          *
2400*495ae853SAndroid Build Coastguard Worker          *     The 1st and 2nd scenarios are easy, since we just needs to increment
2401*495ae853SAndroid Build Coastguard Worker          *     recon cnt whenever we get a valid recon. This cnt can we used to
2402*495ae853SAndroid Build Coastguard Worker          *     sync the recon and input
2403*495ae853SAndroid Build Coastguard Worker          *     3rd scenario in conjuction with 2nd will pose problems. Even if
2404*495ae853SAndroid Build Coastguard Worker          *     the returning frame is NA, we donot know we should increment the
2405*495ae853SAndroid Build Coastguard Worker          *     recon cnt or not becasue it can be case 2 or case 3.
2406*495ae853SAndroid Build Coastguard Worker          *
2407*495ae853SAndroid Build Coastguard Worker          *  Solutions:
2408*495ae853SAndroid Build Coastguard Worker          *  -------------------------
2409*495ae853SAndroid Build Coastguard Worker          *   One way to over come this will be to return more information as of
2410*495ae853SAndroid Build Coastguard Worker          *   the frame type. We can send if a frame was skipped as a part of the
2411*495ae853SAndroid Build Coastguard Worker          *   return frame type.
2412*495ae853SAndroid Build Coastguard Worker          *   This will not work. Since the output and recon are not in sync, we
2413*495ae853SAndroid Build Coastguard Worker          *   cannot use the current output frame type to determine if a recon
2414*495ae853SAndroid Build Coastguard Worker          *   is present currently or not. We need some other way to acheive this.
2415*495ae853SAndroid Build Coastguard Worker          *
2416*495ae853SAndroid Build Coastguard Worker          *   Other way to do this which is cleaner and maintains the seperation
2417*495ae853SAndroid Build Coastguard Worker          *   between recon and the ouptut is to set the width [& height] of output recon
2418*495ae853SAndroid Build Coastguard Worker          *   buffer to be zero. Hence we will in effect be saying :"look there
2419*495ae853SAndroid Build Coastguard Worker          *   is a recon, but due to frame not being encoded it is having a width 0".
2420*495ae853SAndroid Build Coastguard Worker          *   To be more clear we need to make height also to be zero.
2421*495ae853SAndroid Build Coastguard Worker          *
2422*495ae853SAndroid Build Coastguard Worker          *   But are we using these variables for allocating and deallocating
2423*495ae853SAndroid Build Coastguard Worker          *   the buffers some where ? No we are not. The buffer gets re-init
2424*495ae853SAndroid Build Coastguard Worker          *   at every encode call
2425*495ae853SAndroid Build Coastguard Worker          *
2426*495ae853SAndroid Build Coastguard Worker          *   Fixes
2427*495ae853SAndroid Build Coastguard Worker          *   ------------------------
2428*495ae853SAndroid Build Coastguard Worker          *   Currently the recon buff width and height are set in the encoder.
2429*495ae853SAndroid Build Coastguard Worker          *   This will not work now because since recon and input are not
2430*495ae853SAndroid Build Coastguard Worker          *   in sync. Hence a recon buff sent at time stamp x will get used to
2431*495ae853SAndroid Build Coastguard Worker          *   fill recon of input at time stamp y (x > y). If we reduced the
2432*495ae853SAndroid Build Coastguard Worker          *   frame dimensions in between, the recon buffer will not have enough
2433*495ae853SAndroid Build Coastguard Worker          *   space. Hence we need to set the with and height appropriatley inside
2434*495ae853SAndroid Build Coastguard Worker          *   lib itself.
2435*495ae853SAndroid Build Coastguard Worker          */
2436*495ae853SAndroid Build Coastguard Worker 
2437*495ae853SAndroid Build Coastguard Worker         if (ps_app_ctxt->u4_recon_enable || ps_app_ctxt->u4_chksum_enable
2438*495ae853SAndroid Build Coastguard Worker                         || ps_app_ctxt->u4_psnr_enable)
2439*495ae853SAndroid Build Coastguard Worker         {
2440*495ae853SAndroid Build Coastguard Worker             if (ps_video_encode_op->dump_recon)
2441*495ae853SAndroid Build Coastguard Worker             {
2442*495ae853SAndroid Build Coastguard Worker                 s_recon_buf = ps_video_encode_op->s_recon_buf;
2443*495ae853SAndroid Build Coastguard Worker 
2444*495ae853SAndroid Build Coastguard Worker                 /* Read input for psnr computuation */
2445*495ae853SAndroid Build Coastguard Worker                 if (ps_app_ctxt->u4_psnr_enable)
2446*495ae853SAndroid Build Coastguard Worker                     read_input(ps_app_ctxt->fp_psnr_ip, &s_inp_buf);
2447*495ae853SAndroid Build Coastguard Worker 
2448*495ae853SAndroid Build Coastguard Worker                 /* if we have a valid recon buffer do the assocated tasks */
2449*495ae853SAndroid Build Coastguard Worker                 if (s_recon_buf.au4_wd[0])
2450*495ae853SAndroid Build Coastguard Worker                 {
2451*495ae853SAndroid Build Coastguard Worker                     /* Dump recon when enabled, and output bytes != 0 */
2452*495ae853SAndroid Build Coastguard Worker                     if (ps_app_ctxt->u4_recon_enable)
2453*495ae853SAndroid Build Coastguard Worker                     {
2454*495ae853SAndroid Build Coastguard Worker                         status = write_recon(ps_app_ctxt->fp_recon, &s_recon_buf);
2455*495ae853SAndroid Build Coastguard Worker                         if (IV_SUCCESS != status)
2456*495ae853SAndroid Build Coastguard Worker                         {
2457*495ae853SAndroid Build Coastguard Worker                             printf("Error: Unable to write to recon file\n");
2458*495ae853SAndroid Build Coastguard Worker                             break;
2459*495ae853SAndroid Build Coastguard Worker                         }
2460*495ae853SAndroid Build Coastguard Worker                     }
2461*495ae853SAndroid Build Coastguard Worker 
2462*495ae853SAndroid Build Coastguard Worker                     if (ps_app_ctxt->u4_psnr_enable)
2463*495ae853SAndroid Build Coastguard Worker                     {
2464*495ae853SAndroid Build Coastguard Worker                         compute_psnr(ps_app_ctxt, &s_recon_buf, &s_inp_buf);
2465*495ae853SAndroid Build Coastguard Worker                     }
2466*495ae853SAndroid Build Coastguard Worker 
2467*495ae853SAndroid Build Coastguard Worker 
2468*495ae853SAndroid Build Coastguard Worker                     if (ps_app_ctxt->u4_chksum_enable)
2469*495ae853SAndroid Build Coastguard Worker                     {
2470*495ae853SAndroid Build Coastguard Worker                         WORD32 comp, num_comp = 2;
2471*495ae853SAndroid Build Coastguard Worker 
2472*495ae853SAndroid Build Coastguard Worker                         if (IV_YUV_420P == s_recon_buf.e_color_fmt)
2473*495ae853SAndroid Build Coastguard Worker                             num_comp = 3;
2474*495ae853SAndroid Build Coastguard Worker 
2475*495ae853SAndroid Build Coastguard Worker                         for (comp = 0; comp < num_comp; comp++)
2476*495ae853SAndroid Build Coastguard Worker                         {
2477*495ae853SAndroid Build Coastguard Worker                             UWORD8 au1_chksum[16];
2478*495ae853SAndroid Build Coastguard Worker                             calc_md5_cksum((UWORD8 *)s_recon_buf.apv_bufs[comp],
2479*495ae853SAndroid Build Coastguard Worker                                            s_recon_buf.au4_strd[comp],
2480*495ae853SAndroid Build Coastguard Worker                                            s_recon_buf.au4_wd[comp],
2481*495ae853SAndroid Build Coastguard Worker                                            s_recon_buf.au4_ht[comp],
2482*495ae853SAndroid Build Coastguard Worker                                            au1_chksum);
2483*495ae853SAndroid Build Coastguard Worker                             fwrite(au1_chksum, sizeof(UWORD8), 16, ps_app_ctxt->fp_chksum);
2484*495ae853SAndroid Build Coastguard Worker                         }
2485*495ae853SAndroid Build Coastguard Worker                     }
2486*495ae853SAndroid Build Coastguard Worker                 }
2487*495ae853SAndroid Build Coastguard Worker             }
2488*495ae853SAndroid Build Coastguard Worker         }
2489*495ae853SAndroid Build Coastguard Worker 
2490*495ae853SAndroid Build Coastguard Worker         u4_timestamp_low++;
2491*495ae853SAndroid Build Coastguard Worker 
2492*495ae853SAndroid Build Coastguard Worker         /* Break if all the encoded frames are taken from encoder */
2493*495ae853SAndroid Build Coastguard Worker         if (1 == ps_video_encode_op->u4_is_last)
2494*495ae853SAndroid Build Coastguard Worker         {
2495*495ae853SAndroid Build Coastguard Worker             break;
2496*495ae853SAndroid Build Coastguard Worker         }
2497*495ae853SAndroid Build Coastguard Worker     }
2498*495ae853SAndroid Build Coastguard Worker 
2499*495ae853SAndroid Build Coastguard Worker     /* Pic count is 1 more than actual num frames encoded, because last call is
2500*495ae853SAndroid Build Coastguard Worker      * to just get the output  */
2501*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_pics_cnt--;
2502*495ae853SAndroid Build Coastguard Worker 
2503*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctxt->u4_psnr_enable)
2504*495ae853SAndroid Build Coastguard Worker     {
2505*495ae853SAndroid Build Coastguard Worker         print_average_psnr(ps_app_ctxt);
2506*495ae853SAndroid Build Coastguard Worker     }
2507*495ae853SAndroid Build Coastguard Worker 
2508*495ae853SAndroid Build Coastguard Worker     /* house keeping operations */
2509*495ae853SAndroid Build Coastguard Worker     fclose(ps_app_ctxt->fp_ip);
2510*495ae853SAndroid Build Coastguard Worker     fclose(ps_app_ctxt->fp_op);
2511*495ae853SAndroid Build Coastguard Worker     if(1 == ps_app_ctxt->u4_recon_enable)
2512*495ae853SAndroid Build Coastguard Worker     {
2513*495ae853SAndroid Build Coastguard Worker         fclose(ps_app_ctxt->fp_recon);
2514*495ae853SAndroid Build Coastguard Worker     }
2515*495ae853SAndroid Build Coastguard Worker     if(1 == ps_app_ctxt->u4_chksum_enable)
2516*495ae853SAndroid Build Coastguard Worker     {
2517*495ae853SAndroid Build Coastguard Worker         fclose(ps_app_ctxt->fp_chksum);
2518*495ae853SAndroid Build Coastguard Worker     }
2519*495ae853SAndroid Build Coastguard Worker     if(1 == ps_app_ctxt->u4_psnr_enable)
2520*495ae853SAndroid Build Coastguard Worker     {
2521*495ae853SAndroid Build Coastguard Worker         fclose(ps_app_ctxt->fp_psnr_ip);
2522*495ae853SAndroid Build Coastguard Worker     }
2523*495ae853SAndroid Build Coastguard Worker 
2524*495ae853SAndroid Build Coastguard Worker     if(0 != ps_app_ctxt->u4_mb_info_type)
2525*495ae853SAndroid Build Coastguard Worker     {
2526*495ae853SAndroid Build Coastguard Worker         fclose(ps_app_ctxt->fp_mb_info);
2527*495ae853SAndroid Build Coastguard Worker     }
2528*495ae853SAndroid Build Coastguard Worker     if (ps_app_ctxt->u4_pic_info_type)
2529*495ae853SAndroid Build Coastguard Worker     {
2530*495ae853SAndroid Build Coastguard Worker         fclose(ps_app_ctxt->fp_pic_info);
2531*495ae853SAndroid Build Coastguard Worker     }
2532*495ae853SAndroid Build Coastguard Worker 
2533*495ae853SAndroid Build Coastguard Worker     free_input(ps_app_ctxt);
2534*495ae853SAndroid Build Coastguard Worker     free_output(ps_app_ctxt);
2535*495ae853SAndroid Build Coastguard Worker     free_recon(ps_app_ctxt);
2536*495ae853SAndroid Build Coastguard Worker }
2537*495ae853SAndroid Build Coastguard Worker 
2538*495ae853SAndroid Build Coastguard Worker /**
2539*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2540*495ae853SAndroid Build Coastguard Worker * @brief Application to demonstrate codec API. Shows how to use create,
2541*495ae853SAndroid Build Coastguard Worker * process, control and delete
2542*495ae853SAndroid Build Coastguard Worker *******************************************************************************
2543*495ae853SAndroid Build Coastguard Worker */
2544*495ae853SAndroid Build Coastguard Worker #ifdef IOS
h264enc_main(char * homedir,char * documentdir,int screen_wd,int screen_ht)2545*495ae853SAndroid Build Coastguard Worker int h264enc_main(char * homedir,char *documentdir, int screen_wd, int screen_ht)
2546*495ae853SAndroid Build Coastguard Worker #else
2547*495ae853SAndroid Build Coastguard Worker int main(int argc, char *argv[])
2548*495ae853SAndroid Build Coastguard Worker #endif
2549*495ae853SAndroid Build Coastguard Worker {
2550*495ae853SAndroid Build Coastguard Worker     /* Config Parameters for Encoding */
2551*495ae853SAndroid Build Coastguard Worker     app_ctxt_t s_app_ctxt;
2552*495ae853SAndroid Build Coastguard Worker 
2553*495ae853SAndroid Build Coastguard Worker     /* error string */
2554*495ae853SAndroid Build Coastguard Worker     CHAR ac_error[STRLENGTH];
2555*495ae853SAndroid Build Coastguard Worker 
2556*495ae853SAndroid Build Coastguard Worker     /* config file name */
2557*495ae853SAndroid Build Coastguard Worker     CHAR ac_cfg_fname[STRLENGTH];
2558*495ae853SAndroid Build Coastguard Worker 
2559*495ae853SAndroid Build Coastguard Worker     /* error status */
2560*495ae853SAndroid Build Coastguard Worker     IV_STATUS_T status = IV_SUCCESS;
2561*495ae853SAndroid Build Coastguard Worker #ifdef IOS
2562*495ae853SAndroid Build Coastguard Worker     /* temp var */
2563*495ae853SAndroid Build Coastguard Worker     CHAR filename_with_path[STRLENGTH];
2564*495ae853SAndroid Build Coastguard Worker #endif
2565*495ae853SAndroid Build Coastguard Worker     WORD32 num_mem_recs;
2566*495ae853SAndroid Build Coastguard Worker     iv_obj_t *ps_enc;
2567*495ae853SAndroid Build Coastguard Worker     WORD32 i;
2568*495ae853SAndroid Build Coastguard Worker     FILE *fp_cfg = NULL;
2569*495ae853SAndroid Build Coastguard Worker 
2570*495ae853SAndroid Build Coastguard Worker #ifdef X86_MINGW
2571*495ae853SAndroid Build Coastguard Worker 
2572*495ae853SAndroid Build Coastguard Worker     /* For getting printfs without any delay in eclipse */
2573*495ae853SAndroid Build Coastguard Worker     setvbuf(stdout, NULL, _IONBF, 0);
2574*495ae853SAndroid Build Coastguard Worker     setvbuf(stderr, NULL, _IONBF, 0);
2575*495ae853SAndroid Build Coastguard Worker 
2576*495ae853SAndroid Build Coastguard Worker #endif
2577*495ae853SAndroid Build Coastguard Worker 
2578*495ae853SAndroid Build Coastguard Worker     init_default_params(&s_app_ctxt);
2579*495ae853SAndroid Build Coastguard Worker 
2580*495ae853SAndroid Build Coastguard Worker #ifndef IOS
2581*495ae853SAndroid Build Coastguard Worker 
2582*495ae853SAndroid Build Coastguard Worker     /* Usage */
2583*495ae853SAndroid Build Coastguard Worker     if(argc < 2)
2584*495ae853SAndroid Build Coastguard Worker     {
2585*495ae853SAndroid Build Coastguard Worker         printf("Using enc.cfg as configuration file \n");
2586*495ae853SAndroid Build Coastguard Worker         strcpy(ac_cfg_fname, "enc.cfg");
2587*495ae853SAndroid Build Coastguard Worker     }
2588*495ae853SAndroid Build Coastguard Worker     else if(argc == 2)
2589*495ae853SAndroid Build Coastguard Worker     {
2590*495ae853SAndroid Build Coastguard Worker         if (!strcmp(argv[1], "--help"))
2591*495ae853SAndroid Build Coastguard Worker         {
2592*495ae853SAndroid Build Coastguard Worker             print_usage();
2593*495ae853SAndroid Build Coastguard Worker             exit(-1);
2594*495ae853SAndroid Build Coastguard Worker         }
2595*495ae853SAndroid Build Coastguard Worker         strcpy(ac_cfg_fname, argv[1]);
2596*495ae853SAndroid Build Coastguard Worker     }
2597*495ae853SAndroid Build Coastguard Worker 
2598*495ae853SAndroid Build Coastguard Worker #else
2599*495ae853SAndroid Build Coastguard Worker     strcpy(ac_cfg_fname, "test.cfg");
2600*495ae853SAndroid Build Coastguard Worker 
2601*495ae853SAndroid Build Coastguard Worker #endif
2602*495ae853SAndroid Build Coastguard Worker 
2603*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2604*495ae853SAndroid Build Coastguard Worker     /* Parse arguments                                                       */
2605*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2606*495ae853SAndroid Build Coastguard Worker 
2607*495ae853SAndroid Build Coastguard Worker #ifndef IOS
2608*495ae853SAndroid Build Coastguard Worker 
2609*495ae853SAndroid Build Coastguard Worker     /* Read command line arguments */
2610*495ae853SAndroid Build Coastguard Worker     if(argc > 2)
2611*495ae853SAndroid Build Coastguard Worker     {
2612*495ae853SAndroid Build Coastguard Worker         for(i = 1; i + 1 < argc; i += 2)
2613*495ae853SAndroid Build Coastguard Worker         {
2614*495ae853SAndroid Build Coastguard Worker             if(CONFIG == get_argument(argv[i]))
2615*495ae853SAndroid Build Coastguard Worker             {
2616*495ae853SAndroid Build Coastguard Worker                 strcpy(ac_cfg_fname, argv[i + 1]);
2617*495ae853SAndroid Build Coastguard Worker                 if((fp_cfg = fopen(ac_cfg_fname, "r")) == NULL)
2618*495ae853SAndroid Build Coastguard Worker                 {
2619*495ae853SAndroid Build Coastguard Worker                     sprintf(ac_error,
2620*495ae853SAndroid Build Coastguard Worker                             "Could not open Configuration file %s",
2621*495ae853SAndroid Build Coastguard Worker                             ac_cfg_fname);
2622*495ae853SAndroid Build Coastguard Worker                     codec_exit(ac_error);
2623*495ae853SAndroid Build Coastguard Worker                 }
2624*495ae853SAndroid Build Coastguard Worker                 read_cfg_file(&s_app_ctxt, fp_cfg);
2625*495ae853SAndroid Build Coastguard Worker                 fclose(fp_cfg);
2626*495ae853SAndroid Build Coastguard Worker             }
2627*495ae853SAndroid Build Coastguard Worker             else
2628*495ae853SAndroid Build Coastguard Worker             {
2629*495ae853SAndroid Build Coastguard Worker                 parse_argument(&s_app_ctxt, argv[i], argv[i + 1]);
2630*495ae853SAndroid Build Coastguard Worker             }
2631*495ae853SAndroid Build Coastguard Worker         }
2632*495ae853SAndroid Build Coastguard Worker     }
2633*495ae853SAndroid Build Coastguard Worker     else
2634*495ae853SAndroid Build Coastguard Worker     {
2635*495ae853SAndroid Build Coastguard Worker         if((fp_cfg = fopen(ac_cfg_fname, "r")) == NULL)
2636*495ae853SAndroid Build Coastguard Worker         {
2637*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Could not open Configuration file %s",
2638*495ae853SAndroid Build Coastguard Worker                     ac_cfg_fname);
2639*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error);
2640*495ae853SAndroid Build Coastguard Worker         }
2641*495ae853SAndroid Build Coastguard Worker         read_cfg_file(&s_app_ctxt, fp_cfg);
2642*495ae853SAndroid Build Coastguard Worker         fclose(fp_cfg);
2643*495ae853SAndroid Build Coastguard Worker     }
2644*495ae853SAndroid Build Coastguard Worker 
2645*495ae853SAndroid Build Coastguard Worker #else
2646*495ae853SAndroid Build Coastguard Worker 
2647*495ae853SAndroid Build Coastguard Worker     sprintf(filename_with_path, "%s/%s", homedir, "enc.cfg");
2648*495ae853SAndroid Build Coastguard Worker     if((fp_cfg = fopen(filename_with_path, "r")) == NULL)
2649*495ae853SAndroid Build Coastguard Worker     {
2650*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error, "Could not open Configuration file %s",
2651*495ae853SAndroid Build Coastguard Worker                 ac_cfg_fname);
2652*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
2653*495ae853SAndroid Build Coastguard Worker 
2654*495ae853SAndroid Build Coastguard Worker     }
2655*495ae853SAndroid Build Coastguard Worker     read_cfg_file(&s_app_ctxt, fp_cfg);
2656*495ae853SAndroid Build Coastguard Worker     fclose(fp_cfg);
2657*495ae853SAndroid Build Coastguard Worker 
2658*495ae853SAndroid Build Coastguard Worker #endif
2659*495ae853SAndroid Build Coastguard Worker 
2660*495ae853SAndroid Build Coastguard Worker     validate_params(&s_app_ctxt);
2661*495ae853SAndroid Build Coastguard Worker 
2662*495ae853SAndroid Build Coastguard Worker 
2663*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2664*495ae853SAndroid Build Coastguard Worker     /*                      Getting Number of MemRecords                     */
2665*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2666*495ae853SAndroid Build Coastguard Worker     {
2667*495ae853SAndroid Build Coastguard Worker         ih264e_num_mem_rec_ip_t s_num_mem_rec_ip;
2668*495ae853SAndroid Build Coastguard Worker         ih264e_num_mem_rec_op_t s_num_mem_rec_op;
2669*495ae853SAndroid Build Coastguard Worker 
2670*495ae853SAndroid Build Coastguard Worker         s_num_mem_rec_ip.s_ive_ip.u4_size = sizeof(ih264e_num_mem_rec_ip_t);
2671*495ae853SAndroid Build Coastguard Worker         s_num_mem_rec_ip.s_ive_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC;
2672*495ae853SAndroid Build Coastguard Worker 
2673*495ae853SAndroid Build Coastguard Worker         s_num_mem_rec_op.s_ive_op.u4_size = sizeof(ih264e_num_mem_rec_op_t);
2674*495ae853SAndroid Build Coastguard Worker 
2675*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(NULL, &s_num_mem_rec_ip, &s_num_mem_rec_op);
2676*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
2677*495ae853SAndroid Build Coastguard Worker         {
2678*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Get number of memory records failed = 0x%x\n",
2679*495ae853SAndroid Build Coastguard Worker                     s_num_mem_rec_op.s_ive_op.u4_error_code);
2680*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error);
2681*495ae853SAndroid Build Coastguard Worker         }
2682*495ae853SAndroid Build Coastguard Worker 
2683*495ae853SAndroid Build Coastguard Worker         s_app_ctxt.u4_num_mem_rec = s_num_mem_rec_op.s_ive_op.u4_num_mem_rec;
2684*495ae853SAndroid Build Coastguard Worker         num_mem_recs = s_num_mem_rec_op.s_ive_op.u4_num_mem_rec;
2685*495ae853SAndroid Build Coastguard Worker     }
2686*495ae853SAndroid Build Coastguard Worker 
2687*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2688*495ae853SAndroid Build Coastguard Worker     /*         Allocate and Default initialize MemRecords                    */
2689*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2690*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.ps_mem_rec = malloc(num_mem_recs * sizeof(iv_mem_rec_t));
2691*495ae853SAndroid Build Coastguard Worker     if(NULL == s_app_ctxt.ps_mem_rec)
2692*495ae853SAndroid Build Coastguard Worker     {
2693*495ae853SAndroid Build Coastguard Worker         sprintf(ac_error,
2694*495ae853SAndroid Build Coastguard Worker                 "Unable to allocate memory for hold memory records: Size %d",
2695*495ae853SAndroid Build Coastguard Worker                 (WORD32)(num_mem_recs * sizeof(iv_mem_rec_t)));
2696*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error);
2697*495ae853SAndroid Build Coastguard Worker     }
2698*495ae853SAndroid Build Coastguard Worker     /* Default init memory records */
2699*495ae853SAndroid Build Coastguard Worker     {
2700*495ae853SAndroid Build Coastguard Worker         iv_mem_rec_t *ps_mem_rec = s_app_ctxt.ps_mem_rec;
2701*495ae853SAndroid Build Coastguard Worker 
2702*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < num_mem_recs; i++, ps_mem_rec++)
2703*495ae853SAndroid Build Coastguard Worker         {
2704*495ae853SAndroid Build Coastguard Worker             ps_mem_rec->u4_size = sizeof(iv_mem_rec_t);
2705*495ae853SAndroid Build Coastguard Worker             ps_mem_rec->pv_base = NULL;
2706*495ae853SAndroid Build Coastguard Worker             ps_mem_rec->u4_mem_size = 0;
2707*495ae853SAndroid Build Coastguard Worker             ps_mem_rec->u4_mem_alignment = 0;
2708*495ae853SAndroid Build Coastguard Worker             ps_mem_rec->e_mem_type = IV_NA_MEM_TYPE;
2709*495ae853SAndroid Build Coastguard Worker         }
2710*495ae853SAndroid Build Coastguard Worker     }
2711*495ae853SAndroid Build Coastguard Worker 
2712*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2713*495ae853SAndroid Build Coastguard Worker     /*                      Getting MemRecords Attributes                    */
2714*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2715*495ae853SAndroid Build Coastguard Worker     {
2716*495ae853SAndroid Build Coastguard Worker         ih264e_fill_mem_rec_ip_t s_fill_mem_rec_ip;
2717*495ae853SAndroid Build Coastguard Worker         ih264e_fill_mem_rec_op_t s_fill_mem_rec_op;
2718*495ae853SAndroid Build Coastguard Worker 
2719*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_size = sizeof(ih264e_fill_mem_rec_ip_t);
2720*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC;
2721*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.ps_mem_rec = s_app_ctxt.ps_mem_rec;
2722*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_num_mem_rec = s_app_ctxt.u4_num_mem_rec;
2723*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_max_wd = s_app_ctxt.u4_max_wd;
2724*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_max_ht = s_app_ctxt.u4_max_ht;
2725*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
2726*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
2727*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_max_level = s_app_ctxt.u4_max_level;
2728*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.e_color_format = DEFAULT_INP_COLOR_FMT;
2729*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
2730*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_ip.s_ive_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
2731*495ae853SAndroid Build Coastguard Worker 
2732*495ae853SAndroid Build Coastguard Worker         s_fill_mem_rec_op.s_ive_op.u4_size = sizeof(ih264e_fill_mem_rec_op_t);
2733*495ae853SAndroid Build Coastguard Worker 
2734*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(NULL, &s_fill_mem_rec_ip, &s_fill_mem_rec_op);
2735*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
2736*495ae853SAndroid Build Coastguard Worker         {
2737*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Fill memory records failed = 0x%x\n",
2738*495ae853SAndroid Build Coastguard Worker                     s_fill_mem_rec_op.s_ive_op.u4_error_code);
2739*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error);
2740*495ae853SAndroid Build Coastguard Worker         }
2741*495ae853SAndroid Build Coastguard Worker     }
2742*495ae853SAndroid Build Coastguard Worker 
2743*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2744*495ae853SAndroid Build Coastguard Worker     /*                      Allocating Memory for Mem Records                */
2745*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2746*495ae853SAndroid Build Coastguard Worker     {
2747*495ae853SAndroid Build Coastguard Worker         iv_mem_rec_t *ps_mem_rec = s_app_ctxt.ps_mem_rec;
2748*495ae853SAndroid Build Coastguard Worker         WORD32 total_size = 0;
2749*495ae853SAndroid Build Coastguard Worker 
2750*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < num_mem_recs; i++)
2751*495ae853SAndroid Build Coastguard Worker         {
2752*495ae853SAndroid Build Coastguard Worker             ps_mem_rec->pv_base = ih264a_aligned_malloc(
2753*495ae853SAndroid Build Coastguard Worker                             ps_mem_rec->u4_mem_alignment,
2754*495ae853SAndroid Build Coastguard Worker                             ps_mem_rec->u4_mem_size);
2755*495ae853SAndroid Build Coastguard Worker             if(ps_mem_rec->pv_base == NULL)
2756*495ae853SAndroid Build Coastguard Worker             {
2757*495ae853SAndroid Build Coastguard Worker                 sprintf(ac_error,
2758*495ae853SAndroid Build Coastguard Worker                         "Allocation failure for mem record id %d size %d\n", i,
2759*495ae853SAndroid Build Coastguard Worker                         ps_mem_rec->u4_mem_size);
2760*495ae853SAndroid Build Coastguard Worker                 codec_exit(ac_error);
2761*495ae853SAndroid Build Coastguard Worker             }
2762*495ae853SAndroid Build Coastguard Worker             total_size += ps_mem_rec->u4_mem_size;
2763*495ae853SAndroid Build Coastguard Worker 
2764*495ae853SAndroid Build Coastguard Worker             ps_mem_rec++;
2765*495ae853SAndroid Build Coastguard Worker         }
2766*495ae853SAndroid Build Coastguard Worker         printf("\nTotal memory for codec %d\n", total_size);
2767*495ae853SAndroid Build Coastguard Worker     }
2768*495ae853SAndroid Build Coastguard Worker 
2769*495ae853SAndroid Build Coastguard Worker 
2770*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2771*495ae853SAndroid Build Coastguard Worker     /*                        Codec Instance Creation                        */
2772*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2773*495ae853SAndroid Build Coastguard Worker     {
2774*495ae853SAndroid Build Coastguard Worker         ih264e_init_ip_t s_init_ip;
2775*495ae853SAndroid Build Coastguard Worker         ih264e_init_op_t s_init_op;
2776*495ae853SAndroid Build Coastguard Worker 
2777*495ae853SAndroid Build Coastguard Worker         ps_enc = s_app_ctxt.ps_mem_rec[0].pv_base;
2778*495ae853SAndroid Build Coastguard Worker         ps_enc->u4_size = sizeof(iv_obj_t);
2779*495ae853SAndroid Build Coastguard Worker         ps_enc->pv_fxns = ih264e_api_function;
2780*495ae853SAndroid Build Coastguard Worker         s_app_ctxt.ps_enc = ps_enc;
2781*495ae853SAndroid Build Coastguard Worker 
2782*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_size = sizeof(ih264e_init_ip_t);
2783*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.e_cmd = IV_CMD_INIT;
2784*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_num_mem_rec = s_app_ctxt.u4_num_mem_rec;
2785*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.ps_mem_rec = s_app_ctxt.ps_mem_rec;
2786*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_wd = s_app_ctxt.u4_max_wd;
2787*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_ht = s_app_ctxt.u4_max_ht;
2788*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM;
2789*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM;
2790*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_level = s_app_ctxt.u4_max_level;
2791*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.e_inp_color_fmt = s_app_ctxt.e_inp_color_fmt;
2792*495ae853SAndroid Build Coastguard Worker         if(s_app_ctxt.u4_recon_enable || s_app_ctxt.u4_psnr_enable
2793*495ae853SAndroid Build Coastguard Worker                         || s_app_ctxt.u4_chksum_enable)
2794*495ae853SAndroid Build Coastguard Worker         {
2795*495ae853SAndroid Build Coastguard Worker             s_init_ip.s_ive_ip.u4_enable_recon = 1;
2796*495ae853SAndroid Build Coastguard Worker         }
2797*495ae853SAndroid Build Coastguard Worker         else
2798*495ae853SAndroid Build Coastguard Worker         {
2799*495ae853SAndroid Build Coastguard Worker             s_init_ip.s_ive_ip.u4_enable_recon = 0;
2800*495ae853SAndroid Build Coastguard Worker         }
2801*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.e_recon_color_fmt = s_app_ctxt.e_recon_color_fmt;
2802*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.e_rc_mode = s_app_ctxt.u4_rc;
2803*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_framerate = s_app_ctxt.u4_max_frame_rate;
2804*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_bitrate = s_app_ctxt.u4_max_bitrate;
2805*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_num_bframes = s_app_ctxt.u4_num_bframes;
2806*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.e_content_type = IV_PROGRESSIVE;
2807*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X;
2808*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y;
2809*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.e_slice_mode = s_app_ctxt.u4_slice_mode;
2810*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.u4_slice_param = s_app_ctxt.u4_slice_param;
2811*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.e_arch = s_app_ctxt.e_arch;
2812*495ae853SAndroid Build Coastguard Worker         s_init_ip.s_ive_ip.e_soc = s_app_ctxt.e_soc;
2813*495ae853SAndroid Build Coastguard Worker 
2814*495ae853SAndroid Build Coastguard Worker         s_init_op.s_ive_op.u4_size = sizeof(ih264e_init_op_t);
2815*495ae853SAndroid Build Coastguard Worker 
2816*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_enc, &s_init_ip, &s_init_op);
2817*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
2818*495ae853SAndroid Build Coastguard Worker         {
2819*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Init memory records failed = 0x%x\n",
2820*495ae853SAndroid Build Coastguard Worker                     s_init_op.s_ive_op.u4_error_code);
2821*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error);
2822*495ae853SAndroid Build Coastguard Worker         }
2823*495ae853SAndroid Build Coastguard Worker     }
2824*495ae853SAndroid Build Coastguard Worker 
2825*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2826*495ae853SAndroid Build Coastguard Worker     /*                        set processor details                          */
2827*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2828*495ae853SAndroid Build Coastguard Worker     {
2829*495ae853SAndroid Build Coastguard Worker         ih264e_ctl_set_num_cores_ip_t s_ctl_set_num_cores_ip;
2830*495ae853SAndroid Build Coastguard Worker         ih264e_ctl_set_num_cores_op_t s_ctl_set_num_cores_op;
2831*495ae853SAndroid Build Coastguard Worker 
2832*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_cores_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_set_num_cores_ip_t);
2833*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_cores_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
2834*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_cores_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_SET_NUM_CORES;
2835*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_cores_ip.s_ive_ip.u4_num_cores = s_app_ctxt.u4_num_cores;
2836*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_cores_ip.s_ive_ip.u4_timestamp_high = 0;
2837*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_cores_ip.s_ive_ip.u4_timestamp_low = 0;
2838*495ae853SAndroid Build Coastguard Worker 
2839*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_cores_op.s_ive_op.u4_size = sizeof(ih264e_ctl_set_num_cores_op_t);
2840*495ae853SAndroid Build Coastguard Worker 
2841*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_enc, (void *)&s_ctl_set_num_cores_ip,
2842*495ae853SAndroid Build Coastguard Worker                                      (void *)&s_ctl_set_num_cores_op);
2843*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
2844*495ae853SAndroid Build Coastguard Worker         {
2845*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to set processor params = 0x%x\n",
2846*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_num_cores_op.s_ive_op.u4_error_code);
2847*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error);
2848*495ae853SAndroid Build Coastguard Worker         }
2849*495ae853SAndroid Build Coastguard Worker     }
2850*495ae853SAndroid Build Coastguard Worker 
2851*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2852*495ae853SAndroid Build Coastguard Worker     /*                        Get Codec Version                              */
2853*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2854*495ae853SAndroid Build Coastguard Worker     {
2855*495ae853SAndroid Build Coastguard Worker         ih264e_ctl_getversioninfo_ip_t s_ctl_set_getversioninfo_ip;
2856*495ae853SAndroid Build Coastguard Worker         ih264e_ctl_getversioninfo_op_t s_ctl_set_getversioninfo_op;
2857*495ae853SAndroid Build Coastguard Worker         CHAR ac_version_string[STRLENGTH];
2858*495ae853SAndroid Build Coastguard Worker 
2859*495ae853SAndroid Build Coastguard Worker         s_ctl_set_getversioninfo_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_getversioninfo_ip_t);
2860*495ae853SAndroid Build Coastguard Worker         s_ctl_set_getversioninfo_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
2861*495ae853SAndroid Build Coastguard Worker         s_ctl_set_getversioninfo_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_GETVERSION;
2862*495ae853SAndroid Build Coastguard Worker         s_ctl_set_getversioninfo_ip.s_ive_ip.pu1_version = (UWORD8 *)ac_version_string;
2863*495ae853SAndroid Build Coastguard Worker         s_ctl_set_getversioninfo_ip.s_ive_ip.u4_version_bufsize = sizeof(ac_version_string);
2864*495ae853SAndroid Build Coastguard Worker 
2865*495ae853SAndroid Build Coastguard Worker         s_ctl_set_getversioninfo_op.s_ive_op.u4_size = sizeof(ih264e_ctl_getversioninfo_op_t);
2866*495ae853SAndroid Build Coastguard Worker 
2867*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_enc,
2868*495ae853SAndroid Build Coastguard Worker                                      (void *)&s_ctl_set_getversioninfo_ip,
2869*495ae853SAndroid Build Coastguard Worker                                      (void *)&s_ctl_set_getversioninfo_op);
2870*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
2871*495ae853SAndroid Build Coastguard Worker         {
2872*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to get codec version = 0x%x\n",
2873*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_getversioninfo_op.s_ive_op.u4_error_code);
2874*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error);
2875*495ae853SAndroid Build Coastguard Worker         }
2876*495ae853SAndroid Build Coastguard Worker         printf("CODEC VERSION %s\n", ac_version_string);
2877*495ae853SAndroid Build Coastguard Worker     }
2878*495ae853SAndroid Build Coastguard Worker 
2879*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2880*495ae853SAndroid Build Coastguard Worker     /*                      Get I/O Buffer Requirement                       */
2881*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2882*495ae853SAndroid Build Coastguard Worker     {
2883*495ae853SAndroid Build Coastguard Worker         ih264e_ctl_getbufinfo_ip_t s_get_buf_info_ip;
2884*495ae853SAndroid Build Coastguard Worker         ih264e_ctl_getbufinfo_op_t s_get_buf_info_op;
2885*495ae853SAndroid Build Coastguard Worker 
2886*495ae853SAndroid Build Coastguard Worker         s_get_buf_info_ip.s_ive_ip.u4_size = sizeof(ih264e_ctl_getbufinfo_ip_t);
2887*495ae853SAndroid Build Coastguard Worker         s_get_buf_info_ip.s_ive_ip.e_cmd = IVE_CMD_VIDEO_CTL;
2888*495ae853SAndroid Build Coastguard Worker         s_get_buf_info_ip.s_ive_ip.e_sub_cmd = IVE_CMD_CTL_GETBUFINFO;
2889*495ae853SAndroid Build Coastguard Worker         s_get_buf_info_ip.s_ive_ip.u4_max_ht = s_app_ctxt.u4_max_ht;
2890*495ae853SAndroid Build Coastguard Worker         s_get_buf_info_ip.s_ive_ip.u4_max_wd = s_app_ctxt.u4_max_wd;
2891*495ae853SAndroid Build Coastguard Worker         s_get_buf_info_ip.s_ive_ip.e_inp_color_fmt = s_app_ctxt.e_inp_color_fmt;
2892*495ae853SAndroid Build Coastguard Worker 
2893*495ae853SAndroid Build Coastguard Worker         s_get_buf_info_op.s_ive_op.u4_size = sizeof(ih264e_ctl_getbufinfo_op_t);
2894*495ae853SAndroid Build Coastguard Worker 
2895*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_enc, &s_get_buf_info_ip,
2896*495ae853SAndroid Build Coastguard Worker                                      &s_get_buf_info_op);
2897*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
2898*495ae853SAndroid Build Coastguard Worker         {
2899*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to get I/O buffer requirements = 0x%x\n",
2900*495ae853SAndroid Build Coastguard Worker                     s_get_buf_info_op.s_ive_op.u4_error_code);
2901*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error);
2902*495ae853SAndroid Build Coastguard Worker         }
2903*495ae853SAndroid Build Coastguard Worker         s_app_ctxt.s_get_buf_info_op = s_get_buf_info_op;
2904*495ae853SAndroid Build Coastguard Worker     }
2905*495ae853SAndroid Build Coastguard Worker 
2906*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2907*495ae853SAndroid Build Coastguard Worker     /* Add the following initializations based on the parameters in context   */
2908*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2909*495ae853SAndroid Build Coastguard Worker 
2910*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2911*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set Frame dimensions                                  */
2912*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2913*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u4_strd = s_app_ctxt.u4_wd;
2914*495ae853SAndroid Build Coastguard Worker     set_dimensions(&s_app_ctxt, 0, 0);
2915*495ae853SAndroid Build Coastguard Worker 
2916*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2917*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set Frame rates                                       */
2918*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2919*495ae853SAndroid Build Coastguard Worker     set_frame_rate(&s_app_ctxt, 0, 0);
2920*495ae853SAndroid Build Coastguard Worker 
2921*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2922*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set IPE Params                                        */
2923*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2924*495ae853SAndroid Build Coastguard Worker     set_ipe_params(&s_app_ctxt, 0, 0);
2925*495ae853SAndroid Build Coastguard Worker 
2926*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2927*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set Bitrate                                           */
2928*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2929*495ae853SAndroid Build Coastguard Worker     set_bit_rate(&s_app_ctxt, 0, 0);
2930*495ae853SAndroid Build Coastguard Worker 
2931*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2932*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set QP                                                */
2933*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2934*495ae853SAndroid Build Coastguard Worker     set_qp(&s_app_ctxt, 0, 0);
2935*495ae853SAndroid Build Coastguard Worker 
2936*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2937*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set AIR params                                        */
2938*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2939*495ae853SAndroid Build Coastguard Worker     set_air_params(&s_app_ctxt, 0, 0);
2940*495ae853SAndroid Build Coastguard Worker 
2941*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2942*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set VBV params                                        */
2943*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2944*495ae853SAndroid Build Coastguard Worker     set_vbv_params(&s_app_ctxt, 0, 0);
2945*495ae853SAndroid Build Coastguard Worker 
2946*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2947*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set Motion estimation params                          */
2948*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2949*495ae853SAndroid Build Coastguard Worker     set_me_params(&s_app_ctxt, 0, 0);
2950*495ae853SAndroid Build Coastguard Worker 
2951*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2952*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set GOP params                                        */
2953*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2954*495ae853SAndroid Build Coastguard Worker     set_gop_params(&s_app_ctxt, 0, 0);
2955*495ae853SAndroid Build Coastguard Worker 
2956*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2957*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set Deblock params                                    */
2958*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2959*495ae853SAndroid Build Coastguard Worker     set_deblock_params(&s_app_ctxt, 0, 0);
2960*495ae853SAndroid Build Coastguard Worker 
2961*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2962*495ae853SAndroid Build Coastguard Worker     /*   Video control  Set Profile params                                    */
2963*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2964*495ae853SAndroid Build Coastguard Worker     set_profile_params(&s_app_ctxt, 0, 0);
2965*495ae853SAndroid Build Coastguard Worker 
2966*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2967*495ae853SAndroid Build Coastguard Worker     /*   Video usability information                                          */
2968*495ae853SAndroid Build Coastguard Worker     /**************************************************************************/
2969*495ae853SAndroid Build Coastguard Worker     set_vui_params(&s_app_ctxt);
2970*495ae853SAndroid Build Coastguard Worker 
2971*495ae853SAndroid Build Coastguard Worker #ifdef IOS
2972*495ae853SAndroid Build Coastguard Worker     /* Correct file paths */
2973*495ae853SAndroid Build Coastguard Worker     sprintf(filename_with_path, "%s/%s", documentdir, s_app_ctxt.ac_ip_fname);
2974*495ae853SAndroid Build Coastguard Worker     strcpy (s_app_ctxt.ac_ip_fname, filename_with_path);
2975*495ae853SAndroid Build Coastguard Worker 
2976*495ae853SAndroid Build Coastguard Worker     sprintf(filename_with_path, "%s/%s", documentdir, s_app_ctxt.ac_op_fname);
2977*495ae853SAndroid Build Coastguard Worker     strcpy (s_app_ctxt.ac_op_fname, filename_with_path);
2978*495ae853SAndroid Build Coastguard Worker 
2979*495ae853SAndroid Build Coastguard Worker     sprintf(filename_with_path, "%s/%s", documentdir, s_app_ctxt.ac_recon_fname);
2980*495ae853SAndroid Build Coastguard Worker     strcpy (s_app_ctxt.ac_recon_fname, filename_with_path);
2981*495ae853SAndroid Build Coastguard Worker 
2982*495ae853SAndroid Build Coastguard Worker     sprintf(filename_with_path, "%s/%s", documentdir, s_app_ctxt.ac_chksum_fname);
2983*495ae853SAndroid Build Coastguard Worker     strcpy (s_app_ctxt.ac_chksum_fname, filename_with_path);
2984*495ae853SAndroid Build Coastguard Worker 
2985*495ae853SAndroid Build Coastguard Worker     sprintf(filename_with_path, "%s/%s", documentdir, s_app_ctxt.ac_mb_info_fname);
2986*495ae853SAndroid Build Coastguard Worker     strcpy (s_app_ctxt.ac_mb_info_fname, filename_with_path);
2987*495ae853SAndroid Build Coastguard Worker 
2988*495ae853SAndroid Build Coastguard Worker     sprintf(filename_with_path, "%s/%s", documentdir, s_app_ctxt.ac_pic_info_fname);
2989*495ae853SAndroid Build Coastguard Worker     strcpy (s_app_ctxt.ac_pic_info_fname, filename_with_path);
2990*495ae853SAndroid Build Coastguard Worker #endif
2991*495ae853SAndroid Build Coastguard Worker 
2992*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2993*495ae853SAndroid Build Coastguard Worker     /*   Encoding                                                            */
2994*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2995*495ae853SAndroid Build Coastguard Worker     synchronous_encode(ps_enc, &s_app_ctxt);
2996*495ae853SAndroid Build Coastguard Worker 
2997*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2998*495ae853SAndroid Build Coastguard Worker     /*   Print summary                                                       */
2999*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
3000*495ae853SAndroid Build Coastguard Worker     {
3001*495ae853SAndroid Build Coastguard Worker         DOUBLE bytes_per_frame;
3002*495ae853SAndroid Build Coastguard Worker         DOUBLE bytes_per_second;
3003*495ae853SAndroid Build Coastguard Worker         WORD32 achieved_bitrate;
3004*495ae853SAndroid Build Coastguard Worker 
3005*495ae853SAndroid Build Coastguard Worker         if(s_app_ctxt.u4_pics_cnt != 0)
3006*495ae853SAndroid Build Coastguard Worker         {
3007*495ae853SAndroid Build Coastguard Worker             bytes_per_frame = (s_app_ctxt.u4_total_bytes) / (s_app_ctxt.u4_pics_cnt);
3008*495ae853SAndroid Build Coastguard Worker         }
3009*495ae853SAndroid Build Coastguard Worker         else
3010*495ae853SAndroid Build Coastguard Worker         {
3011*495ae853SAndroid Build Coastguard Worker             bytes_per_frame = 0;
3012*495ae853SAndroid Build Coastguard Worker         }
3013*495ae853SAndroid Build Coastguard Worker         bytes_per_second = (bytes_per_frame * s_app_ctxt.u4_tgt_frame_rate);
3014*495ae853SAndroid Build Coastguard Worker 
3015*495ae853SAndroid Build Coastguard Worker         achieved_bitrate = bytes_per_second * 8;
3016*495ae853SAndroid Build Coastguard Worker 
3017*495ae853SAndroid Build Coastguard Worker         printf("\nEncoding Completed\n");
3018*495ae853SAndroid Build Coastguard Worker         printf("Summary\n");
3019*495ae853SAndroid Build Coastguard Worker         printf("Input filename                  : %s\n", s_app_ctxt.ac_ip_fname);
3020*495ae853SAndroid Build Coastguard Worker         printf("Output filename                 : %s\n", s_app_ctxt.ac_op_fname);
3021*495ae853SAndroid Build Coastguard Worker         printf("Output Width                    : %-4d\n", s_app_ctxt.u4_wd);
3022*495ae853SAndroid Build Coastguard Worker         printf("Output Height                   : %-4d\n", s_app_ctxt.u4_ht);
3023*495ae853SAndroid Build Coastguard Worker         printf("Target Bitrate (bps)            : %-4d\n", s_app_ctxt.u4_bitrate);
3024*495ae853SAndroid Build Coastguard Worker         printf("Achieved Bitrate (bps)          : %-4d\n", achieved_bitrate);
3025*495ae853SAndroid Build Coastguard Worker         printf("Average Time per Frame          : %-4d\n", s_app_ctxt.avg_time);
3026*495ae853SAndroid Build Coastguard Worker         printf("Achieved FPS                    : %-4.2f\n", 1000000.0 / s_app_ctxt.avg_time);
3027*495ae853SAndroid Build Coastguard Worker     }
3028*495ae853SAndroid Build Coastguard Worker 
3029*495ae853SAndroid Build Coastguard Worker 
3030*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
3031*495ae853SAndroid Build Coastguard Worker     /*                         Close Codec Instance                         */
3032*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
3033*495ae853SAndroid Build Coastguard Worker     {
3034*495ae853SAndroid Build Coastguard Worker         ih264e_retrieve_mem_rec_ip_t s_retrieve_mem_ip;
3035*495ae853SAndroid Build Coastguard Worker         ih264e_retrieve_mem_rec_op_t s_retrieve_mem_op;
3036*495ae853SAndroid Build Coastguard Worker         iv_mem_rec_t *ps_mem_rec = s_app_ctxt.ps_mem_rec;
3037*495ae853SAndroid Build Coastguard Worker 
3038*495ae853SAndroid Build Coastguard Worker         s_retrieve_mem_ip.s_ive_ip.u4_size = sizeof(ih264e_retrieve_mem_rec_ip_t);
3039*495ae853SAndroid Build Coastguard Worker         s_retrieve_mem_ip.s_ive_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC;
3040*495ae853SAndroid Build Coastguard Worker         s_retrieve_mem_ip.s_ive_ip.ps_mem_rec = s_app_ctxt.ps_mem_rec;
3041*495ae853SAndroid Build Coastguard Worker 
3042*495ae853SAndroid Build Coastguard Worker         s_retrieve_mem_op.s_ive_op.u4_size = sizeof(ih264e_retrieve_mem_rec_op_t);
3043*495ae853SAndroid Build Coastguard Worker 
3044*495ae853SAndroid Build Coastguard Worker         status = ih264e_api_function(ps_enc, &s_retrieve_mem_ip, &s_retrieve_mem_op);
3045*495ae853SAndroid Build Coastguard Worker         if(status != IV_SUCCESS)
3046*495ae853SAndroid Build Coastguard Worker         {
3047*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error, "Unable to retrieve memory records = 0x%x\n",
3048*495ae853SAndroid Build Coastguard Worker                     s_retrieve_mem_op.s_ive_op.u4_error_code);
3049*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error);
3050*495ae853SAndroid Build Coastguard Worker         }
3051*495ae853SAndroid Build Coastguard Worker 
3052*495ae853SAndroid Build Coastguard Worker         /* Free memory records */
3053*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < num_mem_recs; i++)
3054*495ae853SAndroid Build Coastguard Worker         {
3055*495ae853SAndroid Build Coastguard Worker             ih264a_aligned_free(ps_mem_rec->pv_base);
3056*495ae853SAndroid Build Coastguard Worker             ps_mem_rec++;
3057*495ae853SAndroid Build Coastguard Worker         }
3058*495ae853SAndroid Build Coastguard Worker         free(s_app_ctxt.ps_mem_rec);
3059*495ae853SAndroid Build Coastguard Worker     }
3060*495ae853SAndroid Build Coastguard Worker 
3061*495ae853SAndroid Build Coastguard Worker     return 0;
3062*495ae853SAndroid Build Coastguard Worker }
3063*495ae853SAndroid Build Coastguard Worker 
3064*495ae853SAndroid Build Coastguard Worker 
3065*495ae853SAndroid Build Coastguard Worker #ifdef  ANDROID_NDK
raise(int a)3066*495ae853SAndroid Build Coastguard Worker int raise(int a)
3067*495ae853SAndroid Build Coastguard Worker {
3068*495ae853SAndroid Build Coastguard Worker     printf("Divide by zero\n");
3069*495ae853SAndroid Build Coastguard Worker     return 0;
3070*495ae853SAndroid Build Coastguard Worker }
__aeabi_assert(const char * assertion,const char * file,unsigned int line)3071*495ae853SAndroid Build Coastguard Worker void __aeabi_assert(const char *assertion, const char *file, unsigned int line)
3072*495ae853SAndroid Build Coastguard Worker {
3073*495ae853SAndroid Build Coastguard Worker     return;
3074*495ae853SAndroid Build Coastguard Worker }
3075*495ae853SAndroid Build Coastguard Worker #endif
3076