OMX 移植解码器

移植个解码器而已,没必要还非得自己写个播放器吧
参考libstatefright/codecs目录里的代码,封装实现start、stop、read三个接口就可以了


程序的流程是
播放器打开文件,得到输入流 ,输入流传递给解码器, 解码器解码, 解码器输出流, 输出流来到java端,java端调用SurfaceView绘图.

statefrightPlayer使用的AwesomePlayer来实现的,
所以从Awesomeplayer开始看就行,首先是分离器的实现,对于系统本身不支持的格式是没有分离器的,
具体查看代码(我只以本地文件播放举例,不说网络流播放),
Awesomeplayer.cpp的setDataSource_l(
   const sp<DataSource> &dataSource) {
   sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
这个就是创建分离器的地方,查看代码MediaExtractor.cpp的create函数

datasource的sniff函数就是自动检测媒体格式容器的类型的,楼主要新增原系统无法识别的媒体格式,必然无法得到有效的分离器,所以这里需要自己创建自己分离器,我就暂时没有自己写相应的sniff函数,每一种格式的XXXXExtractor.cpp函数中有个SniffXXXX函数,在Awesomeplayer的构造函数中的这一句DataSource::RegisterDefaultSniffers()就是注册好所有的sniff函数,额,这个你想标准化点就这么干吧,写一个自己的XXXExtractor类,照样写个XXXXsinff函数,在RegisterDefaultSniffers中加入自己的函数,

解码阶段了,
status_t AwesomePlayer::initVideoDecoder() {
  mVideoSource = OMXCodec::Create(
  mClient.interface(), mVideoTrack->getFormat(),
  false,  
  mVideoTrack);

这个就是创建的解码器了,create的最后一个参数就是分离出来的独立的视频流,具备的接口最重要的就是read接口,是分离器中实现的,这个track是XXXXExtractor中的getTrack获取的

对应的视频流格式就对应你自己解码器

解码器的逻辑主要集中在OMXCodec.cpp中,sp<MediaSource> softwareCodec =
  InstantiateSoftwareCodec(componentName, source);
这个函数就是查找解码器的,你肯定要在kDecoderInfo数组里面加入自己解码器名称,在kFactoryInfo注册自己解码器创建函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值