2 * TechSmith Screen Codec 2 (aka Dora) decoder
3 * Copyright (c) 2012 Konstantin Shishkov
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * TechSmith Screen Codec 2 decoder
27 #define BITSTREAM_READER_LE
30 #include "bytestream.h"
31 #include "tscc2data.h"
33 typedef struct TSCC2Context
{
34 AVCodecContext
*avctx
;
36 int mb_width
, mb_height
;
37 uint8_t *slice_quants
;
42 VLC dc_vlc
, nc_vlc
[NUM_VLC_SETS
], ac_vlc
[NUM_VLC_SETS
];
46 static av_cold
void free_vlcs(TSCC2Context
*c
)
50 ff_free_vlc(&c
->dc_vlc
);
51 for (i
= 0; i
< NUM_VLC_SETS
; i
++) {
52 ff_free_vlc(c
->nc_vlc
+ i
);
53 ff_free_vlc(c
->ac_vlc
+ i
);
57 static av_cold
int init_vlcs(TSCC2Context
*c
)
61 ret
= ff_init_vlc_sparse(&c
->dc_vlc
, 9, DC_VLC_COUNT
,
62 tscc2_dc_vlc_bits
, 1, 1,
63 tscc2_dc_vlc_codes
, 2, 2,
64 tscc2_dc_vlc_syms
, 2, 2, INIT_VLC_LE
);
68 for (i
= 0; i
< NUM_VLC_SETS
; i
++) {
69 ret
= ff_init_vlc_sparse(c
->nc_vlc
+ i
, 9, 16,
70 tscc2_nc_vlc_bits
[i
], 1, 1,
71 tscc2_nc_vlc_codes
[i
], 2, 2,
72 tscc2_nc_vlc_syms
, 1, 1, INIT_VLC_LE
);
77 ret
= ff_init_vlc_sparse(c
->ac_vlc
+ i
, 9, tscc2_ac_vlc_sizes
[i
],
78 tscc2_ac_vlc_bits
[i
], 1, 1,
79 tscc2_ac_vlc_codes
[i
], 2, 2,
80 tscc2_ac_vlc_syms
[i
], 2, 2, INIT_VLC_LE
);
90 #define DEQUANT(val, q) ((q * val + 0x80) >> 8)
91 #define DCT1D(d0, d1, d2, d3, s0, s1, s2, s3, OP) \
92 OP(d0, 5 * ((s0) + (s1) + (s2)) + 2 * (s3)); \
93 OP(d1, 5 * ((s0) - (s2) - (s3)) + 2 * (s1)); \
94 OP(d2, 5 * ((s0) - (s2) + (s3)) - 2 * (s1)); \
95 OP(d3, 5 * ((s0) - (s1) + (s2)) - 2 * (s3)); \
97 #define COL_OP(a, b) a = b
98 #define ROW_OP(a, b) a = ((b) + 0x20) >> 6
100 static void tscc2_idct4_put(int *in
, int q
[3], uint8_t *dst
, int stride
)
106 for (i
= 0; i
< 4; i
++) {
107 t0
= DEQUANT(q
[0 + (i
& 1)], in
[0 * 4 + i
]);
108 t1
= DEQUANT(q
[1 + (i
& 1)], in
[1 * 4 + i
]);
109 t2
= DEQUANT(q
[0 + (i
& 1)], in
[2 * 4 + i
]);
110 t3
= DEQUANT(q
[1 + (i
& 1)], in
[3 * 4 + i
]);
111 DCT1D(tblk
[0 * 4 + i
], tblk
[1 * 4 + i
],
112 tblk
[2 * 4 + i
], tblk
[3 * 4 + i
],
113 t0
, t1
, t2
, t3
, COL_OP
);
115 for (i
= 0; i
< 4; i
++) {
116 DCT1D(dst
[0], dst
[1], dst
[2], dst
[3],
117 tblk
[i
* 4 + 0], tblk
[i
* 4 + 1],
118 tblk
[i
* 4 + 2], tblk
[i
* 4 + 3], ROW_OP
);
123 static int tscc2_decode_mb(TSCC2Context
*c
, int *q
, int vlc_set
,
124 uint8_t *dst
, int stride
, int plane
)
126 GetBitContext
*gb
= &c
->gb
;
127 int prev_dc
, dc
, nc
, ac
, bpos
, val
;
132 val
= get_bits(gb
, 8);
133 for (i
= 0; i
< 8; i
++, dst
+= stride
)
134 memset(dst
, val
, 16);
136 if (get_bits_left(gb
) < 16 * 8 * 8)
137 return AVERROR_INVALIDDATA
;
138 for (i
= 0; i
< 8; i
++) {
139 for (j
= 0; j
< 16; j
++)
140 dst
[j
] = get_bits(gb
, 8);
148 for (j
= 0; j
< 2; j
++) {
149 for (k
= 0; k
< 4; k
++) {
151 dc
= get_bits(gb
, 8);
153 dc
= get_vlc2(gb
, c
->dc_vlc
.table
, 9, 2);
155 return AVERROR_INVALIDDATA
;
157 dc
= get_bits(gb
, 8);
159 dc
= (dc
+ prev_dc
) & 0xFF;
163 nc
= get_vlc2(gb
, c
->nc_vlc
[vlc_set
].table
, 9, 1);
165 return AVERROR_INVALIDDATA
;
168 memset(c
->block
+ 1, 0, 15 * sizeof(*c
->block
));
169 for (l
= 0; l
< nc
; l
++) {
170 ac
= get_vlc2(gb
, c
->ac_vlc
[vlc_set
].table
, 9, 2);
172 return AVERROR_INVALIDDATA
;
174 ac
= get_bits(gb
, 12);
177 return AVERROR_INVALIDDATA
;
178 val
= sign_extend(ac
>> 4, 8);
179 c
->block
[tscc2_zigzag
[bpos
++]] = val
;
181 tscc2_idct4_put(c
->block
, q
, dst
+ k
* 4, stride
);
188 static int tscc2_decode_slice(TSCC2Context
*c
, int mb_y
,
189 const uint8_t *buf
, int buf_size
)
194 init_get_bits(&c
->gb
, buf
, buf_size
* 8);
196 for (mb_x
= 0; mb_x
< c
->mb_width
; mb_x
++) {
197 q
= c
->slice_quants
[mb_x
+ c
->mb_width
* mb_y
];
199 if (q
== 0 || q
== 3) // skip block
201 for (i
= 0; i
< 3; i
++) {
202 off
= mb_x
* 16 + mb_y
* 8 * c
->pic
.linesize
[i
];
203 ret
= tscc2_decode_mb(c
, c
->q
[q
- 1], c
->quant
[q
- 1] - 2,
204 c
->pic
.data
[i
] + off
, c
->pic
.linesize
[i
], i
);
213 static int tscc2_decode_frame(AVCodecContext
*avctx
, void *data
,
214 int *got_frame
, AVPacket
*avpkt
)
216 const uint8_t *buf
= avpkt
->data
;
217 int buf_size
= avpkt
->size
;
218 TSCC2Context
*c
= avctx
->priv_data
;
220 uint32_t frame_type
, size
;
221 int i
, val
, len
, pos
= 0;
222 int num_mb
= c
->mb_width
* c
->mb_height
;
225 bytestream2_init(&gb
, buf
, buf_size
);
226 frame_type
= bytestream2_get_byte(&gb
);
227 if (frame_type
> 1) {
228 av_log(avctx
, AV_LOG_ERROR
, "Incorrect frame type %d\n", frame_type
);
229 return AVERROR_INVALIDDATA
;
232 c
->pic
.reference
= 3;
233 c
->pic
.buffer_hints
= FF_BUFFER_HINTS_VALID
| FF_BUFFER_HINTS_PRESERVE
|
234 FF_BUFFER_HINTS_REUSABLE
;
235 if ((ret
= avctx
->reget_buffer(avctx
, &c
->pic
)) < 0) {
236 av_log(avctx
, AV_LOG_ERROR
, "reget_buffer() failed\n");
240 if (frame_type
== 0) {
242 *(AVFrame
*)data
= c
->pic
;
247 if (bytestream2_get_bytes_left(&gb
) < 4) {
248 av_log(avctx
, AV_LOG_ERROR
, "Frame is too short\n");
249 return AVERROR_INVALIDDATA
;
252 c
->quant
[0] = bytestream2_get_byte(&gb
);
253 c
->quant
[1] = bytestream2_get_byte(&gb
);
254 if (c
->quant
[0] < 2 || c
->quant
[0] > NUM_VLC_SETS
+ 1 ||
255 c
->quant
[1] < 2 || c
->quant
[1] > NUM_VLC_SETS
+ 1) {
256 av_log(avctx
, AV_LOG_ERROR
, "Invalid quantisers %d / %d\n",
257 c
->quant
[0], c
->quant
[1]);
258 return AVERROR_INVALIDDATA
;
261 for (i
= 0; i
< 3; i
++) {
262 c
->q
[0][i
] = tscc2_quants
[c
->quant
[0] - 2][i
];
263 c
->q
[1][i
] = tscc2_quants
[c
->quant
[1] - 2][i
];
266 bytestream2_skip(&gb
, 1);
268 size
= bytestream2_get_le32(&gb
);
269 if (size
> bytestream2_get_bytes_left(&gb
)) {
270 av_log(avctx
, AV_LOG_ERROR
, "Slice properties chunk is too large\n");
271 return AVERROR_INVALIDDATA
;
274 for (i
= 0; i
< size
; i
++) {
275 val
= bytestream2_get_byte(&gb
);
278 if (pos
+ len
> num_mb
) {
279 av_log(avctx
, AV_LOG_ERROR
, "Too many slice properties\n");
280 return AVERROR_INVALIDDATA
;
282 memset(c
->slice_quants
+ pos
, val
, len
);
286 av_log(avctx
, AV_LOG_ERROR
, "Too few slice properties (%d / %d)\n",
288 return AVERROR_INVALIDDATA
;
291 for (i
= 0; i
< c
->mb_height
; i
++) {
292 size
= bytestream2_peek_byte(&gb
);
294 size
= bytestream2_get_byte(&gb
) - 1;
296 size
= bytestream2_get_le32(&gb
) >> 1;
299 int skip_row
= 1, j
, off
= i
* c
->mb_width
;
300 for (j
= 0; j
< c
->mb_width
; j
++) {
301 if (c
->slice_quants
[off
+ j
] == 1 ||
302 c
->slice_quants
[off
+ j
] == 2) {
308 av_log(avctx
, AV_LOG_ERROR
, "Non-skip row with zero size\n");
309 return AVERROR_INVALIDDATA
;
312 if (bytestream2_get_bytes_left(&gb
) < size
) {
313 av_log(avctx
, AV_LOG_ERROR
, "Invalid slice size (%d/%d)\n",
314 size
, bytestream2_get_bytes_left(&gb
));
315 return AVERROR_INVALIDDATA
;
317 ret
= tscc2_decode_slice(c
, i
, buf
+ bytestream2_tell(&gb
), size
);
319 av_log(avctx
, AV_LOG_ERROR
, "Error decoding slice %d\n", i
);
322 bytestream2_skip(&gb
, size
);
326 *(AVFrame
*)data
= c
->pic
;
328 /* always report that the buffer was completely consumed */
332 static av_cold
int tscc2_decode_init(AVCodecContext
*avctx
)
334 TSCC2Context
* const c
= avctx
->priv_data
;
339 avctx
->pix_fmt
= AV_PIX_FMT_YUV444P
;
341 if ((ret
= init_vlcs(c
)) < 0) {
342 av_log(avctx
, AV_LOG_ERROR
, "Cannot initialise VLCs\n");
346 c
->mb_width
= FFALIGN(avctx
->width
, 16) >> 4;
347 c
->mb_height
= FFALIGN(avctx
->height
, 8) >> 3;
348 c
->slice_quants
= av_malloc(c
->mb_width
* c
->mb_height
);
349 if (!c
->slice_quants
) {
350 av_log(avctx
, AV_LOG_ERROR
, "Cannot allocate slice information\n");
352 return AVERROR(ENOMEM
);
355 avctx
->coded_frame
= &c
->pic
;
360 static av_cold
int tscc2_decode_end(AVCodecContext
*avctx
)
362 TSCC2Context
* const c
= avctx
->priv_data
;
365 avctx
->release_buffer(avctx
, &c
->pic
);
366 av_freep(&c
->slice_quants
);
372 AVCodec ff_tscc2_decoder
= {
374 .type
= AVMEDIA_TYPE_VIDEO
,
375 .id
= AV_CODEC_ID_TSCC2
,
376 .priv_data_size
= sizeof(TSCC2Context
),
377 .init
= tscc2_decode_init
,
378 .close
= tscc2_decode_end
,
379 .decode
= tscc2_decode_frame
,
380 .capabilities
= CODEC_CAP_DR1
,
381 .long_name
= NULL_IF_CONFIG_SMALL("TechSmith Screen Codec 2"),