1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (C) 2001-2002 Michael Niedermayer (michaelni@gmx.at)
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or modify
7cabdff1aSopenharmony_ci * it under the terms of the GNU General Public License as published by
8cabdff1aSopenharmony_ci * the Free Software Foundation; either version 2 of the License, or
9cabdff1aSopenharmony_ci * (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14cabdff1aSopenharmony_ci * GNU General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU General Public License
17cabdff1aSopenharmony_ci * along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci/**
22cabdff1aSopenharmony_ci * @file
23cabdff1aSopenharmony_ci * internal API header.
24cabdff1aSopenharmony_ci */
25cabdff1aSopenharmony_ci
26cabdff1aSopenharmony_ci#ifndef POSTPROC_POSTPROCESS_INTERNAL_H
27cabdff1aSopenharmony_ci#define POSTPROC_POSTPROCESS_INTERNAL_H
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include <string.h>
30cabdff1aSopenharmony_ci#include "libavutil/avutil.h"
31cabdff1aSopenharmony_ci#include "libavutil/intmath.h"
32cabdff1aSopenharmony_ci#include "libavutil/log.h"
33cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
34cabdff1aSopenharmony_ci#include "postprocess.h"
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_ci#define V_DEBLOCK       0x01
37cabdff1aSopenharmony_ci#define H_DEBLOCK       0x02
38cabdff1aSopenharmony_ci#define DERING          0x04
39cabdff1aSopenharmony_ci#define LEVEL_FIX       0x08 ///< Brightness & Contrast
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci#define LUM_V_DEBLOCK   V_DEBLOCK               //   1
42cabdff1aSopenharmony_ci#define LUM_H_DEBLOCK   H_DEBLOCK               //   2
43cabdff1aSopenharmony_ci#define CHROM_V_DEBLOCK (V_DEBLOCK<<4)          //  16
44cabdff1aSopenharmony_ci#define CHROM_H_DEBLOCK (H_DEBLOCK<<4)          //  32
45cabdff1aSopenharmony_ci#define LUM_DERING      DERING                  //   4
46cabdff1aSopenharmony_ci#define CHROM_DERING    (DERING<<4)             //  64
47cabdff1aSopenharmony_ci#define LUM_LEVEL_FIX   LEVEL_FIX               //   8
48cabdff1aSopenharmony_ci#define CHROM_LEVEL_FIX (LEVEL_FIX<<4)          // 128 (not implemented yet)
49cabdff1aSopenharmony_ci
50cabdff1aSopenharmony_ci// Experimental vertical filters
51cabdff1aSopenharmony_ci#define V_X1_FILTER     0x0200                  // 512
52cabdff1aSopenharmony_ci#define V_A_DEBLOCK     0x0400
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci// Experimental horizontal filters
55cabdff1aSopenharmony_ci#define H_X1_FILTER     0x2000                  // 8192
56cabdff1aSopenharmony_ci#define H_A_DEBLOCK     0x4000
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_ci/// select between full y range (255-0) or standard one (234-16)
59cabdff1aSopenharmony_ci#define FULL_Y_RANGE    0x8000                  // 32768
60cabdff1aSopenharmony_ci
61cabdff1aSopenharmony_ci//Deinterlacing Filters
62cabdff1aSopenharmony_ci#define LINEAR_IPOL_DEINT_FILTER        0x10000 // 65536
63cabdff1aSopenharmony_ci#define LINEAR_BLEND_DEINT_FILTER       0x20000 // 131072
64cabdff1aSopenharmony_ci#define CUBIC_BLEND_DEINT_FILTER        0x8000  // (not implemented yet)
65cabdff1aSopenharmony_ci#define CUBIC_IPOL_DEINT_FILTER         0x40000 // 262144
66cabdff1aSopenharmony_ci#define MEDIAN_DEINT_FILTER             0x80000 // 524288
67cabdff1aSopenharmony_ci#define FFMPEG_DEINT_FILTER             0x400000
68cabdff1aSopenharmony_ci#define LOWPASS5_DEINT_FILTER           0x800000
69cabdff1aSopenharmony_ci
70cabdff1aSopenharmony_ci#define TEMP_NOISE_FILTER               0x100000
71cabdff1aSopenharmony_ci#define FORCE_QUANT                     0x200000
72cabdff1aSopenharmony_ci#define BITEXACT                        0x1000000
73cabdff1aSopenharmony_ci#define VISUALIZE                       0x2000000
74cabdff1aSopenharmony_ci
75cabdff1aSopenharmony_ci//use if you want a faster postprocessing code
76cabdff1aSopenharmony_ci//cannot differentiate between chroma & luma filters (both on or both off)
77cabdff1aSopenharmony_ci//obviously the -pp option on the command line has no effect except turning the here selected
78cabdff1aSopenharmony_ci//filters on
79cabdff1aSopenharmony_ci//#define COMPILE_TIME_MODE 0x77
80cabdff1aSopenharmony_ci
81cabdff1aSopenharmony_ci/**
82cabdff1aSopenharmony_ci * Postprocessing filter.
83cabdff1aSopenharmony_ci */
84cabdff1aSopenharmony_cistruct PPFilter{
85cabdff1aSopenharmony_ci    const char *shortName;
86cabdff1aSopenharmony_ci    const char *longName;
87cabdff1aSopenharmony_ci    int chromDefault;       ///< is chrominance filtering on by default if this filter is manually activated
88cabdff1aSopenharmony_ci    int minLumQuality;      ///< minimum quality to turn luminance filtering on
89cabdff1aSopenharmony_ci    int minChromQuality;    ///< minimum quality to turn chrominance filtering on
90cabdff1aSopenharmony_ci    int mask;               ///< Bitmask to turn this filter on
91cabdff1aSopenharmony_ci};
92cabdff1aSopenharmony_ci
93cabdff1aSopenharmony_ci/**
94cabdff1aSopenharmony_ci * Postprocessing mode.
95cabdff1aSopenharmony_ci */
96cabdff1aSopenharmony_citypedef struct PPMode{
97cabdff1aSopenharmony_ci    int lumMode;                    ///< activates filters for luminance
98cabdff1aSopenharmony_ci    int chromMode;                  ///< activates filters for chrominance
99cabdff1aSopenharmony_ci    int error;                      ///< non zero on error
100cabdff1aSopenharmony_ci
101cabdff1aSopenharmony_ci    int minAllowedY;                ///< for brightness correction
102cabdff1aSopenharmony_ci    int maxAllowedY;                ///< for brightness correction
103cabdff1aSopenharmony_ci    AVRational maxClippedThreshold; ///< amount of "black" you are willing to lose to get a brightness-corrected picture
104cabdff1aSopenharmony_ci
105cabdff1aSopenharmony_ci    int maxTmpNoise[3];             ///< for Temporal Noise Reducing filter (Maximal sum of abs differences)
106cabdff1aSopenharmony_ci
107cabdff1aSopenharmony_ci    int baseDcDiff;
108cabdff1aSopenharmony_ci    int flatnessThreshold;
109cabdff1aSopenharmony_ci
110cabdff1aSopenharmony_ci    int forcedQuant;                ///< quantizer if FORCE_QUANT is used
111cabdff1aSopenharmony_ci} PPMode;
112cabdff1aSopenharmony_ci
113cabdff1aSopenharmony_ci/**
114cabdff1aSopenharmony_ci * postprocess context.
115cabdff1aSopenharmony_ci */
116cabdff1aSopenharmony_citypedef struct PPContext{
117cabdff1aSopenharmony_ci    /**
118cabdff1aSopenharmony_ci     * info on struct for av_log
119cabdff1aSopenharmony_ci     */
120cabdff1aSopenharmony_ci    const AVClass *av_class;
121cabdff1aSopenharmony_ci
122cabdff1aSopenharmony_ci    uint8_t *tempBlocks; ///<used for the horizontal code
123cabdff1aSopenharmony_ci
124cabdff1aSopenharmony_ci    /**
125cabdff1aSopenharmony_ci     * luma histogram.
126cabdff1aSopenharmony_ci     * we need 64bit here otherwise we'll going to have a problem
127cabdff1aSopenharmony_ci     * after watching a black picture for 5 hours
128cabdff1aSopenharmony_ci     */
129cabdff1aSopenharmony_ci    uint64_t *yHistogram;
130cabdff1aSopenharmony_ci
131cabdff1aSopenharmony_ci    DECLARE_ALIGNED(8, uint64_t, packedYOffset);
132cabdff1aSopenharmony_ci    DECLARE_ALIGNED(8, uint64_t, packedYScale);
133cabdff1aSopenharmony_ci
134cabdff1aSopenharmony_ci    /** Temporal noise reducing buffers */
135cabdff1aSopenharmony_ci    uint8_t *tempBlurred[3];
136cabdff1aSopenharmony_ci    int32_t *tempBlurredPast[3];
137cabdff1aSopenharmony_ci
138cabdff1aSopenharmony_ci    /** Temporary buffers for handling the last row(s) */
139cabdff1aSopenharmony_ci    uint8_t *tempDst;
140cabdff1aSopenharmony_ci    uint8_t *tempSrc;
141cabdff1aSopenharmony_ci
142cabdff1aSopenharmony_ci    uint8_t *deintTemp;
143cabdff1aSopenharmony_ci
144cabdff1aSopenharmony_ci    DECLARE_ALIGNED(8, uint64_t, pQPb);
145cabdff1aSopenharmony_ci    DECLARE_ALIGNED(8, uint64_t, pQPb2);
146cabdff1aSopenharmony_ci
147cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, uint64_t, pQPb_block)[4];
148cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, uint64_t, pQPb2_block)[4];
149cabdff1aSopenharmony_ci
150cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, uint64_t, mmxDcOffset)[64];
151cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, uint64_t, mmxDcThreshold)[64];
152cabdff1aSopenharmony_ci
153cabdff1aSopenharmony_ci    int8_t *stdQPTable;       ///< used to fix MPEG2 style qscale
154cabdff1aSopenharmony_ci    int8_t *nonBQPTable;
155cabdff1aSopenharmony_ci    int8_t *forcedQPTable;
156cabdff1aSopenharmony_ci
157cabdff1aSopenharmony_ci    int QP;
158cabdff1aSopenharmony_ci    int nonBQP;
159cabdff1aSopenharmony_ci
160cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, int, QP_block)[4];
161cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, int, nonBQP_block)[4];
162cabdff1aSopenharmony_ci
163cabdff1aSopenharmony_ci    int frameNum;
164cabdff1aSopenharmony_ci
165cabdff1aSopenharmony_ci    int cpuCaps;
166cabdff1aSopenharmony_ci
167cabdff1aSopenharmony_ci    int qpStride; ///<size of qp buffers (needed to realloc them if needed)
168cabdff1aSopenharmony_ci    int stride;   ///<size of some buffers (needed to realloc them if needed)
169cabdff1aSopenharmony_ci
170cabdff1aSopenharmony_ci    int hChromaSubSample;
171cabdff1aSopenharmony_ci    int vChromaSubSample;
172cabdff1aSopenharmony_ci
173cabdff1aSopenharmony_ci    PPMode ppMode;
174cabdff1aSopenharmony_ci} PPContext;
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci
177cabdff1aSopenharmony_cistatic inline void linecpy(void *dest, const void *src, int lines, int stride) {
178cabdff1aSopenharmony_ci    if (stride > 0) {
179cabdff1aSopenharmony_ci        memcpy(dest, src, lines*stride);
180cabdff1aSopenharmony_ci    } else {
181cabdff1aSopenharmony_ci        memcpy((uint8_t*)dest+(lines-1)*stride, (const uint8_t*)src+(lines-1)*stride, -lines*stride);
182cabdff1aSopenharmony_ci    }
183cabdff1aSopenharmony_ci}
184cabdff1aSopenharmony_ci
185cabdff1aSopenharmony_ci#endif /* POSTPROC_POSTPROCESS_INTERNAL_H */
186