Hello!
When using the H264 decoder on our DM8147 and the result has strange macroblock-like artifacts on the right side of the image.
Input:
- device: DM8147
- codec: H264VDEC_TI DEV.500.V.H264AVC.D.HP.IVAHD.02.00.15.01
- input: H264 frame created by the TI H264 encoder
Result:
After decoding any frame the output YUV420SP image always has weird macroblock-like artifacts on the right side like it incorrectly slided the whole image to the left a bit. These artifacts are present on Y, U and V planes.
Before decoding the luma buffer (OUTPUT_BUFFER_Y, size 13381632 bytes) is set to zeros (black) and the chroma buffer (OUTPUT_BUFFER_UV, size 6690816 bytes) is set to 0xFF (green) values.
The decoder is used with frame level process call and is expected to decode only I/IDR and P frames up to 4096x3072 resolution (High profile 5.1).
What parameters cause this behaviour? The artifacts appear on all resolutions tested from 640x* to 4096x*. Should the decoder be called with a header-only decode first?
Input H264 (INPUT_BUFFER): http://www.karsiac.com/ti_h264d_ra/h264.raw (2560x1920)
Output YUV420SP converted to JPEG: http://www.karsiac.com/ti_h264d_ra/h264.jpg (see green (UV value 0xFF) artifacts on right side)
Decoder parameters:
IH264VDEC_Params params; IH264VDEC_DynamicParams dyn_params; memcpy(¶ms, &IH264VDEC_PARAMS, sizeof(IH264VDEC_Params)); params.viddec3Params.size = sizeof(IH264VDEC_Params); params.viddec3Params.maxHeight = 3072; params.viddec3Params.maxWidth = 4096; params.viddec3Params.dataEndianness = XDM_BYTE; params.viddec3Params.forceChromaFormat = XDM_YUV_420SP; params.viddec3Params.operatingMode = IVIDEO_DECODE_ONLY; params.viddec3Params.displayDelay = IVIDDEC3_DECODE_ORDER; params.viddec3Params.inputDataMode = IVIDEO_ENTIREFRAME; params.viddec3Params.outputDataMode = IVIDEO_ENTIREFRAME; params.viddec3Params.errorInfoMode = IVIDEO_ERRORINFO_OFF; params.viddec3Params.displayBufsMode = IVIDDEC3_DISPLAYBUFS_EMBEDDED; params.viddec3Params.metadataType[0] = IVIDEO_METADATAPLANE_NONE; params.viddec3Params.metadataType[1] = IVIDEO_METADATAPLANE_NONE; params.viddec3Params.metadataType[2] = IVIDEO_METADATAPLANE_NONE; params.pConstantMemory = NULL; params.dpbSizeInFrames = IH264VDEC_DPB_NUMFRAMES_AUTO; params.bitStreamFormat = IH264VDEC_BYTE_STREAM_FORMAT; params.errConcealmentMode = IH264VDEC_NO_CONCEALMENT; params.temporalDirModePred = IH264VDEC_DISABLE_TEMPORALDIRECT; params.svcExtensionFlag = IH264VDEC_DISABLE_SVCEXTENSION; params.svcTargetLayerDID = IH264VDEC_TARGET_DID_DEFAULT; params.svcTargetLayerTID = IH264VDEC_TARGET_TID_DEFAULT; params.svcTargetLayerQID = IH264VDEC_TARGET_QID_DEFAULT; params.presetLevelIdc = IH264VDEC_LEVEL51; params.presetProfileIdc = IH264VDEC_PROFILE_HIGH; params.detectCabacAlignErr = IH264VDEC_ENABLE_CABACALIGNERR_DETECTION; params.detectIPCMAlignErr = IH264VDEC_ENABLE_IPCMALIGNERR_DETECTION; params.debugTraceLevel = IH264VDEC_DEBUGTRACE_LEVEL0; params.lastNFramesToLog = 0; params.enableDualOutput = IH264VDEC_DUALOUTPUT_DISABLE; params.processCallLevel = IH264VDEC_FRAMELEVELPROCESSCALL; params.enableWatermark = IH264VDEC_WATERMARK_DISABLE; params.decodeFrameType = IH264VDEC_DECODE_IP_ONLY; memcpy(&dyn_params, &IH264VDEC_TI_DYNAMICPARAMS, sizeof(IH264VDEC_DynamicParams)); dyn_params.viddec3DynamicParams.size = sizeof(IH264VDEC_DynamicParams); dyn_params.viddec3DynamicParams.decodeHeader = XDM_DECODE_AU; dyn_params.viddec3DynamicParams.displayWidth = 0; dyn_params.viddec3DynamicParams.frameSkipMode = IVIDEO_NO_SKIP; dyn_params.viddec3DynamicParams.newFrameFlag = XDAS_TRUE; dyn_params.viddec3DynamicParams.lateAcquireArg = 0; dyn_params.viddec3DynamicParams.putDataFxn = NULL; dyn_params.viddec3DynamicParams.putDataHandle = NULL; dyn_params.viddec3DynamicParams.putBufferFxn = NULL; dyn_params.viddec3DynamicParams.putBufferHandle = NULL; dyn_params.viddec3DynamicParams.getDataFxn = NULL; dyn_params.viddec3DynamicParams.getDataHandle = NULL; dyn_params.svcELayerDecode = IH264VDEC_DISABLE_ELAYERDECODE; dyn_params.deblockFilterMode = IH264VDEC_DEBLOCK_DEFAULT; dyn_params.svcTargetLayerDID = IH264VDEC_TARGET_DID_DEFAULT; dyn_params.svcTargetLayerTID = IH264VDEC_TARGET_TID_DEFAULT; dyn_params.svcTargetLayerQID = IH264VDEC_TARGET_QID_DEFAULT;
Decoder options for decoding call:
XDM2_BufDesc inBuf; inBuf.numBufs = 1; inBuf.descs[0].buf = (XDAS_Int8*)INPUT_BUFFER; inBuf.descs[0].bufSize.bytes = INPUT_BUFFER_SIZE; inBuf.descs[0].memType = XDM_MEMTYPE_RAW; inBuf.descs[0].usageMode = XDM_MEMUSAGE_DATASYNC; inBuf.descs[0].accessMask = 0; IH264VDEC_InArgs inArgs; inArgs.viddec3InArgs.size = sizeof(IH264VDEC_InArgs); inArgs.viddec3InArgs.inputID = 1; inArgs.viddec3InArgs.numBytes = buffer.get_buffer_size(); inArgs.lateAcquireArg = 0; XDM2_BufDesc outBufs; outBufs.numBufs = 2; outBufs.descs[0].buf = (XDAS_Int8*)OUTPUT_BUFFER_Y; outBufs.descs[0].bufSize.bytes = OUTPUT_BUFFER_Y_SIZE; outBufs.descs[0].memType = XDM_MEMTYPE_RAW; outBufs.descs[0].usageMode = XDM_MEMUSAGE_DATASYNC; outBufs.descs[0].accessMask = 0; outBufs.descs[1].buf = (XDAS_Int8*)OUTPUT_BUFFER_UV; outBufs.descs[1].bufSize.bytes = OUTPUT_BUFFER_UV_SIZE; outBufs.descs[1].memType = XDM_MEMTYPE_RAW; outBufs.descs[1].usageMode = XDM_MEMUSAGE_DATASYNC; outBufs.descs[1].accessMask = 0; IH264VDEC_OutArgs outArgs; outArgs.viddec3OutArgs.size = sizeof(IH264VDEC_OutArgs);