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