/src/ffmpeg/libavcodec/snow_dwt.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (C) 2004-2010 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 |
7 | | * modify it under the terms of the GNU Lesser General Public |
8 | | * License as published by the Free Software Foundation; either |
9 | | * version 2.1 of the License, or (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 GNU |
14 | | * Lesser General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU Lesser General Public |
17 | | * License 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 | | #ifndef AVCODEC_SNOW_DWT_H |
22 | | #define AVCODEC_SNOW_DWT_H |
23 | | |
24 | | #include <stddef.h> |
25 | | #include <stdint.h> |
26 | | |
27 | | #include "libavutil/attributes.h" |
28 | | |
29 | | struct MpegEncContext; |
30 | | |
31 | | typedef int DWTELEM; |
32 | | typedef short IDWTELEM; |
33 | | |
34 | 520k | #define MAX_DECOMPOSITIONS 8 |
35 | | |
36 | | typedef struct DWTCompose { |
37 | | IDWTELEM *b0; |
38 | | IDWTELEM *b1; |
39 | | IDWTELEM *b2; |
40 | | IDWTELEM *b3; |
41 | | int y; |
42 | | } DWTCompose; |
43 | | |
44 | | /** Used to minimize the amount of memory used in order to |
45 | | * optimize cache performance. **/ |
46 | | typedef struct slice_buffer_s { |
47 | | IDWTELEM **line; ///< For use by idwt and predict_slices. |
48 | | IDWTELEM **data_stack; ///< Used for internal purposes. |
49 | | int data_stack_top; |
50 | | int line_count; |
51 | | int line_width; |
52 | | int data_count; |
53 | | IDWTELEM *base_buffer; ///< Buffer that this structure is caching. |
54 | | } slice_buffer; |
55 | | |
56 | | struct SnowDWTContext; |
57 | | |
58 | | typedef struct SnowDWTContext { |
59 | | void (*vertical_compose97i)(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, |
60 | | IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, |
61 | | int width); |
62 | | void (*horizontal_compose97i)(IDWTELEM *b, IDWTELEM *temp, int width); |
63 | | void (*inner_add_yblock)(const uint8_t *obmc, const int obmc_stride, |
64 | | uint8_t **block, int b_w, int b_h, int src_x, |
65 | | int src_y, int src_stride, slice_buffer *sb, |
66 | | int add, uint8_t *dst8); |
67 | | } SnowDWTContext; |
68 | | |
69 | | |
70 | 19.2M | #define DWT_97 0 |
71 | 0 | #define DWT_53 1 |
72 | | |
73 | | #define liftS lift |
74 | 637M | #define W_AM 3 |
75 | 637M | #define W_AO 0 |
76 | 637M | #define W_AS 1 |
77 | | |
78 | | #undef liftS |
79 | 555M | #define W_BM 1 |
80 | 656M | #define W_BO 8 |
81 | 555M | #define W_BS 4 |
82 | | |
83 | 637M | #define W_CM 1 |
84 | 637M | #define W_CO 0 |
85 | 637M | #define W_CS 0 |
86 | | |
87 | 656M | #define W_DM 3 |
88 | 656M | #define W_DO 4 |
89 | 656M | #define W_DS 3 |
90 | | |
91 | | #define slice_buffer_get_line(slice_buf, line_num) \ |
92 | 0 | ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] \ |
93 | 0 | : ff_slice_buffer_load_line((slice_buf), \ |
94 | 0 | (line_num))) |
95 | | |
96 | | /* C bits used by mmx/sse2/altivec */ |
97 | | |
98 | | static av_always_inline void snow_interleave_line_header(int *i, int width, IDWTELEM *low, IDWTELEM *high) |
99 | 0 | { |
100 | 0 | *i = width - 2; |
101 | |
|
102 | 0 | if (width & 1) { |
103 | 0 | low[*i + 1] = low[(*i + 1)>>1]; |
104 | 0 | (*i)--; |
105 | 0 | } |
106 | 0 | } Unexecuted instantiation: snow_dwt.c:snow_interleave_line_header Unexecuted instantiation: snowdsp.c:snow_interleave_line_header Unexecuted instantiation: snow.c:snow_interleave_line_header Unexecuted instantiation: snowenc.c:snow_interleave_line_header |
107 | | |
108 | | static av_always_inline void snow_interleave_line_footer(int *i, IDWTELEM *low, const IDWTELEM *high) |
109 | 0 | { |
110 | 0 | for (; *i >= 0; *i -= 2) { |
111 | 0 | low[*i + 1] = high[*i >> 1]; |
112 | 0 | low[*i] = low[*i >> 1]; |
113 | 0 | } |
114 | 0 | } Unexecuted instantiation: snow_dwt.c:snow_interleave_line_footer Unexecuted instantiation: snowdsp.c:snow_interleave_line_footer Unexecuted instantiation: snow.c:snow_interleave_line_footer Unexecuted instantiation: snowenc.c:snow_interleave_line_footer |
115 | | |
116 | | static av_always_inline void snow_horizontal_compose_lift_lead_out(int i, IDWTELEM *dst, const IDWTELEM *src, const IDWTELEM *ref, int width, int w, int lift_high, int mul, int add, int shift) |
117 | 0 | { |
118 | 0 | for (; i < w; i++) |
119 | 0 | dst[i] = src[i] - ((mul * (ref[i] + ref[i + 1]) + add) >> shift); |
120 | |
|
121 | 0 | if ((width ^ lift_high) & 1) |
122 | 0 | dst[w] = src[w] - ((mul * 2 * ref[w] + add) >> shift); |
123 | 0 | } Unexecuted instantiation: snow_dwt.c:snow_horizontal_compose_lift_lead_out Unexecuted instantiation: snowdsp.c:snow_horizontal_compose_lift_lead_out Unexecuted instantiation: snow.c:snow_horizontal_compose_lift_lead_out Unexecuted instantiation: snowenc.c:snow_horizontal_compose_lift_lead_out |
124 | | |
125 | | static av_always_inline void snow_horizontal_compose_liftS_lead_out(int i, IDWTELEM *dst, const IDWTELEM *src, const IDWTELEM *ref, int width, int w) |
126 | 0 | { |
127 | 0 | for (; i < w; i++) |
128 | 0 | dst[i] = src[i] + ((ref[i] + ref[(i+1)]+W_BO + 4 * src[i]) >> W_BS); |
129 | |
|
130 | 0 | if (width & 1) |
131 | 0 | dst[w] = src[w] + ((2 * ref[w] + W_BO + 4 * src[w]) >> W_BS); |
132 | 0 | } Unexecuted instantiation: snow_dwt.c:snow_horizontal_compose_liftS_lead_out Unexecuted instantiation: snowdsp.c:snow_horizontal_compose_liftS_lead_out Unexecuted instantiation: snow.c:snow_horizontal_compose_liftS_lead_out Unexecuted instantiation: snowenc.c:snow_horizontal_compose_liftS_lead_out |
133 | | |
134 | | int ff_slice_buffer_init(slice_buffer *buf, int line_count, |
135 | | int max_allocated_lines, int line_width, |
136 | | IDWTELEM *base_buffer); |
137 | | void ff_slice_buffer_release(slice_buffer *buf, int line); |
138 | | void ff_slice_buffer_flush(slice_buffer *buf); |
139 | | void ff_slice_buffer_destroy(slice_buffer *buf); |
140 | | IDWTELEM *ff_slice_buffer_load_line(slice_buffer *buf, int line); |
141 | | |
142 | | void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, |
143 | | uint8_t **block, int b_w, int b_h, int src_x, |
144 | | int src_y, int src_stride, slice_buffer *sb, |
145 | | int add, uint8_t *dst8); |
146 | | |
147 | | int ff_w53_32_c(struct MpegEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h); |
148 | | int ff_w97_32_c(struct MpegEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h); |
149 | | |
150 | | void ff_spatial_dwt(int *buffer, int *temp, int width, int height, int stride, |
151 | | int type, int decomposition_count); |
152 | | |
153 | | void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer *sb, int width, |
154 | | int height, int stride_line, int type, |
155 | | int decomposition_count); |
156 | | void ff_spatial_idwt_buffered_slice(SnowDWTContext *dsp, DWTCompose *cs, |
157 | | slice_buffer *slice_buf, IDWTELEM *temp, |
158 | | int width, int height, int stride_line, |
159 | | int type, int decomposition_count, int y); |
160 | | void ff_spatial_idwt(IDWTELEM *buffer, IDWTELEM *temp, int width, int height, |
161 | | int stride, int type, int decomposition_count); |
162 | | |
163 | | void ff_dwt_init(SnowDWTContext *c); |
164 | | void ff_dwt_init_x86(SnowDWTContext *c); |
165 | | |
166 | | #endif /* AVCODEC_DWT_H */ |