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