[h264e]: fix bug: case when encode infochange

tips: when input data for encode change solution, the buffer_ready
is on, then not realloc buffer ever. Thus, it must check when hw_cfg
parameters change, and then realloc relative buffer.

Change-Id: I870f04f14d1f05b652a324601fdd7316e29951ed
Signed-off-by: Ding Wei <leo.ding@rock-chips.com>
This commit is contained in:
Ding Wei
2018-05-23 11:31:53 +08:00
committed by Herman Chen
parent 13fdedf1fd
commit ea47dc871a
6 changed files with 87 additions and 51 deletions

View File

@@ -441,7 +441,6 @@ typedef struct H264eHalContext_t {
RK_U32 idr_pic_id;
RK_U32 qp_scale; /* can be 1 or 2 */
RK_U32 buffer_ready;
H264eHwCfg hw_cfg;
MppLinReg *inter_qs;
MppLinReg *intra_qs;

View File

@@ -754,47 +754,31 @@ MPP_RET h264e_vpu_free_buffers(H264eHalContext *ctx)
return ret;
}
MPP_RET h264e_vpu_allocate_buffers(H264eHalContext *ctx, H264eHwCfg *syn)
MPP_RET h264e_vpu_allocate_buffers(H264eHalContext *ctx)
{
MPP_RET ret = MPP_OK;
RK_S32 k = 0;
h264e_hal_vpu_buffers *buffers = (h264e_hal_vpu_buffers *)ctx->buffers;
RK_U32 frame_size = ((syn->width + 15) & (~15))
* ((syn->height + 15) & (~15)) * 3 / 2;
h264e_hal_enter();
// init parameters
buffers->cabac_init_idc = 0;
buffers->align_width = 0;
buffers->align_height = 0;
ret = mpp_buffer_group_get_internal(&buffers->hw_buf_grp,
MPP_BUFFER_TYPE_ION);
if (ret) {
mpp_err("buf group get failed ret %d\n", ret);
return ret;
}
ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_cabac_table_buf,
H264E_CABAC_TABLE_BUF_SIZE);
if (ret) {
mpp_err("hw_cabac_table_buf get failed\n");
return ret;
}
ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_nal_size_table_buf,
(sizeof(RK_U32) * (syn->height + 1) + 7) & (~7));
if (ret) {
mpp_err("hw_nal_size_table_buf get failed\n");
return ret;
}
for (k = 0; k < 2; k++) {
ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_rec_buf[k],
frame_size + 4096);
if (ret) {
mpp_err("hw_rec_buf[%d] get failed\n", k);
return ret;
}
}
hal_h264e_vpu_write_cabac_table(buffers->hw_cabac_table_buf,
syn->cabac_init_idc);
buffers->cabac_init_idc);
h264e_hal_leave();
return MPP_OK;
@@ -1025,3 +1009,58 @@ MPP_RET h264e_vpu_update_hw_cfg(H264eHalContext *ctx, HalEncTask *task,
ctx->idr_pic_id = !ctx->idr_pic_id;
return MPP_OK;
}
MPP_RET h264e_vpu_update_buffers(H264eHalContext *ctx, H264eHwCfg *hw_cfg)
{
MPP_RET ret = MPP_OK;
h264e_hal_vpu_buffers *buffers = (h264e_hal_vpu_buffers *)ctx->buffers;
h264e_hal_enter();
if (hw_cfg->cabac_init_idc != buffers->cabac_init_idc) {
hal_h264e_vpu_write_cabac_table(buffers->hw_cabac_table_buf,
hw_cfg->cabac_init_idc);
buffers->cabac_init_idc = hw_cfg->cabac_init_idc;
}
RK_S32 align_width = MPP_ALIGN(hw_cfg->width, 16);
RK_S32 align_height = MPP_ALIGN(hw_cfg->height, 16);
if ((align_width != buffers->align_width) ||
(align_height != buffers->align_height)) {
RK_S32 k = 0;
// free original buffer
if (buffers->hw_nal_size_table_buf) {
mpp_buffer_put(buffers->hw_nal_size_table_buf);
buffers->hw_nal_size_table_buf = NULL;
}
for (k = 0; k < 2; k++) {
if (buffers->hw_rec_buf[k]) {
mpp_buffer_put(buffers->hw_rec_buf[k]);
buffers->hw_rec_buf[k] = NULL;
}
}
// realloc buffer
RK_U32 frame_size = align_width * align_height * 3 / 2;
ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_nal_size_table_buf,
(sizeof(RK_U32) * align_height));
if (ret) {
mpp_err("hw_nal_size_table_buf get failed\n");
return ret;
}
for (k = 0; k < 2; k++) {
ret = mpp_buffer_get(buffers->hw_buf_grp, &buffers->hw_rec_buf[k],
frame_size + 4096);
if (ret) {
mpp_err("hw_rec_buf[%d] get failed\n", k);
return ret;
}
}
buffers->align_width = align_width;
buffers->align_height = align_height;
}
h264e_hal_leave();
return MPP_OK;
}

View File

@@ -28,9 +28,10 @@ MPP_RET h264e_vpu_deinit_extra_info(void *extra_info);
MPP_RET h264e_vpu_set_extra_info(H264eHalContext *ctx);
MPP_RET h264e_vpu_free_buffers(H264eHalContext *ctx);
MPP_RET h264e_vpu_allocate_buffers(H264eHalContext *ctx, H264eHwCfg *syn);
MPP_RET h264e_vpu_allocate_buffers(H264eHalContext *ctx);
MPP_RET h264e_vpu_update_hw_cfg(H264eHalContext *ctx, HalEncTask *task,
H264eHwCfg *hw_cfg);
MPP_RET h264e_vpu_update_buffers(H264eHalContext *ctx, H264eHwCfg *hw_cfg);
RK_S32 exp_golomb_signed(RK_S32 val);
#endif

View File

@@ -67,8 +67,11 @@ typedef struct H264eVpuExtraInfo_t {
} H264eVpuExtraInfo;
typedef struct h264e_hal_vpu_buffers_t {
MppBufferGroup hw_buf_grp;
RK_S32 cabac_init_idc;
RK_S32 align_width;
RK_S32 align_height;
MppBufferGroup hw_buf_grp;
MppBuffer hw_rec_buf[2];
MppBuffer hw_cabac_table_buf;
MppBuffer hw_nal_size_table_buf;

View File

@@ -67,8 +67,14 @@ MPP_RET hal_h264e_vepu1_init(void *hal, MppHalCfg *cfg)
ctx->hw_cfg.qp_prev = ctx->cfg->codec.h264.qp_init;
mpp_env_get_u32("hal_vpu_h264e_debug", &hal_vpu_h264e_debug, 0);
ret = h264e_vpu_allocate_buffers(ctx);
if (ret != MPP_OK) {
h264e_hal_err("allocate buffers failed\n");
h264e_vpu_free_buffers(ctx);
}
h264e_hal_leave();
return MPP_OK;
return ret;
}
MPP_RET hal_h264e_vepu1_deinit(void *hal)
@@ -143,21 +149,9 @@ MPP_RET hal_h264e_vepu1_gen_regs(void *hal, HalTaskInfo *task)
RK_U32 mbs_in_row = 0;
RK_U32 mbs_in_col = 0;
h264e_hal_enter();
h264e_vpu_update_hw_cfg(ctx, enc_task, hw_cfg);
if (!ctx->buffer_ready) {
MPP_RET ret;
ret = h264e_vpu_allocate_buffers(ctx, hw_cfg);
if (ret) {
h264e_hal_err("allocate buffers failed\n");
h264e_vpu_free_buffers(ctx);
} else {
ctx->buffer_ready = 1;
}
}
h264e_vpu_update_buffers(ctx, hw_cfg);
mbs_in_row = (prep->width + 15) / 16;
mbs_in_col = (prep->height + 15) / 16;

View File

@@ -67,6 +67,12 @@ MPP_RET hal_h264e_vepu2_init(void *hal, MppHalCfg *cfg)
ctx->hw_cfg.qp_prev = ctx->cfg->codec.h264.qp_init;
mpp_env_get_u32("hal_vpu_h264e_debug", &hal_vpu_h264e_debug, 0);
ret = h264e_vpu_allocate_buffers(ctx);
if (ret) {
h264e_hal_err("allocate buffers failed\n");
h264e_vpu_free_buffers(ctx);
}
h264e_hal_leave();
return ret;
}
@@ -139,16 +145,10 @@ MPP_RET hal_h264e_vepu2_gen_regs(void *hal, HalTaskInfo *task)
// generate parameter from config
h264e_vpu_update_hw_cfg(ctx, enc_task, hw_cfg);
// prepare buffer
if (!ctx->buffer_ready) {
ret = h264e_vpu_allocate_buffers(ctx, hw_cfg);
if (ret) {
h264e_hal_err("allocate buffers failed\n");
h264e_vpu_free_buffers(ctx);
return ret;
} else
ctx->buffer_ready = 1;
ret = h264e_vpu_update_buffers(ctx, hw_cfg);
if (ret != MPP_OK) {
mpp_err_f("update buffers error.\n");
return ret;
}
mb_w = (prep->width + 15) / 16;