FFmpeg mxf扩展hdr、bt2020
最近做广电音视频项目,从CCTV发布的《中央广播电视总台4K超高清电视节目制播技术规范(暂行)》来看需要支持mxf封装XAVC编码的HLG视频。于是欣然完成了FFmpeg中XAVC Intra Class300/480的扩展工作,并且将HLG的信息封装进了H.264 sps vui中的color_trc、color_primaries。MediaInfo、FFprobe解析视频均解析到HLG/BT2020信息,完美。
今天拿到索贝提供的HLG样片,分析发现样片居然没有vui信息,然而MediaInfo明明解析出HLG/BT2020信息,但是奇怪的是FFProbe居然解析不出。直觉告诉样片的这部分信息一定是存在于mxf的容器封装里面,而不在h264的语法元素内。而且FFmpeg不支持这mxf部分信息的封装。
由于网上没有找到公开的mxf spec/uid定义资料,因此必须通过MediaInfo解码的逆向工程完成FFmpeg mxf的封装支持。
下载MediaInfo源码:
https://netix.dl.sourceforge.net/project/mediainfo/binary/mediainfogui/18.08.1/MediaInfo_GUI_18.08.1_GNU_FromSource.tar.xz
查看mxf解析源码:MediaInfoLib/Source/MediaInfo/Multiple/File_Mxf.cpp
1327 //---------------------------------------------------------------------------1328 static const char* Mxf_TransferCharacteristic(const int128u TransferCharacteristic)1329 {1330 int32u Code_Compare4=(int32u)TransferCharacteristic.lo;1331 int32u c1 = (int32u)(TransferCharacteristic.lo >> 32);1332 int32u c2 = (int32u)(TransferCharacteristic.hi);1333 int32u c3 = (int32u)(TransferCharacteristic.hi >> 32);1334 printf("c0 %p\n", Code_Compare4);1335 printf("c1 %p\n", c1);1336 printf("c2 %p\n", c2);1337 printf("c3 %p\n", c3);1338 switch ((int8u)(Code_Compare4>>16))1339 {1340 case 0x01 : return "BT.601";1341 case 0x02 : return "BT.709";1342 case 0x03 : return "SMPTE 240M";1343 case 0x04 : return "SMPTE 274M";1344 case 0x05 : return "BT.1361";1345 case 0x06 : return "Linear";1346 case 0x07 : return "SMPTE 428M";1347 case 0x08 : return "xvYCC";1348 case 0x09 : return "BT.2020"; // ISO does a difference of value between 10 and 12 bit1349 case 0x0A : return "PQ";1350 case 0x0B : return "HLG";1351 default : return "";1352 }1353 }
添加打印,打印出样片color_trc=HLG对应的完整uid值:
c0 0x10b0000
c1 0x4010101
c2 0x401010d
c3 0x60e2b34
1305 static const char* Mxf_ColorPrimaries(const int128u ColorPrimaries)1306 {1307 int32u Code_Compare4=(int32u)ColorPrimaries.lo;1308 int32u c1 = (int32u)(ColorPrimaries.lo >> 32);1309 int32u c2 = (int32u)(ColorPrimaries.hi);1310 int32u c3 = (int32u)(ColorPrimaries.hi >> 32);1311 printf("p0 %p\n", Code_Compare4);1312 printf("p1 %p\n", c1);1313 printf("p2 %p\n", c2);1314 printf("p3 %p\n", c3);1315 switch ((int8u)(Code_Compare4>>16))1316 {1317 case 0x01 : return "BT.601 NTSC";1318 case 0x02 : return "BT.601 PAL";1319 case 0x03 : return "BT.709";1320 case 0x04 : return "BT.2020";1321 case 0x05 : return "XYZ";1322 case 0x06 : return "Display P3";1323 default : return "";1324 }1325 }
同样对color_primaries添加打印,打印BT.2020的完整uid:
p0 0x3040000
p1 0x4010101
p2 0x4010101
p3 0x60e2b34
在获取常见关心的BT.709、BT.2020、HDR10(PQ)、HLG的uid后,在FFmpeg mxfenc.c 中添加:
From e3de4edf8ba509f2321223304ef54e6a95a4ba49 Mon Sep 17 00:00:00 20012 From: James <mydota@qq.com>3 Date: Tue, 30 Oct 2018 16:48:06 +08004 Subject: [PATCH] extends mxf color_trc and color_primaries5 6 Signed-off-by: James <mydota@qq.com>7 ---8 libavformat/mxfenc.c | 29 ++++++++++++++++++++++++++++-9 1 file changed, 28 insertions(+), 1 deletion(-)10 11 diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c12 index 46cf231a53..626245cfdb 10064413 --- a/libavformat/mxfenc.c14 +++ b/libavformat/mxfenc.c15 @@ -1171,6 +1171,26 @@ static int get_trc(UID ul, enum AVColorTransferCharacteristic trc)16 case AVCOL_TRC_SMPTE428 :17 memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x08,0x04,0x01,0x01,0x01,0x01,0x07,0x00,0x00}), 16);18 return 0;19 + case AVCOL_TRC_SMPTE2084 :20 + memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x01,0x0A,0x00,0x00}), 16);21 + return 0;22 + case AVCOL_TRC_ARIB_STD_B67 :23 + memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x0D,0x04,0x01,0x01,0x01,0x01,0x0B,0x00,0x00}), 16);24 + return 0;25 + default:26 + return -1;27 + }28 +}29 +30 +static int get_color_primaries(UID ul, enum AVColorPrimaries p)31 +{32 + switch (p) {33 + case AVCOL_PRI_BT709:34 + memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x02,0x00,0x00}), 16);35 + return 0;36 + case AVCOL_PRI_BT2020:37 + memcpy(ul, ((UID){0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x03,0x04,0x00,0x00}), 16);38 + return 0;39 default:40 return -1;41 }42 @@ -1185,10 +1205,11 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID43 int display_height;44 int f1, f2;45 UID transfer_ul = {0};46 + UID color_primaries_ul = {0};47 int64_t pos = mxf_write_generic_desc(s, st, key);48 49 - av_log(s, AV_LOG_ERROR, "mxf color_trc %d\n", st->codecpar->color_trc);50 get_trc(transfer_ul, st->codecpar->color_trc);51 + get_color_primaries(color_primaries_ul, st->codecpar->color_primaries);52 53 mxf_write_local_tag(pb, 4, 0x3203);54 avio_wb32(pb, stored_width);55 @@ -1342,6 +1363,12 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID56 avio_w8(pb, sc->field_dominance);57 }58 59 + //Color Primaries60 + if (color_primaries_ul[0]) {61 + mxf_write_local_tag(pb, 16, 0x3219);62 + avio_write(pb, color_primaries_ul, 16);63 + }64 +65 return pos;66 }67 68 -- 69 2.17.170
在libx264中去除对vui color_trc和color_primaries的信息添加,确保只有mxf携带,测试:
./ffmpeg -i '/home/lyh/4K/Customer/Sobey/2018080927test_video/10M_SR012CA3.mp4' -r 50 -pix_fmt yuv422p10le -c:v libx264 -avcintra-class 300 -x264opts avcintra-class=300 -x264opts avcintra-flavor=sony -color_primaries bt2020 -color_trc arib-std-b67 -colorspace bt2020nc 1.mxf
MediaInfo打印:
Video
ID : 2
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High 4:2:2 Intra@L5.2
Format settings, CABAC : No
Format settings, GOP : N=1
Format settings, wrapping mode : Frame
Codec ID : 0D01030102106001-0401020201323001
Duration : 1 s 600 ms
Bit rate : 501 Mb/s
Width : 3 840 pixels
Height : 2 160 pixels
Display aspect ratio : 16:9
Frame rate : 50.000 FPS
Color space : YUV
Chroma subsampling : 4:2:2
Bit depth : 10 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 1.207
Stream size : 95.5 MiB (100%)
Color primaries : BT.2020
Transfer characteristics : HLG
顺利识别。
FFmpeg mxf扩展hdr、bt2020相关推荐
- 视频增强之“动态范围扩展”HDR技术漫谈
本文转载自腾讯多媒体实验室. 随着HDR(High Dynamic Range)相关技术的发展,越来越多的视频平台和设备厂商持续推动HDR内容的制作与传播.HDR可以提供更丰富的细节,更宽广的色域和更 ...
- 【FFmpeg如何判断HDR视频,SDR视频】
1. hdr视频判断规则 判断的方法: ffprobe -v error -select_streams v -show_streams 'input.mp4' | grep -E "col ...
- FFmpeg编码扩展之————编码库的扩展(libfdk-aac)
ffmpeg windows版没有libfdk-acc 请求该地址下载:http://tmod.nmm-hd.org/FFmpeg/
- 仿照FFmpeg在GLSL中处理HDR.ToneMapping(下)
FFmpeg 命令行 HDR 转 SDR ffmpeg -i planet_hdr.MP4 -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p= ...
- FFmpeg从入门到出家(HEVC在RTMP中的扩展)
由金山云视频云技术团队提供:FFmpeg从入门到出家第三季: 为推进HEVC视频编码格式在直播方案中的落地,经过CDN联盟讨论,并和主流云服务厂商达成一致,规范了HEVC在RTMP/FLV中的扩展,具 ...
- FFmpeg代码导读——HEVC在RTMP中的扩展
视频流媒体中视频数据的传输占据了绝大部分的带宽,如何提升编码效率.减小带宽使用.提升画面质量,成为音视频开发者努力的重点.HEVC编码格式的推出为此带来了突破点.对于直播而言,大部分推拉流协议是基于R ...
- 仿照FFmpeg在GLSL中处理HDR.ToneMapping(上)
承接上文内容,纯干货,别看漏一个字. BT.601.709.2020标准下的YUV转RGB 上回我们已经把解码数据以short类型传递到gpu显存环境当中,下一步就是要正确的转换城rgb形式,翻查li ...
- ffmpeg + x264 编码H264(x86+arm)
一.x86-linux 1. 编译x264 我用的是目前最新版:x264-snapshot-20101130-2245.tar.bz2 ./configure --disable-asm mak ...
- FFmpeg学习之八(FFmpeg源码编译)
FFmpeg学习之八(FFmpeg源码编译) Mac下 FFmpeg源码编译 安装 1. 使用终端安装FFmpeg 2. 手动编译 2.1 编译环境 - Xcode 2.2 安装依赖库 2.3 安装F ...
- 一个简单视频网站开发小记
前言 视频格式转换,视频图片截取,视频存储设计,大文件上传处理以及相关配置,前端视频播放,视频播放流畅度,每一个都不简单,都需要花心思思考解决方法!基本上每个问题,都是使用相应的开源库! 需求背景 手 ...
最新文章
- C#初学——doWhile
- 每日一皮:这翻译...真辛苦老外看纪录片纯靠脑补 ...
- 【Paper】2011_Distributed fault detection for interconnected second-order systems
- VUE $SET源码
- (43)System Verilog模块变量数据位宽扩展
- 蓝桥杯 ALGO-60 算法训练 矩阵乘方
- python 计算协方差_Python3Numpy——相关性协方差应用
- 类的数据成员的一些注意事项
- Centos 安装Java JDK8
- springboot 打卡功能_SpringBoot、SSM、ajax实现考勤打卡功能(详细实现),供新手参考!...
- Android 系统鼠标
- kali安装python3.8_kali2019.4试用记录
- lamp一键安装包不安装mysql_LAMP一键安装包安装与配置
- 如何写论文?新手小白快速入门!
- 【FPGA】VGA驱动:行同步时序+场同步时序
- 实现动态表单功能设计思路
- 慧荣SMI_量产图文教程
- 2015浙江理工校赛A 孙壕请一盘青岛大虾呗(简单搜索)
- 26岁亿万富翁创业日记曝光(二)
- DeprecationWarning: NEAREST is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampl