Blame view

ffmpeg-4.2.2/libavfilter/transform.h 4.4 KB
aac5773f   hucm   功能基本完成,接口待打磨
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  /*
   * Copyright (C) 2010 Georg Martius <georg.martius@web.de>
   * Copyright (C) 2010 Daniel G. Taylor <dan@programmer-art.org>
   *
   * This file is part of FFmpeg.
   *
   * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
   * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
   * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #ifndef AVFILTER_TRANSFORM_H
  #define AVFILTER_TRANSFORM_H
  
  #include <stdint.h>
  
  /**
   * @file
   * transform input video
   *
   * All matrices are defined as a single 9-item block of contiguous memory. For
   * example, the identity matrix would be:
   *
   *     float *matrix = {1, 0, 0,
   *                      0, 1, 0,
   *                      0, 0, 1};
   */
  
  enum InterpolateMethod {
      INTERPOLATE_NEAREST,        //< Nearest-neighbor (fast)
      INTERPOLATE_BILINEAR,       //< Bilinear
      INTERPOLATE_BIQUADRATIC,    //< Biquadratic (best)
      INTERPOLATE_COUNT,          //< Number of interpolation methods
  };
  
  // Shortcuts for the fastest and best interpolation methods
  #define INTERPOLATE_DEFAULT INTERPOLATE_BILINEAR
  #define INTERPOLATE_FAST    INTERPOLATE_NEAREST
  #define INTERPOLATE_BEST    INTERPOLATE_BIQUADRATIC
  
  enum FillMethod {
      FILL_BLANK,         //< Fill zeroes at blank locations
      FILL_ORIGINAL,      //< Original image at blank locations
      FILL_CLAMP,         //< Extruded edge value at blank locations
      FILL_MIRROR,        //< Mirrored edge at blank locations
      FILL_COUNT,         //< Number of edge fill methods
  };
  
  // Shortcuts for fill methods
  #define FILL_DEFAULT FILL_ORIGINAL
  
  /**
   * Get an affine transformation matrix from a given translation, rotation, and
   * zoom factor. The matrix will look like:
   *
   * [ zoom * cos(angle),           -sin(angle),     x_shift,
   *          sin(angle),     zoom * cos(angle),     y_shift,
   *                   0,                     0,           1 ]
   *
   * @param x_shift horizontal translation
   * @param y_shift vertical translation
   * @param angle   rotation in radians
   * @param zoom    scale percent (1.0 = 100%)
   * @param matrix  9-item affine transformation matrix
   */
  void avfilter_get_matrix(float x_shift, float y_shift, float angle, float zoom, float *matrix);
  
  /**
   * Add two matrices together. result = m1 + m2.
   *
   * @param m1     9-item transformation matrix
   * @param m2     9-item transformation matrix
   * @param result 9-item transformation matrix
   */
  void avfilter_add_matrix(const float *m1, const float *m2, float *result);
  
  /**
   * Subtract one matrix from another. result = m1 - m2.
   *
   * @param m1     9-item transformation matrix
   * @param m2     9-item transformation matrix
   * @param result 9-item transformation matrix
   */
  void avfilter_sub_matrix(const float *m1, const float *m2, float *result);
  
  /**
   * Multiply a matrix by a scalar value. result = m1 * scalar.
   *
   * @param m1     9-item transformation matrix
   * @param scalar a number
   * @param result 9-item transformation matrix
   */
  void avfilter_mul_matrix(const float *m1, float scalar, float *result);
  
  /**
   * Do an affine transformation with the given interpolation method. This
   * multiplies each vector [x,y,1] by the matrix and then interpolates to
   * get the final value.
   *
   * @param src         source image
   * @param dst         destination image
   * @param src_stride  source image line size in bytes
   * @param dst_stride  destination image line size in bytes
   * @param width       image width in pixels
   * @param height      image height in pixels
   * @param matrix      9-item affine transformation matrix
   * @param interpolate pixel interpolation method
   * @param fill        edge fill method
   * @return negative on error
   */
  int avfilter_transform(const uint8_t *src, uint8_t *dst,
                          int src_stride, int dst_stride,
                          int width, int height, const float *matrix,
                          enum InterpolateMethod interpolate,
                          enum FillMethod fill);
  
  #endif /* AVFILTER_TRANSFORM_H */