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. #define VISUALIZE                       0x2000000
  73.  
  74. //use if you want a faster postprocessing code
  75. //cannot differentiate between chroma & luma filters (both on or both off)
  76. //obviously the -pp option on the command line has no effect except turning the here selected
  77. //filters on
  78. //#define COMPILE_TIME_MODE 0x77
  79.  
  80. /**
  81.  * Postprocessing filter.
  82.  */
  83. struct PPFilter{
  84.     const char *shortName;
  85.     const char *longName;
  86.     int chromDefault;       ///< is chrominance filtering on by default if this filter is manually activated
  87.     int minLumQuality;      ///< minimum quality to turn luminance filtering on
  88.     int minChromQuality;    ///< minimum quality to turn chrominance filtering on
  89.     int mask;               ///< Bitmask to turn this filter on
  90. };
  91.  
  92. /**
  93.  * Postprocessing mode.
  94.  */
  95. typedef struct PPMode{
  96.     int lumMode;                    ///< activates filters for luminance
  97.     int chromMode;                  ///< activates filters for chrominance
  98.     int error;                      ///< non zero on error
  99.  
  100.     int minAllowedY;                ///< for brightness correction
  101.     int maxAllowedY;                ///< for brightness correction
  102.     AVRational maxClippedThreshold; ///< amount of "black" you are willing to lose to get a brightness-corrected picture
  103.  
  104.     int maxTmpNoise[3];             ///< for Temporal Noise Reducing filter (Maximal sum of abs differences)
  105.  
  106.     int baseDcDiff;
  107.     int flatnessThreshold;
  108.  
  109.     int forcedQuant;                ///< quantizer if FORCE_QUANT is used
  110. } PPMode;
  111.  
  112. /**
  113.  * postprocess context.
  114.  */
  115. typedef struct PPContext{
  116.     /**
  117.      * info on struct for av_log
  118.      */
  119.     const AVClass *av_class;
  120.  
  121.     uint8_t *tempBlocks; ///<used for the horizontal code
  122.  
  123.     /**
  124.      * luma histogram.
  125.      * we need 64bit here otherwise we'll going to have a problem
  126.      * after watching a black picture for 5 hours
  127.      */
  128.     uint64_t *yHistogram;
  129.  
  130.     DECLARE_ALIGNED(8, uint64_t, packedYOffset);
  131.     DECLARE_ALIGNED(8, uint64_t, packedYScale);
  132.  
  133.     /** Temporal noise reducing buffers */
  134.     uint8_t *tempBlurred[3];
  135.     int32_t *tempBlurredPast[3];
  136.  
  137.     /** Temporary buffers for handling the last row(s) */
  138.     uint8_t *tempDst;
  139.     uint8_t *tempSrc;
  140.  
  141.     uint8_t *deintTemp;
  142.  
  143.     DECLARE_ALIGNED(8, uint64_t, pQPb);
  144.     DECLARE_ALIGNED(8, uint64_t, pQPb2);
  145.  
  146.     DECLARE_ALIGNED(32, uint64_t, pQPb_block)[4];
  147.     DECLARE_ALIGNED(32, uint64_t, pQPb2_block)[4];
  148.  
  149.     DECLARE_ALIGNED(32, uint64_t, mmxDcOffset)[64];
  150.     DECLARE_ALIGNED(32, uint64_t, mmxDcThreshold)[64];
  151.  
  152.     QP_STORE_T *stdQPTable;       ///< used to fix MPEG2 style qscale
  153.     QP_STORE_T *nonBQPTable;
  154.     QP_STORE_T *forcedQPTable;
  155.  
  156.     int QP;
  157.     int nonBQP;
  158.  
  159.     DECLARE_ALIGNED(32, int, QP_block)[4];
  160.     DECLARE_ALIGNED(32, int, nonBQP_block)[4];
  161.  
  162.     int frameNum;
  163.  
  164.     int cpuCaps;
  165.  
  166.     int qpStride; ///<size of qp buffers (needed to realloc them if needed)
  167.     int stride;   ///<size of some buffers (needed to realloc them if needed)
  168.  
  169.     int hChromaSubSample;
  170.     int vChromaSubSample;
  171.  
  172.     PPMode ppMode;
  173. } PPContext;
  174.  
  175.  
  176. static inline void linecpy(void *dest, const void *src, int lines, int stride) {
  177.     if (stride > 0) {
  178.         memcpy(dest, src, lines*stride);
  179.     } else {
  180.         memcpy((uint8_t*)dest+(lines-1)*stride, (const uint8_t*)src+(lines-1)*stride, -lines*stride);
  181.     }
  182. }
  183.  
  184. #endif /* POSTPROC_POSTPROCESS_INTERNAL_H */
  185.