Statistics
| Branch: | Revision:

ffmpeg / libavcodec / lcldec.c @ 5a18221b

History | View | Annotate | Download (21.5 KB)

1
/*
2
 * LCL (LossLess Codec Library) Codec
3
 * Copyright (c) 2002-2004 Roberto Togni
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21

    
22
/**
23
 * @file libavcodec/lcldec.c
24
 * LCL (LossLess Codec Library) Video Codec
25
 * Decoder for MSZH and ZLIB codecs
26
 * Experimental encoder for ZLIB RGB24
27
 *
28
 * Fourcc: MSZH, ZLIB
29
 *
30
 * Original Win32 dll:
31
 * Ver2.23 By Kenji Oshima 2000.09.20
32
 * avimszh.dll, avizlib.dll
33
 *
34
 * A description of the decoding algorithm can be found here:
35
 *   http://www.pcisys.net/~melanson/codecs
36
 *
37
 * Supports: BGR24 (RGB 24bpp)
38
 *
39
 */
40

    
41
#include <stdio.h>
42
#include <stdlib.h>
43

    
44
#include "avcodec.h"
45
#include "get_bits.h"
46
#include "lcl.h"
47

    
48
#if CONFIG_ZLIB_DECODER
49
#include <zlib.h>
50
#endif
51

    
52
/*
53
 * Decoder context
54
 */
55
typedef struct LclDecContext {
56
    AVFrame pic;
57

    
58
    // Image type
59
    int imgtype;
60
    // Compression type
61
    int compression;
62
    // Flags
63
    int flags;
64
    // Decompressed data size
65
    unsigned int decomp_size;
66
    // Decompression buffer
67
    unsigned char* decomp_buf;
68
#if CONFIG_ZLIB_DECODER
69
    z_stream zstream;
70
#endif
71
} LclDecContext;
72

    
73

    
74
/**
75
 * \param srcptr compressed source buffer, must be padded with at least 4 extra bytes
76
 */
77
static unsigned int mszh_decomp(unsigned char * srcptr, int srclen, unsigned char * destptr, unsigned int destsize)
78
{
79
    unsigned char *destptr_bak = destptr;
80
    unsigned char *destptr_end = destptr + destsize;
81
    unsigned char *srcptr_end = srcptr + srclen;
82
    unsigned char mask = 0;
83
    unsigned char maskbit = 0;
84
    unsigned int ofs, cnt;
85

    
86
    while (srcptr < srcptr_end && destptr < destptr_end) {
87
        if (maskbit == 0) {
88
            mask = *srcptr++;
89
            maskbit = 8;
90
            continue;
91
        }
92
        if ((mask & (1 << (--maskbit))) == 0) {
93
            if (destptr_end - destptr < 4)
94
                break;
95
            memcpy(destptr, srcptr, 4);
96
            destptr += 4;
97
            srcptr += 4;
98
        } else {
99
            ofs = *srcptr++;
100
            cnt = *srcptr++;
101
            ofs += cnt * 256;
102
            cnt = (cnt >> 3) + 1;
103
            ofs &= 0x7ff;
104
            cnt *= 4;
105
            if (destptr_end - destptr < cnt) {
106
                cnt =  destptr_end - destptr;
107
            }
108
            for (; cnt > 0; cnt--) {
109
                *destptr = *(destptr - ofs);
110
                destptr++;
111
            }
112
        }
113
    }
114

    
115
    return destptr - destptr_bak;
116
}
117

    
118

    
119
/**
120
 * \brief decompress a zlib-compressed data block into decomp_buf
121
 * \param src compressed input buffer
122
 * \param src_len data length in input buffer
123
 * \param offset offset in decomp_buf
124
 * \param expected expected decompressed length
125
 */
126
static int zlib_decomp(AVCodecContext *avctx, const uint8_t *src, int src_len, int offset, int expected)
127
{
128
    LclDecContext *c = avctx->priv_data;
129
    int zret = inflateReset(&c->zstream);
130
    if (zret != Z_OK) {
131
        av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret);
132
        return -1;
133
    }
134
    c->zstream.next_in = src;
135
    c->zstream.avail_in = src_len;
136
    c->zstream.next_out = c->decomp_buf + offset;
137
    c->zstream.avail_out = c->decomp_size - offset;
138
    zret = inflate(&c->zstream, Z_FINISH);
139
    if (zret != Z_OK && zret != Z_STREAM_END) {
140
        av_log(avctx, AV_LOG_ERROR, "Inflate error: %d\n", zret);
141
        return -1;
142
    }
143
    if (expected != (unsigned int)c->zstream.total_out) {
144
        av_log(avctx, AV_LOG_ERROR, "Decoded size differs (%d != %lu)\n",
145
               expected, c->zstream.total_out);
146
        return -1;
147
    }
148
    return c->zstream.total_out;
149
}
150

    
151

    
152
/*
153
 *
154
 * Decode a frame
155
 *
156
 */
157
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
158
{
159
    const uint8_t *buf = avpkt->data;
160
    int buf_size = avpkt->size;
161
    LclDecContext * const c = avctx->priv_data;
162
    unsigned char *encoded = (unsigned char *)buf;
163
    unsigned int pixel_ptr;
164
    int row, col;
165
    unsigned char *outptr;
166
    uint8_t *y_out, *u_out, *v_out;
167
    unsigned int width = avctx->width; // Real image width
168
    unsigned int height = avctx->height; // Real image height
169
    unsigned int mszh_dlen;
170
    unsigned char yq, y1q, uq, vq;
171
    int uqvq;
172
    unsigned int mthread_inlen, mthread_outlen;
173
    unsigned int len = buf_size;
174

    
175
    if(c->pic.data[0])
176
        avctx->release_buffer(avctx, &c->pic);
177

    
178
    c->pic.reference = 0;
179
    c->pic.buffer_hints = FF_BUFFER_HINTS_VALID;
180
    if(avctx->get_buffer(avctx, &c->pic) < 0){
181
        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
182
        return -1;
183
    }
184

    
185
    outptr = c->pic.data[0]; // Output image pointer
186

    
187
    /* Decompress frame */
188
    switch (avctx->codec_id) {
189
    case CODEC_ID_MSZH:
190
        switch (c->compression) {
191
        case COMP_MSZH:
192
            if (c->flags & FLAG_MULTITHREAD) {
193
                mthread_inlen = AV_RL32(encoded);
194
                mthread_inlen = FFMIN(mthread_inlen, len - 8);
195
                mthread_outlen = AV_RL32(encoded+4);
196
                mthread_outlen = FFMIN(mthread_outlen, c->decomp_size);
197
                mszh_dlen = mszh_decomp(encoded + 8, mthread_inlen, c->decomp_buf, c->decomp_size);
198
                if (mthread_outlen != mszh_dlen) {
199
                    av_log(avctx, AV_LOG_ERROR, "Mthread1 decoded size differs (%d != %d)\n",
200
                           mthread_outlen, mszh_dlen);
201
                    return -1;
202
                }
203
                mszh_dlen = mszh_decomp(encoded + 8 + mthread_inlen, len - 8 - mthread_inlen,
204
                                        c->decomp_buf + mthread_outlen, c->decomp_size - mthread_outlen);
205
                if (mthread_outlen != mszh_dlen) {
206
                    av_log(avctx, AV_LOG_ERROR, "Mthread2 decoded size differs (%d != %d)\n",
207
                           mthread_outlen, mszh_dlen);
208
                    return -1;
209
                }
210
                encoded = c->decomp_buf;
211
                len = c->decomp_size;
212
            } else {
213
                mszh_dlen = mszh_decomp(encoded, len, c->decomp_buf, c->decomp_size);
214
                if (c->decomp_size != mszh_dlen) {
215
                    av_log(avctx, AV_LOG_ERROR, "Decoded size differs (%d != %d)\n",
216
                           c->decomp_size, mszh_dlen);
217
                    return -1;
218
                }
219
                encoded = c->decomp_buf;
220
                len = mszh_dlen;
221
            }
222
            break;
223
        case COMP_MSZH_NOCOMP:
224
            break;
225
        default:
226
            av_log(avctx, AV_LOG_ERROR, "BUG! Unknown MSZH compression in frame decoder.\n");
227
            return -1;
228
        }
229
        break;
230
#if CONFIG_ZLIB_DECODER
231
    case CODEC_ID_ZLIB:
232
        /* Using the original dll with normal compression (-1) and RGB format
233
         * gives a file with ZLIB fourcc, but frame is really uncompressed.
234
         * To be sure that's true check also frame size */
235
        if (c->compression == COMP_ZLIB_NORMAL && c->imgtype == IMGTYPE_RGB24 &&
236
            len == width * height * 3)
237
            break;
238
        if (c->flags & FLAG_MULTITHREAD) {
239
            int ret;
240
            mthread_inlen = AV_RL32(encoded);
241
            mthread_inlen = FFMIN(mthread_inlen, len - 8);
242
            mthread_outlen = AV_RL32(encoded+4);
243
            mthread_outlen = FFMIN(mthread_outlen, c->decomp_size);
244
            ret = zlib_decomp(avctx, encoded + 8, mthread_inlen, 0, mthread_outlen);
245
            if (ret < 0) return ret;
246
            ret = zlib_decomp(avctx, encoded + 8 + mthread_inlen, len - 8 - mthread_inlen,
247
                              mthread_outlen, mthread_outlen);
248
            if (ret < 0) return ret;
249
        } else {
250
            int ret = zlib_decomp(avctx, encoded, len, 0, c->decomp_size);
251
            if (ret < 0) return ret;
252
        }
253
        encoded = c->decomp_buf;
254
        len = c->decomp_size;
255
        break;
256
#endif
257
    default:
258
        av_log(avctx, AV_LOG_ERROR, "BUG! Unknown codec in frame decoder compression switch.\n");
259
        return -1;
260
    }
261

    
262

    
263
    /* Apply PNG filter */
264
    if (avctx->codec_id == CODEC_ID_ZLIB && (c->flags & FLAG_PNGFILTER)) {
265
        switch (c->imgtype) {
266
        case IMGTYPE_YUV111:
267
        case IMGTYPE_RGB24:
268
            for (row = 0; row < height; row++) {
269
                pixel_ptr = row * width * 3;
270
                yq = encoded[pixel_ptr++];
271
                uqvq = AV_RL16(encoded+pixel_ptr);
272
                pixel_ptr += 2;
273
                for (col = 1; col < width; col++) {
274
                    encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
275
                    uqvq -= AV_RL16(encoded+pixel_ptr+1);
276
                    AV_WL16(encoded+pixel_ptr+1, uqvq);
277
                    pixel_ptr += 3;
278
                }
279
            }
280
            break;
281
        case IMGTYPE_YUV422:
282
            for (row = 0; row < height; row++) {
283
                pixel_ptr = row * width * 2;
284
                yq = uq = vq =0;
285
                for (col = 0; col < width/4; col++) {
286
                    encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
287
                    encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
288
                    encoded[pixel_ptr+2] = yq -= encoded[pixel_ptr+2];
289
                    encoded[pixel_ptr+3] = yq -= encoded[pixel_ptr+3];
290
                    encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
291
                    encoded[pixel_ptr+5] = uq -= encoded[pixel_ptr+5];
292
                    encoded[pixel_ptr+6] = vq -= encoded[pixel_ptr+6];
293
                    encoded[pixel_ptr+7] = vq -= encoded[pixel_ptr+7];
294
                    pixel_ptr += 8;
295
                }
296
            }
297
            break;
298
        case IMGTYPE_YUV411:
299
            for (row = 0; row < height; row++) {
300
                pixel_ptr = row * width / 2 * 3;
301
                yq = uq = vq =0;
302
                for (col = 0; col < width/4; col++) {
303
                    encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
304
                    encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
305
                    encoded[pixel_ptr+2] = yq -= encoded[pixel_ptr+2];
306
                    encoded[pixel_ptr+3] = yq -= encoded[pixel_ptr+3];
307
                    encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
308
                    encoded[pixel_ptr+5] = vq -= encoded[pixel_ptr+5];
309
                    pixel_ptr += 6;
310
                }
311
            }
312
            break;
313
        case IMGTYPE_YUV211:
314
            for (row = 0; row < height; row++) {
315
                pixel_ptr = row * width * 2;
316
                yq = uq = vq =0;
317
                for (col = 0; col < width/2; col++) {
318
                    encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
319
                    encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
320
                    encoded[pixel_ptr+2] = uq -= encoded[pixel_ptr+2];
321
                    encoded[pixel_ptr+3] = vq -= encoded[pixel_ptr+3];
322
                    pixel_ptr += 4;
323
                }
324
            }
325
            break;
326
        case IMGTYPE_YUV420:
327
            for (row = 0; row < height/2; row++) {
328
                pixel_ptr = row * width * 3;
329
                yq = y1q = uq = vq =0;
330
                for (col = 0; col < width/2; col++) {
331
                    encoded[pixel_ptr] = yq -= encoded[pixel_ptr];
332
                    encoded[pixel_ptr+1] = yq -= encoded[pixel_ptr+1];
333
                    encoded[pixel_ptr+2] = y1q -= encoded[pixel_ptr+2];
334
                    encoded[pixel_ptr+3] = y1q -= encoded[pixel_ptr+3];
335
                    encoded[pixel_ptr+4] = uq -= encoded[pixel_ptr+4];
336
                    encoded[pixel_ptr+5] = vq -= encoded[pixel_ptr+5];
337
                    pixel_ptr += 6;
338
                }
339
            }
340
            break;
341
        default:
342
            av_log(avctx, AV_LOG_ERROR, "BUG! Unknown imagetype in pngfilter switch.\n");
343
            return -1;
344
        }
345
    }
346

    
347
    /* Convert colorspace */
348
    y_out = c->pic.data[0] + (height - 1) * c->pic.linesize[0];
349
    u_out = c->pic.data[1] + (height - 1) * c->pic.linesize[1];
350
    v_out = c->pic.data[2] + (height - 1) * c->pic.linesize[2];
351
    switch (c->imgtype) {
352
    case IMGTYPE_YUV111:
353
        for (row = 0; row < height; row++) {
354
            for (col = 0; col < width; col++) {
355
                y_out[col] = *encoded++;
356
                u_out[col] = *encoded++ + 128;
357
                v_out[col] = *encoded++ + 128;
358
            }
359
            y_out -= c->pic.linesize[0];
360
            u_out -= c->pic.linesize[1];
361
            v_out -= c->pic.linesize[2];
362
        }
363
        break;
364
    case IMGTYPE_YUV422:
365
        for (row = 0; row < height; row++) {
366
            for (col = 0; col < width - 3; col += 4) {
367
                memcpy(y_out + col, encoded, 4);
368
                encoded += 4;
369
                u_out[ col >> 1     ] = *encoded++ + 128;
370
                u_out[(col >> 1) + 1] = *encoded++ + 128;
371
                v_out[ col >> 1     ] = *encoded++ + 128;
372
                v_out[(col >> 1) + 1] = *encoded++ + 128;
373
            }
374
            y_out -= c->pic.linesize[0];
375
            u_out -= c->pic.linesize[1];
376
            v_out -= c->pic.linesize[2];
377
        }
378
        break;
379
    case IMGTYPE_RGB24:
380
        for (row = height - 1; row >= 0; row--) {
381
            pixel_ptr = row * c->pic.linesize[0];
382
            memcpy(outptr + pixel_ptr, encoded, 3 * width);
383
            encoded += 3 * width;
384
        }
385
        break;
386
    case IMGTYPE_YUV411:
387
        for (row = 0; row < height; row++) {
388
            for (col = 0; col < width - 3; col += 4) {
389
                memcpy(y_out + col, encoded, 4);
390
                encoded += 4;
391
                u_out[col >> 2] = *encoded++ + 128;
392
                v_out[col >> 2] = *encoded++ + 128;
393
            }
394
            y_out -= c->pic.linesize[0];
395
            u_out -= c->pic.linesize[1];
396
            v_out -= c->pic.linesize[2];
397
        }
398
        break;
399
    case IMGTYPE_YUV211:
400
        for (row = 0; row < height; row++) {
401
            for (col = 0; col < width - 1; col += 2) {
402
                memcpy(y_out + col, encoded, 2);
403
                encoded += 2;
404
                u_out[col >> 1] = *encoded++ + 128;
405
                v_out[col >> 1] = *encoded++ + 128;
406
            }
407
            y_out -= c->pic.linesize[0];
408
            u_out -= c->pic.linesize[1];
409
            v_out -= c->pic.linesize[2];
410
        }
411
        break;
412
    case IMGTYPE_YUV420:
413
        u_out = c->pic.data[1] + ((height >> 1) - 1) * c->pic.linesize[1];
414
        v_out = c->pic.data[2] + ((height >> 1) - 1) * c->pic.linesize[2];
415
        for (row = 0; row < height - 1; row += 2) {
416
            for (col = 0; col < width - 1; col += 2) {
417
                memcpy(y_out + col, encoded, 2);
418
                encoded += 2;
419
                memcpy(y_out + col - c->pic.linesize[0], encoded, 2);
420
                encoded += 2;
421
                u_out[col >> 1] = *encoded++ + 128;
422
                v_out[col >> 1] = *encoded++ + 128;
423
            }
424
            y_out -= c->pic.linesize[0] << 1;
425
            u_out -= c->pic.linesize[1];
426
            v_out -= c->pic.linesize[2];
427
        }
428
        break;
429
    default:
430
        av_log(avctx, AV_LOG_ERROR, "BUG! Unknown imagetype in image decoder.\n");
431
        return -1;
432
    }
433

    
434
    *data_size = sizeof(AVFrame);
435
    *(AVFrame*)data = c->pic;
436

    
437
    /* always report that the buffer was completely consumed */
438
    return buf_size;
439
}
440

    
441
/*
442
 *
443
 * Init lcl decoder
444
 *
445
 */
446
static av_cold int decode_init(AVCodecContext *avctx)
447
{
448
    LclDecContext * const c = avctx->priv_data;
449
    unsigned int basesize = avctx->width * avctx->height;
450
    unsigned int max_basesize = FFALIGN(avctx->width, 4) * FFALIGN(avctx->height, 4);
451
    unsigned int max_decomp_size;
452

    
453
    c->pic.data[0] = NULL;
454

    
455
#if CONFIG_ZLIB_DECODER
456
    // Needed if zlib unused or init aborted before inflateInit
457
    memset(&c->zstream, 0, sizeof(z_stream));
458
#endif
459

    
460
    if (avctx->extradata_size < 8) {
461
        av_log(avctx, AV_LOG_ERROR, "Extradata size too small.\n");
462
        return 1;
463
    }
464

    
465
    if (avcodec_check_dimensions(avctx, avctx->width, avctx->height) < 0) {
466
        return 1;
467
    }
468

    
469
    /* Check codec type */
470
    if ((avctx->codec_id == CODEC_ID_MSZH  && avctx->extradata[7] != CODEC_MSZH) ||
471
        (avctx->codec_id == CODEC_ID_ZLIB  && avctx->extradata[7] != CODEC_ZLIB)) {
472
        av_log(avctx, AV_LOG_ERROR, "Codec id and codec type mismatch. This should not happen.\n");
473
    }
474

    
475
    /* Detect image type */
476
    switch (c->imgtype = avctx->extradata[4]) {
477
    case IMGTYPE_YUV111:
478
        c->decomp_size = basesize * 3;
479
        max_decomp_size = max_basesize * 3;
480
        avctx->pix_fmt = PIX_FMT_YUV444P;
481
        av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 1:1:1.\n");
482
        break;
483
    case IMGTYPE_YUV422:
484
        c->decomp_size = basesize * 2;
485
        max_decomp_size = max_basesize * 2;
486
        avctx->pix_fmt = PIX_FMT_YUV422P;
487
        av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 4:2:2.\n");
488
        break;
489
    case IMGTYPE_RGB24:
490
        c->decomp_size = basesize * 3;
491
        max_decomp_size = max_basesize * 3;
492
        avctx->pix_fmt = PIX_FMT_BGR24;
493
        av_log(avctx, AV_LOG_DEBUG, "Image type is RGB 24.\n");
494
        break;
495
    case IMGTYPE_YUV411:
496
        c->decomp_size = basesize / 2 * 3;
497
        max_decomp_size = max_basesize / 2 * 3;
498
        avctx->pix_fmt = PIX_FMT_YUV411P;
499
        av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 4:1:1.\n");
500
        break;
501
    case IMGTYPE_YUV211:
502
        c->decomp_size = basesize * 2;
503
        max_decomp_size = max_basesize * 2;
504
        avctx->pix_fmt = PIX_FMT_YUV422P;
505
        av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 2:1:1.\n");
506
        break;
507
    case IMGTYPE_YUV420:
508
        c->decomp_size = basesize / 2 * 3;
509
        max_decomp_size = max_basesize / 2 * 3;
510
        avctx->pix_fmt = PIX_FMT_YUV420P;
511
        av_log(avctx, AV_LOG_DEBUG, "Image type is YUV 4:2:0.\n");
512
        break;
513
    default:
514
        av_log(avctx, AV_LOG_ERROR, "Unsupported image format %d.\n", c->imgtype);
515
        return 1;
516
    }
517

    
518
    /* Detect compression method */
519
    c->compression = avctx->extradata[5];
520
    switch (avctx->codec_id) {
521
    case CODEC_ID_MSZH:
522
        switch (c->compression) {
523
        case COMP_MSZH:
524
            av_log(avctx, AV_LOG_DEBUG, "Compression enabled.\n");
525
            break;
526
        case COMP_MSZH_NOCOMP:
527
            c->decomp_size = 0;
528
            av_log(avctx, AV_LOG_DEBUG, "No compression.\n");
529
            break;
530
        default:
531
            av_log(avctx, AV_LOG_ERROR, "Unsupported compression format for MSZH (%d).\n", c->compression);
532
            return 1;
533
        }
534
        break;
535
#if CONFIG_ZLIB_DECODER
536
    case CODEC_ID_ZLIB:
537
        switch (c->compression) {
538
        case COMP_ZLIB_HISPEED:
539
            av_log(avctx, AV_LOG_DEBUG, "High speed compression.\n");
540
            break;
541
        case COMP_ZLIB_HICOMP:
542
            av_log(avctx, AV_LOG_DEBUG, "High compression.\n");
543
            break;
544
        case COMP_ZLIB_NORMAL:
545
            av_log(avctx, AV_LOG_DEBUG, "Normal compression.\n");
546
            break;
547
        default:
548
            if (c->compression < Z_NO_COMPRESSION || c->compression > Z_BEST_COMPRESSION) {
549
                av_log(avctx, AV_LOG_ERROR, "Unsupported compression level for ZLIB: (%d).\n", c->compression);
550
                return 1;
551
            }
552
            av_log(avctx, AV_LOG_DEBUG, "Compression level for ZLIB: (%d).\n", c->compression);
553
        }
554
        break;
555
#endif
556
    default:
557
        av_log(avctx, AV_LOG_ERROR, "BUG! Unknown codec in compression switch.\n");
558
        return 1;
559
    }
560

    
561
    /* Allocate decompression buffer */
562
    if (c->decomp_size) {
563
        if ((c->decomp_buf = av_malloc(max_decomp_size)) == NULL) {
564
            av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n");
565
            return 1;
566
        }
567
    }
568

    
569
    /* Detect flags */
570
    c->flags = avctx->extradata[6];
571
    if (c->flags & FLAG_MULTITHREAD)
572
        av_log(avctx, AV_LOG_DEBUG, "Multithread encoder flag set.\n");
573
    if (c->flags & FLAG_NULLFRAME)
574
        av_log(avctx, AV_LOG_DEBUG, "Nullframe insertion flag set.\n");
575
    if (avctx->codec_id == CODEC_ID_ZLIB && (c->flags & FLAG_PNGFILTER))
576
        av_log(avctx, AV_LOG_DEBUG, "PNG filter flag set.\n");
577
    if (c->flags & FLAGMASK_UNUSED)
578
        av_log(avctx, AV_LOG_ERROR, "Unknown flag set (%d).\n", c->flags);
579

    
580
    /* If needed init zlib */
581
#if CONFIG_ZLIB_DECODER
582
    if (avctx->codec_id == CODEC_ID_ZLIB) {
583
        int zret;
584
        c->zstream.zalloc = Z_NULL;
585
        c->zstream.zfree = Z_NULL;
586
        c->zstream.opaque = Z_NULL;
587
        zret = inflateInit(&c->zstream);
588
        if (zret != Z_OK) {
589
            av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
590
            return 1;
591
        }
592
    }
593
#endif
594

    
595
    return 0;
596
}
597

    
598
/*
599
 *
600
 * Uninit lcl decoder
601
 *
602
 */
603
static av_cold int decode_end(AVCodecContext *avctx)
604
{
605
    LclDecContext * const c = avctx->priv_data;
606

    
607
    if (c->pic.data[0])
608
        avctx->release_buffer(avctx, &c->pic);
609
#if CONFIG_ZLIB_DECODER
610
    inflateEnd(&c->zstream);
611
#endif
612

    
613
    return 0;
614
}
615

    
616
#if CONFIG_MSZH_DECODER
617
AVCodec mszh_decoder = {
618
    "mszh",
619
    CODEC_TYPE_VIDEO,
620
    CODEC_ID_MSZH,
621
    sizeof(LclDecContext),
622
    decode_init,
623
    NULL,
624
    decode_end,
625
    decode_frame,
626
    CODEC_CAP_DR1,
627
    .long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) MSZH"),
628
};
629
#endif
630

    
631
#if CONFIG_ZLIB_DECODER
632
AVCodec zlib_decoder = {
633
    "zlib",
634
    CODEC_TYPE_VIDEO,
635
    CODEC_ID_ZLIB,
636
    sizeof(LclDecContext),
637
    decode_init,
638
    NULL,
639
    decode_end,
640
    decode_frame,
641
    CODEC_CAP_DR1,
642
    .long_name = NULL_IF_CONFIG_SMALL("LCL (LossLess Codec Library) ZLIB"),
643
};
644
#endif