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