Try to set AVFrame.reference to correct values.
[ffmpeg.git] / libavcodec / xxan.c
1 /*
2  * Wing Commander/Xan Video Decoder
3  * Copyright (C) 2011 Konstantin Shishkov
4  * based on work by Mike Melanson
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 #include "avcodec.h"
24 #include "libavutil/intreadwrite.h"
25 #include "bytestream.h"
26 #define ALT_BITSTREAM_READER_LE
27 #include "get_bits.h"
28 // for av_memcpy_backptr
29 #include "libavutil/lzo.h"
30
31 typedef struct XanContext {
32     AVCodecContext *avctx;
33     AVFrame pic;
34
35     uint8_t *y_buffer;
36     uint8_t *scratch_buffer;
37     int     buffer_size;
38 } XanContext;
39
40 static av_cold int xan_decode_init(AVCodecContext *avctx)
41 {
42     XanContext *s = avctx->priv_data;
43
44     s->avctx = avctx;
45
46     avctx->pix_fmt = PIX_FMT_YUV420P;
47
48     s->buffer_size = avctx->width * avctx->height;
49     s->y_buffer = av_malloc(s->buffer_size);
50     if (!s->y_buffer)
51         return AVERROR(ENOMEM);
52     s->scratch_buffer = av_malloc(s->buffer_size + 130);
53     if (!s->scratch_buffer) {
54         av_freep(&s->y_buffer);
55         return AVERROR(ENOMEM);
56     }
57
58     return 0;
59 }
60
61 static int xan_unpack_luma(const uint8_t *src, const int src_size,
62                            uint8_t *dst, const int dst_size)
63 {
64    int tree_size, eof;
65    const uint8_t *tree;
66    int bits, mask;
67    int tree_root, node;
68    const uint8_t *dst_end = dst + dst_size;
69    const uint8_t *src_end = src + src_size;
70
71    tree_size = *src++;
72    eof       = *src++;
73    tree      = src - eof * 2 - 2;
74    tree_root = eof + tree_size;
75    src += tree_size * 2;
76
77    node = tree_root;
78    bits = *src++;
79    mask = 0x80;
80    for (;;) {
81        int bit = !!(bits & mask);
82        mask >>= 1;
83        node = tree[node*2 + bit];
84        if (node == eof)
85            break;
86        if (node < eof) {
87            *dst++ = node;
88            if (dst > dst_end)
89                break;
90            node = tree_root;
91        }
92        if (!mask) {
93            bits = *src++;
94            if (src > src_end)
95                break;
96            mask = 0x80;
97        }
98    }
99    return dst != dst_end;
100 }
101
102 /* almost the same as in xan_wc3 decoder */
103 static int xan_unpack(uint8_t *dest, const int dest_len,
104                       const uint8_t *src, const int src_len)
105 {
106     uint8_t opcode;
107     int size;
108     uint8_t *orig_dest = dest;
109     const uint8_t *src_end = src + src_len;
110     const uint8_t *dest_end = dest + dest_len;
111
112     while (dest < dest_end) {
113         opcode = *src++;
114
115         if (opcode < 0xe0) {
116             int size2, back;
117             if ((opcode & 0x80) == 0) {
118                 size  = opcode & 3;
119                 back  = ((opcode & 0x60) << 3) + *src++ + 1;
120                 size2 = ((opcode & 0x1c) >> 2) + 3;
121             } else if ((opcode & 0x40) == 0) {
122                 size  = *src >> 6;
123                 back  = (bytestream_get_be16(&src) & 0x3fff) + 1;
124                 size2 = (opcode & 0x3f) + 4;
125             } else {
126                 size  = opcode & 3;
127                 back  = ((opcode & 0x10) << 12) + bytestream_get_be16(&src) + 1;
128                 size2 = ((opcode & 0x0c) <<  6) + *src++ + 5;
129                 if (size + size2 > dest_end - dest)
130                     break;
131             }
132             if (src + size > src_end ||
133                 dest + size + size2 > dest_end ||
134                 dest + size - orig_dest < back )
135                 return -1;
136             bytestream_get_buffer(&src, dest, size);
137             dest += size;
138             av_memcpy_backptr(dest, back, size2);
139             dest += size2;
140         } else {
141             int finish = opcode >= 0xfc;
142
143             size = finish ? opcode & 3 : ((opcode & 0x1f) << 2) + 4;
144             if (src + size > src_end || dest + size > dest_end)
145                 return -1;
146             bytestream_get_buffer(&src, dest, size);
147             dest += size;
148             if (finish)
149                 break;
150         }
151     }
152     return dest - orig_dest;
153 }
154
155 static int xan_decode_chroma(AVCodecContext *avctx, AVPacket *avpkt)
156 {
157     const uint8_t *buf = avpkt->data;
158     XanContext *s = avctx->priv_data;
159     uint8_t *U, *V;
160     unsigned chroma_off;
161     int val, uval, vval;
162     int i, j;
163     const uint8_t *src, *src_end;
164     const uint8_t *table;
165     int mode, offset, dec_size;
166
167     chroma_off = AV_RL32(buf + 4);
168     if (!chroma_off)
169         return 0;
170     if (chroma_off + 10 >= avpkt->size) {
171         av_log(avctx, AV_LOG_ERROR, "Invalid chroma block position\n");
172         return -1;
173     }
174     src    = avpkt->data + 4 + chroma_off;
175     table  = src + 2;
176     mode   = bytestream_get_le16(&src);
177     offset = bytestream_get_le16(&src) * 2;
178
179     if (src - avpkt->data >= avpkt->size - offset) {
180         av_log(avctx, AV_LOG_ERROR, "Invalid chroma block offset\n");
181         return -1;
182     }
183
184     memset(s->scratch_buffer, 0, s->buffer_size);
185     dec_size = xan_unpack(s->scratch_buffer, s->buffer_size, src + offset,
186                           avpkt->size - offset - (src - avpkt->data));
187     if (dec_size < 0) {
188         av_log(avctx, AV_LOG_ERROR, "Chroma unpacking failed\n");
189         return -1;
190     }
191
192     U = s->pic.data[1];
193     V = s->pic.data[2];
194     src     = s->scratch_buffer;
195     src_end = src + dec_size;
196     if (mode) {
197         for (j = 0; j < avctx->height >> 1; j++) {
198             for (i = 0; i < avctx->width >> 1; i++) {
199                 if (src_end - src < 1)
200                     return 0;
201                 val = *src++;
202                 if (val) {
203                     val  = AV_RL16(table + (val << 1));
204                     uval = (val >> 3) & 0xF8;
205                     vval = (val >> 8) & 0xF8;
206                     U[i] = uval | (uval >> 5);
207                     V[i] = vval | (vval >> 5);
208                 }
209             }
210             U += s->pic.linesize[1];
211             V += s->pic.linesize[2];
212         }
213     } else {
214         uint8_t *U2 = U + s->pic.linesize[1];
215         uint8_t *V2 = V + s->pic.linesize[2];
216
217         for (j = 0; j < avctx->height >> 2; j++) {
218             for (i = 0; i < avctx->width >> 1; i += 2) {
219                 if (src_end - src < 1)
220                     return 0;
221                 val = *src++;
222                 if (val) {
223                     val  = AV_RL16(table + (val << 1));
224                     uval = (val >> 3) & 0xF8;
225                     vval = (val >> 8) & 0xF8;
226                     U[i] = U[i+1] = U2[i] = U2[i+1] = uval | (uval >> 5);
227                     V[i] = V[i+1] = V2[i] = V2[i+1] = vval | (vval >> 5);
228                 }
229             }
230             U  += s->pic.linesize[1] * 2;
231             V  += s->pic.linesize[2] * 2;
232             U2 += s->pic.linesize[1] * 2;
233             V2 += s->pic.linesize[2] * 2;
234         }
235     }
236
237     return 0;
238 }
239
240 static int xan_decode_frame_type0(AVCodecContext *avctx, AVPacket *avpkt)
241 {
242     const uint8_t *buf = avpkt->data;
243     XanContext *s = avctx->priv_data;
244     uint8_t *ybuf, *prev_buf, *src = s->scratch_buffer;
245     unsigned  chroma_off, corr_off;
246     int cur, last, size;
247     int i, j;
248     int ret;
249
250     corr_off   = AV_RL32(buf + 8);
251     chroma_off = AV_RL32(buf + 4);
252
253     if ((ret = xan_decode_chroma(avctx, avpkt)) != 0)
254         return ret;
255
256     size = avpkt->size - 4;
257     if (corr_off >= avpkt->size) {
258         av_log(avctx, AV_LOG_WARNING, "Ignoring invalid correction block position\n");
259         corr_off = 0;
260     }
261     if (corr_off)
262         size = corr_off;
263     if (chroma_off)
264         size = FFMIN(size, chroma_off);
265     ret = xan_unpack_luma(buf + 12, size, src, s->buffer_size >> 1);
266     if (ret) {
267         av_log(avctx, AV_LOG_ERROR, "Luma decoding failed\n");
268         return ret;
269     }
270
271     ybuf = s->y_buffer;
272     last = *src++;
273     ybuf[0] = last << 1;
274     for (j = 1; j < avctx->width - 1; j += 2) {
275         cur = (last + *src++) & 0x1F;
276         ybuf[j]   = last + cur;
277         ybuf[j+1] = cur << 1;
278         last = cur;
279     }
280     ybuf[j]  = last << 1;
281     prev_buf = ybuf;
282     ybuf += avctx->width;
283
284     for (i = 1; i < avctx->height; i++) {
285         last = ((prev_buf[0] >> 1) + *src++) & 0x1F;
286         ybuf[0] = last << 1;
287         for (j = 1; j < avctx->width - 1; j += 2) {
288             cur = ((prev_buf[j + 1] >> 1) + *src++) & 0x1F;
289             ybuf[j]   = last + cur;
290             ybuf[j+1] = cur << 1;
291             last = cur;
292         }
293         ybuf[j] = last << 1;
294         prev_buf = ybuf;
295         ybuf += avctx->width;
296     }
297
298     if (corr_off) {
299         int corr_end, dec_size;
300
301         corr_end = avpkt->size;
302         if (chroma_off > corr_off)
303             corr_end = chroma_off;
304         dec_size = xan_unpack(s->scratch_buffer, s->buffer_size,
305                               avpkt->data + 8 + corr_off,
306                               corr_end - corr_off);
307         if (dec_size < 0)
308             dec_size = 0;
309         else
310             dec_size = FFMIN(dec_size, s->buffer_size/2 - 1);
311
312         for (i = 0; i < dec_size; i++)
313             s->y_buffer[i*2+1] = (s->y_buffer[i*2+1] + (s->scratch_buffer[i] << 1)) & 0x3F;
314     }
315
316     src  = s->y_buffer;
317     ybuf = s->pic.data[0];
318     for (j = 0; j < avctx->height; j++) {
319         for (i = 0; i < avctx->width; i++)
320             ybuf[i] = (src[i] << 2) | (src[i] >> 3);
321         src  += avctx->width;
322         ybuf += s->pic.linesize[0];
323     }
324
325     return 0;
326 }
327
328 static int xan_decode_frame_type1(AVCodecContext *avctx, AVPacket *avpkt)
329 {
330     const uint8_t *buf = avpkt->data;
331     XanContext *s = avctx->priv_data;
332     uint8_t *ybuf, *src = s->scratch_buffer;
333     int cur, last;
334     int i, j;
335     int ret;
336
337     if ((ret = xan_decode_chroma(avctx, avpkt)) != 0)
338         return ret;
339
340     ret = xan_unpack_luma(buf + 16, avpkt->size - 16, src,
341                           s->buffer_size >> 1);
342     if (ret) {
343         av_log(avctx, AV_LOG_ERROR, "Luma decoding failed\n");
344         return ret;
345     }
346
347     ybuf = s->y_buffer;
348     for (i = 0; i < avctx->height; i++) {
349         last = (ybuf[0] + (*src++ << 1)) & 0x3F;
350         ybuf[0] = last;
351         for (j = 1; j < avctx->width - 1; j += 2) {
352             cur = (ybuf[j + 1] + (*src++ << 1)) & 0x3F;
353             ybuf[j]   = (last + cur) >> 1;
354             ybuf[j+1] = cur;
355             last = cur;
356         }
357         ybuf[j] = last;
358         ybuf += avctx->width;
359     }
360
361     src = s->y_buffer;
362     ybuf = s->pic.data[0];
363     for (j = 0; j < avctx->height; j++) {
364         for (i = 0; i < avctx->width; i++)
365             ybuf[i] = (src[i] << 2) | (src[i] >> 3);
366         src  += avctx->width;
367         ybuf += s->pic.linesize[0];
368     }
369
370     return 0;
371 }
372
373 static int xan_decode_frame(AVCodecContext *avctx,
374                             void *data, int *data_size,
375                             AVPacket *avpkt)
376 {
377     XanContext *s = avctx->priv_data;
378     int ftype;
379     int ret;
380
381     s->pic.reference = 3;
382     s->pic.buffer_hints = FF_BUFFER_HINTS_VALID |
383                           FF_BUFFER_HINTS_PRESERVE |
384                           FF_BUFFER_HINTS_REUSABLE;
385     if ((ret = avctx->reget_buffer(avctx, &s->pic))) {
386         av_log(s->avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
387         return ret;
388     }
389
390     ftype = AV_RL32(avpkt->data);
391     switch (ftype) {
392     case 0:
393         ret = xan_decode_frame_type0(avctx, avpkt);
394         break;
395     case 1:
396         ret = xan_decode_frame_type1(avctx, avpkt);
397         break;
398     default:
399         av_log(avctx, AV_LOG_ERROR, "Unknown frame type %d\n", ftype);
400         return -1;
401     }
402     if (ret)
403         return ret;
404
405     *data_size = sizeof(AVFrame);
406     *(AVFrame*)data = s->pic;
407
408     return avpkt->size;
409 }
410
411 static av_cold int xan_decode_end(AVCodecContext *avctx)
412 {
413     XanContext *s = avctx->priv_data;
414
415     if (s->pic.data[0])
416         avctx->release_buffer(avctx, &s->pic);
417
418     av_freep(&s->y_buffer);
419     av_freep(&s->scratch_buffer);
420
421     return 0;
422 }
423
424 AVCodec ff_xan_wc4_decoder = {
425     .name           = "xan_wc4",
426     .type           = AVMEDIA_TYPE_VIDEO,
427     .id             = CODEC_ID_XAN_WC4,
428     .priv_data_size = sizeof(XanContext),
429     .init           = xan_decode_init,
430     .close          = xan_decode_end,
431     .decode         = xan_decode_frame,
432     .capabilities   = CODEC_CAP_DR1,
433     .long_name = NULL_IF_CONFIG_SMALL("Wing Commander IV / Xxan"),
434 };
435