请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TDA2SX 工具与软件:
如何 使用 TI Vision SDK 3.04配置 h264SPS (序列参数集)帧的 VUI 信息。
平台: TDA2SX
SDK 版本: TI Vision SDK 3.04
H264编码器 HDVICP2版本: H264ENC_TI DEV.500.V.H264AVC E.IVAHD.02.01.09.01
根据 h264_Encoder_HDVICP2_UserGuide.pdf、 我 尝试修改了 enclink_h264_set_static_params 函数代码。
H264 SPS 帧中仍然没有 VUI 信息。
enclink_h264_set_static_params 的代码如下所示
static Int enclink_h264_set_static_params(IH264ENC_Params * staticParams,
EncLink_AlgCreateParams *
algCreateParams)
{
/* Initialize default values for static params */
*staticParams = H264ENC_TI_PARAMS;
/* Both width & height needs to be align with 2 bytes */
staticParams->videnc2Params.maxHeight =
VpsUtils_align(algCreateParams->maxHeight, 2);
staticParams->videnc2Params.maxWidth =
VpsUtils_align(algCreateParams->maxWidth, 16);
staticParams->videnc2Params.maxInterFrameInterval =
algCreateParams->maxInterFrameInterval;
staticParams->videnc2Params.inputContentType =
algCreateParams->inputContentType;
staticParams->videnc2Params.inputChromaFormat =
algCreateParams->inputChromaFormat;
if (algCreateParams->format == SYSTEM_IVIDEO_H264BP)
staticParams->videnc2Params.profile = IH264_BASELINE_PROFILE;
else if (algCreateParams->format == SYSTEM_IVIDEO_H264MP)
staticParams->videnc2Params.profile = IH264_MAIN_PROFILE;
else if (algCreateParams->format == SYSTEM_IVIDEO_H264HP)
staticParams->videnc2Params.profile = IH264_HIGH_PROFILE;
staticParams->videnc2Params.level = IH264_LEVEL_40;
staticParams->videnc2Params.encodingPreset = algCreateParams->encodingPreset;
if ((staticParams->videnc2Params.encodingPreset == XDM_USER_DEFINED) &&
(algCreateParams->enableHighSpeed == TRUE))
{
staticParams->interCodingParams.interCodingPreset =
IH264_INTERCODING_HIGH_SPEED;
staticParams->intraCodingParams.intraCodingPreset =
IH264_INTRACODING_HIGH_SPEED;
staticParams->transformBlockSize = IH264_TRANSFORM_8x8;
}
/* In case of interlaced encode, below would be used. In case of progressive
this will be ignored. */
staticParams->enableAnalyticinfo = algCreateParams->enableAnalyticinfo;
staticParams->enableWatermark = algCreateParams->enableWaterMarking;
staticParams->videnc2Params.rateControlPreset = IVIDEO_USER_DEFINED;
staticParams->rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_USERDEFINED;
staticParams->rateControlParams.scalingMatrixPreset
= IH264_SCALINGMATRIX_NONE;
staticParams->rateControlParams.rcAlgo = algCreateParams->rateControlPreset;
staticParams->videnc2Params.maxBitRate = algCreateParams->maxBitRate;
staticParams->videnc2Params.inputDataMode = IVIDEO_ENTIREFRAME;
staticParams->videnc2Params.outputDataMode = IVIDEO_ENTIREFRAME;
/* Number of temporal layeers set to 1. This is the default value */
/* in the codec*/
if (0 == algCreateParams->numTemporalLayer)
{
staticParams->numTemporalLayer = IH264_TEMPORAL_LAYERS_1;
}
else
{
staticParams->numTemporalLayer = algCreateParams->numTemporalLayer;
}
/*Note: Enabling this flag adds svc enxtension header to the stream, not all decoders
are generally able to play back such a stream. */
/* Needs to be enabled to IH264_SVC_EXTENSION_FLAG_ENABLE for the
svc extension headers to be present in the stream*/
/*!!! Note: This flag needs to be enabled for the temporalId to be parsed
out from the stream.*/
staticParams->svcCodingParams.svcExtensionFlag =
algCreateParams->enableSVCExtensionFlag;
/*Slice Coding Parameters*/
staticParams->sliceCodingParams.sliceCodingPreset = IH264_SLICECODING_DEFAULT;
staticParams->sliceCodingParams.sliceMode = IH264_SLICEMODE_NONE;
staticParams->sliceCodingParams.streamFormat = IH264_STREAM_FORMAT_DEFAULT;
/* To set IDR frame periodically instead of I Frame */
staticParams->IDRFrameInterval = 1;
/* Override with App settings */
staticParams->IDRFrameInterval = algCreateParams->IDRFrameInterval;
/*To trigger workaround inside codec, where SAME_CODEC is overridden as same
codec type*/
staticParams->reservedParams[1] = 0x5A3EC0DE;
/* Enabling debug logging inside the codec. Details in appendix E in H.264
* encoder user guide.
*/
#ifdef ENCLINK_H264_PERFORMANCE_LOGGING
staticParams->debugTraceLevel = 1;
staticParams->lastNFramesToLog = ENCLINK_H264_PROFILER_NUM_FRAMES;
#endif
/* We want SPS and PPS to be set for every intra frame. Hence configure the
* the NALU control params to force encoder to insert SPS/PPS on every
* I frame
*/
#if 1
staticParams->nalUnitControlParams.naluControlPreset =
IH264_NALU_CONTROL_USERDEFINED;
ENCLINK_H264_SETNALU_MASK_SPS(staticParams->nalUnitControlParams.
naluPresentMaskIntraPicture);
ENCLINK_H264_SETNALU_MASK_PPS(staticParams->nalUnitControlParams.
naluPresentMaskIntraPicture);
ENCLINK_H264_SETNALU_MASK_SEI(staticParams->nalUnitControlParams.
naluPresentMaskIntraPicture);
ENCLINK_H264_SETNALU_MASK_SPS(staticParams->nalUnitControlParams.
naluPresentMaskIDRPicture);
ENCLINK_H264_SETNALU_MASK_PPS(staticParams->nalUnitControlParams.
naluPresentMaskIDRPicture);
ENCLINK_H264_SETNALU_MASK_SEI(staticParams->nalUnitControlParams.
naluPresentMaskIDRPicture);
ENCLINK_H264_SETNALU_MASK_SPS(staticParams->nalUnitControlParams.
naluPresentMaskStartOfSequence);
ENCLINK_H264_SETNALU_MASK_PPS(staticParams->nalUnitControlParams.
naluPresentMaskStartOfSequence);
ENCLINK_H264_SETNALU_MASK_SEI(staticParams->nalUnitControlParams.
naluPresentMaskStartOfSequence);
#endif
staticParams->entropyCodingMode = IH264_ENTROPYCODING_CABAC;
if (algCreateParams->profile != IH264_HIGH_PROFILE)
{
memset (&staticParams->intraCodingParams, 0,
sizeof(IH264ENC_IntraCodingParams));
staticParams->transformBlockSize = IH264_TRANSFORM_4x4;
if (algCreateParams->profile == IH264_BASELINE_PROFILE)
{
staticParams->entropyCodingMode = IH264_ENTROPYCODING_CAVLC;
}
}
#if 1
staticParams->vuiCodingParams.vuiCodingPreset = IH264_VUICODING_USERDEFINED;
staticParams->vuiCodingParams.hrdParamsPresentFlag = 1;
staticParams->vuiCodingParams.aspectRatioInfoPresentFlag = 0;
staticParams->vuiCodingParams.aspectRatioIdc = 0;
staticParams->vuiCodingParams.videoSignalTypePresentFlag = 0;
staticParams->vuiCodingParams.videoFormat = 0;
staticParams->vuiCodingParams.videoFullRangeFlag = 0;
staticParams->vuiCodingParams.timingInfoPresentFlag = 1;
staticParams->vuiCodingParams.numUnitsInTicks = 1;
#endif
/* Uncomment below settings if SEI/meta data needs to be enabled */
/* staticParams->videnc2Params.metadataType[0] = IH264_SEI_USER_DATA_UNREGISTERED; */
return 0;
}