00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_AV_CONFIG_H
00023 #undef HAVE_AV_CONFIG_H
00024 #endif
00025
00026 #include "avcodec.h"
00027 #include <dts.h>
00028
00029 #include <stdlib.h>
00030 #include <string.h>
00031
00032 #ifdef HAVE_MALLOC_H
00033 #include <malloc.h>
00034 #endif
00035
00036 #define INBUF_SIZE 4096
00037 #define BUFFER_SIZE 4096
00038 #define HEADER_SIZE 14
00039
00040 #ifdef LIBDTS_FIXED
00041 #define CONVERT_LEVEL (1 << 26)
00042 #define CONVERT_BIAS 0
00043 #else
00044 #define CONVERT_LEVEL 1
00045 #define CONVERT_BIAS 384
00046 #endif
00047
00048 static inline
00049 int16_t convert (int32_t i)
00050 {
00051 #ifdef LIBDTS_FIXED
00052 i >>= 15;
00053 #else
00054 i -= 0x43c00000;
00055 #endif
00056 return (i > 32767) ? 32767 : ((i < -32768) ? -32768 : i);
00057 }
00058
00059 void
00060 convert2s16_2 (sample_t * _f, int16_t * s16)
00061 {
00062 int i;
00063 int32_t * f = (int32_t *) _f;
00064
00065 for (i = 0; i < 256; i++)
00066 {
00067 s16[2*i] = convert (f[i]);
00068 s16[2*i+1] = convert (f[i+256]);
00069 }
00070 }
00071
00072 void
00073 convert2s16_4 (sample_t * _f, int16_t * s16)
00074 {
00075 int i;
00076 int32_t * f = (int32_t *) _f;
00077
00078 for (i = 0; i < 256; i++)
00079 {
00080 s16[4*i] = convert (f[i]);
00081 s16[4*i+1] = convert (f[i+256]);
00082 s16[4*i+2] = convert (f[i+512]);
00083 s16[4*i+3] = convert (f[i+768]);
00084 }
00085 }
00086
00087 void
00088 convert2s16_5 (sample_t * _f, int16_t * s16)
00089 {
00090 int i;
00091 int32_t * f = (int32_t *) _f;
00092
00093 for (i = 0; i < 256; i++)
00094 {
00095 s16[5*i] = convert (f[i]);
00096 s16[5*i+1] = convert (f[i+256]);
00097 s16[5*i+2] = convert (f[i+512]);
00098 s16[5*i+3] = convert (f[i+768]);
00099 s16[5*i+4] = convert (f[i+1024]);
00100 }
00101 }
00102
00103 static void
00104 convert2s16_multi (sample_t * _f, int16_t * s16, int flags)
00105 {
00106 int i;
00107 int32_t * f = (int32_t *) _f;
00108
00109 switch (flags)
00110 {
00111 case DTS_MONO:
00112 for (i = 0; i < 256; i++)
00113 {
00114 s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0;
00115 s16[5*i+4] = convert (f[i]);
00116 }
00117 break;
00118 case DTS_CHANNEL:
00119 case DTS_STEREO:
00120 case DTS_DOLBY:
00121 convert2s16_2 (_f, s16);
00122 break;
00123 case DTS_3F:
00124 for (i = 0; i < 256; i++)
00125 {
00126 s16[5*i] = convert (f[i]);
00127 s16[5*i+1] = convert (f[i+512]);
00128 s16[5*i+2] = s16[5*i+3] = 0;
00129 s16[5*i+4] = convert (f[i+256]);
00130 }
00131 break;
00132 case DTS_2F2R:
00133 convert2s16_4 (_f, s16);
00134 break;
00135 case DTS_3F2R:
00136 convert2s16_5 (_f, s16);
00137 break;
00138 case DTS_MONO | DTS_LFE:
00139 for (i = 0; i < 256; i++)
00140 {
00141 s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0;
00142 s16[6*i+4] = convert (f[i+256]);
00143 s16[6*i+5] = convert (f[i]);
00144 }
00145 break;
00146 case DTS_CHANNEL | DTS_LFE:
00147 case DTS_STEREO | DTS_LFE:
00148 case DTS_DOLBY | DTS_LFE:
00149 for (i = 0; i < 256; i++)
00150 {
00151 s16[6*i] = convert (f[i+256]);
00152 s16[6*i+1] = convert (f[i+512]);
00153 s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0;
00154 s16[6*i+5] = convert (f[i]);
00155 }
00156 break;
00157 case DTS_3F | DTS_LFE:
00158 for (i = 0; i < 256; i++)
00159 {
00160 s16[6*i] = convert (f[i+256]);
00161 s16[6*i+1] = convert (f[i+768]);
00162 s16[6*i+2] = s16[6*i+3] = 0;
00163 s16[6*i+4] = convert (f[i+512]);
00164 s16[6*i+5] = convert (f[i]);
00165 }
00166 break;
00167 case DTS_2F2R | DTS_LFE:
00168 for (i = 0; i < 256; i++)
00169 {
00170 s16[6*i] = convert (f[i+256]);
00171 s16[6*i+1] = convert (f[i+512]);
00172 s16[6*i+2] = convert (f[i+768]);
00173 s16[6*i+3] = convert (f[i+1024]);
00174 s16[6*i+4] = 0;
00175 s16[6*i+5] = convert (f[i]);
00176 }
00177 break;
00178 case DTS_3F2R | DTS_LFE:
00179 for (i = 0; i < 256; i++)
00180 {
00181 s16[6*i] = convert (f[i+256]);
00182 s16[6*i+1] = convert (f[i+768]);
00183 s16[6*i+2] = convert (f[i+1024]);
00184 s16[6*i+3] = convert (f[i+1280]);
00185 s16[6*i+4] = convert (f[i+512]);
00186 s16[6*i+5] = convert (f[i]);
00187 }
00188 break;
00189 }
00190 }
00191
00192 static int
00193 channels_multi (int flags)
00194 {
00195 if (flags & DTS_LFE)
00196 return 6;
00197 else if (flags & 1)
00198 return 5;
00199 else if ((flags & DTS_CHANNEL_MASK) == DTS_2F2R)
00200 return 4;
00201 else
00202 return 2;
00203 }
00204
00205 static int
00206 dts_decode_frame (AVCodecContext *avctx, void *data, int *data_size,
00207 uint8_t *buff, int buff_size)
00208 {
00209 uint8_t * start = buff;
00210 uint8_t * end = buff + buff_size;
00211 static uint8_t buf[BUFFER_SIZE];
00212 static uint8_t * bufptr = buf;
00213 static uint8_t * bufpos = buf + HEADER_SIZE;
00214
00215 static int sample_rate;
00216 static int frame_length;
00217 static int flags;
00218 int bit_rate;
00219 int len;
00220 dts_state_t *state = avctx->priv_data;
00221
00222 *data_size = 0;
00223
00224 while (1)
00225 {
00226 len = end - start;
00227 if (!len)
00228 break;
00229 if (len > bufpos - bufptr)
00230 len = bufpos - bufptr;
00231 memcpy (bufptr, start, len);
00232 bufptr += len;
00233 start += len;
00234 if (bufptr == bufpos)
00235 {
00236 if (bufpos == buf + HEADER_SIZE)
00237 {
00238 int length;
00239
00240 length = dts_syncinfo (state, buf, &flags, &sample_rate,
00241 &bit_rate, &frame_length);
00242 if (!length)
00243 {
00244 av_log (NULL, AV_LOG_INFO, "skip\n");
00245 for (bufptr = buf; bufptr < buf + HEADER_SIZE-1; bufptr++)
00246 bufptr[0] = bufptr[1];
00247 continue;
00248 }
00249 bufpos = buf + length;
00250 }
00251 else
00252 {
00253 level_t level;
00254 sample_t bias;
00255 int i;
00256
00257 flags = 2;
00258 level = CONVERT_LEVEL;
00259 bias = CONVERT_BIAS;
00260
00261 flags |= DTS_ADJUST_LEVEL;
00262 if (dts_frame (state, buf, &flags, &level, bias))
00263 goto error;
00264 avctx->sample_rate = sample_rate;
00265 avctx->channels = channels_multi (flags);
00266 avctx->bit_rate = bit_rate;
00267 for (i = 0; i < dts_blocks_num (state); i++)
00268 {
00269 if (dts_block (state))
00270 goto error;
00271 {
00272 int chans;
00273 chans = channels_multi (flags);
00274 convert2s16_multi (dts_samples (state), data,
00275 flags & (DTS_CHANNEL_MASK | DTS_LFE));
00276
00277 data += 256 * sizeof (int16_t) * chans;
00278 *data_size += 256 * sizeof (int16_t) * chans;
00279 }
00280 }
00281 bufptr = buf;
00282 bufpos = buf + HEADER_SIZE;
00283 continue;
00284 error:
00285 av_log (NULL, AV_LOG_ERROR, "error\n");
00286 bufptr = buf;
00287 bufpos = buf + HEADER_SIZE;
00288 }
00289 }
00290 }
00291
00292 return buff_size;
00293 }
00294
00295 static int
00296 dts_decode_init (AVCodecContext *avctx)
00297 {
00298 avctx->priv_data = dts_init (0);
00299 if (avctx->priv_data == NULL)
00300 return 1;
00301
00302 return 0;
00303 }
00304
00305 static int
00306 dts_decode_end (AVCodecContext *s)
00307 {
00308 return 0;
00309 }
00310
00311 AVCodec dts_decoder = {
00312 "dts",
00313 CODEC_TYPE_AUDIO,
00314 CODEC_ID_DTS,
00315 sizeof (dts_state_t *),
00316 dts_decode_init,
00317 NULL,
00318 dts_decode_end,
00319 dts_decode_frame,
00320 };