libheif/nclx.h (111 lines of code) (raw):

/* * HEIF codec. * Copyright (c) 2020 Dirk Farin <dirk.farin@gmail.com> * * This file is part of libheif. * * libheif is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * libheif is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libheif. If not, see <http://www.gnu.org/licenses/>. */ #ifndef LIBHEIF_NCLX_H #define LIBHEIF_NCLX_H #include "box.h" #include <cinttypes> #include <memory> #include <string> #include <vector> struct primaries { primaries() = default; primaries(float gx, float gy, float bx, float by, float rx, float ry, float wx, float wy); bool defined = false; float greenX = 0, greenY = 0; float blueX = 0, blueY = 0; float redX = 0, redY = 0; float whiteX = 0, whiteY = 0; }; primaries get_colour_primaries(uint16_t primaries_idx); struct Kr_Kb { float Kr = 0, Kb = 0; static Kr_Kb defaults(); }; Kr_Kb get_Kr_Kb(uint16_t matrix_coefficients_idx, uint16_t primaries_idx); struct YCbCr_to_RGB_coefficients { bool defined = false; float r_cr = 0; float g_cb = 0; float g_cr = 0; float b_cb = 0; static YCbCr_to_RGB_coefficients defaults(); }; YCbCr_to_RGB_coefficients get_YCbCr_to_RGB_coefficients(uint16_t matrix_coefficients_idx, uint16_t primaries_idx); struct RGB_to_YCbCr_coefficients { bool defined = false; float c[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; // e.g. y = c[0][0]*r + c[0][1]*g + c[0][2]*b static RGB_to_YCbCr_coefficients defaults(); }; RGB_to_YCbCr_coefficients get_RGB_to_YCbCr_coefficients(uint16_t matrix_coefficients_idx, uint16_t primaries_idx); // uint16_t get_transfer_characteristics() const {return m_transfer_characteristics;} // uint16_t get_matrix_coefficients() const {return m_matrix_coefficients;} // bool get_full_range_flag() const {return m_full_range_flag;} class color_profile { public: virtual ~color_profile() = default; virtual uint32_t get_type() const = 0; virtual std::string dump(Indent&) const = 0; virtual Error write(StreamWriter& writer) const = 0; }; class color_profile_raw : public color_profile { public: color_profile_raw(uint32_t type, const std::vector<uint8_t>& data) : m_type(type), m_data(data) {} uint32_t get_type() const override { return m_type; } const std::vector<uint8_t>& get_data() const { return m_data; } std::string dump(Indent&) const override; Error write(StreamWriter& writer) const override; private: uint32_t m_type; std::vector<uint8_t> m_data; }; class color_profile_nclx : public color_profile { public: color_profile_nclx() { set_sRGB_defaults(); } uint32_t get_type() const override { return fourcc("nclx"); } std::string dump(Indent&) const override; Error parse(BitstreamRange& range); Error write(StreamWriter& writer) const override; uint16_t get_colour_primaries() const { return m_colour_primaries; } uint16_t get_transfer_characteristics() const { return m_transfer_characteristics; } uint16_t get_matrix_coefficients() const { return m_matrix_coefficients; } bool get_full_range_flag() const { return m_full_range_flag; } void set_colour_primaries(uint16_t primaries) { m_colour_primaries = primaries; } void set_transfer_characteristics(uint16_t characteristics) { m_transfer_characteristics = characteristics; } void set_matrix_coefficients(uint16_t coefficients) { m_matrix_coefficients = coefficients; } void set_full_range_flag(bool full_range) { m_full_range_flag = full_range; } void set_sRGB_defaults(); void set_undefined(); Error get_nclx_color_profile(struct heif_color_profile_nclx** out_data) const; static struct heif_color_profile_nclx* alloc_nclx_color_profile(); static void free_nclx_color_profile(struct heif_color_profile_nclx* profile); void set_from_heif_color_profile_nclx(const struct heif_color_profile_nclx* nclx); void replace_undefined_values_with_sRGB_defaults(); private: uint16_t m_colour_primaries = heif_color_primaries_unspecified; uint16_t m_transfer_characteristics = heif_transfer_characteristic_unspecified; uint16_t m_matrix_coefficients = heif_matrix_coefficients_unspecified; bool m_full_range_flag = true; }; class Box_colr : public Box { public: Box_colr() { set_short_type(fourcc("colr")); } std::string dump(Indent&) const override; uint32_t get_color_profile_type() const { return m_color_profile->get_type(); } const std::shared_ptr<const color_profile>& get_color_profile() const { return m_color_profile; } void set_color_profile(const std::shared_ptr<const color_profile>& prof) { m_color_profile = prof; } Error write(StreamWriter& writer) const override; protected: Error parse(BitstreamRange& range) override; private: std::shared_ptr<const color_profile> m_color_profile; }; #endif //LIBHEIF_NCLX_H