From 3aff069b580503c1a21315e9fe539d02f210648d Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sun, 27 Jul 2003 20:20:31 +0000 Subject: CLJR decoding support Originally committed as revision 2090 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/cljr.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 libavcodec/cljr.c (limited to 'libavcodec/cljr.c') diff --git a/libavcodec/cljr.c b/libavcodec/cljr.c new file mode 100644 index 0000000000..4611d61004 --- /dev/null +++ b/libavcodec/cljr.c @@ -0,0 +1,177 @@ +/* + * Cirrus Logic AccuPak (CLJR) codec + * Copyright (c) 2003 Alex Beregszaszi + * + * This library 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 of the License, or (at your option) any later version. + * + * This library 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/** + * @file cljr.c + * Cirrus Logic AccuPak codec. + */ + +#include "avcodec.h" +#include "mpegvideo.h" + +typedef struct CLJRContext{ + AVCodecContext *avctx; + AVFrame picture; + int delta[16]; + int offset[4]; + GetBitContext gb; +} CLJRContext; + +static int decode_frame(AVCodecContext *avctx, + void *data, int *data_size, + uint8_t *buf, int buf_size) +{ + CLJRContext * const a = avctx->priv_data; + AVFrame *picture = data; + AVFrame * const p= (AVFrame*)&a->picture; + uint8_t *bytestream= buf; + int i, x, y; + + *data_size = 0; + + /* special case for last picture */ + if (buf_size == 0) { + return 0; + } + + if(p->data[0]) + avctx->release_buffer(avctx, p); + + p->reference= 0; + if(avctx->get_buffer(avctx, p) < 0){ + fprintf(stderr, "get_buffer() failed\n"); + return -1; + } + p->pict_type= I_TYPE; + p->key_frame= 1; + + init_get_bits(&a->gb, buf, buf_size); + + for(y=0; yheight; y++){ + int offset; + uint8_t *luma= &a->picture.data[0][ y*a->picture.linesize[0] ]; + uint8_t *cb= &a->picture.data[1][ (y>>2)*a->picture.linesize[1] ]; + uint8_t *cr= &a->picture.data[2][ (y>>2)*a->picture.linesize[2] ]; + + for(x=0; xwidth; x+=4){ + luma[3] = get_bits(&a->gb, 5) << 3; + luma[2] = get_bits(&a->gb, 5) << 3; + luma[1] = get_bits(&a->gb, 5) << 3; + luma[0] = get_bits(&a->gb, 5) << 3; + luma+= 4; + *(cb++) = get_bits(&a->gb, 6) << 2; + *(cr++) = get_bits(&a->gb, 6) << 2; + } + } + + *picture= *(AVFrame*)&a->picture; + *data_size = sizeof(AVPicture); + + emms_c(); + + return buf_size; +} + +#if 0 +static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ + CLJRContext * const a = avctx->priv_data; + AVFrame *pict = data; + AVFrame * const p= (AVFrame*)&a->picture; + int size; + int mb_x, mb_y; + + *p = *pict; + p->pict_type= I_TYPE; + p->key_frame= 1; + + emms_c(); + + align_put_bits(&a->pb); + while(get_bit_count(&a->pb)&31) + put_bits(&a->pb, 8, 0); + + size= get_bit_count(&a->pb)/32; + + return size*4; +} +#endif + +static void common_init(AVCodecContext *avctx){ + CLJRContext * const a = avctx->priv_data; + + avctx->coded_frame= (AVFrame*)&a->picture; + a->avctx= avctx; +} + +static int decode_init(AVCodecContext *avctx){ + CLJRContext * const a = avctx->priv_data; + AVFrame *p= (AVFrame*)&a->picture; + int i; + + common_init(avctx); + + avctx->pix_fmt= PIX_FMT_YUV410P; + + return 0; +} + +static int encode_init(AVCodecContext *avctx){ + CLJRContext * const a = avctx->priv_data; + int i; + + common_init(avctx); + + return 0; +} + +static int decode_end(AVCodecContext *avctx){ + CLJRContext * const a = avctx->priv_data; + + avcodec_default_free_buffers(avctx); + + return 0; +} + +AVCodec cljr_decoder = { + "cljr", + CODEC_TYPE_VIDEO, + CODEC_ID_CLJR, + sizeof(CLJRContext), + decode_init, + NULL, + decode_end, + decode_frame, + CODEC_CAP_DR1, +}; +#if 0 +#ifdef CONFIG_ENCODERS + +AVCodec cljr_encoder = { + "cljr", + CODEC_TYPE_VIDEO, + CODEC_ID_cljr, + sizeof(CLJRContext), + encode_init, + encode_frame, + //encode_end, +}; + +#endif //CONFIG_ENCODERS +#endif -- cgit v1.2.3