2 * DSP functions for Indeo Video Interactive codecs (Indeo4 and Indeo5)
4 * Copyright (c) 2009-2011 Maxim Poliakovski
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * DSP functions (inverse transforms, motion compensations, wavelet recompostion)
26 * for Indeo Video Interactive codecs.
29 #ifndef AVCODEC_IVI_DSP_H
30 #define AVCODEC_IVI_DSP_H
33 #include "ivi_common.h"
36 * 5/3 wavelet recomposition filter for Indeo5
38 * @param[in] plane pointer to the descriptor of the plane being processed
39 * @param[out] dst pointer to the destination buffer
40 * @param[in] dst_pitch pitch of the destination buffer
42 void ff_ivi_recompose53(const IVIPlaneDesc *plane, uint8_t *dst,
46 * Haar wavelet recomposition filter for Indeo 4
48 * @param[in] plane pointer to the descriptor of the plane being processed
49 * @param[out] dst pointer to the destination buffer
50 * @param[in] dst_pitch pitch of the destination buffer
52 void ff_ivi_recompose_haar(const IVIPlaneDesc *plane, uint8_t *dst,
56 * two-dimensional inverse Haar 8x8 transform for Indeo 4
58 * @param[in] in pointer to the vector of transform coefficients
59 * @param[out] out pointer to the output buffer (frame)
60 * @param[in] pitch pitch to move to the next y line
61 * @param[in] flags pointer to the array of column flags:
62 * != 0 - non_empty column, 0 - empty one
63 * (this array must be filled by caller)
65 void ff_ivi_inverse_haar_8x8(const int32_t *in, int16_t *out, uint32_t pitch,
66 const uint8_t *flags);
67 void ff_ivi_inverse_haar_8x1(const int32_t *in, int16_t *out, uint32_t pitch,
68 const uint8_t *flags);
69 void ff_ivi_inverse_haar_1x8(const int32_t *in, int16_t *out, uint32_t pitch,
70 const uint8_t *flags);
73 * DC-only two-dimensional inverse Haar transform for Indeo 4.
74 * Performing the inverse transform in this case is equivalent to
75 * spreading DC_coeff >> 3 over the whole block.
77 * @param[in] in pointer to the dc coefficient
78 * @param[out] out pointer to the output buffer (frame)
79 * @param[in] pitch pitch to move to the next y line
80 * @param[in] blk_size transform block size
82 void ff_ivi_dc_haar_2d(const int32_t *in, int16_t *out, uint32_t pitch,
86 * two-dimensional inverse slant 8x8 transform
88 * @param[in] in pointer to the vector of transform coefficients
89 * @param[out] out pointer to the output buffer (frame)
90 * @param[in] pitch pitch to move to the next y line
91 * @param[in] flags pointer to the array of column flags:
92 * != 0 - non_empty column, 0 - empty one
93 * (this array must be filled by caller)
95 void ff_ivi_inverse_slant_8x8(const int32_t *in, int16_t *out, uint32_t pitch,
96 const uint8_t *flags);
99 * two-dimensional inverse slant 4x4 transform
101 * @param[in] in pointer to the vector of transform coefficients
102 * @param[out] out pointer to the output buffer (frame)
103 * @param[in] pitch pitch to move to the next y line
104 * @param[in] flags pointer to the array of column flags:
105 * != 0 - non_empty column, 0 - empty one
106 * (this array must be filled by caller)
108 void ff_ivi_inverse_slant_4x4(const int32_t *in, int16_t *out, uint32_t pitch,
109 const uint8_t *flags);
112 * DC-only two-dimensional inverse slant transform.
113 * Performing the inverse slant transform in this case is equivalent to
114 * spreading (DC_coeff + 1)/2 over the whole block.
115 * It works much faster than performing the slant transform on a vector of zeroes.
117 * @param[in] in pointer to the dc coefficient
118 * @param[out] out pointer to the output buffer (frame)
119 * @param[in] pitch pitch to move to the next y line
120 * @param[in] blk_size transform block size
122 void ff_ivi_dc_slant_2d(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
125 * inverse 1D row slant transform
127 * @param[in] in pointer to the vector of transform coefficients
128 * @param[out] out pointer to the output buffer (frame)
129 * @param[in] pitch pitch to move to the next y line
130 * @param[in] flags pointer to the array of column flags (unused here)
132 void ff_ivi_row_slant8(const int32_t *in, int16_t *out, uint32_t pitch,
133 const uint8_t *flags);
136 * inverse 1D column slant transform
138 * @param[in] in pointer to the vector of transform coefficients
139 * @param[out] out pointer to the output buffer (frame)
140 * @param[in] pitch pitch to move to the next y line
141 * @param[in] flags pointer to the array of column flags:
142 * != 0 - non_empty column, 0 - empty one
143 * (this array must be filled by caller)
145 void ff_ivi_col_slant8(const int32_t *in, int16_t *out, uint32_t pitch,
146 const uint8_t *flags);
149 * DC-only inverse row slant transform
151 void ff_ivi_dc_row_slant(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
154 * DC-only inverse column slant transform
156 void ff_ivi_dc_col_slant(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
159 * Copy the pixels into the frame buffer.
161 void ff_ivi_put_pixels_8x8(const int32_t *in, int16_t *out, uint32_t pitch, const uint8_t *flags);
164 * Copy the DC coefficient into the first pixel of the block and
167 void ff_ivi_put_dc_pixel_8x8(const int32_t *in, int16_t *out, uint32_t pitch, int blk_size);
170 * 8x8 block motion compensation with adding delta
172 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
173 * @param[in] ref_buf pointer to the corresponding block in the reference frame
174 * @param[in] pitch pitch for moving to the next y line
175 * @param[in] mc_type interpolation type
177 void ff_ivi_mc_8x8_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
180 * 4x4 block motion compensation with adding delta
182 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
183 * @param[in] ref_buf pointer to the corresponding block in the reference frame
184 * @param[in] pitch pitch for moving to the next y line
185 * @param[in] mc_type interpolation type
187 void ff_ivi_mc_4x4_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
190 * motion compensation without adding delta
192 * @param[in,out] buf pointer to the block in the current frame receiving the result
193 * @param[in] ref_buf pointer to the corresponding block in the reference frame
194 * @param[in] pitch pitch for moving to the next y line
195 * @param[in] mc_type interpolation type
197 void ff_ivi_mc_8x8_no_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
200 * 4x4 block motion compensation without adding delta
202 * @param[in,out] buf pointer to the block in the current frame receiving the result
203 * @param[in] ref_buf pointer to the corresponding block in the reference frame
204 * @param[in] pitch pitch for moving to the next y line
205 * @param[in] mc_type interpolation type
207 void ff_ivi_mc_4x4_no_delta(int16_t *buf, const int16_t *ref_buf, uint32_t pitch, int mc_type);
209 #endif /* AVCODEC_IVI_DSP_H */