mirror of
https://github.com/nyanmisaka/mpp.git
synced 2026-01-24 02:40:39 +01:00
refactor[hal_avs2d]: Extract the shared parts into common
Platform: General Spec: avs2d Signed-off-by: Hongjin Li <vic.hong@rock-chips.com> Change-Id: I497a193051d673314e05344b9939071a45b8c559
This commit is contained in:
parent
bcc15421e3
commit
2af3c91b0c
5 changed files with 381 additions and 598 deletions
|
|
@ -4,3 +4,348 @@
|
|||
*/
|
||||
|
||||
#define MODULE_TAG "hal_avs2d_com"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <dlfcn.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "mpp_mem.h"
|
||||
#include "mpp_env.h"
|
||||
#include "mpp_platform.h"
|
||||
#include "mpp_common.h"
|
||||
#include "mpp_log.h"
|
||||
#include "vdpu38x_com.h"
|
||||
#include "hal_avs2d_global.h"
|
||||
#include "hal_avs2d_ctx.h"
|
||||
#include "mpp_bitput.h"
|
||||
|
||||
MPP_RET hal_avs2d_vdpu_deinit(void *hal)
|
||||
{
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
Avs2dRkvRegCtx *reg_ctx = (Avs2dRkvRegCtx *)p_hal->reg_ctx;
|
||||
RK_U32 i, loop;
|
||||
MPP_RET ret = MPP_OK;
|
||||
|
||||
AVS2D_HAL_TRACE("In.");
|
||||
|
||||
INP_CHECK(ret, NULL == reg_ctx);
|
||||
|
||||
//!< malloc buffers
|
||||
loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
|
||||
for (i = 0; i < loop; i++) {
|
||||
if (reg_ctx->rcb_buf[i]) {
|
||||
mpp_buffer_put(reg_ctx->rcb_buf[i]);
|
||||
reg_ctx->rcb_buf[i] = NULL;
|
||||
}
|
||||
|
||||
MPP_FREE(reg_ctx->reg_buf[i].regs);
|
||||
}
|
||||
vdpu38x_rcb_calc_deinit(reg_ctx->rcb_ctx);
|
||||
|
||||
if (reg_ctx->bufs) {
|
||||
mpp_buffer_put(reg_ctx->bufs);
|
||||
reg_ctx->bufs = NULL;
|
||||
}
|
||||
|
||||
if (p_hal->cmv_bufs) {
|
||||
hal_bufs_deinit(p_hal->cmv_bufs);
|
||||
p_hal->cmv_bufs = NULL;
|
||||
}
|
||||
|
||||
MPP_FREE(reg_ctx->shph_dat);
|
||||
MPP_FREE(reg_ctx->scalist_dat);
|
||||
|
||||
MPP_FREE(p_hal->reg_ctx);
|
||||
|
||||
__RETURN:
|
||||
AVS2D_HAL_TRACE("Out. ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu38x_prepare_header(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len)
|
||||
{
|
||||
Avs2dSyntax_t *syntax = &p_hal->syntax;
|
||||
PicParams_Avs2d *pp = &syntax->pp;
|
||||
AlfParams_Avs2d *alfp = &syntax->alfp;
|
||||
RefParams_Avs2d *refp = &syntax->refp;
|
||||
WqmParams_Avs2d *wqmp = &syntax->wqmp;
|
||||
RK_U64 *bit_buf = (RK_U64 *)data;
|
||||
BitputCtx_t bp;
|
||||
RK_U32 i, j;
|
||||
|
||||
memset(data, 0, len);
|
||||
|
||||
mpp_set_bitput_ctx(&bp, bit_buf, len);
|
||||
|
||||
//!< sequence header syntax
|
||||
mpp_put_bits(&bp, pp->chroma_format_idc, 2);
|
||||
mpp_put_bits(&bp, pp->pic_width_in_luma_samples, 16);
|
||||
mpp_put_bits(&bp, pp->pic_height_in_luma_samples, 16);
|
||||
mpp_put_bits(&bp, pp->bit_depth_luma_minus8, 3);
|
||||
mpp_put_bits(&bp, pp->bit_depth_chroma_minus8, 3);
|
||||
mpp_put_bits(&bp, pp->lcu_size, 3);
|
||||
mpp_put_bits(&bp, pp->progressive_sequence, 1);
|
||||
mpp_put_bits(&bp, pp->field_coded_sequence, 1);
|
||||
|
||||
mpp_put_bits(&bp, pp->secondary_transform_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->sample_adaptive_offset_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->adaptive_loop_filter_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->pmvr_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->cross_slice_loopfilter_enable_flag, 1);
|
||||
|
||||
//!< picture header syntax
|
||||
mpp_put_bits(&bp, pp->picture_type, 3);
|
||||
mpp_put_bits(&bp, refp->ref_pic_num, 3);
|
||||
mpp_put_bits(&bp, pp->scene_reference_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->bottom_field_picture_flag, 1);
|
||||
mpp_put_bits(&bp, pp->fixed_picture_qp, 1);
|
||||
mpp_put_bits(&bp, pp->picture_qp, 7);
|
||||
mpp_put_bits(&bp, pp->loop_filter_disable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->alpha_c_offset, 5);
|
||||
mpp_put_bits(&bp, pp->beta_offset, 5);
|
||||
|
||||
//!< weight quant param
|
||||
mpp_put_bits(&bp, wqmp->chroma_quant_param_delta_cb, 6);
|
||||
mpp_put_bits(&bp, wqmp->chroma_quant_param_delta_cr, 6);
|
||||
mpp_put_bits(&bp, wqmp->pic_weight_quant_enable_flag, 1);
|
||||
|
||||
//!< alf param
|
||||
mpp_put_bits(&bp, alfp->enable_pic_alf_y, 1);
|
||||
mpp_put_bits(&bp, alfp->enable_pic_alf_cb, 1);
|
||||
mpp_put_bits(&bp, alfp->enable_pic_alf_cr, 1);
|
||||
|
||||
mpp_put_bits(&bp, alfp->alf_filter_num_minus1, 4);
|
||||
for (i = 0; i < 16; i++)
|
||||
mpp_put_bits(&bp, alfp->alf_coeff_idx_tab[i], 4);
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
for (j = 0; j < 9; j++)
|
||||
mpp_put_bits(&bp, alfp->alf_coeff_y[i][j], 7);
|
||||
|
||||
for (j = 0; j < 9; j++)
|
||||
mpp_put_bits(&bp, alfp->alf_coeff_cb[j], 7);
|
||||
|
||||
for (j = 0; j < 9; j++)
|
||||
mpp_put_bits(&bp, alfp->alf_coeff_cr[j], 7);
|
||||
|
||||
/* other flags */
|
||||
mpp_put_bits(&bp, pp->multi_hypothesis_skip_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->dual_hypothesis_prediction_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->weighted_skip_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->asymmetrc_motion_partitions_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->nonsquare_quadtree_transform_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->nonsquare_intra_prediction_enable_flag, 1);
|
||||
|
||||
//!< picture reference params
|
||||
mpp_put_bits(&bp, pp->cur_poc, 32);
|
||||
for (i = 0; i < 8; i++)
|
||||
mpp_put_bits(&bp, (i < refp->ref_pic_num) ? refp->ref_poc_list[i] : 0, 32);
|
||||
for (i = 0; i < 8; i++)
|
||||
mpp_put_bits(&bp, (i < refp->ref_pic_num) ? pp->field_coded_sequence : 0, 1);
|
||||
for (i = 0; i < 8; i++)
|
||||
mpp_put_bits(&bp, (i < refp->ref_pic_num) ? pp->bottom_field_picture_flag : 0, 1);
|
||||
for (i = 0; i < 8; i++)
|
||||
mpp_put_bits(&bp, (i < refp->ref_pic_num), 1);
|
||||
|
||||
mpp_put_align(&bp, 64, 0);
|
||||
|
||||
#ifdef DUMP_VDPU38X_DATAS
|
||||
{
|
||||
char *cur_fname = "global_cfg.dat";
|
||||
memset(vdpu38x_dump_cur_fname_path, 0, sizeof(vdpu38x_dump_cur_fname_path));
|
||||
sprintf(vdpu38x_dump_cur_fname_path, "%s/%s", vdpu38x_dump_cur_dir, cur_fname);
|
||||
vdpu38x_dump_data_to_file(vdpu38x_dump_cur_fname_path, (void *)bp.pbuf,
|
||||
64 * bp.index + bp.bitpos, 128, 0, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return MPP_OK;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu38x_prepare_scalist(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len)
|
||||
{
|
||||
Avs2dSyntax_t *syntax = &p_hal->syntax;
|
||||
WqmParams_Avs2d *wqmp = &syntax->wqmp;
|
||||
RK_U32 i = 0;
|
||||
RK_U32 n = 0;
|
||||
|
||||
if (!wqmp->pic_weight_quant_enable_flag)
|
||||
return MPP_OK;
|
||||
|
||||
memset(data, 0, len);
|
||||
|
||||
/* dump by block4x4, vectial direction */
|
||||
for (i = 0; i < 4; i++) {
|
||||
data[n++] = wqmp->wq_matrix[0][i + 0];
|
||||
data[n++] = wqmp->wq_matrix[0][i + 4];
|
||||
data[n++] = wqmp->wq_matrix[0][i + 8];
|
||||
data[n++] = wqmp->wq_matrix[0][i + 12];
|
||||
}
|
||||
|
||||
/* block8x8 */
|
||||
{
|
||||
RK_S32 blk4_x = 0, blk4_y = 0;
|
||||
|
||||
/* dump by block4x4, vectial direction */
|
||||
for (blk4_x = 0; blk4_x < 8; blk4_x += 4) {
|
||||
for (blk4_y = 0; blk4_y < 8; blk4_y += 4) {
|
||||
RK_S32 pos = blk4_y * 8 + blk4_x;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
data[n++] = wqmp->wq_matrix[1][pos + i + 0];
|
||||
data[n++] = wqmp->wq_matrix[1][pos + i + 8];
|
||||
data[n++] = wqmp->wq_matrix[1][pos + i + 16];
|
||||
data[n++] = wqmp->wq_matrix[1][pos + i + 24];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return MPP_OK;
|
||||
}
|
||||
|
||||
RK_S32 hal_avs2d_get_frame_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx)
|
||||
{
|
||||
RK_S32 ret_fd = 0;
|
||||
MppBuffer mbuffer = NULL;
|
||||
|
||||
mpp_buf_slot_get_prop(p_hal->frame_slots, idx, SLOT_BUFFER, &mbuffer);
|
||||
ret_fd = mpp_buffer_get_fd(mbuffer);
|
||||
|
||||
return ret_fd;
|
||||
}
|
||||
|
||||
RK_S32 hal_avs2d_get_packet_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx)
|
||||
{
|
||||
RK_S32 ret_fd = 0;
|
||||
MppBuffer mbuffer = NULL;
|
||||
|
||||
mpp_buf_slot_get_prop(p_hal->packet_slots, idx, SLOT_BUFFER, &mbuffer);
|
||||
ret_fd = mpp_buffer_get_fd(mbuffer);
|
||||
|
||||
return ret_fd;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_set_up_colmv_buf(void *hal)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
Avs2dSyntax_t *syntax = &p_hal->syntax;
|
||||
PicParams_Avs2d *pp = &syntax->pp;
|
||||
RK_U32 ctu_size = 1 << (p_hal->syntax.pp.lcu_size);
|
||||
RK_S32 mv_size = hal_h265d_avs2d_calc_mv_size(pp->pic_width_in_luma_samples,
|
||||
pp->pic_height_in_luma_samples *
|
||||
(1 + pp->field_coded_sequence),
|
||||
ctu_size);
|
||||
|
||||
AVS2D_HAL_TRACE("mv_size %d", mv_size);
|
||||
|
||||
if (p_hal->mv_size < (RK_U32)mv_size) {
|
||||
size_t size = mv_size;
|
||||
|
||||
if (p_hal->cmv_bufs) {
|
||||
hal_bufs_deinit(p_hal->cmv_bufs);
|
||||
p_hal->cmv_bufs = NULL;
|
||||
}
|
||||
|
||||
hal_bufs_init(&p_hal->cmv_bufs);
|
||||
if (p_hal->cmv_bufs == NULL) {
|
||||
mpp_err_f("colmv bufs init fail");
|
||||
ret = MPP_ERR_INIT;
|
||||
goto __RETURN;
|
||||
}
|
||||
|
||||
p_hal->mv_size = mv_size;
|
||||
p_hal->mv_count = mpp_buf_slot_get_count(p_hal->frame_slots);
|
||||
hal_bufs_setup(p_hal->cmv_bufs, p_hal->mv_count, 1, &size);
|
||||
}
|
||||
|
||||
__RETURN:
|
||||
return ret;
|
||||
}
|
||||
|
||||
RK_U8 hal_avs2d_fetch_data(RK_U32 fmt, RK_U8 *line, RK_U32 num)
|
||||
{
|
||||
RK_U32 offset = 0;
|
||||
RK_U32 value = 0;
|
||||
|
||||
if (fmt == MPP_FMT_YUV420SP_10BIT) {
|
||||
offset = (num * 2) & 7;
|
||||
value = (line[num * 10 / 8] >> offset) |
|
||||
(line[num * 10 / 8 + 1] << (8 - offset));
|
||||
|
||||
value = (value & 0x3ff) >> 2;
|
||||
} else if (fmt == MPP_FMT_YUV420SP) {
|
||||
value = line[num];
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu_dump_yuv(void *hal, HalTaskInfo *task)
|
||||
{
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
MppFrameFormat fmt = MPP_FMT_YUV420SP;
|
||||
RK_U32 vir_w = 0;
|
||||
RK_U32 vir_h = 0;
|
||||
FILE *fp_stream = NULL;
|
||||
char name[50];
|
||||
MppBuffer buffer = NULL;
|
||||
MppFrame frame;
|
||||
void *base = NULL;
|
||||
RK_U32 i, j;
|
||||
MPP_RET ret = MPP_OK;
|
||||
|
||||
ret = mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output, SLOT_FRAME_PTR, &frame);
|
||||
|
||||
if (ret != MPP_OK || frame == NULL)
|
||||
mpp_log_f("failed to get frame slot %d", task->dec.output);
|
||||
|
||||
ret = mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output, SLOT_BUFFER, &buffer);
|
||||
|
||||
if (ret != MPP_OK || buffer == NULL)
|
||||
mpp_log_f("failed to get frame buffer slot %d", task->dec.output);
|
||||
|
||||
AVS2D_HAL_TRACE("frame slot %d, fd %d\n", task->dec.output, mpp_buffer_get_fd(buffer));
|
||||
base = mpp_buffer_get_ptr(buffer);
|
||||
vir_w = mpp_frame_get_hor_stride(frame);
|
||||
vir_h = mpp_frame_get_ver_stride(frame);
|
||||
fmt = mpp_frame_get_fmt(frame);
|
||||
snprintf(name, sizeof(name), "/data/tmp/rkv_out_%dx%d_nv12_%03d.yuv", vir_w, vir_h,
|
||||
p_hal->frame_no);
|
||||
fp_stream = fopen(name, "wb");
|
||||
/* if format is fbc, write fbc header first */
|
||||
if (MPP_FRAME_FMT_IS_FBC(fmt)) {
|
||||
RK_U32 header_size = 0;
|
||||
|
||||
header_size = vir_w * vir_h / 16;
|
||||
fwrite(base, 1, header_size, fp_stream);
|
||||
base += header_size;
|
||||
}
|
||||
|
||||
if (fmt != MPP_FMT_YUV420SP_10BIT) {
|
||||
fwrite(base, 1, vir_w * vir_h * 3 / 2, fp_stream);
|
||||
} else {
|
||||
RK_U8 tmp = 0;
|
||||
for (i = 0; i < vir_h; i++) {
|
||||
for (j = 0; j < vir_w; j++) {
|
||||
tmp = hal_avs2d_fetch_data(fmt, base, j);
|
||||
fwrite(&tmp, 1, 1, fp_stream);
|
||||
}
|
||||
base += vir_w;
|
||||
}
|
||||
|
||||
for (i = 0; i < vir_h / 2; i++) {
|
||||
for (j = 0; j < vir_w; j++) {
|
||||
tmp = hal_avs2d_fetch_data(fmt, base, j);
|
||||
fwrite(&tmp, 1, 1, fp_stream);
|
||||
}
|
||||
base += vir_w;
|
||||
}
|
||||
}
|
||||
fclose(fp_stream);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,4 +6,13 @@
|
|||
#ifndef HAL_AVS2D_COM_H
|
||||
#define HAL_AVS2D_COM_H
|
||||
|
||||
MPP_RET hal_avs2d_vdpu_deinit(void *hal);
|
||||
MPP_RET hal_avs2d_vdpu38x_prepare_header(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len);
|
||||
MPP_RET hal_avs2d_vdpu38x_prepare_scalist(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len);
|
||||
RK_S32 hal_avs2d_get_frame_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx);
|
||||
RK_S32 hal_avs2d_get_packet_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx);
|
||||
MPP_RET hal_avs2d_set_up_colmv_buf(void *hal);
|
||||
RK_U8 hal_avs2d_fetch_data(RK_U32 fmt, RK_U8 *line, RK_U32 num);
|
||||
MPP_RET hal_avs2d_vdpu_dump_yuv(void *hal, HalTaskInfo *task);
|
||||
|
||||
#endif /* HAL_AVS2D_COM_H */
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include "mpp_dec_cb_param.h"
|
||||
#include "vdpu34x_avs2d.h"
|
||||
#include "hal_avs2d_ctx.h"
|
||||
#include "hal_avs2d_com.h"
|
||||
|
||||
#define MAX_REF_NUM (8)
|
||||
#define AVS2_RKV_SHPH_SIZE (1408 / 8) /* bytes */
|
||||
|
|
@ -161,28 +162,6 @@ static MPP_RET prepare_scalist(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len)
|
|||
return MPP_OK;
|
||||
}
|
||||
|
||||
static RK_S32 get_frame_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx)
|
||||
{
|
||||
RK_S32 ret_fd = 0;
|
||||
MppBuffer mbuffer = NULL;
|
||||
|
||||
mpp_buf_slot_get_prop(p_hal->frame_slots, idx, SLOT_BUFFER, &mbuffer);
|
||||
ret_fd = mpp_buffer_get_fd(mbuffer);
|
||||
|
||||
return ret_fd;
|
||||
}
|
||||
|
||||
static RK_S32 get_packet_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx)
|
||||
{
|
||||
RK_S32 ret_fd = 0;
|
||||
MppBuffer mbuffer = NULL;
|
||||
|
||||
mpp_buf_slot_get_prop(p_hal->packet_slots, idx, SLOT_BUFFER, &mbuffer);
|
||||
ret_fd = mpp_buffer_get_fd(mbuffer);
|
||||
|
||||
return ret_fd;
|
||||
}
|
||||
|
||||
static MPP_RET init_common_regs(Vdpu34xAvs2dRegSet *regs)
|
||||
{
|
||||
Vdpu34xRegCommon *common = ®s->common;
|
||||
|
|
@ -325,7 +304,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu34xAvs2dRegSet *p_regs,
|
|||
RK_S32 fd = -1;
|
||||
p_regs->avs2d_param.reg65_cur_top_poc = mpp_frame_get_poc(mframe);
|
||||
p_regs->avs2d_param.reg66_cur_bot_poc = 0;
|
||||
fd = get_frame_fd(p_hal, task_dec->output);
|
||||
fd = hal_avs2d_get_frame_fd(p_hal, task_dec->output);
|
||||
mpp_assert(fd >= 0);
|
||||
p_regs->common_addr.reg130_decout_base = fd;
|
||||
mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, task_dec->output);
|
||||
|
|
@ -375,7 +354,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu34xAvs2dRegSet *p_regs,
|
|||
|
||||
ref_flag |= frm_flag << (i * 8);
|
||||
|
||||
p_regs->avs2d_addr.ref_base[i] = get_frame_fd(p_hal, slot_idx);
|
||||
p_regs->avs2d_addr.ref_base[i] = hal_avs2d_get_frame_fd(p_hal, slot_idx);
|
||||
mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, slot_idx);
|
||||
p_regs->avs2d_addr.colmv_base[i] = mpp_buffer_get_fd(mv_buf->buf[0]);
|
||||
|
||||
|
|
@ -398,7 +377,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu34xAvs2dRegSet *p_regs,
|
|||
mpp_buf_slot_get_prop(p_hal->frame_slots, slot_idx, SLOT_FRAME_PTR, &scene_ref);
|
||||
|
||||
if (scene_ref) {
|
||||
p_regs->avs2d_addr.ref_base[replace_idx] = get_frame_fd(p_hal, slot_idx);
|
||||
p_regs->avs2d_addr.ref_base[replace_idx] = hal_avs2d_get_frame_fd(p_hal, slot_idx);
|
||||
mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, slot_idx);
|
||||
p_regs->avs2d_addr.colmv_base[replace_idx] = mpp_buffer_get_fd(mv_buf->buf[0]);
|
||||
p_regs->avs2d_param.reg67_098_ref_poc[replace_idx] = mpp_frame_get_poc(scene_ref);
|
||||
|
|
@ -413,7 +392,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu34xAvs2dRegSet *p_regs,
|
|||
|
||||
// set rlc
|
||||
{
|
||||
p_regs->common_addr.reg128_rlc_base = get_packet_fd(p_hal, task_dec->input);
|
||||
p_regs->common_addr.reg128_rlc_base = hal_avs2d_get_packet_fd(p_hal, task_dec->input);
|
||||
AVS2D_HAL_TRACE("packet fd %d from slot %d", p_regs->common_addr.reg128_rlc_base, task_dec->input);
|
||||
p_regs->common_addr.reg129_rlcwrite_base = p_regs->common_addr.reg128_rlc_base;
|
||||
common->reg016_str_len = MPP_ALIGN(mpp_packet_get_length(task_dec->input_packet), 16) + 64;
|
||||
|
|
@ -896,93 +875,6 @@ __RETURN:
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static RK_U8 fetch_data(RK_U32 fmt, RK_U8 *line, RK_U32 num)
|
||||
{
|
||||
RK_U32 offset = 0;
|
||||
RK_U32 value = 0;
|
||||
|
||||
if (fmt == MPP_FMT_YUV420SP_10BIT) {
|
||||
offset = (num * 2) & 7;
|
||||
value = (line[num * 10 / 8] >> offset) |
|
||||
(line[num * 10 / 8 + 1] << (8 - offset));
|
||||
|
||||
value = (value & 0x3ff) >> 2;
|
||||
} else if (fmt == MPP_FMT_YUV420SP) {
|
||||
value = line[num];
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static MPP_RET hal_avs2d_rkv_dump_yuv(void *hal, HalTaskInfo *task)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
|
||||
MppFrameFormat fmt = MPP_FMT_YUV420SP;
|
||||
RK_U32 vir_w = 0;
|
||||
RK_U32 vir_h = 0;
|
||||
RK_U32 i = 0;
|
||||
RK_U32 j = 0;
|
||||
FILE *fp_stream = NULL;
|
||||
char name[50];
|
||||
MppBuffer buffer = NULL;
|
||||
MppFrame frame;
|
||||
void *base = NULL;
|
||||
|
||||
ret = mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output, SLOT_FRAME_PTR, &frame);
|
||||
|
||||
if (ret != MPP_OK || frame == NULL)
|
||||
mpp_log_f("failed to get frame slot %d", task->dec.output);
|
||||
|
||||
ret = mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output, SLOT_BUFFER, &buffer);
|
||||
|
||||
if (ret != MPP_OK || buffer == NULL)
|
||||
mpp_log_f("failed to get frame buffer slot %d", task->dec.output);
|
||||
|
||||
AVS2D_HAL_TRACE("frame slot %d, fd %d\n", task->dec.output, mpp_buffer_get_fd(buffer));
|
||||
base = mpp_buffer_get_ptr(buffer);
|
||||
vir_w = mpp_frame_get_hor_stride(frame);
|
||||
vir_h = mpp_frame_get_ver_stride(frame);
|
||||
fmt = mpp_frame_get_fmt(frame);
|
||||
snprintf(name, sizeof(name), "/data/tmp/rkv_out_%dx%d_nv12_%03d.yuv", vir_w, vir_h,
|
||||
p_hal->frame_no);
|
||||
fp_stream = fopen(name, "wb");
|
||||
/* if format is fbc, write fbc header first */
|
||||
if (MPP_FRAME_FMT_IS_FBC(fmt)) {
|
||||
RK_U32 header_size = 0;
|
||||
|
||||
header_size = vir_w * vir_h / 16;
|
||||
fwrite(base, 1, header_size, fp_stream);
|
||||
base += header_size;
|
||||
}
|
||||
|
||||
if (fmt != MPP_FMT_YUV420SP_10BIT) {
|
||||
fwrite(base, 1, vir_w * vir_h * 3 / 2, fp_stream);
|
||||
} else {
|
||||
RK_U8 tmp = 0;
|
||||
for (i = 0; i < vir_h; i++) {
|
||||
for (j = 0; j < vir_w; j++) {
|
||||
tmp = fetch_data(fmt, base, j);
|
||||
fwrite(&tmp, 1, 1, fp_stream);
|
||||
}
|
||||
base += vir_w;
|
||||
}
|
||||
|
||||
for (i = 0; i < vir_h / 2; i++) {
|
||||
for (j = 0; j < vir_w; j++) {
|
||||
tmp = fetch_data(fmt, base, j);
|
||||
fwrite(&tmp, 1, 1, fp_stream);
|
||||
}
|
||||
base += vir_w;
|
||||
}
|
||||
}
|
||||
fclose(fp_stream);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_rkv_wait(void *hal, HalTaskInfo *task)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
|
|
@ -1006,7 +898,7 @@ MPP_RET hal_avs2d_rkv_wait(void *hal, HalTaskInfo *task)
|
|||
}
|
||||
|
||||
if (avs2d_hal_debug & AVS2D_HAL_DBG_OUT)
|
||||
hal_avs2d_rkv_dump_yuv(hal, task);
|
||||
hal_avs2d_vdpu_dump_yuv(hal, task);
|
||||
|
||||
if (avs2d_hal_debug & AVS2D_HAL_DBG_REG) {
|
||||
FILE *fp_reg = NULL;
|
||||
|
|
@ -1071,7 +963,7 @@ const MppHalApi hal_avs2d_rkvdpu = {
|
|||
.ctx_size = sizeof(Avs2dRkvRegCtx),
|
||||
.flag = 0,
|
||||
.init = hal_avs2d_rkv_init,
|
||||
.deinit = hal_avs2d_rkv_deinit,
|
||||
.deinit = hal_avs2d_vdpu_deinit,
|
||||
.reg_gen = hal_avs2d_rkv_gen_regs,
|
||||
.start = hal_avs2d_rkv_start,
|
||||
.wait = hal_avs2d_rkv_wait,
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include "vdpu382_avs2d.h"
|
||||
#include "vdpu_com.h"
|
||||
#include "hal_avs2d_ctx.h"
|
||||
#include "hal_avs2d_com.h"
|
||||
|
||||
#define MAX_REF_NUM (8)
|
||||
#define AVS2_RKV_SHPH_SIZE (1408 / 8) /* bytes */
|
||||
|
|
@ -50,8 +51,6 @@
|
|||
#define COLMV_BYTES (16)
|
||||
|
||||
|
||||
MPP_RET hal_avs2d_vdpu382_deinit(void *hal);
|
||||
|
||||
static MPP_RET prepare_header(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len)
|
||||
{
|
||||
RK_U32 i, j;
|
||||
|
|
@ -162,28 +161,6 @@ static MPP_RET prepare_scalist(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len)
|
|||
return MPP_OK;
|
||||
}
|
||||
|
||||
static RK_S32 get_frame_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx)
|
||||
{
|
||||
RK_S32 ret_fd = 0;
|
||||
MppBuffer mbuffer = NULL;
|
||||
|
||||
mpp_buf_slot_get_prop(p_hal->frame_slots, idx, SLOT_BUFFER, &mbuffer);
|
||||
ret_fd = mpp_buffer_get_fd(mbuffer);
|
||||
|
||||
return ret_fd;
|
||||
}
|
||||
|
||||
static RK_S32 get_packet_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx)
|
||||
{
|
||||
RK_S32 ret_fd = 0;
|
||||
MppBuffer mbuffer = NULL;
|
||||
|
||||
mpp_buf_slot_get_prop(p_hal->packet_slots, idx, SLOT_BUFFER, &mbuffer);
|
||||
ret_fd = mpp_buffer_get_fd(mbuffer);
|
||||
|
||||
return ret_fd;
|
||||
}
|
||||
|
||||
static MPP_RET init_common_regs(Vdpu382Avs2dRegSet *regs)
|
||||
{
|
||||
Vdpu382RegCommon *common = ®s->common;
|
||||
|
|
@ -382,7 +359,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu382Avs2dRegSet *p_regs,
|
|||
RK_S32 fd = -1;
|
||||
p_regs->avs2d_param.reg65_cur_top_poc = mpp_frame_get_poc(mframe);
|
||||
p_regs->avs2d_param.reg66_cur_bot_poc = 0;
|
||||
fd = get_frame_fd(p_hal, task_dec->output);
|
||||
fd = hal_avs2d_get_frame_fd(p_hal, task_dec->output);
|
||||
mpp_assert(fd >= 0);
|
||||
p_regs->common_addr.reg130_decout_base = fd;
|
||||
mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, task_dec->output);
|
||||
|
|
@ -432,7 +409,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu382Avs2dRegSet *p_regs,
|
|||
|
||||
ref_flag |= frm_flag << (i * 8);
|
||||
|
||||
p_regs->avs2d_addr.ref_base[i] = get_frame_fd(p_hal, slot_idx);
|
||||
p_regs->avs2d_addr.ref_base[i] = hal_avs2d_get_frame_fd(p_hal, slot_idx);
|
||||
mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, slot_idx);
|
||||
p_regs->avs2d_addr.colmv_base[i] = mpp_buffer_get_fd(mv_buf->buf[0]);
|
||||
|
||||
|
|
@ -454,7 +431,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu382Avs2dRegSet *p_regs,
|
|||
mpp_buf_slot_get_prop(p_hal->frame_slots, slot_idx, SLOT_FRAME_PTR, &scene_ref);
|
||||
|
||||
if (scene_ref) {
|
||||
p_regs->avs2d_addr.ref_base[replace_idx] = get_frame_fd(p_hal, slot_idx);
|
||||
p_regs->avs2d_addr.ref_base[replace_idx] = hal_avs2d_get_frame_fd(p_hal, slot_idx);
|
||||
mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, slot_idx);
|
||||
p_regs->avs2d_addr.colmv_base[replace_idx] = mpp_buffer_get_fd(mv_buf->buf[0]);
|
||||
p_regs->avs2d_param.reg67_098_ref_poc[replace_idx] = mpp_frame_get_poc(scene_ref);
|
||||
|
|
@ -469,7 +446,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu382Avs2dRegSet *p_regs,
|
|||
|
||||
// set rlc
|
||||
{
|
||||
p_regs->common_addr.reg128_rlc_base = get_packet_fd(p_hal, task_dec->input);
|
||||
p_regs->common_addr.reg128_rlc_base = hal_avs2d_get_packet_fd(p_hal, task_dec->input);
|
||||
AVS2D_HAL_TRACE("packet fd %d from slot %d", p_regs->common_addr.reg128_rlc_base, task_dec->input);
|
||||
p_regs->common_addr.reg129_rlcwrite_base = p_regs->common_addr.reg128_rlc_base;
|
||||
common->reg016_str_len = MPP_ALIGN(mpp_packet_get_length(task_dec->input_packet), 16) + 64;
|
||||
|
|
@ -489,48 +466,6 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu382Avs2dRegSet *p_regs,
|
|||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu382_deinit(void *hal)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
RK_U32 i, loop;
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
Avs2dRkvRegCtx *reg_ctx = (Avs2dRkvRegCtx *)p_hal->reg_ctx;
|
||||
|
||||
AVS2D_HAL_TRACE("In.");
|
||||
|
||||
INP_CHECK(ret, NULL == reg_ctx);
|
||||
|
||||
//!< malloc buffers
|
||||
loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
|
||||
for (i = 0; i < loop; i++) {
|
||||
if (reg_ctx->rcb_buf[i]) {
|
||||
mpp_buffer_put(reg_ctx->rcb_buf[i]);
|
||||
reg_ctx->rcb_buf[i] = NULL;
|
||||
}
|
||||
|
||||
MPP_FREE(reg_ctx->reg_buf[i].regs);
|
||||
}
|
||||
|
||||
if (reg_ctx->bufs) {
|
||||
mpp_buffer_put(reg_ctx->bufs);
|
||||
reg_ctx->bufs = NULL;
|
||||
}
|
||||
|
||||
if (p_hal->cmv_bufs) {
|
||||
hal_bufs_deinit(p_hal->cmv_bufs);
|
||||
p_hal->cmv_bufs = NULL;
|
||||
}
|
||||
|
||||
MPP_FREE(reg_ctx->shph_dat);
|
||||
MPP_FREE(reg_ctx->scalist_dat);
|
||||
|
||||
MPP_FREE(p_hal->reg_ctx);
|
||||
|
||||
__RETURN:
|
||||
AVS2D_HAL_TRACE("Out. ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu382_init(void *hal, MppHalCfg *cfg)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
|
|
@ -580,7 +515,7 @@ __RETURN:
|
|||
(void)cfg;
|
||||
return ret;
|
||||
__FAILED:
|
||||
hal_avs2d_vdpu382_deinit(p_hal);
|
||||
hal_avs2d_vdpu_deinit(p_hal);
|
||||
AVS2D_HAL_TRACE("Out. ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -963,93 +898,6 @@ __RETURN:
|
|||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static RK_U8 fetch_data(RK_U32 fmt, RK_U8 *line, RK_U32 num)
|
||||
{
|
||||
RK_U32 offset = 0;
|
||||
RK_U32 value = 0;
|
||||
|
||||
if (fmt == MPP_FMT_YUV420SP_10BIT) {
|
||||
offset = (num * 2) & 7;
|
||||
value = (line[num * 10 / 8] >> offset) |
|
||||
(line[num * 10 / 8 + 1] << (8 - offset));
|
||||
|
||||
value = (value & 0x3ff) >> 2;
|
||||
} else if (fmt == MPP_FMT_YUV420SP) {
|
||||
value = line[num];
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static MPP_RET hal_avs2d_vdpu382_dump_yuv(void *hal, HalTaskInfo *task)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
|
||||
MppFrameFormat fmt = MPP_FMT_YUV420SP;
|
||||
RK_U32 vir_w = 0;
|
||||
RK_U32 vir_h = 0;
|
||||
RK_U32 i = 0;
|
||||
RK_U32 j = 0;
|
||||
FILE *fp_stream = NULL;
|
||||
char name[50];
|
||||
MppBuffer buffer = NULL;
|
||||
MppFrame frame;
|
||||
void *base = NULL;
|
||||
|
||||
ret = mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output, SLOT_FRAME_PTR, &frame);
|
||||
|
||||
if (ret != MPP_OK || frame == NULL)
|
||||
mpp_log_f("failed to get frame slot %d", task->dec.output);
|
||||
|
||||
ret = mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output, SLOT_BUFFER, &buffer);
|
||||
|
||||
if (ret != MPP_OK || buffer == NULL)
|
||||
mpp_log_f("failed to get frame buffer slot %d", task->dec.output);
|
||||
|
||||
AVS2D_HAL_TRACE("frame slot %d, fd %d\n", task->dec.output, mpp_buffer_get_fd(buffer));
|
||||
base = mpp_buffer_get_ptr(buffer);
|
||||
vir_w = mpp_frame_get_hor_stride(frame);
|
||||
vir_h = mpp_frame_get_ver_stride(frame);
|
||||
fmt = mpp_frame_get_fmt(frame);
|
||||
snprintf(name, sizeof(name), "/data/tmp/rkv_out_%dx%d_nv12_%03d.yuv", vir_w, vir_h,
|
||||
p_hal->frame_no);
|
||||
fp_stream = fopen(name, "wb");
|
||||
/* if format is fbc, write fbc header first */
|
||||
if (MPP_FRAME_FMT_IS_FBC(fmt)) {
|
||||
RK_U32 header_size = 0;
|
||||
|
||||
header_size = vir_w * vir_h / 16;
|
||||
fwrite(base, 1, header_size, fp_stream);
|
||||
base += header_size;
|
||||
}
|
||||
|
||||
if (fmt != MPP_FMT_YUV420SP_10BIT) {
|
||||
fwrite(base, 1, vir_w * vir_h * 3 / 2, fp_stream);
|
||||
} else {
|
||||
RK_U8 tmp = 0;
|
||||
for (i = 0; i < vir_h; i++) {
|
||||
for (j = 0; j < vir_w; j++) {
|
||||
tmp = fetch_data(fmt, base, j);
|
||||
fwrite(&tmp, 1, 1, fp_stream);
|
||||
}
|
||||
base += vir_w;
|
||||
}
|
||||
|
||||
for (i = 0; i < vir_h / 2; i++) {
|
||||
for (j = 0; j < vir_w; j++) {
|
||||
tmp = fetch_data(fmt, base, j);
|
||||
fwrite(&tmp, 1, 1, fp_stream);
|
||||
}
|
||||
base += vir_w;
|
||||
}
|
||||
}
|
||||
fclose(fp_stream);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu382_wait(void *hal, HalTaskInfo *task)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
|
|
@ -1073,7 +921,7 @@ MPP_RET hal_avs2d_vdpu382_wait(void *hal, HalTaskInfo *task)
|
|||
}
|
||||
|
||||
if (avs2d_hal_debug & AVS2D_HAL_DBG_OUT)
|
||||
hal_avs2d_vdpu382_dump_yuv(hal, task);
|
||||
hal_avs2d_vdpu_dump_yuv(hal, task);
|
||||
|
||||
if (avs2d_hal_debug & AVS2D_HAL_DBG_REG) {
|
||||
FILE *fp_reg = NULL;
|
||||
|
|
@ -1138,7 +986,7 @@ const MppHalApi hal_avs2d_vdpu382 = {
|
|||
.ctx_size = sizeof(Avs2dRkvRegCtx),
|
||||
.flag = 0,
|
||||
.init = hal_avs2d_vdpu382_init,
|
||||
.deinit = hal_avs2d_vdpu382_deinit,
|
||||
.deinit = hal_avs2d_vdpu_deinit,
|
||||
.reg_gen = hal_avs2d_vdpu382_gen_regs,
|
||||
.start = hal_avs2d_vdpu382_start,
|
||||
.wait = hal_avs2d_vdpu382_wait,
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include "vdpu_com.h"
|
||||
#include "vdpu38x_com.h"
|
||||
#include "hal_avs2d_ctx.h"
|
||||
#include "hal_avs2d_com.h"
|
||||
|
||||
#define MAX_REF_NUM (8)
|
||||
#define AVS2_383_SHPH_SIZE (208) /* bytes */
|
||||
|
|
@ -42,160 +43,6 @@
|
|||
#define COLMV_BLOCK_SIZE (16)
|
||||
#define COLMV_BYTES (16)
|
||||
|
||||
MPP_RET hal_avs2d_vdpu383_deinit(void *hal);
|
||||
|
||||
static MPP_RET prepare_header(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len)
|
||||
{
|
||||
RK_U32 i, j;
|
||||
BitputCtx_t bp;
|
||||
RK_U64 *bit_buf = (RK_U64 *)data;
|
||||
Avs2dSyntax_t *syntax = &p_hal->syntax;
|
||||
PicParams_Avs2d *pp = &syntax->pp;
|
||||
AlfParams_Avs2d *alfp = &syntax->alfp;
|
||||
RefParams_Avs2d *refp = &syntax->refp;
|
||||
WqmParams_Avs2d *wqmp = &syntax->wqmp;
|
||||
|
||||
memset(data, 0, len);
|
||||
|
||||
mpp_set_bitput_ctx(&bp, bit_buf, len);
|
||||
|
||||
//!< sequence header syntax
|
||||
mpp_put_bits(&bp, pp->chroma_format_idc, 2);
|
||||
mpp_put_bits(&bp, pp->pic_width_in_luma_samples, 16);
|
||||
mpp_put_bits(&bp, pp->pic_height_in_luma_samples, 16);
|
||||
mpp_put_bits(&bp, pp->bit_depth_luma_minus8, 3);
|
||||
mpp_put_bits(&bp, pp->bit_depth_chroma_minus8, 3);
|
||||
mpp_put_bits(&bp, pp->lcu_size, 3);
|
||||
mpp_put_bits(&bp, pp->progressive_sequence, 1);
|
||||
mpp_put_bits(&bp, pp->field_coded_sequence, 1);
|
||||
|
||||
mpp_put_bits(&bp, pp->secondary_transform_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->sample_adaptive_offset_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->adaptive_loop_filter_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->pmvr_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->cross_slice_loopfilter_enable_flag, 1);
|
||||
|
||||
//!< picture header syntax
|
||||
mpp_put_bits(&bp, pp->picture_type, 3);
|
||||
mpp_put_bits(&bp, refp->ref_pic_num, 3);
|
||||
mpp_put_bits(&bp, pp->scene_reference_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->bottom_field_picture_flag, 1);
|
||||
mpp_put_bits(&bp, pp->fixed_picture_qp, 1);
|
||||
mpp_put_bits(&bp, pp->picture_qp, 7);
|
||||
mpp_put_bits(&bp, pp->loop_filter_disable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->alpha_c_offset, 5);
|
||||
mpp_put_bits(&bp, pp->beta_offset, 5);
|
||||
|
||||
//!< weight quant param
|
||||
mpp_put_bits(&bp, wqmp->chroma_quant_param_delta_cb, 6);
|
||||
mpp_put_bits(&bp, wqmp->chroma_quant_param_delta_cr, 6);
|
||||
mpp_put_bits(&bp, wqmp->pic_weight_quant_enable_flag, 1);
|
||||
|
||||
//!< alf param
|
||||
mpp_put_bits(&bp, alfp->enable_pic_alf_y, 1);
|
||||
mpp_put_bits(&bp, alfp->enable_pic_alf_cb, 1);
|
||||
mpp_put_bits(&bp, alfp->enable_pic_alf_cr, 1);
|
||||
|
||||
mpp_put_bits(&bp, alfp->alf_filter_num_minus1, 4);
|
||||
for (i = 0; i < 16; i++)
|
||||
mpp_put_bits(&bp, alfp->alf_coeff_idx_tab[i], 4);
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
for (j = 0; j < 9; j++)
|
||||
mpp_put_bits(&bp, alfp->alf_coeff_y[i][j], 7);
|
||||
|
||||
for (j = 0; j < 9; j++)
|
||||
mpp_put_bits(&bp, alfp->alf_coeff_cb[j], 7);
|
||||
|
||||
for (j = 0; j < 9; j++)
|
||||
mpp_put_bits(&bp, alfp->alf_coeff_cr[j], 7);
|
||||
|
||||
/* other flags */
|
||||
mpp_put_bits(&bp, pp->multi_hypothesis_skip_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->dual_hypothesis_prediction_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->weighted_skip_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->asymmetrc_motion_partitions_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->nonsquare_quadtree_transform_enable_flag, 1);
|
||||
mpp_put_bits(&bp, pp->nonsquare_intra_prediction_enable_flag, 1);
|
||||
|
||||
//!< picture reference params
|
||||
mpp_put_bits(&bp, pp->cur_poc, 32);
|
||||
for (i = 0; i < 8; i++)
|
||||
mpp_put_bits(&bp, (i < refp->ref_pic_num) ? refp->ref_poc_list[i] : 0, 32);
|
||||
for (i = 0; i < 8; i++)
|
||||
mpp_put_bits(&bp, (i < refp->ref_pic_num) ? pp->field_coded_sequence : 0, 1);
|
||||
for (i = 0; i < 8; i++)
|
||||
mpp_put_bits(&bp, (i < refp->ref_pic_num) ? pp->bottom_field_picture_flag : 0, 1);
|
||||
for (i = 0; i < 8; i++)
|
||||
mpp_put_bits(&bp, (i < refp->ref_pic_num), 1);
|
||||
|
||||
return MPP_OK;
|
||||
}
|
||||
|
||||
static MPP_RET prepare_scalist(Avs2dHalCtx_t *p_hal, RK_U8 *data, RK_U32 len)
|
||||
{
|
||||
Avs2dSyntax_t *syntax = &p_hal->syntax;
|
||||
WqmParams_Avs2d *wqmp = &syntax->wqmp;
|
||||
RK_U32 i = 0;
|
||||
RK_U32 n = 0;
|
||||
|
||||
if (!wqmp->pic_weight_quant_enable_flag)
|
||||
return MPP_OK;
|
||||
|
||||
memset(data, 0, len);
|
||||
|
||||
/* dump by block4x4, vectial direction */
|
||||
for (i = 0; i < 4; i++) {
|
||||
data[n++] = wqmp->wq_matrix[0][i + 0];
|
||||
data[n++] = wqmp->wq_matrix[0][i + 4];
|
||||
data[n++] = wqmp->wq_matrix[0][i + 8];
|
||||
data[n++] = wqmp->wq_matrix[0][i + 12];
|
||||
}
|
||||
|
||||
/* block8x8 */
|
||||
{
|
||||
RK_S32 blk4_x = 0, blk4_y = 0;
|
||||
|
||||
/* dump by block4x4, vectial direction */
|
||||
for (blk4_x = 0; blk4_x < 8; blk4_x += 4) {
|
||||
for (blk4_y = 0; blk4_y < 8; blk4_y += 4) {
|
||||
RK_S32 pos = blk4_y * 8 + blk4_x;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
data[n++] = wqmp->wq_matrix[1][pos + i + 0];
|
||||
data[n++] = wqmp->wq_matrix[1][pos + i + 8];
|
||||
data[n++] = wqmp->wq_matrix[1][pos + i + 16];
|
||||
data[n++] = wqmp->wq_matrix[1][pos + i + 24];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return MPP_OK;
|
||||
}
|
||||
|
||||
static RK_S32 get_frame_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx)
|
||||
{
|
||||
RK_S32 ret_fd = 0;
|
||||
MppBuffer mbuffer = NULL;
|
||||
|
||||
mpp_buf_slot_get_prop(p_hal->frame_slots, idx, SLOT_BUFFER, &mbuffer);
|
||||
ret_fd = mpp_buffer_get_fd(mbuffer);
|
||||
|
||||
return ret_fd;
|
||||
}
|
||||
|
||||
static RK_S32 get_packet_fd(Avs2dHalCtx_t *p_hal, RK_S32 idx)
|
||||
{
|
||||
RK_S32 ret_fd = 0;
|
||||
MppBuffer mbuffer = NULL;
|
||||
|
||||
mpp_buf_slot_get_prop(p_hal->packet_slots, idx, SLOT_BUFFER, &mbuffer);
|
||||
ret_fd = mpp_buffer_get_fd(mbuffer);
|
||||
|
||||
return ret_fd;
|
||||
}
|
||||
|
||||
static void init_ctrl_regs(Vdpu383Avs2dRegSet *regs)
|
||||
{
|
||||
Vdpu383CtrlReg *ctrl_regs = ®s->ctrl_regs;
|
||||
|
|
@ -365,7 +212,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu383Avs2dRegSet *regs, Ha
|
|||
|
||||
// set current
|
||||
{
|
||||
RK_S32 fd = get_frame_fd(p_hal, task_dec->output);
|
||||
RK_S32 fd = hal_avs2d_get_frame_fd(p_hal, task_dec->output);
|
||||
|
||||
mpp_assert(fd >= 0);
|
||||
|
||||
|
|
@ -408,8 +255,8 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu383Avs2dRegSet *regs, Ha
|
|||
mpp_buf_slot_get_prop(p_hal->frame_slots, slot_idx, SLOT_FRAME_PTR, &frame_ref);
|
||||
|
||||
if (frame_ref) {
|
||||
regs->avs2d_addrs.reg170_185_ref_base[i] = get_frame_fd(p_hal, slot_idx);
|
||||
regs->avs2d_addrs.reg195_210_payload_st_ref_base[i] = get_frame_fd(p_hal, slot_idx);
|
||||
regs->avs2d_addrs.reg170_185_ref_base[i] = hal_avs2d_get_frame_fd(p_hal, slot_idx);
|
||||
regs->avs2d_addrs.reg195_210_payload_st_ref_base[i] = hal_avs2d_get_frame_fd(p_hal, slot_idx);
|
||||
mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, slot_idx);
|
||||
regs->avs2d_addrs.reg217_232_colmv_ref_base[i] = mpp_buffer_get_fd(mv_buf->buf[0]);
|
||||
}
|
||||
|
|
@ -424,7 +271,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu383Avs2dRegSet *regs, Ha
|
|||
mpp_buf_slot_get_prop(p_hal->frame_slots, slot_idx, SLOT_FRAME_PTR, &scene_ref);
|
||||
|
||||
if (scene_ref) {
|
||||
regs->avs2d_addrs.reg170_185_ref_base[replace_idx] = get_frame_fd(p_hal, slot_idx);
|
||||
regs->avs2d_addrs.reg170_185_ref_base[replace_idx] = hal_avs2d_get_frame_fd(p_hal, slot_idx);
|
||||
regs->avs2d_addrs.reg195_210_payload_st_ref_base[replace_idx] = regs->avs2d_addrs.reg170_185_ref_base[replace_idx];
|
||||
mv_buf = hal_bufs_get_buf(p_hal->cmv_bufs, slot_idx);
|
||||
regs->avs2d_addrs.reg217_232_colmv_ref_base[replace_idx] = mpp_buffer_get_fd(mv_buf->buf[0]);
|
||||
|
|
@ -436,7 +283,7 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu383Avs2dRegSet *regs, Ha
|
|||
}
|
||||
|
||||
// set rlc
|
||||
regs->common_addr.reg128_strm_base = get_packet_fd(p_hal, task_dec->input);
|
||||
regs->common_addr.reg128_strm_base = hal_avs2d_get_packet_fd(p_hal, task_dec->input);
|
||||
AVS2D_HAL_TRACE("packet fd %d from slot %d", regs->common_addr.reg128_strm_base, task_dec->input);
|
||||
|
||||
regs->avs2d_paras.reg66_stream_len = MPP_ALIGN(mpp_packet_get_length(task_dec->input_packet), 16) + 64;
|
||||
|
|
@ -457,48 +304,6 @@ static MPP_RET fill_registers(Avs2dHalCtx_t *p_hal, Vdpu383Avs2dRegSet *regs, Ha
|
|||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu383_deinit(void *hal)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
RK_U32 i, loop;
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
Avs2dRkvRegCtx *reg_ctx = (Avs2dRkvRegCtx *)p_hal->reg_ctx;
|
||||
|
||||
AVS2D_HAL_TRACE("In.");
|
||||
|
||||
INP_CHECK(ret, NULL == reg_ctx);
|
||||
|
||||
//!< malloc buffers
|
||||
loop = p_hal->fast_mode ? MPP_ARRAY_ELEMS(reg_ctx->reg_buf) : 1;
|
||||
for (i = 0; i < loop; i++) {
|
||||
if (reg_ctx->rcb_buf[i]) {
|
||||
mpp_buffer_put(reg_ctx->rcb_buf[i]);
|
||||
reg_ctx->rcb_buf[i] = NULL;
|
||||
}
|
||||
|
||||
MPP_FREE(reg_ctx->reg_buf[i].regs);
|
||||
}
|
||||
|
||||
if (reg_ctx->bufs) {
|
||||
mpp_buffer_put(reg_ctx->bufs);
|
||||
reg_ctx->bufs = NULL;
|
||||
}
|
||||
|
||||
if (p_hal->cmv_bufs) {
|
||||
hal_bufs_deinit(p_hal->cmv_bufs);
|
||||
p_hal->cmv_bufs = NULL;
|
||||
}
|
||||
|
||||
MPP_FREE(reg_ctx->shph_dat);
|
||||
MPP_FREE(reg_ctx->scalist_dat);
|
||||
|
||||
MPP_FREE(p_hal->reg_ctx);
|
||||
|
||||
__RETURN:
|
||||
AVS2D_HAL_TRACE("Out. ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu383_init(void *hal, MppHalCfg *cfg)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
|
|
@ -544,49 +349,11 @@ __RETURN:
|
|||
(void)cfg;
|
||||
return ret;
|
||||
__FAILED:
|
||||
hal_avs2d_vdpu383_deinit(p_hal);
|
||||
hal_avs2d_vdpu_deinit(p_hal);
|
||||
AVS2D_HAL_TRACE("Out. ret %d", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static MPP_RET set_up_colmv_buf(void *hal)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
Avs2dSyntax_t *syntax = &p_hal->syntax;
|
||||
PicParams_Avs2d *pp = &syntax->pp;
|
||||
RK_U32 ctu_size = 1 << (p_hal->syntax.pp.lcu_size);
|
||||
RK_S32 mv_size = hal_h265d_avs2d_calc_mv_size(pp->pic_width_in_luma_samples,
|
||||
pp->pic_height_in_luma_samples *
|
||||
(1 + pp->field_coded_sequence),
|
||||
ctu_size);
|
||||
|
||||
AVS2D_HAL_TRACE("mv_size %d", mv_size);
|
||||
|
||||
if (p_hal->cmv_bufs == NULL || p_hal->mv_size < (RK_U32)mv_size) {
|
||||
size_t size = mv_size;
|
||||
|
||||
if (p_hal->cmv_bufs) {
|
||||
hal_bufs_deinit(p_hal->cmv_bufs);
|
||||
p_hal->cmv_bufs = NULL;
|
||||
}
|
||||
|
||||
hal_bufs_init(&p_hal->cmv_bufs);
|
||||
if (p_hal->cmv_bufs == NULL) {
|
||||
mpp_err_f("colmv bufs init fail");
|
||||
ret = MPP_ERR_INIT;
|
||||
goto __RETURN;
|
||||
}
|
||||
|
||||
p_hal->mv_size = mv_size;
|
||||
p_hal->mv_count = mpp_buf_slot_get_count(p_hal->frame_slots);
|
||||
hal_bufs_setup(p_hal->cmv_bufs, p_hal->mv_count, 1, &size);
|
||||
}
|
||||
|
||||
__RETURN:
|
||||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu383_gen_regs(void *hal, HalTaskInfo *task)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
|
|
@ -603,7 +370,7 @@ MPP_RET hal_avs2d_vdpu383_gen_regs(void *hal, HalTaskInfo *task)
|
|||
goto __RETURN;
|
||||
}
|
||||
|
||||
ret = set_up_colmv_buf(p_hal);
|
||||
ret = hal_avs2d_set_up_colmv_buf(p_hal);
|
||||
if (ret)
|
||||
goto __RETURN;
|
||||
|
||||
|
|
@ -631,8 +398,8 @@ MPP_RET hal_avs2d_vdpu383_gen_regs(void *hal, HalTaskInfo *task)
|
|||
memset(regs, 0, sizeof(Vdpu383Avs2dRegSet));
|
||||
init_ctrl_regs(regs);
|
||||
|
||||
prepare_header(p_hal, reg_ctx->shph_dat, AVS2_383_SHPH_SIZE / 8);
|
||||
prepare_scalist(p_hal, reg_ctx->scalist_dat, AVS2_383_SCALIST_SIZE / 8);
|
||||
hal_avs2d_vdpu38x_prepare_header(p_hal, reg_ctx->shph_dat, AVS2_383_SHPH_SIZE / 8);
|
||||
hal_avs2d_vdpu38x_prepare_scalist(p_hal, reg_ctx->scalist_dat, AVS2_383_SCALIST_SIZE / 8);
|
||||
|
||||
ret = fill_registers(p_hal, regs, task);
|
||||
|
||||
|
|
@ -764,84 +531,6 @@ __RETURN:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static RK_U8 fetch_data(RK_U32 fmt, RK_U8 *line, RK_U32 num)
|
||||
{
|
||||
RK_U32 offset = 0;
|
||||
RK_U32 value = 0;
|
||||
|
||||
if (fmt == MPP_FMT_YUV420SP_10BIT) {
|
||||
offset = (num * 2) & 7;
|
||||
value = (line[num * 10 / 8] >> offset) |
|
||||
(line[num * 10 / 8 + 1] << (8 - offset));
|
||||
|
||||
value = (value & 0x3ff) >> 2;
|
||||
} else if (fmt == MPP_FMT_YUV420SP) {
|
||||
value = line[num];
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
static MPP_RET hal_avs2d_vdpu383_dump_yuv(void *hal, HalTaskInfo *task)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
Avs2dHalCtx_t *p_hal = (Avs2dHalCtx_t *)hal;
|
||||
|
||||
MppFrameFormat fmt = MPP_FMT_YUV420SP;
|
||||
RK_U32 vir_w = 0;
|
||||
RK_U32 vir_h = 0;
|
||||
RK_U32 i = 0;
|
||||
RK_U32 j = 0;
|
||||
FILE *fp_stream = NULL;
|
||||
char name[50];
|
||||
MppBuffer buffer = NULL;
|
||||
MppFrame frame;
|
||||
void *base = NULL;
|
||||
|
||||
ret = mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output, SLOT_FRAME_PTR, &frame);
|
||||
|
||||
if (ret != MPP_OK || frame == NULL)
|
||||
mpp_log_f("failed to get frame slot %d", task->dec.output);
|
||||
|
||||
ret = mpp_buf_slot_get_prop(p_hal->frame_slots, task->dec.output, SLOT_BUFFER, &buffer);
|
||||
|
||||
if (ret != MPP_OK || buffer == NULL)
|
||||
mpp_log_f("failed to get frame buffer slot %d", task->dec.output);
|
||||
|
||||
AVS2D_HAL_TRACE("frame slot %d, fd %d\n", task->dec.output, mpp_buffer_get_fd(buffer));
|
||||
base = mpp_buffer_get_ptr(buffer);
|
||||
vir_w = mpp_frame_get_hor_stride(frame);
|
||||
vir_h = mpp_frame_get_ver_stride(frame);
|
||||
fmt = mpp_frame_get_fmt(frame);
|
||||
snprintf(name, sizeof(name), "/data/tmp/rkv_out_%dx%d_nv12_%03d.yuv", vir_w, vir_h,
|
||||
p_hal->frame_no);
|
||||
fp_stream = fopen(name, "wb");
|
||||
|
||||
if (fmt != MPP_FMT_YUV420SP_10BIT) {
|
||||
fwrite(base, 1, vir_w * vir_h * 3 / 2, fp_stream);
|
||||
} else {
|
||||
RK_U8 tmp = 0;
|
||||
for (i = 0; i < vir_h; i++) {
|
||||
for (j = 0; j < vir_w; j++) {
|
||||
tmp = fetch_data(fmt, base, j);
|
||||
fwrite(&tmp, 1, 1, fp_stream);
|
||||
}
|
||||
base += vir_w;
|
||||
}
|
||||
|
||||
for (i = 0; i < vir_h / 2; i++) {
|
||||
for (j = 0; j < vir_w; j++) {
|
||||
tmp = fetch_data(fmt, base, j);
|
||||
fwrite(&tmp, 1, 1, fp_stream);
|
||||
}
|
||||
base += vir_w;
|
||||
}
|
||||
}
|
||||
fclose(fp_stream);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
MPP_RET hal_avs2d_vdpu383_wait(void *hal, HalTaskInfo *task)
|
||||
{
|
||||
MPP_RET ret = MPP_OK;
|
||||
|
|
@ -865,7 +554,7 @@ MPP_RET hal_avs2d_vdpu383_wait(void *hal, HalTaskInfo *task)
|
|||
}
|
||||
|
||||
if (avs2d_hal_debug & AVS2D_HAL_DBG_OUT)
|
||||
hal_avs2d_vdpu383_dump_yuv(hal, task);
|
||||
hal_avs2d_vdpu_dump_yuv(hal, task);
|
||||
|
||||
AVS2D_HAL_TRACE("read irq_status 0x%08x\n", regs->ctrl_regs.reg15);
|
||||
|
||||
|
|
@ -909,7 +598,7 @@ const MppHalApi hal_avs2d_vdpu383 = {
|
|||
.ctx_size = sizeof(Avs2dRkvRegCtx),
|
||||
.flag = 0,
|
||||
.init = hal_avs2d_vdpu383_init,
|
||||
.deinit = hal_avs2d_vdpu383_deinit,
|
||||
.deinit = hal_avs2d_vdpu_deinit,
|
||||
.reg_gen = hal_avs2d_vdpu383_gen_regs,
|
||||
.start = hal_avs2d_vdpu383_start,
|
||||
.wait = hal_avs2d_vdpu383_wait,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue