X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fcyuv.c;h=60cce82feeb69f5e5faf72b92fb3469b19428a17;hb=f64e0a2f379c1297dc9b1744999e29ab84646261;hp=4d625e08fb23c417ecd58e0c5470bc39046b98bd;hpb=587d07227eed8021ac38dc352ba72ee5b6714380;p=ffmpeg diff --git a/libavcodec/cyuv.c b/libavcodec/cyuv.c index 4d625e08fb2..60cce82feeb 100644 --- a/libavcodec/cyuv.c +++ b/libavcodec/cyuv.c @@ -1,44 +1,39 @@ /* + * Creative YUV (CYUV) Video Decoder + * by Mike Melanson (melanson@pcisys.net) + * based on "Creative YUV (CYUV) stream format for AVI": + * http://www.csse.monash.edu.au/~timf/videocodec/cyuv.txt * * Copyright (C) 2003 the ffmpeg project * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Creative YUV (CYUV) Video Decoder - * by Mike Melanson (melanson@pcisys.net) - * based on "Creative YUV (CYUV) stream format for AVI": - * http://www.csse.monash.edu.au/~timf/videocodec/cyuv.txt - * */ /** - * @file cyuv.c + * @file * Creative YUV (CYUV) Video Decoder. */ #include #include #include -#include -#include "common.h" #include "avcodec.h" #include "dsputil.h" -#include "mpegvideo.h" typedef struct CyuvDecodeContext { @@ -47,7 +42,7 @@ typedef struct CyuvDecodeContext { AVFrame frame; } CyuvDecodeContext; -static int cyuv_decode_init(AVCodecContext *avctx) +static av_cold int cyuv_decode_init(AVCodecContext *avctx) { CyuvDecodeContext *s = avctx->priv_data; @@ -64,8 +59,10 @@ static int cyuv_decode_init(AVCodecContext *avctx) static int cyuv_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - uint8_t *buf, int buf_size) + AVPacket *avpkt) { + const uint8_t *buf = avpkt->data; + int buf_size = avpkt->size; CyuvDecodeContext *s=avctx->priv_data; unsigned char *y_plane; @@ -76,35 +73,38 @@ static int cyuv_decode_frame(AVCodecContext *avctx, int v_ptr; /* prediction error tables (make it clear that they are signed values) */ - signed char *y_table = (signed char*)buf + 0; - signed char *u_table = (signed char*)buf + 16; - signed char *v_table = (signed char*)buf + 32; + const signed char *y_table = (const signed char*)buf + 0; + const signed char *u_table = (const signed char*)buf + 16; + const signed char *v_table = (const signed char*)buf + 32; unsigned char y_pred, u_pred, v_pred; int stream_ptr; unsigned char cur_byte; int pixel_groups; + if (avctx->codec_id == CODEC_ID_AURA) { + y_table = u_table; + u_table = v_table; + } /* sanity check the buffer size: A buffer has 3x16-bytes tables * followed by (height) lines each with 3 bytes to represent groups * of 4 pixels. Thus, the total size of the buffer ought to be: * (3 * 16) + height * (width * 3 / 4) */ if (buf_size != 48 + s->height * (s->width * 3 / 4)) { - av_log(avctx, AV_LOG_ERROR, "ffmpeg: cyuv: got a buffer with %d bytes when %d were expected\n", - buf_size, - 48 + s->height * (s->width * 3 / 4)); - return -1; + av_log(avctx, AV_LOG_ERROR, "got a buffer with %d bytes when %d were expected\n", + buf_size, 48 + s->height * (s->width * 3 / 4)); + return -1; } /* pixel data starts 48 bytes in, after 3x16-byte tables */ stream_ptr = 48; - if(s->frame.data[0]) + if (s->frame.data[0]) avctx->release_buffer(avctx, &s->frame); s->frame.buffer_hints = FF_BUFFER_HINTS_VALID; s->frame.reference = 0; - if(avctx->get_buffer(avctx, &s->frame) < 0) { + if (avctx->get_buffer(avctx, &s->frame) < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } @@ -167,23 +167,40 @@ static int cyuv_decode_frame(AVCodecContext *avctx, return buf_size; } -static int cyuv_decode_end(AVCodecContext *avctx) +static av_cold int cyuv_decode_end(AVCodecContext *avctx) { -/* CyuvDecodeContext *s = avctx->priv_data;*/ + CyuvDecodeContext *s = avctx->priv_data; + + if (s->frame.data[0]) + avctx->release_buffer(avctx, &s->frame); return 0; } -AVCodec cyuv_decoder = { - "cyuv", - CODEC_TYPE_VIDEO, - CODEC_ID_CYUV, - sizeof(CyuvDecodeContext), - cyuv_decode_init, - NULL, - cyuv_decode_end, - cyuv_decode_frame, - CODEC_CAP_DR1, - NULL +#if CONFIG_AURA_DECODER +AVCodec ff_aura_decoder = { + .name = "aura", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_AURA, + .priv_data_size = sizeof(CyuvDecodeContext), + .init = cyuv_decode_init, + .close = cyuv_decode_end, + .decode = cyuv_decode_frame, + .capabilities = CODEC_CAP_DR1, + .long_name = NULL_IF_CONFIG_SMALL("Auravision AURA"), }; - +#endif + +#if CONFIG_CYUV_DECODER +AVCodec ff_cyuv_decoder = { + .name = "cyuv", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_CYUV, + .priv_data_size = sizeof(CyuvDecodeContext), + .init = cyuv_decode_init, + .close = cyuv_decode_end, + .decode = cyuv_decode_frame, + .capabilities = CODEC_CAP_DR1, + .long_name = NULL_IF_CONFIG_SMALL("Creative YUV (CYUV)"), +}; +#endif