| Index: media/base/video_codecs.cc
|
| diff --git a/media/base/video_codecs.cc b/media/base/video_codecs.cc
|
| index f726b034ed27a8fc5f114d4ec4b7c86a82bb631e..7ed18532d624d4347ade7b4656df60d2c2c1bdaa 100644
|
| --- a/media/base/video_codecs.cc
|
| +++ b/media/base/video_codecs.cc
|
| @@ -8,6 +8,7 @@
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/string_split.h"
|
| #include "base/strings/string_util.h"
|
| +#include "media/base/video_color_space.h"
|
|
|
| namespace media {
|
|
|
| @@ -94,73 +95,12 @@ std::string GetProfileName(VideoCodecProfile profile) {
|
| return "";
|
| }
|
|
|
| -// Described in ISO 23001-8:2016 Table 3.
|
| -bool ParseVp9Eotf(const int value, gfx::ColorSpace::TransferID* eotf) {
|
| - switch (value) {
|
| - case 1:
|
| - *eotf = gfx::ColorSpace::TransferID::BT709;
|
| - break;
|
| - case 2:
|
| - // "2" is interpreted as "Unspecified"
|
| - *eotf = gfx::ColorSpace::TransferID::INVALID;
|
| - break;
|
| - case 4:
|
| - *eotf = gfx::ColorSpace::TransferID::GAMMA22;
|
| - break;
|
| - case 5:
|
| - *eotf = gfx::ColorSpace::TransferID::GAMMA28;
|
| - break;
|
| - case 6:
|
| - *eotf = gfx::ColorSpace::TransferID::SMPTE170M;
|
| - break;
|
| - case 7:
|
| - *eotf = gfx::ColorSpace::TransferID::SMPTE240M;
|
| - break;
|
| - case 8:
|
| - *eotf = gfx::ColorSpace::TransferID::LINEAR;
|
| - break;
|
| - case 9:
|
| - *eotf = gfx::ColorSpace::TransferID::LOG;
|
| - break;
|
| - case 10:
|
| - *eotf = gfx::ColorSpace::TransferID::LOG_SQRT;
|
| - break;
|
| - case 11:
|
| - *eotf = gfx::ColorSpace::TransferID::IEC61966_2_4;
|
| - break;
|
| - case 12:
|
| - *eotf = gfx::ColorSpace::TransferID::BT1361_ECG;
|
| - break;
|
| - case 13:
|
| - *eotf = gfx::ColorSpace::TransferID::IEC61966_2_1;
|
| - break;
|
| - case 14:
|
| - *eotf = gfx::ColorSpace::TransferID::BT2020_10;
|
| - break;
|
| - case 15:
|
| - *eotf = gfx::ColorSpace::TransferID::BT2020_12;
|
| - break;
|
| - case 16:
|
| - *eotf = gfx::ColorSpace::TransferID::SMPTEST2084;
|
| - break;
|
| - case 17:
|
| - *eotf = gfx::ColorSpace::TransferID::SMPTEST428_1;
|
| - break;
|
| - default:
|
| - // Includes reserved values of 0, 3, 18 - 255.
|
| - *eotf = gfx::ColorSpace::TransferID::INVALID;
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| bool ParseNewStyleVp9CodecID(const std::string& codec_id,
|
| VideoCodecProfile* profile,
|
| uint8_t* level_idc,
|
| - gfx::ColorSpace::TransferID* eotf) {
|
| + VideoColorSpace* color_space) {
|
| // Initialize optional fields to their defaults.
|
| - *eotf = gfx::ColorSpace::TransferID::BT709;
|
| + *color_space = VideoColorSpace::BT709();
|
|
|
| std::vector<std::string> fields = base::SplitString(
|
| codec_id, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
|
| @@ -241,32 +181,26 @@ bool ParseNewStyleVp9CodecID(const std::string& codec_id,
|
|
|
| if (values.size() < 4)
|
| return true;
|
| - const int color_primaries = values[3];
|
| - // TODO(chcunningham): parse and bubble up color primaries, described in ISO
|
| - // 23001-8:2016 Table 2.
|
| - // Values 0, 3, and 23 - 255 are reserved.
|
| - if (color_primaries == 0 || color_primaries == 3 || color_primaries > 22) {
|
| - DVLOG(3) << __func__ << " Invalid color primaries (" << color_primaries
|
| - << ")";
|
| + color_space->primaries = VideoColorSpace::GetPrimaryID(values[3]);
|
| + if (color_space->primaries == VideoColorSpace::PrimaryID::INVALID) {
|
| + DVLOG(3) << __func__ << " Invalid color primaries (" << values[3] << ")";
|
| return false;
|
| }
|
|
|
| if (values.size() < 5)
|
| return true;
|
| - if (!ParseVp9Eotf(values[4], eotf)) {
|
| + color_space->transfer = VideoColorSpace::GetTransferID(values[4]);
|
| + if (color_space->transfer == VideoColorSpace::TransferID::INVALID) {
|
| DVLOG(3) << __func__ << " Invalid transfer function (" << values[4] << ")";
|
| return false;
|
| }
|
|
|
| - // TODO(chcunningham): Parse and bubble up the following fields. For now just
|
| - // doing basic validation.
|
| -
|
| if (values.size() < 6)
|
| return true;
|
| - const int matrix_coefficients = values[5];
|
| - if (matrix_coefficients > 11) {
|
| - DVLOG(3) << __func__ << " Invalid matrix coefficients ("
|
| - << matrix_coefficients << ")";
|
| + color_space->matrix = VideoColorSpace::GetMatrixID(values[5]);
|
| + if (color_space->matrix == VideoColorSpace::MatrixID::INVALID) {
|
| + DVLOG(3) << __func__ << " Invalid matrix coefficients (" << values[5]
|
| + << ")";
|
| return false;
|
| }
|
|
|
| @@ -278,12 +212,16 @@ bool ParseNewStyleVp9CodecID(const std::string& codec_id,
|
| << video_full_range_flag << ")";
|
| return false;
|
| }
|
| + color_space->range = video_full_range_flag == 1
|
| + ? gfx::ColorSpace::RangeID::FULL
|
| + : gfx::ColorSpace::RangeID::LIMITED;
|
|
|
| if (values.size() < 8)
|
| return true;
|
| const int chroma_subsampling = values[7];
|
| if (chroma_subsampling > 3 ||
|
| - (chroma_subsampling != 3 && matrix_coefficients == 0)) {
|
| + (chroma_subsampling != 3 &&
|
| + color_space->matrix == VideoColorSpace::MatrixID::RGB)) {
|
| DVLOG(3) << __func__ << " Invalid chroma subsampling ("
|
| << chroma_subsampling << ")";
|
| return false;
|
| @@ -662,11 +600,11 @@ VideoCodec StringToVideoCodec(const std::string& codec_id) {
|
|
|
| VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN;
|
| uint8_t level = 0;
|
| - gfx::ColorSpace::TransferID eotf = gfx::ColorSpace::TransferID::INVALID;
|
| + VideoColorSpace color_space;
|
|
|
| if (codec_id == "vp8" || codec_id == "vp8.0")
|
| return kCodecVP8;
|
| - if (ParseNewStyleVp9CodecID(codec_id, &profile, &level, &eotf) ||
|
| + if (ParseNewStyleVp9CodecID(codec_id, &profile, &level, &color_space) ||
|
| ParseLegacyVp9CodecID(codec_id, &profile, &level)) {
|
| return kCodecVP9;
|
| }
|
|
|