annotate cljr.c @ 5310:9aa9197034d7 libavcodec

AC-3 decoder, soc revision 40, Aug 9 00:10:14 2006 UTC by cloud9 More code cleanup. Window is now runtime generated. Fixed the bugs in rematrixing routine and in Decoding AC3 Bitstreams when coupling is in use. Still struggling to find out what affects the quality of the produced sound. Can anybody have a look at the imdct routines do_imdct_256 and do_imdct_512 and tell me whether it is the correctly implemented as described in standard.
author jbr
date Sat, 14 Jul 2007 15:57:51 +0000
parents 2b72f9bc4f06
children 042a48b6de72
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
1 /*
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
2 * Cirrus Logic AccuPak (CLJR) codec
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
3 * Copyright (c) 2003 Alex Beregszaszi
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
15 * Lesser General Public License for more details.
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
16 *
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
21
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
22 /**
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
23 * @file cljr.c
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
24 * Cirrus Logic AccuPak codec.
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
25 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
26
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
27 #include "avcodec.h"
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
28 #include "mpegvideo.h"
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
29
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
30 typedef struct CLJRContext{
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
31 AVCodecContext *avctx;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
32 AVFrame picture;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
33 int delta[16];
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
34 int offset[4];
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
35 GetBitContext gb;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
36 } CLJRContext;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
37
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
38 static int decode_frame(AVCodecContext *avctx,
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
39 void *data, int *data_size,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
40 uint8_t *buf, int buf_size)
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
41 {
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
42 CLJRContext * const a = avctx->priv_data;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
43 AVFrame *picture = data;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
44 AVFrame * const p= (AVFrame*)&a->picture;
1415
9a218b289ee0 removed unused variables
bellard
parents: 1386
diff changeset
45 int x, y;
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
46
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
47 if(p->data[0])
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
48 avctx->release_buffer(avctx, p);
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
49
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
50 p->reference= 0;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
51 if(avctx->get_buffer(avctx, p) < 0){
1598
932d306bf1dc av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 1415
diff changeset
52 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
53 return -1;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
54 }
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
55 p->pict_type= I_TYPE;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
56 p->key_frame= 1;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
57
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
58 init_get_bits(&a->gb, buf, buf_size);
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
59
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
60 for(y=0; y<avctx->height; y++){
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
61 uint8_t *luma= &a->picture.data[0][ y*a->picture.linesize[0] ];
1386
5cabff29411e 410p -> 411p
al3x
parents: 1385
diff changeset
62 uint8_t *cb= &a->picture.data[1][ y*a->picture.linesize[1] ];
5cabff29411e 410p -> 411p
al3x
parents: 1385
diff changeset
63 uint8_t *cr= &a->picture.data[2][ y*a->picture.linesize[2] ];
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
64 for(x=0; x<avctx->width; x+=4){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
65 luma[3] = get_bits(&a->gb, 5) << 3;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
66 luma[2] = get_bits(&a->gb, 5) << 3;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
67 luma[1] = get_bits(&a->gb, 5) << 3;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
68 luma[0] = get_bits(&a->gb, 5) << 3;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
69 luma+= 4;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
70 *(cb++) = get_bits(&a->gb, 6) << 2;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
71 *(cr++) = get_bits(&a->gb, 6) << 2;
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
72 }
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
73 }
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
74
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
75 *picture= *(AVFrame*)&a->picture;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
76 *data_size = sizeof(AVPicture);
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
77
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
78 emms_c();
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
79
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
80 return buf_size;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
81 }
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
82
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
83 #if 0
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
84 static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
85 CLJRContext * const a = avctx->priv_data;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
86 AVFrame *pict = data;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
87 AVFrame * const p= (AVFrame*)&a->picture;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
88 int size;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
89 int mb_x, mb_y;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
90
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
91 *p = *pict;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
92 p->pict_type= I_TYPE;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
93 p->key_frame= 1;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
94
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
95 emms_c();
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
96
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
97 align_put_bits(&a->pb);
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
98 while(get_bit_count(&a->pb)&31)
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
99 put_bits(&a->pb, 8, 0);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
100
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
101 size= get_bit_count(&a->pb)/32;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
102
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
103 return size*4;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
104 }
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
105 #endif
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
106
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
107 static void common_init(AVCodecContext *avctx){
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
108 CLJRContext * const a = avctx->priv_data;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
109
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
110 avctx->coded_frame= (AVFrame*)&a->picture;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
111 a->avctx= avctx;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
112 }
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
113
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
114 static int decode_init(AVCodecContext *avctx){
1415
9a218b289ee0 removed unused variables
bellard
parents: 1386
diff changeset
115
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
116 common_init(avctx);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
117
1386
5cabff29411e 410p -> 411p
al3x
parents: 1385
diff changeset
118 avctx->pix_fmt= PIX_FMT_YUV411P;
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
119
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
120 return 0;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
121 }
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
122
2522
e25782262d7d kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 2453
diff changeset
123 #if 0
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
124 static int encode_init(AVCodecContext *avctx){
1415
9a218b289ee0 removed unused variables
bellard
parents: 1386
diff changeset
125
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
126 common_init(avctx);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2522
diff changeset
127
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
128 return 0;
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
129 }
2522
e25782262d7d kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents: 2453
diff changeset
130 #endif
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
131
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
132 AVCodec cljr_decoder = {
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
133 "cljr",
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
134 CODEC_TYPE_VIDEO,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
135 CODEC_ID_CLJR,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
136 sizeof(CLJRContext),
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
137 decode_init,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
138 NULL,
1994
8d3540dddd1b cleanup & memleak fix
michael
parents: 1598
diff changeset
139 NULL,
1385
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
140 decode_frame,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
141 CODEC_CAP_DR1,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
142 };
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
143 #if 0
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
144 #ifdef CONFIG_ENCODERS
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
145
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
146 AVCodec cljr_encoder = {
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
147 "cljr",
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
148 CODEC_TYPE_VIDEO,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
149 CODEC_ID_cljr,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
150 sizeof(CLJRContext),
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
151 encode_init,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
152 encode_frame,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
153 //encode_end,
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
154 };
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
155
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
156 #endif //CONFIG_ENCODERS
a16990d50fce CLJR decoding support
al3x
parents:
diff changeset
157 #endif