Added support for exporting seq header, seq extn and seq display extn info

Bug: 27442922

Change-Id: Idebc69a2bac22c61ec06176e563c93f80d103eee
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 @@
     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 @@
     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 @@
     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 @@
                                                        (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 @@
 
                         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 @@
     }
     */
 
-    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 @@
     /* 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 @@
                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);
+        }
+    }
 
 
     /*************************************************************************/