]> git.sesse.net Git - ffmpeg/blob - libavcodec/ffv1.c
h264: fix bit depth changes with frame threading
[ffmpeg] / libavcodec / ffv1.c
1 /*
2  * FFV1 codec for libavcodec
3  *
4  * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * This file is part of Libav.
7  *
8  * Libav 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  * Libav 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 Libav; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 /**
24  * @file
25  * FF Video Codec 1 (a lossless codec)
26  */
27
28 #include "libavutil/avassert.h"
29 #include "avcodec.h"
30 #include "get_bits.h"
31 #include "put_bits.h"
32 #include "rangecoder.h"
33 #include "golomb.h"
34 #include "mathops.h"
35 #include "ffv1.h"
36
37 const int8_t ffv1_quant5_10bit[256] = {
38      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,
39      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
40      1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
41      1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
42      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
43      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
44      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
45      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
46     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
47     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
48     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
49     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
50     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1,
51     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
52     -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
53     -1, -1, -1, -1, -1, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0,
54 };
55
56 const int8_t ffv1_quant5[256] = {
57      0,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
58      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
59      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
60      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
61      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
62      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
63      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
64      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
65     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
66     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
67     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
68     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
69     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
70     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
71     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
72     -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1,
73 };
74
75 const int8_t ffv1_quant9_10bit[256] = {
76      0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,
77      2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,
78      3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
79      3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,
80      4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
81      4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
82      4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
83      4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
84     -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
85     -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
86     -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
87     -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
88     -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3,
89     -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3,
90     -3, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
91     -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -0, -0, -0, -0,
92 };
93
94 const int8_t ffv1_quant11[256] = {
95      0,  1,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,
96      4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
97      4,  4,  4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
98      5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
99      5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
100      5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
101      5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
102      5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
103     -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
104     -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
105     -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
106     -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
107     -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5,
108     -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4,
109     -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4,
110     -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2, -2, -2, -1,
111 };
112
113 const uint8_t ffv1_ver2_state[256] = {
114       0,  10,  10,  10,  10,  16,  16,  16,  28,  16,  16,  29,  42,  49,  20,  49,
115      59,  25,  26,  26,  27,  31,  33,  33,  33,  34,  34,  37,  67,  38,  39,  39,
116      40,  40,  41,  79,  43,  44,  45,  45,  48,  48,  64,  50,  51,  52,  88,  52,
117      53,  74,  55,  57,  58,  58,  74,  60,  101, 61,  62,  84,  66,  66,  68,  69,
118      87,  82,  71,  97,  73,  73,  82,  75,  111, 77,  94,  78,  87,  81,  83,  97,
119      85,  83,  94,  86,  99,  89,  90,  99,  111, 92,  93,  134, 95,  98,  105, 98,
120     105, 110, 102, 108, 102, 118, 103, 106, 106, 113, 109, 112, 114, 112, 116, 125,
121     115, 116, 117, 117, 126, 119, 125, 121, 121, 123, 145, 124, 126, 131, 127, 129,
122     165, 130, 132, 138, 133, 135, 145, 136, 137, 139, 146, 141, 143, 142, 144, 148,
123     147, 155, 151, 149, 151, 150, 152, 157, 153, 154, 156, 168, 158, 162, 161, 160,
124     172, 163, 169, 164, 166, 184, 167, 170, 177, 174, 171, 173, 182, 176, 180, 178,
125     175, 189, 179, 181, 186, 183, 192, 185, 200, 187, 191, 188, 190, 197, 193, 196,
126     197, 194, 195, 196, 198, 202, 199, 201, 210, 203, 207, 204, 205, 206, 208, 214,
127     209, 211, 221, 212, 213, 215, 224, 216, 217, 218, 219, 220, 222, 228, 223, 225,
128     226, 224, 227, 229, 240, 230, 231, 232, 233, 234, 235, 236, 238, 239, 237, 242,
129     241, 243, 242, 244, 245, 246, 247, 248, 249, 250, 251, 252, 252, 253, 254, 255,
130 };
131
132
133 int ffv1_common_init(AVCodecContext *avctx)
134 {
135     FFV1Context *s = avctx->priv_data;
136
137     s->avctx = avctx;
138     s->flags = avctx->flags;
139
140     if (!avctx->width || !avctx->height)
141         return AVERROR_INVALIDDATA;
142
143     avcodec_get_frame_defaults(&s->picture);
144
145     ff_dsputil_init(&s->dsp, avctx);
146
147     s->width  = avctx->width;
148     s->height = avctx->height;
149
150     // defaults
151     s->num_h_slices = 1;
152     s->num_v_slices = 1;
153
154     return 0;
155 }
156
157 int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
158 {
159     int j;
160
161     fs->plane_count  = f->plane_count;
162     fs->transparency = f->transparency;
163     for (j = 0; j < f->plane_count; j++) {
164         PlaneContext *const p = &fs->plane[j];
165
166         if (fs->ac) {
167             if (!p->state)
168                 p->state = av_malloc(CONTEXT_SIZE * p->context_count *
169                                      sizeof(uint8_t));
170             if (!p->state)
171                 return AVERROR(ENOMEM);
172         } else {
173             if (!p->vlc_state)
174                 p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
175             if (!p->vlc_state)
176                 return AVERROR(ENOMEM);
177         }
178     }
179
180     if (fs->ac > 1) {
181         //FIXME only redo if state_transition changed
182         for (j = 1; j < 256; j++) {
183             fs->c.one_state[j]        = f->state_transition[j];
184             fs->c.zero_state[256 - j] = 256 - fs->c.one_state[j];
185         }
186     }
187
188     return 0;
189 }
190
191 av_cold int ffv1_init_slice_contexts(FFV1Context *f)
192 {
193     int i;
194
195     f->slice_count = f->num_h_slices * f->num_v_slices;
196
197     for (i = 0; i < f->slice_count; i++) {
198         FFV1Context *fs = av_mallocz(sizeof(*fs));
199         int sx          = i % f->num_h_slices;
200         int sy          = i / f->num_h_slices;
201         int sxs         = f->avctx->width  *  sx      / f->num_h_slices;
202         int sxe         = f->avctx->width  * (sx + 1) / f->num_h_slices;
203         int sys         = f->avctx->height *  sy      / f->num_v_slices;
204         int sye         = f->avctx->height * (sy + 1) / f->num_v_slices;
205         f->slice_context[i] = fs;
206         memcpy(fs, f, sizeof(*fs));
207         memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
208
209         fs->slice_width  = sxe - sxs;
210         fs->slice_height = sye - sys;
211         fs->slice_x      = sxs;
212         fs->slice_y      = sys;
213
214         fs->sample_buffer = av_malloc(3 * MAX_PLANES * (fs->width + 6) *
215                                       sizeof(*fs->sample_buffer));
216         if (!fs->sample_buffer)
217             return AVERROR(ENOMEM);
218     }
219     return 0;
220 }
221
222 int ffv1_allocate_initial_states(FFV1Context *f)
223 {
224     int i;
225
226     for (i = 0; i < f->quant_table_count; i++) {
227         f->initial_states[i] = av_malloc(f->context_count[i] *
228                                          sizeof(*f->initial_states[i]));
229         if (!f->initial_states[i])
230             return AVERROR(ENOMEM);
231         memset(f->initial_states[i], 128,
232                f->context_count[i] * sizeof(*f->initial_states[i]));
233     }
234     return 0;
235 }
236
237 void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs)
238 {
239     int i, j;
240
241     for (i = 0; i < f->plane_count; i++) {
242         PlaneContext *p = &fs->plane[i];
243
244         p->interlace_bit_state[0] = 128;
245         p->interlace_bit_state[1] = 128;
246
247         if (fs->ac) {
248             if (f->initial_states[p->quant_table_index]) {
249                 memcpy(p->state, f->initial_states[p->quant_table_index],
250                        CONTEXT_SIZE * p->context_count);
251             } else
252                 memset(p->state, 128, CONTEXT_SIZE * p->context_count);
253         } else {
254             for (j = 0; j < p->context_count; j++) {
255                 p->vlc_state[j].drift     = 0;
256                 p->vlc_state[j].error_sum = 4;    //FFMAX((RANGE + 32)/64, 2);
257                 p->vlc_state[j].bias      = 0;
258                 p->vlc_state[j].count     = 1;
259             }
260         }
261     }
262 }
263
264 av_cold int ffv1_close(AVCodecContext *avctx)
265 {
266     FFV1Context *s = avctx->priv_data;
267     int i, j;
268
269     av_frame_unref(&s->last_picture);
270
271     for (j = 0; j < s->slice_count; j++) {
272         FFV1Context *fs = s->slice_context[j];
273         for (i = 0; i < s->plane_count; i++) {
274             PlaneContext *p = &fs->plane[i];
275
276             av_freep(&p->state);
277             av_freep(&p->vlc_state);
278         }
279         av_freep(&fs->sample_buffer);
280     }
281
282     av_freep(&avctx->stats_out);
283     for (j = 0; j < s->quant_table_count; j++) {
284         av_freep(&s->initial_states[j]);
285         for (i = 0; i < s->slice_count; i++) {
286             FFV1Context *sf = s->slice_context[i];
287             av_freep(&sf->rc_stat2[j]);
288         }
289         av_freep(&s->rc_stat2[j]);
290     }
291
292     for (i = 0; i < s->slice_count; i++)
293         av_freep(&s->slice_context[i]);
294
295     return 0;
296 }