FFmpeg/libavcodec/h2645_sei.h
Jan Ekström 5de565107a avcodec/h2645_sei: add support for Ambient Viewing Environment SEI
Defined by H.274, this SEI message is utilized by iPhones to save
the nominal ambient viewing environment for the display of recorded
HDR content. The contents of the message are exposed to API users
as AVFrame side data containing AVAmbientViewingEnvironment.

As the DV RPU test sample is from an iPhone and includes Ambient
Viewing Environment SEI messages, its test result gets updated.
2023-01-13 21:26:27 +02:00

153 lines
4.9 KiB
C

/*
* 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 AVCODEC_H2645_SEI_H
#define AVCODEC_H2645_SEI_H
#include <stdint.h>
#include "libavutil/buffer.h"
#include "libavutil/frame.h"
#include "avcodec.h"
#include "bytestream.h"
#include "codec_id.h"
#include "get_bits.h"
#include "h2645_vui.h"
#include "sei.h"
typedef struct H2645SEIA53Caption {
AVBufferRef *buf_ref;
} H2645SEIA53Caption;
typedef struct H2645SEIAFD {
int present;
uint8_t active_format_description;
} H2645SEIAFD;
typedef struct HEVCSEIDynamicHDRPlus {
AVBufferRef *info;
} HEVCSEIDynamicHDRPlus;
typedef struct HEVCSEIDynamicHDRVivid {
AVBufferRef *info;
} HEVCSEIDynamicHDRVivid;
typedef struct H2645SEIUnregistered {
AVBufferRef **buf_ref;
unsigned nb_buf_ref;
int x264_build; //< H.264 only
} H2645SEIUnregistered;
typedef struct H2645SEIFramePacking {
int present;
int arrangement_id;
int arrangement_cancel_flag; ///< is previous arrangement canceled, -1 if never received (currently H.264 only)
SEIFpaType arrangement_type;
int arrangement_repetition_period;
int content_interpretation_type;
int quincunx_sampling_flag;
int current_frame_is_frame0_flag;
} H2645SEIFramePacking;
typedef struct H2645SEIDisplayOrientation {
int present;
int anticlockwise_rotation;
int hflip, vflip;
} H2645SEIDisplayOrientation;
typedef struct H2645SEIAlternativeTransfer {
int present;
int preferred_transfer_characteristics;
} H2645SEIAlternativeTransfer;
typedef struct H2645SEIAmbientViewingEnvironment {
int present;
uint32_t ambient_illuminance;
uint16_t ambient_light_x;
uint16_t ambient_light_y;
} H2645SEIAmbientViewingEnvironment;
typedef struct H2645SEIFilmGrainCharacteristics {
int present;
int model_id;
int separate_colour_description_present_flag;
int bit_depth_luma;
int bit_depth_chroma;
int full_range;
int color_primaries;
int transfer_characteristics;
int matrix_coeffs;
int blending_mode_id;
int log2_scale_factor;
int comp_model_present_flag[3];
uint16_t num_intensity_intervals[3];
uint8_t num_model_values[3];
uint8_t intensity_interval_lower_bound[3][256];
uint8_t intensity_interval_upper_bound[3][256];
int16_t comp_model_value[3][256][6];
int repetition_period; //< H.264 only
int persistence_flag; //< HEVC only
} H2645SEIFilmGrainCharacteristics;
typedef struct H2645SEI {
H2645SEIA53Caption a53_caption;
H2645SEIAFD afd;
HEVCSEIDynamicHDRPlus dynamic_hdr_plus; //< HEVC only
HEVCSEIDynamicHDRVivid dynamic_hdr_vivid; //< HEVC only
H2645SEIUnregistered unregistered;
H2645SEIFramePacking frame_packing;
H2645SEIDisplayOrientation display_orientation;
H2645SEIAlternativeTransfer alternative_transfer;
H2645SEIFilmGrainCharacteristics film_grain_characteristics;
H2645SEIAmbientViewingEnvironment ambient_viewing_environment;
} H2645SEI;
enum {
FF_H2645_SEI_MESSAGE_HANDLED = 0,
FF_H2645_SEI_MESSAGE_UNHANDLED,
};
/**
* Decode a single SEI message.
*
* This function may either use gb or gbyte to decode the SEI message.
*
* @param[in, out] gb GetBitContext that needs to be at the start
* of the payload (i.e. after the payload_size bytes);
* it needs to be initially byte-aligned
* @param[in, out] gbyte a GetByteContext for the same data as gb
* @return < 0 on error, FF_H2645_SEI_MESSAGE_HANDLED if the SEI message
* has been handled or FF_H2645_SEI_MESSAGE_UNHANDLED if not.
*/
int ff_h2645_sei_message_decode(H2645SEI *h, enum SEIType type,
enum AVCodecID codec_id, GetBitContext *gb,
GetByteContext *gbyte, void *logctx);
int ff_h2645_sei_ctx_replace(H2645SEI *dst, const H2645SEI *src);
void ff_h2645_sei_reset(H2645SEI *s);
int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei,
enum AVCodecID codec_id,
AVCodecContext *avctx, const H2645VUI *vui,
unsigned bit_depth_luma, unsigned bit_depth_chroma,
int seed);
#endif /* AVCODEC_H2645_SEI_H */