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.

请教:有关DM368的demos中deocde解码视频文件“视频解码有错误”的问题

大家好:

    开发环境:基于DM368开发的单板。

   使用软件环境:DVSDK4.02

   使用的样例程序:dvsdk-demos_4_02_00_01/decode

  遇到问题:

   (1)在解码视频文件时,当解码的是全部正确的视频文件,能够正常显示。

   (2)在解码有误码的视频文件时,decode会报错,并且直接退出。并不是如mplayer那样继续播放出现马赛克。

   (3)  视频发生误码的原因是我们的源视频经过传输后接收下来再显示,在传输中不可避免有低概率错误。

(4)发生错误的信息提示及代码位置:

代码位置

Vdec2.c 
(f:\forlena\ti-dvsdk\dmai_2_20_00_15\packages\ti\sdo\dmai\ce)	
***********************************************
  /* Decode video buffer */
    status = VIDDEC2_process(hVd->hDecode, &inBufDesc, &outBufDesc, &inArgs,
                             &outArgs);

    Buffer_setNumBytesUsed(hInBuf, outArgs.bytesConsumed);

    Dmai_dbg4("VIDDEC2_process() ret %d inId %d inUse %d consumed %d\n",
              status, Buffer_getId(hDstBuf), outArgs.outBufsInUseFlag,
              outArgs.bytesConsumed);

    if (status != VIDDEC2_EOK) {
        if (XDM_ISFATALERROR(outArgs.decodedBufs.extendedError)) {
            Dmai_err2("VIDDEC2_process() failed with error (%d ext: 0x%x)\n",
                      (Int)status, (Uns) outArgs.decodedBufs.extendedError);
            return Dmai_EFAIL;
        }
        else {
 Dmai_dbg1("VIDDEC2_process() non-fatal error 0x%x\n", (Uns) outArgs.decodedBufs.extendedError); ret = Dmai_EBITERROR;
        }
    }

1.其中,fatal error错误与non fatal error错误都见过。

2.从ti-dvsdk\codecs-dm365_4_02_00_00\packages\ti\sdo\codecs\h264dec\docs\h264_decoder_dm365_userguide中了解到,当出现fatal error 时,需要XDM_RESET,并且也可以在代码包中找到类似的例子。还没有尝试,是否有效。但我们出现这个错误的情况较少。

3.当出现non fatal error时,我们的错误符合这种描述:

If decoder found serious error in Header, decoder will return from that point with bytesConsumed equal to the stream data consumed till that point.  Decoder will also release the output buffer given in that process call (will set freeBufID[0] = inputID ). outputID[0] will be set to 0 (nothing to display
If decoder found frame loss error (one or more complete frame was missing) while parsing the header, decoder will return from that point with bytesConsumed set as 0. Decoder will also release the output buffer given in that process call (will set freeBufID[0] = inputID ). outputID[0] will be set to 0 (nothing to display). 

但是没有找到如何能跳过错误的数据,继续解码后续数据的方法。

手册中说,当出现non fatal error时,并没有提到如何处理.

错误时打印的错误提示为:

@192,753,373us: [+0 T:0x41348490 S:0x41347c3c] OM - Memory_getBufferPhysicalAddress> Enter(virtAddr=0x42d7982b, size=4)
@192,753,584us: [+1 T:0x41348490 S:0x41347c3c] OM - Memory__getPhysicalAddress> Enter(virtAddr=0x42d7982b, size=4)
@193,086,195us: [+1 T:0x41348490 S:0x41347c3c] OM - Memory__getPhysicalAddress> found in cb(Sc=0x42c29000, Ec=0x430bb7c0, Ss=0x42d7982b, Es=0x42d7982f, PSc=0x8768b000)
@193,086,460us: [+1 T:0x41348490 S:0x41347c3c] OM - Memory__getPhysicalAddress> returning physAddr=0x877db82b
@193,086,657us: [+0 T:0x41348490 S:0x41347c3c] OM - Memory_getBufferPhysicalAddress> return (0x877db82b)
@193,086,850us: [+2 T:0x41348490 S:0x41347c74] ti.sdo.dmai - [Buffer] Set user pointer 0x42d7982b (physical 0x877db82b)
Loader_getFrame Buffer_setNumBytesUsed = 2097152
@193,087,374us: [+0 T:0x41348490 S:0x41347314] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_process> Enter (handle=0x22bd20, inBufs=0x41347464, outBufs=0x41347458, inArgs=0x41347cc8, outArgs=0x41347528)
@193,087,652us: [+5 T:0x41348490 S:0x413472f4] CV - VISA_enter(visa=0x22bd20): algHandle = 0x22bd58
@193,087,855us: [+0 T:0x41348490 S:0x413472e4] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Enter(alg=0x22bd58)
@193,088,051us: [+0 T:0x41348490 S:0x413472ac] ti.sdo.ce.osal.SemMP - Entered SemMP_pend> sem[0x22b450] timeout[0xffffffff]
@193,088,281us: [+0 T:0x41348490 S:0x413472ac] ti.sdo.ce.osal.SemMP - Leaving SemMP_pend> sem[0x22b450] status[0]
@193,088,522us: [+0 T:0x41348490 S:0x413472f4] ti.sdo.ce.alg.Algorithm - Algorithm_activate> Exit
ARM Load: 6% Video fps: 4 fps Video bit rate: 416 kbps Sound bit rate: 0 kbps Time: 00:02:44 Resolution: 1920x1080

@193,926,829us: [+5 T:0x41348490 S:0x413472fc] CV - VISA_exit(visa=0x22bd20): algHandle = 0x22bd58
@193,927,185us: [+0 T:0x41348490 S:0x413472ec] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Enter(alg=0x22bd58)
@193,927,444us: [+0 T:0x41348490 S:0x413472cc] ti.sdo.ce.osal.SemMP - Entered SemMP_post> sem[0x22b450]
@193,927,677us: [+0 T:0x41348490 S:0x413472cc] ti.sdo.ce.osal.SemMP - Leaving SemMP_post> sem[0x22b450]
@193,927,879us: [+0 T:0x41348490 S:0x413472fc] ti.sdo.ce.alg.Algorithm - Algorithm_deactivate> Exit
@193,928,063us: [+0 T:0x41348490 S:0x41347314] ti.sdo.ce.video2.VIDDEC2 - VIDDEC2_process> Exit (handle=0x22bd20, retVal=0xffffffff)
@193,928,269us: [+2 T:0x41348490 S:0x41347364] ti.sdo.dmai - [Vdec2] VIDDEC2_process() ret -1 inId 3 inUse 0 consumed 4178585
@193,928,526us: [+2 T:0x41348490 S:0x41347364] ti.sdo.dmai - [Vdec2] VIDDEC2_process() non-fatal error 0x200
Loader_getFrame
Loader_getFrame Buffer_getNumBytesUsed(hBuf) = 4178585
Loader_getFrame hLoader->async=0
ringBufferEnd = 0X430BB7C0
Loader_readData delta = -2081433
Loader_readData hLoader->w = 0X42F7982B
Loader_readData hLoader->r1 = 0X43175AC4
Loader_readData toRead = 4178585
Loader_readData 4444
Loader_readData 4444 hLoader->r1 =0X43175AC4
Loader_readData 4444 ptr = 0X43175AC4
hLoader->mParams.flags=0
Memory_CACHED 11
Loader_readData 4444 catchUp = 0
Loader_readData numBytes = 2011801
@193,964,888us: [+7 T:0x41348490 S:0x41347c64] ti.sdo.dmai - [Loader] Error reading data from file
numBytes = 2011801 ferror(hLoader->file) = 1
Error: Failed to get frame of encoded data from file system


我理解,这个错误对应的应该就是:

If decoder found serious error in Header, decoder will return from that point with bytesConsumed equal to the stream data consumed till that point.  Decoder will also release the output buffer given in that process call (will set freeBufID[0] = inputID ). outputID[0] will be set to 0 (nothing to display

但如果希望decode能够跳过错误数据,继续解码显示后续视频,应该怎么处理呢?


希望能够有人给予指导。:)

  • 你好,

    首先请检查一下你们使用的解码器版本是否为最新,如果不是请更新到最新的版本。下载链接:http://software-dl.ti.com/dsps/dsps_public_sw/codecs/DM36x/index_FDS.html。

    对于non fatal error,最新版本的解码器是如下描述,对于你还需要继续解码的,一定不能调用XDM_RESET。所以你需要修改应用程序,把下一帧的数据送给解码器解码就可以了。对于系统程序来说,显示是希望保持显示前一帧正常解码的输出。

    If decoder returns Non-FATAL error :
    o If the application is interested in continuing with the same stream, then Application should not do XDM_RESET.
    o If the application is interested in providing a fresh stream, then Application should do XDM_RESET.

  • 你好,

    请在最新的算法库下获得更新的信息,看看是否有同样bytesConsumed数据过大的问题?

    更新算法库,请把原来的算法目录用新的替换掉,然后再重新编译一下。如果编译出现问题,请参考以下下面的链接:

    http://processors.wiki.ti.com/index.php/DM365_codecs_DVSDK_2_10_integration

  • 你好 :

    希望我的回答对你有帮助。

    你的insmod cmemk.ko 的时候给cmem分配了多少内存?可以适当的扩大cmem,缩小linux的内存,如果不用qt的情况下,linux内存需求不大。

  • 同样大小的文件,只要没有错误,就可以正确解码。不知道是否和内存有关?

  • 你好,孟工,

    我下载了dm365_h264dec_02_00_00_13_production.bin,这个应该替换呢?:)

    阅读了链接中文档,没有找到相应的,只是说tar 解压就ok了,可是这个也不是个压缩包。

    :)谢谢

  • Feller,

    .bin文件是Linux的安装文件,请在Linxu下安装。

  • 您好,

       我按照您的建议,更新了decode 264的库,重新生成了版本,但是在遇到有错误字节时,仍然与之前的现象一致。

    1.decode直接退出,而不会继续播放。

    2.decode告警码如下

    @92,141,679us: [+2 T:0x41348490 S:0x41347364] ti.sdo.dmai - [Vdec2] VIDDEC2_process() ret -1 inId 2 inUse 0 consumed 4188020
    @92,141,935us: [+2 T:0x41348490 S:0x41347364] ti.sdo.dmai - [Vdec2] VIDDEC2_process() non-fatal error 0x200
    @92,152,502us: [+7 T:0x41348490 S:0x41347c94] ti.sdo.dmai - [Loader] Reader not keeping up with processing
    Error: Failed to get frame of encoded data from file system


    3.原始参考文件与在传输中发生了一些错误,但是错误很少。字节错误的视频文件如附件。
    其中,我使用Elecard StreamEye Tools /h264visa或者是其他视频播放器,来播放有错误的视频,都只是有马赛克,而不会有播错误,或者卡住
    4.附件中还包含了我更新decode 264库的步骤。
    5.其中,视频文件发生错误的位置是:
    0x2ed940:两个字节
    0x370ba0:大约16个字节
    谢谢您,麻烦再帮忙看看有什么思路可以解决?
    :)

     

    附件.rar
  • Shi Feller,

    更新解码库的流程应该没有什么问题。

    请问你出现下面错误的时候,使用的是哪个码流?

    @92,141,679us: [+2 T:0x41348490 S:0x41347364] ti.sdo.dmai - [Vdec2] VIDDEC2_process() ret -1 inId 2 inUse 0 consumed 4188020

    @92,141,935us: [+2 T:0x41348490 S:0x41347364] ti.sdo.dmai - [Vdec2] VIDDEC2_process() non-fatal error 0x200

    请问在出现上面错误后,再调用decode应用程序解码其他没有错误的码流,是否能正常解码?



  • 您好,chris meng

    1.请问你出现下面错误的时候,使用的是哪个码流?

    出现错误的码流是文件名中加了一个“1byte”字符串。也就是名字比较长那个。

    2.请问在出现上面错误后,再调用decode应用程序解码其他没有错误的码流,是否能正常解码?

    (1)   在采用dvsdk_demos的decode程序中,还没有做这个实验。也就是出错后自动加载另一个视频码流文件播放。

      (2)因为现象是出错后直接退出进程。  我做过再次手动启动decoe进程,是可以解码视频码流的。

    (3)我今天晚上计划尝试下使用loop播放,看在出现错误后,是否能够重新播放。

    (4)也可以尝试下XDM_RESET等的操作后,视频是否能够继续播放后续码流文件。这个是针对fatal_error。

    (5)另一个疑问,就是non fatal error是,一般那如何进行后处理?

    谢谢:)

  • Feller,

    看下来还是bytesConsumed输出过大的问题,我在内部询问,为什么会这么大。

    一般来说,non fatal error的错误,就是根据bytesConsumed的输出,解码接下来的码流。

  • Feller,

    算法同事使用算法库自带的测试程序解码ENC_FRAM720P - 1byte.dat文件,没有复现你的问题,没有出现comsumed byte过大的情况,具体见附件log。这个测试程序没有使用DMAI/CE。

    你能否把DMAI里面从开始解码文件ENC_FRAM720P - 1byte.dat,打印的所有的consumed的相关信息都提供一下,我们对比一下附件log文件。

  • 我尽快提供该log。

    另外,孟工对下面这个问题有没有什么建议?

    http://www.deyisupport.com/question_answer/dsp_arm/davinci_digital_media_processors/f/39/t/102816.aspx

  • 孟工,log如附件。谢谢:)

  • Feller,

    两个log的codec消耗byte数完全对不上。你解码的是ENC_FRAM720P - 1byte.dat么?

  • 你好,我们这些天又做相应的实验。

    视频文件对于不同位置的误码,解码器的现象是不同的。

    1.有的位置虽然视频文件有错误,但是decode能够正常解码播放。

    2.有的位置视频文件有错,会提示0x200的告警码,并且提示consumed byte太大。

    3.有的位置视频文件优醋,会提示0x853的告警码,并提示consumed byte为0.

    对于有告警码的

    0x200:我理解应该是代表bit9的错误, XDM_APPLIEDCONCEALMENT,代表应用错误恢复。

    0x853:我理解0x800代表XDM_CORRUPTEDDATA,数据问题或破坏。

    但是,在deoce错误的编码中,没有找到0x53。错误编码直到0x52.

    不知道这个代表什么错误呢?

    谢谢:)

  • Feller,

    在dm365_h264dec_02_00_00_13_production\packages\ti\sdo\codecs\h264dec\ih264vdec.h文件里,你可以找到下面的信息:

    typedef enum IH264VDEC_ExtendedError {

    。。。


        IH264VDEC_EX_ERR_UNINTENSIONAL_FRAME_LOST              = 0x53,

        IH264VDEC_EOSTR                                        = 0x80

    } IH264VDEC_ExtendedError;

  • Feller,

    文档里面0x52错误和头文件里面的不一致,请以头文件为准。

  • 最近又做了一些实验,我们暂时不准备让decode来完成错误恢复了,这个机制暂时了解不清楚。

    我们准备在应用层添加错误处理来规避。

    后面有时间,继续研究decode的错误恢复机制。

    谢谢