summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Swain <robert.swain@gmail.com>2008-08-21 07:21:26 +0000
committerRobert Swain <robert.swain@gmail.com>2008-08-21 07:21:26 +0000
commit7d8f3de4a8ea88edb8afa7b663cfefc1a06c04cf (patch)
treeff4030490cf531d1f39c0cf4ca5d2da1284d2753
parent7fb262b568eef705f7fd50379e006b39684c9aad (diff)
Last hunk of the AAC decoder code to be OKed and build system and documentation
alterations as appropriate Originally committed as revision 14873 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--Changelog1
-rw-r--r--doc/general.texi2
-rw-r--r--libavcodec/Makefile1
-rw-r--r--libavcodec/aac.c38
-rw-r--r--libavcodec/allcodecs.c1
-rw-r--r--libavcodec/avcodec.h2
6 files changed, 42 insertions, 3 deletions
diff --git a/Changelog b/Changelog
index e4bfa6ec67..93ea06fc07 100644
--- a/Changelog
+++ b/Changelog
@@ -130,6 +130,7 @@ version <next>
- D-Cinema audio muxer
- Electronic Arts TGV decoder
- Apple Lossless Audio Codec (ALAC) encoder
+- AAC decoder
version 0.4.9-pre1:
diff --git a/doc/general.texi b/doc/general.texi
index c536eac138..99f48539c3 100644
--- a/doc/general.texi
+++ b/doc/general.texi
@@ -337,7 +337,7 @@ following image formats are supported:
@item 4X IMA ADPCM @tab @tab X
@item 8SVX audio @tab @tab X
@item AAC @tab X @tab X
- @tab Supported through the external library libfaac/libfaad.
+ @tab Encoding is supported through the external library libfaac.
@item AC-3 @tab IX @tab IX
@tab liba52 can be used alternatively for decoding.
@item AMR-NB @tab X @tab X
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 382d5bda99..e749b48343 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -25,6 +25,7 @@ HEADERS = avcodec.h opt.h
OBJS-$(CONFIG_ENCODERS) += faandct.o jfdctfst.o jfdctint.o
+OBJS-$(CONFIG_AAC_DECODER) += aac.o aactab.o mdct.o fft.o
OBJS-$(CONFIG_AASC_DECODER) += aasc.o
OBJS-$(CONFIG_AC3_DECODER) += ac3dec.o ac3tab.o ac3dec_data.o ac3.o mdct.o fft.o
OBJS-$(CONFIG_AC3_ENCODER) += ac3enc.o ac3tab.o ac3.o
diff --git a/libavcodec/aac.c b/libavcodec/aac.c
index 27d8cee266..61c27638f6 100644
--- a/libavcodec/aac.c
+++ b/libavcodec/aac.c
@@ -1104,6 +1104,42 @@ static int decode_extension_payload(AACContext * ac, GetBitContext * gb, int cnt
return res;
}
+/**
+ * Decode Temporal Noise Shaping filter coefficients and apply all-pole filters; reference: 4.6.9.3.
+ *
+ * @param decode 1 if tool is used normally, 0 if tool is used in LTP.
+ * @param coef spectral coefficients
+ */
+static void apply_tns(float coef[1024], TemporalNoiseShaping * tns, IndividualChannelStream * ics, int decode) {
+ const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb);
+ int w, filt, m, i, ib;
+ int bottom, top, order, start, end, size, inc;
+ float lpc[TNS_MAX_ORDER];
+
+ for (w = 0; w < ics->num_windows; w++) {
+ bottom = ics->num_swb;
+ for (filt = 0; filt < tns->n_filt[w]; filt++) {
+ top = bottom;
+ bottom = FFMAX(0, top - tns->length[w][filt]);
+ order = tns->order[w][filt];
+ if (order == 0)
+ continue;
+
+ /* tns_decode_coef
+ * FIXME: This duplicates the functionality of some double code in lpc.c.
+ */
+ for (m = 0; m < order; m++) {
+ float tmp;
+ lpc[m] = tns->coef[w][filt][m];
+ for (i = 0; i < m/2; i++) {
+ tmp = lpc[i];
+ lpc[i] += lpc[m] * lpc[m-1-i];
+ lpc[m-1-i] += lpc[m] * tmp;
+ }
+ if(m & 1)
+ lpc[i] += lpc[m] * lpc[i];
+ }
+
start = ics->swb_offset[FFMIN(bottom, mmm)];
end = ics->swb_offset[FFMIN( top, mmm)];
if ((size = end - start) <= 0)
@@ -1118,7 +1154,7 @@ static int decode_extension_payload(AACContext * ac, GetBitContext * gb, int cnt
// ar filter
for (m = 0; m < size; m++, start += inc)
for (i = 1; i <= FFMIN(m, order); i++)
- coef[start] -= coef[start - i*inc] * lpc[i];
+ coef[start] -= coef[start - i*inc] * lpc[i-1];
}
}
}
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 1f202267ab..ab2e8f67de 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -181,6 +181,7 @@ void avcodec_register_all(void)
REGISTER_ENCDEC (ZMBV, zmbv);
/* audio codecs */
+ REGISTER_DECODER (AAC, aac);
REGISTER_ENCDEC (AC3, ac3);
REGISTER_ENCDEC (ALAC, alac);
REGISTER_DECODER (APE, ape);
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index a4cc3f4eb7..6691089e1f 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -30,7 +30,7 @@
#include "libavutil/avutil.h"
#define LIBAVCODEC_VERSION_MAJOR 51
-#define LIBAVCODEC_VERSION_MINOR 68
+#define LIBAVCODEC_VERSION_MINOR 69
#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \