FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
h274.h
Go to the documentation of this file.
1 /*
2  * H.274 film grain synthesis
3  * Copyright (c) 2021 Niklas Haas <ffmpeg@haasn.xyz>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * H.274 film grain synthesis.
25  * @author Niklas Haas <ffmpeg@haasn.xyz>
26  */
27 
28 #ifndef AVCODEC_H274_H
29 #define AVCODEC_H274_H
30 
32 
33 // Must be initialized to {0} prior to first usage
34 typedef struct H274FilmGrainDatabase {
35  // Database of film grain patterns, lazily computed as-needed
36  int8_t db[13 /* h */][13 /* v */][64][64];
37  uint16_t residency[13 /* h */]; // bit field of v
38 
39  // Temporary buffer for slice generation
40  int16_t slice_tmp[64][64];
42 
43 /**
44  * Check whether ff_h274_apply_film_grain() supports the given parameter combination.
45  *
46  * @param model_id model_id from AVFilmGrainParams to be supplied
47  * @param pix_fmt pixel format of the frames to be supplied
48  */
49 static inline int ff_h274_film_grain_params_supported(int model_id, enum AVPixelFormat pix_fmt)
50 {
51  return model_id == 0 && pix_fmt == AV_PIX_FMT_YUV420P;
52 }
53 
54 // Synthesizes film grain on top of `in` and stores the result to `out`. `out`
55 // must already have been allocated and set to the same size and format as
56 // `in`.
57 //
58 // Returns a negative error code on error, such as invalid params.
59 // If ff_h274_film_grain_params_supported() indicated that the parameters
60 // are supported, no error will be returned if the arguments given to
61 // ff_h274_film_grain_params_supported() coincide with actual values
62 // from the frames and params.
65  const AVFilmGrainParams *params);
66 
67 typedef struct H274HashContext H274HashContext;
68 
69 typedef struct H274SEIPictureHash {
70  int present;
71  union {
72  uint8_t md5[3][16];
73  uint16_t crc[3];
74  uint32_t checksum[3];
75  };
76  uint8_t hash_type;
78 
81  const AVFrame *frame, int coded_width, int coded_height);
83 
84 typedef struct H274SEIFrameFieldInfo {
85  int present;
89  uint8_t duplicate_flag;
91 
92 #endif /* AVCODEC_H274_H */
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
H274SEIPictureHash
Definition: h274.h:69
out
FILE * out
Definition: movenc.c:55
ff_h274_apply_film_grain
int ff_h274_apply_film_grain(AVFrame *out, const AVFrame *in, H274FilmGrainDatabase *db, const AVFilmGrainParams *params)
Definition: h274.c:221
H274SEIPictureHash::crc
uint16_t crc[3]
Definition: h274.h:73
H274HashContext
Definition: h274.c:866
H274SEIFrameFieldInfo::duplicate_flag
uint8_t duplicate_flag
Definition: h274.h:89
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
H274SEIPictureHash::present
int present
Definition: h274.h:70
H274SEIFrameFieldInfo::present
int present
Definition: h274.h:85
hash
uint8_t hash[HASH_SIZE]
Definition: movenc.c:58
H274SEIFrameFieldInfo::picture_struct
int picture_struct
Definition: h274.h:86
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
H274FilmGrainDatabase::slice_tmp
int16_t slice_tmp[64][64]
Definition: h274.h:40
film_grain_params.h
ff_h274_hash_verify
int ff_h274_hash_verify(H274HashContext *c, const H274SEIPictureHash *hash, const AVFrame *frame, int coded_width, int coded_height)
Definition: h274.c:912
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
H274SEIPictureHash::md5
uint8_t md5[3][16]
Definition: h274.h:72
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
H274FilmGrainDatabase::db
int8_t db[13][13][64][64]
Definition: h274.h:36
H274FilmGrainDatabase::residency
uint16_t residency[13]
Definition: h274.h:37
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
H274SEIFrameFieldInfo::source_scan_type
uint8_t source_scan_type
Definition: h274.h:88
ff_h274_hash_init
int ff_h274_hash_init(H274HashContext **c, int type)
Definition: h274.c:881
H274FilmGrainDatabase
Definition: h274.h:34
AVFilmGrainParams
This structure describes how to handle film grain synthesis in video for specific codecs.
Definition: film_grain_params.h:201
H274SEIPictureHash::checksum
uint32_t checksum[3]
Definition: h274.h:74
H274SEIFrameFieldInfo::display_elemental_periods
uint8_t display_elemental_periods
Definition: h274.h:87
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
ff_h274_film_grain_params_supported
static int ff_h274_film_grain_params_supported(int model_id, enum AVPixelFormat pix_fmt)
Check whether ff_h274_apply_film_grain() supports the given parameter combination.
Definition: h274.h:49
H274SEIFrameFieldInfo
Definition: h274.h:84
H274SEIPictureHash::hash_type
uint8_t hash_type
Definition: h274.h:76
ff_h274_hash_freep
void ff_h274_hash_freep(H274HashContext **c)
Definition: h274.c:871