xref: /aosp_15_r20/external/libavc/examples/svcdec/main.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2022 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  * @file
23*495ae853SAndroid Build Coastguard Worker  *  main.c
24*495ae853SAndroid Build Coastguard Worker  *
25*495ae853SAndroid Build Coastguard Worker  * @brief
26*495ae853SAndroid Build Coastguard Worker  *  Contains an application that demonstrates use of H264 decoder API
27*495ae853SAndroid Build Coastguard Worker  *
28*495ae853SAndroid Build Coastguard Worker  * @author
29*495ae853SAndroid Build Coastguard Worker  *  Kishore
30*495ae853SAndroid Build Coastguard Worker  *
31*495ae853SAndroid Build Coastguard Worker  * @remarks
32*495ae853SAndroid Build Coastguard Worker  *  None
33*495ae853SAndroid Build Coastguard Worker  *
34*495ae853SAndroid Build Coastguard Worker  *******************************************************************************
35*495ae853SAndroid Build Coastguard Worker  */
36*495ae853SAndroid Build Coastguard Worker 
37*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
38*495ae853SAndroid Build Coastguard Worker #include <string.h>
39*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
40*495ae853SAndroid Build Coastguard Worker 
41*495ae853SAndroid Build Coastguard Worker #ifdef X86_MINGW
42*495ae853SAndroid Build Coastguard Worker #include <signal.h>
43*495ae853SAndroid Build Coastguard Worker #endif
44*495ae853SAndroid Build Coastguard Worker 
45*495ae853SAndroid Build Coastguard Worker #ifdef IOS_DISPLAY
46*495ae853SAndroid Build Coastguard Worker #include "cast_types.h"
47*495ae853SAndroid Build Coastguard Worker #else
48*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
49*495ae853SAndroid Build Coastguard Worker #endif
50*495ae853SAndroid Build Coastguard Worker 
51*495ae853SAndroid Build Coastguard Worker #include "iv.h"
52*495ae853SAndroid Build Coastguard Worker #include "ivd.h"
53*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
54*495ae853SAndroid Build Coastguard Worker 
55*495ae853SAndroid Build Coastguard Worker #include "ih264d.h"
56*495ae853SAndroid Build Coastguard Worker #include "isvcd.h"
57*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
58*495ae853SAndroid Build Coastguard Worker #include <windows.h>
59*495ae853SAndroid Build Coastguard Worker #else
60*495ae853SAndroid Build Coastguard Worker #include <sys/time.h>
61*495ae853SAndroid Build Coastguard Worker #endif
62*495ae853SAndroid Build Coastguard Worker 
63*495ae853SAndroid Build Coastguard Worker // #define ADAPTIVE_TEST
64*495ae853SAndroid Build Coastguard Worker #define ADAPTIVE_MAX_WD 4096
65*495ae853SAndroid Build Coastguard Worker #define ADAPTIVE_MAX_HT 2160
66*495ae853SAndroid Build Coastguard Worker 
67*495ae853SAndroid Build Coastguard Worker #define ALIGN8(x) ((((x) + 7) >> 3) << 3)
68*495ae853SAndroid Build Coastguard Worker #define NUM_DISPLAY_BUFFERS 4
69*495ae853SAndroid Build Coastguard Worker #define DEFAULT_FPS 30
70*495ae853SAndroid Build Coastguard Worker 
71*495ae853SAndroid Build Coastguard Worker #define ENABLE_DEGRADE 0
72*495ae853SAndroid Build Coastguard Worker #define MAX_DISP_BUFFERS 64
73*495ae853SAndroid Build Coastguard Worker #define EXTRA_DISP_BUFFERS 8
74*495ae853SAndroid Build Coastguard Worker #define STRLENGTH 1000
75*495ae853SAndroid Build Coastguard Worker #define STR2(x) #x
76*495ae853SAndroid Build Coastguard Worker #define STR(X) STR2(X)
77*495ae853SAndroid Build Coastguard Worker 
78*495ae853SAndroid Build Coastguard Worker // #define TEST_FLUSH
79*495ae853SAndroid Build Coastguard Worker #define FLUSH_FRM_CNT 100
80*495ae853SAndroid Build Coastguard Worker // #define APP_EXTRA_BUFS 1
81*495ae853SAndroid Build Coastguard Worker 
82*495ae853SAndroid Build Coastguard Worker #undef PROFILE_ENABLE
83*495ae853SAndroid Build Coastguard Worker 
84*495ae853SAndroid Build Coastguard Worker #ifdef IOS
85*495ae853SAndroid Build Coastguard Worker #define PATHLENMAX 500
86*495ae853SAndroid Build Coastguard Worker char filename_with_path[PATHLENMAX];
87*495ae853SAndroid Build Coastguard Worker #endif
88*495ae853SAndroid Build Coastguard Worker 
89*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
90*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
91*495ae853SAndroid Build Coastguard Worker typedef LARGE_INTEGER TIMER;
92*495ae853SAndroid Build Coastguard Worker #else
93*495ae853SAndroid Build Coastguard Worker // #ifdef GCC_TIMER
94*495ae853SAndroid Build Coastguard Worker typedef struct timeval TIMER;
95*495ae853SAndroid Build Coastguard Worker // #endif
96*495ae853SAndroid Build Coastguard Worker #endif
97*495ae853SAndroid Build Coastguard Worker #else
98*495ae853SAndroid Build Coastguard Worker typedef WORD32 TIMER;
99*495ae853SAndroid Build Coastguard Worker #endif
100*495ae853SAndroid Build Coastguard Worker 
101*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
102*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
103*495ae853SAndroid Build Coastguard Worker #define GETTIME(timer) QueryPerformanceCounter(timer);
104*495ae853SAndroid Build Coastguard Worker #else
105*495ae853SAndroid Build Coastguard Worker // #ifdef GCC_TIMER
106*495ae853SAndroid Build Coastguard Worker #define GETTIME(timer) gettimeofday(timer, NULL);
107*495ae853SAndroid Build Coastguard Worker // #endif
108*495ae853SAndroid Build Coastguard Worker #endif
109*495ae853SAndroid Build Coastguard Worker 
110*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
111*495ae853SAndroid Build Coastguard Worker #define ELAPSEDTIME(s_start_timer, s_end_timer, s_elapsed_time, frequency)                     \
112*495ae853SAndroid Build Coastguard Worker     {                                                                                          \
113*495ae853SAndroid Build Coastguard Worker         TIMER s_temp_time;                                                                     \
114*495ae853SAndroid Build Coastguard Worker         s_temp_time.LowPart = s_end_timer.LowPart - s_start_timer.LowPart;                     \
115*495ae853SAndroid Build Coastguard Worker         s_elapsed_time =                                                                       \
116*495ae853SAndroid Build Coastguard Worker             (UWORD32) (((DOUBLE) s_temp_time.LowPart / (DOUBLE) frequency.LowPart) * 1000000); \
117*495ae853SAndroid Build Coastguard Worker     }
118*495ae853SAndroid Build Coastguard Worker #else
119*495ae853SAndroid Build Coastguard Worker // #ifdef GCC_TIMER
120*495ae853SAndroid Build Coastguard Worker #define ELAPSEDTIME(s_start_timer, s_end_timer, s_elapsed_time, frequency)     \
121*495ae853SAndroid Build Coastguard Worker     s_elapsed_time = ((s_end_timer.tv_sec - s_start_timer.tv_sec) * 1000000) + \
122*495ae853SAndroid Build Coastguard Worker                      (s_end_timer.tv_usec - s_start_timer.tv_usec);
123*495ae853SAndroid Build Coastguard Worker // #endif
124*495ae853SAndroid Build Coastguard Worker #endif
125*495ae853SAndroid Build Coastguard Worker 
126*495ae853SAndroid Build Coastguard Worker #else
127*495ae853SAndroid Build Coastguard Worker #define GETTIME(timer)
128*495ae853SAndroid Build Coastguard Worker #define ELAPSEDTIME(s_start_timer, s_end_timer, s_elapsed_time, frequency)
129*495ae853SAndroid Build Coastguard Worker #endif
130*495ae853SAndroid Build Coastguard Worker 
131*495ae853SAndroid Build Coastguard Worker /* Function declarations */
132*495ae853SAndroid Build Coastguard Worker #ifndef MD5_DISABLE
133*495ae853SAndroid Build Coastguard Worker void calc_md5_cksum(UWORD8 *pu1_inbuf, UWORD32 u4_stride, UWORD32 u4_width, UWORD32 u4_height,
134*495ae853SAndroid Build Coastguard Worker                     UWORD8 *pu1_cksum_p);
135*495ae853SAndroid Build Coastguard Worker #else
136*495ae853SAndroid Build Coastguard Worker #define calc_md5_cksum(a, b, c, d, e)
137*495ae853SAndroid Build Coastguard Worker #endif
138*495ae853SAndroid Build Coastguard Worker #ifdef SDL_DISPLAY
139*495ae853SAndroid Build Coastguard Worker void *sdl_disp_init(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
140*495ae853SAndroid Build Coastguard Worker void sdl_alloc_disp_buffers(void *);
141*495ae853SAndroid Build Coastguard Worker void sdl_display(void *, WORD32);
142*495ae853SAndroid Build Coastguard Worker void sdl_set_disp_buffers(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
143*495ae853SAndroid Build Coastguard Worker void sdl_disp_deinit(void *);
144*495ae853SAndroid Build Coastguard Worker void sdl_disp_usleep(UWORD32);
145*495ae853SAndroid Build Coastguard Worker IV_COLOR_FORMAT_T sdl_get_color_fmt(void);
146*495ae853SAndroid Build Coastguard Worker UWORD32 sdl_get_stride(void);
147*495ae853SAndroid Build Coastguard Worker #endif
148*495ae853SAndroid Build Coastguard Worker 
149*495ae853SAndroid Build Coastguard Worker #ifdef INTEL_CE5300
150*495ae853SAndroid Build Coastguard Worker void *gdl_disp_init(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
151*495ae853SAndroid Build Coastguard Worker void gdl_alloc_disp_buffers(void *);
152*495ae853SAndroid Build Coastguard Worker void gdl_display(void *, WORD32);
153*495ae853SAndroid Build Coastguard Worker void gdl_set_disp_buffers(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
154*495ae853SAndroid Build Coastguard Worker void gdl_disp_deinit(void *);
155*495ae853SAndroid Build Coastguard Worker void gdl_disp_usleep(UWORD32);
156*495ae853SAndroid Build Coastguard Worker IV_COLOR_FORMAT_T gdl_get_color_fmt(void);
157*495ae853SAndroid Build Coastguard Worker UWORD32 gdl_get_stride(void);
158*495ae853SAndroid Build Coastguard Worker #endif
159*495ae853SAndroid Build Coastguard Worker 
160*495ae853SAndroid Build Coastguard Worker #ifdef FBDEV_DISPLAY
161*495ae853SAndroid Build Coastguard Worker void *fbd_disp_init(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
162*495ae853SAndroid Build Coastguard Worker void fbd_alloc_disp_buffers(void *);
163*495ae853SAndroid Build Coastguard Worker void fbd_display(void *, WORD32);
164*495ae853SAndroid Build Coastguard Worker void fbd_set_disp_buffers(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
165*495ae853SAndroid Build Coastguard Worker void fbd_disp_deinit(void *);
166*495ae853SAndroid Build Coastguard Worker void fbd_disp_usleep(UWORD32);
167*495ae853SAndroid Build Coastguard Worker IV_COLOR_FORMAT_T fbd_get_color_fmt(void);
168*495ae853SAndroid Build Coastguard Worker UWORD32 fbd_get_stride(void);
169*495ae853SAndroid Build Coastguard Worker #endif
170*495ae853SAndroid Build Coastguard Worker 
171*495ae853SAndroid Build Coastguard Worker #ifdef IOS_DISPLAY
172*495ae853SAndroid Build Coastguard Worker void *ios_disp_init(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
173*495ae853SAndroid Build Coastguard Worker void ios_alloc_disp_buffers(void *);
174*495ae853SAndroid Build Coastguard Worker void ios_display(void *, WORD32);
175*495ae853SAndroid Build Coastguard Worker void ios_set_disp_buffers(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
176*495ae853SAndroid Build Coastguard Worker void ios_disp_deinit(void *);
177*495ae853SAndroid Build Coastguard Worker void ios_disp_usleep(UWORD32);
178*495ae853SAndroid Build Coastguard Worker IV_COLOR_FORMAT_T ios_get_color_fmt(void);
179*495ae853SAndroid Build Coastguard Worker UWORD32 ios_get_stride(void);
180*495ae853SAndroid Build Coastguard Worker #endif
181*495ae853SAndroid Build Coastguard Worker 
182*495ae853SAndroid Build Coastguard Worker typedef struct
183*495ae853SAndroid Build Coastguard Worker {
184*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_piclen_flag;
185*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_file_save_flag;
186*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_frame_info_enable;
187*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_chksum_save_flag;
188*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_max_frm_ts;
189*495ae853SAndroid Build Coastguard Worker     IV_COLOR_FORMAT_T e_output_chroma_format;
190*495ae853SAndroid Build Coastguard Worker     IVD_ARCH_T e_arch;
191*495ae853SAndroid Build Coastguard Worker     IVD_SOC_T e_soc;
192*495ae853SAndroid Build Coastguard Worker     UWORD32 dump_q_rd_idx;
193*495ae853SAndroid Build Coastguard Worker     UWORD32 dump_q_wr_idx;
194*495ae853SAndroid Build Coastguard Worker     WORD32 disp_q_wr_idx;
195*495ae853SAndroid Build Coastguard Worker     WORD32 disp_q_rd_idx;
196*495ae853SAndroid Build Coastguard Worker 
197*495ae853SAndroid Build Coastguard Worker     void *cocodec_obj;
198*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_share_disp_buf;
199*495ae853SAndroid Build Coastguard Worker     UWORD32 num_disp_buf;
200*495ae853SAndroid Build Coastguard Worker     UWORD32 b_pic_present;
201*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_disable_dblk_level;
202*495ae853SAndroid Build Coastguard Worker     WORD32 i4_target_layer_id;
203*495ae853SAndroid Build Coastguard Worker     WORD32 i4_degrade_type;
204*495ae853SAndroid Build Coastguard Worker     WORD32 i4_degrade_pics;
205*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_cores;
206*495ae853SAndroid Build Coastguard Worker     UWORD32 disp_delay;
207*495ae853SAndroid Build Coastguard Worker     WORD32 trace_enable;
208*495ae853SAndroid Build Coastguard Worker     CHAR ac_trace_fname[STRLENGTH];
209*495ae853SAndroid Build Coastguard Worker     CHAR ac_piclen_fname[STRLENGTH];
210*495ae853SAndroid Build Coastguard Worker     CHAR ac_ip_fname[STRLENGTH];
211*495ae853SAndroid Build Coastguard Worker     CHAR ac_op_fname[STRLENGTH];
212*495ae853SAndroid Build Coastguard Worker     CHAR ac_qp_map_fname[STRLENGTH];
213*495ae853SAndroid Build Coastguard Worker     CHAR ac_blk_type_map_fname[STRLENGTH];
214*495ae853SAndroid Build Coastguard Worker     CHAR ac_op_chksum_fname[STRLENGTH];
215*495ae853SAndroid Build Coastguard Worker     ivd_out_bufdesc_t s_disp_buffers[MAX_DISP_BUFFERS];
216*495ae853SAndroid Build Coastguard Worker     iv_yuv_buf_t s_disp_frm_queue[MAX_DISP_BUFFERS];
217*495ae853SAndroid Build Coastguard Worker     UWORD32 s_disp_frm_id_queue[MAX_DISP_BUFFERS];
218*495ae853SAndroid Build Coastguard Worker     UWORD32 loopback;
219*495ae853SAndroid Build Coastguard Worker     UWORD32 display;
220*495ae853SAndroid Build Coastguard Worker     UWORD32 full_screen;
221*495ae853SAndroid Build Coastguard Worker     UWORD32 fps;
222*495ae853SAndroid Build Coastguard Worker 
223*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_strd;
224*495ae853SAndroid Build Coastguard Worker 
225*495ae853SAndroid Build Coastguard Worker     /* For signalling to display thread */
226*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_pic_wd;
227*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_pic_ht;
228*495ae853SAndroid Build Coastguard Worker 
229*495ae853SAndroid Build Coastguard Worker     /* For IOS diplay */
230*495ae853SAndroid Build Coastguard Worker     WORD32 i4_screen_wd;
231*495ae853SAndroid Build Coastguard Worker     WORD32 i4_screen_ht;
232*495ae853SAndroid Build Coastguard Worker 
233*495ae853SAndroid Build Coastguard Worker     WORD32 quit;
234*495ae853SAndroid Build Coastguard Worker     WORD32 paused;
235*495ae853SAndroid Build Coastguard Worker 
236*495ae853SAndroid Build Coastguard Worker     void *pv_disp_ctx;
237*495ae853SAndroid Build Coastguard Worker     void *display_thread_handle;
238*495ae853SAndroid Build Coastguard Worker     WORD32 display_thread_created;
239*495ae853SAndroid Build Coastguard Worker     volatile WORD32 display_init_done;
240*495ae853SAndroid Build Coastguard Worker     volatile WORD32 display_deinit_flag;
241*495ae853SAndroid Build Coastguard Worker 
242*495ae853SAndroid Build Coastguard Worker     void *(*disp_init)(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *,
243*495ae853SAndroid Build Coastguard Worker                        WORD32 *);
244*495ae853SAndroid Build Coastguard Worker     void (*alloc_disp_buffers)(void *);
245*495ae853SAndroid Build Coastguard Worker     void (*display_buffer)(void *, WORD32);
246*495ae853SAndroid Build Coastguard Worker     void (*set_disp_buffers)(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
247*495ae853SAndroid Build Coastguard Worker     void (*disp_deinit)(void *);
248*495ae853SAndroid Build Coastguard Worker     void (*disp_usleep)(UWORD32);
249*495ae853SAndroid Build Coastguard Worker     IV_COLOR_FORMAT_T (*get_color_fmt)(void);
250*495ae853SAndroid Build Coastguard Worker     UWORD32 (*get_stride)(void);
251*495ae853SAndroid Build Coastguard Worker } vid_dec_ctx_t;
252*495ae853SAndroid Build Coastguard Worker 
253*495ae853SAndroid Build Coastguard Worker /**
254*495ae853SAndroid Build Coastguard Worker  * function pointer to malloc
255*495ae853SAndroid Build Coastguard Worker  */
256*495ae853SAndroid Build Coastguard Worker void *(*pf_mem_alloc)(UWORD32 u4_size);
257*495ae853SAndroid Build Coastguard Worker 
258*495ae853SAndroid Build Coastguard Worker /**
259*495ae853SAndroid Build Coastguard Worker  * function pointer to free
260*495ae853SAndroid Build Coastguard Worker  */
261*495ae853SAndroid Build Coastguard Worker void (*pf_mem_free)(void *pv_mem);
262*495ae853SAndroid Build Coastguard Worker 
263*495ae853SAndroid Build Coastguard Worker typedef enum
264*495ae853SAndroid Build Coastguard Worker {
265*495ae853SAndroid Build Coastguard Worker     INVALID,
266*495ae853SAndroid Build Coastguard Worker     HELP,
267*495ae853SAndroid Build Coastguard Worker     VERSION,
268*495ae853SAndroid Build Coastguard Worker     INPUT_FILE,
269*495ae853SAndroid Build Coastguard Worker     OUTPUT,
270*495ae853SAndroid Build Coastguard Worker     QP_MAP_FILE,
271*495ae853SAndroid Build Coastguard Worker     BLK_TYPE_MAP_FILE,
272*495ae853SAndroid Build Coastguard Worker     CHKSUM,
273*495ae853SAndroid Build Coastguard Worker     SAVE_OUTPUT,
274*495ae853SAndroid Build Coastguard Worker     SAVE_FRAME_INFO,
275*495ae853SAndroid Build Coastguard Worker     SAVE_CHKSUM,
276*495ae853SAndroid Build Coastguard Worker     CHROMA_FORMAT,
277*495ae853SAndroid Build Coastguard Worker     NUM_FRAMES,
278*495ae853SAndroid Build Coastguard Worker     NUM_CORES,
279*495ae853SAndroid Build Coastguard Worker     DISABLE_DEBLOCK_LEVEL,
280*495ae853SAndroid Build Coastguard Worker     SHARE_DISPLAY_BUF,
281*495ae853SAndroid Build Coastguard Worker     LOOPBACK,
282*495ae853SAndroid Build Coastguard Worker     DISPLAY,
283*495ae853SAndroid Build Coastguard Worker     FULLSCREEN,
284*495ae853SAndroid Build Coastguard Worker     FPS,
285*495ae853SAndroid Build Coastguard Worker     TRACE,
286*495ae853SAndroid Build Coastguard Worker     CONFIG,
287*495ae853SAndroid Build Coastguard Worker 
288*495ae853SAndroid Build Coastguard Worker     DEGRADE_TYPE,
289*495ae853SAndroid Build Coastguard Worker     DEGRADE_PICS,
290*495ae853SAndroid Build Coastguard Worker     ARCH,
291*495ae853SAndroid Build Coastguard Worker     SOC,
292*495ae853SAndroid Build Coastguard Worker     PICLEN,
293*495ae853SAndroid Build Coastguard Worker     PICLEN_FILE,
294*495ae853SAndroid Build Coastguard Worker     TARGET_LAYER_ID,
295*495ae853SAndroid Build Coastguard Worker } ARGUMENT_T;
296*495ae853SAndroid Build Coastguard Worker 
297*495ae853SAndroid Build Coastguard Worker typedef struct
298*495ae853SAndroid Build Coastguard Worker {
299*495ae853SAndroid Build Coastguard Worker     CHAR argument_shortname[4];
300*495ae853SAndroid Build Coastguard Worker     CHAR argument_name[128];
301*495ae853SAndroid Build Coastguard Worker     ARGUMENT_T argument;
302*495ae853SAndroid Build Coastguard Worker     CHAR description[512];
303*495ae853SAndroid Build Coastguard Worker } argument_t;
304*495ae853SAndroid Build Coastguard Worker 
305*495ae853SAndroid Build Coastguard Worker static const argument_t argument_mapping[] = {
306*495ae853SAndroid Build Coastguard Worker     {"-h", "--help", HELP, "Print this help\n"},
307*495ae853SAndroid Build Coastguard Worker     {"-c", "--config", CONFIG, "config file (Default: test.cfg)\n"},
308*495ae853SAndroid Build Coastguard Worker 
309*495ae853SAndroid Build Coastguard Worker     {"-v", "--version", VERSION, "Version information\n"},
310*495ae853SAndroid Build Coastguard Worker     {"-i", "--input", INPUT_FILE, "Input file\n"},
311*495ae853SAndroid Build Coastguard Worker     {"-o", "--output", OUTPUT, "Output file\n"},
312*495ae853SAndroid Build Coastguard Worker     {"--", "--qp_map_file", QP_MAP_FILE, "QP map file\n"},
313*495ae853SAndroid Build Coastguard Worker     {"--", "--blk_type_map_file", BLK_TYPE_MAP_FILE, "Block type map file\n"},
314*495ae853SAndroid Build Coastguard Worker     {"--", "--piclen", PICLEN,
315*495ae853SAndroid Build Coastguard Worker      "Flag to signal if the decoder has to use a file containing number of "
316*495ae853SAndroid Build Coastguard Worker      "bytes in each picture to be fed in each call\n"},
317*495ae853SAndroid Build Coastguard Worker     {"--", "--piclen_file", PICLEN_FILE,
318*495ae853SAndroid Build Coastguard Worker      "File containing number of bytes in each picture - each line containing "
319*495ae853SAndroid Build Coastguard Worker      "one i4_size\n"},
320*495ae853SAndroid Build Coastguard Worker     {"--", "--chksum", CHKSUM, "Output MD5 Checksum file\n"},
321*495ae853SAndroid Build Coastguard Worker     {"-s", "--save_output", SAVE_OUTPUT, "Save Output file\n"},
322*495ae853SAndroid Build Coastguard Worker     {"--", "--save_frame_info", SAVE_FRAME_INFO, "Save frame_info file\n"},
323*495ae853SAndroid Build Coastguard Worker     {"--", "--save_chksum", SAVE_CHKSUM, "Save Check sum file\n"},
324*495ae853SAndroid Build Coastguard Worker     {"--", "--chroma_format", CHROMA_FORMAT,
325*495ae853SAndroid Build Coastguard Worker      "Output Chroma format Supported values YUV_420P, YUV_422ILE, RGB_565, "
326*495ae853SAndroid Build Coastguard Worker      "YUV_420SP_UV, YUV_420SP_VU\n"},
327*495ae853SAndroid Build Coastguard Worker     {"-n", "--num_frames", NUM_FRAMES, "Number of frames to be decoded\n"},
328*495ae853SAndroid Build Coastguard Worker     {"--", "--num_cores", NUM_CORES, "Number of cores to be used\n"},
329*495ae853SAndroid Build Coastguard Worker     {"--", "--share_display_buf", SHARE_DISPLAY_BUF, "Enable shared display buffer mode\n"},
330*495ae853SAndroid Build Coastguard Worker     {"--", "--disable_deblock_level", DISABLE_DEBLOCK_LEVEL,
331*495ae853SAndroid Build Coastguard Worker      "Disable deblocking level : 0 to 4 - 0 Enable deblocking 4 Disable "
332*495ae853SAndroid Build Coastguard Worker      "deblocking completely\n"},
333*495ae853SAndroid Build Coastguard Worker     {"--", "--loopback", LOOPBACK, "Enable playback in a loop\n"},
334*495ae853SAndroid Build Coastguard Worker     {"--", "--display", DISPLAY, "Enable display (uses SDL)\n"},
335*495ae853SAndroid Build Coastguard Worker     {"--", "--fullscreen", FULLSCREEN, "Enable full screen (Only for GDL and SDL)\n"},
336*495ae853SAndroid Build Coastguard Worker     {"--", "--fps", FPS, "FPS to be used for display \n"},
337*495ae853SAndroid Build Coastguard Worker     {"-i", "--trace", TRACE, "Trace file\n"},
338*495ae853SAndroid Build Coastguard Worker 
339*495ae853SAndroid Build Coastguard Worker     {"--", "--degrade_type", DEGRADE_TYPE,
340*495ae853SAndroid Build Coastguard Worker      "Degrade type : 0: No degrade 0th bit set : Disable SAO 1st bit set : "
341*495ae853SAndroid Build Coastguard Worker      "Disable deblocking 2nd bit set : Faster inter prediction filters 3rd bit "
342*495ae853SAndroid Build Coastguard Worker      "set : Fastest inter prediction filters\n"},
343*495ae853SAndroid Build Coastguard Worker     {"--", "--degrade_pics", DEGRADE_PICS,
344*495ae853SAndroid Build Coastguard Worker      "Degrade pics : 0 : No degrade  1 : Only on non-reference frames  2 : Do "
345*495ae853SAndroid Build Coastguard Worker      "not degrade every 4th or key frames  3 : All non-key frames  4 : All "
346*495ae853SAndroid Build Coastguard Worker      "frames"},
347*495ae853SAndroid Build Coastguard Worker 
348*495ae853SAndroid Build Coastguard Worker     {"--", "--arch", ARCH,
349*495ae853SAndroid Build Coastguard Worker      "Set Architecture. Supported values  ARM_NONEON, ARM_A9Q, ARM_A7, ARM_A5, "
350*495ae853SAndroid Build Coastguard Worker      "ARM_NEONINTR,ARMV8_GENERIC, X86_GENERIC, X86_SSSE3, X86_SSE4 \n"},
351*495ae853SAndroid Build Coastguard Worker     {"--", "--soc", SOC, "Set SOC. Supported values  GENERIC, HISI_37X \n"},
352*495ae853SAndroid Build Coastguard Worker     {"-t", "--target_layer_id", TARGET_LAYER_ID, "Version information\n"},
353*495ae853SAndroid Build Coastguard Worker 
354*495ae853SAndroid Build Coastguard Worker };
355*495ae853SAndroid Build Coastguard Worker 
356*495ae853SAndroid Build Coastguard Worker #define PEAK_WINDOW_SIZE 8
357*495ae853SAndroid Build Coastguard Worker #define DEFAULT_SHARE_DISPLAY_BUF 0
358*495ae853SAndroid Build Coastguard Worker #define STRIDE 0
359*495ae853SAndroid Build Coastguard Worker #define DEFAULT_NUM_CORES 1
360*495ae853SAndroid Build Coastguard Worker 
361*495ae853SAndroid Build Coastguard Worker #define DUMP_SINGLE_BUF 0
362*495ae853SAndroid Build Coastguard Worker #define IV_ISFATALERROR(x) (((x) >> IVD_FATALERROR) & 0x1)
363*495ae853SAndroid Build Coastguard Worker 
364*495ae853SAndroid Build Coastguard Worker #define ivd_api_function isvcd_api_function
365*495ae853SAndroid Build Coastguard Worker 
366*495ae853SAndroid Build Coastguard Worker #ifdef IOS
367*495ae853SAndroid Build Coastguard Worker char filename_trace[PATHLENMAX];
368*495ae853SAndroid Build Coastguard Worker #endif
369*495ae853SAndroid Build Coastguard Worker 
370*495ae853SAndroid Build Coastguard Worker #if ANDROID_NDK
371*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
372*495ae853SAndroid Build Coastguard Worker /*                                                                           */
373*495ae853SAndroid Build Coastguard Worker /*  Function Name : raise                                                    */
374*495ae853SAndroid Build Coastguard Worker /*                                                                           */
375*495ae853SAndroid Build Coastguard Worker /*  Description   : Needed as a workaround when the application is built in  */
376*495ae853SAndroid Build Coastguard Worker /*                  Android NDK. This is an exception to be called for divide*/
377*495ae853SAndroid Build Coastguard Worker /*                  by zero error                                            */
378*495ae853SAndroid Build Coastguard Worker /*                                                                           */
379*495ae853SAndroid Build Coastguard Worker /*  Inputs        : a                                                        */
380*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
381*495ae853SAndroid Build Coastguard Worker /*  Processing    : None                                                     */
382*495ae853SAndroid Build Coastguard Worker /*                                                                           */
383*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
384*495ae853SAndroid Build Coastguard Worker /*  Returns       :                                                          */
385*495ae853SAndroid Build Coastguard Worker /*                                                                           */
386*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
387*495ae853SAndroid Build Coastguard Worker /*                                                                           */
388*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
389*495ae853SAndroid Build Coastguard Worker /*                                                                           */
390*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
391*495ae853SAndroid Build Coastguard Worker /*         07 09 2012   100189          Initial Version                      */
392*495ae853SAndroid Build Coastguard Worker /*                                                                           */
393*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
raise(int a)394*495ae853SAndroid Build Coastguard Worker int raise(int a)
395*495ae853SAndroid Build Coastguard Worker {
396*495ae853SAndroid Build Coastguard Worker     printf("Divide by zero\n");
397*495ae853SAndroid Build Coastguard Worker     return 0;
398*495ae853SAndroid Build Coastguard Worker }
399*495ae853SAndroid Build Coastguard Worker #endif
400*495ae853SAndroid Build Coastguard Worker 
401*495ae853SAndroid Build Coastguard Worker #ifdef _WIN32
402*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
403*495ae853SAndroid Build Coastguard Worker /* Function to print library calls                                           */
404*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
405*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
406*495ae853SAndroid Build Coastguard Worker /*                                                                           */
407*495ae853SAndroid Build Coastguard Worker /*  Function Name : memalign                                                 */
408*495ae853SAndroid Build Coastguard Worker /*                                                                           */
409*495ae853SAndroid Build Coastguard Worker /*  Description   : Returns malloc data. Ideally should return aligned memory*/
410*495ae853SAndroid Build Coastguard Worker /*                  support alignment will be added later                    */
411*495ae853SAndroid Build Coastguard Worker /*                                                                           */
412*495ae853SAndroid Build Coastguard Worker /*  Inputs        : alignment i4_size                                        */
413*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
414*495ae853SAndroid Build Coastguard Worker /*  Processing    :                                                          */
415*495ae853SAndroid Build Coastguard Worker /*                                                                           */
416*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
417*495ae853SAndroid Build Coastguard Worker /*  Returns       :                                                          */
418*495ae853SAndroid Build Coastguard Worker /*                                                                           */
419*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
420*495ae853SAndroid Build Coastguard Worker /*                                                                           */
421*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
422*495ae853SAndroid Build Coastguard Worker /*                                                                           */
423*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
424*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore          Initial Version                     */
425*495ae853SAndroid Build Coastguard Worker /*                                                                           */
426*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
427*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_malloc(void * pv_ctxt,WORD32 alignment,WORD32 i4_size)428*495ae853SAndroid Build Coastguard Worker void *ih264a_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
429*495ae853SAndroid Build Coastguard Worker {
430*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
431*495ae853SAndroid Build Coastguard Worker     return (void *) _aligned_malloc(i4_size, alignment);
432*495ae853SAndroid Build Coastguard Worker }
433*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_free(void * pv_ctxt,void * pv_buf)434*495ae853SAndroid Build Coastguard Worker void ih264a_aligned_free(void *pv_ctxt, void *pv_buf)
435*495ae853SAndroid Build Coastguard Worker {
436*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
437*495ae853SAndroid Build Coastguard Worker     _aligned_free(pv_buf);
438*495ae853SAndroid Build Coastguard Worker     return;
439*495ae853SAndroid Build Coastguard Worker }
440*495ae853SAndroid Build Coastguard Worker #endif
441*495ae853SAndroid Build Coastguard Worker 
442*495ae853SAndroid Build Coastguard Worker #if IOS
ih264a_aligned_malloc(void * pv_ctxt,WORD32 alignment,WORD32 i4_size)443*495ae853SAndroid Build Coastguard Worker void *ih264a_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
444*495ae853SAndroid Build Coastguard Worker {
445*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
446*495ae853SAndroid Build Coastguard Worker     return malloc(i4_size);
447*495ae853SAndroid Build Coastguard Worker }
448*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_free(void * pv_ctxt,void * pv_buf)449*495ae853SAndroid Build Coastguard Worker void ih264a_aligned_free(void *pv_ctxt, void *pv_buf)
450*495ae853SAndroid Build Coastguard Worker {
451*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
452*495ae853SAndroid Build Coastguard Worker     free(pv_buf);
453*495ae853SAndroid Build Coastguard Worker }
454*495ae853SAndroid Build Coastguard Worker #endif
455*495ae853SAndroid Build Coastguard Worker 
456*495ae853SAndroid Build Coastguard Worker #if(!defined(IOS)) && (!defined(_WIN32))
ih264a_aligned_malloc(void * pv_ctxt,WORD32 alignment,WORD32 i4_size)457*495ae853SAndroid Build Coastguard Worker void *ih264a_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
458*495ae853SAndroid Build Coastguard Worker {
459*495ae853SAndroid Build Coastguard Worker     void *buf = NULL;
460*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
461*495ae853SAndroid Build Coastguard Worker     if(0 != posix_memalign(&buf, alignment, i4_size))
462*495ae853SAndroid Build Coastguard Worker     {
463*495ae853SAndroid Build Coastguard Worker         return NULL;
464*495ae853SAndroid Build Coastguard Worker     }
465*495ae853SAndroid Build Coastguard Worker     return buf;
466*495ae853SAndroid Build Coastguard Worker }
467*495ae853SAndroid Build Coastguard Worker 
ih264a_aligned_free(void * pv_ctxt,void * pv_buf)468*495ae853SAndroid Build Coastguard Worker void ih264a_aligned_free(void *pv_ctxt, void *pv_buf)
469*495ae853SAndroid Build Coastguard Worker {
470*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
471*495ae853SAndroid Build Coastguard Worker     free(pv_buf);
472*495ae853SAndroid Build Coastguard Worker }
473*495ae853SAndroid Build Coastguard Worker #endif
474*495ae853SAndroid Build Coastguard Worker 
ih264a_memory_alloc(UWORD32 u4_size)475*495ae853SAndroid Build Coastguard Worker void *ih264a_memory_alloc(UWORD32 u4_size) { return (malloc(u4_size)); }
476*495ae853SAndroid Build Coastguard Worker 
ih264a_memory_free(void * pv_mem)477*495ae853SAndroid Build Coastguard Worker void ih264a_memory_free(void *pv_mem) { free(pv_mem); }
478*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
479*495ae853SAndroid Build Coastguard Worker /*                                                                           */
480*495ae853SAndroid Build Coastguard Worker /*  Function Name : set_degrade                                              */
481*495ae853SAndroid Build Coastguard Worker /*                                                                           */
482*495ae853SAndroid Build Coastguard Worker /*  Description   : Control call to set degrade level                        */
483*495ae853SAndroid Build Coastguard Worker /*                                                                           */
484*495ae853SAndroid Build Coastguard Worker /*                                                                           */
485*495ae853SAndroid Build Coastguard Worker /*  Inputs        : codec_obj  - Codec Handle                                */
486*495ae853SAndroid Build Coastguard Worker /*                  type - degrade level value between 0 to 4                */
487*495ae853SAndroid Build Coastguard Worker /*                    0 : No degrade                                         */
488*495ae853SAndroid Build Coastguard Worker /*                    1st bit : Disable SAO                                  */
489*495ae853SAndroid Build Coastguard Worker /*                    2nd bit : Disable Deblock                              */
490*495ae853SAndroid Build Coastguard Worker /*                    3rd bit : Faster MC for non-ref                        */
491*495ae853SAndroid Build Coastguard Worker /*                    4th bit : Fastest MC for non-ref                       */
492*495ae853SAndroid Build Coastguard Worker /*                  pics - Pictures that are are degraded                    */
493*495ae853SAndroid Build Coastguard Worker /*                    0 : No degrade                                         */
494*495ae853SAndroid Build Coastguard Worker /*                    1 : Non-ref pictures                                   */
495*495ae853SAndroid Build Coastguard Worker /*                    2 : Pictures at given interval are not degraded        */
496*495ae853SAndroid Build Coastguard Worker /*                    3 : All non-key pictures                               */
497*495ae853SAndroid Build Coastguard Worker /*                    4 : All pictures                                       */
498*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
499*495ae853SAndroid Build Coastguard Worker /*  Processing    : Calls degrade control to the codec                       */
500*495ae853SAndroid Build Coastguard Worker /*                                                                           */
501*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
502*495ae853SAndroid Build Coastguard Worker /*  Returns       : Control call return i4_status                            */
503*495ae853SAndroid Build Coastguard Worker /*                                                                           */
504*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
505*495ae853SAndroid Build Coastguard Worker /*                                                                           */
506*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
507*495ae853SAndroid Build Coastguard Worker /*                                                                           */
508*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
509*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
510*495ae853SAndroid Build Coastguard Worker /*                                                                           */
511*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
512*495ae853SAndroid Build Coastguard Worker 
set_degrade(void * codec_obj,UWORD32 type,WORD32 pics)513*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T set_degrade(void *codec_obj, UWORD32 type, WORD32 pics)
514*495ae853SAndroid Build Coastguard Worker {
515*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_degrade_ip_t s_ctl_ip;
516*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_degrade_op_t s_ctl_op;
517*495ae853SAndroid Build Coastguard Worker     void *pv_api_ip, *pv_api_op;
518*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T e_dec_status;
519*495ae853SAndroid Build Coastguard Worker 
520*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.u4_size = sizeof(isvcd_ctl_degrade_ip_t);
521*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.i4_degrade_type = type;
522*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.i4_nondegrade_interval = 4;
523*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.i4_degrade_pics = pics;
524*495ae853SAndroid Build Coastguard Worker 
525*495ae853SAndroid Build Coastguard Worker     s_ctl_op.u4_size = sizeof(isvcd_ctl_degrade_op_t);
526*495ae853SAndroid Build Coastguard Worker 
527*495ae853SAndroid Build Coastguard Worker     pv_api_ip = (void *) &s_ctl_ip;
528*495ae853SAndroid Build Coastguard Worker     pv_api_op = (void *) &s_ctl_op;
529*495ae853SAndroid Build Coastguard Worker 
530*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
531*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_sub_cmd = (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_DEGRADE;
532*495ae853SAndroid Build Coastguard Worker 
533*495ae853SAndroid Build Coastguard Worker     e_dec_status = ivd_api_function((iv_obj_t *) codec_obj, pv_api_ip, pv_api_op);
534*495ae853SAndroid Build Coastguard Worker 
535*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != e_dec_status)
536*495ae853SAndroid Build Coastguard Worker     {
537*495ae853SAndroid Build Coastguard Worker         printf("Error in setting degrade level \n");
538*495ae853SAndroid Build Coastguard Worker     }
539*495ae853SAndroid Build Coastguard Worker     return (e_dec_status);
540*495ae853SAndroid Build Coastguard Worker }
541*495ae853SAndroid Build Coastguard Worker 
542*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
543*495ae853SAndroid Build Coastguard Worker /*                                                                           */
544*495ae853SAndroid Build Coastguard Worker /*  Function Name : enable_skipb_frames                                      */
545*495ae853SAndroid Build Coastguard Worker /*                                                                           */
546*495ae853SAndroid Build Coastguard Worker /*  Description   : Control call to enable skipping of b frames              */
547*495ae853SAndroid Build Coastguard Worker /*                                                                           */
548*495ae853SAndroid Build Coastguard Worker /*                                                                           */
549*495ae853SAndroid Build Coastguard Worker /*  Inputs        : codec_obj : Codec handle                                 */
550*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
551*495ae853SAndroid Build Coastguard Worker /*  Processing    : Calls enable skip B frames control                       */
552*495ae853SAndroid Build Coastguard Worker /*                                                                           */
553*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
554*495ae853SAndroid Build Coastguard Worker /*  Returns       : Control call return i4_status                            */
555*495ae853SAndroid Build Coastguard Worker /*                                                                           */
556*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
557*495ae853SAndroid Build Coastguard Worker /*                                                                           */
558*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
559*495ae853SAndroid Build Coastguard Worker /*                                                                           */
560*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
561*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
562*495ae853SAndroid Build Coastguard Worker /*                                                                           */
563*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
564*495ae853SAndroid Build Coastguard Worker 
enable_skipb_frames(void * codec_obj,vid_dec_ctx_t * ps_app_ctx)565*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T enable_skipb_frames(void *codec_obj, vid_dec_ctx_t *ps_app_ctx)
566*495ae853SAndroid Build Coastguard Worker {
567*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_config_ip_t s_h264d_ctl_ip;
568*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_config_op_t s_h264d_ctl_op;
569*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
570*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
571*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T e_dec_status;
572*495ae853SAndroid Build Coastguard Worker 
573*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->u4_disp_wd = ps_app_ctx->u4_strd;
574*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_B;
575*495ae853SAndroid Build Coastguard Worker 
576*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
577*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
578*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
579*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
580*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->u4_size = sizeof(isvcd_ctl_set_config_ip_t);
581*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_size = sizeof(isvcd_ctl_set_config_op_t);
582*495ae853SAndroid Build Coastguard Worker 
583*495ae853SAndroid Build Coastguard Worker     e_dec_status = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_ctl_ip,
584*495ae853SAndroid Build Coastguard Worker                                     (void *) &s_h264d_ctl_op);
585*495ae853SAndroid Build Coastguard Worker 
586*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != e_dec_status)
587*495ae853SAndroid Build Coastguard Worker     {
588*495ae853SAndroid Build Coastguard Worker         printf("Error in Enable SkipB frames \n");
589*495ae853SAndroid Build Coastguard Worker     }
590*495ae853SAndroid Build Coastguard Worker 
591*495ae853SAndroid Build Coastguard Worker     return e_dec_status;
592*495ae853SAndroid Build Coastguard Worker }
593*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
594*495ae853SAndroid Build Coastguard Worker /*                                                                           */
595*495ae853SAndroid Build Coastguard Worker /*  Function Name : disable_skipb_frames                                     */
596*495ae853SAndroid Build Coastguard Worker /*                                                                           */
597*495ae853SAndroid Build Coastguard Worker /*  Description   : Control call to disable skipping of b frames             */
598*495ae853SAndroid Build Coastguard Worker /*                                                                           */
599*495ae853SAndroid Build Coastguard Worker /*                                                                           */
600*495ae853SAndroid Build Coastguard Worker /*  Inputs        : codec_obj : Codec handle                                 */
601*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
602*495ae853SAndroid Build Coastguard Worker /*  Processing    : Calls disable B frame skip control                       */
603*495ae853SAndroid Build Coastguard Worker /*                                                                           */
604*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
605*495ae853SAndroid Build Coastguard Worker /*  Returns       : Control call return i4_status                            */
606*495ae853SAndroid Build Coastguard Worker /*                                                                           */
607*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
608*495ae853SAndroid Build Coastguard Worker /*                                                                           */
609*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
610*495ae853SAndroid Build Coastguard Worker /*                                                                           */
611*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
612*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
613*495ae853SAndroid Build Coastguard Worker /*                                                                           */
614*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
615*495ae853SAndroid Build Coastguard Worker 
disable_skipb_frames(void * codec_obj,vid_dec_ctx_t * ps_app_ctx)616*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T disable_skipb_frames(void *codec_obj, vid_dec_ctx_t *ps_app_ctx)
617*495ae853SAndroid Build Coastguard Worker {
618*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_config_ip_t s_h264d_ctl_ip;
619*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_config_op_t s_h264d_ctl_op;
620*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
621*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
622*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T e_dec_status;
623*495ae853SAndroid Build Coastguard Worker 
624*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->u4_disp_wd = ps_app_ctx->u4_strd;
625*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
626*495ae853SAndroid Build Coastguard Worker 
627*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
628*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
629*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
630*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
631*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->u4_size = sizeof(isvcd_ctl_set_config_ip_t);
632*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_size = sizeof(isvcd_ctl_set_config_op_t);
633*495ae853SAndroid Build Coastguard Worker 
634*495ae853SAndroid Build Coastguard Worker     e_dec_status = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_ctl_ip,
635*495ae853SAndroid Build Coastguard Worker                                     (void *) &s_h264d_ctl_op);
636*495ae853SAndroid Build Coastguard Worker 
637*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != e_dec_status)
638*495ae853SAndroid Build Coastguard Worker     {
639*495ae853SAndroid Build Coastguard Worker         printf("Error in Disable SkipB frames\n");
640*495ae853SAndroid Build Coastguard Worker     }
641*495ae853SAndroid Build Coastguard Worker 
642*495ae853SAndroid Build Coastguard Worker     return e_dec_status;
643*495ae853SAndroid Build Coastguard Worker }
644*495ae853SAndroid Build Coastguard Worker 
645*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
646*495ae853SAndroid Build Coastguard Worker /*                                                                           */
647*495ae853SAndroid Build Coastguard Worker /*  Function Name : enable_skippb_frames                                     */
648*495ae853SAndroid Build Coastguard Worker /*                                                                           */
649*495ae853SAndroid Build Coastguard Worker /*  Description   : Control call to enable skipping of P & B frames          */
650*495ae853SAndroid Build Coastguard Worker /*                                                                           */
651*495ae853SAndroid Build Coastguard Worker /*                                                                           */
652*495ae853SAndroid Build Coastguard Worker /*  Inputs        : codec_obj : Codec handle                                 */
653*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
654*495ae853SAndroid Build Coastguard Worker /*  Processing    : Calls enable skip P and B frames control                 */
655*495ae853SAndroid Build Coastguard Worker /*                                                                           */
656*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
657*495ae853SAndroid Build Coastguard Worker /*  Returns       : Control call return i4_status                            */
658*495ae853SAndroid Build Coastguard Worker /*                                                                           */
659*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
660*495ae853SAndroid Build Coastguard Worker /*                                                                           */
661*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
662*495ae853SAndroid Build Coastguard Worker /*                                                                           */
663*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
664*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
665*495ae853SAndroid Build Coastguard Worker /*                                                                           */
666*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
667*495ae853SAndroid Build Coastguard Worker 
enable_skippb_frames(void * codec_obj,vid_dec_ctx_t * ps_app_ctx)668*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T enable_skippb_frames(void *codec_obj, vid_dec_ctx_t *ps_app_ctx)
669*495ae853SAndroid Build Coastguard Worker {
670*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_config_ip_t s_h264d_ctl_ip;
671*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_config_op_t s_h264d_ctl_op;
672*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
673*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
674*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T e_dec_status;
675*495ae853SAndroid Build Coastguard Worker 
676*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->u4_disp_wd = ps_app_ctx->u4_strd;
677*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_PB;
678*495ae853SAndroid Build Coastguard Worker 
679*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
680*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
681*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
682*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
683*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->u4_size = sizeof(isvcd_ctl_set_config_ip_t);
684*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_size = sizeof(isvcd_ctl_set_config_op_t);
685*495ae853SAndroid Build Coastguard Worker 
686*495ae853SAndroid Build Coastguard Worker     e_dec_status = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_ctl_ip,
687*495ae853SAndroid Build Coastguard Worker                                     (void *) &s_h264d_ctl_op);
688*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != e_dec_status)
689*495ae853SAndroid Build Coastguard Worker     {
690*495ae853SAndroid Build Coastguard Worker         printf("Error in Enable SkipPB frames\n");
691*495ae853SAndroid Build Coastguard Worker     }
692*495ae853SAndroid Build Coastguard Worker 
693*495ae853SAndroid Build Coastguard Worker     return e_dec_status;
694*495ae853SAndroid Build Coastguard Worker }
695*495ae853SAndroid Build Coastguard Worker 
696*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
697*495ae853SAndroid Build Coastguard Worker /*                                                                           */
698*495ae853SAndroid Build Coastguard Worker /*  Function Name : disable_skippb_frames                                    */
699*495ae853SAndroid Build Coastguard Worker /*                                                                           */
700*495ae853SAndroid Build Coastguard Worker /*  Description   : Control call to disable skipping of P and B frames       */
701*495ae853SAndroid Build Coastguard Worker /*                                                                           */
702*495ae853SAndroid Build Coastguard Worker /*                                                                           */
703*495ae853SAndroid Build Coastguard Worker /*  Inputs        : codec_obj : Codec handle                                 */
704*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
705*495ae853SAndroid Build Coastguard Worker /*  Processing    : Calls disable P and B frame skip control                 */
706*495ae853SAndroid Build Coastguard Worker /*                                                                           */
707*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
708*495ae853SAndroid Build Coastguard Worker /*  Returns       : Control call return i4_status                            */
709*495ae853SAndroid Build Coastguard Worker /*                                                                           */
710*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
711*495ae853SAndroid Build Coastguard Worker /*                                                                           */
712*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
713*495ae853SAndroid Build Coastguard Worker /*                                                                           */
714*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
715*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
716*495ae853SAndroid Build Coastguard Worker /*                                                                           */
717*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
718*495ae853SAndroid Build Coastguard Worker 
disable_skippb_frames(void * codec_obj,vid_dec_ctx_t * ps_app_ctx)719*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T disable_skippb_frames(void *codec_obj, vid_dec_ctx_t *ps_app_ctx)
720*495ae853SAndroid Build Coastguard Worker {
721*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_config_ip_t s_h264d_ctl_ip;
722*495ae853SAndroid Build Coastguard Worker     isvcd_ctl_set_config_op_t s_h264d_ctl_op;
723*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
724*495ae853SAndroid Build Coastguard Worker     ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
725*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T e_dec_status;
726*495ae853SAndroid Build Coastguard Worker 
727*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->u4_disp_wd = ps_app_ctx->u4_strd;
728*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
729*495ae853SAndroid Build Coastguard Worker 
730*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
731*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
732*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
733*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
734*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip->u4_size = sizeof(isvcd_ctl_set_config_ip_t);
735*495ae853SAndroid Build Coastguard Worker     ps_ctl_op->u4_size = sizeof(isvcd_ctl_set_config_op_t);
736*495ae853SAndroid Build Coastguard Worker 
737*495ae853SAndroid Build Coastguard Worker     e_dec_status = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_ctl_ip,
738*495ae853SAndroid Build Coastguard Worker                                     (void *) &s_h264d_ctl_op);
739*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != e_dec_status)
740*495ae853SAndroid Build Coastguard Worker     {
741*495ae853SAndroid Build Coastguard Worker         printf("Error in Disable SkipPB frames\n");
742*495ae853SAndroid Build Coastguard Worker     }
743*495ae853SAndroid Build Coastguard Worker 
744*495ae853SAndroid Build Coastguard Worker     return e_dec_status;
745*495ae853SAndroid Build Coastguard Worker }
746*495ae853SAndroid Build Coastguard Worker 
747*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
748*495ae853SAndroid Build Coastguard Worker /*                                                                           */
749*495ae853SAndroid Build Coastguard Worker /*  Function Name : release_disp_frame                                       */
750*495ae853SAndroid Build Coastguard Worker /*                                                                           */
751*495ae853SAndroid Build Coastguard Worker /*  Description   : Calls release display control - Used to signal to the    */
752*495ae853SAndroid Build Coastguard Worker /*                  decoder that this particular buffer has been displayed   */
753*495ae853SAndroid Build Coastguard Worker /*                  and that the codec is now free to write to this buffer   */
754*495ae853SAndroid Build Coastguard Worker /*                                                                           */
755*495ae853SAndroid Build Coastguard Worker /*                                                                           */
756*495ae853SAndroid Build Coastguard Worker /*  Inputs        : codec_obj : Codec Handle                                 */
757*495ae853SAndroid Build Coastguard Worker /*                  buf_id    : Buffer Id of the buffer to be released       */
758*495ae853SAndroid Build Coastguard Worker /*                              This id would have been returned earlier by  */
759*495ae853SAndroid Build Coastguard Worker /*                              the codec                                    */
760*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
761*495ae853SAndroid Build Coastguard Worker /*  Processing    : Calls Release Display call                               */
762*495ae853SAndroid Build Coastguard Worker /*                                                                           */
763*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
764*495ae853SAndroid Build Coastguard Worker /*  Returns       : Status of release display call                           */
765*495ae853SAndroid Build Coastguard Worker /*                                                                           */
766*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
767*495ae853SAndroid Build Coastguard Worker /*                                                                           */
768*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
769*495ae853SAndroid Build Coastguard Worker /*                                                                           */
770*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
771*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
772*495ae853SAndroid Build Coastguard Worker /*                                                                           */
773*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
774*495ae853SAndroid Build Coastguard Worker 
release_disp_frame(void * codec_obj,UWORD32 buf_id)775*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T release_disp_frame(void *codec_obj, UWORD32 buf_id)
776*495ae853SAndroid Build Coastguard Worker {
777*495ae853SAndroid Build Coastguard Worker     ivd_rel_display_frame_ip_t s_video_rel_disp_ip;
778*495ae853SAndroid Build Coastguard Worker     ivd_rel_display_frame_op_t s_video_rel_disp_op;
779*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T e_dec_status;
780*495ae853SAndroid Build Coastguard Worker 
781*495ae853SAndroid Build Coastguard Worker     s_video_rel_disp_ip.e_cmd = IVD_CMD_REL_DISPLAY_FRAME;
782*495ae853SAndroid Build Coastguard Worker     s_video_rel_disp_ip.u4_size = sizeof(ivd_rel_display_frame_ip_t);
783*495ae853SAndroid Build Coastguard Worker     s_video_rel_disp_op.u4_size = sizeof(ivd_rel_display_frame_op_t);
784*495ae853SAndroid Build Coastguard Worker     s_video_rel_disp_ip.u4_disp_buf_id = buf_id;
785*495ae853SAndroid Build Coastguard Worker 
786*495ae853SAndroid Build Coastguard Worker     e_dec_status = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_video_rel_disp_ip,
787*495ae853SAndroid Build Coastguard Worker                                     (void *) &s_video_rel_disp_op);
788*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != e_dec_status)
789*495ae853SAndroid Build Coastguard Worker     {
790*495ae853SAndroid Build Coastguard Worker         printf("Error in Release Disp frame\n");
791*495ae853SAndroid Build Coastguard Worker     }
792*495ae853SAndroid Build Coastguard Worker 
793*495ae853SAndroid Build Coastguard Worker     return (e_dec_status);
794*495ae853SAndroid Build Coastguard Worker }
795*495ae853SAndroid Build Coastguard Worker 
796*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
797*495ae853SAndroid Build Coastguard Worker /*                                                                           */
798*495ae853SAndroid Build Coastguard Worker /*  Function Name : get_version                                      */
799*495ae853SAndroid Build Coastguard Worker /*                                                                           */
800*495ae853SAndroid Build Coastguard Worker /*  Description   : Control call to get codec version                        */
801*495ae853SAndroid Build Coastguard Worker /*                                                                           */
802*495ae853SAndroid Build Coastguard Worker /*                                                                           */
803*495ae853SAndroid Build Coastguard Worker /*  Inputs        : codec_obj : Codec handle                                 */
804*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
805*495ae853SAndroid Build Coastguard Worker /*  Processing    : Calls enable skip B frames control                       */
806*495ae853SAndroid Build Coastguard Worker /*                                                                           */
807*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
808*495ae853SAndroid Build Coastguard Worker /*  Returns       : Control call return i4_status                            */
809*495ae853SAndroid Build Coastguard Worker /*                                                                           */
810*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
811*495ae853SAndroid Build Coastguard Worker /*                                                                           */
812*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
813*495ae853SAndroid Build Coastguard Worker /*                                                                           */
814*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
815*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
816*495ae853SAndroid Build Coastguard Worker /*                                                                           */
817*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
818*495ae853SAndroid Build Coastguard Worker 
get_version(void * codec_obj)819*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T get_version(void *codec_obj)
820*495ae853SAndroid Build Coastguard Worker {
821*495ae853SAndroid Build Coastguard Worker     ivd_ctl_getversioninfo_ip_t ps_ctl_ip;
822*495ae853SAndroid Build Coastguard Worker     ivd_ctl_getversioninfo_op_t ps_ctl_op;
823*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_buf[512];
824*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T i4_status;
825*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
826*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION;
827*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t);
828*495ae853SAndroid Build Coastguard Worker     ps_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t);
829*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip.pv_version_buffer = au1_buf;
830*495ae853SAndroid Build Coastguard Worker     ps_ctl_ip.u4_version_buffer_size = sizeof(au1_buf);
831*495ae853SAndroid Build Coastguard Worker 
832*495ae853SAndroid Build Coastguard Worker     i4_status =
833*495ae853SAndroid Build Coastguard Worker         ivd_api_function((iv_obj_t *) codec_obj, (void *) &(ps_ctl_ip), (void *) &(ps_ctl_op));
834*495ae853SAndroid Build Coastguard Worker 
835*495ae853SAndroid Build Coastguard Worker     if(i4_status != IV_SUCCESS)
836*495ae853SAndroid Build Coastguard Worker     {
837*495ae853SAndroid Build Coastguard Worker         printf(
838*495ae853SAndroid Build Coastguard Worker             "Error in Getting Version number e_dec_status = %d u4_error_code = "
839*495ae853SAndroid Build Coastguard Worker             "%x\n",
840*495ae853SAndroid Build Coastguard Worker             i4_status, ps_ctl_op.u4_error_code);
841*495ae853SAndroid Build Coastguard Worker     }
842*495ae853SAndroid Build Coastguard Worker     else
843*495ae853SAndroid Build Coastguard Worker     {
844*495ae853SAndroid Build Coastguard Worker         printf("Ittiam Decoder Version number: %s\n", (char *) ps_ctl_ip.pv_version_buffer);
845*495ae853SAndroid Build Coastguard Worker     }
846*495ae853SAndroid Build Coastguard Worker     return i4_status;
847*495ae853SAndroid Build Coastguard Worker }
848*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
849*495ae853SAndroid Build Coastguard Worker /*                                                                           */
850*495ae853SAndroid Build Coastguard Worker /*  Function Name : codec_exit                                               */
851*495ae853SAndroid Build Coastguard Worker /*                                                                           */
852*495ae853SAndroid Build Coastguard Worker /*  Description   : handles unrecoverable errors                             */
853*495ae853SAndroid Build Coastguard Worker /*  Inputs        : Error message                                            */
854*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
855*495ae853SAndroid Build Coastguard Worker /*  Processing    : Prints error message to console and exits.               */
856*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Error mesage to the console                              */
857*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
858*495ae853SAndroid Build Coastguard Worker /*                                                                           */
859*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
860*495ae853SAndroid Build Coastguard Worker /*                                                                           */
861*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
862*495ae853SAndroid Build Coastguard Worker /*                                                                           */
863*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
864*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Creation                             */
865*495ae853SAndroid Build Coastguard Worker /*                                                                           */
866*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
codec_exit(CHAR * pc_err_message)867*495ae853SAndroid Build Coastguard Worker void codec_exit(CHAR *pc_err_message)
868*495ae853SAndroid Build Coastguard Worker {
869*495ae853SAndroid Build Coastguard Worker     printf("%s\n", pc_err_message);
870*495ae853SAndroid Build Coastguard Worker     exit(-1);
871*495ae853SAndroid Build Coastguard Worker }
872*495ae853SAndroid Build Coastguard Worker 
873*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
874*495ae853SAndroid Build Coastguard Worker /*                                                                           */
875*495ae853SAndroid Build Coastguard Worker /*  Function Name : dump_output                                              */
876*495ae853SAndroid Build Coastguard Worker /*                                                                           */
877*495ae853SAndroid Build Coastguard Worker /*  Description   : Used to dump output YUV                                  */
878*495ae853SAndroid Build Coastguard Worker /*  Inputs        : App context, disp output desc, File pointer              */
879*495ae853SAndroid Build Coastguard Worker /*  Globals       : None                                                     */
880*495ae853SAndroid Build Coastguard Worker /*  Processing    : Dumps to a file                                          */
881*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
882*495ae853SAndroid Build Coastguard Worker /*                                                                           */
883*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
884*495ae853SAndroid Build Coastguard Worker /*                                                                           */
885*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
886*495ae853SAndroid Build Coastguard Worker /*                                                                           */
887*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
888*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Creation                             */
889*495ae853SAndroid Build Coastguard Worker /*                                                                           */
890*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
dump_output(vid_dec_ctx_t * ps_app_ctx,iv_yuv_buf_t * ps_disp_frm_buf,isvcd_video_decode_op_t * ps_h264d_decode_op,UWORD32 u4_disp_frm_id,FILE * ps_op_file,FILE * ps_qp_file,FILE * ps_mb_type_file,FILE * ps_op_chksum_file,WORD32 i4_op_frm_ts,UWORD32 file_save,UWORD32 chksum_save,UWORD32 mbinfo_save)891*495ae853SAndroid Build Coastguard Worker void dump_output(vid_dec_ctx_t *ps_app_ctx, iv_yuv_buf_t *ps_disp_frm_buf,
892*495ae853SAndroid Build Coastguard Worker                  isvcd_video_decode_op_t *ps_h264d_decode_op, UWORD32 u4_disp_frm_id,
893*495ae853SAndroid Build Coastguard Worker                  FILE *ps_op_file, FILE *ps_qp_file, FILE *ps_mb_type_file, FILE *ps_op_chksum_file,
894*495ae853SAndroid Build Coastguard Worker                  WORD32 i4_op_frm_ts, UWORD32 file_save, UWORD32 chksum_save, UWORD32 mbinfo_save)
895*495ae853SAndroid Build Coastguard Worker 
896*495ae853SAndroid Build Coastguard Worker {
897*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
898*495ae853SAndroid Build Coastguard Worker     iv_yuv_buf_t s_dump_disp_frm_buf;
899*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_disp_id;
900*495ae853SAndroid Build Coastguard Worker 
901*495ae853SAndroid Build Coastguard Worker     memset(&s_dump_disp_frm_buf, 0, sizeof(iv_yuv_buf_t));
902*495ae853SAndroid Build Coastguard Worker 
903*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctx->u4_share_disp_buf)
904*495ae853SAndroid Build Coastguard Worker     {
905*495ae853SAndroid Build Coastguard Worker         if(ps_app_ctx->dump_q_wr_idx == MAX_DISP_BUFFERS) ps_app_ctx->dump_q_wr_idx = 0;
906*495ae853SAndroid Build Coastguard Worker 
907*495ae853SAndroid Build Coastguard Worker         if(ps_app_ctx->dump_q_rd_idx == MAX_DISP_BUFFERS) ps_app_ctx->dump_q_rd_idx = 0;
908*495ae853SAndroid Build Coastguard Worker 
909*495ae853SAndroid Build Coastguard Worker         ps_app_ctx->s_disp_frm_queue[ps_app_ctx->dump_q_wr_idx] = *ps_disp_frm_buf;
910*495ae853SAndroid Build Coastguard Worker         ps_app_ctx->s_disp_frm_id_queue[ps_app_ctx->dump_q_wr_idx] = u4_disp_frm_id;
911*495ae853SAndroid Build Coastguard Worker         ps_app_ctx->dump_q_wr_idx++;
912*495ae853SAndroid Build Coastguard Worker 
913*495ae853SAndroid Build Coastguard Worker         if((WORD32) i4_op_frm_ts >= (WORD32) (ps_app_ctx->disp_delay - 1))
914*495ae853SAndroid Build Coastguard Worker         {
915*495ae853SAndroid Build Coastguard Worker             s_dump_disp_frm_buf = ps_app_ctx->s_disp_frm_queue[ps_app_ctx->dump_q_rd_idx];
916*495ae853SAndroid Build Coastguard Worker             u4_disp_id = ps_app_ctx->s_disp_frm_id_queue[ps_app_ctx->dump_q_rd_idx];
917*495ae853SAndroid Build Coastguard Worker             ps_app_ctx->dump_q_rd_idx++;
918*495ae853SAndroid Build Coastguard Worker         }
919*495ae853SAndroid Build Coastguard Worker         else
920*495ae853SAndroid Build Coastguard Worker         {
921*495ae853SAndroid Build Coastguard Worker             return;
922*495ae853SAndroid Build Coastguard Worker         }
923*495ae853SAndroid Build Coastguard Worker     }
924*495ae853SAndroid Build Coastguard Worker     else
925*495ae853SAndroid Build Coastguard Worker     {
926*495ae853SAndroid Build Coastguard Worker         s_dump_disp_frm_buf = *ps_disp_frm_buf;
927*495ae853SAndroid Build Coastguard Worker         u4_disp_id = u4_disp_frm_id;
928*495ae853SAndroid Build Coastguard Worker     }
929*495ae853SAndroid Build Coastguard Worker 
930*495ae853SAndroid Build Coastguard Worker     release_disp_frame(ps_app_ctx->cocodec_obj, u4_disp_id);
931*495ae853SAndroid Build Coastguard Worker 
932*495ae853SAndroid Build Coastguard Worker     if(0 == file_save && 0 == chksum_save && 0 == mbinfo_save) return;
933*495ae853SAndroid Build Coastguard Worker 
934*495ae853SAndroid Build Coastguard Worker     if(0 != mbinfo_save)
935*495ae853SAndroid Build Coastguard Worker     {
936*495ae853SAndroid Build Coastguard Worker         UWORD8 *buf;
937*495ae853SAndroid Build Coastguard Worker         if(ps_h264d_decode_op->pu1_8x8_blk_qp_map && ps_qp_file)
938*495ae853SAndroid Build Coastguard Worker         {
939*495ae853SAndroid Build Coastguard Worker             buf = ps_h264d_decode_op->pu1_8x8_blk_qp_map;
940*495ae853SAndroid Build Coastguard Worker             fwrite(buf, 1, ps_h264d_decode_op->u4_8x8_blk_qp_map_size, ps_qp_file);
941*495ae853SAndroid Build Coastguard Worker             fflush(ps_qp_file);
942*495ae853SAndroid Build Coastguard Worker         }
943*495ae853SAndroid Build Coastguard Worker         if(ps_h264d_decode_op->pu1_8x8_blk_type_map && ps_mb_type_file)
944*495ae853SAndroid Build Coastguard Worker         {
945*495ae853SAndroid Build Coastguard Worker             buf = ps_h264d_decode_op->pu1_8x8_blk_type_map;
946*495ae853SAndroid Build Coastguard Worker             fwrite(buf, 1, ps_h264d_decode_op->u4_8x8_blk_type_map_size, ps_mb_type_file);
947*495ae853SAndroid Build Coastguard Worker             fflush(ps_mb_type_file);
948*495ae853SAndroid Build Coastguard Worker         }
949*495ae853SAndroid Build Coastguard Worker     }
950*495ae853SAndroid Build Coastguard Worker     if(NULL == s_dump_disp_frm_buf.pv_y_buf) return;
951*495ae853SAndroid Build Coastguard Worker 
952*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctx->e_output_chroma_format == IV_YUV_420P)
953*495ae853SAndroid Build Coastguard Worker     {
954*495ae853SAndroid Build Coastguard Worker #if DUMP_SINGLE_BUF
955*495ae853SAndroid Build Coastguard Worker         {
956*495ae853SAndroid Build Coastguard Worker             UWORD8 *buf = s_dump_disp_frm_buf.pv_y_buf - 80 - (s_dump_disp_frm_buf.u4_y_strd * 80);
957*495ae853SAndroid Build Coastguard Worker 
958*495ae853SAndroid Build Coastguard Worker             UWORD32 i4_size = s_dump_disp_frm_buf.u4_y_strd * ((s_dump_disp_frm_buf.u4_y_ht + 160) +
959*495ae853SAndroid Build Coastguard Worker                                                                (s_dump_disp_frm_buf.u4_u_ht + 80));
960*495ae853SAndroid Build Coastguard Worker             fwrite(buf, 1, i4_size, ps_op_file);
961*495ae853SAndroid Build Coastguard Worker         }
962*495ae853SAndroid Build Coastguard Worker #else
963*495ae853SAndroid Build Coastguard Worker         if(0 != file_save && ps_op_file)
964*495ae853SAndroid Build Coastguard Worker         {
965*495ae853SAndroid Build Coastguard Worker             UWORD8 *buf;
966*495ae853SAndroid Build Coastguard Worker 
967*495ae853SAndroid Build Coastguard Worker             buf = (UWORD8 *) s_dump_disp_frm_buf.pv_y_buf;
968*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < s_dump_disp_frm_buf.u4_y_ht; i++)
969*495ae853SAndroid Build Coastguard Worker             {
970*495ae853SAndroid Build Coastguard Worker                 fwrite(buf, 1, s_dump_disp_frm_buf.u4_y_wd, ps_op_file);
971*495ae853SAndroid Build Coastguard Worker                 buf += s_dump_disp_frm_buf.u4_y_strd;
972*495ae853SAndroid Build Coastguard Worker             }
973*495ae853SAndroid Build Coastguard Worker 
974*495ae853SAndroid Build Coastguard Worker             buf = (UWORD8 *) s_dump_disp_frm_buf.pv_u_buf;
975*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < s_dump_disp_frm_buf.u4_u_ht; i++)
976*495ae853SAndroid Build Coastguard Worker             {
977*495ae853SAndroid Build Coastguard Worker                 fwrite(buf, 1, s_dump_disp_frm_buf.u4_u_wd, ps_op_file);
978*495ae853SAndroid Build Coastguard Worker                 buf += s_dump_disp_frm_buf.u4_u_strd;
979*495ae853SAndroid Build Coastguard Worker             }
980*495ae853SAndroid Build Coastguard Worker             buf = (UWORD8 *) s_dump_disp_frm_buf.pv_v_buf;
981*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < s_dump_disp_frm_buf.u4_v_ht; i++)
982*495ae853SAndroid Build Coastguard Worker             {
983*495ae853SAndroid Build Coastguard Worker                 fwrite(buf, 1, s_dump_disp_frm_buf.u4_v_wd, ps_op_file);
984*495ae853SAndroid Build Coastguard Worker                 buf += s_dump_disp_frm_buf.u4_v_strd;
985*495ae853SAndroid Build Coastguard Worker             }
986*495ae853SAndroid Build Coastguard Worker         }
987*495ae853SAndroid Build Coastguard Worker 
988*495ae853SAndroid Build Coastguard Worker         if(0 != chksum_save && ps_op_chksum_file)
989*495ae853SAndroid Build Coastguard Worker         {
990*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_y_chksum[16];
991*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_u_chksum[16];
992*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_v_chksum[16];
993*495ae853SAndroid Build Coastguard Worker             calc_md5_cksum((UWORD8 *) s_dump_disp_frm_buf.pv_y_buf, s_dump_disp_frm_buf.u4_y_strd,
994*495ae853SAndroid Build Coastguard Worker                            s_dump_disp_frm_buf.u4_y_wd, s_dump_disp_frm_buf.u4_y_ht, au1_y_chksum);
995*495ae853SAndroid Build Coastguard Worker             calc_md5_cksum((UWORD8 *) s_dump_disp_frm_buf.pv_u_buf, s_dump_disp_frm_buf.u4_u_strd,
996*495ae853SAndroid Build Coastguard Worker                            s_dump_disp_frm_buf.u4_u_wd, s_dump_disp_frm_buf.u4_u_ht, au1_u_chksum);
997*495ae853SAndroid Build Coastguard Worker             calc_md5_cksum((UWORD8 *) s_dump_disp_frm_buf.pv_v_buf, s_dump_disp_frm_buf.u4_v_strd,
998*495ae853SAndroid Build Coastguard Worker                            s_dump_disp_frm_buf.u4_v_wd, s_dump_disp_frm_buf.u4_v_ht, au1_v_chksum);
999*495ae853SAndroid Build Coastguard Worker 
1000*495ae853SAndroid Build Coastguard Worker             fwrite(au1_y_chksum, sizeof(UWORD8), 16, ps_op_chksum_file);
1001*495ae853SAndroid Build Coastguard Worker             fwrite(au1_u_chksum, sizeof(UWORD8), 16, ps_op_chksum_file);
1002*495ae853SAndroid Build Coastguard Worker             fwrite(au1_v_chksum, sizeof(UWORD8), 16, ps_op_chksum_file);
1003*495ae853SAndroid Build Coastguard Worker         }
1004*495ae853SAndroid Build Coastguard Worker #endif
1005*495ae853SAndroid Build Coastguard Worker     }
1006*495ae853SAndroid Build Coastguard Worker     else if((ps_app_ctx->e_output_chroma_format == IV_YUV_420SP_UV) ||
1007*495ae853SAndroid Build Coastguard Worker             (ps_app_ctx->e_output_chroma_format == IV_YUV_420SP_VU))
1008*495ae853SAndroid Build Coastguard Worker     {
1009*495ae853SAndroid Build Coastguard Worker #if DUMP_SINGLE_BUF
1010*495ae853SAndroid Build Coastguard Worker         {
1011*495ae853SAndroid Build Coastguard Worker             UWORD8 *buf = s_dump_disp_frm_buf.pv_y_buf - 24 - (s_dump_disp_frm_buf.u4_y_strd * 40);
1012*495ae853SAndroid Build Coastguard Worker 
1013*495ae853SAndroid Build Coastguard Worker             UWORD32 i4_size = s_dump_disp_frm_buf.u4_y_strd * ((s_dump_disp_frm_buf.u4_y_ht + 80) +
1014*495ae853SAndroid Build Coastguard Worker                                                                (s_dump_disp_frm_buf.u4_u_ht + 40));
1015*495ae853SAndroid Build Coastguard Worker             fwrite(buf, 1, i4_size, ps_op_file);
1016*495ae853SAndroid Build Coastguard Worker         }
1017*495ae853SAndroid Build Coastguard Worker #else
1018*495ae853SAndroid Build Coastguard Worker         {
1019*495ae853SAndroid Build Coastguard Worker             UWORD8 *buf;
1020*495ae853SAndroid Build Coastguard Worker 
1021*495ae853SAndroid Build Coastguard Worker             buf = (UWORD8 *) s_dump_disp_frm_buf.pv_y_buf;
1022*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < s_dump_disp_frm_buf.u4_y_ht; i++)
1023*495ae853SAndroid Build Coastguard Worker             {
1024*495ae853SAndroid Build Coastguard Worker                 fwrite(buf, 1, s_dump_disp_frm_buf.u4_y_wd, ps_op_file);
1025*495ae853SAndroid Build Coastguard Worker                 buf += s_dump_disp_frm_buf.u4_y_strd;
1026*495ae853SAndroid Build Coastguard Worker             }
1027*495ae853SAndroid Build Coastguard Worker 
1028*495ae853SAndroid Build Coastguard Worker             buf = (UWORD8 *) s_dump_disp_frm_buf.pv_u_buf;
1029*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < s_dump_disp_frm_buf.u4_u_ht; i++)
1030*495ae853SAndroid Build Coastguard Worker             {
1031*495ae853SAndroid Build Coastguard Worker                 fwrite(buf, 1, s_dump_disp_frm_buf.u4_u_wd, ps_op_file);
1032*495ae853SAndroid Build Coastguard Worker                 buf += s_dump_disp_frm_buf.u4_u_strd;
1033*495ae853SAndroid Build Coastguard Worker             }
1034*495ae853SAndroid Build Coastguard Worker         }
1035*495ae853SAndroid Build Coastguard Worker #endif
1036*495ae853SAndroid Build Coastguard Worker     }
1037*495ae853SAndroid Build Coastguard Worker     else if(ps_app_ctx->e_output_chroma_format == IV_RGBA_8888)
1038*495ae853SAndroid Build Coastguard Worker     {
1039*495ae853SAndroid Build Coastguard Worker         UWORD8 *buf;
1040*495ae853SAndroid Build Coastguard Worker 
1041*495ae853SAndroid Build Coastguard Worker         buf = (UWORD8 *) s_dump_disp_frm_buf.pv_y_buf;
1042*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < s_dump_disp_frm_buf.u4_y_ht; i++)
1043*495ae853SAndroid Build Coastguard Worker         {
1044*495ae853SAndroid Build Coastguard Worker             fwrite(buf, 1, s_dump_disp_frm_buf.u4_y_wd * 4, ps_op_file);
1045*495ae853SAndroid Build Coastguard Worker             buf += s_dump_disp_frm_buf.u4_y_strd * 4;
1046*495ae853SAndroid Build Coastguard Worker         }
1047*495ae853SAndroid Build Coastguard Worker     }
1048*495ae853SAndroid Build Coastguard Worker     else
1049*495ae853SAndroid Build Coastguard Worker     {
1050*495ae853SAndroid Build Coastguard Worker         UWORD8 *buf;
1051*495ae853SAndroid Build Coastguard Worker 
1052*495ae853SAndroid Build Coastguard Worker         buf = (UWORD8 *) s_dump_disp_frm_buf.pv_y_buf;
1053*495ae853SAndroid Build Coastguard Worker         for(i = 0; i < s_dump_disp_frm_buf.u4_y_ht; i++)
1054*495ae853SAndroid Build Coastguard Worker         {
1055*495ae853SAndroid Build Coastguard Worker             fwrite(buf, 1, s_dump_disp_frm_buf.u4_y_strd * 2, ps_op_file);
1056*495ae853SAndroid Build Coastguard Worker             buf += s_dump_disp_frm_buf.u4_y_strd * 2;
1057*495ae853SAndroid Build Coastguard Worker         }
1058*495ae853SAndroid Build Coastguard Worker     }
1059*495ae853SAndroid Build Coastguard Worker 
1060*495ae853SAndroid Build Coastguard Worker     fflush(ps_op_file);
1061*495ae853SAndroid Build Coastguard Worker     fflush(ps_op_chksum_file);
1062*495ae853SAndroid Build Coastguard Worker }
1063*495ae853SAndroid Build Coastguard Worker 
1064*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1065*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1066*495ae853SAndroid Build Coastguard Worker /*  Function Name : print_usage                                              */
1067*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1068*495ae853SAndroid Build Coastguard Worker /*  Description   : Prints argument format                                   */
1069*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1070*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1071*495ae853SAndroid Build Coastguard Worker /*  Inputs        :                                                          */
1072*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
1073*495ae853SAndroid Build Coastguard Worker /*  Processing    : Prints argument format                                   */
1074*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1075*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
1076*495ae853SAndroid Build Coastguard Worker /*  Returns       :                                                          */
1077*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1078*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
1079*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1080*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1081*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1082*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
1083*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
1084*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1085*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1086*495ae853SAndroid Build Coastguard Worker 
print_usage(void)1087*495ae853SAndroid Build Coastguard Worker void print_usage(void)
1088*495ae853SAndroid Build Coastguard Worker {
1089*495ae853SAndroid Build Coastguard Worker     WORD32 i = 0;
1090*495ae853SAndroid Build Coastguard Worker     WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
1091*495ae853SAndroid Build Coastguard Worker     printf("\nUsage:\n");
1092*495ae853SAndroid Build Coastguard Worker     while(i < num_entries)
1093*495ae853SAndroid Build Coastguard Worker     {
1094*495ae853SAndroid Build Coastguard Worker         printf("%-32s\t %s", argument_mapping[i].argument_name, argument_mapping[i].description);
1095*495ae853SAndroid Build Coastguard Worker         i++;
1096*495ae853SAndroid Build Coastguard Worker     }
1097*495ae853SAndroid Build Coastguard Worker }
1098*495ae853SAndroid Build Coastguard Worker 
1099*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1100*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1101*495ae853SAndroid Build Coastguard Worker /*  Function Name : get_argument                                             */
1102*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1103*495ae853SAndroid Build Coastguard Worker /*  Description   : Gets argument for a given string                         */
1104*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1105*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1106*495ae853SAndroid Build Coastguard Worker /*  Inputs        : name                                                     */
1107*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
1108*495ae853SAndroid Build Coastguard Worker /*  Processing    : Searches the given string in the array and returns       */
1109*495ae853SAndroid Build Coastguard Worker /*                  appropriate argument ID                                  */
1110*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1111*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Argument ID                                              */
1112*495ae853SAndroid Build Coastguard Worker /*  Returns       : Argument ID                                              */
1113*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1114*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
1115*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1116*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1117*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1118*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
1119*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
1120*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1121*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1122*495ae853SAndroid Build Coastguard Worker 
get_argument(CHAR * name)1123*495ae853SAndroid Build Coastguard Worker ARGUMENT_T get_argument(CHAR *name)
1124*495ae853SAndroid Build Coastguard Worker {
1125*495ae853SAndroid Build Coastguard Worker     WORD32 i = 0;
1126*495ae853SAndroid Build Coastguard Worker     WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
1127*495ae853SAndroid Build Coastguard Worker     while(i < num_entries)
1128*495ae853SAndroid Build Coastguard Worker     {
1129*495ae853SAndroid Build Coastguard Worker         if((0 == strcmp(argument_mapping[i].argument_name, name)) ||
1130*495ae853SAndroid Build Coastguard Worker            ((0 == strcmp(argument_mapping[i].argument_shortname, name)) &&
1131*495ae853SAndroid Build Coastguard Worker             (0 != strcmp(argument_mapping[i].argument_shortname, "--"))))
1132*495ae853SAndroid Build Coastguard Worker         {
1133*495ae853SAndroid Build Coastguard Worker             return argument_mapping[i].argument;
1134*495ae853SAndroid Build Coastguard Worker         }
1135*495ae853SAndroid Build Coastguard Worker         i++;
1136*495ae853SAndroid Build Coastguard Worker     }
1137*495ae853SAndroid Build Coastguard Worker     return INVALID;
1138*495ae853SAndroid Build Coastguard Worker }
1139*495ae853SAndroid Build Coastguard Worker 
1140*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1141*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1142*495ae853SAndroid Build Coastguard Worker /*  Function Name : get_argument                                             */
1143*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1144*495ae853SAndroid Build Coastguard Worker /*  Description   : Gets argument for a given string                         */
1145*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1146*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1147*495ae853SAndroid Build Coastguard Worker /*  Inputs        : name                                                     */
1148*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
1149*495ae853SAndroid Build Coastguard Worker /*  Processing    : Searches the given string in the array and returns       */
1150*495ae853SAndroid Build Coastguard Worker /*                  appropriate argument ID                                  */
1151*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1152*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Argument ID                                              */
1153*495ae853SAndroid Build Coastguard Worker /*  Returns       : Argument ID                                              */
1154*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1155*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
1156*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1157*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1158*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1159*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
1160*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
1161*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1162*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1163*495ae853SAndroid Build Coastguard Worker 
parse_argument(vid_dec_ctx_t * ps_app_ctx,CHAR * argument,CHAR * value)1164*495ae853SAndroid Build Coastguard Worker void parse_argument(vid_dec_ctx_t *ps_app_ctx, CHAR *argument, CHAR *value)
1165*495ae853SAndroid Build Coastguard Worker {
1166*495ae853SAndroid Build Coastguard Worker     ARGUMENT_T arg;
1167*495ae853SAndroid Build Coastguard Worker 
1168*495ae853SAndroid Build Coastguard Worker     arg = get_argument(argument);
1169*495ae853SAndroid Build Coastguard Worker     switch(arg)
1170*495ae853SAndroid Build Coastguard Worker     {
1171*495ae853SAndroid Build Coastguard Worker         case HELP:
1172*495ae853SAndroid Build Coastguard Worker             print_usage();
1173*495ae853SAndroid Build Coastguard Worker             exit(-1);
1174*495ae853SAndroid Build Coastguard Worker         case VERSION:
1175*495ae853SAndroid Build Coastguard Worker             break;
1176*495ae853SAndroid Build Coastguard Worker         case INPUT_FILE:
1177*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_ip_fname);
1178*495ae853SAndroid Build Coastguard Worker             // input_passed = 1;
1179*495ae853SAndroid Build Coastguard Worker             break;
1180*495ae853SAndroid Build Coastguard Worker 
1181*495ae853SAndroid Build Coastguard Worker         case OUTPUT:
1182*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_op_fname);
1183*495ae853SAndroid Build Coastguard Worker             break;
1184*495ae853SAndroid Build Coastguard Worker 
1185*495ae853SAndroid Build Coastguard Worker         case QP_MAP_FILE:
1186*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_qp_map_fname);
1187*495ae853SAndroid Build Coastguard Worker             break;
1188*495ae853SAndroid Build Coastguard Worker 
1189*495ae853SAndroid Build Coastguard Worker         case BLK_TYPE_MAP_FILE:
1190*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_blk_type_map_fname);
1191*495ae853SAndroid Build Coastguard Worker             break;
1192*495ae853SAndroid Build Coastguard Worker 
1193*495ae853SAndroid Build Coastguard Worker         case CHKSUM:
1194*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_op_chksum_fname);
1195*495ae853SAndroid Build Coastguard Worker             break;
1196*495ae853SAndroid Build Coastguard Worker 
1197*495ae853SAndroid Build Coastguard Worker         case SAVE_OUTPUT:
1198*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->u4_file_save_flag);
1199*495ae853SAndroid Build Coastguard Worker             break;
1200*495ae853SAndroid Build Coastguard Worker 
1201*495ae853SAndroid Build Coastguard Worker         case SAVE_FRAME_INFO:
1202*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->u4_frame_info_enable);
1203*495ae853SAndroid Build Coastguard Worker             break;
1204*495ae853SAndroid Build Coastguard Worker 
1205*495ae853SAndroid Build Coastguard Worker         case SAVE_CHKSUM:
1206*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->u4_chksum_save_flag);
1207*495ae853SAndroid Build Coastguard Worker             break;
1208*495ae853SAndroid Build Coastguard Worker 
1209*495ae853SAndroid Build Coastguard Worker         case CHROMA_FORMAT:
1210*495ae853SAndroid Build Coastguard Worker             if((strcmp(value, "YUV_420P")) == 0)
1211*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_output_chroma_format = IV_YUV_420P;
1212*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "YUV_422ILE")) == 0)
1213*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_output_chroma_format = IV_YUV_422ILE;
1214*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "RGB_565")) == 0)
1215*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_output_chroma_format = IV_RGB_565;
1216*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "RGBA_8888")) == 0)
1217*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_output_chroma_format = IV_RGBA_8888;
1218*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "YUV_420SP_UV")) == 0)
1219*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_output_chroma_format = IV_YUV_420SP_UV;
1220*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "YUV_420SP_VU")) == 0)
1221*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_output_chroma_format = IV_YUV_420SP_VU;
1222*495ae853SAndroid Build Coastguard Worker             else
1223*495ae853SAndroid Build Coastguard Worker             {
1224*495ae853SAndroid Build Coastguard Worker                 printf("\nInvalid colour format setting it to IV_YUV_420P\n");
1225*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_output_chroma_format = IV_YUV_420P;
1226*495ae853SAndroid Build Coastguard Worker             }
1227*495ae853SAndroid Build Coastguard Worker 
1228*495ae853SAndroid Build Coastguard Worker             break;
1229*495ae853SAndroid Build Coastguard Worker         case NUM_FRAMES:
1230*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->u4_max_frm_ts);
1231*495ae853SAndroid Build Coastguard Worker             break;
1232*495ae853SAndroid Build Coastguard Worker 
1233*495ae853SAndroid Build Coastguard Worker         case NUM_CORES:
1234*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->u4_num_cores);
1235*495ae853SAndroid Build Coastguard Worker             break;
1236*495ae853SAndroid Build Coastguard Worker         case DEGRADE_PICS:
1237*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->i4_degrade_pics);
1238*495ae853SAndroid Build Coastguard Worker             break;
1239*495ae853SAndroid Build Coastguard Worker         case DEGRADE_TYPE:
1240*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->i4_degrade_type);
1241*495ae853SAndroid Build Coastguard Worker             break;
1242*495ae853SAndroid Build Coastguard Worker         case SHARE_DISPLAY_BUF:
1243*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->u4_share_disp_buf);
1244*495ae853SAndroid Build Coastguard Worker             break;
1245*495ae853SAndroid Build Coastguard Worker         case LOOPBACK:
1246*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->loopback);
1247*495ae853SAndroid Build Coastguard Worker             break;
1248*495ae853SAndroid Build Coastguard Worker         case DISPLAY:
1249*495ae853SAndroid Build Coastguard Worker #if defined(SDL_DISPLAY) || defined(FBDEV_DISPLAY) || defined(INTEL_CE5300) || defined(IOS_DISPLAY)
1250*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->display);
1251*495ae853SAndroid Build Coastguard Worker #else
1252*495ae853SAndroid Build Coastguard Worker             ps_app_ctx->display = 0;
1253*495ae853SAndroid Build Coastguard Worker #endif
1254*495ae853SAndroid Build Coastguard Worker             break;
1255*495ae853SAndroid Build Coastguard Worker         case FULLSCREEN:
1256*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->full_screen);
1257*495ae853SAndroid Build Coastguard Worker             break;
1258*495ae853SAndroid Build Coastguard Worker         case FPS:
1259*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->fps);
1260*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctx->fps <= 0) ps_app_ctx->fps = DEFAULT_FPS;
1261*495ae853SAndroid Build Coastguard Worker             break;
1262*495ae853SAndroid Build Coastguard Worker         case ARCH:
1263*495ae853SAndroid Build Coastguard Worker             if((strcmp(value, "ARM_NONEON")) == 0)
1264*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARM_NONEON;
1265*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_A9Q")) == 0)
1266*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARM_A9Q;
1267*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_A7")) == 0)
1268*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARM_A7;
1269*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_A5")) == 0)
1270*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARM_A5;
1271*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARM_NEONINTR")) == 0)
1272*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARM_NEONINTR;
1273*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_GENERIC")) == 0)
1274*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_X86_GENERIC;
1275*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_SSSE3")) == 0)
1276*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_X86_SSSE3;
1277*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_SSE42")) == 0)
1278*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_X86_SSE42;
1279*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_AVX2")) == 0)
1280*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_X86_AVX2;
1281*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "MIPS_GENERIC")) == 0)
1282*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_MIPS_GENERIC;
1283*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "MIPS_32")) == 0)
1284*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_MIPS_32;
1285*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARMV8_GENERIC")) == 0)
1286*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARMV8_GENERIC;
1287*495ae853SAndroid Build Coastguard Worker             else
1288*495ae853SAndroid Build Coastguard Worker             {
1289*495ae853SAndroid Build Coastguard Worker                 printf("\nInvalid Arch. Setting it to ARM_A9Q\n");
1290*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARM_A9Q;
1291*495ae853SAndroid Build Coastguard Worker             }
1292*495ae853SAndroid Build Coastguard Worker 
1293*495ae853SAndroid Build Coastguard Worker             break;
1294*495ae853SAndroid Build Coastguard Worker         case SOC:
1295*495ae853SAndroid Build Coastguard Worker             if((strcmp(value, "GENERIC")) == 0)
1296*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_soc = SOC_GENERIC;
1297*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "HISI_37X")) == 0)
1298*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_soc = SOC_HISI_37X;
1299*495ae853SAndroid Build Coastguard Worker             else
1300*495ae853SAndroid Build Coastguard Worker             {
1301*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_soc = atoi(value);
1302*495ae853SAndroid Build Coastguard Worker                 /*
1303*495ae853SAndroid Build Coastguard Worker                                 printf("\nInvalid SOC. Setting it to GENERIC\n");
1304*495ae853SAndroid Build Coastguard Worker                                 ps_app_ctx->e_soc = SOC_GENERIC;
1305*495ae853SAndroid Build Coastguard Worker                 */
1306*495ae853SAndroid Build Coastguard Worker             }
1307*495ae853SAndroid Build Coastguard Worker             break;
1308*495ae853SAndroid Build Coastguard Worker         case PICLEN:
1309*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->u4_piclen_flag);
1310*495ae853SAndroid Build Coastguard Worker             break;
1311*495ae853SAndroid Build Coastguard Worker 
1312*495ae853SAndroid Build Coastguard Worker         case PICLEN_FILE:
1313*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_piclen_fname);
1314*495ae853SAndroid Build Coastguard Worker             break;
1315*495ae853SAndroid Build Coastguard Worker         case DISABLE_DEBLOCK_LEVEL:
1316*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->u4_disable_dblk_level);
1317*495ae853SAndroid Build Coastguard Worker             break;
1318*495ae853SAndroid Build Coastguard Worker 
1319*495ae853SAndroid Build Coastguard Worker         case TARGET_LAYER_ID:
1320*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->i4_target_layer_id);
1321*495ae853SAndroid Build Coastguard Worker             break;
1322*495ae853SAndroid Build Coastguard Worker 
1323*495ae853SAndroid Build Coastguard Worker         case INVALID:
1324*495ae853SAndroid Build Coastguard Worker         default:
1325*495ae853SAndroid Build Coastguard Worker             printf("Ignoring argument :  %s\n", argument);
1326*495ae853SAndroid Build Coastguard Worker             break;
1327*495ae853SAndroid Build Coastguard Worker     }
1328*495ae853SAndroid Build Coastguard Worker }
1329*495ae853SAndroid Build Coastguard Worker 
1330*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1331*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1332*495ae853SAndroid Build Coastguard Worker /*  Function Name : read_cfg_file                                            */
1333*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1334*495ae853SAndroid Build Coastguard Worker /*  Description   : Reads arguments from a configuration file                */
1335*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1336*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1337*495ae853SAndroid Build Coastguard Worker /*  Inputs        : ps_app_ctx  : Application context                        */
1338*495ae853SAndroid Build Coastguard Worker /*                  fp_cfg_file : Configuration file handle                  */
1339*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
1340*495ae853SAndroid Build Coastguard Worker /*  Processing    : Parses the arguments and fills in the application context*/
1341*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1342*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Arguments parsed                                         */
1343*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
1344*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1345*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
1346*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1347*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1348*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1349*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
1350*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
1351*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1352*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1353*495ae853SAndroid Build Coastguard Worker 
read_cfg_file(vid_dec_ctx_t * ps_app_ctx,FILE * fp_cfg_file)1354*495ae853SAndroid Build Coastguard Worker void read_cfg_file(vid_dec_ctx_t *ps_app_ctx, FILE *fp_cfg_file)
1355*495ae853SAndroid Build Coastguard Worker {
1356*495ae853SAndroid Build Coastguard Worker     CHAR line[STRLENGTH];
1357*495ae853SAndroid Build Coastguard Worker     CHAR description[STRLENGTH];
1358*495ae853SAndroid Build Coastguard Worker     CHAR value[STRLENGTH];
1359*495ae853SAndroid Build Coastguard Worker     CHAR argument[STRLENGTH];
1360*495ae853SAndroid Build Coastguard Worker     void *ret;
1361*495ae853SAndroid Build Coastguard Worker     while(0 == feof(fp_cfg_file))
1362*495ae853SAndroid Build Coastguard Worker     {
1363*495ae853SAndroid Build Coastguard Worker         line[0] = '\0';
1364*495ae853SAndroid Build Coastguard Worker         ret = fgets(line, STRLENGTH, fp_cfg_file);
1365*495ae853SAndroid Build Coastguard Worker         if(NULL == ret) break;
1366*495ae853SAndroid Build Coastguard Worker         argument[0] = '\0';
1367*495ae853SAndroid Build Coastguard Worker         /* Reading Input File Name */
1368*495ae853SAndroid Build Coastguard Worker         sscanf(line, "%s %s %s", argument, value, description);
1369*495ae853SAndroid Build Coastguard Worker         if(argument[0] == '\0') continue;
1370*495ae853SAndroid Build Coastguard Worker 
1371*495ae853SAndroid Build Coastguard Worker         parse_argument(ps_app_ctx, argument, value);
1372*495ae853SAndroid Build Coastguard Worker     }
1373*495ae853SAndroid Build Coastguard Worker }
1374*495ae853SAndroid Build Coastguard Worker 
1375*495ae853SAndroid Build Coastguard Worker /*!
1376*495ae853SAndroid Build Coastguard Worker **************************************************************************
1377*495ae853SAndroid Build Coastguard Worker * \if Function name : dispq_producer_dequeue \endif
1378*495ae853SAndroid Build Coastguard Worker *
1379*495ae853SAndroid Build Coastguard Worker * \brief
1380*495ae853SAndroid Build Coastguard Worker *    This function gets a free buffer index where display data can be written
1381*495ae853SAndroid Build Coastguard Worker *    This is a blocking call and can be exited by setting quit to true in
1382*495ae853SAndroid Build Coastguard Worker *    the application context
1383*495ae853SAndroid Build Coastguard Worker *
1384*495ae853SAndroid Build Coastguard Worker * \param[in]  ps_app_ctx  : Pointer to application context
1385*495ae853SAndroid Build Coastguard Worker *
1386*495ae853SAndroid Build Coastguard Worker * \return
1387*495ae853SAndroid Build Coastguard Worker *    returns Next free buffer index for producer
1388*495ae853SAndroid Build Coastguard Worker *
1389*495ae853SAndroid Build Coastguard Worker * \author
1390*495ae853SAndroid Build Coastguard Worker *  Ittiam
1391*495ae853SAndroid Build Coastguard Worker *
1392*495ae853SAndroid Build Coastguard Worker **************************************************************************
1393*495ae853SAndroid Build Coastguard Worker */
dispq_producer_dequeue(vid_dec_ctx_t * ps_app_ctx)1394*495ae853SAndroid Build Coastguard Worker WORD32 dispq_producer_dequeue(vid_dec_ctx_t *ps_app_ctx)
1395*495ae853SAndroid Build Coastguard Worker {
1396*495ae853SAndroid Build Coastguard Worker     WORD32 idx;
1397*495ae853SAndroid Build Coastguard Worker 
1398*495ae853SAndroid Build Coastguard Worker     /* If there is no free buffer wait */
1399*495ae853SAndroid Build Coastguard Worker 
1400*495ae853SAndroid Build Coastguard Worker     while(((ps_app_ctx->disp_q_wr_idx + 1) % NUM_DISPLAY_BUFFERS) == ps_app_ctx->disp_q_rd_idx)
1401*495ae853SAndroid Build Coastguard Worker     {
1402*495ae853SAndroid Build Coastguard Worker         ithread_sleep(1000);
1403*495ae853SAndroid Build Coastguard Worker 
1404*495ae853SAndroid Build Coastguard Worker         if(ps_app_ctx->quit) return (-1);
1405*495ae853SAndroid Build Coastguard Worker     }
1406*495ae853SAndroid Build Coastguard Worker 
1407*495ae853SAndroid Build Coastguard Worker     idx = ps_app_ctx->disp_q_wr_idx;
1408*495ae853SAndroid Build Coastguard Worker     return (idx);
1409*495ae853SAndroid Build Coastguard Worker }
1410*495ae853SAndroid Build Coastguard Worker 
1411*495ae853SAndroid Build Coastguard Worker /*!
1412*495ae853SAndroid Build Coastguard Worker **************************************************************************
1413*495ae853SAndroid Build Coastguard Worker * \if Function name : dispq_producer_queue \endif
1414*495ae853SAndroid Build Coastguard Worker *
1415*495ae853SAndroid Build Coastguard Worker * \brief
1416*495ae853SAndroid Build Coastguard Worker *    This function adds buffer which can be displayed
1417*495ae853SAndroid Build Coastguard Worker *
1418*495ae853SAndroid Build Coastguard Worker * \param[in]  ps_app_ctx  : Pointer to application context
1419*495ae853SAndroid Build Coastguard Worker *
1420*495ae853SAndroid Build Coastguard Worker * \return
1421*495ae853SAndroid Build Coastguard Worker *    returns Next free buffer index for producer
1422*495ae853SAndroid Build Coastguard Worker *
1423*495ae853SAndroid Build Coastguard Worker * \author
1424*495ae853SAndroid Build Coastguard Worker *  Ittiam
1425*495ae853SAndroid Build Coastguard Worker *
1426*495ae853SAndroid Build Coastguard Worker **************************************************************************
1427*495ae853SAndroid Build Coastguard Worker */
dispq_producer_queue(vid_dec_ctx_t * ps_app_ctx)1428*495ae853SAndroid Build Coastguard Worker WORD32 dispq_producer_queue(vid_dec_ctx_t *ps_app_ctx)
1429*495ae853SAndroid Build Coastguard Worker {
1430*495ae853SAndroid Build Coastguard Worker     ps_app_ctx->disp_q_wr_idx++;
1431*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctx->disp_q_wr_idx == NUM_DISPLAY_BUFFERS) ps_app_ctx->disp_q_wr_idx = 0;
1432*495ae853SAndroid Build Coastguard Worker 
1433*495ae853SAndroid Build Coastguard Worker     return (0);
1434*495ae853SAndroid Build Coastguard Worker }
1435*495ae853SAndroid Build Coastguard Worker /*!
1436*495ae853SAndroid Build Coastguard Worker **************************************************************************
1437*495ae853SAndroid Build Coastguard Worker * \if Function name : dispq_consumer_dequeue \endif
1438*495ae853SAndroid Build Coastguard Worker *
1439*495ae853SAndroid Build Coastguard Worker * \brief
1440*495ae853SAndroid Build Coastguard Worker *    This function gets a free buffer index where display data can be written
1441*495ae853SAndroid Build Coastguard Worker *    This is a blocking call and can be exited by setting quit to true in
1442*495ae853SAndroid Build Coastguard Worker *    the application context
1443*495ae853SAndroid Build Coastguard Worker *
1444*495ae853SAndroid Build Coastguard Worker * \param[in]  ps_app_ctx  : Pointer to application context
1445*495ae853SAndroid Build Coastguard Worker *
1446*495ae853SAndroid Build Coastguard Worker * \return
1447*495ae853SAndroid Build Coastguard Worker *    returns Next free buffer index for producer
1448*495ae853SAndroid Build Coastguard Worker *
1449*495ae853SAndroid Build Coastguard Worker * \author
1450*495ae853SAndroid Build Coastguard Worker *  Ittiam
1451*495ae853SAndroid Build Coastguard Worker *
1452*495ae853SAndroid Build Coastguard Worker **************************************************************************
1453*495ae853SAndroid Build Coastguard Worker */
dispq_consumer_dequeue(vid_dec_ctx_t * ps_app_ctx)1454*495ae853SAndroid Build Coastguard Worker WORD32 dispq_consumer_dequeue(vid_dec_ctx_t *ps_app_ctx)
1455*495ae853SAndroid Build Coastguard Worker {
1456*495ae853SAndroid Build Coastguard Worker     WORD32 idx;
1457*495ae853SAndroid Build Coastguard Worker 
1458*495ae853SAndroid Build Coastguard Worker     /* If there is no free buffer wait */
1459*495ae853SAndroid Build Coastguard Worker 
1460*495ae853SAndroid Build Coastguard Worker     while(ps_app_ctx->disp_q_wr_idx == ps_app_ctx->disp_q_rd_idx)
1461*495ae853SAndroid Build Coastguard Worker     {
1462*495ae853SAndroid Build Coastguard Worker         ithread_sleep(1000);
1463*495ae853SAndroid Build Coastguard Worker 
1464*495ae853SAndroid Build Coastguard Worker         if(ps_app_ctx->quit) return (-1);
1465*495ae853SAndroid Build Coastguard Worker     }
1466*495ae853SAndroid Build Coastguard Worker 
1467*495ae853SAndroid Build Coastguard Worker     idx = ps_app_ctx->disp_q_rd_idx;
1468*495ae853SAndroid Build Coastguard Worker     return (idx);
1469*495ae853SAndroid Build Coastguard Worker }
1470*495ae853SAndroid Build Coastguard Worker 
1471*495ae853SAndroid Build Coastguard Worker /*!
1472*495ae853SAndroid Build Coastguard Worker **************************************************************************
1473*495ae853SAndroid Build Coastguard Worker * \if Function name : dispq_producer_queue \endif
1474*495ae853SAndroid Build Coastguard Worker *
1475*495ae853SAndroid Build Coastguard Worker * \brief
1476*495ae853SAndroid Build Coastguard Worker *    This function adds buffer which can be displayed
1477*495ae853SAndroid Build Coastguard Worker *
1478*495ae853SAndroid Build Coastguard Worker * \param[in]  ps_app_ctx  : Pointer to application context
1479*495ae853SAndroid Build Coastguard Worker *
1480*495ae853SAndroid Build Coastguard Worker * \return
1481*495ae853SAndroid Build Coastguard Worker *    returns Next free buffer index for producer
1482*495ae853SAndroid Build Coastguard Worker *
1483*495ae853SAndroid Build Coastguard Worker * \author
1484*495ae853SAndroid Build Coastguard Worker *  Ittiam
1485*495ae853SAndroid Build Coastguard Worker *
1486*495ae853SAndroid Build Coastguard Worker **************************************************************************
1487*495ae853SAndroid Build Coastguard Worker */
dispq_consumer_queue(vid_dec_ctx_t * ps_app_ctx)1488*495ae853SAndroid Build Coastguard Worker WORD32 dispq_consumer_queue(vid_dec_ctx_t *ps_app_ctx)
1489*495ae853SAndroid Build Coastguard Worker {
1490*495ae853SAndroid Build Coastguard Worker     ps_app_ctx->disp_q_rd_idx++;
1491*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctx->disp_q_rd_idx == NUM_DISPLAY_BUFFERS) ps_app_ctx->disp_q_rd_idx = 0;
1492*495ae853SAndroid Build Coastguard Worker 
1493*495ae853SAndroid Build Coastguard Worker     return (0);
1494*495ae853SAndroid Build Coastguard Worker }
1495*495ae853SAndroid Build Coastguard Worker 
1496*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1497*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1498*495ae853SAndroid Build Coastguard Worker /*  Function Name : display_thread                                           */
1499*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1500*495ae853SAndroid Build Coastguard Worker /*  Description   : Thread to display the frame                              */
1501*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1502*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1503*495ae853SAndroid Build Coastguard Worker /*  Inputs        : pv_ctx  : Application context                            */
1504*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1505*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
1506*495ae853SAndroid Build Coastguard Worker /*  Processing    : Wait for a buffer to get produced by decoder and display */
1507*495ae853SAndroid Build Coastguard Worker /*                  that frame                                               */
1508*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1509*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
1510*495ae853SAndroid Build Coastguard Worker /*  Returns       : None                                                     */
1511*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1512*495ae853SAndroid Build Coastguard Worker /*  Issues        : Pause followed by quit is making some deadlock condn     */
1513*495ae853SAndroid Build Coastguard Worker /*                  If decoder was lagging initially and then fasten up,     */
1514*495ae853SAndroid Build Coastguard Worker /*                  display will also go at faster rate till it reaches      */
1515*495ae853SAndroid Build Coastguard Worker /*                  equilibrium wrt the initial time                         */
1516*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1517*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1518*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1519*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
1520*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
1521*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1522*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1523*495ae853SAndroid Build Coastguard Worker 
display_thread(void * pv_ctx)1524*495ae853SAndroid Build Coastguard Worker WORD32 display_thread(void *pv_ctx)
1525*495ae853SAndroid Build Coastguard Worker {
1526*495ae853SAndroid Build Coastguard Worker     vid_dec_ctx_t *ps_app_ctx = (vid_dec_ctx_t *) pv_ctx;
1527*495ae853SAndroid Build Coastguard Worker 
1528*495ae853SAndroid Build Coastguard Worker     UWORD32 frm_duration; /* in us */
1529*495ae853SAndroid Build Coastguard Worker     UWORD32 current_time = 0;
1530*495ae853SAndroid Build Coastguard Worker     UWORD32 expected_time;
1531*495ae853SAndroid Build Coastguard Worker     UWORD32 first_frame_displayed;
1532*495ae853SAndroid Build Coastguard Worker 
1533*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
1534*495ae853SAndroid Build Coastguard Worker     LARGE_INTEGER frequency;
1535*495ae853SAndroid Build Coastguard Worker #endif
1536*495ae853SAndroid Build Coastguard Worker 
1537*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
1538*495ae853SAndroid Build Coastguard Worker     QueryPerformanceFrequency(&frequency);
1539*495ae853SAndroid Build Coastguard Worker #endif
1540*495ae853SAndroid Build Coastguard Worker 
1541*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
1542*495ae853SAndroid Build Coastguard Worker     UWORD32 s_elapsed_time;
1543*495ae853SAndroid Build Coastguard Worker     TIMER s_start_timer;
1544*495ae853SAndroid Build Coastguard Worker     TIMER s_end_timer;
1545*495ae853SAndroid Build Coastguard Worker     TIMER s_first_frame_time;
1546*495ae853SAndroid Build Coastguard Worker #endif
1547*495ae853SAndroid Build Coastguard Worker 
1548*495ae853SAndroid Build Coastguard Worker     first_frame_displayed = 0;
1549*495ae853SAndroid Build Coastguard Worker     expected_time = 0;
1550*495ae853SAndroid Build Coastguard Worker     frm_duration = 1000000 / ps_app_ctx->fps;
1551*495ae853SAndroid Build Coastguard Worker 
1552*495ae853SAndroid Build Coastguard Worker     /* Init display and allocate display buffers */
1553*495ae853SAndroid Build Coastguard Worker     ps_app_ctx->pv_disp_ctx = (void *) ps_app_ctx->disp_init(
1554*495ae853SAndroid Build Coastguard Worker         ps_app_ctx->u4_pic_wd, ps_app_ctx->u4_pic_ht, ps_app_ctx->i4_screen_wd,
1555*495ae853SAndroid Build Coastguard Worker         ps_app_ctx->i4_screen_ht, ps_app_ctx->u4_pic_wd, ps_app_ctx->u4_pic_ht,
1556*495ae853SAndroid Build Coastguard Worker         ps_app_ctx->full_screen, &ps_app_ctx->quit, &ps_app_ctx->paused);
1557*495ae853SAndroid Build Coastguard Worker     ps_app_ctx->alloc_disp_buffers(ps_app_ctx->pv_disp_ctx);
1558*495ae853SAndroid Build Coastguard Worker 
1559*495ae853SAndroid Build Coastguard Worker     ps_app_ctx->display_init_done = 1;
1560*495ae853SAndroid Build Coastguard Worker 
1561*495ae853SAndroid Build Coastguard Worker     while(1)
1562*495ae853SAndroid Build Coastguard Worker     {
1563*495ae853SAndroid Build Coastguard Worker         WORD32 rd_idx;
1564*495ae853SAndroid Build Coastguard Worker 
1565*495ae853SAndroid Build Coastguard Worker         rd_idx = dispq_consumer_dequeue(ps_app_ctx);
1566*495ae853SAndroid Build Coastguard Worker         if(ps_app_ctx->quit) break;
1567*495ae853SAndroid Build Coastguard Worker 
1568*495ae853SAndroid Build Coastguard Worker         ps_app_ctx->display_buffer(ps_app_ctx->pv_disp_ctx, rd_idx);
1569*495ae853SAndroid Build Coastguard Worker 
1570*495ae853SAndroid Build Coastguard Worker         if(0 == first_frame_displayed)
1571*495ae853SAndroid Build Coastguard Worker         {
1572*495ae853SAndroid Build Coastguard Worker             GETTIME(&s_first_frame_time);
1573*495ae853SAndroid Build Coastguard Worker             first_frame_displayed = 1;
1574*495ae853SAndroid Build Coastguard Worker         }
1575*495ae853SAndroid Build Coastguard Worker 
1576*495ae853SAndroid Build Coastguard Worker         /*********************************************************************/
1577*495ae853SAndroid Build Coastguard Worker         /* Sleep based on the expected time of arrival of current buffer and */
1578*495ae853SAndroid Build Coastguard Worker         /* the Current frame                                                 */
1579*495ae853SAndroid Build Coastguard Worker         /*********************************************************************/
1580*495ae853SAndroid Build Coastguard Worker 
1581*495ae853SAndroid Build Coastguard Worker         GETTIME(&s_end_timer);
1582*495ae853SAndroid Build Coastguard Worker         ELAPSEDTIME(s_first_frame_time, s_end_timer, current_time, frequency);
1583*495ae853SAndroid Build Coastguard Worker 
1584*495ae853SAndroid Build Coastguard Worker         /* time in micro second */
1585*495ae853SAndroid Build Coastguard Worker         expected_time += frm_duration;
1586*495ae853SAndroid Build Coastguard Worker 
1587*495ae853SAndroid Build Coastguard Worker         // printf("current_time %d expected_time %d diff %d \n", current_time,
1588*495ae853SAndroid Build Coastguard Worker         // expected_time, (expected_time - current_time));
1589*495ae853SAndroid Build Coastguard Worker         /* sleep for the diff. in time */
1590*495ae853SAndroid Build Coastguard Worker         if(current_time < expected_time)
1591*495ae853SAndroid Build Coastguard Worker             ps_app_ctx->disp_usleep((expected_time - current_time));
1592*495ae853SAndroid Build Coastguard Worker         else
1593*495ae853SAndroid Build Coastguard Worker             expected_time += (current_time - expected_time);
1594*495ae853SAndroid Build Coastguard Worker 
1595*495ae853SAndroid Build Coastguard Worker         dispq_consumer_queue(ps_app_ctx);
1596*495ae853SAndroid Build Coastguard Worker     }
1597*495ae853SAndroid Build Coastguard Worker 
1598*495ae853SAndroid Build Coastguard Worker     while(0 == ps_app_ctx->display_deinit_flag)
1599*495ae853SAndroid Build Coastguard Worker     {
1600*495ae853SAndroid Build Coastguard Worker         ps_app_ctx->disp_usleep(1000);
1601*495ae853SAndroid Build Coastguard Worker     }
1602*495ae853SAndroid Build Coastguard Worker     ps_app_ctx->disp_deinit(ps_app_ctx->pv_disp_ctx);
1603*495ae853SAndroid Build Coastguard Worker 
1604*495ae853SAndroid Build Coastguard Worker     return 0;
1605*495ae853SAndroid Build Coastguard Worker }
1606*495ae853SAndroid Build Coastguard Worker 
output_write_stall(CHAR * fname,UWORD32 cur_frm_idx)1607*495ae853SAndroid Build Coastguard Worker void output_write_stall(CHAR *fname, UWORD32 cur_frm_idx)
1608*495ae853SAndroid Build Coastguard Worker {
1609*495ae853SAndroid Build Coastguard Worker     const UWORD8 threshold = 64;
1610*495ae853SAndroid Build Coastguard Worker     CHAR past_fname[1000];
1611*495ae853SAndroid Build Coastguard Worker     FILE *fp_fast_file = NULL;
1612*495ae853SAndroid Build Coastguard Worker 
1613*495ae853SAndroid Build Coastguard Worker     if(cur_frm_idx >= threshold)
1614*495ae853SAndroid Build Coastguard Worker     {
1615*495ae853SAndroid Build Coastguard Worker         sprintf(past_fname, fname, cur_frm_idx - threshold);
1616*495ae853SAndroid Build Coastguard Worker         do
1617*495ae853SAndroid Build Coastguard Worker         {
1618*495ae853SAndroid Build Coastguard Worker             fp_fast_file = fopen(past_fname, "rb");
1619*495ae853SAndroid Build Coastguard Worker             if(fp_fast_file != NULL)
1620*495ae853SAndroid Build Coastguard Worker             {
1621*495ae853SAndroid Build Coastguard Worker                 fclose(fp_fast_file);
1622*495ae853SAndroid Build Coastguard Worker                 /* Wait until the resource is released by a third party app*/
1623*495ae853SAndroid Build Coastguard Worker                 ithread_sleep(5000);
1624*495ae853SAndroid Build Coastguard Worker             }
1625*495ae853SAndroid Build Coastguard Worker             else
1626*495ae853SAndroid Build Coastguard Worker                 break;
1627*495ae853SAndroid Build Coastguard Worker         } while(1);
1628*495ae853SAndroid Build Coastguard Worker     }
1629*495ae853SAndroid Build Coastguard Worker }
1630*495ae853SAndroid Build Coastguard Worker 
flush_output(iv_obj_t * codec_obj,vid_dec_ctx_t * ps_app_ctx,ivd_out_bufdesc_t * ps_out_buf,UWORD8 * pu1_bs_buf,UWORD32 * pu4_op_frm_ts,FILE * ps_op_file,FILE * ps_qp_file,FILE * ps_mb_type_file,UWORD8 * pu1_qp_map_buf,UWORD8 * pu1_blk_type_map_buf,FILE * ps_op_chksum_file,UWORD32 u4_ip_frm_ts,UWORD32 u4_bytes_remaining)1631*495ae853SAndroid Build Coastguard Worker void flush_output(iv_obj_t *codec_obj, vid_dec_ctx_t *ps_app_ctx, ivd_out_bufdesc_t *ps_out_buf,
1632*495ae853SAndroid Build Coastguard Worker                   UWORD8 *pu1_bs_buf, UWORD32 *pu4_op_frm_ts, FILE *ps_op_file, FILE *ps_qp_file,
1633*495ae853SAndroid Build Coastguard Worker                   FILE *ps_mb_type_file, UWORD8 *pu1_qp_map_buf, UWORD8 *pu1_blk_type_map_buf,
1634*495ae853SAndroid Build Coastguard Worker                   FILE *ps_op_chksum_file, UWORD32 u4_ip_frm_ts, UWORD32 u4_bytes_remaining)
1635*495ae853SAndroid Build Coastguard Worker {
1636*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
1637*495ae853SAndroid Build Coastguard Worker 
1638*495ae853SAndroid Build Coastguard Worker     do
1639*495ae853SAndroid Build Coastguard Worker     {
1640*495ae853SAndroid Build Coastguard Worker         ivd_ctl_flush_ip_t s_ctl_ip;
1641*495ae853SAndroid Build Coastguard Worker         ivd_ctl_flush_op_t s_ctl_op;
1642*495ae853SAndroid Build Coastguard Worker 
1643*495ae853SAndroid Build Coastguard Worker         if(*pu4_op_frm_ts >= (ps_app_ctx->u4_max_frm_ts + ps_app_ctx->disp_delay)) break;
1644*495ae853SAndroid Build Coastguard Worker 
1645*495ae853SAndroid Build Coastguard Worker         s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
1646*495ae853SAndroid Build Coastguard Worker         s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH;
1647*495ae853SAndroid Build Coastguard Worker         s_ctl_ip.u4_size = sizeof(ivd_ctl_flush_ip_t);
1648*495ae853SAndroid Build Coastguard Worker         s_ctl_op.u4_size = sizeof(ivd_ctl_flush_op_t);
1649*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_ip, (void *) &s_ctl_op);
1650*495ae853SAndroid Build Coastguard Worker 
1651*495ae853SAndroid Build Coastguard Worker         if(ret != IV_SUCCESS)
1652*495ae853SAndroid Build Coastguard Worker         {
1653*495ae853SAndroid Build Coastguard Worker             printf("Error in Setting the decoder in flush mode\n");
1654*495ae853SAndroid Build Coastguard Worker         }
1655*495ae853SAndroid Build Coastguard Worker 
1656*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS == ret)
1657*495ae853SAndroid Build Coastguard Worker         {
1658*495ae853SAndroid Build Coastguard Worker             isvcd_video_decode_ip_t s_h264d_decode_ip;
1659*495ae853SAndroid Build Coastguard Worker             isvcd_video_decode_op_t s_h264d_decode_op;
1660*495ae853SAndroid Build Coastguard Worker             ivd_video_decode_ip_t *ps_video_decode_ip = &s_h264d_decode_ip.s_ivd_video_decode_ip_t;
1661*495ae853SAndroid Build Coastguard Worker             ivd_video_decode_op_t *ps_video_decode_op = &s_h264d_decode_op.s_ivd_video_decode_op_t;
1662*495ae853SAndroid Build Coastguard Worker 
1663*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
1664*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_ts = u4_ip_frm_ts;
1665*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->pv_stream_buffer = pu1_bs_buf;
1666*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_num_Bytes = u4_bytes_remaining;
1667*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_size = sizeof(isvcd_video_decode_ip_t);
1668*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[0] =
1669*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[0];
1670*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[1] =
1671*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[1];
1672*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[2] =
1673*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[2];
1674*495ae853SAndroid Build Coastguard Worker 
1675*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.pu1_bufs[0] = ps_out_buf->pu1_bufs[0];
1676*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.pu1_bufs[1] = ps_out_buf->pu1_bufs[1];
1677*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.pu1_bufs[2] = ps_out_buf->pu1_bufs[2];
1678*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.u4_num_bufs = ps_out_buf->u4_num_bufs;
1679*495ae853SAndroid Build Coastguard Worker 
1680*495ae853SAndroid Build Coastguard Worker             ps_video_decode_op->u4_size = sizeof(isvcd_video_decode_op_t);
1681*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.pu1_8x8_blk_qp_map = pu1_qp_map_buf;
1682*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.pu1_8x8_blk_type_map = pu1_blk_type_map_buf;
1683*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.u4_8x8_blk_qp_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
1684*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.u4_8x8_blk_type_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
1685*495ae853SAndroid Build Coastguard Worker 
1686*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
1687*495ae853SAndroid Build Coastguard Worker             /*   API Call: Video Decode */
1688*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
1689*495ae853SAndroid Build Coastguard Worker             ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_decode_ip,
1690*495ae853SAndroid Build Coastguard Worker                                    (void *) &s_h264d_decode_op);
1691*495ae853SAndroid Build Coastguard Worker 
1692*495ae853SAndroid Build Coastguard Worker             if(1 == ps_video_decode_op->u4_output_present)
1693*495ae853SAndroid Build Coastguard Worker             {
1694*495ae853SAndroid Build Coastguard Worker                 CHAR cur_fname[1000];
1695*495ae853SAndroid Build Coastguard Worker                 CHAR *extn = NULL;
1696*495ae853SAndroid Build Coastguard Worker                 /* The objective is to dump the decoded frames into separate files
1697*495ae853SAndroid Build Coastguard Worker                  * instead of dumping all the frames in one common file. Also, the
1698*495ae853SAndroid Build Coastguard Worker                  * number of dumped frames at any given instance of time cannot exceed
1699*495ae853SAndroid Build Coastguard Worker                  * 'frame_memory'
1700*495ae853SAndroid Build Coastguard Worker                  */
1701*495ae853SAndroid Build Coastguard Worker 
1702*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
1703*495ae853SAndroid Build Coastguard Worker                 /* Get SEI MDCV parameters */
1704*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
1705*495ae853SAndroid Build Coastguard Worker                 if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_mdcv_params_present_flag)
1706*495ae853SAndroid Build Coastguard Worker                 {
1707*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_mdcv_params_ip_t s_ctl_get_sei_mdcv_params_ip;
1708*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_mdcv_params_op_t s_ctl_get_sei_mdcv_params_op;
1709*495ae853SAndroid Build Coastguard Worker 
1710*495ae853SAndroid Build Coastguard Worker                     memset(&s_ctl_get_sei_mdcv_params_ip, 0,
1711*495ae853SAndroid Build Coastguard Worker                            sizeof(isvcd_ctl_get_sei_mdcv_params_ip_t));
1712*495ae853SAndroid Build Coastguard Worker                     memset(&s_ctl_get_sei_mdcv_params_op, 0,
1713*495ae853SAndroid Build Coastguard Worker                            sizeof(isvcd_ctl_get_sei_mdcv_params_op_t));
1714*495ae853SAndroid Build Coastguard Worker 
1715*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_mdcv_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
1716*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_mdcv_params_ip.e_sub_cmd =
1717*495ae853SAndroid Build Coastguard Worker                         (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS;
1718*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_mdcv_params_ip.u4_size =
1719*495ae853SAndroid Build Coastguard Worker                         sizeof(isvcd_ctl_get_sei_mdcv_params_ip_t);
1720*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_mdcv_params_op.u4_size =
1721*495ae853SAndroid Build Coastguard Worker                         sizeof(isvcd_ctl_get_sei_mdcv_params_op_t);
1722*495ae853SAndroid Build Coastguard Worker 
1723*495ae853SAndroid Build Coastguard Worker                     ret = ivd_api_function((iv_obj_t *) codec_obj,
1724*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_get_sei_mdcv_params_ip,
1725*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_get_sei_mdcv_params_op);
1726*495ae853SAndroid Build Coastguard Worker 
1727*495ae853SAndroid Build Coastguard Worker                     if(IV_SUCCESS != ret)
1728*495ae853SAndroid Build Coastguard Worker                     {
1729*495ae853SAndroid Build Coastguard Worker                         printf("MDCV SEI params not present : Error %x\n",
1730*495ae853SAndroid Build Coastguard Worker                                s_ctl_get_sei_mdcv_params_op.u4_error_code);
1731*495ae853SAndroid Build Coastguard Worker                     }
1732*495ae853SAndroid Build Coastguard Worker                 }
1733*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
1734*495ae853SAndroid Build Coastguard Worker                 /* Get SEI CLL parameters */
1735*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
1736*495ae853SAndroid Build Coastguard Worker                 if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_cll_params_present_flag)
1737*495ae853SAndroid Build Coastguard Worker                 {
1738*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_cll_params_ip_t s_ctl_get_sei_cll_params_ip;
1739*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_cll_params_op_t s_ctl_get_sei_cll_params_op;
1740*495ae853SAndroid Build Coastguard Worker 
1741*495ae853SAndroid Build Coastguard Worker                     memset(&s_ctl_get_sei_cll_params_ip, 0,
1742*495ae853SAndroid Build Coastguard Worker                            sizeof(isvcd_ctl_get_sei_cll_params_ip_t));
1743*495ae853SAndroid Build Coastguard Worker                     memset(&s_ctl_get_sei_cll_params_op, 0,
1744*495ae853SAndroid Build Coastguard Worker                            sizeof(isvcd_ctl_get_sei_cll_params_op_t));
1745*495ae853SAndroid Build Coastguard Worker 
1746*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_cll_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
1747*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_cll_params_ip.e_sub_cmd =
1748*495ae853SAndroid Build Coastguard Worker                         (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_CLL_PARAMS;
1749*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_cll_params_ip.u4_size = sizeof(isvcd_ctl_get_sei_cll_params_ip_t);
1750*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_cll_params_op.u4_size = sizeof(isvcd_ctl_get_sei_cll_params_op_t);
1751*495ae853SAndroid Build Coastguard Worker 
1752*495ae853SAndroid Build Coastguard Worker                     ret = ivd_api_function((iv_obj_t *) codec_obj,
1753*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_get_sei_cll_params_ip,
1754*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_get_sei_cll_params_op);
1755*495ae853SAndroid Build Coastguard Worker 
1756*495ae853SAndroid Build Coastguard Worker                     if(IV_SUCCESS != ret)
1757*495ae853SAndroid Build Coastguard Worker                     {
1758*495ae853SAndroid Build Coastguard Worker                         printf("CLL SEI params not present : Error %x\n",
1759*495ae853SAndroid Build Coastguard Worker                                s_ctl_get_sei_cll_params_op.u4_error_code);
1760*495ae853SAndroid Build Coastguard Worker                     }
1761*495ae853SAndroid Build Coastguard Worker                 }
1762*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
1763*495ae853SAndroid Build Coastguard Worker                 /* Get SEI AVE parameters */
1764*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
1765*495ae853SAndroid Build Coastguard Worker                 if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_ave_params_present_flag)
1766*495ae853SAndroid Build Coastguard Worker                 {
1767*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_ave_params_ip_t s_ctl_get_sei_ave_params_ip;
1768*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_ave_params_op_t s_ctl_get_sei_ave_params_op;
1769*495ae853SAndroid Build Coastguard Worker 
1770*495ae853SAndroid Build Coastguard Worker                     memset(&s_ctl_get_sei_ave_params_ip, 0,
1771*495ae853SAndroid Build Coastguard Worker                            sizeof(isvcd_ctl_get_sei_ave_params_ip_t));
1772*495ae853SAndroid Build Coastguard Worker                     memset(&s_ctl_get_sei_ave_params_op, 0,
1773*495ae853SAndroid Build Coastguard Worker                            sizeof(isvcd_ctl_get_sei_ave_params_op_t));
1774*495ae853SAndroid Build Coastguard Worker 
1775*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_ave_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
1776*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_ave_params_ip.e_sub_cmd =
1777*495ae853SAndroid Build Coastguard Worker                         (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_AVE_PARAMS;
1778*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_ave_params_ip.u4_size = sizeof(isvcd_ctl_get_sei_ave_params_ip_t);
1779*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_ave_params_op.u4_size = sizeof(isvcd_ctl_get_sei_ave_params_op_t);
1780*495ae853SAndroid Build Coastguard Worker 
1781*495ae853SAndroid Build Coastguard Worker                     ret = ivd_api_function((iv_obj_t *) codec_obj,
1782*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_get_sei_ave_params_ip,
1783*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_get_sei_ave_params_op);
1784*495ae853SAndroid Build Coastguard Worker 
1785*495ae853SAndroid Build Coastguard Worker                     if(IV_SUCCESS != ret)
1786*495ae853SAndroid Build Coastguard Worker                     {
1787*495ae853SAndroid Build Coastguard Worker                         printf("AVE SEI params not present : Error %x\n",
1788*495ae853SAndroid Build Coastguard Worker                                s_ctl_get_sei_ave_params_op.u4_error_code);
1789*495ae853SAndroid Build Coastguard Worker                     }
1790*495ae853SAndroid Build Coastguard Worker                 }
1791*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
1792*495ae853SAndroid Build Coastguard Worker                 /* Get SEI CCV parameters */
1793*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
1794*495ae853SAndroid Build Coastguard Worker                 if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_ccv_params_present_flag)
1795*495ae853SAndroid Build Coastguard Worker                 {
1796*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_ccv_params_ip_t s_ctl_get_sei_ccv_params_ip;
1797*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_get_sei_ccv_params_op_t s_ctl_get_sei_ccv_params_op;
1798*495ae853SAndroid Build Coastguard Worker 
1799*495ae853SAndroid Build Coastguard Worker                     memset(&s_ctl_get_sei_ccv_params_ip, 0,
1800*495ae853SAndroid Build Coastguard Worker                            sizeof(isvcd_ctl_get_sei_ccv_params_ip_t));
1801*495ae853SAndroid Build Coastguard Worker                     memset(&s_ctl_get_sei_ccv_params_op, 0,
1802*495ae853SAndroid Build Coastguard Worker                            sizeof(isvcd_ctl_get_sei_ccv_params_op_t));
1803*495ae853SAndroid Build Coastguard Worker 
1804*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_ccv_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
1805*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_ccv_params_ip.e_sub_cmd =
1806*495ae853SAndroid Build Coastguard Worker                         (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_CCV_PARAMS;
1807*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_ccv_params_ip.u4_size = sizeof(isvcd_ctl_get_sei_ccv_params_ip_t);
1808*495ae853SAndroid Build Coastguard Worker                     s_ctl_get_sei_ccv_params_op.u4_size = sizeof(isvcd_ctl_get_sei_ccv_params_op_t);
1809*495ae853SAndroid Build Coastguard Worker 
1810*495ae853SAndroid Build Coastguard Worker                     ret = ivd_api_function((iv_obj_t *) codec_obj,
1811*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_get_sei_ccv_params_ip,
1812*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_get_sei_ccv_params_op);
1813*495ae853SAndroid Build Coastguard Worker 
1814*495ae853SAndroid Build Coastguard Worker                     if(IV_SUCCESS != ret)
1815*495ae853SAndroid Build Coastguard Worker                     {
1816*495ae853SAndroid Build Coastguard Worker                         printf("CCV SEI params not present : Error %x\n",
1817*495ae853SAndroid Build Coastguard Worker                                s_ctl_get_sei_ccv_params_op.u4_error_code);
1818*495ae853SAndroid Build Coastguard Worker                     }
1819*495ae853SAndroid Build Coastguard Worker                 }
1820*495ae853SAndroid Build Coastguard Worker 
1821*495ae853SAndroid Build Coastguard Worker                 if(ps_app_ctx->u4_file_save_flag)
1822*495ae853SAndroid Build Coastguard Worker                 {
1823*495ae853SAndroid Build Coastguard Worker                     /* Locate the position of extension yuv */
1824*495ae853SAndroid Build Coastguard Worker                     extn = strstr(ps_app_ctx->ac_op_fname, "%d");
1825*495ae853SAndroid Build Coastguard Worker                     if(extn != NULL)
1826*495ae853SAndroid Build Coastguard Worker                     {
1827*495ae853SAndroid Build Coastguard Worker                         output_write_stall(ps_app_ctx->ac_op_fname, *pu4_op_frm_ts);
1828*495ae853SAndroid Build Coastguard Worker                         /* Generate output file names */
1829*495ae853SAndroid Build Coastguard Worker                         sprintf(cur_fname, ps_app_ctx->ac_op_fname, *pu4_op_frm_ts);
1830*495ae853SAndroid Build Coastguard Worker                         /* Open Output file */
1831*495ae853SAndroid Build Coastguard Worker                         ps_op_file = fopen(cur_fname, "wb");
1832*495ae853SAndroid Build Coastguard Worker                         if(NULL == ps_op_file)
1833*495ae853SAndroid Build Coastguard Worker                         {
1834*495ae853SAndroid Build Coastguard Worker                             CHAR ac_error_str[STRLENGTH];
1835*495ae853SAndroid Build Coastguard Worker                             snprintf(ac_error_str, sizeof(ac_error_str),
1836*495ae853SAndroid Build Coastguard Worker                                      "Could not open output file %s", cur_fname);
1837*495ae853SAndroid Build Coastguard Worker 
1838*495ae853SAndroid Build Coastguard Worker                             codec_exit(ac_error_str);
1839*495ae853SAndroid Build Coastguard Worker                         }
1840*495ae853SAndroid Build Coastguard Worker                     }
1841*495ae853SAndroid Build Coastguard Worker                 }
1842*495ae853SAndroid Build Coastguard Worker 
1843*495ae853SAndroid Build Coastguard Worker                 dump_output(ps_app_ctx, &(ps_video_decode_op->s_disp_frm_buf), &s_h264d_decode_op,
1844*495ae853SAndroid Build Coastguard Worker                             ps_video_decode_op->u4_disp_buf_id, ps_op_file, ps_qp_file,
1845*495ae853SAndroid Build Coastguard Worker                             ps_mb_type_file, ps_op_chksum_file, *pu4_op_frm_ts,
1846*495ae853SAndroid Build Coastguard Worker                             ps_app_ctx->u4_file_save_flag, ps_app_ctx->u4_chksum_save_flag,
1847*495ae853SAndroid Build Coastguard Worker                             ps_app_ctx->u4_frame_info_enable);
1848*495ae853SAndroid Build Coastguard Worker                 if(extn != NULL) fclose(ps_op_file);
1849*495ae853SAndroid Build Coastguard Worker                 (*pu4_op_frm_ts)++;
1850*495ae853SAndroid Build Coastguard Worker             }
1851*495ae853SAndroid Build Coastguard Worker         }
1852*495ae853SAndroid Build Coastguard Worker     } while(IV_SUCCESS == ret);
1853*495ae853SAndroid Build Coastguard Worker }
1854*495ae853SAndroid Build Coastguard Worker 
1855*495ae853SAndroid Build Coastguard Worker #ifdef X86_MINGW
sigsegv_handler()1856*495ae853SAndroid Build Coastguard Worker void sigsegv_handler()
1857*495ae853SAndroid Build Coastguard Worker {
1858*495ae853SAndroid Build Coastguard Worker     printf("Segmentation fault, Exiting.. \n");
1859*495ae853SAndroid Build Coastguard Worker     exit(-1);
1860*495ae853SAndroid Build Coastguard Worker }
1861*495ae853SAndroid Build Coastguard Worker #endif
1862*495ae853SAndroid Build Coastguard Worker 
default_get_stride(void)1863*495ae853SAndroid Build Coastguard Worker UWORD32 default_get_stride(void) { return 0; }
1864*495ae853SAndroid Build Coastguard Worker 
default_get_color_fmt(void)1865*495ae853SAndroid Build Coastguard Worker IV_COLOR_FORMAT_T default_get_color_fmt(void) { return IV_YUV_420P; }
1866*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1867*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1868*495ae853SAndroid Build Coastguard Worker /*  Function Name : main                                                     */
1869*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1870*495ae853SAndroid Build Coastguard Worker /*  Description   : Application to demonstrate codec API                     */
1871*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1872*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1873*495ae853SAndroid Build Coastguard Worker /*  Inputs        : argc    - Number of arguments                            */
1874*495ae853SAndroid Build Coastguard Worker /*                  argv[]  - Arguments                                      */
1875*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
1876*495ae853SAndroid Build Coastguard Worker /*  Processing    : Shows how to use create, process, control and delete     */
1877*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1878*495ae853SAndroid Build Coastguard Worker /*  Outputs       : Codec output in a file                                   */
1879*495ae853SAndroid Build Coastguard Worker /*  Returns       :                                                          */
1880*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1881*495ae853SAndroid Build Coastguard Worker /*  Issues        : Assumes both PROFILE_ENABLE to be                        */
1882*495ae853SAndroid Build Coastguard Worker /*                  defined for multithread decode-display working           */
1883*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1884*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
1885*495ae853SAndroid Build Coastguard Worker /*                                                                           */
1886*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
1887*495ae853SAndroid Build Coastguard Worker /*         06 09 2021   Kishore         Initial Version                      */
1888*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
1889*495ae853SAndroid Build Coastguard Worker #ifdef IOS
h264dec_main(char * homedir,char * documentdir,int screen_wd,int screen_ht)1890*495ae853SAndroid Build Coastguard Worker int h264dec_main(char *homedir, char *documentdir, int screen_wd, int screen_ht)
1891*495ae853SAndroid Build Coastguard Worker #else
1892*495ae853SAndroid Build Coastguard Worker int main(WORD32 argc, CHAR *argv[])
1893*495ae853SAndroid Build Coastguard Worker #endif
1894*495ae853SAndroid Build Coastguard Worker {
1895*495ae853SAndroid Build Coastguard Worker     CHAR ac_cfg_fname[STRLENGTH];
1896*495ae853SAndroid Build Coastguard Worker     FILE *fp_cfg_file = NULL;
1897*495ae853SAndroid Build Coastguard Worker     FILE *ps_piclen_file = NULL;
1898*495ae853SAndroid Build Coastguard Worker     FILE *ps_ip_file = NULL;
1899*495ae853SAndroid Build Coastguard Worker     FILE *ps_op_file = NULL;
1900*495ae853SAndroid Build Coastguard Worker     FILE *ps_qp_file = NULL;
1901*495ae853SAndroid Build Coastguard Worker     FILE *ps_mb_type_file = NULL;
1902*495ae853SAndroid Build Coastguard Worker     FILE *ps_op_chksum_file = NULL;
1903*495ae853SAndroid Build Coastguard Worker     WORD32 ret;
1904*495ae853SAndroid Build Coastguard Worker     CHAR ac_error_str[STRLENGTH];
1905*495ae853SAndroid Build Coastguard Worker     vid_dec_ctx_t s_app_ctx;
1906*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_bs_buf = NULL;
1907*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_qp_map_buf = NULL;
1908*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_blk_type_map_buf = NULL;
1909*495ae853SAndroid Build Coastguard Worker 
1910*495ae853SAndroid Build Coastguard Worker     ivd_out_bufdesc_t *ps_out_buf;
1911*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_bytes_dec = 0;
1912*495ae853SAndroid Build Coastguard Worker     UWORD32 file_pos = 0;
1913*495ae853SAndroid Build Coastguard Worker 
1914*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ip_frm_ts = 0, u4_op_frm_ts = 0;
1915*495ae853SAndroid Build Coastguard Worker 
1916*495ae853SAndroid Build Coastguard Worker     WORD32 u4_bytes_remaining = 0;
1917*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
1918*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ip_buf_len;
1919*495ae853SAndroid Build Coastguard Worker     WORD32 total_bytes_comsumed;
1920*495ae853SAndroid Build Coastguard Worker     UWORD32 max_op_frm_ts;
1921*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_disp_bufs_with_dec;
1922*495ae853SAndroid Build Coastguard Worker 
1923*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
1924*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_tot_cycles = 0;
1925*495ae853SAndroid Build Coastguard Worker     UWORD32 frm_cnt = 0;
1926*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_tot_fmt_cycles = 0;
1927*495ae853SAndroid Build Coastguard Worker     UWORD32 peak_window[PEAK_WINDOW_SIZE];
1928*495ae853SAndroid Build Coastguard Worker     UWORD32 peak_window_idx = 0;
1929*495ae853SAndroid Build Coastguard Worker     UWORD32 peak_avg_max = 0;
1930*495ae853SAndroid Build Coastguard Worker #ifdef INTEL_CE5300
1931*495ae853SAndroid Build Coastguard Worker     UWORD32 time_consumed = 0;
1932*495ae853SAndroid Build Coastguard Worker     UWORD32 bytes_consumed = 0;
1933*495ae853SAndroid Build Coastguard Worker #endif
1934*495ae853SAndroid Build Coastguard Worker #endif
1935*495ae853SAndroid Build Coastguard Worker 
1936*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
1937*495ae853SAndroid Build Coastguard Worker     LARGE_INTEGER frequency;
1938*495ae853SAndroid Build Coastguard Worker #endif
1939*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
1940*495ae853SAndroid Build Coastguard Worker     WORD32 width = 0, height = 0;
1941*495ae853SAndroid Build Coastguard Worker #endif
1942*495ae853SAndroid Build Coastguard Worker     iv_obj_t *codec_obj;
1943*495ae853SAndroid Build Coastguard Worker #if defined(GPU_BUILD) && !defined(X86)
1944*495ae853SAndroid Build Coastguard Worker //    int ioctl_init();
1945*495ae853SAndroid Build Coastguard Worker //    ioctl_init();
1946*495ae853SAndroid Build Coastguard Worker #endif
1947*495ae853SAndroid Build Coastguard Worker 
1948*495ae853SAndroid Build Coastguard Worker #ifdef X86_MINGW
1949*495ae853SAndroid Build Coastguard Worker     // For getting printfs without any delay
1950*495ae853SAndroid Build Coastguard Worker     setvbuf(stdout, NULL, _IONBF, 0);
1951*495ae853SAndroid Build Coastguard Worker     setvbuf(stderr, NULL, _IONBF, 0);
1952*495ae853SAndroid Build Coastguard Worker #endif
1953*495ae853SAndroid Build Coastguard Worker #ifdef IOS
1954*495ae853SAndroid Build Coastguard Worker     sprintf(filename_trace, "%s/iostrace.txt", homedir);
1955*495ae853SAndroid Build Coastguard Worker     printf("\ntrace file name = %s", filename_trace);
1956*495ae853SAndroid Build Coastguard Worker #endif
1957*495ae853SAndroid Build Coastguard Worker 
1958*495ae853SAndroid Build Coastguard Worker #ifdef X86_MINGW
1959*495ae853SAndroid Build Coastguard Worker     {
1960*495ae853SAndroid Build Coastguard Worker         signal(SIGSEGV, sigsegv_handler);
1961*495ae853SAndroid Build Coastguard Worker     }
1962*495ae853SAndroid Build Coastguard Worker #endif
1963*495ae853SAndroid Build Coastguard Worker 
1964*495ae853SAndroid Build Coastguard Worker #ifndef IOS
1965*495ae853SAndroid Build Coastguard Worker     /* Usage */
1966*495ae853SAndroid Build Coastguard Worker     if(argc < 2)
1967*495ae853SAndroid Build Coastguard Worker     {
1968*495ae853SAndroid Build Coastguard Worker         printf("Using test.cfg as configuration file \n");
1969*495ae853SAndroid Build Coastguard Worker         strcpy(ac_cfg_fname, "test.cfg");
1970*495ae853SAndroid Build Coastguard Worker     }
1971*495ae853SAndroid Build Coastguard Worker     else if(argc == 2)
1972*495ae853SAndroid Build Coastguard Worker     {
1973*495ae853SAndroid Build Coastguard Worker         strcpy(ac_cfg_fname, argv[1]);
1974*495ae853SAndroid Build Coastguard Worker     }
1975*495ae853SAndroid Build Coastguard Worker 
1976*495ae853SAndroid Build Coastguard Worker #else
1977*495ae853SAndroid Build Coastguard Worker     strcpy(ac_cfg_fname, "test.cfg");
1978*495ae853SAndroid Build Coastguard Worker 
1979*495ae853SAndroid Build Coastguard Worker #endif
1980*495ae853SAndroid Build Coastguard Worker 
1981*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1982*495ae853SAndroid Build Coastguard Worker     /*                  Initialize Application parameters                  */
1983*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1984*495ae853SAndroid Build Coastguard Worker 
1985*495ae853SAndroid Build Coastguard Worker     strcpy(s_app_ctx.ac_ip_fname, "\0");
1986*495ae853SAndroid Build Coastguard Worker     s_app_ctx.dump_q_wr_idx = 0;
1987*495ae853SAndroid Build Coastguard Worker     s_app_ctx.dump_q_rd_idx = 0;
1988*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display_thread_created = 0;
1989*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_q_wr_idx = 0;
1990*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_q_rd_idx = 0;
1991*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_delay = 0;
1992*495ae853SAndroid Build Coastguard Worker     s_app_ctx.loopback = 0;
1993*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display = 0;
1994*495ae853SAndroid Build Coastguard Worker     s_app_ctx.full_screen = 0;
1995*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_piclen_flag = 0;
1996*495ae853SAndroid Build Coastguard Worker     s_app_ctx.fps = DEFAULT_FPS;
1997*495ae853SAndroid Build Coastguard Worker     file_pos = 0;
1998*495ae853SAndroid Build Coastguard Worker     total_bytes_comsumed = 0;
1999*495ae853SAndroid Build Coastguard Worker     u4_ip_frm_ts = 0;
2000*495ae853SAndroid Build Coastguard Worker     u4_op_frm_ts = 0;
2001*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
2002*495ae853SAndroid Build Coastguard Worker     memset(peak_window, 0, sizeof(WORD32) * PEAK_WINDOW_SIZE);
2003*495ae853SAndroid Build Coastguard Worker #endif
2004*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_share_disp_buf = DEFAULT_SHARE_DISPLAY_BUF;
2005*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_num_cores = DEFAULT_NUM_CORES;
2006*495ae853SAndroid Build Coastguard Worker     s_app_ctx.i4_degrade_type = 0;
2007*495ae853SAndroid Build Coastguard Worker     s_app_ctx.i4_degrade_pics = 0;
2008*495ae853SAndroid Build Coastguard Worker     s_app_ctx.e_arch = ARCH_ARM_A9Q;
2009*495ae853SAndroid Build Coastguard Worker     s_app_ctx.e_soc = SOC_GENERIC;
2010*495ae853SAndroid Build Coastguard Worker     s_app_ctx.i4_target_layer_id = 0;
2011*495ae853SAndroid Build Coastguard Worker 
2012*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_strd = STRIDE;
2013*495ae853SAndroid Build Coastguard Worker 
2014*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display_thread_handle = malloc(ithread_get_handle_size());
2015*495ae853SAndroid Build Coastguard Worker     s_app_ctx.quit = 0;
2016*495ae853SAndroid Build Coastguard Worker     s_app_ctx.paused = 0;
2017*495ae853SAndroid Build Coastguard Worker     // s_app_ctx.u4_output_present = 0;
2018*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_chksum_save_flag = 0;
2019*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_frame_info_enable = 0;
2020*495ae853SAndroid Build Coastguard Worker 
2021*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_stride = &default_get_stride;
2022*495ae853SAndroid Build Coastguard Worker 
2023*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_color_fmt = &default_get_color_fmt;
2024*495ae853SAndroid Build Coastguard Worker 
2025*495ae853SAndroid Build Coastguard Worker     /* Set function pointers for display */
2026*495ae853SAndroid Build Coastguard Worker #ifdef SDL_DISPLAY
2027*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_init = &sdl_disp_init;
2028*495ae853SAndroid Build Coastguard Worker     s_app_ctx.alloc_disp_buffers = &sdl_alloc_disp_buffers;
2029*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display_buffer = &sdl_display;
2030*495ae853SAndroid Build Coastguard Worker     s_app_ctx.set_disp_buffers = &sdl_set_disp_buffers;
2031*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_deinit = &sdl_disp_deinit;
2032*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_usleep = &sdl_disp_usleep;
2033*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_color_fmt = &sdl_get_color_fmt;
2034*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_stride = &sdl_get_stride;
2035*495ae853SAndroid Build Coastguard Worker #endif
2036*495ae853SAndroid Build Coastguard Worker 
2037*495ae853SAndroid Build Coastguard Worker #ifdef FBDEV_DISPLAY
2038*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_init = &fbd_disp_init;
2039*495ae853SAndroid Build Coastguard Worker     s_app_ctx.alloc_disp_buffers = &fbd_alloc_disp_buffers;
2040*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display_buffer = &fbd_display;
2041*495ae853SAndroid Build Coastguard Worker     s_app_ctx.set_disp_buffers = &fbd_set_disp_buffers;
2042*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_deinit = &fbd_disp_deinit;
2043*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_usleep = &fbd_disp_usleep;
2044*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_color_fmt = &fbd_get_color_fmt;
2045*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_stride = &fbd_get_stride;
2046*495ae853SAndroid Build Coastguard Worker #endif
2047*495ae853SAndroid Build Coastguard Worker 
2048*495ae853SAndroid Build Coastguard Worker #ifdef INTEL_CE5300
2049*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_init = &gdl_disp_init;
2050*495ae853SAndroid Build Coastguard Worker     s_app_ctx.alloc_disp_buffers = &gdl_alloc_disp_buffers;
2051*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display_buffer = &gdl_display;
2052*495ae853SAndroid Build Coastguard Worker     s_app_ctx.set_disp_buffers = &gdl_set_disp_buffers;
2053*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_deinit = &gdl_disp_deinit;
2054*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_usleep = &gdl_disp_usleep;
2055*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_color_fmt = &gdl_get_color_fmt;
2056*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_stride = &gdl_get_stride;
2057*495ae853SAndroid Build Coastguard Worker #endif
2058*495ae853SAndroid Build Coastguard Worker 
2059*495ae853SAndroid Build Coastguard Worker #ifdef IOS_DISPLAY
2060*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_init = &ios_disp_init;
2061*495ae853SAndroid Build Coastguard Worker     s_app_ctx.alloc_disp_buffers = &ios_alloc_disp_buffers;
2062*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display_buffer = &ios_display;
2063*495ae853SAndroid Build Coastguard Worker     s_app_ctx.set_disp_buffers = &ios_set_disp_buffers;
2064*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_deinit = &ios_disp_deinit;
2065*495ae853SAndroid Build Coastguard Worker     s_app_ctx.disp_usleep = &ios_disp_usleep;
2066*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_color_fmt = &ios_get_color_fmt;
2067*495ae853SAndroid Build Coastguard Worker     s_app_ctx.get_stride = &ios_get_stride;
2068*495ae853SAndroid Build Coastguard Worker #endif
2069*495ae853SAndroid Build Coastguard Worker 
2070*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display_deinit_flag = 0;
2071*495ae853SAndroid Build Coastguard Worker     s_app_ctx.e_output_chroma_format = IV_YUV_420SP_UV;
2072*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2073*495ae853SAndroid Build Coastguard Worker     /* Parse arguments                                                       */
2074*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2075*495ae853SAndroid Build Coastguard Worker 
2076*495ae853SAndroid Build Coastguard Worker #ifndef IOS
2077*495ae853SAndroid Build Coastguard Worker     /* Read command line arguments */
2078*495ae853SAndroid Build Coastguard Worker     if(argc > 2)
2079*495ae853SAndroid Build Coastguard Worker     {
2080*495ae853SAndroid Build Coastguard Worker         for(i = 1; i < (UWORD32) argc; i += 2)
2081*495ae853SAndroid Build Coastguard Worker         {
2082*495ae853SAndroid Build Coastguard Worker             if(CONFIG == get_argument(argv[i]))
2083*495ae853SAndroid Build Coastguard Worker             {
2084*495ae853SAndroid Build Coastguard Worker                 strcpy(ac_cfg_fname, argv[i + 1]);
2085*495ae853SAndroid Build Coastguard Worker                 if((fp_cfg_file = fopen(ac_cfg_fname, "r")) == NULL)
2086*495ae853SAndroid Build Coastguard Worker                 {
2087*495ae853SAndroid Build Coastguard Worker                     snprintf(ac_error_str, sizeof(ac_error_str),
2088*495ae853SAndroid Build Coastguard Worker                              "Could not open Configuration file %s", ac_cfg_fname);
2089*495ae853SAndroid Build Coastguard Worker                     codec_exit(ac_error_str);
2090*495ae853SAndroid Build Coastguard Worker                 }
2091*495ae853SAndroid Build Coastguard Worker                 read_cfg_file(&s_app_ctx, fp_cfg_file);
2092*495ae853SAndroid Build Coastguard Worker                 fclose(fp_cfg_file);
2093*495ae853SAndroid Build Coastguard Worker             }
2094*495ae853SAndroid Build Coastguard Worker             else
2095*495ae853SAndroid Build Coastguard Worker             {
2096*495ae853SAndroid Build Coastguard Worker                 parse_argument(&s_app_ctx, argv[i], argv[i + 1]);
2097*495ae853SAndroid Build Coastguard Worker             }
2098*495ae853SAndroid Build Coastguard Worker         }
2099*495ae853SAndroid Build Coastguard Worker     }
2100*495ae853SAndroid Build Coastguard Worker     else
2101*495ae853SAndroid Build Coastguard Worker     {
2102*495ae853SAndroid Build Coastguard Worker         if((fp_cfg_file = fopen(ac_cfg_fname, "r")) == NULL)
2103*495ae853SAndroid Build Coastguard Worker         {
2104*495ae853SAndroid Build Coastguard Worker             snprintf(ac_error_str, sizeof(ac_error_str), "Could not open Configuration file %s",
2105*495ae853SAndroid Build Coastguard Worker                      ac_cfg_fname);
2106*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2107*495ae853SAndroid Build Coastguard Worker         }
2108*495ae853SAndroid Build Coastguard Worker         read_cfg_file(&s_app_ctx, fp_cfg_file);
2109*495ae853SAndroid Build Coastguard Worker         fclose(fp_cfg_file);
2110*495ae853SAndroid Build Coastguard Worker     }
2111*495ae853SAndroid Build Coastguard Worker #else
2112*495ae853SAndroid Build Coastguard Worker     snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", homedir, ac_cfg_fname);
2113*495ae853SAndroid Build Coastguard Worker     if((fp_cfg_file = fopen(filename_with_path, "r")) == NULL)
2114*495ae853SAndroid Build Coastguard Worker     {
2115*495ae853SAndroid Build Coastguard Worker         snprintf(ac_error_str, sizeof(ac_error_str), "Could not open Configuration file %s",
2116*495ae853SAndroid Build Coastguard Worker                  ac_cfg_fname);
2117*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error_str);
2118*495ae853SAndroid Build Coastguard Worker     }
2119*495ae853SAndroid Build Coastguard Worker     read_cfg_file(&s_app_ctx, fp_cfg_file);
2120*495ae853SAndroid Build Coastguard Worker     fclose(fp_cfg_file);
2121*495ae853SAndroid Build Coastguard Worker 
2122*495ae853SAndroid Build Coastguard Worker #endif
2123*495ae853SAndroid Build Coastguard Worker #ifdef PRINT_PICSIZE
2124*495ae853SAndroid Build Coastguard Worker     /* If the binary is used for only getting number of bytes in each picture,
2125*495ae853SAndroid Build Coastguard Worker      * then disable the following features */
2126*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_piclen_flag = 0;
2127*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_file_save_flag = 0;
2128*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_chksum_save_flag = 0;
2129*495ae853SAndroid Build Coastguard Worker     s_app_ctx.i4_degrade_pics = 0;
2130*495ae853SAndroid Build Coastguard Worker     s_app_ctx.i4_degrade_type = 0;
2131*495ae853SAndroid Build Coastguard Worker     s_app_ctx.loopback = 0;
2132*495ae853SAndroid Build Coastguard Worker     s_app_ctx.u4_share_disp_buf = 0;
2133*495ae853SAndroid Build Coastguard Worker     s_app_ctx.display = 0;
2134*495ae853SAndroid Build Coastguard Worker #endif
2135*495ae853SAndroid Build Coastguard Worker 
2136*495ae853SAndroid Build Coastguard Worker     /* If display is enabled, then turn off shared mode and get color format that
2137*495ae853SAndroid Build Coastguard Worker      * is supported by display */
2138*495ae853SAndroid Build Coastguard Worker     if(1 == s_app_ctx.display)
2139*495ae853SAndroid Build Coastguard Worker     {
2140*495ae853SAndroid Build Coastguard Worker         s_app_ctx.u4_share_disp_buf = 0;
2141*495ae853SAndroid Build Coastguard Worker         s_app_ctx.e_output_chroma_format = s_app_ctx.get_color_fmt();
2142*495ae853SAndroid Build Coastguard Worker     }
2143*495ae853SAndroid Build Coastguard Worker     if(strcmp(s_app_ctx.ac_ip_fname, "\0") == 0)
2144*495ae853SAndroid Build Coastguard Worker     {
2145*495ae853SAndroid Build Coastguard Worker         printf("\nNo input file given for decoding\n");
2146*495ae853SAndroid Build Coastguard Worker         exit(-1);
2147*495ae853SAndroid Build Coastguard Worker     }
2148*495ae853SAndroid Build Coastguard Worker 
2149*495ae853SAndroid Build Coastguard Worker     if(1 == s_app_ctx.u4_frame_info_enable)
2150*495ae853SAndroid Build Coastguard Worker     {
2151*495ae853SAndroid Build Coastguard Worker         pu1_qp_map_buf = calloc((ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6, 1);
2152*495ae853SAndroid Build Coastguard Worker         pu1_blk_type_map_buf = calloc((ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6, 1);
2153*495ae853SAndroid Build Coastguard Worker     }
2154*495ae853SAndroid Build Coastguard Worker 
2155*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2156*495ae853SAndroid Build Coastguard Worker     /*          create the file object for input file                      */
2157*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2158*495ae853SAndroid Build Coastguard Worker #ifdef IOS
2159*495ae853SAndroid Build Coastguard Worker     snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", homedir,
2160*495ae853SAndroid Build Coastguard Worker              s_app_ctx.ac_ip_fname);
2161*495ae853SAndroid Build Coastguard Worker     ps_ip_file = fopen(filename_with_path, "rb");
2162*495ae853SAndroid Build Coastguard Worker #else
2163*495ae853SAndroid Build Coastguard Worker     ps_ip_file = fopen(s_app_ctx.ac_ip_fname, "rb");
2164*495ae853SAndroid Build Coastguard Worker #endif
2165*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_ip_file)
2166*495ae853SAndroid Build Coastguard Worker     {
2167*495ae853SAndroid Build Coastguard Worker         snprintf(ac_error_str, sizeof(ac_error_str), "Could not open input file %s",
2168*495ae853SAndroid Build Coastguard Worker                  s_app_ctx.ac_ip_fname);
2169*495ae853SAndroid Build Coastguard Worker         codec_exit(ac_error_str);
2170*495ae853SAndroid Build Coastguard Worker     }
2171*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2172*495ae853SAndroid Build Coastguard Worker     /*          create the file object for input file                      */
2173*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2174*495ae853SAndroid Build Coastguard Worker     if(1 == s_app_ctx.u4_piclen_flag)
2175*495ae853SAndroid Build Coastguard Worker     {
2176*495ae853SAndroid Build Coastguard Worker #ifdef IOS
2177*495ae853SAndroid Build Coastguard Worker         snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s",
2178*495ae853SAndroid Build Coastguard Worker                  s_app_ctx.ac_piclen_fname);
2179*495ae853SAndroid Build Coastguard Worker         ps_piclen_file = fopen(filename_with_path, "rb");
2180*495ae853SAndroid Build Coastguard Worker #else
2181*495ae853SAndroid Build Coastguard Worker         ps_piclen_file = fopen(s_app_ctx.ac_piclen_fname, "rb");
2182*495ae853SAndroid Build Coastguard Worker #endif
2183*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_piclen_file)
2184*495ae853SAndroid Build Coastguard Worker         {
2185*495ae853SAndroid Build Coastguard Worker             snprintf(ac_error_str, sizeof(ac_error_str), "Could not open piclen file %s",
2186*495ae853SAndroid Build Coastguard Worker                      s_app_ctx.ac_piclen_fname);
2187*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2188*495ae853SAndroid Build Coastguard Worker         }
2189*495ae853SAndroid Build Coastguard Worker     }
2190*495ae853SAndroid Build Coastguard Worker 
2191*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2192*495ae853SAndroid Build Coastguard Worker     /*          create the file object for output file                     */
2193*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2194*495ae853SAndroid Build Coastguard Worker 
2195*495ae853SAndroid Build Coastguard Worker     /* If the filename does not contain %d, then output will be dumped to
2196*495ae853SAndroid Build Coastguard Worker        a single file and it is opened here */
2197*495ae853SAndroid Build Coastguard Worker     if((1 == s_app_ctx.u4_file_save_flag) && (strstr(s_app_ctx.ac_op_fname, "%d") == NULL))
2198*495ae853SAndroid Build Coastguard Worker     {
2199*495ae853SAndroid Build Coastguard Worker #ifdef IOS
2200*495ae853SAndroid Build Coastguard Worker         snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", documentdir,
2201*495ae853SAndroid Build Coastguard Worker                  s_app_ctx.ac_op_fname);
2202*495ae853SAndroid Build Coastguard Worker         ps_op_file = fopen(filename_with_path, "wb");
2203*495ae853SAndroid Build Coastguard Worker #else
2204*495ae853SAndroid Build Coastguard Worker         ps_op_file = fopen(s_app_ctx.ac_op_fname, "wb");
2205*495ae853SAndroid Build Coastguard Worker #endif
2206*495ae853SAndroid Build Coastguard Worker 
2207*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_op_file)
2208*495ae853SAndroid Build Coastguard Worker         {
2209*495ae853SAndroid Build Coastguard Worker             snprintf(ac_error_str, sizeof(ac_error_str), "Could not open output file %s",
2210*495ae853SAndroid Build Coastguard Worker                      s_app_ctx.ac_op_fname);
2211*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2212*495ae853SAndroid Build Coastguard Worker         }
2213*495ae853SAndroid Build Coastguard Worker     }
2214*495ae853SAndroid Build Coastguard Worker 
2215*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2216*495ae853SAndroid Build Coastguard Worker     /*          create the file object for mbinfo file                     */
2217*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2218*495ae853SAndroid Build Coastguard Worker 
2219*495ae853SAndroid Build Coastguard Worker     if(1 == s_app_ctx.u4_frame_info_enable)
2220*495ae853SAndroid Build Coastguard Worker     {
2221*495ae853SAndroid Build Coastguard Worker #ifdef IOS
2222*495ae853SAndroid Build Coastguard Worker         snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", documentdir,
2223*495ae853SAndroid Build Coastguard Worker                  s_app_ctx.ac_qp_map_fname);
2224*495ae853SAndroid Build Coastguard Worker         ps_qp_file = fopen(filename_with_path, "wb");
2225*495ae853SAndroid Build Coastguard Worker 
2226*495ae853SAndroid Build Coastguard Worker         snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", documentdir,
2227*495ae853SAndroid Build Coastguard Worker                  s_app_ctx.ac_blk_type_map_fname);
2228*495ae853SAndroid Build Coastguard Worker         ps_mb_type_file = fopen(filename_with_path, "wb");
2229*495ae853SAndroid Build Coastguard Worker #else
2230*495ae853SAndroid Build Coastguard Worker         ps_qp_file = fopen(s_app_ctx.ac_qp_map_fname, "wb");
2231*495ae853SAndroid Build Coastguard Worker         ps_mb_type_file = fopen(s_app_ctx.ac_blk_type_map_fname, "wb");
2232*495ae853SAndroid Build Coastguard Worker 
2233*495ae853SAndroid Build Coastguard Worker #endif
2234*495ae853SAndroid Build Coastguard Worker 
2235*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_qp_file)
2236*495ae853SAndroid Build Coastguard Worker         {
2237*495ae853SAndroid Build Coastguard Worker             snprintf(ac_error_str, sizeof(ac_error_str), "Could not open block_qp map file %s",
2238*495ae853SAndroid Build Coastguard Worker                      s_app_ctx.ac_qp_map_fname);
2239*495ae853SAndroid Build Coastguard Worker         }
2240*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_mb_type_file)
2241*495ae853SAndroid Build Coastguard Worker         {
2242*495ae853SAndroid Build Coastguard Worker             snprintf(ac_error_str, sizeof(ac_error_str), "Could not open block_type map file %s",
2243*495ae853SAndroid Build Coastguard Worker                      s_app_ctx.ac_blk_type_map_fname);
2244*495ae853SAndroid Build Coastguard Worker         }
2245*495ae853SAndroid Build Coastguard Worker     }
2246*495ae853SAndroid Build Coastguard Worker 
2247*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2248*495ae853SAndroid Build Coastguard Worker     /*          create the file object for check sum file                  */
2249*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2250*495ae853SAndroid Build Coastguard Worker     if(1 == s_app_ctx.u4_chksum_save_flag)
2251*495ae853SAndroid Build Coastguard Worker     {
2252*495ae853SAndroid Build Coastguard Worker #if IOS
2253*495ae853SAndroid Build Coastguard Worker         snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", documentdir,
2254*495ae853SAndroid Build Coastguard Worker                  s_app_ctx.ac_op_chksum_fname);
2255*495ae853SAndroid Build Coastguard Worker         ps_op_chksum_file = fopen(filename_with_path, "wb");
2256*495ae853SAndroid Build Coastguard Worker #else
2257*495ae853SAndroid Build Coastguard Worker         ps_op_chksum_file = fopen(s_app_ctx.ac_op_chksum_fname, "wb");
2258*495ae853SAndroid Build Coastguard Worker #endif
2259*495ae853SAndroid Build Coastguard Worker         if(NULL == ps_op_chksum_file)
2260*495ae853SAndroid Build Coastguard Worker         {
2261*495ae853SAndroid Build Coastguard Worker             snprintf(ac_error_str, sizeof(ac_error_str), "Could not open check sum file %s",
2262*495ae853SAndroid Build Coastguard Worker                      s_app_ctx.ac_op_chksum_fname);
2263*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2264*495ae853SAndroid Build Coastguard Worker         }
2265*495ae853SAndroid Build Coastguard Worker     }
2266*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2267*495ae853SAndroid Build Coastguard Worker     /*                      Create decoder instance                        */
2268*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
2269*495ae853SAndroid Build Coastguard Worker     {
2270*495ae853SAndroid Build Coastguard Worker         ps_out_buf = (ivd_out_bufdesc_t *) malloc(sizeof(ivd_out_bufdesc_t));
2271*495ae853SAndroid Build Coastguard Worker 
2272*495ae853SAndroid Build Coastguard Worker         /*****************************************************************************/
2273*495ae853SAndroid Build Coastguard Worker         /*   API Call: Initialize the Decoder */
2274*495ae853SAndroid Build Coastguard Worker         /*****************************************************************************/
2275*495ae853SAndroid Build Coastguard Worker         {
2276*495ae853SAndroid Build Coastguard Worker             isvcd_create_ip_t s_create_ip = {};
2277*495ae853SAndroid Build Coastguard Worker             isvcd_create_op_t s_create_op = {};
2278*495ae853SAndroid Build Coastguard Worker             void *fxns = &ivd_api_function;
2279*495ae853SAndroid Build Coastguard Worker 
2280*495ae853SAndroid Build Coastguard Worker             s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE;
2281*495ae853SAndroid Build Coastguard Worker             s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = s_app_ctx.u4_share_disp_buf;
2282*495ae853SAndroid Build Coastguard Worker             s_create_ip.s_ivd_create_ip_t.e_output_format =
2283*495ae853SAndroid Build Coastguard Worker                 (IV_COLOR_FORMAT_T) s_app_ctx.e_output_chroma_format;
2284*495ae853SAndroid Build Coastguard Worker             s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ih264a_aligned_malloc;
2285*495ae853SAndroid Build Coastguard Worker             s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ih264a_aligned_free;
2286*495ae853SAndroid Build Coastguard Worker             s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = NULL;
2287*495ae853SAndroid Build Coastguard Worker             s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(isvcd_create_ip_t);
2288*495ae853SAndroid Build Coastguard Worker             s_create_op.s_ivd_create_op_t.u4_size = sizeof(isvcd_create_op_t);
2289*495ae853SAndroid Build Coastguard Worker             s_create_ip.u4_enable_frame_info = s_app_ctx.u4_frame_info_enable;
2290*495ae853SAndroid Build Coastguard Worker 
2291*495ae853SAndroid Build Coastguard Worker             ret = ivd_api_function(NULL, (void *) &s_create_ip, (void *) &s_create_op);
2292*495ae853SAndroid Build Coastguard Worker             if(ret != IV_SUCCESS)
2293*495ae853SAndroid Build Coastguard Worker             {
2294*495ae853SAndroid Build Coastguard Worker                 sprintf(ac_error_str, "Error in Create %8x\n",
2295*495ae853SAndroid Build Coastguard Worker                         s_create_op.s_ivd_create_op_t.u4_error_code);
2296*495ae853SAndroid Build Coastguard Worker                 codec_exit(ac_error_str);
2297*495ae853SAndroid Build Coastguard Worker             }
2298*495ae853SAndroid Build Coastguard Worker             codec_obj = (iv_obj_t *) s_create_op.s_ivd_create_op_t.pv_handle;
2299*495ae853SAndroid Build Coastguard Worker             codec_obj->pv_fxns = fxns;
2300*495ae853SAndroid Build Coastguard Worker             codec_obj->u4_size = sizeof(iv_obj_t);
2301*495ae853SAndroid Build Coastguard Worker             s_app_ctx.cocodec_obj = codec_obj;
2302*495ae853SAndroid Build Coastguard Worker 
2303*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
2304*495ae853SAndroid Build Coastguard Worker             /*  set stride */
2305*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
2306*495ae853SAndroid Build Coastguard Worker             {
2307*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_set_config_ip_t s_h264d_ctl_ip = {};
2308*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_set_config_op_t s_h264d_ctl_op = {};
2309*495ae853SAndroid Build Coastguard Worker                 ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
2310*495ae853SAndroid Build Coastguard Worker                 ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
2311*495ae853SAndroid Build Coastguard Worker 
2312*495ae853SAndroid Build Coastguard Worker                 ps_ctl_ip->u4_disp_wd = STRIDE;
2313*495ae853SAndroid Build Coastguard Worker                 if(1 == s_app_ctx.display) ps_ctl_ip->u4_disp_wd = s_app_ctx.get_stride();
2314*495ae853SAndroid Build Coastguard Worker 
2315*495ae853SAndroid Build Coastguard Worker                 ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
2316*495ae853SAndroid Build Coastguard Worker                 ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
2317*495ae853SAndroid Build Coastguard Worker                 ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_HEADER;
2318*495ae853SAndroid Build Coastguard Worker                 ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
2319*495ae853SAndroid Build Coastguard Worker                 ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
2320*495ae853SAndroid Build Coastguard Worker                 ps_ctl_ip->u4_size = sizeof(isvcd_ctl_set_config_ip_t);
2321*495ae853SAndroid Build Coastguard Worker                 ps_ctl_op->u4_size = sizeof(isvcd_ctl_set_config_op_t);
2322*495ae853SAndroid Build Coastguard Worker 
2323*495ae853SAndroid Build Coastguard Worker                 ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_ctl_ip,
2324*495ae853SAndroid Build Coastguard Worker                                        (void *) &s_h264d_ctl_op);
2325*495ae853SAndroid Build Coastguard Worker                 if(ret != IV_SUCCESS)
2326*495ae853SAndroid Build Coastguard Worker                 {
2327*495ae853SAndroid Build Coastguard Worker                     sprintf(ac_error_str, "\nError in setting the stride");
2328*495ae853SAndroid Build Coastguard Worker                     codec_exit(ac_error_str);
2329*495ae853SAndroid Build Coastguard Worker                 }
2330*495ae853SAndroid Build Coastguard Worker             }
2331*495ae853SAndroid Build Coastguard Worker         }
2332*495ae853SAndroid Build Coastguard Worker     }
2333*495ae853SAndroid Build Coastguard Worker 
2334*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2335*495ae853SAndroid Build Coastguard Worker     /* set num of cores                                                      */
2336*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2337*495ae853SAndroid Build Coastguard Worker     {
2338*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_set_num_cores_ip_t s_ctl_set_cores_ip;
2339*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_set_num_cores_op_t s_ctl_set_cores_op;
2340*495ae853SAndroid Build Coastguard Worker 
2341*495ae853SAndroid Build Coastguard Worker         s_ctl_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
2342*495ae853SAndroid Build Coastguard Worker         s_ctl_set_cores_ip.e_sub_cmd =
2343*495ae853SAndroid Build Coastguard Worker             (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_SET_NUM_CORES;
2344*495ae853SAndroid Build Coastguard Worker         s_ctl_set_cores_ip.u4_num_cores = s_app_ctx.u4_num_cores;
2345*495ae853SAndroid Build Coastguard Worker         s_ctl_set_cores_ip.u4_size = sizeof(isvcd_ctl_set_num_cores_ip_t);
2346*495ae853SAndroid Build Coastguard Worker         s_ctl_set_cores_op.u4_size = sizeof(isvcd_ctl_set_num_cores_op_t);
2347*495ae853SAndroid Build Coastguard Worker 
2348*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_set_cores_ip,
2349*495ae853SAndroid Build Coastguard Worker                                (void *) &s_ctl_set_cores_op);
2350*495ae853SAndroid Build Coastguard Worker         if(ret != IV_SUCCESS)
2351*495ae853SAndroid Build Coastguard Worker         {
2352*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "\nError in setting number of cores");
2353*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2354*495ae853SAndroid Build Coastguard Worker         }
2355*495ae853SAndroid Build Coastguard Worker     }
2356*495ae853SAndroid Build Coastguard Worker 
2357*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2358*495ae853SAndroid Build Coastguard Worker     /* set target layer                                                     */
2359*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2360*495ae853SAndroid Build Coastguard Worker     {
2361*495ae853SAndroid Build Coastguard Worker         isvcd_set_target_layer_ip_t s_ctl_set_target_layer_ip;
2362*495ae853SAndroid Build Coastguard Worker         isvcd_set_target_layer_op_t s_ctl_set_target_layer_op;
2363*495ae853SAndroid Build Coastguard Worker 
2364*495ae853SAndroid Build Coastguard Worker         s_ctl_set_target_layer_ip.e_cmd = IVD_CMD_VIDEO_CTL;
2365*495ae853SAndroid Build Coastguard Worker         s_ctl_set_target_layer_ip.e_sub_cmd =
2366*495ae853SAndroid Build Coastguard Worker             (IVD_CONTROL_API_COMMAND_TYPE_T) ISVCD_CMD_CTL_SET_TGT_LAYER;
2367*495ae853SAndroid Build Coastguard Worker         s_ctl_set_target_layer_ip.u1_tgt_priority_id = 63;
2368*495ae853SAndroid Build Coastguard Worker         s_ctl_set_target_layer_ip.u1_tgt_temp_id = 7;
2369*495ae853SAndroid Build Coastguard Worker         s_ctl_set_target_layer_ip.u1_tgt_quality_id = 0;
2370*495ae853SAndroid Build Coastguard Worker         s_ctl_set_target_layer_ip.u1_tgt_dep_id = s_app_ctx.i4_target_layer_id;
2371*495ae853SAndroid Build Coastguard Worker         s_ctl_set_target_layer_ip.u4_size = sizeof(isvcd_set_target_layer_ip_t);
2372*495ae853SAndroid Build Coastguard Worker         s_ctl_set_target_layer_op.u4_size = sizeof(isvcd_set_target_layer_op_t);
2373*495ae853SAndroid Build Coastguard Worker 
2374*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_set_target_layer_ip,
2375*495ae853SAndroid Build Coastguard Worker                                (void *) &s_ctl_set_target_layer_op);
2376*495ae853SAndroid Build Coastguard Worker 
2377*495ae853SAndroid Build Coastguard Worker         if(ret != IV_SUCCESS)
2378*495ae853SAndroid Build Coastguard Worker         {
2379*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "\nError in setting target layer id");
2380*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2381*495ae853SAndroid Build Coastguard Worker         }
2382*495ae853SAndroid Build Coastguard Worker     }
2383*495ae853SAndroid Build Coastguard Worker 
2384*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2385*495ae853SAndroid Build Coastguard Worker     /* set processsor                                                        */
2386*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2387*495ae853SAndroid Build Coastguard Worker     {
2388*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_set_processor_ip_t s_ctl_set_num_processor_ip;
2389*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_set_processor_op_t s_ctl_set_num_processor_op;
2390*495ae853SAndroid Build Coastguard Worker 
2391*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_processor_ip.e_cmd = IVD_CMD_VIDEO_CTL;
2392*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_processor_ip.e_sub_cmd =
2393*495ae853SAndroid Build Coastguard Worker             (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_SET_PROCESSOR;
2394*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_processor_ip.u4_arch = s_app_ctx.e_arch;
2395*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_processor_ip.u4_soc = s_app_ctx.e_soc;
2396*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_processor_ip.u4_size = sizeof(isvcd_ctl_set_processor_ip_t);
2397*495ae853SAndroid Build Coastguard Worker         s_ctl_set_num_processor_op.u4_size = sizeof(isvcd_ctl_set_processor_op_t);
2398*495ae853SAndroid Build Coastguard Worker 
2399*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_set_num_processor_ip,
2400*495ae853SAndroid Build Coastguard Worker                                (void *) &s_ctl_set_num_processor_op);
2401*495ae853SAndroid Build Coastguard Worker         if(ret != IV_SUCCESS)
2402*495ae853SAndroid Build Coastguard Worker         {
2403*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "\nError in setting Processor type");
2404*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2405*495ae853SAndroid Build Coastguard Worker         }
2406*495ae853SAndroid Build Coastguard Worker     }
2407*495ae853SAndroid Build Coastguard Worker 
2408*495ae853SAndroid Build Coastguard Worker     flush_output(codec_obj, &s_app_ctx, ps_out_buf, pu1_bs_buf, &u4_op_frm_ts, ps_op_file,
2409*495ae853SAndroid Build Coastguard Worker                  ps_qp_file, ps_mb_type_file, pu1_qp_map_buf, pu1_blk_type_map_buf,
2410*495ae853SAndroid Build Coastguard Worker                  ps_op_chksum_file, u4_ip_frm_ts, u4_bytes_remaining);
2411*495ae853SAndroid Build Coastguard Worker 
2412*495ae853SAndroid Build Coastguard Worker     /*****************************************************************************/
2413*495ae853SAndroid Build Coastguard Worker     /*   Decode header to get width and height and buffer sizes */
2414*495ae853SAndroid Build Coastguard Worker     /*****************************************************************************/
2415*495ae853SAndroid Build Coastguard Worker     {
2416*495ae853SAndroid Build Coastguard Worker         isvcd_video_decode_ip_t s_h264d_decode_ip = {};
2417*495ae853SAndroid Build Coastguard Worker         isvcd_video_decode_op_t s_h264d_decode_op = {};
2418*495ae853SAndroid Build Coastguard Worker         ivd_video_decode_ip_t *ps_video_decode_ip = &s_h264d_decode_ip.s_ivd_video_decode_ip_t;
2419*495ae853SAndroid Build Coastguard Worker         ivd_video_decode_op_t *ps_video_decode_op = &s_h264d_decode_op.s_ivd_video_decode_op_t;
2420*495ae853SAndroid Build Coastguard Worker 
2421*495ae853SAndroid Build Coastguard Worker         {
2422*495ae853SAndroid Build Coastguard Worker             isvcd_ctl_set_config_ip_t s_h264d_ctl_ip = {};
2423*495ae853SAndroid Build Coastguard Worker             isvcd_ctl_set_config_op_t s_h264d_ctl_op = {};
2424*495ae853SAndroid Build Coastguard Worker             ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
2425*495ae853SAndroid Build Coastguard Worker             ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
2426*495ae853SAndroid Build Coastguard Worker 
2427*495ae853SAndroid Build Coastguard Worker             ps_ctl_ip->u4_disp_wd = STRIDE;
2428*495ae853SAndroid Build Coastguard Worker             if(1 == s_app_ctx.display) ps_ctl_ip->u4_disp_wd = s_app_ctx.get_stride();
2429*495ae853SAndroid Build Coastguard Worker 
2430*495ae853SAndroid Build Coastguard Worker             ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
2431*495ae853SAndroid Build Coastguard Worker             ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
2432*495ae853SAndroid Build Coastguard Worker             ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_HEADER;
2433*495ae853SAndroid Build Coastguard Worker             ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
2434*495ae853SAndroid Build Coastguard Worker             ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
2435*495ae853SAndroid Build Coastguard Worker             ps_ctl_ip->u4_size = sizeof(isvcd_ctl_set_config_ip_t);
2436*495ae853SAndroid Build Coastguard Worker             ps_ctl_op->u4_size = sizeof(isvcd_ctl_set_config_op_t);
2437*495ae853SAndroid Build Coastguard Worker 
2438*495ae853SAndroid Build Coastguard Worker             ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_ctl_ip,
2439*495ae853SAndroid Build Coastguard Worker                                    (void *) &s_h264d_ctl_op);
2440*495ae853SAndroid Build Coastguard Worker             if(ret != IV_SUCCESS)
2441*495ae853SAndroid Build Coastguard Worker             {
2442*495ae853SAndroid Build Coastguard Worker                 sprintf(ac_error_str, "\nError in setting the codec in header decode mode");
2443*495ae853SAndroid Build Coastguard Worker                 codec_exit(ac_error_str);
2444*495ae853SAndroid Build Coastguard Worker             }
2445*495ae853SAndroid Build Coastguard Worker         }
2446*495ae853SAndroid Build Coastguard Worker 
2447*495ae853SAndroid Build Coastguard Worker         /* Allocate input buffer for header */
2448*495ae853SAndroid Build Coastguard Worker         u4_ip_buf_len = 256 * 1024;
2449*495ae853SAndroid Build Coastguard Worker         pu1_bs_buf = (UWORD8 *) malloc(u4_ip_buf_len);
2450*495ae853SAndroid Build Coastguard Worker 
2451*495ae853SAndroid Build Coastguard Worker         if(pu1_bs_buf == NULL)
2452*495ae853SAndroid Build Coastguard Worker         {
2453*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "\nAllocation failure for input buffer of i4_size %d",
2454*495ae853SAndroid Build Coastguard Worker                     u4_ip_buf_len);
2455*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2456*495ae853SAndroid Build Coastguard Worker         }
2457*495ae853SAndroid Build Coastguard Worker 
2458*495ae853SAndroid Build Coastguard Worker         do
2459*495ae853SAndroid Build Coastguard Worker         {
2460*495ae853SAndroid Build Coastguard Worker             WORD32 numbytes;
2461*495ae853SAndroid Build Coastguard Worker 
2462*495ae853SAndroid Build Coastguard Worker             if(0 == s_app_ctx.u4_piclen_flag)
2463*495ae853SAndroid Build Coastguard Worker             {
2464*495ae853SAndroid Build Coastguard Worker                 fseek(ps_ip_file, file_pos, SEEK_SET);
2465*495ae853SAndroid Build Coastguard Worker                 numbytes = u4_ip_buf_len;
2466*495ae853SAndroid Build Coastguard Worker             }
2467*495ae853SAndroid Build Coastguard Worker             else
2468*495ae853SAndroid Build Coastguard Worker             {
2469*495ae853SAndroid Build Coastguard Worker                 WORD32 entries;
2470*495ae853SAndroid Build Coastguard Worker                 entries = fscanf(ps_piclen_file, "%d\n", &numbytes);
2471*495ae853SAndroid Build Coastguard Worker                 if(1 != entries) numbytes = u4_ip_buf_len;
2472*495ae853SAndroid Build Coastguard Worker             }
2473*495ae853SAndroid Build Coastguard Worker 
2474*495ae853SAndroid Build Coastguard Worker             u4_bytes_remaining = (WORD32) fread(pu1_bs_buf, sizeof(UWORD8), numbytes, ps_ip_file);
2475*495ae853SAndroid Build Coastguard Worker 
2476*495ae853SAndroid Build Coastguard Worker             if((1 == s_app_ctx.u4_piclen_flag) && (u4_bytes_remaining > 0))
2477*495ae853SAndroid Build Coastguard Worker             {
2478*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x00;
2479*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2480*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x00;
2481*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2482*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x00;
2483*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2484*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x01;
2485*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2486*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x09;
2487*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2488*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x10;
2489*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2490*495ae853SAndroid Build Coastguard Worker 
2491*495ae853SAndroid Build Coastguard Worker                 u4_bytes_remaining += 6;
2492*495ae853SAndroid Build Coastguard Worker             }
2493*495ae853SAndroid Build Coastguard Worker 
2494*495ae853SAndroid Build Coastguard Worker             if(0 == u4_bytes_remaining)
2495*495ae853SAndroid Build Coastguard Worker             {
2496*495ae853SAndroid Build Coastguard Worker                 sprintf(ac_error_str, "\nUnable to read from input file");
2497*495ae853SAndroid Build Coastguard Worker                 codec_exit(ac_error_str);
2498*495ae853SAndroid Build Coastguard Worker             }
2499*495ae853SAndroid Build Coastguard Worker 
2500*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
2501*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_ts = u4_ip_frm_ts;
2502*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->pv_stream_buffer = pu1_bs_buf;
2503*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_num_Bytes = u4_bytes_remaining;
2504*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_size = sizeof(isvcd_video_decode_ip_t);
2505*495ae853SAndroid Build Coastguard Worker             ps_video_decode_op->u4_size = sizeof(isvcd_video_decode_op_t);
2506*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.pu1_8x8_blk_qp_map = pu1_qp_map_buf;
2507*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.pu1_8x8_blk_type_map = pu1_blk_type_map_buf;
2508*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.u4_8x8_blk_qp_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
2509*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.u4_8x8_blk_type_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
2510*495ae853SAndroid Build Coastguard Worker 
2511*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
2512*495ae853SAndroid Build Coastguard Worker             /*   API Call: Header Decode */
2513*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
2514*495ae853SAndroid Build Coastguard Worker             ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_decode_ip,
2515*495ae853SAndroid Build Coastguard Worker                                    (void *) &s_h264d_decode_op);
2516*495ae853SAndroid Build Coastguard Worker 
2517*495ae853SAndroid Build Coastguard Worker             if(ret != IV_SUCCESS)
2518*495ae853SAndroid Build Coastguard Worker             {
2519*495ae853SAndroid Build Coastguard Worker                 printf("Error in header decode 0x%x\n", ps_video_decode_op->u4_error_code);
2520*495ae853SAndroid Build Coastguard Worker                 // codec_exit(ac_error_str);
2521*495ae853SAndroid Build Coastguard Worker             }
2522*495ae853SAndroid Build Coastguard Worker 
2523*495ae853SAndroid Build Coastguard Worker             u4_num_bytes_dec = ps_video_decode_op->u4_num_bytes_consumed;
2524*495ae853SAndroid Build Coastguard Worker #ifndef PROFILE_ENABLE
2525*495ae853SAndroid Build Coastguard Worker             printf("%d\n", ps_video_decode_op->u4_num_bytes_consumed);
2526*495ae853SAndroid Build Coastguard Worker #endif
2527*495ae853SAndroid Build Coastguard Worker             file_pos += u4_num_bytes_dec;
2528*495ae853SAndroid Build Coastguard Worker             total_bytes_comsumed += u4_num_bytes_dec;
2529*495ae853SAndroid Build Coastguard Worker         } while(ret != IV_SUCCESS);
2530*495ae853SAndroid Build Coastguard Worker 
2531*495ae853SAndroid Build Coastguard Worker         /* copy pic_wd and pic_ht to initialize buffers */
2532*495ae853SAndroid Build Coastguard Worker         s_app_ctx.u4_pic_wd = ps_video_decode_op->u4_pic_wd;
2533*495ae853SAndroid Build Coastguard Worker         s_app_ctx.u4_pic_ht = ps_video_decode_op->u4_pic_ht;
2534*495ae853SAndroid Build Coastguard Worker 
2535*495ae853SAndroid Build Coastguard Worker         free(pu1_bs_buf);
2536*495ae853SAndroid Build Coastguard Worker 
2537*495ae853SAndroid Build Coastguard Worker #if IOS_DISPLAY
2538*495ae853SAndroid Build Coastguard Worker         s_app_ctx.i4_screen_wd = screen_wd;
2539*495ae853SAndroid Build Coastguard Worker         s_app_ctx.i4_screen_ht = screen_ht;
2540*495ae853SAndroid Build Coastguard Worker #endif
2541*495ae853SAndroid Build Coastguard Worker         {
2542*495ae853SAndroid Build Coastguard Worker             ivd_ctl_getbufinfo_ip_t s_ctl_ip;
2543*495ae853SAndroid Build Coastguard Worker             ivd_ctl_getbufinfo_op_t s_ctl_op;
2544*495ae853SAndroid Build Coastguard Worker             WORD32 outlen = 0;
2545*495ae853SAndroid Build Coastguard Worker 
2546*495ae853SAndroid Build Coastguard Worker             s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
2547*495ae853SAndroid Build Coastguard Worker             s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETBUFINFO;
2548*495ae853SAndroid Build Coastguard Worker             s_ctl_ip.u4_size = sizeof(ivd_ctl_getbufinfo_ip_t);
2549*495ae853SAndroid Build Coastguard Worker             s_ctl_op.u4_size = sizeof(ivd_ctl_getbufinfo_op_t);
2550*495ae853SAndroid Build Coastguard Worker             ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_ip, (void *) &s_ctl_op);
2551*495ae853SAndroid Build Coastguard Worker             if(ret != IV_SUCCESS)
2552*495ae853SAndroid Build Coastguard Worker             {
2553*495ae853SAndroid Build Coastguard Worker                 sprintf(ac_error_str, "Error in Get Buf Info %x", s_ctl_op.u4_error_code);
2554*495ae853SAndroid Build Coastguard Worker                 codec_exit(ac_error_str);
2555*495ae853SAndroid Build Coastguard Worker             }
2556*495ae853SAndroid Build Coastguard Worker 
2557*495ae853SAndroid Build Coastguard Worker             /* Allocate bitstream buffer */
2558*495ae853SAndroid Build Coastguard Worker             u4_ip_buf_len = s_ctl_op.u4_min_in_buf_size[0];
2559*495ae853SAndroid Build Coastguard Worker #ifdef ADAPTIVE_TEST
2560*495ae853SAndroid Build Coastguard Worker             u4_ip_buf_len = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 3 >> 1;
2561*495ae853SAndroid Build Coastguard Worker #endif
2562*495ae853SAndroid Build Coastguard Worker             pu1_bs_buf = (UWORD8 *) malloc(u4_ip_buf_len);
2563*495ae853SAndroid Build Coastguard Worker 
2564*495ae853SAndroid Build Coastguard Worker             if(pu1_bs_buf == NULL)
2565*495ae853SAndroid Build Coastguard Worker             {
2566*495ae853SAndroid Build Coastguard Worker                 sprintf(ac_error_str, "\nAllocation failure for input buffer of i4_size %d",
2567*495ae853SAndroid Build Coastguard Worker                         u4_ip_buf_len);
2568*495ae853SAndroid Build Coastguard Worker                 codec_exit(ac_error_str);
2569*495ae853SAndroid Build Coastguard Worker             }
2570*495ae853SAndroid Build Coastguard Worker 
2571*495ae853SAndroid Build Coastguard Worker             s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
2572*495ae853SAndroid Build Coastguard Worker             /* Allocate output buffer only if display buffers are not shared */
2573*495ae853SAndroid Build Coastguard Worker             /* Or if shared and output is 420P */
2574*495ae853SAndroid Build Coastguard Worker             if((0 == s_app_ctx.u4_share_disp_buf) ||
2575*495ae853SAndroid Build Coastguard Worker                (IV_YUV_420P == s_app_ctx.e_output_chroma_format))
2576*495ae853SAndroid Build Coastguard Worker             {
2577*495ae853SAndroid Build Coastguard Worker #ifdef ADAPTIVE_TEST
2578*495ae853SAndroid Build Coastguard Worker                 switch(s_app_ctx.e_output_chroma_format)
2579*495ae853SAndroid Build Coastguard Worker                 {
2580*495ae853SAndroid Build Coastguard Worker                     case IV_YUV_420P:
2581*495ae853SAndroid Build Coastguard Worker                     {
2582*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT;
2583*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[1] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 2;
2584*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[2] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 2;
2585*495ae853SAndroid Build Coastguard Worker                         break;
2586*495ae853SAndroid Build Coastguard Worker                     }
2587*495ae853SAndroid Build Coastguard Worker                     case IV_YUV_420SP_UV:
2588*495ae853SAndroid Build Coastguard Worker                     case IV_YUV_420SP_VU:
2589*495ae853SAndroid Build Coastguard Worker                     {
2590*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT;
2591*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[1] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 1;
2592*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[2] = 0;
2593*495ae853SAndroid Build Coastguard Worker                         break;
2594*495ae853SAndroid Build Coastguard Worker                     }
2595*495ae853SAndroid Build Coastguard Worker                     case IV_YUV_422ILE:
2596*495ae853SAndroid Build Coastguard Worker                     {
2597*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 2;
2598*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[1] = 0;
2599*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[2] = 0;
2600*495ae853SAndroid Build Coastguard Worker                         break;
2601*495ae853SAndroid Build Coastguard Worker                     }
2602*495ae853SAndroid Build Coastguard Worker                     case IV_RGBA_8888:
2603*495ae853SAndroid Build Coastguard Worker                     {
2604*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 4;
2605*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[1] = 0;
2606*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[2] = 0;
2607*495ae853SAndroid Build Coastguard Worker                         break;
2608*495ae853SAndroid Build Coastguard Worker                     }
2609*495ae853SAndroid Build Coastguard Worker                     case IV_RGB_565:
2610*495ae853SAndroid Build Coastguard Worker                     {
2611*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 2;
2612*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[1] = 0;
2613*495ae853SAndroid Build Coastguard Worker                         s_ctl_op.u4_min_out_buf_size[2] = 0;
2614*495ae853SAndroid Build Coastguard Worker                         break;
2615*495ae853SAndroid Build Coastguard Worker                     }
2616*495ae853SAndroid Build Coastguard Worker                     default:
2617*495ae853SAndroid Build Coastguard Worker                         break;
2618*495ae853SAndroid Build Coastguard Worker                 }
2619*495ae853SAndroid Build Coastguard Worker #endif
2620*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[0] = s_ctl_op.u4_min_out_buf_size[0];
2621*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[1] = s_ctl_op.u4_min_out_buf_size[1];
2622*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[2] = s_ctl_op.u4_min_out_buf_size[2];
2623*495ae853SAndroid Build Coastguard Worker 
2624*495ae853SAndroid Build Coastguard Worker                 outlen = s_ctl_op.u4_min_out_buf_size[0];
2625*495ae853SAndroid Build Coastguard Worker                 if(s_ctl_op.u4_min_num_out_bufs > 1) outlen += s_ctl_op.u4_min_out_buf_size[1];
2626*495ae853SAndroid Build Coastguard Worker 
2627*495ae853SAndroid Build Coastguard Worker                 if(s_ctl_op.u4_min_num_out_bufs > 2) outlen += s_ctl_op.u4_min_out_buf_size[2];
2628*495ae853SAndroid Build Coastguard Worker 
2629*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->pu1_bufs[0] = (UWORD8 *) malloc(outlen);
2630*495ae853SAndroid Build Coastguard Worker                 if(ps_out_buf->pu1_bufs[0] == NULL)
2631*495ae853SAndroid Build Coastguard Worker                 {
2632*495ae853SAndroid Build Coastguard Worker                     sprintf(ac_error_str, "\nAllocation failure for output buffer of i4_size %d",
2633*495ae853SAndroid Build Coastguard Worker                             outlen);
2634*495ae853SAndroid Build Coastguard Worker                     codec_exit(ac_error_str);
2635*495ae853SAndroid Build Coastguard Worker                 }
2636*495ae853SAndroid Build Coastguard Worker 
2637*495ae853SAndroid Build Coastguard Worker                 if(s_ctl_op.u4_min_num_out_bufs > 1)
2638*495ae853SAndroid Build Coastguard Worker                     ps_out_buf->pu1_bufs[1] =
2639*495ae853SAndroid Build Coastguard Worker                         ps_out_buf->pu1_bufs[0] + (s_ctl_op.u4_min_out_buf_size[0]);
2640*495ae853SAndroid Build Coastguard Worker 
2641*495ae853SAndroid Build Coastguard Worker                 if(s_ctl_op.u4_min_num_out_bufs > 2)
2642*495ae853SAndroid Build Coastguard Worker                     ps_out_buf->pu1_bufs[2] =
2643*495ae853SAndroid Build Coastguard Worker                         ps_out_buf->pu1_bufs[1] + (s_ctl_op.u4_min_out_buf_size[1]);
2644*495ae853SAndroid Build Coastguard Worker 
2645*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_num_bufs = s_ctl_op.u4_min_num_out_bufs;
2646*495ae853SAndroid Build Coastguard Worker             }
2647*495ae853SAndroid Build Coastguard Worker 
2648*495ae853SAndroid Build Coastguard Worker #ifdef APP_EXTRA_BUFS
2649*495ae853SAndroid Build Coastguard Worker             s_app_ctx.disp_delay = EXTRA_DISP_BUFFERS;
2650*495ae853SAndroid Build Coastguard Worker             s_ctl_op.u4_num_disp_bufs += EXTRA_DISP_BUFFERS;
2651*495ae853SAndroid Build Coastguard Worker #endif
2652*495ae853SAndroid Build Coastguard Worker 
2653*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
2654*495ae853SAndroid Build Coastguard Worker             /*   API Call: Allocate display buffers for display buffer shared case */
2655*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
2656*495ae853SAndroid Build Coastguard Worker 
2657*495ae853SAndroid Build Coastguard Worker             for(i = 0; i < s_ctl_op.u4_num_disp_bufs; i++)
2658*495ae853SAndroid Build Coastguard Worker             {
2659*495ae853SAndroid Build Coastguard Worker                 s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[0] =
2660*495ae853SAndroid Build Coastguard Worker                     s_ctl_op.u4_min_out_buf_size[0];
2661*495ae853SAndroid Build Coastguard Worker                 s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[1] =
2662*495ae853SAndroid Build Coastguard Worker                     s_ctl_op.u4_min_out_buf_size[1];
2663*495ae853SAndroid Build Coastguard Worker                 s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[2] =
2664*495ae853SAndroid Build Coastguard Worker                     s_ctl_op.u4_min_out_buf_size[2];
2665*495ae853SAndroid Build Coastguard Worker 
2666*495ae853SAndroid Build Coastguard Worker                 outlen = s_ctl_op.u4_min_out_buf_size[0];
2667*495ae853SAndroid Build Coastguard Worker                 if(s_ctl_op.u4_min_num_out_bufs > 1) outlen += s_ctl_op.u4_min_out_buf_size[1];
2668*495ae853SAndroid Build Coastguard Worker 
2669*495ae853SAndroid Build Coastguard Worker                 if(s_ctl_op.u4_min_num_out_bufs > 2) outlen += s_ctl_op.u4_min_out_buf_size[2];
2670*495ae853SAndroid Build Coastguard Worker 
2671*495ae853SAndroid Build Coastguard Worker                 s_app_ctx.s_disp_buffers[i].pu1_bufs[0] = (UWORD8 *) malloc(outlen);
2672*495ae853SAndroid Build Coastguard Worker 
2673*495ae853SAndroid Build Coastguard Worker                 if(s_app_ctx.s_disp_buffers[i].pu1_bufs[0] == NULL)
2674*495ae853SAndroid Build Coastguard Worker                 {
2675*495ae853SAndroid Build Coastguard Worker                     sprintf(ac_error_str, "\nAllocation failure for output buffer of i4_size %d",
2676*495ae853SAndroid Build Coastguard Worker                             outlen);
2677*495ae853SAndroid Build Coastguard Worker                     codec_exit(ac_error_str);
2678*495ae853SAndroid Build Coastguard Worker                 }
2679*495ae853SAndroid Build Coastguard Worker 
2680*495ae853SAndroid Build Coastguard Worker                 if(s_ctl_op.u4_min_num_out_bufs > 1)
2681*495ae853SAndroid Build Coastguard Worker                     s_app_ctx.s_disp_buffers[i].pu1_bufs[1] =
2682*495ae853SAndroid Build Coastguard Worker                         s_app_ctx.s_disp_buffers[i].pu1_bufs[0] + (s_ctl_op.u4_min_out_buf_size[0]);
2683*495ae853SAndroid Build Coastguard Worker 
2684*495ae853SAndroid Build Coastguard Worker                 if(s_ctl_op.u4_min_num_out_bufs > 2)
2685*495ae853SAndroid Build Coastguard Worker                     s_app_ctx.s_disp_buffers[i].pu1_bufs[2] =
2686*495ae853SAndroid Build Coastguard Worker                         s_app_ctx.s_disp_buffers[i].pu1_bufs[1] + (s_ctl_op.u4_min_out_buf_size[1]);
2687*495ae853SAndroid Build Coastguard Worker 
2688*495ae853SAndroid Build Coastguard Worker                 s_app_ctx.s_disp_buffers[i].u4_num_bufs = s_ctl_op.u4_min_num_out_bufs;
2689*495ae853SAndroid Build Coastguard Worker             }
2690*495ae853SAndroid Build Coastguard Worker             s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
2691*495ae853SAndroid Build Coastguard Worker         }
2692*495ae853SAndroid Build Coastguard Worker 
2693*495ae853SAndroid Build Coastguard Worker         /* Create display thread and wait for the display buffers to be initialized*/
2694*495ae853SAndroid Build Coastguard Worker         if(1 == s_app_ctx.display)
2695*495ae853SAndroid Build Coastguard Worker         {
2696*495ae853SAndroid Build Coastguard Worker             if(0 == s_app_ctx.display_thread_created)
2697*495ae853SAndroid Build Coastguard Worker             {
2698*495ae853SAndroid Build Coastguard Worker                 s_app_ctx.display_init_done = 0;
2699*495ae853SAndroid Build Coastguard Worker                 ithread_create(s_app_ctx.display_thread_handle, NULL, (void *) &display_thread,
2700*495ae853SAndroid Build Coastguard Worker                                (void *) &s_app_ctx);
2701*495ae853SAndroid Build Coastguard Worker                 s_app_ctx.display_thread_created = 1;
2702*495ae853SAndroid Build Coastguard Worker 
2703*495ae853SAndroid Build Coastguard Worker                 while(1)
2704*495ae853SAndroid Build Coastguard Worker                 {
2705*495ae853SAndroid Build Coastguard Worker                     if(s_app_ctx.display_init_done) break;
2706*495ae853SAndroid Build Coastguard Worker 
2707*495ae853SAndroid Build Coastguard Worker                     ithread_msleep(1);
2708*495ae853SAndroid Build Coastguard Worker                 }
2709*495ae853SAndroid Build Coastguard Worker             }
2710*495ae853SAndroid Build Coastguard Worker 
2711*495ae853SAndroid Build Coastguard Worker             s_app_ctx.u4_strd = s_app_ctx.get_stride();
2712*495ae853SAndroid Build Coastguard Worker         }
2713*495ae853SAndroid Build Coastguard Worker     }
2714*495ae853SAndroid Build Coastguard Worker 
2715*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2716*495ae853SAndroid Build Coastguard Worker     /* Get actual number of output buffers requried, which is dependent      */
2717*495ae853SAndroid Build Coastguard Worker     /* on ps_bitstrm properties such as width, height and level etc */
2718*495ae853SAndroid Build Coastguard Worker     /* This is needed mainly for shared display mode                         */
2719*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2720*495ae853SAndroid Build Coastguard Worker 
2721*495ae853SAndroid Build Coastguard Worker     /*****************************************************************************/
2722*495ae853SAndroid Build Coastguard Worker     /*   API Call: Send the allocated display buffers to codec */
2723*495ae853SAndroid Build Coastguard Worker     /*****************************************************************************/
2724*495ae853SAndroid Build Coastguard Worker     {
2725*495ae853SAndroid Build Coastguard Worker         ivd_set_display_frame_ip_t s_set_display_frame_ip;
2726*495ae853SAndroid Build Coastguard Worker         ivd_set_display_frame_op_t s_set_display_frame_op;
2727*495ae853SAndroid Build Coastguard Worker 
2728*495ae853SAndroid Build Coastguard Worker         s_set_display_frame_ip.e_cmd = IVD_CMD_SET_DISPLAY_FRAME;
2729*495ae853SAndroid Build Coastguard Worker         s_set_display_frame_ip.u4_size = sizeof(ivd_set_display_frame_ip_t);
2730*495ae853SAndroid Build Coastguard Worker         s_set_display_frame_op.u4_size = sizeof(ivd_set_display_frame_op_t);
2731*495ae853SAndroid Build Coastguard Worker 
2732*495ae853SAndroid Build Coastguard Worker         s_set_display_frame_ip.num_disp_bufs = s_app_ctx.num_disp_buf;
2733*495ae853SAndroid Build Coastguard Worker 
2734*495ae853SAndroid Build Coastguard Worker         memcpy(&(s_set_display_frame_ip.s_disp_buffer), &(s_app_ctx.s_disp_buffers),
2735*495ae853SAndroid Build Coastguard Worker                s_app_ctx.num_disp_buf * sizeof(ivd_out_bufdesc_t));
2736*495ae853SAndroid Build Coastguard Worker 
2737*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_set_display_frame_ip,
2738*495ae853SAndroid Build Coastguard Worker                                (void *) &s_set_display_frame_op);
2739*495ae853SAndroid Build Coastguard Worker 
2740*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS != ret)
2741*495ae853SAndroid Build Coastguard Worker         {
2742*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "Error in Set display frame");
2743*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2744*495ae853SAndroid Build Coastguard Worker         }
2745*495ae853SAndroid Build Coastguard Worker     }
2746*495ae853SAndroid Build Coastguard Worker 
2747*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2748*495ae853SAndroid Build Coastguard Worker     /* Get frame dimensions for display buffers such as x_offset,y_offset    */
2749*495ae853SAndroid Build Coastguard Worker     /* etc. This information might be needed to set display buffer           */
2750*495ae853SAndroid Build Coastguard Worker     /* offsets in case of shared display buffer mode                         */
2751*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2752*495ae853SAndroid Build Coastguard Worker     {
2753*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_get_frame_dimensions_ip_t s_ctl_get_frame_dimensions_ip;
2754*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_get_frame_dimensions_op_t s_ctl_get_frame_dimensions_op;
2755*495ae853SAndroid Build Coastguard Worker 
2756*495ae853SAndroid Build Coastguard Worker         s_ctl_get_frame_dimensions_ip.e_cmd = IVD_CMD_VIDEO_CTL;
2757*495ae853SAndroid Build Coastguard Worker         s_ctl_get_frame_dimensions_ip.e_sub_cmd =
2758*495ae853SAndroid Build Coastguard Worker             (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_BUFFER_DIMENSIONS;
2759*495ae853SAndroid Build Coastguard Worker         s_ctl_get_frame_dimensions_ip.u4_size = sizeof(isvcd_ctl_get_frame_dimensions_ip_t);
2760*495ae853SAndroid Build Coastguard Worker         s_ctl_get_frame_dimensions_op.u4_size = sizeof(isvcd_ctl_get_frame_dimensions_op_t);
2761*495ae853SAndroid Build Coastguard Worker 
2762*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_get_frame_dimensions_ip,
2763*495ae853SAndroid Build Coastguard Worker                                (void *) &s_ctl_get_frame_dimensions_op);
2764*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS != ret)
2765*495ae853SAndroid Build Coastguard Worker         {
2766*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "Error in Get buffer Dimensions");
2767*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
2768*495ae853SAndroid Build Coastguard Worker         }
2769*495ae853SAndroid Build Coastguard Worker     }
2770*495ae853SAndroid Build Coastguard Worker 
2771*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2772*495ae853SAndroid Build Coastguard Worker     /* Get VUI parameters                                                    */
2773*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2774*495ae853SAndroid Build Coastguard Worker     {
2775*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip;
2776*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_get_vui_params_op_t s_ctl_get_vui_params_op;
2777*495ae853SAndroid Build Coastguard Worker 
2778*495ae853SAndroid Build Coastguard Worker         s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
2779*495ae853SAndroid Build Coastguard Worker         s_ctl_get_vui_params_ip.e_sub_cmd =
2780*495ae853SAndroid Build Coastguard Worker             (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_VUI_PARAMS;
2781*495ae853SAndroid Build Coastguard Worker         s_ctl_get_vui_params_ip.u4_size = sizeof(isvcd_ctl_get_vui_params_ip_t);
2782*495ae853SAndroid Build Coastguard Worker         s_ctl_get_vui_params_op.u4_size = sizeof(isvcd_ctl_get_vui_params_op_t);
2783*495ae853SAndroid Build Coastguard Worker 
2784*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_get_vui_params_ip,
2785*495ae853SAndroid Build Coastguard Worker                                (void *) &s_ctl_get_vui_params_op);
2786*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS != ret)
2787*495ae853SAndroid Build Coastguard Worker         {
2788*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "Error in Get VUI params");
2789*495ae853SAndroid Build Coastguard Worker             // codec_exit(ac_error_str);
2790*495ae853SAndroid Build Coastguard Worker         }
2791*495ae853SAndroid Build Coastguard Worker     }
2792*495ae853SAndroid Build Coastguard Worker 
2793*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2794*495ae853SAndroid Build Coastguard Worker     /* Set the decoder in frame decode mode. It was set in header decode     */
2795*495ae853SAndroid Build Coastguard Worker     /* mode earlier                                                          */
2796*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2797*495ae853SAndroid Build Coastguard Worker     {
2798*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_set_config_ip_t s_h264d_ctl_ip = {};
2799*495ae853SAndroid Build Coastguard Worker         isvcd_ctl_set_config_op_t s_h264d_ctl_op = {};
2800*495ae853SAndroid Build Coastguard Worker         ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
2801*495ae853SAndroid Build Coastguard Worker         ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
2802*495ae853SAndroid Build Coastguard Worker 
2803*495ae853SAndroid Build Coastguard Worker         ps_ctl_ip->u4_disp_wd = STRIDE;
2804*495ae853SAndroid Build Coastguard Worker         if(1 == s_app_ctx.display) ps_ctl_ip->u4_disp_wd = s_app_ctx.get_stride();
2805*495ae853SAndroid Build Coastguard Worker         ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
2806*495ae853SAndroid Build Coastguard Worker 
2807*495ae853SAndroid Build Coastguard Worker         ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
2808*495ae853SAndroid Build Coastguard Worker         ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
2809*495ae853SAndroid Build Coastguard Worker         ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
2810*495ae853SAndroid Build Coastguard Worker         ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
2811*495ae853SAndroid Build Coastguard Worker         ps_ctl_ip->u4_size = sizeof(isvcd_ctl_set_config_ip_t);
2812*495ae853SAndroid Build Coastguard Worker 
2813*495ae853SAndroid Build Coastguard Worker         ps_ctl_op->u4_size = sizeof(isvcd_ctl_set_config_op_t);
2814*495ae853SAndroid Build Coastguard Worker 
2815*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_ctl_ip,
2816*495ae853SAndroid Build Coastguard Worker                                (void *) &s_h264d_ctl_op);
2817*495ae853SAndroid Build Coastguard Worker 
2818*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS != ret)
2819*495ae853SAndroid Build Coastguard Worker         {
2820*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "Error in Set Parameters");
2821*495ae853SAndroid Build Coastguard Worker             // codec_exit(ac_error_str);
2822*495ae853SAndroid Build Coastguard Worker         }
2823*495ae853SAndroid Build Coastguard Worker     }
2824*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2825*495ae853SAndroid Build Coastguard Worker     /* If required disable deblocking and sao at given level                 */
2826*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
2827*495ae853SAndroid Build Coastguard Worker 
2828*495ae853SAndroid Build Coastguard Worker     set_degrade(codec_obj, s_app_ctx.i4_degrade_type, s_app_ctx.i4_degrade_pics);
2829*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
2830*495ae853SAndroid Build Coastguard Worker     QueryPerformanceFrequency(&frequency);
2831*495ae853SAndroid Build Coastguard Worker #endif
2832*495ae853SAndroid Build Coastguard Worker #ifndef PRINT_PICSIZE
2833*495ae853SAndroid Build Coastguard Worker     get_version(codec_obj);
2834*495ae853SAndroid Build Coastguard Worker #endif
2835*495ae853SAndroid Build Coastguard Worker 
2836*495ae853SAndroid Build Coastguard Worker     max_op_frm_ts = s_app_ctx.u4_max_frm_ts + s_app_ctx.disp_delay;
2837*495ae853SAndroid Build Coastguard Worker 
2838*495ae853SAndroid Build Coastguard Worker     if(max_op_frm_ts < s_app_ctx.disp_delay)
2839*495ae853SAndroid Build Coastguard Worker         max_op_frm_ts = 0xffffffff; /* clip as overflow has occured*/
2840*495ae853SAndroid Build Coastguard Worker 
2841*495ae853SAndroid Build Coastguard Worker     max_op_frm_ts = (s_app_ctx.u4_max_frm_ts > 0) ? (max_op_frm_ts) : 0xffffffff;
2842*495ae853SAndroid Build Coastguard Worker 
2843*495ae853SAndroid Build Coastguard Worker     u4_num_disp_bufs_with_dec = 0;
2844*495ae853SAndroid Build Coastguard Worker 
2845*495ae853SAndroid Build Coastguard Worker     while(u4_op_frm_ts < max_op_frm_ts)
2846*495ae853SAndroid Build Coastguard Worker     {
2847*495ae853SAndroid Build Coastguard Worker #ifdef TEST_FLUSH
2848*495ae853SAndroid Build Coastguard Worker         if(u4_ip_frm_ts == FLUSH_FRM_CNT)
2849*495ae853SAndroid Build Coastguard Worker         {
2850*495ae853SAndroid Build Coastguard Worker             ivd_ctl_flush_ip_t s_ctl_ip;
2851*495ae853SAndroid Build Coastguard Worker             ivd_ctl_flush_op_t s_ctl_op;
2852*495ae853SAndroid Build Coastguard Worker 
2853*495ae853SAndroid Build Coastguard Worker             s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
2854*495ae853SAndroid Build Coastguard Worker             s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH;
2855*495ae853SAndroid Build Coastguard Worker             s_ctl_ip.u4_size = sizeof(ivd_ctl_flush_ip_t);
2856*495ae853SAndroid Build Coastguard Worker             s_ctl_op.u4_size = sizeof(ivd_ctl_flush_op_t);
2857*495ae853SAndroid Build Coastguard Worker             ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_ip, (void *) &s_ctl_op);
2858*495ae853SAndroid Build Coastguard Worker 
2859*495ae853SAndroid Build Coastguard Worker             if(ret != IV_SUCCESS)
2860*495ae853SAndroid Build Coastguard Worker             {
2861*495ae853SAndroid Build Coastguard Worker                 printf("Error in Setting the decoder in flush mode\n");
2862*495ae853SAndroid Build Coastguard Worker             }
2863*495ae853SAndroid Build Coastguard Worker             //            file_pos = 0;
2864*495ae853SAndroid Build Coastguard Worker 
2865*495ae853SAndroid Build Coastguard Worker             //          fseek(ps_ip_file, file_pos, SEEK_SET);
2866*495ae853SAndroid Build Coastguard Worker         }
2867*495ae853SAndroid Build Coastguard Worker #endif
2868*495ae853SAndroid Build Coastguard Worker         if(u4_num_disp_bufs_with_dec < s_app_ctx.num_disp_buf)
2869*495ae853SAndroid Build Coastguard Worker         {
2870*495ae853SAndroid Build Coastguard Worker             release_disp_frame(codec_obj, u4_num_disp_bufs_with_dec);
2871*495ae853SAndroid Build Coastguard Worker             u4_num_disp_bufs_with_dec++;
2872*495ae853SAndroid Build Coastguard Worker         }
2873*495ae853SAndroid Build Coastguard Worker 
2874*495ae853SAndroid Build Coastguard Worker         /*************************************************************************/
2875*495ae853SAndroid Build Coastguard Worker         /* set num of cores                                                      */
2876*495ae853SAndroid Build Coastguard Worker         /*************************************************************************/
2877*495ae853SAndroid Build Coastguard Worker #ifdef DYNAMIC_NUMCORES
2878*495ae853SAndroid Build Coastguard Worker         {
2879*495ae853SAndroid Build Coastguard Worker             isvcd_ctl_set_num_cores_ip_t s_ctl_set_cores_ip;
2880*495ae853SAndroid Build Coastguard Worker             isvcd_ctl_set_num_cores_op_t s_ctl_set_cores_op;
2881*495ae853SAndroid Build Coastguard Worker 
2882*495ae853SAndroid Build Coastguard Worker             s_ctl_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
2883*495ae853SAndroid Build Coastguard Worker             s_ctl_set_cores_ip.e_sub_cmd = IH264D_CMD_CTL_SET_NUM_CORES;
2884*495ae853SAndroid Build Coastguard Worker             s_ctl_set_cores_ip.u4_num_cores = 1 + 3 * (u4_ip_frm_ts % 2);
2885*495ae853SAndroid Build Coastguard Worker             s_ctl_set_cores_ip.u4_size = sizeof(isvcd_ctl_set_num_cores_ip_t);
2886*495ae853SAndroid Build Coastguard Worker             s_ctl_set_cores_op.u4_size = sizeof(isvcd_ctl_set_num_cores_op_t);
2887*495ae853SAndroid Build Coastguard Worker 
2888*495ae853SAndroid Build Coastguard Worker             ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_set_cores_ip,
2889*495ae853SAndroid Build Coastguard Worker                                    (void *) &s_ctl_set_cores_op);
2890*495ae853SAndroid Build Coastguard Worker             if(ret != IV_SUCCESS)
2891*495ae853SAndroid Build Coastguard Worker             {
2892*495ae853SAndroid Build Coastguard Worker                 sprintf(ac_error_str, "\nError in setting number of cores");
2893*495ae853SAndroid Build Coastguard Worker                 codec_exit(ac_error_str);
2894*495ae853SAndroid Build Coastguard Worker             }
2895*495ae853SAndroid Build Coastguard Worker         }
2896*495ae853SAndroid Build Coastguard Worker #endif
2897*495ae853SAndroid Build Coastguard Worker         /***********************************************************************/
2898*495ae853SAndroid Build Coastguard Worker         /*   Seek the file to start of current frame, this is equavelent of    */
2899*495ae853SAndroid Build Coastguard Worker         /*   having a parcer which tells the start of current frame            */
2900*495ae853SAndroid Build Coastguard Worker         /***********************************************************************/
2901*495ae853SAndroid Build Coastguard Worker         {
2902*495ae853SAndroid Build Coastguard Worker             WORD32 numbytes;
2903*495ae853SAndroid Build Coastguard Worker 
2904*495ae853SAndroid Build Coastguard Worker             if(0 == s_app_ctx.u4_piclen_flag)
2905*495ae853SAndroid Build Coastguard Worker             {
2906*495ae853SAndroid Build Coastguard Worker                 fseek(ps_ip_file, file_pos, SEEK_SET);
2907*495ae853SAndroid Build Coastguard Worker                 numbytes = u4_ip_buf_len;
2908*495ae853SAndroid Build Coastguard Worker             }
2909*495ae853SAndroid Build Coastguard Worker             else
2910*495ae853SAndroid Build Coastguard Worker             {
2911*495ae853SAndroid Build Coastguard Worker                 WORD32 entries;
2912*495ae853SAndroid Build Coastguard Worker                 entries = fscanf(ps_piclen_file, "%d\n", &numbytes);
2913*495ae853SAndroid Build Coastguard Worker                 if(1 != entries) numbytes = u4_ip_buf_len;
2914*495ae853SAndroid Build Coastguard Worker             }
2915*495ae853SAndroid Build Coastguard Worker 
2916*495ae853SAndroid Build Coastguard Worker             u4_bytes_remaining = (WORD32) fread(pu1_bs_buf, sizeof(UWORD8), numbytes, ps_ip_file);
2917*495ae853SAndroid Build Coastguard Worker 
2918*495ae853SAndroid Build Coastguard Worker             // AUD_PIC_BOUNDARY
2919*495ae853SAndroid Build Coastguard Worker             if((1 == s_app_ctx.u4_piclen_flag) && (u4_bytes_remaining > 0))
2920*495ae853SAndroid Build Coastguard Worker             {
2921*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x00;
2922*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2923*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x00;
2924*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2925*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x00;
2926*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2927*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x01;
2928*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2929*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x09;
2930*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2931*495ae853SAndroid Build Coastguard Worker                 *(pu1_bs_buf + numbytes) = 0x10;
2932*495ae853SAndroid Build Coastguard Worker                 numbytes++;
2933*495ae853SAndroid Build Coastguard Worker 
2934*495ae853SAndroid Build Coastguard Worker                 u4_bytes_remaining += 6;
2935*495ae853SAndroid Build Coastguard Worker             }
2936*495ae853SAndroid Build Coastguard Worker 
2937*495ae853SAndroid Build Coastguard Worker             if(u4_bytes_remaining == 0)
2938*495ae853SAndroid Build Coastguard Worker             {
2939*495ae853SAndroid Build Coastguard Worker                 if(1 == s_app_ctx.loopback)
2940*495ae853SAndroid Build Coastguard Worker                 {
2941*495ae853SAndroid Build Coastguard Worker                     file_pos = 0;
2942*495ae853SAndroid Build Coastguard Worker                     if(0 == s_app_ctx.u4_piclen_flag)
2943*495ae853SAndroid Build Coastguard Worker                     {
2944*495ae853SAndroid Build Coastguard Worker                         fseek(ps_ip_file, file_pos, SEEK_SET);
2945*495ae853SAndroid Build Coastguard Worker                         numbytes = u4_ip_buf_len;
2946*495ae853SAndroid Build Coastguard Worker                     }
2947*495ae853SAndroid Build Coastguard Worker                     else
2948*495ae853SAndroid Build Coastguard Worker                     {
2949*495ae853SAndroid Build Coastguard Worker                         WORD32 entries;
2950*495ae853SAndroid Build Coastguard Worker                         entries = fscanf(ps_piclen_file, "%d\n", &numbytes);
2951*495ae853SAndroid Build Coastguard Worker                         if(1 != entries) numbytes = u4_ip_buf_len;
2952*495ae853SAndroid Build Coastguard Worker                     }
2953*495ae853SAndroid Build Coastguard Worker 
2954*495ae853SAndroid Build Coastguard Worker                     u4_bytes_remaining =
2955*495ae853SAndroid Build Coastguard Worker                         (WORD32) fread(pu1_bs_buf, sizeof(UWORD8), numbytes, ps_ip_file);
2956*495ae853SAndroid Build Coastguard Worker                 }
2957*495ae853SAndroid Build Coastguard Worker                 else
2958*495ae853SAndroid Build Coastguard Worker                     break;
2959*495ae853SAndroid Build Coastguard Worker             }
2960*495ae853SAndroid Build Coastguard Worker         }
2961*495ae853SAndroid Build Coastguard Worker 
2962*495ae853SAndroid Build Coastguard Worker         /*********************************************************************/
2963*495ae853SAndroid Build Coastguard Worker         /* Following calls can be enabled at diffent times                   */
2964*495ae853SAndroid Build Coastguard Worker         /*********************************************************************/
2965*495ae853SAndroid Build Coastguard Worker #if ENABLE_DEGRADE
2966*495ae853SAndroid Build Coastguard Worker         if(u4_op_frm_ts >= 10000) disable_deblocking(codec_obj, 4);
2967*495ae853SAndroid Build Coastguard Worker 
2968*495ae853SAndroid Build Coastguard Worker         if(u4_op_frm_ts == 30000) enable_deblocking(codec_obj);
2969*495ae853SAndroid Build Coastguard Worker 
2970*495ae853SAndroid Build Coastguard Worker         if(u4_op_frm_ts == 10000) enable_skippb_frames(codec_obj);
2971*495ae853SAndroid Build Coastguard Worker 
2972*495ae853SAndroid Build Coastguard Worker         if(u4_op_frm_ts == 60000) disable_skippb_frames(codec_obj);
2973*495ae853SAndroid Build Coastguard Worker 
2974*495ae853SAndroid Build Coastguard Worker         if(u4_op_frm_ts == 30000) enable_skipb_frames(codec_obj);
2975*495ae853SAndroid Build Coastguard Worker 
2976*495ae853SAndroid Build Coastguard Worker         if(u4_op_frm_ts == 60000) disable_skipb_frames(codec_obj);
2977*495ae853SAndroid Build Coastguard Worker #endif
2978*495ae853SAndroid Build Coastguard Worker 
2979*495ae853SAndroid Build Coastguard Worker         {
2980*495ae853SAndroid Build Coastguard Worker             isvcd_video_decode_ip_t s_h264d_decode_ip = {};
2981*495ae853SAndroid Build Coastguard Worker             isvcd_video_decode_op_t s_h264d_decode_op = {};
2982*495ae853SAndroid Build Coastguard Worker             ivd_video_decode_ip_t *ps_video_decode_ip = &s_h264d_decode_ip.s_ivd_video_decode_ip_t;
2983*495ae853SAndroid Build Coastguard Worker             ivd_video_decode_op_t *ps_video_decode_op = &s_h264d_decode_op.s_ivd_video_decode_op_t;
2984*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
2985*495ae853SAndroid Build Coastguard Worker             UWORD32 s_elapsed_time;
2986*495ae853SAndroid Build Coastguard Worker             TIMER s_start_timer;
2987*495ae853SAndroid Build Coastguard Worker             TIMER s_end_timer;
2988*495ae853SAndroid Build Coastguard Worker #endif
2989*495ae853SAndroid Build Coastguard Worker 
2990*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
2991*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_ts = u4_ip_frm_ts;
2992*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->pv_stream_buffer = pu1_bs_buf;
2993*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_num_Bytes = u4_bytes_remaining;
2994*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->u4_size = sizeof(isvcd_video_decode_ip_t);
2995*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[0] =
2996*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[0];
2997*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[1] =
2998*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[1];
2999*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[2] =
3000*495ae853SAndroid Build Coastguard Worker                 ps_out_buf->u4_min_out_buf_size[2];
3001*495ae853SAndroid Build Coastguard Worker 
3002*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.pu1_bufs[0] = ps_out_buf->pu1_bufs[0];
3003*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.pu1_bufs[1] = ps_out_buf->pu1_bufs[1];
3004*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.pu1_bufs[2] = ps_out_buf->pu1_bufs[2];
3005*495ae853SAndroid Build Coastguard Worker             ps_video_decode_ip->s_out_buffer.u4_num_bufs = ps_out_buf->u4_num_bufs;
3006*495ae853SAndroid Build Coastguard Worker             ps_video_decode_op->u4_size = sizeof(isvcd_video_decode_op_t);
3007*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.pu1_8x8_blk_qp_map = pu1_qp_map_buf;
3008*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.pu1_8x8_blk_type_map = pu1_blk_type_map_buf;
3009*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.u4_8x8_blk_qp_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
3010*495ae853SAndroid Build Coastguard Worker             s_h264d_decode_ip.u4_8x8_blk_type_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
3011*495ae853SAndroid Build Coastguard Worker 
3012*495ae853SAndroid Build Coastguard Worker             /* Get display buffer pointers */
3013*495ae853SAndroid Build Coastguard Worker             if(1 == s_app_ctx.display)
3014*495ae853SAndroid Build Coastguard Worker             {
3015*495ae853SAndroid Build Coastguard Worker                 WORD32 wr_idx;
3016*495ae853SAndroid Build Coastguard Worker 
3017*495ae853SAndroid Build Coastguard Worker                 wr_idx = dispq_producer_dequeue(&s_app_ctx);
3018*495ae853SAndroid Build Coastguard Worker 
3019*495ae853SAndroid Build Coastguard Worker                 if(s_app_ctx.quit) break;
3020*495ae853SAndroid Build Coastguard Worker 
3021*495ae853SAndroid Build Coastguard Worker                 s_app_ctx.set_disp_buffers(s_app_ctx.pv_disp_ctx, wr_idx,
3022*495ae853SAndroid Build Coastguard Worker                                            &ps_video_decode_ip->s_out_buffer.pu1_bufs[0],
3023*495ae853SAndroid Build Coastguard Worker                                            &ps_video_decode_ip->s_out_buffer.pu1_bufs[1],
3024*495ae853SAndroid Build Coastguard Worker                                            &ps_video_decode_ip->s_out_buffer.pu1_bufs[2]);
3025*495ae853SAndroid Build Coastguard Worker             }
3026*495ae853SAndroid Build Coastguard Worker 
3027*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
3028*495ae853SAndroid Build Coastguard Worker             /*   API Call: Video Decode */
3029*495ae853SAndroid Build Coastguard Worker             /*****************************************************************************/
3030*495ae853SAndroid Build Coastguard Worker 
3031*495ae853SAndroid Build Coastguard Worker             GETTIME(&s_start_timer);
3032*495ae853SAndroid Build Coastguard Worker 
3033*495ae853SAndroid Build Coastguard Worker             ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_h264d_decode_ip,
3034*495ae853SAndroid Build Coastguard Worker                                    (void *) &s_h264d_decode_op);
3035*495ae853SAndroid Build Coastguard Worker 
3036*495ae853SAndroid Build Coastguard Worker             GETTIME(&s_end_timer);
3037*495ae853SAndroid Build Coastguard Worker             ELAPSEDTIME(s_start_timer, s_end_timer, s_elapsed_time, frequency);
3038*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
3039*495ae853SAndroid Build Coastguard Worker             {
3040*495ae853SAndroid Build Coastguard Worker                 UWORD32 peak_avg, id;
3041*495ae853SAndroid Build Coastguard Worker                 u4_tot_cycles += s_elapsed_time;
3042*495ae853SAndroid Build Coastguard Worker                 peak_window[peak_window_idx++] = s_elapsed_time;
3043*495ae853SAndroid Build Coastguard Worker                 if(peak_window_idx == PEAK_WINDOW_SIZE) peak_window_idx = 0;
3044*495ae853SAndroid Build Coastguard Worker                 peak_avg = 0;
3045*495ae853SAndroid Build Coastguard Worker                 for(id = 0; id < PEAK_WINDOW_SIZE; id++)
3046*495ae853SAndroid Build Coastguard Worker                 {
3047*495ae853SAndroid Build Coastguard Worker                     peak_avg += peak_window[id];
3048*495ae853SAndroid Build Coastguard Worker                 }
3049*495ae853SAndroid Build Coastguard Worker                 peak_avg /= PEAK_WINDOW_SIZE;
3050*495ae853SAndroid Build Coastguard Worker                 if(peak_avg > peak_avg_max) peak_avg_max = peak_avg;
3051*495ae853SAndroid Build Coastguard Worker                 frm_cnt++;
3052*495ae853SAndroid Build Coastguard Worker 
3053*495ae853SAndroid Build Coastguard Worker                 printf(
3054*495ae853SAndroid Build Coastguard Worker                     "FrameNum: %4d TimeTaken(microsec): %6d AvgTime: %6d "
3055*495ae853SAndroid Build Coastguard Worker                     "PeakAvgTimeMax: %6d Output: %2d NumBytes: %6d \n",
3056*495ae853SAndroid Build Coastguard Worker                     frm_cnt, s_elapsed_time, u4_tot_cycles / frm_cnt, peak_avg_max,
3057*495ae853SAndroid Build Coastguard Worker                     ps_video_decode_op->u4_output_present,
3058*495ae853SAndroid Build Coastguard Worker                     ps_video_decode_op->u4_num_bytes_consumed);
3059*495ae853SAndroid Build Coastguard Worker             }
3060*495ae853SAndroid Build Coastguard Worker #else
3061*495ae853SAndroid Build Coastguard Worker             printf("%d\n", ps_video_decode_op->u4_num_bytes_consumed);
3062*495ae853SAndroid Build Coastguard Worker #endif
3063*495ae853SAndroid Build Coastguard Worker 
3064*495ae853SAndroid Build Coastguard Worker             if(ret != IV_SUCCESS)
3065*495ae853SAndroid Build Coastguard Worker             {
3066*495ae853SAndroid Build Coastguard Worker                 printf("Error in video Frame decode : ret %x Error %x\n", ret,
3067*495ae853SAndroid Build Coastguard Worker                        ps_video_decode_op->u4_error_code);
3068*495ae853SAndroid Build Coastguard Worker             }
3069*495ae853SAndroid Build Coastguard Worker 
3070*495ae853SAndroid Build Coastguard Worker             if((IV_SUCCESS != ret) &&
3071*495ae853SAndroid Build Coastguard Worker                ((ps_video_decode_op->u4_error_code & 0xFF) == IVD_RES_CHANGED))
3072*495ae853SAndroid Build Coastguard Worker             {
3073*495ae853SAndroid Build Coastguard Worker                 ivd_ctl_reset_ip_t s_ctl_ip;
3074*495ae853SAndroid Build Coastguard Worker                 ivd_ctl_reset_op_t s_ctl_op;
3075*495ae853SAndroid Build Coastguard Worker 
3076*495ae853SAndroid Build Coastguard Worker                 flush_output(codec_obj, &s_app_ctx, ps_out_buf, pu1_bs_buf, &u4_op_frm_ts,
3077*495ae853SAndroid Build Coastguard Worker                              ps_op_file, ps_qp_file, ps_mb_type_file, pu1_qp_map_buf,
3078*495ae853SAndroid Build Coastguard Worker                              pu1_blk_type_map_buf, ps_op_chksum_file, u4_ip_frm_ts,
3079*495ae853SAndroid Build Coastguard Worker                              u4_bytes_remaining);
3080*495ae853SAndroid Build Coastguard Worker 
3081*495ae853SAndroid Build Coastguard Worker                 s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
3082*495ae853SAndroid Build Coastguard Worker                 s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET;
3083*495ae853SAndroid Build Coastguard Worker                 s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t);
3084*495ae853SAndroid Build Coastguard Worker                 s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t);
3085*495ae853SAndroid Build Coastguard Worker 
3086*495ae853SAndroid Build Coastguard Worker                 ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_ip,
3087*495ae853SAndroid Build Coastguard Worker                                        (void *) &s_ctl_op);
3088*495ae853SAndroid Build Coastguard Worker                 if(IV_SUCCESS != ret)
3089*495ae853SAndroid Build Coastguard Worker                 {
3090*495ae853SAndroid Build Coastguard Worker                     sprintf(ac_error_str, "Error in Reset");
3091*495ae853SAndroid Build Coastguard Worker                     codec_exit(ac_error_str);
3092*495ae853SAndroid Build Coastguard Worker                 }
3093*495ae853SAndroid Build Coastguard Worker 
3094*495ae853SAndroid Build Coastguard Worker                 /*when reset all buffers are released by lib*/
3095*495ae853SAndroid Build Coastguard Worker                 u4_num_disp_bufs_with_dec = 0;
3096*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
3097*495ae853SAndroid Build Coastguard Worker                 /* set num of cores */
3098*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
3099*495ae853SAndroid Build Coastguard Worker                 {
3100*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_num_cores_ip_t s_ctl_set_cores_ip;
3101*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_num_cores_op_t s_ctl_set_cores_op;
3102*495ae853SAndroid Build Coastguard Worker 
3103*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
3104*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_cores_ip.e_sub_cmd =
3105*495ae853SAndroid Build Coastguard Worker                         (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_SET_NUM_CORES;
3106*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_cores_ip.u4_num_cores = s_app_ctx.u4_num_cores;
3107*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_cores_ip.u4_size = sizeof(isvcd_ctl_set_num_cores_ip_t);
3108*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_cores_op.u4_size = sizeof(isvcd_ctl_set_num_cores_op_t);
3109*495ae853SAndroid Build Coastguard Worker 
3110*495ae853SAndroid Build Coastguard Worker                     ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_set_cores_ip,
3111*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_set_cores_op);
3112*495ae853SAndroid Build Coastguard Worker                     if(ret != IV_SUCCESS)
3113*495ae853SAndroid Build Coastguard Worker                     {
3114*495ae853SAndroid Build Coastguard Worker                         sprintf(ac_error_str, "\nError in setting number of cores");
3115*495ae853SAndroid Build Coastguard Worker                         codec_exit(ac_error_str);
3116*495ae853SAndroid Build Coastguard Worker                     }
3117*495ae853SAndroid Build Coastguard Worker                 }
3118*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
3119*495ae853SAndroid Build Coastguard Worker                 /* set processsor */
3120*495ae853SAndroid Build Coastguard Worker                 /*************************************************************************/
3121*495ae853SAndroid Build Coastguard Worker 
3122*495ae853SAndroid Build Coastguard Worker                 {
3123*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_processor_ip_t s_ctl_set_num_processor_ip;
3124*495ae853SAndroid Build Coastguard Worker                     isvcd_ctl_set_processor_op_t s_ctl_set_num_processor_op;
3125*495ae853SAndroid Build Coastguard Worker 
3126*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_num_processor_ip.e_cmd = IVD_CMD_VIDEO_CTL;
3127*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_num_processor_ip.e_sub_cmd =
3128*495ae853SAndroid Build Coastguard Worker                         (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_SET_PROCESSOR;
3129*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_num_processor_ip.u4_arch = s_app_ctx.e_arch;
3130*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_num_processor_ip.u4_soc = s_app_ctx.e_soc;
3131*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_num_processor_ip.u4_size = sizeof(isvcd_ctl_set_processor_ip_t);
3132*495ae853SAndroid Build Coastguard Worker                     s_ctl_set_num_processor_op.u4_size = sizeof(isvcd_ctl_set_processor_op_t);
3133*495ae853SAndroid Build Coastguard Worker 
3134*495ae853SAndroid Build Coastguard Worker                     ret = ivd_api_function((iv_obj_t *) codec_obj,
3135*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_set_num_processor_ip,
3136*495ae853SAndroid Build Coastguard Worker                                            (void *) &s_ctl_set_num_processor_op);
3137*495ae853SAndroid Build Coastguard Worker                     if(ret != IV_SUCCESS)
3138*495ae853SAndroid Build Coastguard Worker                     {
3139*495ae853SAndroid Build Coastguard Worker                         sprintf(ac_error_str, "\nError in setting Processor type");
3140*495ae853SAndroid Build Coastguard Worker                         codec_exit(ac_error_str);
3141*495ae853SAndroid Build Coastguard Worker                     }
3142*495ae853SAndroid Build Coastguard Worker                 }
3143*495ae853SAndroid Build Coastguard Worker             }
3144*495ae853SAndroid Build Coastguard Worker 
3145*495ae853SAndroid Build Coastguard Worker             /*************************************************************************/
3146*495ae853SAndroid Build Coastguard Worker             /* Get SEI MDCV parameters                                               */
3147*495ae853SAndroid Build Coastguard Worker             /*************************************************************************/
3148*495ae853SAndroid Build Coastguard Worker             if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_mdcv_params_present_flag)
3149*495ae853SAndroid Build Coastguard Worker             {
3150*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_get_sei_mdcv_params_ip_t s_ctl_get_sei_mdcv_params_ip;
3151*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_get_sei_mdcv_params_op_t s_ctl_get_sei_mdcv_params_op;
3152*495ae853SAndroid Build Coastguard Worker 
3153*495ae853SAndroid Build Coastguard Worker                 memset(&s_ctl_get_sei_mdcv_params_ip, 0,
3154*495ae853SAndroid Build Coastguard Worker                        sizeof(isvcd_ctl_get_sei_mdcv_params_ip_t));
3155*495ae853SAndroid Build Coastguard Worker                 memset(&s_ctl_get_sei_mdcv_params_op, 0,
3156*495ae853SAndroid Build Coastguard Worker                        sizeof(isvcd_ctl_get_sei_mdcv_params_op_t));
3157*495ae853SAndroid Build Coastguard Worker 
3158*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_mdcv_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
3159*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_mdcv_params_ip.e_sub_cmd =
3160*495ae853SAndroid Build Coastguard Worker                     (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS;
3161*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_mdcv_params_ip.u4_size = sizeof(isvcd_ctl_get_sei_mdcv_params_ip_t);
3162*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_mdcv_params_op.u4_size = sizeof(isvcd_ctl_get_sei_mdcv_params_op_t);
3163*495ae853SAndroid Build Coastguard Worker 
3164*495ae853SAndroid Build Coastguard Worker                 ret =
3165*495ae853SAndroid Build Coastguard Worker                     ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_get_sei_mdcv_params_ip,
3166*495ae853SAndroid Build Coastguard Worker                                      (void *) &s_ctl_get_sei_mdcv_params_op);
3167*495ae853SAndroid Build Coastguard Worker 
3168*495ae853SAndroid Build Coastguard Worker                 if(IV_SUCCESS != ret)
3169*495ae853SAndroid Build Coastguard Worker                 {
3170*495ae853SAndroid Build Coastguard Worker                     printf("MDCV SEI params not present : Error %x\n",
3171*495ae853SAndroid Build Coastguard Worker                            s_ctl_get_sei_mdcv_params_op.u4_error_code);
3172*495ae853SAndroid Build Coastguard Worker                 }
3173*495ae853SAndroid Build Coastguard Worker             }
3174*495ae853SAndroid Build Coastguard Worker             /*************************************************************************/
3175*495ae853SAndroid Build Coastguard Worker             /* Get SEI CLL parameters                                                */
3176*495ae853SAndroid Build Coastguard Worker             /*************************************************************************/
3177*495ae853SAndroid Build Coastguard Worker             if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_cll_params_present_flag)
3178*495ae853SAndroid Build Coastguard Worker             {
3179*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_get_sei_cll_params_ip_t s_ctl_get_sei_cll_params_ip;
3180*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_get_sei_cll_params_op_t s_ctl_get_sei_cll_params_op;
3181*495ae853SAndroid Build Coastguard Worker 
3182*495ae853SAndroid Build Coastguard Worker                 memset(&s_ctl_get_sei_cll_params_ip, 0, sizeof(isvcd_ctl_get_sei_cll_params_ip_t));
3183*495ae853SAndroid Build Coastguard Worker                 memset(&s_ctl_get_sei_cll_params_op, 0, sizeof(isvcd_ctl_get_sei_cll_params_op_t));
3184*495ae853SAndroid Build Coastguard Worker 
3185*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_cll_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
3186*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_cll_params_ip.e_sub_cmd =
3187*495ae853SAndroid Build Coastguard Worker                     (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_CLL_PARAMS;
3188*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_cll_params_ip.u4_size = sizeof(isvcd_ctl_get_sei_cll_params_ip_t);
3189*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_cll_params_op.u4_size = sizeof(isvcd_ctl_get_sei_cll_params_op_t);
3190*495ae853SAndroid Build Coastguard Worker 
3191*495ae853SAndroid Build Coastguard Worker                 ret =
3192*495ae853SAndroid Build Coastguard Worker                     ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_get_sei_cll_params_ip,
3193*495ae853SAndroid Build Coastguard Worker                                      (void *) &s_ctl_get_sei_cll_params_op);
3194*495ae853SAndroid Build Coastguard Worker 
3195*495ae853SAndroid Build Coastguard Worker                 if(IV_SUCCESS != ret)
3196*495ae853SAndroid Build Coastguard Worker                 {
3197*495ae853SAndroid Build Coastguard Worker                     printf("CLL SEI params not present : Error %x\n",
3198*495ae853SAndroid Build Coastguard Worker                            s_ctl_get_sei_cll_params_op.u4_error_code);
3199*495ae853SAndroid Build Coastguard Worker                 }
3200*495ae853SAndroid Build Coastguard Worker             }
3201*495ae853SAndroid Build Coastguard Worker             /*************************************************************************/
3202*495ae853SAndroid Build Coastguard Worker             /* Get SEI AVE parameters                                                */
3203*495ae853SAndroid Build Coastguard Worker             /*************************************************************************/
3204*495ae853SAndroid Build Coastguard Worker             if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_ave_params_present_flag)
3205*495ae853SAndroid Build Coastguard Worker             {
3206*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_get_sei_ave_params_ip_t s_ctl_get_sei_ave_params_ip;
3207*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_get_sei_ave_params_op_t s_ctl_get_sei_ave_params_op;
3208*495ae853SAndroid Build Coastguard Worker 
3209*495ae853SAndroid Build Coastguard Worker                 memset(&s_ctl_get_sei_ave_params_ip, 0, sizeof(isvcd_ctl_get_sei_ave_params_ip_t));
3210*495ae853SAndroid Build Coastguard Worker                 memset(&s_ctl_get_sei_ave_params_op, 0, sizeof(isvcd_ctl_get_sei_ave_params_op_t));
3211*495ae853SAndroid Build Coastguard Worker 
3212*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_ave_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
3213*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_ave_params_ip.e_sub_cmd =
3214*495ae853SAndroid Build Coastguard Worker                     (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_AVE_PARAMS;
3215*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_ave_params_ip.u4_size = sizeof(isvcd_ctl_get_sei_ave_params_ip_t);
3216*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_ave_params_op.u4_size = sizeof(isvcd_ctl_get_sei_ave_params_op_t);
3217*495ae853SAndroid Build Coastguard Worker 
3218*495ae853SAndroid Build Coastguard Worker                 ret =
3219*495ae853SAndroid Build Coastguard Worker                     ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_get_sei_ave_params_ip,
3220*495ae853SAndroid Build Coastguard Worker                                      (void *) &s_ctl_get_sei_ave_params_op);
3221*495ae853SAndroid Build Coastguard Worker 
3222*495ae853SAndroid Build Coastguard Worker                 if(IV_SUCCESS != ret)
3223*495ae853SAndroid Build Coastguard Worker                 {
3224*495ae853SAndroid Build Coastguard Worker                     printf("AVE SEI params not present : Error %x\n",
3225*495ae853SAndroid Build Coastguard Worker                            s_ctl_get_sei_ave_params_op.u4_error_code);
3226*495ae853SAndroid Build Coastguard Worker                 }
3227*495ae853SAndroid Build Coastguard Worker             }
3228*495ae853SAndroid Build Coastguard Worker             /*************************************************************************/
3229*495ae853SAndroid Build Coastguard Worker             /* Get SEI CCV parameters                                                */
3230*495ae853SAndroid Build Coastguard Worker             /*************************************************************************/
3231*495ae853SAndroid Build Coastguard Worker             if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_ccv_params_present_flag)
3232*495ae853SAndroid Build Coastguard Worker             {
3233*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_get_sei_ccv_params_ip_t s_ctl_get_sei_ccv_params_ip;
3234*495ae853SAndroid Build Coastguard Worker                 isvcd_ctl_get_sei_ccv_params_op_t s_ctl_get_sei_ccv_params_op;
3235*495ae853SAndroid Build Coastguard Worker 
3236*495ae853SAndroid Build Coastguard Worker                 memset(&s_ctl_get_sei_ccv_params_ip, 0, sizeof(isvcd_ctl_get_sei_ccv_params_ip_t));
3237*495ae853SAndroid Build Coastguard Worker                 memset(&s_ctl_get_sei_ccv_params_op, 0, sizeof(isvcd_ctl_get_sei_ccv_params_op_t));
3238*495ae853SAndroid Build Coastguard Worker 
3239*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_ccv_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
3240*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_ccv_params_ip.e_sub_cmd =
3241*495ae853SAndroid Build Coastguard Worker                     (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_CCV_PARAMS;
3242*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_ccv_params_ip.u4_size = sizeof(isvcd_ctl_get_sei_ccv_params_ip_t);
3243*495ae853SAndroid Build Coastguard Worker                 s_ctl_get_sei_ccv_params_op.u4_size = sizeof(isvcd_ctl_get_sei_ccv_params_op_t);
3244*495ae853SAndroid Build Coastguard Worker 
3245*495ae853SAndroid Build Coastguard Worker                 ret =
3246*495ae853SAndroid Build Coastguard Worker                     ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_get_sei_ccv_params_ip,
3247*495ae853SAndroid Build Coastguard Worker                                      (void *) &s_ctl_get_sei_ccv_params_op);
3248*495ae853SAndroid Build Coastguard Worker 
3249*495ae853SAndroid Build Coastguard Worker                 if(IV_SUCCESS != ret)
3250*495ae853SAndroid Build Coastguard Worker                 {
3251*495ae853SAndroid Build Coastguard Worker                     printf("CCV SEI params not present : Error %x\n",
3252*495ae853SAndroid Build Coastguard Worker                            s_ctl_get_sei_ccv_params_op.u4_error_code);
3253*495ae853SAndroid Build Coastguard Worker                 }
3254*495ae853SAndroid Build Coastguard Worker             }
3255*495ae853SAndroid Build Coastguard Worker 
3256*495ae853SAndroid Build Coastguard Worker             if((1 == s_app_ctx.display) && (1 == ps_video_decode_op->u4_output_present))
3257*495ae853SAndroid Build Coastguard Worker             {
3258*495ae853SAndroid Build Coastguard Worker                 dispq_producer_queue(&s_app_ctx);
3259*495ae853SAndroid Build Coastguard Worker             }
3260*495ae853SAndroid Build Coastguard Worker 
3261*495ae853SAndroid Build Coastguard Worker             if(IV_B_FRAME == ps_video_decode_op->e_pic_type) s_app_ctx.b_pic_present |= 1;
3262*495ae853SAndroid Build Coastguard Worker 
3263*495ae853SAndroid Build Coastguard Worker             u4_num_bytes_dec = ps_video_decode_op->u4_num_bytes_consumed;
3264*495ae853SAndroid Build Coastguard Worker 
3265*495ae853SAndroid Build Coastguard Worker             file_pos += u4_num_bytes_dec;
3266*495ae853SAndroid Build Coastguard Worker             total_bytes_comsumed += u4_num_bytes_dec;
3267*495ae853SAndroid Build Coastguard Worker             u4_ip_frm_ts++;
3268*495ae853SAndroid Build Coastguard Worker 
3269*495ae853SAndroid Build Coastguard Worker             if(1 == ps_video_decode_op->u4_output_present)
3270*495ae853SAndroid Build Coastguard Worker             {
3271*495ae853SAndroid Build Coastguard Worker                 CHAR cur_fname[1000];
3272*495ae853SAndroid Build Coastguard Worker                 CHAR *extn = NULL;
3273*495ae853SAndroid Build Coastguard Worker                 /* The objective is to dump the decoded frames into separate files instead
3274*495ae853SAndroid Build Coastguard Worker                  * of dumping all the frames in one common file. Also, the number of
3275*495ae853SAndroid Build Coastguard Worker                  * dumped frames at any given instance of time cannot exceed
3276*495ae853SAndroid Build Coastguard Worker                  * 'frame_memory'
3277*495ae853SAndroid Build Coastguard Worker                  */
3278*495ae853SAndroid Build Coastguard Worker                 if(s_app_ctx.u4_file_save_flag)
3279*495ae853SAndroid Build Coastguard Worker                 {
3280*495ae853SAndroid Build Coastguard Worker                     /* Locate the position of extension yuv */
3281*495ae853SAndroid Build Coastguard Worker                     extn = strstr(s_app_ctx.ac_op_fname, "%d");
3282*495ae853SAndroid Build Coastguard Worker                     if(extn != NULL)
3283*495ae853SAndroid Build Coastguard Worker                     {
3284*495ae853SAndroid Build Coastguard Worker                         output_write_stall(s_app_ctx.ac_op_fname, u4_op_frm_ts);
3285*495ae853SAndroid Build Coastguard Worker                         /* Generate output file names */
3286*495ae853SAndroid Build Coastguard Worker                         sprintf(cur_fname, s_app_ctx.ac_op_fname, u4_op_frm_ts);
3287*495ae853SAndroid Build Coastguard Worker                         /* Open Output file */
3288*495ae853SAndroid Build Coastguard Worker                         ps_op_file = fopen(cur_fname, "wb");
3289*495ae853SAndroid Build Coastguard Worker                         if(NULL == ps_op_file)
3290*495ae853SAndroid Build Coastguard Worker                         {
3291*495ae853SAndroid Build Coastguard Worker                             snprintf(ac_error_str, sizeof(ac_error_str),
3292*495ae853SAndroid Build Coastguard Worker                                      "Could not open output file %s", cur_fname);
3293*495ae853SAndroid Build Coastguard Worker 
3294*495ae853SAndroid Build Coastguard Worker                             codec_exit(ac_error_str);
3295*495ae853SAndroid Build Coastguard Worker                         }
3296*495ae853SAndroid Build Coastguard Worker                     }
3297*495ae853SAndroid Build Coastguard Worker                 }
3298*495ae853SAndroid Build Coastguard Worker 
3299*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
3300*495ae853SAndroid Build Coastguard Worker                 width = ps_video_decode_op->s_disp_frm_buf.u4_y_wd;
3301*495ae853SAndroid Build Coastguard Worker                 height = ps_video_decode_op->s_disp_frm_buf.u4_y_ht;
3302*495ae853SAndroid Build Coastguard Worker #endif
3303*495ae853SAndroid Build Coastguard Worker                 dump_output(&s_app_ctx, &(ps_video_decode_op->s_disp_frm_buf), &s_h264d_decode_op,
3304*495ae853SAndroid Build Coastguard Worker                             ps_video_decode_op->u4_disp_buf_id, ps_op_file, ps_qp_file,
3305*495ae853SAndroid Build Coastguard Worker                             ps_mb_type_file, ps_op_chksum_file, u4_op_frm_ts,
3306*495ae853SAndroid Build Coastguard Worker                             s_app_ctx.u4_file_save_flag, s_app_ctx.u4_chksum_save_flag,
3307*495ae853SAndroid Build Coastguard Worker                             s_app_ctx.u4_frame_info_enable);
3308*495ae853SAndroid Build Coastguard Worker 
3309*495ae853SAndroid Build Coastguard Worker                 u4_op_frm_ts++;
3310*495ae853SAndroid Build Coastguard Worker                 if(extn != NULL) fclose(ps_op_file);
3311*495ae853SAndroid Build Coastguard Worker             }
3312*495ae853SAndroid Build Coastguard Worker             else
3313*495ae853SAndroid Build Coastguard Worker             {
3314*495ae853SAndroid Build Coastguard Worker                 if((ps_video_decode_op->u4_error_code >> IVD_FATALERROR) & 1)
3315*495ae853SAndroid Build Coastguard Worker                 {
3316*495ae853SAndroid Build Coastguard Worker                     printf("Fatal error\n");
3317*495ae853SAndroid Build Coastguard Worker                     break;
3318*495ae853SAndroid Build Coastguard Worker                 }
3319*495ae853SAndroid Build Coastguard Worker             }
3320*495ae853SAndroid Build Coastguard Worker         }
3321*495ae853SAndroid Build Coastguard Worker     }
3322*495ae853SAndroid Build Coastguard Worker 
3323*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
3324*495ae853SAndroid Build Coastguard Worker     /*      To get the last decoded frames, call process with NULL input    */
3325*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
3326*495ae853SAndroid Build Coastguard Worker     flush_output(codec_obj, &s_app_ctx, ps_out_buf, pu1_bs_buf, &u4_op_frm_ts, ps_op_file,
3327*495ae853SAndroid Build Coastguard Worker                  ps_qp_file, ps_mb_type_file, pu1_qp_map_buf, pu1_blk_type_map_buf,
3328*495ae853SAndroid Build Coastguard Worker                  ps_op_chksum_file, u4_ip_frm_ts, u4_bytes_remaining);
3329*495ae853SAndroid Build Coastguard Worker 
3330*495ae853SAndroid Build Coastguard Worker     /* set disp_end u4_flag */
3331*495ae853SAndroid Build Coastguard Worker     s_app_ctx.quit = 1;
3332*495ae853SAndroid Build Coastguard Worker 
3333*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
3334*495ae853SAndroid Build Coastguard Worker     printf("Summary\n");
3335*495ae853SAndroid Build Coastguard Worker     printf("Input filename                  : %s\n", s_app_ctx.ac_ip_fname);
3336*495ae853SAndroid Build Coastguard Worker     printf("Output Width                    : %-4d\n", width);
3337*495ae853SAndroid Build Coastguard Worker     printf("Output Height                   : %-4d\n", height);
3338*495ae853SAndroid Build Coastguard Worker 
3339*495ae853SAndroid Build Coastguard Worker     if(frm_cnt)
3340*495ae853SAndroid Build Coastguard Worker     {
3341*495ae853SAndroid Build Coastguard Worker         double avg = u4_tot_cycles / frm_cnt;
3342*495ae853SAndroid Build Coastguard Worker         double bytes_avg = total_bytes_comsumed / frm_cnt;
3343*495ae853SAndroid Build Coastguard Worker         double bitrate = (bytes_avg * 8 * s_app_ctx.fps) / 1000000;
3344*495ae853SAndroid Build Coastguard Worker         printf("Bitrate @ %2d fps(mbps)          : %-6.2f\n", s_app_ctx.fps, bitrate);
3345*495ae853SAndroid Build Coastguard Worker         printf("Average decode time(micro sec)  : %-6d\n", (WORD32) avg);
3346*495ae853SAndroid Build Coastguard Worker         printf("Avg Peak decode time(%2d frames) : %-6d\n", PEAK_WINDOW_SIZE,
3347*495ae853SAndroid Build Coastguard Worker                (WORD32) peak_avg_max);
3348*495ae853SAndroid Build Coastguard Worker         avg = (u4_tot_cycles + u4_tot_fmt_cycles) * 1.0 / frm_cnt;
3349*495ae853SAndroid Build Coastguard Worker 
3350*495ae853SAndroid Build Coastguard Worker         if(0 == s_app_ctx.u4_share_disp_buf)
3351*495ae853SAndroid Build Coastguard Worker             printf("FPS achieved (with format conv) : %-3.2f\n", 1000000 / avg);
3352*495ae853SAndroid Build Coastguard Worker         else
3353*495ae853SAndroid Build Coastguard Worker             printf("FPS achieved                    : %-3.2f\n", 1000000 / avg);
3354*495ae853SAndroid Build Coastguard Worker     }
3355*495ae853SAndroid Build Coastguard Worker #endif
3356*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
3357*495ae853SAndroid Build Coastguard Worker     /*   Clear the decoder, close all the files, free all the memory       */
3358*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
3359*495ae853SAndroid Build Coastguard Worker     if(1 == s_app_ctx.display)
3360*495ae853SAndroid Build Coastguard Worker     {
3361*495ae853SAndroid Build Coastguard Worker         s_app_ctx.display_deinit_flag = 1;
3362*495ae853SAndroid Build Coastguard Worker         /* wait for display to finish */
3363*495ae853SAndroid Build Coastguard Worker         if(s_app_ctx.display_thread_created)
3364*495ae853SAndroid Build Coastguard Worker         {
3365*495ae853SAndroid Build Coastguard Worker             ithread_join(s_app_ctx.display_thread_handle, NULL);
3366*495ae853SAndroid Build Coastguard Worker         }
3367*495ae853SAndroid Build Coastguard Worker         free(s_app_ctx.display_thread_handle);
3368*495ae853SAndroid Build Coastguard Worker     }
3369*495ae853SAndroid Build Coastguard Worker 
3370*495ae853SAndroid Build Coastguard Worker     {
3371*495ae853SAndroid Build Coastguard Worker         ivd_delete_ip_t s_delete_dec_ip;
3372*495ae853SAndroid Build Coastguard Worker         ivd_delete_op_t s_delete_dec_op;
3373*495ae853SAndroid Build Coastguard Worker 
3374*495ae853SAndroid Build Coastguard Worker         s_delete_dec_ip.e_cmd = IVD_CMD_DELETE;
3375*495ae853SAndroid Build Coastguard Worker         s_delete_dec_ip.u4_size = sizeof(ivd_delete_ip_t);
3376*495ae853SAndroid Build Coastguard Worker         s_delete_dec_op.u4_size = sizeof(ivd_delete_op_t);
3377*495ae853SAndroid Build Coastguard Worker 
3378*495ae853SAndroid Build Coastguard Worker         ret = ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_delete_dec_ip,
3379*495ae853SAndroid Build Coastguard Worker                                (void *) &s_delete_dec_op);
3380*495ae853SAndroid Build Coastguard Worker 
3381*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS != ret)
3382*495ae853SAndroid Build Coastguard Worker         {
3383*495ae853SAndroid Build Coastguard Worker             sprintf(ac_error_str, "Error in Codec delete");
3384*495ae853SAndroid Build Coastguard Worker             codec_exit(ac_error_str);
3385*495ae853SAndroid Build Coastguard Worker         }
3386*495ae853SAndroid Build Coastguard Worker     }
3387*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
3388*495ae853SAndroid Build Coastguard Worker     /*              Close all the files and free all the memory            */
3389*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
3390*495ae853SAndroid Build Coastguard Worker     {
3391*495ae853SAndroid Build Coastguard Worker         fclose(ps_ip_file);
3392*495ae853SAndroid Build Coastguard Worker 
3393*495ae853SAndroid Build Coastguard Worker         if((1 == s_app_ctx.u4_file_save_flag) && (strstr(s_app_ctx.ac_op_fname, "%d") == NULL))
3394*495ae853SAndroid Build Coastguard Worker         {
3395*495ae853SAndroid Build Coastguard Worker             fclose(ps_op_file);
3396*495ae853SAndroid Build Coastguard Worker         }
3397*495ae853SAndroid Build Coastguard Worker         if(1 == s_app_ctx.u4_chksum_save_flag)
3398*495ae853SAndroid Build Coastguard Worker         {
3399*495ae853SAndroid Build Coastguard Worker             fclose(ps_op_chksum_file);
3400*495ae853SAndroid Build Coastguard Worker         }
3401*495ae853SAndroid Build Coastguard Worker         if(1 == s_app_ctx.u4_frame_info_enable)
3402*495ae853SAndroid Build Coastguard Worker         {
3403*495ae853SAndroid Build Coastguard Worker             if(NULL != ps_qp_file)
3404*495ae853SAndroid Build Coastguard Worker             {
3405*495ae853SAndroid Build Coastguard Worker                 fclose(ps_qp_file);
3406*495ae853SAndroid Build Coastguard Worker             }
3407*495ae853SAndroid Build Coastguard Worker             if(NULL != ps_mb_type_file)
3408*495ae853SAndroid Build Coastguard Worker             {
3409*495ae853SAndroid Build Coastguard Worker                 fclose(ps_mb_type_file);
3410*495ae853SAndroid Build Coastguard Worker             }
3411*495ae853SAndroid Build Coastguard Worker         }
3412*495ae853SAndroid Build Coastguard Worker     }
3413*495ae853SAndroid Build Coastguard Worker 
3414*495ae853SAndroid Build Coastguard Worker     if(0 == s_app_ctx.u4_share_disp_buf)
3415*495ae853SAndroid Build Coastguard Worker     {
3416*495ae853SAndroid Build Coastguard Worker         free(ps_out_buf->pu1_bufs[0]);
3417*495ae853SAndroid Build Coastguard Worker     }
3418*495ae853SAndroid Build Coastguard Worker 
3419*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < s_app_ctx.num_disp_buf; i++)
3420*495ae853SAndroid Build Coastguard Worker     {
3421*495ae853SAndroid Build Coastguard Worker         free(s_app_ctx.s_disp_buffers[i].pu1_bufs[0]);
3422*495ae853SAndroid Build Coastguard Worker     }
3423*495ae853SAndroid Build Coastguard Worker 
3424*495ae853SAndroid Build Coastguard Worker     free(ps_out_buf);
3425*495ae853SAndroid Build Coastguard Worker     free(pu1_bs_buf);
3426*495ae853SAndroid Build Coastguard Worker     if(1 == s_app_ctx.u4_frame_info_enable)
3427*495ae853SAndroid Build Coastguard Worker     {
3428*495ae853SAndroid Build Coastguard Worker         if(pu1_qp_map_buf)
3429*495ae853SAndroid Build Coastguard Worker         {
3430*495ae853SAndroid Build Coastguard Worker             free(pu1_qp_map_buf);
3431*495ae853SAndroid Build Coastguard Worker         }
3432*495ae853SAndroid Build Coastguard Worker         if(pu1_blk_type_map_buf)
3433*495ae853SAndroid Build Coastguard Worker         {
3434*495ae853SAndroid Build Coastguard Worker             free(pu1_blk_type_map_buf);
3435*495ae853SAndroid Build Coastguard Worker         }
3436*495ae853SAndroid Build Coastguard Worker     }
3437*495ae853SAndroid Build Coastguard Worker 
3438*495ae853SAndroid Build Coastguard Worker     if(s_app_ctx.display_thread_handle) free(s_app_ctx.display_thread_handle);
3439*495ae853SAndroid Build Coastguard Worker 
3440*495ae853SAndroid Build Coastguard Worker     return (0);
3441*495ae853SAndroid Build Coastguard Worker }
3442