[vp8e]: Fix vp8e reencode and ivf problems

1. Not do reencode in vp8 enc
2. Add api to control whether need to add ivf header
   (default: have ivf header)

Signed-off-by: yandong.lin <yandong.lin@rock-chips.com>
Change-Id: I59a3a7193abead6c73e6e1eed593a115add77888
This commit is contained in:
yandong.lin
2020-10-22 09:51:48 +08:00
committed by Herman Chen
parent 0f8aeda99d
commit e54234a11b
4 changed files with 24 additions and 15 deletions

View File

@@ -911,6 +911,7 @@ typedef struct MppEncJpegCfg_t {
*/
typedef enum MppEncVP8CfgChange_e {
MPP_ENC_VP8_CFG_CHANGE_QP = (1 << 0),
MPP_ENC_VP8_CFG_CHANGE_DIS_IVF = (1 << 1),
MPP_ENC_VP8_CFG_CHANGE_ALL = (0xFFFFFFFF),
} MppEncVP8CfgChange;
@@ -924,6 +925,7 @@ typedef struct MppEncVp8Cfg_t {
RK_S32 qp_min;
RK_S32 qp_min_i;
RK_S32 qp_max_step;
RK_S32 disable_ivf;
} MppEncVp8Cfg;
/**

View File

@@ -234,6 +234,7 @@ static const char *cfg_func_names[] = {
ENTRY(vp8, qp_max_i, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_max_i) \
ENTRY(vp8, qp_min_i, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_min_i) \
ENTRY(vp8, qp_step, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_QP, codec.vp8, qp_max_step) \
ENTRY(vp8, disable_ivf, S32, RK_S32, MPP_ENC_VP8_CFG_CHANGE_DIS_IVF, codec.vp8, disable_ivf) \
/* jpeg config */ \
ENTRY(jpeg, quant, S32, RK_S32, MPP_ENC_JPEG_CFG_CHANGE_QP, codec.jpeg, quant) \
ENTRY(jpeg, qtable_y, PTR, RK_U8*, MPP_ENC_JPEG_CFG_CHANGE_QTABLE, codec.jpeg, qtable_y) \
@@ -258,7 +259,7 @@ RK_S32 const_strlen(const char* str)
return *str ? 1 + const_strlen(str + 1) : 0;
}
static RK_S32 node_len = ENTRY_TABLE(EXPAND_AS_STRLEN) - 62;
static RK_S32 node_len = ENTRY_TABLE(EXPAND_AS_STRLEN) - 55;
class MppEncCfgService
{

View File

@@ -100,7 +100,7 @@ static MPP_RET vp8e_init(void *ctx, EncImplCfg *ctrl_cfg)
rc_cfg->fps_out_num = 30;
rc_cfg->fps_out_denorm = 1;
rc_cfg->gop = 60;
rc_cfg->max_reenc_times = 1;
rc_cfg->max_reenc_times = 0;
p->rc = mpp_calloc(Vp8eRc, 1);
memset(p->rc, 0, sizeof(Vp8eRc));
@@ -175,8 +175,8 @@ static MPP_RET vp8e_proc_prep_cfg(MppEncPrepCfg *dst, MppEncPrepCfg *src)
dst->format = src->format;
}
dst->change |= src->change;
vp8e_dbg_cfg("width %d height %d ver_srtride %d format 0x%x\n",
dst->width, dst->height, dst->ver_stride, dst->hor_stride, dst->format);
vp8e_dbg_cfg("width %d height %d hor_stride %d ver_srtride %d format 0x%x\n",
dst->width, dst->height, dst->hor_stride, dst->ver_stride, dst->format);
}
return ret;
}
@@ -284,8 +284,11 @@ static MPP_RET vp8e_proc_vp8_cfg(MppEncVp8Cfg *dst, MppEncVp8Cfg *src)
dst->qp_max_i = src->qp_max_i;
dst->qp_min_i = src->qp_min_i;
}
vp8e_dbg_cfg("rc cfg qp_init %d qp_max %d qp_min %d qp_max_i %d qp_min_i %d\n",
dst->qp_init, dst->qp_max, dst->qp_min, dst->qp_max_i, dst->qp_min_i);
if (change & MPP_ENC_VP8_CFG_CHANGE_DIS_IVF) {
dst->disable_ivf = src->disable_ivf;
}
vp8e_dbg_cfg("rc cfg qp_init %d qp_max %d qp_min %d qp_max_i %d qp_min_i %d, disable_ivf %d\n",
dst->qp_init, dst->qp_max, dst->qp_min, dst->qp_max_i, dst->qp_min_i, dst->disable_ivf);
dst->change |= src->change;
return MPP_OK;
}

View File

@@ -1589,19 +1589,22 @@ MPP_RET hal_vp8e_update_buffers(void *hal, HalEncTask *task)
{
HalEncTask *enc_task = task;
RK_U8 *p_out = mpp_buffer_get_ptr(enc_task->output);
RK_S32 disable_ivf = ctx->cfg->codec.vp8.disable_ivf;
if (ctx->frame_cnt == 0) {
write_ivf_header(hal, p_out);
if (!disable_ivf) {
if (ctx->frame_cnt == 0) {
write_ivf_header(hal, p_out);
p_out += IVF_HDR_BYTES;
enc_task->length += IVF_HDR_BYTES;
}
p_out += IVF_HDR_BYTES;
enc_task->length += IVF_HDR_BYTES;
}
if (ctx->frame_size) {
write_ivf_frame(ctx, p_out);
if (ctx->frame_size) {
write_ivf_frame(ctx, p_out);
p_out += IVF_FRM_BYTES;
enc_task->length += IVF_FRM_BYTES;
p_out += IVF_FRM_BYTES;
enc_task->length += IVF_FRM_BYTES;
}
}
memcpy(p_out, ctx->p_out_buf[0], ctx->stream_size[0]);