tju_hongwei 发表于 2015-8-21 13:59:49

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

在使用firefly盒子(rk3288)做视频的开发测试,发现在使用HEVCH265硬解码器进行1080P解码时出现以下问题:
1、解码器设置的参数为width=1920,height=1080
2、给出的原始数据1920*1080的编码后数据
解码结果:发现图像信息错位
最后跟踪原因:在进行解码过程中,解码器会出INFO_OUTPUT_FORMAT_CHANGED事件,获取的slice-height参数为1088。

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



注:1、RK3288HEVC 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;
//设置outputData的起始位置
outputData.position(info.offset);
//设置outputData可取数据的范围
outputData.limit(info.offset + info.size);
frameBuffer.put(outputData);
//释放编解码器的内存
mc.releaseOutputBuffer(index, false);
return info.size;
}
}

isle 发表于 2015-8-21 16:58:09

VPU 解码是16位数对齐的,1080不够16整除 就补到1088了。但rk在后期处理数据有点问题。
如果使用rk自己的编码器编码的数据 1080P是正常的,如果使用外部的数据源 1080P会出现数据偏位。

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

tju_hongwei 发表于 2015-8-21 18:20:11

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

tju_hongwei 发表于 2015-8-21 18:22:12

isle 发表于 2015-8-21 16:58
VPU 解码是16位数对齐的,1080不够16整除 就补到1088了。但rk在后期处理数据有点问题。
如果使用rk自己的 ...

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

isle 发表于 2015-8-22 09:11:30

是的。

tju_hongwei 发表于 2015-8-22 11:50:48

isle 发表于 2015-8-22 09:11
是的。

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

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

isle 发表于 2015-8-24 09:24:36

怎么会。我们这边已经验证过是可以的。
你一开始的图像是不是Y数据正常。UV数据下移?

tju_hongwei 发表于 2015-8-24 10:04:50

isle 发表于 2015-8-24 09:24
怎么会。我们这边已经验证过是可以的。
你一开始的图像是不是Y数据正常。UV数据下移?

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

isle 发表于 2015-8-25 09:24:42

不正常是个什么样子 ,你前面不是说是错位么。截个图来看看

tju_hongwei 发表于 2015-8-25 11:52:37

isle 发表于 2015-8-25 09:24
不正常是个什么样子 ,你前面不是说是错位么。截个图来看看




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


页: [1] 2 3
查看完整版本: RK3288硬解码器(H265) 解码1080P视频问题