[FFmpeg-devel] [PATCH] movenc/isom: update vpcC box to the latest draft specification
Hendrik Leppkes
h.leppkes at gmail.com
Sat Apr 22 02:25:40 EEST 2017
This brings our generation of the vpcC box up to date to version 1.0
of the VP Codec ISO Media File Format Binding.
Specifically, color/transfer properties are now written with values
based on ISO/IEC 23001-8, which is the same reference specification the
AVColor* enumerations are based on.
---
libavformat/movenc.c | 3 ++-
libavformat/vpcc.c | 55 +++++-----------------------------------------------
2 files changed, 7 insertions(+), 51 deletions(-)
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index e6e2313c53..e2f57586e2 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1112,7 +1112,8 @@ static int mov_write_vpcc_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra
avio_wb32(pb, 0);
ffio_wfourcc(pb, "vpcC");
- avio_wb32(pb, 0); /* version & flags */
+ avio_w8(pb, 1); /* version */
+ avio_wb24(pb, 0); /* flags */
ff_isom_write_vpcc(s, pb, track->par);
return update_size(pb, pos);
}
diff --git a/libavformat/vpcc.c b/libavformat/vpcc.c
index 2390e1711c..df08de59a6 100644
--- a/libavformat/vpcc.c
+++ b/libavformat/vpcc.c
@@ -23,44 +23,6 @@
#include "libavutil/pixfmt.h"
#include "vpcc.h"
-enum VpxColorSpace
-{
- VPX_COLOR_SPACE_UNSPECIFIED = 0,
- VPX_COLOR_SPACE_BT601 = 1,
- VPX_COLOR_SPACE_BT709 = 2,
- VPX_COLOR_SPACE_SMPTE_170 = 3,
- VPX_COLOR_SPACE_SMPTE_240 = 4,
- VPX_COLOR_SPACE_BT2020_NCL = 5,
- VPX_COLOR_SPACE_BT2020_CL = 6,
- VPX_COLOR_SPACE_RGB = 7,
-};
-
-static int get_vpx_color_space(AVFormatContext *s,
- enum AVColorSpace color_space)
-{
- switch (color_space) {
- case AVCOL_SPC_RGB:
- return VPX_COLOR_SPACE_RGB;
- case AVCOL_SPC_BT709:
- return VPX_COLOR_SPACE_BT709;
- case AVCOL_SPC_UNSPECIFIED:
- return VPX_COLOR_SPACE_UNSPECIFIED;
- case AVCOL_SPC_BT470BG:
- return VPX_COLOR_SPACE_BT601;
- case AVCOL_SPC_SMPTE170M:
- return VPX_COLOR_SPACE_SMPTE_170;
- case AVCOL_SPC_SMPTE240M:
- return VPX_COLOR_SPACE_SMPTE_240;
- case AVCOL_SPC_BT2020_NCL:
- return VPX_COLOR_SPACE_BT2020_NCL;
- case AVCOL_SPC_BT2020_CL:
- return VPX_COLOR_SPACE_BT2020_CL;
- default:
- av_log(s, AV_LOG_ERROR, "Unsupported color space (%d)\n", color_space);
- return -1;
- }
-}
-
enum VPX_CHROMA_SUBSAMPLING
{
VPX_SUBSAMPLING_420_VERTICAL = 0,
@@ -100,12 +62,6 @@ static int get_bit_depth(AVFormatContext *s, enum AVPixelFormat pixel_format)
return desc->comp[0].depth;
}
-static int get_vpx_transfer_function(
- enum AVColorTransferCharacteristic transfer)
-{
- return transfer == AVCOL_TRC_SMPTEST2084;
-}
-
static int get_vpx_video_full_range_flag(enum AVColorRange color_range)
{
return color_range == AVCOL_RANGE_JPEG;
@@ -117,14 +73,12 @@ int ff_isom_write_vpcc(AVFormatContext *s, AVIOContext *pb,
int profile = par->profile;
int level = par->level == FF_LEVEL_UNKNOWN ? 0 : par->level;
int bit_depth = get_bit_depth(s, par->format);
- int vpx_color_space = get_vpx_color_space(s, par->color_space);
int vpx_chroma_subsampling =
get_vpx_chroma_subsampling(s, par->format, par->chroma_location);
- int vpx_transfer_function = get_vpx_transfer_function(par->color_trc);
int vpx_video_full_range_flag =
get_vpx_video_full_range_flag(par->color_range);
- if (bit_depth < 0 || vpx_color_space < 0 || vpx_chroma_subsampling < 0)
+ if (bit_depth < 0 || vpx_chroma_subsampling < 0)
return AVERROR_INVALIDDATA;
if (profile == FF_PROFILE_UNKNOWN) {
@@ -138,9 +92,10 @@ int ff_isom_write_vpcc(AVFormatContext *s, AVIOContext *pb,
avio_w8(pb, profile);
avio_w8(pb, level);
- avio_w8(pb, (bit_depth << 4) | vpx_color_space);
- avio_w8(pb, (vpx_chroma_subsampling << 4) | (vpx_transfer_function << 1) |
- vpx_video_full_range_flag);
+ avio_w8(pb, (bit_depth << 4) | (vpx_chroma_subsampling << 1) | vpx_video_full_range_flag);
+ avio_w8(pb, par->color_primaries);
+ avio_w8(pb, par->color_trc);
+ avio_w8(pb, par->color_space);
// vp9 does not have codec initialization data.
avio_wb16(pb, 0);
--
2.12.2.windows.2
More information about the ffmpeg-devel
mailing list