summaryrefslogtreecommitdiffstats
path: root/encoder
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2015-06-09 17:48:53 +0530
committerRonghua Wu <ronghuawu@google.com>2015-06-12 18:34:16 -0700
commitcf91c87b25ad49fc7e307932754d188e3ba2a479 (patch)
tree881c74b4e114b82b5a226678e26a6caf34660ae1 /encoder
parentc75cf37283c11079d6015385453200f4710656da (diff)
downloadandroid_external_libavc-cf91c87b25ad49fc7e307932754d188e3ba2a479.tar.gz
android_external_libavc-cf91c87b25ad49fc7e307932754d188e3ba2a479.tar.bz2
android_external_libavc-cf91c87b25ad49fc7e307932754d188e3ba2a479.zip
Fixed an overread in YUV420 Semi-planar input usecase
Handled non-multiple of 16 dimensions for 420 semiplanar input Modified test code to remove alignment of width and height Bug: 21586373 Change-Id: I83ff8165364a863d577fcac81e711b07eec9c004
Diffstat (limited to 'encoder')
-rw-r--r--encoder/ih264e_api.c5
-rw-r--r--encoder/ih264e_process.c52
2 files changed, 56 insertions, 1 deletions
diff --git a/encoder/ih264e_api.c b/encoder/ih264e_api.c
index b68d6dc..8a478bb 100644
--- a/encoder/ih264e_api.c
+++ b/encoder/ih264e_api.c
@@ -3381,6 +3381,11 @@ static WORD32 ih264e_fill_num_mem_rec(void *pv_api_ip, void *pv_api_op)
* (wd * ht) for luma and (wd * ht / 2) for chroma*/
ps_mem_rec->u4_mem_size = MAX_CTXT_SETS
* ((3 * max_ht_luma * max_wd_luma) >> 1);
+ /* Allocate an extra row, since inverse transform functions for
+ * chroma access(only read, not used) few extra bytes due to
+ * interleaved input
+ */
+ ps_mem_rec->u4_mem_size += max_wd_luma;
}
DEBUG("\nMemory record Id %d = %d \n", MEM_REC_CSC, ps_mem_rec->u4_mem_size);
diff --git a/encoder/ih264e_process.c b/encoder/ih264e_process.c
index 7b39fe5..670428e 100644
--- a/encoder/ih264e_process.c
+++ b/encoder/ih264e_process.c
@@ -1052,7 +1052,21 @@ IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
/* init buffer pointers */
- ps_proc->pu1_src_buf_chroma = ps_proc->pu1_src_buf_chroma_base + (i4_mb_x * MB_SIZE) + ps_codec->s_cfg.u4_max_wd * (i4_mb_y * BLK8x8SIZE);
+ if (ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_422ILE ||
+ ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_420P ||
+ ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1))
+ {
+ if ((ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_420SP_UV) ||
+ (ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_420SP_VU))
+ ps_proc->pu1_src_buf_chroma_base = ps_codec->pu1_uv_csc_buf_base;
+
+ ps_proc->pu1_src_buf_chroma = ps_proc->pu1_src_buf_chroma_base + (i4_mb_x * MB_SIZE) + ps_codec->s_cfg.u4_max_wd * (i4_mb_y * BLK8x8SIZE);
+ }
+ else
+ {
+ ps_proc->pu1_src_buf_chroma = ps_proc->pu1_src_buf_chroma_base + (i4_mb_x * MB_SIZE) + i4_src_strd * (i4_mb_y * BLK8x8SIZE);
+ }
+
ps_proc->pu1_rec_buf_luma = ps_proc->pu1_rec_buf_luma_base + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * MB_SIZE);
ps_proc->pu1_rec_buf_chroma = ps_proc->pu1_rec_buf_chroma_base + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * BLK8x8SIZE);
ps_proc->pu1_ref_buf_luma = ps_proc->pu1_ref_buf_luma_base + (i4_mb_x * MB_SIZE) + i4_rec_strd * (i4_mb_y * MB_SIZE);
@@ -1067,6 +1081,42 @@ IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
{
case IV_YUV_420SP_UV:
case IV_YUV_420SP_VU:
+ /* In case of 420 semi-planar input, copy last few rows to intermediate
+ buffer as chroma trans functions access one extra byte due to interleaved input.
+ This data will be padded if required */
+ if (ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1))
+ {
+ WORD32 num_rows = ps_codec->s_cfg.u4_disp_ht & 0xF;
+ UWORD8 *pu1_src;
+ UWORD8 *pu1_dst;
+ WORD32 i;
+ pu1_src = (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[0] + (i4_mb_x * MB_SIZE) +
+ ps_proc->s_inp_buf.s_raw_buf.au4_strd[0] * (i4_mb_y * MB_SIZE);
+
+ pu1_dst = ps_proc->pu1_src_buf_luma;
+
+ for (i = 0; i < num_rows; i++)
+ {
+ memcpy(pu1_dst, pu1_src, ps_codec->s_cfg.u4_wd);
+ pu1_src += ps_proc->s_inp_buf.s_raw_buf.au4_strd[0];
+ pu1_dst += ps_proc->i4_src_strd;
+ }
+ pu1_src = (UWORD8 *)ps_proc->s_inp_buf.s_raw_buf.apv_bufs[1] + (i4_mb_x * BLK8x8SIZE) +
+ ps_proc->s_inp_buf.s_raw_buf.au4_strd[1] * (i4_mb_y * BLK8x8SIZE);
+ pu1_dst = ps_proc->pu1_src_buf_chroma;
+
+ /* Last MB row of chroma is copied unconditionally, since trans functions access an extra byte
+ * due to interleaved input
+ */
+ num_rows = (ps_codec->s_cfg.u4_disp_ht >> 1) - (ps_proc->i4_mb_y * BLK8x8SIZE);
+ for (i = 0; i < num_rows; i++)
+ {
+ memcpy(pu1_dst, pu1_src, ps_codec->s_cfg.u4_wd);
+ pu1_src += ps_proc->s_inp_buf.s_raw_buf.au4_strd[1];
+ pu1_dst += ps_proc->i4_src_strd;
+ }
+
+ }
break;
case IV_YUV_420P :