mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-11-03 09:40:50 +08:00
[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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user