mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-04 16:52:40 +08:00
[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
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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 {
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
20
mpp/mpi.cpp
20
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;
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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");
|
||||
|
Reference in New Issue
Block a user