From 3aff069b580503c1a21315e9fe539d02f210648d Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sun, 27 Jul 2003 20:20:31 +0000 Subject: [PATCH] CLJR decoding support Originally committed as revision 2090 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/Makefile | 2 +- libavcodec/allcodecs.c | 1 + libavcodec/avcodec.h | 2 + libavcodec/cljr.c | 177 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 libavcodec/cljr.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 8d48d97996..de2b970f18 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -17,7 +17,7 @@ OBJS= common.o utils.o mem.o allcodecs.o \ mpeg12.o mpegaudiodec.o pcm.o simple_idct.o \ ratecontrol.o adpcm.o eval.o dv.o error_resilience.o \ fft.o mdct.o mace.o huffyuv.o cyuv.o opts.o raw.o h264.o golomb.o \ - vp3.o asv1.o 4xm.o cabac.o ffv1.o ra144.o ra288.o vcr1.o + vp3.o asv1.o 4xm.o cabac.o ffv1.o ra144.o ra288.o vcr1.o cljr.o ifeq ($(AMR_NB),yes) ifeq ($(AMR_NB_FIXED),yes) diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index c364f228da..f14844200d 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -114,6 +114,7 @@ void avcodec_register_all(void) register_avcodec(&vp3_decoder); register_avcodec(&asv1_decoder); register_avcodec(&vcr1_decoder); + register_avcodec(&cljr_decoder); register_avcodec(&fourxm_decoder); #ifdef CONFIG_AC3 register_avcodec(&ac3_decoder); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 329fa4cba1..e61dd43a46 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -62,6 +62,7 @@ enum CodecID { CODEC_ID_FFV1, CODEC_ID_4XM, CODEC_ID_VCR1, + CODEC_ID_CLJR, /* various pcm "codecs" */ CODEC_ID_PCM_S16LE, @@ -1307,6 +1308,7 @@ extern AVCodec aac_decoder; extern AVCodec mpeg4aac_decoder; extern AVCodec asv1_decoder; extern AVCodec vcr1_decoder; +extern AVCodec cljr_decoder; extern AVCodec ffv1_decoder; extern AVCodec fourxm_decoder; extern AVCodec ra_144_decoder; 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