[automerger] Adding Check For Number of Skip MBs am: 414cd5db73 am: 5da13fdeb2 am: 7b162d4405 am: c03b3f3f0c am: 7dd36bd482

Change-Id: Ib99f72f9068cbc1d93de273115455b8d2f170fd7
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 e4f3c1c..cd549e4 100644
--- a/decoder/impeg2d_api_main.c
+++ b/decoder/impeg2d_api_main.c
@@ -328,6 +328,55 @@
     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;
+        if(ps_codec->u1_seq_disp_extn_present == 1)
+        {
+            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;
+        }
+        else
+        {
+            ps_op->u1_video_format = 5;
+            ps_op->u1_colour_primaries = 2;
+            ps_op->u1_transfer_characteristics = 2;
+            ps_op->u1_matrix_coefficients = 2;
+            ps_op->u2_display_horizontal_size = ps_codec->u2_horizontal_size;
+            ps_op->u2_display_vertical_size = ps_codec->u2_vertical_size;
+        }
+        ps_op->u4_error_code = IV_SUCCESS;
+        return IV_SUCCESS;
+    }
+    else
+    {
+        ps_op->u4_error_code = IV_FAIL;
+        return IV_FAIL;
+    }
+}
+
 /**
 *******************************************************************************
 *
@@ -2113,6 +2162,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);
@@ -2972,7 +3027,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 3dff8c2..6bb0a85 100644
--- a/decoder/impeg2d_dec_hdr.c
+++ b/decoder/impeg2d_dec_hdr.c
@@ -421,10 +421,17 @@
     }
     */
 
-    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);
+    ps_dec->u1_colour_primaries = 2;
+    ps_dec->u1_transfer_characteristics = 2;
+    ps_dec->u1_matrix_coefficients = 2;
+    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 */
@@ -432,6 +439,7 @@
     GET_MARKER_BIT(ps_dec,ps_stream);
     ps_dec->u2_display_vertical_size   = impeg2d_bit_stream_get(ps_stream,14);
 
+    ps_dec->u1_seq_disp_extn_present = 1;
     impeg2d_next_start_code(ps_dec);
 }
 
diff --git a/decoder/impeg2d_structs.h b/decoder/impeg2d_structs.h
index 9d0c756..48fdd13 100644
--- a/decoder/impeg2d_structs.h
+++ b/decoder/impeg2d_structs.h
@@ -249,6 +249,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;
@@ -384,6 +389,8 @@
     /** Buffer used after deinterlacer for format conversion */
     UWORD8          *pu1_deint_fmt_buf;
 
+    /** Flag to indicate if Seq Display Extn is present */
+    UWORD8          u1_seq_disp_extn_present;
 }dec_state_t;
 
 
diff --git a/test/decoder/main.c b/test/decoder/main.c
index e6eb1ef..6229f50 100644
--- a/test/decoder/main.c
+++ b/test/decoder/main.c
@@ -2599,6 +2599,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);
+        }
+    }
 
 
     /*************************************************************************/