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 
28 
29 typedef int DWTELEM;
30 typedef short IDWTELEM;
31 
32 #define MAX_DECOMPOSITIONS 8
33 
34 typedef struct DWTCompose {
39  int y;
40 } DWTCompose;
41 
42 /** Used to minimize the amount of memory used in order to
43  * optimize cache performance. **/
44 typedef struct slice_buffer_s {
45  IDWTELEM **line; ///< For use by idwt and predict_slices.
46  IDWTELEM **data_stack; ///< Used for internal purposes.
51  IDWTELEM *base_buffer; ///< Buffer that this structure is caching.
52 } slice_buffer;
53 
54 struct SnowDWTContext;
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_y, int src_stride, slice_buffer *sb,
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 int ff_slice_buffer_init(slice_buffer *buf, int line_count,
95  int max_allocated_lines, int line_width,
96  IDWTELEM *base_buffer);
97 void ff_slice_buffer_release(slice_buffer *buf, int line);
98 void ff_slice_buffer_flush(slice_buffer *buf);
99 void ff_slice_buffer_destroy(slice_buffer *buf);
100 IDWTELEM *ff_slice_buffer_load_line(slice_buffer *buf, int line);
101 
102 void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride,
103  uint8_t **block, int b_w, int b_h, int src_x,
104  int src_y, int src_stride, slice_buffer *sb,
105  int add, uint8_t *dst8);
106 
107 int ff_w53_32_c(struct MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t line_size, int h);
108 int ff_w97_32_c(struct MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t line_size, int h);
109 
110 void ff_spatial_dwt(int *buffer, int *temp, int width, int height, int stride,
111  int type, int decomposition_count);
112 
113 void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer *sb, int width,
114  int height, int stride_line, int type,
115  int decomposition_count);
117  slice_buffer *slice_buf, IDWTELEM *temp,
118  int width, int height, int stride_line,
119  int type, int decomposition_count, int y);
121  int stride, int type, int decomposition_count);
122 
125 
126 #endif /* AVCODEC_DWT_H */
ff_dwt_init_x86
void ff_dwt_init_x86(SnowDWTContext *c)
Definition: snowdsp.c:882
DWTELEM
int DWTELEM
Definition: snow_dwt.h:27
stride
int stride
Definition: mace.c:144
ff_slice_buffer_flush
void ff_slice_buffer_flush(slice_buffer *buf)
Definition: snow_dwt.c:91
slice_buffer_s
Used to minimize the amount of memory used in order to optimize cache performance.
Definition: snow_dwt.h:44
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:731
slice_buffer_s::data_count
int data_count
Definition: snow_dwt.h:50
slice_buffer_s::data_stack
IDWTELEM ** data_stack
Used for internal purposes.
Definition: snow_dwt.h:46
b
#define b
Definition: input.c:40
slice_buffer_s::line
IDWTELEM ** line
For use by idwt and predict_slices.
Definition: snow_dwt.h:45
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
ff_w97_32_c
int ff_w97_32_c(struct MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t line_size, int h)
Definition: snow_dwt.c:837
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:319
b1
static double b1(void *priv, double x, double y)
Definition: vf_xfade.c:1703
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:37
DWTCompose
Definition: dirac_dwt.h:32
DWTCompose::b1
IDWTELEM * b1
Definition: snow_dwt.h:36
DWTCompose::b0
IDWTELEM * b0
Definition: snow_dwt.h:35
slice_buffer_s::line_width
int line_width
Definition: snow_dwt.h:49
DWTCompose::y
int y
Definition: dirac_dwt.h:34
ff_w53_32_c
int ff_w53_32_c(struct MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t line_size, int h)
Definition: snow_dwt.c:832
width
#define width
b3
static double b3(void *priv, double x, double y)
Definition: vf_xfade.c:1705
ff_dwt_init
void ff_dwt_init(SnowDWTContext *c)
Definition: snow_dwt.c:850
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:639
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:28
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:38
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:61
IDWTELEM
short IDWTELEM
Definition: snow_dwt.h:30
height
#define height
b2
static double b2(void *priv, double x, double y)
Definition: vf_xfade.c:1704
line
Definition: graph2dot.c:48
SnowDWTContext::horizontal_compose97i
void(* horizontal_compose97i)(IDWTELEM *b, IDWTELEM *temp, int width)
Definition: snow_dwt.h:60
ff_slice_buffer_load_line
IDWTELEM * ff_slice_buffer_load_line(slice_buffer *buf, int line)
Definition: snow_dwt.c:62
ff_slice_buffer_destroy
void ff_slice_buffer_destroy(slice_buffer *buf)
Definition: snow_dwt.c:103
ff_slice_buffer_release
void ff_slice_buffer_release(slice_buffer *buf, int line)
Definition: snow_dwt.c:78
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
temp
else temp
Definition: vf_mcdeint.c:248
slice_buffer_s::base_buffer
IDWTELEM * base_buffer
Buffer that this structure is caching.
Definition: snow_dwt.h:51
add
static float add(float src0, float src1)
Definition: dnn_backend_native_layer_mathbinary.c:35
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:658
slice_buffer_s::data_stack_top
int data_stack_top
Definition: snow_dwt.h:47
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:1702
h
h
Definition: vp9dsp_template.c:2038
slice_buffer_s::line_count
int line_count
Definition: snow_dwt.h:48
MpegEncContext
MpegEncContext.
Definition: mpegvideo.h:71
DWTCompose::b2
IDWTELEM * b2
Definition: snow_dwt.h:37