2 * Canopus Lossless Codec decoder
4 * Copyright (c) 2012 Derek Buitenhuis
6 * This file is part of Libav.
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.
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.
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
23 #include "libavutil/intreadwrite.h"
29 typedef struct CLLCContext
{
31 AVCodecContext
*avctx
;
37 static int read_code_table(CLLCContext
*ctx
, GetBitContext
*gb
, VLC
*vlc
)
42 int num_lens
, num_codes
, num_codes_sum
, prefix
;
49 num_lens
= get_bits(gb
, 5);
51 for (i
= 0; i
< num_lens
; i
++) {
52 num_codes
= get_bits(gb
, 9);
53 num_codes_sum
+= num_codes
;
55 if (num_codes_sum
> 256) {
58 av_log(ctx
->avctx
, AV_LOG_ERROR
,
59 "Too many VLCs (%d) to be read.\n", num_codes_sum
);
60 return AVERROR_INVALIDDATA
;
63 for (j
= 0; j
< num_codes
; j
++) {
64 symbols
[count
] = get_bits(gb
, 8);
66 codes
[count
] = prefix
++;
74 return ff_init_vlc_sparse(vlc
, 7, count
, bits
, 1, 1,
75 codes
, 2, 2, symbols
, 1, 1, 0);
79 * Unlike the RGB24 read/restore, which reads in a component at a time,
80 * ARGB read/restore reads in ARGB quads.
82 static int read_argb_line(CLLCContext
*ctx
, GetBitContext
*gb
, int *top_left
,
83 VLC
*vlc
, uint8_t *outbuf
)
90 OPEN_READER(bits
, gb
);
93 pred
[0] = top_left
[0];
94 pred
[1] = top_left
[1];
95 pred
[2] = top_left
[2];
96 pred
[3] = top_left
[3];
98 for (i
= 0; i
< ctx
->avctx
->width
; i
++) {
99 /* Always get the alpha component */
100 UPDATE_CACHE(bits
, gb
);
101 GET_VLC(code
, bits
, gb
, vlc
[0].table
, 7, 2);
106 /* Skip the components if they are entirely transparent */
109 UPDATE_CACHE(bits
, gb
);
110 GET_VLC(code
, bits
, gb
, vlc
[1].table
, 7, 2);
116 UPDATE_CACHE(bits
, gb
);
117 GET_VLC(code
, bits
, gb
, vlc
[2].table
, 7, 2);
123 UPDATE_CACHE(bits
, gb
);
124 GET_VLC(code
, bits
, gb
, vlc
[3].table
, 7, 2);
137 CLOSE_READER(bits
, gb
);
139 dst
-= 4 * ctx
->avctx
->width
;
140 top_left
[0] = dst
[0];
142 /* Only stash components if they are not transparent */
144 top_left
[1] = dst
[1];
145 top_left
[2] = dst
[2];
146 top_left
[3] = dst
[3];
152 static int read_rgb24_component_line(CLLCContext
*ctx
, GetBitContext
*gb
,
153 int *top_left
, VLC
*vlc
, uint8_t *outbuf
)
159 OPEN_READER(bits
, gb
);
164 /* Simultaneously read and restore the line */
165 for (i
= 0; i
< ctx
->avctx
->width
; i
++) {
166 UPDATE_CACHE(bits
, gb
);
167 GET_VLC(code
, bits
, gb
, vlc
->table
, 7, 2);
174 CLOSE_READER(bits
, gb
);
176 /* Stash the first pixel */
177 *top_left
= dst
[-3 * ctx
->avctx
->width
];
182 static int decode_argb_frame(CLLCContext
*ctx
, GetBitContext
*gb
, AVFrame
*pic
)
184 AVCodecContext
*avctx
= ctx
->avctx
;
200 /* Read in code table for each plane */
201 for (i
= 0; i
< 4; i
++) {
202 ret
= read_code_table(ctx
, gb
, &vlc
[i
]);
204 for (j
= 0; j
<= i
; j
++)
205 ff_free_vlc(&vlc
[j
]);
207 av_log(ctx
->avctx
, AV_LOG_ERROR
,
208 "Could not read code table %d.\n", i
);
213 /* Read in and restore every line */
214 for (i
= 0; i
< avctx
->height
; i
++) {
215 read_argb_line(ctx
, gb
, pred
, vlc
, dst
);
217 dst
+= pic
->linesize
[0];
220 for (i
= 0; i
< 4; i
++)
221 ff_free_vlc(&vlc
[i
]);
226 static int decode_rgb24_frame(CLLCContext
*ctx
, GetBitContext
*gb
, AVFrame
*pic
)
228 AVCodecContext
*avctx
= ctx
->avctx
;
243 /* Read in code table for each plane */
244 for (i
= 0; i
< 3; i
++) {
245 ret
= read_code_table(ctx
, gb
, &vlc
[i
]);
247 for (j
= 0; j
<= i
; j
++)
248 ff_free_vlc(&vlc
[j
]);
250 av_log(ctx
->avctx
, AV_LOG_ERROR
,
251 "Could not read code table %d.\n", i
);
256 /* Read in and restore every line */
257 for (i
= 0; i
< avctx
->height
; i
++) {
258 for (j
= 0; j
< 3; j
++)
259 read_rgb24_component_line(ctx
, gb
, &pred
[j
], &vlc
[j
], &dst
[j
]);
261 dst
+= pic
->linesize
[0];
264 for (i
= 0; i
< 3; i
++)
265 ff_free_vlc(&vlc
[i
]);
270 static int cllc_decode_frame(AVCodecContext
*avctx
, void *data
,
271 int *got_picture_ptr
, AVPacket
*avpkt
)
273 CLLCContext
*ctx
= avctx
->priv_data
;
274 AVFrame
*pic
= avctx
->coded_frame
;
275 uint8_t *src
= avpkt
->data
;
276 uint32_t info_tag
, info_offset
;
279 int coding_type
, ret
;
282 avctx
->release_buffer(avctx
, pic
);
286 /* Skip the INFO header if present */
288 info_tag
= AV_RL32(src
);
289 if (info_tag
== MKTAG('I', 'N', 'F', 'O')) {
290 info_offset
= AV_RL32(src
+ 4);
291 if (info_offset
> UINT32_MAX
- 8 || info_offset
+ 8 > avpkt
->size
) {
292 av_log(avctx
, AV_LOG_ERROR
,
293 "Invalid INFO header offset: 0x%08X is too large.\n",
295 return AVERROR_INVALIDDATA
;
301 av_log(avctx
, AV_LOG_DEBUG
, "Skipping INFO chunk.\n");
304 data_size
= (avpkt
->size
- info_offset
) & ~1;
306 /* Make sure our bswap16'd buffer is big enough */
307 av_fast_padded_malloc(&ctx
->swapped_buf
,
308 &ctx
->swapped_buf_size
, data_size
);
309 if (!ctx
->swapped_buf
) {
310 av_log(avctx
, AV_LOG_ERROR
, "Could not allocate swapped buffer.\n");
311 return AVERROR(ENOMEM
);
314 /* bswap16 the buffer since CLLC's bitreader works in 16-bit words */
315 ctx
->dsp
.bswap16_buf((uint16_t *) ctx
->swapped_buf
, (uint16_t *) src
,
318 init_get_bits(&gb
, ctx
->swapped_buf
, data_size
* 8);
321 * Read in coding type. The types are as follows:
324 * 1 - BGR24 (Triples)
328 coding_type
= (AV_RL32(src
) >> 8) & 0xFF;
329 av_log(avctx
, AV_LOG_DEBUG
, "Frame coding type: %d\n", coding_type
);
331 switch (coding_type
) {
334 avctx
->pix_fmt
= AV_PIX_FMT_RGB24
;
335 avctx
->bits_per_raw_sample
= 8;
337 ret
= ff_get_buffer(avctx
, pic
);
339 av_log(avctx
, AV_LOG_ERROR
, "Could not allocate buffer.\n");
343 ret
= decode_rgb24_frame(ctx
, &gb
, pic
);
349 avctx
->pix_fmt
= AV_PIX_FMT_ARGB
;
350 avctx
->bits_per_raw_sample
= 8;
352 ret
= ff_get_buffer(avctx
, pic
);
354 av_log(avctx
, AV_LOG_ERROR
, "Could not allocate buffer.\n");
358 ret
= decode_argb_frame(ctx
, &gb
, pic
);
364 av_log(avctx
, AV_LOG_ERROR
, "Unknown coding type: %d.\n", coding_type
);
365 return AVERROR_INVALIDDATA
;
369 pic
->pict_type
= AV_PICTURE_TYPE_I
;
371 *got_picture_ptr
= 1;
372 *(AVFrame
*)data
= *pic
;
377 static av_cold
int cllc_decode_close(AVCodecContext
*avctx
)
379 CLLCContext
*ctx
= avctx
->priv_data
;
381 if (avctx
->coded_frame
->data
[0])
382 avctx
->release_buffer(avctx
, avctx
->coded_frame
);
384 av_freep(&avctx
->coded_frame
);
385 av_freep(&ctx
->swapped_buf
);
390 static av_cold
int cllc_decode_init(AVCodecContext
*avctx
)
392 CLLCContext
*ctx
= avctx
->priv_data
;
394 /* Initialize various context values */
396 ctx
->swapped_buf
= NULL
;
397 ctx
->swapped_buf_size
= 0;
399 ff_dsputil_init(&ctx
->dsp
, avctx
);
401 avctx
->coded_frame
= avcodec_alloc_frame();
402 if (!avctx
->coded_frame
) {
403 av_log(avctx
, AV_LOG_ERROR
, "Could not allocate frame.\n");
404 return AVERROR(ENOMEM
);
410 AVCodec ff_cllc_decoder
= {
412 .type
= AVMEDIA_TYPE_VIDEO
,
413 .id
= AV_CODEC_ID_CLLC
,
414 .priv_data_size
= sizeof(CLLCContext
),
415 .init
= cllc_decode_init
,
416 .decode
= cllc_decode_frame
,
417 .close
= cllc_decode_close
,
418 .capabilities
= CODEC_CAP_DR1
,
419 .long_name
= NULL_IF_CONFIG_SMALL("Canopus Lossless Codec"),