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