[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