| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android.MediaCodec解码P010,texelFetch读取非归一化纹素。 -> 正文阅读 |
|
[移动开发]Android.MediaCodec解码P010,texelFetch读取非归一化纹素。 |
废话不说,直接上干货,懂的都懂,不懂的慢慢消化。 一、Android.MediaCodec解码P0101、正如之前的文章所说的,通过API判断是否支持HEVCProfileMain10HDR10,其实这些都不是硬性条件。想利用MediaCodec解码出P010格式的10bit数据,主要还是取决于手机DSP芯片是否支持。通过测试发现目前市面流行的芯片厂商,目前发现高通的SDM系列(即新代的晓龙)支持解码出P010格式的10bit(源码依据:?https://android.googlesource.com/platform/hardware/qcom/sdm845/display/+/android-10.0.0_r40/gralloc/gralloc_priv.h) 2、在创建MeidaCodec之前配置的MediaFormat,需要指定颜色格式KEY_COLOR_FORMAT为0x7F420888 即 CodecCapabilities.COLOR_FormatYUV420Flexible,虽然这个格式定义很模糊,但好歹也跟系统说明了输出格式是YUV类型,要不然解码输出队列会抛异常提示,解不出数据。(查询官网资料,在Android 14,API33-Tiramisu,现在(2022-4-10)还是Preview预览版,在MediaCodecInfo.CodecCapabilities增加COLOR_FormatYUVP010类型的变量声明。) 3、以示例编码数据planet_sdr_1920x1080@30fps.h265为例子,常规解码得到的数据长度为
如果输入的是10bit的planet_hdr_1920x1080@30fps.h265,得到的一帧解码数据长度是
符合之前的文章的理论分析预期。此时可以证明当前解码的数据就是10bit的YUV raw data。 并且可以发现解码输出队列dequeueOutputBuffer的MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED,会输出格式变化
上面hardware/qcom/sdm845的源码连接就有其定义:
测试文件可以到这领取
二、texelFetch读取非归一化纹素在GLSL环境要想精确地换取每个像素的值,这个时候就不能使用传统的 texture(sampler2d)?,因为采样器sampler2d默认是float精度,而且texture采用函数会涉及归一化、过滤以及插值等复杂操作,基本无法得到某一确切像素的值。 此时很多网上教程就会教你使用纹素获取函数 texelFetch ,texlFetch 是 OpenGL ES 3.0 引入的 API ,它将纹理视为图像,可以精确访问像素的内容,我们可以类比通过索引来获取数组某个元素的值。texelFetch 使用的是未归一化的坐标直接访问纹理中的纹素,不执行任何形式的过滤和插值操作,坐标范围为实际载入纹理图像的宽和高。 texelFetch 使用起来比较方便,在片段着色器中,下面 2 行代码可以互换
基础教学我就不再这累述了,那么利用 texelFetch提取理想的纹素 需要注意些什么呢? 1、升级EGLVersion到3.0以上,EGLConfig支持10bit的rgb位深
2、创建的纹理对象一定要注意、注意、注意两个地方:
第一点:要想利用texelFetch提取纹素,这里的 GL_TEXTURE_MAG_FILTER 和?GL_TEXTURE_MIN_FILTER不能使用线性过滤的方式,即GL_LINEAR or?GL_LINEAR_***的参数。(其实上面的基础介绍已经加粗提示) 第二点:一定要注意!注意!注意! internalFormat、format、dataType这三个参数的组合,详情请仔细阅读官方文档?https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml?(用google翻译一行行的慢慢看) 结合我们现在实际的10bit双字节数据,这三个参数要该如何填写? 我们可以利用GL_R16UI、GL_RED_INTEGER、GL_UNSIGNED_SHORT(对应无符号双字节short类型的数据)或者GL_R16I、GL_RED_INTEGER、GL_SHORT(对应有符号双字节short类型的数据) 其中GL_RED 和 GL_RED_INTEGER是单通道的格式,GL_RG和GL_RG_INTEGER就是双通道的格式,我们可以利用单通道的格式存储Y分量,利用双通道的格式存储UV分量。至于带和不带INTEGER的格式区别是什么,其实官方文档已经给出解释:
在从MeidaCodec解码出来的 6266880 长的ByteBuffer,可以直接利用asShortBuffer方法转换成short类型的数据,免得自己处理合并过程还需要注意大端小端问题,还浪费性能。大致的代码如下所示:
3、到最后的GLSL环境,shader大致如下
利用texelFetch读取文素,需要确保着色器中用于纹理采样的类型与存储在纹理中的数据类型匹配。在本例中,由于使用的2D纹理包含无符号数值,因此采样器类型应为usampler2D,并且希望将采样操作的结果存储在类型为uvec4的变量中,每个个通道都是uint的类型;如果是有符号的数值,那么采样器对应的isampler2d,结果返回类型为ivec4的变量。 并且一定要注意显式的声名精度范围!要不然默认的int or uint精度只有1位。 下一章讨论BT.2020的10bit yuv -> rgb。 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 21:22:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |