最近调的一个关于视频播放的小bug

  上星期接到一个CQ,问题是这样的:下载官方的爱奇艺或者搜狐视频apk在板子上安装之后,无法正常播放在线视频,点击视频播放之后总是弹出对话框“XXX has stopped”,或者整个视频APP闪退。

  于是我首先下载了一个爱奇艺的apk开始复现这个问题,然后从log进行分析,在kernel log发现线索:

[ 392.674685] android: (01-02 01:17:32) process pid: 3352, tid: 4326 crash![ 392.682842] c0 4326 (com.qiyi.video) com.qiyi.video[4326]: undefined instruction: pc=000000007805022c
[ 392.692649] c0 4326 (com.qiyi.video) Code: 0a000073 e3130003 1afffff9 e59f22bc (f1010200)

  可以看到这是一个undefined instruction问题,而且pc在user space,于是进一步查看logcat记录,user space的backtrace如下:

I/DEBUG ( 170): #00 pc 0008922c /data/app-lib/com.qiyi.video-1/libffmpeg_pps.so (ff_h264_find_start_code_candidate_armv6+52)
I/DEBUG ( 170): #01 pc 0014f52c /data/app-lib/com.qiyi.video-1/libffmpeg_pps.so

  从中可以看出问题的根源在于动态库libffmpeg_pps.so,而且根据后面的函数名,猜测与指令集兼容有关(测试平台是ARMv8的),所以反汇编libffmpeg_pps.so查看。

  命令:aarch64-linux-gnu-objdump -d libffmpeg_pps.so

  然后查看地址偏移f1010200

89220: e3130003 tst r3, #3
89224: 1afffff9 bne 89210 <ff_h264_find_start_code_candidate_armv6+0x18>
89228: e59f22bc ldr r2, [pc, #700] ; 894ec <ff_h264_find_start_code_candidate_armv6+0x2f4>
8922c: f1010200 setend be
89230: e313000c tst r3, #12
89234: 0a000007 beq 89258 <ff_h264_find_start_code_candidate_armv6+0x60>
89238: e4934004 ldr r4, [r3], #4

  可以看出是在执行指令setend时出错的,查看ARMv8的spec发现,这个指令已经被desperate了, libffmpeg已经有patch修复这个问题,如下:

commit 79fce1ec8abd017593c003917fc123f7119a78d6
Author: Martin Storsjö <[email protected]>
Date: Fri Jul 4 18:21:50 2014 +0300

arm: Avoid using the ‘setend‘ instruction on ARMv7 and newer

This instruction is deprecated on ARMv8, and it is serializing on
some ARMv7 cores as well [1].

[1] http://article.gmane.org/gmane.linux.ports.arm.kernel/339293

CC: [email protected]
Signed-off-by: Martin Storsjö <[email protected]>

diff --git a/libavcodec/arm/h264dsp_init_arm.c b/libavcodec/arm/h264dsp_init_arm.c
index 92658e7..f9712d8 100644
--- a/libavcodec/arm/h264dsp_init_arm.c
+++ b/libavcodec/arm/h264dsp_init_arm.c
@@ -104,8 +104,12 @@ av_cold void ff_h264dsp_init_arm(H264DSPContext *c, const int bit_depth,
{
int cpu_flags = av_get_cpu_flags();

- if (have_armv6(cpu_flags))
+ if (have_armv6(cpu_flags) && !(have_vfpv3(cpu_flags) || have_neon(cpu_flags))) {
+ // This function uses the ‘setend‘ instruction which is deprecated
+ // on ARMv8. This instruction is serializing on some ARMv7 cores as
+ // well. Therefore, only use the function on ARMv6.
c->h264_find_start_code_candidate = ff_h264_find_start_code_candidate_armv6;
+ }
if (have_neon(cpu_flags))
h264dsp_init_neon(c, bit_depth, chroma_format_idc);
}

  但是现在市面上大多数的视频播放apk采用的还是老的libffmpeg,而且搜狐视频app使用的是libtea_codecs.so(这个动态库中也包括setend这个指令导致出错),所以我们最终还是决定在kernel层解决这个问题,查看ARMv8的spec,发现有方法可以enable 这个指令,相关寄存器描述如下:

  

SCTLR_EL1.{SED, ITD, THEE, CP15BEN}

These bits control AArch32 functionality that is deprecated, or OPTIONAL and deprecated:

SED Disables use of the SETEND instruction.

ITD Disables use of the IT instruction.

THEE Enables use of the Thumb-EE instruction set.

CP15BEN Enables use of the CP15 DMB, DSB, and ISB barrier operations.

  

   fix的patch如下,作用也很简单,就是在系统初始化的是clear下上面提到的SCTLR_EL1寄存器中的SED位

Date: Wed Nov 12 16:40:07 2014 +0800

arm64: mm: Clear bit SED in sctlr_el1 to support SETEND instruction.

SETEND instruction is deprecated on ARMv8, we need to clear bit SED in
sctlr_el1 to make SETEND instruction available explicitly.

This patch is used to solve the issue that some video app would fail to
playback video.

diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S
index 7736779..39a032e 100644
--- a/arch/arm64/mm/proc.S
+++ b/arch/arm64/mm/proc.S
@@ -238,5 +238,5 @@ ENDPROC(__cpu_setup)
*/
.type crval, #object
crval:
- .word 0x000802e2 // clear
- .word 0x0405d11d // set
+ .word 0x000803e2 // clear
+ .word 0x0405d01d // set

  至于为什么改变这两个值就能到达修改sctlr_el1的目的,就牵涉到kernel的启动流程,以后再写文章分析吧。

时间: 2024-10-09 11:53:19

最近调的一个关于视频播放的小bug的相关文章

vue示例之transition-另外发现一个vue(可能的)小bug

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link href="//cdn.bootcss.com/animate.css/3.5.2/animate.css" rel="stylesheet"> <style&

【VS】一个秀智商下限的小BUG

写在前面的 先讲讲起因吧,在今天的程序调错过程中发现了一个数据类型的小BUG,就想重新打开一个VS窗口,然后新建一个控制台的解决方案,然后在里面调试我的代码,然后问题就来了. BUG 本来,在我的脑海中,打开VS2015的新建,应该是这样的: 没错吧,要啥有啥,一应俱全. 但是,实际上,我打开确是这样的: 一脸大写的懵逼 (╯°Д°)╯︵ ┻━┻ 心累 _(:з」∠)_ 解决方案都跑哪里去了?! 解决方案 我看着这个缺少解决方案的窗口干瞅了半天,才知道,原来是我打开的软件不对.正常情况下,我们都

两天撸一个天气应用微信小程序

这是一个完整的已经线上运行的天气应用小程序,点击可查看源码,可随意 star.也可以扫描下方的小程序码直接体验. 效果图: 说明 鸣谢:pure 天气 APP:首页样式借鉴了 pure天气 APP.如侵删. 数据来源 地理编码.天气数据均来自百度地图开放平台.个人开发完全免费,有对应的小程序 sdk,加入即可,但是返回的天气数据较少. 运行前准备 注册微信小程序,获取 appid 注册百度地图开放平台开发者,创建应用,获取 ak(其他配置自行查看) 在 app.js 中替换 globalData

【ASP.net控件】DropDownList数据绑定一个小bug

绑定数据出现这种情况,明明在第一项插入了一条数据,却始终在DropDownList中没有显示出来. 代码如下: if (!IsPostBack) { //绑定城市 DataTable dtCity = new HighSearch().GetCitySelect(); DropDownList1.DataSource = dtCity; DropDownList1.DataValueField = "citycode"; DropDownList1.DataTextField = &q

一个php多态性的小例子

多态性在 OO 中指 "语言具有以不同方式处理不同类型对象的能力",但 PHP 是弱类型语言,在这一点上就比较弱,仅有 instance of 可以用于判断对象的类型 多态性的优点:让代码更接近生活中的真实情况 一下是一个非常简单的多态性例子,描述在电脑上安装不同操作系统,linux, OS X, windows 和 computer 是两种不同类型的对象. interface os{ function name(); function creator(); } class linux

一个随机上翻的小效果

html <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="Content-Type" content="text/html; charset=uft-8"> <meta name="keywords

现学现卖的一个“快递查询“的小程序开发

最近微信小程序是炒的如火如荼,各种热门, 正好赶上这个热潮,这几天先把小程序技术文档看了个遍,结合教程手写了一个案例.今天写了一个快递查询的小demo,大致分为三步 产品需求,准备api,代码编写. 第一步:产品需求,我们需要实现如下图的一个功能,在文本框输入快递单号,点击查询,下面出来我们需要的快递信息 第二步:准备 我们先找一个快递的api接口,通过http://apistore.baidu.com/我们可以看到很多的api,我们找一个快递查询的 我们可以看到有接口地址,和一些参数.做好这个

小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和

小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数. 输入描述: 输入第一行为数字个数n (n ≤ 20) 第二行为n个数xi (1

一个字符编码处理小程序(一)

一个字符编码处理小程序(一)以前与他人合作申请了一个汉字输入法编码专利(YXY),现在决定继续在此基础上进行一些开发工作,要将它的编码拆分成前.中.后三个子串,以便作进一步的处理.用户故事可以表达为:作为一个代码的开发人员,需要将YXY编码拆分成前.中.后三个子字符串,以便作进一步的汉字分析处理.下面对照个人开发流程,进行开发工作:一. 计划估计这个任务需要多少开发时间.由于利用业余时间开发,开发时间呈现碎片化的状况:故这里只是估计纯的开发时间,大约需要两周.二. 开发1. 分析需求出入内容:Y