Adding Internal Input Buffer

Allocating a input buffer in the decoder context and copying all input
to this buffer before using. This will ensure that we do not access
memory out of bounds because of our bit read optimisations.

Bug: 72764648
Test: poc before/after
Change-Id: Ide6c58291fa1d0472a9589c95aba231d13122a19
(cherry picked from commit 1532e414898ae7c0abc44cab66681054edceb1f7)
diff --git a/decoder/impeg2d_api.h b/decoder/impeg2d_api.h
index 3fa098b..f239637 100644
--- a/decoder/impeg2d_api.h
+++ b/decoder/impeg2d_api.h
@@ -50,7 +50,7 @@
 
 
 
-#define NUM_MEM_RECORDS                 4 * MAX_THREADS + NUM_INT_FRAME_BUFFERS + 5 + 2
+#define NUM_MEM_RECORDS                 4 * MAX_THREADS + NUM_INT_FRAME_BUFFERS + 5 + 2 + 1
 
 
 #define SETBIT(a,i)   ((a) |= (1 << i))
diff --git a/decoder/impeg2d_api_main.c b/decoder/impeg2d_api_main.c
index 847c4f7..cd549e4 100644
--- a/decoder/impeg2d_api_main.c
+++ b/decoder/impeg2d_api_main.c
@@ -647,7 +647,11 @@
         }
     }
 
-
+    ps_mem_rec->u4_mem_alignment = 128;
+    ps_mem_rec->e_mem_type       = IV_EXTERNAL_CACHEABLE_PERSISTENT_MEM;
+    ps_mem_rec->u4_mem_size      = MAX_BITSTREAM_BUFFER_SIZE + MIN_BUFFER_BYTES_AT_EOS;
+    ps_mem_rec++;
+    u1_no_rec++;
 
     {
         WORD32 i4_job_queue_size;
@@ -693,6 +697,7 @@
     ps_mem_rec->u4_mem_size      = sizeof(iv_mem_rec_t) * (NUM_MEM_RECORDS);
     ps_mem_rec++;
     u1_no_rec++;
+
     ps_op->s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled = u1_no_rec;
     ps_op->s_ivd_fill_mem_rec_op_t.u4_error_code = 0;
 }
@@ -1963,6 +1968,9 @@
 
     ps_dec_state = ps_dec_state_multi_core->ps_dec_state[0];
 
+    ps_dec_state->pu1_input_buffer = ps_mem_rec->pv_base;
+    u4_num_mem_rec++;
+    ps_mem_rec++;
 
     ps_dec_state->pv_jobq_buf = ps_mem_rec->pv_base;
     ps_dec_state->i4_jobq_buf_size = ps_mem_rec->u4_mem_size;
diff --git a/decoder/impeg2d_decoder.c b/decoder/impeg2d_decoder.c
index e4ff79c..bff8c21 100644
--- a/decoder/impeg2d_decoder.c
+++ b/decoder/impeg2d_decoder.c
@@ -102,12 +102,14 @@
 
     ps_dec = (dec_state_t *)pv_dec;
     ps_op->s_ivd_video_decode_op_t.u4_error_code = 0;
-    if (u4_size >= MAX_BITSTREAM_BUFFER_SIZE)
+    if (u4_size > MAX_BITSTREAM_BUFFER_SIZE)
     {
-        u4_size = MAX_BITSTREAM_BUFFER_SIZE - MIN_BUFFER_BYTES_AT_EOS;
+        u4_size = MAX_BITSTREAM_BUFFER_SIZE;
     }
 
-    impeg2d_bit_stream_init(&(ps_dec->s_bit_stream),ps_ip->s_ivd_video_decode_ip_t.pv_stream_buffer,
+    memcpy(ps_dec->pu1_input_buffer, ps_ip->s_ivd_video_decode_ip_t.pv_stream_buffer, u4_size);
+
+    impeg2d_bit_stream_init(&(ps_dec->s_bit_stream), ps_dec->pu1_input_buffer,
         u4_size);
 
     {
@@ -194,16 +196,19 @@
     ps_op->s_ivd_video_decode_op_t.u4_num_bytes_consumed = 0;
 
     IMPEG2D_FRM_NUM_SET();
-    if (u4_size >= MAX_BITSTREAM_BUFFER_SIZE)
+    if (u4_size > MAX_BITSTREAM_BUFFER_SIZE)
     {
-        u4_size = MAX_BITSTREAM_BUFFER_SIZE - MIN_BUFFER_BYTES_AT_EOS;
+        u4_size = MAX_BITSTREAM_BUFFER_SIZE;
     }
 
-    ps_dec->pu1_inp_bits_buf = ps_ip->s_ivd_video_decode_ip_t.pv_stream_buffer;
+    memcpy(ps_dec->pu1_input_buffer, ps_ip->s_ivd_video_decode_ip_t.pv_stream_buffer, u4_size);
+
+    ps_dec->pu1_inp_bits_buf = ps_dec->pu1_input_buffer;
+
     ps_dec->u4_num_inp_bytes = u4_size;
     ps_stream  = &ps_dec->s_bit_stream;
 
-    impeg2d_bit_stream_init(ps_stream,ps_ip->s_ivd_video_decode_ip_t.pv_stream_buffer,u4_size);
+    impeg2d_bit_stream_init(ps_stream, ps_dec->pu1_input_buffer, u4_size);
 
     /* @ */ /* Updating the bufferID */
 
diff --git a/decoder/impeg2d_structs.h b/decoder/impeg2d_structs.h
index bdda8b8..48fdd13 100644
--- a/decoder/impeg2d_structs.h
+++ b/decoder/impeg2d_structs.h
@@ -342,6 +342,9 @@
     WORD32          i4_start_mb_y;
     WORD32          i4_end_mb_y;
 
+    /* Buffer to store the input stream */
+    UWORD8 *pu1_input_buffer;
+
     /**
      * Job queue buffer base
      */