summaryrefslogtreecommitdiffstats
path: root/encoder
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2015-06-16 21:30:36 +0200
committerMarco Nelissen <marcone@google.com>2015-06-25 08:25:50 -0700
commit4f5ceca078b8caab482bfd314bb24308ad872446 (patch)
tree03b655d02c8e7549b13e0005184feac9f2b0fd97 /encoder
parentcb6a43532c0b863d46c82feb25b10dc8732a34f9 (diff)
downloadandroid_external_libavc-4f5ceca078b8caab482bfd314bb24308ad872446.tar.gz
android_external_libavc-4f5ceca078b8caab482bfd314bb24308ad872446.tar.bz2
android_external_libavc-4f5ceca078b8caab482bfd314bb24308ad872446.zip
Always copy data to a local buffer if padding is needed
If horizontal padding is needed, copy the data to avoid having to try to write into the input buffer. If vertical padding is needed, we could get away with only copying the last MB row (as previously was done), but then one extra row of pixels are needed for intra pred. Thus always copy all of the picture, for simplicity, if padding is needed. Change-Id: I6b456a12956120d64e7c6b86d7b571e159f4566b
Diffstat (limited to 'encoder')
-rw-r--r--encoder/ih264e_process.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/encoder/ih264e_process.c b/encoder/ih264e_process.c
index 2c3a18e..db960dc 100644
--- a/encoder/ih264e_process.c
+++ b/encoder/ih264e_process.c
@@ -1187,7 +1187,7 @@ IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
/* init buffer pointers */
convert_uv_only = 1;
- if ((u4_pad_bottom_sz && (ps_proc->i4_mb_y == ps_proc->i4_ht_mbs - 1)) ||
+ if (u4_pad_bottom_sz || u4_pad_right_sz ||
ps_codec->s_cfg.e_inp_color_fmt == IV_YUV_422ILE)
{
if (ps_proc->i4_mb_y == ps_proc->i4_ht_mbs - 1)
@@ -1206,7 +1206,8 @@ IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
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))
+ ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1) ||
+ u4_pad_bottom_sz || u4_pad_right_sz)
{
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))
@@ -1241,9 +1242,9 @@ IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
/* 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))
+ if (ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1) || u4_pad_bottom_sz || u4_pad_right_sz)
{
- WORD32 num_rows = ps_codec->s_cfg.u4_disp_ht & 0xF;
+ WORD32 num_rows = MB_SIZE;
UWORD8 *pu1_src;
UWORD8 *pu1_dst;
WORD32 i;
@@ -1252,11 +1253,16 @@ IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
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;
+ /* If padding is required, we always copy luma, if padding isn't required we never copy luma. */
+ if (u4_pad_bottom_sz || u4_pad_right_sz) {
+ if (ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1))
+ num_rows = MB_SIZE - u4_pad_bottom_sz;
+ 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);
@@ -1265,7 +1271,10 @@ IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
/* 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);
+ if (ps_proc->i4_mb_y == (ps_proc->i4_ht_mbs - 1))
+ num_rows = (ps_codec->s_cfg.u4_disp_ht >> 1) - (ps_proc->i4_mb_y * BLK8x8SIZE);
+ else
+ num_rows = BLK8x8SIZE;
for (i = 0; i < num_rows; i++)
{
memcpy(pu1_dst, pu1_src, ps_codec->s_cfg.u4_wd);
@@ -1316,8 +1325,7 @@ IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc)
break;
}
- if (u4_pad_right_sz && (ps_proc->i4_mb_x == 0) &&
- (ps_proc->i4_src_strd > (WORD32)ps_codec->s_cfg.u4_disp_wd) )
+ if (u4_pad_right_sz && (ps_proc->i4_mb_x == 0))
{
UWORD32 u4_pad_wd, u4_pad_ht;
u4_pad_wd = (UWORD32)(ps_proc->i4_src_strd - ps_codec->s_cfg.u4_disp_wd);