Firefly开源社区

123
发表新贴
打印 上一主题 下一主题

RK3288硬解码器(H265) 解码1080P视频问题

11

积分

0

威望

0

贡献

游客

积分
11

RK3288硬解码器(H265) 解码1080P视频问题

发表于 2015-8-21 13:59:49      浏览:32003 | 回复:21        打印      只看该作者   [复制链接] 楼主
在使用firefly盒子(rk3288)做视频的开发测试,发现在使用HEVC  H265硬解码器进行1080P解码时出现以下问题:
1、解码器设置的参数为width=1920,height=1080
2、给出的原始数据1920*1080的编码后数据
  解码结果:发现图像信息错位
最后跟踪原因:在进行解码过程中,解码器会出INFO_OUTPUT_FORMAT_CHANGED事件,获取的slice-height参数为1088。

想请教下,采用什么样的方式才能对1080P的数据进行正常的解码,或者如果对1080P的数据解码后,如何处理才能回复正常的图片



注:1、RK3288  HEVC H265解码器对720P的数据可正常解码,效果不错
       2、同样1080P的数据,其他机顶盒的HEVC H265解码器也可正常解码








解码器工作时OutputBuffer的代码如下所示:
ByteBuffer[] outputBuffers = mc.getOutputBuffers();
BufferInfo info = new BufferInfo();
int index = mc.dequeueOutputBuffer(info, timeout);
Log.v(TAG, "java output index="+index);
switch (index) {
case MediaCodec.INFO_TRY_AGAIN_LATER:
break;
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
mDecOutputFormat = mc.getOutputFormat();
mWidth = mDecOutputFormat.getInteger(MediaFormat.KEY_WIDTH);
mHeight = mDecOutputFormat.getInteger(MediaFormat.KEY_HEIGHT);
mSliceHeight = mDecOutputFormat.getInteger("slice-height");
mDecoderColorFormat = mDecOutputFormat.getInteger(MediaFormat.KEY_COLOR_FORMAT);
break;
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
outputBuffers = mc.getOutputBuffers();
break;
default:
if (index >= 0) {
Log.v(TAG, "before java output buffer,info.size="+info.size+",info.offset="+info.offset+",frameBuffer.capacity="+frameBuffer.capacity());
ByteBuffer outputData = outputBuffers[index];
//设置outputData的起始位置
outputData.position(info.offset);
//设置outputData可取数据的范围
outputData.limit(info.offset + info.size);
frameBuffer.put(outputData);
//释放编解码器的内存
mc.releaseOutputBuffer(index, false);
return info.size;
}
}


回复

使用道具 举报

936

积分

20

威望

19

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
936
发表于 2015-8-21 16:58:09        只看该作者  沙发
VPU 解码是16位数对齐的,1080不够16整除 就补到1088了。但rk在后期处理数据有点问题。
如果使用rk自己的编码器编码的数据 1080P是正常的,如果使用外部的数据源 1080P会出现数据偏位。

目前我们这边有个暂时的解决方案,得到数据后,在使用数据的时候,譬如显示的时候,将UV的数据,往前拷贝补齐位。1080就是往前补8行。这个方法有个后遗症,uv的补齐位数据缺失,所以,譬如你显示的时候,后8行就不要显示了,
回复

使用道具 举报

11

积分

0

威望

0

贡献

游客

积分
11
发表于 2015-8-21 18:20:11        只看该作者  板凳
用UV的数据往前拷贝补齐位,是不是说要删掉8行Y的数据,然后后面UV的数据前移,跟着Y的数据
回复

使用道具 举报

11

积分

0

威望

0

贡献

游客

积分
11
发表于 2015-8-21 18:22:12        只看该作者  地板
isle 发表于 2015-8-21 16:58
VPU 解码是16位数对齐的,1080不够16整除 就补到1088了。但rk在后期处理数据有点问题。
如果使用rk自己的 ...

用UV的数据往前拷贝补齐位,是不是说要删掉8行Y的数据,然后后面UV的数据前移,跟着Y的数据
回复

使用道具 举报

936

积分

20

威望

19

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
936
发表于 2015-8-22 09:11:30        只看该作者  5#
是的。
回复

使用道具 举报

11

积分

0

威望

0

贡献

游客

积分
11
发表于 2015-8-22 11:50:48        只看该作者  6#

按照你给的方案尝试了一下还是不行
我给的是1920*1080数据,解码后数据的大小还是3110400(1920*1080*3/2)。
按照你上面的解释,他会自动补齐,解码后的数据大小应该是3133440(1920*1088*3/2)才对吧?

我按照你给的方案,对3110400的数据做了以下处理
Y值取了0 --- 1920*1080之间的字节
UV值取了1920*1088 ---3110400之间的字节
但是结果还是图像错位。

回复

使用道具 举报

936

积分

20

威望

19

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
936
发表于 2015-8-24 09:24:36        只看该作者  7#
怎么会。我们这边已经验证过是可以的。
你一开始的图像是不是Y数据正常。UV数据下移?
回复

使用道具 举报

11

积分

0

威望

0

贡献

游客

积分
11
发表于 2015-8-24 10:04:50        只看该作者  8#
isle 发表于 2015-8-24 09:24
怎么会。我们这边已经验证过是可以的。
你一开始的图像是不是Y数据正常。UV数据下移?

一开始Y数据都不正常.UV数据我尝试过去掉,Y数据都不正常
回复

使用道具 举报

936

积分

20

威望

19

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
936
发表于 2015-8-25 09:24:42        只看该作者  9#
不正常是个什么样子 ,你前面不是说是错位么。截个图来看看
回复

使用道具 举报

11

积分

0

威望

0

贡献

游客

积分
11
发表于 2015-8-25 11:52:37        只看该作者  10#
isle 发表于 2015-8-25 09:24
不正常是个什么样子 ,你前面不是说是错位么。截个图来看看




解码的结果显示看的话,其实是Y、U、V数据都错位了,因为画面全绿屏,只是会有一些条纹看到在动,应该是Y的数据(黑色的部分),但是某一部分的Y信息,貌似显示了5个竖屏(图片中可清楚的看到)


回复

使用道具 举报

返回列表
123
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表