summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2016-04-25 12:08:37 +0530
committerHarish Mahendrakar <harish.mahendrakar@ittiam.com>2016-06-16 03:30:20 +0000
commit77985389f0ee19450c67284e2ac6263b184bdfb0 (patch)
tree84639d1c732bbb67b0728b8a2a279bc46a81c9ad
parent109dd2989fd5595bec81af5d2e625fc2bfee93a8 (diff)
downloadlibmpeg2-nougat-mr1-wear-release.tar.gz
Bug: 27442922 Change-Id: Idebc69a2bac22c61ec06176e563c93f80d103eee
-rw-r--r--decoder/impeg2d.h84
-rw-r--r--decoder/impeg2d_api_main.c73
-rw-r--r--decoder/impeg2d_dec_hdr.c10
-rw-r--r--decoder/impeg2d_structs.h5
-rw-r--r--test/decoder/main.c24
5 files changed, 193 insertions, 3 deletions
diff --git a/decoder/impeg2d.h b/decoder/impeg2d.h
index 5567733..97094dc 100644
--- a/decoder/impeg2d.h
+++ b/decoder/impeg2d.h
@@ -167,6 +167,9 @@ typedef enum
IMPEG2D_CMD_CTL_GET_BUFFER_DIMENSIONS = IVD_CMD_CTL_CODEC_SUBCMD_START
+ 0x100,
+ /** Get Seq header/seq header extension info */
+ IMPEG2D_CMD_CTL_GET_SEQ_INFO = IVD_CMD_CTL_CODEC_SUBCMD_START + 0x101,
+
} IMPEG2D_CMD_CTL_SUB_CMDS;
/*****************************************************************************/
@@ -509,6 +512,87 @@ typedef struct
UWORD32 u4_buffer_ht[3];
} impeg2d_ctl_get_frame_dimensions_op_t;
+typedef struct
+{
+ /**
+ * size
+ */
+ UWORD32 u4_size;
+
+ /**
+ * cmd
+ */
+ IVD_API_COMMAND_TYPE_T e_cmd;
+
+ /**
+ * sub cmd
+ */
+ IVD_CONTROL_API_COMMAND_TYPE_T e_sub_cmd;
+} impeg2d_ctl_get_seq_info_ip_t;
+
+typedef struct
+{
+ /**
+ * size
+ */
+ UWORD32 u4_size;
+
+ /**
+ * error_code
+ */
+ UWORD32 u4_error_code;
+
+ /**
+ * aspect_ratio_information
+ */
+ UWORD8 u1_aspect_ratio_information;
+
+ /**
+ * frame_rate_code
+ */
+ UWORD8 u1_frame_rate_code;
+
+ /**
+ * frame_rate_extension_n
+ */
+ UWORD8 u1_frame_rate_extension_n;
+
+ /**
+ * frame_rate_extension_d
+ */
+ UWORD8 u1_frame_rate_extension_d;
+
+ /**
+ * video_format
+ */
+ UWORD8 u1_video_format;
+
+ /**
+ * colour_primaries
+ */
+ UWORD8 u1_colour_primaries;
+
+ /**
+ * transfer_characteristics
+ */
+ UWORD8 u1_transfer_characteristics;
+
+ /**
+ * matrix_coefficients
+ */
+ UWORD8 u1_matrix_coefficients;
+
+ /**
+ * display_horizontal_size
+ */
+ UWORD16 u2_display_horizontal_size;
+
+ /**
+ * display_vertical_size
+ */
+ UWORD16 u2_display_vertical_size;
+
+} impeg2d_ctl_get_seq_info_op_t;
#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif
diff --git a/decoder/impeg2d_api_main.c b/decoder/impeg2d_api_main.c
index 1bae457..5a6b36b 100644
--- a/decoder/impeg2d_api_main.c
+++ b/decoder/impeg2d_api_main.c
@@ -296,6 +296,44 @@ IV_API_CALL_STATUS_T impeg2d_api_set_num_cores(iv_obj_t *ps_dechdl,
return IV_SUCCESS;
}
+IV_API_CALL_STATUS_T impeg2d_api_get_seq_info(iv_obj_t *ps_dechdl,
+ void *pv_api_ip,
+ void *pv_api_op)
+{
+ impeg2d_ctl_get_seq_info_ip_t *ps_ip;
+ impeg2d_ctl_get_seq_info_op_t *ps_op;
+ dec_state_t *ps_codec;
+ dec_state_multi_core_t *ps_dec_state_multi_core;
+
+ ps_ip = (impeg2d_ctl_get_seq_info_ip_t *)pv_api_ip;
+ ps_op = (impeg2d_ctl_get_seq_info_op_t *)pv_api_op;
+
+ ps_dec_state_multi_core = (dec_state_multi_core_t *) (ps_dechdl->pv_codec_handle);
+ ps_codec = ps_dec_state_multi_core->ps_dec_state[0];
+ UNUSED(ps_ip);
+ if(ps_codec->u2_header_done == 1)
+ {
+ ps_op->u1_aspect_ratio_information = ps_codec->u2_aspect_ratio_info;
+ ps_op->u1_frame_rate_code = ps_codec->u2_frame_rate_code;
+ ps_op->u1_frame_rate_extension_n = ps_codec->u2_frame_rate_extension_n;
+ ps_op->u1_frame_rate_extension_d = ps_codec->u2_frame_rate_extension_d;
+ ps_op->u1_video_format = ps_codec->u1_video_format;
+ ps_op->u1_colour_primaries = ps_codec->u1_colour_primaries;
+ ps_op->u1_transfer_characteristics = ps_codec->u1_transfer_characteristics;
+ ps_op->u1_matrix_coefficients = ps_codec->u1_matrix_coefficients;
+ ps_op->u2_display_horizontal_size = ps_codec->u2_display_horizontal_size;
+ ps_op->u2_display_vertical_size = ps_codec->u2_display_vertical_size;
+ ps_op->u4_error_code = IV_SUCCESS;
+ }
+ else
+ {
+ ps_op->u4_error_code = IV_FAIL;
+ }
+
+
+ return IV_SUCCESS;
+}
+
/**
*******************************************************************************
*
@@ -2015,6 +2053,12 @@ IV_API_CALL_STATUS_T impeg2d_api_ctl(iv_obj_t *ps_dechdl,
(void *)pv_api_op);
break;
+ case IMPEG2D_CMD_CTL_GET_SEQ_INFO:
+ u4_error_code = impeg2d_api_get_seq_info(ps_dechdl,
+ (void *)pv_api_ip,
+ (void *)pv_api_op);
+ break;
+
case IMPEG2D_CMD_CTL_SET_PROCESSOR:
u4_error_code = impeg2d_set_processor(ps_dechdl, (void *)pv_api_ip,
(void *)pv_api_op);
@@ -2874,7 +2918,36 @@ IV_API_CALL_STATUS_T impeg2d_api_check_struct_sanity(iv_obj_t *ps_handle,
break;
}
+ case IMPEG2D_CMD_CTL_GET_SEQ_INFO:
+ {
+ impeg2d_ctl_get_seq_info_ip_t *ps_ip;
+ impeg2d_ctl_get_seq_info_op_t *ps_op;
+
+ ps_ip =
+ (impeg2d_ctl_get_seq_info_ip_t *)pv_api_ip;
+ ps_op =
+ (impeg2d_ctl_get_seq_info_op_t *)pv_api_op;
+
+ if(ps_ip->u4_size
+ != sizeof(impeg2d_ctl_get_seq_info_ip_t))
+ {
+ ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
+ ps_op->u4_error_code |=
+ IVD_IP_API_STRUCT_SIZE_INCORRECT;
+ return IV_FAIL;
+ }
+ if(ps_op->u4_size
+ != sizeof(impeg2d_ctl_get_seq_info_op_t))
+ {
+ ps_op->u4_error_code |= 1 << IVD_UNSUPPORTEDPARAM;
+ ps_op->u4_error_code |=
+ IVD_OP_API_STRUCT_SIZE_INCORRECT;
+ return IV_FAIL;
+ }
+
+ break;
+ }
case IMPEG2D_CMD_CTL_SET_NUM_CORES:
{
impeg2d_ctl_set_num_cores_ip_t *ps_ip;
diff --git a/decoder/impeg2d_dec_hdr.c b/decoder/impeg2d_dec_hdr.c
index e353e98..bfaf895 100644
--- a/decoder/impeg2d_dec_hdr.c
+++ b/decoder/impeg2d_dec_hdr.c
@@ -376,10 +376,14 @@ void impeg2d_dec_seq_disp_ext(dec_state_t *ps_dec)
}
*/
- impeg2d_bit_stream_get(ps_stream,7);
- if (impeg2d_bit_stream_get_bit(ps_stream) == 1)
+ impeg2d_bit_stream_get(ps_stream, 4);
+ ps_dec->u1_video_format = impeg2d_bit_stream_get(ps_stream, 3);
+ ps_dec->u1_colour_description = impeg2d_bit_stream_get(ps_stream, 1);
+ if(ps_dec->u1_colour_description)
{
- impeg2d_bit_stream_get(ps_stream,24);
+ ps_dec->u1_colour_primaries = impeg2d_bit_stream_get(ps_stream, 8);
+ ps_dec->u1_transfer_characteristics = impeg2d_bit_stream_get(ps_stream, 8);
+ ps_dec->u1_matrix_coefficients = impeg2d_bit_stream_get(ps_stream, 8);
}
/* display_horizontal_size and display_vertical_size */
diff --git a/decoder/impeg2d_structs.h b/decoder/impeg2d_structs.h
index 743b043..b8fc3b5 100644
--- a/decoder/impeg2d_structs.h
+++ b/decoder/impeg2d_structs.h
@@ -248,6 +248,11 @@ typedef struct dec_state_struct_t
/* Members related to display dimensions of bitstream */
/* The size values may not be returned right now. But they are read */
/* and can be returned if there is a requirement. */
+ UWORD8 u1_video_format;
+ UWORD8 u1_colour_description;
+ UWORD8 u1_colour_primaries;
+ UWORD8 u1_transfer_characteristics;
+ UWORD8 u1_matrix_coefficients;
UWORD16 u2_display_horizontal_size;
UWORD16 u2_display_vertical_size;
UWORD16 u2_aspect_ratio_info;
diff --git a/test/decoder/main.c b/test/decoder/main.c
index c344ec0..7a6db46 100644
--- a/test/decoder/main.c
+++ b/test/decoder/main.c
@@ -2598,6 +2598,30 @@ int main(WORD32 argc, CHAR *argv[])
s_ctl_get_frame_dimensions_op.u4_y_offset[0]);
*/
}
+ /*************************************************************************/
+ /* Get Sequence Header/Seq Extn/Seq display extension info */
+ /*************************************************************************/
+ {
+
+ impeg2d_ctl_get_seq_info_ip_t s_ctl_get_seq_info_ip;
+ impeg2d_ctl_get_seq_info_op_t s_ctl_get_seq_info_op;
+
+ s_ctl_get_seq_info_ip.e_cmd = IVD_CMD_VIDEO_CTL;
+ s_ctl_get_seq_info_ip.e_sub_cmd =
+ (IVD_CONTROL_API_COMMAND_TYPE_T)IMPEG2D_CMD_CTL_GET_SEQ_INFO;
+ s_ctl_get_seq_info_ip.u4_size =
+ sizeof(impeg2d_ctl_get_seq_info_ip_t);
+ s_ctl_get_seq_info_op.u4_size =
+ sizeof(impeg2d_ctl_get_seq_info_op_t);
+
+ ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_get_seq_info_ip,
+ (void *)&s_ctl_get_seq_info_op);
+ if(IV_SUCCESS != ret)
+ {
+ sprintf(ac_error_str, "Error in Get Sequence Info");
+ codec_exit(ac_error_str);
+ }
+ }
/*************************************************************************/