123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 |
- /*
- * Copyright (c) 2018 Mohammad Izadi <moh.izadi at gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg 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 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg 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 FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- #ifndef AVUTIL_HDR_DYNAMIC_METADATA_H
- #define AVUTIL_HDR_DYNAMIC_METADATA_H
- #include "frame.h"
- #include "rational.h"
- /**
- * Option for overlapping elliptical pixel selectors in an image.
- */
- enum AVHDRPlusOverlapProcessOption {
- AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0,
- AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1,
- };
- /**
- * Represents the percentile at a specific percentage in
- * a distribution.
- */
- typedef struct AVHDRPlusPercentile {
- /**
- * The percentage value corresponding to a specific percentile linearized
- * RGB value in the processing window in the scene. The value shall be in
- * the range of 0 to100, inclusive.
- */
- uint8_t percentage;
- /**
- * The linearized maxRGB value at a specific percentile in the processing
- * window in the scene. The value shall be in the range of 0 to 1, inclusive
- * and in multiples of 0.00001.
- */
- AVRational percentile;
- } AVHDRPlusPercentile;
- /**
- * Color transform parameters at a processing window in a dynamic metadata for
- * SMPTE 2094-40.
- */
- typedef struct AVHDRPlusColorTransformParams {
- /**
- * The relative x coordinate of the top left pixel of the processing
- * window. The value shall be in the range of 0 and 1, inclusive and
- * in multiples of 1/(width of Picture - 1). The value 1 corresponds
- * to the absolute coordinate of width of Picture - 1. The value for
- * first processing window shall be 0.
- */
- AVRational window_upper_left_corner_x;
- /**
- * The relative y coordinate of the top left pixel of the processing
- * window. The value shall be in the range of 0 and 1, inclusive and
- * in multiples of 1/(height of Picture - 1). The value 1 corresponds
- * to the absolute coordinate of height of Picture - 1. The value for
- * first processing window shall be 0.
- */
- AVRational window_upper_left_corner_y;
- /**
- * The relative x coordinate of the bottom right pixel of the processing
- * window. The value shall be in the range of 0 and 1, inclusive and
- * in multiples of 1/(width of Picture - 1). The value 1 corresponds
- * to the absolute coordinate of width of Picture - 1. The value for
- * first processing window shall be 1.
- */
- AVRational window_lower_right_corner_x;
- /**
- * The relative y coordinate of the bottom right pixel of the processing
- * window. The value shall be in the range of 0 and 1, inclusive and
- * in multiples of 1/(height of Picture - 1). The value 1 corresponds
- * to the absolute coordinate of height of Picture - 1. The value for
- * first processing window shall be 1.
- */
- AVRational window_lower_right_corner_y;
- /**
- * The x coordinate of the center position of the concentric internal and
- * external ellipses of the elliptical pixel selector in the processing
- * window. The value shall be in the range of 0 to (width of Picture - 1),
- * inclusive and in multiples of 1 pixel.
- */
- uint16_t center_of_ellipse_x;
- /**
- * The y coordinate of the center position of the concentric internal and
- * external ellipses of the elliptical pixel selector in the processing
- * window. The value shall be in the range of 0 to (height of Picture - 1),
- * inclusive and in multiples of 1 pixel.
- */
- uint16_t center_of_ellipse_y;
- /**
- * The clockwise rotation angle in degree of arc with respect to the
- * positive direction of the x-axis of the concentric internal and external
- * ellipses of the elliptical pixel selector in the processing window. The
- * value shall be in the range of 0 to 180, inclusive and in multiples of 1.
- */
- uint8_t rotation_angle;
- /**
- * The semi-major axis value of the internal ellipse of the elliptical pixel
- * selector in amount of pixels in the processing window. The value shall be
- * in the range of 1 to 65535, inclusive and in multiples of 1 pixel.
- */
- uint16_t semimajor_axis_internal_ellipse;
- /**
- * The semi-major axis value of the external ellipse of the elliptical pixel
- * selector in amount of pixels in the processing window. The value
- * shall not be less than semimajor_axis_internal_ellipse of the current
- * processing window. The value shall be in the range of 1 to 65535,
- * inclusive and in multiples of 1 pixel.
- */
- uint16_t semimajor_axis_external_ellipse;
- /**
- * The semi-minor axis value of the external ellipse of the elliptical pixel
- * selector in amount of pixels in the processing window. The value shall be
- * in the range of 1 to 65535, inclusive and in multiples of 1 pixel.
- */
- uint16_t semiminor_axis_external_ellipse;
- /**
- * Overlap process option indicates one of the two methods of combining
- * rendered pixels in the processing window in an image with at least one
- * elliptical pixel selector. For overlapping elliptical pixel selectors
- * in an image, overlap_process_option shall have the same value.
- */
- enum AVHDRPlusOverlapProcessOption overlap_process_option;
- /**
- * The maximum of the color components of linearized RGB values in the
- * processing window in the scene. The values should be in the range of 0 to
- * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and
- * maxscl[ 2 ] are corresponding to R, G, B color components respectively.
- */
- AVRational maxscl[3];
- /**
- * The average of linearized maxRGB values in the processing window in the
- * scene. The value should be in the range of 0 to 1, inclusive and in
- * multiples of 0.00001.
- */
- AVRational average_maxrgb;
- /**
- * The number of linearized maxRGB values at given percentiles in the
- * processing window in the scene. The maximum value shall be 15.
- */
- uint8_t num_distribution_maxrgb_percentiles;
- /**
- * The linearized maxRGB values at given percentiles in the
- * processing window in the scene.
- */
- AVHDRPlusPercentile distribution_maxrgb[15];
- /**
- * The fraction of selected pixels in the image that contains the brightest
- * pixel in the scene. The value shall be in the range of 0 to 1, inclusive
- * and in multiples of 0.001.
- */
- AVRational fraction_bright_pixels;
- /**
- * This flag indicates that the metadata for the tone mapping function in
- * the processing window is present (for value of 1).
- */
- uint8_t tone_mapping_flag;
- /**
- * The x coordinate of the separation point between the linear part and the
- * curved part of the tone mapping function. The value shall be in the range
- * of 0 to 1, excluding 0 and in multiples of 1/4095.
- */
- AVRational knee_point_x;
- /**
- * The y coordinate of the separation point between the linear part and the
- * curved part of the tone mapping function. The value shall be in the range
- * of 0 to 1, excluding 0 and in multiples of 1/4095.
- */
- AVRational knee_point_y;
- /**
- * The number of the intermediate anchor parameters of the tone mapping
- * function in the processing window. The maximum value shall be 15.
- */
- uint8_t num_bezier_curve_anchors;
- /**
- * The intermediate anchor parameters of the tone mapping function in the
- * processing window in the scene. The values should be in the range of 0
- * to 1, inclusive and in multiples of 1/1023.
- */
- AVRational bezier_curve_anchors[15];
- /**
- * This flag shall be equal to 0 in bitstreams conforming to this version of
- * this Specification. Other values are reserved for future use.
- */
- uint8_t color_saturation_mapping_flag;
- /**
- * The color saturation gain in the processing window in the scene. The
- * value shall be in the range of 0 to 63/8, inclusive and in multiples of
- * 1/8. The default value shall be 1.
- */
- AVRational color_saturation_weight;
- } AVHDRPlusColorTransformParams;
- /**
- * This struct represents dynamic metadata for color volume transform -
- * application 4 of SMPTE 2094-40:2016 standard.
- *
- * To be used as payload of a AVFrameSideData or AVPacketSideData with the
- * appropriate type.
- *
- * @note The struct should be allocated with
- * av_dynamic_hdr_plus_alloc() and its size is not a part of
- * the public ABI.
- */
- typedef struct AVDynamicHDRPlus {
- /**
- * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5.
- */
- uint8_t itu_t_t35_country_code;
- /**
- * Application version in the application defining document in ST-2094
- * suite. The value shall be set to 0.
- */
- uint8_t application_version;
- /**
- * The number of processing windows. The value shall be in the range
- * of 1 to 3, inclusive.
- */
- uint8_t num_windows;
- /**
- * The color transform parameters for every processing window.
- */
- AVHDRPlusColorTransformParams params[3];
- /**
- * The nominal maximum display luminance of the targeted system display,
- * in units of 0.0001 candelas per square metre. The value shall be in
- * the range of 0 to 10000, inclusive.
- */
- AVRational targeted_system_display_maximum_luminance;
- /**
- * This flag shall be equal to 0 in bit streams conforming to this version
- * of this Specification. The value 1 is reserved for future use.
- */
- uint8_t targeted_system_display_actual_peak_luminance_flag;
- /**
- * The number of rows in the targeted system_display_actual_peak_luminance
- * array. The value shall be in the range of 2 to 25, inclusive.
- */
- uint8_t num_rows_targeted_system_display_actual_peak_luminance;
- /**
- * The number of columns in the
- * targeted_system_display_actual_peak_luminance array. The value shall be
- * in the range of 2 to 25, inclusive.
- */
- uint8_t num_cols_targeted_system_display_actual_peak_luminance;
- /**
- * The normalized actual peak luminance of the targeted system display. The
- * values should be in the range of 0 to 1, inclusive and in multiples of
- * 1/15.
- */
- AVRational targeted_system_display_actual_peak_luminance[25][25];
- /**
- * This flag shall be equal to 0 in bitstreams conforming to this version of
- * this Specification. The value 1 is reserved for future use.
- */
- uint8_t mastering_display_actual_peak_luminance_flag;
- /**
- * The number of rows in the mastering_display_actual_peak_luminance array.
- * The value shall be in the range of 2 to 25, inclusive.
- */
- uint8_t num_rows_mastering_display_actual_peak_luminance;
- /**
- * The number of columns in the mastering_display_actual_peak_luminance
- * array. The value shall be in the range of 2 to 25, inclusive.
- */
- uint8_t num_cols_mastering_display_actual_peak_luminance;
- /**
- * The normalized actual peak luminance of the mastering display used for
- * mastering the image essence. The values should be in the range of 0 to 1,
- * inclusive and in multiples of 1/15.
- */
- AVRational mastering_display_actual_peak_luminance[25][25];
- } AVDynamicHDRPlus;
- /**
- * Allocate an AVDynamicHDRPlus structure and set its fields to
- * default values. The resulting struct can be freed using av_freep().
- *
- * @return An AVDynamicHDRPlus filled with default values or NULL
- * on failure.
- */
- AVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size);
- /**
- * Allocate a complete AVDynamicHDRPlus and add it to the frame.
- * @param frame The frame which side data is added to.
- *
- * @return The AVDynamicHDRPlus structure to be filled by caller or NULL
- * on failure.
- */
- AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame);
- /**
- * Parse the user data registered ITU-T T.35 to AVbuffer (AVDynamicHDRPlus).
- * The T.35 buffer must begin with the application mode, skipping the
- * country code, terminal provider codes, and application identifier.
- * @param s A pointer containing the decoded AVDynamicHDRPlus structure.
- * @param data The byte array containing the raw ITU-T T.35 data.
- * @param size Size of the data array in bytes.
- *
- * @return >= 0 on success. Otherwise, returns the appropriate AVERROR.
- */
- int av_dynamic_hdr_plus_from_t35(AVDynamicHDRPlus *s, const uint8_t *data,
- size_t size);
- #define AV_HDR_PLUS_MAX_PAYLOAD_SIZE 907
- /**
- * Serialize dynamic HDR10+ metadata to a user data registered ITU-T T.35 buffer,
- * excluding the first 48 bytes of the header, and beginning with the application mode.
- * @param s A pointer containing the decoded AVDynamicHDRPlus structure.
- * @param[in,out] data A pointer to pointer to a byte buffer to be filled with the
- * serialized metadata.
- * If *data is NULL, a buffer be will be allocated and a pointer to
- * it stored in its place. The caller assumes ownership of the buffer.
- * May be NULL, in which case the function will only store the
- * required buffer size in *size.
- * @param[in,out] size A pointer to a size to be set to the returned buffer's size.
- * If *data is not NULL, *size must contain the size of the input
- * buffer. May be NULL only if *data is NULL.
- *
- * @return >= 0 on success. Otherwise, returns the appropriate AVERROR.
- */
- int av_dynamic_hdr_plus_to_t35(const AVDynamicHDRPlus *s, uint8_t **data, size_t *size);
- #endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */
|