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 
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 struct SnowDWTContext;
57 
58 typedef struct SnowDWTContext {
60  IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5,
61  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);
68 
69 
70 #define DWT_97 0
71 #define DWT_53 1
72 
73 #define liftS lift
74 #define W_AM 3
75 #define W_AO 0
76 #define W_AS 1
77 
78 #undef liftS
79 #define W_BM 1
80 #define W_BO 8
81 #define W_BS 4
82 
83 #define W_CM 1
84 #define W_CO 0
85 #define W_CS 0
86 
87 #define W_DM 3
88 #define W_DO 4
89 #define W_DS 3
90 
91 #define slice_buffer_get_line(slice_buf, line_num) \
92  ((slice_buf)->line[line_num] ? (slice_buf)->line[line_num] \
93  : ff_slice_buffer_load_line((slice_buf), \
94  (line_num)))
95 
96 /* C bits used by mmx/sse2/altivec */
97 
99 {
100  *i = width - 2;
101 
102  if (width & 1) {
103  low[*i + 1] = low[(*i + 1)>>1];
104  (*i)--;
105  }
106 }
107 
109 {
110  for (; *i >= 0; *i -= 2) {
111  low[*i + 1] = high[*i >> 1];
112  low[*i] = low[*i >> 1];
113  }
114 }
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 {
118  for (; i < w; i++)
119  dst[i] = src[i] - ((mul * (ref[i] + ref[i + 1]) + add) >> shift);
120 
121  if ((width ^ lift_high) & 1)
122  dst[w] = src[w] - ((mul * 2 * ref[w] + add) >> shift);
123 }
124 
126 {
127  for (; i < w; i++)
128  dst[i] = src[i] + ((ref[i] + ref[(i+1)]+W_BO + 4 * src[i]) >> W_BS);
129 
130  if (width & 1)
131  dst[w] = src[w] + ((2 * ref[w] + W_BO + 4 * src[w]) >> W_BS);
132 }
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);
157  slice_buffer *slice_buf, IDWTELEM *temp,
158  int width, int height, int stride_line,
159  int type, int decomposition_count, int y);
161  int stride, int type, int decomposition_count);
162 
165 
166 #endif /* AVCODEC_DWT_H */
ff_dwt_init_x86
void ff_dwt_init_x86(SnowDWTContext *c)
Definition: snowdsp.c:881
DWTELEM
int DWTELEM
Definition: snow_dwt.h:29
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:80
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
w
uint8_t w
Definition: llviddspenc.c:38
slice_buffer_s::data_stack
IDWTELEM ** data_stack
Used for internal purposes.
Definition: snow_dwt.h:48
b
#define b
Definition: input.c:41
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:59
high
int high
Definition: dovi_rpuenc.c:38
SnowDWTContext
Definition: snow_dwt.h:58
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
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
ff_snow_inner_add_yblock
void ff_snow_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_y, int src_stride, slice_buffer *sb, int add, uint8_t *dst8)
Definition: snow.c:30
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
ff_w97_32_c
int ff_w97_32_c(struct MpegEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h)
Definition: snow_dwt.c:838
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:108
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
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_y, int src_stride, slice_buffer *sb, int add, uint8_t *dst8)
Definition: snow_dwt.h:63
height
#define height
Definition: dsp.h:85
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:83
IDWTELEM
short IDWTELEM
Definition: snow_dwt.h:32
b2
static double b2(void *priv, double x, double y)
Definition: vf_xfade.c:2035
line
Definition: graph2dot.c:48
attributes.h
ff_w53_32_c
int ff_w53_32_c(struct MpegEncContext *v, const uint8_t *pix1, const uint8_t *pix2, ptrdiff_t line_size, int h)
Definition: snow_dwt.c:833
SnowDWTContext::horizontal_compose97i
void(* horizontal_compose97i)(IDWTELEM *b, IDWTELEM *temp, int width)
Definition: snow_dwt.h:62
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:116
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
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:49
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
stride
#define stride
Definition: h264pred_template.c:537
W_BS
#define W_BS
Definition: snow_dwt.h:81
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:112
temp
else temp
Definition: vf_mcdeint.c:263
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:125
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:98
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
width
#define width
Definition: dsp.h:85
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:73
src
#define src
Definition: vp8dsp.c:248
DWTCompose::b2
IDWTELEM * b2
Definition: snow_dwt.h:39