1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-11-23 21:54:53 +02:00
Files
FFmpeg/libswscale/cms.h
Niklas Haas ae84aa775f swscale/utils: split off format code into new file
utils.c is getting quite crowded, and I need a new place to dump a lot of
format handling code for the ongoing rewrite. Rather than bloating this file
even more, start splitting format handling helpers off into a new file.

This also renames the existing utils.h header, which didn't really contain
anything except the SwsFormat definition anyway (the prototypes for what should
have been in utils.h are all still in the legacy swscale_internal.h).
2025-03-14 19:50:44 +01:00

106 lines
3.5 KiB
C

/*
* Copyright (C) 2024 Niklas Haas
*
* 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 SWSCALE_CMS_H
#define SWSCALE_CMS_H
#include <stdbool.h>
#include "libavutil/csp.h"
#include "csputils.h"
#include "swscale.h"
#include "format.h"
/* Minimum, maximum, and default knee point for perceptual tone mapping [0,1] */
#define PERCEPTUAL_KNEE_MIN 0.10f
#define PERCEPTUAL_KNEE_MAX 0.80f
#define PERCEPTUAL_KNEE_DEF 0.40f
/* Ratio between source average and target average. */
#define PERCEPTUAL_ADAPTATION 0.40f
/* (Relative) chromaticity protection zone for perceptual mapping [0,1] */
#define PERCEPTUAL_DEADZONE 0.30f
/* Contrast setting for perceptual tone mapping. [0,1.5] */
#define PERCEPTUAL_CONTRAST 0.50f
/* Tuning constants for overriding the contrast near extremes */
#define SLOPE_TUNING 1.50f /* [0,10] */
#define SLOPE_OFFSET 0.20f /* [0,1] */
/* Strength of the perceptual saturation mapping component [0,1] */
#define PERCEPTUAL_STRENGTH 0.80f
/* Knee point to use for perceptual soft clipping [0,1] */
#define SOFTCLIP_KNEE 0.70f
/* I vs C curve gamma to use for colorimetric clipping [0,10] */
#define COLORIMETRIC_GAMMA 1.80f
/* Struct describing a color mapping operation */
typedef struct SwsColorMap {
SwsColor src;
SwsColor dst;
SwsIntent intent;
} SwsColorMap;
/**
* Returns true if the given color map is a semantic no-op - that is,
* the overall RGB end to end transform would an identity mapping.
*/
bool ff_sws_color_map_noop(const SwsColorMap *map);
/**
* Generates a single end-to-end color mapping 3DLUT embedding a static tone
* mapping curve.
*
* Returns 0 on success, or a negative error code on failure.
*/
int ff_sws_color_map_generate_static(v3u16_t *lut, int size, const SwsColorMap *map);
/**
* Generates a split pair of 3DLUTS, going to IPT and back, allowing an
* arbitrary dynamic EETF to be nestled in between these two operations.
*
* See ff_sws_tone_map_generate().
*
* Returns 0 on success, or a negative error code on failure.
*/
int ff_sws_color_map_generate_dynamic(v3u16_t *input, v3u16_t *output,
int size_input, int size_I, int size_PT,
const SwsColorMap *map);
/**
* Generate a 1D LUT of size `size` adapting intensity (I) levels from the
* source to the destination color space. The LUT is normalized to the
* relevant intensity range directly. The second channel of each entry returns
* the corresponding 15-bit scaling factor for the P/T channels. The scaling
* factor k may be applied as `(1 << 15) - k + (PT * k >> 15)`.
*
* This is designed to be used with sws_gamut_map_generate_dynamic().
*
* Returns 0 on success, or a negative error code on failure.
*/
void ff_sws_tone_map_generate(v2u16_t *lut, int size, const SwsColorMap *map);
#endif // SWSCALE_GAMUT_MAPPING_H