android8.0平台camera monkey拷机卡死异常

最近在处理一个camera monkey拷机卡死的问题,卡死在停止录像的画面。

monkey测试命令

monkey -p com.android.camera2 --throttle 300 --ignore-crashes --ignore-timeouts --ignore-security-exceptions -v -v -v 50000000 &

camera卡住的时候,把mediaserver进程的backtrace打印可发现卡在audiosource::waitoutstandingencodingframes_l函数中,异常log:

debugger -b [pid]

...

[04-28 16:35:43]"binder:237_4" systid=2571

[04-28 16:35:43] #00 pc 00018cd8 /system/lib/libc.so (syscall+28)

[04-28 16:35:43] #01 pc 00047529 /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)

[04-28 16:35:43] #02 pc 000a7adb /system/lib/libstagefright.so (android::audiosource::waitoutstandingencodingframes_l()+54)

[04-28 16:35:43] #03 pc 000a787b /system/lib/libstagefright.so (android::audiosource::reset()+82)

[04-28 16:35:43] #04 pc 000a77e9 /system/lib/libstagefright.so (android::audiosource::~audiosource()+44)

[04-28 16:35:43] #05 pc 000a794d /system/lib/libstagefright.so (android::audiosource::~audiosource()+12)

[04-28 16:35:43] #06 pc 0000ac5b /system/lib/libutils.so (android::refbase::decstrong(void const*) const+70)

[04-28 16:35:43] #07 pc 00049c4f /system/lib/libmediaplayerservice.so (android::stagefrightrecorder::~stagefrightrecorder()+206)

[04-28 16:35:43] #08 pc 00049e7b /system/lib/libmediaplayerservice.so (android::stagefrightrecorder::~stagefrightrecorder()+2)

[04-28 16:35:43] #09 pc 00047eef /system/lib/libmediaplayerservice.so (android::mediarecorderclient::release()+34)

...

把调试log打开,并跟踪其代码流程如下

238 1538 v audiosource: set stoptime: 80223601 us

代码:

stagefrightrecorder.cpp

status_t stagefrightrecorder::stop() {

int64_t stoptimeus = systemtime() / 1000;

for (const auto &source : { maudioencodersource, mvideoencodersource }) {

if (source != nullptr && ok != source->setstoptimeus(stoptimeus)) {

alogw("failed to set stoptime %lld us for %s",

(long long)stoptimeus, source->isvideo() ? "video" : "audio");

}

}

audiosource.cpp

status_t audiosource::setstoptimeus(int64_t stoptimeus) {

mstopsystemtimeus = stoptimeus;

return ok;

}

238 1523 v audiosource: datacallbacktimestamp: 80264993 us

238 1523 v audiosource: drop audio frame at 80264993 stop time: 80223601 us

代码:

audiosource.cpp

if (mstopsystemtimeus != -1 && timeus >= mstopsystemtimeus) {

alogv("drop audio frame at %lld stop time: %lld us",

(long long)timeus, (long long)mstopsystemtimeus);

mnomoreframestoread = true;

mframeavailablecondition.signal();

return ok;

}

238 1538 i audiosource: read: mbuffersreceived is empty and mnomoreframestoread

代码

audiosource.cpp

status_t audiosource::read(

mediabuffer **out, const readoptions * /* options */) {

mutex::autolock autolock(mlock);

*out = null;

if (minitcheck != ok) {

alogi("read: minitcheck not ok");

return no_init;

}

while (mstarted && mbuffersreceived.empty()) {

mframeavailablecondition.wait(mlock);

if (mnomoreframestoread) {

alogi("read: mbuffersreceived is empty and mnomoreframestoread");

return ok;

}

}

此处当mbuffersreceived为空且mnomoreframestoread被设置时候,直接返回.

04-30 07:57:53.687 238 1538 v mediacodecsource: puller (audio) posting eos

04-30 07:57:53.730 238 1513 v mediacodecsource: puller (audio) reached eos

04-30 07:57:53.730 238 1513 v mediacodecsource: encoder (audio) reached eos

代码

mediacodecsource.cpp

case kwhatpull:

status_t err = msource->read(&mbuf);

if (mbuf != null) {

mnotify->post();

msg->post();

} else {

handleeos();

}

mediacodecsource.cpp

void mediacodecsource::puller::handleeos() {

alogv("puller (%s) posting eos", misaudio ? "audio" : "video");

// android::callstack cs("puller::handleeos");

sp msg = mnotify->dup();

msg->setint32("eos", 1);

msg->post();

}

因为从source获取到的buffer为空,于是判定为eos,并进行eos处理。

04-30 07:57:54.126 238 1513 i mediacodecsource: encoder (audio) stopping

04-30 07:57:54.126 238 1513 i mediacodecsource: encoder (audio) already stopped

代码

mediacodecsource.cpp

case kwhatstop:

{

alogi("encoder (%s) stopping", misvideo ? "video" : "audio");

if (moutput.lock()->mencoderreachedeos) {

// if we already reached eos, reply and return now

alogi("encoder (%s) already stopped",

misvideo ? "video" : "audio");

(new amessage)->postreply(replyid);

break;

}

mpuller->stop();

由于先前已经接收到eos信息,因此mediacodecsource在处理kwhatstop时候直接返回。

此次问题发生的流程大致如下

应用层发出停止录像的请求 audiosource把该停止录像的请求之后的音频数据丢弃,并设置mnomoreframestoread mediacodecsource从audiosource读取到buffer为null,于是判定为eos,并进行相关处理,但并不清除mediacodecsource::puller::queue.mreadbuffers mediacodecsource接收到kwhatstop消息,发现已经进行了eos处理,于是放弃执行puller.stop(它会对puller::queue.mreadbuffers执行flush操作),直接返回。 audiosource最后进行reset时候,调用waitoutstandingencodingframes_l去等待直到所有buffer被释放,但有些buffer在audio puller::queue.mreadbuffers没有释放,于是在进程被hold在此处。

暂时的修改方案是

在第4步处理kwhatstop消息时候,即使已经进行过eos处理,仍然执行puller.stop,以确保puller::queue.mreadbuffers为空。

android拷机工具,Android8.0平台Camera monkey拷机卡死异常解决方案相关推荐

  1. android摄像头监控打电话卡死,Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案...

    本文将带你了解Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案,希望本文对大家学Android有所帮助. Android8.0平台Camera monkey ...

  2. android烤机按键变慢,Android8.0平台Camera monkey拷机卡死异常

    Android8.0平台Camera monkey拷机卡死异常 最近在处理一个camera monkey拷机卡死的问题,卡死在停止录像的画面. monkey测试命令 monkey -p com.and ...

  3. Android8.0平台Camera monkey拷机卡死异常

    Android8.0平台Camera monkey拷机卡死异常 最近在处理一个camera monkey拷机卡死的问题,卡死在停止录像的画面. monkey测试命令 monkey -p com.and ...

  4. Android8.0前后Camera架构对比(二十三)

    Android 的相机硬件抽象层 (HAL) 可将Camera2中较高层级的相机框架 API 连接到底层的相机驱动程序和硬件.相机子系统包括相机管道组件的实现,而相机 HAL 可提供用于实现您的这些组 ...

  5. Recovery刷机工具 v5.0.2.8

    Recovery刷机工具 v5.0.2.8 中文版 软件大小:4.3701MB 软件语言:简体中文 软件类别:常用软件 软件授权:免费版 更新时间:2012-12-17 应用平台:/WinXP/|Wi ...

  6. android拷机工具,【AndroidFramework】【EMMC拷机】混合拷机时盒子待机

    [AndroidFramework][EMMC拷机]混合拷机时盒子待机 问题结论 暂时确定为误按键,不是故障.问题关闭.后续完全保证无按键(物理隔离)情况下如果出现待机,请反馈. 问题描述 [EMMC ...

  7. android 打印kernel log,android8.0 kernel4.9.44 各层log打开

    一.问题 平台android8.0 kernel4.9.44,想加个i2c驱动,打开log都是一件脑瓜疼的事. 二.log总结 android有三种log. 1.kernel下面的,就是driver层 ...

  8. 最新支持android的手机型号,android8.0国产手机有哪些 哪些手机支持android 8.0

    谷歌Android 8.0系统虽然早已经发布,但是能用上的机型却寥寥无几.那么目前有哪些手机支持android 8.0呢,其中国产手机支持android8.0的有哪些? 现在,XDA整理并公布了39款 ...

  9. Android 8.0 学习(22) Android8.0平台Eng版本中显示界面切换闪红框

    Android O平台Eng版本中显示界面切换闪红框 1.问题 Version >= Android O1 在Android O平台Eng版本中,在切换显示界面.开任何apk.操作按钮等操作时, ...

最新文章

  1. 再见,Windows 7!盘点 2020 影响开发者的十大事件!
  2. 暴力探测蓝牙设备工具redfang
  3. 为什么torch.nn.Linear的表达形式为y=xA^T+b而不是常见的y=Ax+b?
  4. OSI、TCP/IP or Five-layer(Protocols Use) Model
  5. linux下toe网卡驱动,toe命令是干什么的,有没有大神解答一下
  6. PHP文件操作的经典案例
  7. 你不懂js系列学习笔记-类型与文法- 02
  8. thinkphp5 mysql助手_ThinkPHP5-数据库基本操作
  9. Python多线程学习(上)
  10. cesium cesium is not defined
  11. 删除excel 2007数据透视表
  12. 使用 ABAP 代码制作手机能够扫描的二维码(QRCode)
  13. 扬州工业机器人外壳设计排名_世界十大工业机器人制造商公布,排名第一的竟是……...
  14. 安卓手机显示没有网络连接到服务器,安卓手机 总是提示登录网络
  15. 计算机财务应用实验心得,金蝶财务软件实训心得.doc
  16. ShuffleNet神经网络
  17. 开发对接微信卡包会员卡_微信公众号实现会员卡领取功能
  18. 下载jar源码时,出现:cannt not download source Sources not found for
  19. QQ邮箱开通exchange的方法
  20. vue3 - 网页大转盘抽奖功能,支持后端接口确定最终奖品,可自定义轮盘宽高、颜色、字号、按钮等等(超详细的示例代码及注释开箱即用,稍微改改就能应用到你的项目中)

热门文章

  1. 橘子学Flink03之Flink的流处理与批处理
  2. 史上最强鸿蒙教程来袭!跟Android初学者分享几点经验,专题解析
  3. python数据科学导论_数据科学导论:Python语言(原书第3版)
  4. ubuntu18.04美化主题(完整版)
  5. 计算机系vlog,华为Mate40系列化身vlog神器,专业好用两手抓
  6. 荣耀10鸿蒙系统禁用列表
  7. 证券期货经营机构私募资产管理业务管理办法 2018年10月22日
  8. Linux应用基础——串口应用编程
  9. npoi2.0版本word中插入图片
  10. 【解决方案】如何搭建运动场体育赛事直播方案:EasyCVR综合智能化体育赛事直播