Fixed few issues seen in CTS tests

Buffer managers are reset to init state in reset()

Return picture type of picture being output instead of picture decoded

Read start code only if input bitstream has enough bytes

Change-Id: Ic158d9dbff6d6b5295173b6ff2a4c6d6da66115f
diff --git a/common/arm/impeg2_mem_func.s b/common/arm/impeg2_mem_func.s
old mode 100755
new mode 100644
diff --git a/common/impeg2_globals.h b/common/impeg2_globals.h
old mode 100755
new mode 100644
diff --git a/common/impeg2_inter_pred.h b/common/impeg2_inter_pred.h
index be3b0e5..ddd6928 100644
--- a/common/impeg2_inter_pred.h
+++ b/common/impeg2_inter_pred.h
@@ -53,6 +53,9 @@
      */
     WORD32 i4_buf_id;
 
+    /* To store the buffer's picture type */
+    e_pic_type_t e_pic_type;
+
 }pic_buf_t;
 
 typedef void pf_copy_mb_t (yuv_buf_t *src_buf,
diff --git a/common/x86/impeg2_idct_recon_sse42_intr.c b/common/x86/impeg2_idct_recon_sse42_intr.c
old mode 100755
new mode 100644
diff --git a/decoder/arm/impeg2d_function_selector.c b/decoder/arm/impeg2d_function_selector.c
index bc6a688..a344e59 100644
--- a/decoder/arm/impeg2d_function_selector.c
+++ b/decoder/arm/impeg2d_function_selector.c
@@ -65,12 +65,7 @@
 #include "impeg2d_pic_proc.h"
 #include "impeg2d_debug.h"
 #include "impeg2d_mc.h"
-
-void impeg2d_init_function_ptr_generic(void *pv_codec);
-void impeg2d_init_function_ptr_a9q(void *pv_codec);
-#ifdef ARMV8
-void impeg2d_init_function_ptr_av8(void *pv_codec);
-#endif /* ARMV8 */
+#include "impeg2d_function_selector.h"
 
 void impeg2d_init_function_ptr(void *pv_codec)
 {
diff --git a/decoder/impeg2d_api_main.c b/decoder/impeg2d_api_main.c
old mode 100755
new mode 100644
index 451eb93..a96afd5
--- a/decoder/impeg2d_api_main.c
+++ b/decoder/impeg2d_api_main.c
@@ -896,6 +896,20 @@
 
     if(ps_dec_state_multi_core != NULL)
     {
+        if(ps_dec_state->aps_ref_pics[1] != NULL)
+            impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[1]->i4_buf_id, BUF_MGR_REF);
+        if(ps_dec_state->aps_ref_pics[0] != NULL)
+            impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF);
+        while(1)
+        {
+            pic_buf_t *ps_disp_pic = impeg2_disp_mgr_get(&ps_dec_state->s_disp_mgr, &ps_dec_state->i4_disp_buf_id);
+            if(NULL == ps_disp_pic)
+                break;
+            if(0 == ps_dec_state->u4_share_disp_buf)
+                impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_disp_pic->i4_buf_id, BUF_MGR_DISP);
+
+        }
+
         for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++)
         {
 
@@ -908,6 +922,8 @@
             ps_dec_state->u2_header_done    = 0;  /* Header decoding not done */
             ps_dec_state->u4_frm_buf_stride = 0;
             ps_dec_state->u2_is_mpeg2       = 0;
+            ps_dec_state->aps_ref_pics[0] = NULL;
+            ps_dec_state->aps_ref_pics[1] = NULL;
         }
     }
     else
@@ -3138,6 +3154,11 @@
 
             ps_dec_op->s_ivd_video_decode_op_t.u4_progressive_frame_flag           = IV_PROGRESSIVE;
 
+            if (0 == ps_dec_state->u4_frm_buf_stride)
+            {
+                ps_dec_state->u4_frm_buf_stride = ALIGN16(ps_dec_state->u2_horizontal_size);
+            }
+
             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_wd = ps_dec_state->u2_horizontal_size;
             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_strd = ps_dec_state->u4_frm_buf_stride;
             ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_ht = ps_dec_state->u2_vertical_size;
@@ -3181,36 +3202,41 @@
                 if (IVD_ERROR_NONE ==
                         ps_dec_op->s_ivd_video_decode_op_t.u4_error_code)
                 {
-                    if(ps_dec_state->ps_disp_pic)
-                    ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 1;
-                    else
-                    ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0;
                     if(ps_dec_state->u1_first_frame_done == 0)
                     {
                         ps_dec_state->u1_first_frame_done = 1;
                     }
 
-                    switch(ps_dec_state->e_pic_type)
+                    if(ps_dec_state->ps_disp_pic)
                     {
-                        case I_PIC :
-                        ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
-                        break;
+                        ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 1;
+                        switch(ps_dec_state->ps_disp_pic->e_pic_type)
+                        {
+                            case I_PIC :
+                            ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
+                            break;
 
-                        case P_PIC:
-                        ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_P_FRAME;
-                        break;
+                            case P_PIC:
+                            ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_P_FRAME;
+                            break;
 
-                        case B_PIC:
-                        ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_B_FRAME;
-                        break;
+                            case B_PIC:
+                            ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_B_FRAME;
+                            break;
 
-                        case D_PIC:
-                        ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
-                        break;
+                            case D_PIC:
+                            ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
+                            break;
 
-                        default :
-                        ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_FRAMETYPE_DEFAULT;
-                        break;
+                            default :
+                            ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_FRAMETYPE_DEFAULT;
+                            break;
+                        }
+                    }
+                    else
+                    {
+                        ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0;
+                        ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_NA_FRAME;
                     }
 
                     ps_dec_state->u4_num_frames_decoded++;
diff --git a/decoder/impeg2d_d_pic.c b/decoder/impeg2d_d_pic.c
index a90e16d..6fcf1f4 100644
--- a/decoder/impeg2d_d_pic.c
+++ b/decoder/impeg2d_d_pic.c
@@ -236,7 +236,7 @@
         {
             return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
         }
-        else if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+        else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
         {
             ps_dec->u2_mb_x = 0;
             ps_dec->u2_mb_y++;
diff --git a/decoder/impeg2d_dec_hdr.c b/decoder/impeg2d_dec_hdr.c
index 15e61fb..061bf04 100644
--- a/decoder/impeg2d_dec_hdr.c
+++ b/decoder/impeg2d_dec_hdr.c
@@ -1129,12 +1129,12 @@
     while(1)
     {
         WORD32 i4_is_slice;
-        u4_bits = impeg2d_bit_stream_nxt(&s_bitstrm,START_CODE_LEN);
-        if(s_bitstrm.u4_offset >= s_bitstrm.u4_max_offset)
+
+        if(s_bitstrm.u4_offset + START_CODE_LEN >= s_bitstrm.u4_max_offset)
         {
             break;
         }
-
+        u4_bits = impeg2d_bit_stream_nxt(&s_bitstrm,START_CODE_LEN);
 
         i4_row = u4_bits & 0xFF;
 
diff --git a/decoder/impeg2d_decoder.c b/decoder/impeg2d_decoder.c
old mode 100755
new mode 100644
index ae58675..7bc3253
--- a/decoder/impeg2d_decoder.c
+++ b/decoder/impeg2d_decoder.c
@@ -143,7 +143,6 @@
         ps_op->s_ivd_video_decode_op_t.u4_frame_decoded_flag = 0;
         /* MOD */
         ps_dec->u2_header_done = 1;
-        ps_dec->u2_decode_header = 0;
 
     }
 }
diff --git a/decoder/impeg2d_function_selector.h b/decoder/impeg2d_function_selector.h
new file mode 100644
index 0000000..19915b3
--- /dev/null
+++ b/decoder/impeg2d_function_selector.h
@@ -0,0 +1,75 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+
+/**
+ *******************************************************************************
+ * @file
+ *  impeg2d_function_selector.h
+ *
+ * @brief
+ *  Structure definitions used in the decoder
+ *
+ * @author
+ *  Harish
+ *
+ * @par List of Functions:
+ *
+ * @remarks
+ *  None
+ *
+ *******************************************************************************
+ */
+
+#ifndef _IMPEG2D_FUNCTION_SELECTOR_H_
+#define _IMPEG2D_FUNCTION_SELECTOR_H_
+
+#define D_ARCH_NA                   1
+#define D_ARCH_ARM_NONEON           2
+#define D_ARCH_ARM_A9Q              3
+#define D_ARCH_ARM_A9A              4
+#define D_ARCH_ARM_A9               5
+#define D_ARCH_ARM_A7               6
+#define D_ARCH_ARM_A5               7
+#define D_ARCH_ARM_A15              8
+#define D_ARCH_ARM_NEONINTR         9
+#define D_ARCH_ARMV8_GENERIC        10
+#define D_ARCH_X86_GENERIC          11
+#define D_ARCH_X86_SSSE3            12
+#define D_ARCH_X86_SSE42            13
+#define D_ARCH_X86_AVX2             14
+#define D_ARCH_MIPS_GENERIC         15
+#define D_ARCH_MIPS_32              16
+
+void impeg2d_init_arch(void *ps_codec);
+
+void impeg2d_init_function_ptr(void *ps_codec);
+
+void impeg2d_init_function_ptr_generic(void *ps_codec);
+void impeg2d_init_function_ptr_ssse3(void *ps_codec);
+void impeg2d_init_function_ptr_sse42(void *ps_codec);
+
+#ifndef DISABLE_AVX2
+void impeg2d_init_function_ptr_avx2(void *ps_codec);
+#endif
+
+void impeg2d_init_function_ptr_a9q(void *ps_codec);
+void impeg2d_init_function_ptr_av8(void *ps_codec);
+
+#endif /* _IMPEG2D_FUNCTION_SELECTOR_H_ */
diff --git a/decoder/impeg2d_i_pic.c b/decoder/impeg2d_i_pic.c
index 1b45350..2e20983 100644
--- a/decoder/impeg2d_i_pic.c
+++ b/decoder/impeg2d_i_pic.c
@@ -316,7 +316,7 @@
         {
             return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
         }
-        else if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+        else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
         {
             ps_dec->u2_mb_x = 0;
             ps_dec->u2_mb_y++;
diff --git a/decoder/impeg2d_mc.c b/decoder/impeg2d_mc.c
index da13a8c..79c5ef6 100644
--- a/decoder/impeg2d_mc.c
+++ b/decoder/impeg2d_mc.c
@@ -591,7 +591,7 @@
         ps_dec->u2_mb_x++;
         ps_dec->u2_num_mbs_left--;
 
-        if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+        if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
         {
             ps_dec->u2_mb_x = 0;
             ps_dec->u2_mb_y++;
@@ -704,7 +704,7 @@
         ps_dec->u2_mb_x++;
         ps_dec->u2_num_mbs_left--;
 
-        if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+        if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
         {
             ps_dec->u2_mb_x = 0;
             ps_dec->u2_mb_y++;
diff --git a/decoder/impeg2d_pic_proc.c b/decoder/impeg2d_pic_proc.c
old mode 100755
new mode 100644
index 3dececb..e79e87a
--- a/decoder/impeg2d_pic_proc.c
+++ b/decoder/impeg2d_pic_proc.c
@@ -367,6 +367,7 @@
             impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF);
 
             ps_pic_buf->u4_ts = ps_dec->u4_inp_ts;
+            ps_pic_buf->e_pic_type = ps_dec->e_pic_type;
             ps_dec->ps_cur_pic = ps_pic_buf;
             ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y;
             ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u;
@@ -407,6 +408,7 @@
         impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF);
 
         ps_pic_buf->u4_ts = ps_dec->u4_inp_ts;
+        ps_pic_buf->e_pic_type = ps_dec->e_pic_type;
         ps_dec->ps_cur_pic = ps_pic_buf;
         ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y;
         ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u;
diff --git a/decoder/impeg2d_pnb_pic.c b/decoder/impeg2d_pnb_pic.c
index 036c7d1..0960c24 100644
--- a/decoder/impeg2d_pnb_pic.c
+++ b/decoder/impeg2d_pnb_pic.c
@@ -686,7 +686,7 @@
         {
             return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
         }
-        else if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+        else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
         {
             ps_dec->u2_mb_x = 0;
             ps_dec->u2_mb_y++;
diff --git a/decoder/impeg2d_structs.h b/decoder/impeg2d_structs.h
old mode 100755
new mode 100644
diff --git a/decoder/mips/impeg2d_function_selector.c b/decoder/mips/impeg2d_function_selector.c
index a72c1f9..3b2677a 100644
--- a/decoder/mips/impeg2d_function_selector.c
+++ b/decoder/mips/impeg2d_function_selector.c
@@ -65,8 +65,7 @@
 #include "impeg2d_pic_proc.h"
 #include "impeg2d_debug.h"
 #include "impeg2d_mc.h"
-
-void impeg2d_init_function_ptr_generic(void *pv_codec);
+#include "impeg2d_function_selector.h"
 
 void impeg2d_init_function_ptr(void *pv_codec)
 {
diff --git a/decoder/x86/impeg2d_function_selector.c b/decoder/x86/impeg2d_function_selector.c
old mode 100755
new mode 100644
index ddadb02..9596aef
--- a/decoder/x86/impeg2d_function_selector.c
+++ b/decoder/x86/impeg2d_function_selector.c
@@ -62,11 +62,7 @@
 #include "impeg2d_bitstream.h"
 #include "impeg2d_debug.h"
 #include "impeg2d_structs.h"
-
-void impeg2d_init_function_ptr_generic(void *pv_codec);
-void impeg2d_init_function_ptr_ssse3(void *pv_codec);
-void impeg2d_init_function_ptr_sse42(void *pv_codec);
-void impeg2d_init_function_ptr_avx2(void *pv_codec);
+#include "impeg2d_function_selector.h"
 
 void impeg2d_init_function_ptr(void *pv_codec)
 {