mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			343 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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);
 | |
| 
 | |
| #endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */
 |