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 struct MpegEncContext; 28 29 typedef int DWTELEM; 30 typedef short IDWTELEM; 31 32 #define MAX_DECOMPOSITIONS 8 33 34 typedef struct DWTCompose { 35 IDWTELEM *b0; 36 IDWTELEM *b1; 37 IDWTELEM *b2; 38 IDWTELEM *b3; 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. 47 int data_stack_top; 48 int line_count; 49 int line_width; 50 int data_count; 51 IDWTELEM *base_buffer; ///< Buffer that this structure is caching. 52 } slice_buffer; 53 54 struct SnowDWTContext; 55 56 typedef struct SnowDWTContext { 57 void (*vertical_compose97i)(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, 58 IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, 59 int width); 60 void (*horizontal_compose97i)(IDWTELEM *b, IDWTELEM *temp, 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); 65 } SnowDWTContext; 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_vertical_compose97i(IDWTELEM *b0, IDWTELEM *b1, IDWTELEM *b2, 103 IDWTELEM *b3, IDWTELEM *b4, IDWTELEM *b5, 104 int width); 105 void ff_snow_horizontal_compose97i(IDWTELEM *b, IDWTELEM *temp, int width); 106 void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, 107 uint8_t **block, int b_w, int b_h, int src_x, 108 int src_y, int src_stride, slice_buffer *sb, 109 int add, uint8_t *dst8); 110 111 int ff_w53_32_c(struct MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t line_size, int h); 112 int ff_w97_32_c(struct MpegEncContext *v, uint8_t *pix1, uint8_t *pix2, ptrdiff_t line_size, int h); 113 114 void ff_spatial_dwt(int *buffer, int *temp, int width, int height, int stride, 115 int type, int decomposition_count); 116 117 void ff_spatial_idwt_buffered_init(DWTCompose *cs, slice_buffer *sb, int width, 118 int height, int stride_line, int type, 119 int decomposition_count); 120 void ff_spatial_idwt_buffered_slice(SnowDWTContext *dsp, DWTCompose *cs, 121 slice_buffer *slice_buf, IDWTELEM *temp, 122 int width, int height, int stride_line, 123 int type, int decomposition_count, int y); 124 void ff_spatial_idwt(IDWTELEM *buffer, IDWTELEM *temp, int width, int height, 125 int stride, int type, int decomposition_count); 126 127 void ff_dwt_init(SnowDWTContext *c); 128 void ff_dwt_init_x86(SnowDWTContext *c); 129 130 #endif /* AVCODEC_DWT_H */ 131