| Index: media/base/video_color_space.h
|
| diff --git a/media/base/video_color_space.h b/media/base/video_color_space.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2be5b1d809a890f67274a4460cc5a822b5ad0673
|
| --- /dev/null
|
| +++ b/media/base/video_color_space.h
|
| @@ -0,0 +1,188 @@
|
| +// Copyright (c) 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef MEDIA_BASE_COLOR_SPACE_H_
|
| +#define MEDIA_BASE_COLOR_SPACE_H_
|
| +
|
| +#include <cstdint>
|
| +#include <vector>
|
| +
|
| +#include "base/memory/ref_counted.h"
|
| +#include "media/base/media_export.h"
|
| +#include "media/base/video_types.h"
|
| +
|
| +namespace media {
|
| +
|
| +class VideoFrame;
|
| +
|
| +class MEDIA_EXPORT VideoColorSpace {
|
| + public:
|
| + enum PrimaryID : int16_t {
|
| + // The first 0-255 values should match the H264 specification.
|
| + PRI_RESERVED0 = 0,
|
| + PRI_BT709 = 1,
|
| + PRI_UNSPECIFIED = 2,
|
| + PRI_RESERVED = 3,
|
| + PRI_BT470M = 4,
|
| + PRI_BT470BG = 5,
|
| + PRI_SMPTE170M = 6,
|
| + PRI_SMPTE240M = 7,
|
| + PRI_FILM = 8,
|
| + PRI_BT2020 = 9,
|
| + PRI_SMPTEST428_1 = 10,
|
| + PRI_SMPTEST431_2 = 11,
|
| + PRI_SMPTEST432_1 = 12,
|
| +
|
| + // Chrome-specific values start at 1000.
|
| + PRI_XYZ_D50 = 1000,
|
| + PRI_LAST = PRI_XYZ_D50
|
| + };
|
| +
|
| + enum TransferID : int16_t {
|
| + // The first 0-255 values should match the H264 specification.
|
| + TRC_RESERVED0 = 0,
|
| + TRC_BT709 = 1,
|
| + TRC_UNSPECIFIED = 2,
|
| + TRC_RESERVED = 3,
|
| + TRC_GAMMA22 = 4,
|
| + TRC_GAMMA28 = 5,
|
| + TRC_SMPTE170M = 6,
|
| + TRC_SMPTE240M = 7,
|
| + TRC_LINEAR = 8,
|
| + TRC_LOG = 9,
|
| + TRC_LOG_SQRT = 10,
|
| + TRC_IEC61966_2_4 = 11,
|
| + TRC_BT1361_ECG = 12,
|
| + TRC_IEC61966_2_1 = 13,
|
| + TRC_BT2020_10 = 14,
|
| + TRC_BT2020_12 = 15,
|
| + TRC_SMPTEST2084 = 16,
|
| + TRC_SMPTEST428_1 = 17,
|
| +
|
| + // Chrome-specific values start at 1000.
|
| + TRC_GAMMA24 = 1000,
|
| +
|
| + TRC_LAST = TRC_GAMMA24
|
| + };
|
| +
|
| + enum MatrixID : int16_t {
|
| + // The first 0-255 values should match the H264 specification.
|
| + SPC_RGB = 0,
|
| + SPC_BT709 = 1,
|
| + SPC_UNSPECIFIED = 2,
|
| + SPC_RESERVED = 3,
|
| + SPC_FCC = 4,
|
| + SPC_BT470BG = 5,
|
| + SPC_SMPTE170M = 6,
|
| + SPC_SMPTE240M = 7,
|
| + SPC_YCOCG = 8,
|
| + SPC_BT2020_NCL = 9,
|
| + SPC_BT2020_CL = 10,
|
| + SPC_YDZDX = 11,
|
| +
|
| + // Chrome-specific values start at 1000
|
| + SPC_LAST = SPC_BT2020_CL
|
| + };
|
| +
|
| + typedef float Quad[4];
|
| + struct Matrix4x4 {
|
| + Quad rows[4];
|
| + };
|
| + // Tristimulus value, RGB, XYZ or YUV
|
| + struct TriStim {
|
| + TriStim() {
|
| + values[0] = 0.0f;
|
| + values[1] = 0.0f;
|
| + values[2] = 0.0f;
|
| + }
|
| + TriStim(float a, float b, float c) {
|
| + values[0] = a;
|
| + values[1] = b;
|
| + values[2] = c;
|
| + }
|
| + float values[3];
|
| + };
|
| +
|
| + // Used to represent the XY coordinate of a primary.
|
| + typedef std::pair<float, float> XY;
|
| +
|
| + VideoColorSpace();
|
| + VideoColorSpace(PrimaryID primaries,
|
| + TransferID transfer,
|
| + MatrixID matrix,
|
| + bool full_range);
|
| +
|
| + bool operator==(const VideoColorSpace& other) const;
|
| + bool operator<(const VideoColorSpace& other) const;
|
| +
|
| + // Get a color space from a video frame.
|
| + explicit VideoColorSpace(const scoped_refptr<VideoFrame>& frame);
|
| + explicit VideoColorSpace(ColorSpace color_space);
|
| + void SetVideoFrameColorSpace(const scoped_refptr<VideoFrame>& frame);
|
| +
|
| + // Return the XYZ (D50) color space.
|
| + static VideoColorSpace XYZ();
|
| + // Return the SRGB color space.
|
| + static VideoColorSpace SRGB();
|
| +
|
| + static std::vector<XY> GetPrimaries(PrimaryID id);
|
| + std::vector<XY> GetPrimaries() const { return GetPrimaries(primaries); }
|
| +
|
| + // Get a matrix for convertnig from the given primaries to XYZD50.
|
| + static Matrix4x4 GetPrimaryMatrix(const std::vector<XY>& primaries);
|
| + static Matrix4x4 GetPrimaryMatrix(PrimaryID id) {
|
| + return GetPrimaryMatrix(GetPrimaries(id));
|
| + }
|
| + Matrix4x4 GetPrimaryMatrix() const {
|
| + return GetPrimaryMatrix(GetPrimaries());
|
| + }
|
| +
|
| + // Undo gamma correction.
|
| + static float toLinear(TransferID id, float f);
|
| + float toLinear(float f) const { return toLinear(transfer, f); }
|
| +
|
| + // Do gamma correction.
|
| + static float fromLinear(TransferID id, float f);
|
| + float fromLinear(float f) const { return fromLinear(transfer, f); }
|
| +
|
| + // Get the matrix for YUV->primaries (rgb) conversion.
|
| + static Matrix4x4 GetTransferMatrix(MatrixID id);
|
| + Matrix4x4 GetTransferMatrix() const { return GetTransferMatrix(matrix); }
|
| +
|
| + // Get the values needed to correct the range.
|
| + // Returns false if offset == 0.0 && multiplier == 1.0.
|
| + bool GetRangeAdjust(TriStim* offset, TriStim* multiplier) const;
|
| + Matrix4x4 GetRangeAdjustMatrix() const;
|
| +
|
| + static Matrix4x4 Multiply(const Matrix4x4& a, const Matrix4x4& b);
|
| + static TriStim Multiply(const Matrix4x4& a, const TriStim& b);
|
| + static Matrix4x4 Invert(Matrix4x4 a);
|
| +
|
| + PrimaryID primaries;
|
| + TransferID transfer;
|
| + MatrixID matrix;
|
| + bool full_range;
|
| +};
|
| +
|
| +class MEDIA_EXPORT ColorTransform {
|
| + public:
|
| + enum Intent {
|
| + INTENT_ABSOLUTE,
|
| + INTENT_PERCEIVED,
|
| + };
|
| +
|
| + ColorTransform(const VideoColorSpace& from,
|
| + const VideoColorSpace& to,
|
| + Intent intent);
|
| + void transform(VideoColorSpace::TriStim* colors, size_t num);
|
| +
|
| + private:
|
| + VideoColorSpace from_;
|
| + VideoColorSpace to_;
|
| + VideoColorSpace::Matrix4x4 transforms_[3];
|
| +};
|
| +
|
| +} // namespace media
|
| +
|
| +#endif // MEDIA_BASE_COLOR_SPACE_H_
|
|
|