]> git.sesse.net Git - ffmpeg/blob - libavcodec/ffv1.c
arm: Remove a leftover define for the pld instruction
[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     ff_dsputil_init(&s->dsp, avctx);
145
146     s->width  = avctx->width;
147     s->height = avctx->height;
148
149     // defaults
150     s->num_h_slices = 1;
151     s->num_v_slices = 1;
152
153     return 0;
154 }
155
156 int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs)
157 {
158     int j;
159
160     fs->plane_count  = f->plane_count;
161     fs->transparency = f->transparency;
162     for (j = 0; j < f->plane_count; j++) {
163         PlaneContext *const p = &fs->plane[j];
164
165         if (fs->ac) {
166             if (!p->state)
167                 p->state = av_malloc(CONTEXT_SIZE * p->context_count *
168                                      sizeof(uint8_t));
169             if (!p->state)
170                 return AVERROR(ENOMEM);
171         } else {
172             if (!p->vlc_state)
173                 p->vlc_state = av_malloc(p->context_count * sizeof(VlcState));
174             if (!p->vlc_state)
175                 return AVERROR(ENOMEM);
176         }
177     }
178
179     if (fs->ac > 1) {
180         //FIXME only redo if state_transition changed
181         for (j = 1; j < 256; j++) {
182             fs->c.one_state[j]        = f->state_transition[j];
183             fs->c.zero_state[256 - j] = 256 - fs->c.one_state[j];
184         }
185     }
186
187     return 0;
188 }
189
190 av_cold int ffv1_init_slice_contexts(FFV1Context *f)
191 {
192     int i;
193
194     f->slice_count = f->num_h_slices * f->num_v_slices;
195     if (f->slice_count <= 0) {
196         av_log(f->avctx, AV_LOG_ERROR, "Invalid number of slices\n");
197         return AVERROR(EINVAL);
198     }
199
200     for (i = 0; i < f->slice_count; i++) {
201         FFV1Context *fs = av_mallocz(sizeof(*fs));
202         int sx          = i % f->num_h_slices;
203         int sy          = i / f->num_h_slices;
204         int sxs         = f->avctx->width  *  sx      / f->num_h_slices;
205         int sxe         = f->avctx->width  * (sx + 1) / f->num_h_slices;
206         int sys         = f->avctx->height *  sy      / f->num_v_slices;
207         int sye         = f->avctx->height * (sy + 1) / f->num_v_slices;
208         f->slice_context[i] = fs;
209         memcpy(fs, f, sizeof(*fs));
210         memset(fs->rc_stat2, 0, sizeof(fs->rc_stat2));
211
212         fs->slice_width  = sxe - sxs;
213         fs->slice_height = sye - sys;
214         fs->slice_x      = sxs;
215         fs->slice_y      = sys;
216
217         fs->sample_buffer = av_malloc(3 * MAX_PLANES * (fs->width + 6) *
218                                       sizeof(*fs->sample_buffer));
219         if (!fs->sample_buffer)
220             return AVERROR(ENOMEM);
221     }
222     return 0;
223 }
224
225 int ffv1_allocate_initial_states(FFV1Context *f)
226 {
227     int i;
228
229     for (i = 0; i < f->quant_table_count; i++) {
230         f->initial_states[i] = av_malloc(f->context_count[i] *
231                                          sizeof(*f->initial_states[i]));
232         if (!f->initial_states[i])
233             return AVERROR(ENOMEM);
234         memset(f->initial_states[i], 128,
235                f->context_count[i] * sizeof(*f->initial_states[i]));
236     }
237     return 0;
238 }
239
240 void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs)
241 {
242     int i, j;
243
244     for (i = 0; i < f->plane_count; i++) {
245         PlaneContext *p = &fs->plane[i];
246
247         p->interlace_bit_state[0] = 128;
248         p->interlace_bit_state[1] = 128;
249
250         if (fs->ac) {
251             if (f->initial_states[p->quant_table_index]) {
252                 memcpy(p->state, f->initial_states[p->quant_table_index],
253                        CONTEXT_SIZE * p->context_count);
254             } else
255                 memset(p->state, 128, CONTEXT_SIZE * p->context_count);
256         } else {
257             for (j = 0; j < p->context_count; j++) {
258                 p->vlc_state[j].drift     = 0;
259                 p->vlc_state[j].error_sum = 4;    //FFMAX((RANGE + 32)/64, 2);
260                 p->vlc_state[j].bias      = 0;
261                 p->vlc_state[j].count     = 1;
262             }
263         }
264     }
265 }
266
267 av_cold int ffv1_close(AVCodecContext *avctx)
268 {
269     FFV1Context *s = avctx->priv_data;
270     int i, j;
271
272     for (j = 0; j < s->slice_count; j++) {
273         FFV1Context *fs = s->slice_context[j];
274         for (i = 0; i < s->plane_count; i++) {
275             PlaneContext *p = &fs->plane[i];
276
277             av_freep(&p->state);
278             av_freep(&p->vlc_state);
279         }
280         av_freep(&fs->sample_buffer);
281     }
282
283     av_freep(&avctx->stats_out);
284     for (j = 0; j < s->quant_table_count; j++) {
285         av_freep(&s->initial_states[j]);
286         for (i = 0; i < s->slice_count; i++) {
287             FFV1Context *sf = s->slice_context[i];
288             av_freep(&sf->rc_stat2[j]);
289         }
290         av_freep(&s->rc_stat2[j]);
291     }
292
293     for (i = 0; i < s->slice_count; i++)
294         av_freep(&s->slice_context[i]);
295
296     return 0;
297 }