blob: c2bae1e6da178452d09e8017b2078826df665c71
1 | /* |
2 | * FFV1 codec for libavcodec |
3 | * |
4 | * Copyright (c) 2003-2012 Michael Niedermayer <michaelni@gmx.at> |
5 | * |
6 | * This file is part of FFmpeg. |
7 | * |
8 | * FFmpeg is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU Lesser General Public |
10 | * License as published by the Free Software Foundation; either |
11 | * version 2.1 of the License, or (at your option) any later version. |
12 | * |
13 | * FFmpeg is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with FFmpeg; if not, write to the Free Software |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | */ |
22 | |
23 | #ifndef AVCODEC_FFV1_H |
24 | #define AVCODEC_FFV1_H |
25 | |
26 | /** |
27 | * @file |
28 | * FF Video Codec 1 (a lossless codec) |
29 | */ |
30 | |
31 | #include "libavutil/avassert.h" |
32 | #include "libavutil/crc.h" |
33 | #include "libavutil/opt.h" |
34 | #include "libavutil/imgutils.h" |
35 | #include "libavutil/pixdesc.h" |
36 | #include "libavutil/timer.h" |
37 | #include "avcodec.h" |
38 | #include "get_bits.h" |
39 | #include "internal.h" |
40 | #include "mathops.h" |
41 | #include "put_bits.h" |
42 | #include "rangecoder.h" |
43 | #include "thread.h" |
44 | |
45 | #ifdef __INTEL_COMPILER |
46 | #undef av_flatten |
47 | #define av_flatten |
48 | #endif |
49 | |
50 | #define MAX_PLANES 4 |
51 | #define CONTEXT_SIZE 32 |
52 | |
53 | #define MAX_QUANT_TABLES 8 |
54 | #define MAX_CONTEXT_INPUTS 5 |
55 | |
56 | #define AC_GOLOMB_RICE 0 |
57 | #define AC_RANGE_DEFAULT_TAB 1 |
58 | #define AC_RANGE_CUSTOM_TAB 2 |
59 | #define AC_RANGE_DEFAULT_TAB_FORCE -2 |
60 | |
61 | typedef struct VlcState { |
62 | int16_t drift; |
63 | uint16_t error_sum; |
64 | int8_t bias; |
65 | uint8_t count; |
66 | } VlcState; |
67 | |
68 | typedef struct PlaneContext { |
69 | int16_t quant_table[MAX_CONTEXT_INPUTS][256]; |
70 | int quant_table_index; |
71 | int context_count; |
72 | uint8_t (*state)[CONTEXT_SIZE]; |
73 | VlcState *vlc_state; |
74 | uint8_t interlace_bit_state[2]; |
75 | } PlaneContext; |
76 | |
77 | #define MAX_SLICES 256 |
78 | |
79 | typedef struct FFV1Context { |
80 | AVClass *class; |
81 | AVCodecContext *avctx; |
82 | RangeCoder c; |
83 | GetBitContext gb; |
84 | PutBitContext pb; |
85 | uint64_t rc_stat[256][2]; |
86 | uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2]; |
87 | int version; |
88 | int micro_version; |
89 | int width, height; |
90 | int chroma_planes; |
91 | int chroma_h_shift, chroma_v_shift; |
92 | int transparency; |
93 | int flags; |
94 | int picture_number; |
95 | int key_frame; |
96 | ThreadFrame picture, last_picture; |
97 | struct FFV1Context *fsrc; |
98 | |
99 | AVFrame *cur; |
100 | int plane_count; |
101 | int ac; ///< 1=range coder <-> 0=golomb rice |
102 | int ac_byte_count; ///< number of bytes used for AC coding |
103 | PlaneContext plane[MAX_PLANES]; |
104 | int16_t quant_table[MAX_CONTEXT_INPUTS][256]; |
105 | int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256]; |
106 | int context_count[MAX_QUANT_TABLES]; |
107 | uint8_t state_transition[256]; |
108 | uint8_t (*initial_states[MAX_QUANT_TABLES])[32]; |
109 | int run_index; |
110 | int colorspace; |
111 | int16_t *sample_buffer; |
112 | int32_t *sample_buffer32; |
113 | |
114 | int use32bit; |
115 | |
116 | int ec; |
117 | int intra; |
118 | int slice_damaged; |
119 | int key_frame_ok; |
120 | int context_model; |
121 | |
122 | int bits_per_raw_sample; |
123 | int packed_at_lsb; |
124 | |
125 | int gob_count; |
126 | int quant_table_count; |
127 | |
128 | struct FFV1Context *slice_context[MAX_SLICES]; |
129 | int slice_count; |
130 | int max_slice_count; |
131 | int num_v_slices; |
132 | int num_h_slices; |
133 | int slice_width; |
134 | int slice_height; |
135 | int slice_x; |
136 | int slice_y; |
137 | int slice_reset_contexts; |
138 | int slice_coding_mode; |
139 | int slice_rct_by_coef; |
140 | int slice_rct_ry_coef; |
141 | } FFV1Context; |
142 | |
143 | int ff_ffv1_common_init(AVCodecContext *avctx); |
144 | int ff_ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs); |
145 | int ff_ffv1_init_slices_state(FFV1Context *f); |
146 | int ff_ffv1_init_slice_contexts(FFV1Context *f); |
147 | int ff_ffv1_allocate_initial_states(FFV1Context *f); |
148 | void ff_ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs); |
149 | int ff_ffv1_close(AVCodecContext *avctx); |
150 | |
151 | static av_always_inline int fold(int diff, int bits) |
152 | { |
153 | if (bits == 8) |
154 | diff = (int8_t)diff; |
155 | else { |
156 | diff += 1 << (bits - 1); |
157 | diff = av_mod_uintp2(diff, bits); |
158 | diff -= 1 << (bits - 1); |
159 | } |
160 | |
161 | return diff; |
162 | } |
163 | |
164 | static inline void update_vlc_state(VlcState *const state, const int v) |
165 | { |
166 | int drift = state->drift; |
167 | int count = state->count; |
168 | state->error_sum += FFABS(v); |
169 | drift += v; |
170 | |
171 | if (count == 128) { // FIXME: variable |
172 | count >>= 1; |
173 | drift >>= 1; |
174 | state->error_sum >>= 1; |
175 | } |
176 | count++; |
177 | |
178 | if (drift <= -count) { |
179 | if (state->bias > -128) |
180 | state->bias--; |
181 | |
182 | drift += count; |
183 | if (drift <= -count) |
184 | drift = -count + 1; |
185 | } else if (drift > 0) { |
186 | if (state->bias < 127) |
187 | state->bias++; |
188 | |
189 | drift -= count; |
190 | if (drift > 0) |
191 | drift = 0; |
192 | } |
193 | |
194 | state->drift = drift; |
195 | state->count = count; |
196 | } |
197 | |
198 | #define TYPE int16_t |
199 | #define RENAME(name) name |
200 | #include "ffv1_template.c" |
201 | #undef TYPE |
202 | #undef RENAME |
203 | |
204 | #define TYPE int32_t |
205 | #define RENAME(name) name ## 32 |
206 | #include "ffv1_template.c" |
207 | #undef TYPE |
208 | #undef RENAME |
209 | |
210 | #endif /* AVCODEC_FFV1_H */ |
211 |