前面写了两篇blog,介绍mfc的hw decoder加入到mplayer和vlc的事情,由于平时懒散惯了,很少总结完整的技术文档,只是收到的邮件太多,我有空都尽量及时回复,只是问的邮件多了,自然很多问题都是重复的,总是回复类似的问题,实在太枯燥,也没那么多时间.现在随机选几个代表性的回复,贴在这里,给需要的朋友参考!
Q:在mplayer那部分代码加入S3C6410的MFC
A:我提供一种方式:
1.在etc/codecs.conf里面添加自己的decoder
2.编写vd_s3c**.c,格式可以参考
vd_rawvideo.c和vd_real.c
3.将vd_s3c**加入到vd.c里面
4.vo部分可以添加
vo_s3c**.c
5.将vo_s3c*加入到video_out.c
具体流程可以阅读mplayer源码DOC/tech目录下的文档
Q:我H264的video stream 同样是baseline的,我封装了一个文件,
不能解出来,
可能是格式上有出入,但我对H264不是很了解。
我真正要用的是,从网络上获取了H264 的video stream后,用S3C 6410
的MFC 来解码。
但我不知道怎么下手做了
A:仔细看下MFC的那几个文档就可以了,文件封装的H264可能需要自己做demuxer,那个文档里面里面有提,ring
buf模式支持文件封装的数据,我没测试,linebuf只支持标准的es流,我是用mplayer把文件demuxer出来的h264数据送到
linebuf模式的mfc,这样来测试的。
网络上取H264数据,是rtp/udp还是http?反正都是文件封装的问题,最好用基本的es
流,如果没有文件封装,那需要在本地解析组装NAL
Q:我收到的buffer 根本就没有传给MFC 的 line_buffer. 这个我不明白 ,我也是按MFC 的测试程序做的。
因为给line_buffer 的数据为空,所以一直就没P,P,…… I, P……
进去,解出来就是花的。我初始化是在一个函数里,解码是在别一个函数里
A:decoder是从pStrmBuf获取H.264的数据,然后把pYUVBuf里面的yuv数据取出来显示,所以你每次都要更新pStrmBuf
更
新pStrmBuf的方法可以自己实现,也可以用mfc实例里面现成的NextFrameH264函数:
使用NextFrameH264函数的时
候,需要设置源数据(H.264)的的起始地址p_start和结束地址p_end,所以在每次调用NextFrameH264函数之前都需要下面这段代
码重新设置p_start和p_end
pFrameExCtx =
FrameExtractorInit(FRAMEX_IN_TYPE_MEM, delimiter_h264,
sizeof(delimiter_h264), 1);
file_strm.p_start =
file_strm.p_cur = (unsigned char *)data;
file_strm.p_end =
(unsigned char *)(data + len);
FrameExtractorFirst(pFrameExCtx, &file_strm);
所以正确的顺序应该这样:
先设置
p_start,p_end,然后调用NextFrameH264更新pStrmBuf,然后再decode,再取yuv
-->set_pos(p_start,end)->update_pStrmBuf(NextFrameH264)-->decode->display->...
你
的代码结构里面会遇到一个问题,就是开始初始化的时候的H.264源数据会没有播放,所以影片开头的一些画面可能会看不到,你可以根据自己的实际程序结构
组织下,比如mfc的测试代码是每次播放完之后就预取下帧数据,所以他的代码是这样的结构:
init->--/|\->decode->display->getNextFrame---|
|---<----------------------------------|
你也可以自己组织其他模式,比如他还支持decoder和
diaplayer的同步,所以就可以用多线程模式来提高效率
Q:我看了MFC测试程序的代码,他把SPS帧和第一个I帧之间的P帧给丢弃掉了,这个是正确的处理方法吗?
A:mfc初始化的时候必须要按照他那个文档说的,就是config stream(pps,sps,sei,I
frame)这样初始化成功后,才可以送入p帧或者I帧正常解码,如果没有完整的config
stream,只能在整个数据里面搜索,直到成功搜索到为止,具体可以看mfc的实例代码,他里面也应该是这样的实现。
0001是nal的
startcode,查看实际的h264码流,有时候也可能是001,所以这时候要具体分析下,大致就是如此
Q:是否有S3C.C的原
碼可以供參考 ,謝謝
A:不提供源码.下面是大概的实现思路
s3c.c是按照vlc codec接口标准自己写的代码
也就是用mfc的api实现一个符合vlc codec接口
mfc 的api实现方法可以看mfc demo
vlc codec接口可以参考vlc代码目录下codec/rawvideo.c以及codec/realvideo.c的实现
模仿而已
OpenDecoder
CloseDecoder
DecodeBlock
需要实现类似这样的函数
还可以去看看vlc官方文档
http://wiki.videolan.org/Documentation:Hacker%27s_Guide/Decoder
阅读(1514) | 评论(0) | 转发(0) |