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