00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "libavutil/intreadwrite.h"
00024 #include "dsputil.h"
00025 #include "get_bits.h"
00026 #include "avcodec.h"
00027 #include "internal.h"
00028
00029 typedef struct CLLCContext {
00030 DSPContext dsp;
00031 AVCodecContext *avctx;
00032
00033 uint8_t *swapped_buf;
00034 int swapped_buf_size;
00035 } CLLCContext;
00036
00037 static int read_code_table(CLLCContext *ctx, GetBitContext *gb, VLC *vlc)
00038 {
00039 uint8_t symbols[256];
00040 uint8_t bits[256];
00041 uint16_t codes[256];
00042 int num_lens, num_codes, num_codes_sum, prefix;
00043 int i, j, count;
00044
00045 prefix = 0;
00046 count = 0;
00047 num_codes_sum = 0;
00048
00049 num_lens = get_bits(gb, 5);
00050
00051 for (i = 0; i < num_lens; i++) {
00052 num_codes = get_bits(gb, 9);
00053 num_codes_sum += num_codes;
00054
00055 if (num_codes_sum > 256) {
00056 vlc->table = NULL;
00057
00058 av_log(ctx->avctx, AV_LOG_ERROR,
00059 "Too many VLCs (%d) to be read.\n", num_codes_sum);
00060 return AVERROR_INVALIDDATA;
00061 }
00062
00063 for (j = 0; j < num_codes; j++) {
00064 symbols[count] = get_bits(gb, 8);
00065 bits[count] = i + 1;
00066 codes[count] = prefix++;
00067
00068 count++;
00069 }
00070
00071 prefix <<= 1;
00072 }
00073
00074 return ff_init_vlc_sparse(vlc, 7, count, bits, 1, 1,
00075 codes, 2, 2, symbols, 1, 1, 0);
00076 }
00077
00078
00079
00080
00081
00082 static int read_argb_line(CLLCContext *ctx, GetBitContext *gb, int *top_left,
00083 VLC *vlc, uint8_t *outbuf)
00084 {
00085 uint8_t *dst;
00086 int pred[4];
00087 int code;
00088 int i;
00089
00090 OPEN_READER(bits, gb);
00091
00092 dst = outbuf;
00093 pred[0] = top_left[0];
00094 pred[1] = top_left[1];
00095 pred[2] = top_left[2];
00096 pred[3] = top_left[3];
00097
00098 for (i = 0; i < ctx->avctx->width; i++) {
00099
00100 UPDATE_CACHE(bits, gb);
00101 GET_VLC(code, bits, gb, vlc[0].table, 7, 2);
00102
00103 pred[0] += code;
00104 dst[0] = pred[0];
00105
00106
00107 if (dst[0]) {
00108
00109 UPDATE_CACHE(bits, gb);
00110 GET_VLC(code, bits, gb, vlc[1].table, 7, 2);
00111
00112 pred[1] += code;
00113 dst[1] = pred[1];
00114
00115
00116 UPDATE_CACHE(bits, gb);
00117 GET_VLC(code, bits, gb, vlc[2].table, 7, 2);
00118
00119 pred[2] += code;
00120 dst[2] = pred[2];
00121
00122
00123 UPDATE_CACHE(bits, gb);
00124 GET_VLC(code, bits, gb, vlc[3].table, 7, 2);
00125
00126 pred[3] += code;
00127 dst[3] = pred[3];
00128 } else {
00129 dst[1] = 0;
00130 dst[2] = 0;
00131 dst[3] = 0;
00132 }
00133
00134 dst += 4;
00135 }
00136
00137 CLOSE_READER(bits, gb);
00138
00139 dst -= 4 * ctx->avctx->width;
00140 top_left[0] = dst[0];
00141
00142
00143 if (top_left[0]) {
00144 top_left[1] = dst[1];
00145 top_left[2] = dst[2];
00146 top_left[3] = dst[3];
00147 }
00148
00149 return 0;
00150 }
00151
00152 static int read_rgb24_component_line(CLLCContext *ctx, GetBitContext *gb,
00153 int *top_left, VLC *vlc, uint8_t *outbuf)
00154 {
00155 uint8_t *dst;
00156 int pred, code;
00157 int i;
00158
00159 OPEN_READER(bits, gb);
00160
00161 dst = outbuf;
00162 pred = *top_left;
00163
00164
00165 for (i = 0; i < ctx->avctx->width; i++) {
00166 UPDATE_CACHE(bits, gb);
00167 GET_VLC(code, bits, gb, vlc->table, 7, 2);
00168
00169 pred += code;
00170 dst[0] = pred;
00171 dst += 3;
00172 }
00173
00174 CLOSE_READER(bits, gb);
00175
00176
00177 *top_left = dst[-3 * ctx->avctx->width];
00178
00179 return 0;
00180 }
00181
00182 static int decode_argb_frame(CLLCContext *ctx, GetBitContext *gb, AVFrame *pic)
00183 {
00184 AVCodecContext *avctx = ctx->avctx;
00185 uint8_t *dst;
00186 int pred[4];
00187 int ret;
00188 int i, j;
00189 VLC vlc[4];
00190
00191 pred[0] = 0;
00192 pred[1] = 0x80;
00193 pred[2] = 0x80;
00194 pred[3] = 0x80;
00195
00196 dst = pic->data[0];
00197
00198 skip_bits(gb, 16);
00199
00200
00201 for (i = 0; i < 4; i++) {
00202 ret = read_code_table(ctx, gb, &vlc[i]);
00203 if (ret < 0) {
00204 for (j = 0; j <= i; j++)
00205 ff_free_vlc(&vlc[j]);
00206
00207 av_log(ctx->avctx, AV_LOG_ERROR,
00208 "Could not read code table %d.\n", i);
00209 return ret;
00210 }
00211 }
00212
00213
00214 for (i = 0; i < avctx->height; i++) {
00215 read_argb_line(ctx, gb, pred, vlc, dst);
00216
00217 dst += pic->linesize[0];
00218 }
00219
00220 for (i = 0; i < 4; i++)
00221 ff_free_vlc(&vlc[i]);
00222
00223 return 0;
00224 }
00225
00226 static int decode_rgb24_frame(CLLCContext *ctx, GetBitContext *gb, AVFrame *pic)
00227 {
00228 AVCodecContext *avctx = ctx->avctx;
00229 uint8_t *dst;
00230 int pred[3];
00231 int ret;
00232 int i, j;
00233 VLC vlc[3];
00234
00235 pred[0] = 0x80;
00236 pred[1] = 0x80;
00237 pred[2] = 0x80;
00238
00239 dst = pic->data[0];
00240
00241 skip_bits(gb, 16);
00242
00243
00244 for (i = 0; i < 3; i++) {
00245 ret = read_code_table(ctx, gb, &vlc[i]);
00246 if (ret < 0) {
00247 for (j = 0; j <= i; j++)
00248 ff_free_vlc(&vlc[j]);
00249
00250 av_log(ctx->avctx, AV_LOG_ERROR,
00251 "Could not read code table %d.\n", i);
00252 return ret;
00253 }
00254 }
00255
00256
00257 for (i = 0; i < avctx->height; i++) {
00258 for (j = 0; j < 3; j++)
00259 read_rgb24_component_line(ctx, gb, &pred[j], &vlc[j], &dst[j]);
00260
00261 dst += pic->linesize[0];
00262 }
00263
00264 for (i = 0; i < 3; i++)
00265 ff_free_vlc(&vlc[i]);
00266
00267 return 0;
00268 }
00269
00270 static int cllc_decode_frame(AVCodecContext *avctx, void *data,
00271 int *got_picture_ptr, AVPacket *avpkt)
00272 {
00273 CLLCContext *ctx = avctx->priv_data;
00274 AVFrame *pic = avctx->coded_frame;
00275 uint8_t *src = avpkt->data;
00276 uint32_t info_tag, info_offset;
00277 int data_size;
00278 GetBitContext gb;
00279 int coding_type, ret;
00280
00281 if (pic->data[0])
00282 avctx->release_buffer(avctx, pic);
00283
00284 pic->reference = 0;
00285
00286
00287 info_offset = 0;
00288 info_tag = AV_RL32(src);
00289 if (info_tag == MKTAG('I', 'N', 'F', 'O')) {
00290 info_offset = AV_RL32(src + 4);
00291 if (info_offset > UINT32_MAX - 8 || info_offset + 8 > avpkt->size) {
00292 av_log(avctx, AV_LOG_ERROR,
00293 "Invalid INFO header offset: 0x%08X is too large.\n",
00294 info_offset);
00295 return AVERROR_INVALIDDATA;
00296 }
00297
00298 info_offset += 8;
00299 src += info_offset;
00300
00301 av_log(avctx, AV_LOG_DEBUG, "Skipping INFO chunk.\n");
00302 }
00303
00304 data_size = (avpkt->size - info_offset) & ~1;
00305
00306
00307 av_fast_padded_malloc(&ctx->swapped_buf,
00308 &ctx->swapped_buf_size, data_size);
00309 if (!ctx->swapped_buf) {
00310 av_log(avctx, AV_LOG_ERROR, "Could not allocate swapped buffer.\n");
00311 return AVERROR(ENOMEM);
00312 }
00313
00314
00315 ctx->dsp.bswap16_buf((uint16_t *) ctx->swapped_buf, (uint16_t *) src,
00316 data_size / 2);
00317
00318 init_get_bits(&gb, ctx->swapped_buf, data_size * 8);
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 coding_type = (AV_RL32(src) >> 8) & 0xFF;
00329 av_log(avctx, AV_LOG_DEBUG, "Frame coding type: %d\n", coding_type);
00330
00331 switch (coding_type) {
00332 case 1:
00333 case 2:
00334 avctx->pix_fmt = AV_PIX_FMT_RGB24;
00335 avctx->bits_per_raw_sample = 8;
00336
00337 ret = ff_get_buffer(avctx, pic);
00338 if (ret < 0) {
00339 av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
00340 return ret;
00341 }
00342
00343 ret = decode_rgb24_frame(ctx, &gb, pic);
00344 if (ret < 0)
00345 return ret;
00346
00347 break;
00348 case 3:
00349 avctx->pix_fmt = AV_PIX_FMT_ARGB;
00350 avctx->bits_per_raw_sample = 8;
00351
00352 ret = ff_get_buffer(avctx, pic);
00353 if (ret < 0) {
00354 av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
00355 return ret;
00356 }
00357
00358 ret = decode_argb_frame(ctx, &gb, pic);
00359 if (ret < 0)
00360 return ret;
00361
00362 break;
00363 default:
00364 av_log(avctx, AV_LOG_ERROR, "Unknown coding type: %d.\n", coding_type);
00365 return AVERROR_INVALIDDATA;
00366 }
00367
00368 pic->key_frame = 1;
00369 pic->pict_type = AV_PICTURE_TYPE_I;
00370
00371 *got_picture_ptr = 1;
00372 *(AVFrame *)data = *pic;
00373
00374 return avpkt->size;
00375 }
00376
00377 static av_cold int cllc_decode_close(AVCodecContext *avctx)
00378 {
00379 CLLCContext *ctx = avctx->priv_data;
00380
00381 if (avctx->coded_frame->data[0])
00382 avctx->release_buffer(avctx, avctx->coded_frame);
00383
00384 av_freep(&avctx->coded_frame);
00385 av_freep(&ctx->swapped_buf);
00386
00387 return 0;
00388 }
00389
00390 static av_cold int cllc_decode_init(AVCodecContext *avctx)
00391 {
00392 CLLCContext *ctx = avctx->priv_data;
00393
00394
00395 ctx->avctx = avctx;
00396 ctx->swapped_buf = NULL;
00397 ctx->swapped_buf_size = 0;
00398
00399 ff_dsputil_init(&ctx->dsp, avctx);
00400
00401 avctx->coded_frame = avcodec_alloc_frame();
00402 if (!avctx->coded_frame) {
00403 av_log(avctx, AV_LOG_ERROR, "Could not allocate frame.\n");
00404 return AVERROR(ENOMEM);
00405 }
00406
00407 return 0;
00408 }
00409
00410 AVCodec ff_cllc_decoder = {
00411 .name = "cllc",
00412 .type = AVMEDIA_TYPE_VIDEO,
00413 .id = AV_CODEC_ID_CLLC,
00414 .priv_data_size = sizeof(CLLCContext),
00415 .init = cllc_decode_init,
00416 .decode = cllc_decode_frame,
00417 .close = cllc_decode_close,
00418 .capabilities = CODEC_CAP_DR1,
00419 .long_name = NULL_IF_CONFIG_SMALL("Canopus Lossless Codec"),
00420 };