目前的IPNC RDK默认支持的是High profile的h264编码。为了兼容性的需要,用户也需需要配置main profile或者的是baseline。下面的代码可以实现main profile的配置,baseline也是同理。
TI的h264编码器提供高质量和高速度的选项,在高质量情况下图像质量最好,但性能略差。在高速度的情况下,性能最优。为了满足系统的要求,用户会需要配置高速模式,在high profile的1080p分辨率use case下,高速度模式已经支持。但在megapixel编码模式和MP/Baseline的情况下,需要做一定修改来支持高速模式。
如何修改高速模式下的Main profile
Chris Meng:
目前的IPNC RDK代码支持的是P帧的qpMax/min的修改。在实际应用中,为了实现最好的效果,用户需要减少qpMinI的值。为了获得最小的码流来满足码率控制,用户需要增加qpMaxI的值。这两点需要通过下面文档的介绍来修改。
如何修改默认的qpMaxI/qpMinI/qpI的值。
heng:
回复 Chris Meng:
此方法适用于dm36x的IPNC SDK 5.1V吗?如果不适用,如何修改?
Chris Meng:
回复 heng:
你好,
此方法适用于dm36x的IPNC SDK 5.1V吗?如果不适用,如何修改?
不可以。两者使用的算法库的参数是不同的。
yang ran:
回复 Chris Meng:
您好,请问次方法适用于dvr rdk吗?
Chris Meng:
回复 yang ran:
yang ran您好,请问次方法适用于dvr rdk吗?
基本可以使用,DVR RDK里面使用的库是一样的,只是应用程序上可能有些差别,基本是一样的。
s s4:
你好,使用的平台为DM8127J3,IPNC_RDKV3.5.0,运行在双通道模式下,H264:1080P,H264:D1.按照pdf文档中的方法修改,出现下面的错误:
[m3video] 4183: ENCODE: Create in progress … !!! [m3video] 4242: ENCODE: Creating CH0 of 1920 x 1080, pitch = (1920, 1920) [PROGRESSIVE] [NON-TILED ], bitrate = 8000 Kbps … [m3video] 4349:!ERROR!:ENCLINK::links_m3video/iva_enc/encLink_h264.c:[191]::INTERNAL ERROR:-1 [m3video] ALGCONTROL FAILED:CMD:1 [m3video] ERROR: XDM_UNSUPPORTEDPARAM = 14, [m3video] ERROR: XDM_FATALERROR = 15 [m3video] ERROR: IH264ENC_UNSUPPORTED_INTRACODINGPARAMS = 23, [m3video] ERROR: IH264ENC_UNSUPPORTED_H264ENCDYNAMICPARAMS = 31, [m3video] [m3video] 4349:ERR::linkID:10000025::channelID:0::errorCode:-5::FileName:links_m3video/iva_enc/encLink_h264.c::linuNum:1379::errorCondition:(algStatus == XDM_EOK) [m3video] ENCLINK_H264:HEAPID:0 USED:1896 [m3video] 4350: Assertion @ Line: 901 in links_m3video/iva_enc/encLink_common.c: retVal == ENC_LINK_S_SUCCESS : failed !!!
请问还有什么地方需要修改的,多谢!
Chris Meng:
回复 s s4:
你好,
提示的是IH264ENC_UNSUPPORTED_INTRACODINGPARAMS错误,你能提供一下你的intracoding的动态参数么?
s s4:
回复 Chris Meng:
你好,下面是修改的静态及动态参数:
修改1处:static Int enclink_h264_set_params_stream_preset(){………..
if(staticParams->videnc2Params.profile != IH264_HIGH_PROFILE ) { staticParams->transformBlockSize = IH264_TRANSFORM_4x4; staticParams->rateControlParams.scalingMatrixPreset = IH264_SCALINGMATRIX_NONE; dynamicParams->rateControlParams.scalingMatrixPreset = IH264_SCALINGMATRIX_NONE;#if 0 staticParams->intraCodingParams.intraCodingPreset = IH264_INTRACODING_DEFAULT; dynamicParams->intraCodingParams.intraCodingPreset = IH264_INTRACODING_DEFAULT; staticParams->interCodingParams.interCodingPreset = IH264_INTERCODING_USERDEFINED; dynamicParams->interCodingParams.interCodingPreset = IH264_INTERCODING_USERDEFINED;#endif staticParams->intraCodingParams.intraCodingBias = IH264ENC_INTRACODINGBIAS_HIGH_SPEED; dynamicParams->intraCodingParams.intraCodingBias = IH264ENC_INTRACODINGBIAS_HIGH_SPEED; staticParams->intraCodingParams.intraCodingPreset = IH264_INTRACODING_HIGH_SPEED; dynamicParams->intraCodingParams.intraCodingPreset = IH264_INTRACODING_HIGH_SPEED;
staticParams->interCodingParams.interCodingPreset = IH264_INTERCODING_HIGH_SPEED; dynamicParams->interCodingParams.interCodingPreset = IH264_INTERCODING_HIGH_SPEED;
staticParams->intraCodingParams.lumaIntra4x4Enable = 255; dynamicParams->intraCodingParams.lumaIntra4x4Enable = 255; staticParams->intraCodingParams.lumaIntra8x8Enable = 0; dynamicParams->intraCodingParams.lumaIntra8x8Enable = 0; }…….
}
修改2处:if((algObj->u.h264AlgIfObj.dynamicParams.videnc2DynamicParams.inputWidth == 1920 && algObj->u.h264AlgIfObj.dynamicParams.videnc2DynamicParams.inputHeight == 1080 && algObj->u.h264AlgIfObj.dynamicParams.videnc2DynamicParams.targetFrameRate <= 30000) || algObj->u.h264AlgIfObj.staticParams.videnc2Params.profile != IH264_HIGH_PROFILE ) { #if 0 algObj->u.h264AlgIfObj.dynamicParams.interCodingParams.interCodingPreset = IH264_INTERCODING_USERDEFINED; algObj->u.h264AlgIfObj.dynamicParams.interCodingParams.meAlgoMode = IH264ENC_MOTIONESTMODE_DEFAULT; algObj->u.h264AlgIfObj.dynamicParams.intraCodingParams.intraCodingPreset = IH264_INTRACODING_USERDEFINED; algObj->u.h264AlgIfObj.dynamicParams.interCodingParams.minBlockSizeP = IH264_BLOCKSIZE_8x8; algObj->u.h264AlgIfObj.dynamicParams.interCodingParams.minBlockSizeB = IH264_BLOCKSIZE_8x8; #endif algObj->u.h264AlgIfObj.dynamicParams.interCodingParams.interCodingPreset = IH264_INTERCODING_HIGH_SPEED; algObj->u.h264AlgIfObj.dynamicParams.interCodingParams.meAlgoMode = IH264ENC_MOTIONESTMODE_HIGH_SPEED; algObj->u.h264AlgIfObj.dynamicParams.intraCodingParams.intraCodingPreset = IH264_INTRACODING_HIGH_SPEED; algObj->u.h264AlgIfObj.dynamicParams.interCodingParams.minBlockSizeP = IH264_BLOCKSIZE_16x16; algObj->u.h264AlgIfObj.dynamicParams.interCodingParams.minBlockSizeB = IH264_BLOCKSIZE_16x16; }
修改3处:for (chId=0; chId < VENC_CHN_MAX; chId++) { //pContext->h264Profile[chId] = VENC_CHN_HIGH_PROFILE; pContext->h264Profile[chId] = VENC_CHN_MAIN_PROFILE;//test main profile with high speed
下面是只作了"修改3处"的修改,改为MAIN profile;而未做"修改1处,修改2处"的修改,即为原始代码,程序可以正常运行,打印出的动态参数信息:
[m3video] intraCodingParams -> intraCodingPreset : 0 [m3video] intraCodingParams -> lumaIntra4x4Enable : 255 [m3video] intraCodingParams -> lumaIntra8x8Enable : 0 [m3video] intraCodingParams -> lumaIntra16x16Enable : 15 [m3video] intraCodingParams -> chromaIntra8x8Enable : 15 [m3video] intraCodingParams -> chromaComponentEnable : 1 [m3video] intraCodingParams -> intraRefreshMethod : 0 [m3video] intraCodingParams -> intraRefreshRate : 0 [m3video] intraCodingParams -> gdrOverlapRowsBtwFrames : 0 [m3video] intraCodingParams -> constrainedIntraPredEnable : 0 [m3video] intraCodingParams -> intraCodingBias : 0
请帮我看看有没有问题,谢谢!
s s4:
回复 Chris Meng:
您好,intracoding已提供,帮我看下有没有问题,以及实现main profile/baseline 下的高速模式,还需要修改哪些地方,谢谢
s s4:
回复 Chris Meng:
你好,我使用的编码器版本为REL.500.V.H264AVC.E.IVAHD.02.00.04.01,
在Doc目录下H264_Encoder_HDVICP2_UserGuide.pdf文档第64页,IH264ENC_IntraCodingPreset为IH264_INTRACODING_HIGH_SPEED的前提是:Intra coding params for highspeed encoding.1、Me algo mode should be IH264ENC_MOTIONESTMODE_HIGH_SPEED.2、IH264ENC_TransformBlockSize should be IH264_TRANSFORM_8x8.
而在第68页,IH264ENC_TransformBlockSize 为 IH264_TRANSFORM_8x8,Transform blocks size is 8×8: Valid for only High Profile
根据编码器数据手册上的信息,是不是这个版本的编码器不支main/baseline profile下的高速模式。