HDRSample: 用MediaCode和OpenGL实现了HDR和SDR转换
这个库用MediaCode和OpenGL实现了HDR和SDR转换,如果你觉得有所收获,给这个库点个赞吧,你的鼓励是我前进最大的动力。 HDR和SDR转换是为了解决以下问题:
1,播放流程,不是所有手机都支持HDR屏幕会导致视频变灰,需要转换成SDR视频
2,编辑流程,HDR和SDR混合编辑时,要不HDR转SDR,要不SDR转HDR,不然会出现色差
现有功能实现如下,供大家一起学习一起上进:
1,输出模式(直接输出到Surface、经过OpenGL中转)
2,视图模式(无缝切换SurfaceView和TextureView)
3,多种纹理来源配置(Auto、YUV420Buffer、外部纹理OES、Y2Y)、纹理位深配置(8位、10位、16位)
4,HDR转SDR CubeLut配置,PQ转SDR12种、HLG转SDR4种
5,HDR转SDR Shader配置,该Shader支持对PQ视频和HLG视频进行色度矫正、色调参考、色调映射、色域转换、Gamma压缩
6,色调映射已支持Android8的Tonemap、Android13的Tonemap、BT2446A、BT2446C、Hable
7,色域转换已支持BT2020转BT709Clip、Compress、adpative_l0_cusp
8,10个测试视频无缝切换
关键代码
代码已经都加上注释了,如果有疑惑,欢迎加入HDR视频开发讨论群
1,Shader目录下实现了色度矫正、色调参考、色调映射、色域转换、Gamma压缩
2,YUV420FragmentShader和GLYUV420Renderer 纯Shader实现四种YUV420的Buffer转换成纹理
4,Java代码读取CubeLut文件,从3s左右优化成70ms
5,直接使用3D纹理加载CubeLut数据
6,2D纹理、OES纹理、Y2Y纹理渲染
7,判断MediaCodec是否支持10位解码
8,不同位深的纹理创建
9,GLVideoOutputImpl
10,MediaCodec异步解码
11,OpenGL运行环境封装
实践总结
1,HDR转SDR实践之旅(一)流程总结
2,HDR转SDR实践之旅(二)解码10位YUV纹理
3,HDR转SDR实践之旅(三)YUV420转YUV公式
4,HDR转SDR实践之旅(四)YUV转RGB矩阵推导
5,HDR转SDR实践之旅(五)色域转换BT2020转BT709
6,HDR转SDR实践之旅(六)传递函数与色差矫正
7,HDR转SDR实践之旅(七)Gamma、HLG、PQ公式详解
8,HDR转SDR实践之旅(八)色调映射
9,HDR转SDR实践之旅(九)HDR开发资源汇总
10,HDR转SDR实践之旅(十)SDR转HDR逆色调映射探索
参考