Adding mastering display metadata struct to avutil. The mastering display metadata contains information about the mastering display color volume (SMPTE 2086:2014). This info comes from HEVC in the SEI_TYPE_MASTERING_DISPLAY_INFO and is soon to be included in MKV: https://mailarchive.ietf.org/arch/search/?email_list=cellar&gbt=1&index=sZyfPTM-QY69P-0omfOIiTN622o so it is similar to SEI FPA / stereo_mode in MKV and as such this patch follows how AVStereo3D is implemented. I'll add support to HEVC in a follow-up (and MKV when spec is approved). Signed-off-by: Neil Birkbeck <neil.birkbeck@gmail.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>tags/n3.0
| @@ -38,6 +38,7 @@ HEADERS = adler32.h \ | |||||
| log.h \ | log.h \ | ||||
| macros.h \ | macros.h \ | ||||
| mathematics.h \ | mathematics.h \ | ||||
| mastering_display_metadata.h \ | |||||
| md5.h \ | md5.h \ | ||||
| mem.h \ | mem.h \ | ||||
| motion_vector.h \ | motion_vector.h \ | ||||
| @@ -115,6 +116,7 @@ OBJS = adler32.o \ | |||||
| log.o \ | log.o \ | ||||
| log2_tab.o \ | log2_tab.o \ | ||||
| mathematics.o \ | mathematics.o \ | ||||
| mastering_display_metadata.o \ | |||||
| md5.o \ | md5.o \ | ||||
| mem.o \ | mem.o \ | ||||
| murmur3.o \ | murmur3.o \ | ||||
| @@ -106,12 +106,17 @@ enum AVFrameSideDataType { | |||||
| * @endcode | * @endcode | ||||
| */ | */ | ||||
| AV_FRAME_DATA_SKIP_SAMPLES, | AV_FRAME_DATA_SKIP_SAMPLES, | ||||
| /** | /** | ||||
| * This side data must be associated with an audio frame and corresponds to | * This side data must be associated with an audio frame and corresponds to | ||||
| * enum AVAudioServiceType defined in avcodec.h. | * enum AVAudioServiceType defined in avcodec.h. | ||||
| */ | */ | ||||
| AV_FRAME_DATA_AUDIO_SERVICE_TYPE, | AV_FRAME_DATA_AUDIO_SERVICE_TYPE, | ||||
| /** | |||||
| * Mastering display metadata associated with a video frame. The payload is | |||||
| * an AVMasteringDisplayMetadata type and contains information about the | |||||
| * mastering display color volume. | |||||
| */ | |||||
| AV_FRAME_DATA_MASTERING_DISPLAY_METADATA | |||||
| }; | }; | ||||
| enum AVActiveFormatDescription { | enum AVActiveFormatDescription { | ||||
| @@ -0,0 +1,43 @@ | |||||
| /** | |||||
| * Copyright (c) 2016 Neil Birkbeck <neil.birkbeck@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 | |||||
| */ | |||||
| #include <stdint.h> | |||||
| #include <string.h> | |||||
| #include "mastering_display_metadata.h" | |||||
| #include "mem.h" | |||||
| AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void) | |||||
| { | |||||
| return av_mallocz(sizeof(AVMasteringDisplayMetadata)); | |||||
| } | |||||
| AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame) | |||||
| { | |||||
| AVFrameSideData *side_data = av_frame_new_side_data(frame, | |||||
| AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, | |||||
| sizeof(AVMasteringDisplayMetadata)); | |||||
| if (!side_data) | |||||
| return NULL; | |||||
| memset(side_data->data, 0, sizeof(AVMasteringDisplayMetadata)); | |||||
| return (AVMasteringDisplayMetadata *)side_data->data; | |||||
| } | |||||
| @@ -0,0 +1,87 @@ | |||||
| /** | |||||
| * Copyright (c) 2016 Neil Birkbeck <neil.birkbeck@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_MASTERING_DISPLAY_METADATA_H | |||||
| #define AVUTIL_MASTERING_DISPLAY_METADATA_H | |||||
| #include "frame.h" | |||||
| /** | |||||
| * Mastering display metadata capable of representing the color volume of | |||||
| * the display used to master the content (SMPTE 2086:2014). | |||||
| * | |||||
| * To be used as payload of a AVFrameSideData or AVPacketSideData with the | |||||
| * appropriate type. | |||||
| * | |||||
| * @note The struct should be allocated with av_mastering_display_metadata_alloc() | |||||
| * and its size is not a part of the public ABI. | |||||
| */ | |||||
| typedef struct AVMasteringDisplayMetadata { | |||||
| /** | |||||
| * CIE 1931 xy chromaticity coords of color primaries (r, g, b order). | |||||
| */ | |||||
| float display_primaries[3][2]; | |||||
| /** | |||||
| * CIE 1931 xy chromaticity coords of white point. | |||||
| */ | |||||
| float white_point[2]; | |||||
| /** | |||||
| * Min luminance of mastering display (cd/m^2). | |||||
| */ | |||||
| float min_luminance; | |||||
| /** | |||||
| * Max luminance of mastering display (cd/m^2). | |||||
| */ | |||||
| float max_luminance; | |||||
| /** | |||||
| * Flag indicating whether the display primaries (and white point) are set. | |||||
| */ | |||||
| int has_primaries; | |||||
| /** | |||||
| * Flag indicating whether the luminance (min_ and max_) have been set. | |||||
| */ | |||||
| int has_luminance; | |||||
| } AVMasteringDisplayMetadata; | |||||
| /** | |||||
| * Allocate an AVMasteringDisplayMetadata structure and set its fields to | |||||
| * default values. The resulting struct can be freed using av_freep(). | |||||
| * | |||||
| * @return An AVMasteringDisplayMetadata filled with default values or NULL | |||||
| * on failure. | |||||
| */ | |||||
| AVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void); | |||||
| /** | |||||
| * Allocate a complete AVMasteringDisplayMetadata and add it to the frame. | |||||
| * | |||||
| * @param frame The frame which side data is added to. | |||||
| * | |||||
| * @return The AVMasteringDisplayMetadata structure to be filled by caller. | |||||
| */ | |||||
| AVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame); | |||||
| #endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */ | |||||
| @@ -64,7 +64,7 @@ | |||||
| */ | */ | ||||
| #define LIBAVUTIL_VERSION_MAJOR 55 | #define LIBAVUTIL_VERSION_MAJOR 55 | ||||
| #define LIBAVUTIL_VERSION_MINOR 13 | |||||
| #define LIBAVUTIL_VERSION_MINOR 14 | |||||
| #define LIBAVUTIL_VERSION_MICRO 100 | #define LIBAVUTIL_VERSION_MICRO 100 | ||||
| #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ | ||||