comparison mpegaudiodec.c @ 5050:a5f6fbc9fa66 libavcodec

loosen dependencies over mpegaudiodec
author aurel
date Sun, 20 May 2007 13:40:07 +0000
parents d47ee2d1d7da
children b908c67063c8
comparison
equal deleted inserted replaced
5049:668249bc4c16 5050:a5f6fbc9fa66
40 #ifdef CONFIG_MPEGAUDIO_HP 40 #ifdef CONFIG_MPEGAUDIO_HP
41 # define USE_HIGHPRECISION 41 # define USE_HIGHPRECISION
42 #endif 42 #endif
43 43
44 #include "mpegaudio.h" 44 #include "mpegaudio.h"
45 #include "mpegaudiodecheader.h"
45 46
46 #include "mathops.h" 47 #include "mathops.h"
47 48
48 #define FRAC_ONE (1 << FRAC_BITS) 49 #define FRAC_ONE (1 << FRAC_BITS)
49 50
55 #define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5)) 56 #define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5))
56 57
57 /****************/ 58 /****************/
58 59
59 #define HEADER_SIZE 4 60 #define HEADER_SIZE 4
60 #define BACKSTEP_SIZE 512
61 #define EXTRABYTES 24
62
63 struct GranuleDef;
64
65 typedef struct MPADecodeContext {
66 DECLARE_ALIGNED_8(uint8_t, last_buf[2*BACKSTEP_SIZE + EXTRABYTES]);
67 int last_buf_size;
68 int frame_size;
69 /* next header (used in free format parsing) */
70 uint32_t free_format_next_header;
71 int error_protection;
72 int layer;
73 int sample_rate;
74 int sample_rate_index; /* between 0 and 8 */
75 int bit_rate;
76 GetBitContext gb;
77 GetBitContext in_gb;
78 int nb_channels;
79 int mode;
80 int mode_ext;
81 int lsf;
82 DECLARE_ALIGNED_16(MPA_INT, synth_buf[MPA_MAX_CHANNELS][512 * 2]);
83 int synth_buf_offset[MPA_MAX_CHANNELS];
84 DECLARE_ALIGNED_16(int32_t, sb_samples[MPA_MAX_CHANNELS][36][SBLIMIT]);
85 int32_t mdct_buf[MPA_MAX_CHANNELS][SBLIMIT * 18]; /* previous samples, for layer 3 MDCT */
86 #ifdef DEBUG
87 int frame_count;
88 #endif
89 void (*compute_antialias)(struct MPADecodeContext *s, struct GranuleDef *g);
90 int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3
91 int dither_state;
92 int error_resilience;
93 AVCodecContext* avctx;
94 } MPADecodeContext;
95 61
96 /** 62 /**
97 * Context for MP3On4 decoder 63 * Context for MP3On4 decoder
98 */ 64 */
99 typedef struct MP3On4DecodeContext { 65 typedef struct MP3On4DecodeContext {
1103 t1 = s0 - s1; 1069 t1 = s0 - s1;
1104 out[(9 + 4)*SBLIMIT] = MULH(t1, win[9 + 4]) + buf[9 + 4]; 1070 out[(9 + 4)*SBLIMIT] = MULH(t1, win[9 + 4]) + buf[9 + 4];
1105 out[(8 - 4)*SBLIMIT] = MULH(t1, win[8 - 4]) + buf[8 - 4]; 1071 out[(8 - 4)*SBLIMIT] = MULH(t1, win[8 - 4]) + buf[8 - 4];
1106 buf[9 + 4] = MULH(t0, win[18 + 9 + 4]); 1072 buf[9 + 4] = MULH(t0, win[18 + 9 + 4]);
1107 buf[8 - 4] = MULH(t0, win[18 + 8 - 4]); 1073 buf[8 - 4] = MULH(t0, win[18 + 8 - 4]);
1108 }
1109
1110 /* header decoding. MUST check the header before because no
1111 consistency check is done there. Return 1 if free format found and
1112 that the frame size must be computed externally */
1113 static int decode_header(MPADecodeContext *s, uint32_t header)
1114 {
1115 int sample_rate, frame_size, mpeg25, padding;
1116 int sample_rate_index, bitrate_index;
1117 if (header & (1<<20)) {
1118 s->lsf = (header & (1<<19)) ? 0 : 1;
1119 mpeg25 = 0;
1120 } else {
1121 s->lsf = 1;
1122 mpeg25 = 1;
1123 }
1124
1125 s->layer = 4 - ((header >> 17) & 3);
1126 /* extract frequency */
1127 sample_rate_index = (header >> 10) & 3;
1128 sample_rate = ff_mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25);
1129 sample_rate_index += 3 * (s->lsf + mpeg25);
1130 s->sample_rate_index = sample_rate_index;
1131 s->error_protection = ((header >> 16) & 1) ^ 1;
1132 s->sample_rate = sample_rate;
1133
1134 bitrate_index = (header >> 12) & 0xf;
1135 padding = (header >> 9) & 1;
1136 //extension = (header >> 8) & 1;
1137 s->mode = (header >> 6) & 3;
1138 s->mode_ext = (header >> 4) & 3;
1139 //copyright = (header >> 3) & 1;
1140 //original = (header >> 2) & 1;
1141 //emphasis = header & 3;
1142
1143 if (s->mode == MPA_MONO)
1144 s->nb_channels = 1;
1145 else
1146 s->nb_channels = 2;
1147
1148 if (bitrate_index != 0) {
1149 frame_size = ff_mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index];
1150 s->bit_rate = frame_size * 1000;
1151 switch(s->layer) {
1152 case 1:
1153 frame_size = (frame_size * 12000) / sample_rate;
1154 frame_size = (frame_size + padding) * 4;
1155 break;
1156 case 2:
1157 frame_size = (frame_size * 144000) / sample_rate;
1158 frame_size += padding;
1159 break;
1160 default:
1161 case 3:
1162 frame_size = (frame_size * 144000) / (sample_rate << s->lsf);
1163 frame_size += padding;
1164 break;
1165 }
1166 s->frame_size = frame_size;
1167 } else {
1168 /* if no frame size computed, signal it */
1169 return 1;
1170 }
1171
1172 #if defined(DEBUG)
1173 dprintf(s->avctx, "layer%d, %d Hz, %d kbits/s, ",
1174 s->layer, s->sample_rate, s->bit_rate);
1175 if (s->nb_channels == 2) {
1176 if (s->layer == 3) {
1177 if (s->mode_ext & MODE_EXT_MS_STEREO)
1178 dprintf(s->avctx, "ms-");
1179 if (s->mode_ext & MODE_EXT_I_STEREO)
1180 dprintf(s->avctx, "i-");
1181 }
1182 dprintf(s->avctx, "stereo");
1183 } else {
1184 dprintf(s->avctx, "mono");
1185 }
1186 dprintf(s->avctx, "\n");
1187 #endif
1188 return 0;
1189 }
1190
1191 /* useful helper to get mpeg audio stream infos. Return -1 if error in
1192 header, otherwise the coded frame size in bytes */
1193 int mpa_decode_header(AVCodecContext *avctx, uint32_t head, int *sample_rate)
1194 {
1195 MPADecodeContext s1, *s = &s1;
1196 s1.avctx = avctx;
1197
1198 if (ff_mpa_check_header(head) != 0)
1199 return -1;
1200
1201 if (decode_header(s, head) != 0) {
1202 return -1;
1203 }
1204
1205 switch(s->layer) {
1206 case 1:
1207 avctx->frame_size = 384;
1208 break;
1209 case 2:
1210 avctx->frame_size = 1152;
1211 break;
1212 default:
1213 case 3:
1214 if (s->lsf)
1215 avctx->frame_size = 576;
1216 else
1217 avctx->frame_size = 1152;
1218 break;
1219 }
1220
1221 *sample_rate = s->sample_rate;
1222 avctx->channels = s->nb_channels;
1223 avctx->bit_rate = s->bit_rate;
1224 avctx->sub_id = s->layer;
1225 return s->frame_size;
1226 } 1074 }
1227 1075
1228 /* return the number of decoded frames */ 1076 /* return the number of decoded frames */
1229 static int mp_decode_layer1(MPADecodeContext *s) 1077 static int mp_decode_layer1(MPADecodeContext *s)
1230 { 1078 {