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