aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2017-04-22 01:25:40 +0200
committerHendrik Leppkes <h.leppkes@gmail.com>2017-05-16 01:53:05 +0200
commit64ad44a3817a288168ba97f6c022160b940cd22e (patch)
tree5dad24334f5fd9e0e61cfbb122d5691b15c4963c
parent4c55144ee969a63bb5e469e3ebd7179b7b3616e8 (diff)
downloadffmpeg-64ad44a3817a288168ba97f6c022160b940cd22e.tar.gz
movenc/isom: update vpcC box to version 1.0 of the specification
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.
-rw-r--r--libavformat/movenc.c3
-rw-r--r--libavformat/vpcc.c55
2 files changed, 7 insertions, 51 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index d20d272f89..a6c0662cd0 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);