惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Google DeepMind News
Google DeepMind News
L
LINUX DO - 最新话题
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Vercel News
Vercel News
Last Week in AI
Last Week in AI
月光博客
月光博客
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
博客园 - 叶小钗
NISL@THU
NISL@THU
C
Check Point Blog
K
Kaspersky official blog
N
News and Events Feed by Topic
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
Arctic Wolf
T
Threatpost
GbyAI
GbyAI
L
LINUX DO - 热门话题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy & Cybersecurity Law Blog
N
News and Events Feed by Topic
Scott Helme
Scott Helme
P
Privacy International News Feed
The Register - Security
The Register - Security
G
GRAHAM CLULEY
Recorded Future
Recorded Future
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog
Project Zero
Project Zero
Cyberwarzone
Cyberwarzone
Webroot Blog
Webroot Blog
Microsoft Security Blog
Microsoft Security Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
D
DataBreaches.Net
J
Java Code Geeks
AWS News Blog
AWS News Blog
Help Net Security
Help Net Security
Engineering at Meta
Engineering at Meta
M
MIT News - Artificial intelligence
T
Threat Research - Cisco Blogs
Google DeepMind News
Google DeepMind News

博客园 - loop

brew 出现 git 错误的问题分析 xcode 编译器在各个arch下面默认宏 parallels无法启动之大乌龙-流水账版 关于结对敏捷开发 mac上parallel与virtualbox无法共存 git submodule 使用 VLC plugin加载代码分析 在parallel中安装archlinux + awesome inline 小结 小米盒子试用 keepass管理密码 chrome同步书签cpu占用率过高问题解决 git对svn操作 mac上的ssh proxy客户端 --iSSH个人修改版 终于可以在家更新mplayer了 不要一个人吃饭 在archlinux中安装chrome 关于MP4 fileformat中 duration及timescale相关的几个地方 linux ramdom hung up
android openmax hardware decoder 整合记录
loop · 2013-08-16 · via 博客园 - loop

关于android中openmax中hardware decoder的调用中,整合过程比较简单。主要是对OMXCodec的封装进行调用。

这里记录一下碰到的主要的问题:

1 现象:开关几次后程序出现crash。

  几台设备都有此现象,内存大的机器可以开关的次数多些,内存小的机器开关次数少。video尺寸小的可开关的次数多些,video尺寸小的可开关次数少。典型的内存泄露,而且与video decoder的解码buffer有关。经过痛苦万分的无数次打log,发现GraphicBuffer没有释放。

解决方案也简单的可以,从surface中申请的ANativewindow没有被释放。也就是

ANativeWindow_fromSurface()

....

....

ANativeWindow_release()

没有成对调用。

2 现象:播放某些流或者DTV时出现解码错误且不再恢复

  由于我们的framework和OMXCodec的调用方式,导致过早decoder退出。具体些讲,由于我们的封装接口调用OMXCodec的解码是通过read函数调用实现的。read内部会去调用tracksource->read.如果出现数据不足或者错误太多,容易导致tracksource的buffer不够。我们这时候会在tracksource的read给出数据不足的返回值。OMXcodec的封装认为收到这个错误返回值把自己的状态设置为Endofstream,之后就不再解码了。

解决方案:参考AnotherPacketSource。在tracksource read阻塞住,等新的数据填入。

3 现象:解码时卡死

这个是由于调用OMXCodec的调用为阻塞导致的。我们往codec塞数据和decode的调用都是在一个线程中。先塞数据,再decode。如果decode中出现错误数据过多或者数据不足时,按照上一个问题的解决方案,会出现等待新数据输入的过程。可是这时候在framework中decode函数无法返回,也就没有办法输入更多数据了。典型的死锁过程。

解决方案:放弃上一个方案中的阻塞方法。出现数据不足时,给OMXCodec返回一个空的MediaBuffer,并且告知没有错误发生。上面两个问题完美解决。

4 现象:无法使用overlay

使用系统默认播放器时,会有Log表明在SurfaceFlinger做doComposeSurfaces函数时使用的是HWC_OVERLAY。而我们的framework只能使用到HWC_FRAMEBUFFER。对比awesome player对OMXCodec的调用,发现调用的OMXCodec的接口,以及nativewindow的操作并没有太大区别。

最后只好从Java层开始review,终于在 MediaPlayerService::Client::setVideoSurfaceTexture中发现了native_window_api_connect(anw.get(), NATIVE_WINDOW_API_MEDIA);调用。

解决方案: 在申请好nativewindow后调用native_window_api_connect,在release nativewindow前调用native_window_api_disconnect。