Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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