[rc_test]: debug through demo under new framework

set and configure codec_cfg

Change-Id: I40f404c525f588f5555ca8d37ff9509483128d3d
Signed-off-by: Lin Kesheng <lks@rock-chips.com>
This commit is contained in:
Lin Kesheng
2017-01-05 16:44:32 +08:00
committed by Herman Chen
parent 51a7f82285
commit 5fca2c7645

View File

@@ -537,6 +537,7 @@ static void mpi_rc_log_stat(MpiRcTestCtx *ctx, RK_U32 frame_count, RK_U32 one_se
}
}
#if 0
static void mpi_rc_change_cfg(MppEncConfig *mpp_cfg, MpiRcTestCmd *cmd, RK_U32 frame_count)
{
RK_U32 item = cmd->item_flag;
@@ -562,6 +563,7 @@ static void mpi_rc_change_cfg(MppEncConfig *mpp_cfg, MpiRcTestCmd *cmd, RK_U32 f
(void)mpp_cfg;
(void)frame_count;
}
#endif
static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
{
@@ -616,6 +618,9 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
RK_U32 frame_count = 0;
RK_U64 stream_size = 0;
RK_U64 stream_size_1s = 0;
MppEncRcCfg rc_cfg;
MppEncPrepCfg prep_cfg;
MppEncCodecCfg codec_cfg;
mpp_log_f("test start width %d height %d codingtype %d\n", width, height, type);
@@ -692,7 +697,7 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
mpp_frame_set_width(frame_tmp, width);
mpp_frame_set_height(frame_tmp, height);
// NOTE: only for current version, otherwise there will be info change
mpp_frame_set_hor_stride(frame_tmp, (MPP_ALIGN(hor_stride, 256) | 256));
mpp_frame_set_hor_stride(frame_tmp, /*(MPP_ALIGN(hor_stride, 256) | 256)*/hor_stride);
mpp_frame_set_ver_stride(frame_tmp, ver_stride);
mpp_frame_set_fmt(frame_tmp, MPP_FMT_YUV420SP); // dec out frame only support 420sp
ret = dec_mpi->control(dec_ctx, MPP_DEC_SET_FRAME_INFO, (MppParam)frame_tmp);
@@ -745,19 +750,12 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
mpp_cfg.level = 41;
mpp_cfg.cabac_en = 1;
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_SEI_CFG, &sei_mode);
if (MPP_OK != ret) {
mpp_err("mpi control enc set sei cfg failed\n");
goto MPP_TEST_OUT;
}
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_CFG, &mpp_cfg);
if (MPP_OK != ret) {
mpp_err("mpi control enc set cfg failed\n");
goto MPP_TEST_OUT;
}
MppEncRcCfg rc_cfg;
rc_cfg.change = MPP_ENC_RC_CFG_CHANGE_ALL;
rc_cfg.rc_mode = 3;
rc_cfg.quality = 0;
@@ -767,15 +765,85 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
rc_cfg.fps_in_denorm = 1;
rc_cfg.fps_out_denorm = 1;
rc_cfg.fps_in_num = 30;
rc_cfg.fps_out_denorm = 30;
rc_cfg.fps_out_num = 30;
rc_cfg.fps_in_flex = 0;
rc_cfg.fps_out_flex = 0;
rc_cfg.gop = 30;
rc_cfg.skip_cnt = 0;
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_RC_CFG, &rc_cfg);
if (ret) {
mpp_err("mpi control enc set rc cfg failed ret %d\n", ret);
goto MPP_TEST_OUT;
}
prep_cfg.change = MPP_ENC_PREP_CFG_CHANGE_INPUT |
MPP_ENC_PREP_CFG_CHANGE_FORMAT;
prep_cfg.width = width;
prep_cfg.height = height;
prep_cfg.hor_stride = hor_stride;
prep_cfg.ver_stride = ver_stride;
prep_cfg.format = fmt;
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_PREP_CFG, &prep_cfg);
if (ret) {
mpp_err("mpi control enc set prep cfg failed ret %d\n", ret);
goto MPP_TEST_OUT;
}
codec_cfg.coding = type;
codec_cfg.h264.change = MPP_ENC_H264_CFG_CHANGE_PROFILE |
MPP_ENC_H264_CFG_CHANGE_ENTROPY |
MPP_ENC_H264_CFG_CHANGE_QP_LIMIT;
/*
* H.264 profile_idc parameter
* 66 - Baseline profile
* 77 - Main profile
* 100 - High profile
*/
codec_cfg.h264.profile = 100;
/*
* H.264 level_idc parameter
* 10 / 11 / 12 / 13 - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps
* 20 / 21 / 22 - cif@30fps / half-D1@@25fps / D1@12.5fps
* 30 / 31 / 32 - D1@25fps / 720p@30fps / 720p@60fps
* 40 / 41 / 42 - 1080p@30fps / 1080p@30fps / 1080p@60fps
* 50 / 51 / 52 - 4K@30fps
*/
codec_cfg.h264.level = 40;
codec_cfg.h264.entropy_coding_mode = 1;
codec_cfg.h264.cabac_init_idc = 0;
if (rc_cfg.rc_mode == 1) {
/* constant QP mode qp is fixed */
codec_cfg.h264.qp_max = 26;
codec_cfg.h264.qp_min = 26;
codec_cfg.h264.qp_max_step = 0;
} else if (rc_cfg.rc_mode == 5) {
/* constant bitrate do not limit qp range */
codec_cfg.h264.qp_max = 48;
codec_cfg.h264.qp_min = 4;
codec_cfg.h264.qp_max_step = 16;
} else if (rc_cfg.rc_mode == 3) {
/* variable bitrate has qp min limit */
codec_cfg.h264.qp_max = 40;
codec_cfg.h264.qp_min = 12;
codec_cfg.h264.qp_max_step = 8;
}
codec_cfg.h264.qp_init = 26;
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_CODEC_CFG, &codec_cfg);
if (ret) {
mpp_err("mpi control enc set codec cfg failed ret %d\n", ret);
goto MPP_TEST_OUT;
}
/* optional */
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_SEI_CFG, &sei_mode);
if (ret) {
mpp_err("mpi control enc set sei cfg failed ret %d\n", ret);
goto MPP_TEST_OUT;
}
MppEncPrepCfg prep_cfg;
prep_cfg.change = MPP_ENC_PREP_CFG_CHANGE_INPUT |
MPP_ENC_PREP_CFG_CHANGE_FORMAT;
prep_cfg.width = width;
@@ -877,138 +945,130 @@ static MPP_RET mpi_rc_codec(MpiRcTestCtx *ctx)
mpp_task_meta_set_frame (enc_task, KEY_INPUT_FRAME, frame_in);
mpp_task_meta_set_packet(enc_task, KEY_OUTPUT_PACKET, packet);
if (cmd->item_flag) {
mpi_rc_change_cfg(&mpp_cfg, cmd, frame_count);
ret = enc_mpi->control(enc_ctx, MPP_ENC_SET_CFG, &mpp_cfg);
if (MPP_OK != ret) {
mpp_err("mpi control enc set cfg failed\n");
goto MPP_TEST_OUT;
}
}
ret = enc_mpi->enqueue(enc_ctx, MPP_PORT_INPUT, enc_task);
if (ret) {
mpp_err("mpp task input enqueue failed\n");
goto MPP_TEST_OUT;
}
msleep(20);
ret = enc_mpi->poll(enc_ctx, MPP_PORT_OUTPUT, MPP_POLL_BLOCK);
if (ret) {
mpp_err("mpp task output poll failed ret %d\n", ret);
goto MPP_TEST_OUT;
}
do {
ret = enc_mpi->dequeue(enc_ctx, MPP_PORT_OUTPUT, &enc_task);
if (ret) {
mpp_err("mpp task output dequeue failed\n");
goto MPP_TEST_OUT;
}
ret = enc_mpi->dequeue(enc_ctx, MPP_PORT_OUTPUT, &enc_task);
if (ret || NULL == enc_task) {
mpp_err("mpp task output dequeue failed ret %d task %p\n", ret, enc_task);
goto MPP_TEST_OUT;
}
if (enc_task) {
MppFrame packet_out = NULL;
if (enc_task) {
MppFrame packet_out = NULL;
mpp_task_meta_get_packet(enc_task, KEY_OUTPUT_PACKET, &packet_out);
mpp_task_meta_get_packet(enc_task, KEY_OUTPUT_PACKET, &packet_out);
mpp_assert(packet_out == packet);
if (packet) {
// write packet to file here
void *ptr = mpp_packet_get_pos(packet);
size_t len = mpp_packet_get_length(packet);
RK_U32 dec_pkt_done = 0;
mpp_assert(packet_out == packet);
if (packet) {
// write packet to file here
void *ptr = mpp_packet_get_pos(packet);
size_t len = mpp_packet_get_length(packet);
RK_U32 dec_pkt_done = 0;
pkt_eos = mpp_packet_get_eos(packet);
pkt_eos = mpp_packet_get_eos(packet);
if (fp_enc_out)
fwrite(ptr, 1, len, fp_enc_out);
if (fp_enc_out)
fwrite(ptr, 1, len, fp_enc_out);
//mpp_log_f("encoded frame %d size %d\n", frame_count, len);
stream_size += len;
stream_size_1s += len;
stat->frame_size = len;
if ((frame_count + 1) % mpp_cfg.fps_in == 0) {
stat->ins_bitrate = stream_size_1s;
stream_size_1s = 0;
//mpp_log_f("encoded frame %d size %d\n", frame_count, len);
stream_size += len;
stream_size_1s += len;
stat->frame_size = len;
if ((frame_count + 1) % mpp_cfg.fps_in == 0) {
stat->ins_bitrate = stream_size_1s;
stream_size_1s = 0;
}
if (pkt_eos) {
mpp_log("found last packet\n");
mpp_assert(frm_eos);
}
/* decode one frame */
// write packet to dec input
memset(dec_in_buf, 0, packet_size);
mpp_packet_write(dec_packet, 0, ptr, len);
// reset pos
mpp_packet_set_pos(dec_packet, dec_in_buf);
mpp_packet_set_length(dec_packet, len);
mpp_packet_set_size(dec_packet, len);
frame_out = NULL;
do {
// send the packet first if packet is not done
if (!dec_pkt_done) {
ret = dec_mpi->decode_put_packet(dec_ctx, dec_packet);
if (MPP_OK == ret)
dec_pkt_done = 1;
}
if (pkt_eos) {
mpp_log("found last packet\n");
mpp_assert(frm_eos);
}
/* decode one frame */
// write packet to dec input
memset(dec_in_buf, 0, packet_size);
mpp_packet_write(dec_packet, 0, ptr, len);
// reset pos
mpp_packet_set_pos(dec_packet, dec_in_buf);
mpp_packet_set_length(dec_packet, len);
mpp_packet_set_size(dec_packet, len);
frame_out = NULL;
// then get all available frame and release
do {
// send the packet first if packet is not done
if (!dec_pkt_done) {
ret = dec_mpi->decode_put_packet(dec_ctx, dec_packet);
if (MPP_OK == ret)
dec_pkt_done = 1;
RK_S32 dec_get_frm = 0;
RK_U32 dec_frm_eos = 0;
ret = dec_mpi->decode_get_frame(dec_ctx, &frame_out);
if (MPP_OK != ret) {
mpp_err("decode_get_frame failed ret %d\n", ret);
break;
}
// then get all available frame and release
do {
RK_S32 dec_get_frm = 0;
RK_U32 dec_frm_eos = 0;
ret = dec_mpi->decode_get_frame(dec_ctx, &frame_out);
if (MPP_OK != ret) {
mpp_err("decode_get_frame failed ret %d\n", ret);
break;
if (frame_out) {
if (mpp_frame_get_info_change(frame_out)) {
mpp_log("decode_get_frame get info changed found\n");
dec_mpi->control(dec_ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);
} else {
/*
mpp_log_f("decoded frame %d width %d height %d\n",
frame_count, mpp_frame_get_width(frame_out),
mpp_frame_get_height(frame_out));
*/
if (fp_dec_out)
dump_mpp_frame_to_file(frame_out, fp_dec_out);
mpi_rc_calc_stat(ctx, frame_in, frame_out);
mpi_rc_log_stat(ctx, frame_count, (frame_count + 1) % mpp_cfg.fps_in == 0,
frame_count + 1 == num_frames);
dec_get_frm = 1;
}
dec_frm_eos = mpp_frame_get_eos(frame_out);
mpp_frame_deinit(&frame_out);
frame_out = NULL;
}
if (frame_out) {
if (mpp_frame_get_info_change(frame_out)) {
mpp_log("decode_get_frame get info changed found\n");
dec_mpi->control(dec_ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);
} else {
/*
mpp_log_f("decoded frame %d width %d height %d\n",
frame_count, mpp_frame_get_width(frame_out),
mpp_frame_get_height(frame_out));
*/
if (fp_dec_out)
dump_mpp_frame_to_file(frame_out, fp_dec_out);
mpi_rc_calc_stat(ctx, frame_in, frame_out);
mpi_rc_log_stat(ctx, frame_count, (frame_count + 1) % mpp_cfg.fps_in == 0,
frame_count + 1 == num_frames);
dec_get_frm = 1;
}
dec_frm_eos = mpp_frame_get_eos(frame_out);
mpp_frame_deinit(&frame_out);
frame_out = NULL;
}
// if last packet is send but last frame is not found continue
if (pkt_eos && dec_pkt_done && !dec_frm_eos)
continue;
// if last packet is send but last frame is not found continue
if (pkt_eos && dec_pkt_done && !dec_frm_eos)
continue;
if (dec_get_frm)
break;
} while (1);
if (dec_pkt_done)
if (dec_get_frm)
break;
msleep(50);
} while (1);
mpp_packet_deinit(&packet); // encoder packet deinit
}
frame_count++;
if (dec_pkt_done)
break;
ret = enc_mpi->enqueue(enc_ctx, MPP_PORT_OUTPUT, enc_task);
if (ret) {
mpp_err("mpp task output enqueue failed\n");
goto MPP_TEST_OUT;
}
break;
msleep(5);
} while (1);
mpp_packet_deinit(&packet); // encoder packet deinit
}
} while (1);
frame_count++;
ret = enc_mpi->enqueue(enc_ctx, MPP_PORT_OUTPUT, enc_task);
if (ret) {
mpp_err("mpp task output enqueue failed\n");
goto MPP_TEST_OUT;
}
}
if (num_frames && frame_count >= num_frames) {
mpp_log_f("codec max %d frames", frame_count);
@@ -1094,7 +1154,7 @@ MPP_TEST_OUT:
mpp_log("test success total frame %d bps %lld\n",
frame_count, (RK_U64)((stream_size * 8 * mpp_cfg.fps_out) / frame_count));
else
mpp_err("mpi_rc_test failed ret %d\n", ret);
mpp_err_f("failed ret %d\n", ret);
return ret;
}