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