| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Wing Commander/Xan Video Decoder | 2 * Wing Commander/Xan Video Decoder |
| 3 * Copyright (C) 2003 the ffmpeg project | 3 * Copyright (C) 2003 the ffmpeg project |
| 4 * | 4 * |
| 5 * This file is part of FFmpeg. | 5 * This file is part of FFmpeg. |
| 6 * | 6 * |
| 7 * FFmpeg is free software; you can redistribute it and/or | 7 * FFmpeg is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Lesser General Public | 8 * modify it under the terms of the GNU Lesser General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2.1 of the License, or (at your option) any later version. | 10 * version 2.1 of the License, or (at your option) any later version. |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 | 61 |
| 62 static av_cold int xan_decode_init(AVCodecContext *avctx) | 62 static av_cold int xan_decode_init(AVCodecContext *avctx) |
| 63 { | 63 { |
| 64 XanContext *s = avctx->priv_data; | 64 XanContext *s = avctx->priv_data; |
| 65 | 65 |
| 66 s->avctx = avctx; | 66 s->avctx = avctx; |
| 67 s->frame_size = 0; | 67 s->frame_size = 0; |
| 68 | 68 |
| 69 if ((avctx->codec->id == CODEC_ID_XAN_WC3) && | 69 if ((avctx->codec->id == CODEC_ID_XAN_WC3) && |
| 70 (s->avctx->palctrl == NULL)) { | 70 (s->avctx->palctrl == NULL)) { |
| 71 av_log(avctx, AV_LOG_ERROR, " WC3 Xan video: palette expected.\n"); | 71 av_log(avctx, AV_LOG_ERROR, "palette expected\n"); |
| 72 return -1; | 72 return AVERROR(EINVAL); |
| 73 } | 73 } |
| 74 | 74 |
| 75 avctx->pix_fmt = PIX_FMT_PAL8; | 75 avctx->pix_fmt = PIX_FMT_PAL8; |
| 76 | 76 |
| 77 s->buffer1_size = avctx->width * avctx->height; | 77 s->buffer1_size = avctx->width * avctx->height; |
| 78 s->buffer1 = av_malloc(s->buffer1_size); | 78 s->buffer1 = av_malloc(s->buffer1_size); |
| 79 if (!s->buffer1) | 79 if (!s->buffer1) |
| 80 return -1; | 80 return AVERROR(ENOMEM); |
| 81 s->buffer2_size = avctx->width * avctx->height; | 81 s->buffer2_size = avctx->width * avctx->height; |
| 82 s->buffer2 = av_malloc(s->buffer2_size + 130); | 82 s->buffer2 = av_malloc(s->buffer2_size + 130); |
| 83 if (!s->buffer2) { | 83 if (!s->buffer2) { |
| 84 av_freep(&s->buffer1); | 84 av_freep(&s->buffer1); |
| 85 return -1; | 85 return AVERROR(ENOMEM); |
| 86 } | 86 } |
| 87 | 87 |
| 88 return 0; | 88 return 0; |
| 89 } | 89 } |
| 90 | 90 |
| 91 static int xan_huffman_decode(unsigned char *dest, const unsigned char *src, | 91 static int xan_huffman_decode(unsigned char *dest, const unsigned char *src, |
| 92 int dest_len) | 92 int dest_len) |
| 93 { | 93 { |
| 94 unsigned char byte = *src++; | 94 unsigned char byte = *src++; |
| 95 unsigned char ival = byte + 0x16; | 95 unsigned char ival = byte + 0x16; |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 } | 352 } |
| 353 | 353 |
| 354 static void xan_wc4_decode_frame(XanContext *s) { | 354 static void xan_wc4_decode_frame(XanContext *s) { |
| 355 } | 355 } |
| 356 | 356 |
| 357 static int xan_decode_frame(AVCodecContext *avctx, | 357 static int xan_decode_frame(AVCodecContext *avctx, |
| 358 void *data, int *data_size, | 358 void *data, int *data_size, |
| 359 AVPacket *avpkt) | 359 AVPacket *avpkt) |
| 360 { | 360 { |
| 361 const uint8_t *buf = avpkt->data; | 361 const uint8_t *buf = avpkt->data; |
| 362 int buf_size = avpkt->size; | 362 int ret, buf_size = avpkt->size; |
| 363 XanContext *s = avctx->priv_data; | 363 XanContext *s = avctx->priv_data; |
| 364 AVPaletteControl *palette_control = avctx->palctrl; | 364 AVPaletteControl *palette_control = avctx->palctrl; |
| 365 | 365 |
| 366 if (avctx->get_buffer(avctx, &s->current_frame)) { | 366 if ((ret = avctx->get_buffer(avctx, &s->current_frame))) { |
| 367 av_log(s->avctx, AV_LOG_ERROR, " Xan Video: get_buffer() failed\n"); | 367 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
| 368 return -1; | 368 return ret; |
| 369 } | 369 } |
| 370 s->current_frame.reference = 3; | 370 s->current_frame.reference = 3; |
| 371 | 371 |
| 372 if (!s->frame_size) | 372 if (!s->frame_size) |
| 373 s->frame_size = s->current_frame.linesize[0] * s->avctx->height; | 373 s->frame_size = s->current_frame.linesize[0] * s->avctx->height; |
| 374 | 374 |
| 375 palette_control->palette_changed = 0; | 375 palette_control->palette_changed = 0; |
| 376 memcpy(s->current_frame.data[1], palette_control->palette, | 376 memcpy(s->current_frame.data[1], palette_control->palette, |
| 377 AVPALETTE_SIZE); | 377 AVPALETTE_SIZE); |
| 378 s->current_frame.palette_has_changed = 1; | 378 s->current_frame.palette_has_changed = 1; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 CODEC_ID_XAN_WC4, | 435 CODEC_ID_XAN_WC4, |
| 436 sizeof(XanContext), | 436 sizeof(XanContext), |
| 437 xan_decode_init, | 437 xan_decode_init, |
| 438 NULL, | 438 NULL, |
| 439 xan_decode_end, | 439 xan_decode_end, |
| 440 xan_decode_frame, | 440 xan_decode_frame, |
| 441 CODEC_CAP_DR1, | 441 CODEC_CAP_DR1, |
| 442 .long_name = NULL_IF_CONFIG_SMALL("Wing Commander IV / Xxan"), | 442 .long_name = NULL_IF_CONFIG_SMALL("Wing Commander IV / Xxan"), |
| 443 }; | 443 }; |
| 444 */ | 444 */ |
| OLD | NEW |