summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2015-08-04 09:55:15 +0530
committerRachad Alao <rachad@google.com>2015-09-23 18:35:27 +0000
commit251b007eccf5a0ddac897ce27de88d3901bc5d00 (patch)
treeaed2bbcfabe3895b38492754a28fcc0ffcda7938
parent2ee0c1bced131ffb06d1b430b08a202cd3a52005 (diff)
downloadandroid_external_libavc-251b007eccf5a0ddac897ce27de88d3901bc5d00.tar.gz
android_external_libavc-251b007eccf5a0ddac897ce27de88d3901bc5d00.tar.bz2
android_external_libavc-251b007eccf5a0ddac897ce27de88d3901bc5d00.zip
Decoder: Reduced memory requirements
Memory allocations are now done based on contents of SPS API changed to move allocations inside the library Also changed strlen to strnlen Bug: 24221026 Change-Id: I9130457f564cddb4da7ec6399cc9fe88ee871217
-rw-r--r--decoder/ih264d.h67
-rw-r--r--decoder/ih264d_api.c1909
-rw-r--r--decoder/ih264d_defs.h36
-rw-r--r--decoder/ih264d_inter_pred.c2
-rw-r--r--decoder/ih264d_mb_utils.c6
-rw-r--r--decoder/ih264d_mem_request.h2
-rw-r--r--decoder/ih264d_parse_bslice.c15
-rw-r--r--decoder/ih264d_parse_headers.c91
-rw-r--r--decoder/ih264d_parse_pslice.c27
-rw-r--r--decoder/ih264d_parse_slice.c53
-rw-r--r--decoder/ih264d_process_pslice.c1
-rw-r--r--decoder/ih264d_structs.h99
-rw-r--r--decoder/ih264d_thread_parse_decode.c6
-rw-r--r--decoder/ih264d_utils.c910
-rw-r--r--decoder/ih264d_utils.h11
-rw-r--r--decoder/ih264d_vui.c6
-rw-r--r--decoder/ih264d_vui.h1
-rw-r--r--decoder/iv.h182
-rw-r--r--decoder/ivd.h557
-rw-r--r--test/decoder/main.c589
20 files changed, 1558 insertions, 3012 deletions
diff --git a/decoder/ih264d.h b/decoder/ih264d.h
index beda247..63a5ce1 100644
--- a/decoder/ih264d.h
+++ b/decoder/ih264d.h
@@ -78,8 +78,6 @@ IV_API_CALL_STATUS_T ih264d_api_function(iv_obj_t *ps_handle, void *pv_api_ip,vo
typedef enum {
IH264D_VID_HDR_DEC_NUM_FRM_BUF_NOT_SUFFICIENT = IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS + 1,
- IH264D_UNSUPPORTED_LEVEL = IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS + 2,
- IH264D_UNSUPPORTED_NUM_REF_FRAMES = IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS + 3
}IH264D_ERROR_CODES_T;
@@ -87,60 +85,20 @@ typedef enum {
/* Extended Structures */
/*****************************************************************************/
-/*****************************************************************************/
-/* Get Number of Memory Records */
-/*****************************************************************************/
-
-
-typedef struct {
- iv_num_mem_rec_ip_t s_ivd_num_mem_rec_ip_t;
-}ih264d_num_mem_rec_ip_t;
-
-
-typedef struct{
- iv_num_mem_rec_op_t s_ivd_num_mem_rec_op_t;
-}ih264d_num_mem_rec_op_t;
-
/*****************************************************************************/
-/* Fill Memory Records */
+/* Delete Codec */
/*****************************************************************************/
typedef struct {
- iv_fill_mem_rec_ip_t s_ivd_fill_mem_rec_ip_t;
- WORD32 i4_level;
- UWORD32 u4_num_reorder_frames;
- UWORD32 u4_num_ref_frames;
- UWORD32 u4_share_disp_buf;
-
- /* format in which codec has to give out frame data for display */
- IV_COLOR_FORMAT_T e_output_format;
-
- /* Number of extra display buffers that will be allocated to handle display pipeline depth */
- UWORD32 u4_num_extra_disp_buf;
-
-}ih264d_fill_mem_rec_ip_t;
+ ivd_delete_ip_t s_ivd_delete_ip_t;
+}ih264d_delete_ip_t;
typedef struct{
- iv_fill_mem_rec_op_t s_ivd_fill_mem_rec_op_t;
-
-}ih264d_fill_mem_rec_op_t;
-
-/*****************************************************************************/
-/* Retrieve Memory Records */
-/*****************************************************************************/
-
-
-typedef struct {
- iv_retrieve_mem_rec_ip_t s_ivd_retrieve_mem_rec_ip_t;
-}ih264d_retrieve_mem_rec_ip_t;
-
-
-typedef struct{
- iv_retrieve_mem_rec_op_t s_ivd_retrieve_mem_rec_op_t;
-}ih264d_retrieve_mem_rec_op_t;
+ ivd_delete_op_t s_ivd_delete_op_t;
+}ih264d_delete_op_t;
/*****************************************************************************/
@@ -149,20 +107,13 @@ typedef struct{
typedef struct {
- ivd_init_ip_t s_ivd_init_ip_t;
- WORD32 i4_level;
- UWORD32 u4_num_reorder_frames;
- UWORD32 u4_num_ref_frames;
- UWORD32 u4_share_disp_buf;
- /* Number of extra display buffers that will be allocated to handle display pipeline depth */
- UWORD32 u4_num_extra_disp_buf;
-
-}ih264d_init_ip_t;
+ ivd_create_ip_t s_ivd_create_ip_t;
+}ih264d_create_ip_t;
typedef struct{
- ivd_init_op_t s_ivd_init_op_t;
-}ih264d_init_op_t;
+ ivd_create_op_t s_ivd_create_op_t;
+}ih264d_create_op_t;
/*****************************************************************************/
diff --git a/decoder/ih264d_api.c b/decoder/ih264d_api.c
index 6fbd834..6ef5185 100644
--- a/decoder/ih264d_api.c
+++ b/decoder/ih264d_api.c
@@ -27,11 +27,8 @@
/* */
/* List of Functions : api_check_struct_sanity */
/* ih264d_set_processor */
-/* ih264d_get_num_rec */
-/* ih264d_init_decoder */
-/* ih264d_init_video_decoder */
-/* ih264d_fill_num_mem_rec */
-/* ih264d_clr */
+/* ih264d_create */
+/* ih264d_delete */
/* ih264d_init */
/* ih264d_map_error */
/* ih264d_video_decode */
@@ -103,7 +100,7 @@
//Move this to where it is used
#define CODEC_NAME "H264VDEC"
#define CODEC_RELEASE_TYPE "production"
-#define CODEC_RELEASE_VER "04.00"
+#define CODEC_RELEASE_VER "05.00"
#define CODEC_VENDOR "ITTIAM"
#define MAXVERSION_STRLEN 511
#define VERSION(version_string, codec_name, codec_release_type, codec_release_ver, codec_vendor) \
@@ -111,16 +108,12 @@
"@(#)Id:%s_%s Ver:%s Released by %s Build: %s @ %s", \
codec_name, codec_release_type, codec_release_ver, codec_vendor, __DATE__, __TIME__)
-#define MAX_NAL_UNIT_SIZE MAX((H264_MAX_FRAME_HEIGHT * H264_MAX_FRAME_HEIGHT),MIN_NALUNIT_SIZE)
-#define MIN_NALUNIT_SIZE 200000
-
#define MIN_IN_BUFS 1
#define MIN_OUT_BUFS_420 3
#define MIN_OUT_BUFS_422ILE 1
#define MIN_OUT_BUFS_RGB565 1
#define MIN_OUT_BUFS_420SP 2
-#define MIN_IN_BUF_SIZE (2*1024*1024) // Currently, i4_size set to 500kb, CHECK LATER
#define NUM_FRAMES_LIMIT_ENABLED 0
@@ -173,32 +166,14 @@ static IV_API_CALL_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
/* error checks on handle */
switch((WORD32)e_cmd)
{
- case IV_CMD_GET_NUM_MEM_REC:
- case IV_CMD_FILL_NUM_MEM_REC:
+ case IVD_CMD_CREATE:
break;
- case IV_CMD_INIT:
- if(ps_handle == NULL)
- {
- *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
- *(pu4_api_op + 1) |= IVD_HANDLE_NULL;
- return IV_FAIL;
- }
- if(ps_handle->u4_size != sizeof(iv_obj_t))
- {
- *(pu4_api_op + 1) |= 1 << IVD_UNSUPPORTEDPARAM;
- *(pu4_api_op + 1) |= IVD_HANDLE_STRUCT_SIZE_INCORRECT;
- H264_DEC_DEBUG_PRINT(
- "Sizes do not match. Expected: %d, Got: %d",
- sizeof(iv_obj_t), ps_handle->u4_size);
- return IV_FAIL;
- }
- break;
case IVD_CMD_REL_DISPLAY_FRAME:
case IVD_CMD_SET_DISPLAY_FRAME:
case IVD_CMD_GET_DISPLAY_FRAME:
case IVD_CMD_VIDEO_DECODE:
- case IV_CMD_RETRIEVE_MEMREC:
+ case IVD_CMD_DELETE:
case IVD_CMD_VIDEO_CTL:
if(ps_handle == NULL)
{
@@ -236,530 +211,57 @@ static IV_API_CALL_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
switch((WORD32)e_cmd)
{
- case IV_CMD_GET_NUM_MEM_REC:
+ case IVD_CMD_CREATE:
{
- ih264d_num_mem_rec_ip_t *ps_ip =
- (ih264d_num_mem_rec_ip_t *)pv_api_ip;
- ih264d_num_mem_rec_op_t *ps_op =
- (ih264d_num_mem_rec_op_t *)pv_api_op;
- ps_op->s_ivd_num_mem_rec_op_t.u4_error_code = 0;
-
- if(ps_ip->s_ivd_num_mem_rec_ip_t.u4_size
- != sizeof(ih264d_num_mem_rec_ip_t))
- {
- ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |=
- IVD_IP_API_STRUCT_SIZE_INCORRECT;
- return (IV_FAIL);
- }
+ ih264d_create_ip_t *ps_ip = (ih264d_create_ip_t *)pv_api_ip;
+ ih264d_create_op_t *ps_op = (ih264d_create_op_t *)pv_api_op;
- if(ps_op->s_ivd_num_mem_rec_op_t.u4_size
- != sizeof(ih264d_num_mem_rec_op_t))
- {
- ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_num_mem_rec_op_t.u4_error_code |=
- IVD_OP_API_STRUCT_SIZE_INCORRECT;
- return (IV_FAIL);
- }
- }
- break;
- case IV_CMD_FILL_NUM_MEM_REC:
- {
- ih264d_fill_mem_rec_ip_t *ps_ip =
- (ih264d_fill_mem_rec_ip_t *)pv_api_ip;
- ih264d_fill_mem_rec_op_t *ps_op =
- (ih264d_fill_mem_rec_op_t *)pv_api_op;
- iv_mem_rec_t *ps_mem_rec;
- WORD32 max_wd = ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd;
- WORD32 max_ht = ps_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht;
-
- max_wd = ALIGN16(max_wd);
- max_ht = ALIGN32(max_ht);
-
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code = 0;
-
- if((ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size
- > sizeof(ih264d_fill_mem_rec_ip_t))
- || (ps_ip->s_ivd_fill_mem_rec_ip_t.u4_size
- < sizeof(iv_fill_mem_rec_ip_t)))
- {
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- IVD_IP_API_STRUCT_SIZE_INCORRECT;
- return (IV_FAIL);
- }
- if((ps_op->s_ivd_fill_mem_rec_op_t.u4_size
- != sizeof(ih264d_fill_mem_rec_op_t))
- && (ps_op->s_ivd_fill_mem_rec_op_t.u4_size
- != sizeof(iv_fill_mem_rec_op_t)))
- {
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- IVD_OP_API_STRUCT_SIZE_INCORRECT;
- return (IV_FAIL);
- }
+ ps_op->s_ivd_create_op_t.u4_error_code = 0;
- if(max_wd < H264_MIN_FRAME_WIDTH)
+ if((ps_ip->s_ivd_create_ip_t.u4_size > sizeof(ih264d_create_ip_t))
+ || (ps_ip->s_ivd_create_ip_t.u4_size
+ < sizeof(ivd_create_ip_t)))
{
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
+ ps_op->s_ivd_create_op_t.u4_error_code |= 1
<< IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- IVD_REQUESTED_WIDTH_NOT_SUPPPORTED;
- return (IV_FAIL);
- }
-
- if(max_wd > H264_MAX_FRAME_WIDTH)
- {
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- IVD_REQUESTED_WIDTH_NOT_SUPPPORTED;
- return (IV_FAIL);
- }
-
- if(max_ht < H264_MIN_FRAME_HEIGHT)
- {
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- IVD_REQUESTED_HEIGHT_NOT_SUPPPORTED;
- return (IV_FAIL);
- }
-
- if((max_ht * max_wd)
- > (H264_MAX_FRAME_HEIGHT * H264_MAX_FRAME_WIDTH))
-
- {
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- IVD_REQUESTED_HEIGHT_NOT_SUPPPORTED;
- return (IV_FAIL);
- }
-
- if(NULL == ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location)
- {
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- IVD_NUM_REC_NOT_SUFFICIENT;
- return (IV_FAIL);
- }
-
- /* check memrecords sizes are correct */
- ps_mem_rec = ps_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location;
- for(i = 0; i < MEM_REC_CNT; i++)
- {
- if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
- {
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
- return IV_FAIL;
- }
- }
- }
- break;
-
- case IV_CMD_INIT:
- {
- ih264d_init_ip_t *ps_ip = (ih264d_init_ip_t *)pv_api_ip;
- ih264d_init_op_t *ps_op = (ih264d_init_op_t *)pv_api_op;
- iv_mem_rec_t *ps_mem_rec;
- WORD32 max_wd = ps_ip->s_ivd_init_ip_t.u4_frm_max_wd;
- WORD32 max_ht = ps_ip->s_ivd_init_ip_t.u4_frm_max_ht;
-
- max_wd = ALIGN16(max_wd);
- max_ht = ALIGN32(max_ht);
-
- ps_op->s_ivd_init_op_t.u4_error_code = 0;
-
- if((ps_ip->s_ivd_init_ip_t.u4_size > sizeof(ih264d_init_ip_t))
- || (ps_ip->s_ivd_init_ip_t.u4_size
- < sizeof(ivd_init_ip_t)))
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
+ ps_op->s_ivd_create_op_t.u4_error_code |=
IVD_IP_API_STRUCT_SIZE_INCORRECT;
H264_DEC_DEBUG_PRINT("\n");
return (IV_FAIL);
}
- if((ps_op->s_ivd_init_op_t.u4_size != sizeof(ih264d_init_op_t))
- && (ps_op->s_ivd_init_op_t.u4_size
- != sizeof(ivd_init_op_t)))
+ if((ps_op->s_ivd_create_op_t.u4_size != sizeof(ih264d_create_op_t))
+ && (ps_op->s_ivd_create_op_t.u4_size
+ != sizeof(ivd_create_op_t)))
{
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
+ ps_op->s_ivd_create_op_t.u4_error_code |= 1
<< IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
+ ps_op->s_ivd_create_op_t.u4_error_code |=
IVD_OP_API_STRUCT_SIZE_INCORRECT;
H264_DEC_DEBUG_PRINT("\n");
return (IV_FAIL);
}
- if(ps_ip->s_ivd_init_ip_t.u4_num_mem_rec != MEM_REC_CNT)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_NOT_SUFFICIENT;
- H264_DEC_DEBUG_PRINT("\n");
- return (IV_FAIL);
- }
-
- if(max_wd < H264_MIN_FRAME_WIDTH)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_WIDTH_NOT_SUPPPORTED;
- H264_DEC_DEBUG_PRINT("\n");
- return (IV_FAIL);
- }
-
- if(max_wd > H264_MAX_FRAME_WIDTH)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_WIDTH_NOT_SUPPPORTED;
- H264_DEC_DEBUG_PRINT("\n");
- return (IV_FAIL);
- }
-
- if(max_ht < H264_MIN_FRAME_HEIGHT)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_HEIGHT_NOT_SUPPPORTED;
- H264_DEC_DEBUG_PRINT("\n");
- return (IV_FAIL);
- }
-
- if((max_ht * max_wd)
- > (H264_MAX_FRAME_HEIGHT * H264_MAX_FRAME_WIDTH))
-
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_HEIGHT_NOT_SUPPPORTED;
- H264_DEC_DEBUG_PRINT("\n");
- return (IV_FAIL);
- }
-
- if(NULL == ps_ip->s_ivd_init_ip_t.pv_mem_rec_location)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_NUM_REC_NOT_SUFFICIENT;
- H264_DEC_DEBUG_PRINT("\n");
- return (IV_FAIL);
- }
- if((ps_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420P)
- && (ps_ip->s_ivd_init_ip_t.e_output_format
+ if((ps_ip->s_ivd_create_ip_t.e_output_format != IV_YUV_420P)
+ && (ps_ip->s_ivd_create_ip_t.e_output_format
!= IV_YUV_422ILE)
- && (ps_ip->s_ivd_init_ip_t.e_output_format
+ && (ps_ip->s_ivd_create_ip_t.e_output_format
!= IV_RGB_565)
- && (ps_ip->s_ivd_init_ip_t.e_output_format
+ && (ps_ip->s_ivd_create_ip_t.e_output_format
!= IV_YUV_420SP_UV)
- && (ps_ip->s_ivd_init_ip_t.e_output_format
+ && (ps_ip->s_ivd_create_ip_t.e_output_format
!= IV_YUV_420SP_VU))
{
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
+ ps_op->s_ivd_create_op_t.u4_error_code |= 1
<< IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
+ ps_op->s_ivd_create_op_t.u4_error_code |=
IVD_INIT_DEC_COL_FMT_NOT_SUPPORTED;
H264_DEC_DEBUG_PRINT("\n");
return (IV_FAIL);
}
- /* verify number of mem records */
- if(ps_ip->s_ivd_init_ip_t.u4_num_mem_rec < MEM_REC_CNT)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_MEM_REC_NOT_SUFFICIENT;
- H264_DEC_DEBUG_PRINT("\n");
- return IV_FAIL;
- }
-
- ps_mem_rec = ps_ip->s_ivd_init_ip_t.pv_mem_rec_location;
- /* check memrecords sizes are correct */
- for(i = 0; i < ps_ip->s_ivd_init_ip_t.u4_num_mem_rec; i++)
- {
- if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
- H264_DEC_DEBUG_PRINT("i: %d\n", i);
- return IV_FAIL;
- }
- /* check memrecords pointers are not NULL */
-
- if(ps_mem_rec[i].pv_base == NULL)
- {
-
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_MEM_REC_BASE_NULL;
- H264_DEC_DEBUG_PRINT("i: %d\n", i);
- return IV_FAIL;
-
- }
-
- }
-
- /* verify memtabs for overlapping regions */
- {
- void *start[MEM_REC_CNT];
- void *end[MEM_REC_CNT];
-
- start[0] = (void *)(ps_mem_rec[0].pv_base);
- end[0] = (void *)((UWORD8 *)ps_mem_rec[0].pv_base
- + ps_mem_rec[0].u4_mem_size - 1);
- for(i = 1; i < MEM_REC_CNT; i++)
- {
- /* This array is populated to check memtab overlapp */
- start[i] = (void *)(ps_mem_rec[i].pv_base);
- end[i] = (void *)((UWORD8 *)ps_mem_rec[i].pv_base
- + ps_mem_rec[i].u4_mem_size - 1);
-
- for(j = 0; j < i; j++)
- {
- if((start[i] >= start[j]) && (start[i] <= end[j]))
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
- H264_DEC_DEBUG_PRINT("i: %d, j: %d\n", i, j);
- return IV_FAIL;
- }
-
- if((end[i] >= start[j]) && (end[i] <= end[j]))
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
- H264_DEC_DEBUG_PRINT("i: %d, j: %d\n", i, j);
- return IV_FAIL;
- }
-
- if((start[i] < start[j]) && (end[i] > end[j]))
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_MEM_REC_OVERLAP_ERR;
- H264_DEC_DEBUG_PRINT("i: %d, j: %d\n", i, j);
- return IV_FAIL;
- }
- }
-
- }
- }
-
- {
- iv_mem_rec_t mem_rec_ittiam_api[MEM_REC_CNT];
- ih264d_fill_mem_rec_ip_t s_fill_mem_rec_ip;
- ih264d_fill_mem_rec_op_t s_fill_mem_rec_op;
- IV_API_CALL_STATUS_T e_status;
-
- UWORD32 i;
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.e_cmd =
- IV_CMD_FILL_NUM_MEM_REC;
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location =
- mem_rec_ittiam_api;
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd =
- max_wd;
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht =
- max_ht;
-
- if(ps_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t, i4_level))
- {
- s_fill_mem_rec_ip.i4_level = ps_ip->i4_level;
- }
- else
- {
- s_fill_mem_rec_ip.i4_level = H264_LEVEL_3_1;
- }
-
- if(ps_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t, u4_num_ref_frames))
- {
- s_fill_mem_rec_ip.u4_num_ref_frames =
- ps_ip->u4_num_ref_frames;
- }
- else
- {
- s_fill_mem_rec_ip.u4_num_ref_frames =
- (H264_MAX_REF_PICS + 1);
- }
-
- if(ps_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t,
- u4_num_reorder_frames))
- {
- s_fill_mem_rec_ip.u4_num_reorder_frames =
- ps_ip->u4_num_reorder_frames;
- }
- else
- {
- s_fill_mem_rec_ip.u4_num_reorder_frames = (H264_MAX_REF_PICS
- + 1);
- }
-
- if(ps_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t,
- u4_num_extra_disp_buf))
- {
- s_fill_mem_rec_ip.u4_num_extra_disp_buf =
- ps_ip->u4_num_extra_disp_buf;
- }
- else
- {
- s_fill_mem_rec_ip.u4_num_extra_disp_buf = 0;
- }
-
- if(ps_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t, u4_share_disp_buf))
- {
-#ifndef LOGO_EN
- s_fill_mem_rec_ip.u4_share_disp_buf =
- ps_ip->u4_share_disp_buf;
-#else
- s_fill_mem_rec_ip.u4_share_disp_buf = 0;
-#endif
- }
- else
- {
- s_fill_mem_rec_ip.u4_share_disp_buf = 0;
- }
-
- s_fill_mem_rec_ip.e_output_format =
- ps_ip->s_ivd_init_ip_t.e_output_format;
-
- if((s_fill_mem_rec_ip.e_output_format != IV_YUV_420P)
- && (s_fill_mem_rec_ip.e_output_format
- != IV_YUV_420SP_UV)
- && (s_fill_mem_rec_ip.e_output_format
- != IV_YUV_420SP_VU))
- {
- s_fill_mem_rec_ip.u4_share_disp_buf = 0;
- }
-
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_size =
- sizeof(ih264d_fill_mem_rec_ip_t);
- s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_size =
- sizeof(ih264d_fill_mem_rec_op_t);
-
- for(i = 0; i < MEM_REC_CNT; i++)
- mem_rec_ittiam_api[i].u4_size = sizeof(iv_mem_rec_t);
-
- e_status = ih264d_api_function(NULL,
- (void *)&s_fill_mem_rec_ip,
- (void *)&s_fill_mem_rec_op);
- if(IV_FAIL == e_status)
- {
- ps_op->s_ivd_init_op_t.u4_error_code =
- s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_error_code;
- H264_DEC_DEBUG_PRINT("Fail\n");
- return (IV_FAIL);
- }
-
- for(i = 0; i < MEM_REC_CNT; i++)
- {
- if(ps_mem_rec[i].u4_mem_size
- < mem_rec_ittiam_api[i].u4_mem_size)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_MEM_REC_INSUFFICIENT_SIZE;
- H264_DEC_DEBUG_PRINT("i: %d \n", i);
- return IV_FAIL;
- }
- if(ps_mem_rec[i].u4_mem_alignment
- != mem_rec_ittiam_api[i].u4_mem_alignment)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_MEM_REC_ALIGNMENT_ERR;
- H264_DEC_DEBUG_PRINT("i: %d \n", i);
- return IV_FAIL;
- }
- if(ps_mem_rec[i].e_mem_type
- != mem_rec_ittiam_api[i].e_mem_type)
- {
- UWORD32 check = IV_SUCCESS;
- UWORD32 diff = mem_rec_ittiam_api[i].e_mem_type
- - ps_mem_rec[i].e_mem_type;
-
- if((ps_mem_rec[i].e_mem_type
- <= IV_EXTERNAL_CACHEABLE_SCRATCH_MEM)
- && (mem_rec_ittiam_api[i].e_mem_type
- >= IV_INTERNAL_NONCACHEABLE_PERSISTENT_MEM))
- {
- check = IV_FAIL;
- }
- if(3 != MOD(mem_rec_ittiam_api[i].e_mem_type, 4))
- {
- /*
- * It is not IV_EXTERNAL_NONCACHEABLE_PERSISTENT_MEM or IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM
- */
- if((diff < 1) || (diff > 3))
- {
- // Difference between 1 and 3 is okay for all cases other than the two filtered
- // with the MOD condition above
- check = IV_FAIL;
- }
- }
- else
- {
- if(diff == 1)
- {
- /*
- * This particular case is when codec asked for External Persistent, but got
- * Internal Scratch.
- */
- check = IV_FAIL;
- }
- if((diff != 2) && (diff != 3))
- {
- check = IV_FAIL;
- }
- }
- if(check == IV_FAIL)
- {
- ps_op->s_ivd_init_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_init_op_t.u4_error_code |=
- IVD_INIT_DEC_MEM_REC_INCORRECT_TYPE;
- H264_DEC_DEBUG_PRINT("i: %d \n", i);
- return IV_FAIL;
- }
- }
- }
- }
-
}
break;
@@ -955,49 +457,35 @@ static IV_API_CALL_STATUS_T api_check_struct_sanity(iv_obj_t *ps_handle,
}
break;
- case IV_CMD_RETRIEVE_MEMREC:
+ case IVD_CMD_DELETE:
{
- ih264d_retrieve_mem_rec_ip_t *ps_ip =
- (ih264d_retrieve_mem_rec_ip_t *)pv_api_ip;
- ih264d_retrieve_mem_rec_op_t *ps_op =
- (ih264d_retrieve_mem_rec_op_t *)pv_api_op;
- iv_mem_rec_t *ps_mem_rec;
+ ih264d_delete_ip_t *ps_ip =
+ (ih264d_delete_ip_t *)pv_api_ip;
+ ih264d_delete_op_t *ps_op =
+ (ih264d_delete_op_t *)pv_api_op;
- ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code = 0;
+ ps_op->s_ivd_delete_op_t.u4_error_code = 0;
- if(ps_ip->s_ivd_retrieve_mem_rec_ip_t.u4_size
- != sizeof(ih264d_retrieve_mem_rec_ip_t))
+ if(ps_ip->s_ivd_delete_ip_t.u4_size
+ != sizeof(ih264d_delete_ip_t))
{
- ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1
+ ps_op->s_ivd_delete_op_t.u4_error_code |= 1
<< IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |=
+ ps_op->s_ivd_delete_op_t.u4_error_code |=
IVD_IP_API_STRUCT_SIZE_INCORRECT;
return (IV_FAIL);
}
- if(ps_op->s_ivd_retrieve_mem_rec_op_t.u4_size
- != sizeof(ih264d_retrieve_mem_rec_op_t))
+ if(ps_op->s_ivd_delete_op_t.u4_size
+ != sizeof(ih264d_delete_op_t))
{
- ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1
+ ps_op->s_ivd_delete_op_t.u4_error_code |= 1
<< IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |=
+ ps_op->s_ivd_delete_op_t.u4_error_code |=
IVD_OP_API_STRUCT_SIZE_INCORRECT;
return (IV_FAIL);
}
- ps_mem_rec = ps_ip->s_ivd_retrieve_mem_rec_ip_t.pv_mem_rec_location;
- /* check memrecords sizes are correct */
- for(i = 0; i < MEM_REC_CNT; i++)
- {
- if(ps_mem_rec[i].u4_size != sizeof(iv_mem_rec_t))
- {
- ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |= 1
- << IVD_UNSUPPORTEDPARAM;
- ps_op->s_ivd_retrieve_mem_rec_op_t.u4_error_code |=
- IVD_MEM_REC_STRUCT_SIZE_INCORRECT;
- return IV_FAIL;
- }
- }
}
break;
@@ -1365,38 +853,6 @@ WORD32 ih264d_set_processor(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
ps_op->u4_error_code = 0;
return IV_SUCCESS;
}
-/*****************************************************************************/
-/* */
-/* Function Name : ih264d_get_num_rec */
-/* */
-/* Description : returns number of mem records required */
-/* */
-/* Inputs : pv_api_ip input api structure */
-/* : pv_api_op output api structure */
-/* Outputs : */
-/* Outputs : */
-/* Returns : void */
-/* */
-/* Issues : none */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes (Describe the changes made) */
-/* 22 10 2008 100356 Draft */
-/* */
-/*****************************************************************************/
-WORD32 ih264d_get_num_rec(void *pv_api_ip, void *pv_api_op)
-{
- iv_num_mem_rec_ip_t *ps_mem_q_ip;
- iv_num_mem_rec_op_t *ps_mem_q_op;
- ps_mem_q_ip = (iv_num_mem_rec_ip_t *)pv_api_ip;
- ps_mem_q_op = (iv_num_mem_rec_op_t *)pv_api_op;
- UNUSED(ps_mem_q_ip);
- ps_mem_q_op->u4_num_mem_rec = MEM_REC_CNT;
-
- return IV_SUCCESS;
-
-}
/**************************************************************************
@@ -1427,11 +883,8 @@ void ih264d_init_decoder(void * ps_dec_params)
dec_slice_params_t *ps_cur_slice;
pocstruct_t *ps_prev_poc, *ps_cur_poc;
-
-
- /* Set pic_parameter_set_id to -1 */
-
-
+ /* Free any dynamic buffers that are allocated */
+ ih264d_free_dynamic_bufs(ps_dec);
ps_cur_slice = ps_dec->ps_cur_slice;
ps_dec->init_done = 0;
@@ -1579,12 +1032,6 @@ void ih264d_init_decoder(void * ps_dec_params)
/* Initialize Reference Pic Buffers */
ih264d_init_ref_bufs(ps_dec->ps_dpb_mgr);
-#if VERT_SCALE_UP_AND_422
- ps_dec->u1_vert_up_scale_flag = 1;
-#else
- ps_dec->u1_vert_up_scale_flag = 0;
-#endif
-
ps_dec->u2_prv_frame_num = 0;
ps_dec->u1_top_bottom_decoded = 0;
ps_dec->u1_dangling_field = 0;
@@ -1615,214 +1062,66 @@ void ih264d_init_decoder(void * ps_dec_params)
ih264d_init_arch(ps_dec);
ih264d_init_function_ptr(ps_dec);
-
+ ps_dec->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
ps_dec->init_done = 1;
- ps_dec->process_called = 1;
- ps_dec->pv_pic_buf_mgr = NULL;
- ps_dec->pv_mv_buf_mgr = NULL;
}
-
-/**************************************************************************
- * \if Function name : ih264d_init_video_decoder \endif
- *
- * \brief
- * Wrapper for the decoder init
- *
- * \param p_NALBufAPI: Pointer to NAL Buffer API.
- * \param ih264d_dec_mem_manager :Pointer to the function that will be called by decoder
- * for memory allocation and freeing.
- *
- * \return
- * pointer to the decparams
- *
- **************************************************************************
- */
-
-WORD32 ih264d_init_video_decoder(iv_obj_t *dec_hdl,
- ih264d_init_ip_t *ps_init_ip,
- ih264d_init_op_t *ps_init_op)
+WORD32 ih264d_free_static_bufs(iv_obj_t *dec_hdl)
{
- dec_struct_t * ps_dec;
- iv_mem_rec_t *memtab;
- UWORD8 *pu1_extra_mem_base,*pu1_mem_base;
-
- memtab = ps_init_ip->s_ivd_init_ip_t.pv_mem_rec_location;
-
- dec_hdl->pv_codec_handle = memtab[MEM_REC_CODEC].pv_base;
- ps_dec = dec_hdl->pv_codec_handle;
-
- memset(ps_dec, 0, sizeof(dec_struct_t));
-
- if(ps_init_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t, i4_level))
- {
- ps_dec->u4_level_at_init = ps_init_ip->i4_level;
- }
- else
- {
- ps_dec->u4_level_at_init = H264_LEVEL_3_1;
- }
-
- if(ps_init_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t, u4_num_ref_frames))
- {
- ps_dec->u4_num_ref_frames_at_init = ps_init_ip->u4_num_ref_frames;
- }
- else
- {
- ps_dec->u4_num_ref_frames_at_init = H264_MAX_REF_PICS;
- }
-
- if(ps_init_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t, u4_num_reorder_frames))
- {
- ps_dec->u4_num_reorder_frames_at_init =
- ps_init_ip->u4_num_reorder_frames;
- }
- else
- {
- ps_dec->u4_num_reorder_frames_at_init = H264_MAX_REF_PICS;
- }
-
- if(ps_init_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t, u4_num_extra_disp_buf))
- {
- ps_dec->u4_num_extra_disp_bufs_at_init =
- ps_init_ip->u4_num_extra_disp_buf;
- }
- else
- {
- ps_dec->u4_num_extra_disp_bufs_at_init = 0;
- }
-
- if(ps_init_ip->s_ivd_init_ip_t.u4_size
- > offsetof(ih264d_init_ip_t, u4_share_disp_buf))
- {
-#ifndef LOGO_EN
- ps_dec->u4_share_disp_buf = ps_init_ip->u4_share_disp_buf;
-#else
- ps_dec->u4_share_disp_buf = 0;
-#endif
- }
- else
- {
- ps_dec->u4_share_disp_buf = 0;
- }
-
- if((ps_init_ip->s_ivd_init_ip_t.e_output_format != IV_YUV_420P)
- && (ps_init_ip->s_ivd_init_ip_t.e_output_format
- != IV_YUV_420SP_UV)
- && (ps_init_ip->s_ivd_init_ip_t.e_output_format
- != IV_YUV_420SP_VU))
- {
- ps_dec->u4_share_disp_buf = 0;
- }
-
- if((ps_dec->u4_level_at_init < MIN_LEVEL_SUPPORTED)
- || (ps_dec->u4_level_at_init > MAX_LEVEL_SUPPORTED))
- {
- ps_init_op->s_ivd_init_op_t.u4_error_code |= ERROR_LEVEL_UNSUPPORTED;
- return (IV_FAIL);
- }
-
- if(ps_dec->u4_num_ref_frames_at_init > H264_MAX_REF_PICS)
- {
- ps_init_op->s_ivd_init_op_t.u4_error_code |= ERROR_NUM_REF;
- ps_dec->u4_num_ref_frames_at_init = H264_MAX_REF_PICS;
- }
-
- if(ps_dec->u4_num_reorder_frames_at_init > H264_MAX_REF_PICS)
- {
- ps_init_op->s_ivd_init_op_t.u4_error_code |= ERROR_NUM_REF;
- ps_dec->u4_num_reorder_frames_at_init = H264_MAX_REF_PICS;
+ dec_struct_t *ps_dec;
+
+ void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
+ void *pv_mem_ctxt;
+
+ ps_dec = (dec_struct_t *)dec_hdl->pv_codec_handle;
+ pf_aligned_free = ps_dec->pf_aligned_free;
+ pv_mem_ctxt = ps_dec->pv_mem_ctxt;
+
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sps);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pps);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_dec_thread_handle);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_bs_deblk_thread_handle);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dpb_mgr);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pred);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_disp_buf_mgr);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_pic_buf_mgr);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pic_buf_base);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dec_err_status);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_sei);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dpb_cmds);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_bitstrm);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_cur_slice);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_scratch_sps_pps);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_bits_buf_static);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ppv_map_ref_idx_to_poc_base);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->p_cabac_ctxt_table_t);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_left_mb_ctxt_info);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_ref_buff_base);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pi2_pred1);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_temp_mc_buffer);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_init_dpb_base);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu4_mbaff_wt_mat);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu4_wts_ofsts_mat);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_left_mvpred_addr);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pv_mv_buf_mgr);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_col_mv_base);
+ PS_DEC_ALIGNED_FREE(ps_dec, dec_hdl->pv_codec_handle);
+
+ if(dec_hdl)
+ {
+ pf_aligned_free(pv_mem_ctxt, dec_hdl);
}
-
- if(ps_dec->u4_num_extra_disp_bufs_at_init > H264_MAX_REF_PICS)
- {
- ps_init_op->s_ivd_init_op_t.u4_error_code |= ERROR_NUM_REF;
- ps_dec->u4_num_extra_disp_bufs_at_init = 0;
- }
-
- if(0 == ps_dec->u4_share_disp_buf)
- ps_dec->u4_num_extra_disp_bufs_at_init = 0;
-
- ps_dec->u4_num_disp_bufs_requested = 1;
-
- ps_dec->u4_width_at_init = ps_init_ip->s_ivd_init_ip_t.u4_frm_max_wd;
- ps_dec->u4_height_at_init = ps_init_ip->s_ivd_init_ip_t.u4_frm_max_ht;
-
- ps_dec->u4_width_at_init = ALIGN16(ps_dec->u4_width_at_init);
- ps_dec->u4_height_at_init = ALIGN32(ps_dec->u4_height_at_init);
-
- ps_dec->pv_dec_thread_handle = memtab[MEM_REC_THREAD_HANDLE].pv_base;
-
- pu1_mem_base = memtab[MEM_REC_THREAD_HANDLE].pv_base;
- ps_dec->pv_bs_deblk_thread_handle = pu1_mem_base
- + ithread_get_handle_size();
-
- ps_dec->u4_extra_mem_used = 0;
-
- pu1_extra_mem_base = memtab[MEM_REC_EXTRA_MEM].pv_base;
-
- ps_dec->ps_dec_err_status = (dec_err_status_t *)(pu1_extra_mem_base + ps_dec->u4_extra_mem_used);
- ps_dec->u4_extra_mem_used += (((sizeof(dec_err_status_t) + 127) >> 7) << 7);
-
- ps_dec->ps_mem_tab = memtab[MEM_REC_BACKUP].pv_base;
-
- memcpy(ps_dec->ps_mem_tab, memtab, sizeof(iv_mem_rec_t) * MEM_REC_CNT);
-
- ps_dec->ps_pps = memtab[MEM_REC_PPS].pv_base;
-
- ps_dec->ps_sps = memtab[MEM_REC_SPS].pv_base;
-
- ps_dec->ps_sei = (sei *)(pu1_extra_mem_base + ps_dec->u4_extra_mem_used);
- ps_dec->u4_extra_mem_used += sizeof(sei);
-
- ps_dec->ps_dpb_mgr = memtab[MEM_REC_DPB_MGR].pv_base;
-
- ps_dec->ps_dpb_cmds = (dpb_commands_t *)(pu1_extra_mem_base + ps_dec->u4_extra_mem_used);
- ps_dec->u4_extra_mem_used += sizeof(dpb_commands_t);
-
- ps_dec->ps_bitstrm = (dec_bit_stream_t *)(pu1_extra_mem_base + ps_dec->u4_extra_mem_used);
- ps_dec->u4_extra_mem_used += sizeof(dec_bit_stream_t);
-
- ps_dec->ps_cur_slice =(dec_slice_params_t *) (pu1_extra_mem_base + ps_dec->u4_extra_mem_used);
- ps_dec->u4_extra_mem_used += sizeof(dec_slice_params_t);
-
- ps_dec->pv_scratch_sps_pps = (void *)(pu1_extra_mem_base + ps_dec->u4_extra_mem_used);
-
-
- ps_dec->u4_extra_mem_used += MAX(sizeof(dec_seq_params_t),
- sizeof(dec_pic_params_t));
- ps_dec->ps_pred_pkd = memtab[MEM_REC_PRED_INFO_PKD].pv_base;
-
-
- ps_dec->ps_dpb_mgr->pv_codec_handle = ps_dec;
-
- ps_dec->pv_dec_out = (void *)ps_init_op;
- ps_dec->pv_dec_in = (void *)ps_init_ip;
-
- ps_dec->u1_chroma_format =
- (UWORD8)(ps_init_ip->s_ivd_init_ip_t.e_output_format);
-
-
-
- ih264d_init_decoder(ps_dec);
-
- return (IV_SUCCESS);
-
+ return IV_SUCCESS;
}
-
-
/*****************************************************************************/
/* */
-/* Function Name : ih264d_fill_num_mem_rec */
+/* Function Name : ih264d_create */
/* */
-/* Description : fills memory records */
+/* Description : creates decoder */
/* */
-/* Inputs : pv_api_ip input api structure */
-/* : pv_api_op output api structure */
+/* Inputs :iv_obj_t decoder handle */
+/* :pv_api_ip pointer to input structure */
+/* :pv_api_op pointer to output structure */
/* Outputs : */
/* Returns : void */
/* */
@@ -1834,531 +1133,270 @@ WORD32 ih264d_init_video_decoder(iv_obj_t *dec_hdl,
/* 22 10 2008 100356 Draft */
/* */
/*****************************************************************************/
-WORD32 ih264d_fill_num_mem_rec(void *pv_api_ip, void *pv_api_op)
+WORD32 ih264d_allocate_static_bufs(iv_obj_t **dec_hdl, void *pv_api_ip, void *pv_api_op)
{
+ ih264d_create_ip_t *ps_create_ip;
+ ih264d_create_op_t *ps_create_op;
+ void *pv_buf;
+ UWORD8 *pu1_buf;
+ dec_struct_t *ps_dec;
+ void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
+ void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
+ void *pv_mem_ctxt;
+ WORD32 size;
+
+ ps_create_ip = (ih264d_create_ip_t *)pv_api_ip;
+ ps_create_op = (ih264d_create_op_t *)pv_api_op;
+
+ ps_create_op->s_ivd_create_op_t.u4_error_code = 0;
+
+ pf_aligned_alloc = ps_create_ip->s_ivd_create_ip_t.pf_aligned_alloc;
+ pf_aligned_free = ps_create_ip->s_ivd_create_ip_t.pf_aligned_free;
+ pv_mem_ctxt = ps_create_ip->s_ivd_create_ip_t.pv_mem_ctxt;
+
+ /* Initialize return handle to NULL */
+ ps_create_op->s_ivd_create_op_t.pv_handle = NULL;
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(iv_obj_t));
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ *dec_hdl = (iv_obj_t *)pv_buf;
+ ps_create_op->s_ivd_create_op_t.pv_handle = *dec_hdl;
+
+ (*dec_hdl)->pv_codec_handle = NULL;
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, sizeof(dec_struct_t));
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ (*dec_hdl)->pv_codec_handle = (dec_struct_t *)pv_buf;
+ ps_dec = (dec_struct_t *)pv_buf;
- ih264d_fill_mem_rec_ip_t *ps_mem_q_ip;
- ih264d_fill_mem_rec_op_t *ps_mem_q_op;
- WORD32 level;
- UWORD32 num_reorder_frames;
- UWORD32 num_ref_frames;
- UWORD32 num_extra_disp_bufs;
- UWORD32 u4_dpb_size_num_frames;
- iv_mem_rec_t *memTab;
-
- UWORD32 chroma_format, u4_share_disp_buf;
- UWORD32 u4_total_num_mbs;
- UWORD32 luma_width, luma_width_in_mbs;
- UWORD32 luma_height, luma_height_in_mbs;
- UWORD32 max_dpb_size;
-
- ps_mem_q_ip = (ih264d_fill_mem_rec_ip_t *)pv_api_ip;
- ps_mem_q_op = (ih264d_fill_mem_rec_op_t *)pv_api_op;
-
- if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
- > offsetof(ih264d_fill_mem_rec_ip_t, i4_level))
- {
- level = ps_mem_q_ip->i4_level;
- }
- else
- {
- level = H264_LEVEL_3_1;
- }
-
- if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
- > offsetof(ih264d_fill_mem_rec_ip_t, u4_num_reorder_frames))
- {
- num_reorder_frames = ps_mem_q_ip->u4_num_reorder_frames;
- }
- else
- {
- num_reorder_frames = H264_MAX_REF_PICS;
- }
-
- if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
- > offsetof(ih264d_fill_mem_rec_ip_t, u4_num_ref_frames))
- {
- num_ref_frames = ps_mem_q_ip->u4_num_ref_frames;
- }
- else
- {
- num_ref_frames = H264_MAX_REF_PICS;
- }
-
- if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
- > offsetof(ih264d_fill_mem_rec_ip_t, u4_num_extra_disp_buf))
- {
- num_extra_disp_bufs = ps_mem_q_ip->u4_num_extra_disp_buf;
- }
- else
- {
- num_extra_disp_bufs = 0;
- }
+ memset(ps_dec, 0, sizeof(dec_struct_t));
- if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
- > offsetof(ih264d_fill_mem_rec_ip_t, u4_share_disp_buf))
- {
#ifndef LOGO_EN
- u4_share_disp_buf = ps_mem_q_ip->u4_share_disp_buf;
+ ps_dec->u4_share_disp_buf = ps_create_ip->s_ivd_create_ip_t.u4_share_disp_buf;
#else
- u4_share_disp_buf = 0;
+ ps_dec->u4_share_disp_buf = 0;
#endif
- }
- else
- {
- u4_share_disp_buf = 0;
- }
-
- if(ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_size
- > offsetof(ih264d_fill_mem_rec_ip_t, e_output_format))
- {
- chroma_format = ps_mem_q_ip->e_output_format;
- }
- else
- {
- chroma_format = -1;
- }
-
- if((chroma_format != IV_YUV_420P) && (chroma_format != IV_YUV_420SP_UV)
- && (chroma_format != IV_YUV_420SP_VU))
- {
- u4_share_disp_buf = 0;
- }
- if(0 == u4_share_disp_buf)
- num_extra_disp_bufs = 0;
-
- {
- luma_height = ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht;
- luma_width = ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd;
-
- luma_height = ALIGN32(luma_height);
- luma_width = ALIGN16(luma_width);
- luma_width_in_mbs = luma_width >> 4;
- luma_height_in_mbs = luma_height >> 4;
- u4_total_num_mbs = (luma_height * luma_width) >> 8;
- }
- /*
- * If level is lesser than 31 and the resolution required is higher,
- * then make the level at least 31.
- */
- if(u4_total_num_mbs > MAX_MBS_LEVEL_30 && level < H264_LEVEL_3_1)
- {
- level = H264_LEVEL_3_1;
- }
+ ps_dec->u1_chroma_format =
+ (UWORD8)(ps_create_ip->s_ivd_create_ip_t.e_output_format);
- if((level < MIN_LEVEL_SUPPORTED) || (level > MAX_LEVEL_SUPPORTED))
+ if((ps_dec->u1_chroma_format != IV_YUV_420P)
+ && (ps_dec->u1_chroma_format
+ != IV_YUV_420SP_UV)
+ && (ps_dec->u1_chroma_format
+ != IV_YUV_420SP_VU))
{
- ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_error_code |=
- ERROR_LEVEL_UNSUPPORTED;
- return (IV_FAIL);
+ ps_dec->u4_share_disp_buf = 0;
}
- if(num_ref_frames > H264_MAX_REF_PICS)
- {
- ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= ERROR_NUM_REF;
- num_ref_frames = H264_MAX_REF_PICS;
- }
+ ps_dec->pf_aligned_alloc = pf_aligned_alloc;
+ ps_dec->pf_aligned_free = pf_aligned_free;
+ ps_dec->pv_mem_ctxt = pv_mem_ctxt;
- if(num_reorder_frames > H264_MAX_REF_PICS)
- {
- ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_error_code |= ERROR_NUM_REF;
- num_reorder_frames = H264_MAX_REF_PICS;
- }
- memTab = ps_mem_q_ip->s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location;
- memTab[MEM_REC_IV_OBJ].u4_mem_size = sizeof(iv_obj_t);
- memTab[MEM_REC_IV_OBJ].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_IV_OBJ].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- H264_DEC_DEBUG_PRINT("MEM_REC_IV_OBJ MEM Size = %d\n",
- memTab[MEM_REC_IV_OBJ].u4_mem_size);
+ size = ((sizeof(dec_seq_params_t)) * MAX_NUM_SEQ_PARAMS);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_sps = pv_buf;
- memTab[MEM_REC_CODEC].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_CODEC].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_CODEC].u4_mem_size = sizeof(dec_struct_t);
+ size = (sizeof(dec_pic_params_t)) * MAX_NUM_PIC_PARAMS;
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_pps = pv_buf;
- {
- UWORD32 mvinfo_size, mv_info_size_pad;
- UWORD32 MVbank, MVbank_pad;
- UWORD32 Ysize;
- UWORD32 UVsize;
- UWORD32 one_frm_size;
+ size = ithread_get_handle_size();
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pv_dec_thread_handle = pv_buf;
- UWORD32 extra_mem = 0;
+ size = ithread_get_handle_size();
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pv_bs_deblk_thread_handle = pv_buf;
- UWORD32 pad_len_h, pad_len_v;
+ size = sizeof(dpb_manager_t);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_dpb_mgr = pv_buf;
- /*
- * For low_delay, use num_buf as 2 -
- * num_buf = (num_buf_ref) + 1;
- * where num_buf_ref is 1.
- */
- UWORD32 num_buf;
+ size = sizeof(pred_info_t) * 2 * 32;
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_pred = pv_buf;
- {
- UWORD32 num_bufs_app, num_bufs_level;
+ size = sizeof(disp_mgr_t);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pv_disp_buf_mgr = pv_buf;
- num_bufs_app = num_ref_frames + num_reorder_frames + 1;
+ size = sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pv_pic_buf_mgr = pv_buf;
- if(num_bufs_app <= 1)
- num_bufs_app = 2;
+ size = sizeof(struct pic_buffer_t) * (H264_MAX_REF_PICS * 2);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_pic_buf_base = pv_buf;
- num_bufs_level = ih264d_get_dpb_size_new(level, (luma_width >> 4),
- (luma_height >> 4));
+ size = sizeof(dec_err_status_t);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_dec_err_status = (dec_err_status_t *)pv_buf;
- max_dpb_size = num_bufs_level;
+ size = sizeof(sei);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_sei = (sei *)pv_buf;
- num_bufs_level = num_bufs_level * 2 + 1;
+ size = sizeof(dpb_commands_t);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_dpb_cmds = (dpb_commands_t *)pv_buf;
- num_buf = MIN(num_bufs_level, num_bufs_app);
+ size = sizeof(dec_bit_stream_t);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_bitstrm = (dec_bit_stream_t *)pv_buf;
- num_buf += num_extra_disp_bufs;
+ size = sizeof(dec_slice_params_t);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_cur_slice = (dec_slice_params_t *)pv_buf;
- }
+ size = MAX(sizeof(dec_seq_params_t), sizeof(dec_pic_params_t));
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pv_scratch_sps_pps = pv_buf;
- mvinfo_size = ((luma_width * (luma_height)) >> 4);
- mv_info_size_pad = ((luma_width * (PAD_MV_BANK_ROW)) >> 4);
+ ps_dec->u4_static_bits_buf_size = 256000;
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, ps_dec->u4_static_bits_buf_size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_bits_buf_static = pv_buf;
- Ysize = ALIGN32((luma_width + (PAD_LEN_Y_H << 1)))
- * (luma_height + (PAD_LEN_Y_V << 2));
+ size = ((TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC)
+ * sizeof(void *));
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ppv_map_ref_idx_to_poc_base = pv_buf;
+ memset(ps_dec->ppv_map_ref_idx_to_poc_base, 0, size);
- UVsize = Ysize >> 2;
- if(u4_share_disp_buf == 1)
- {
- /* In case of buffers getting shared between application and library
- there is no need of reference memtabs. Instead of setting the i4_size
- to zero, it is reduced to a small i4_size to ensure that changes
- in the code are minimal */
-
- if((chroma_format == IV_YUV_420P)
- || (chroma_format == IV_YUV_420SP_UV)
- || (chroma_format == IV_YUV_420SP_VU))
- {
- Ysize = 64;
- }
- if(chroma_format == IV_YUV_420SP_UV)
- {
- UVsize = 64;
- }
- }
+ ps_dec->ppv_map_ref_idx_to_poc = ps_dec->ppv_map_ref_idx_to_poc_base + OFFSET_MAP_IDX_POC;
- one_frm_size = (((Ysize + 127) >> 7) << 7)
- + ((((UVsize << 1) + 127) >> 7) << 7);
- //Note that for ARM RVDS WS the sizeof(mv_pred_t) is 16
+ size = (sizeof(bin_ctxt_model_t) * NUM_CABAC_CTXTS);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->p_cabac_ctxt_table_t = pv_buf;
- /*Add memory for colocated MB*/
- MVbank = sizeof(mv_pred_t) * mvinfo_size;
- MVbank_pad = sizeof(mv_pred_t) * mv_info_size_pad;
- MVbank = (((MVbank + 127) >> 7) << 7);
- MVbank_pad = (((MVbank_pad + 127) >> 7) << 7);
+ size = sizeof(ctxt_inc_mb_info_t);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_left_mb_ctxt_info = pv_buf;
- memTab[MEM_REC_MVBANK].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_MVBANK].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_MVBANK].u4_mem_size = (MVbank + MVbank_pad)
- * (MIN(max_dpb_size, num_ref_frames) + 1);
- memTab[MEM_REC_REF_PIC].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_REF_PIC].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_REF_PIC].u4_mem_size = one_frm_size * num_buf;
+ size = MAX_REF_BUF_SIZE * 2;
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_ref_buff_base = pv_buf;
+ ps_dec->pu1_ref_buff = ps_dec->pu1_ref_buff_base + MAX_REF_BUF_SIZE;
- }
- memTab[MEM_REC_DEBLK_MB_INFO].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_DEBLK_MB_INFO].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_DEBLK_MB_INFO].u4_mem_size = (((((u4_total_num_mbs
- + (luma_width >> 4)) * sizeof(deblk_mb_t)) + 127) >> 7) << 7);
-
- memTab[MEM_REC_NEIGHBOR_INFO].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_NEIGHBOR_INFO].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_NEIGHBOR_INFO].u4_mem_size = sizeof(mb_neigbour_params_t)
- * ((luma_width + 16) >> 4) * 2 * 2;
- {
- WORD32 size;
- WORD32 num_entries;
-
- num_entries = MIN(MAX_FRAMES, num_ref_frames);
- num_entries = 2 * ((2 * num_entries) + 1);
-
- size = num_entries * sizeof(void *);
- size += PAD_MAP_IDX_POC * sizeof(void *);
- size *= u4_total_num_mbs;
- size += sizeof(dec_slice_struct_t) * u4_total_num_mbs;
- memTab[MEM_REC_SLICE_HDR].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_SLICE_HDR].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_SLICE_HDR].u4_mem_size = size;
- }
- {
-
- UWORD32 u4_num_entries;
-
- u4_num_entries = u4_total_num_mbs;
-
- memTab[MEM_REC_MB_INFO].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_MB_INFO].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_MB_INFO].u4_mem_size = sizeof(dec_mb_info_t)
- * u4_num_entries;
-
- memTab[MEM_REC_PRED_INFO].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_PRED_INFO].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
-
- memTab[MEM_REC_PRED_INFO].u4_mem_size = sizeof(pred_info_t) * 2*32;
-
- memTab[MEM_REC_COEFF_DATA].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_COEFF_DATA].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_COEFF_DATA].u4_mem_size = MB_LUM_SIZE * sizeof(WORD16);
- /*For I16x16 MBs, 16 4x4 AC coeffs and 1 4x4 DC coeff TU blocks will be sent
- For all MBs along with 8 4x4 AC coeffs 2 2x2 DC coeff TU blocks will be sent
- So use 17 4x4 TU blocks for luma and 9 4x4 TU blocks for chroma */
- memTab[MEM_REC_COEFF_DATA].u4_mem_size += u4_num_entries
- * (MAX(17 * sizeof(tu_sblk4x4_coeff_data_t),4 * sizeof(tu_blk8x8_coeff_data_t))
- + 9 * sizeof(tu_sblk4x4_coeff_data_t));
- //32 bytes for each mb to store u1_prev_intra4x4_pred_mode and u1_rem_intra4x4_pred_mode data
- memTab[MEM_REC_COEFF_DATA].u4_mem_size += u4_num_entries * 32;
-
- }
-
- memTab[MEM_REC_SPS].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_SPS].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_SPS].u4_mem_size = ((sizeof(dec_seq_params_t))
- * MAX_NUM_SEQ_PARAMS);
-
- memTab[MEM_REC_PPS].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_PPS].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_PPS].u4_mem_size = (sizeof(dec_pic_params_t))
- * MAX_NUM_PIC_PARAMS;
-
- {
- UWORD32 u4_mem_size;
-
- u4_mem_size = 0;
- u4_mem_size += (((sizeof(dec_err_status_t) + 127) >> 7) << 7);
- u4_mem_size += sizeof(sei);
- u4_mem_size += sizeof(dpb_commands_t);
- u4_mem_size += sizeof(dec_bit_stream_t);
- u4_mem_size += sizeof(dec_slice_params_t);
- u4_mem_size += MAX(sizeof(dec_seq_params_t), sizeof(dec_pic_params_t));
-
- memTab[MEM_REC_EXTRA_MEM].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_EXTRA_MEM].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_EXTRA_MEM].u4_mem_size = u4_mem_size;
- }
-
- {
-
- UWORD32 u4_mem_size;
-
- u4_mem_size = 0;
- u4_mem_size += ((TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC) * sizeof(void *));
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += (sizeof(bin_ctxt_model_t) * NUM_CABAC_CTXTS);
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += sizeof(ctxt_inc_mb_info_t);
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += sizeof(UWORD32) * (MAX_REF_BUFS * MAX_REF_BUFS);
- u4_mem_size = ALIGN64(u4_mem_size);
-
- u4_mem_size += MAX_REF_BUF_SIZE * 2;
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += ((sizeof(WORD16)) * PRED_BUFFER_WIDTH
+ size = ((sizeof(WORD16)) * PRED_BUFFER_WIDTH
* PRED_BUFFER_HEIGHT * 2);
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += sizeof(UWORD8) * (MB_LUM_SIZE);
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += sizeof(parse_pmbarams_t) * luma_width_in_mbs; //Max recon mb group*/
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += (sizeof(parse_part_params_t) * luma_width_in_mbs) << 4; //Max recon mb group*/
- u4_mem_size = ALIGN64(u4_mem_size);
-
- u4_mem_size += 2 * MAX_REF_BUFS * sizeof(struct pic_buffer_t);
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += 2 * MAX_REF_BUFS * sizeof(struct pic_buffer_t);
- u4_mem_size = ALIGN64(u4_mem_size);
- u4_mem_size += (sizeof(UWORD32) * 3 * (MAX_REF_BUFS * MAX_REF_BUFS)) << 3;
- u4_mem_size = ALIGN64(u4_mem_size);
-
- u4_mem_size += sizeof(UWORD32) * 2 * 3 * (MAX_REF_BUFS * MAX_REF_BUFS);
- u4_mem_size = ALIGN64(u4_mem_size);
-
- memTab[MEM_REC_INTERNAL_SCRATCH].u4_mem_alignment =
- (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_INTERNAL_SCRATCH].e_mem_type =
- IV_EXTERNAL_CACHEABLE_SCRATCH_MEM;
- memTab[MEM_REC_INTERNAL_SCRATCH].u4_mem_size = u4_mem_size;
- }
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pi2_pred1 = pv_buf;
- {
- UWORD32 u4_mem_used;
- UWORD32 u4_numRows = MB_SIZE << 1;
- UWORD32 u4_blk_wd = ((luma_width_in_mbs << 4) >> 1) + 8;
-
- u4_mem_used = 0;
- u4_mem_used += ((luma_width_in_mbs * sizeof(deblkmb_neighbour_t)) << 1);
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += (sizeof(neighbouradd_t) << 2);
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += ((sizeof(ctxt_inc_mb_info_t))
- * (((luma_width_in_mbs + 1) << 1) + 1));
- u4_mem_used = ALIGN64(u4_mem_used);
-
- u4_mem_used += (sizeof(mv_pred_t) * luma_width_in_mbs * 16);
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += (sizeof(mv_pred_t) * luma_width_in_mbs * 16);
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += (sizeof(mv_pred_t) * luma_width_in_mbs * 4
- * MV_SCRATCH_BUFS);
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_numRows = BLK8x8SIZE << 1;
-
- u4_blk_wd = ((luma_width_in_mbs << 3) >> 1) + 8;
-
- u4_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_mem_used += 32;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(UWORD8) * (luma_width + 16) * 2;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(UWORD8) * (luma_width + 16) * 2;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(UWORD8) * (luma_width + 16) * 2;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += sizeof(mb_neigbour_params_t) * (luma_width_in_mbs + 1)
- * luma_height_in_mbs;
- u4_mem_used += luma_width;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += luma_width;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += luma_width;
- u4_mem_used = ALIGN64(u4_mem_used);
-
- u4_mem_used += ((MB_SIZE + 4) << 1) * PAD_LEN_Y_H;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += ((BLK8x8SIZE + 2) << 1) * PAD_LEN_UV_H;
- u4_mem_used = ALIGN64(u4_mem_used);
- u4_mem_used += ((BLK8x8SIZE + 2) << 1) * PAD_LEN_UV_H;
- u4_mem_used = ALIGN64(u4_mem_used);
- memTab[MEM_REC_INTERNAL_PERSIST].u4_mem_alignment =
- (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_INTERNAL_PERSIST].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_INTERNAL_PERSIST].u4_mem_size = u4_mem_used;
- }
+ size = sizeof(UWORD8) * (MB_LUM_SIZE);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_temp_mc_buffer = pv_buf;
- memTab[MEM_REC_BITSBUF].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_BITSBUF].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_BITSBUF].u4_mem_size = MAX(256000, (luma_width * luma_height * 3 / 2));
- {
- UWORD32 u4_thread_struct_size = ithread_get_handle_size();
- memTab[MEM_REC_THREAD_HANDLE].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_THREAD_HANDLE].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_THREAD_HANDLE].u4_mem_size = u4_thread_struct_size * 2;
+ size = 8 * MAX_REF_BUFS * sizeof(struct pic_buffer_t);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
- }
-
- memTab[MEM_REC_PARSE_MAP].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_PARSE_MAP].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_PARSE_MAP].u4_mem_size = u4_total_num_mbs;
+ ps_dec->pu1_init_dpb_base = pv_buf;
+ pu1_buf = pv_buf;
+ ps_dec->ps_dpb_mgr->ps_init_dpb[0][0] = (struct pic_buffer_t *)pu1_buf;
- memTab[MEM_REC_PROC_MAP].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_PROC_MAP].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_PROC_MAP].u4_mem_size = u4_total_num_mbs;
+ pu1_buf += size / 2;
+ ps_dec->ps_dpb_mgr->ps_init_dpb[1][0] = (struct pic_buffer_t *)pu1_buf;
- memTab[MEM_REC_SLICE_NUM_MAP].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_SLICE_NUM_MAP].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_SLICE_NUM_MAP].u4_mem_size = u4_total_num_mbs
- * sizeof(UWORD16);
+ size = (sizeof(UWORD32) * 3
+ * (MAX_FRAMES * MAX_FRAMES))
+ << 3;
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu4_mbaff_wt_mat = pv_buf;
- memTab[MEM_REC_DPB_MGR].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_DPB_MGR].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_DPB_MGR].u4_mem_size = sizeof(dpb_manager_t);
+ size = sizeof(UWORD32) * 2 * 3
+ * (MAX_FRAMES * MAX_FRAMES);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu4_wts_ofsts_mat = pv_buf;
- memTab[MEM_REC_BACKUP].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_BACKUP].e_mem_type = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_BACKUP].u4_mem_size = sizeof(iv_mem_rec_t) * MEM_REC_CNT;
- {
+ size = (sizeof(neighbouradd_t) << 2);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_left_mvpred_addr = pv_buf;
- UWORD32 u4_mem_size;
- u4_mem_size = sizeof(disp_mgr_t);
- u4_mem_size += sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
- u4_mem_size += sizeof(struct pic_buffer_t) * (H264_MAX_REF_PICS * 2);
-
- memTab[MEM_REC_PIC_BUF_MGR].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_PIC_BUF_MGR].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_PIC_BUF_MGR].u4_mem_size = u4_mem_size;
- }
+ size = sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pv_mv_buf_mgr = pv_buf;
- {
- UWORD32 u4_mem_size;
-
- u4_mem_size = sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
- u4_mem_size += sizeof(col_mv_buf_t) * (H264_MAX_REF_PICS * 2);
- u4_mem_size = ALIGN128(u4_mem_size);
- u4_mem_size += ((luma_width * luma_height) >> 4)
- * (MIN(max_dpb_size, num_ref_frames) + 1);
- memTab[MEM_REC_MV_BUF_MGR].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_MV_BUF_MGR].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
- memTab[MEM_REC_MV_BUF_MGR].u4_mem_size = u4_mem_size;
- }
- memTab[MEM_REC_PRED_INFO_PKD].u4_mem_alignment = (128 * 8) / CHAR_BIT;
- memTab[MEM_REC_PRED_INFO_PKD].e_mem_type =
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
+ size = sizeof(col_mv_buf_t) * (H264_MAX_REF_PICS * 2);
+ pv_buf = pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_col_mv_base = pv_buf;
+ memset(ps_dec->ps_col_mv_base, 0, size);
{
- UWORD32 u4_num_entries;
- u4_num_entries = u4_total_num_mbs;
-
- if(1 == num_ref_frames)
- u4_num_entries *= 16;
- else
- u4_num_entries *= 16 * 2;
+ UWORD8 i;
+ struct pic_buffer_t *ps_init_dpb;
+ ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[0][0];
+ for(i = 0; i < 2 * MAX_REF_BUFS; i++)
+ {
+ ps_init_dpb->pu1_buf1 = NULL;
+ ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
+ ps_dec->ps_dpb_mgr->ps_init_dpb[0][i] = ps_init_dpb;
+ ps_dec->ps_dpb_mgr->ps_mod_dpb[0][i] = ps_init_dpb;
+ ps_init_dpb++;
+ }
- memTab[MEM_REC_PRED_INFO_PKD].u4_mem_size = sizeof(pred_info_pkd_t)
- * u4_num_entries;
+ ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[1][0];
+ for(i = 0; i < 2 * MAX_REF_BUFS; i++)
+ {
+ ps_init_dpb->pu1_buf1 = NULL;
+ ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
+ ps_dec->ps_dpb_mgr->ps_init_dpb[1][i] = ps_init_dpb;
+ ps_dec->ps_dpb_mgr->ps_mod_dpb[1][i] = ps_init_dpb;
+ ps_init_dpb++;
+ }
}
-
- ps_mem_q_op->s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled = MEM_REC_CNT;
-
+ ih264d_init_decoder(ps_dec);
return IV_SUCCESS;
}
+
+
/*****************************************************************************/
/* */
-/* Function Name : ih264d_clr */
+/* Function Name : ih264d_create */
/* */
-/* Description : returns memory records to app */
+/* Description : creates decoder */
/* */
/* Inputs :iv_obj_t decoder handle */
/* :pv_api_ip pointer to input structure */
@@ -2374,78 +1412,33 @@ WORD32 ih264d_fill_num_mem_rec(void *pv_api_ip, void *pv_api_op)
/* 22 10 2008 100356 Draft */
/* */
/*****************************************************************************/
-WORD32 ih264d_clr(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
+WORD32 ih264d_create(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
{
+ ih264d_create_op_t *ps_create_op;
- dec_struct_t * ps_dec;
- iv_retrieve_mem_rec_ip_t *dec_clr_ip;
- iv_retrieve_mem_rec_op_t *dec_clr_op;
+ WORD32 ret;
- dec_clr_ip = (iv_retrieve_mem_rec_ip_t *)pv_api_ip;
- dec_clr_op = (iv_retrieve_mem_rec_op_t *)pv_api_op;
- ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
+ ps_create_op = (ih264d_create_op_t *)pv_api_op;
- if(ps_dec->init_done != 1)
- {
- //return a proper Error Code
- return IV_FAIL;
- }
+ ps_create_op->s_ivd_create_op_t.u4_error_code = 0;
- if(ps_dec->pv_pic_buf_mgr)
- ih264_buf_mgr_free((buf_mgr_t *)ps_dec->pv_pic_buf_mgr);
- if(ps_dec->pv_mv_buf_mgr)
- ih264_buf_mgr_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr);
+ ret = ih264d_allocate_static_bufs(&dec_hdl, pv_api_ip, pv_api_op);
- memcpy(dec_clr_ip->pv_mem_rec_location, ps_dec->ps_mem_tab,
- MEM_REC_CNT * (sizeof(iv_mem_rec_t)));
- dec_clr_op->u4_num_mem_rec_filled = MEM_REC_CNT;
+ /* If allocation of some buffer fails, then free buffers allocated till then */
+ if((IV_FAIL == ret) && (NULL != dec_hdl))
+ {
+ ih264d_free_static_bufs(dec_hdl);
+ ps_create_op->s_ivd_create_op_t.u4_error_code = IVD_MEM_ALLOC_FAILED;
+ ps_create_op->s_ivd_create_op_t.u4_error_code = 1 << IVD_FATALERROR;
- H264_DEC_DEBUG_PRINT("The clear non-conceal num mem recs: %d\n",
- dec_clr_op->u4_num_mem_rec_filled);
+ return IV_FAIL;
+ }
return IV_SUCCESS;
-
}
/*****************************************************************************/
/* */
-/* Function Name : ih264d_init */
-/* */
-/* Description : initializes decoder */
-/* */
-/* Inputs :iv_obj_t decoder handle */
-/* :pv_api_ip pointer to input structure */
-/* :pv_api_op pointer to output structure */
-/* Outputs : */
-/* Returns : void */
-/* */
-/* Issues : none */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes (Describe the changes made) */
-/* 22 10 2008 100356 Draft */
-/* */
-/*****************************************************************************/
-WORD32 ih264d_init(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
-{
- ih264d_init_ip_t *ps_init_ip;
- ih264d_init_op_t *ps_init_op;
- WORD32 init_status = IV_SUCCESS;
- ps_init_ip = (ih264d_init_ip_t *)pv_api_ip;
- ps_init_op = (ih264d_init_op_t *)pv_api_op;
-
- init_status = ih264d_init_video_decoder(dec_hdl, ps_init_ip, ps_init_op);
-
- if(IV_SUCCESS != init_status)
- {
- return init_status;
- }
-
- return init_status;
-}
-/*****************************************************************************/
-/* */
/* Function Name : ih264d_map_error */
/* */
/* Description : Maps error codes to IVD error groups */
@@ -2477,6 +1470,7 @@ UWORD32 ih264d_map_error(UWORD32 i4_err_status)
case ERROR_ACTUAL_RESOLUTION_GREATER_THAN_INIT:
case ERROR_PROFILE_NOT_SUPPORTED:
case ERROR_INIT_NOT_DONE:
+ case IVD_MEM_ALLOC_FAILED:
temp = 1 << IVD_FATALERROR;
H264_DEC_DEBUG_PRINT("\nFatal Error\n");
break;
@@ -2600,7 +1594,6 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
ps_dec_ip = (ivd_video_decode_ip_t *)pv_api_ip;
ps_dec_op = (ivd_video_decode_op_t *)pv_api_op;
ps_dec->pv_dec_out = ps_dec_op;
- ps_dec->process_called = 1;
if(ps_dec->init_done != 1)
{
return IV_FAIL;
@@ -2640,7 +1633,6 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
ps_dec->u4_output_present = 0;
ps_dec->s_disp_op.u4_error_code = 1;
ps_dec->u4_fmt_conv_num_rows = FMT_CONV_NUM_ROWS;
- ps_dec->u4_stop_threads = 0;
if(0 == ps_dec->u4_share_disp_buf
&& ps_dec->i4_decode_header == 0)
{
@@ -2859,17 +1851,46 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
DEBUG_THREADS_PRINTF(" Starting process call\n");
+
ps_dec->u4_pic_buf_got = 0;
do
{
+ WORD32 buf_size;
pu1_buf = (UWORD8*)ps_dec_ip->pv_stream_buffer
+ ps_dec_op->u4_num_bytes_consumed;
u4_max_ofst = ps_dec_ip->u4_num_Bytes
- ps_dec_op->u4_num_bytes_consumed;
- pu1_bitstrm_buf = ps_dec->ps_mem_tab[MEM_REC_BITSBUF].pv_base;
+
+ /* If dynamic bitstream buffer is not allocated and
+ * header decode is done, then allocate dynamic bitstream buffer
+ */
+ if((NULL == ps_dec->pu1_bits_buf_dynamic) &&
+ (ps_dec->i4_header_decoded & 1))
+ {
+ WORD32 size;
+
+ void *pv_buf;
+ void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
+ size = MAX(256000, ps_dec->u2_pic_wd * ps_dec->u2_pic_ht * 3 / 2);
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_bits_buf_dynamic = pv_buf;
+ ps_dec->u4_dynamic_bits_buf_size = size;
+ }
+
+ if(ps_dec->pu1_bits_buf_dynamic)
+ {
+ pu1_bitstrm_buf = ps_dec->pu1_bits_buf_dynamic;
+ buf_size = ps_dec->u4_dynamic_bits_buf_size;
+ }
+ else
+ {
+ pu1_bitstrm_buf = ps_dec->pu1_bits_buf_static;
+ buf_size = ps_dec->u4_static_bits_buf_size;
+ }
u4_next_is_aud = 0;
@@ -2880,47 +1901,11 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
if(buflen == -1)
buflen = 0;
/* Ignore bytes beyond the allocated size of intermediate buffer */
- buflen = MIN(buflen, (WORD32)ps_dec->ps_mem_tab[MEM_REC_BITSBUF].u4_mem_size);
+ buflen = MIN(buflen, buf_size);
bytes_consumed = buflen + u4_length_of_start_code;
ps_dec_op->u4_num_bytes_consumed += bytes_consumed;
- if(buflen >= MAX_NAL_UNIT_SIZE)
- {
-
- ih264d_fill_output_struct_from_context(ps_dec, ps_dec_op);
- H264_DEC_DEBUG_PRINT(
- "\nNal Size exceeded %d, Processing Stopped..\n",
- MAX_NAL_UNIT_SIZE);
- ps_dec->i4_error_code = 1 << IVD_CORRUPTEDDATA;
-
- ps_dec_op->e_pic_type = -1;
- /*signal the decode thread*/
- ih264d_signal_decode_thread(ps_dec);
- /*signal end of frame decode for curren frame*/
-
- if(ps_dec->u4_pic_buf_got == 0)
- {
- if(ps_dec->i4_header_decoded == 3)
- {
- ps_dec->u2_total_mbs_coded =
- ps_dec->ps_cur_sps->u2_max_mb_addr + 1;
- }
-
- /* close deblock thread if it is not closed yet*/
- if(ps_dec->u4_num_cores == 3)
- {
- ih264d_signal_bs_deblk_thread(ps_dec);
- }
- return IV_FAIL;
- }
- else
- {
- ps_dec->u1_pic_decode_done = 1;
- continue;
- }
- }
-
{
UWORD8 u1_firstbyte, u1_nal_ref_idc;
@@ -3020,7 +2005,6 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
api_ret_value = IV_FAIL;
if((ret == IVD_RES_CHANGED)
- || (ret == IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED)
|| (ret == ERROR_UNAVAIL_PICBUF_T)
|| (ret == ERROR_UNAVAIL_MVBUF_T))
{
@@ -3102,7 +2086,6 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
}
if((ret == IVD_RES_CHANGED)
- || (ret == IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED)
|| (ret == ERROR_UNAVAIL_PICBUF_T)
|| (ret == ERROR_UNAVAIL_MVBUF_T))
{
@@ -3290,7 +2273,7 @@ WORD32 ih264d_video_decode(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
* Note in this mode, format conversion does not run paralelly in a thread and adds to the codec cycles
*/
- if((0 == ps_dec->u4_num_reorder_frames_at_init)
+ if((IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode)
&& ps_dec->u1_init_dec_flag)
{
@@ -3363,7 +2346,7 @@ WORD32 ih264d_get_version(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
return (IV_FAIL);
}
- version_string_len = strlen(version_string) + 1;
+ version_string_len = strnlen(version_string, MAXVERSION_STRLEN) + 1;
if(ps_ip->u4_version_buffer_size >= version_string_len) //(WORD32)sizeof(sizeof(version_string)))
{
@@ -3437,72 +2420,20 @@ WORD32 ih264d_set_display_frame(iv_obj_t *dec_hdl,
ivd_set_display_frame_ip_t *dec_disp_ip;
ivd_set_display_frame_op_t *dec_disp_op;
- UWORD32 i, num_mvbank_req;
+ UWORD32 i;
dec_struct_t * ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
dec_disp_ip = (ivd_set_display_frame_ip_t *)pv_api_ip;
dec_disp_op = (ivd_set_display_frame_op_t *)pv_api_op;
dec_disp_op->u4_error_code = 0;
- if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
- {
- UWORD32 level, width_mbs, height_mbs;
-
- level = ps_dec->u4_level_at_init;
- width_mbs = ps_dec->u2_frm_wd_in_mbs;
- height_mbs = ps_dec->u2_frm_ht_in_mbs;
-
- if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1)
- && (ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames != 64))
- {
- num_mvbank_req = ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 2;
- }
- else
- {
- /*if VUI is not present assume maximum possible refrence frames for the level,
- * as max reorder frames*/
- num_mvbank_req = ih264d_get_dpb_size_new(level, width_mbs,
- height_mbs);
- }
-
- num_mvbank_req += ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
- }
- else
- {
- UWORD32 num_bufs_app, num_bufs_level;
- UWORD32 num_ref_frames, num_reorder_frames, luma_width;
- UWORD32 luma_height, level;
-
- num_ref_frames = ps_dec->u4_num_ref_frames_at_init;
- num_reorder_frames = ps_dec->u4_num_reorder_frames_at_init;
- level = ps_dec->u4_level_at_init;
- luma_width = ps_dec->u4_width_at_init;
- luma_height = ps_dec->u4_height_at_init;
-
- num_bufs_app = num_ref_frames + num_reorder_frames + 1;
-
- if(num_bufs_app <= 1)
- num_bufs_app = 2;
-
- num_bufs_level = ih264d_get_dpb_size_new(level, (luma_width >> 4),
- (luma_height >> 4));
- num_bufs_level = num_bufs_level * 2 + 1;
-
- num_mvbank_req = MIN(num_bufs_level, num_bufs_app);
-
- num_mvbank_req += ps_dec->u4_num_extra_disp_bufs_at_init;
-
- }
ps_dec->u4_num_disp_bufs = 0;
if(ps_dec->u4_share_disp_buf)
{
UWORD32 u4_num_bufs = dec_disp_ip->num_disp_bufs;
- if(u4_num_bufs > MAX_DISP_BUFS_NEW)
- u4_num_bufs = MAX_DISP_BUFS_NEW;
u4_num_bufs = MIN(u4_num_bufs, MAX_DISP_BUFS_NEW);
- u4_num_bufs = MIN(u4_num_bufs, num_mvbank_req);
ps_dec->u4_num_disp_bufs = u4_num_bufs;
for(i = 0; i < u4_num_bufs; i++)
@@ -3613,8 +2544,6 @@ WORD32 ih264d_get_status(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
- pic_wd = ps_dec->u4_width_at_init;
- pic_ht = ps_dec->u4_height_at_init;
if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
{
@@ -3635,6 +2564,9 @@ WORD32 ih264d_get_status(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
}
else
{
+ pic_wd = 0;
+ pic_ht = 0;
+
ps_ctl_op->u4_pic_ht = pic_wd;
ps_ctl_op->u4_pic_wd = pic_ht;
@@ -3655,25 +2587,17 @@ WORD32 ih264d_get_status(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
{
if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
{
- UWORD32 level, width_mbs, height_mbs;
-
- level = ps_dec->u4_level_at_init;
- width_mbs = ps_dec->u2_frm_wd_in_mbs;
- height_mbs = ps_dec->u2_frm_ht_in_mbs;
-
- if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1)
- && (ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames
- != 64))
+ if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1) &&
+ (1 == ps_dec->ps_cur_sps->s_vui.u1_bitstream_restriction_flag))
{
ps_ctl_op->u4_num_disp_bufs =
- ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 2;
+ ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 1;
}
else
{
/*if VUI is not present assume maximum possible refrence frames for the level,
* as max reorder frames*/
- ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size_new(
- level, width_mbs, height_mbs);
+ ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size(ps_dec->ps_cur_sps);
}
ps_ctl_op->u4_num_disp_bufs +=
@@ -3681,21 +2605,8 @@ WORD32 ih264d_get_status(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
}
else
{
- ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size_new(
- ps_dec->u4_level_at_init,
- (ps_dec->u4_width_at_init >> 4),
- (ps_dec->u4_height_at_init >> 4));
-
- ps_ctl_op->u4_num_disp_bufs +=
- ps_ctl_op->u4_num_disp_bufs;
-
- ps_ctl_op->u4_num_disp_bufs =
- MIN(ps_ctl_op->u4_num_disp_bufs,
- (ps_dec->u4_num_ref_frames_at_init
- + ps_dec->u4_num_reorder_frames_at_init));
-
+ ps_ctl_op->u4_num_disp_bufs = 32;
}
-
ps_ctl_op->u4_num_disp_bufs = MAX(
ps_ctl_op->u4_num_disp_bufs, 6);
ps_ctl_op->u4_num_disp_bufs = MIN(
@@ -3737,7 +2648,7 @@ WORD32 ih264d_get_status(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
for(i = 0; i < ps_ctl_op->u4_min_num_in_bufs; i++)
{
- ps_ctl_op->u4_min_in_buf_size[i] = MIN_IN_BUF_SIZE;
+ ps_ctl_op->u4_min_in_buf_size[i] = MAX(256000, pic_wd * pic_ht * 3 / 2);
}
/*!*/
@@ -3829,15 +2740,11 @@ WORD32 ih264d_get_buf_info(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
ps_ctl_op->u4_num_disp_bufs = 1;
- for(i = 0; i < ps_ctl_op->u4_min_num_in_bufs; i++)
- {
- ps_ctl_op->u4_min_in_buf_size[i] = MIN_IN_BUF_SIZE;
- }
- pic_wd = ps_dec->u4_width_at_init;
- pic_ht = ps_dec->u4_height_at_init;
+ pic_wd = 0;
+ pic_ht = 0;
- if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
+ if(ps_dec->i4_header_decoded == 3)
{
if(0 == ps_dec->u4_share_disp_buf)
@@ -3853,16 +2760,11 @@ WORD32 ih264d_get_buf_info(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
}
}
- else
- {
- if(1 == ps_dec->u4_share_disp_buf)
- {
- pic_wd += (PAD_LEN_Y_H << 1);
- pic_ht += (PAD_LEN_Y_V << 2);
- }
+ for(i = 0; i < ps_ctl_op->u4_min_num_in_bufs; i++)
+ {
+ ps_ctl_op->u4_min_in_buf_size[i] = MAX(256000, pic_wd * pic_ht * 3 / 2);
}
-
if((WORD32)ps_dec->u4_app_disp_width > pic_wd)
pic_wd = ps_dec->u4_app_disp_width;
@@ -3872,25 +2774,17 @@ WORD32 ih264d_get_buf_info(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
{
if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
{
- UWORD32 level, width_mbs, height_mbs;
-
- level = ps_dec->u4_level_at_init;
- width_mbs = ps_dec->u2_frm_wd_in_mbs;
- height_mbs = ps_dec->u2_frm_ht_in_mbs;
-
- if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1)
- && (ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames
- != 64))
+ if((ps_dec->ps_cur_sps->u1_vui_parameters_present_flag == 1) &&
+ (1 == ps_dec->ps_cur_sps->s_vui.u1_bitstream_restriction_flag))
{
ps_ctl_op->u4_num_disp_bufs =
- ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 2;
+ ps_dec->ps_cur_sps->s_vui.u4_num_reorder_frames + 1;
}
else
{
/*if VUI is not present assume maximum possible refrence frames for the level,
* as max reorder frames*/
- ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size_new(
- level, width_mbs, height_mbs);
+ ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size(ps_dec->ps_cur_sps);
}
ps_ctl_op->u4_num_disp_bufs +=
@@ -3899,18 +2793,7 @@ WORD32 ih264d_get_buf_info(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
}
else
{
- ps_ctl_op->u4_num_disp_bufs = ih264d_get_dpb_size_new(
- ps_dec->u4_level_at_init,
- (ps_dec->u4_width_at_init >> 4),
- (ps_dec->u4_height_at_init >> 4));
-
- ps_ctl_op->u4_num_disp_bufs +=
- ps_ctl_op->u4_num_disp_bufs;
-
- ps_ctl_op->u4_num_disp_bufs =
- MIN(ps_ctl_op->u4_num_disp_bufs,
- (ps_dec->u4_num_ref_frames_at_init
- + ps_dec->u4_num_reorder_frames_at_init));
+ ps_ctl_op->u4_num_disp_bufs = 32;
}
@@ -4031,11 +2914,11 @@ WORD32 ih264d_set_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
}
else
{
- if((ps_ctl_ip->u4_disp_wd >= ps_dec->u2_pic_wd)/* && (ps_ctl_ip->u4_disp_wd <= ps_dec->u4_width_at_init) */)
+ if(ps_ctl_ip->u4_disp_wd >= ps_dec->u2_pic_wd)
{
ps_dec->u4_app_disp_width = ps_ctl_ip->u4_disp_wd;
}
- else if((0 == ps_dec->i4_header_decoded) /*&& (ps_ctl_ip->u4_disp_wd <= ps_dec->u4_width_at_init)*/)
+ else if(0 == ps_dec->i4_header_decoded)
{
ps_dec->u4_app_disp_width = ps_ctl_ip->u4_disp_wd;
}
@@ -4065,7 +2948,15 @@ WORD32 ih264d_set_params(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
ps_dec->i4_decode_header = 1;
ret = IV_FAIL;
}
+ ps_dec->e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
+ if((ps_ctl_ip->e_frm_out_mode != IVD_DECODE_FRAME_OUT) &&
+ (ps_ctl_ip->e_frm_out_mode != IVD_DISPLAY_FRAME_OUT))
+ {
+ ps_ctl_op->u4_error_code = (1 << IVD_UNSUPPORTEDPARAM);
+ ret = IV_FAIL;
+ }
+ ps_dec->e_frm_out_mode = ps_ctl_ip->e_frm_out_mode;
return ret;
}
@@ -4115,7 +3006,40 @@ WORD32 ih264d_set_default_params(iv_obj_t *dec_hdl,
return ret;
}
+/*****************************************************************************/
+/* */
+/* Function Name : ih264d_reset */
+/* */
+/* Description : */
+/* */
+/* Inputs :iv_obj_t decoder handle */
+/* :pv_api_ip pointer to input structure */
+/* :pv_api_op pointer to output structure */
+/* Globals : <Does it use any global variables?> */
+/* Outputs : */
+/* Returns : void */
+/* */
+/* Issues : none */
+/* */
+/* Revision History: */
+/* */
+/* DD MM YYYY Author(s) Changes (Describe the changes made) */
+/* 22 10 2008 100356 Draft */
+/* */
+/*****************************************************************************/
+WORD32 ih264d_delete(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
+{
+ dec_struct_t *ps_dec;
+ ih264d_delete_ip_t *ps_ip = (ih264d_delete_ip_t *)pv_api_ip;
+ ih264d_delete_op_t *ps_op = (ih264d_delete_op_t *)pv_api_op;
+ ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
+ UNUSED(ps_ip);
+ ps_op->s_ivd_delete_op_t.u4_error_code = 0;
+ ih264d_free_dynamic_bufs(ps_dec);
+ ih264d_free_static_bufs(dec_hdl);
+ return IV_SUCCESS;
+}
/*****************************************************************************/
/* */
/* Function Name : ih264d_reset */
@@ -4145,17 +3069,10 @@ WORD32 ih264d_reset(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
ps_ctl_op->u4_error_code = 0;
ps_dec = (dec_struct_t *)(dec_hdl->pv_codec_handle);
-//CHECK
+
if(ps_dec != NULL)
{
-
ih264d_init_decoder(ps_dec);
-
- /*
- memset(ps_dec->disp_bufs, 0, (MAX_DISP_BUFS_NEW) * sizeof(disp_buf_t));
- memset(ps_dec->u4_disp_buf_mapping, 0, (MAX_DISP_BUFS_NEW) * sizeof(UWORD32));
- memset(ps_dec->u4_disp_buf_to_be_freed, 0, (MAX_DISP_BUFS_NEW) * sizeof(UWORD32));
- */
}
else
{
@@ -4400,8 +3317,8 @@ WORD32 ih264d_get_frame_dimensions(iv_obj_t *dec_hdl,
}
else
{
- disp_wd = ps_dec->u4_width_at_init;
- disp_ht = ps_dec->u4_height_at_init;
+ disp_wd = 0;
+ disp_ht = 0;
if(0 == ps_dec->u4_share_disp_buf)
{
@@ -4487,7 +3404,6 @@ WORD32 ih264d_set_num_cores(iv_obj_t *dec_hdl, void *pv_api_ip, void *pv_api_op)
if(ps_dec->u4_num_cores == 1)
{
ps_dec->u1_separate_parse = 0;
- ps_dec->pi4_ctxt_save_register_dec = ps_dec->pi4_ctxt_save_register;
}
else
{
@@ -4579,18 +3495,12 @@ IV_API_CALL_STATUS_T ih264d_api_function(iv_obj_t *dec_hdl,
switch(command)
{
- case IV_CMD_GET_NUM_MEM_REC:
- u4_api_ret = ih264d_get_num_rec((void *)pv_api_ip,
- (void *)pv_api_op);
-
- break;
- case IV_CMD_FILL_NUM_MEM_REC:
-
- u4_api_ret = ih264d_fill_num_mem_rec((void *)pv_api_ip,
- (void *)pv_api_op);
+ case IVD_CMD_CREATE:
+ u4_api_ret = ih264d_create(dec_hdl, (void *)pv_api_ip,
+ (void *)pv_api_op);
break;
- case IV_CMD_INIT:
- u4_api_ret = ih264d_init(dec_hdl, (void *)pv_api_ip,
+ case IVD_CMD_DELETE:
+ u4_api_ret = ih264d_delete(dec_hdl, (void *)pv_api_ip,
(void *)pv_api_op);
break;
@@ -4616,11 +3526,6 @@ IV_API_CALL_STATUS_T ih264d_api_function(iv_obj_t *dec_hdl,
(void *)pv_api_op);
break;
- case IV_CMD_RETRIEVE_MEMREC:
- u4_api_ret = ih264d_clr(dec_hdl, (void *)pv_api_ip,
- (void *)pv_api_op);
- break;
-
case IVD_CMD_VIDEO_CTL:
u4_api_ret = ih264d_ctl(dec_hdl, (void *)pv_api_ip,
(void *)pv_api_op);
diff --git a/decoder/ih264d_defs.h b/decoder/ih264d_defs.h
index fbdbd45..e266206 100644
--- a/decoder/ih264d_defs.h
+++ b/decoder/ih264d_defs.h
@@ -302,42 +302,6 @@ enum
#define MAX_MBS_LEVEL_11 396
#define MAX_MBS_LEVEL_10 99
-
-/*
- | Legend:
- | LVL Level*10
- | MPR Macroblk processing rate
- | MMF Max Mbs/Frm
- | MDK Max DbpSize (in kB)
- | MDB max DbpSize (in bytes)
- | MFS FrmSizeYUV (in bytes)
- | MDP Max DBPics
- | MDC Ceiling DBPics
- | FPS Frame/Second
- |
- | LVL MPR MMF MDK MDB MFS MDP MDC FPS
- | 10 1485 99 148.5 152064 38016 4.00 4.00 15.00
- | 11 3000 396 337.5 345600 152064 2.27 3.00 7.58
- | 12 6000 396 891 912384 152064 6.00 6.00 15.15
- | 13 11880 396 891 912384 152064 6.00 6.00 30.00
- | 20 11880 396 891 912384 152064 6.00 6.00 30.00
- | 21 19800 792 1782 1824768 304128 6.00 6.00 25.00
- | 22 20250 1620 3037.5 3110400 622080 5.00 5.00 12.50
- | 30 40500 1620 3037.5 3110400 622080 5.00 5.00 25.00
- */
-#define MAX_REF_LEVEL_1_0 4
-#define MAX_REF_LEVEL_1_1 3
-#define MAX_REF_LEVEL_1_2 6
-#define MAX_REF_LEVEL_1_3 6
-#define MAX_REF_LEVEL_2_0 6
-#define MAX_REF_LEVEL_2_1 6
-#define MAX_REF_LEVEL_2_2 5
-#define MAX_REF_LEVEL_3_0 5
-#define H264_MAX_REF_PICS 16
-
-#define MIN_LEVEL_SUPPORTED 10
-#define MAX_LEVEL_SUPPORTED 64
-
/** NAL Types */
#define SLICE_NAL 1
#define SLICE_DATA_PARTITION_A_NAL 2
diff --git a/decoder/ih264d_inter_pred.c b/decoder/ih264d_inter_pred.c
index d3e6a4d..01f2e01 100644
--- a/decoder/ih264d_inter_pred.c
+++ b/decoder/ih264d_inter_pred.c
@@ -869,7 +869,7 @@ WORD32 ih264d_form_mb_part_info_mp(pred_info_pkd_t *ps_pred_pkd,
/* Increment the reference buffer Index */
ps_dec->u4_dma_buf_idx += u2_tot_ref_scratch_size;
- if(ps_dec->u4_dma_buf_idx > ps_dec->u4_ref_buf_size)
+ if(ps_dec->u4_dma_buf_idx > MAX_REF_BUF_SIZE)
return ERROR_NUM_MV;
return OK;
diff --git a/decoder/ih264d_mb_utils.c b/decoder/ih264d_mb_utils.c
index c38b266..ded2756 100644
--- a/decoder/ih264d_mb_utils.c
+++ b/decoder/ih264d_mb_utils.c
@@ -1461,11 +1461,7 @@ void ih264d_transfer_mb_group_data(dec_struct_t * ps_dec,
/* Increment deblock parameters pointer in external memory */
- if(ps_dec->u1_separate_parse == 1)
- {
- ps_dec->ps_deblk_mbn_dec_thrd += u1_num_mbs;
- }
- else
+ if(ps_dec->u1_separate_parse == 0)
{
ps_dec->ps_deblk_mbn += u1_num_mbs;
}
diff --git a/decoder/ih264d_mem_request.h b/decoder/ih264d_mem_request.h
index 3c60c72..88e334d 100644
--- a/decoder/ih264d_mem_request.h
+++ b/decoder/ih264d_mem_request.h
@@ -76,7 +76,7 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
WORD32 ih264d_create_mv_bank(void * pv_codec_handle,
UWORD32 u4_wd,
UWORD32 u4_ht);
-WORD16 ih264d_get_memory_dec_params(dec_struct_t * ps_dec);
+WORD16 ih264d_allocate_dynamic_bufs(dec_struct_t * ps_dec);
#endif /* _IH264D_MEM_REQUEST_H_ */
diff --git a/decoder/ih264d_parse_bslice.c b/decoder/ih264d_parse_bslice.c
index 6707039..0758b77 100644
--- a/decoder/ih264d_parse_bslice.c
+++ b/decoder/ih264d_parse_bslice.c
@@ -907,7 +907,7 @@ WORD32 ih264d_mv_pred_ref_tfr_nby2_bmb(dec_struct_t * ps_dec,
ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
/* Restore the slice scratch MbX and MbY context */
ps_cur_mb_info = ps_dec->ps_nmb_info + i;
- ps_dec->u2_wait_id = i;
+
u1_field = ps_cur_mb_info->u1_mb_field_decodingflag;
@@ -1536,9 +1536,18 @@ WORD32 ih264d_parse_bslice(dec_struct_t * ps_dec, UWORD16 u2_first_mb_in_slice)
{
WORD32 num_entries;
WORD32 size;
+ num_entries = MAX_FRAMES;
+ if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
+ (0 == ps_dec->i4_display_delay))
+ {
+ num_entries = 1;
+ }
- num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
- num_entries = 2 * ((2 * num_entries) + 1);
+ num_entries = ((2 * num_entries) + 1);
+ if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
+ {
+ num_entries *= 2;
+ }
size = num_entries * sizeof(void *);
size += PAD_MAP_IDX_POC * sizeof(void *);
diff --git a/decoder/ih264d_parse_headers.c b/decoder/ih264d_parse_headers.c
index 21ebfa8..e97f457 100644
--- a/decoder/ih264d_parse_headers.c
+++ b/decoder/ih264d_parse_headers.c
@@ -567,6 +567,10 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
ps_seq = ps_dec->pv_scratch_sps_pps;
*ps_seq = ps_dec->ps_sps[u1_seq_parameter_set_id];
+
+ if(NULL == ps_dec->ps_cur_sps)
+ ps_dec->ps_cur_sps = ps_seq;
+
ps_seq->u1_profile_idc = u1_profile_idc;
ps_seq->u1_level_idc = u1_level_idc;
ps_seq->u1_seq_parameter_set_id = u1_seq_parameter_set_id;
@@ -734,12 +738,6 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
return ERROR_NUM_REF;
}
ps_seq->u1_num_ref_frames = u4_temp;
-
- if(ps_seq->u1_num_ref_frames > ps_dec->u4_num_ref_frames_at_init)
- {
- return IH264D_UNSUPPORTED_NUM_REF_FRAMES;
- }
-
COPYTHECONTEXT("SPS: num_ref_frames",ps_seq->u1_num_ref_frames);
ps_seq->u1_gaps_in_frame_num_value_allowed_flag = ih264d_get_bit_h264(
@@ -789,49 +787,6 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
else
ps_seq->u1_mb_aff_flag = 0;
- {
- WORD32 frame_height_in_mbs = (2 - ps_seq->u1_frame_mbs_only_flag)
- * (pic_height_in_map_units_minus1 + 1);
- UWORD32 wdth = (ps_seq->u2_frm_wd_in_mbs) << 4;
- UWORD32 hght = (frame_height_in_mbs) << 4;
-
- if((u2_pic_wd < H264_MIN_FRAME_WIDTH)
- || (u2_pic_wd > ps_dec->u4_width_at_init))
- {
- ivd_video_decode_op_t *ps_out;
- /*set width and height in decode output structure*/
- ps_out = (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
- ps_out->u4_pic_wd = u2_pic_wd;
- ps_out->u4_pic_ht = u2_pic_ht;
-
- return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
- }
-
- if((u2_pic_ht < H264_MIN_FRAME_HEIGHT)
- || (((0 != ps_seq->u1_frame_mbs_only_flag)
- && (u2_pic_ht * u2_pic_wd
- > ps_dec->u4_height_at_init
- * ps_dec->u4_width_at_init))
- || ((0 == ps_seq->u1_frame_mbs_only_flag)
- && (ALIGN32(u2_pic_ht)
- * u2_pic_wd
- > ALIGN32(ps_dec->u4_height_at_init)
- * ps_dec->u4_width_at_init))))
- {
- ivd_video_decode_op_t *ps_out;
- /*set width and height in decode output structure*/
- ps_out = (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
- ps_out->u4_pic_wd = u2_pic_wd;
- ps_out->u4_pic_ht = u2_pic_ht;
-
- return IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
- }
-
-
-
-
- }
-
ps_seq->u1_direct_8x8_inference_flag = ih264d_get_bit_h264(ps_bitstrm);
COPYTHECONTEXT("SPS: direct_8x8_inference_flag",
@@ -950,44 +905,6 @@ WORD32 ih264d_parse_sps(dec_struct_t *ps_dec, dec_bit_stream_t *ps_bitstrm)
return ret;
}
- if(ps_dec->u4_level_at_init < u1_level_idc)
- {
- UWORD32 u4_num_pic_bufs_reqd, u4_num_reorder_frames,
- u4_num_mv_bufs_reqd;
- UWORD32 u4_num_pic_bufs_memory, u4_num_mv_bufs_memory;
- UWORD32 u4_num_ref_frames;
-
- u4_num_ref_frames = ps_seq->u1_num_ref_frames;
- if(1 == ps_seq->u1_vui_parameters_present_flag)
- {
- u4_num_reorder_frames = ps_seq->s_vui.u4_num_reorder_frames;
- }
- else
- {
- u4_num_reorder_frames = ps_dec->u4_num_reorder_frames_at_init;
- }
-
- u4_num_pic_bufs_reqd = u4_num_ref_frames + u4_num_reorder_frames + 1;
-
- u4_num_pic_bufs_memory = ih264d_get_numbuf_dpb_bank(ps_dec, u2_frm_wd_y,
- u2_frm_ht_y);
-
- u4_num_mv_bufs_reqd = u4_num_ref_frames + 1;
-
- if(u4_num_mv_bufs_reqd < 2)
- u4_num_mv_bufs_reqd = 2;
-
- u4_num_mv_bufs_memory = ih264d_get_numbuf_mv_bank(ps_dec, u2_pic_wd,
- u2_pic_ht);
-
- if((u4_num_pic_bufs_reqd > u4_num_pic_bufs_memory)
- || (u4_num_mv_bufs_reqd > u4_num_mv_bufs_memory))
- {
- return IH264D_UNSUPPORTED_LEVEL;
- }
-
- }
-
ps_dec->u2_pic_wd = u2_pic_wd;
ps_dec->u2_pic_ht = u2_pic_ht;
diff --git a/decoder/ih264d_parse_pslice.c b/decoder/ih264d_parse_pslice.c
index d56f44e..f300e2b 100644
--- a/decoder/ih264d_parse_pslice.c
+++ b/decoder/ih264d_parse_pslice.c
@@ -1655,9 +1655,17 @@ WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec,
WORD32 size;
UWORD8 *pu1_buf;
- num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
- num_entries = 2 * ((2 * num_entries) + 1);
-
+ num_entries = MAX_FRAMES;
+ if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
+ (0 == ps_dec->i4_display_delay))
+ {
+ num_entries = 1;
+ }
+ num_entries = ((2 * num_entries) + 1);
+ if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
+ {
+ num_entries *= 2;
+ }
size = num_entries * sizeof(void *);
size += PAD_MAP_IDX_POC * sizeof(void *);
@@ -2021,8 +2029,17 @@ WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice)
WORD32 num_entries;
WORD32 size;
- num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
- num_entries = 2 * ((2 * num_entries) + 1);
+ num_entries = MAX_FRAMES;
+ if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
+ (0 == ps_dec->i4_display_delay))
+ {
+ num_entries = 1;
+ }
+ num_entries = ((2 * num_entries) + 1);
+ if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
+ {
+ num_entries *= 2;
+ }
size = num_entries * sizeof(void *);
size += PAD_MAP_IDX_POC * sizeof(void *);
diff --git a/decoder/ih264d_parse_slice.c b/decoder/ih264d_parse_slice.c
index eef9db5..fa85aa1 100644
--- a/decoder/ih264d_parse_slice.c
+++ b/decoder/ih264d_parse_slice.c
@@ -344,15 +344,12 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info;
if(ps_dec->u1_separate_parse)
{
- UWORD16 pic_wd = ps_dec->u4_width_at_init;
- UWORD16 pic_ht = ps_dec->u4_height_at_init;
+ UWORD16 pic_wd;
+ UWORD16 pic_ht;
UWORD32 num_mbs;
- if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
- {
- pic_wd = ps_dec->u2_pic_wd;
- pic_ht = ps_dec->u2_pic_ht;
- }
+ pic_wd = ps_dec->u2_pic_wd;
+ pic_ht = ps_dec->u2_pic_ht;
num_mbs = (pic_wd * pic_ht) >> 8;
if(ps_dec->pu1_dec_mb_map)
@@ -546,18 +543,13 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
<< 2);
ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0];
- ps_dec->ps_cur_mb_row++; //Increment by 1 ,so that left mb will always be valid
- ps_dec->ps_top_mb_row =
- ps_dec->ps_nbr_mb_row
- + ((ps_dec->u2_frm_wd_in_mbs + 1)
- << (1
- - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
- ps_dec->ps_top_mb_row++; //Increment by 1 ,so that left mb will always be valid
-
- ps_dec->pu1_y = ps_dec->pu1_y_scratch[0];
- ps_dec->pu1_u = ps_dec->pu1_u_scratch[0];
- ps_dec->pu1_v = ps_dec->pu1_v_scratch[0];
- ps_dec->u1_yuv_scratch_idx = 0;
+ //Increment by 2 ,so that left mb (mbaff decrements by 2) will always be valid
+ ps_dec->ps_cur_mb_row += 2;
+ ps_dec->ps_top_mb_row = ps_dec->ps_nbr_mb_row;
+ ps_dec->ps_top_mb_row += ((ps_dec->u2_frm_wd_in_mbs + 2) << (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
+ //Increment by 2 ,so that left mb (mbaff decrements by 2) will always be valid
+ ps_dec->ps_top_mb_row += 2;
+
/* CHANGED CODE */
ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
@@ -566,10 +558,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
ps_dec->u1_mb_idx = 0;
/* CHANGED CODE */
ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
- ps_dec->pu1_yleft = 0;
- ps_dec->pu1_uleft = 0;
- ps_dec->pu1_vleft = 0;
- ps_dec->u1_not_wait_rec = 2;
ps_dec->u2_total_mbs_coded = 0;
ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE);
ps_dec->u4_pred_info_idx = 0;
@@ -610,8 +598,6 @@ WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
+ ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE;
ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
- ps_dec->ps_deblk_mbn_curr = ps_dec->ps_deblk_mbn;
- ps_dec->ps_deblk_mbn_prev = ps_dec->ps_deblk_mbn + ps_dec->u1_recon_mb_grp;
/* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */
{
if(ps_cur_slice->u1_mbaff_frame_flag)
@@ -770,7 +756,7 @@ WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec)
ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
ih264d_release_display_bufs(ps_dec);
}
- if(ps_dec->u4_num_reorder_frames_at_init != 0)
+ if(IVD_DECODE_FRAME_OUT != ps_dec->e_frm_out_mode)
{
ret = ih264d_assign_display_seq(ps_dec);
if(ret != OK)
@@ -854,7 +840,7 @@ WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec)
|| ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
== ps_dec->u1_top_bottom_decoded))
{
- if(ps_dec->u4_num_reorder_frames_at_init == 0)
+ if(IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode)
{
ret = ih264d_assign_display_seq(ps_dec);
if(ret != OK)
@@ -1854,8 +1840,17 @@ WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
WORD32 size;
UWORD8 *pu1_buf;
- num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
- num_entries = 2 * ((2 * num_entries) + 1);
+ num_entries = MAX_FRAMES;
+ if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
+ (0 == ps_dec->i4_display_delay))
+ {
+ num_entries = 1;
+ }
+ num_entries = ((2 * num_entries) + 1);
+ if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
+ {
+ num_entries *= 2;
+ }
size = num_entries * sizeof(void *);
size += PAD_MAP_IDX_POC * sizeof(void *);
diff --git a/decoder/ih264d_process_pslice.c b/decoder/ih264d_process_pslice.c
index 2c7446e..95ac557 100644
--- a/decoder/ih264d_process_pslice.c
+++ b/decoder/ih264d_process_pslice.c
@@ -97,7 +97,6 @@ WORD32 ih264d_mv_pred_ref_tfr_nby2_pmb(dec_struct_t * ps_dec,
*ps_mv_pred = ps_dec->s_default_mv_pred;
ps_dec->i4_submb_ofst += SUB_BLK_SIZE;
- ps_dec->u2_wait_id = i;
/* Restore the slice scratch MbX and MbY context */
ps_cur_mb_info = ps_dec->ps_nmb_info + i;
diff --git a/decoder/ih264d_structs.h b/decoder/ih264d_structs.h
index 062747b..4260393 100644
--- a/decoder/ih264d_structs.h
+++ b/decoder/ih264d_structs.h
@@ -581,12 +581,6 @@ typedef struct
typedef struct
{
- UWORD8 *pu1_mb_y; /* pointer to N-Mb pad buffer Y (Horz) */
- UWORD8 *pu1_mb_u; /* pointer to N-Mb pad buffer U (Horz) */
- UWORD8 *pu1_mb_v; /* pointer to N-Mb pad buffer V (Horz) */
- UWORD8 *pu1_row_y; /* pointer to row pad buffer Y (Vert) */
- UWORD8 *pu1_row_u; /* pointer to row pad buffer U (Vert) */
- UWORD8 *pu1_row_v; /* pointer to row pad buffer V (Vert) */
UWORD8 u1_vert_pad_top; /* flip-flop u4_flag remembering pad area (Vert) */
UWORD8 u1_vert_pad_bot; /* flip-flop u4_flag remembering pad area (Vert) */
UWORD8 u1_horz_pad; /* flip-flop u4_flag remembering pad area (Vert) */
@@ -594,13 +588,6 @@ typedef struct
UWORD8 u1_pad_len_cr_v; /* vertical pad amount for chroma */
} pad_mgr_t;
-typedef struct code_overlay_ctxt
-{
- UWORD8 u1_pb_slice_type;
- UWORD8 u1_entropy_coding_type;
- UWORD8 u1_mbaff_frame_flag;
- UWORD8 u1_b_direct_flag;
-} code_overlay_ctxt_t;
#define ACCEPT_ALL_PICS (0x00)
#define REJECT_CUR_PIC (0x01)
@@ -875,16 +862,10 @@ typedef struct _DecStruct
UWORD8 *pu1_left_yuv_dc_csbp;
- /* c64x_map.inc takes care of only this part
- If you change/add any members above this,
- modify c64x_map.inc accordingly */
-
- void **pp_ext_g_table_ptr;
deblkmb_neighbour_t deblk_left_mb[2];
deblkmb_neighbour_t *ps_deblk_top_mb;
neighbouradd_t (*ps_left_mvpred_addr)[2]; /* Left MvPred Address Ping Pong*/
-// neighbouradd_t *ps_topMvPredAdd;
/***************************************************************************/
/* Ref_idx contexts are stored in the following way */
@@ -964,7 +945,7 @@ typedef struct _DecStruct
pic_buffer_t **ps_ref_pic_buf_lx[2];
/* refIdx to POC mapping */
void **ppv_map_ref_idx_to_poc;
- UWORD32 *pu4_defI_wts_ofsts;
+ void **ppv_map_ref_idx_to_poc_base;
UWORD32 *pu4_wts_ofsts_mat;
UWORD32 *pu4_wt_ofsts;
UWORD32 *pu4_mbaff_wt_mat;
@@ -1011,21 +992,8 @@ typedef struct _DecStruct
UWORD32 u4_intra_pred_line_ofst;
- /* Scratch ping reconstruction pointers for Y U V */
- UWORD8 *pu1_y_scratch[2];
- UWORD8 *pu1_u_scratch[2];
- UWORD8 *pu1_v_scratch[2];
- UWORD8 u1_yuv_scratch_idx;
- UWORD8 u1_not_wait_rec;
UWORD8 u1_res_changed;
- UWORD8 *pu1_yleft; /** Left Y pointer, used for intra-pred */
- UWORD8 *pu1_uleft; /** Left U pointer, used for intra-pred */
- UWORD8 *pu1_vleft; /** Left V pointer, used for intra-pred */
- UWORD8 u1_y_topleft[2]; /** Left Y pointer, used for intra-pred */
- UWORD8 u1_u_topleft[2]; /** Left U pointer, used for intra-pred */
- UWORD8 u1_v_topleft[2]; /** Left V pointer, used for intra-pred */
-
mv_pred_t *ps_mv_cur; /** pointer to current motion vector bank */
mv_pred_t *ps_mv_top; /** pointer to top motion vector bank */
mv_pred_t *ps_mv_top_right2;/** Pointer to top right motion vector bank */
@@ -1034,9 +1002,6 @@ typedef struct _DecStruct
UWORD8 u1_mv_top_p;
deblk_mb_t *ps_deblk_mbn;
- deblk_mb_t *ps_deblk_mbn_dec_thrd;/*pointer used by parsing when spearaet_parse is 1*/
- deblk_mb_t *ps_deblk_mbn_curr;
- deblk_mb_t *ps_deblk_mbn_prev;
UWORD8 *pu1_temp_mc_buffer;
@@ -1053,13 +1018,6 @@ typedef struct _DecStruct
/* Variables used for gaps in frame number */
UWORD16 u2_prev_ref_frame_num;
- UWORD8 u1_vert_up_scale_flag;
- iv_mem_rec_t *ps_mem_tab;
-
- UWORD16 u2_wait_id;
-
- void *pi4_ctxt_save_register;
- void *pi4_ctxt_save_register_dec;
UWORD8 u1_mb_idx;
struct pic_buffer_t *ps_col_pic;
@@ -1099,39 +1057,20 @@ typedef struct _DecStruct
prev_seq_params_t s_prev_seq_params;
UWORD8 u1_cur_mb_fld_dec_flag; /* current Mb fld or Frm */
- code_overlay_ctxt_t s_code_overlay_ctxt;
- UWORD8 u1_code_overlay;
-
-// WORD8 *pi1_cur_predmodes;
WORD8 pi1_left_pred_mode[8];
UWORD8 u1_topleft_mb_fld;
UWORD8 u1_topleft_mbtype;
UWORD8 u1_topleft_mb_fld_bot;
UWORD8 u1_topleft_mbtype_bot;
- UWORD8 u1_deblk_mb_grp;
WORD16 i2_prev_slice_mbx;
WORD16 i2_prev_slice_mby;
UWORD16 u2_top_left_mask;
UWORD16 u2_top_right_mask;
dec_err_status_t * ps_dec_err_status;
- UWORD32 *pu4_sos_signal;
UWORD8 u1_mb_idx_mv;
UWORD16 u2_mv_2mb[2];
- UWORD32 u4_ref_buf_size;
- UWORD32 u4_packet_cnt;
- /* to remember the i4_status & input parameters from the sample app */
- void *pv_dec_status; // itt_dec_status_t void pointer */
- void *pv_dec_params; // itt_dec_prms_t void pointer
- void *pv_app_ctxt;
UWORD32 u4_skip_frm_mask;
- void *pv_fmt_con_ctxt;
- /* for the parallel format conversion */
- UWORD8 *pu1_frmt_conv_y[3];
- UWORD8 *pu1_frmt_conv_u[3];
- UWORD8 *pu1_frmt_conv_v[3];
- UWORD8 *pu1_deblk_scr;
- UWORD32 u4_deblk_scr_sz;
/* variable for finding the no.of mbs decoded in the current picture */
UWORD16 u2_total_mbs_coded;
@@ -1149,11 +1088,6 @@ typedef struct _DecStruct
/* To keep track of whether the last picture was decoded or not */
/* in case of skip mode set by the application */
UWORD8 u1_last_pic_not_decoded;
- UWORD32 *pu4_return_remaining_bufs;
-
- /* Used for disabling deblocking of non-reference pictures */
- WORD32 i4_set_low_complexity_mode;
- WORD32 i4_disable_deblock;
WORD32 e_dec_status;
UWORD32 u4_num_fld_in_frm;
@@ -1261,11 +1195,7 @@ typedef struct _DecStruct
UWORD8 u1_chroma_format;
UWORD8 u1_pic_decode_done;
UWORD8 u1_slice_header_done;
- UWORD32 u4_level_at_init;
- UWORD32 u4_width_at_init;
- UWORD32 u4_height_at_init;
WORD32 init_done;
- WORD32 process_called;
/******************************************/
/* For the high profile related variables */
@@ -1282,12 +1212,14 @@ typedef struct _DecStruct
UWORD8 u1_top_bottom_decoded;
UWORD8 u1_dangling_field;
- /*
- * For Low Memory case
- */
- UWORD32 u4_num_ref_frames_at_init;
- UWORD32 u4_num_reorder_frames_at_init;
- UWORD32 u4_num_extra_disp_bufs_at_init;
+ IVD_DISPLAY_FRAME_OUT_MODE_T e_frm_out_mode;
+
+ UWORD8 *pu1_bits_buf_static;
+ UWORD8 *pu1_bits_buf_dynamic;
+
+ UWORD32 u4_static_bits_buf_size;
+ UWORD32 u4_dynamic_bits_buf_size;
+
UWORD32 u4_num_disp_bufs_requested;
WORD32 i4_display_delay;
UWORD32 u4_slice_start_code_found;
@@ -1329,7 +1261,6 @@ typedef struct _DecStruct
UWORD32 u4_fmt_conv_cur_row;
ivd_out_bufdesc_t *ps_out_buffer;
ivd_get_display_frame_op_t s_disp_op;
- UWORD32 u4_stop_threads;
UWORD32 u4_output_present;
volatile UWORD16 cur_dec_mb_num;
@@ -1410,6 +1341,18 @@ typedef struct _DecStruct
UWORD8 au1_pic_buf_ref_flag[MAX_DISP_BUFS_NEW];
+ struct pic_buffer_t *ps_pic_buf_base;
+
+ UWORD8 *pu1_ref_buff_base;
+ col_mv_buf_t *ps_col_mv_base;
+ void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
+ void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
+ void *pv_mem_ctxt;
+
+ UWORD8 *pu1_pic_buf_base;
+ UWORD8 *pu1_mv_bank_buf_base;
+ UWORD8 *pu1_init_dpb_base;
+
ih264_default_weighted_pred_ft *pf_default_weighted_pred_luma;
ih264_default_weighted_pred_ft *pf_default_weighted_pred_chroma;
diff --git a/decoder/ih264d_thread_parse_decode.c b/decoder/ih264d_thread_parse_decode.c
index f3da270..131c808 100644
--- a/decoder/ih264d_thread_parse_decode.c
+++ b/decoder/ih264d_thread_parse_decode.c
@@ -534,13 +534,7 @@ WORD32 ih264d_decode_slice_thread(dec_struct_t *ps_dec)
ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
- /**********Number of Mbs in Slice**********/
-
- ps_dec->ps_deblk_mbn_dec_thrd = ps_dec->ps_deblk_pic
- + (u2_first_mb_in_slice << u1_mbaff);
-
/* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
-
{
ps_dec->p_mc_dec_thread = ih264d_motion_compensate_bp;
ps_dec->p_form_mb_part_info_thread = ih264d_form_mb_part_info_bp;
diff --git a/decoder/ih264d_utils.c b/decoder/ih264d_utils.c
index a4896c0..d388421 100644
--- a/decoder/ih264d_utils.c
+++ b/decoder/ih264d_utils.c
@@ -550,16 +550,6 @@ WORD32 ih264d_end_of_pic_processing(dec_struct_t *ps_dec)
u1_pic_type = TOP_REF | BOT_REF;
ps_dec->ps_cur_pic->u1_pic_type |= u1_pic_type;
-#if ROW_ACCESSES_STAT
- {
- H264_DEC_DEBUG_PRINT("Row_Accesses_BeforeBB = %6d, Row_Accesses_AfterBB = %6d \n\n",
- gui_Row_Accesses_BeforeBB, gui_Row_Accesses_AfterBB);
- gui_Row_Accesses_BeforeBBTotal += gui_Row_Accesses_BeforeBB;
- gui_Row_Accesses_AfterBBTotal += gui_Row_Accesses_AfterBB;
- gui_Row_Accesses_AfterBB = 0;
- gui_Row_Accesses_BeforeBB = 0;
- }
-#endif
if(ps_cur_slice->u1_field_pic_flag)
{
@@ -591,13 +581,12 @@ WORD32 ih264d_end_of_pic_processing(dec_struct_t *ps_dec)
/* 28 04 2005 NS Draft */
/* */
/*****************************************************************************/
-WORD32 ih264d_get_dpb_size(dec_seq_params_t *ps_seq, dec_struct_t *ps_dec)
+WORD32 ih264d_get_dpb_size(dec_seq_params_t *ps_seq)
{
WORD32 i4_size;
UWORD8 u1_level_idc;
- u1_level_idc = ps_seq->u1_level_idc; //harcode for the time being
- u1_level_idc = MIN(u1_level_idc, ps_dec->u4_level_at_init);
+ u1_level_idc = ps_seq->u1_level_idc;
switch(u1_level_idc)
{
@@ -661,121 +650,6 @@ WORD32 ih264d_get_dpb_size(dec_seq_params_t *ps_seq, dec_struct_t *ps_dec)
return (i4_size);
}
-WORD32 ih264d_get_dpb_size_new(UWORD32 u4_level_idc,
- UWORD32 u2_frm_wd_in_mbs,
- UWORD32 u2_frm_ht_in_mbs)
-{
-
- UWORD32 i4_size = 0;
-
- switch(u4_level_idc)
- {
- case 10:
- i4_size = 152064;
- break;
- case 11:
- i4_size = 345600;
- break;
- case 12:
- i4_size = 912384;
- break;
- case 13:
- i4_size = 912384;
- break;
- case 20:
- i4_size = 912384;
- break;
- case 21:
- i4_size = 1824768;
- break;
- case 22:
- i4_size = 3110400;
- break;
- case 30:
- i4_size = 3110400;
- break;
- case 31:
- i4_size = 6912000;
- break;
- case 32:
- i4_size = 7864320;
- break;
- case 40:
- i4_size = 12582912;
- break;
- case 41:
- i4_size = 12582912;
- break;
- case 42:
- i4_size = 12582912;
- break;
- case 50:
- i4_size = 42393600;
- break;
- case 51:
- i4_size = 70778880;
- break;
- case 52:
- i4_size = 70778880;
- break;
- default:
- {
- i4_size = 70778880;
- }
- break;
- }
-
- i4_size = i4_size / (u2_frm_wd_in_mbs * (u2_frm_ht_in_mbs));
- i4_size = (i4_size + 383) / 384;
- i4_size = MIN(i4_size, 16);
- i4_size = MAX(i4_size, 1);
- return (i4_size);
-}
-
-/*****************************************************************************/
-/* */
-/* Function Name : ih264d_max_possible_ref_pics */
-/* */
-/* Description : This function returns the maximum number of */
-/* reference buffers corresponding to the current Level */
-/* in accordance to "Table A-1 Level limits" in standard. */
-/* Please refer to Annex A - Profiles and Levels */
-/* Maximum Number of reference buffers are derived from */
-/* the dbpsize and max_mbs_in frame given in the table */
-/* Inputs : level number */
-/* */
-/* Revision History: */
-/* */
-/* DD MM YYYY Author(s) Changes (Describe the changes made) */
-/* 19 05 2005 SWRN Draft */
-/* */
-/*****************************************************************************/
-
-UWORD8 ih264d_max_possible_ref_pics(UWORD8 u1_level)
-{
- switch(u1_level)
- {
- case H264_LEVEL_1_0:
- return (MAX_REF_LEVEL_1_0);
- case H264_LEVEL_1_1:
- return (MAX_REF_LEVEL_1_1);
- case H264_LEVEL_1_2:
- return (MAX_REF_LEVEL_1_2);
- case H264_LEVEL_1_3:
- return (MAX_REF_LEVEL_1_3);
- case H264_LEVEL_2_0:
- return (MAX_REF_LEVEL_2_0);
- case H264_LEVEL_2_1:
- return (MAX_REF_LEVEL_2_1);
- case H264_LEVEL_2_2:
- return (MAX_REF_LEVEL_2_2);
- case H264_LEVEL_3_0:
- return (MAX_REF_LEVEL_3_0);
- }
-
- return (H264_MAX_REF_PICS);
-}
-
/***************************************************************************/
/* If change in Level or the required PicBuffers i4_size is more than the */
/* current one FREE the current PicBuffers and allocate affresh */
@@ -829,92 +703,9 @@ WORD32 ih264d_init_dec_mb_grp(dec_struct_t *ps_dec)
return OK;
}
-/*!
- **************************************************************************
- * \if Function name : ih264d_get_numbuf_dpb_bank \endif
- *
- * \brief
- * Initializes the picture.
- *
- * \return
- * 0 on Success and Error code otherwise
- *
- * \note
- * This function is called when first slice of the
- * NON -IDR picture is encountered.
- **************************************************************************
- */
-WORD32 ih264d_get_numbuf_dpb_bank(dec_struct_t *ps_dec, UWORD32 u4_frame_wd, UWORD32 u4_frame_ht)
-{
- WORD32 i4_DPB_size;
- WORD32 i4_pic_size;
- WORD32 i4_num_buf_alloc;
- UWORD32 Ysize;
- UWORD32 UVsize;
- UWORD32 one_frm_size;
-
-
- i4_DPB_size = ps_dec->ps_mem_tab[MEM_REC_REF_PIC].u4_mem_size;
-
- Ysize = u4_frame_wd * u4_frame_ht;
-
- UVsize = Ysize >> 2;
-
- {
- if(ps_dec->u4_share_disp_buf == 1)
- {
- /* In case of buffers getting shared between application and library
- there is no need of reference memtabs. Instead of setting the i4_size
- to zero, it is reduced to a small i4_size to ensure that changes
- in the code are minimal */
- if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
- || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU)
- || (ps_dec->u1_chroma_format == IV_YUV_420P))
- {
- Ysize = 64;
- }
- if(ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
- {
- UVsize = 64;
- }
-
- }
- }
-
- one_frm_size = (((Ysize + 127) >> 7) << 7)
- + ((((UVsize << 1) + 127) >> 7) << 7);
- i4_num_buf_alloc = i4_DPB_size / (one_frm_size);
-
- return i4_num_buf_alloc;
-}
/*!
**************************************************************************
- * \if Function name : ih264d_get_numbuf_mv_bank \endif
- *
- * \brief
- * Computes number of MVbank buffers that can be allocated.
- *
- * \return
- * Number of MV bank buffers that can be allocated.
- *
- * \note
- **************************************************************************
- */
-UWORD32 ih264d_get_numbuf_mv_bank(dec_struct_t *ps_dec, UWORD32 width,
- UWORD32 height)
-{
- UWORD32 u4_mv_bank_size,one_frame_size;
- UWORD32 u4_num_buf_alloc;
-
- u4_mv_bank_size = ps_dec->ps_mem_tab[MEM_REC_MVBANK].u4_mem_size;
- one_frame_size = sizeof(mv_pred_t)
- * ((width * (height + PAD_MV_BANK_ROW)) >> 4);
- u4_num_buf_alloc = u4_mv_bank_size / one_frame_size;
- return u4_num_buf_alloc;
-}
-/*!
- **************************************************************************
* \if Function name : ih264d_init_pic \endif
*
* \brief
@@ -972,59 +763,44 @@ WORD32 ih264d_init_pic(dec_struct_t *ps_dec,
if(!ps_dec->u1_init_dec_flag
|| ih264d_is_sps_changed(ps_prev_seq_params, ps_seq))
{
+ ps_dec->u1_max_dec_frame_buffering = ih264d_get_dpb_size(ps_seq);
+ ps_dec->i4_display_delay = ps_dec->u1_max_dec_frame_buffering;
+ if((1 == ps_seq->u1_vui_parameters_present_flag) &&
+ (1 == ps_seq->s_vui.u1_bitstream_restriction_flag))
+ {
+ if(ps_seq->u1_frame_mbs_only_flag == 1)
+ ps_dec->i4_display_delay = ps_seq->s_vui.u4_num_reorder_frames + 1;
+ else
+ ps_dec->i4_display_delay = ps_seq->s_vui.u4_num_reorder_frames * 2 + 2;
+ }
- ivd_video_decode_ip_t *ps_dec_in = ps_dec->pv_dec_in;
- ivd_video_decode_op_t *ps_dec_out = ps_dec->pv_dec_out;
+ if(IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode)
+ ps_dec->i4_display_delay = 0;
if(ps_dec->u4_share_disp_buf == 0)
{
- i4_pic_bufs = ih264d_get_numbuf_dpb_bank(ps_dec, ps_dec->u2_frm_wd_y,
- ps_dec->u2_frm_ht_y);
+ if(ps_seq->u1_frame_mbs_only_flag == 1)
+ ps_dec->u1_pic_bufs = ps_dec->i4_display_delay + ps_seq->u1_num_ref_frames + 1;
+ else
+ ps_dec->u1_pic_bufs = ps_dec->i4_display_delay + ps_seq->u1_num_ref_frames * 2 + 2;
}
else
{
- i4_pic_bufs = (WORD32)ps_dec->u4_num_disp_bufs;
+ ps_dec->u1_pic_bufs = (WORD32)ps_dec->u4_num_disp_bufs;
}
- ps_dec->u1_pic_bufs = CLIP_U8(i4_pic_bufs);
+ /* Ensure at least two buffers are allocated */
+ ps_dec->u1_pic_bufs = MAX(ps_dec->u1_pic_bufs, 2);
if(ps_dec->u4_share_disp_buf == 0)
ps_dec->u1_pic_bufs = MIN(ps_dec->u1_pic_bufs,
(H264_MAX_REF_PICS * 2));
- ps_dec->u1_max_dec_frame_buffering = ih264d_get_dpb_size(ps_seq,
- ps_dec);
-
- ps_dec->u1_max_dec_frame_buffering = MIN(
- ps_dec->u1_max_dec_frame_buffering,
- ps_dec->u4_num_ref_frames_at_init);
ps_dec->u1_max_dec_frame_buffering = MIN(
ps_dec->u1_max_dec_frame_buffering,
ps_dec->u1_pic_bufs);
-// ps_dec->u1_pic_bufs = ps_dec->i1_max_dec_frame_buffering;
-
- /* Fix is for handling one pic in and one pic out incase of */
- /* MMCO 5 or IDR */
-
- ps_dec->i4_display_delay = MIN(ps_dec->u4_num_reorder_frames_at_init,
- ps_dec->u1_max_dec_frame_buffering);
-
- if(1 == ps_seq->u1_vui_parameters_present_flag)
- {
- if(ps_seq->u1_frame_mbs_only_flag == 1)
- ps_dec->i4_display_delay = MIN(
- (UWORD32 )ps_dec->i4_display_delay,
- ((UWORD32 )ps_seq->s_vui.u4_num_reorder_frames
- + 1));
- else
- ps_dec->i4_display_delay = MIN(
- (UWORD32 )ps_dec->i4_display_delay,
- ((UWORD32 )ps_seq->s_vui.u4_num_reorder_frames
- + 1) * 2);
- }
-
/* Temporary hack to run Tractor Cav/Cab/MbAff Profiler streams also for CAFI1_SVA_C.264 in conformance*/
if(ps_dec->u1_init_dec_flag)
{
@@ -1046,12 +822,21 @@ WORD32 ih264d_init_pic(dec_struct_t *ps_dec,
return ret;
}
+ ret = ih264d_allocate_dynamic_bufs(ps_dec);
+ if(ret != OK)
+ {
+ /* Free any dynamic buffers that are allocated */
+ ih264d_free_dynamic_bufs(ps_dec);
+ ps_dec->i4_error_code = IVD_MEM_ALLOC_FAILED;
+ return IVD_MEM_ALLOC_FAILED;
+ }
+
ret = ih264d_create_pic_buffers(ps_dec->u1_pic_bufs,
ps_dec);
if(ret != OK)
return ret;
- ih264d_get_memory_dec_params(ps_dec);
+
ret = ih264d_create_mv_bank(ps_dec, ps_dec->u2_pic_wd,
ps_dec->u2_pic_ht);
@@ -1897,26 +1682,11 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
UWORD32 u4_luma_size, u4_chroma_size;
UWORD8 u1_frm = ps_dec->ps_cur_sps->u1_frame_mbs_only_flag;
WORD32 j;
- UWORD32 u4_pic_buf_mem_used, u4_ref_buf_mem_used;
- UWORD8 *pu1_pic_buf_mem_base, *pu1_ref_buf_mem_base;
-
- u4_pic_buf_mem_used = 0;
- pu1_pic_buf_mem_base = ps_dec->ps_mem_tab[MEM_REC_PIC_BUF_MGR].pv_base;
+ UWORD8 *pu1_buf;
- ps_dec->pv_disp_buf_mgr = (void *)(pu1_pic_buf_mem_base
- + u4_pic_buf_mem_used);
- u4_pic_buf_mem_used += sizeof(disp_mgr_t);
+ ps_pic_buf = ps_dec->ps_pic_buf_base;
ih264_disp_mgr_init((disp_mgr_t *)ps_dec->pv_disp_buf_mgr);
-
- ps_dec->pv_pic_buf_mgr =
- (void *)(pu1_pic_buf_mem_base + u4_pic_buf_mem_used);
- u4_pic_buf_mem_used += sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
ih264_buf_mgr_init((buf_mgr_t *)ps_dec->pv_pic_buf_mgr);
-
- ps_pic_buf = (pic_buffer_t *)(pu1_pic_buf_mem_base + u4_pic_buf_mem_used);
- u4_pic_buf_mem_used += sizeof(struct pic_buffer_t)
- * (H264_MAX_REF_PICS * 2);
-
u4_luma_size = ps_dec->u2_frm_wd_y * ps_dec->u2_frm_ht_y;
u4_chroma_size = ps_dec->u2_frm_wd_uv * ps_dec->u2_frm_ht_uv;
@@ -1935,7 +1705,6 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
}
if(ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
-
{
u4_chroma_size = 64;
}
@@ -1943,8 +1712,7 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
}
}
- pu1_ref_buf_mem_base = ps_dec->ps_mem_tab[MEM_REC_REF_PIC].pv_base;
- u4_ref_buf_mem_used = 0;
+ pu1_buf = ps_dec->pu1_pic_buf_base;
/* Allocate memory for refernce buffers */
for(i = 0; i < u1_num_of_buf; i++)
@@ -1952,11 +1720,12 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
UWORD32 u4_offset;
WORD32 buf_ret;
UWORD8 *pu1_luma, *pu1_chroma;
+ void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
- pu1_luma = pu1_ref_buf_mem_base + u4_ref_buf_mem_used;
- u4_ref_buf_mem_used += u4_luma_size;
- pu1_chroma = pu1_ref_buf_mem_base + u4_ref_buf_mem_used;
- u4_ref_buf_mem_used += u4_chroma_size;
+ pu1_luma = pu1_buf;
+ pu1_buf += ALIGN64(u4_luma_size);
+ pu1_chroma = pu1_buf;
+ pu1_buf += ALIGN64(u4_chroma_size);
/* Offset to the start of the pic from the top left corner of the frame
buffer */
@@ -2015,9 +1784,7 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
ps_dec->disp_bufs[i].u4_ofst[1] = u4_offset;
ps_dec->disp_bufs[i].u4_ofst[2] = u4_offset;
-
}
-
}
ps_pic_buf->u2_frm_ht_y = ps_dec->u2_frm_ht_y;
@@ -2039,13 +1806,6 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
ps_pic_buf++;
}
- if((u4_ref_buf_mem_used > ps_dec->ps_mem_tab[MEM_REC_REF_PIC].u4_mem_size) ||
- (u4_pic_buf_mem_used > ps_dec->ps_mem_tab[MEM_REC_PIC_BUF_MGR].u4_mem_size))
- {
- ps_dec->i4_error_code = ERROR_BUF_MGR;
- return ERROR_BUF_MGR;
- }
-
if(1 == ps_dec->u4_share_disp_buf)
{
for(i = 0; i < u1_num_of_buf; i++)
@@ -2056,7 +1816,7 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
/*!
**************************************************************************
- * \if Function name : ih264d_get_memory_dec_params \endif
+ * \if Function name : ih264d_allocate_dynamic_bufs \endif
*
* \brief
* This function allocates memory required by Decoder.
@@ -2068,7 +1828,7 @@ WORD32 ih264d_create_pic_buffers(UWORD8 u1_num_of_buf,
*
**************************************************************************
*/
-WORD16 ih264d_get_memory_dec_params(dec_struct_t * ps_dec)
+WORD16 ih264d_allocate_dynamic_bufs(dec_struct_t * ps_dec)
{
struct MemReq s_MemReq;
struct MemBlock *p_MemBlock;
@@ -2093,330 +1853,237 @@ WORD16 ih264d_get_memory_dec_params(dec_struct_t * ps_dec)
UWORD32 ui_size = 0;
UWORD32 u4_int_scratch_size = 0, u4_ref_pred_size = 0;
UWORD8 *pu1_buf;
+ WORD32 num_entries;
+ WORD32 size;
+ void *pv_buf;
+ UWORD32 u4_num_bufs;
+ UWORD32 u4_luma_size, u4_chroma_size;
+ void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
+
+ size = u4_total_mbs;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_dec_mb_map = pv_buf;
+
+ size = u4_total_mbs;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_recon_mb_map = pv_buf;
+
+ size = u4_total_mbs * sizeof(UWORD16);
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu2_slice_num_map = pv_buf;
+
+ /************************************************************/
+ /* Post allocation Initialisations */
+ /************************************************************/
+ ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
+ ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
+ ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
+
+ ps_dec->ps_pred_start = ps_dec->ps_pred;
+
+ size = sizeof(parse_pmbarams_t) * (ps_dec->u1_recon_mb_grp);
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_parse_mb_data = pv_buf;
+
+ size = sizeof(parse_part_params_t)
+ * ((ps_dec->u1_recon_mb_grp) << 4);
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_parse_part_params = pv_buf;
- ps_dec->ps_deblk_pic = ps_dec->ps_mem_tab[MEM_REC_DEBLK_MB_INFO].pv_base;
- memset(ps_dec->ps_deblk_pic, 0, ps_dec->ps_mem_tab[MEM_REC_DEBLK_MB_INFO].u4_mem_size);
-
- ps_dec->pu1_dec_mb_map = ps_dec->ps_mem_tab[MEM_REC_PARSE_MAP].pv_base;
-
- ps_dec->pu1_recon_mb_map = ps_dec->ps_mem_tab[MEM_REC_PROC_MAP].pv_base;
-
- ps_dec->pu2_slice_num_map =
- ps_dec->ps_mem_tab[MEM_REC_SLICE_NUM_MAP].pv_base;
-
- ps_dec->ps_dec_slice_buf = ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].pv_base;
- memset(ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].pv_base, 0,
- ps_dec->ps_mem_tab[MEM_REC_SLICE_HDR].u4_mem_size);
- pu1_buf = (UWORD8 *)ps_dec->ps_dec_slice_buf;
- pu1_buf += sizeof(dec_slice_struct_t) * u4_total_mbs;
- ps_dec->pv_map_ref_idx_to_poc_buf = (void *)pu1_buf;
-
- ps_dec->ps_frm_mb_info = ps_dec->ps_mem_tab[MEM_REC_MB_INFO].pv_base;
- memset(ps_dec->ps_frm_mb_info, 0, ps_dec->ps_mem_tab[MEM_REC_MB_INFO].u4_mem_size);
+ size = ((u4_wd_mbs * sizeof(deblkmb_neighbour_t)) << uc_frmOrFld);
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_deblk_top_mb = pv_buf;
- ps_dec->ps_pred = ps_dec->ps_mem_tab[MEM_REC_PRED_INFO].pv_base;
+ size = ((sizeof(ctxt_inc_mb_info_t))
+ * (((u4_wd_mbs + 1) << uc_frmOrFld) + 1));
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->p_ctxt_inc_mb_map = pv_buf;
- ps_dec->pi2_coeff_data = ps_dec->ps_mem_tab[MEM_REC_COEFF_DATA].pv_base;
+ size = (sizeof(mv_pred_t) * ps_dec->u1_recon_mb_grp
+ * 16);
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_mv_p[0] = pv_buf;
- ps_dec->pv_pic_tu_coeff_data = (void *)(ps_dec->pi2_coeff_data + MB_LUM_SIZE);
+ size = (sizeof(mv_pred_t) * ps_dec->u1_recon_mb_grp
+ * 16);
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_mv_p[1] = pv_buf;
- /*scratch memory allocations*/
{
- UWORD8 *pu1_scratch_mem_base;
- UWORD32 u4_scratch_mem_used;
-
- pu1_scratch_mem_base =
- ps_dec->ps_mem_tab[MEM_REC_INTERNAL_SCRATCH].pv_base;
- u4_scratch_mem_used = 0;
-
- ps_dec->ppv_map_ref_idx_to_poc = (void *)(pu1_scratch_mem_base
- + u4_scratch_mem_used);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
- u4_scratch_mem_used += ((TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC)
- * sizeof(void *));
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
- memset(ps_dec->ppv_map_ref_idx_to_poc, 0, (TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC)
- * sizeof(void *));
-
- ps_dec->p_cabac_ctxt_table_t = (void *)(pu1_scratch_mem_base
- + u4_scratch_mem_used);
- u4_scratch_mem_used += (sizeof(bin_ctxt_model_t) * NUM_CABAC_CTXTS);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
-
- ps_dec->ps_left_mb_ctxt_info = (void *)(pu1_scratch_mem_base
- + u4_scratch_mem_used);
- u4_scratch_mem_used += sizeof(ctxt_inc_mb_info_t);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
-
- ps_dec->pu4_defI_wts_ofsts = (void *)(pu1_scratch_mem_base
- + u4_scratch_mem_used);
- u4_scratch_mem_used +=
- sizeof(UWORD32)
- * (ps_sps->u1_num_ref_frames
- * ps_sps->u1_num_ref_frames);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
-
- ps_dec->pu1_ref_buff = pu1_scratch_mem_base + u4_scratch_mem_used + MAX_REF_BUF_SIZE;
- u4_scratch_mem_used += MAX_REF_BUF_SIZE * 2;
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
- ps_dec->pi2_pred1 =
- (void *)(pu1_scratch_mem_base + u4_scratch_mem_used);
- u4_scratch_mem_used += ((sizeof(WORD16)) * PRED_BUFFER_WIDTH
- * PRED_BUFFER_HEIGHT * 2);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
-
- ps_dec->pu1_temp_mc_buffer = (void *)(pu1_scratch_mem_base
- + u4_scratch_mem_used);
- u4_scratch_mem_used += sizeof(UWORD8) * (MB_LUM_SIZE);
-
- ps_dec->ps_parse_mb_data = (void *)(pu1_scratch_mem_base
- + u4_scratch_mem_used);
- u4_scratch_mem_used += sizeof(parse_pmbarams_t)
- * (ps_dec->u1_recon_mb_grp);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
-
- ps_dec->ps_parse_part_params = (void *)(pu1_scratch_mem_base
- + u4_scratch_mem_used);
- u4_scratch_mem_used += sizeof(parse_part_params_t)
- * ((ps_dec->u1_recon_mb_grp) << 4);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
-
- ps_dec->ps_dpb_mgr->ps_init_dpb[0][0] =
- (struct pic_buffer_t*)(pu1_scratch_mem_base
- + u4_scratch_mem_used);
- u4_scratch_mem_used += 2 * MAX_REF_BUFS * sizeof(struct pic_buffer_t);
-
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
- ps_dec->ps_dpb_mgr->ps_init_dpb[1][0] =
- (struct pic_buffer_t*)(pu1_scratch_mem_base + u4_scratch_mem_used);
- u4_scratch_mem_used += 2 * MAX_REF_BUFS * sizeof(struct pic_buffer_t);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
- ps_dec->pu4_mbaff_wt_mat = (UWORD32 *)(pu1_scratch_mem_base + u4_scratch_mem_used);
-
- u4_scratch_mem_used += (sizeof(UWORD32) * 3
- * (MAX_FRAMES * MAX_FRAMES))
- << 3;
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
-
- ps_dec->pu4_wts_ofsts_mat = (UWORD32 *)(pu1_scratch_mem_base + u4_scratch_mem_used);
- u4_scratch_mem_used += sizeof(UWORD32) * 2 * 3
- * (MAX_FRAMES * MAX_FRAMES);
- u4_scratch_mem_used = ALIGN64(u4_scratch_mem_used);
- }
- /********************************************************************/
- /* check whether deblk memory used is less than the scratch buffer */
- /* and assign deblocking pointers in the the reference buffers */
- /********************************************************************/
- {
- /************************************************************/
- /* Post allocation Initialisations */
- /************************************************************/
- memset(ps_dec->ppv_map_ref_idx_to_poc, 0,
- (TOTAL_LIST_ENTRIES + PAD_MAP_IDX_POC) * sizeof(void *));
- ps_dec->ppv_map_ref_idx_to_poc += OFFSET_MAP_IDX_POC;
-
+ UWORD8 i;
+ for(i = 0; i < MV_SCRATCH_BUFS; i++)
{
- ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
- ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
- ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
-
- ps_dec->ps_pred_start = ps_dec->ps_pred;
- ps_dec->u4_ref_buf_size = MAX_REF_BUF_SIZE;
- }
-
- {
- UWORD8 i;
- struct pic_buffer_t *ps_init_dpb;
- ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[0][0];
- for(i = 0; i < 2 * MAX_REF_BUFS; i++)
- {
- ps_init_dpb->pu1_buf1 = NULL;
- ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
- ps_dec->ps_dpb_mgr->ps_init_dpb[0][i] = ps_init_dpb;
- ps_dec->ps_dpb_mgr->ps_mod_dpb[0][i] = ps_init_dpb;
- ps_init_dpb++;
- }
-
- ps_init_dpb = ps_dec->ps_dpb_mgr->ps_init_dpb[1][0];
- for(i = 0; i < 2 * MAX_REF_BUFS; i++)
- {
- ps_init_dpb->pu1_buf1 = NULL;
- ps_init_dpb->u1_long_term_frm_idx = MAX_REF_BUFS + 1;
- ps_dec->ps_dpb_mgr->ps_init_dpb[1][i] = ps_init_dpb;
- ps_dec->ps_dpb_mgr->ps_mod_dpb[1][i] = ps_init_dpb;
- ps_init_dpb++;
- }
+ size = (sizeof(mv_pred_t)
+ * ps_dec->u1_recon_mb_grp * 4);
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_mv_top_p[i] = pv_buf;
}
}
- /*persistent memory allocations*/
-
+ size = sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_y_intra_pred_line = pv_buf;
+ memset(ps_dec->pu1_y_intra_pred_line, 0, size);
+
+ size = sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_u_intra_pred_line = pv_buf;
+ memset(ps_dec->pu1_u_intra_pred_line, 0, size);
+
+ size = sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_v_intra_pred_line = pv_buf;
+ memset(ps_dec->pu1_v_intra_pred_line, 0, size);
+
+ if(ps_dec->u1_separate_parse)
{
- UWORD8 *pu1_persitent_mem_base;
- UWORD32 u4_persistent_mem_used;
-
- pu1_persitent_mem_base =
- ps_dec->ps_mem_tab[MEM_REC_INTERNAL_PERSIST].pv_base;
- u4_persistent_mem_used = 0;
-
- ps_dec->ps_deblk_top_mb = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += ((u4_wd_mbs
- * sizeof(deblkmb_neighbour_t)) << uc_frmOrFld);
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->ps_left_mvpred_addr = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += (sizeof(neighbouradd_t) << 2);
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->p_ctxt_inc_mb_map = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += ((sizeof(ctxt_inc_mb_info_t))
- * (((u4_wd_mbs + 1) << uc_frmOrFld) + 1));
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->ps_mv_p[0] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += (sizeof(mv_pred_t) * ps_dec->u1_recon_mb_grp
- * 16);
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->ps_mv_p[1] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += (sizeof(mv_pred_t) * ps_dec->u1_recon_mb_grp
- * 16);
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ size = sizeof(mb_neigbour_params_t)
+ * 2 * ((u4_wd_mbs + 2) * u4_ht_mbs);
+ }
+ else
+ {
+ size = sizeof(mb_neigbour_params_t)
+ * 2 * ((u4_wd_mbs + 2) << uc_frmOrFld);
+ }
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
- {
- UWORD8 i;
- for(i = 0; i < MV_SCRATCH_BUFS; i++)
- {
+ ps_dec->ps_nbr_mb_row = pv_buf;
+ memset(ps_dec->ps_nbr_mb_row, 0, size);
- ps_dec->ps_mv_top_p[i] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += (sizeof(mv_pred_t)
- * ps_dec->u1_recon_mb_grp * 4);
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ /* Allocate deblock MB info */
+ size = (u4_total_mbs + u4_wd_mbs) * sizeof(deblk_mb_t);
- }
- }
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_deblk_pic = pv_buf;
- {
- UWORD32 u4_numRows = MB_SIZE << 1;
+ memset(ps_dec->ps_deblk_pic, 0, size);
- /* Allocate memory for ping, pong and left reconstruction buffers */
- u4_blk_wd = ((ps_dec->u1_recon_mb_grp << 4) >> 1) + 8;
+ /* Allocate frame level mb info */
+ size = sizeof(dec_mb_info_t) * u4_total_mbs;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_frm_mb_info = pv_buf;
+ memset(ps_dec->ps_frm_mb_info, 0, size);
- ps_dec->pu1_y_scratch[0] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->pu1_y_scratch[1] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ /* Allocate memory for slice headers dec_slice_struct_t */
+ num_entries = MAX_FRAMES;
+ if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
+ (0 == ps_dec->i4_display_delay))
+ {
+ num_entries = 1;
+ }
+ num_entries = ((2 * num_entries) + 1);
+ if(BASE_PROFILE_IDC != ps_dec->ps_cur_sps->u1_profile_idc)
+ {
+ num_entries *= 2;
+ }
- u4_numRows = BLK8x8SIZE << 1;
- u4_blk_wd = ((ps_dec->u1_recon_mb_grp << 3) >> 1) + 8;
+ size = num_entries * sizeof(void *);
+ size += PAD_MAP_IDX_POC * sizeof(void *);
+ size *= u4_total_mbs;
+ size += sizeof(dec_slice_struct_t) * u4_total_mbs;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
- ps_dec->pu1_u_scratch[0] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ ps_dec->ps_dec_slice_buf = pv_buf;
+ memset(ps_dec->ps_dec_slice_buf, 0, size);
+ pu1_buf = (UWORD8 *)ps_dec->ps_dec_slice_buf;
+ pu1_buf += sizeof(dec_slice_struct_t) * u4_total_mbs;
+ ps_dec->pv_map_ref_idx_to_poc_buf = (void *)pu1_buf;
- ps_dec->pu1_v_scratch[0] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ /* Allocate memory for packed pred info */
+ num_entries = u4_total_mbs;
+ if(1 == ps_dec->ps_cur_sps->u1_num_ref_frames)
+ num_entries *= 16;
+ else
+ num_entries *= 16 * 2;
+
+ size = sizeof(pred_info_pkd_t) * num_entries;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->ps_pred_pkd = pv_buf;
+
+ /* Allocate memory for coeff data */
+ size = MB_LUM_SIZE * sizeof(WORD16);
+ /*For I16x16 MBs, 16 4x4 AC coeffs and 1 4x4 DC coeff TU blocks will be sent
+ For all MBs along with 8 4x4 AC coeffs 2 2x2 DC coeff TU blocks will be sent
+ So use 17 4x4 TU blocks for luma and 9 4x4 TU blocks for chroma */
+ size += u4_total_mbs * (MAX(17 * sizeof(tu_sblk4x4_coeff_data_t),4 * sizeof(tu_blk8x8_coeff_data_t))
+ + 9 * sizeof(tu_sblk4x4_coeff_data_t));
+ //32 bytes for each mb to store u1_prev_intra4x4_pred_mode and u1_rem_intra4x4_pred_mode data
+ size += u4_total_mbs * 32;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+
+ ps_dec->pi2_coeff_data = pv_buf;
- ps_dec->pu1_u_scratch[1] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ ps_dec->pv_pic_tu_coeff_data = (void *)(ps_dec->pi2_coeff_data + MB_LUM_SIZE);
- ps_dec->pu1_v_scratch[1] = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * u4_numRows * u4_blk_wd;
- u4_persistent_mem_used += 32;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ /* Allocate MV bank buffer */
+ {
+ UWORD32 col_flag_buffer_size, mvpred_buffer_size;
- }
+ col_flag_buffer_size = ((ps_dec->u2_pic_wd * ps_dec->u2_pic_ht) >> 4);
+ mvpred_buffer_size = sizeof(mv_pred_t)
+ * ((ps_dec->u2_pic_wd * (ps_dec->u2_pic_ht + PAD_MV_BANK_ROW)) >> 4);
- ps_dec->pu1_y_intra_pred_line = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ u4_num_bufs = ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
- ps_dec->pu1_u_intra_pred_line = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ u4_num_bufs = MIN(u4_num_bufs, ps_dec->u1_pic_bufs);
+ u4_num_bufs = MAX(u4_num_bufs, 2);
+ size = ALIGN64(mvpred_buffer_size) + ALIGN64(col_flag_buffer_size);
+ size *= u4_num_bufs;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_mv_bank_buf_base = pv_buf;
+ }
- ps_dec->pu1_v_intra_pred_line = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += sizeof(UWORD8) * ((u4_wd_mbs + 1) * MB_SIZE) * 2;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
+ /* Allocate Pic buffer */
+ u4_luma_size = ps_dec->u2_frm_wd_y * ps_dec->u2_frm_ht_y;
+ u4_chroma_size = ps_dec->u2_frm_wd_uv * ps_dec->u2_frm_ht_uv;
- ps_dec->ps_nbr_mb_row = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- if(ps_dec->u1_separate_parse)
- {
- u4_persistent_mem_used += sizeof(mb_neigbour_params_t)
- * ((u4_wd_mbs + 1) * u4_ht_mbs);
- memset(ps_dec->ps_nbr_mb_row, 0, sizeof(mb_neigbour_params_t)
- * ((u4_wd_mbs + 1) * u4_ht_mbs));
- }
- else
+ {
+ if(ps_dec->u4_share_disp_buf == 1)
{
- u4_persistent_mem_used += sizeof(mb_neigbour_params_t)
- * ((u4_wd_mbs + 1) << uc_frmOrFld);
- memset(ps_dec->ps_nbr_mb_row, 0, sizeof(mb_neigbour_params_t)
- * ((u4_wd_mbs + 1) << uc_frmOrFld));
+ /* In case of buffers getting shared between application and library
+ there is no need of reference memtabs. Instead of setting the i4_size
+ to zero, it is reduced to a small i4_size to ensure that changes
+ in the code are minimal */
+ if((ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
+ || (ps_dec->u1_chroma_format == IV_YUV_420SP_VU)
+ || (ps_dec->u1_chroma_format == IV_YUV_420P))
+ {
+ u4_luma_size = 64;
+ }
+
+ if(ps_dec->u1_chroma_format == IV_YUV_420SP_UV)
+ {
+ u4_chroma_size = 64;
+ }
}
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
- ps_dec->s_pad_mgr.pu1_row_y = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += ps_dec->u2_frm_wd_y;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->s_pad_mgr.pu1_row_u = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += ps_dec->u2_frm_wd_uv;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->s_pad_mgr.pu1_row_v = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += ps_dec->u2_frm_wd_uv;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->s_pad_mgr.pu1_mb_y = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += ((MB_SIZE + 4) << uc_frmOrFld) * PAD_LEN_Y_H;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->s_pad_mgr.pu1_mb_u = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += ((BLK8x8SIZE + 2) << uc_frmOrFld)
- * PAD_LEN_UV_H;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
-
- ps_dec->s_pad_mgr.pu1_mb_v = (void *)(pu1_persitent_mem_base
- + u4_persistent_mem_used);
- u4_persistent_mem_used += ((BLK8x8SIZE + 2) << uc_frmOrFld)
- * PAD_LEN_UV_H;
- u4_persistent_mem_used = ALIGN64(u4_persistent_mem_used);
}
- /*Post allocation initializations*/
- memset(ps_dec->pu1_y_intra_pred_line, 0,
- sizeof(UWORD8) * u4_luma_wd + PAD_LEN_Y_H);
- memset(ps_dec->pu1_u_intra_pred_line, 0,
- sizeof(UWORD8) * u4_chroma_wd + PAD_LEN_UV_H);
- memset(ps_dec->pu1_v_intra_pred_line, 0,
- sizeof(UWORD8) * u4_chroma_wd + PAD_LEN_UV_H);
+ size = ALIGN64(u4_luma_size) + ALIGN64(u4_chroma_size);
+ size *= ps_dec->u1_pic_bufs;
+ pv_buf = ps_dec->pf_aligned_alloc(pv_mem_ctxt, 128, size);
+ RETURN_IF((NULL == pv_buf), IV_FAIL);
+ ps_dec->pu1_pic_buf_base = pv_buf;
/* 0th entry of CtxtIncMbMap will be always be containing default values
for CABAC context representing MB not available */
@@ -2497,15 +2164,68 @@ WORD16 ih264d_get_memory_dec_params(dec_struct_t * ps_dec)
ps_dec->s_high_profile.ps_last_sigcoeff_8x8_field =
p_cabac_ctxt_table_t
+ LAST_SIGNIFICANT_COEFF_FLAG_8X8_FIELD;
-
}
-
}
return (i16_status);
}
/*!
**************************************************************************
+ * \if Function name : ih264d_free_dynamic_bufs \endif
+ *
+ * \brief
+ * This function frees dynamic memory allocated by Decoder.
+ *
+ * \param ps_dec: Pointer to dec_struct_t.
+ *
+ * \return
+ * Returns i4_status as returned by MemManager.
+ *
+ **************************************************************************
+ */
+WORD16 ih264d_free_dynamic_bufs(dec_struct_t * ps_dec)
+{
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_bits_buf_dynamic);
+
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_deblk_pic);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_dec_mb_map);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_recon_mb_map);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu2_slice_num_map);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_dec_slice_buf);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_frm_mb_info);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pi2_coeff_data);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_parse_mb_data);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_parse_part_params);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_deblk_top_mb);
+
+ if(ps_dec->p_ctxt_inc_mb_map)
+ {
+ ps_dec->p_ctxt_inc_mb_map -= 1;
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->p_ctxt_inc_mb_map);
+ }
+
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_mv_p[0]);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_mv_p[1]);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_pred_pkd);
+ {
+ UWORD8 i;
+ for(i = 0; i < MV_SCRATCH_BUFS; i++)
+ {
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_mv_top_p[i]);
+ }
+ }
+
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_y_intra_pred_line);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_u_intra_pred_line);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_v_intra_pred_line);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->ps_nbr_mb_row);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_mv_bank_buf_base);
+ PS_DEC_ALIGNED_FREE(ps_dec, ps_dec->pu1_pic_buf_base);
+ return 0;
+}
+
+/*!
+ **************************************************************************
* \if Function name : ih264d_create_mv_bank \endif
*
* \brief
@@ -2533,44 +2253,38 @@ WORD32 ih264d_create_mv_bank(void *pv_dec,
UWORD8 i;
UWORD32 col_flag_buffer_size, mvpred_buffer_size;
UWORD8 *pu1_mv_buf_mgr_base, *pu1_mv_bank_base;
- UWORD32 u4_mv_buf_mgr_mem_used, u4_mv_bank_mem_used;
col_mv_buf_t *ps_col_mv;
mv_pred_t *ps_mv;
UWORD8 *pu1_col_zero_flag_buf;
dec_struct_t *ps_dec = (dec_struct_t *)pv_dec;
WORD32 buf_ret;
UWORD32 u4_num_bufs;
+ UWORD8 *pu1_buf;
+ WORD32 size;
+ void *pv_mem_ctxt = ps_dec->pv_mem_ctxt;
- pu1_mv_buf_mgr_base = ps_dec->ps_mem_tab[MEM_REC_MV_BUF_MGR].pv_base;
- u4_mv_buf_mgr_mem_used = 0;
col_flag_buffer_size = ((ui_width * ui_height) >> 4);
-
- pu1_mv_bank_base = ps_dec->ps_mem_tab[MEM_REC_MVBANK].pv_base;
- u4_mv_bank_mem_used = 0;
mvpred_buffer_size = sizeof(mv_pred_t)
* ((ui_width * (ui_height + PAD_MV_BANK_ROW)) >> 4);
- ps_dec->pv_mv_buf_mgr = (void *)(pu1_mv_buf_mgr_base + u4_mv_buf_mgr_mem_used);
- u4_mv_buf_mgr_mem_used += sizeof(buf_mgr_t) + ithread_get_mutex_lock_size();
ih264_buf_mgr_init((buf_mgr_t *)ps_dec->pv_mv_buf_mgr);
- ps_col_mv = (col_mv_buf_t *)(pu1_mv_buf_mgr_base + u4_mv_buf_mgr_mem_used);
- u4_mv_buf_mgr_mem_used += sizeof(col_mv_buf_t) * (H264_MAX_REF_PICS * 2);
- u4_mv_buf_mgr_mem_used = ALIGN128(u4_mv_buf_mgr_mem_used);
+ ps_col_mv = ps_dec->ps_col_mv_base;
- u4_num_bufs = ih264d_get_numbuf_mv_bank(ps_dec, ui_width, ui_height);
+ u4_num_bufs = ps_dec->ps_cur_sps->u1_num_ref_frames + 1;
u4_num_bufs = MIN(u4_num_bufs, ps_dec->u1_pic_bufs);
-
+ u4_num_bufs = MAX(u4_num_bufs, 2);
+ pu1_buf = ps_dec->pu1_mv_bank_buf_base;
for(i = 0 ; i < u4_num_bufs ; i++)
{
- pu1_col_zero_flag_buf = pu1_mv_buf_mgr_base + u4_mv_buf_mgr_mem_used;
- u4_mv_buf_mgr_mem_used += col_flag_buffer_size;
+ pu1_col_zero_flag_buf = pu1_buf;
+ pu1_buf += ALIGN64(col_flag_buffer_size);
- ps_mv = (mv_pred_t *)(pu1_mv_bank_base + u4_mv_bank_mem_used);
- u4_mv_bank_mem_used += mvpred_buffer_size;
+ ps_mv = (mv_pred_t *)pu1_buf;
+ pu1_buf += ALIGN64(mvpred_buffer_size);
- memset(ps_mv, 0, ((ui_width*OFFSET_MV_BANK_ROW) >> 4) * sizeof(mv_pred_t));
+ memset(ps_mv, 0, ((ui_width * OFFSET_MV_BANK_ROW) >> 4) * sizeof(mv_pred_t));
ps_mv += (ui_width*OFFSET_MV_BANK_ROW) >> 4;
ps_col_mv->pv_col_zero_flag = (void *)pu1_col_zero_flag_buf;
@@ -2583,19 +2297,9 @@ WORD32 ih264d_create_mv_bank(void *pv_dec,
}
ps_col_mv++;
}
-
- if((u4_mv_buf_mgr_mem_used > ps_dec->ps_mem_tab[MEM_REC_MV_BUF_MGR].u4_mem_size) ||
- (u4_mv_bank_mem_used > ps_dec->ps_mem_tab[MEM_REC_MVBANK].u4_mem_size))
- {
- ps_dec->i4_error_code = ERROR_BUF_MGR;
- return ERROR_BUF_MGR;
- }
-
return OK;
-
}
-
void ih264d_unpack_coeff4x4_dc_4x4blk(tu_sblk4x4_coeff_data_t *ps_tu_4x4,
WORD16 *pi2_out_coeff_data,
UWORD8 *pu1_inv_scan)
diff --git a/decoder/ih264d_utils.h b/decoder/ih264d_utils.h
index 326acc0..ddef744 100644
--- a/decoder/ih264d_utils.h
+++ b/decoder/ih264d_utils.h
@@ -40,6 +40,8 @@
#include "ih264d_structs.h"
#include "ih264d_parse_cavlc.h"
+#define PS_DEC_ALIGNED_FREE(ps_dec, y) \
+if(y) {ps_dec->pf_aligned_free(ps_dec->pv_mem_ctxt, ((void *)y)); (y) = NULL;}
void pad_frm_buff_vert(dec_struct_t *ps_dec);
UWORD8 ih264d_is_end_of_pic(UWORD16 u2_frame_num,
@@ -90,16 +92,11 @@ WORD32 ih264d_get_next_display_field(dec_struct_t * ps_dec,
void ih264d_release_display_field(dec_struct_t *ps_dec,
ivd_get_display_frame_op_t *pv_disp_op);
void ih264d_close_video_decoder(iv_obj_t *iv_obj_t);
-WORD32 ih264d_get_dpb_size_new(UWORD32 u4_level_idc,
- UWORD32 width,
- UWORD32 height);
+WORD32 ih264d_get_dpb_size(dec_seq_params_t *ps_seq);
WORD32 ih264d_get_next_nal_unit(UWORD8 *pu1_buf,
UWORD32 u4_cur_pos,
UWORD32 u4_max_ofst,
UWORD32 *pu4_length_of_start_code);
-UWORD32 ih264d_get_numbuf_mv_bank(dec_struct_t *ps_dec, UWORD32 width, UWORD32 height);
-WORD32 ih264d_get_numbuf_dpb_bank(dec_struct_t *ps_dec,
- UWORD32 u2_frame_wd,
- UWORD32 u2_frame_ht);
+WORD16 ih264d_free_dynamic_bufs(dec_struct_t * ps_dec);
#endif /* _IH264D_UTILS_H_ */
diff --git a/decoder/ih264d_vui.c b/decoder/ih264d_vui.c
index 87276bd..97b40c2 100644
--- a/decoder/ih264d_vui.c
+++ b/decoder/ih264d_vui.c
@@ -205,8 +205,9 @@ WORD32 ih264d_parse_vui_parametres(vui_t *ps_vu4,
}
ps_vu4->u1_pic_struct_present_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
- u4_bits = ih264d_get_bits_h264(ps_bitstrm, 1);
- if(u4_bits)
+ ps_vu4->u1_bitstream_restriction_flag = ih264d_get_bits_h264(ps_bitstrm, 1);
+
+ if(ps_vu4->u1_bitstream_restriction_flag)
{
ps_vu4->u1_mv_over_pic_boundaries_flag = ih264d_get_bits_h264(
ps_bitstrm, 1);
@@ -227,6 +228,7 @@ WORD32 ih264d_parse_vui_parametres(vui_t *ps_vu4,
{
/* Setting this to a large value if not present */
ps_vu4->u4_num_reorder_frames = 64;
+ ps_vu4->u4_max_dec_frame_buffering = 64;
}
return OK;
diff --git a/decoder/ih264d_vui.h b/decoder/ih264d_vui.h
index e380a5b..b882f72 100644
--- a/decoder/ih264d_vui.h
+++ b/decoder/ih264d_vui.h
@@ -81,6 +81,7 @@ typedef struct
hrd_t s_vcl_hrd;
UWORD8 u1_low_delay_hrd_flag;
UWORD8 u1_pic_struct_present_flag;
+ UWORD8 u1_bitstream_restriction_flag;
UWORD8 u1_mv_over_pic_boundaries_flag;
UWORD32 u4_max_bytes_per_pic_denom;
UWORD32 u4_max_bits_per_mb_denom;
diff --git a/decoder/iv.h b/decoder/iv.h
index 3a2ebf5..dbccae5 100644
--- a/decoder/iv.h
+++ b/decoder/iv.h
@@ -65,20 +65,6 @@ typedef enum {
IV_FAIL = 0x1,
}IV_API_CALL_STATUS_T;
-/* IV_MEM_TYPE_T: This Enumeration defines the type of memory (Internal/Ext */
-/* -ernal) along with the cacheable/non-cacheable attributes */
-
-typedef enum {
- IV_NA_MEM_TYPE = 0x7FFFFFFF,
- IV_INTERNAL_CACHEABLE_PERSISTENT_MEM = 0x1,
- IV_INTERNAL_CACHEABLE_SCRATCH_MEM = 0x2,
- IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM = 0x3,
- IV_EXTERNAL_CACHEABLE_SCRATCH_MEM = 0x4,
- IV_INTERNAL_NONCACHEABLE_PERSISTENT_MEM = 0x5,
- IV_INTERNAL_NONCACHEABLE_SCRATCH_MEM = 0x6,
- IV_EXTERNAL_NONCACHEABLE_PERSISTENT_MEM = 0x7,
- IV_EXTERNAL_NONCACHEABLE_SCRATCH_MEM = 0x8
-}IV_MEM_TYPE_T;
/* IV_COLOR_FORMAT_T: This enumeration lists all the color formats which */
/* finds usage in video/image codecs */
@@ -150,10 +136,6 @@ typedef enum {
/* IV_API_COMMAND_TYPE_T:API command type */
typedef enum {
IV_CMD_NA = 0x7FFFFFFF,
- IV_CMD_GET_NUM_MEM_REC = 0x0,
- IV_CMD_FILL_NUM_MEM_REC = 0x1,
- IV_CMD_RETRIEVE_MEMREC = 0x2,
- IV_CMD_INIT = 0x3,
IV_CMD_DUMMY_ELEMENT = 0x4,
}IV_API_COMMAND_TYPE_T;
@@ -180,35 +162,6 @@ typedef struct {
void *pv_codec_handle;
}iv_obj_t;
-/* iv_mem_rec_t: This structure defines the memory record holder which will */
-/* be used by the codec to communicate its memory requirements to the */
-/* application through appropriate API functions */
-
-typedef struct {
- /**
- * u4_size of the structure
- */
- UWORD32 u4_size;
-
- /**
- * Pointer to the memory allocated by the application
- */
- void *pv_base;
-
- /**
- * u4_size of the memory to be allocated
- */
- UWORD32 u4_mem_size;
-
- /**
- * Alignment of the memory pointer
- */
- UWORD32 u4_mem_alignment;
- /**
- * Nature of the memory to be allocated
- */
- IV_MEM_TYPE_T e_mem_type;
-}iv_mem_rec_t;
/* IV_YUV_BUF_T: This structure defines attributes for the yuv buffer */
@@ -279,141 +232,6 @@ typedef struct {
UWORD32 u4_v_strd;
}iv_yuv_buf_t;
-/*****************************************************************************/
-/* Get Number of Memory Records */
-/*****************************************************************************/
-
-/* IV_API_COMMAND_TYPE_T::e_cmd = IV_CMD_GET_NUM_MEM_REC */
-
-
-typedef struct {
- /**
- * u4_size of the structure
- */
- UWORD32 u4_size;
-
- /**
- * cmd
- */
- IV_API_COMMAND_TYPE_T e_cmd;
-}iv_num_mem_rec_ip_t;
-
-
-typedef struct {
- /**
- * u4_size of the structure
- */
- UWORD32 u4_size;
-
- /**
- * error code
- */
- UWORD32 u4_error_code;
-
- /**
- * num_mem_rec
- */
- UWORD32 u4_num_mem_rec;
-}iv_num_mem_rec_op_t;
-
-
-/*****************************************************************************/
-/* Fill Memory Records */
-/*****************************************************************************/
-
-/* IV_API_COMMAND_TYPE_T::e_cmd = IV_CMD_FILL_NUM_MEM_REC */
-
-
-typedef struct {
- /**
- * u4_size of the structure
- */
- UWORD32 u4_size;
-
- /**
- * cmd
- */
- IV_API_COMMAND_TYPE_T e_cmd;
-
- /**
- * pointer to array of memrecords structures should be filled by codec
- with details of memory resource requirements
- */
- iv_mem_rec_t *pv_mem_rec_location;
-
- /**
- * maximum width for which codec should request memory requirements
- */
- UWORD32 u4_max_frm_wd;
-
- /**
- * maximum height for which codec should request memory requirements
- */
- UWORD32 u4_max_frm_ht;
-}iv_fill_mem_rec_ip_t;
-
-
-typedef struct {
- /**
- * u4_size of the structure
- */
- UWORD32 u4_size;
-
- /**
- * error_code
- */
- UWORD32 u4_error_code;
-
- /**
- * no of memory record structures which are filled by codec
- */
- UWORD32 u4_num_mem_rec_filled;
-}iv_fill_mem_rec_op_t;
-
-
-/*****************************************************************************/
-/* Retrieve Memory Records */
-/*****************************************************************************/
-
-/* IV_API_COMMAND_TYPE_T::e_cmd = IV_CMD_RETRIEVE_MEMREC */
-
-
-
-typedef struct {
- /**
- * u4_size of the structure
- */
- UWORD32 u4_size;
-
- /**
- * cmd
- */
- IV_API_COMMAND_TYPE_T e_cmd;
-
- /**
- * array of structures where codec should fill with all resources(memory) with it
- */
- iv_mem_rec_t *pv_mem_rec_location;
-}iv_retrieve_mem_rec_ip_t;
-
-
-typedef struct {
- /**
- * u4_size of the structure
- */
- UWORD32 u4_size;
-
- /**
- * error_code
- */
- UWORD32 u4_error_code;
-
- /**
- * no of memory records filled by codec
- */
- UWORD32 u4_num_mem_rec_filled;
-}iv_retrieve_mem_rec_op_t;
-
#endif /* _IV_H */
diff --git a/decoder/ivd.h b/decoder/ivd.h
index b30b0b1..8d304bc 100644
--- a/decoder/ivd.h
+++ b/decoder/ivd.h
@@ -17,24 +17,24 @@
*****************************************************************************
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
-/*****************************************************************************/
-/* */
-/* File Name : ivd.h */
-/* */
-/* Description : This file contains all the necessary structure and */
-/* enumeration definitions needed for the Application */
-/* Program Interface(API) of the Ittiam Video Decoders */
-/* */
-/* List of Functions : None */
-/* */
-/* Issues / Problems : None */
-/* */
-/* Revision History : */
-/* */
-/* DD MM YYYY Author(s) Changes (Describe the changes made) */
-/* 26 08 2010 100239(RCY) Draft */
-/* */
-/*****************************************************************************/
+/**
+*******************************************************************************
+* @file
+* ivd.h
+*
+* @brief
+* This file contains all the necessary structure and enumeration
+* definitions needed for the Application Program Interface(API) of the
+* Ittiam Video Decoders
+*
+* @author
+* 100239(RCY)
+*
+* @remarks
+* None
+*
+*******************************************************************************
+*/
#ifndef _IVD_H
#define _IVD_H
@@ -128,7 +128,9 @@ typedef enum {
/* IVD_API_COMMAND_TYPE_T:API command type */
typedef enum {
IVD_CMD_VIDEO_NA = 0x7FFFFFFF,
- IVD_CMD_VIDEO_CTL = IV_CMD_DUMMY_ELEMENT + 1,
+ IVD_CMD_CREATE = IV_CMD_DUMMY_ELEMENT + 1,
+ IVD_CMD_DELETE,
+ IVD_CMD_VIDEO_CTL,
IVD_CMD_VIDEO_DECODE,
IVD_CMD_GET_DISPLAY_FRAME,
IVD_CMD_REL_DISPLAY_FRAME,
@@ -228,6 +230,7 @@ typedef enum {
IVD_DEC_REF_BUF_NULL = 0x28,
IVD_DEC_FRM_SKIPPED = 0x29,
IVD_RES_CHANGED = 0x2a,
+ IVD_MEM_ALLOC_FAILED = 0x2b,
IVD_DUMMY_ELEMENT_FOR_CODEC_EXTENSIONS = 0xD0,
}IVD_ERROR_CODES_T;
@@ -239,48 +242,127 @@ typedef enum {
/* call */
typedef struct {
- /* number of output buffers */
+ /**
+ * number of output buffers
+ */
UWORD32 u4_num_bufs;
- /* list of pointers to output buffers */
+ /**
+ *list of pointers to output buffers
+ */
UWORD8 *pu1_bufs[IVD_VIDDEC_MAX_IO_BUFFERS];
- /* sizes of each output buffer */
+ /**
+ * sizes of each output buffer
+ */
UWORD32 u4_min_out_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
}ivd_out_bufdesc_t;
/*****************************************************************************/
-/* Initialize decoder */
+/* Create decoder */
/*****************************************************************************/
-/* IVD_API_COMMAND_TYPE_T::e_cmd = IVD_CMD_INIT */
+/* IVD_API_COMMAND_TYPE_T::e_cmd = IVD_CMD_CREATE */
typedef struct {
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * e_cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
- /* no memrecords which are allocated on request of codec through
- fill mem records */
- UWORD32 u4_num_mem_rec;
- /* maximum height for which codec should be initialized */
- UWORD32 u4_frm_max_wd;
- /* maximum width for which codec should be initialized */
- UWORD32 u4_frm_max_ht;
- /* format in which codec has to give out frame data for display */
+
+ /**
+ * format in which codec has to give out frame data for display
+ */
IV_COLOR_FORMAT_T e_output_format;
- /* pointer to memrecord array, which contains allocated resources */
- iv_mem_rec_t *pv_mem_rec_location;
-}ivd_init_ip_t;
+
+ /**
+ * Flag to indicate shared display buffer mode
+ */
+ UWORD32 u4_share_disp_buf;
+
+ /**
+ * Pointer to a function for aligned allocation.
+ */
+ void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
+
+ /**
+ * Pointer to a function for aligned free.
+ */
+ void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
+
+ /**
+ * Pointer to memory context that is needed during alloc/free for custom
+ * memory managers. This will be passed as first argument to pf_aligned_alloc and
+ * pf_aligned_free.
+ * If application is using standard memory functions like
+ * malloc/aligned_malloc/memalign/free/aligned_free,
+ * then this is not needed and can be set to NULL
+ */
+ void *pv_mem_ctxt;
+
+}ivd_create_ip_t;
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * u4_error_code
+ */
UWORD32 u4_error_code;
-}ivd_init_op_t;
+ /**
+ * Codec Handle
+ */
+ void *pv_handle;
+
+}ivd_create_op_t;
+
+
+/*****************************************************************************/
+/* Delete decoder */
+/*****************************************************************************/
+
+/* IVD_API_COMMAND_TYPE_T::e_cmd = IVD_CMD_DELETE */
+
+
+
+typedef struct {
+ /**
+ * u4_size of the structure
+ */
+ UWORD32 u4_size;
+
+ /**
+ * cmd
+ */
+ IVD_API_COMMAND_TYPE_T e_cmd;
+
+}ivd_delete_ip_t;
+
+
+typedef struct{
+ /**
+ * u4_size of the structure
+ */
+ UWORD32 u4_size;
+
+ /**
+ * error_code
+ */
+ UWORD32 u4_error_code;
+
+}ivd_delete_op_t;
/*****************************************************************************/
/* Video Decode */
@@ -291,37 +373,118 @@ typedef struct{
typedef struct {
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * e_cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * u4_ts
+ */
UWORD32 u4_ts;
+
+ /**
+ * u4_num_Bytes
+ */
UWORD32 u4_num_Bytes;
+
+ /**
+ * pv_stream_buffer
+ */
void *pv_stream_buffer;
- /* output buffer desc */
+ /**
+ * output buffer desc
+ */
ivd_out_bufdesc_t s_out_buffer;
}ivd_video_decode_ip_t;
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * u4_error_code
+ */
UWORD32 u4_error_code;
+
+ /**
+ * num_bytes_consumed
+ */
UWORD32 u4_num_bytes_consumed;
+
+ /**
+ * pic_wd
+ */
UWORD32 u4_pic_wd;
+
+ /**
+ * pic_ht
+ */
UWORD32 u4_pic_ht;
+
+ /**
+ * pic_type
+ */
IV_PICTURE_CODING_TYPE_T e_pic_type;
+
+ /**
+ * frame_decoded_flag
+ */
UWORD32 u4_frame_decoded_flag;
+
+ /**
+ * new_seq
+ */
UWORD32 u4_new_seq;
+ /**
+ * output_present
+ */
UWORD32 u4_output_present;
+
+ /**
+ * progressive_frame_flag
+ */
UWORD32 u4_progressive_frame_flag;
+
+ /**
+ * is_ref_flag
+ */
UWORD32 u4_is_ref_flag;
+
+ /**
+ * output_format
+ */
IV_COLOR_FORMAT_T e_output_format;
+
+ /**
+ * disp_frm_buf
+ */
iv_yuv_buf_t s_disp_frm_buf;
+
+ /**
+ * fld_type
+ */
IV_FLD_TYPE_T e4_fld_type;
+
+ /**
+ * ts
+ */
UWORD32 u4_ts;
+
+ /**
+ * disp_buf_id
+ */
UWORD32 u4_disp_buf_id;
}ivd_video_decode_op_t;
@@ -335,12 +498,19 @@ typedef struct{
typedef struct
{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+ /**
+ * e_cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
- /* output buffer desc */
+ /**
+ * output buffer desc
+ */
ivd_out_bufdesc_t s_out_buffer;
}ivd_get_display_frame_ip_t;
@@ -348,16 +518,54 @@ typedef struct
typedef struct
{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * error_code
+ */
UWORD32 u4_error_code;
+
+ /**
+ * progressive_frame_flag
+ */
UWORD32 u4_progressive_frame_flag;
+
+ /**
+ * pic_type
+ */
IV_PICTURE_CODING_TYPE_T e_pic_type;
+
+ /**
+ * is_ref_flag
+ */
UWORD32 u4_is_ref_flag;
+
+ /**
+ * output_format
+ */
IV_COLOR_FORMAT_T e_output_format;
+
+ /**
+ * disp_frm_buf
+ */
iv_yuv_buf_t s_disp_frm_buf;
+
+ /**
+ * fld_type
+ */
IV_FLD_TYPE_T e4_fld_type;
+
+ /**
+ * ts
+ */
UWORD32 u4_ts;
+
+ /**
+ * disp_buf_id
+ */
UWORD32 u4_disp_buf_id;
}ivd_get_display_frame_op_t;
@@ -370,14 +578,24 @@ typedef struct
typedef struct
{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+ /**
+ * cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+ /**
+ * num_disp_bufs
+ */
UWORD32 num_disp_bufs;
- /* output buffer desc */
+ /**
+ * output buffer desc
+ */
ivd_out_bufdesc_t s_disp_buffer[IVD_VIDDEC_MAX_IO_BUFFERS];
}ivd_set_display_frame_ip_t;
@@ -385,8 +603,14 @@ typedef struct
typedef struct
{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * error code
+ */
UWORD32 u4_error_code;
}ivd_set_display_frame_op_t;
@@ -400,17 +624,33 @@ typedef struct
typedef struct
{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * e_cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * disp_buf_id
+ */
UWORD32 u4_disp_buf_id;
}ivd_rel_display_frame_ip_t;
typedef struct
{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * error code
+ */
UWORD32 u4_error_code;
}ivd_rel_display_frame_op_t;
@@ -423,16 +663,32 @@ typedef struct
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * sub_cmd
+ */
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
}ivd_ctl_flush_ip_t;
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * error code
+ */
UWORD32 u4_error_code;
}ivd_ctl_flush_op_t;
@@ -444,16 +700,33 @@ typedef struct{
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * sub_cmd
+ */
+
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
}ivd_ctl_reset_ip_t;
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * error code
+ */
UWORD32 u4_error_code;
}ivd_ctl_reset_op_t;
@@ -468,20 +741,52 @@ typedef struct{
typedef struct {
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * sub_cmd
+ */
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
+
+ /**
+ * vid_dec_mode
+ */
IVD_VIDEO_DECODE_MODE_T e_vid_dec_mode;
+
+ /**
+ * disp_wd
+ */
UWORD32 u4_disp_wd;
+
+ /**
+ * frm_skip_mode
+ */
IVD_FRAME_SKIP_MODE_T e_frm_skip_mode;
+
+ /**
+ * frm_out_mode
+ */
IVD_DISPLAY_FRAME_OUT_MODE_T e_frm_out_mode;
}ivd_ctl_set_config_ip_t;
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * u4_error_code
+ */
UWORD32 u4_error_code;
}ivd_ctl_set_config_op_t;
@@ -494,26 +799,57 @@ typedef struct{
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * e_cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * sub_cmd
+ */
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
}ivd_ctl_getbufinfo_ip_t;
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * error code
+ */
UWORD32 u4_error_code;
- /* no of display buffer sets required by codec */
+
+ /**
+ * no of display buffer sets required by codec
+ */
UWORD32 u4_num_disp_bufs;
- /* no of input buffers required for codec */
+
+ /**
+ * no of input buffers required for codec
+ */
UWORD32 u4_min_num_in_bufs;
- /* no of output buffers required for codec */
+
+ /**
+ * no of output buffers required for codec
+ */
UWORD32 u4_min_num_out_bufs;
- /* sizes of each input buffer required */
+
+ /**
+ * sizes of each input buffer required
+ */
UWORD32 u4_min_in_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
- /* sizes of each output buffer required */
+
+ /**
+ * sizes of each output buffer required
+ */
UWORD32 u4_min_out_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
}ivd_ctl_getbufinfo_op_t;
@@ -528,31 +864,88 @@ typedef struct{
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * sub_cmd
+ */
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
}ivd_ctl_getstatus_ip_t;
typedef struct{
+
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * error code
+ */
UWORD32 u4_error_code;
- /* no of display buffer sets required by codec */
+
+ /**
+ * no of display buffer sets required by codec
+ */
UWORD32 u4_num_disp_bufs;
+
+ /**
+ * u4_pic_ht
+ */
UWORD32 u4_pic_ht;
+
+ /**
+ * u4_pic_wd
+ */
UWORD32 u4_pic_wd;
+
+ /**
+ * frame_rate
+ */
UWORD32 u4_frame_rate;
+
+ /**
+ * u4_bit_rate
+ */
UWORD32 u4_bit_rate;
+
+ /**
+ * content_type
+ */
IV_CONTENT_TYPE_T e_content_type;
+
+ /**
+ * output_chroma_format
+ */
IV_COLOR_FORMAT_T e_output_chroma_format;
- /* no of input buffers required for codec */
+
+ /**
+ * no of input buffers required for codec
+ */
UWORD32 u4_min_num_in_bufs;
- /* no of output buffers required for codec */
+
+ /**
+ * no of output buffers required for codec
+ */
UWORD32 u4_min_num_out_bufs;
- /* sizes of each input buffer required */
+
+ /**
+ * sizes of each input buffer required
+ */
UWORD32 u4_min_in_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
- /* sizes of each output buffer required */
+
+ /**
+ * sizes of each output buffer required
+ */
UWORD32 u4_min_out_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
}ivd_ctl_getstatus_op_t;
@@ -566,18 +959,42 @@ typedef struct{
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * cmd
+ */
IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * sub_cmd
+ */
IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
+
+ /**
+ * pv_version_buffer
+ */
void *pv_version_buffer;
+
+ /**
+ * version_buffer_size
+ */
UWORD32 u4_version_buffer_size;
}ivd_ctl_getversioninfo_ip_t;
typedef struct{
- /* u4_size of the structure */
+ /**
+ * u4_size of the structure
+ */
UWORD32 u4_size;
+
+ /**
+ * error code
+ */
UWORD32 u4_error_code;
}ivd_ctl_getversioninfo_op_t;
diff --git a/test/decoder/main.c b/test/decoder/main.c
index 35454a4..89a54c5 100644
--- a/test/decoder/main.c
+++ b/test/decoder/main.c
@@ -64,7 +64,9 @@
#include <sys/time.h>
#endif
-
+//#define ADAPTIVE_TEST
+#define ADAPTIVE_MAX_WD 1920
+#define ADAPTIVE_MAX_HT 1088
#define ALIGN8(x) ((((x) + 7) >> 3) << 3)
#define NUM_DISPLAY_BUFFERS 4
@@ -211,9 +213,6 @@ typedef struct
UWORD32 display;
UWORD32 full_screen;
UWORD32 fps;
- UWORD32 max_wd;
- UWORD32 max_ht;
- UWORD32 max_level;
UWORD32 u4_strd;
@@ -268,9 +267,6 @@ typedef enum
FULLSCREEN,
FPS,
TRACE,
- MAX_WD,
- MAX_HT,
- MAX_LEVEL,
CONFIG,
DEGRADE_TYPE,
@@ -332,13 +328,6 @@ static const argument_t argument_mapping[] =
"FPS to be used for display \n" },
{"-i", "--trace", TRACE,
"Trace file\n"},
- { "--", "--max_wd", MAX_WD,
- "Maximum width (Default: 2560) \n" },
- { "--", "--max_ht", MAX_HT,
- "Maximum height (Default: 1600)\n" },
-
- { "--", "--max_level", MAX_LEVEL,
- "Maximum Decoder Level (Default: 50)\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" },
@@ -353,11 +342,6 @@ static const argument_t argument_mapping[] =
};
#define PEAK_WINDOW_SIZE 8
-#define MAX_FRAME_WIDTH 2560
-#define MAX_FRAME_HEIGHT 1600
-#define MAX_LEVEL_SUPPORTED 50
-#define MAX_REF_FRAMES 16
-#define MAX_REORDER_FRAMES 16
#define DEFAULT_SHARE_DISPLAY_BUF 0
#define STRIDE 0
#define DEFAULT_NUM_CORES 1
@@ -431,39 +415,45 @@ int raise(int a)
/* */
/*****************************************************************************/
-void * ih264a_aligned_malloc(WORD32 alignment, WORD32 i4_size)
+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_buf)
+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(WORD32 alignment, WORD32 i4_size)
+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_buf)
+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(WORD32 alignment, WORD32 i4_size)
+void * ih264a_aligned_malloc(void *pv_ctxt, WORD32 alignment, WORD32 i4_size)
{
+ (void)pv_ctxt;
return memalign(alignment, i4_size);
}
-void ih264a_aligned_free(void *pv_buf)
+void ih264a_aligned_free(void *pv_ctxt, void *pv_buf)
{
+ (void)pv_ctxt;
free(pv_buf);
return;
}
@@ -1252,15 +1242,6 @@ void parse_argument(vid_dec_ctx_t *ps_app_ctx, CHAR *argument, CHAR *value)
if(ps_app_ctx->fps <= 0)
ps_app_ctx->fps = DEFAULT_FPS;
break;
- case MAX_WD:
- sscanf(value, "%d", &ps_app_ctx->max_wd);
- break;
- case MAX_HT:
- sscanf(value, "%d", &ps_app_ctx->max_ht);
- break;
- case MAX_LEVEL:
- sscanf(value, "%d", &ps_app_ctx->max_level);
- break;
case ARCH:
if((strcmp(value, "ARM_NONEON")) == 0)
ps_app_ctx->e_arch = ARCH_ARM_NONEON;
@@ -1558,8 +1539,8 @@ WORD32 display_thread(void *pv_ctx)
ps_app_ctx->u4_pic_ht,
ps_app_ctx->i4_screen_wd,
ps_app_ctx->i4_screen_ht,
- ps_app_ctx->max_wd,
- ps_app_ctx->max_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);
@@ -1813,12 +1794,10 @@ int main(WORD32 argc, CHAR *argv[])
ivd_out_bufdesc_t *ps_out_buf;
UWORD32 u4_num_bytes_dec = 0;
UWORD32 file_pos = 0;
- IV_API_CALL_STATUS_T e_dec_status;
+
UWORD32 u4_ip_frm_ts = 0, u4_op_frm_ts = 0;
WORD32 u4_bytes_remaining = 0;
- void *pv_mem_rec_location;
- UWORD32 u4_num_mem_recs;
UWORD32 i;
UWORD32 u4_ip_buf_len;
UWORD32 frm_cnt = 0;
@@ -1910,9 +1889,6 @@ int main(WORD32 argc, CHAR *argv[])
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.max_wd = 0;
- s_app_ctx.max_ht = 0;
- s_app_ctx.max_level = 0;
s_app_ctx.e_arch = ARCH_ARM_A9Q;
s_app_ctx.e_soc = SOC_GENERIC;
@@ -2134,144 +2110,37 @@ int main(WORD32 argc, CHAR *argv[])
ps_out_buf = (ivd_out_bufdesc_t *)malloc(sizeof(ivd_out_bufdesc_t));
- {
- iv_num_mem_rec_ip_t s_no_of_mem_rec_query_ip;
- iv_num_mem_rec_op_t s_no_of_mem_rec_query_op;
-
- s_no_of_mem_rec_query_ip.u4_size = sizeof(s_no_of_mem_rec_query_ip);
- s_no_of_mem_rec_query_op.u4_size = sizeof(s_no_of_mem_rec_query_op);
- s_no_of_mem_rec_query_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC;
-
- /*****************************************************************************/
- /* API Call: Get Number of Mem Records */
- /*****************************************************************************/
- e_dec_status = ivd_api_function(
- NULL, (void*)&s_no_of_mem_rec_query_ip,
- (void*)&s_no_of_mem_rec_query_op);
- if(IV_SUCCESS != e_dec_status)
- {
- sprintf(ac_error_str, "Error in get mem records");
- codec_exit(ac_error_str);
- }
-
- u4_num_mem_recs = s_no_of_mem_rec_query_op.u4_num_mem_rec;
- }
-
- pv_mem_rec_location = malloc(u4_num_mem_recs * sizeof(iv_mem_rec_t));
- if(pv_mem_rec_location == NULL)
- {
- sprintf(ac_error_str, "Allocation failure for mem_rec_location");
- codec_exit(ac_error_str);
-
- }
-
- {
- ih264d_fill_mem_rec_ip_t s_fill_mem_rec_ip;
- ih264d_fill_mem_rec_op_t s_fill_mem_rec_op;
- iv_mem_rec_t *ps_mem_rec;
- UWORD32 total_size;
-
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.e_cmd =
- IV_CMD_FILL_NUM_MEM_REC;
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location =
- (iv_mem_rec_t *)pv_mem_rec_location;
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd =
- (s_app_ctx.max_wd == 0) ? MAX_FRAME_WIDTH : s_app_ctx.max_wd;
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht =
- (s_app_ctx.max_ht == 0) ? MAX_FRAME_HEIGHT : s_app_ctx.max_ht;
- s_fill_mem_rec_ip.i4_level = (s_app_ctx.max_level == 0) ? MAX_LEVEL_SUPPORTED : s_app_ctx.max_level;
- s_fill_mem_rec_ip.u4_num_ref_frames = MAX_REF_FRAMES;
- s_fill_mem_rec_ip.u4_num_reorder_frames = MAX_REORDER_FRAMES;
- s_fill_mem_rec_ip.u4_share_disp_buf = s_app_ctx.u4_share_disp_buf;
- s_fill_mem_rec_ip.e_output_format =
- (IV_COLOR_FORMAT_T)s_app_ctx.e_output_chroma_format;
- s_fill_mem_rec_ip.u4_num_extra_disp_buf = EXTRA_DISP_BUFFERS;
-
- s_fill_mem_rec_ip.s_ivd_fill_mem_rec_ip_t.u4_size =
- sizeof(ih264d_fill_mem_rec_ip_t);
- s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_size =
- sizeof(ih264d_fill_mem_rec_op_t);
-
- ps_mem_rec = (iv_mem_rec_t *)pv_mem_rec_location;
- for(i = 0; i < u4_num_mem_recs; i++)
- ps_mem_rec[i].u4_size = sizeof(iv_mem_rec_t);
-
- /*****************************************************************************/
- /* API Call: Fill Mem Records */
- /*****************************************************************************/
-
- e_dec_status = ivd_api_function(NULL,
- (void *)&s_fill_mem_rec_ip,
- (void *)&s_fill_mem_rec_op);
-
- u4_num_mem_recs =
- s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled;
-
- if(IV_SUCCESS != e_dec_status)
- {
- sprintf(ac_error_str, "Error in fill mem records: %x",s_fill_mem_rec_op.s_ivd_fill_mem_rec_op_t.u4_error_code);
- codec_exit(ac_error_str);
- }
-
- ps_mem_rec = (iv_mem_rec_t *)pv_mem_rec_location;
- total_size = 0;
- for(i = 0; i < u4_num_mem_recs; i++)
- {
- ps_mem_rec->pv_base = ih264a_aligned_malloc(ps_mem_rec->u4_mem_alignment,
- ps_mem_rec->u4_mem_size);
- if(ps_mem_rec->pv_base == NULL)
- {
- sprintf(ac_error_str,
- "\nAllocation failure for mem record id %d i4_size %d\n",
- i, ps_mem_rec->u4_mem_size);
- codec_exit(ac_error_str);
-
- }
- total_size += ps_mem_rec->u4_mem_size;
- ps_mem_rec++;
- }
- printf("\nTotal memory for codec %d\n", total_size);
- }
/*****************************************************************************/
/* API Call: Initialize the Decoder */
/*****************************************************************************/
{
- ih264d_init_ip_t s_init_ip;
- ih264d_init_op_t s_init_op;
+ ih264d_create_ip_t s_create_ip;
+ ih264d_create_op_t s_create_op;
void *fxns = &ivd_api_function;
- iv_mem_rec_t *mem_tab;
-
- mem_tab = (iv_mem_rec_t*)pv_mem_rec_location;
- s_init_ip.s_ivd_init_ip_t.e_cmd = (IVD_API_COMMAND_TYPE_T)IV_CMD_INIT;
- s_init_ip.s_ivd_init_ip_t.pv_mem_rec_location = mem_tab;
- s_init_ip.s_ivd_init_ip_t.u4_frm_max_wd = (s_app_ctx.max_wd == 0) ? MAX_FRAME_WIDTH : s_app_ctx.max_wd;
- s_init_ip.s_ivd_init_ip_t.u4_frm_max_ht = (s_app_ctx.max_ht == 0) ? MAX_FRAME_HEIGHT : s_app_ctx.max_ht;
- s_init_ip.i4_level = (s_app_ctx.max_level == 0) ? MAX_LEVEL_SUPPORTED : s_app_ctx.max_level;
- s_init_ip.u4_num_ref_frames = MAX_REF_FRAMES;
- s_init_ip.u4_num_reorder_frames = MAX_REORDER_FRAMES;
- s_init_ip.u4_share_disp_buf = s_app_ctx.u4_share_disp_buf;
- s_init_ip.u4_num_extra_disp_buf = EXTRA_DISP_BUFFERS;
- s_init_ip.s_ivd_init_ip_t.u4_num_mem_rec = u4_num_mem_recs;
- s_init_ip.s_ivd_init_ip_t.e_output_format =
- (IV_COLOR_FORMAT_T)s_app_ctx.e_output_chroma_format;
- s_init_ip.s_ivd_init_ip_t.u4_size = sizeof(ih264d_init_ip_t);
- s_init_op.s_ivd_init_op_t.u4_size = sizeof(ih264d_init_op_t);
-
- codec_obj = (iv_obj_t*)mem_tab[0].pv_base;
- codec_obj->pv_fxns = fxns;
- codec_obj->u4_size = sizeof(iv_obj_t);
- s_app_ctx.cocodec_obj = codec_obj;
+ 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);
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_init_ip,
- (void *)&s_init_op);
+
+
+ ret = ivd_api_function(NULL, (void *)&s_create_ip,
+ (void *)&s_create_op);
if(ret != IV_SUCCESS)
{
- sprintf(ac_error_str, "Error in Init %8x\n",
- s_init_op.s_ivd_init_op_t.u4_error_code);
+ 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 */
@@ -2286,7 +2155,7 @@ int main(WORD32 argc, CHAR *argv[])
s_ctl_ip.u4_disp_wd = s_app_ctx.get_stride();
s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE;
- s_ctl_ip.e_frm_out_mode = IVD_DECODE_FRAME_OUT;
+ s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
s_ctl_ip.e_vid_dec_mode = IVD_DECODE_HEADER;
s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
@@ -2304,128 +2173,7 @@ int main(WORD32 argc, CHAR *argv[])
}
- /*****************************************************************************/
- /* Input and output buffer allocation */
- /*****************************************************************************/
- {
-
- 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 input buffer */
- u4_ip_buf_len = s_ctl_op.u4_min_in_buf_size[0];
- 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))
- {
- 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;
- }
}
}
@@ -2485,37 +2233,54 @@ int main(WORD32 argc, CHAR *argv[])
/* Decode header to get width and height and buffer sizes */
/*****************************************************************************/
{
-
- ivd_ctl_set_config_ip_t s_ctl_ip;
- ivd_ctl_set_config_op_t s_ctl_op;
-
ivd_video_decode_ip_t s_video_decode_ip;
ivd_video_decode_op_t s_video_decode_op;
- s_ctl_ip.u4_disp_wd = STRIDE;
- if(1 == s_app_ctx.display)
- s_ctl_ip.u4_disp_wd = s_app_ctx.get_stride();
- s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE;
- s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
- s_ctl_ip.e_vid_dec_mode = IVD_DECODE_HEADER;
- s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
- s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
- s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t);
- ret = ivd_api_function((iv_obj_t*)codec_obj, (void *)&s_ctl_ip,
- (void *)&s_ctl_op);
- if(ret != IV_SUCCESS)
+ {
+ ivd_ctl_set_config_ip_t s_ctl_ip;
+ ivd_ctl_set_config_op_t s_ctl_op;
+
+
+ s_ctl_ip.u4_disp_wd = STRIDE;
+ if(1 == s_app_ctx.display)
+ s_ctl_ip.u4_disp_wd = s_app_ctx.get_stride();
+
+ s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE;
+ s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT;
+ s_ctl_ip.e_vid_dec_mode = IVD_DECODE_HEADER;
+ s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS;
+ s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t);
+ s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_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,
+ "\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,
- "\nError in setting the codec in header decode mode");
+ "\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);
@@ -2569,10 +2334,181 @@ int main(WORD32 argc, CHAR *argv[])
s_app_ctx.u4_pic_wd = s_video_decode_op.u4_pic_wd;
s_app_ctx.u4_pic_ht = s_video_decode_op.u4_pic_ht;
+ /* Allocate input buffer */
+ u4_ip_buf_len = 2048 * 2048;
+ 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)
@@ -3034,7 +2970,6 @@ int main(WORD32 argc, CHAR *argv[])
}
}
-
}
@@ -3158,39 +3093,21 @@ int main(WORD32 argc, CHAR *argv[])
}
{
- iv_retrieve_mem_rec_ip_t s_retrieve_dec_ip;
- iv_retrieve_mem_rec_op_t s_retrieve_dec_op;
- s_retrieve_dec_ip.pv_mem_rec_location = (iv_mem_rec_t *)pv_mem_rec_location;
+ ivd_delete_ip_t s_delete_dec_ip;
+ ivd_delete_op_t s_delete_dec_op;
- s_retrieve_dec_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC;
- s_retrieve_dec_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t);
- s_retrieve_dec_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t);
+ 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_retrieve_dec_ip,
- (void *)&s_retrieve_dec_op);
+ 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 Retrieve Memrec");
+ sprintf(ac_error_str, "Error in Codec delete");
codec_exit(ac_error_str);
}
-
- {
- iv_mem_rec_t *ps_mem_rec;
- UWORD16 u2_i;
-
- u4_num_mem_recs = s_retrieve_dec_op.u4_num_mem_rec_filled;
-
- ps_mem_rec = s_retrieve_dec_ip.pv_mem_rec_location;
-
- for(u2_i = 0; u2_i < u4_num_mem_recs; u2_i++)
- {
- ih264a_aligned_free(ps_mem_rec->pv_base);
- ps_mem_rec++;
- }
- free(s_retrieve_dec_ip.pv_mem_rec_location);
- }
-
}
/***********************************************************************/
/* Close all the files and free all the memory */