From abc3e780789d2227d83addc584b401ec1b8c3b40 Mon Sep 17 00:00:00 2001 From: ChenHengming Date: Wed, 27 Jul 2016 06:27:32 +0000 Subject: [PATCH] [mpp_enc]: remove mpp_enc_get_extra_data and mpp_enc_get_extra_data_size function and use control to get sps/pps of H.264 encoder git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@1104 6e48237b-75ef-9749-8fc9-41990f28c85a --- inc/rk_mpi.h | 2 -- inc/vpu_api.h | 2 +- mpp/codec/inc/mpp_enc.h | 3 +++ mpp/codec/mpp_enc.cpp | 12 +++++---- mpp/hal/inc/mpp_hal.h | 2 +- mpp/hal/rkenc/h264e/hal_h264e.h | 6 +++++ mpp/hal/rkenc/h264e/hal_h264e_vpu.c | 41 ++++++++++++++++++++++++++++- mpp/legacy/vpu_api.cpp | 2 +- mpp/legacy/vpu_api_legacy.cpp | 18 ++++++++----- mpp/mpi.cpp | 20 +------------- mpp/mpp.cpp | 3 ++- test/mpi_enc_test.c | 19 ++++++++++++- 12 files changed, 91 insertions(+), 39 deletions(-) diff --git a/inc/rk_mpi.h b/inc/rk_mpi.h index 23ead0d8..0d199b63 100644 --- a/inc/rk_mpi.h +++ b/inc/rk_mpi.h @@ -263,8 +263,6 @@ MPP_RET mpp_destroy(MppCtx ctx); // coding type format function MPP_RET mpp_check_support_format(MppCtxType type, MppCodingType coding); void mpp_show_support_format(); -RK_U8 *mpp_enc_get_extra_data(MppCtx ctx); -RK_U32 mpp_enc_get_extra_data_size(MppCtx ctx); #ifdef __cplusplus } diff --git a/inc/vpu_api.h b/inc/vpu_api.h index ffae0d58..16664631 100644 --- a/inc/vpu_api.h +++ b/inc/vpu_api.h @@ -273,7 +273,7 @@ typedef struct VpuCodecContext { RK_U32 width; RK_U32 height; - RK_U8 *extradata; + void *extradata; RK_S32 extradata_size; RK_U8 enableparsing; diff --git a/mpp/codec/inc/mpp_enc.h b/mpp/codec/inc/mpp_enc.h index ce42985e..9d93ba74 100644 --- a/mpp/codec/inc/mpp_enc.h +++ b/mpp/codec/inc/mpp_enc.h @@ -36,6 +36,9 @@ struct MppEnc_t { RK_U32 reset_flag; void *mpp; + /* + * configuration parameter to controller and hal + */ H264EncConfig enc_cfg; H264EncRateCtrl enc_rc_cfg; h264e_control_extra_info_cfg extra_info_cfg; diff --git a/mpp/codec/mpp_enc.cpp b/mpp/codec/mpp_enc.cpp index 25bcecfd..4d23251b 100644 --- a/mpp/codec/mpp_enc.cpp +++ b/mpp/codec/mpp_enc.cpp @@ -411,7 +411,7 @@ MPP_RET mpp_enc_control(MppEnc *enc, MpiCmd cmd, void *param) H264EncRateCtrl *enc_rc_cfg = &(enc->enc_rc_cfg); switch (cmd) { - case MPP_ENC_SET_CFG: + case MPP_ENC_SET_CFG : { //H264ENC_NAL_UNIT_STREAM; // decide whether stream start with start code,e.g."00 00 00 01" enc_cfg->streamType = H264ENC_BYTE_STREAM; enc_cfg->frameRateDenom = 1; @@ -487,11 +487,13 @@ MPP_RET mpp_enc_control(MppEnc *enc, MpiCmd cmd, void *param) mpp_extra_info_generate(enc); mpp_hal_control(enc->hal, MPP_ENC_SET_EXTRA_INFO, (void*)(&(enc->extra_info_cfg))); - mpp_hal_control(enc->hal, MPP_ENC_GET_EXTRA_INFO, (void*)(&(enc->extra_info))); - break; - default: - break; + } break; + case MPP_ENC_GET_EXTRA_INFO : { + mpp_hal_control(enc->hal, cmd, param); + } break; + default : { + } break; } return MPP_OK; diff --git a/mpp/hal/inc/mpp_hal.h b/mpp/hal/inc/mpp_hal.h index ac9dd610..679dfe98 100644 --- a/mpp/hal/inc/mpp_hal.h +++ b/mpp/hal/inc/mpp_hal.h @@ -52,7 +52,7 @@ typedef struct MppHalCfg_t { HalTaskGroup tasks; RK_S32 task_count; RK_U32 fast_mode; - IOInterruptCB hal_int_cb; + IOInterruptCB hal_int_cb; } MppHalCfg; typedef struct MppHalApi_t { diff --git a/mpp/hal/rkenc/h264e/hal_h264e.h b/mpp/hal/rkenc/h264e/hal_h264e.h index 9bc4e017..8e056cf9 100644 --- a/mpp/hal/rkenc/h264e/hal_h264e.h +++ b/mpp/hal/rkenc/h264e/hal_h264e.h @@ -20,6 +20,8 @@ #include "vpu.h" #include "mpp_log.h" #include "mpp_hal.h" + +#include "mpp_packet.h" #include "h264e_syntax.h" #define H264E_HAL_LOG_MODE 0x00000111 @@ -301,6 +303,10 @@ typedef struct h264e_hal_context_t { h264e_hal_param param; RK_U32 enc_mode; void *dump_files; + + void *param_buf; + size_t param_size; + MppPacket packeted_param; } h264e_hal_context; #endif diff --git a/mpp/hal/rkenc/h264e/hal_h264e_vpu.c b/mpp/hal/rkenc/h264e/hal_h264e_vpu.c index d1ed5b1a..7416c6c0 100644 --- a/mpp/hal/rkenc/h264e/hal_h264e_vpu.c +++ b/mpp/hal/rkenc/h264e/hal_h264e_vpu.c @@ -22,6 +22,8 @@ #include "hal_h264e.h" #include "hal_h264e_vpu.h" +#define H264E_MAX_PACKETED_PARAM_SIZE 256 + /* H.264 motion estimation parameters */ static const RK_U32 h264_prev_mode_favor[52] = { 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, @@ -1555,6 +1557,10 @@ MPP_RET hal_h264e_vpu_init(void *hal, MppHalCfg *cfg) ctx->buffers = mpp_calloc(h264e_hal_vpu_buffers, 1); ctx->extra_info = mpp_calloc(h264e_hal_vpu_extra_info, 1); ctx->dump_files = mpp_calloc(h264e_hal_vpu_dump_files, 1); + ctx->param_size = H264E_MAX_PACKETED_PARAM_SIZE; + ctx->param_buf = mpp_calloc_size(void, ctx->param_size); + mpp_packet_init(&ctx->packeted_param, ctx->param_buf, ctx->param_size); + hal_h264e_vpu_init_extra_info(ctx->extra_info); #ifdef H264E_DUMP_DATA_TO_FILE hal_h264e_vpu_open_dump_files(ctx->dump_files); @@ -1590,12 +1596,26 @@ MPP_RET hal_h264e_vpu_deinit(void *hal) { h264e_hal_context *ctx = (h264e_hal_context *)hal; h264e_hal_debug_enter(); + MPP_FREE(ctx->regs); + if (ctx->extra_info) { hal_h264e_vpu_deinit_extra_info(ctx->extra_info); MPP_FREE(ctx->extra_info); } + if (ctx->packeted_param) { + mpp_packet_deinit(&ctx->packeted_param); + ctx->packeted_param = NULL; + } + + if (ctx->param_buf) { + mpp_free(ctx->param_buf); + ctx->param_buf = NULL; + } + + ctx->param_size = 0; + if (ctx->buffers) { hal_h264e_vpu_free_buffers(ctx); MPP_FREE(ctx->buffers); @@ -2049,8 +2069,26 @@ MPP_RET hal_h264e_vpu_control(void *hal, RK_S32 cmd_type, void *param) break; } case MPP_ENC_GET_EXTRA_INFO: { - hal_h264e_vpu_get_extra_info(param, ctx->extra_info); + MppPacket pkt = ctx->packeted_param; + MppPacket *pkt_out = (MppPacket *)param; + + h264e_hal_vpu_extra_info *src = (h264e_hal_vpu_extra_info *)ctx->extra_info; + h264e_hal_vpu_stream *sps_stream = &src->sps_stream; + h264e_hal_vpu_stream *pps_stream = &src->pps_stream; + + size_t offset = 0; + + mpp_packet_write(pkt, offset, sps_stream->buffer, sps_stream->byte_cnt); + offset += sps_stream->byte_cnt; + + mpp_packet_write(pkt, offset, pps_stream->buffer, pps_stream->byte_cnt); + offset += pps_stream->byte_cnt; + + mpp_packet_set_length(pkt, offset); + + *pkt_out = pkt; #ifdef H264E_DUMP_DATA_TO_FILE + hal_h264e_vpu_get_extra_info(param, ctx->extra_info); hal_h264e_vpu_dump_mpp_strm_out_header(param, ctx); #endif break; @@ -2063,3 +2101,4 @@ MPP_RET hal_h264e_vpu_control(void *hal, RK_S32 cmd_type, void *param) h264e_hal_debug_leave(); return MPP_OK; } + diff --git a/mpp/legacy/vpu_api.cpp b/mpp/legacy/vpu_api.cpp index 63fb76b4..b1e4e981 100644 --- a/mpp/legacy/vpu_api.cpp +++ b/mpp/legacy/vpu_api.cpp @@ -325,7 +325,7 @@ RK_S32 vpu_open_context(VpuCodecContext **ctx) *ctx = s; return 0; -#ifndef SOFIA_3GR_LINUX +#ifndef SOFIA_3GR_LINUX #ifdef RKPLATFORM if (s != NULL) { free(s); diff --git a/mpp/legacy/vpu_api_legacy.cpp b/mpp/legacy/vpu_api_legacy.cpp index 0d7b49dd..981a4afa 100644 --- a/mpp/legacy/vpu_api_legacy.cpp +++ b/mpp/legacy/vpu_api_legacy.cpp @@ -86,11 +86,11 @@ VpuApiLegacy::~VpuApiLegacy() mpp_free(fp_buf); fp_buf = NULL; } - if (outData != NULL) { + if (outData) { mpp_free(outData); outData = NULL; } - if (memGroup != NULL) { + if (memGroup) { mpp_err("memGroup deInit"); mpp_buffer_group_put(memGroup); } @@ -186,12 +186,16 @@ RK_S32 VpuApiLegacy::init(VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_s mpi->control(mpp_ctx, MPP_ENC_SET_CFG, &mpp_cfg); - if (mpp_enc_get_extra_data_size(mpp_ctx) > 0) { - ctx->extradata_size = mpp_enc_get_extra_data_size(mpp_ctx); - ctx->extradata = mpp_enc_get_extra_data(mpp_ctx); + mpi->control(mpp_ctx, MPP_ENC_GET_EXTRA_INFO, &pkt); + + if (pkt) { + ctx->extradata_size = mpp_packet_get_length(pkt); + ctx->extradata = mpp_packet_get_data(pkt); mpp_log("Mpp generate extra data!"); - } else + } else { mpp_err("No extra data generate!"); + } + pkt = NULL; } VPU_GENERIC vpug; @@ -584,7 +588,7 @@ RK_S32 VpuApiLegacy::encode(VpuCodecContext *ctx, EncInputStream_t *aEncInStrm, aEncOut->timeUs = pts; aEncOut->keyFrame = (flag & MPP_PACKET_FLAG_INTRA) ? (1) : (0); if (!use_fd_flag) { - aEncOut->data = outData; + mpp_assert(aEncOut->data); memcpy(aEncOut->data, (RK_U8*) mpp_buffer_get_ptr(outbufMem), aEncOut->size); } mpp_buffer_put(outbufMem); diff --git a/mpp/mpi.cpp b/mpp/mpi.cpp index aadab887..0f0add16 100644 --- a/mpp/mpi.cpp +++ b/mpp/mpi.cpp @@ -44,7 +44,7 @@ static MppCodingTypeInfo support_list[] = { { MPP_CTX_DEC, MPP_VIDEO_CodingVP9, "dec", "VP9", }, { MPP_CTX_DEC, MPP_VIDEO_CodingAVS, "dec", "avs+", }, { MPP_CTX_DEC, MPP_VIDEO_CodingMJPEG, "dec", "jpeg", }, - { MPP_CTX_ENC, MPP_VIDEO_CodingAVC, "enc", "h.264/AVC", }, + { MPP_CTX_ENC, MPP_VIDEO_CodingAVC, "enc", "h.264/AVC", }, }; #define check_mpp_ctx(ctx) _check_mpp_ctx(ctx, __FUNCTION__) @@ -460,21 +460,3 @@ void mpp_show_support_format() } } -RK_U32 mpp_enc_get_extra_data_size(MppCtx ctx) -{ - mpi_dbg_func("enter ctx %p\n", ctx); - MpiImpl *p = (MpiImpl*)ctx; - RK_U32 ret = p->ctx->mEnc->extra_info.size; - mpi_dbg_func("leave\n"); - return ret; -} - -RK_U8 *mpp_enc_get_extra_data(MppCtx ctx) -{ - mpi_dbg_func("enter ctx %p\n", ctx); - MpiImpl *p = (MpiImpl*)ctx; - RK_U8 *extra_data = p->ctx->mEnc->extra_info.buf; - mpp_log("Mpp get extra data now!"); - mpi_dbg_func("leave\n"); - return extra_data; -} diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 3f61da38..98800e46 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -645,7 +645,8 @@ MPP_RET Mpp::control_enc(MpiCmd cmd, MppParam param) MPP_RET ret = MPP_NOK; switch (cmd) { - case MPP_ENC_SET_CFG : { + case MPP_ENC_SET_CFG : + case MPP_ENC_GET_EXTRA_INFO : { mpp_assert(mEnc); ret = mpp_enc_control(mEnc, cmd, param); } break; diff --git a/test/mpi_enc_test.c b/test/mpi_enc_test.c index 9b73bdac..4c8840dc 100644 --- a/test/mpi_enc_test.c +++ b/test/mpi_enc_test.c @@ -170,10 +170,27 @@ int mpi_enc_test(MpiEncTestCmd *cmd) ret = mpi->control(ctx, MPP_ENC_SET_CFG, &mpp_cfg); if (MPP_OK != ret) { - mpp_err("mpi control failed\n"); + mpp_err("mpi control enc set cfg failed\n"); goto MPP_TEST_OUT; } + ret = mpi->control(ctx, MPP_ENC_GET_EXTRA_INFO, &packet); + if (MPP_OK != ret) { + mpp_err("mpi control enc get extra info failed\n"); + goto MPP_TEST_OUT; + } + + /* get and write sps/pps for H.264 */ + if (packet) { + void *ptr = mpp_packet_get_pos(packet); + size_t len = mpp_packet_get_length(packet); + + if (fp_output) + fwrite(ptr, 1, len, fp_output); + + packet = NULL; + } + ret = mpp_frame_init(&frame); if (MPP_OK != ret) { mpp_err("mpp_frame_init failed\n");