当前位置: 技术问答>linux和unix
请教大家一个问题
来源: 互联网 发布时间:2016-08-02
本文导语: 本帖最后由 nosilence_2007 于 2010-01-25 17:01:41 编辑 这个问题呢比较大,贴代码很难。 希望过来人能够给点拨一下,一点思路也没有。 我们正在android平台上开发多媒体,AP有硬件加速器的。所以播放就用了硬件加速器。...
我们正在android平台上开发多媒体,AP有硬件加速器的。所以播放就用了硬件加速器。
但是播放H264出现了问题,比如一个4分钟左右的视频,他能够播放几次,但是不断循环的话就会decoder 出错,而究其原因不是硬件加速器的原因,而是往里面输入的数据就出错了。
数据是从 文件->tempbuf->buffer->mp4 parser ->decoder
这里 文件到tempbuf数据是对的,但是从tempbuf->bffer就会出错,如果出错的话,decoder就出错了。
我当初怀疑是sdcard读写文件的问题,但是我将文件放到onenand或者 通过
mkdir temp;
mount -t tmpfs none /temp;
然后文件拷到temp下
如果不断循环还是会出错。
而奇怪的是为什么重新开始多次之后会出错呢? 因为每次播放不都是在重复操作么? 我们的stream 和frm buffer都是事前预置的
因为我们没有调试器,所以也不知道到底是哪里的问题。调了很久也不知道到底问题出在哪里。
看起来好像是野指针的问题,但是怎么也找不到这个在哪里?!! 现在又不知道是否有可能硬件错误或者是其他错误
希望哪位大哥能够点拨一下。 非常谢谢
|
文件->tempbuf->buffer->mp4 parser ->decoder
因为4分钟左右的视频 是分段读取的。 重复播放实际上是重新seek文件,然后读取。硬件应该是没有问题,parser本身应该也没有问题。
这期间可能会出现的问题,内存管理出错,buffer这边是否是固定的数组还是malloc出来的。建议将buffer改的大上两倍,调试一下如果循环的次数多了。那基本上就能肯定buffer管理出错。
因为4分钟左右的视频 是分段读取的。 重复播放实际上是重新seek文件,然后读取。硬件应该是没有问题,parser本身应该也没有问题。
这期间可能会出现的问题,内存管理出错,buffer这边是否是固定的数组还是malloc出来的。建议将buffer改的大上两倍,调试一下如果循环的次数多了。那基本上就能肯定buffer管理出错。
|
我建议你把你要问的问题下到标题上面高手打开的几率不会很高的!
|
如果是不断重复出错的,更可能的是软件的问题,不是sdcard的问题。
而且你也发现了是但是从tempbuf->bffer就会出错,那么就有可能是tempbuf 到buffer这里的内存的管理有问题。
能否使用log记录每次崩溃前这个地方的内存的状态那?
而且你也发现了是但是从tempbuf->bffer就会出错,那么就有可能是tempbuf 到buffer这里的内存的管理有问题。
能否使用log记录每次崩溃前这个地方的内存的状态那?
|
水平不够 帮你顶一顶
|
关注
|
重点检查 tempbuf->buffer 业务逻辑的代码,加入assert和日志。
为什么你们的平台不能调试呢?
为什么你们的平台不能调试呢?
|
关键点就是在"他能够播放几次,但是不断循环的话就会decoder 出错"
1)循环播放跟一次播放/停止/再次播放 本身就有些不一样。
你可以查一查
2)“出错”,出什么错?
让大家猜迷?
思路已经比较清晰,请顺着这条路跟下去。
1)循环播放跟一次播放/停止/再次播放 本身就有些不一样。
你可以查一查
2)“出错”,出什么错?
让大家猜迷?
思路已经比较清晰,请顺着这条路跟下去。
|
文件->tempbuf->buffer
没看明白怎么会跟sdcard有关系? 文件是在sdcard上? tempbuf是在内存里吗?buffer是在内存里吗?
没看明白怎么会跟sdcard有关系? 文件是在sdcard上? tempbuf是在内存里吗?buffer是在内存里吗?
|
问题其实蛮奇怪的。按经验来看,读文件,和最后的解码本身出错的概率很小。也就是说问题应该集中在tempbuf和buffer之间。
重新播放是需要重新打开文件,找文件头播放的,这个时候产生的buffer都是临时申请的,基本上如果出错都是次次出错,要么就是堆或者栈爆掉。
如果这边查证不出来的话,再检查一下,是否有野指针,修改了内存的值,这个很难查出来。需要读一下系统log,看看期间发生了哪些事件。调试就是不停的查找验证过程。
如果担心硬件问题,就把硬件加速先关起来。看看是否一样出错。
重新播放是需要重新打开文件,找文件头播放的,这个时候产生的buffer都是临时申请的,基本上如果出错都是次次出错,要么就是堆或者栈爆掉。
如果这边查证不出来的话,再检查一下,是否有野指针,修改了内存的值,这个很难查出来。需要读一下系统log,看看期间发生了哪些事件。调试就是不停的查找验证过程。
如果担心硬件问题,就把硬件加速先关起来。看看是否一样出错。
|
我觉得根据描述野指针、硬件不稳定概率比较大。
出错的地址是否是固定的?
如果是怀疑野指针的话,要么从被改写的内容看,如果地址固定且修改不频繁的话还可以使用数据断点(如果CPU有的话)