典型问题分析(1)---- 腾讯视频播放《长津湖之水门桥》视频花屏

问题现象

MIUI系统安装腾讯视频APP,搜索并且播放《长津湖之水门桥》,播放的视频出现闪烁的绿点

问题分析
  • 设置选项中关闭HW Overlay 功能,也就是将所有的图层强制使用GPU合成,此问题不再复现
  • kernel 的log中存在ACE的 error,表明 DPU(Display Processing Unit)出现了错误,引发了错误的中断
问题原因

在花屏的时间点,dumpsys SurfaceFlinger 观察到:
surfaceview  buffer属性
看到 AFBCCrop 的区域(0,4,32,134) (left,top,right,bottom);实际的buffer 宽高是864x374
AFBC 的super block size 分为 16x16 和 32x8 两种;根据 Tile 和 Linear 的不同,对于宽高的对齐要求也不一样
如果是 Tile mode,Tile mode是对四个相邻的 superblock 一起解码,对齐要求是:
Align_width = superblock_width x 4
Align_height = superblock_height x 4

Linear Mode,Linear Mode 下对单独的 superblock 进行解码:
Align_width = superblock_width
Align_height = superblock_height

如果输入 buffer 的实际宽高不满足对齐要求,Gralloc 分配Buffer 时会进行自动对齐,理论上,对齐的宽高不会超过一个 Tile 或者 superblock 的宽高,Tile 模式下 padding_width 和 padding_height 最高不超出128;上面的 AFBC crop 的134显得很异常

根据上面的 flags选项,可以看到 AFBC flag信息:

MALIDP_BUFFER_AFBC = 0x00000001 
MALIDP_BUFFER_AFBC_WIDEBLK = 0x00000002
MALIDP_BUFFER_AFBC_SPLITBLK = 0x00000004
MALIDP_BUFFER_AFBC_YTR = 0x00000008
MALIDP_BUFFER_AFBC_SPARSE_MODE = 0x00000010
MALIDP_BUFFER_AFBC_SOLID_COLOR = 0x00000020
MALIDP_BUFFER_AFBC_TILED_HEADERS = 0x00000040

一般 RGBA 的 buffer flag=95(DEC) = 0x5F(HEX)拥有除了solid color 之外的所有属性
上面 YUV NV12 的flag 为 24641,包含tiled 和 AFBC属性

实际原因是 media codec 产生AFBC buffer 和实际下的AFBC参数是不一致的,导致解码错误

dump AFBC buffer 发现:
按照 alloc_height=384计算:
Buffer header size = (896*384)/256 x 16 = 0x5400. 由于需要page(4K)对齐,和32byte的文件头,文件中payload的起始地址是0x60020.

按照 alloc_height=512计算:
Buffer header size = (896*512)/256 x16 = 0x7000. 由于需要page对齐(4K),和32byte的文件头,文件中payload的起始地址是0x70020.

计算方法:superblock_count *16 Bytes,superblock_count 等于 align 之后的width * align 之后的height

从dump的AFBC文件来看,payload的offset是0x60020, 所以VPU是按照384 buffer_height编码afbc buffer而不是gralloc中定义的512;需要修改VPU对AFBC编码部分的处理。
AFBC 文件 payload
864x374 NV12_AFBC 格式的对齐要求是怎样的?
根据 flag,NV12_AFBC是 Tiled,所以
Align_width = 16x4 = 64
Align_height= 16x4 = 64
对齐后的宽高为896x384

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些具体的步骤。 1. 使用 requests 库获取电影《长津湖》的影评数据 ``` import requests from bs4 import BeautifulSoup url = 'https://movie.douban.com/subject/1291828/comments?start={}&limit=20&sort=new_score&status=P' comments = [] for i in range(10): # 爬取前10页的数据 response = requests.get(url.format(i*20)) soup = BeautifulSoup(response.text, 'html.parser') comment_items = soup.select('.comment-item') for item in comment_items: comment = item.select('.short')[0].text.strip() comments.append(comment) ``` 2. 对获取的数据进行预处理 ``` import pandas as pd import jieba # 将评论数据转成 DataFrame 格式 df = pd.DataFrame(comments, columns=['comments']) # 对评论数据进行分词 df['words'] = df['comments'].apply(lambda x: jieba.lcut(x)) ``` 3. 进行可视化分析 ``` import matplotlib.pyplot as plt from wordcloud import WordCloud # 将所有评论的分词结果拼接成一个字符串 text = ' '.join(df['words'].sum()) # 生成词云 wordcloud = WordCloud(background_color='white', width=800, height=600).generate(text) # 绘制词云图 plt.figure(figsize=(10, 8)) plt.imshow(wordcloud, interpolation='bilinear') plt.axis('off') plt.show() ``` 这里使用了 jieba 库对评论数据进行分词,并使用了 wordcloud 库生成词云图。您可以根据需要对数据进行更加详细的分析和可视化。需要注意的是,在爬取网页数据时需要遵守相关法律法规,不得进行侵犯他人权益的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值