FFmpeg
snow_dwt.h
Go to the documentation of this file.
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 typedef struct MPVEncContext MPVEncContext;
30 
31 typedef int DWTELEM;
32 typedef short IDWTELEM;
33 
34 #define MAX_DECOMPOSITIONS 8
35 
36 typedef struct DWTCompose {
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.
53  IDWTELEM *base_buffer; ///< Buffer that this structure is caching.
54 } slice_buffer;
55 
56 typedef struct SnowDWTContext {
58  IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5,
59  int width);
61  void (*inner_add_yblock)(const uint8_t *obmc, const int obmc_stride,
62  uint8_t **block, int b_w, int b_h, int src_x,
63  int src_stride, IDWTELEM * const *lines,
64  int add, uint8_t *dst8);
66 
67 
68 #define DWT_97 0
69 #define DWT_53 1
70 
71 #define liftS lift
72 #define W_AM 3
73 #define W_AO 0
74 #define W_AS 1
75 
76 #undef liftS
77 #define W_BM 1
78 #define W_BO 8
79 #define W_BS 4
80 
81 #define W_CM 1
82 #define W_CO 0
83 #define W_CS 0
84 
85 #define W_DM 3
86 #define W_DO 4
87 #define W_DS 3
88 
89 #define slice_buffer_get_line(slice_buf, line_num) \
90  ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] \
91  : ff_slice_buffer_load_line((slice_buf), \
92  (line_num)))
93 
94 /* C bits used by mmx/sse2/altivec */
95 
97 {
98  *i = width - 2;
99 
100  if (width & 1) {
101  low[*i + 1] = low[(*i + 1)>>1];
102  (*i)--;
103  }
104 }
105 
107 {
108  for (; *i >= 0; *i -= 2) {
109  low[*i + 1] = high[*i >> 1];
110  low[*i] = low[*i >> 1];
111  }
112 }
113 
114 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)
115 {
116  for (; i < w; i++)
117  dst[i] = src[i] - ((mul * (ref[i] + ref[i + 1]) + add) >> shift);
118 
119  if ((width ^ lift_high) & 1)
120  dst[w] = src[w] - ((mul * 2 * ref[w] + add) >> shift);
121 }
122 
124 {
125  for (; i < w; i++)
126  dst[i] = src[i] + ((ref[i] + ref[(i+1)]+W_BO + 4 * src[i]) >> W_BS);
127 
128  if (width & 1)
129  dst[w] = src[w] + ((2 * ref[w] + W_BO + 4 * src[w]) >> W_BS);
130 }
131 
132 int ff_slice_buffer_init(slice_buffer *buf, int line_count,
133  int max_allocated_lines, int line_width,
134  IDWTELEM *base_buffer);
135 void ff_slice_buffer_release(slice_buffer *buf, int line);
136 void ff_slice_buffer_flush(slice_buffer *buf);
137 void ff_slice_buffer_destroy(slice_buffer *buf);
138 IDWTELEM *ff_slice_buffer_load_line(slice_buffer *buf, int line);
139 
140 void ff_snow_inner_add_yblock_c(const uint8_t *obmc, const int obmc_stride,
141  uint8_t **block, int b_w, int b_h, int src_x,
142  int src_stride, IDWTELEM *const *lines,
143  int add, uint8_t *dst8);
144 
145 int ff_w53_32_c(MPVEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h);
146 int ff_w97_32_c(MPVEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h);
147 
148 void ff_spatial_dwt(int *buffer, int *temp, int width, int height, int stride,
149  int type, int decomposition_count);
150 
151 void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer *sb, int width,
152  int height, int stride_line, int type,
153  int decomposition_count);
155  slice_buffer *slice_buf, IDWTELEM *temp,
156  int width, int height, int stride_line,
157  int type, int decomposition_count, int y);
159  int stride, int type, int decomposition_count);
160 
163 
164 #endif /* AVCODEC_DWT_H */
ff_dwt_init_x86
void ff_dwt_init_x86(SnowDWTContext *c)
Definition: snowdsp_init.c:332
DWTELEM
int DWTELEM
Definition: snow_dwt.h:31
MPVEncContext
Definition: mpegvideoenc.h:46
ff_slice_buffer_flush
void ff_slice_buffer_flush(slice_buffer *buf)
Definition: snow_dwt.c:92
W_BO
#define W_BO
Definition: snow_dwt.h:78
slice_buffer_s
Used to minimize the amount of memory used in order to optimize cache performance.
Definition: snow_dwt.h:46
ff_spatial_idwt
void ff_spatial_idwt(IDWTELEM *buffer, IDWTELEM *temp, int width, int height, int stride, int type, int decomposition_count)
Definition: snow_dwt.c:732
slice_buffer_s::data_count
int data_count
Definition: snow_dwt.h:52
slice_buffer_s::data_stack
IDWTELEM ** data_stack
Used for internal purposes.
Definition: snow_dwt.h:48
b
#define b
Definition: input.c:42
slice_buffer_s::line
IDWTELEM ** line
For use by idwt and predict_slices.
Definition: snow_dwt.h:47
SnowDWTContext::vertical_compose97i
void(* vertical_compose97i)(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, int width)
Definition: snow_dwt.h:57
high
int high
Definition: dovi_rpuenc.c:39
SnowDWTContext
Definition: snow_dwt.h:56
ff_spatial_dwt
void ff_spatial_dwt(int *buffer, int *temp, int width, int height, int stride, int type, int decomposition_count)
Definition: snow_dwt.c:320
SnowDWTContext::inner_add_yblock
void(* inner_add_yblock)(const uint8_t *obmc, const int obmc_stride, uint8_t **block, int b_w, int b_h, int src_x, int src_stride, IDWTELEM *const *lines, int add, uint8_t *dst8)
Definition: snow_dwt.h:61
b1
static double b1(void *priv, double x, double y)
Definition: vf_xfade.c:2034
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
DWTCompose
Definition: dirac_dwt.h:32
DWTCompose::b1
IDWTELEM * b1
Definition: snow_dwt.h:38
DWTCompose::b0
IDWTELEM * b0
Definition: snow_dwt.h:37
slice_buffer_s::line_width
int line_width
Definition: snow_dwt.h:51
DWTCompose::y
int y
Definition: dirac_dwt.h:34
b3
static double b3(void *priv, double x, double y)
Definition: vf_xfade.c:2036
snow_interleave_line_footer
static av_always_inline void snow_interleave_line_footer(int *i, IDWTELEM *low, const IDWTELEM *high)
Definition: snow_dwt.h:106
ff_dwt_init
void ff_dwt_init(SnowDWTContext *c)
Definition: snow_dwt.c:851
ff_spatial_idwt_buffered_init
void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer *sb, int width, int height, int stride_line, int type, int decomposition_count)
Definition: snow_dwt.c:640
ff_slice_buffer_init
int ff_slice_buffer_init(slice_buffer *buf, int line_count, int max_allocated_lines, int line_width, IDWTELEM *base_buffer)
Definition: snow_dwt.c:29
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
DWTCompose::b3
IDWTELEM * b3
Definition: snow_dwt.h:40
ff_w53_32_c
int ff_w53_32_c(MPVEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h)
Definition: snow_dwt.c:833
height
#define height
Definition: dsp.h:89
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
IDWTELEM
short IDWTELEM
Definition: snow_dwt.h:32
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
ff_w97_32_c
int ff_w97_32_c(MPVEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h)
Definition: snow_dwt.c:838
b2
static double b2(void *priv, double x, double y)
Definition: vf_xfade.c:2035
line
Definition: graph2dot.c:48
attributes.h
SnowDWTContext::horizontal_compose97i
void(* horizontal_compose97i)(IDWTELEM *b, IDWTELEM *temp, int width)
Definition: snow_dwt.h:60
snow_horizontal_compose_lift_lead_out
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)
Definition: snow_dwt.h:114
ff_slice_buffer_load_line
IDWTELEM * ff_slice_buffer_load_line(slice_buffer *buf, int line)
Definition: snow_dwt.c:63
av_always_inline
#define av_always_inline
Definition: attributes.h:68
ff_slice_buffer_destroy
void ff_slice_buffer_destroy(slice_buffer *buf)
Definition: snow_dwt.c:104
ff_slice_buffer_release
void ff_slice_buffer_release(slice_buffer *buf, int line)
Definition: snow_dwt.c:79
W_BS
#define W_BS
Definition: snow_dwt.h:79
buffer
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
Definition: filter_design.txt:49
ref
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:117
temp
else temp
Definition: vf_mcdeint.c:271
slice_buffer_s::base_buffer
IDWTELEM * base_buffer
Buffer that this structure is caching.
Definition: snow_dwt.h:53
snow_horizontal_compose_liftS_lead_out
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)
Definition: snow_dwt.h:123
w
uint8_t w
Definition: llvidencdsp.c:39
ff_snow_inner_add_yblock_c
void ff_snow_inner_add_yblock_c(const uint8_t *obmc, const int obmc_stride, uint8_t **block, int b_w, int b_h, int src_x, int src_stride, IDWTELEM *const *lines, int add, uint8_t *dst8)
Definition: snow.c:118
snow_interleave_line_header
static av_always_inline void snow_interleave_line_header(int *i, int width, IDWTELEM *low, IDWTELEM *high)
Definition: snow_dwt.h:96
ff_spatial_idwt_buffered_slice
void ff_spatial_idwt_buffered_slice(SnowDWTContext *dsp, DWTCompose *cs, slice_buffer *slice_buf, IDWTELEM *temp, int width, int height, int stride_line, int type, int decomposition_count, int y)
Definition: snow_dwt.c:659
slice_buffer_s::data_stack_top
int data_stack_top
Definition: snow_dwt.h:49
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
IDWTELEM
short IDWTELEM
Definition: dirac_dwt.h:27
b0
static double b0(void *priv, double x, double y)
Definition: vf_xfade.c:2033
h
h
Definition: vp9dsp_template.c:2070
slice_buffer_s::line_count
int line_count
Definition: snow_dwt.h:50
stride
#define stride
Definition: h264pred_template.c:536
width
#define width
Definition: dsp.h:89
src
#define src
Definition: vp8dsp.c:248
DWTCompose::b2
IDWTELEM * b2
Definition: snow_dwt.h:39