xref: /aosp_15_r20/external/libavc/examples/mvcdec/main.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker  *
3*495ae853SAndroid Build Coastguard Worker  * Copyright (C) 2021 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker  *
5*495ae853SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker  *
9*495ae853SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker  *
11*495ae853SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker  * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker  *
17*495ae853SAndroid Build Coastguard Worker  *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker  */
20*495ae853SAndroid Build Coastguard Worker 
21*495ae853SAndroid Build Coastguard Worker #include <stdio.h>
22*495ae853SAndroid Build Coastguard Worker #include <string.h>
23*495ae853SAndroid Build Coastguard Worker #include <stdlib.h>
24*495ae853SAndroid Build Coastguard Worker #include <stdint.h>
25*495ae853SAndroid Build Coastguard Worker #include <sys/time.h>
26*495ae853SAndroid Build Coastguard Worker 
27*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
28*495ae853SAndroid Build Coastguard Worker #include "iv.h"
29*495ae853SAndroid Build Coastguard Worker #include "ivd.h"
30*495ae853SAndroid Build Coastguard Worker #include "imvcd.h"
31*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
32*495ae853SAndroid Build Coastguard Worker #include "ih264d.h"
33*495ae853SAndroid Build Coastguard Worker #include "ithread.h"
34*495ae853SAndroid Build Coastguard Worker 
35*495ae853SAndroid Build Coastguard Worker /* Constants */
36*495ae853SAndroid Build Coastguard Worker #define DEFAULT_NON_DEGRADE_INTERVAL 4
37*495ae853SAndroid Build Coastguard Worker 
38*495ae853SAndroid Build Coastguard Worker #define MAX_DISP_BUFFERS 64
39*495ae853SAndroid Build Coastguard Worker 
40*495ae853SAndroid Build Coastguard Worker #define STRLENGTH 1000
41*495ae853SAndroid Build Coastguard Worker 
42*495ae853SAndroid Build Coastguard Worker #define PEAK_WINDOW_SIZE 8
43*495ae853SAndroid Build Coastguard Worker 
44*495ae853SAndroid Build Coastguard Worker #define DEFAULT_COLOR_FORMAT IV_YUV_420P
45*495ae853SAndroid Build Coastguard Worker 
46*495ae853SAndroid Build Coastguard Worker #define DEFAULT_NUM_CORES 1
47*495ae853SAndroid Build Coastguard Worker 
48*495ae853SAndroid Build Coastguard Worker #define MAX_ARG_SHORTNAME_LENGTH 4
49*495ae853SAndroid Build Coastguard Worker 
50*495ae853SAndroid Build Coastguard Worker #define MAX_ARG_NAME_LENGTH 128
51*495ae853SAndroid Build Coastguard Worker 
52*495ae853SAndroid Build Coastguard Worker #define MAX_ARG_DESC_LENGTH 512
53*495ae853SAndroid Build Coastguard Worker 
54*495ae853SAndroid Build Coastguard Worker #define MAX_NUM_VIEWS 6
55*495ae853SAndroid Build Coastguard Worker 
56*495ae853SAndroid Build Coastguard Worker #undef PROFILE_ENABLE
57*495ae853SAndroid Build Coastguard Worker 
58*495ae853SAndroid Build Coastguard Worker /* Macro functions */
59*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
60*495ae853SAndroid Build Coastguard Worker #define GETTIME(timer) gettimeofday(timer, NULL);
61*495ae853SAndroid Build Coastguard Worker 
62*495ae853SAndroid Build Coastguard Worker #define ELAPSEDTIME(s_start_timer, s_end_timer, s_elapsed_time, frequency)     \
63*495ae853SAndroid Build Coastguard Worker     s_elapsed_time = ((s_end_timer.tv_sec - s_start_timer.tv_sec) * 1000000) + \
64*495ae853SAndroid Build Coastguard Worker                      (s_end_timer.tv_usec - s_start_timer.tv_usec);
65*495ae853SAndroid Build Coastguard Worker #else
66*495ae853SAndroid Build Coastguard Worker #define GETTIME(timer)
67*495ae853SAndroid Build Coastguard Worker #define ELAPSEDTIME(s_start_timer, s_end_timer, s_elapsed_time, frequency)
68*495ae853SAndroid Build Coastguard Worker #endif
69*495ae853SAndroid Build Coastguard Worker 
70*495ae853SAndroid Build Coastguard Worker /* Typedefs */
71*495ae853SAndroid Build Coastguard Worker typedef enum ARGUMENT_T
72*495ae853SAndroid Build Coastguard Worker {
73*495ae853SAndroid Build Coastguard Worker     INVALID,
74*495ae853SAndroid Build Coastguard Worker     HELP,
75*495ae853SAndroid Build Coastguard Worker     INPUT_FILE,
76*495ae853SAndroid Build Coastguard Worker     OUTPUT,
77*495ae853SAndroid Build Coastguard Worker     CHKSUM,
78*495ae853SAndroid Build Coastguard Worker     SAVE_OUTPUT,
79*495ae853SAndroid Build Coastguard Worker     SAVE_CHKSUM,
80*495ae853SAndroid Build Coastguard Worker     NUM_FRAMES,
81*495ae853SAndroid Build Coastguard Worker     NUM_CORES,
82*495ae853SAndroid Build Coastguard Worker     DISABLE_DEBLOCK_LEVEL,
83*495ae853SAndroid Build Coastguard Worker     LOOPBACK,
84*495ae853SAndroid Build Coastguard Worker     CONFIG,
85*495ae853SAndroid Build Coastguard Worker     DEGRADE_TYPE,
86*495ae853SAndroid Build Coastguard Worker     DEGRADE_PICS,
87*495ae853SAndroid Build Coastguard Worker     ARCH
88*495ae853SAndroid Build Coastguard Worker } ARGUMENT_T;
89*495ae853SAndroid Build Coastguard Worker 
90*495ae853SAndroid Build Coastguard Worker typedef enum COMPONENT_TYPES_T
91*495ae853SAndroid Build Coastguard Worker {
92*495ae853SAndroid Build Coastguard Worker     Y = 0,
93*495ae853SAndroid Build Coastguard Worker     UV = 1,
94*495ae853SAndroid Build Coastguard Worker     U = 1,
95*495ae853SAndroid Build Coastguard Worker     V = 2,
96*495ae853SAndroid Build Coastguard Worker     NUM_SP_COMPONENTS = 2,
97*495ae853SAndroid Build Coastguard Worker     NUM_COMPONENTS = 3
98*495ae853SAndroid Build Coastguard Worker } COMPONENT_TYPES_T;
99*495ae853SAndroid Build Coastguard Worker 
100*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
101*495ae853SAndroid Build Coastguard Worker typedef struct timeval TIMER;
102*495ae853SAndroid Build Coastguard Worker #else
103*495ae853SAndroid Build Coastguard Worker typedef WORD32 TIMER;
104*495ae853SAndroid Build Coastguard Worker #endif
105*495ae853SAndroid Build Coastguard Worker 
106*495ae853SAndroid Build Coastguard Worker typedef struct mvc_app_files_t
107*495ae853SAndroid Build Coastguard Worker {
108*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_ip_fname[STRLENGTH];
109*495ae853SAndroid Build Coastguard Worker 
110*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_op_fname[STRLENGTH];
111*495ae853SAndroid Build Coastguard Worker 
112*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_op_chksum_fname[STRLENGTH];
113*495ae853SAndroid Build Coastguard Worker 
114*495ae853SAndroid Build Coastguard Worker     UWORD32 au4_disp_frm_id_queue[MAX_DISP_BUFFERS];
115*495ae853SAndroid Build Coastguard Worker } mvc_app_files_t;
116*495ae853SAndroid Build Coastguard Worker 
117*495ae853SAndroid Build Coastguard Worker typedef struct mvc_dec_ctx_t
118*495ae853SAndroid Build Coastguard Worker {
119*495ae853SAndroid Build Coastguard Worker     mvc_app_files_t s_mvc_app_files;
120*495ae853SAndroid Build Coastguard Worker 
121*495ae853SAndroid Build Coastguard Worker     imvcd_get_buf_info_op_t s_disp_buf_props;
122*495ae853SAndroid Build Coastguard Worker 
123*495ae853SAndroid Build Coastguard Worker     iv_yuv_buf_t as_view_disp_bufs[MAX_NUM_VIEWS];
124*495ae853SAndroid Build Coastguard Worker 
125*495ae853SAndroid Build Coastguard Worker     iv_obj_t *ps_codec_obj;
126*495ae853SAndroid Build Coastguard Worker 
127*495ae853SAndroid Build Coastguard Worker     IV_COLOR_FORMAT_T e_output_chroma_format;
128*495ae853SAndroid Build Coastguard Worker 
129*495ae853SAndroid Build Coastguard Worker     IVD_ARCH_T e_arch;
130*495ae853SAndroid Build Coastguard Worker 
131*495ae853SAndroid Build Coastguard Worker     IVD_SOC_T e_soc;
132*495ae853SAndroid Build Coastguard Worker 
133*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_max_frm_ts;
134*495ae853SAndroid Build Coastguard Worker 
135*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_disable_dblk_level;
136*495ae853SAndroid Build Coastguard Worker 
137*495ae853SAndroid Build Coastguard Worker     WORD32 i4_degrade_type;
138*495ae853SAndroid Build Coastguard Worker 
139*495ae853SAndroid Build Coastguard Worker     WORD32 i4_degrade_pics;
140*495ae853SAndroid Build Coastguard Worker 
141*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_cores;
142*495ae853SAndroid Build Coastguard Worker 
143*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_disp_delay;
144*495ae853SAndroid Build Coastguard Worker 
145*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_fps;
146*495ae853SAndroid Build Coastguard Worker 
147*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_pic_wd;
148*495ae853SAndroid Build Coastguard Worker 
149*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_pic_ht;
150*495ae853SAndroid Build Coastguard Worker 
151*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_loopback;
152*495ae853SAndroid Build Coastguard Worker 
153*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_file_save_flag;
154*495ae853SAndroid Build Coastguard Worker 
155*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_chksum_save_flag;
156*495ae853SAndroid Build Coastguard Worker 
157*495ae853SAndroid Build Coastguard Worker     UWORD8 u1_quit;
158*495ae853SAndroid Build Coastguard Worker 
159*495ae853SAndroid Build Coastguard Worker } mvc_dec_ctx_t;
160*495ae853SAndroid Build Coastguard Worker 
161*495ae853SAndroid Build Coastguard Worker typedef struct argument_t
162*495ae853SAndroid Build Coastguard Worker {
163*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_argument_shortname[MAX_ARG_SHORTNAME_LENGTH];
164*495ae853SAndroid Build Coastguard Worker 
165*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_argument_name[MAX_ARG_NAME_LENGTH];
166*495ae853SAndroid Build Coastguard Worker 
167*495ae853SAndroid Build Coastguard Worker     ARGUMENT_T e_argument;
168*495ae853SAndroid Build Coastguard Worker 
169*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_description[MAX_ARG_DESC_LENGTH];
170*495ae853SAndroid Build Coastguard Worker 
171*495ae853SAndroid Build Coastguard Worker } argument_t;
172*495ae853SAndroid Build Coastguard Worker 
173*495ae853SAndroid Build Coastguard Worker /* Function declarations */
174*495ae853SAndroid Build Coastguard Worker #ifndef MD5_DISABLE
175*495ae853SAndroid Build Coastguard Worker void calc_md5_cksum(UWORD8 *pu1_inbuf, UWORD32 u4_stride, UWORD32 u4_width, UWORD32 u4_height,
176*495ae853SAndroid Build Coastguard Worker                     UWORD8 *pu1_cksum_p);
177*495ae853SAndroid Build Coastguard Worker #else
178*495ae853SAndroid Build Coastguard Worker #define calc_md5_cksum(a, b, c, d, e)
179*495ae853SAndroid Build Coastguard Worker #endif
180*495ae853SAndroid Build Coastguard Worker 
mvcd_aligned_malloc(void * pv_ctxt,WORD32 alignment,WORD32 i4_size)181*495ae853SAndroid Build Coastguard Worker static inline void *mvcd_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
182*495ae853SAndroid Build Coastguard Worker {
183*495ae853SAndroid Build Coastguard Worker     void *buf = NULL;
184*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
185*495ae853SAndroid Build Coastguard Worker     if(0 != posix_memalign(&buf, alignment, i4_size))
186*495ae853SAndroid Build Coastguard Worker     {
187*495ae853SAndroid Build Coastguard Worker         return NULL;
188*495ae853SAndroid Build Coastguard Worker     }
189*495ae853SAndroid Build Coastguard Worker     return buf;
190*495ae853SAndroid Build Coastguard Worker }
191*495ae853SAndroid Build Coastguard Worker 
mvcd_aligned_free(void * pv_ctxt,void * pv_buf)192*495ae853SAndroid Build Coastguard Worker static inline void mvcd_aligned_free(void *pv_ctxt, void *pv_buf)
193*495ae853SAndroid Build Coastguard Worker {
194*495ae853SAndroid Build Coastguard Worker     (void) pv_ctxt;
195*495ae853SAndroid Build Coastguard Worker     free(pv_buf);
196*495ae853SAndroid Build Coastguard Worker     return;
197*495ae853SAndroid Build Coastguard Worker }
198*495ae853SAndroid Build Coastguard Worker 
199*495ae853SAndroid Build Coastguard Worker static const argument_t argument_mapping[] = {
200*495ae853SAndroid Build Coastguard Worker     {"-h", "--help", HELP, "Print this help\n"},
201*495ae853SAndroid Build Coastguard Worker     {"-c", "--config", CONFIG, "config file (Default: test.cfg)\n"},
202*495ae853SAndroid Build Coastguard Worker     {"-i", "--input", INPUT_FILE, "Input file\n"},
203*495ae853SAndroid Build Coastguard Worker     {"-o", "--output", OUTPUT, "Output file\n"},
204*495ae853SAndroid Build Coastguard Worker     {"--", "--chksum", CHKSUM, "Output MD5 Checksum file\n"},
205*495ae853SAndroid Build Coastguard Worker     {"-s", "--save_output", SAVE_OUTPUT, "Save Output file\n"},
206*495ae853SAndroid Build Coastguard Worker     {"--", "--save_chksum", SAVE_CHKSUM, "Save Check sum file\n"},
207*495ae853SAndroid Build Coastguard Worker     {"-n", "--num_frames", NUM_FRAMES, "Number of frames to be decoded\n"},
208*495ae853SAndroid Build Coastguard Worker     {"--", "--num_cores", NUM_CORES, "Number of cores to be used\n"},
209*495ae853SAndroid Build Coastguard Worker     {"--", "--disable_deblock_level", DISABLE_DEBLOCK_LEVEL,
210*495ae853SAndroid Build Coastguard Worker      "Disable deblocking level : 0 to 4 - 0 Enable deblocking 4 Disable "
211*495ae853SAndroid Build Coastguard Worker      "deblocking completely\n"},
212*495ae853SAndroid Build Coastguard Worker     {"--", "--u4_loopback", LOOPBACK, "Enable playback in a loop\n"},
213*495ae853SAndroid Build Coastguard Worker     {"--", "--degrade_type", DEGRADE_TYPE,
214*495ae853SAndroid Build Coastguard Worker      "Degrade type : 0: No degrade 0th bit set : Disable SAO 1st bit set : "
215*495ae853SAndroid Build Coastguard Worker      "Disable deblocking 2nd bit set : Faster inter prediction filters 3rd bit "
216*495ae853SAndroid Build Coastguard Worker      "set : Fastest inter prediction filters\n"},
217*495ae853SAndroid Build Coastguard Worker     {"--", "--degrade_pics", DEGRADE_PICS,
218*495ae853SAndroid Build Coastguard Worker      "Degrade pics : 0 : No degrade  1 : Only on non-reference frames  2 : Do "
219*495ae853SAndroid Build Coastguard Worker      "not degrade every 4th or key frames  3 : All non-key frames  4 : All "
220*495ae853SAndroid Build Coastguard Worker      "frames\n"},
221*495ae853SAndroid Build Coastguard Worker     {"--", "--arch", ARCH,
222*495ae853SAndroid Build Coastguard Worker      "Set Architecture. Supported values - ARM_A9Q, ARMV8_GENERIC, "
223*495ae853SAndroid Build Coastguard Worker      "X86_GENERIC, X86_SSE4 \n"},
224*495ae853SAndroid Build Coastguard Worker };
225*495ae853SAndroid Build Coastguard Worker 
226*495ae853SAndroid Build Coastguard Worker #if ANDROID_NDK
227*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
228*495ae853SAndroid Build Coastguard Worker /*                                                                           */
229*495ae853SAndroid Build Coastguard Worker /*  Function Name : raise                                                    */
230*495ae853SAndroid Build Coastguard Worker /*                                                                           */
231*495ae853SAndroid Build Coastguard Worker /*  Description   : Needed as a workaround when the application is built in  */
232*495ae853SAndroid Build Coastguard Worker /*                  Android NDK. This is an exception to be called for divide*/
233*495ae853SAndroid Build Coastguard Worker /*                  by zero error                                            */
234*495ae853SAndroid Build Coastguard Worker /*                                                                           */
235*495ae853SAndroid Build Coastguard Worker /*  Inputs        : a                                                        */
236*495ae853SAndroid Build Coastguard Worker /*  Globals       :                                                          */
237*495ae853SAndroid Build Coastguard Worker /*  Processing    : None                                                     */
238*495ae853SAndroid Build Coastguard Worker /*                                                                           */
239*495ae853SAndroid Build Coastguard Worker /*  Outputs       :                                                          */
240*495ae853SAndroid Build Coastguard Worker /*  Returns       :                                                          */
241*495ae853SAndroid Build Coastguard Worker /*                                                                           */
242*495ae853SAndroid Build Coastguard Worker /*  Issues        :                                                          */
243*495ae853SAndroid Build Coastguard Worker /*                                                                           */
244*495ae853SAndroid Build Coastguard Worker /*  Revision History:                                                        */
245*495ae853SAndroid Build Coastguard Worker /*                                                                           */
246*495ae853SAndroid Build Coastguard Worker /*         DD MM YYYY   Author(s)       Changes                              */
247*495ae853SAndroid Build Coastguard Worker /*         07 09 2012   100189          Initial Version                      */
248*495ae853SAndroid Build Coastguard Worker /*                                                                           */
249*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
raise(int a)250*495ae853SAndroid Build Coastguard Worker static int raise(int a)
251*495ae853SAndroid Build Coastguard Worker {
252*495ae853SAndroid Build Coastguard Worker     printf("Divide by zero\n");
253*495ae853SAndroid Build Coastguard Worker     return 0;
254*495ae853SAndroid Build Coastguard Worker }
255*495ae853SAndroid Build Coastguard Worker #endif
256*495ae853SAndroid Build Coastguard Worker 
mvcd_print_usage(void)257*495ae853SAndroid Build Coastguard Worker static void mvcd_print_usage(void)
258*495ae853SAndroid Build Coastguard Worker {
259*495ae853SAndroid Build Coastguard Worker     WORD32 i = 0;
260*495ae853SAndroid Build Coastguard Worker     WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
261*495ae853SAndroid Build Coastguard Worker 
262*495ae853SAndroid Build Coastguard Worker     printf("\nUsage:\n");
263*495ae853SAndroid Build Coastguard Worker 
264*495ae853SAndroid Build Coastguard Worker     while(i < num_entries)
265*495ae853SAndroid Build Coastguard Worker     {
266*495ae853SAndroid Build Coastguard Worker         printf("%-32s\t %s", argument_mapping[i].au1_argument_name,
267*495ae853SAndroid Build Coastguard Worker                argument_mapping[i].au1_description);
268*495ae853SAndroid Build Coastguard Worker         i++;
269*495ae853SAndroid Build Coastguard Worker     }
270*495ae853SAndroid Build Coastguard Worker }
271*495ae853SAndroid Build Coastguard Worker 
mvcd_get_argument(char * name)272*495ae853SAndroid Build Coastguard Worker static ARGUMENT_T mvcd_get_argument(char *name)
273*495ae853SAndroid Build Coastguard Worker {
274*495ae853SAndroid Build Coastguard Worker     WORD32 i = 0;
275*495ae853SAndroid Build Coastguard Worker     WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
276*495ae853SAndroid Build Coastguard Worker 
277*495ae853SAndroid Build Coastguard Worker     while(i < num_entries)
278*495ae853SAndroid Build Coastguard Worker     {
279*495ae853SAndroid Build Coastguard Worker         if((0 == strcmp((char *) argument_mapping[i].au1_argument_name, name)) ||
280*495ae853SAndroid Build Coastguard Worker            ((0 == strcmp((char *) argument_mapping[i].au1_argument_shortname, name)) &&
281*495ae853SAndroid Build Coastguard Worker             (0 != strcmp((char *) argument_mapping[i].au1_argument_shortname, "--"))))
282*495ae853SAndroid Build Coastguard Worker         {
283*495ae853SAndroid Build Coastguard Worker             return argument_mapping[i].e_argument;
284*495ae853SAndroid Build Coastguard Worker         }
285*495ae853SAndroid Build Coastguard Worker         i++;
286*495ae853SAndroid Build Coastguard Worker     }
287*495ae853SAndroid Build Coastguard Worker 
288*495ae853SAndroid Build Coastguard Worker     return INVALID;
289*495ae853SAndroid Build Coastguard Worker }
290*495ae853SAndroid Build Coastguard Worker 
mvcd_exit(UWORD8 * pu1_err_message)291*495ae853SAndroid Build Coastguard Worker static void mvcd_exit(UWORD8 *pu1_err_message)
292*495ae853SAndroid Build Coastguard Worker {
293*495ae853SAndroid Build Coastguard Worker     printf("%s\n", pu1_err_message);
294*495ae853SAndroid Build Coastguard Worker     exit(-1);
295*495ae853SAndroid Build Coastguard Worker }
296*495ae853SAndroid Build Coastguard Worker 
mvcd_parse_argument(mvc_dec_ctx_t * ps_app_ctx,char * argument,char * value)297*495ae853SAndroid Build Coastguard Worker static void mvcd_parse_argument(mvc_dec_ctx_t *ps_app_ctx, char *argument, char *value)
298*495ae853SAndroid Build Coastguard Worker {
299*495ae853SAndroid Build Coastguard Worker     ARGUMENT_T arg;
300*495ae853SAndroid Build Coastguard Worker 
301*495ae853SAndroid Build Coastguard Worker     arg = mvcd_get_argument((char *) argument);
302*495ae853SAndroid Build Coastguard Worker 
303*495ae853SAndroid Build Coastguard Worker     switch(arg)
304*495ae853SAndroid Build Coastguard Worker     {
305*495ae853SAndroid Build Coastguard Worker         case HELP:
306*495ae853SAndroid Build Coastguard Worker         {
307*495ae853SAndroid Build Coastguard Worker             mvcd_print_usage();
308*495ae853SAndroid Build Coastguard Worker 
309*495ae853SAndroid Build Coastguard Worker             exit(-1);
310*495ae853SAndroid Build Coastguard Worker         }
311*495ae853SAndroid Build Coastguard Worker         case INPUT_FILE:
312*495ae853SAndroid Build Coastguard Worker         {
313*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctx->s_mvc_app_files.au1_ip_fname);
314*495ae853SAndroid Build Coastguard Worker 
315*495ae853SAndroid Build Coastguard Worker             break;
316*495ae853SAndroid Build Coastguard Worker         }
317*495ae853SAndroid Build Coastguard Worker         case OUTPUT:
318*495ae853SAndroid Build Coastguard Worker         {
319*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctx->s_mvc_app_files.au1_op_fname);
320*495ae853SAndroid Build Coastguard Worker 
321*495ae853SAndroid Build Coastguard Worker             break;
322*495ae853SAndroid Build Coastguard Worker         }
323*495ae853SAndroid Build Coastguard Worker         case CHKSUM:
324*495ae853SAndroid Build Coastguard Worker         {
325*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%s", ps_app_ctx->s_mvc_app_files.au1_op_chksum_fname);
326*495ae853SAndroid Build Coastguard Worker 
327*495ae853SAndroid Build Coastguard Worker             break;
328*495ae853SAndroid Build Coastguard Worker         }
329*495ae853SAndroid Build Coastguard Worker         case SAVE_OUTPUT:
330*495ae853SAndroid Build Coastguard Worker         {
331*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%u", &ps_app_ctx->u4_file_save_flag);
332*495ae853SAndroid Build Coastguard Worker 
333*495ae853SAndroid Build Coastguard Worker             break;
334*495ae853SAndroid Build Coastguard Worker         }
335*495ae853SAndroid Build Coastguard Worker         case SAVE_CHKSUM:
336*495ae853SAndroid Build Coastguard Worker         {
337*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%u", &ps_app_ctx->u4_chksum_save_flag);
338*495ae853SAndroid Build Coastguard Worker 
339*495ae853SAndroid Build Coastguard Worker             break;
340*495ae853SAndroid Build Coastguard Worker         }
341*495ae853SAndroid Build Coastguard Worker         case NUM_FRAMES:
342*495ae853SAndroid Build Coastguard Worker         {
343*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%u", &ps_app_ctx->u4_max_frm_ts);
344*495ae853SAndroid Build Coastguard Worker 
345*495ae853SAndroid Build Coastguard Worker             break;
346*495ae853SAndroid Build Coastguard Worker         }
347*495ae853SAndroid Build Coastguard Worker         case NUM_CORES:
348*495ae853SAndroid Build Coastguard Worker         {
349*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%u", &ps_app_ctx->u4_num_cores);
350*495ae853SAndroid Build Coastguard Worker 
351*495ae853SAndroid Build Coastguard Worker             break;
352*495ae853SAndroid Build Coastguard Worker         }
353*495ae853SAndroid Build Coastguard Worker         case DEGRADE_PICS:
354*495ae853SAndroid Build Coastguard Worker         {
355*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->i4_degrade_pics);
356*495ae853SAndroid Build Coastguard Worker 
357*495ae853SAndroid Build Coastguard Worker             break;
358*495ae853SAndroid Build Coastguard Worker         }
359*495ae853SAndroid Build Coastguard Worker         case DEGRADE_TYPE:
360*495ae853SAndroid Build Coastguard Worker         {
361*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%d", &ps_app_ctx->i4_degrade_type);
362*495ae853SAndroid Build Coastguard Worker 
363*495ae853SAndroid Build Coastguard Worker             break;
364*495ae853SAndroid Build Coastguard Worker         }
365*495ae853SAndroid Build Coastguard Worker         case LOOPBACK:
366*495ae853SAndroid Build Coastguard Worker         {
367*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%u", &ps_app_ctx->u4_loopback);
368*495ae853SAndroid Build Coastguard Worker 
369*495ae853SAndroid Build Coastguard Worker             break;
370*495ae853SAndroid Build Coastguard Worker         }
371*495ae853SAndroid Build Coastguard Worker         case ARCH:
372*495ae853SAndroid Build Coastguard Worker         {
373*495ae853SAndroid Build Coastguard Worker             if((strcmp(value, "ARM_A9Q")) == 0)
374*495ae853SAndroid Build Coastguard Worker             {
375*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARM_A9Q;
376*495ae853SAndroid Build Coastguard Worker             }
377*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_GENERIC")) == 0)
378*495ae853SAndroid Build Coastguard Worker             {
379*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_X86_GENERIC;
380*495ae853SAndroid Build Coastguard Worker             }
381*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_SSSE3")) == 0)
382*495ae853SAndroid Build Coastguard Worker             {
383*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_X86_SSSE3;
384*495ae853SAndroid Build Coastguard Worker             }
385*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "X86_SSE42")) == 0)
386*495ae853SAndroid Build Coastguard Worker             {
387*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_X86_SSE42;
388*495ae853SAndroid Build Coastguard Worker             }
389*495ae853SAndroid Build Coastguard Worker             else if((strcmp(value, "ARMV8_GENERIC")) == 0)
390*495ae853SAndroid Build Coastguard Worker             {
391*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARMV8_GENERIC;
392*495ae853SAndroid Build Coastguard Worker             }
393*495ae853SAndroid Build Coastguard Worker             else
394*495ae853SAndroid Build Coastguard Worker             {
395*495ae853SAndroid Build Coastguard Worker                 printf("\nInvalid Arch. Setting it to ARCH_ARMV8_GENERIC\n");
396*495ae853SAndroid Build Coastguard Worker                 ps_app_ctx->e_arch = ARCH_ARMV8_GENERIC;
397*495ae853SAndroid Build Coastguard Worker             }
398*495ae853SAndroid Build Coastguard Worker 
399*495ae853SAndroid Build Coastguard Worker             break;
400*495ae853SAndroid Build Coastguard Worker         }
401*495ae853SAndroid Build Coastguard Worker         case DISABLE_DEBLOCK_LEVEL:
402*495ae853SAndroid Build Coastguard Worker         {
403*495ae853SAndroid Build Coastguard Worker             sscanf(value, "%u", &ps_app_ctx->u4_disable_dblk_level);
404*495ae853SAndroid Build Coastguard Worker 
405*495ae853SAndroid Build Coastguard Worker             break;
406*495ae853SAndroid Build Coastguard Worker         }
407*495ae853SAndroid Build Coastguard Worker         default:
408*495ae853SAndroid Build Coastguard Worker         {
409*495ae853SAndroid Build Coastguard Worker             printf("Ignoring argument :  %s\n", argument);
410*495ae853SAndroid Build Coastguard Worker 
411*495ae853SAndroid Build Coastguard Worker             break;
412*495ae853SAndroid Build Coastguard Worker         }
413*495ae853SAndroid Build Coastguard Worker     }
414*495ae853SAndroid Build Coastguard Worker }
415*495ae853SAndroid Build Coastguard Worker 
mvcd_read_cfg_file(mvc_dec_ctx_t * ps_app_ctx,FILE * ps_cfg_file)416*495ae853SAndroid Build Coastguard Worker static void mvcd_read_cfg_file(mvc_dec_ctx_t *ps_app_ctx, FILE *ps_cfg_file)
417*495ae853SAndroid Build Coastguard Worker {
418*495ae853SAndroid Build Coastguard Worker     char line[STRLENGTH];
419*495ae853SAndroid Build Coastguard Worker     char description[STRLENGTH];
420*495ae853SAndroid Build Coastguard Worker     char value[STRLENGTH];
421*495ae853SAndroid Build Coastguard Worker     char argument[STRLENGTH];
422*495ae853SAndroid Build Coastguard Worker     void *ret;
423*495ae853SAndroid Build Coastguard Worker 
424*495ae853SAndroid Build Coastguard Worker     while(0 == feof(ps_cfg_file))
425*495ae853SAndroid Build Coastguard Worker     {
426*495ae853SAndroid Build Coastguard Worker         line[0] = '\0';
427*495ae853SAndroid Build Coastguard Worker         ret = fgets(line, STRLENGTH, ps_cfg_file);
428*495ae853SAndroid Build Coastguard Worker         if(NULL == ret) break;
429*495ae853SAndroid Build Coastguard Worker         argument[0] = '\0';
430*495ae853SAndroid Build Coastguard Worker         /* Reading Input File Name */
431*495ae853SAndroid Build Coastguard Worker         sscanf(line, "%s %s %s", argument, value, description);
432*495ae853SAndroid Build Coastguard Worker         if(argument[0] == '\0') continue;
433*495ae853SAndroid Build Coastguard Worker 
434*495ae853SAndroid Build Coastguard Worker         mvcd_parse_argument(ps_app_ctx, argument, value);
435*495ae853SAndroid Build Coastguard Worker     }
436*495ae853SAndroid Build Coastguard Worker }
437*495ae853SAndroid Build Coastguard Worker 
mvcd_get_view_file_name(const UWORD8 * pu1_default_name,UWORD8 * pu1_view_file_name,UWORD16 u2_view_id)438*495ae853SAndroid Build Coastguard Worker static void mvcd_get_view_file_name(const UWORD8 *pu1_default_name, UWORD8 *pu1_view_file_name,
439*495ae853SAndroid Build Coastguard Worker                              UWORD16 u2_view_id)
440*495ae853SAndroid Build Coastguard Worker {
441*495ae853SAndroid Build Coastguard Worker     CHAR *apc_sub_str[2];
442*495ae853SAndroid Build Coastguard Worker     CHAR ac_string[STRLENGTH];
443*495ae853SAndroid Build Coastguard Worker 
444*495ae853SAndroid Build Coastguard Worker     const CHAR ac_delimiters[] = ".";
445*495ae853SAndroid Build Coastguard Worker 
446*495ae853SAndroid Build Coastguard Worker     strcpy(ac_string, (char *) pu1_default_name);
447*495ae853SAndroid Build Coastguard Worker 
448*495ae853SAndroid Build Coastguard Worker     apc_sub_str[0] = strtok(ac_string, ac_delimiters);
449*495ae853SAndroid Build Coastguard Worker     apc_sub_str[1] = strtok(NULL, ac_delimiters);
450*495ae853SAndroid Build Coastguard Worker 
451*495ae853SAndroid Build Coastguard Worker     ASSERT(NULL == strtok(NULL, ac_delimiters));
452*495ae853SAndroid Build Coastguard Worker     ASSERT((strlen(apc_sub_str[0]) + strlen(apc_sub_str[1]) + 3) < STRLENGTH);
453*495ae853SAndroid Build Coastguard Worker 
454*495ae853SAndroid Build Coastguard Worker     sprintf((char *) pu1_view_file_name, "%s_%d.%s", apc_sub_str[0], u2_view_id, apc_sub_str[1]);
455*495ae853SAndroid Build Coastguard Worker }
456*495ae853SAndroid Build Coastguard Worker 
mvcd_in_buf_alloc(mvc_dec_ctx_t * ps_app_ctxt,UWORD8 ** ppu1_bs_buf)457*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_in_buf_alloc(mvc_dec_ctx_t *ps_app_ctxt, UWORD8 **ppu1_bs_buf)
458*495ae853SAndroid Build Coastguard Worker {
459*495ae853SAndroid Build Coastguard Worker     ppu1_bs_buf[0] =
460*495ae853SAndroid Build Coastguard Worker         (UWORD8 *) malloc(ps_app_ctxt->s_disp_buf_props.s_ivd_op.u4_min_in_buf_size[0]);
461*495ae853SAndroid Build Coastguard Worker 
462*495ae853SAndroid Build Coastguard Worker     if(ppu1_bs_buf[0] == NULL)
463*495ae853SAndroid Build Coastguard Worker     {
464*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
465*495ae853SAndroid Build Coastguard Worker     }
466*495ae853SAndroid Build Coastguard Worker 
467*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
468*495ae853SAndroid Build Coastguard Worker }
469*495ae853SAndroid Build Coastguard Worker 
mvcd_in_buf_free(UWORD8 * pu1_bs_buf)470*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_in_buf_free(UWORD8 *pu1_bs_buf)
471*495ae853SAndroid Build Coastguard Worker {
472*495ae853SAndroid Build Coastguard Worker     free(pu1_bs_buf);
473*495ae853SAndroid Build Coastguard Worker 
474*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
475*495ae853SAndroid Build Coastguard Worker }
476*495ae853SAndroid Build Coastguard Worker 
mvcd_out_buf_alloc(mvc_dec_ctx_t * ps_app_ctxt,ivd_out_bufdesc_t * ps_out_buf)477*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_out_buf_alloc(mvc_dec_ctx_t *ps_app_ctxt, ivd_out_bufdesc_t *ps_out_buf)
478*495ae853SAndroid Build Coastguard Worker {
479*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
480*495ae853SAndroid Build Coastguard Worker 
481*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_num_views = ps_app_ctxt->s_disp_buf_props.s_mvc_buf_info.u2_num_views;
482*495ae853SAndroid Build Coastguard Worker 
483*495ae853SAndroid Build Coastguard Worker     if(ps_app_ctxt->s_disp_buf_props.s_ivd_op.u4_min_num_out_bufs < (NUM_COMPONENTS * u2_num_views))
484*495ae853SAndroid Build Coastguard Worker     {
485*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
486*495ae853SAndroid Build Coastguard Worker     }
487*495ae853SAndroid Build Coastguard Worker 
488*495ae853SAndroid Build Coastguard Worker     ps_out_buf->u4_num_bufs = ps_app_ctxt->s_disp_buf_props.s_ivd_op.u4_min_num_out_bufs;
489*495ae853SAndroid Build Coastguard Worker 
490*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_out_buf->u4_num_bufs; i++)
491*495ae853SAndroid Build Coastguard Worker     {
492*495ae853SAndroid Build Coastguard Worker         ps_out_buf->u4_min_out_buf_size[i] =
493*495ae853SAndroid Build Coastguard Worker             ps_app_ctxt->s_disp_buf_props.s_ivd_op.u4_min_out_buf_size[i];
494*495ae853SAndroid Build Coastguard Worker         ps_out_buf->pu1_bufs[i] =
495*495ae853SAndroid Build Coastguard Worker             (UWORD8 *) malloc(ps_app_ctxt->s_disp_buf_props.s_ivd_op.u4_min_out_buf_size[i]);
496*495ae853SAndroid Build Coastguard Worker 
497*495ae853SAndroid Build Coastguard Worker         if(ps_out_buf->pu1_bufs[i] == NULL)
498*495ae853SAndroid Build Coastguard Worker         {
499*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
500*495ae853SAndroid Build Coastguard Worker         }
501*495ae853SAndroid Build Coastguard Worker     }
502*495ae853SAndroid Build Coastguard Worker 
503*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
504*495ae853SAndroid Build Coastguard Worker }
505*495ae853SAndroid Build Coastguard Worker 
mvcd_out_buf_free(ivd_out_bufdesc_t * ps_out_buf)506*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_out_buf_free(ivd_out_bufdesc_t *ps_out_buf)
507*495ae853SAndroid Build Coastguard Worker {
508*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
509*495ae853SAndroid Build Coastguard Worker 
510*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < ps_out_buf->u4_num_bufs; i++)
511*495ae853SAndroid Build Coastguard Worker     {
512*495ae853SAndroid Build Coastguard Worker         free(ps_out_buf->pu1_bufs[i]);
513*495ae853SAndroid Build Coastguard Worker     }
514*495ae853SAndroid Build Coastguard Worker 
515*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
516*495ae853SAndroid Build Coastguard Worker }
517*495ae853SAndroid Build Coastguard Worker 
mvcd_output_write_stall(UWORD8 * au1_fname,UWORD32 u4_cur_frm_idx)518*495ae853SAndroid Build Coastguard Worker static void mvcd_output_write_stall(UWORD8 *au1_fname, UWORD32 u4_cur_frm_idx)
519*495ae853SAndroid Build Coastguard Worker {
520*495ae853SAndroid Build Coastguard Worker     FILE *fp_fast_file = NULL;
521*495ae853SAndroid Build Coastguard Worker 
522*495ae853SAndroid Build Coastguard Worker     const UWORD8 threshold = 64;
523*495ae853SAndroid Build Coastguard Worker     char past_fname[1000];
524*495ae853SAndroid Build Coastguard Worker 
525*495ae853SAndroid Build Coastguard Worker     if(u4_cur_frm_idx >= threshold)
526*495ae853SAndroid Build Coastguard Worker     {
527*495ae853SAndroid Build Coastguard Worker         sprintf(past_fname, (char *) au1_fname, u4_cur_frm_idx - threshold);
528*495ae853SAndroid Build Coastguard Worker         do
529*495ae853SAndroid Build Coastguard Worker         {
530*495ae853SAndroid Build Coastguard Worker             fp_fast_file = fopen(past_fname, "rb");
531*495ae853SAndroid Build Coastguard Worker 
532*495ae853SAndroid Build Coastguard Worker             if(fp_fast_file != NULL)
533*495ae853SAndroid Build Coastguard Worker             {
534*495ae853SAndroid Build Coastguard Worker                 fclose(fp_fast_file);
535*495ae853SAndroid Build Coastguard Worker                 /* Wait until the resource is released by a third party app*/
536*495ae853SAndroid Build Coastguard Worker                 ithread_sleep(5000);
537*495ae853SAndroid Build Coastguard Worker             }
538*495ae853SAndroid Build Coastguard Worker             else
539*495ae853SAndroid Build Coastguard Worker             {
540*495ae853SAndroid Build Coastguard Worker                 break;
541*495ae853SAndroid Build Coastguard Worker             }
542*495ae853SAndroid Build Coastguard Worker         } while(1);
543*495ae853SAndroid Build Coastguard Worker     }
544*495ae853SAndroid Build Coastguard Worker }
545*495ae853SAndroid Build Coastguard Worker 
mvcd_create_decoder(mvc_dec_ctx_t * ps_app_ctxt)546*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_create_decoder(mvc_dec_ctx_t *ps_app_ctxt)
547*495ae853SAndroid Build Coastguard Worker {
548*495ae853SAndroid Build Coastguard Worker     imvcd_create_ip_t s_create_ip;
549*495ae853SAndroid Build Coastguard Worker     imvcd_create_op_t s_create_op;
550*495ae853SAndroid Build Coastguard Worker 
551*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T ret;
552*495ae853SAndroid Build Coastguard Worker 
553*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.e_cmd = IVD_CMD_CREATE;
554*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.e_output_format = ps_app_ctxt->e_output_chroma_format;
555*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.pf_aligned_alloc = mvcd_aligned_malloc;
556*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.pf_aligned_free = mvcd_aligned_free;
557*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.u4_share_disp_buf = 0;
558*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.pv_mem_ctxt = NULL;
559*495ae853SAndroid Build Coastguard Worker 
560*495ae853SAndroid Build Coastguard Worker     s_create_ip.s_ivd_ip.u4_size = sizeof(s_create_ip.s_ivd_ip);
561*495ae853SAndroid Build Coastguard Worker     s_create_op.s_ivd_op.u4_size = sizeof(s_create_op.s_ivd_op);
562*495ae853SAndroid Build Coastguard Worker 
563*495ae853SAndroid Build Coastguard Worker     ret = imvcd_api_function(NULL, &s_create_ip, &s_create_op);
564*495ae853SAndroid Build Coastguard Worker 
565*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
566*495ae853SAndroid Build Coastguard Worker     {
567*495ae853SAndroid Build Coastguard Worker         return ret;
568*495ae853SAndroid Build Coastguard Worker     }
569*495ae853SAndroid Build Coastguard Worker 
570*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->ps_codec_obj = (iv_obj_t *) s_create_op.s_ivd_op.pv_handle;
571*495ae853SAndroid Build Coastguard Worker 
572*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
573*495ae853SAndroid Build Coastguard Worker }
574*495ae853SAndroid Build Coastguard Worker 
mvcd_set_decode_mode(mvc_dec_ctx_t * ps_app_ctxt,IVD_VIDEO_DECODE_MODE_T e_decode_mode)575*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_set_decode_mode(mvc_dec_ctx_t *ps_app_ctxt,
576*495ae853SAndroid Build Coastguard Worker                                           IVD_VIDEO_DECODE_MODE_T e_decode_mode)
577*495ae853SAndroid Build Coastguard Worker {
578*495ae853SAndroid Build Coastguard Worker     imvcd_set_config_ip_t s_ctl_ip;
579*495ae853SAndroid Build Coastguard Worker     imvcd_set_config_op_t s_ctl_op;
580*495ae853SAndroid Build Coastguard Worker 
581*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.u4_size = sizeof(s_ctl_ip.s_ivd_ip);
582*495ae853SAndroid Build Coastguard Worker     s_ctl_op.s_ivd_op.u4_size = sizeof(s_ctl_op.s_ivd_op);
583*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_CTL;
584*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_sub_cmd = (WORD32) IVD_CMD_CTL_SETPARAMS;
585*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
586*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_frm_skip_mode = IVD_SKIP_NONE;
587*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_vid_dec_mode = e_decode_mode;
588*495ae853SAndroid Build Coastguard Worker 
589*495ae853SAndroid Build Coastguard Worker     return imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_ctl_ip, &s_ctl_op);
590*495ae853SAndroid Build Coastguard Worker }
591*495ae853SAndroid Build Coastguard Worker 
mvcd_set_num_cores(mvc_dec_ctx_t * ps_app_ctxt)592*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_set_num_cores(mvc_dec_ctx_t *ps_app_ctxt)
593*495ae853SAndroid Build Coastguard Worker {
594*495ae853SAndroid Build Coastguard Worker     imvcd_set_num_cores_ip_t s_ctl_ip;
595*495ae853SAndroid Build Coastguard Worker     imvcd_set_num_cores_op_t s_ctl_op;
596*495ae853SAndroid Build Coastguard Worker 
597*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.u4_size = sizeof(s_ctl_ip);
598*495ae853SAndroid Build Coastguard Worker     s_ctl_op.u4_size = sizeof(s_ctl_op);
599*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
600*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_sub_cmd = (WORD32) IMVCD_CTL_SET_NUM_CORES;
601*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.u4_num_cores = ps_app_ctxt->u4_num_cores;
602*495ae853SAndroid Build Coastguard Worker 
603*495ae853SAndroid Build Coastguard Worker     return imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_ctl_ip, &s_ctl_op);
604*495ae853SAndroid Build Coastguard Worker }
605*495ae853SAndroid Build Coastguard Worker 
mvcd_set_arch(mvc_dec_ctx_t * ps_app_ctxt)606*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_set_arch(mvc_dec_ctx_t *ps_app_ctxt)
607*495ae853SAndroid Build Coastguard Worker {
608*495ae853SAndroid Build Coastguard Worker     imvcd_set_arch_ip_t s_ctl_ip;
609*495ae853SAndroid Build Coastguard Worker     imvcd_set_arch_op_t s_ctl_op;
610*495ae853SAndroid Build Coastguard Worker 
611*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.u4_size = sizeof(s_ctl_ip);
612*495ae853SAndroid Build Coastguard Worker     s_ctl_op.u4_size = sizeof(s_ctl_op);
613*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
614*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_sub_cmd = (WORD32) IMVCD_CTL_SET_PROCESSOR;
615*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_arch = ps_app_ctxt->e_arch;
616*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_soc = ps_app_ctxt->e_soc;
617*495ae853SAndroid Build Coastguard Worker 
618*495ae853SAndroid Build Coastguard Worker     return imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_ctl_ip, &s_ctl_op);
619*495ae853SAndroid Build Coastguard Worker }
620*495ae853SAndroid Build Coastguard Worker 
mvcd_dump_output(mvc_dec_ctx_t * ps_app_ctxt,iv_yuv_buf_t * ps_view_disp_bufs,FILE ** pps_op_file,FILE ** pps_op_chksum_file,UWORD16 u2_num_views)621*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_dump_output(mvc_dec_ctx_t *ps_app_ctxt,
622*495ae853SAndroid Build Coastguard Worker                                              iv_yuv_buf_t *ps_view_disp_bufs, FILE **pps_op_file,
623*495ae853SAndroid Build Coastguard Worker                                              FILE **pps_op_chksum_file, UWORD16 u2_num_views)
624*495ae853SAndroid Build Coastguard Worker {
625*495ae853SAndroid Build Coastguard Worker     UWORD32 i, j;
626*495ae853SAndroid Build Coastguard Worker 
627*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_file_save = ps_app_ctxt->u4_file_save_flag;
628*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_chksum_save = ps_app_ctxt->u4_chksum_save_flag;
629*495ae853SAndroid Build Coastguard Worker 
630*495ae853SAndroid Build Coastguard Worker     if(!u4_file_save && !u4_chksum_save)
631*495ae853SAndroid Build Coastguard Worker     {
632*495ae853SAndroid Build Coastguard Worker         return IV_SUCCESS;
633*495ae853SAndroid Build Coastguard Worker     }
634*495ae853SAndroid Build Coastguard Worker 
635*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_view_disp_bufs->pv_y_buf)
636*495ae853SAndroid Build Coastguard Worker     {
637*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
638*495ae853SAndroid Build Coastguard Worker     }
639*495ae853SAndroid Build Coastguard Worker 
640*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u2_num_views; i++)
641*495ae853SAndroid Build Coastguard Worker     {
642*495ae853SAndroid Build Coastguard Worker         iv_yuv_buf_t *ps_view_buf = &ps_view_disp_bufs[i];
643*495ae853SAndroid Build Coastguard Worker 
644*495ae853SAndroid Build Coastguard Worker         if(ps_app_ctxt->e_output_chroma_format == IV_YUV_420P)
645*495ae853SAndroid Build Coastguard Worker         {
646*495ae853SAndroid Build Coastguard Worker             if(u4_file_save)
647*495ae853SAndroid Build Coastguard Worker             {
648*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_buf = (UWORD8 *) ps_view_buf->pv_y_buf;
649*495ae853SAndroid Build Coastguard Worker                 UWORD16 u2_width = ps_view_buf->u4_y_wd;
650*495ae853SAndroid Build Coastguard Worker                 UWORD16 u2_height = ps_view_buf->u4_y_ht;
651*495ae853SAndroid Build Coastguard Worker 
652*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < u2_height; j++)
653*495ae853SAndroid Build Coastguard Worker                 {
654*495ae853SAndroid Build Coastguard Worker                     fwrite(pu1_buf, 1, u2_width, pps_op_file[i]);
655*495ae853SAndroid Build Coastguard Worker 
656*495ae853SAndroid Build Coastguard Worker                     pu1_buf += ps_view_buf->u4_y_strd;
657*495ae853SAndroid Build Coastguard Worker                 }
658*495ae853SAndroid Build Coastguard Worker 
659*495ae853SAndroid Build Coastguard Worker                 pu1_buf = (UWORD8 *) ps_view_buf->pv_u_buf;
660*495ae853SAndroid Build Coastguard Worker                 u2_width = ps_view_buf->u4_u_wd;
661*495ae853SAndroid Build Coastguard Worker                 u2_height = ps_view_buf->u4_u_ht;
662*495ae853SAndroid Build Coastguard Worker 
663*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < u2_height; j++)
664*495ae853SAndroid Build Coastguard Worker                 {
665*495ae853SAndroid Build Coastguard Worker                     fwrite(pu1_buf, 1, u2_width, pps_op_file[i]);
666*495ae853SAndroid Build Coastguard Worker 
667*495ae853SAndroid Build Coastguard Worker                     pu1_buf += ps_view_buf->u4_u_strd;
668*495ae853SAndroid Build Coastguard Worker                 }
669*495ae853SAndroid Build Coastguard Worker 
670*495ae853SAndroid Build Coastguard Worker                 pu1_buf = (UWORD8 *) ps_view_buf->pv_v_buf;
671*495ae853SAndroid Build Coastguard Worker                 u2_width = ps_view_buf->u4_v_wd;
672*495ae853SAndroid Build Coastguard Worker                 u2_height = ps_view_buf->u4_v_ht;
673*495ae853SAndroid Build Coastguard Worker 
674*495ae853SAndroid Build Coastguard Worker                 for(j = 0; j < u2_height; j++)
675*495ae853SAndroid Build Coastguard Worker                 {
676*495ae853SAndroid Build Coastguard Worker                     fwrite(pu1_buf, 1, u2_width, pps_op_file[i]);
677*495ae853SAndroid Build Coastguard Worker 
678*495ae853SAndroid Build Coastguard Worker                     pu1_buf += ps_view_buf->u4_v_strd;
679*495ae853SAndroid Build Coastguard Worker                 }
680*495ae853SAndroid Build Coastguard Worker             }
681*495ae853SAndroid Build Coastguard Worker 
682*495ae853SAndroid Build Coastguard Worker #ifndef MD5_DISABLE
683*495ae853SAndroid Build Coastguard Worker             if(u4_chksum_save)
684*495ae853SAndroid Build Coastguard Worker             {
685*495ae853SAndroid Build Coastguard Worker                 UWORD8 au1_cksum[16];
686*495ae853SAndroid Build Coastguard Worker 
687*495ae853SAndroid Build Coastguard Worker                 UWORD8 *pu1_buf = (UWORD8 *) ps_view_buf->pv_y_buf;
688*495ae853SAndroid Build Coastguard Worker                 UWORD16 u2_width = ps_view_buf->u4_y_wd;
689*495ae853SAndroid Build Coastguard Worker                 UWORD16 u2_height = ps_view_buf->u4_y_ht;
690*495ae853SAndroid Build Coastguard Worker 
691*495ae853SAndroid Build Coastguard Worker                 calc_md5_cksum(pu1_buf, ps_view_buf->u4_y_strd, u2_width, u2_height, au1_cksum);
692*495ae853SAndroid Build Coastguard Worker 
693*495ae853SAndroid Build Coastguard Worker                 fwrite(au1_cksum, sizeof(UWORD8), 16, pps_op_chksum_file[i]);
694*495ae853SAndroid Build Coastguard Worker 
695*495ae853SAndroid Build Coastguard Worker                 pu1_buf = (UWORD8 *) ps_view_buf->pv_u_buf;
696*495ae853SAndroid Build Coastguard Worker                 u2_width = ps_view_buf->u4_u_wd;
697*495ae853SAndroid Build Coastguard Worker                 u2_height = ps_view_buf->u4_u_ht;
698*495ae853SAndroid Build Coastguard Worker 
699*495ae853SAndroid Build Coastguard Worker                 calc_md5_cksum(pu1_buf, ps_view_buf->u4_u_strd, u2_width, u2_height, au1_cksum);
700*495ae853SAndroid Build Coastguard Worker 
701*495ae853SAndroid Build Coastguard Worker                 fwrite(au1_cksum, sizeof(UWORD8), 16, pps_op_chksum_file[i]);
702*495ae853SAndroid Build Coastguard Worker 
703*495ae853SAndroid Build Coastguard Worker                 pu1_buf = (UWORD8 *) ps_view_buf->pv_v_buf;
704*495ae853SAndroid Build Coastguard Worker                 u2_width = ps_view_buf->u4_v_wd;
705*495ae853SAndroid Build Coastguard Worker                 u2_height = ps_view_buf->u4_v_ht;
706*495ae853SAndroid Build Coastguard Worker 
707*495ae853SAndroid Build Coastguard Worker                 calc_md5_cksum(pu1_buf, ps_view_buf->u4_v_strd, u2_width, u2_height, au1_cksum);
708*495ae853SAndroid Build Coastguard Worker 
709*495ae853SAndroid Build Coastguard Worker                 fwrite(au1_cksum, sizeof(UWORD8), 16, pps_op_chksum_file[i]);
710*495ae853SAndroid Build Coastguard Worker             }
711*495ae853SAndroid Build Coastguard Worker #endif
712*495ae853SAndroid Build Coastguard Worker         }
713*495ae853SAndroid Build Coastguard Worker         else
714*495ae853SAndroid Build Coastguard Worker         {
715*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
716*495ae853SAndroid Build Coastguard Worker         }
717*495ae853SAndroid Build Coastguard Worker 
718*495ae853SAndroid Build Coastguard Worker         fflush(pps_op_file[i]);
719*495ae853SAndroid Build Coastguard Worker         fflush(pps_op_chksum_file[i]);
720*495ae853SAndroid Build Coastguard Worker     }
721*495ae853SAndroid Build Coastguard Worker 
722*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
723*495ae853SAndroid Build Coastguard Worker }
724*495ae853SAndroid Build Coastguard Worker 
mvcd_flush(mvc_dec_ctx_t * ps_app_ctxt,ivd_out_bufdesc_t * ps_out_buf,FILE ** pps_op_file,FILE ** pps_op_chksum_file,UWORD8 * pu1_bs_buf,UWORD32 * pu4_op_frm_ts,UWORD32 u4_ip_frm_ts,UWORD32 u4_bytes_remaining,UWORD16 u2_num_views)725*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_flush(mvc_dec_ctx_t *ps_app_ctxt, ivd_out_bufdesc_t *ps_out_buf,
726*495ae853SAndroid Build Coastguard Worker                                 FILE **pps_op_file, FILE **pps_op_chksum_file, UWORD8 *pu1_bs_buf,
727*495ae853SAndroid Build Coastguard Worker                                 UWORD32 *pu4_op_frm_ts, UWORD32 u4_ip_frm_ts,
728*495ae853SAndroid Build Coastguard Worker                                 UWORD32 u4_bytes_remaining, UWORD16 u2_num_views)
729*495ae853SAndroid Build Coastguard Worker {
730*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T ret = IV_SUCCESS;
731*495ae853SAndroid Build Coastguard Worker 
732*495ae853SAndroid Build Coastguard Worker     do
733*495ae853SAndroid Build Coastguard Worker     {
734*495ae853SAndroid Build Coastguard Worker         imvcd_flush_dec_ip_t s_ctl_ip;
735*495ae853SAndroid Build Coastguard Worker         imvcd_flush_dec_op_t s_ctl_op;
736*495ae853SAndroid Build Coastguard Worker 
737*495ae853SAndroid Build Coastguard Worker         if(*(pu4_op_frm_ts) >= u4_ip_frm_ts)
738*495ae853SAndroid Build Coastguard Worker         {
739*495ae853SAndroid Build Coastguard Worker             break;
740*495ae853SAndroid Build Coastguard Worker         }
741*495ae853SAndroid Build Coastguard Worker 
742*495ae853SAndroid Build Coastguard Worker         s_ctl_ip.s_ivd_ip.u4_size = sizeof(s_ctl_ip.s_ivd_ip);
743*495ae853SAndroid Build Coastguard Worker         s_ctl_op.s_ivd_op.u4_size = sizeof(s_ctl_op.s_ivd_op);
744*495ae853SAndroid Build Coastguard Worker         s_ctl_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_CTL;
745*495ae853SAndroid Build Coastguard Worker         s_ctl_ip.s_ivd_ip.e_sub_cmd = (WORD32) IVD_CMD_CTL_FLUSH;
746*495ae853SAndroid Build Coastguard Worker 
747*495ae853SAndroid Build Coastguard Worker         ret = imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_ctl_ip, &s_ctl_op);
748*495ae853SAndroid Build Coastguard Worker 
749*495ae853SAndroid Build Coastguard Worker         if(IV_SUCCESS == ret)
750*495ae853SAndroid Build Coastguard Worker         {
751*495ae853SAndroid Build Coastguard Worker             imvcd_video_decode_ip_t s_video_decode_ip;
752*495ae853SAndroid Build Coastguard Worker             imvcd_video_decode_op_t s_video_decode_op;
753*495ae853SAndroid Build Coastguard Worker 
754*495ae853SAndroid Build Coastguard Worker             s_video_decode_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_DECODE;
755*495ae853SAndroid Build Coastguard Worker             s_video_decode_ip.s_ivd_ip.u4_ts = u4_ip_frm_ts;
756*495ae853SAndroid Build Coastguard Worker             s_video_decode_ip.s_ivd_ip.pv_stream_buffer = pu1_bs_buf;
757*495ae853SAndroid Build Coastguard Worker             s_video_decode_ip.s_ivd_ip.u4_num_Bytes = u4_bytes_remaining;
758*495ae853SAndroid Build Coastguard Worker             s_video_decode_ip.s_ivd_ip.s_out_buffer = ps_out_buf[0];
759*495ae853SAndroid Build Coastguard Worker             s_video_decode_op.ps_view_disp_bufs = ps_app_ctxt->as_view_disp_bufs;
760*495ae853SAndroid Build Coastguard Worker 
761*495ae853SAndroid Build Coastguard Worker             s_video_decode_ip.s_ivd_ip.u4_size = sizeof(s_video_decode_ip.s_ivd_ip);
762*495ae853SAndroid Build Coastguard Worker             s_video_decode_op.s_ivd_op.u4_size = sizeof(s_video_decode_op.s_ivd_op);
763*495ae853SAndroid Build Coastguard Worker 
764*495ae853SAndroid Build Coastguard Worker             ret = imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_video_decode_ip,
765*495ae853SAndroid Build Coastguard Worker                                      &s_video_decode_op);
766*495ae853SAndroid Build Coastguard Worker 
767*495ae853SAndroid Build Coastguard Worker             if(1 == s_video_decode_op.s_ivd_op.u4_output_present)
768*495ae853SAndroid Build Coastguard Worker             {
769*495ae853SAndroid Build Coastguard Worker                 ret = mvcd_dump_output(ps_app_ctxt, s_video_decode_op.ps_view_disp_bufs,
770*495ae853SAndroid Build Coastguard Worker                                        pps_op_file, pps_op_chksum_file, u2_num_views);
771*495ae853SAndroid Build Coastguard Worker 
772*495ae853SAndroid Build Coastguard Worker                 (*pu4_op_frm_ts)++;
773*495ae853SAndroid Build Coastguard Worker             }
774*495ae853SAndroid Build Coastguard Worker             else
775*495ae853SAndroid Build Coastguard Worker             {
776*495ae853SAndroid Build Coastguard Worker                 break;
777*495ae853SAndroid Build Coastguard Worker             }
778*495ae853SAndroid Build Coastguard Worker         }
779*495ae853SAndroid Build Coastguard Worker     } while(IV_SUCCESS == ret);
780*495ae853SAndroid Build Coastguard Worker 
781*495ae853SAndroid Build Coastguard Worker     return ret;
782*495ae853SAndroid Build Coastguard Worker }
783*495ae853SAndroid Build Coastguard Worker 
mvcd_decode_header(mvc_dec_ctx_t * ps_app_ctxt,ivd_out_bufdesc_t * ps_out_buf,FILE * ps_ip_file,IVD_ERROR_CODES_T * pe_error_code,UWORD32 * pu4_num_bytes_dec,UWORD32 u4_ip_frm_ts)784*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_decode_header(mvc_dec_ctx_t *ps_app_ctxt, ivd_out_bufdesc_t *ps_out_buf,
785*495ae853SAndroid Build Coastguard Worker                                         FILE *ps_ip_file, IVD_ERROR_CODES_T *pe_error_code,
786*495ae853SAndroid Build Coastguard Worker                                         UWORD32 *pu4_num_bytes_dec, UWORD32 u4_ip_frm_ts)
787*495ae853SAndroid Build Coastguard Worker {
788*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T ret;
789*495ae853SAndroid Build Coastguard Worker 
790*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ip_buf_len;
791*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_bs_buf;
792*495ae853SAndroid Build Coastguard Worker 
793*495ae853SAndroid Build Coastguard Worker     imvcd_video_decode_ip_t s_video_decode_ip = {0};
794*495ae853SAndroid Build Coastguard Worker     imvcd_video_decode_op_t s_video_decode_op = {0};
795*495ae853SAndroid Build Coastguard Worker 
796*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_file_pos = 0;
797*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_bytes_dec = 0;
798*495ae853SAndroid Build Coastguard Worker 
799*495ae853SAndroid Build Coastguard Worker     ret = mvcd_set_decode_mode(ps_app_ctxt, IVD_DECODE_HEADER);
800*495ae853SAndroid Build Coastguard Worker 
801*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
802*495ae853SAndroid Build Coastguard Worker     {
803*495ae853SAndroid Build Coastguard Worker         pe_error_code[0] = IVD_INIT_DEC_FAILED;
804*495ae853SAndroid Build Coastguard Worker 
805*495ae853SAndroid Build Coastguard Worker         return ret;
806*495ae853SAndroid Build Coastguard Worker     }
807*495ae853SAndroid Build Coastguard Worker 
808*495ae853SAndroid Build Coastguard Worker     /* Allocate input buffer for header */
809*495ae853SAndroid Build Coastguard Worker     u4_ip_buf_len = 256 * 1024;
810*495ae853SAndroid Build Coastguard Worker     pu1_bs_buf = (UWORD8 *) malloc(u4_ip_buf_len);
811*495ae853SAndroid Build Coastguard Worker 
812*495ae853SAndroid Build Coastguard Worker     if(pu1_bs_buf == NULL)
813*495ae853SAndroid Build Coastguard Worker     {
814*495ae853SAndroid Build Coastguard Worker         pe_error_code[0] = IVD_MEM_ALLOC_FAILED;
815*495ae853SAndroid Build Coastguard Worker 
816*495ae853SAndroid Build Coastguard Worker         return IV_FAIL;
817*495ae853SAndroid Build Coastguard Worker     }
818*495ae853SAndroid Build Coastguard Worker 
819*495ae853SAndroid Build Coastguard Worker     do
820*495ae853SAndroid Build Coastguard Worker     {
821*495ae853SAndroid Build Coastguard Worker         WORD32 u4_numbytes;
822*495ae853SAndroid Build Coastguard Worker         UWORD32 u4_bytes_remaining;
823*495ae853SAndroid Build Coastguard Worker 
824*495ae853SAndroid Build Coastguard Worker         fseek(ps_ip_file, u4_file_pos, SEEK_SET);
825*495ae853SAndroid Build Coastguard Worker         u4_numbytes = u4_ip_buf_len;
826*495ae853SAndroid Build Coastguard Worker 
827*495ae853SAndroid Build Coastguard Worker         u4_bytes_remaining = fread(pu1_bs_buf, sizeof(UWORD8), u4_numbytes, ps_ip_file);
828*495ae853SAndroid Build Coastguard Worker 
829*495ae853SAndroid Build Coastguard Worker         if(0 == u4_bytes_remaining)
830*495ae853SAndroid Build Coastguard Worker         {
831*495ae853SAndroid Build Coastguard Worker             pe_error_code[0] = IVD_UNEXPECTED_END_OF_STREAM;
832*495ae853SAndroid Build Coastguard Worker 
833*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
834*495ae853SAndroid Build Coastguard Worker         }
835*495ae853SAndroid Build Coastguard Worker 
836*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_DECODE;
837*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_ts = u4_ip_frm_ts;
838*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.pv_stream_buffer = pu1_bs_buf;
839*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_num_Bytes = u4_bytes_remaining;
840*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.s_out_buffer = ps_out_buf[0];
841*495ae853SAndroid Build Coastguard Worker         s_video_decode_op.ps_view_disp_bufs = ps_app_ctxt->as_view_disp_bufs;
842*495ae853SAndroid Build Coastguard Worker 
843*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_size = sizeof(s_video_decode_ip.s_ivd_ip);
844*495ae853SAndroid Build Coastguard Worker         s_video_decode_op.s_ivd_op.u4_size = sizeof(s_video_decode_op.s_ivd_op);
845*495ae853SAndroid Build Coastguard Worker 
846*495ae853SAndroid Build Coastguard Worker         ret = imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_video_decode_ip, &s_video_decode_op);
847*495ae853SAndroid Build Coastguard Worker 
848*495ae853SAndroid Build Coastguard Worker         if(ret != IV_SUCCESS)
849*495ae853SAndroid Build Coastguard Worker         {
850*495ae853SAndroid Build Coastguard Worker             pe_error_code[0] = s_video_decode_op.s_ivd_op.u4_error_code;
851*495ae853SAndroid Build Coastguard Worker 
852*495ae853SAndroid Build Coastguard Worker             return ret;
853*495ae853SAndroid Build Coastguard Worker         }
854*495ae853SAndroid Build Coastguard Worker 
855*495ae853SAndroid Build Coastguard Worker         u4_num_bytes_dec += s_video_decode_op.s_ivd_op.u4_num_bytes_consumed;
856*495ae853SAndroid Build Coastguard Worker 
857*495ae853SAndroid Build Coastguard Worker #ifndef PROFILE_ENABLE
858*495ae853SAndroid Build Coastguard Worker         printf("%d\n", s_video_decode_op.s_ivd_op.u4_num_bytes_consumed);
859*495ae853SAndroid Build Coastguard Worker #endif
860*495ae853SAndroid Build Coastguard Worker     } while(ret != IV_SUCCESS);
861*495ae853SAndroid Build Coastguard Worker 
862*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_pic_wd = s_video_decode_op.s_ivd_op.u4_pic_wd;
863*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->u4_pic_ht = s_video_decode_op.s_ivd_op.u4_pic_ht;
864*495ae853SAndroid Build Coastguard Worker 
865*495ae853SAndroid Build Coastguard Worker     pu4_num_bytes_dec[0] = u4_num_bytes_dec;
866*495ae853SAndroid Build Coastguard Worker     pe_error_code[0] = IVD_ERROR_NONE;
867*495ae853SAndroid Build Coastguard Worker 
868*495ae853SAndroid Build Coastguard Worker     free(pu1_bs_buf);
869*495ae853SAndroid Build Coastguard Worker 
870*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
871*495ae853SAndroid Build Coastguard Worker }
872*495ae853SAndroid Build Coastguard Worker 
mvcd_get_buf_info(mvc_dec_ctx_t * ps_app_ctxt)873*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_get_buf_info(mvc_dec_ctx_t *ps_app_ctxt)
874*495ae853SAndroid Build Coastguard Worker {
875*495ae853SAndroid Build Coastguard Worker     imvcd_get_buf_info_ip_t s_ctl_ip;
876*495ae853SAndroid Build Coastguard Worker     imvcd_get_buf_info_op_t s_ctl_op;
877*495ae853SAndroid Build Coastguard Worker 
878*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T e_retval;
879*495ae853SAndroid Build Coastguard Worker 
880*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.u4_size = sizeof(s_ctl_ip.s_ivd_ip);
881*495ae853SAndroid Build Coastguard Worker     s_ctl_op.s_ivd_op.u4_size = sizeof(s_ctl_op.s_ivd_op);
882*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_CTL;
883*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.s_ivd_ip.e_sub_cmd = (WORD32) IVD_CMD_CTL_GETBUFINFO;
884*495ae853SAndroid Build Coastguard Worker 
885*495ae853SAndroid Build Coastguard Worker     e_retval = imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_ctl_ip, &s_ctl_op);
886*495ae853SAndroid Build Coastguard Worker 
887*495ae853SAndroid Build Coastguard Worker     ps_app_ctxt->s_disp_buf_props = s_ctl_op;
888*495ae853SAndroid Build Coastguard Worker 
889*495ae853SAndroid Build Coastguard Worker     return e_retval;
890*495ae853SAndroid Build Coastguard Worker }
891*495ae853SAndroid Build Coastguard Worker 
mvcd_set_degrade_type(mvc_dec_ctx_t * ps_app_ctxt)892*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_set_degrade_type(mvc_dec_ctx_t *ps_app_ctxt)
893*495ae853SAndroid Build Coastguard Worker {
894*495ae853SAndroid Build Coastguard Worker     imvcd_set_degrade_mode_ip_t s_ctl_ip;
895*495ae853SAndroid Build Coastguard Worker     imvcd_set_degrade_mode_op_t s_ctl_op;
896*495ae853SAndroid Build Coastguard Worker 
897*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.u4_size = sizeof(s_ctl_ip);
898*495ae853SAndroid Build Coastguard Worker     s_ctl_op.u4_size = sizeof(s_ctl_op);
899*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
900*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.e_sub_cmd = (WORD32) IMVCD_CTL_DEGRADE;
901*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.i4_degrade_type = ps_app_ctxt->i4_degrade_type;
902*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.i4_degrade_pics = ps_app_ctxt->i4_degrade_pics;
903*495ae853SAndroid Build Coastguard Worker     s_ctl_ip.i4_nondegrade_interval = DEFAULT_NON_DEGRADE_INTERVAL;
904*495ae853SAndroid Build Coastguard Worker 
905*495ae853SAndroid Build Coastguard Worker     return imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_ctl_ip, &s_ctl_op);
906*495ae853SAndroid Build Coastguard Worker }
907*495ae853SAndroid Build Coastguard Worker 
mvcd_decode_frame(mvc_dec_ctx_t * ps_app_ctxt,ivd_out_bufdesc_t * ps_out_buf,FILE * ps_ip_file,FILE ** pps_op_file,FILE ** pps_op_chksum_file,UWORD8 * pu1_bs_buf,IVD_ERROR_CODES_T * pe_error_code,UWORD32 * pu4_num_bytes_consumed,UWORD32 * pu4_file_pos,UWORD32 * pu4_ip_frm_ts,UWORD32 * pu4_op_frm_ts,UWORD32 u4_ip_buf_len)908*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_decode_frame(mvc_dec_ctx_t *ps_app_ctxt, ivd_out_bufdesc_t *ps_out_buf,
909*495ae853SAndroid Build Coastguard Worker                                        FILE *ps_ip_file, FILE **pps_op_file,
910*495ae853SAndroid Build Coastguard Worker                                        FILE **pps_op_chksum_file, UWORD8 *pu1_bs_buf,
911*495ae853SAndroid Build Coastguard Worker                                        IVD_ERROR_CODES_T *pe_error_code,
912*495ae853SAndroid Build Coastguard Worker                                        UWORD32 *pu4_num_bytes_consumed, UWORD32 *pu4_file_pos,
913*495ae853SAndroid Build Coastguard Worker                                        UWORD32 *pu4_ip_frm_ts, UWORD32 *pu4_op_frm_ts,
914*495ae853SAndroid Build Coastguard Worker                                        UWORD32 u4_ip_buf_len)
915*495ae853SAndroid Build Coastguard Worker {
916*495ae853SAndroid Build Coastguard Worker     imvcd_video_decode_ip_t s_video_decode_ip;
917*495ae853SAndroid Build Coastguard Worker     imvcd_video_decode_op_t s_video_decode_op;
918*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
919*495ae853SAndroid Build Coastguard Worker     TIMER s_start_timer;
920*495ae853SAndroid Build Coastguard Worker     TIMER s_end_timer;
921*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
922*495ae853SAndroid Build Coastguard Worker     TIMER frequency;
923*495ae853SAndroid Build Coastguard Worker #endif
924*495ae853SAndroid Build Coastguard Worker 
925*495ae853SAndroid Build Coastguard Worker     UWORD32 au4_peak_window[PEAK_WINDOW_SIZE];
926*495ae853SAndroid Build Coastguard Worker     UWORD32 s_elapsed_time;
927*495ae853SAndroid Build Coastguard Worker #endif
928*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_max_op_frm_ts;
929*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_bytes_remaining;
930*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_numbytes;
931*495ae853SAndroid Build Coastguard Worker 
932*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T ret;
933*495ae853SAndroid Build Coastguard Worker 
934*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_bytes_dec = 0;
935*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_num_views = ps_app_ctxt->s_disp_buf_props.s_mvc_buf_info.u2_num_views;
936*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
937*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_frm_cnt = 0;
938*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_tot_cycles = 0;
939*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_tot_fmt_cycles = 0;
940*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_peak_window_idx = 0;
941*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_peak_avg_max = 0;
942*495ae853SAndroid Build Coastguard Worker #endif
943*495ae853SAndroid Build Coastguard Worker 
944*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
945*495ae853SAndroid Build Coastguard Worker     memset(au4_peak_window, 0, sizeof(WORD32) * PEAK_WINDOW_SIZE);
946*495ae853SAndroid Build Coastguard Worker 
947*495ae853SAndroid Build Coastguard Worker #ifdef WINDOWS_TIMER
948*495ae853SAndroid Build Coastguard Worker     QueryPerformanceFrequency(&frequency);
949*495ae853SAndroid Build Coastguard Worker #endif
950*495ae853SAndroid Build Coastguard Worker #endif
951*495ae853SAndroid Build Coastguard Worker 
952*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
953*495ae853SAndroid Build Coastguard Worker     /* Set the decoder in frame decode mode. It was set in header decode     */
954*495ae853SAndroid Build Coastguard Worker     /* mode earlier                                                          */
955*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
956*495ae853SAndroid Build Coastguard Worker     ret = mvcd_set_decode_mode(ps_app_ctxt, IVD_DECODE_FRAME);
957*495ae853SAndroid Build Coastguard Worker 
958*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != ret)
959*495ae853SAndroid Build Coastguard Worker     {
960*495ae853SAndroid Build Coastguard Worker         pe_error_code[0] = IVD_INIT_DEC_FAILED;
961*495ae853SAndroid Build Coastguard Worker 
962*495ae853SAndroid Build Coastguard Worker         return ret;
963*495ae853SAndroid Build Coastguard Worker     }
964*495ae853SAndroid Build Coastguard Worker 
965*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
966*495ae853SAndroid Build Coastguard Worker     /* If required disable deblocking and sao at given level                 */
967*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
968*495ae853SAndroid Build Coastguard Worker     ret = mvcd_set_degrade_type(ps_app_ctxt);
969*495ae853SAndroid Build Coastguard Worker 
970*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != ret)
971*495ae853SAndroid Build Coastguard Worker     {
972*495ae853SAndroid Build Coastguard Worker         pe_error_code[0] = IVD_INIT_DEC_FAILED;
973*495ae853SAndroid Build Coastguard Worker 
974*495ae853SAndroid Build Coastguard Worker         return ret;
975*495ae853SAndroid Build Coastguard Worker     }
976*495ae853SAndroid Build Coastguard Worker 
977*495ae853SAndroid Build Coastguard Worker     u4_max_op_frm_ts = ps_app_ctxt->u4_max_frm_ts + ps_app_ctxt->u4_disp_delay;
978*495ae853SAndroid Build Coastguard Worker 
979*495ae853SAndroid Build Coastguard Worker     if(u4_max_op_frm_ts < ps_app_ctxt->u4_disp_delay)
980*495ae853SAndroid Build Coastguard Worker     {
981*495ae853SAndroid Build Coastguard Worker         /* clip as overflow has occured*/
982*495ae853SAndroid Build Coastguard Worker         u4_max_op_frm_ts = UINT32_MAX;
983*495ae853SAndroid Build Coastguard Worker     }
984*495ae853SAndroid Build Coastguard Worker 
985*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != ret)
986*495ae853SAndroid Build Coastguard Worker     {
987*495ae853SAndroid Build Coastguard Worker         pe_error_code[0] = IVD_INIT_DEC_FAILED;
988*495ae853SAndroid Build Coastguard Worker 
989*495ae853SAndroid Build Coastguard Worker         return ret;
990*495ae853SAndroid Build Coastguard Worker     }
991*495ae853SAndroid Build Coastguard Worker 
992*495ae853SAndroid Build Coastguard Worker     while(pu4_op_frm_ts[0] < u4_max_op_frm_ts)
993*495ae853SAndroid Build Coastguard Worker     {
994*495ae853SAndroid Build Coastguard Worker         fseek(ps_ip_file, pu4_file_pos[0], SEEK_SET);
995*495ae853SAndroid Build Coastguard Worker         u4_numbytes = u4_ip_buf_len;
996*495ae853SAndroid Build Coastguard Worker 
997*495ae853SAndroid Build Coastguard Worker         u4_bytes_remaining = fread(pu1_bs_buf, sizeof(UWORD8), u4_numbytes, ps_ip_file);
998*495ae853SAndroid Build Coastguard Worker 
999*495ae853SAndroid Build Coastguard Worker         if(0 == u4_bytes_remaining)
1000*495ae853SAndroid Build Coastguard Worker         {
1001*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->u4_loopback)
1002*495ae853SAndroid Build Coastguard Worker             {
1003*495ae853SAndroid Build Coastguard Worker                 pu4_file_pos[0] = 0;
1004*495ae853SAndroid Build Coastguard Worker 
1005*495ae853SAndroid Build Coastguard Worker                 fseek(ps_ip_file, pu4_file_pos[0], SEEK_SET);
1006*495ae853SAndroid Build Coastguard Worker                 u4_numbytes = u4_ip_buf_len;
1007*495ae853SAndroid Build Coastguard Worker 
1008*495ae853SAndroid Build Coastguard Worker                 u4_bytes_remaining = fread(pu1_bs_buf, sizeof(UWORD8), u4_numbytes, ps_ip_file);
1009*495ae853SAndroid Build Coastguard Worker             }
1010*495ae853SAndroid Build Coastguard Worker             else
1011*495ae853SAndroid Build Coastguard Worker             {
1012*495ae853SAndroid Build Coastguard Worker                 break;
1013*495ae853SAndroid Build Coastguard Worker             }
1014*495ae853SAndroid Build Coastguard Worker         }
1015*495ae853SAndroid Build Coastguard Worker 
1016*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.e_cmd = IVD_CMD_VIDEO_DECODE;
1017*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_ts = pu4_ip_frm_ts[0];
1018*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.pv_stream_buffer = pu1_bs_buf;
1019*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_num_Bytes = u4_bytes_remaining;
1020*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.s_out_buffer = ps_out_buf[0];
1021*495ae853SAndroid Build Coastguard Worker         s_video_decode_op.ps_view_disp_bufs = ps_app_ctxt->as_view_disp_bufs;
1022*495ae853SAndroid Build Coastguard Worker 
1023*495ae853SAndroid Build Coastguard Worker         s_video_decode_ip.s_ivd_ip.u4_size = sizeof(s_video_decode_ip.s_ivd_ip);
1024*495ae853SAndroid Build Coastguard Worker         s_video_decode_op.s_ivd_op.u4_size = sizeof(s_video_decode_op.s_ivd_op);
1025*495ae853SAndroid Build Coastguard Worker 
1026*495ae853SAndroid Build Coastguard Worker         /****************/
1027*495ae853SAndroid Build Coastguard Worker         /* Video Decode */
1028*495ae853SAndroid Build Coastguard Worker         /****************/
1029*495ae853SAndroid Build Coastguard Worker         GETTIME(&s_start_timer);
1030*495ae853SAndroid Build Coastguard Worker 
1031*495ae853SAndroid Build Coastguard Worker         ret = imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_video_decode_ip, &s_video_decode_op);
1032*495ae853SAndroid Build Coastguard Worker 
1033*495ae853SAndroid Build Coastguard Worker         GETTIME(&s_end_timer);
1034*495ae853SAndroid Build Coastguard Worker         ELAPSEDTIME(s_start_timer, s_end_timer, s_elapsed_time, frequency);
1035*495ae853SAndroid Build Coastguard Worker 
1036*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
1037*495ae853SAndroid Build Coastguard Worker         {
1038*495ae853SAndroid Build Coastguard Worker             UWORD32 peak_avg, id;
1039*495ae853SAndroid Build Coastguard Worker 
1040*495ae853SAndroid Build Coastguard Worker             u4_tot_cycles += s_elapsed_time;
1041*495ae853SAndroid Build Coastguard Worker             au4_peak_window[u4_peak_window_idx++] = s_elapsed_time;
1042*495ae853SAndroid Build Coastguard Worker 
1043*495ae853SAndroid Build Coastguard Worker             if(u4_peak_window_idx == PEAK_WINDOW_SIZE)
1044*495ae853SAndroid Build Coastguard Worker             {
1045*495ae853SAndroid Build Coastguard Worker                 u4_peak_window_idx = 0;
1046*495ae853SAndroid Build Coastguard Worker             }
1047*495ae853SAndroid Build Coastguard Worker 
1048*495ae853SAndroid Build Coastguard Worker             peak_avg = 0;
1049*495ae853SAndroid Build Coastguard Worker             for(id = 0; id < PEAK_WINDOW_SIZE; id++)
1050*495ae853SAndroid Build Coastguard Worker             {
1051*495ae853SAndroid Build Coastguard Worker                 peak_avg += au4_peak_window[id];
1052*495ae853SAndroid Build Coastguard Worker             }
1053*495ae853SAndroid Build Coastguard Worker 
1054*495ae853SAndroid Build Coastguard Worker             peak_avg /= PEAK_WINDOW_SIZE;
1055*495ae853SAndroid Build Coastguard Worker             if(peak_avg > u4_peak_avg_max) u4_peak_avg_max = peak_avg;
1056*495ae853SAndroid Build Coastguard Worker             u4_frm_cnt++;
1057*495ae853SAndroid Build Coastguard Worker 
1058*495ae853SAndroid Build Coastguard Worker             printf(
1059*495ae853SAndroid Build Coastguard Worker                 "FrameNum: %4d TimeTaken(microsec): %6d AvgTime: %6d "
1060*495ae853SAndroid Build Coastguard Worker                 "PeakAvgTimeMax: "
1061*495ae853SAndroid Build Coastguard Worker                 "%6d Output: %2d NumBytes: %6d \n",
1062*495ae853SAndroid Build Coastguard Worker                 u4_frm_cnt, s_elapsed_time, u4_tot_cycles / u4_frm_cnt, u4_peak_avg_max,
1063*495ae853SAndroid Build Coastguard Worker                 s_video_decode_op.s_ivd_op.u4_output_present,
1064*495ae853SAndroid Build Coastguard Worker                 s_video_decode_op.s_ivd_op.u4_num_bytes_consumed);
1065*495ae853SAndroid Build Coastguard Worker         }
1066*495ae853SAndroid Build Coastguard Worker #else
1067*495ae853SAndroid Build Coastguard Worker         printf("%d\n", s_video_decode_op.s_ivd_op.u4_num_bytes_consumed);
1068*495ae853SAndroid Build Coastguard Worker #endif
1069*495ae853SAndroid Build Coastguard Worker 
1070*495ae853SAndroid Build Coastguard Worker         if(ret != IV_SUCCESS)
1071*495ae853SAndroid Build Coastguard Worker         {
1072*495ae853SAndroid Build Coastguard Worker             pe_error_code[0] = s_video_decode_op.s_ivd_op.u4_error_code;
1073*495ae853SAndroid Build Coastguard Worker 
1074*495ae853SAndroid Build Coastguard Worker             return ret;
1075*495ae853SAndroid Build Coastguard Worker         }
1076*495ae853SAndroid Build Coastguard Worker 
1077*495ae853SAndroid Build Coastguard Worker         u4_num_bytes_dec = s_video_decode_op.s_ivd_op.u4_num_bytes_consumed;
1078*495ae853SAndroid Build Coastguard Worker 
1079*495ae853SAndroid Build Coastguard Worker         pu4_file_pos[0] += u4_num_bytes_dec;
1080*495ae853SAndroid Build Coastguard Worker         pu4_num_bytes_consumed[0] += u4_num_bytes_dec;
1081*495ae853SAndroid Build Coastguard Worker         pu4_ip_frm_ts[0]++;
1082*495ae853SAndroid Build Coastguard Worker 
1083*495ae853SAndroid Build Coastguard Worker         if(s_video_decode_op.s_ivd_op.u4_output_present)
1084*495ae853SAndroid Build Coastguard Worker         {
1085*495ae853SAndroid Build Coastguard Worker             char cur_fname[1000];
1086*495ae853SAndroid Build Coastguard Worker 
1087*495ae853SAndroid Build Coastguard Worker             char *extn = NULL;
1088*495ae853SAndroid Build Coastguard Worker 
1089*495ae853SAndroid Build Coastguard Worker             /* The objective is to dump the decoded frames into separate files
1090*495ae853SAndroid Build Coastguard Worker              * instead of dumping all the frames in one common file. Also, the
1091*495ae853SAndroid Build Coastguard Worker              * number of dumped frames at any given instance of time cannot exceed
1092*495ae853SAndroid Build Coastguard Worker              * 'frame_memory'
1093*495ae853SAndroid Build Coastguard Worker              */
1094*495ae853SAndroid Build Coastguard Worker             if(ps_app_ctxt->u4_file_save_flag)
1095*495ae853SAndroid Build Coastguard Worker             {
1096*495ae853SAndroid Build Coastguard Worker                 /* Locate the position of extension yuv */
1097*495ae853SAndroid Build Coastguard Worker                 extn = strstr((char *) ps_app_ctxt->s_mvc_app_files.au1_op_fname, "%d");
1098*495ae853SAndroid Build Coastguard Worker 
1099*495ae853SAndroid Build Coastguard Worker                 if(extn != NULL)
1100*495ae853SAndroid Build Coastguard Worker                 {
1101*495ae853SAndroid Build Coastguard Worker                     mvcd_output_write_stall(ps_app_ctxt->s_mvc_app_files.au1_op_fname,
1102*495ae853SAndroid Build Coastguard Worker                                             pu4_op_frm_ts[0]);
1103*495ae853SAndroid Build Coastguard Worker 
1104*495ae853SAndroid Build Coastguard Worker                     sprintf(cur_fname, (char *) ps_app_ctxt->s_mvc_app_files.au1_op_fname,
1105*495ae853SAndroid Build Coastguard Worker                             pu4_op_frm_ts[0]);
1106*495ae853SAndroid Build Coastguard Worker 
1107*495ae853SAndroid Build Coastguard Worker                     pps_op_file[0] = fopen(cur_fname, "wb");
1108*495ae853SAndroid Build Coastguard Worker 
1109*495ae853SAndroid Build Coastguard Worker                     if(NULL == pps_op_file[0])
1110*495ae853SAndroid Build Coastguard Worker                     {
1111*495ae853SAndroid Build Coastguard Worker                         pe_error_code[0] = IVD_MEM_ALLOC_FAILED;
1112*495ae853SAndroid Build Coastguard Worker 
1113*495ae853SAndroid Build Coastguard Worker                         return IV_FAIL;
1114*495ae853SAndroid Build Coastguard Worker                     }
1115*495ae853SAndroid Build Coastguard Worker                 }
1116*495ae853SAndroid Build Coastguard Worker             }
1117*495ae853SAndroid Build Coastguard Worker 
1118*495ae853SAndroid Build Coastguard Worker             if(u2_num_views > 1)
1119*495ae853SAndroid Build Coastguard Worker             {
1120*495ae853SAndroid Build Coastguard Worker                 if(s_video_decode_op.ps_view_disp_bufs[0].u4_y_wd !=
1121*495ae853SAndroid Build Coastguard Worker                    s_video_decode_op.ps_view_disp_bufs[1].u4_y_wd)
1122*495ae853SAndroid Build Coastguard Worker                 {
1123*495ae853SAndroid Build Coastguard Worker                     pe_error_code[0] = IVD_MEM_ALLOC_FAILED;
1124*495ae853SAndroid Build Coastguard Worker 
1125*495ae853SAndroid Build Coastguard Worker                     return IV_FAIL;
1126*495ae853SAndroid Build Coastguard Worker                 }
1127*495ae853SAndroid Build Coastguard Worker 
1128*495ae853SAndroid Build Coastguard Worker                 if(s_video_decode_op.ps_view_disp_bufs[0].u4_y_ht !=
1129*495ae853SAndroid Build Coastguard Worker                    s_video_decode_op.ps_view_disp_bufs[1].u4_y_ht)
1130*495ae853SAndroid Build Coastguard Worker                 {
1131*495ae853SAndroid Build Coastguard Worker                     pe_error_code[0] = IVD_MEM_ALLOC_FAILED;
1132*495ae853SAndroid Build Coastguard Worker 
1133*495ae853SAndroid Build Coastguard Worker                     return IV_FAIL;
1134*495ae853SAndroid Build Coastguard Worker                 }
1135*495ae853SAndroid Build Coastguard Worker             }
1136*495ae853SAndroid Build Coastguard Worker 
1137*495ae853SAndroid Build Coastguard Worker             mvcd_dump_output(ps_app_ctxt, s_video_decode_op.ps_view_disp_bufs, pps_op_file,
1138*495ae853SAndroid Build Coastguard Worker                              pps_op_chksum_file, u2_num_views);
1139*495ae853SAndroid Build Coastguard Worker 
1140*495ae853SAndroid Build Coastguard Worker             pu4_op_frm_ts[0]++;
1141*495ae853SAndroid Build Coastguard Worker         }
1142*495ae853SAndroid Build Coastguard Worker         else if((s_video_decode_op.s_ivd_op.u4_error_code >> IVD_FATALERROR) & 1)
1143*495ae853SAndroid Build Coastguard Worker         {
1144*495ae853SAndroid Build Coastguard Worker             pe_error_code[0] = s_video_decode_op.s_ivd_op.u4_error_code;
1145*495ae853SAndroid Build Coastguard Worker 
1146*495ae853SAndroid Build Coastguard Worker             return IV_FAIL;
1147*495ae853SAndroid Build Coastguard Worker         }
1148*495ae853SAndroid Build Coastguard Worker     }
1149*495ae853SAndroid Build Coastguard Worker 
1150*495ae853SAndroid Build Coastguard Worker #ifdef PROFILE_ENABLE
1151*495ae853SAndroid Build Coastguard Worker     printf("Summary\n");
1152*495ae853SAndroid Build Coastguard Worker     printf("Input filename                  : %s\n", ps_app_ctxt->s_mvc_app_files.au1_ip_fname);
1153*495ae853SAndroid Build Coastguard Worker     printf("Output Width                    : %-4d\n", ps_app_ctxt->u4_pic_wd);
1154*495ae853SAndroid Build Coastguard Worker     printf("Output Height                   : %-4d\n", ps_app_ctxt->u4_pic_ht);
1155*495ae853SAndroid Build Coastguard Worker 
1156*495ae853SAndroid Build Coastguard Worker     if(u4_frm_cnt)
1157*495ae853SAndroid Build Coastguard Worker     {
1158*495ae853SAndroid Build Coastguard Worker         double avg = u4_tot_cycles / u4_frm_cnt;
1159*495ae853SAndroid Build Coastguard Worker         double bytes_avg = pu4_num_bytes_consumed[0] / u4_frm_cnt;
1160*495ae853SAndroid Build Coastguard Worker         double bitrate = (bytes_avg * 8 * ps_app_ctxt->u4_fps) / 1000000;
1161*495ae853SAndroid Build Coastguard Worker 
1162*495ae853SAndroid Build Coastguard Worker         printf("Bitrate @ %2d u4_fps(mbps)          : %-6.2f\n", ps_app_ctxt->u4_fps, bitrate);
1163*495ae853SAndroid Build Coastguard Worker         printf("Average decode time(micro sec)  : %-6d\n", (WORD32) avg);
1164*495ae853SAndroid Build Coastguard Worker         printf("Avg Peak decode time(%2d frames) : %-6d\n", PEAK_WINDOW_SIZE,
1165*495ae853SAndroid Build Coastguard Worker                (WORD32) u4_peak_avg_max);
1166*495ae853SAndroid Build Coastguard Worker 
1167*495ae853SAndroid Build Coastguard Worker         avg = (u4_tot_cycles + u4_tot_fmt_cycles) * 1.0 / u4_frm_cnt;
1168*495ae853SAndroid Build Coastguard Worker         printf("FPS achieved (with format conv) : %-3.2f\n", 1000000 / avg);
1169*495ae853SAndroid Build Coastguard Worker     }
1170*495ae853SAndroid Build Coastguard Worker #endif
1171*495ae853SAndroid Build Coastguard Worker 
1172*495ae853SAndroid Build Coastguard Worker     return IV_SUCCESS;
1173*495ae853SAndroid Build Coastguard Worker }
1174*495ae853SAndroid Build Coastguard Worker 
mvcd_delete_decoder(mvc_dec_ctx_t * ps_app_ctxt)1175*495ae853SAndroid Build Coastguard Worker static IV_API_CALL_STATUS_T mvcd_delete_decoder(mvc_dec_ctx_t *ps_app_ctxt)
1176*495ae853SAndroid Build Coastguard Worker {
1177*495ae853SAndroid Build Coastguard Worker     imvcd_delete_ip_t s_delete_ip;
1178*495ae853SAndroid Build Coastguard Worker     imvcd_delete_op_t s_delete_op;
1179*495ae853SAndroid Build Coastguard Worker 
1180*495ae853SAndroid Build Coastguard Worker     s_delete_ip.s_ivd_ip.e_cmd = IVD_CMD_DELETE;
1181*495ae853SAndroid Build Coastguard Worker 
1182*495ae853SAndroid Build Coastguard Worker     s_delete_ip.s_ivd_ip.u4_size = sizeof(s_delete_ip.s_ivd_ip);
1183*495ae853SAndroid Build Coastguard Worker     s_delete_op.s_ivd_op.u4_size = sizeof(s_delete_op.s_ivd_op);
1184*495ae853SAndroid Build Coastguard Worker 
1185*495ae853SAndroid Build Coastguard Worker     return imvcd_api_function(ps_app_ctxt->ps_codec_obj, &s_delete_ip, &s_delete_op);
1186*495ae853SAndroid Build Coastguard Worker }
1187*495ae853SAndroid Build Coastguard Worker 
main(WORD32 argc,char * argv[])1188*495ae853SAndroid Build Coastguard Worker int main(WORD32 argc, char *argv[])
1189*495ae853SAndroid Build Coastguard Worker {
1190*495ae853SAndroid Build Coastguard Worker     mvc_dec_ctx_t s_app_ctxt;
1191*495ae853SAndroid Build Coastguard Worker     ivd_out_bufdesc_t s_out_buf;
1192*495ae853SAndroid Build Coastguard Worker 
1193*495ae853SAndroid Build Coastguard Worker     IV_API_CALL_STATUS_T ret;
1194*495ae853SAndroid Build Coastguard Worker     IVD_ERROR_CODES_T e_error_code;
1195*495ae853SAndroid Build Coastguard Worker 
1196*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_cfg_fname[STRLENGTH];
1197*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_error_str[STRLENGTH];
1198*495ae853SAndroid Build Coastguard Worker     UWORD32 i;
1199*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ip_buf_len;
1200*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_total_bytes_consumed;
1201*495ae853SAndroid Build Coastguard Worker     UWORD8 au1_view_file_names[STRLENGTH];
1202*495ae853SAndroid Build Coastguard Worker     UWORD16 u2_num_views;
1203*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_num_header_bytes;
1204*495ae853SAndroid Build Coastguard Worker 
1205*495ae853SAndroid Build Coastguard Worker     FILE *ps_cfg_file = NULL;
1206*495ae853SAndroid Build Coastguard Worker     FILE *ps_ip_file = NULL;
1207*495ae853SAndroid Build Coastguard Worker     FILE *aps_op_file[MAX_NUM_VIEWS] = {NULL};
1208*495ae853SAndroid Build Coastguard Worker     FILE *aps_op_chksum_file[MAX_NUM_VIEWS] = {NULL};
1209*495ae853SAndroid Build Coastguard Worker 
1210*495ae853SAndroid Build Coastguard Worker     UWORD8 *pu1_bs_buf = NULL;
1211*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_file_pos = 0;
1212*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_ip_frm_ts = 0, u4_op_frm_ts = 0;
1213*495ae853SAndroid Build Coastguard Worker     UWORD32 u4_bytes_remaining = 0;
1214*495ae853SAndroid Build Coastguard Worker 
1215*495ae853SAndroid Build Coastguard Worker     /* Usage */
1216*495ae853SAndroid Build Coastguard Worker     if(argc < 2)
1217*495ae853SAndroid Build Coastguard Worker     {
1218*495ae853SAndroid Build Coastguard Worker         mvcd_print_usage();
1219*495ae853SAndroid Build Coastguard Worker 
1220*495ae853SAndroid Build Coastguard Worker         exit(-1);
1221*495ae853SAndroid Build Coastguard Worker     }
1222*495ae853SAndroid Build Coastguard Worker     else if(argc == 2)
1223*495ae853SAndroid Build Coastguard Worker     {
1224*495ae853SAndroid Build Coastguard Worker         strcpy((char *) au1_cfg_fname, argv[1]);
1225*495ae853SAndroid Build Coastguard Worker     }
1226*495ae853SAndroid Build Coastguard Worker 
1227*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1228*495ae853SAndroid Build Coastguard Worker     /*                  Initialize Application parameters                  */
1229*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1230*495ae853SAndroid Build Coastguard Worker     strcpy((char *) s_app_ctxt.s_mvc_app_files.au1_ip_fname, "\0");
1231*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u4_disp_delay = 0;
1232*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u4_max_frm_ts = 100;
1233*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u4_loopback = 0;
1234*495ae853SAndroid Build Coastguard Worker     u4_file_pos = 0;
1235*495ae853SAndroid Build Coastguard Worker     u4_total_bytes_consumed = 0;
1236*495ae853SAndroid Build Coastguard Worker     u4_ip_frm_ts = 0;
1237*495ae853SAndroid Build Coastguard Worker     u4_op_frm_ts = 0;
1238*495ae853SAndroid Build Coastguard Worker 
1239*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u4_num_cores = DEFAULT_NUM_CORES;
1240*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.i4_degrade_type = 0;
1241*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.i4_degrade_pics = 0;
1242*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.e_arch = ARCH_X86_SSE42;
1243*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.e_soc = SOC_GENERIC;
1244*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u1_quit = 0;
1245*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u4_disable_dblk_level = 0;
1246*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u4_file_save_flag = 0;
1247*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u4_chksum_save_flag = 0;
1248*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.e_output_chroma_format = DEFAULT_COLOR_FORMAT;
1249*495ae853SAndroid Build Coastguard Worker 
1250*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
1251*495ae853SAndroid Build Coastguard Worker     /* Parse arguments                                                       */
1252*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
1253*495ae853SAndroid Build Coastguard Worker 
1254*495ae853SAndroid Build Coastguard Worker     /* Read command line arguments */
1255*495ae853SAndroid Build Coastguard Worker     if(argc > 2)
1256*495ae853SAndroid Build Coastguard Worker     {
1257*495ae853SAndroid Build Coastguard Worker         for(i = 1; i < (UWORD32) argc; i += 2)
1258*495ae853SAndroid Build Coastguard Worker         {
1259*495ae853SAndroid Build Coastguard Worker             if(CONFIG == mvcd_get_argument(argv[i]))
1260*495ae853SAndroid Build Coastguard Worker             {
1261*495ae853SAndroid Build Coastguard Worker                 strcpy((char *) au1_cfg_fname, argv[i + 1]);
1262*495ae853SAndroid Build Coastguard Worker 
1263*495ae853SAndroid Build Coastguard Worker                 if((ps_cfg_file = fopen((char *) au1_cfg_fname, "r")) == NULL)
1264*495ae853SAndroid Build Coastguard Worker                 {
1265*495ae853SAndroid Build Coastguard Worker                     sprintf((char *) au1_error_str, "Could not open Configuration file %s",
1266*495ae853SAndroid Build Coastguard Worker                             au1_cfg_fname);
1267*495ae853SAndroid Build Coastguard Worker 
1268*495ae853SAndroid Build Coastguard Worker                     mvcd_exit(au1_error_str);
1269*495ae853SAndroid Build Coastguard Worker                 }
1270*495ae853SAndroid Build Coastguard Worker                 mvcd_read_cfg_file(&s_app_ctxt, ps_cfg_file);
1271*495ae853SAndroid Build Coastguard Worker                 fclose(ps_cfg_file);
1272*495ae853SAndroid Build Coastguard Worker             }
1273*495ae853SAndroid Build Coastguard Worker             else
1274*495ae853SAndroid Build Coastguard Worker             {
1275*495ae853SAndroid Build Coastguard Worker                 mvcd_parse_argument(&s_app_ctxt, argv[i], argv[i + 1]);
1276*495ae853SAndroid Build Coastguard Worker             }
1277*495ae853SAndroid Build Coastguard Worker         }
1278*495ae853SAndroid Build Coastguard Worker     }
1279*495ae853SAndroid Build Coastguard Worker     else
1280*495ae853SAndroid Build Coastguard Worker     {
1281*495ae853SAndroid Build Coastguard Worker         if((ps_cfg_file = fopen((char *) au1_cfg_fname, "r")) == NULL)
1282*495ae853SAndroid Build Coastguard Worker         {
1283*495ae853SAndroid Build Coastguard Worker             sprintf((char *) au1_error_str, "Could not open Configuration file %s", au1_cfg_fname);
1284*495ae853SAndroid Build Coastguard Worker             mvcd_exit(au1_error_str);
1285*495ae853SAndroid Build Coastguard Worker         }
1286*495ae853SAndroid Build Coastguard Worker 
1287*495ae853SAndroid Build Coastguard Worker         mvcd_read_cfg_file(&s_app_ctxt, ps_cfg_file);
1288*495ae853SAndroid Build Coastguard Worker 
1289*495ae853SAndroid Build Coastguard Worker         fclose(ps_cfg_file);
1290*495ae853SAndroid Build Coastguard Worker     }
1291*495ae853SAndroid Build Coastguard Worker 
1292*495ae853SAndroid Build Coastguard Worker     if(strcmp((char *) s_app_ctxt.s_mvc_app_files.au1_ip_fname, "\0") == 0)
1293*495ae853SAndroid Build Coastguard Worker     {
1294*495ae853SAndroid Build Coastguard Worker         printf("\nNo input file given for decoding\n");
1295*495ae853SAndroid Build Coastguard Worker 
1296*495ae853SAndroid Build Coastguard Worker         exit(-1);
1297*495ae853SAndroid Build Coastguard Worker     }
1298*495ae853SAndroid Build Coastguard Worker 
1299*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1300*495ae853SAndroid Build Coastguard Worker     /*          create the file object for input file                      */
1301*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1302*495ae853SAndroid Build Coastguard Worker     ps_ip_file = fopen((char *) s_app_ctxt.s_mvc_app_files.au1_ip_fname, "rb");
1303*495ae853SAndroid Build Coastguard Worker 
1304*495ae853SAndroid Build Coastguard Worker     if(NULL == ps_ip_file)
1305*495ae853SAndroid Build Coastguard Worker     {
1306*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "Could not open input file %s",
1307*495ae853SAndroid Build Coastguard Worker                 s_app_ctxt.s_mvc_app_files.au1_ip_fname);
1308*495ae853SAndroid Build Coastguard Worker 
1309*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1310*495ae853SAndroid Build Coastguard Worker     }
1311*495ae853SAndroid Build Coastguard Worker 
1312*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1313*495ae853SAndroid Build Coastguard Worker     /*          create the file object for output file                     */
1314*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1315*495ae853SAndroid Build Coastguard Worker     /* If the filename does not contain %d, then output will be dumped to
1316*495ae853SAndroid Build Coastguard Worker        a single file and it is opened here */
1317*495ae853SAndroid Build Coastguard Worker     if((1 == s_app_ctxt.u4_file_save_flag) &&
1318*495ae853SAndroid Build Coastguard Worker        (strstr((char *) s_app_ctxt.s_mvc_app_files.au1_op_fname, "%d") == NULL))
1319*495ae853SAndroid Build Coastguard Worker     {
1320*495ae853SAndroid Build Coastguard Worker         mvcd_get_view_file_name(s_app_ctxt.s_mvc_app_files.au1_op_fname, au1_view_file_names, 0);
1321*495ae853SAndroid Build Coastguard Worker 
1322*495ae853SAndroid Build Coastguard Worker         aps_op_file[0] = fopen((char *) au1_view_file_names, "wb");
1323*495ae853SAndroid Build Coastguard Worker 
1324*495ae853SAndroid Build Coastguard Worker         if(NULL == aps_op_file[0])
1325*495ae853SAndroid Build Coastguard Worker         {
1326*495ae853SAndroid Build Coastguard Worker             const CHAR au1_explanatory_string[] = "Could not open output file ";
1327*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_error_str[STRLENGTH + sizeof(au1_explanatory_string) + 1];
1328*495ae853SAndroid Build Coastguard Worker 
1329*495ae853SAndroid Build Coastguard Worker             sprintf((char *) au1_error_str, "%s%s", au1_explanatory_string, au1_view_file_names);
1330*495ae853SAndroid Build Coastguard Worker             mvcd_exit(au1_error_str);
1331*495ae853SAndroid Build Coastguard Worker         }
1332*495ae853SAndroid Build Coastguard Worker     }
1333*495ae853SAndroid Build Coastguard Worker 
1334*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1335*495ae853SAndroid Build Coastguard Worker     /*          create the file object for check sum file                  */
1336*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1337*495ae853SAndroid Build Coastguard Worker     if((1 == s_app_ctxt.u4_chksum_save_flag) &&
1338*495ae853SAndroid Build Coastguard Worker        (strstr((char *) s_app_ctxt.s_mvc_app_files.au1_op_chksum_fname, "%d") == NULL))
1339*495ae853SAndroid Build Coastguard Worker     {
1340*495ae853SAndroid Build Coastguard Worker         mvcd_get_view_file_name(s_app_ctxt.s_mvc_app_files.au1_op_chksum_fname, au1_view_file_names,
1341*495ae853SAndroid Build Coastguard Worker                                 0);
1342*495ae853SAndroid Build Coastguard Worker         aps_op_chksum_file[0] = fopen((char *) au1_view_file_names, "wb");
1343*495ae853SAndroid Build Coastguard Worker 
1344*495ae853SAndroid Build Coastguard Worker         if(NULL == aps_op_chksum_file[0])
1345*495ae853SAndroid Build Coastguard Worker         {
1346*495ae853SAndroid Build Coastguard Worker             const CHAR au1_explanatory_string[] = "Could not open check sum file ";
1347*495ae853SAndroid Build Coastguard Worker             UWORD8 au1_error_str[STRLENGTH + sizeof(au1_explanatory_string) + 1];
1348*495ae853SAndroid Build Coastguard Worker 
1349*495ae853SAndroid Build Coastguard Worker             sprintf((char *) au1_error_str, "%s%s", au1_explanatory_string, au1_view_file_names);
1350*495ae853SAndroid Build Coastguard Worker             mvcd_exit(au1_error_str);
1351*495ae853SAndroid Build Coastguard Worker         }
1352*495ae853SAndroid Build Coastguard Worker     }
1353*495ae853SAndroid Build Coastguard Worker 
1354*495ae853SAndroid Build Coastguard Worker     /***************************/
1355*495ae853SAndroid Build Coastguard Worker     /* Create decoder instance */
1356*495ae853SAndroid Build Coastguard Worker     /***************************/
1357*495ae853SAndroid Build Coastguard Worker     ret = mvcd_create_decoder(&s_app_ctxt);
1358*495ae853SAndroid Build Coastguard Worker 
1359*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
1360*495ae853SAndroid Build Coastguard Worker     {
1361*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "Error in Create %8x\n", ret);
1362*495ae853SAndroid Build Coastguard Worker 
1363*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1364*495ae853SAndroid Build Coastguard Worker     }
1365*495ae853SAndroid Build Coastguard Worker 
1366*495ae853SAndroid Build Coastguard Worker     /**************/
1367*495ae853SAndroid Build Coastguard Worker     /* set params */
1368*495ae853SAndroid Build Coastguard Worker     /**************/
1369*495ae853SAndroid Build Coastguard Worker     ret = mvcd_set_decode_mode(&s_app_ctxt, IVD_DECODE_HEADER);
1370*495ae853SAndroid Build Coastguard Worker 
1371*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
1372*495ae853SAndroid Build Coastguard Worker     {
1373*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "\nError in Dec mode");
1374*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1375*495ae853SAndroid Build Coastguard Worker     }
1376*495ae853SAndroid Build Coastguard Worker 
1377*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
1378*495ae853SAndroid Build Coastguard Worker     /* set num of cores                                                      */
1379*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
1380*495ae853SAndroid Build Coastguard Worker     ret = mvcd_set_num_cores(&s_app_ctxt);
1381*495ae853SAndroid Build Coastguard Worker 
1382*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
1383*495ae853SAndroid Build Coastguard Worker     {
1384*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "\nError in setting number of cores");
1385*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1386*495ae853SAndroid Build Coastguard Worker     }
1387*495ae853SAndroid Build Coastguard Worker 
1388*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
1389*495ae853SAndroid Build Coastguard Worker     /* set processsor                                                        */
1390*495ae853SAndroid Build Coastguard Worker     /*************************************************************************/
1391*495ae853SAndroid Build Coastguard Worker     ret = mvcd_set_arch(&s_app_ctxt);
1392*495ae853SAndroid Build Coastguard Worker 
1393*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
1394*495ae853SAndroid Build Coastguard Worker     {
1395*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "\nError in setting Processor type");
1396*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1397*495ae853SAndroid Build Coastguard Worker     }
1398*495ae853SAndroid Build Coastguard Worker 
1399*495ae853SAndroid Build Coastguard Worker     /*****************/
1400*495ae853SAndroid Build Coastguard Worker     /* Header Decode */
1401*495ae853SAndroid Build Coastguard Worker     /*****************/
1402*495ae853SAndroid Build Coastguard Worker     ret = mvcd_decode_header(&s_app_ctxt, &s_out_buf, ps_ip_file, &e_error_code,
1403*495ae853SAndroid Build Coastguard Worker                              &u4_num_header_bytes, u4_ip_frm_ts);
1404*495ae853SAndroid Build Coastguard Worker 
1405*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
1406*495ae853SAndroid Build Coastguard Worker     {
1407*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "Error in header decode 0x%x\n", e_error_code);
1408*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1409*495ae853SAndroid Build Coastguard Worker     }
1410*495ae853SAndroid Build Coastguard Worker 
1411*495ae853SAndroid Build Coastguard Worker     u4_file_pos += u4_num_header_bytes;
1412*495ae853SAndroid Build Coastguard Worker     u4_total_bytes_consumed += u4_num_header_bytes;
1413*495ae853SAndroid Build Coastguard Worker 
1414*495ae853SAndroid Build Coastguard Worker     /****************/
1415*495ae853SAndroid Build Coastguard Worker     /* Get buf info */
1416*495ae853SAndroid Build Coastguard Worker     /****************/
1417*495ae853SAndroid Build Coastguard Worker     ret = mvcd_get_buf_info(&s_app_ctxt);
1418*495ae853SAndroid Build Coastguard Worker 
1419*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
1420*495ae853SAndroid Build Coastguard Worker     {
1421*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "Error in Get Buf Info %x",
1422*495ae853SAndroid Build Coastguard Worker                 s_app_ctxt.s_disp_buf_props.s_ivd_op.u4_error_code);
1423*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1424*495ae853SAndroid Build Coastguard Worker     }
1425*495ae853SAndroid Build Coastguard Worker 
1426*495ae853SAndroid Build Coastguard Worker     u2_num_views = s_app_ctxt.s_disp_buf_props.s_mvc_buf_info.u2_num_views;
1427*495ae853SAndroid Build Coastguard Worker     ASSERT(u2_num_views <= MAX_NUM_VIEWS);
1428*495ae853SAndroid Build Coastguard Worker 
1429*495ae853SAndroid Build Coastguard Worker     ret = mvcd_out_buf_alloc(&s_app_ctxt, &s_out_buf);
1430*495ae853SAndroid Build Coastguard Worker 
1431*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != ret)
1432*495ae853SAndroid Build Coastguard Worker     {
1433*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "Error in Out buf alloc\n");
1434*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1435*495ae853SAndroid Build Coastguard Worker     }
1436*495ae853SAndroid Build Coastguard Worker 
1437*495ae853SAndroid Build Coastguard Worker     /***************************************************************************/
1438*495ae853SAndroid Build Coastguard Worker     /*   create the file object for output file for other views(if present) */
1439*495ae853SAndroid Build Coastguard Worker     /***************************************************************************/
1440*495ae853SAndroid Build Coastguard Worker     for(i = 1; i < u2_num_views; i++)
1441*495ae853SAndroid Build Coastguard Worker     {
1442*495ae853SAndroid Build Coastguard Worker         if((1 == s_app_ctxt.u4_file_save_flag) &&
1443*495ae853SAndroid Build Coastguard Worker            (strstr((char *) s_app_ctxt.s_mvc_app_files.au1_op_fname, "%d") == NULL))
1444*495ae853SAndroid Build Coastguard Worker         {
1445*495ae853SAndroid Build Coastguard Worker             mvcd_get_view_file_name(s_app_ctxt.s_mvc_app_files.au1_op_fname, au1_view_file_names,
1446*495ae853SAndroid Build Coastguard Worker                                     i);
1447*495ae853SAndroid Build Coastguard Worker 
1448*495ae853SAndroid Build Coastguard Worker             aps_op_file[i] = fopen((char *) au1_view_file_names, "wb");
1449*495ae853SAndroid Build Coastguard Worker 
1450*495ae853SAndroid Build Coastguard Worker             if(NULL == aps_op_file[i])
1451*495ae853SAndroid Build Coastguard Worker             {
1452*495ae853SAndroid Build Coastguard Worker                 const UWORD8 au1_explanatory_string[] = "Could not open output file ";
1453*495ae853SAndroid Build Coastguard Worker                 UWORD8 au1_error_str[STRLENGTH + sizeof(au1_explanatory_string) + 1];
1454*495ae853SAndroid Build Coastguard Worker 
1455*495ae853SAndroid Build Coastguard Worker                 sprintf((char *) au1_error_str, "%s%s", au1_explanatory_string,
1456*495ae853SAndroid Build Coastguard Worker                         au1_view_file_names);
1457*495ae853SAndroid Build Coastguard Worker                 mvcd_exit(au1_error_str);
1458*495ae853SAndroid Build Coastguard Worker             }
1459*495ae853SAndroid Build Coastguard Worker         }
1460*495ae853SAndroid Build Coastguard Worker 
1461*495ae853SAndroid Build Coastguard Worker         if((1 == s_app_ctxt.u4_chksum_save_flag) &&
1462*495ae853SAndroid Build Coastguard Worker            (strstr((char *) s_app_ctxt.s_mvc_app_files.au1_op_chksum_fname, "%d") == NULL))
1463*495ae853SAndroid Build Coastguard Worker         {
1464*495ae853SAndroid Build Coastguard Worker             mvcd_get_view_file_name(s_app_ctxt.s_mvc_app_files.au1_op_chksum_fname,
1465*495ae853SAndroid Build Coastguard Worker                                     au1_view_file_names, i);
1466*495ae853SAndroid Build Coastguard Worker             aps_op_chksum_file[i] = fopen((char *) au1_view_file_names, "wb");
1467*495ae853SAndroid Build Coastguard Worker 
1468*495ae853SAndroid Build Coastguard Worker             if(NULL == aps_op_chksum_file[i])
1469*495ae853SAndroid Build Coastguard Worker             {
1470*495ae853SAndroid Build Coastguard Worker                 const UWORD8 au1_explanatory_string[] = "Could not open check sum file ";
1471*495ae853SAndroid Build Coastguard Worker                 UWORD8 au1_error_str[STRLENGTH + sizeof(au1_explanatory_string) + 1];
1472*495ae853SAndroid Build Coastguard Worker 
1473*495ae853SAndroid Build Coastguard Worker                 sprintf((char *) au1_error_str, "%s%s", au1_explanatory_string,
1474*495ae853SAndroid Build Coastguard Worker                         au1_view_file_names);
1475*495ae853SAndroid Build Coastguard Worker                 mvcd_exit(au1_error_str);
1476*495ae853SAndroid Build Coastguard Worker             }
1477*495ae853SAndroid Build Coastguard Worker         }
1478*495ae853SAndroid Build Coastguard Worker     }
1479*495ae853SAndroid Build Coastguard Worker 
1480*495ae853SAndroid Build Coastguard Worker     u4_ip_buf_len = s_app_ctxt.s_disp_buf_props.s_ivd_op.u4_min_in_buf_size[0];
1481*495ae853SAndroid Build Coastguard Worker     ret = mvcd_in_buf_alloc(&s_app_ctxt, &pu1_bs_buf);
1482*495ae853SAndroid Build Coastguard Worker 
1483*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != ret)
1484*495ae853SAndroid Build Coastguard Worker     {
1485*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "Error in In buf alloc\n");
1486*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1487*495ae853SAndroid Build Coastguard Worker     }
1488*495ae853SAndroid Build Coastguard Worker 
1489*495ae853SAndroid Build Coastguard Worker     ret = mvcd_decode_frame(&s_app_ctxt, &s_out_buf, ps_ip_file, aps_op_file, aps_op_chksum_file,
1490*495ae853SAndroid Build Coastguard Worker                             pu1_bs_buf, &e_error_code, &u4_total_bytes_consumed, &u4_file_pos,
1491*495ae853SAndroid Build Coastguard Worker                             &u4_ip_frm_ts, &u4_op_frm_ts, u4_ip_buf_len);
1492*495ae853SAndroid Build Coastguard Worker 
1493*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
1494*495ae853SAndroid Build Coastguard Worker     {
1495*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "Error in Frame decode 0x%x\n", e_error_code);
1496*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1497*495ae853SAndroid Build Coastguard Worker     }
1498*495ae853SAndroid Build Coastguard Worker 
1499*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1500*495ae853SAndroid Build Coastguard Worker     /*      To get the last decoded frames, call process with NULL input    */
1501*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1502*495ae853SAndroid Build Coastguard Worker     ret = mvcd_flush(&s_app_ctxt, &s_out_buf, aps_op_file, aps_op_chksum_file, pu1_bs_buf,
1503*495ae853SAndroid Build Coastguard Worker                      &u4_op_frm_ts, u4_ip_frm_ts, u4_bytes_remaining, u2_num_views);
1504*495ae853SAndroid Build Coastguard Worker 
1505*495ae853SAndroid Build Coastguard Worker     if(ret != IV_SUCCESS)
1506*495ae853SAndroid Build Coastguard Worker     {
1507*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "\nError in Setting the decoder in flush mode");
1508*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1509*495ae853SAndroid Build Coastguard Worker     }
1510*495ae853SAndroid Build Coastguard Worker 
1511*495ae853SAndroid Build Coastguard Worker     s_app_ctxt.u1_quit = 1;
1512*495ae853SAndroid Build Coastguard Worker 
1513*495ae853SAndroid Build Coastguard Worker     ret = mvcd_delete_decoder(&s_app_ctxt);
1514*495ae853SAndroid Build Coastguard Worker 
1515*495ae853SAndroid Build Coastguard Worker     if(IV_SUCCESS != ret)
1516*495ae853SAndroid Build Coastguard Worker     {
1517*495ae853SAndroid Build Coastguard Worker         sprintf((char *) au1_error_str, "Error in Codec delete");
1518*495ae853SAndroid Build Coastguard Worker         mvcd_exit(au1_error_str);
1519*495ae853SAndroid Build Coastguard Worker     }
1520*495ae853SAndroid Build Coastguard Worker 
1521*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1522*495ae853SAndroid Build Coastguard Worker     /*              Close all the files and free all the memory            */
1523*495ae853SAndroid Build Coastguard Worker     /***********************************************************************/
1524*495ae853SAndroid Build Coastguard Worker     fclose(ps_ip_file);
1525*495ae853SAndroid Build Coastguard Worker 
1526*495ae853SAndroid Build Coastguard Worker     for(i = 0; i < u2_num_views; i++)
1527*495ae853SAndroid Build Coastguard Worker     {
1528*495ae853SAndroid Build Coastguard Worker         if(aps_op_file[i])
1529*495ae853SAndroid Build Coastguard Worker         {
1530*495ae853SAndroid Build Coastguard Worker             fclose(aps_op_file[i]);
1531*495ae853SAndroid Build Coastguard Worker         }
1532*495ae853SAndroid Build Coastguard Worker 
1533*495ae853SAndroid Build Coastguard Worker         if(aps_op_chksum_file[i])
1534*495ae853SAndroid Build Coastguard Worker         {
1535*495ae853SAndroid Build Coastguard Worker             fclose(aps_op_chksum_file[i]);
1536*495ae853SAndroid Build Coastguard Worker         }
1537*495ae853SAndroid Build Coastguard Worker     }
1538*495ae853SAndroid Build Coastguard Worker 
1539*495ae853SAndroid Build Coastguard Worker     mvcd_in_buf_free(pu1_bs_buf);
1540*495ae853SAndroid Build Coastguard Worker 
1541*495ae853SAndroid Build Coastguard Worker     mvcd_out_buf_free(&s_out_buf);
1542*495ae853SAndroid Build Coastguard Worker 
1543*495ae853SAndroid Build Coastguard Worker     return (0);
1544*495ae853SAndroid Build Coastguard Worker }
1545