aboutsummaryrefslogtreecommitdiff
path: root/test/decoder
diff options
context:
space:
mode:
Diffstat (limited to 'test/decoder')
-rw-r--r--test/decoder/avcdec.cmake2
-rw-r--r--test/decoder/dec.cfg12
-rw-r--r--test/decoder/main.c3698
3 files changed, 0 insertions, 3712 deletions
diff --git a/test/decoder/avcdec.cmake b/test/decoder/avcdec.cmake
deleted file mode 100644
index c244131..0000000
--- a/test/decoder/avcdec.cmake
+++ /dev/null
@@ -1,2 +0,0 @@
-libavc_add_executable(avcdec libavcdec SOURCES ${AVC_ROOT}/test/decoder/main.c)
-target_compile_definitions(avcdec PRIVATE PROFILE_ENABLE MD5_DISABLE)
diff --git a/test/decoder/dec.cfg b/test/decoder/dec.cfg
deleted file mode 100644
index f452ea1..0000000
--- a/test/decoder/dec.cfg
+++ /dev/null
@@ -1,12 +0,0 @@
---input input.h264
---save_output 0
---num_frames -1
---output out.yuv
---chroma_format YUV_420P
---share_display_buf 0
---num_cores 3
---loopback 0
---display 0
---fps 59.94
---arch ARM_A9Q
---soc GENERIC
diff --git a/test/decoder/main.c b/test/decoder/main.c
deleted file mode 100644
index e90bdac..0000000
--- a/test/decoder/main.c
+++ /dev/null
@@ -1,3698 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *****************************************************************************
- * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
-*/
-/*****************************************************************************/
-/* */
-/* File Name : main.c */
-/* */
-/* Description : Contains an application that demonstrates use of H264*/
-/* decoder API */
-/* */
-/* List of Functions : */
-/* */
-/* Issues / Problems : None */
-/* */
-/* Revision History : */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 Harish Initial Version */
-/*****************************************************************************/
-/*****************************************************************************/
-/* File Includes */
-/*****************************************************************************/
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifdef X86_MINGW
-#include <signal.h>
-#endif
-
-#ifdef IOS_DISPLAY
-#include "cast_types.h"
-#else
-#include "ih264_typedefs.h"
-#endif
-
-#include "iv.h"
-#include "ivd.h"
-#include "ih264d.h"
-#include "ithread.h"
-
-#ifdef WINDOWS_TIMER
-#include <windows.h>
-#else
-#include <sys/time.h>
-#endif
-
-//#define ADAPTIVE_TEST
-#define ADAPTIVE_MAX_WD 4096
-#define ADAPTIVE_MAX_HT 2160
-
-#define ALIGN8(x) ((((x) + 7) >> 3) << 3)
-#define NUM_DISPLAY_BUFFERS 4
-#define DEFAULT_FPS 30
-
-#define ENABLE_DEGRADE 0
-#define MAX_DISP_BUFFERS 64
-#define EXTRA_DISP_BUFFERS 8
-#define STRLENGTH 1000
-#define STR2(x) #x
-#define STR(X) STR2(X)
-
-//#define TEST_FLUSH
-#define FLUSH_FRM_CNT 100
-//#define APP_EXTRA_BUFS 1
-
-#ifdef IOS
-#define PATHLENMAX 500
-char filename_with_path[PATHLENMAX];
-#endif
-
-#ifdef PROFILE_ENABLE
- #ifdef WINDOWS_TIMER
- typedef LARGE_INTEGER TIMER;
- #else
- //#ifdef GCC_TIMER
- typedef struct timeval TIMER;
- //#endif
- #endif
-#else
- typedef WORD32 TIMER;
-#endif
-
-#ifdef PROFILE_ENABLE
- #ifdef WINDOWS_TIMER
- #define GETTIME(timer) QueryPerformanceCounter(timer);
- #else
- //#ifdef GCC_TIMER
- #define GETTIME(timer) gettimeofday(timer,NULL);
- //#endif
- #endif
-
- #ifdef WINDOWS_TIMER
- #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency) \
- { \
- TIMER s_temp_time; \
- s_temp_time.LowPart = s_end_timer.LowPart - s_start_timer.LowPart ; \
- s_elapsed_time = (UWORD32) ( ((DOUBLE)s_temp_time.LowPart / (DOUBLE)frequency.LowPart ) * 1000000); \
- }
- #else
- //#ifdef GCC_TIMER
- #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency) \
- s_elapsed_time = ((s_end_timer.tv_sec - s_start_timer.tv_sec) * 1000000) + (s_end_timer.tv_usec - s_start_timer.tv_usec);
- //#endif
- #endif
-
-#else
- #define GETTIME(timer)
- #define ELAPSEDTIME(s_start_timer,s_end_timer, s_elapsed_time, frequency)
-#endif
-
-
-/* Function declarations */
-#ifndef MD5_DISABLE
-void calc_md5_cksum(UWORD8 *pu1_inbuf,UWORD32 u4_stride,UWORD32 u4_width,UWORD32 u4_height,UWORD8 *pu1_cksum_p );
-#else
-#define calc_md5_cksum(a, b, c, d, e)
-#endif
-#ifdef SDL_DISPLAY
-void* sdl_disp_init(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
-void sdl_alloc_disp_buffers(void *);
-void sdl_display(void *, WORD32 );
-void sdl_set_disp_buffers(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
-void sdl_disp_deinit(void *);
-void sdl_disp_usleep(UWORD32);
-IV_COLOR_FORMAT_T sdl_get_color_fmt(void);
-UWORD32 sdl_get_stride(void);
-#endif
-
-#ifdef INTEL_CE5300
-void* gdl_disp_init(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
-void gdl_alloc_disp_buffers(void *);
-void gdl_display(void *, WORD32 );
-void gdl_set_disp_buffers(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
-void gdl_disp_deinit(void *);
-void gdl_disp_usleep(UWORD32);
-IV_COLOR_FORMAT_T gdl_get_color_fmt(void);
-UWORD32 gdl_get_stride(void);
-#endif
-
-#ifdef FBDEV_DISPLAY
-void* fbd_disp_init(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
-void fbd_alloc_disp_buffers(void *);
-void fbd_display(void *, WORD32 );
-void fbd_set_disp_buffers(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
-void fbd_disp_deinit(void *);
-void fbd_disp_usleep(UWORD32);
-IV_COLOR_FORMAT_T fbd_get_color_fmt(void);
-UWORD32 fbd_get_stride(void);
-#endif
-
-#ifdef IOS_DISPLAY
-void* ios_disp_init(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
-void ios_alloc_disp_buffers(void *);
-void ios_display(void *, WORD32 );
-void ios_set_disp_buffers(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
-void ios_disp_deinit(void *);
-void ios_disp_usleep(UWORD32);
-IV_COLOR_FORMAT_T ios_get_color_fmt(void);
-UWORD32 ios_get_stride(void);
-#endif
-
-typedef struct
-{
- UWORD32 u4_piclen_flag;
- UWORD32 u4_file_save_flag;
- UWORD32 u4_frame_info_enable;
- UWORD32 u4_chksum_save_flag;
- UWORD32 u4_max_frm_ts;
- IV_COLOR_FORMAT_T e_output_chroma_format;
- IVD_ARCH_T e_arch;
- IVD_SOC_T e_soc;
- UWORD32 dump_q_rd_idx;
- UWORD32 dump_q_wr_idx;
- WORD32 disp_q_wr_idx;
- WORD32 disp_q_rd_idx;
-
- void *cocodec_obj;
- UWORD32 u4_share_disp_buf;
- UWORD32 num_disp_buf;
- UWORD32 b_pic_present;
- UWORD32 u4_disable_dblk_level;
- WORD32 i4_degrade_type;
- WORD32 i4_degrade_pics;
- UWORD32 u4_num_cores;
- UWORD32 disp_delay;
- WORD32 trace_enable;
- CHAR ac_trace_fname[STRLENGTH];
- CHAR ac_piclen_fname[STRLENGTH];
- CHAR ac_ip_fname[STRLENGTH];
- CHAR ac_op_fname[STRLENGTH];
- CHAR ac_qp_map_fname[STRLENGTH];
- CHAR ac_blk_type_map_fname[STRLENGTH];
- CHAR ac_op_chksum_fname[STRLENGTH];
- ivd_out_bufdesc_t s_disp_buffers[MAX_DISP_BUFFERS];
- iv_yuv_buf_t s_disp_frm_queue[MAX_DISP_BUFFERS];
- UWORD32 s_disp_frm_id_queue[MAX_DISP_BUFFERS];
- UWORD32 loopback;
- UWORD32 display;
- UWORD32 full_screen;
- UWORD32 fps;
-
- UWORD32 u4_strd;
-
- /* For signalling to display thread */
- UWORD32 u4_pic_wd;
- UWORD32 u4_pic_ht;
-
- /* For IOS diplay */
- WORD32 i4_screen_wd;
- WORD32 i4_screen_ht;
-
- //UWORD32 u4_output_present;
- WORD32 quit;
- WORD32 paused;
-
- /* Active threads present*/
- UWORD32 i4_active_threads;
-
- void *pv_disp_ctx;
- void *display_thread_handle;
- WORD32 display_thread_created;
- volatile WORD32 display_init_done;
- volatile WORD32 display_deinit_flag;
-
- void *(*disp_init)(UWORD32, UWORD32, WORD32, WORD32, WORD32, WORD32, WORD32, WORD32 *, WORD32 *);
- void (*alloc_disp_buffers)(void *);
- void (*display_buffer)(void *, WORD32);
- void (*set_disp_buffers)(void *, WORD32, UWORD8 **, UWORD8 **, UWORD8 **);
- void (*disp_deinit)(void *);
- void (*disp_usleep)(UWORD32);
- IV_COLOR_FORMAT_T (*get_color_fmt)(void);
- UWORD32 (*get_stride)(void);
-} vid_dec_ctx_t;
-
-
-
-typedef enum
-{
- INVALID,
- HELP,
- VERSION,
- INPUT_FILE,
- OUTPUT,
- QP_MAP_FILE,
- BLK_TYPE_MAP_FILE,
- CHKSUM,
- SAVE_OUTPUT,
- SAVE_FRAME_INFO,
- SAVE_CHKSUM,
- CHROMA_FORMAT,
- NUM_FRAMES,
- NUM_CORES,
- DISABLE_DEBLOCK_LEVEL,
- SHARE_DISPLAY_BUF,
- LOOPBACK,
- DISPLAY,
- FULLSCREEN,
- FPS,
- TRACE,
- CONFIG,
-
- DEGRADE_TYPE,
- DEGRADE_PICS,
- ARCH,
- SOC,
- PICLEN,
- PICLEN_FILE,
-
- KEEP_THREADS_ACTIVE,
-} ARGUMENT_T;
-
-typedef struct
-{
- CHAR argument_shortname[4];
- CHAR argument_name[128];
- ARGUMENT_T argument;
- CHAR description[512];
-} argument_t;
-
-static const argument_t argument_mapping[] =
-{
- {"-h", "--help", HELP,
- "Print this help\n"},
- { "-c", "--config", CONFIG,
- "config file (Default: test.cfg)\n" },
-
- {"-v", "--version", VERSION,
- "Version information\n"},
- {"-i", "--input", INPUT_FILE,
- "Input file\n"},
- {"-o", "--output", OUTPUT,
- "Output file\n"},
- {"--", "--qp_map_file", QP_MAP_FILE,
- "QP map file\n"},
- {"--", "--blk_type_map_file", BLK_TYPE_MAP_FILE,
- "Block type map file\n"},
- {"--", "--piclen", PICLEN,
- "Flag to signal if the decoder has to use a file containing number of bytes in each picture to be fed in each call\n"},
- {"--", "--piclen_file", PICLEN_FILE,
- "File containing number of bytes in each picture - each line containing one i4_size\n"},
- {"--", "--chksum", CHKSUM,
- "Output MD5 Checksum file\n"},
- { "-s", "--save_output", SAVE_OUTPUT,
- "Save Output file\n" },
- { "--", "--save_frame_info", SAVE_FRAME_INFO,
- "Save frame_info file\n" },
- { "--", "--save_chksum", SAVE_CHKSUM,
- "Save Check sum file\n" },
- {"--", "--chroma_format", CHROMA_FORMAT,
- "Output Chroma format Supported values YUV_420P, YUV_422ILE, RGB_565, YUV_420SP_UV, YUV_420SP_VU\n" },
- { "-n", "--num_frames", NUM_FRAMES,
- "Number of frames to be decoded\n" },
- { "--", "--num_cores", NUM_CORES,
- "Number of cores to be used\n" },
- { "--", "--share_display_buf", SHARE_DISPLAY_BUF,
- "Enable shared display buffer mode\n" },
- {"--", "--disable_deblock_level", DISABLE_DEBLOCK_LEVEL,
- "Disable deblocking level : 0 to 4 - 0 Enable deblocking 4 Disable deblocking completely\n"},
- { "--", "--loopback", LOOPBACK,
- "Enable playback in a loop\n" },
- { "--", "--display", DISPLAY,
- "Enable display (uses SDL)\n" },
- { "--", "--fullscreen", FULLSCREEN,
- "Enable full screen (Only for GDL and SDL)\n" },
- { "--", "--fps", FPS,
- "FPS to be used for display \n" },
- {"-i", "--trace", TRACE,
- "Trace file\n"},
-
- {"--", "--degrade_type", DEGRADE_TYPE,
- "Degrade type : 0: No degrade 0th bit set : Disable SAO 1st bit set : Disable deblocking 2nd bit set : Faster inter prediction filters 3rd bit set : Fastest inter prediction filters\n" },
- {"--", "--degrade_pics", DEGRADE_PICS,
- "Degrade pics : 0 : No degrade 1 : Only on non-reference frames 2 : Do not degrade every 4th or key frames 3 : All non-key frames 4 : All frames"},
-
- {"--", "--arch", ARCH,
- "Set Architecture. Supported values ARM_NONEON, ARM_A9Q, ARM_A7, ARM_A5, ARM_NEONINTR,ARMV8_GENERIC, X86_GENERIC, X86_SSSE3, X86_SSE4 \n" },
- {"--", "--soc", SOC,
- "Set SOC. Supported values GENERIC, HISI_37X \n" },
- {"--", "--keep_threads_active", KEEP_THREADS_ACTIVE,
- "Keep threads active"},
-
-};
-
-#define PEAK_WINDOW_SIZE 8
-#define DEFAULT_SHARE_DISPLAY_BUF 0
-#define STRIDE 0
-#define DEFAULT_NUM_CORES 1
-
-
-#define DUMP_SINGLE_BUF 0
-#define IV_ISFATALERROR(x) (((x) >> IVD_FATALERROR) & 0x1)
-
-#define ivd_api_function ih264d_api_function
-
-#ifdef IOS
-char filename_trace[PATHLENMAX];
-#endif
-
-#if ANDROID_NDK
-/*****************************************************************************/
-/* */
-/* Function Name : raise */
-/* */
-/* Description : Needed as a workaround when the application is built in */
-/* Android NDK. This is an exception to be called for divide*/
-/* by zero error */
-/* */
-/* Inputs : a */
-/* Globals : */
-/* Processing : None */
-/* */
-/* Outputs : */
-/* Returns : */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-int raise(int a)
-{
- printf("Divide by zero\n");
- return 0;
-}
-#endif
-
-#ifdef _WIN32
-/*****************************************************************************/
-/* Function to print library calls */
-/*****************************************************************************/
-/*****************************************************************************/
-/* */
-/* Function Name : memalign */
-/* */
-/* Description : Returns malloc data. Ideally should return aligned memory*/
-/* support alignment will be added later */
-/* */
-/* Inputs : alignment */
-/* i4_size */
-/* Globals : */
-/* Processing : */
-/* */
-/* Outputs : */
-/* Returns : */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-void * ih264a_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
-{
- (void)pv_ctxt;
- return (void *)_aligned_malloc(i4_size, alignment);
-}
-
-void ih264a_aligned_free(void *pv_ctxt, void *pv_buf)
-{
- (void)pv_ctxt;
- _aligned_free(pv_buf);
- return;
-}
-#endif
-
-#if IOS
-void * ih264a_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
-{
- (void)pv_ctxt;
- return malloc(i4_size);
-}
-
-void ih264a_aligned_free(void *pv_ctxt, void *pv_buf)
-{
- (void)pv_ctxt;
- free(pv_buf);
- return;
-}
-#endif
-
-#if (!defined(IOS)) && (!defined(_WIN32))
-void * ih264a_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
-{
- void *buf = NULL;
- (void)pv_ctxt;
- if (0 != posix_memalign(&buf, alignment, i4_size))
- {
- return NULL;
- }
- return buf;
-}
-
-void ih264a_aligned_free(void *pv_ctxt, void *pv_buf)
-{
- (void)pv_ctxt;
- free(pv_buf);
- return;
-}
-#endif
-/*****************************************************************************/
-/* */
-/* Function Name : set_degrade */
-/* */
-/* Description : Control call to set degrade level */
-/* */
-/* */
-/* Inputs : codec_obj - Codec Handle */
-/* type - degrade level value between 0 to 4 */
-/* 0 : No degrade */
-/* 1st bit : Disable SAO */
-/* 2nd bit : Disable Deblock */
-/* 3rd bit : Faster MC for non-ref */
-/* 4th bit : Fastest MC for non-ref */
-/* pics - Pictures that are are degraded */
-/* 0 : No degrade */
-/* 1 : Non-ref pictures */
-/* 2 : Pictures at given interval are not degraded */
-/* 3 : All non-key pictures */
-/* 4 : All pictures */
-/* Globals : */
-/* Processing : Calls degrade control to the codec */
-/* */
-/* Outputs : */
-/* Returns : Control call return i4_status */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-IV_API_CALL_STATUS_T set_degrade(void *codec_obj, UWORD32 type, WORD32 pics)
-{
- ih264d_ctl_degrade_ip_t s_ctl_ip;
- ih264d_ctl_degrade_op_t s_ctl_op;
- void *pv_api_ip, *pv_api_op;
- IV_API_CALL_STATUS_T e_dec_status;
-
- s_ctl_ip.u4_size = sizeof(ih264d_ctl_degrade_ip_t);
- s_ctl_ip.i4_degrade_type = type;
- s_ctl_ip.i4_nondegrade_interval = 4;
- s_ctl_ip.i4_degrade_pics = pics;
-
- s_ctl_op.u4_size = sizeof(ih264d_ctl_degrade_op_t);
-
- pv_api_ip = (void *)&s_ctl_ip;
- pv_api_op = (void *)&s_ctl_op;
-
- s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_ip.e_sub_cmd = (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_DEGRADE;
-
- e_dec_status = ivd_api_function((iv_obj_t *)codec_obj, pv_api_ip, pv_api_op);
-
- if(IV_SUCCESS != e_dec_status)
- {
- printf("Error in setting degrade level \n");
- }
- return (e_dec_status);
-
-}
-
-
-
-/*****************************************************************************/
-/* */
-/* Function Name : enable_skipb_frames */
-/* */
-/* Description : Control call to enable skipping of b frames */
-/* */
-/* */
-/* Inputs : codec_obj : Codec handle */
-/* Globals : */
-/* Processing : Calls enable skip B frames control */
-/* */
-/* Outputs : */
-/* Returns : Control call return i4_status */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-IV_API_CALL_STATUS_T enable_skipb_frames(void *codec_obj,
- vid_dec_ctx_t *ps_app_ctx)
-{
- ih264d_ctl_set_config_ip_t s_h264d_ctl_ip = {};
- ih264d_ctl_set_config_op_t s_h264d_ctl_op = {};
- ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
- ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
- IV_API_CALL_STATUS_T e_dec_status;
-
- ps_ctl_ip->u4_disp_wd = ps_app_ctx->u4_strd;
- ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_B;
-
- ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
- ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
- ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
- ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
- ps_ctl_ip->u4_size = sizeof(ih264d_ctl_set_config_ip_t);
- ps_ctl_op->u4_size = sizeof(ih264d_ctl_set_config_op_t);
-
- e_dec_status = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_h264d_ctl_ip,
- (void *)&s_h264d_ctl_op);
-
- if(IV_SUCCESS != e_dec_status)
- {
- printf("Error in Enable SkipB frames \n");
- }
-
- return e_dec_status;
-}
-/*****************************************************************************/
-/* */
-/* Function Name : disable_skipb_frames */
-/* */
-/* Description : Control call to disable skipping of b frames */
-/* */
-/* */
-/* Inputs : codec_obj : Codec handle */
-/* Globals : */
-/* Processing : Calls disable B frame skip control */
-/* */
-/* Outputs : */
-/* Returns : Control call return i4_status */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-IV_API_CALL_STATUS_T disable_skipb_frames(void *codec_obj,
- vid_dec_ctx_t *ps_app_ctx)
-{
- ih264d_ctl_set_config_ip_t s_h264d_ctl_ip = {};
- ih264d_ctl_set_config_op_t s_h264d_ctl_op = {};
- ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
- ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
- IV_API_CALL_STATUS_T e_dec_status;
-
- ps_ctl_ip->u4_disp_wd = ps_app_ctx->u4_strd;
- ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
-
- ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
- ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
- ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
- ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
- ps_ctl_ip->u4_size = sizeof(ih264d_ctl_set_config_ip_t);
- ps_ctl_op->u4_size = sizeof(ih264d_ctl_set_config_op_t);
-
- e_dec_status = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_h264d_ctl_ip,
- (void *)&s_h264d_ctl_op);
-
- if(IV_SUCCESS != e_dec_status)
- {
- printf("Error in Disable SkipB frames\n");
- }
-
- return e_dec_status;
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : enable_skippb_frames */
-/* */
-/* Description : Control call to enable skipping of P & B frames */
-/* */
-/* */
-/* Inputs : codec_obj : Codec handle */
-/* Globals : */
-/* Processing : Calls enable skip P and B frames control */
-/* */
-/* Outputs : */
-/* Returns : Control call return i4_status */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-IV_API_CALL_STATUS_T enable_skippb_frames(void *codec_obj,
- vid_dec_ctx_t *ps_app_ctx)
-{
- ih264d_ctl_set_config_ip_t s_h264d_ctl_ip = {};
- ih264d_ctl_set_config_op_t s_h264d_ctl_op = {};
- ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
- ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
- IV_API_CALL_STATUS_T e_dec_status;
-
- ps_ctl_ip->u4_disp_wd = ps_app_ctx->u4_strd;
- ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_PB;
-
- ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
- ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
- ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
- ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
- ps_ctl_ip->u4_size = sizeof(ih264d_ctl_set_config_ip_t);
- ps_ctl_op->u4_size = sizeof(ih264d_ctl_set_config_op_t);
-
- e_dec_status = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_h264d_ctl_ip,
- (void *)&s_h264d_ctl_op);
- if(IV_SUCCESS != e_dec_status)
- {
- printf("Error in Enable SkipPB frames\n");
- }
-
- return e_dec_status;
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : disable_skippb_frames */
-/* */
-/* Description : Control call to disable skipping of P and B frames */
-/* */
-/* */
-/* Inputs : codec_obj : Codec handle */
-/* Globals : */
-/* Processing : Calls disable P and B frame skip control */
-/* */
-/* Outputs : */
-/* Returns : Control call return i4_status */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-IV_API_CALL_STATUS_T disable_skippb_frames(void *codec_obj,
- vid_dec_ctx_t *ps_app_ctx)
-{
- ih264d_ctl_set_config_ip_t s_h264d_ctl_ip = {};
- ih264d_ctl_set_config_op_t s_h264d_ctl_op = {};
- ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
- ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
- IV_API_CALL_STATUS_T e_dec_status;
-
- ps_ctl_ip->u4_disp_wd = ps_app_ctx->u4_strd;
- ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
-
- ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
- ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
- ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
- ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
- ps_ctl_ip->u4_size = sizeof(ih264d_ctl_set_config_ip_t);
- ps_ctl_op->u4_size = sizeof(ih264d_ctl_set_config_op_t);
-
- e_dec_status = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_h264d_ctl_ip,
- (void *)&s_h264d_ctl_op);
- if(IV_SUCCESS != e_dec_status)
- {
- printf("Error in Disable SkipPB frames\n");
- }
-
- return e_dec_status;
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : release_disp_frame */
-/* */
-/* Description : Calls release display control - Used to signal to the */
-/* decoder that this particular buffer has been displayed */
-/* and that the codec is now free to write to this buffer */
-/* */
-/* */
-/* Inputs : codec_obj : Codec Handle */
-/* buf_id : Buffer Id of the buffer to be released */
-/* This id would have been returned earlier by */
-/* the codec */
-/* Globals : */
-/* Processing : Calls Release Display call */
-/* */
-/* Outputs : */
-/* Returns : Status of release display call */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-IV_API_CALL_STATUS_T release_disp_frame(void *codec_obj, UWORD32 buf_id)
-{
- ivd_rel_display_frame_ip_t s_video_rel_disp_ip;
- ivd_rel_display_frame_op_t s_video_rel_disp_op;
- IV_API_CALL_STATUS_T e_dec_status;
-
- s_video_rel_disp_ip.e_cmd = IVD_CMD_REL_DISPLAY_FRAME;
- s_video_rel_disp_ip.u4_size = sizeof(ivd_rel_display_frame_ip_t);
- s_video_rel_disp_op.u4_size = sizeof(ivd_rel_display_frame_op_t);
- s_video_rel_disp_ip.u4_disp_buf_id = buf_id;
-
- e_dec_status = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_video_rel_disp_ip,
- (void *)&s_video_rel_disp_op);
- if(IV_SUCCESS != e_dec_status)
- {
- printf("Error in Release Disp frame\n");
- }
-
-
- return (e_dec_status);
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : get_version */
-/* */
-/* Description : Control call to get codec version */
-/* */
-/* */
-/* Inputs : codec_obj : Codec handle */
-/* Globals : */
-/* Processing : Calls enable skip B frames control */
-/* */
-/* Outputs : */
-/* Returns : Control call return i4_status */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-IV_API_CALL_STATUS_T get_version(void *codec_obj)
-{
- ivd_ctl_getversioninfo_ip_t ps_ctl_ip;
- ivd_ctl_getversioninfo_op_t ps_ctl_op;
- UWORD8 au1_buf[512];
- IV_API_CALL_STATUS_T i4_status;
- ps_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- ps_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION;
- ps_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t);
- ps_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t);
- ps_ctl_ip.pv_version_buffer = au1_buf;
- ps_ctl_ip.u4_version_buffer_size = sizeof(au1_buf);
-
- i4_status = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&(ps_ctl_ip),
- (void *)&(ps_ctl_op));
-
- if(i4_status != IV_SUCCESS)
- {
- printf("Error in Getting Version number e_dec_status = %d u4_error_code = %x\n",
- i4_status, ps_ctl_op.u4_error_code);
- }
- else
- {
- printf("Ittiam Decoder Version number: %s\n",
- (char *)ps_ctl_ip.pv_version_buffer);
- }
- return i4_status;
-}
-/*****************************************************************************/
-/* */
-/* Function Name : codec_exit */
-/* */
-/* Description : handles unrecoverable errors */
-/* Inputs : Error message */
-/* Globals : None */
-/* Processing : Prints error message to console and exits. */
-/* Outputs : Error mesage to the console */
-/* Returns : None */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes (Describe the changes made) */
-/* 07 06 2006 Sankar Creation */
-/* */
-/*****************************************************************************/
-void codec_exit(CHAR *pc_err_message)
-{
- printf("Summary\n");
- printf("%s\n", pc_err_message);
- exit(-1);
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : dump_output */
-/* */
-/* Description : Used to dump output YUV */
-/* Inputs : App context, disp output desc, File pointer */
-/* Globals : None */
-/* Processing : Dumps to a file */
-/* Returns : None */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes (Describe the changes made) */
-/* 07 06 2006 Sankar Creation */
-/* */
-/*****************************************************************************/
-void dump_output(vid_dec_ctx_t *ps_app_ctx,
- iv_yuv_buf_t *ps_disp_frm_buf,
- ih264d_video_decode_op_t *ps_h264d_decode_op,
- UWORD32 u4_disp_frm_id,
- FILE *ps_op_file,
- FILE *ps_qp_file,
- FILE *ps_mb_type_file,
- FILE *ps_op_chksum_file,
- WORD32 i4_op_frm_ts,
- UWORD32 file_save,
- UWORD32 chksum_save,
- UWORD32 mbinfo_save)
-
-{
-
- UWORD32 i;
- iv_yuv_buf_t s_dump_disp_frm_buf;
- UWORD32 u4_disp_id;
-
- memset(&s_dump_disp_frm_buf, 0, sizeof(iv_yuv_buf_t));
-
- if(ps_app_ctx->u4_share_disp_buf)
- {
- if(ps_app_ctx->dump_q_wr_idx == MAX_DISP_BUFFERS)
- ps_app_ctx->dump_q_wr_idx = 0;
-
- if(ps_app_ctx->dump_q_rd_idx == MAX_DISP_BUFFERS)
- ps_app_ctx->dump_q_rd_idx = 0;
-
- ps_app_ctx->s_disp_frm_queue[ps_app_ctx->dump_q_wr_idx] =
- *ps_disp_frm_buf;
- ps_app_ctx->s_disp_frm_id_queue[ps_app_ctx->dump_q_wr_idx] =
- u4_disp_frm_id;
- ps_app_ctx->dump_q_wr_idx++;
-
- if((WORD32)i4_op_frm_ts >= (WORD32)(ps_app_ctx->disp_delay - 1))
- {
- s_dump_disp_frm_buf =
- ps_app_ctx->s_disp_frm_queue[ps_app_ctx->dump_q_rd_idx];
- u4_disp_id =
- ps_app_ctx->s_disp_frm_id_queue[ps_app_ctx->dump_q_rd_idx];
- ps_app_ctx->dump_q_rd_idx++;
- }
- else
- {
- return;
- }
- }
- else
- {
- s_dump_disp_frm_buf = *ps_disp_frm_buf;
- u4_disp_id = u4_disp_frm_id;
- }
-
- release_disp_frame(ps_app_ctx->cocodec_obj, u4_disp_id);
-
- if(0 == file_save && 0 == chksum_save && 0 == mbinfo_save)
- return;
-
- if(0 != mbinfo_save)
- {
- UWORD8 *buf;
- if(ps_h264d_decode_op->pu1_8x8_blk_qp_map && ps_qp_file)
- {
- buf = ps_h264d_decode_op->pu1_8x8_blk_qp_map;
- fwrite(buf, 1, ps_h264d_decode_op->u4_8x8_blk_qp_map_size, ps_qp_file);
- fflush(ps_qp_file);
- }
- if(ps_h264d_decode_op->pu1_8x8_blk_type_map && ps_mb_type_file)
- {
- buf = ps_h264d_decode_op->pu1_8x8_blk_type_map;
- fwrite(buf, 1, ps_h264d_decode_op->u4_8x8_blk_type_map_size, ps_mb_type_file);
- fflush(ps_mb_type_file);
- }
- }
-
- if(NULL == s_dump_disp_frm_buf.pv_y_buf)
- return;
-
- if(ps_app_ctx->e_output_chroma_format == IV_YUV_420P)
- {
-#if DUMP_SINGLE_BUF
- {
- UWORD8 *buf = s_dump_disp_frm_buf.pv_y_buf - 80 - (s_dump_disp_frm_buf.u4_y_strd * 80);
-
- UWORD32 i4_size = s_dump_disp_frm_buf.u4_y_strd * ((s_dump_disp_frm_buf.u4_y_ht + 160) + (s_dump_disp_frm_buf.u4_u_ht + 80));
- fwrite(buf, 1, i4_size ,ps_op_file);
-
- }
-#else
- if(0 != file_save && ps_op_file)
- {
- UWORD8 *buf;
-
-
- buf = (UWORD8 *)s_dump_disp_frm_buf.pv_y_buf;
- for(i = 0; i < s_dump_disp_frm_buf.u4_y_ht; i++)
- {
- fwrite(buf, 1, s_dump_disp_frm_buf.u4_y_wd, ps_op_file);
- buf += s_dump_disp_frm_buf.u4_y_strd;
- }
-
- buf = (UWORD8 *)s_dump_disp_frm_buf.pv_u_buf;
- for(i = 0; i < s_dump_disp_frm_buf.u4_u_ht; i++)
- {
- fwrite(buf, 1, s_dump_disp_frm_buf.u4_u_wd, ps_op_file);
- buf += s_dump_disp_frm_buf.u4_u_strd;
- }
- buf = (UWORD8 *)s_dump_disp_frm_buf.pv_v_buf;
- for(i = 0; i < s_dump_disp_frm_buf.u4_v_ht; i++)
- {
- fwrite(buf, 1, s_dump_disp_frm_buf.u4_v_wd, ps_op_file);
- buf += s_dump_disp_frm_buf.u4_v_strd;
- }
-
- }
-
- if(0 != chksum_save && ps_op_chksum_file)
- {
- UWORD8 au1_y_chksum[16];
- UWORD8 au1_u_chksum[16];
- UWORD8 au1_v_chksum[16];
- calc_md5_cksum((UWORD8 *)s_dump_disp_frm_buf.pv_y_buf,
- s_dump_disp_frm_buf.u4_y_strd,
- s_dump_disp_frm_buf.u4_y_wd,
- s_dump_disp_frm_buf.u4_y_ht,
- au1_y_chksum);
- calc_md5_cksum((UWORD8 *)s_dump_disp_frm_buf.pv_u_buf,
- s_dump_disp_frm_buf.u4_u_strd,
- s_dump_disp_frm_buf.u4_u_wd,
- s_dump_disp_frm_buf.u4_u_ht,
- au1_u_chksum);
- calc_md5_cksum((UWORD8 *)s_dump_disp_frm_buf.pv_v_buf,
- s_dump_disp_frm_buf.u4_v_strd,
- s_dump_disp_frm_buf.u4_v_wd,
- s_dump_disp_frm_buf.u4_v_ht,
- au1_v_chksum);
-
- fwrite(au1_y_chksum, sizeof(UWORD8), 16, ps_op_chksum_file);
- fwrite(au1_u_chksum, sizeof(UWORD8), 16, ps_op_chksum_file);
- fwrite(au1_v_chksum, sizeof(UWORD8), 16, ps_op_chksum_file);
- }
-#endif
- }
- else if((ps_app_ctx->e_output_chroma_format == IV_YUV_420SP_UV)
- || (ps_app_ctx->e_output_chroma_format == IV_YUV_420SP_VU))
- {
-#if DUMP_SINGLE_BUF
- {
-
- UWORD8 *buf = s_dump_disp_frm_buf.pv_y_buf - 24 - (s_dump_disp_frm_buf.u4_y_strd * 40);
-
- UWORD32 i4_size = s_dump_disp_frm_buf.u4_y_strd * ((s_dump_disp_frm_buf.u4_y_ht + 80) + (s_dump_disp_frm_buf.u4_u_ht + 40));
- fwrite(buf, 1, i4_size ,ps_op_file);
- }
-#else
- {
- UWORD8 *buf;
-
- buf = (UWORD8 *)s_dump_disp_frm_buf.pv_y_buf;
- for(i = 0; i < s_dump_disp_frm_buf.u4_y_ht; i++)
- {
- fwrite(buf, 1, s_dump_disp_frm_buf.u4_y_wd, ps_op_file);
- buf += s_dump_disp_frm_buf.u4_y_strd;
- }
-
- buf = (UWORD8 *)s_dump_disp_frm_buf.pv_u_buf;
- for(i = 0; i < s_dump_disp_frm_buf.u4_u_ht; i++)
- {
- fwrite(buf, 1, s_dump_disp_frm_buf.u4_u_wd, ps_op_file);
- buf += s_dump_disp_frm_buf.u4_u_strd;
- }
- }
-#endif
- }
- else if(ps_app_ctx->e_output_chroma_format == IV_RGBA_8888)
- {
- UWORD8 *buf;
-
- buf = (UWORD8 *)s_dump_disp_frm_buf.pv_y_buf;
- for(i = 0; i < s_dump_disp_frm_buf.u4_y_ht; i++)
- {
- fwrite(buf, 1, s_dump_disp_frm_buf.u4_y_wd * 4, ps_op_file);
- buf += s_dump_disp_frm_buf.u4_y_strd * 4;
- }
- }
- else
- {
- UWORD8 *buf;
-
- buf = (UWORD8 *)s_dump_disp_frm_buf.pv_y_buf;
- for(i = 0; i < s_dump_disp_frm_buf.u4_y_ht; i++)
- {
- fwrite(buf, 1, s_dump_disp_frm_buf.u4_y_strd * 2, ps_op_file);
- buf += s_dump_disp_frm_buf.u4_y_strd * 2;
- }
- }
-
- fflush(ps_op_file);
- fflush(ps_op_chksum_file);
-
-}
-
-
-/*****************************************************************************/
-/* */
-/* Function Name : print_usage */
-/* */
-/* Description : Prints argument format */
-/* */
-/* */
-/* Inputs : */
-/* Globals : */
-/* Processing : Prints argument format */
-/* */
-/* Outputs : */
-/* Returns : */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-void print_usage(void)
-{
- WORD32 i = 0;
- WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
- printf("\nUsage:\n");
- while(i < num_entries)
- {
- printf("%-32s\t %s", argument_mapping[i].argument_name,
- argument_mapping[i].description);
- i++;
- }
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : get_argument */
-/* */
-/* Description : Gets argument for a given string */
-/* */
-/* */
-/* Inputs : name */
-/* Globals : */
-/* Processing : Searches the given string in the array and returns */
-/* appropriate argument ID */
-/* */
-/* Outputs : Argument ID */
-/* Returns : Argument ID */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-ARGUMENT_T get_argument(CHAR *name)
-{
- WORD32 i = 0;
- WORD32 num_entries = sizeof(argument_mapping) / sizeof(argument_t);
- while(i < num_entries)
- {
- if((0 == strcmp(argument_mapping[i].argument_name, name)) ||
- ((0 == strcmp(argument_mapping[i].argument_shortname, name)) &&
- (0 != strcmp(argument_mapping[i].argument_shortname, "--"))))
- {
- return argument_mapping[i].argument;
- }
- i++;
- }
- return INVALID;
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : get_argument */
-/* */
-/* Description : Gets argument for a given string */
-/* */
-/* */
-/* Inputs : name */
-/* Globals : */
-/* Processing : Searches the given string in the array and returns */
-/* appropriate argument ID */
-/* */
-/* Outputs : Argument ID */
-/* Returns : Argument ID */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-void parse_argument(vid_dec_ctx_t *ps_app_ctx, CHAR *argument, CHAR *value)
-{
- ARGUMENT_T arg;
-
- arg = get_argument(argument);
- switch(arg)
- {
- case HELP:
- print_usage();
- exit(-1);
- case VERSION:
- break;
- case INPUT_FILE:
- sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_ip_fname);
- //input_passed = 1;
- break;
-
- case OUTPUT:
- sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_op_fname);
- break;
-
- case QP_MAP_FILE:
- sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_qp_map_fname);
- break;
-
- case BLK_TYPE_MAP_FILE:
- sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_blk_type_map_fname);
- break;
-
- case CHKSUM:
- sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_op_chksum_fname);
- break;
-
- case SAVE_OUTPUT:
- sscanf(value, "%d", &ps_app_ctx->u4_file_save_flag);
- break;
-
- case SAVE_FRAME_INFO:
- sscanf(value, "%d", &ps_app_ctx->u4_frame_info_enable);
- break;
-
- case SAVE_CHKSUM:
- sscanf(value, "%d", &ps_app_ctx->u4_chksum_save_flag);
- break;
-
- case CHROMA_FORMAT:
- if((strcmp(value, "YUV_420P")) == 0)
- ps_app_ctx->e_output_chroma_format = IV_YUV_420P;
- else if((strcmp(value, "YUV_422ILE")) == 0)
- ps_app_ctx->e_output_chroma_format = IV_YUV_422ILE;
- else if((strcmp(value, "RGB_565")) == 0)
- ps_app_ctx->e_output_chroma_format = IV_RGB_565;
- else if((strcmp(value, "RGBA_8888")) == 0)
- ps_app_ctx->e_output_chroma_format = IV_RGBA_8888;
- else if((strcmp(value, "YUV_420SP_UV")) == 0)
- ps_app_ctx->e_output_chroma_format = IV_YUV_420SP_UV;
- else if((strcmp(value, "YUV_420SP_VU")) == 0)
- ps_app_ctx->e_output_chroma_format = IV_YUV_420SP_VU;
- else
- {
- printf("\nInvalid colour format setting it to IV_YUV_420P\n");
- ps_app_ctx->e_output_chroma_format = IV_YUV_420P;
- }
-
- break;
- case NUM_FRAMES:
- sscanf(value, "%d", &ps_app_ctx->u4_max_frm_ts);
- break;
-
- case NUM_CORES:
- sscanf(value, "%d", &ps_app_ctx->u4_num_cores);
- break;
- case DEGRADE_PICS:
- sscanf(value, "%d", &ps_app_ctx->i4_degrade_pics);
- break;
- case DEGRADE_TYPE:
- sscanf(value, "%d", &ps_app_ctx->i4_degrade_type);
- break;
- case SHARE_DISPLAY_BUF:
- sscanf(value, "%d", &ps_app_ctx->u4_share_disp_buf);
- break;
- case LOOPBACK:
- sscanf(value, "%d", &ps_app_ctx->loopback);
- break;
- case DISPLAY:
-#if defined(SDL_DISPLAY) || defined(FBDEV_DISPLAY) || defined(INTEL_CE5300) || defined(IOS_DISPLAY)
- sscanf(value, "%d", &ps_app_ctx->display);
-#else
- ps_app_ctx->display = 0;
-#endif
- break;
- case FULLSCREEN:
- sscanf(value, "%d", &ps_app_ctx->full_screen);
- break;
- case FPS:
- sscanf(value, "%d", &ps_app_ctx->fps);
- if(ps_app_ctx->fps <= 0)
- ps_app_ctx->fps = DEFAULT_FPS;
- break;
- case ARCH:
- if((strcmp(value, "ARM_NONEON")) == 0)
- ps_app_ctx->e_arch = ARCH_ARM_NONEON;
- else if((strcmp(value, "ARM_A9Q")) == 0)
- ps_app_ctx->e_arch = ARCH_ARM_A9Q;
- else if((strcmp(value, "ARM_A7")) == 0)
- ps_app_ctx->e_arch = ARCH_ARM_A7;
- else if((strcmp(value, "ARM_A5")) == 0)
- ps_app_ctx->e_arch = ARCH_ARM_A5;
- else if((strcmp(value, "ARM_NEONINTR")) == 0)
- ps_app_ctx->e_arch = ARCH_ARM_NEONINTR;
- else if((strcmp(value, "X86_GENERIC")) == 0)
- ps_app_ctx->e_arch = ARCH_X86_GENERIC;
- else if((strcmp(value, "X86_SSSE3")) == 0)
- ps_app_ctx->e_arch = ARCH_X86_SSSE3;
- else if((strcmp(value, "X86_SSE42")) == 0)
- ps_app_ctx->e_arch = ARCH_X86_SSE42;
- else if((strcmp(value, "X86_AVX2")) == 0)
- ps_app_ctx->e_arch = ARCH_X86_AVX2;
- else if((strcmp(value, "MIPS_GENERIC")) == 0)
- ps_app_ctx->e_arch = ARCH_MIPS_GENERIC;
- else if((strcmp(value, "MIPS_32")) == 0)
- ps_app_ctx->e_arch = ARCH_MIPS_32;
- else if((strcmp(value, "ARMV8_GENERIC")) == 0)
- ps_app_ctx->e_arch = ARCH_ARMV8_GENERIC;
- else
- {
- printf("\nInvalid Arch. Setting it to ARM_A9Q\n");
- ps_app_ctx->e_arch = ARCH_ARM_A9Q;
- }
-
- break;
- case SOC:
- if((strcmp(value, "GENERIC")) == 0)
- ps_app_ctx->e_soc = SOC_GENERIC;
- else if((strcmp(value, "HISI_37X")) == 0)
- ps_app_ctx->e_soc = SOC_HISI_37X;
- else
- {
- ps_app_ctx->e_soc = atoi(value);
-/*
- printf("\nInvalid SOC. Setting it to GENERIC\n");
- ps_app_ctx->e_soc = SOC_GENERIC;
-*/
- }
- break;
- case PICLEN:
- sscanf(value, "%d", &ps_app_ctx->u4_piclen_flag);
- break;
-
- case PICLEN_FILE:
- sscanf(value, "%" STR(STRLENGTH) "s", ps_app_ctx->ac_piclen_fname);
- break;
- case DISABLE_DEBLOCK_LEVEL:
- sscanf(value, "%d", &ps_app_ctx->u4_disable_dblk_level);
- break;
- case KEEP_THREADS_ACTIVE:
- sscanf(value, "%d", &ps_app_ctx->i4_active_threads);
- break;
-
- case INVALID:
- default:
- printf("Ignoring argument : %s\n", argument);
- break;
- }
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : read_cfg_file */
-/* */
-/* Description : Reads arguments from a configuration file */
-/* */
-/* */
-/* Inputs : ps_app_ctx : Application context */
-/* fp_cfg_file : Configuration file handle */
-/* Globals : */
-/* Processing : Parses the arguments and fills in the application context*/
-/* */
-/* Outputs : Arguments parsed */
-/* Returns : None */
-/* */
-/* Issues : */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* */
-/*****************************************************************************/
-
-void read_cfg_file(vid_dec_ctx_t *ps_app_ctx, FILE *fp_cfg_file)
-{
-
- CHAR line[STRLENGTH];
- CHAR description[STRLENGTH];
- CHAR value[STRLENGTH];
- CHAR argument[STRLENGTH];
- void *ret;
- while(0 == feof(fp_cfg_file))
- {
- line[0] = '\0';
- ret = fgets(line, STRLENGTH, fp_cfg_file);
- if(NULL == ret)
- break;
- argument[0] = '\0';
- /* Reading Input File Name */
- sscanf(line, "%s %s %s", argument, value, description);
- if(argument[0] == '\0')
- continue;
-
- parse_argument(ps_app_ctx, argument, value);
- }
-
-
-}
-
-/*!
-**************************************************************************
-* \if Function name : dispq_producer_dequeue \endif
-*
-* \brief
-* This function gets a free buffer index where display data can be written
-* This is a blocking call and can be exited by setting quit to true in
-* the application context
-*
-* \param[in] ps_app_ctx : Pointer to application context
-*
-* \return
-* returns Next free buffer index for producer
-*
-* \author
-* Ittiam
-*
-**************************************************************************
-*/
-WORD32 dispq_producer_dequeue(vid_dec_ctx_t *ps_app_ctx)
-{
- WORD32 idx;
-
- /* If there is no free buffer wait */
-
- while(((ps_app_ctx->disp_q_wr_idx + 1) % NUM_DISPLAY_BUFFERS) == ps_app_ctx->disp_q_rd_idx)
- {
-
- ithread_msleep(1);
-
- if(ps_app_ctx->quit)
- return(-1);
- }
-
- idx = ps_app_ctx->disp_q_wr_idx;
- return (idx);
-}
-
-/*!
-**************************************************************************
-* \if Function name : dispq_producer_queue \endif
-*
-* \brief
-* This function adds buffer which can be displayed
-*
-* \param[in] ps_app_ctx : Pointer to application context
-*
-* \return
-* returns Next free buffer index for producer
-*
-* \author
-* Ittiam
-*
-**************************************************************************
-*/
-WORD32 dispq_producer_queue(vid_dec_ctx_t *ps_app_ctx)
-{
- ps_app_ctx->disp_q_wr_idx++;
- if(ps_app_ctx->disp_q_wr_idx == NUM_DISPLAY_BUFFERS)
- ps_app_ctx->disp_q_wr_idx = 0;
-
- return (0);
-}
-/*!
-**************************************************************************
-* \if Function name : dispq_consumer_dequeue \endif
-*
-* \brief
-* This function gets a free buffer index where display data can be written
-* This is a blocking call and can be exited by setting quit to true in
-* the application context
-*
-* \param[in] ps_app_ctx : Pointer to application context
-*
-* \return
-* returns Next free buffer index for producer
-*
-* \author
-* Ittiam
-*
-**************************************************************************
-*/
-WORD32 dispq_consumer_dequeue(vid_dec_ctx_t *ps_app_ctx)
-{
- WORD32 idx;
-
- /* If there is no free buffer wait */
-
- while(ps_app_ctx->disp_q_wr_idx == ps_app_ctx->disp_q_rd_idx)
- {
-
- ithread_msleep(1);
-
- if(ps_app_ctx->quit)
- return(-1);
- }
-
- idx = ps_app_ctx->disp_q_rd_idx;
- return (idx);
-}
-
-/*!
-**************************************************************************
-* \if Function name : dispq_producer_queue \endif
-*
-* \brief
-* This function adds buffer which can be displayed
-*
-* \param[in] ps_app_ctx : Pointer to application context
-*
-* \return
-* returns Next free buffer index for producer
-*
-* \author
-* Ittiam
-*
-**************************************************************************
-*/
-WORD32 dispq_consumer_queue(vid_dec_ctx_t *ps_app_ctx)
-{
- ps_app_ctx->disp_q_rd_idx++;
- if(ps_app_ctx->disp_q_rd_idx == NUM_DISPLAY_BUFFERS)
- ps_app_ctx->disp_q_rd_idx = 0;
-
- return (0);
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : display_thread */
-/* */
-/* Description : Thread to display the frame */
-/* */
-/* */
-/* Inputs : pv_ctx : Application context */
-/* */
-/* Globals : */
-/* Processing : Wait for a buffer to get produced by decoder and display */
-/* that frame */
-/* */
-/* Outputs : */
-/* Returns : None */
-/* */
-/* Issues : Pause followed by quit is making some deadlock condn */
-/* If decoder was lagging initially and then fasten up, */
-/* display will also go at faster rate till it reaches */
-/* equilibrium wrt the initial time */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 05 2013 100578 Initial Version */
-/* */
-/*****************************************************************************/
-
-WORD32 display_thread(void *pv_ctx)
-{
- vid_dec_ctx_t *ps_app_ctx = (vid_dec_ctx_t *) pv_ctx;
-
-
- UWORD32 frm_duration; /* in us */
- UWORD32 current_time;
- UWORD32 expected_time;
- TIMER s_end_timer;
- TIMER s_first_frame_time;
- UWORD32 first_frame_displayed;
-
-#ifdef WINDOWS_TIMER
- TIMER frequency;
-#endif
-
-#ifdef WINDOWS_TIMER
- QueryPerformanceFrequency ( &frequency);
-#endif
- first_frame_displayed = 0;
- expected_time = 0;
- frm_duration = 1000000/ps_app_ctx->fps;
-
- /* Init display and allocate display buffers */
- ps_app_ctx->pv_disp_ctx = (void *)ps_app_ctx->disp_init(ps_app_ctx->u4_pic_wd,
- ps_app_ctx->u4_pic_ht,
- ps_app_ctx->i4_screen_wd,
- ps_app_ctx->i4_screen_ht,
- ps_app_ctx->u4_pic_wd,
- ps_app_ctx->u4_pic_ht,
- ps_app_ctx->full_screen,
- &ps_app_ctx->quit,
- &ps_app_ctx->paused);
- ps_app_ctx->alloc_disp_buffers(ps_app_ctx->pv_disp_ctx);
-
- ps_app_ctx->display_init_done = 1;
-
- while(1)
- {
- WORD32 rd_idx;
-
- rd_idx = dispq_consumer_dequeue(ps_app_ctx);
- if (ps_app_ctx->quit)
- break;
-
- ps_app_ctx->display_buffer(ps_app_ctx->pv_disp_ctx, rd_idx);
-
- if(0 == first_frame_displayed)
- {
- GETTIME(&s_first_frame_time);
- first_frame_displayed = 1;
- }
-
- /*********************************************************************/
- /* Sleep based on the expected time of arrival of current buffer and */
- /* the Current frame */
- /*********************************************************************/
-
- GETTIME(&s_end_timer);
- ELAPSEDTIME(s_first_frame_time,s_end_timer,current_time,frequency);
-
- /* time in micro second */
- expected_time += frm_duration;
-
- //printf("current_time %d expected_time %d diff %d \n", current_time, expected_time, (expected_time - current_time));
- /* sleep for the diff. in time */
- if(current_time < expected_time)
- ps_app_ctx->disp_usleep((expected_time - current_time));
- else
- expected_time += (current_time - expected_time);
-
- dispq_consumer_queue(ps_app_ctx);
-
- }
-
-
- while(0 == ps_app_ctx->display_deinit_flag)
- {
- ps_app_ctx->disp_usleep(1000);
- }
- ps_app_ctx->disp_deinit(ps_app_ctx->pv_disp_ctx);
-
- return 0;
-}
-
-void output_write_stall(CHAR *fname, UWORD32 cur_frm_idx)
-{
- const UWORD8 threshold = 64;
- CHAR past_fname[1000];
- FILE *fp_fast_file = NULL;
-
- if (cur_frm_idx >= threshold)
- {
- sprintf(past_fname, fname, cur_frm_idx - threshold);
- do
- {
- fp_fast_file = fopen(past_fname,"rb");
- if (fp_fast_file != NULL)
- {
- fclose(fp_fast_file);
- /* Wait until the resource is released by a third party app*/
- ithread_msleep(5);
- }
- else
- break;
- } while(1);
- }
-}
-
-void flush_output(iv_obj_t *codec_obj,
- vid_dec_ctx_t *ps_app_ctx,
- ivd_out_bufdesc_t *ps_out_buf,
- UWORD8 *pu1_bs_buf,
- UWORD32 *pu4_op_frm_ts,
- FILE *ps_op_file,
- FILE *ps_qp_file,
- FILE *ps_mb_type_file,
- UWORD8 *pu1_qp_map_buf,
- UWORD8 *pu1_blk_type_map_buf,
- FILE *ps_op_chksum_file,
- UWORD32 u4_ip_frm_ts,
- UWORD32 u4_bytes_remaining)
-{
- WORD32 ret;
-
- do
- {
-
- ivd_ctl_flush_ip_t s_ctl_ip;
- ivd_ctl_flush_op_t s_ctl_op;
-
- if(*pu4_op_frm_ts >= (ps_app_ctx->u4_max_frm_ts + ps_app_ctx->disp_delay))
- break;
-
- s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH;
- s_ctl_ip.u4_size = sizeof(ivd_ctl_flush_ip_t);
- s_ctl_op.u4_size = sizeof(ivd_ctl_flush_op_t);
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_ip,
- (void *)&s_ctl_op);
-
- if(ret != IV_SUCCESS)
- {
- printf("Error in Setting the decoder in flush mode\n");
- }
-
- if(IV_SUCCESS == ret)
- {
- ih264d_video_decode_ip_t s_h264d_decode_ip = {};
- ih264d_video_decode_op_t s_h264d_decode_op = {};
- ivd_video_decode_ip_t *ps_video_decode_ip = &s_h264d_decode_ip.s_ivd_video_decode_ip_t;
- ivd_video_decode_op_t *ps_video_decode_op = &s_h264d_decode_op.s_ivd_video_decode_op_t;
-
- ps_video_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
- ps_video_decode_ip->u4_ts = u4_ip_frm_ts;
- ps_video_decode_ip->pv_stream_buffer = pu1_bs_buf;
- ps_video_decode_ip->u4_num_Bytes = u4_bytes_remaining;
- ps_video_decode_ip->u4_size = sizeof(ih264d_video_decode_ip_t);
- ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[0] =
- ps_out_buf->u4_min_out_buf_size[0];
- ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[1] =
- ps_out_buf->u4_min_out_buf_size[1];
- ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[2] =
- ps_out_buf->u4_min_out_buf_size[2];
-
- ps_video_decode_ip->s_out_buffer.pu1_bufs[0] =
- ps_out_buf->pu1_bufs[0];
- ps_video_decode_ip->s_out_buffer.pu1_bufs[1] =
- ps_out_buf->pu1_bufs[1];
- ps_video_decode_ip->s_out_buffer.pu1_bufs[2] =
- ps_out_buf->pu1_bufs[2];
- ps_video_decode_ip->s_out_buffer.u4_num_bufs =
- ps_out_buf->u4_num_bufs;
-
- ps_video_decode_op->u4_size = sizeof(ih264d_video_decode_op_t);
- s_h264d_decode_ip.pu1_8x8_blk_qp_map = pu1_qp_map_buf;
- s_h264d_decode_ip.pu1_8x8_blk_type_map = pu1_blk_type_map_buf;
- s_h264d_decode_ip.u4_8x8_blk_qp_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
- s_h264d_decode_ip.u4_8x8_blk_type_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
-
- /*****************************************************************************/
- /* API Call: Video Decode */
- /*****************************************************************************/
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_h264d_decode_ip,
- (void *)&s_h264d_decode_op);
-
- if(1 == ps_video_decode_op->u4_output_present)
- {
- CHAR cur_fname[1000];
- CHAR *extn = NULL;
- /* The objective is to dump the decoded frames into separate files instead of
- * dumping all the frames in one common file. Also, the number of dumped frames
- * at any given instance of time cannot exceed 'frame_memory'
- */
-
- /*************************************************************************/
- /* Get SEI MDCV parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_mdcv_params_present_flag)
- {
- ih264d_ctl_get_sei_mdcv_params_ip_t s_ctl_get_sei_mdcv_params_ip;
- ih264d_ctl_get_sei_mdcv_params_op_t s_ctl_get_sei_mdcv_params_op;
-
- memset(&s_ctl_get_sei_mdcv_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_mdcv_params_ip_t));
- memset(&s_ctl_get_sei_mdcv_params_op, 0,
- sizeof(ih264d_ctl_get_sei_mdcv_params_op_t));
-
- s_ctl_get_sei_mdcv_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_mdcv_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS;
- s_ctl_get_sei_mdcv_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_mdcv_params_ip_t);
- s_ctl_get_sei_mdcv_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_mdcv_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_ctl_get_sei_mdcv_params_ip,
- (void *)&s_ctl_get_sei_mdcv_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("MDCV SEI params not present : Error %x\n",
- s_ctl_get_sei_mdcv_params_op.u4_error_code);
- }
- }
- /*************************************************************************/
- /* Get SEI CLL parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_cll_params_present_flag)
- {
- ih264d_ctl_get_sei_cll_params_ip_t s_ctl_get_sei_cll_params_ip;
- ih264d_ctl_get_sei_cll_params_op_t s_ctl_get_sei_cll_params_op;
-
- memset(&s_ctl_get_sei_cll_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_cll_params_ip_t));
- memset(&s_ctl_get_sei_cll_params_op, 0,
- sizeof(ih264d_ctl_get_sei_cll_params_op_t));
-
- s_ctl_get_sei_cll_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_cll_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_SEI_CLL_PARAMS;
- s_ctl_get_sei_cll_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_cll_params_ip_t);
- s_ctl_get_sei_cll_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_cll_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_ctl_get_sei_cll_params_ip,
- (void *)&s_ctl_get_sei_cll_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("CLL SEI params not present : Error %x\n",
- s_ctl_get_sei_cll_params_op.u4_error_code);
- }
- }
- /*************************************************************************/
- /* Get SEI AVE parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_ave_params_present_flag)
- {
- ih264d_ctl_get_sei_ave_params_ip_t s_ctl_get_sei_ave_params_ip;
- ih264d_ctl_get_sei_ave_params_op_t s_ctl_get_sei_ave_params_op;
-
- memset(&s_ctl_get_sei_ave_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_ave_params_ip_t));
- memset(&s_ctl_get_sei_ave_params_op, 0,
- sizeof(ih264d_ctl_get_sei_ave_params_op_t));
-
- s_ctl_get_sei_ave_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_ave_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_SEI_AVE_PARAMS;
- s_ctl_get_sei_ave_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_ave_params_ip_t);
- s_ctl_get_sei_ave_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_ave_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_ctl_get_sei_ave_params_ip,
- (void *)&s_ctl_get_sei_ave_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("AVE SEI params not present : Error %x\n",
- s_ctl_get_sei_ave_params_op.u4_error_code);
- }
- }
- /*************************************************************************/
- /* Get SEI CCV parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_ccv_params_present_flag)
- {
- ih264d_ctl_get_sei_ccv_params_ip_t s_ctl_get_sei_ccv_params_ip;
- ih264d_ctl_get_sei_ccv_params_op_t s_ctl_get_sei_ccv_params_op;
-
- memset(&s_ctl_get_sei_ccv_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_ccv_params_ip_t));
- memset(&s_ctl_get_sei_ccv_params_op, 0,
- sizeof(ih264d_ctl_get_sei_ccv_params_op_t));
-
- s_ctl_get_sei_ccv_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_ccv_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_SEI_CCV_PARAMS;
- s_ctl_get_sei_ccv_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_ccv_params_ip_t);
- s_ctl_get_sei_ccv_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_ccv_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_ctl_get_sei_ccv_params_ip,
- (void *)&s_ctl_get_sei_ccv_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("CCV SEI params not present : Error %x\n",
- s_ctl_get_sei_ccv_params_op.u4_error_code);
- }
- }
- /*************************************************************************/
- /* Get SEI SII parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_sii_params_present_flag)
- {
- ih264d_ctl_get_sei_sii_params_ip_t s_ctl_get_sei_sii_params_ip = {0};
- ih264d_ctl_get_sei_sii_params_op_t s_ctl_get_sei_sii_params_op = {0};
-
- s_ctl_get_sei_sii_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_sii_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_SII_PARAMS;
- s_ctl_get_sei_sii_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_sii_params_ip_t);
- s_ctl_get_sei_sii_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_sii_params_op_t);
- ret = ivd_api_function((iv_obj_t *) codec_obj,
- (void *) &s_ctl_get_sei_sii_params_ip,
- (void *) &s_ctl_get_sei_sii_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("SII SEI params not present : Error %x\n",
- s_ctl_get_sei_sii_params_op.u4_error_code);
- }
- }
-
- /*************************************************************************/
- /* Get SEI film grain parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_fgc_params_present_flag)
- {
- ih264d_ctl_get_sei_fgc_params_ip_t s_ctl_get_sei_fgc_params_ip;
- ih264d_ctl_get_sei_fgc_params_op_t s_ctl_get_sei_fgc_params_op;
-
- memset(&s_ctl_get_sei_fgc_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_fgc_params_ip_t));
- memset(&s_ctl_get_sei_fgc_params_op, 0,
- sizeof(ih264d_ctl_get_sei_fgc_params_op_t));
-
- s_ctl_get_sei_fgc_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_fgc_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_FGC_PARAMS;
- s_ctl_get_sei_fgc_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_fgc_params_ip_t);
- s_ctl_get_sei_fgc_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_fgc_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *) codec_obj,
- (void *) &s_ctl_get_sei_fgc_params_ip,
- (void *) &s_ctl_get_sei_fgc_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("FGC SEI params not present : Error %x\n",
- s_ctl_get_sei_fgc_params_op.u4_error_code);
- }
- }
-
- if(ps_app_ctx->u4_file_save_flag)
- {
- /* Locate the position of extension yuv */
- extn = strstr(ps_app_ctx->ac_op_fname,"%d");
- if (extn != NULL)
- {
- output_write_stall(ps_app_ctx->ac_op_fname,*pu4_op_frm_ts);
- /* Generate output file names */
- sprintf(cur_fname,ps_app_ctx->ac_op_fname,*pu4_op_frm_ts);
- /* Open Output file */
- ps_op_file = fopen(cur_fname,"wb");
- if (NULL == ps_op_file)
- {
- CHAR ac_error_str[STRLENGTH];
- snprintf(ac_error_str, sizeof(ac_error_str),
- "Could not open output file %s", cur_fname);
-
- codec_exit(ac_error_str);
- }
- }
- }
-
- dump_output(ps_app_ctx, &(ps_video_decode_op->s_disp_frm_buf), &s_h264d_decode_op,
- ps_video_decode_op->u4_disp_buf_id, ps_op_file, ps_qp_file,
- ps_mb_type_file, ps_op_chksum_file, *pu4_op_frm_ts,
- ps_app_ctx->u4_file_save_flag, ps_app_ctx->u4_chksum_save_flag,
- ps_app_ctx->u4_frame_info_enable);
- if (extn != NULL)
- fclose(ps_op_file);
- (*pu4_op_frm_ts)++;
- }
- }
- }
- while(IV_SUCCESS == ret);
-
-}
-
-#ifdef X86_MINGW
-void sigsegv_handler()
-{
- printf("Segmentation fault, Exiting.. \n");
- exit(-1);
-}
-#endif
-
-UWORD32 default_get_stride(void)
-{
- return 0;
-}
-
-
-IV_COLOR_FORMAT_T default_get_color_fmt(void)
-{
- return IV_YUV_420P;
-}
-/*****************************************************************************/
-/* */
-/* Function Name : main */
-/* */
-/* Description : Application to demonstrate codec API */
-/* */
-/* */
-/* Inputs : argc - Number of arguments */
-/* argv[] - Arguments */
-/* Globals : */
-/* Processing : Shows how to use create, process, control and delete */
-/* */
-/* Outputs : Codec output in a file */
-/* Returns : */
-/* */
-/* Issues : Assumes both PROFILE_ENABLE to be */
-/* defined for multithread decode-display working */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes */
-/* 07 09 2012 100189 Initial Version */
-/* 09 05 2013 100578 Multithread decode-display */
-/*****************************************************************************/
-#ifdef IOS
-int h264dec_main(char * homedir,char *documentdir, int screen_wd, int screen_ht)
-#else
-int main(WORD32 argc, CHAR *argv[])
-#endif
-{
- CHAR ac_cfg_fname[STRLENGTH];
- FILE *fp_cfg_file = NULL;
- FILE *ps_piclen_file = NULL;
- FILE *ps_ip_file = NULL;
- FILE *ps_op_file = NULL;
- FILE *ps_qp_file = NULL;
- FILE *ps_mb_type_file = NULL;
- FILE *ps_op_chksum_file = NULL;
- WORD32 ret;
- CHAR ac_error_str[STRLENGTH];
- vid_dec_ctx_t s_app_ctx;
- UWORD8 *pu1_bs_buf = NULL;
- UWORD8 *pu1_qp_map_buf = NULL;
- UWORD8 *pu1_blk_type_map_buf = NULL;
-
- ivd_out_bufdesc_t *ps_out_buf;
- UWORD32 u4_num_bytes_dec = 0;
- UWORD32 file_pos = 0;
-
- UWORD32 u4_ip_frm_ts = 0, u4_op_frm_ts = 0;
-
- WORD32 u4_bytes_remaining = 0;
- UWORD32 i;
- UWORD32 u4_ip_buf_len;
- UWORD32 frm_cnt = 0;
- WORD32 total_bytes_comsumed;
- UWORD32 max_op_frm_ts;
- UWORD32 u4_num_disp_bufs_with_dec;
-
-#ifdef PROFILE_ENABLE
- UWORD32 u4_tot_cycles = 0;
- UWORD32 u4_tot_fmt_cycles = 0;
- UWORD32 peak_window[PEAK_WINDOW_SIZE];
- UWORD32 peak_window_idx = 0;
- UWORD32 peak_avg_max = 0;
-#ifdef INTEL_CE5300
- UWORD32 time_consumed = 0;
- UWORD32 bytes_consumed = 0;
-#endif
-#endif
-
-#ifdef WINDOWS_TIMER
- TIMER frequency;
-#endif
- WORD32 width = 0, height = 0;
- iv_obj_t *codec_obj;
-#if defined(GPU_BUILD) && !defined(X86)
-// int ioctl_init();
-// ioctl_init();
-#endif
-
-#ifdef X86_MINGW
- //For getting printfs without any delay
- setvbuf(stdout, NULL, _IONBF, 0);
- setvbuf(stderr, NULL, _IONBF, 0);
-#endif
-#ifdef IOS
- sprintf(filename_trace, "%s/iostrace.txt", homedir );
- printf("\ntrace file name = %s",filename_trace);
-#endif
-
-#ifdef X86_MINGW
- {
- signal(SIGSEGV, sigsegv_handler);
- }
-#endif
-
-
-#ifndef IOS
- /* Usage */
- if(argc < 2)
- {
- printf("Using test.cfg as configuration file \n");
- strcpy(ac_cfg_fname, "test.cfg");
- }
- else if(argc == 2)
- {
- strcpy(ac_cfg_fname, argv[1]);
- }
-
-#else
- strcpy(ac_cfg_fname, "test.cfg");
-
-#endif
-
-
- /***********************************************************************/
- /* Initialize Application parameters */
- /***********************************************************************/
-
- strcpy(s_app_ctx.ac_ip_fname, "\0");
- s_app_ctx.dump_q_wr_idx = 0;
- s_app_ctx.dump_q_rd_idx = 0;
- s_app_ctx.display_thread_created = 0;
- s_app_ctx.disp_q_wr_idx = 0;
- s_app_ctx.disp_q_rd_idx = 0;
- s_app_ctx.disp_delay = 0;
- s_app_ctx.loopback = 0;
- s_app_ctx.display = 0;
- s_app_ctx.full_screen = 0;
- s_app_ctx.u4_piclen_flag = 0;
- s_app_ctx.fps = DEFAULT_FPS;
- file_pos = 0;
- total_bytes_comsumed = 0;
- u4_ip_frm_ts = 0;
- u4_op_frm_ts = 0;
-#ifdef PROFILE_ENABLE
- memset(peak_window, 0, sizeof(WORD32) * PEAK_WINDOW_SIZE);
-#endif
- s_app_ctx.u4_share_disp_buf = DEFAULT_SHARE_DISPLAY_BUF;
- s_app_ctx.u4_num_cores = DEFAULT_NUM_CORES;
- s_app_ctx.i4_degrade_type = 0;
- s_app_ctx.i4_degrade_pics = 0;
- s_app_ctx.e_arch = ARCH_ARM_A9Q;
- s_app_ctx.e_soc = SOC_GENERIC;
-
- s_app_ctx.u4_strd = STRIDE;
-
- s_app_ctx.display_thread_handle = malloc(ithread_get_handle_size());
- s_app_ctx.quit = 0;
- s_app_ctx.paused = 0;
- //s_app_ctx.u4_output_present = 0;
- s_app_ctx.u4_chksum_save_flag = 0;
- s_app_ctx.u4_frame_info_enable = 0;
- s_app_ctx.i4_active_threads = 1;
-
- s_app_ctx.get_stride = &default_get_stride;
-
- s_app_ctx.get_color_fmt = &default_get_color_fmt;
-
- /* Set function pointers for display */
-#ifdef SDL_DISPLAY
- s_app_ctx.disp_init = &sdl_disp_init;
- s_app_ctx.alloc_disp_buffers = &sdl_alloc_disp_buffers;
- s_app_ctx.display_buffer = &sdl_display;
- s_app_ctx.set_disp_buffers = &sdl_set_disp_buffers;
- s_app_ctx.disp_deinit = &sdl_disp_deinit;
- s_app_ctx.disp_usleep = &sdl_disp_usleep;
- s_app_ctx.get_color_fmt = &sdl_get_color_fmt;
- s_app_ctx.get_stride = &sdl_get_stride;
-#endif
-
-#ifdef FBDEV_DISPLAY
- s_app_ctx.disp_init = &fbd_disp_init;
- s_app_ctx.alloc_disp_buffers = &fbd_alloc_disp_buffers;
- s_app_ctx.display_buffer = &fbd_display;
- s_app_ctx.set_disp_buffers = &fbd_set_disp_buffers;
- s_app_ctx.disp_deinit = &fbd_disp_deinit;
- s_app_ctx.disp_usleep = &fbd_disp_usleep;
- s_app_ctx.get_color_fmt = &fbd_get_color_fmt;
- s_app_ctx.get_stride = &fbd_get_stride;
-#endif
-
-#ifdef INTEL_CE5300
- s_app_ctx.disp_init = &gdl_disp_init;
- s_app_ctx.alloc_disp_buffers = &gdl_alloc_disp_buffers;
- s_app_ctx.display_buffer = &gdl_display;
- s_app_ctx.set_disp_buffers = &gdl_set_disp_buffers;
- s_app_ctx.disp_deinit = &gdl_disp_deinit;
- s_app_ctx.disp_usleep = &gdl_disp_usleep;
- s_app_ctx.get_color_fmt = &gdl_get_color_fmt;
- s_app_ctx.get_stride = &gdl_get_stride;
-#endif
-
-#ifdef IOS_DISPLAY
- s_app_ctx.disp_init = &ios_disp_init;
- s_app_ctx.alloc_disp_buffers = &ios_alloc_disp_buffers;
- s_app_ctx.display_buffer = &ios_display;
- s_app_ctx.set_disp_buffers = &ios_set_disp_buffers;
- s_app_ctx.disp_deinit = &ios_disp_deinit;
- s_app_ctx.disp_usleep = &ios_disp_usleep;
- s_app_ctx.get_color_fmt = &ios_get_color_fmt;
- s_app_ctx.get_stride = &ios_get_stride;
-#endif
-
- s_app_ctx.display_deinit_flag = 0;
- s_app_ctx.e_output_chroma_format = IV_YUV_420SP_UV;
- /*************************************************************************/
- /* Parse arguments */
- /*************************************************************************/
-
-#ifndef IOS
- /* Read command line arguments */
- if(argc > 2)
- {
- for(i = 1; i < (UWORD32)argc; i += 2)
- {
- if(CONFIG == get_argument(argv[i]))
- {
- strcpy(ac_cfg_fname, argv[i + 1]);
- if((fp_cfg_file = fopen(ac_cfg_fname, "r")) == NULL)
- {
- snprintf(ac_error_str, sizeof(ac_error_str),
- "Could not open Configuration file %s", ac_cfg_fname);
- codec_exit(ac_error_str);
- }
- read_cfg_file(&s_app_ctx, fp_cfg_file);
- fclose(fp_cfg_file);
- }
- else
- {
- parse_argument(&s_app_ctx, argv[i], argv[i + 1]);
- }
- }
- }
- else
- {
- if((fp_cfg_file = fopen(ac_cfg_fname, "r")) == NULL)
- {
- snprintf(ac_error_str, sizeof(ac_error_str), "Could not open Configuration file %s",
- ac_cfg_fname);
- codec_exit(ac_error_str);
- }
- read_cfg_file(&s_app_ctx, fp_cfg_file);
- fclose(fp_cfg_file);
- }
-#else
- snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", homedir, ac_cfg_fname);
- if((fp_cfg_file = fopen(filename_with_path, "r")) == NULL)
- {
- snprintf(ac_error_str, sizeof(ac_error_str),"Could not open Configuration file %s",
- ac_cfg_fname);
- codec_exit(ac_error_str);
-
- }
- read_cfg_file(&s_app_ctx, fp_cfg_file);
- fclose(fp_cfg_file);
-
-#endif
-#ifdef PRINT_PICSIZE
- /* If the binary is used for only getting number of bytes in each picture, then disable the following features */
- s_app_ctx.u4_piclen_flag = 0;
- s_app_ctx.u4_file_save_flag = 0;
- s_app_ctx.u4_chksum_save_flag = 0;
- s_app_ctx.i4_degrade_pics = 0;
- s_app_ctx.i4_degrade_type = 0;
- s_app_ctx.loopback = 0;
- s_app_ctx.u4_share_disp_buf = 0;
- s_app_ctx.display = 0;
-#endif
-
- /* If display is enabled, then turn off shared mode and get color format that is supported by display */
- if(1 == s_app_ctx.display)
- {
- s_app_ctx.u4_share_disp_buf = 0;
- s_app_ctx.e_output_chroma_format = s_app_ctx.get_color_fmt();
- }
- if(strcmp(s_app_ctx.ac_ip_fname, "\0") == 0)
- {
- printf("\nNo input file given for decoding\n");
- exit(-1);
- }
-
- if(1 == s_app_ctx.u4_frame_info_enable)
- {
- pu1_qp_map_buf = calloc((ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6, 1);
- pu1_blk_type_map_buf = calloc((ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6, 1);
- }
-
-
-
- /***********************************************************************/
- /* create the file object for input file */
- /***********************************************************************/
-#ifdef IOS
- snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", homedir, s_app_ctx.ac_ip_fname);
- ps_ip_file = fopen(filename_with_path, "rb");
-#else
- ps_ip_file = fopen(s_app_ctx.ac_ip_fname, "rb");
-#endif
- if(NULL == ps_ip_file)
- {
- snprintf(ac_error_str, sizeof(ac_error_str), "Could not open input file %s",
- s_app_ctx.ac_ip_fname);
- codec_exit(ac_error_str);
- }
- /***********************************************************************/
- /* create the file object for input file */
- /***********************************************************************/
- if(1 == s_app_ctx.u4_piclen_flag)
- {
-#ifdef IOS
- snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s",
- s_app_ctx.ac_piclen_fname);
- ps_piclen_file = fopen(filename_with_path, "rb");
-#else
- ps_piclen_file = fopen(s_app_ctx.ac_piclen_fname, "rb");
-#endif
- if(NULL == ps_piclen_file)
- {
- snprintf(ac_error_str, sizeof(ac_error_str), "Could not open piclen file %s",
- s_app_ctx.ac_piclen_fname);
- codec_exit(ac_error_str);
- }
- }
-
- /***********************************************************************/
- /* create the file object for output file */
- /***********************************************************************/
-
- /* If the filename does not contain %d, then output will be dumped to
- a single file and it is opened here */
- if((1 == s_app_ctx.u4_file_save_flag) && (strstr(s_app_ctx.ac_op_fname,"%d") == NULL))
- {
-#ifdef IOS
- snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", documentdir,
- s_app_ctx.ac_op_fname);
- ps_op_file = fopen(filename_with_path,"wb");
-#else
- ps_op_file = fopen(s_app_ctx.ac_op_fname, "wb");
-#endif
-
- if(NULL == ps_op_file)
- {
- snprintf(ac_error_str, sizeof(ac_error_str), "Could not open output file %s",
- s_app_ctx.ac_op_fname);
- codec_exit(ac_error_str);
- }
- }
-
- /***********************************************************************/
- /* create the file object for mbinfo file */
- /***********************************************************************/
-
- if(1 == s_app_ctx.u4_frame_info_enable)
- {
-#ifdef IOS
- snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", documentdir,
- s_app_ctx.ac_qp_map_fname);
- ps_qp_file = fopen(filename_with_path, "wb");
-
- snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", documentdir,
- s_app_ctx.ac_blk_type_map_fname);
- ps_mb_type_file = fopen(filename_with_path, "wb");
-#else
- ps_qp_file = fopen(s_app_ctx.ac_qp_map_fname, "wb");
- ps_mb_type_file = fopen(s_app_ctx.ac_blk_type_map_fname, "wb");
-
-#endif
-
- if(NULL == ps_qp_file)
- {
- snprintf(ac_error_str, sizeof(ac_error_str), "Could not open block_qp map file %s",
- s_app_ctx.ac_qp_map_fname);
- }
- if(NULL == ps_mb_type_file)
- {
- snprintf(ac_error_str, sizeof(ac_error_str), "Could not open block_type map file %s",
- s_app_ctx.ac_blk_type_map_fname);
- }
- }
-
- /***********************************************************************/
- /* create the file object for check sum file */
- /***********************************************************************/
- if(1 == s_app_ctx.u4_chksum_save_flag)
- {
-#if IOS
- snprintf(filename_with_path, sizeof(filename_with_path), "%s/%s", documentdir,
- s_app_ctx.ac_op_chksum_fname);
- ps_op_chksum_file = fopen(filename_with_path,"wb");
-#else
- ps_op_chksum_file = fopen(s_app_ctx.ac_op_chksum_fname, "wb");
-#endif
- if(NULL == ps_op_chksum_file)
- {
- snprintf(ac_error_str, sizeof(ac_error_str), "Could not open check sum file %s",
- s_app_ctx.ac_op_chksum_fname);
- codec_exit(ac_error_str);
- }
- }
- /***********************************************************************/
- /* Create decoder instance */
- /***********************************************************************/
- {
-
- ps_out_buf = (ivd_out_bufdesc_t *)malloc(sizeof(ivd_out_bufdesc_t));
-
- /*****************************************************************************/
- /* API Call: Initialize the Decoder */
- /*****************************************************************************/
- {
- ih264d_create_ip_t s_create_ip = {};
- ih264d_create_op_t s_create_op = {};
- void *fxns = &ivd_api_function;
-
- s_create_ip.s_ivd_create_ip_t.e_cmd = IVD_CMD_CREATE;
- s_create_ip.s_ivd_create_ip_t.u4_share_disp_buf = s_app_ctx.u4_share_disp_buf;
- s_create_ip.s_ivd_create_ip_t.e_output_format = (IV_COLOR_FORMAT_T)s_app_ctx.e_output_chroma_format;
- s_create_ip.s_ivd_create_ip_t.pf_aligned_alloc = ih264a_aligned_malloc;
- s_create_ip.s_ivd_create_ip_t.pf_aligned_free = ih264a_aligned_free;
- s_create_ip.s_ivd_create_ip_t.pv_mem_ctxt = NULL;
- s_create_ip.s_ivd_create_ip_t.u4_size = sizeof(ih264d_create_ip_t);
- s_create_op.s_ivd_create_op_t.u4_size = sizeof(ih264d_create_op_t);
- s_create_ip.u4_enable_frame_info = s_app_ctx.u4_frame_info_enable;
- s_create_ip.u4_keep_threads_active = s_app_ctx.i4_active_threads;
-
-
-
- ret = ivd_api_function(NULL, (void *)&s_create_ip,
- (void *)&s_create_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str, "Error in Create %8x\n",
- s_create_op.s_ivd_create_op_t.u4_error_code);
- codec_exit(ac_error_str);
- }
- codec_obj = (iv_obj_t*)s_create_op.s_ivd_create_op_t.pv_handle;
- codec_obj->pv_fxns = fxns;
- codec_obj->u4_size = sizeof(iv_obj_t);
- s_app_ctx.cocodec_obj = codec_obj;
-
- /*****************************************************************************/
- /* set stride */
- /*****************************************************************************/
- {
- ih264d_ctl_set_config_ip_t s_h264d_ctl_ip = {};
- ih264d_ctl_set_config_op_t s_h264d_ctl_op = {};
- ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
- ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
-
-
- ps_ctl_ip->u4_disp_wd = STRIDE;
- if(1 == s_app_ctx.display)
- ps_ctl_ip->u4_disp_wd = s_app_ctx.get_stride();
-
- ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
- ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
- ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_HEADER;
- ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
- ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
- ps_ctl_ip->u4_size = sizeof(ih264d_ctl_set_config_ip_t);
- ps_ctl_op->u4_size = sizeof(ih264d_ctl_set_config_op_t);
-
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_h264d_ctl_ip,
- (void *)&s_h264d_ctl_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str,
- "\nError in setting the stride");
- codec_exit(ac_error_str);
- }
- }
-
-
-
- }
-
- }
-
-
- /*************************************************************************/
- /* set num of cores */
- /*************************************************************************/
- {
-
- ih264d_ctl_set_num_cores_ip_t s_ctl_set_cores_ip;
- ih264d_ctl_set_num_cores_op_t s_ctl_set_cores_op;
-
- s_ctl_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_set_cores_ip.e_sub_cmd =(IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_SET_NUM_CORES;
- s_ctl_set_cores_ip.u4_num_cores = s_app_ctx.u4_num_cores;
- s_ctl_set_cores_ip.u4_size = sizeof(ih264d_ctl_set_num_cores_ip_t);
- s_ctl_set_cores_op.u4_size = sizeof(ih264d_ctl_set_num_cores_op_t);
-
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_ctl_set_cores_ip,
- (void *)&s_ctl_set_cores_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str, "\nError in setting number of cores");
- codec_exit(ac_error_str);
- }
-
- }
-
- /*************************************************************************/
- /* set processsor */
- /*************************************************************************/
- {
-
- ih264d_ctl_set_processor_ip_t s_ctl_set_num_processor_ip;
- ih264d_ctl_set_processor_op_t s_ctl_set_num_processor_op;
-
- s_ctl_set_num_processor_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_set_num_processor_ip.e_sub_cmd =(IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_SET_PROCESSOR;
- s_ctl_set_num_processor_ip.u4_arch = s_app_ctx.e_arch;
- s_ctl_set_num_processor_ip.u4_soc = s_app_ctx.e_soc;
- s_ctl_set_num_processor_ip.u4_size = sizeof(ih264d_ctl_set_processor_ip_t);
- s_ctl_set_num_processor_op.u4_size = sizeof(ih264d_ctl_set_processor_op_t);
-
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_ctl_set_num_processor_ip,
- (void *)&s_ctl_set_num_processor_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str, "\nError in setting Processor type");
- codec_exit(ac_error_str);
- }
-
- }
-
- flush_output(codec_obj, &s_app_ctx, ps_out_buf, pu1_bs_buf, &u4_op_frm_ts,
- ps_op_file, ps_qp_file, ps_mb_type_file,
- pu1_qp_map_buf, pu1_blk_type_map_buf,
- ps_op_chksum_file, u4_ip_frm_ts, u4_bytes_remaining);
-
- /*****************************************************************************/
- /* Decode header to get width and height and buffer sizes */
- /*****************************************************************************/
- {
- ih264d_video_decode_ip_t s_h264d_decode_ip = {};
- ih264d_video_decode_op_t s_h264d_decode_op = {};
- ivd_video_decode_ip_t *ps_video_decode_ip = &s_h264d_decode_ip.s_ivd_video_decode_ip_t;
- ivd_video_decode_op_t *ps_video_decode_op = &s_h264d_decode_op.s_ivd_video_decode_op_t;
-
-
-
- {
- ih264d_ctl_set_config_ip_t s_h264d_ctl_ip = {};
- ih264d_ctl_set_config_op_t s_h264d_ctl_op = {};
- ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
- ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
-
-
- ps_ctl_ip->u4_disp_wd = STRIDE;
- if(1 == s_app_ctx.display)
- ps_ctl_ip->u4_disp_wd = s_app_ctx.get_stride();
-
- ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
- ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
- ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_HEADER;
- ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
- ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
- ps_ctl_ip->u4_size = sizeof(ih264d_ctl_set_config_ip_t);
- ps_ctl_op->u4_size = sizeof(ih264d_ctl_set_config_op_t);
-
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_h264d_ctl_ip,
- (void *)&s_h264d_ctl_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str,
- "\nError in setting the codec in header decode mode");
- codec_exit(ac_error_str);
- }
- }
-
- /* Allocate input buffer for header */
- u4_ip_buf_len = 256 * 1024;
- pu1_bs_buf = (UWORD8 *)malloc(u4_ip_buf_len);
-
- if(pu1_bs_buf == NULL)
- {
- sprintf(ac_error_str,
- "\nAllocation failure for input buffer of i4_size %d",
- u4_ip_buf_len);
- codec_exit(ac_error_str);
- }
-
- do
- {
- WORD32 numbytes;
-
- if(0 == s_app_ctx.u4_piclen_flag)
- {
- fseek(ps_ip_file, file_pos, SEEK_SET);
- numbytes = u4_ip_buf_len;
- }
- else
- {
- WORD32 entries;
- entries = fscanf(ps_piclen_file, "%d\n", &numbytes);
- if(1 != entries)
- numbytes = u4_ip_buf_len;
- }
-
- u4_bytes_remaining = fread(pu1_bs_buf, sizeof(UWORD8), numbytes,
- ps_ip_file);
-
- if(0 == u4_bytes_remaining)
- {
- sprintf(ac_error_str, "\nUnable to read from input file");
- codec_exit(ac_error_str);
- }
-
- ps_video_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
- ps_video_decode_ip->u4_ts = u4_ip_frm_ts;
- ps_video_decode_ip->pv_stream_buffer = pu1_bs_buf;
- ps_video_decode_ip->u4_num_Bytes = u4_bytes_remaining;
- ps_video_decode_ip->u4_size = sizeof(ih264d_video_decode_ip_t);
- ps_video_decode_op->u4_size = sizeof(ih264d_video_decode_op_t);
- s_h264d_decode_ip.pu1_8x8_blk_qp_map = pu1_qp_map_buf;
- s_h264d_decode_ip.pu1_8x8_blk_type_map = pu1_blk_type_map_buf;
- s_h264d_decode_ip.u4_8x8_blk_qp_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
- s_h264d_decode_ip.u4_8x8_blk_type_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
-
- /*****************************************************************************/
- /* API Call: Header Decode */
- /*****************************************************************************/
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_h264d_decode_ip,
- (void *)&s_h264d_decode_op);
-
- if(ret != IV_SUCCESS)
- {
- printf("Error in header decode 0x%x\n", ps_video_decode_op->u4_error_code);
- // codec_exit(ac_error_str);
- }
-
- u4_num_bytes_dec = ps_video_decode_op->u4_num_bytes_consumed;
-#ifndef PROFILE_ENABLE
- printf("%d\n",ps_video_decode_op->u4_num_bytes_consumed);
-#endif
- file_pos += u4_num_bytes_dec;
- total_bytes_comsumed += u4_num_bytes_dec;
- }while(ret != IV_SUCCESS);
-
- /* copy pic_wd and pic_ht to initialize buffers */
- s_app_ctx.u4_pic_wd = ps_video_decode_op->u4_pic_wd;
- s_app_ctx.u4_pic_ht = ps_video_decode_op->u4_pic_ht;
-
- free(pu1_bs_buf);
-
-#if IOS_DISPLAY
- s_app_ctx.i4_screen_wd = screen_wd;
- s_app_ctx.i4_screen_ht = screen_ht;
-#endif
- {
-
- ivd_ctl_getbufinfo_ip_t s_ctl_ip;
- ivd_ctl_getbufinfo_op_t s_ctl_op;
- WORD32 outlen = 0;
-
- s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETBUFINFO;
- s_ctl_ip.u4_size = sizeof(ivd_ctl_getbufinfo_ip_t);
- s_ctl_op.u4_size = sizeof(ivd_ctl_getbufinfo_op_t);
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_ctl_ip,
- (void *)&s_ctl_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str, "Error in Get Buf Info %x", s_ctl_op.u4_error_code);
- codec_exit(ac_error_str);
- }
-
- /* Allocate bitstream buffer */
- u4_ip_buf_len = s_ctl_op.u4_min_in_buf_size[0];
-#ifdef ADAPTIVE_TEST
- u4_ip_buf_len = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 3 >> 1;
-#endif
- pu1_bs_buf = (UWORD8 *)malloc(u4_ip_buf_len);
-
- if(pu1_bs_buf == NULL)
- {
- sprintf(ac_error_str,
- "\nAllocation failure for input buffer of i4_size %d",
- u4_ip_buf_len);
- codec_exit(ac_error_str);
- }
-
- s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
- /* Allocate output buffer only if display buffers are not shared */
- /* Or if shared and output is 420P */
- if((0 == s_app_ctx.u4_share_disp_buf) || (IV_YUV_420P == s_app_ctx.e_output_chroma_format))
- {
-#ifdef ADAPTIVE_TEST
- switch(s_app_ctx.e_output_chroma_format)
- {
- case IV_YUV_420P:
- {
- s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT;
- s_ctl_op.u4_min_out_buf_size[1] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 2;
- s_ctl_op.u4_min_out_buf_size[2] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 2;
- break;
- }
- case IV_YUV_420SP_UV:
- case IV_YUV_420SP_VU:
- {
- s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT;
- s_ctl_op.u4_min_out_buf_size[1] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT >> 1;
- s_ctl_op.u4_min_out_buf_size[2] = 0;
- break;
- }
- case IV_YUV_422ILE:
- {
- s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 2;
- s_ctl_op.u4_min_out_buf_size[1] = 0;
- s_ctl_op.u4_min_out_buf_size[2] = 0;
- break;
- }
- case IV_RGBA_8888:
- {
- s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 4;
- s_ctl_op.u4_min_out_buf_size[1] = 0;
- s_ctl_op.u4_min_out_buf_size[2] = 0;
- break;
- }
- case IV_RGB_565:
- {
- s_ctl_op.u4_min_out_buf_size[0] = ADAPTIVE_MAX_WD * ADAPTIVE_MAX_HT * 2;
- s_ctl_op.u4_min_out_buf_size[1] = 0;
- s_ctl_op.u4_min_out_buf_size[2] = 0;
- break;
- }
- default:
- break;
-
- }
-#endif
- ps_out_buf->u4_min_out_buf_size[0] =
- s_ctl_op.u4_min_out_buf_size[0];
- ps_out_buf->u4_min_out_buf_size[1] =
- s_ctl_op.u4_min_out_buf_size[1];
- ps_out_buf->u4_min_out_buf_size[2] =
- s_ctl_op.u4_min_out_buf_size[2];
-
- outlen = s_ctl_op.u4_min_out_buf_size[0];
- if(s_ctl_op.u4_min_num_out_bufs > 1)
- outlen += s_ctl_op.u4_min_out_buf_size[1];
-
- if(s_ctl_op.u4_min_num_out_bufs > 2)
- outlen += s_ctl_op.u4_min_out_buf_size[2];
-
- ps_out_buf->pu1_bufs[0] = (UWORD8 *)malloc(outlen);
- if(ps_out_buf->pu1_bufs[0] == NULL)
- {
- sprintf(ac_error_str,
- "\nAllocation failure for output buffer of i4_size %d",
- outlen);
- codec_exit(ac_error_str);
- }
-
- if(s_ctl_op.u4_min_num_out_bufs > 1)
- ps_out_buf->pu1_bufs[1] = ps_out_buf->pu1_bufs[0]
- + (s_ctl_op.u4_min_out_buf_size[0]);
-
- if(s_ctl_op.u4_min_num_out_bufs > 2)
- ps_out_buf->pu1_bufs[2] = ps_out_buf->pu1_bufs[1]
- + (s_ctl_op.u4_min_out_buf_size[1]);
-
- ps_out_buf->u4_num_bufs = s_ctl_op.u4_min_num_out_bufs;
- }
-
-#ifdef APP_EXTRA_BUFS
- s_app_ctx.disp_delay = EXTRA_DISP_BUFFERS;
- s_ctl_op.u4_num_disp_bufs += EXTRA_DISP_BUFFERS;
-#endif
-
- /*****************************************************************************/
- /* API Call: Allocate display buffers for display buffer shared case */
- /*****************************************************************************/
-
- for(i = 0; i < s_ctl_op.u4_num_disp_bufs; i++)
- {
-
- s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[0] =
- s_ctl_op.u4_min_out_buf_size[0];
- s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[1] =
- s_ctl_op.u4_min_out_buf_size[1];
- s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[2] =
- s_ctl_op.u4_min_out_buf_size[2];
-
- outlen = s_ctl_op.u4_min_out_buf_size[0];
- if(s_ctl_op.u4_min_num_out_bufs > 1)
- outlen += s_ctl_op.u4_min_out_buf_size[1];
-
- if(s_ctl_op.u4_min_num_out_bufs > 2)
- outlen += s_ctl_op.u4_min_out_buf_size[2];
-
- s_app_ctx.s_disp_buffers[i].pu1_bufs[0] = (UWORD8 *)malloc(outlen);
-
- if(s_app_ctx.s_disp_buffers[i].pu1_bufs[0] == NULL)
- {
- sprintf(ac_error_str,
- "\nAllocation failure for output buffer of i4_size %d",
- outlen);
- codec_exit(ac_error_str);
- }
-
- if(s_ctl_op.u4_min_num_out_bufs > 1)
- s_app_ctx.s_disp_buffers[i].pu1_bufs[1] =
- s_app_ctx.s_disp_buffers[i].pu1_bufs[0]
- + (s_ctl_op.u4_min_out_buf_size[0]);
-
- if(s_ctl_op.u4_min_num_out_bufs > 2)
- s_app_ctx.s_disp_buffers[i].pu1_bufs[2] =
- s_app_ctx.s_disp_buffers[i].pu1_bufs[1]
- + (s_ctl_op.u4_min_out_buf_size[1]);
-
- s_app_ctx.s_disp_buffers[i].u4_num_bufs =
- s_ctl_op.u4_min_num_out_bufs;
- }
- s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
- }
-
- /* Create display thread and wait for the display buffers to be initialized */
- if(1 == s_app_ctx.display)
- {
- if(0 == s_app_ctx.display_thread_created)
- {
- s_app_ctx.display_init_done = 0;
- ithread_create(s_app_ctx.display_thread_handle, NULL,
- (void *) &display_thread, (void *) &s_app_ctx);
- s_app_ctx.display_thread_created = 1;
-
- while(1)
- {
- if(s_app_ctx.display_init_done)
- break;
-
- ithread_msleep(1);
- }
- }
-
- s_app_ctx.u4_strd = s_app_ctx.get_stride();
- }
- }
-
- /*************************************************************************/
- /* Get actual number of output buffers requried, which is dependent */
- /* on ps_bitstrm properties such as width, height and level etc */
- /* This is needed mainly for shared display mode */
- /*************************************************************************/
- //if(1 == s_app_ctx.u4_share_disp_buf)
- {
- /*****************************************************************************/
- /* API Call: Send the allocated display buffers to codec */
- /*****************************************************************************/
- {
- ivd_set_display_frame_ip_t s_set_display_frame_ip;
- ivd_set_display_frame_op_t s_set_display_frame_op;
-
- s_set_display_frame_ip.e_cmd = IVD_CMD_SET_DISPLAY_FRAME;
- s_set_display_frame_ip.u4_size = sizeof(ivd_set_display_frame_ip_t);
- s_set_display_frame_op.u4_size = sizeof(ivd_set_display_frame_op_t);
-
- s_set_display_frame_ip.num_disp_bufs = s_app_ctx.num_disp_buf;
-
- memcpy(&(s_set_display_frame_ip.s_disp_buffer),
- &(s_app_ctx.s_disp_buffers),
- s_app_ctx.num_disp_buf * sizeof(ivd_out_bufdesc_t));
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_set_display_frame_ip,
- (void *)&s_set_display_frame_op);
-
- if(IV_SUCCESS != ret)
- {
- sprintf(ac_error_str, "Error in Set display frame");
- codec_exit(ac_error_str);
- }
-
- }
-
- }
-
- /*************************************************************************/
- /* Get frame dimensions for display buffers such as x_offset,y_offset */
- /* etc. This information might be needed to set display buffer */
- /* offsets in case of shared display buffer mode */
- /*************************************************************************/
- {
-
- ih264d_ctl_get_frame_dimensions_ip_t s_ctl_get_frame_dimensions_ip;
- ih264d_ctl_get_frame_dimensions_op_t s_ctl_get_frame_dimensions_op;
-
- s_ctl_get_frame_dimensions_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_frame_dimensions_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_BUFFER_DIMENSIONS;
- s_ctl_get_frame_dimensions_ip.u4_size =
- sizeof(ih264d_ctl_get_frame_dimensions_ip_t);
- s_ctl_get_frame_dimensions_op.u4_size =
- sizeof(ih264d_ctl_get_frame_dimensions_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_get_frame_dimensions_ip,
- (void *)&s_ctl_get_frame_dimensions_op);
- if(IV_SUCCESS != ret)
- {
- sprintf(ac_error_str, "Error in Get buffer Dimensions");
- codec_exit(ac_error_str);
- }
-
-/*
- printf("Frame offsets due to padding\n");
- printf("s_ctl_get_frame_dimensions_op.x_offset[0] %d s_ctl_get_frame_dimensions_op.y_offset[0] %d\n",
- s_ctl_get_frame_dimensions_op.u4_x_offset[0],
- s_ctl_get_frame_dimensions_op.u4_y_offset[0]);
-*/
- }
-
- /*************************************************************************/
- /* Get VUI parameters */
- /*************************************************************************/
- {
-
- ih264d_ctl_get_vui_params_ip_t s_ctl_get_vui_params_ip;
- ih264d_ctl_get_vui_params_op_t s_ctl_get_vui_params_op;
-
- s_ctl_get_vui_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_vui_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_VUI_PARAMS;
- s_ctl_get_vui_params_ip.u4_size =
- sizeof(ih264d_ctl_get_vui_params_ip_t);
- s_ctl_get_vui_params_op.u4_size =
- sizeof(ih264d_ctl_get_vui_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_get_vui_params_ip,
- (void *)&s_ctl_get_vui_params_op);
- if(IV_SUCCESS != ret)
- {
- sprintf(ac_error_str, "Error in Get VUI params");
- //codec_exit(ac_error_str);
- }
- }
-
- /*************************************************************************/
- /* Set the decoder in frame decode mode. It was set in header decode */
- /* mode earlier */
- /*************************************************************************/
- {
-
- ih264d_ctl_set_config_ip_t s_h264d_ctl_ip = {};
- ih264d_ctl_set_config_op_t s_h264d_ctl_op = {};
- ivd_ctl_set_config_ip_t *ps_ctl_ip = &s_h264d_ctl_ip.s_ivd_ctl_set_config_ip_t;
- ivd_ctl_set_config_op_t *ps_ctl_op = &s_h264d_ctl_op.s_ivd_ctl_set_config_op_t;
-
- ps_ctl_ip->u4_disp_wd = STRIDE;
- if(1 == s_app_ctx.display)
- ps_ctl_ip->u4_disp_wd = s_app_ctx.get_stride();
- ps_ctl_ip->e_frm_skip_mode = IVD_SKIP_NONE;
-
- ps_ctl_ip->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
- ps_ctl_ip->e_vid_dec_mode = IVD_DECODE_FRAME;
- ps_ctl_ip->e_cmd = IVD_CMD_VIDEO_CTL;
- ps_ctl_ip->e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
- ps_ctl_ip->u4_size = sizeof(ih264d_ctl_set_config_ip_t);
-
- ps_ctl_op->u4_size = sizeof(ih264d_ctl_set_config_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_h264d_ctl_ip,
- (void *)&s_h264d_ctl_op);
-
- if(IV_SUCCESS != ret)
- {
- sprintf(ac_error_str, "Error in Set Parameters");
- //codec_exit(ac_error_str);
- }
-
- }
- /*************************************************************************/
- /* If required disable deblocking and sao at given level */
- /*************************************************************************/
-
- set_degrade(codec_obj, s_app_ctx.i4_degrade_type, s_app_ctx.i4_degrade_pics);
-#ifdef WINDOWS_TIMER
- QueryPerformanceFrequency ( &frequency);
-#endif
-#ifndef PRINT_PICSIZE
- get_version(codec_obj);
-#endif
-
-
- max_op_frm_ts = s_app_ctx.u4_max_frm_ts + s_app_ctx.disp_delay;
-
- if(max_op_frm_ts < s_app_ctx.disp_delay)
- max_op_frm_ts = 0xffffffff;/* clip as overflow has occured*/
-
- max_op_frm_ts = (s_app_ctx.u4_max_frm_ts > 0)? (max_op_frm_ts): 0xffffffff;
-
- u4_num_disp_bufs_with_dec = 0;
-
- while(u4_op_frm_ts < max_op_frm_ts)
- {
-
-#ifdef TEST_FLUSH
- if(u4_ip_frm_ts == FLUSH_FRM_CNT)
- {
- ivd_ctl_flush_ip_t s_ctl_ip;
- ivd_ctl_flush_op_t s_ctl_op;
-
- s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH;
- s_ctl_ip.u4_size = sizeof(ivd_ctl_flush_ip_t);
- s_ctl_op.u4_size = sizeof(ivd_ctl_flush_op_t);
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_ip,
- (void *)&s_ctl_op);
-
- if(ret != IV_SUCCESS)
- {
- printf("Error in Setting the decoder in flush mode\n");
- }
-// file_pos = 0;
-
-// fseek(ps_ip_file, file_pos, SEEK_SET);
-
- }
-#endif
- if(u4_num_disp_bufs_with_dec < s_app_ctx.num_disp_buf)
- {
- release_disp_frame(codec_obj, u4_num_disp_bufs_with_dec);
- u4_num_disp_bufs_with_dec ++;
- }
-
-
- /*************************************************************************/
- /* set num of cores */
- /*************************************************************************/
-#ifdef DYNAMIC_NUMCORES
- {
-
- ih264d_ctl_set_num_cores_ip_t s_ctl_set_cores_ip;
- ih264d_ctl_set_num_cores_op_t s_ctl_set_cores_op;
-
- s_ctl_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_set_cores_ip.e_sub_cmd = IH264D_CMD_CTL_SET_NUM_CORES;
- s_ctl_set_cores_ip.u4_num_cores = 1 + 3 * (u4_ip_frm_ts % 2);
- s_ctl_set_cores_ip.u4_size = sizeof(ih264d_ctl_set_num_cores_ip_t);
- s_ctl_set_cores_op.u4_size = sizeof(ih264d_ctl_set_num_cores_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_set_cores_ip,
- (void *)&s_ctl_set_cores_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str, "\nError in setting number of cores");
- codec_exit(ac_error_str);
- }
-
- }
-#endif
- /***********************************************************************/
- /* Seek the file to start of current frame, this is equavelent of */
- /* having a parcer which tells the start of current frame */
- /***********************************************************************/
- {
- WORD32 numbytes;
-
- if(0 == s_app_ctx.u4_piclen_flag)
- {
- fseek(ps_ip_file, file_pos, SEEK_SET);
- numbytes = u4_ip_buf_len;
- }
- else
- {
- WORD32 entries;
- entries = fscanf(ps_piclen_file, "%d\n", &numbytes);
- if(1 != entries)
- numbytes = u4_ip_buf_len;
- }
-
- u4_bytes_remaining = fread(pu1_bs_buf, sizeof(UWORD8),
- numbytes, ps_ip_file);
-
- if(u4_bytes_remaining == 0)
- {
- if(1 == s_app_ctx.loopback)
- {
- file_pos = 0;
- if(0 == s_app_ctx.u4_piclen_flag)
- {
- fseek(ps_ip_file, file_pos, SEEK_SET);
- numbytes = u4_ip_buf_len;
- }
- else
- {
- WORD32 entries;
- entries = fscanf(ps_piclen_file, "%d\n", &numbytes);
- if(1 != entries)
- numbytes = u4_ip_buf_len;
- }
-
-
- u4_bytes_remaining = fread(pu1_bs_buf, sizeof(UWORD8),
- numbytes, ps_ip_file);
- }
- else
- break;
- }
- }
-
- /*********************************************************************/
- /* Following calls can be enabled at diffent times */
- /*********************************************************************/
-#if ENABLE_DEGRADE
- if(u4_op_frm_ts >= 10000)
- disable_deblocking(codec_obj, 4);
-
- if(u4_op_frm_ts == 30000)
- enable_deblocking(codec_obj);
-
- if(u4_op_frm_ts == 10000)
- enable_skippb_frames(codec_obj);
-
- if(u4_op_frm_ts == 60000)
- disable_skippb_frames(codec_obj);
-
- if(u4_op_frm_ts == 30000)
- enable_skipb_frames(codec_obj);
-
- if(u4_op_frm_ts == 60000)
- disable_skipb_frames(codec_obj);
-#endif
-
-
- {
- ih264d_video_decode_ip_t s_h264d_decode_ip = {};
- ih264d_video_decode_op_t s_h264d_decode_op = {};
- ivd_video_decode_ip_t *ps_video_decode_ip = &s_h264d_decode_ip.s_ivd_video_decode_ip_t;
- ivd_video_decode_op_t *ps_video_decode_op = &s_h264d_decode_op.s_ivd_video_decode_op_t;
-#ifdef PROFILE_ENABLE
- UWORD32 s_elapsed_time;
- TIMER s_start_timer;
- TIMER s_end_timer;
-#endif
-
-
- ps_video_decode_ip->e_cmd = IVD_CMD_VIDEO_DECODE;
- ps_video_decode_ip->u4_ts = u4_ip_frm_ts;
- ps_video_decode_ip->pv_stream_buffer = pu1_bs_buf;
- ps_video_decode_ip->u4_num_Bytes = u4_bytes_remaining;
- ps_video_decode_ip->u4_size = sizeof(ih264d_video_decode_ip_t);
- ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[0] =
- ps_out_buf->u4_min_out_buf_size[0];
- ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[1] =
- ps_out_buf->u4_min_out_buf_size[1];
- ps_video_decode_ip->s_out_buffer.u4_min_out_buf_size[2] =
- ps_out_buf->u4_min_out_buf_size[2];
-
- ps_video_decode_ip->s_out_buffer.pu1_bufs[0] =
- ps_out_buf->pu1_bufs[0];
- ps_video_decode_ip->s_out_buffer.pu1_bufs[1] =
- ps_out_buf->pu1_bufs[1];
- ps_video_decode_ip->s_out_buffer.pu1_bufs[2] =
- ps_out_buf->pu1_bufs[2];
- ps_video_decode_ip->s_out_buffer.u4_num_bufs =
- ps_out_buf->u4_num_bufs;
- ps_video_decode_op->u4_size = sizeof(ih264d_video_decode_op_t);
- s_h264d_decode_ip.pu1_8x8_blk_qp_map = pu1_qp_map_buf;
- s_h264d_decode_ip.pu1_8x8_blk_type_map = pu1_blk_type_map_buf;
- s_h264d_decode_ip.u4_8x8_blk_qp_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
- s_h264d_decode_ip.u4_8x8_blk_type_map_size = (ADAPTIVE_MAX_HT * ADAPTIVE_MAX_WD) >> 6;
-
- /* Get display buffer pointers */
- if(1 == s_app_ctx.display)
- {
- WORD32 wr_idx;
-
- wr_idx = dispq_producer_dequeue(&s_app_ctx);
-
- if(s_app_ctx.quit)
- break;
-
- s_app_ctx.set_disp_buffers(s_app_ctx.pv_disp_ctx, wr_idx,
- &ps_video_decode_ip->s_out_buffer.pu1_bufs[0],
- &ps_video_decode_ip->s_out_buffer.pu1_bufs[1],
- &ps_video_decode_ip->s_out_buffer.pu1_bufs[2]);
- }
-
- /*****************************************************************************/
- /* API Call: Video Decode */
- /*****************************************************************************/
-
- GETTIME(&s_start_timer);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_h264d_decode_ip,
- (void *)&s_h264d_decode_op);
-
-
- GETTIME(&s_end_timer);
- ELAPSEDTIME(s_start_timer,s_end_timer,s_elapsed_time,frequency);
-#ifdef PROFILE_ENABLE
- {
- UWORD32 peak_avg, id;
- u4_tot_cycles += s_elapsed_time;
- peak_window[peak_window_idx++] = s_elapsed_time;
- if(peak_window_idx == PEAK_WINDOW_SIZE)
- peak_window_idx = 0;
- peak_avg = 0;
- for(id = 0; id < PEAK_WINDOW_SIZE; id++)
- {
- peak_avg += peak_window[id];
- }
- peak_avg /= PEAK_WINDOW_SIZE;
- if(peak_avg > peak_avg_max)
- peak_avg_max = peak_avg;
- frm_cnt++;
-
- printf("FrameNum: %4d TimeTaken(microsec): %6d AvgTime: %6d PeakAvgTimeMax: %6d Output: %2d NumBytes: %6d \n",
- frm_cnt, s_elapsed_time, u4_tot_cycles / frm_cnt, peak_avg_max, ps_video_decode_op->u4_output_present, ps_video_decode_op->u4_num_bytes_consumed);
-
- }
-#ifdef INTEL_CE5300
- time_consumed += s_elapsed_time;
- bytes_consumed += ps_video_decode_op->u4_num_bytes_consumed;
- if (!(frm_cnt % (s_app_ctx.fps)))
- {
- time_consumed = time_consumed/s_app_ctx.fps;
- printf("Average decode time(micro sec) for the last second = %6d\n",time_consumed);
- printf("Average bitrate(kb) for the last second = %6d\n",(bytes_consumed * 8) / 1024);
- time_consumed = 0;
- bytes_consumed = 0;
-
- }
-#endif
-#else
- printf("%d\n",ps_video_decode_op->u4_num_bytes_consumed);
-#endif
-
- if(ret != IV_SUCCESS)
- {
- printf("Error in video Frame decode : ret %x Error %x\n", ret,
- ps_video_decode_op->u4_error_code);
- }
-
- if((IV_SUCCESS != ret) &&
- ((ps_video_decode_op->u4_error_code & 0xFF) == IVD_RES_CHANGED))
- {
- ivd_ctl_reset_ip_t s_ctl_ip;
- ivd_ctl_reset_op_t s_ctl_op;
-
- flush_output(codec_obj, &s_app_ctx, ps_out_buf, pu1_bs_buf, &u4_op_frm_ts,
- ps_op_file, ps_qp_file, ps_mb_type_file,
- pu1_qp_map_buf, pu1_blk_type_map_buf,
- ps_op_chksum_file, u4_ip_frm_ts, u4_bytes_remaining);
-
- s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET;
- s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t);
- s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_ip,
- (void *)&s_ctl_op);
- if(IV_SUCCESS != ret)
- {
- sprintf(ac_error_str, "Error in Reset");
- codec_exit(ac_error_str);
- }
-
- /*when reset all buffers are released by lib*/
- u4_num_disp_bufs_with_dec = 0;
- /*************************************************************************/
- /* set num of cores */
- /*************************************************************************/
- {
-
- ih264d_ctl_set_num_cores_ip_t s_ctl_set_cores_ip;
- ih264d_ctl_set_num_cores_op_t s_ctl_set_cores_op;
-
- s_ctl_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_set_cores_ip.e_sub_cmd =(IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_SET_NUM_CORES;
- s_ctl_set_cores_ip.u4_num_cores = s_app_ctx.u4_num_cores;
- s_ctl_set_cores_ip.u4_size = sizeof(ih264d_ctl_set_num_cores_ip_t);
- s_ctl_set_cores_op.u4_size = sizeof(ih264d_ctl_set_num_cores_op_t);
-
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_ctl_set_cores_ip,
- (void *)&s_ctl_set_cores_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str, "\nError in setting number of cores");
- codec_exit(ac_error_str);
- }
-
- }
- /*************************************************************************/
- /* set processsor */
- /*************************************************************************/
-
- {
-
- ih264d_ctl_set_processor_ip_t s_ctl_set_num_processor_ip;
- ih264d_ctl_set_processor_op_t s_ctl_set_num_processor_op;
-
- s_ctl_set_num_processor_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_set_num_processor_ip.e_sub_cmd =(IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_SET_PROCESSOR;
- s_ctl_set_num_processor_ip.u4_arch = s_app_ctx.e_arch;
- s_ctl_set_num_processor_ip.u4_soc = s_app_ctx.e_soc;
- s_ctl_set_num_processor_ip.u4_size = sizeof(ih264d_ctl_set_processor_ip_t);
- s_ctl_set_num_processor_op.u4_size = sizeof(ih264d_ctl_set_processor_op_t);
-
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_ctl_set_num_processor_ip,
- (void *)&s_ctl_set_num_processor_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str, "\nError in setting Processor type");
- codec_exit(ac_error_str);
- }
-
- }
- }
-
- /*************************************************************************/
- /* Get SEI MDCV parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_mdcv_params_present_flag)
- {
- ih264d_ctl_get_sei_mdcv_params_ip_t s_ctl_get_sei_mdcv_params_ip;
- ih264d_ctl_get_sei_mdcv_params_op_t s_ctl_get_sei_mdcv_params_op;
-
- memset(&s_ctl_get_sei_mdcv_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_mdcv_params_ip_t));
- memset(&s_ctl_get_sei_mdcv_params_op, 0,
- sizeof(ih264d_ctl_get_sei_mdcv_params_op_t));
-
- s_ctl_get_sei_mdcv_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_mdcv_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_SEI_MDCV_PARAMS;
- s_ctl_get_sei_mdcv_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_mdcv_params_ip_t);
- s_ctl_get_sei_mdcv_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_mdcv_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_ctl_get_sei_mdcv_params_ip,
- (void *)&s_ctl_get_sei_mdcv_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("MDCV SEI params not present : Error %x\n",
- s_ctl_get_sei_mdcv_params_op.u4_error_code);
- }
- }
- /*************************************************************************/
- /* Get SEI CLL parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_cll_params_present_flag)
- {
-
- ih264d_ctl_get_sei_cll_params_ip_t s_ctl_get_sei_cll_params_ip;
- ih264d_ctl_get_sei_cll_params_op_t s_ctl_get_sei_cll_params_op;
-
- memset(&s_ctl_get_sei_cll_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_cll_params_ip_t));
- memset(&s_ctl_get_sei_cll_params_op, 0,
- sizeof(ih264d_ctl_get_sei_cll_params_op_t));
-
- s_ctl_get_sei_cll_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_cll_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_SEI_CLL_PARAMS;
- s_ctl_get_sei_cll_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_cll_params_ip_t);
- s_ctl_get_sei_cll_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_cll_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_ctl_get_sei_cll_params_ip,
- (void *)&s_ctl_get_sei_cll_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("CLL SEI params not present : Error %x\n",
- s_ctl_get_sei_cll_params_op.u4_error_code);
- }
- }
- /*************************************************************************/
- /* Get SEI AVE parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_ave_params_present_flag)
- {
- ih264d_ctl_get_sei_ave_params_ip_t s_ctl_get_sei_ave_params_ip;
- ih264d_ctl_get_sei_ave_params_op_t s_ctl_get_sei_ave_params_op;
-
- memset(&s_ctl_get_sei_ave_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_ave_params_ip_t));
- memset(&s_ctl_get_sei_ave_params_op, 0,
- sizeof(ih264d_ctl_get_sei_ave_params_op_t));
-
- s_ctl_get_sei_ave_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_ave_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_SEI_AVE_PARAMS;
- s_ctl_get_sei_ave_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_ave_params_ip_t);
- s_ctl_get_sei_ave_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_ave_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_ctl_get_sei_ave_params_ip,
- (void *)&s_ctl_get_sei_ave_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("AVE SEI params not present : Error %x\n",
- s_ctl_get_sei_ave_params_op.u4_error_code);
- }
- }
- /*************************************************************************/
- /* Get SEI CCV parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_ccv_params_present_flag)
- {
- ih264d_ctl_get_sei_ccv_params_ip_t s_ctl_get_sei_ccv_params_ip;
- ih264d_ctl_get_sei_ccv_params_op_t s_ctl_get_sei_ccv_params_op;
-
- memset(&s_ctl_get_sei_ccv_params_ip, 0,
- sizeof(ih264d_ctl_get_sei_ccv_params_ip_t));
- memset(&s_ctl_get_sei_ccv_params_op, 0,
- sizeof(ih264d_ctl_get_sei_ccv_params_op_t));
-
- s_ctl_get_sei_ccv_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_ccv_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_GET_SEI_CCV_PARAMS;
- s_ctl_get_sei_ccv_params_ip.u4_size =
- sizeof(ih264d_ctl_get_sei_ccv_params_ip_t);
- s_ctl_get_sei_ccv_params_op.u4_size =
- sizeof(ih264d_ctl_get_sei_ccv_params_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj,
- (void *)&s_ctl_get_sei_ccv_params_ip,
- (void *)&s_ctl_get_sei_ccv_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("CCV SEI params not present : Error %x\n",
- s_ctl_get_sei_ccv_params_op.u4_error_code);
- }
- }
- /*************************************************************************/
- /* Get SEI SII parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_sii_params_present_flag)
- {
- ih264d_ctl_get_sei_sii_params_ip_t s_ctl_get_sei_sii_params_ip = {0};
- ih264d_ctl_get_sei_sii_params_op_t s_ctl_get_sei_sii_params_op = {0};
-
- s_ctl_get_sei_sii_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_sii_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_SII_PARAMS;
- s_ctl_get_sei_sii_params_ip.u4_size = sizeof(ih264d_ctl_get_sei_sii_params_ip_t);
- s_ctl_get_sei_sii_params_op.u4_size = sizeof(ih264d_ctl_get_sei_sii_params_op_t);
-
- ret =
- ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_get_sei_sii_params_ip,
- (void *) &s_ctl_get_sei_sii_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("SII SEI params not present : Error %x\n",
- s_ctl_get_sei_sii_params_op.u4_error_code);
- }
- }
-
- /*************************************************************************/
- /* Get SEI FGC parameters */
- /*************************************************************************/
- if(1 == ps_video_decode_op->s_sei_decode_op.u1_sei_fgc_params_present_flag)
- {
- ih264d_ctl_get_sei_fgc_params_ip_t s_ctl_get_sei_fgc_params_ip;
- ih264d_ctl_get_sei_fgc_params_op_t s_ctl_get_sei_fgc_params_op;
-
- memset(&s_ctl_get_sei_fgc_params_ip, 0, sizeof(ih264d_ctl_get_sei_fgc_params_ip_t));
- memset(&s_ctl_get_sei_fgc_params_op, 0, sizeof(ih264d_ctl_get_sei_fgc_params_op_t));
-
- s_ctl_get_sei_fgc_params_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_get_sei_fgc_params_ip.e_sub_cmd =
- (IVD_CONTROL_API_COMMAND_TYPE_T) IH264D_CMD_CTL_GET_SEI_FGC_PARAMS;
- s_ctl_get_sei_fgc_params_ip.u4_size = sizeof(ih264d_ctl_get_sei_fgc_params_ip_t);
- s_ctl_get_sei_fgc_params_op.u4_size = sizeof(ih264d_ctl_get_sei_fgc_params_op_t);
-
- ret =
- ivd_api_function((iv_obj_t *) codec_obj, (void *) &s_ctl_get_sei_fgc_params_ip,
- (void *) &s_ctl_get_sei_fgc_params_op);
-
- if(IV_SUCCESS != ret)
- {
- printf("FGC SEI params not present : Error %x\n",
- s_ctl_get_sei_fgc_params_op.u4_error_code);
- }
- }
-
- if((1 == s_app_ctx.display) &&
- (1 == ps_video_decode_op->u4_output_present))
- {
- dispq_producer_queue(&s_app_ctx);
- }
-
- if(IV_B_FRAME == ps_video_decode_op->e_pic_type)
- s_app_ctx.b_pic_present |= 1;
-
- u4_num_bytes_dec = ps_video_decode_op->u4_num_bytes_consumed;
-
- file_pos += u4_num_bytes_dec;
- total_bytes_comsumed += u4_num_bytes_dec;
- u4_ip_frm_ts++;
-
-
- if(1 == ps_video_decode_op->u4_output_present)
- {
-
- CHAR cur_fname[1000];
- CHAR *extn = NULL;
- /* The objective is to dump the decoded frames into separate files instead of
- * dumping all the frames in one common file. Also, the number of dumped frames
- * at any given instance of time cannot exceed 'frame_memory'
- */
- if(s_app_ctx.u4_file_save_flag)
- {
- /* Locate the position of extension yuv */
- extn = strstr(s_app_ctx.ac_op_fname,"%d");
- if (extn != NULL)
- {
- output_write_stall(s_app_ctx.ac_op_fname,u4_op_frm_ts);
- /* Generate output file names */
- sprintf(cur_fname,s_app_ctx.ac_op_fname,u4_op_frm_ts);
- /* Open Output file */
- ps_op_file = fopen(cur_fname,"wb");
- if (NULL == ps_op_file)
- {
- snprintf(ac_error_str, sizeof(ac_error_str),
- "Could not open output file %s", cur_fname);
-
- codec_exit(ac_error_str);
- }
- }
- }
-
- width = ps_video_decode_op->s_disp_frm_buf.u4_y_wd;
- height = ps_video_decode_op->s_disp_frm_buf.u4_y_ht;
- dump_output(&s_app_ctx, &(ps_video_decode_op->s_disp_frm_buf), &s_h264d_decode_op,
- ps_video_decode_op->u4_disp_buf_id, ps_op_file,
- ps_qp_file, ps_mb_type_file, ps_op_chksum_file,
- u4_op_frm_ts, s_app_ctx.u4_file_save_flag,
- s_app_ctx.u4_chksum_save_flag, s_app_ctx.u4_frame_info_enable);
-
- u4_op_frm_ts++;
- if (extn != NULL)
- fclose(ps_op_file);
-
- }
- else
- {
- if((ps_video_decode_op->u4_error_code >> IVD_FATALERROR) & 1)
- {
- printf("Fatal error\n");
- break;
- }
- }
-
- }
- }
-
- /***********************************************************************/
- /* To get the last decoded frames, call process with NULL input */
- /***********************************************************************/
- flush_output(codec_obj, &s_app_ctx, ps_out_buf, pu1_bs_buf, &u4_op_frm_ts,
- ps_op_file, ps_qp_file, ps_mb_type_file,
- pu1_qp_map_buf, pu1_blk_type_map_buf,
- ps_op_chksum_file, u4_ip_frm_ts, u4_bytes_remaining);
-
- /* set disp_end u4_flag */
- s_app_ctx.quit = 1;
-
-
-#ifdef PROFILE_ENABLE
- printf("Summary\n");
- printf("Input filename : %s\n", s_app_ctx.ac_ip_fname);
- printf("Output Width : %-4d\n", width);
- printf("Output Height : %-4d\n", height);
-
- if(frm_cnt)
- {
- double avg = u4_tot_cycles / frm_cnt;
- double bytes_avg = total_bytes_comsumed / frm_cnt;
- double bitrate = (bytes_avg * 8 * s_app_ctx.fps)/1000000;
- printf("Bitrate @ %2d fps(mbps) : %-6.2f\n", s_app_ctx.fps, bitrate);
- printf("Average decode time(micro sec) : %-6d\n", (WORD32)avg);
- printf("Avg Peak decode time(%2d frames) : %-6d\n", PEAK_WINDOW_SIZE, (WORD32)peak_avg_max);
- avg = (u4_tot_cycles + u4_tot_fmt_cycles)* 1.0 / frm_cnt;
-
- if(0 == s_app_ctx.u4_share_disp_buf)
- printf("FPS achieved (with format conv) : %-3.2f\n", 1000000/avg);
- else
- printf("FPS achieved : %-3.2f\n", 1000000/avg);
- }
-#endif
- /***********************************************************************/
- /* Clear the decoder, close all the files, free all the memory */
- /***********************************************************************/
- if(1 == s_app_ctx.display)
- {
- s_app_ctx.display_deinit_flag = 1;
- /* wait for display to finish */
- if(s_app_ctx.display_thread_created)
- {
- ithread_join(s_app_ctx.display_thread_handle, NULL);
- }
- free(s_app_ctx.display_thread_handle);
- }
-
- {
- ivd_delete_ip_t s_delete_dec_ip;
- ivd_delete_op_t s_delete_dec_op;
-
- s_delete_dec_ip.e_cmd = IVD_CMD_DELETE;
- s_delete_dec_ip.u4_size = sizeof(ivd_delete_ip_t);
- s_delete_dec_op.u4_size = sizeof(ivd_delete_op_t);
-
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_delete_dec_ip,
- (void *)&s_delete_dec_op);
-
- if(IV_SUCCESS != ret)
- {
- sprintf(ac_error_str, "Error in Codec delete");
- codec_exit(ac_error_str);
- }
- }
- /***********************************************************************/
- /* Close all the files and free all the memory */
- /***********************************************************************/
- {
- fclose(ps_ip_file);
-
- if((1 == s_app_ctx.u4_file_save_flag) && (strstr(s_app_ctx.ac_op_fname,"%d") == NULL))
- {
- fclose(ps_op_file);
- }
- if(1 == s_app_ctx.u4_chksum_save_flag)
- {
- fclose(ps_op_chksum_file);
- }
- if(1 == s_app_ctx.u4_frame_info_enable)
- {
- if(NULL != ps_qp_file)
- {
- fclose(ps_qp_file);
- }
- if(NULL != ps_mb_type_file)
- {
- fclose(ps_mb_type_file);
- }
- }
- }
-
- if(0 == s_app_ctx.u4_share_disp_buf)
- {
- free(ps_out_buf->pu1_bufs[0]);
- }
-
- for(i = 0; i < s_app_ctx.num_disp_buf; i++)
- {
- free(s_app_ctx.s_disp_buffers[i].pu1_bufs[0]);
- }
-
- free(ps_out_buf);
- free(pu1_bs_buf);
- if(1 == s_app_ctx.u4_frame_info_enable)
- {
- if(pu1_qp_map_buf)
- {
- free(pu1_qp_map_buf);
- }
- if(pu1_blk_type_map_buf)
- {
- free(pu1_blk_type_map_buf);
- }
- }
-
- if(s_app_ctx.display_thread_handle)
- free(s_app_ctx.display_thread_handle);
-
- return (0);
-}