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 * one-dimensional inverse 8-point Haar transform on rows for Indeo 4
75 * @param[in] in pointer to the vector of transform coefficients
76 * @param[out] out pointer to the output buffer (frame)
77 * @param[in] pitch pitch to move to the next y line
78 * @param[in] flags pointer to the array of column flags:
79 * != 0 - non_empty column, 0 - empty one
80 * (this array must be filled by caller)
82 void ff_ivi_row_haar8(const int32_t *in
, int16_t *out
, uint32_t pitch
,
83 const uint8_t *flags
);
86 * one-dimensional inverse 8-point Haar transform on columns for Indeo 4
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_col_haar8(const int32_t *in
, int16_t *out
, uint32_t pitch
,
96 const uint8_t *flags
);
99 * two-dimensional inverse Haar 4x4 transform for Indeo 4
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_haar_4x4(const int32_t *in
, int16_t *out
, uint32_t pitch
,
109 const uint8_t *flags
);
112 * one-dimensional inverse 4-point Haar transform on rows for Indeo 4
114 * @param[in] in pointer to the vector of transform coefficients
115 * @param[out] out pointer to the output buffer (frame)
116 * @param[in] pitch pitch to move to the next y line
117 * @param[in] flags pointer to the array of column flags:
118 * != 0 - non_empty column, 0 - empty one
119 * (this array must be filled by caller)
121 void ff_ivi_row_haar4(const int32_t *in
, int16_t *out
, uint32_t pitch
,
122 const uint8_t *flags
);
125 * one-dimensional inverse 4-point Haar transform on columns for Indeo 4
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:
131 * != 0 - non_empty column, 0 - empty one
132 * (this array must be filled by caller)
134 void ff_ivi_col_haar4(const int32_t *in
, int16_t *out
, uint32_t pitch
,
135 const uint8_t *flags
);
138 * DC-only two-dimensional inverse Haar transform for Indeo 4.
139 * Performing the inverse transform in this case is equivalent to
140 * spreading DC_coeff >> 3 over the whole block.
142 * @param[in] in pointer to the dc coefficient
143 * @param[out] out pointer to the output buffer (frame)
144 * @param[in] pitch pitch to move to the next y line
145 * @param[in] blk_size transform block size
147 void ff_ivi_dc_haar_2d(const int32_t *in
, int16_t *out
, uint32_t pitch
,
151 * two-dimensional inverse slant 8x8 transform
153 * @param[in] in pointer to the vector of transform coefficients
154 * @param[out] out pointer to the output buffer (frame)
155 * @param[in] pitch pitch to move to the next y line
156 * @param[in] flags pointer to the array of column flags:
157 * != 0 - non_empty column, 0 - empty one
158 * (this array must be filled by caller)
160 void ff_ivi_inverse_slant_8x8(const int32_t *in
, int16_t *out
, uint32_t pitch
,
161 const uint8_t *flags
);
164 * two-dimensional inverse slant 4x4 transform
166 * @param[in] in pointer to the vector of transform coefficients
167 * @param[out] out pointer to the output buffer (frame)
168 * @param[in] pitch pitch to move to the next y line
169 * @param[in] flags pointer to the array of column flags:
170 * != 0 - non_empty column, 0 - empty one
171 * (this array must be filled by caller)
173 void ff_ivi_inverse_slant_4x4(const int32_t *in
, int16_t *out
, uint32_t pitch
,
174 const uint8_t *flags
);
177 * DC-only two-dimensional inverse slant transform.
178 * Performing the inverse slant transform in this case is equivalent to
179 * spreading (DC_coeff + 1)/2 over the whole block.
180 * It works much faster than performing the slant transform on a vector of zeroes.
182 * @param[in] in pointer to the dc coefficient
183 * @param[out] out pointer to the output buffer (frame)
184 * @param[in] pitch pitch to move to the next y line
185 * @param[in] blk_size transform block size
187 void ff_ivi_dc_slant_2d(const int32_t *in
, int16_t *out
, uint32_t pitch
, int blk_size
);
190 * inverse 1D row slant transform
192 * @param[in] in pointer to the vector of transform coefficients
193 * @param[out] out pointer to the output buffer (frame)
194 * @param[in] pitch pitch to move to the next y line
195 * @param[in] flags pointer to the array of column flags (unused here)
197 void ff_ivi_row_slant8(const int32_t *in
, int16_t *out
, uint32_t pitch
,
198 const uint8_t *flags
);
201 * inverse 1D column slant transform
203 * @param[in] in pointer to the vector of transform coefficients
204 * @param[out] out pointer to the output buffer (frame)
205 * @param[in] pitch pitch to move to the next y line
206 * @param[in] flags pointer to the array of column flags:
207 * != 0 - non_empty column, 0 - empty one
208 * (this array must be filled by caller)
210 void ff_ivi_col_slant8(const int32_t *in
, int16_t *out
, uint32_t pitch
,
211 const uint8_t *flags
);
214 * inverse 1D row slant transform
216 * @param[in] in pointer to the vector of transform coefficients
217 * @param[out] out pointer to the output buffer (frame)
218 * @param[in] pitch pitch to move to the next y line
219 * @param[in] flags pointer to the array of column flags (unused here)
221 void ff_ivi_row_slant4(const int32_t *in
, int16_t *out
, uint32_t pitch
,
222 const uint8_t *flags
);
225 * inverse 1D column slant transform
227 * @param[in] in pointer to the vector of transform coefficients
228 * @param[out] out pointer to the output buffer (frame)
229 * @param[in] pitch pitch to move to the next y line
230 * @param[in] flags pointer to the array of column flags:
231 * != 0 - non_empty column, 0 - empty one
232 * (this array must be filled by caller)
234 void ff_ivi_col_slant4(const int32_t *in
, int16_t *out
, uint32_t pitch
,
235 const uint8_t *flags
);
238 * DC-only inverse row slant transform
240 void ff_ivi_dc_row_slant(const int32_t *in
, int16_t *out
, uint32_t pitch
, int blk_size
);
243 * DC-only inverse column slant transform
245 void ff_ivi_dc_col_slant(const int32_t *in
, int16_t *out
, uint32_t pitch
, int blk_size
);
248 * Copy the pixels into the frame buffer.
250 void ff_ivi_put_pixels_8x8(const int32_t *in
, int16_t *out
, uint32_t pitch
, const uint8_t *flags
);
253 * Copy the DC coefficient into the first pixel of the block and
256 void ff_ivi_put_dc_pixel_8x8(const int32_t *in
, int16_t *out
, uint32_t pitch
, int blk_size
);
259 * 8x8 block motion compensation with adding delta
261 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
262 * @param[in] ref_buf pointer to the corresponding block in the reference frame
263 * @param[in] pitch pitch for moving to the next y line
264 * @param[in] mc_type interpolation type
266 void ff_ivi_mc_8x8_delta(int16_t *buf
, const int16_t *ref_buf
, uint32_t pitch
, int mc_type
);
269 * 4x4 block motion compensation with adding delta
271 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
272 * @param[in] ref_buf pointer to the corresponding block in the reference frame
273 * @param[in] pitch pitch for moving to the next y line
274 * @param[in] mc_type interpolation type
276 void ff_ivi_mc_4x4_delta(int16_t *buf
, const int16_t *ref_buf
, uint32_t pitch
, int mc_type
);
279 * motion compensation without adding delta
281 * @param[in,out] buf pointer to the block in the current frame receiving the result
282 * @param[in] ref_buf pointer to the corresponding block in the reference frame
283 * @param[in] pitch pitch for moving to the next y line
284 * @param[in] mc_type interpolation type
286 void ff_ivi_mc_8x8_no_delta(int16_t *buf
, const int16_t *ref_buf
, uint32_t pitch
, int mc_type
);
289 * 4x4 block motion compensation without adding delta
291 * @param[in,out] buf pointer to the block in the current frame receiving the result
292 * @param[in] ref_buf pointer to the corresponding block in the reference frame
293 * @param[in] pitch pitch for moving to the next y line
294 * @param[in] mc_type interpolation type
296 void ff_ivi_mc_4x4_no_delta(int16_t *buf
, const int16_t *ref_buf
, uint32_t pitch
, int mc_type
);
299 * 8x8 block motion compensation with adding delta
301 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
302 * @param[in] ref_buf pointer to the corresponding block in the backward reference frame
303 * @param[in] ref_buf2 pointer to the corresponding block in the forward reference frame
304 * @param[in] pitch pitch for moving to the next y line
305 * @param[in] mc_type interpolation type for backward reference
306 * @param[in] mc_type2 interpolation type for forward reference
308 void ff_ivi_mc_avg_8x8_delta(int16_t *buf
, const int16_t *ref_buf
, const int16_t *ref_buf2
, uint32_t pitch
, int mc_type
, int mc_type2
);
311 * 4x4 block motion compensation with adding delta
313 * @param[in,out] buf pointer to the block in the current frame buffer containing delta
314 * @param[in] ref_buf pointer to the corresponding block in the backward reference frame
315 * @param[in] ref_buf2 pointer to the corresponding block in the forward reference frame
316 * @param[in] pitch pitch for moving to the next y line
317 * @param[in] mc_type interpolation type for backward reference
318 * @param[in] mc_type2 interpolation type for forward reference
320 void ff_ivi_mc_avg_4x4_delta(int16_t *buf
, const int16_t *ref_buf
, const int16_t *ref_buf2
, uint32_t pitch
, int mc_type
, int mc_type2
);
323 * motion compensation without adding delta for B-frames
325 * @param[in,out] buf pointer to the block in the current frame receiving the result
326 * @param[in] ref_buf pointer to the corresponding block in the backward reference frame
327 * @param[in] ref_buf2 pointer to the corresponding block in the forward reference frame
328 * @param[in] pitch pitch for moving to the next y line
329 * @param[in] mc_type interpolation type for backward reference
330 * @param[in] mc_type2 interpolation type for forward reference
332 void ff_ivi_mc_avg_8x8_no_delta(int16_t *buf
, const int16_t *ref_buf
, const int16_t *ref_buf2
, uint32_t pitch
, int mc_type
, int mc_type2
);
335 * 4x4 block motion compensation without adding delta for B-frames
337 * @param[in,out] buf pointer to the block in the current frame receiving the result
338 * @param[in] ref_buf pointer to the corresponding block in the backward reference frame
339 * @param[in] ref_buf2 pointer to the corresponding block in the forward reference frame
340 * @param[in] pitch pitch for moving to the next y line
341 * @param[in] mc_type interpolation type for backward reference
342 * @param[in] mc_type2 interpolation type for forward reference
344 void ff_ivi_mc_avg_4x4_no_delta(int16_t *buf
, const int16_t *ref_buf
, const int16_t *ref_buf2
, uint32_t pitch
, int mc_type
, int mc_type2
);
346 #endif /* AVCODEC_IVI_DSP_H */