This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DM8147 H264 decoder artifact

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(&params, &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);

Sincerely,
Attila Baranyai