Fix information disclosure in mediadrmserver am: b41a527176 am: 70dc77cc94 am: e41b49b5ea am: 470e03a10b am: d1e097f456 am: 32ae22ff0f am: 4e55c5aae0 am: 88e846c4e7 am: acfb40f741 am: e2f8930c39 am: b3a0e4680b am: 3cf728e758
am: 650e3e6325
Change-Id: I5e38f52c09b2ab0192873bb7f23fab5c871b055b
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..8f405e9
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,4 @@
+elaurent@google.com
+etalvala@google.com
+lajos@google.com
+marcone@google.com
diff --git a/camera/ICameraClient.cpp b/camera/ICameraClient.cpp
index 7e6297c..8620f36 100644
--- a/camera/ICameraClient.cpp
+++ b/camera/ICameraClient.cpp
@@ -192,12 +192,14 @@
timestamps.reserve(n);
handles.reserve(n);
for (uint32_t i = 0; i < n; i++) {
- res = data.readInt64(×tamps[i]);
+ nsecs_t t;
+ res = data.readInt64(&t);
if (res != OK) {
ALOGE("%s: Failed to read timestamp[%d]: %s (%d)",
__FUNCTION__, i, strerror(-res), res);
return BAD_VALUE;
}
+ timestamps.push_back(t);
}
for (uint32_t i = 0; i < n; i++) {
native_handle_t* handle = data.readNativeHandle();
diff --git a/camera/ICameraRecordingProxyListener.cpp b/camera/ICameraRecordingProxyListener.cpp
index c954241..66faf8f 100644
--- a/camera/ICameraRecordingProxyListener.cpp
+++ b/camera/ICameraRecordingProxyListener.cpp
@@ -146,12 +146,14 @@
timestamps.reserve(n);
handles.reserve(n);
for (uint32_t i = 0; i < n; i++) {
- res = data.readInt64(×tamps[i]);
+ nsecs_t t;
+ res = data.readInt64(&t);
if (res != OK) {
ALOGE("%s: Failed to read timestamp[%d]: %s (%d)",
__FUNCTION__, i, strerror(-res), res);
return BAD_VALUE;
}
+ timestamps.push_back(t);
}
for (uint32_t i = 0; i < n; i++) {
native_handle_t* handle = data.readNativeHandle();
diff --git a/camera/OWNERS b/camera/OWNERS
new file mode 100644
index 0000000..18acfee
--- /dev/null
+++ b/camera/OWNERS
@@ -0,0 +1,6 @@
+cychen@google.com
+epeev@google.com
+etalvala@google.com
+shuzhenwang@google.com
+yinchiayeh@google.com
+zhijunhe@google.com
diff --git a/camera/ndk/impl/ACameraDevice.cpp b/camera/ndk/impl/ACameraDevice.cpp
index 229b159..79a3e3a 100644
--- a/camera/ndk/impl/ACameraDevice.cpp
+++ b/camera/ndk/impl/ACameraDevice.cpp
@@ -941,7 +941,6 @@
ACaptureRequest* request = allocateACaptureRequest(requestSp);
(*onFail)(context, session.get(), request, failure);
freeACaptureRequest(request);
- delete failure;
break;
}
case kWhatCaptureSeqEnd:
diff --git a/camera/ndk/impl/ACameraDevice.h b/camera/ndk/impl/ACameraDevice.h
index c566cd2..c0766c5 100644
--- a/camera/ndk/impl/ACameraDevice.h
+++ b/camera/ndk/impl/ACameraDevice.h
@@ -41,7 +41,7 @@
namespace android {
-// Wrap ACameraCaptureFailure so it can be ref-counter
+// Wrap ACameraCaptureFailure so it can be ref-counted
struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {};
class CameraDevice final : public RefBase {
diff --git a/cmds/OWNERS b/cmds/OWNERS
new file mode 100644
index 0000000..0d32aac
--- /dev/null
+++ b/cmds/OWNERS
@@ -0,0 +1,3 @@
+elaurent@google.com
+lajos@google.com
+marcone@google.com
diff --git a/drm/OWNERS b/drm/OWNERS
new file mode 100644
index 0000000..e788754
--- /dev/null
+++ b/drm/OWNERS
@@ -0,0 +1 @@
+jtinker@google.com
diff --git a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
index 830def9..73eea89 100644
--- a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
+++ b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/src/FwdLockEngine.cpp
@@ -502,8 +502,8 @@
int retVal = FwdLockFile_CheckHeaderIntegrity(fileDesc);
DecodeSession* decodeSession = new DecodeSession(fileDesc);
- if (retVal && NULL != decodeSession) {
- decodeSessionMap.addValue(decryptHandle->decryptId, decodeSession);
+ if (retVal && NULL != decodeSession &&
+ decodeSessionMap.addValue(decryptHandle->decryptId, decodeSession)) {
const char *pmime= FwdLockFile_GetContentType(fileDesc);
String8 contentType = String8(pmime == NULL ? "" : pmime);
contentType.toLower();
@@ -513,7 +513,11 @@
decryptHandle->decryptInfo = NULL;
result = DRM_NO_ERROR;
} else {
- LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession Integrity Check failed for the fd");
+ if (retVal && NULL != decodeSession) {
+ LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession Integrity Check failed for the fd");
+ } else {
+ LOG_VERBOSE("FwdLockEngine::onOpenDecryptSession DecodeSesssion insertion failed");
+ }
FwdLockFile_detach(fileDesc);
delete decodeSession;
}
@@ -631,7 +635,7 @@
ssize_t size = -1;
if (NULL != decryptHandle &&
- decodeSessionMap.isCreated(decryptHandle->decryptId) &&
+ decodeSessionMap.isCreated(decryptHandle->decryptId) &&
NULL != buffer &&
numBytes > -1) {
DecodeSession* session = decodeSessionMap.getValue(decryptHandle->decryptId);
diff --git a/include/OWNERS b/include/OWNERS
new file mode 100644
index 0000000..0ec7529
--- /dev/null
+++ b/include/OWNERS
@@ -0,0 +1,5 @@
+elaurent@google.com
+gkasten@android.com
+hunga@google.com
+lajos@google.com
+marcone@google.com
diff --git a/media/OWNERS b/media/OWNERS
new file mode 100644
index 0000000..cd4afb4
--- /dev/null
+++ b/media/OWNERS
@@ -0,0 +1,5 @@
+hunga@google.com
+lajos@google.com
+marcone@google.com
+robertshih@google.com
+wjia@google.com
diff --git a/media/img_utils/src/TiffWriter.cpp b/media/img_utils/src/TiffWriter.cpp
index 564474f..1711242 100644
--- a/media/img_utils/src/TiffWriter.cpp
+++ b/media/img_utils/src/TiffWriter.cpp
@@ -350,7 +350,7 @@
if (nextIfd == NULL) {
break;
}
- ifd = nextIfd;
+ ifd = std::move(nextIfd);
}
return ifd;
}
diff --git a/media/libaaudio/Android.bp b/media/libaaudio/Android.bp
index f539ba9..6e60f24 100644
--- a/media/libaaudio/Android.bp
+++ b/media/libaaudio/Android.bp
@@ -16,12 +16,14 @@
name: "libAAudio_headers",
from: "include",
to: "",
- srcs: ["include/aaudio/*.h"],
+ // omit AAudioTesting.h; supplied separately to those who need it
+ srcs: ["include/aaudio/AAudio.h"],
license: "include/aaudio/NOTICE",
}
ndk_library {
name: "libaaudio",
+ // deliberately includes symbols from AAudioTesting.h
symbol_file: "libaaudio.map.txt",
first_version: "26",
unversioned_until: "current",
diff --git a/media/libaaudio/examples/loopback/src/loopback.cpp b/media/libaaudio/examples/loopback/src/loopback.cpp
index 144c941..67dafa9 100644
--- a/media/libaaudio/examples/loopback/src/loopback.cpp
+++ b/media/libaaudio/examples/loopback/src/loopback.cpp
@@ -19,9 +19,12 @@
#include <algorithm>
#include <assert.h>
#include <cctype>
+#include <errno.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include <aaudio/AAudio.h>
diff --git a/media/libaaudio/examples/utils/AAudioExampleUtils.h b/media/libaaudio/examples/utils/AAudioExampleUtils.h
index 66de25f..530188b 100644
--- a/media/libaaudio/examples/utils/AAudioExampleUtils.h
+++ b/media/libaaudio/examples/utils/AAudioExampleUtils.h
@@ -17,8 +17,11 @@
#ifndef AAUDIO_EXAMPLE_UTILS_H
#define AAUDIO_EXAMPLE_UTILS_H
-#include <unistd.h>
+#include <errno.h>
#include <sched.h>
+#include <string.h>
+#include <unistd.h>
+
#include <aaudio/AAudio.h>
#define NANOS_PER_MICROSECOND ((int64_t)1000)
diff --git a/media/libaaudio/src/client/IsochronousClockModel.cpp b/media/libaaudio/src/client/IsochronousClockModel.cpp
index 4d0a7b8..c06c8a9 100644
--- a/media/libaaudio/src/client/IsochronousClockModel.cpp
+++ b/media/libaaudio/src/client/IsochronousClockModel.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "AAudio"
//#define LOG_NDEBUG 0
-#include <utils/Log.h>
+#include <log/log.h>
#include <stdint.h>
@@ -25,7 +25,6 @@
#define MIN_LATENESS_NANOS (10 * AAUDIO_NANOS_PER_MICROSECOND)
-using namespace android;
using namespace aaudio;
IsochronousClockModel::IsochronousClockModel()
diff --git a/media/libaaudio/src/utility/AudioClock.h b/media/libaaudio/src/utility/AudioClock.h
index 43b71b0..d5d4ef4 100644
--- a/media/libaaudio/src/utility/AudioClock.h
+++ b/media/libaaudio/src/utility/AudioClock.h
@@ -17,6 +17,7 @@
#ifndef UTILITY_AUDIO_CLOCK_H
#define UTILITY_AUDIO_CLOCK_H
+#include <errno.h>
#include <stdint.h>
#include <time.h>
diff --git a/media/libaudioclient/ToneGenerator.cpp b/media/libaudioclient/ToneGenerator.cpp
index 9bc2594..fa1d253 100644
--- a/media/libaudioclient/ToneGenerator.cpp
+++ b/media/libaudioclient/ToneGenerator.cpp
@@ -740,6 +740,18 @@
{ .duration = 0 , .waveFreq = { 0 }, 0, 0}},
.repeatCnt = ToneGenerator::TONEGEN_INF,
.repeatSegment = 0 }, // TONE_JAPAN_RADIO_ACK
+ { .segments = { { .duration = 375, .waveFreq = { 400, 0 }, 0, 0 },
+ { .duration = 375, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_GB_BUSY
+ { .segments = { { .duration = 400, .waveFreq = { 400, 0 }, 0, 0 },
+ { .duration = 350, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 225, .waveFreq = { 400, 0 }, 0, 0 },
+ { .duration = 525, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_GB_CONGESTION
{ .segments = { { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
{ .duration = 200, .waveFreq = { 0 }, 0, 0 },
{ .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
@@ -747,6 +759,10 @@
{ .duration = 0, .waveFreq = { 0 }, 0, 0}},
.repeatCnt = ToneGenerator::TONEGEN_INF,
.repeatSegment = 0 }, // TONE_GB_RINGTONE
+ { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 400, 425, 450, 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_AUSTRALIA_DIAL
{ .segments = { { .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
{ .duration = 200, .waveFreq = { 0 }, 0, 0 },
{ .duration = 400, .waveFreq = { 400, 450, 0 }, 0, 0 },
@@ -771,6 +787,30 @@
{ .duration = 0 , .waveFreq = { 0 }, 0, 0}},
.repeatCnt = ToneGenerator::TONEGEN_INF,
.repeatSegment = 0 }, // TONE_AUSTRALIA_CONGESTION
+ { .segments = { { .duration = 750, .waveFreq = { 425, 0 }, 0, 0 },
+ { .duration = 750, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_SG_BUSY
+ { .segments = { { .duration = 400, .waveFreq = { 401, 425, 449, 0 }, 0, 0 },
+ { .duration = 200, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 400, .waveFreq = { 401, 425, 449, 0 }, 0, 0 },
+ { .duration = 2000, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_SG_RINGTONE
+ { .segments = { { .duration = 500, .waveFreq = { 480, 620, 0 }, 0, 0 },
+ { .duration = 500, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_HK_BUSY
+ { .segments = { { .duration = 400, .waveFreq = { 440, 480, 0 }, 0, 0 },
+ { .duration = 200, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 400, .waveFreq = { 440, 480, 0 }, 0, 0 },
+ { .duration = 3000, .waveFreq = { 0 }, 0, 0 },
+ { .duration = 0 , .waveFreq = { 0 }, 0, 0}},
+ .repeatCnt = ToneGenerator::TONEGEN_INF,
+ .repeatSegment = 0 }, // TONE_HK_RINGTONE
};
// Used by ToneGenerator::getToneForRegion() to convert user specified supervisory tone type
@@ -797,9 +837,9 @@
TONE_SUP_RINGTONE // TONE_SUP_RINGTONE
},
{ // GB
- TONE_SUP_DIAL, // TONE_SUP_DIAL
- TONE_SUP_BUSY, // TONE_SUP_BUSY
- TONE_SUP_CONGESTION, // TONE_SUP_CONGESTION
+ TONE_ANSI_DIAL, // TONE_SUP_DIAL
+ TONE_GB_BUSY, // TONE_SUP_BUSY
+ TONE_GB_CONGESTION, // TONE_SUP_CONGESTION
TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK
TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL
TONE_SUP_ERROR, // TONE_SUP_ERROR
@@ -807,7 +847,7 @@
TONE_GB_RINGTONE // TONE_SUP_RINGTONE
},
{ // AUSTRALIA
- TONE_ANSI_DIAL, // TONE_SUP_DIAL
+ TONE_AUSTRALIA_DIAL, // TONE_SUP_DIAL
TONE_AUSTRALIA_BUSY, // TONE_SUP_BUSY
TONE_AUSTRALIA_CONGESTION, // TONE_SUP_CONGESTION
TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK
@@ -815,6 +855,26 @@
TONE_SUP_ERROR, // TONE_SUP_ERROR
TONE_AUSTRALIA_CALL_WAITING,// TONE_SUP_CALL_WAITING
TONE_AUSTRALIA_RINGTONE // TONE_SUP_RINGTONE
+ },
+ { // SINGAPORE
+ TONE_SUP_DIAL, // TONE_SUP_DIAL
+ TONE_SG_BUSY, // TONE_SUP_BUSY
+ TONE_SUP_CONGESTION, // TONE_SUP_CONGESTION
+ TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK
+ TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL
+ TONE_SUP_ERROR, // TONE_SUP_ERROR
+ TONE_SUP_CALL_WAITING, // TONE_SUP_CALL_WAITING
+ TONE_SG_RINGTONE // TONE_SUP_RINGTONE
+ },
+ { // HONGKONG
+ TONE_SUP_DIAL, // TONE_SUP_DIAL
+ TONE_HK_BUSY, // TONE_SUP_BUSY
+ TONE_SUP_CONGESTION, // TONE_SUP_CONGESTION
+ TONE_SUP_RADIO_ACK, // TONE_SUP_RADIO_ACK
+ TONE_SUP_RADIO_NOTAVAIL, // TONE_SUP_RADIO_NOTAVAIL
+ TONE_SUP_ERROR, // TONE_SUP_ERROR
+ TONE_SUP_CALL_WAITING, // TONE_SUP_CALL_WAITING
+ TONE_HK_RINGTONE // TONE_SUP_RINGTONE
}
};
@@ -864,6 +924,13 @@
if (property_get("gsm.operator.iso-country", value, "") == 0) {
property_get("gsm.sim.operator.iso-country", value, "");
}
+ // If dual sim device has two SIM cards inserted and is not registerd to any network,
+ // "," is set to "gsm.operator.iso-country" prop.
+ // In this case, "gsm.sim.operator.iso-country" prop should be used.
+ if (strlen(value) == 1 && strstr(value, ",") != NULL) {
+ property_get("gsm.sim.operator.iso-country", value, "");
+ }
+
if (strstr(value, "us") != NULL ||
strstr(value, "ca") != NULL) {
mRegion = ANSI;
@@ -873,6 +940,10 @@
mRegion = GB;
} else if (strstr(value, "au") != NULL) {
mRegion = AUSTRALIA;
+ } else if (strstr(value, "sg") != NULL) {
+ mRegion = SINGAPORE;
+ } else if (strstr(value, "hk") != NULL) {
+ mRegion = HONGKONG;
} else {
mRegion = CEPT;
}
diff --git a/media/libaudioclient/include/media/ToneGenerator.h b/media/libaudioclient/include/media/ToneGenerator.h
index fc3d3ee..97bc825 100644
--- a/media/libaudioclient/include/media/ToneGenerator.h
+++ b/media/libaudioclient/include/media/ToneGenerator.h
@@ -177,7 +177,7 @@
// Region specific tones.
- // These supervisory tones are different depending on the region (USA/CANADA, JAPAN, rest of the world).
+ // These supervisory tones are different depending on the region (USA/CANADA, JAPAN, Singapore, Hong Kong, rest of the world).
// When a tone in the range [FIRST_SUP_TONE, LAST_SUP_TONE] is requested, the region is determined
// from system property gsm.operator.iso-country and the proper tone descriptor is selected with the
// help of sToneMappingTable[]
@@ -194,12 +194,21 @@
TONE_JAPAN_BUSY, // Busy tone: 400Hz, 500ms ON, 500ms OFF...
TONE_JAPAN_RADIO_ACK, // Radio path acknowlegment: 400Hz, 1s ON, 2s OFF...
// GB Supervisory tones
+ TONE_GB_BUSY, // Busy tone: 400 Hz, 375ms ON, 375ms OFF...
+ TONE_GB_CONGESTION, // Congestion Tone: 400 Hz, 400ms ON, 350ms OFF, 225ms ON, 525ms OFF...
TONE_GB_RINGTONE, // Ring Tone: A 400Hz + 450Hz tone repeated in a 0.4s on, 0.2s off, 0.4s on, 2.0s off pattern.
// AUSTRALIA Supervisory tones
+ TONE_AUSTRALIA_DIAL, // Dial tone: 425 Hz tone modulated with 25 Hz, continuous
TONE_AUSTRALIA_RINGTONE, // Ring tone: A 400Hz + 450Hz tone repeated in a 0.4s on, 0.2s off, 0.4s on, 2.0s off pattern.
TONE_AUSTRALIA_BUSY, // Busy tone: 425 Hz repeated in a 0.375s on, 0.375s off pattern.
TONE_AUSTRALIA_CALL_WAITING,// Call waiting tone: 425Hz tone repeated in a 0.2s on, 0.2s off, 0.2s on, 4.4s off pattern.
TONE_AUSTRALIA_CONGESTION, // Congestion tone: 425Hz tone repeated in a 0.375s on, 0.375s off pattern
+ // SINGAPORE Supervisory tones
+ TONE_SG_BUSY, // Busy tone: 425 Hz, 750ms ON, 750ms OFF...
+ TONE_SG_RINGTONE, // Ring Tone: 425 Hz tone modulated with 24 Hz, 400ms ON, 200ms OFF, 400ms ON, 2s OFF...
+ // HONG KONG Supervisory tones
+ TONE_HK_BUSY, // Busy tone: 480 Hz + 620 Hz, 500ms ON, 500ms OFF...
+ TONE_HK_RINGTONE, // Ring Tone: 440 Hz + 480 Hz repeated with pattern 0,4s on, 0,2s off, 0,4s on and 3s off.
NUM_ALTERNATE_TONES
};
@@ -208,6 +217,8 @@
JAPAN,
GB,
AUSTRALIA,
+ SINGAPORE,
+ HONGKONG,
CEPT,
NUM_REGIONS
};
diff --git a/media/libmedia/CharacterEncodingDetector.cpp b/media/libmedia/CharacterEncodingDetector.cpp
index 3020136..808c2b5 100644
--- a/media/libmedia/CharacterEncodingDetector.cpp
+++ b/media/libmedia/CharacterEncodingDetector.cpp
@@ -85,6 +85,8 @@
UErrorCode status = U_ZERO_ERROR;
UCharsetDetector *csd = ucsdet_open(&status);
const UCharsetMatch *ucm;
+ bool goodmatch = true;
+ int highest = 0;
// try combined detection of artist/album/title etc.
char buf[1024];
@@ -116,8 +118,6 @@
ucsdet_setText(csd, buf, strlen(buf), &status);
int32_t matches;
const UCharsetMatch** ucma = ucsdet_detectAll(csd, &matches, &status);
- bool goodmatch = true;
- int highest = 0;
const UCharsetMatch* bestCombinedMatch = getPreferred(buf, strlen(buf),
ucma, matches, &goodmatch, &highest);
@@ -180,8 +180,24 @@
!strcmp(name, "genre") ||
!strcmp(name, "album") ||
!strcmp(name, "title"))) {
- // use encoding determined from the combination of artist/album/title etc.
- enc = combinedenc;
+ if (!goodmatch && highest < 0) {
+ // Give it one more chance if there is no good match.
+ ALOGV("Trying to detect %s separately", name);
+ int32_t matches;
+ bool goodmatchSingle = true;
+ int highestSingle = 0;
+ ucsdet_setText(csd, s, inputLength, &status);
+ const UCharsetMatch** ucma = ucsdet_detectAll(csd, &matches, &status);
+ const UCharsetMatch* bestSingleMatch = getPreferred(s, inputLength,
+ ucma, matches, &goodmatchSingle, &highestSingle);
+ if (goodmatchSingle || highestSingle > highest)
+ enc = ucsdet_getName(bestSingleMatch, &status);
+ else
+ enc = combinedenc;
+ } else {
+ // use encoding determined from the combination of artist/album/title etc.
+ enc = combinedenc;
+ }
} else {
if (isPrintableAscii(s, inputLength)) {
enc = "UTF-8";
diff --git a/media/libmedia/MediaUtils.cpp b/media/libmedia/MediaUtils.cpp
index dc2bc82..bcdc3bd 100644
--- a/media/libmedia/MediaUtils.cpp
+++ b/media/libmedia/MediaUtils.cpp
@@ -24,6 +24,8 @@
#include "MediaUtils.h"
+extern "C" size_t __cfi_shadow_size();
+
namespace android {
void limitProcessMemory(
@@ -62,6 +64,19 @@
if (propVal > 0 && uint64_t(propVal) <= SIZE_MAX) {
maxMem = propVal;
}
+
+ // Increase by the size of the CFI shadow mapping. Most of the shadow is not
+ // backed with physical pages, and it is possible for the result to be
+ // higher than total physical memory. This is fine for RLIMIT_AS.
+ size_t cfi_size = __cfi_shadow_size();
+ if (cfi_size) {
+ ALOGV("cfi shadow size: %zu", cfi_size);
+ if (maxMem <= SIZE_MAX - cfi_size) {
+ maxMem += cfi_size;
+ } else {
+ maxMem = SIZE_MAX;
+ }
+ }
ALOGV("actual limit: %zu", maxMem);
struct rlimit limit;
diff --git a/media/libmediaplayerservice/MediaPlayerFactory.cpp b/media/libmediaplayerservice/MediaPlayerFactory.cpp
index 0a9f791..6da1ec1 100644
--- a/media/libmediaplayerservice/MediaPlayerFactory.cpp
+++ b/media/libmediaplayerservice/MediaPlayerFactory.cpp
@@ -245,8 +245,12 @@
if (sInitComplete)
return;
- registerFactory_l(new NuPlayerFactory(), NU_PLAYER);
- registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);
+ IFactory* factory = new NuPlayerFactory();
+ if (registerFactory_l(factory, NU_PLAYER) != OK)
+ delete factory;
+ factory = new TestPlayerFactory();
+ if (registerFactory_l(factory, TEST_PLAYER) != OK)
+ delete factory;
sInitComplete = true;
}
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 1f98e8d..6491ceb 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -4843,9 +4843,9 @@
rect.nTop < 0 ||
rect.nLeft + rect.nWidth > videoDef->nFrameWidth ||
rect.nTop + rect.nHeight > videoDef->nFrameHeight) {
- ALOGE("Wrong cropped rect (%d, %d) - (%u, %u) vs. frame (%u, %u)",
+ ALOGE("Wrong cropped rect (%d, %d, %u, %u) vs. frame (%u, %u)",
rect.nLeft, rect.nTop,
- rect.nLeft + rect.nWidth, rect.nTop + rect.nHeight,
+ rect.nWidth, rect.nHeight,
videoDef->nFrameWidth, videoDef->nFrameHeight);
return BAD_VALUE;
}
diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp
index 6cc1ace..81b4964 100644
--- a/media/libstagefright/Android.bp
+++ b/media/libstagefright/Android.bp
@@ -93,7 +93,6 @@
"libutils",
"libvorbisidec",
"libmediadrm",
- "libnativewindow",
"libmedia_helper",
"libstagefright_flacdec",
@@ -103,15 +102,12 @@
"libhidlbase",
"libhidlmemory",
"android.hidl.allocator@1.0",
- "android.hidl.memory@1.0",
"android.hardware.media.omx@1.0",
- "libstagefright_xmlparser@1.0",
],
static_libs: [
"libstagefright_color_conversion",
"libyuv_static",
- "libstagefright_aacenc",
"libstagefright_matroska",
"libstagefright_mediafilter",
"libstagefright_omx_utils",
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 3608bad..d2b49dd 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -19,6 +19,7 @@
#include <ctype.h>
#include <inttypes.h>
+#include <memory>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
@@ -462,6 +463,66 @@
return NULL;
}
+ int64_t duration;
+ int32_t samplerate;
+ if (track->has_elst && mHeaderTimescale != 0 &&
+ track->meta->findInt64(kKeyDuration, &duration) &&
+ track->meta->findInt32(kKeySampleRate, &samplerate)) {
+
+ track->has_elst = false;
+
+ if (track->elst_segment_duration > INT64_MAX) {
+ goto editlistoverflow;
+ }
+ int64_t segment_duration = track->elst_segment_duration;
+ int64_t media_time = track->elst_media_time;
+ int64_t halfscale = mHeaderTimescale / 2;
+
+ int64_t delay;
+ // delay = ((media_time * samplerate) + halfscale) / mHeaderTimescale;
+ if (__builtin_mul_overflow(media_time, samplerate, &delay) ||
+ __builtin_add_overflow(delay, halfscale, &delay) ||
+ (delay /= mHeaderTimescale, false) ||
+ delay > INT32_MAX ||
+ delay < INT32_MIN) {
+ goto editlistoverflow;
+ }
+ track->meta->setInt32(kKeyEncoderDelay, delay);
+
+ int64_t scaled_duration;
+ // scaled_duration = ((duration * mHeaderTimescale) + 500000) / 1000000;
+ if (__builtin_mul_overflow(duration, mHeaderTimescale, &scaled_duration) ||
+ __builtin_add_overflow(scaled_duration, 500000, &scaled_duration)) {
+ goto editlistoverflow;
+ }
+ scaled_duration /= 1000000;
+
+ int64_t segment_end;
+ int64_t padding;
+ if (__builtin_add_overflow(segment_duration, media_time, &segment_end) ||
+ __builtin_sub_overflow(scaled_duration, segment_end, &padding)) {
+ goto editlistoverflow;
+ }
+
+ if (padding < 0) {
+ // track duration from media header (which is what kKeyDuration is) might
+ // be slightly shorter than the segment duration, which would make the
+ // padding negative. Clamp to zero.
+ padding = 0;
+ }
+
+ int64_t paddingsamples;
+ // paddingsamples = ((padding * samplerate) + halfscale) / mHeaderTimescale;
+ if (__builtin_mul_overflow(padding, samplerate, &paddingsamples) ||
+ __builtin_add_overflow(paddingsamples, halfscale, &paddingsamples) ||
+ (paddingsamples /= mHeaderTimescale, false) ||
+ paddingsamples > INT32_MAX) {
+ goto editlistoverflow;
+ }
+ track->meta->setInt32(kKeyEncoderPadding, paddingsamples);
+ }
+ editlistoverflow:
+
if ((flags & kIncludeExtensiveMetaData)
&& !track->includes_expensive_metadata) {
track->includes_expensive_metadata = true;
@@ -994,6 +1055,7 @@
track->skipTrack = false;
track->timescale = 0;
track->meta->setCString(kKeyMIMEType, "application/octet-stream");
+ track->has_elst = false;
}
off64_t stop_offset = *offset + chunk_size;
@@ -1060,6 +1122,10 @@
{
*offset += chunk_size;
+ if (!mLastTrack) {
+ return ERROR_MALFORMED;
+ }
+
// See 14496-12 8.6.6
uint8_t version;
if (mDataSource->readAt(data_offset, &version, 1) < 1) {
@@ -1074,8 +1140,6 @@
if (entry_count != 1) {
// we only support a single entry at the moment, for gapless playback
ALOGW("ignoring edit list with %d entries", entry_count);
- } else if (mHeaderTimescale == 0) {
- ALOGW("ignoring edit list because timescale is 0");
} else {
off64_t entriesoffset = data_offset + 8;
uint64_t segment_duration;
@@ -1099,31 +1163,12 @@
return ERROR_IO;
}
- uint64_t halfscale = mHeaderTimescale / 2;
- segment_duration = (segment_duration * 1000000 + halfscale)/ mHeaderTimescale;
- media_time = (media_time * 1000000 + halfscale) / mHeaderTimescale;
-
- int64_t duration;
- int32_t samplerate;
- if (!mLastTrack) {
- return ERROR_MALFORMED;
- }
- if (mLastTrack->meta->findInt64(kKeyDuration, &duration) &&
- mLastTrack->meta->findInt32(kKeySampleRate, &samplerate)) {
-
- int64_t delay = (media_time * samplerate + 500000) / 1000000;
- mLastTrack->meta->setInt32(kKeyEncoderDelay, delay);
-
- int64_t paddingus = duration - (int64_t)(segment_duration + media_time);
- if (paddingus < 0) {
- // track duration from media header (which is what kKeyDuration is) might
- // be slightly shorter than the segment duration, which would make the
- // padding negative. Clamp to zero.
- paddingus = 0;
- }
- int64_t paddingsamples = (paddingus * samplerate + 500000) / 1000000;
- mLastTrack->meta->setInt32(kKeyEncoderPadding, paddingsamples);
- }
+ // save these for later, because the elst atom might precede
+ // the atoms that actually gives us the duration and sample rate
+ // needed to calculate the padding and delay values
+ mLastTrack->has_elst = true;
+ mLastTrack->elst_media_time = media_time;
+ mLastTrack->elst_segment_duration = segment_duration;
}
break;
}
@@ -1776,35 +1821,49 @@
{
*offset += chunk_size;
- // Best case the total data length inside "\xA9xyz" box
- // would be 8, for instance "\xA9xyz" + "\x00\x04\x15\xc7" + "0+0/",
- // where "\x00\x04" is the text string length with value = 4,
- // "\0x15\xc7" is the language code = en, and "0+0" is a
+ // Best case the total data length inside "\xA9xyz" box would
+ // be 9, for instance "\xA9xyz" + "\x00\x05\x15\xc7" + "+0+0/",
+ // where "\x00\x05" is the text string length with value = 5,
+ // "\0x15\xc7" is the language code = en, and "+0+0/" is a
// location (string) value with longitude = 0 and latitude = 0.
- if (chunk_data_size < 8) {
+ // Since some devices encountered in the wild omit the trailing
+ // slash, we'll allow that.
+ if (chunk_data_size < 8) { // 8 instead of 9 to allow for missing /
return ERROR_MALFORMED;
}
- // Worst case the location string length would be 18,
- // for instance +90.0000-180.0000, without the trailing "/" and
- // the string length + language code, and some devices include
- // an additional 8 bytes of altitude, e.g. +007.186
- char buffer[18 + 8];
-
- // Substracting 5 from the data size is because the text string length +
- // language code takes 4 bytes, and the trailing slash "/" takes 1 byte.
- off64_t location_length = chunk_data_size - 5;
- if (location_length >= (off64_t) sizeof(buffer)) {
- return ERROR_MALFORMED;
- }
-
- if (mDataSource->readAt(
- data_offset + 4, buffer, location_length) < location_length) {
+ uint16_t len;
+ if (!mDataSource->getUInt16(data_offset, &len)) {
return ERROR_IO;
}
- buffer[location_length] = '\0';
- mFileMetaData->setCString(kKeyLocation, buffer);
+ // allow "+0+0" without trailing slash
+ if (len < 4 || len > chunk_data_size - 4) {
+ return ERROR_MALFORMED;
+ }
+ // The location string following the language code is formatted
+ // according to ISO 6709:2008 (https://en.wikipedia.org/wiki/ISO_6709).
+ // Allocate 2 extra bytes, in case we need to add a trailing slash,
+ // and to add a terminating 0.
+ std::unique_ptr<char[]> buffer(new (std::nothrow) char[len+2]());
+ if (!buffer) {
+ return NO_MEMORY;
+ }
+
+ if (mDataSource->readAt(
+ data_offset + 4, &buffer[0], len) < len) {
+ return ERROR_IO;
+ }
+
+ len = strlen(&buffer[0]);
+ if (len < 4) {
+ return ERROR_MALFORMED;
+ }
+ // Add a trailing slash if there wasn't one.
+ if (buffer[len - 1] != '/') {
+ buffer[len] = '/';
+ }
+ mFileMetaData->setCString(kKeyLocation, &buffer[0]);
break;
}
@@ -3458,6 +3517,18 @@
return ERROR_UNSUPPORTED;
}
+ if (mLastTrack != NULL) {
+ uint32_t maxBitrate = 0;
+ uint32_t avgBitrate = 0;
+ esds.getBitRate(&maxBitrate, &avgBitrate);
+ if (maxBitrate > 0 && maxBitrate < INT32_MAX) {
+ mLastTrack->meta->setInt32(kKeyMaxBitRate, (int32_t)maxBitrate);
+ }
+ if (avgBitrate > 0 && avgBitrate < INT32_MAX) {
+ mLastTrack->meta->setInt32(kKeyBitRate, (int32_t)avgBitrate);
+ }
+ }
+
const uint8_t *csd;
size_t csd_size;
if (esds.getCodecSpecificInfo(
@@ -5274,7 +5345,7 @@
off64_t chunkDataSize = chunkSize - (chunkDataOffset - offset);
if (chunkDataSize < 0) {
ALOGE("b/23540914");
- return ERROR_MALFORMED;
+ return false;
}
char chunkstring[5];
diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp
index 810b0d6..766230a 100644
--- a/media/libstagefright/OggExtractor.cpp
+++ b/media/libstagefright/OggExtractor.cpp
@@ -1123,6 +1123,7 @@
mMeta->setData(kKeyVorbisInfo, 0, data, size);
mMeta->setInt32(kKeySampleRate, mVi.rate);
mMeta->setInt32(kKeyChannelCount, mVi.channels);
+ mMeta->setInt32(kKeyBitRate, mVi.bitrate_nominal);
ALOGV("lower-bitrate = %ld", mVi.bitrate_lower);
ALOGV("upper-bitrate = %ld", mVi.bitrate_upper);
diff --git a/media/libstagefright/SampleIterator.cpp b/media/libstagefright/SampleIterator.cpp
index 4f31c5f..75f744d 100644
--- a/media/libstagefright/SampleIterator.cpp
+++ b/media/libstagefright/SampleIterator.cpp
@@ -172,7 +172,7 @@
if (mSampleToChunkIndex + 1 < mTable->mNumSampleToChunkOffsets) {
mStopChunk = entry[1].startChunk;
- if (mStopChunk < mFirstChunk ||
+ if (mSamplesPerChunk == 0 || mStopChunk < mFirstChunk ||
(mStopChunk - mFirstChunk) > UINT32_MAX / mSamplesPerChunk ||
((mStopChunk - mFirstChunk) * mSamplesPerChunk >
UINT32_MAX - mFirstChunkSampleIndex)) {
diff --git a/media/libstagefright/avc_utils.cpp b/media/libstagefright/avc_utils.cpp
index a745692..b75b468 100644
--- a/media/libstagefright/avc_utils.cpp
+++ b/media/libstagefright/avc_utils.cpp
@@ -200,10 +200,22 @@
frame_crop_top_offset, frame_crop_bottom_offset,
cropUnitX, cropUnitY);
- *width -=
- (frame_crop_left_offset + frame_crop_right_offset) * cropUnitX;
- *height -=
- (frame_crop_top_offset + frame_crop_bottom_offset) * cropUnitY;
+
+ // *width -= (frame_crop_left_offset + frame_crop_right_offset) * cropUnitX;
+ if(__builtin_add_overflow(frame_crop_left_offset, frame_crop_right_offset, &frame_crop_left_offset) ||
+ __builtin_mul_overflow(frame_crop_left_offset, cropUnitX, &frame_crop_left_offset) ||
+ __builtin_sub_overflow(*width, frame_crop_left_offset, width) ||
+ *width < 0) {
+ *width = 0;
+ }
+
+ //*height -= (frame_crop_top_offset + frame_crop_bottom_offset) * cropUnitY;
+ if(__builtin_add_overflow(frame_crop_top_offset, frame_crop_bottom_offset, &frame_crop_top_offset) ||
+ __builtin_mul_overflow(frame_crop_top_offset, cropUnitY, &frame_crop_top_offset) ||
+ __builtin_sub_overflow(*height, frame_crop_top_offset, height) ||
+ *height < 0) {
+ *height = 0;
+ }
}
if (sarWidth != NULL) {
diff --git a/media/libstagefright/codecs/aacenc/AACEncoder.cpp b/media/libstagefright/codecs/aacenc/AACEncoder.cpp
deleted file mode 100644
index 5656139..0000000
--- a/media/libstagefright/codecs/aacenc/AACEncoder.cpp
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "AACEncoder"
-#include <utils/Log.h>
-
-#include "AACEncoder.h"
-#include "voAAC.h"
-#include "cmnMemory.h"
-
-#include <media/stagefright/foundation/ADebug.h>
-#include <media/stagefright/MediaBufferGroup.h>
-#include <media/stagefright/MediaDefs.h>
-#include <media/stagefright/MediaErrors.h>
-#include <media/stagefright/MetaData.h>
-
-namespace android {
-
-AACEncoder::AACEncoder(const sp<IMediaSource> &source, const sp<MetaData> &meta)
- : mSource(source),
- mMeta(meta),
- mStarted(false),
- mBufferGroup(NULL),
- mInputBuffer(NULL),
- mInputFrame(NULL),
- mEncoderHandle(NULL),
- mApiHandle(NULL),
- mMemOperator(NULL) {
-}
-
-status_t AACEncoder::initCheck() {
- CHECK(mApiHandle == NULL && mEncoderHandle == NULL);
- CHECK(mMeta->findInt32(kKeySampleRate, &mSampleRate));
- CHECK(mMeta->findInt32(kKeyChannelCount, &mChannels));
- CHECK(mChannels <= 2 && mChannels >= 1);
- CHECK(mMeta->findInt32(kKeyBitRate, &mBitRate));
-
- mApiHandle = new VO_AUDIO_CODECAPI;
- CHECK(mApiHandle);
-
- if (VO_ERR_NONE != voGetAACEncAPI(mApiHandle)) {
- ALOGE("Failed to get api handle");
- return UNKNOWN_ERROR;
- }
-
- mMemOperator = new VO_MEM_OPERATOR;
- CHECK(mMemOperator != NULL);
- mMemOperator->Alloc = cmnMemAlloc;
- mMemOperator->Copy = cmnMemCopy;
- mMemOperator->Free = cmnMemFree;
- mMemOperator->Set = cmnMemSet;
- mMemOperator->Check = cmnMemCheck;
-
- VO_CODEC_INIT_USERDATA userData;
- memset(&userData, 0, sizeof(userData));
- userData.memflag = VO_IMF_USERMEMOPERATOR;
- userData.memData = (VO_PTR) mMemOperator;
- if (VO_ERR_NONE != mApiHandle->Init(&mEncoderHandle, VO_AUDIO_CodingAAC, &userData)) {
- ALOGE("Failed to init AAC encoder");
- return UNKNOWN_ERROR;
- }
- if (OK != setAudioSpecificConfigData()) {
- ALOGE("Failed to configure AAC encoder");
- return UNKNOWN_ERROR;
- }
-
- // Configure AAC encoder$
- AACENC_PARAM params;
- memset(¶ms, 0, sizeof(params));
- params.sampleRate = mSampleRate;
- params.bitRate = mBitRate;
- params.nChannels = mChannels;
- params.adtsUsed = 0; // We add adts header in the file writer if needed.
- if (VO_ERR_NONE != mApiHandle->SetParam(mEncoderHandle, VO_PID_AAC_ENCPARAM, ¶ms)) {
- ALOGE("Failed to set AAC encoder parameters");
- return UNKNOWN_ERROR;
- }
-
- return OK;
-}
-
-static status_t getSampleRateTableIndex(int32_t sampleRate, int32_t &index) {
- static const int32_t kSampleRateTable[] = {
- 96000, 88200, 64000, 48000, 44100, 32000,
- 24000, 22050, 16000, 12000, 11025, 8000
- };
- const int32_t tableSize = sizeof(kSampleRateTable) / sizeof(kSampleRateTable[0]);
- for (int32_t i = 0; i < tableSize; ++i) {
- if (sampleRate == kSampleRateTable[i]) {
- index = i;
- return OK;
- }
- }
-
- ALOGE("Sampling rate %d bps is not supported", sampleRate);
- return UNKNOWN_ERROR;
-}
-
-status_t AACEncoder::setAudioSpecificConfigData() {
- ALOGV("setAudioSpecificConfigData: %d hz, %d bps, and %d channels",
- mSampleRate, mBitRate, mChannels);
-
- int32_t index = 0;
- CHECK_EQ((status_t)OK, getSampleRateTableIndex(mSampleRate, index));
- if (mChannels > 2 || mChannels <= 0) {
- ALOGE("Unsupported number of channels(%d)", mChannels);
- return UNKNOWN_ERROR;
- }
-
- // OMX_AUDIO_AACObjectLC
- mAudioSpecificConfigData[0] = ((0x02 << 3) | (index >> 1));
- mAudioSpecificConfigData[1] = ((index & 0x01) << 7) | (mChannels << 3);
- return OK;
-}
-
-AACEncoder::~AACEncoder() {
- if (mStarted) {
- stop();
- }
-}
-
-status_t AACEncoder::start(MetaData *params) {
- if (mStarted) {
- ALOGW("Call start() when encoder already started");
- return OK;
- }
-
- mBufferGroup = new MediaBufferGroup;
- mBufferGroup->add_buffer(new MediaBuffer(2048));
-
- CHECK_EQ((status_t)OK, initCheck());
-
- mNumInputSamples = 0;
- mAnchorTimeUs = 0;
- mFrameCount = 0;
-
- mInputFrame = new int16_t[mChannels * kNumSamplesPerFrame];
- CHECK(mInputFrame != NULL);
-
- status_t err = mSource->start(params);
- if (err != OK) {
- ALOGE("AudioSource is not available");
- return err;
- }
-
- mStarted = true;
-
- return OK;
-}
-
-status_t AACEncoder::stop() {
- if (mInputBuffer) {
- mInputBuffer->release();
- mInputBuffer = NULL;
- }
-
- delete mBufferGroup;
- mBufferGroup = NULL;
-
- if (mInputFrame) {
- delete[] mInputFrame;
- mInputFrame = NULL;
- }
-
- if (!mStarted) {
- ALOGW("Call stop() when encoder has not started");
- return ERROR_END_OF_STREAM;
- }
-
- mSource->stop();
- if (mEncoderHandle) {
- CHECK_EQ((VO_U32)VO_ERR_NONE, mApiHandle->Uninit(mEncoderHandle));
- mEncoderHandle = NULL;
- }
- delete mApiHandle;
- mApiHandle = NULL;
-
- delete mMemOperator;
- mMemOperator = NULL;
-
- mStarted = false;
-
- return OK;
-}
-
-sp<MetaData> AACEncoder::getFormat() {
- sp<MetaData> srcFormat = mSource->getFormat();
-
- mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC);
-
- int64_t durationUs;
- if (srcFormat->findInt64(kKeyDuration, &durationUs)) {
- mMeta->setInt64(kKeyDuration, durationUs);
- }
-
- mMeta->setCString(kKeyDecoderComponent, "AACEncoder");
-
- return mMeta;
-}
-
-status_t AACEncoder::read(
- MediaBuffer **out, const ReadOptions *options) {
- *out = NULL;
-
- int64_t seekTimeUs;
- ReadOptions::SeekMode mode;
- CHECK(options == NULL || !options->getSeekTo(&seekTimeUs, &mode));
-
- MediaBuffer *buffer;
- CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), (status_t)OK);
- uint8_t *outPtr = (uint8_t *)buffer->data();
- bool readFromSource = false;
- int64_t wallClockTimeUs = -1;
-
- if (mFrameCount == 0) {
- memcpy(outPtr, mAudioSpecificConfigData, 2);
- buffer->set_range(0, 2);
- buffer->meta_data()->setInt32(kKeyIsCodecConfig, true);
- *out = buffer;
- ++mFrameCount;
- return OK;
- } else if (mFrameCount == 1) {
- buffer->meta_data()->setInt32(kKeyIsCodecConfig, false);
- }
-
- const int32_t nSamples = mChannels * kNumSamplesPerFrame;
- while (mNumInputSamples < nSamples) {
- if (mInputBuffer == NULL) {
- if (mSource->read(&mInputBuffer, options) != OK) {
- if (mNumInputSamples == 0) {
- buffer->release();
- return ERROR_END_OF_STREAM;
- }
- memset(&mInputFrame[mNumInputSamples],
- 0,
- sizeof(int16_t) * (nSamples - mNumInputSamples));
- mNumInputSamples = 0;
- break;
- }
-
- size_t align = mInputBuffer->range_length() % sizeof(int16_t);
- CHECK_EQ(align, (size_t)0);
-
- int64_t timeUs;
- if (mInputBuffer->meta_data()->findInt64(kKeyDriftTime, &timeUs)) {
- wallClockTimeUs = timeUs;
- }
- if (mInputBuffer->meta_data()->findInt64(kKeyAnchorTime, &timeUs)) {
- mAnchorTimeUs = timeUs;
- }
- readFromSource = true;
- } else {
- readFromSource = false;
- }
- size_t copy = (nSamples - mNumInputSamples) * sizeof(int16_t);
-
- if (copy > mInputBuffer->range_length()) {
- copy = mInputBuffer->range_length();
- }
-
- memcpy(&mInputFrame[mNumInputSamples],
- (const uint8_t *) mInputBuffer->data()
- + mInputBuffer->range_offset(),
- copy);
-
- mInputBuffer->set_range(
- mInputBuffer->range_offset() + copy,
- mInputBuffer->range_length() - copy);
-
- if (mInputBuffer->range_length() == 0) {
- mInputBuffer->release();
- mInputBuffer = NULL;
- }
- mNumInputSamples += copy / sizeof(int16_t);
- if (mNumInputSamples >= nSamples) {
- mNumInputSamples %= nSamples;
- break;
- }
- }
-
- VO_CODECBUFFER inputData;
- memset(&inputData, 0, sizeof(inputData));
- inputData.Buffer = (unsigned char*) mInputFrame;
- inputData.Length = nSamples * sizeof(int16_t);
- CHECK((VO_U32)VO_ERR_NONE == mApiHandle->SetInputData(mEncoderHandle,&inputData));
-
- VO_CODECBUFFER outputData;
- memset(&outputData, 0, sizeof(outputData));
- VO_AUDIO_OUTPUTINFO outputInfo;
- memset(&outputInfo, 0, sizeof(outputInfo));
-
- VO_U32 ret = VO_ERR_NONE;
- size_t nOutputBytes = 0;
- do {
- outputData.Buffer = outPtr;
- outputData.Length = buffer->size() - nOutputBytes;
- ret = mApiHandle->GetOutputData(mEncoderHandle, &outputData, &outputInfo);
- if (ret == VO_ERR_NONE) {
- outPtr += outputData.Length;
- nOutputBytes += outputData.Length;
- }
- } while (ret != VO_ERR_INPUT_BUFFER_SMALL);
- buffer->set_range(0, nOutputBytes);
-
- int64_t mediaTimeUs =
- ((mFrameCount - 1) * 1000000LL * kNumSamplesPerFrame) / mSampleRate;
-
- buffer->meta_data()->setInt64(kKeyTime, mAnchorTimeUs + mediaTimeUs);
- if (readFromSource && wallClockTimeUs != -1) {
- buffer->meta_data()->setInt64(kKeyDriftTime, mediaTimeUs - wallClockTimeUs);
- }
- ++mFrameCount;
-
- *out = buffer;
- return OK;
-}
-
-} // namespace android
diff --git a/media/libstagefright/codecs/aacenc/Android.bp b/media/libstagefright/codecs/aacenc/Android.bp
index 1a7ffca..432047b 100644
--- a/media/libstagefright/codecs/aacenc/Android.bp
+++ b/media/libstagefright/codecs/aacenc/Android.bp
@@ -1,114 +1,3 @@
-cc_library_static {
- name: "libstagefright_aacenc",
-
- srcs: [
- "basic_op/basicop2.c",
- "basic_op/oper_32b.c",
-
- "AACEncoder.cpp",
- "src/aac_rom.c",
- "src/aacenc.c",
- "src/aacenc_core.c",
- "src/adj_thr.c",
- "src/band_nrg.c",
- "src/bit_cnt.c",
- "src/bitbuffer.c",
- "src/bitenc.c",
- "src/block_switch.c",
- "src/channel_map.c",
- "src/dyn_bits.c",
- "src/grp_data.c",
- "src/interface.c",
- "src/line_pe.c",
- "src/ms_stereo.c",
- "src/pre_echo_control.c",
- "src/psy_configuration.c",
- "src/psy_main.c",
- "src/qc_main.c",
- "src/quantize.c",
- "src/sf_estim.c",
- "src/spreading.c",
- "src/stat_bits.c",
- "src/tns.c",
- "src/transform.c",
- "src/memalign.c",
- ],
-
- arch: {
- arm: {
- srcs: [
- "src/asm/ARMV5E/AutoCorrelation_v5.s",
- "src/asm/ARMV5E/band_nrg_v5.s",
- "src/asm/ARMV5E/CalcWindowEnergy_v5.s",
- "src/asm/ARMV5E/PrePostMDCT_v5.s",
- "src/asm/ARMV5E/R4R8First_v5.s",
- "src/asm/ARMV5E/Radix4FFT_v5.s",
- ],
-
- cflags: [
- "-DARMV5E",
- "-DARM_INASM",
- "-DARMV5_INASM",
- ],
-
- local_include_dirs: ["src/asm/ARMV5E"],
-
- instruction_set: "arm",
-
- armv7_a_neon: {
- exclude_srcs: [
- "src/asm/ARMV5E/PrePostMDCT_v5.s",
- "src/asm/ARMV5E/R4R8First_v5.s",
- "src/asm/ARMV5E/Radix4FFT_v5.s",
- ],
- srcs: [
- "src/asm/ARMV7/PrePostMDCT_v7.s",
- "src/asm/ARMV7/R4R8First_v7.s",
- "src/asm/ARMV7/Radix4FFT_v7.s",
- ],
-
- cflags: [
- "-DARMV7Neon",
- "-DARMV6_INASM",
- ],
-
- local_include_dirs: ["src/asm/ARMV7"],
- },
- },
- },
-
- // libstagefright links this static library, so it probably isn't appropriate to
- // link libstagefright. However, this library includes libstagefright headers,
- // and needs libbinder to be able to do so correctly.
- shared_libs: [
- "libbinder",
- "libstagefright_enc_common",
- ],
-
- include_dirs: [
- "frameworks/av/include",
- "frameworks/av/media/libstagefright/include",
- ],
-
- local_include_dirs: [
- "src",
- "inc",
- "basic_op",
- ],
-
- cflags: ["-Werror"],
-
- sanitize: {
- misc_undefined: [
- "signed-integer-overflow",
- "unsigned-integer-overflow",
- ],
- },
-
-}
-
-//###############################################################################
-
cc_library_shared {
name: "libstagefright_soft_aacenc",
@@ -141,36 +30,3 @@
"liblog",
],
}
-
-cc_library_shared {
- name: "libstagefright_soft_aacenc_visualon",
-
- srcs: ["SoftAACEncoder.cpp"],
-
- include_dirs: [
- "frameworks/av/media/libstagefright/include",
- "frameworks/native/include/media/openmax",
- ],
-
- cflags: [
- "-DOSCL_IMPORT_REF=",
- "-Werror",
- ],
-
- sanitize: {
- misc_undefined: [
- "signed-integer-overflow",
- "unsigned-integer-overflow",
- ],
- },
-
- static_libs: ["libstagefright_aacenc"],
-
- shared_libs: [
- "libstagefright_omx",
- "libstagefright_foundation",
- "libutils",
- "liblog",
- "libstagefright_enc_common",
- ],
-}
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c b/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c
deleted file mode 100644
index 2f31de4..0000000
--- a/media/libstagefright/codecs/aacenc/SampleCode/AAC_E_SAMPLES.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: AAC_E_SAMPLES.h
-
- Content: sample code for AAC encoder
-
-*******************************************************************************/
-
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include "voAAC.h"
-#include "cmnMemory.h"
-
-#define VO_AAC_E_OUTPUT 1
-#define READ_SIZE (1024*8)
-unsigned char outBuf[1024*8];
-unsigned char inBuf[READ_SIZE];
-
-const char* HelpString =
-"VisualOn AAC encoder Usage:\n"
-"voAACEncTest -if <inputfile.pcm> -of <outputfile.aac> -sr <samplerate> -ch <channel> -br <bitrate> -adts <adts> \n"
-"-if input file name \n"
-"-of output file name \n"
-"-sr input pcm samplerate, default 44100 \n"
-"-ch input pcm channel, default 2 channel \n"
-"-br encoded aac bitrate, default 64000 * (samplerate/100)*channel/441(480)\n"
-"-adts add or no adts header, default add adts header\n"
-"For example: \n"
-"./voAACEncTest -if raw.pcm -of raw.aac -sr 44100 -ch 2 -br 128000\n";
-
-static int parsecmdline(int argc, char **argv,char **input_filename, char **output_filename, AACENC_PARAM *param)
-{
- // notice that:
- // bitRate/nChannels > 8000
- // bitRate/nChannels < 160000
- // bitRate/nChannels < sampleRate*6
- param->adtsUsed = 1;
- param->bitRate = 0;
- param->nChannels = 2;
- param->sampleRate = 44100;
-
- if(argc < 5 || argc > 13)
- {
- return -1;
- }
-
- argc--;
- argv++;
- while (argc > 0)
- {
- if (!strcmp(*argv, "-if"))
- {
- argv++;
- argc--;
- *input_filename = *argv;
- }
- else if (!strcmp(*argv, "-of"))
- {
- argv++;
- argc--;
- *output_filename = *argv;
- }
- else if (!strcmp(*argv, "-sr"))
- {
- argv++;
- argc--;
- param->sampleRate = atoi(*argv);
- }
- else if (!strcmp(*argv, "-ch"))
- {
- argv++;
- argc--;
- param->nChannels = atoi(*argv);
- }
- else if (!strcmp(*argv, "-br"))
- {
- argv++;
- argc--;
- param->bitRate = atoi(*argv);
- }
- else if(!strcmp(*argv, "-adts"))
- {
- argv++;
- argc--;
- param->adtsUsed = atoi(*argv);
- }
- else
- {
- return -1;
- }
-
- argv++;
- argc--;
- }
-
- if(param->bitRate == 0)
- {
- int scale = 441;
- if(param->sampleRate%8000 == 0)
- scale = 480;
- param->bitRate = 640*param->nChannels*param->sampleRate/scale;
- }
-
- return 0;
-}
-
-int ReadFile2Buf(FILE* infile,unsigned char* dest,int readSize)
-{
- int readBytes = 0;
- readBytes = fread(dest, 1, readSize, infile);
- return readBytes;
-}
-
-typedef int (VO_API * VOGETAUDIODECAPI) (VO_AUDIO_CODECAPI * pDecHandle);
-
-int main(int argc, char **argv)
-{
- FILE *infile, *outfile;
- int t1, t2;
- VO_AUDIO_CODECAPI AudioAPI;
- VO_MEM_OPERATOR moper;
- VO_CODEC_INIT_USERDATA useData;
- VO_HANDLE hCodec;
- VO_CODECBUFFER inData;
- VO_CODECBUFFER outData;
- VO_AUDIO_OUTPUTINFO outInfo;
- int firstWrite = 1;
- int eofFile = 0;
- int *info=(int*)inBuf;
- int bytesLeft, nRead;
- int EncoderdFrame = 0;
- int total = 0;
- int isOutput = 1;
- int returnCode;
- AACENC_PARAM aacpara;
- void *handle;
- void *pfunc;
- VOGETAUDIODECAPI pGetAPI;
- const char *infileName = NULL;
- const char *outfileName = NULL;
-
- returnCode = parsecmdline(argc,argv, &infileName, &outfileName, &aacpara);
- if(returnCode)
- {
- printf("%s", HelpString);
- return 0;
- }
-
- /* open input file */
- infile = fopen(infileName, "rb");
- if (!infile) {
- printf("Open input file fail...");
- return -1;
- }
-
- /* open output file */
- if(isOutput)
- {
- outfile = fopen(outfileName, "wb");
- if (!outfile) {
- printf("Open output file fail...");
- return -1;
- }
- }
- // set memory operators;
- moper.Alloc = cmnMemAlloc;
- moper.Copy = cmnMemCopy;
- moper.Free = cmnMemFree;
- moper.Set = cmnMemSet;
- moper.Check = cmnMemCheck;
- useData.memflag = VO_IMF_USERMEMOPERATOR;
- useData.memData = (VO_PTR)(&moper);
- // open encoder dll;
- handle = dlopen("libstagefright.so", RTLD_NOW);
- if(handle == 0)
- {
- printf("open dll error......");
- return -1;
- }
- // Get API;
- pfunc = dlsym(handle, "voGetAACEncAPI");
- if(pfunc == 0)
- {
- printf("open function error......");
- return -1;
- }
- pGetAPI = (VOGETAUDIODECAPI)pfunc;
- returnCode = pGetAPI(&AudioAPI);
- if(returnCode)
- return -1;
-
-
-//####################################### Init Encoding Section #########################################
- returnCode = AudioAPI.Init(&hCodec, VO_AUDIO_CodingAAC, &useData);
- if(returnCode < 0)
- {
- printf("#### VOI_Error2:fail to initialize the Encoderr###\n");
- return -1;
- }
-
- returnCode = AudioAPI.SetParam(hCodec, VO_PID_AAC_ENCPARAM, &aacpara);
-
- inData.Buffer = inBuf;
- bytesLeft = ReadFile2Buf(infile,inData.Buffer,READ_SIZE);
-
-//####################################### Encoding Section #########################################
-
- do {
-
- inData.Length = bytesLeft;
- outData.Buffer = outBuf;
- outData.Length = 1024*8;
-
- t1 = clock();
-
- returnCode = AudioAPI.SetInputData(hCodec,&inData);
-
- do {
- outData.Buffer = outBuf;
- outData.Length = 1024*8;
-
- returnCode = AudioAPI.GetOutputData(hCodec,&outData, &outInfo);
-
- if(returnCode == 0)
- EncoderdFrame++;
- if(returnCode == VO_ERR_LICENSE_ERROR)
- break;
-
-#if VO_AAC_E_OUTPUT
- if (isOutput && returnCode == 0)
- {
- fwrite(outData.Buffer, 1, outData.Length, outfile);
- }
-#endif
- } while(returnCode != (VO_ERR_INPUT_BUFFER_SMALL));
-
- if(returnCode == VO_ERR_LICENSE_ERROR)
- break;
-
- t2 = clock();
- total += t2 - t1;
-
- if (!eofFile) {
- nRead = ReadFile2Buf(infile, inBuf,READ_SIZE);
- bytesLeft = nRead;
- inData.Buffer = inBuf;
- if (feof(infile))
- eofFile = 1;
- }
-
- } while (!eofFile && returnCode);
-
-
-//################################################ End Encoding Section #######################################################
- returnCode = AudioAPI.Uninit(hCodec);
-
- fclose(infile);
- if (outfile)
- {
- fclose(outfile);
- }
- dlclose(handle);
- return 0;
-}
-
-
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/Android.bp b/media/libstagefright/codecs/aacenc/SampleCode/Android.bp
deleted file mode 100644
index c6ba4f3..0000000
--- a/media/libstagefright/codecs/aacenc/SampleCode/Android.bp
+++ /dev/null
@@ -1,18 +0,0 @@
-cc_binary {
- name: "AACEncTest",
-
- srcs: ["AAC_E_SAMPLES.c"],
-
- arch: {
- arm: {
- instruction_set: "arm",
- },
- },
-
- shared_libs: [
- "libstagefright",
- "libdl",
- ],
-
- static_libs: ["libstagefright_enc_common"],
-}
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/MODULE_LICENSE_APACHE2 b/media/libstagefright/codecs/aacenc/SampleCode/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/media/libstagefright/codecs/aacenc/SampleCode/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/media/libstagefright/codecs/aacenc/SampleCode/NOTICE b/media/libstagefright/codecs/aacenc/SampleCode/NOTICE
deleted file mode 100644
index c5b1efa..0000000
--- a/media/libstagefright/codecs/aacenc/SampleCode/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
- Copyright (c) 2005-2008, The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
diff --git a/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp b/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp
deleted file mode 100644
index 0704294..0000000
--- a/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "SoftAACEncoder"
-#include <utils/Log.h>
-
-#include "SoftAACEncoder.h"
-
-#include "voAAC.h"
-#include "cmnMemory.h"
-
-#include <media/stagefright/foundation/ADebug.h>
-#include <media/stagefright/foundation/hexdump.h>
-
-namespace android {
-
-template<class T>
-static void InitOMXParams(T *params) {
- params->nSize = sizeof(T);
- params->nVersion.s.nVersionMajor = 1;
- params->nVersion.s.nVersionMinor = 0;
- params->nVersion.s.nRevision = 0;
- params->nVersion.s.nStep = 0;
-}
-
-SoftAACEncoder::SoftAACEncoder(
- const char *name,
- const OMX_CALLBACKTYPE *callbacks,
- OMX_PTR appData,
- OMX_COMPONENTTYPE **component)
- : SimpleSoftOMXComponent(name, callbacks, appData, component),
- mEncoderHandle(NULL),
- mApiHandle(NULL),
- mMemOperator(NULL),
- mNumChannels(1),
- mSampleRate(44100),
- mBitRate(0),
- mSentCodecSpecificData(false),
- mInputSize(0),
- mInputFrame(NULL),
- mInputTimeUs(-1ll),
- mSawInputEOS(false),
- mSignalledError(false) {
- initPorts();
- CHECK_EQ(initEncoder(), (status_t)OK);
-
- setAudioParams();
-}
-
-SoftAACEncoder::~SoftAACEncoder() {
- onReset();
-
- if (mEncoderHandle) {
- CHECK_EQ((VO_U32)VO_ERR_NONE, mApiHandle->Uninit(mEncoderHandle));
- mEncoderHandle = NULL;
- }
-
- delete mApiHandle;
- mApiHandle = NULL;
-
- delete mMemOperator;
- mMemOperator = NULL;
-}
-
-void SoftAACEncoder::initPorts() {
- OMX_PARAM_PORTDEFINITIONTYPE def;
- InitOMXParams(&def);
-
- def.nPortIndex = 0;
- def.eDir = OMX_DirInput;
- def.nBufferCountMin = kNumBuffers;
- def.nBufferCountActual = def.nBufferCountMin;
- def.nBufferSize = kNumSamplesPerFrame * sizeof(int16_t) * 2;
- def.bEnabled = OMX_TRUE;
- def.bPopulated = OMX_FALSE;
- def.eDomain = OMX_PortDomainAudio;
- def.bBuffersContiguous = OMX_FALSE;
- def.nBufferAlignment = 1;
-
- def.format.audio.cMIMEType = const_cast<char *>("audio/raw");
- def.format.audio.pNativeRender = NULL;
- def.format.audio.bFlagErrorConcealment = OMX_FALSE;
- def.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
-
- addPort(def);
-
- def.nPortIndex = 1;
- def.eDir = OMX_DirOutput;
- def.nBufferCountMin = kNumBuffers;
- def.nBufferCountActual = def.nBufferCountMin;
- def.nBufferSize = 8192;
- def.bEnabled = OMX_TRUE;
- def.bPopulated = OMX_FALSE;
- def.eDomain = OMX_PortDomainAudio;
- def.bBuffersContiguous = OMX_FALSE;
- def.nBufferAlignment = 2;
-
- def.format.audio.cMIMEType = const_cast<char *>("audio/aac");
- def.format.audio.pNativeRender = NULL;
- def.format.audio.bFlagErrorConcealment = OMX_FALSE;
- def.format.audio.eEncoding = OMX_AUDIO_CodingAAC;
-
- addPort(def);
-}
-
-status_t SoftAACEncoder::initEncoder() {
- mApiHandle = new VO_AUDIO_CODECAPI;
-
- if (VO_ERR_NONE != voGetAACEncAPI(mApiHandle)) {
- ALOGE("Failed to get api handle");
- return UNKNOWN_ERROR;
- }
-
- mMemOperator = new VO_MEM_OPERATOR;
- mMemOperator->Alloc = cmnMemAlloc;
- mMemOperator->Copy = cmnMemCopy;
- mMemOperator->Free = cmnMemFree;
- mMemOperator->Set = cmnMemSet;
- mMemOperator->Check = cmnMemCheck;
-
- VO_CODEC_INIT_USERDATA userData;
- memset(&userData, 0, sizeof(userData));
- userData.memflag = VO_IMF_USERMEMOPERATOR;
- userData.memData = (VO_PTR) mMemOperator;
- if (VO_ERR_NONE !=
- mApiHandle->Init(&mEncoderHandle, VO_AUDIO_CodingAAC, &userData)) {
- ALOGE("Failed to init AAC encoder");
- return UNKNOWN_ERROR;
- }
-
- return OK;
-}
-
-OMX_ERRORTYPE SoftAACEncoder::internalGetParameter(
- OMX_INDEXTYPE index, OMX_PTR params) {
- switch (index) {
- case OMX_IndexParamAudioPortFormat:
- {
- OMX_AUDIO_PARAM_PORTFORMATTYPE *formatParams =
- (OMX_AUDIO_PARAM_PORTFORMATTYPE *)params;
-
- if (!isValidOMXParam(formatParams)) {
- return OMX_ErrorBadParameter;
- }
-
- if (formatParams->nPortIndex > 1) {
- return OMX_ErrorUndefined;
- }
-
- if (formatParams->nIndex > 0) {
- return OMX_ErrorNoMore;
- }
-
- formatParams->eEncoding =
- (formatParams->nPortIndex == 0)
- ? OMX_AUDIO_CodingPCM : OMX_AUDIO_CodingAAC;
-
- return OMX_ErrorNone;
- }
-
- case OMX_IndexParamAudioAac:
- {
- OMX_AUDIO_PARAM_AACPROFILETYPE *aacParams =
- (OMX_AUDIO_PARAM_AACPROFILETYPE *)params;
-
- if (!isValidOMXParam(aacParams)) {
- return OMX_ErrorBadParameter;
- }
-
- if (aacParams->nPortIndex != 1) {
- return OMX_ErrorUndefined;
- }
-
- aacParams->nBitRate = mBitRate;
- aacParams->nAudioBandWidth = 0;
- aacParams->nAACtools = 0;
- aacParams->nAACERtools = 0;
- aacParams->eAACProfile = OMX_AUDIO_AACObjectMain;
- aacParams->eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF;
- aacParams->eChannelMode = OMX_AUDIO_ChannelModeStereo;
-
- aacParams->nChannels = mNumChannels;
- aacParams->nSampleRate = mSampleRate;
- aacParams->nFrameLength = 0;
-
- return OMX_ErrorNone;
- }
-
- case OMX_IndexParamAudioPcm:
- {
- OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams =
- (OMX_AUDIO_PARAM_PCMMODETYPE *)params;
-
- if (!isValidOMXParam(pcmParams)) {
- return OMX_ErrorBadParameter;
- }
-
- if (pcmParams->nPortIndex != 0) {
- return OMX_ErrorUndefined;
- }
-
- pcmParams->eNumData = OMX_NumericalDataSigned;
- pcmParams->eEndian = OMX_EndianBig;
- pcmParams->bInterleaved = OMX_TRUE;
- pcmParams->nBitPerSample = 16;
- pcmParams->ePCMMode = OMX_AUDIO_PCMModeLinear;
- pcmParams->eChannelMapping[0] = OMX_AUDIO_ChannelLF;
- pcmParams->eChannelMapping[1] = OMX_AUDIO_ChannelRF;
-
- pcmParams->nChannels = mNumChannels;
- pcmParams->nSamplingRate = mSampleRate;
-
- return OMX_ErrorNone;
- }
-
- default:
- return SimpleSoftOMXComponent::internalGetParameter(index, params);
- }
-}
-
-OMX_ERRORTYPE SoftAACEncoder::internalSetParameter(
- OMX_INDEXTYPE index, const OMX_PTR params) {
- switch (index) {
- case OMX_IndexParamStandardComponentRole:
- {
- const OMX_PARAM_COMPONENTROLETYPE *roleParams =
- (const OMX_PARAM_COMPONENTROLETYPE *)params;
-
- if (!isValidOMXParam(roleParams)) {
- return OMX_ErrorBadParameter;
- }
-
- if (strncmp((const char *)roleParams->cRole,
- "audio_encoder.aac",
- OMX_MAX_STRINGNAME_SIZE - 1)) {
- return OMX_ErrorUndefined;
- }
-
- return OMX_ErrorNone;
- }
-
- case OMX_IndexParamAudioPortFormat:
- {
- const OMX_AUDIO_PARAM_PORTFORMATTYPE *formatParams =
- (const OMX_AUDIO_PARAM_PORTFORMATTYPE *)params;
-
- if (!isValidOMXParam(formatParams)) {
- return OMX_ErrorBadParameter;
- }
-
- if (formatParams->nPortIndex > 1) {
- return OMX_ErrorUndefined;
- }
-
- if ((formatParams->nPortIndex == 0
- && formatParams->eEncoding != OMX_AUDIO_CodingPCM)
- || (formatParams->nPortIndex == 1
- && formatParams->eEncoding != OMX_AUDIO_CodingAAC)) {
- return OMX_ErrorUndefined;
- }
-
- return OMX_ErrorNone;
- }
-
- case OMX_IndexParamAudioAac:
- {
- OMX_AUDIO_PARAM_AACPROFILETYPE *aacParams =
- (OMX_AUDIO_PARAM_AACPROFILETYPE *)params;
-
- if (!isValidOMXParam(aacParams)) {
- return OMX_ErrorBadParameter;
- }
-
- if (aacParams->nPortIndex != 1) {
- return OMX_ErrorUndefined;
- }
-
- mBitRate = aacParams->nBitRate;
- mNumChannels = aacParams->nChannels;
- mSampleRate = aacParams->nSampleRate;
-
- if (setAudioParams() != OK) {
- return OMX_ErrorUndefined;
- }
-
- return OMX_ErrorNone;
- }
-
- case OMX_IndexParamAudioPcm:
- {
- OMX_AUDIO_PARAM_PCMMODETYPE *pcmParams =
- (OMX_AUDIO_PARAM_PCMMODETYPE *)params;
-
- if (!isValidOMXParam(pcmParams)) {
- return OMX_ErrorBadParameter;
- }
-
- if (pcmParams->nPortIndex != 0) {
- return OMX_ErrorUndefined;
- }
-
- mNumChannels = pcmParams->nChannels;
- mSampleRate = pcmParams->nSamplingRate;
-
- if (setAudioParams() != OK) {
- return OMX_ErrorUndefined;
- }
-
- return OMX_ErrorNone;
- }
-
-
- default:
- return SimpleSoftOMXComponent::internalSetParameter(index, params);
- }
-}
-
-status_t SoftAACEncoder::setAudioParams() {
- // We call this whenever sample rate, number of channels or bitrate change
- // in reponse to setParameter calls.
-
- ALOGV("setAudioParams: %u Hz, %u channels, %u bps",
- mSampleRate, mNumChannels, mBitRate);
-
- status_t err = setAudioSpecificConfigData();
-
- if (err != OK) {
- return err;
- }
-
- AACENC_PARAM params;
- memset(¶ms, 0, sizeof(params));
- params.sampleRate = mSampleRate;
- params.bitRate = mBitRate;
- params.nChannels = mNumChannels;
- params.adtsUsed = 0; // We add adts header in the file writer if needed.
- if (VO_ERR_NONE != mApiHandle->SetParam(
- mEncoderHandle, VO_PID_AAC_ENCPARAM, ¶ms)) {
- ALOGE("Failed to set AAC encoder parameters");
- return UNKNOWN_ERROR;
- }
-
- return OK;
-}
-
-static status_t getSampleRateTableIndex(int32_t sampleRate, int32_t &index) {
- static const int32_t kSampleRateTable[] = {
- 96000, 88200, 64000, 48000, 44100, 32000,
- 24000, 22050, 16000, 12000, 11025, 8000
- };
- const int32_t tableSize =
- sizeof(kSampleRateTable) / sizeof(kSampleRateTable[0]);
-
- for (int32_t i = 0; i < tableSize; ++i) {
- if (sampleRate == kSampleRateTable[i]) {
- index = i;
- return OK;
- }
- }
-
- return UNKNOWN_ERROR;
-}
-
-status_t SoftAACEncoder::setAudioSpecificConfigData() {
- // The AAC encoder's audio specific config really only encodes
- // number of channels and the sample rate (mapped to an index into
- // a fixed sample rate table).
-
- int32_t index;
- status_t err = getSampleRateTableIndex(mSampleRate, index);
- if (err != OK) {
- ALOGE("Unsupported sample rate (%u Hz)", mSampleRate);
- return err;
- }
-
- if (mNumChannels > 2 || mNumChannels <= 0) {
- ALOGE("Unsupported number of channels(%u)", mNumChannels);
- return UNKNOWN_ERROR;
- }
-
- // OMX_AUDIO_AACObjectLC
- mAudioSpecificConfigData[0] = ((0x02 << 3) | (index >> 1));
- mAudioSpecificConfigData[1] = ((index & 0x01) << 7) | (mNumChannels << 3);
-
- return OK;
-}
-
-void SoftAACEncoder::onQueueFilled(OMX_U32 /*portIndex*/) {
- if (mSignalledError) {
- return;
- }
-
- List<BufferInfo *> &inQueue = getPortQueue(0);
- List<BufferInfo *> &outQueue = getPortQueue(1);
-
- if (!mSentCodecSpecificData) {
- // The very first thing we want to output is the codec specific
- // data. It does not require any input data but we will need an
- // output buffer to store it in.
-
- if (outQueue.empty()) {
- return;
- }
-
- BufferInfo *outInfo = *outQueue.begin();
- OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader;
- outHeader->nFilledLen = sizeof(mAudioSpecificConfigData);
- outHeader->nFlags = OMX_BUFFERFLAG_CODECCONFIG;
-
- uint8_t *out = outHeader->pBuffer + outHeader->nOffset;
- memcpy(out, mAudioSpecificConfigData, sizeof(mAudioSpecificConfigData));
-
-#if 0
- ALOGI("sending codec specific data.");
- hexdump(out, sizeof(mAudioSpecificConfigData));
-#endif
-
- outQueue.erase(outQueue.begin());
- outInfo->mOwnedByUs = false;
- notifyFillBufferDone(outHeader);
-
- mSentCodecSpecificData = true;
- }
-
- size_t numBytesPerInputFrame =
- mNumChannels * kNumSamplesPerFrame * sizeof(int16_t);
-
- for (;;) {
- // We do the following until we run out of buffers.
-
- while (mInputSize < numBytesPerInputFrame) {
- // As long as there's still input data to be read we
- // will drain "kNumSamplesPerFrame * mNumChannels" samples
- // into the "mInputFrame" buffer and then encode those
- // as a unit into an output buffer.
-
- if (mSawInputEOS || inQueue.empty()) {
- return;
- }
-
- BufferInfo *inInfo = *inQueue.begin();
- OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader;
-
- const void *inData = inHeader->pBuffer + inHeader->nOffset;
-
- size_t copy = numBytesPerInputFrame - mInputSize;
- if (copy > inHeader->nFilledLen) {
- copy = inHeader->nFilledLen;
- }
-
- if (mInputFrame == NULL) {
- mInputFrame = new int16_t[kNumSamplesPerFrame * mNumChannels];
- }
-
- if (mInputSize == 0) {
- mInputTimeUs = inHeader->nTimeStamp;
- }
-
- memcpy((uint8_t *)mInputFrame + mInputSize, inData, copy);
- mInputSize += copy;
-
- inHeader->nOffset += copy;
- inHeader->nFilledLen -= copy;
-
- // "Time" on the input buffer has in effect advanced by the
- // number of audio frames we just advanced nOffset by.
- inHeader->nTimeStamp +=
- (copy * 1000000ll / mSampleRate)
- / (mNumChannels * sizeof(int16_t));
-
- if (inHeader->nFilledLen == 0) {
- if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
- ALOGV("saw input EOS");
- mSawInputEOS = true;
-
- // Pad any remaining data with zeroes.
- memset((uint8_t *)mInputFrame + mInputSize,
- 0,
- numBytesPerInputFrame - mInputSize);
-
- mInputSize = numBytesPerInputFrame;
- }
-
- inQueue.erase(inQueue.begin());
- inInfo->mOwnedByUs = false;
- notifyEmptyBufferDone(inHeader);
-
- inData = NULL;
- inHeader = NULL;
- inInfo = NULL;
- }
- }
-
- // At this point we have all the input data necessary to encode
- // a single frame, all we need is an output buffer to store the result
- // in.
-
- if (outQueue.empty()) {
- return;
- }
-
- BufferInfo *outInfo = *outQueue.begin();
- OMX_BUFFERHEADERTYPE *outHeader = outInfo->mHeader;
-
- VO_CODECBUFFER inputData;
- memset(&inputData, 0, sizeof(inputData));
- inputData.Buffer = (unsigned char *)mInputFrame;
- inputData.Length = numBytesPerInputFrame;
- CHECK((VO_U32)VO_ERR_NONE ==
- mApiHandle->SetInputData(mEncoderHandle, &inputData));
-
- VO_CODECBUFFER outputData;
- memset(&outputData, 0, sizeof(outputData));
- VO_AUDIO_OUTPUTINFO outputInfo;
- memset(&outputInfo, 0, sizeof(outputInfo));
-
- uint8_t *outPtr = (uint8_t *)outHeader->pBuffer + outHeader->nOffset;
- size_t outAvailable = outHeader->nAllocLen - outHeader->nOffset;
-
- VO_U32 ret = VO_ERR_NONE;
- size_t nOutputBytes = 0;
- do {
- outputData.Buffer = outPtr;
- outputData.Length = outAvailable - nOutputBytes;
- ret = mApiHandle->GetOutputData(
- mEncoderHandle, &outputData, &outputInfo);
- if (ret == VO_ERR_NONE) {
- outPtr += outputData.Length;
- nOutputBytes += outputData.Length;
- }
- } while (ret != VO_ERR_INPUT_BUFFER_SMALL);
-
- outHeader->nFilledLen = nOutputBytes;
-
- outHeader->nFlags = OMX_BUFFERFLAG_ENDOFFRAME;
-
- if (mSawInputEOS) {
- // We also tag this output buffer with EOS if it corresponds
- // to the final input buffer.
- outHeader->nFlags = OMX_BUFFERFLAG_EOS;
- }
-
- outHeader->nTimeStamp = mInputTimeUs;
-
-#if 0
- ALOGI("sending %d bytes of data (time = %lld us, flags = 0x%08lx)",
- nOutputBytes, mInputTimeUs, outHeader->nFlags);
-
- hexdump(outHeader->pBuffer + outHeader->nOffset, outHeader->nFilledLen);
-#endif
-
- outQueue.erase(outQueue.begin());
- outInfo->mOwnedByUs = false;
- notifyFillBufferDone(outHeader);
-
- outHeader = NULL;
- outInfo = NULL;
-
- mInputSize = 0;
- }
-}
-
-void SoftAACEncoder::onReset() {
- delete[] mInputFrame;
- mInputFrame = NULL;
- mInputSize = 0;
-
- mSentCodecSpecificData = false;
- mInputTimeUs = -1ll;
- mSawInputEOS = false;
- mSignalledError = false;
-}
-
-} // namespace android
-
-android::SoftOMXComponent *createSoftOMXComponent(
- const char *name, const OMX_CALLBACKTYPE *callbacks,
- OMX_PTR appData, OMX_COMPONENTTYPE **component) {
- return new android::SoftAACEncoder(name, callbacks, appData, component);
-}
diff --git a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h
deleted file mode 100644
index bbc753b..0000000
--- a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h
+++ /dev/null
@@ -1,1168 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: basicop2.h
-
- Content: Constants , Globals and Basic arithmetic operators.
-
-*******************************************************************************/
-
-#ifndef __BASIC_OP_H
-#define __BASIC_OP_H
-
-#include "typedef.h"
-
-#define MAX_32 (Word32)0x7fffffffL
-#define MIN_32 (Word32)0x80000000L
-
-#define MAX_16 (Word16)0x7fff
-#define MIN_16 (Word16)0x8000
-#define ABS(a) ((a) >= 0) ? (a) : (-(a))
-
-/* Short abs, 1 */
-#define abs_s(x) ((Word16)(((x) != MIN_16) ? (((x) >= 0) ? (x) : (-(x))) : MAX_16))
-
-/* 16 bit var1 -> MSB, 2 */
-#define L_deposit_h(x) (((Word32)(x)) << 16)
-
-
-/* 16 bit var1 -> LSB, 2 */
-#define L_deposit_l(x) ((Word32)(x))
-
-
-/* Long abs, 3 */
-#define L_abs(x) (((x) != MIN_32) ? (((x) >= 0) ? (x) : (-(x))) : MAX_32)
-
-
-/* Short negate, 1 */
-#define negate(var1) ((Word16)(((var1) == MIN_16) ? MAX_16 : (-(var1))))
-
-
-/* Long negate, 2 */
-#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1)))
-
-
-#define MULHIGH(A,B) (int)(((Word64)(A)*(Word64)(B)) >> 32)
-#define fixmul(a, b) (int)((((Word64)(a)*(Word64)(b)) >> 32) << 1)
-
-
-#if (SATRUATE_IS_INLINE)
-__inline Word16 saturate(Word32 L_var1);
-#else
-Word16 saturate(Word32 L_var1);
-#endif
-
-/* Short shift left, 1 */
-#if (SHL_IS_INLINE)
-__inline Word16 shl (Word16 var1, Word16 var2);
-#else
-Word16 shl (Word16 var1, Word16 var2);
-#endif
-
-/* Short shift right, 1 */
-#if (SHR_IS_INLINE)
-__inline Word16 shr (Word16 var1, Word16 var2);
-#else
-Word16 shr (Word16 var1, Word16 var2);
-#endif
-
-#if (L_MULT_IS_INLINE)
-__inline Word32 L_mult(Word16 var1, Word16 var2);
-#else
-Word32 L_mult(Word16 var1, Word16 var2);
-#endif
-
-/* Msu, 1 */
-#if (L_MSU_IS_INLINE)
-__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
-#else
-Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2);
-#endif
-
-/* Long sub, 2 */
-#if (L_SUB_IS_INLINE)
-__inline Word32 L_sub(Word32 L_var1, Word32 L_var2);
-#else
-Word32 L_sub(Word32 L_var1, Word32 L_var2);
-#endif
-
-/* Long shift left, 2 */
-#if (L_SHL_IS_INLINE)
-__inline Word32 L_shl (Word32 L_var1, Word16 var2);
-#else
-Word32 L_shl (Word32 L_var1, Word16 var2);
-#endif
-
-/* Long shift right, 2*/
-#if (L_SHR_IS_INLINE)
-__inline Word32 L_shr (Word32 L_var1, Word16 var2);
-#else
-Word32 L_shr (Word32 L_var1, Word16 var2);
-#endif
-
-/* Short add, 1 */
-#if (ADD_IS_INLINE)
-__inline Word16 add (Word16 var1, Word16 var2);
-#else
-Word16 add (Word16 var1, Word16 var2);
-#endif
-
-/* Short sub, 1 */
-#if (SUB_IS_INLINE)
-__inline Word16 sub(Word16 var1, Word16 var2);
-#else
-Word16 sub(Word16 var1, Word16 var2);
-#endif
-
-/* Short division, 18 */
-#if (DIV_S_IS_INLINE)
-__inline Word16 div_s (Word16 var1, Word16 var2);
-#else
-Word16 div_s (Word16 var1, Word16 var2);
-#endif
-
-/* Short mult, 1 */
-#if (MULT_IS_INLINE)
-__inline Word16 mult (Word16 var1, Word16 var2);
-#else
-Word16 mult (Word16 var1, Word16 var2);
-#endif
-
-/* Short norm, 15 */
-#if (NORM_S_IS_INLINE)
-__inline Word16 norm_s (Word16 var1);
-#else
-Word16 norm_s (Word16 var1);
-#endif
-
-/* Long norm, 30 */
-#if (NORM_L_IS_INLINE)
-__inline Word16 norm_l (Word32 L_var1);
-#else
-Word16 norm_l (Word32 L_var1);
-#endif
-
-/* Round, 1 */
-#if (ROUND_IS_INLINE)
-__inline Word16 round16(Word32 L_var1);
-#else
-Word16 round16(Word32 L_var1);
-#endif
-
-/* Mac, 1 */
-#if (L_MAC_IS_INLINE)
-__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
-#else
-Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2);
-#endif
-
-#if (L_ADD_IS_INLINE)
-__inline Word32 L_add (Word32 L_var1, Word32 L_var2);
-#else
-Word32 L_add (Word32 L_var1, Word32 L_var2);
-#endif
-
-/* Extract high, 1 */
-#if (EXTRACT_H_IS_INLINE)
-__inline Word16 extract_h (Word32 L_var1);
-#else
-Word16 extract_h (Word32 L_var1);
-#endif
-
-/* Extract low, 1 */
-#if (EXTRACT_L_IS_INLINE)
-__inline Word16 extract_l(Word32 L_var1);
-#else
-Word16 extract_l(Word32 L_var1);
-#endif
-
-/* Mult with round, 2 */
-#if (MULT_R_IS_INLINE)
-__inline Word16 mult_r(Word16 var1, Word16 var2);
-#else
-Word16 mult_r(Word16 var1, Word16 var2);
-#endif
-
-/* Shift right with round, 2 */
-#if (SHR_R_IS_INLINE)
-__inline Word16 shr_r (Word16 var1, Word16 var2);
-#else
-Word16 shr_r (Word16 var1, Word16 var2);
-#endif
-
-/* Mac with rounding,2 */
-#if (MAC_R_IS_INLINE)
-__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
-#else
-Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2);
-#endif
-
-/* Msu with rounding,2 */
-#if (MSU_R_IS_INLINE)
-__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
-#else
-Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2);
-#endif
-
-/* Long shift right with round, 3 */
-#if (L_SHR_R_IS_INLINE)
-__inline Word32 L_shr_r (Word32 L_var1, Word16 var2);
-#else
-Word32 L_shr_r (Word32 L_var1, Word16 var2);
-#endif
-
-#if ARMV4_INASM
-__inline Word32 ASM_L_shr(Word32 L_var1, Word16 var2)
-{
- return L_var1 >> var2;
-}
-
-__inline Word32 ASM_L_shl(Word32 L_var1, Word16 var2)
-{
- Word32 result;
- asm (
- "MOV %[result], %[L_var1], ASL %[var2] \n"
- "TEQ %[L_var1], %[result], ASR %[var2]\n"
- "EORNE %[result], %[mask], %[L_var1], ASR #31\n"
- :[result]"=&r"(result)
- :[L_var1]"r"(L_var1), [var2]"r"(var2), [mask]"r"(0x7fffffff)
- );
- return result;
-}
-
-__inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
-{
- Word32 result;
- asm (
- "CMP %[var2], #15\n"
- "MOVLT %[result], %[L_var1], ASR %[var2]\n"
- "MOVGE %[result], %[L_var1], ASR #15\n"
- :[result]"=r"(result)
- :[L_var1]"r"(L_var1), [var2]"r"(var2)
- );
- return result;
-}
-
-__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
-{
-#if ARMV6_SAT
- Word32 result;
- asm (
- "CMP %[var2], #16\n"
- "MOVLT %[result], %[L_var1], ASL %[var2]\n"
- "MOVGE %[result], %[L_var1], ASL #16\n"
- "SSAT %[result], #16, %[result]\n"
- :[result]"=r"(result)
- :[L_var1]"r"(L_var1), [var2]"r"(var2)
- );
- return result;
-#else
- Word32 result;
- Word32 tmp;
- asm (
- "CMP %[var2], #16\n"
- "MOVLT %[result], %[L_var1], ASL %[var2]\n"
- "MOVGE %[result], %[L_var1], ASL #16\n"
- "MOV %[tmp], %[result], ASR #15\n"
- "TEQ %[tmp], %[result], ASR #31 \n"
- "EORNE %[result], %[mask], %[result],ASR #31"
- :[result]"=&r"(result), [tmp]"=&r"(tmp)
- :[L_var1]"r"(L_var1), [var2]"r"(var2), [mask]"r"(0x7fff)
- );
- return result;
-#endif
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | definitions for inline basic arithmetic operators |
- |___________________________________________________________________________|
-*/
-#if (SATRUATE_IS_INLINE)
-__inline Word16 saturate(Word32 L_var1)
-{
-#if ARMV6_SAT
- Word16 result;
- asm (
- "SSAT %[result], #16, %[L_var1]"
- : [result]"=r"(result)
- : [L_var1]"r"(L_var1)
- );
- return result;
-#elif ARMV5TE_SAT
- Word16 result;
- Word32 tmp;
- asm volatile (
- "MOV %[tmp], %[L_var1],ASR#15\n"
- "TEQ %[tmp], %[L_var1],ASR#31\n"
- "EORNE %[result], %[mask],%[L_var1],ASR#31\n"
- "MOVEQ %[result], %[L_var1]\n"
- :[result]"=&r"(result), [tmp]"=&r"(tmp)
- :[L_var1]"r"(L_var1), [mask]"r"(0x7fff)
- );
-
- return result;
-#else
- Word16 var_out;
-
- //var_out = (L_var1 > (Word32)0X00007fffL) ? (MAX_16) : ((L_var1 < (Word32)0xffff8000L) ? (MIN_16) : ((Word16)L_var1));
-
- if (L_var1 > 0X00007fffL)
- {
- var_out = MAX_16;
- }
- else if (L_var1 < (Word32) 0xffff8000L)
- {
- var_out = MIN_16;
- }
- else
- {
- var_out = extract_l(L_var1);
- }
-
- return (var_out);
-#endif
-}
-#endif
-
-/* Short shift left, 1 */
-#if (SHL_IS_INLINE)
-__inline Word16 shl (Word16 var1, Word16 var2)
-{
-#if ARMV5TE_SHL
- if(var2>=0)
- {
- return ASM_shl( var1, var2);
- }
- else
- {
- return ASM_shr( var1, -var2);
- }
-#else
- Word16 var_out;
- Word32 result;
-
- if (var2 < 0)
- {
- var_out = shr (var1, (Word16)-var2);
- }
- else
- {
- result = (Word32) var1 *((Word32) 1 << var2);
-
- if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
- {
- var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
- }
- else
- {
- var_out = extract_l(result);
- }
- }
- return (var_out);
-#endif
-}
-#endif
-
-/* Short shift right, 1 */
-#if (SHR_IS_INLINE)
-__inline Word16 shr (Word16 var1, Word16 var2)
-{
-#if ARMV5TE_SHR
- if(var2>=0)
- {
- return ASM_shr( var1, var2);
- }
- else
- {
- return ASM_shl( var1, -var2);
- }
-#else
- Word16 var_out;
-
- if (var2 < 0)
- {
- var_out = shl (var1, (Word16)-var2);
- }
- else
- {
- if (var2 >= 15)
- {
- var_out = (Word16)((var1 < 0) ? -1 : 0);
- }
- else
- {
- if (var1 < 0)
- {
- var_out = (Word16)(~((~var1) >> var2));
- }
- else
- {
- var_out = (Word16)(var1 >> var2);
- }
- }
- }
-
- return (var_out);
-#endif
-}
-#endif
-
-
-#if (L_MULT_IS_INLINE)
-__inline Word32 L_mult(Word16 var1, Word16 var2)
-{
-#if ARMV5TE_L_MULT
- Word32 result;
- asm (
- "SMULBB %[result], %[var1], %[var2] \n"
- "QADD %[result], %[result], %[result] \n"
- :[result]"=r"(result)
- :[var1]"r"(var1), [var2]"r"(var2)
- );
- return result;
-#else
- Word32 L_var_out;
-
- L_var_out = (Word32) var1 *(Word32) var2;
-
- if (L_var_out != (Word32) 0x40000000L)
- {
- L_var_out <<= 1;
- }
- else
- {
- L_var_out = MAX_32;
- }
- return (L_var_out);
-#endif
-}
-#endif
-
-#if (L_MSU_IS_INLINE)
-__inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
-{
-#if ARMV5TE_L_MSU
- Word32 result;
- asm (
- "SMULBB %[result], %[var1], %[var2] \n"
- "QDSUB %[result], %[L_var3], %[result]\n"
- :[result]"=&r"(result)
- :[L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
- );
- return result;
-#else
- Word32 L_var_out;
- Word32 L_product;
-
- L_product = L_mult(var1, var2);
- L_var_out = L_sub(L_var3, L_product);
- return (L_var_out);
-#endif
-}
-#endif
-
-#if (L_SUB_IS_INLINE)
-__inline Word32 L_sub(Word32 L_var1, Word32 L_var2)
-{
-#if ARMV5TE_L_SUB
- Word32 result;
- asm (
- "QSUB %[result], %[L_var1], %[L_var2]\n"
- :[result]"=r"(result)
- :[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
- );
- return result;
-#else
- Word32 L_var_out;
-
- L_var_out = L_var1 - L_var2;
-
- if (((L_var1 ^ L_var2) & MIN_32) != 0)
- {
- if ((L_var_out ^ L_var1) & MIN_32)
- {
- L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
- }
- }
-
- return (L_var_out);
-#endif
-}
-#endif
-
-#if (L_SHL_IS_INLINE)
-__inline Word32 L_shl(Word32 L_var1, Word16 var2)
-{
-#if ARMV5TE_L_SHL
- if(var2>=0)
- {
- return ASM_L_shl( L_var1, var2);
- }
- else
- {
- return ASM_L_shr( L_var1, -var2);
- }
-#else
- if (var2 <= 0)
- {
- L_var1 = L_shr(L_var1, (Word16)-var2);
- }
- else
- {
- for (; var2 > 0; var2--)
- {
- if (L_var1 > (Word32) 0X3fffffffL)
- {
- return MAX_32;
- }
- else
- {
- if (L_var1 < (Word32) 0xc0000000L)
- {
- return MIN_32;
- }
- }
- L_var1 <<= 1;
- }
- }
- return (L_var1);
-#endif
-}
-#endif
-
-#if (L_SHR_IS_INLINE)
-__inline Word32 L_shr (Word32 L_var1, Word16 var2)
-{
-#if ARMV5TE_L_SHR
- if(var2>=0)
- {
- return ASM_L_shr( L_var1, var2);
- }
- else
- {
- return ASM_L_shl( L_var1, -var2);
- }
-#else
- Word32 L_var_out;
-
- if (var2 < 0)
- {
- L_var_out = L_shl (L_var1, (Word16)-var2);
- }
- else
- {
- if (var2 >= 31)
- {
- L_var_out = (L_var1 < 0L) ? -1 : 0;
- }
- else
- {
- if (L_var1 < 0)
- {
- L_var_out = ~((~L_var1) >> var2);
- }
- else
- {
- L_var_out = L_var1 >> var2;
- }
- }
- }
- return (L_var_out);
-#endif
-}
-#endif
-
-/* Short add, 1 */
-#if (ADD_IS_INLINE)
-__inline Word16 add (Word16 var1, Word16 var2)
-{
-#if ARMV5TE_ADD
- Word32 result;
- Word32 tmp;
- asm (
- "ADD %[result], %[var1], %[var2] \n"
- "MOV %[tmp], %[result], ASR #15 \n"
- "TEQ %[tmp], %[result], ASR #31 \n"
- "EORNE %[result], %[mask], %[result], ASR #31"
- :[result]"=&r"(result), [tmp]"=&r"(tmp)
- :[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
- );
- return result;
-#else
- Word16 var_out;
- Word32 L_sum;
-
- L_sum = (Word32) var1 + var2;
- var_out = saturate(L_sum);
-
- return (var_out);
-#endif
-}
-#endif
-
-/* Short sub, 1 */
-#if (SUB_IS_INLINE)
-__inline Word16 sub(Word16 var1, Word16 var2)
-{
-#if ARMV5TE_SUB
- Word32 result;
- Word32 tmp;
- asm (
- "SUB %[result], %[var1], %[var2] \n"
- "MOV %[tmp], %[var1], ASR #15 \n"
- "TEQ %[tmp], %[var1], ASR #31 \n"
- "EORNE %[result], %[mask], %[result], ASR #31 \n"
- :[result]"=&r"(result), [tmp]"=&r"(tmp)
- :[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
- );
- return result;
-#else
- Word16 var_out;
- Word32 L_diff;
-
- L_diff = (Word32) var1 - var2;
- var_out = saturate(L_diff);
-
- return (var_out);
-#endif
-}
-#endif
-
-/* Short division, 18 */
-#if (DIV_S_IS_INLINE)
-__inline Word16 div_s (Word16 var1, Word16 var2)
-{
- Word16 var_out = 0;
- Word16 iteration;
- Word32 L_num;
- Word32 L_denom;
-
- var_out = MAX_16;
- if (var1!= var2)//var1!= var2
- {
- var_out = 0;
- L_num = (Word32) var1;
-
- L_denom = (Word32) var2;
-
- //return (L_num<<15)/var2;
-
- for (iteration = 0; iteration < 15; iteration++)
- {
- var_out <<= 1;
- L_num <<= 1;
-
- if (L_num >= L_denom)
- {
- L_num -= L_denom;
- var_out++;
- }
- }
- }
- return (var_out);
-}
-#endif
-
-/* Short mult, 1 */
-#if (MULT_IS_INLINE)
-__inline Word16 mult (Word16 var1, Word16 var2)
-{
-#if ARMV5TE_MULT && ARMV6_SAT
- Word32 result;
- asm (
- "SMULBB %[result], %[var1], %[var2] \n"
- "SSAT %[result], #16, %[result], ASR #15 \n"
- :[result]"=r"(result)
- :[var1]"r"(var1), [var2]"r"(var2)
- );
- return result;
-#elif ARMV5TE_MULT
- Word32 result, tmp;
- asm (
- "SMULBB %[tmp], %[var1], %[var2] \n"
- "MOV %[result], %[tmp], ASR #15\n"
- "MOV %[tmp], %[result], ASR #15\n"
- "TEQ %[tmp], %[result], ASR #31\n"
- "EORNE %[result], %[mask], %[result], ASR #31 \n"
- :[result]"=&r"(result), [tmp]"=&r"(tmp)
- :[var1]"r"(var1), [var2]"r"(var2), [mask]"r"(0x7fff)
- );
- return result;
-#else
- Word16 var_out;
- Word32 L_product;
-
- L_product = (Word32) var1 *(Word32) var2;
- L_product = (L_product & (Word32) 0xffff8000L) >> 15;
- if (L_product & (Word32) 0x00010000L)
- L_product = L_product | (Word32) 0xffff0000L;
- var_out = saturate(L_product);
-
- return (var_out);
-#endif
-}
-#endif
-
-
-/* Short norm, 15 */
-#if (NORM_S_IS_INLINE)
-__inline Word16 norm_s (Word16 var1)
-{
-#if ARMV5TE_NORM_S
- Word16 result;
- Word32 tmp;
- asm (
- "RSBS %[tmp], %[var1], #0 \n"
- "CLZLT %[result], %[var1]\n"
- "CLZGT %[result], %[tmp]\n"
- "SUBNE %[result], %[result], #17\n"
- "MOVEQ %[result], #0\n"
- "CMP %[var1], #-1\n"
- "MOVEQ %[result], #15\n"
- :[result]"=&r"(result), [tmp]"=&r"(tmp)
- :[var1]"r"(var1)
- );
- return result;
-#else
- Word16 var_out;
-
- if (var1 == 0)
- {
- var_out = 0;
- }
- else
- {
- if (var1 == -1)
- {
- var_out = 15;
- }
- else
- {
- if (var1 < 0)
- {
- var1 = (Word16)~var1;
- }
- for (var_out = 0; var1 < 0x4000; var_out++)
- {
- var1 <<= 1;
- }
- }
- }
- return (var_out);
-#endif
-}
-#endif
-
-/* Long norm, 30 */
-#if (NORM_L_IS_INLINE)
-__inline Word16 norm_l (Word32 L_var1)
-{
-#if ARMV5TE_NORM_L
- Word16 result;
- asm volatile(
- "CMP %[L_var1], #0\n"
- "CLZNE %[result], %[L_var1]\n"
- "SUBNE %[result], %[result], #1\n"
- "MOVEQ %[result], #0\n"
- :[result]"=r"(result)
- :[L_var1]"r"(L_var1)
- );
- return result;
-#else
- //Word16 var_out;
-
- //if (L_var1 == 0)
- //{
- // var_out = 0;
- //}
- //else
- //{
- // if (L_var1 == (Word32) 0xffffffffL)
- // {
- // var_out = 31;
- // }
- // else
- // {
- // if (L_var1 < 0)
- // {
- // L_var1 = ~L_var1;
- // }
- // for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
- // {
- // L_var1 <<= 1;
- // }
- // }
- //}
- //return (var_out);
- Word16 a16;
- Word16 r = 0 ;
-
-
- if ( L_var1 < 0 ) {
- L_var1 = ~L_var1;
- }
-
- if (0 == (L_var1 & 0x7fff8000)) {
- a16 = extract_l(L_var1);
- r += 16;
-
- if (0 == (a16 & 0x7f80)) {
- r += 8;
-
- if (0 == (a16 & 0x0078)) {
- r += 4;
-
- if (0 == (a16 & 0x0006)) {
- r += 2;
-
- if (0 == (a16 & 0x0001)) {
- r += 1;
- }
- }
- else {
-
- if (0 == (a16 & 0x0004)) {
- r += 1;
- }
- }
- }
- else {
-
- if (0 == (a16 & 0x0060)) {
- r += 2;
-
- if (0 == (a16 & 0x0010)) {
- r += 1;
- }
- }
- else {
-
- if (0 == (a16 & 0x0040)) {
- r += 1;
- }
- }
- }
- }
- else {
-
- if (0 == (a16 & 0x7800)) {
- r += 4;
-
- if (0 == (a16 & 0x0600)) {
- r += 2;
-
- if (0 == (a16 & 0x0100)) {
- r += 1;
- }
- }
- else {
-
- if (0 == (a16 & 0x0400)) {
- r += 1;
- }
- }
- }
- else {
-
- if (0 == (a16 & 0x6000)) {
- r += 2;
-
- if (0 == (a16 & 0x1000)) {
- r += 1;
- }
- }
- else {
-
- if (0 == (a16 & 0x4000)) {
- r += 1;
- }
- }
- }
- }
- }
- else {
- a16 = extract_h(L_var1);
-
- if (0 == (a16 & 0x7f80)) {
- r += 8;
-
- if (0 == (a16 & 0x0078)) {
- r += 4 ;
-
- if (0 == (a16 & 0x0006)) {
- r += 2;
-
- if (0 == (a16 & 0x0001)) {
- r += 1;
- }
- }
- else {
-
- if (0 == (a16 & 0x0004)) {
- r += 1;
- }
- }
- }
- else {
-
- if (0 == (a16 & 0x0060)) {
- r += 2;
-
- if (0 == (a16 & 0x0010)) {
- r += 1;
- }
- }
- else {
-
- if (0 == (a16 & 0x0040)) {
- r += 1;
- }
- }
- }
- }
- else {
-
- if (0 == (a16 & 0x7800)) {
- r += 4;
-
- if (0 == (a16 & 0x0600)) {
- r += 2;
-
- if (0 == (a16 & 0x0100)) {
- r += 1;
- }
- }
- else {
-
- if (0 == (a16 & 0x0400)) {
- r += 1;
- }
- }
- }
- else {
-
- if (0 == (a16 & 0x6000)) {
- r += 2;
-
- if (0 == (a16 & 0x1000)) {
- r += 1;
- }
- }
- else {
-
- if (0 == (a16 & 0x4000)) {
- return 1;
- }
- }
- }
- }
- }
-
- return r ;
-#endif
-}
-#endif
-
-/* Round, 1 */
-#if (ROUND_IS_INLINE)
-__inline Word16 round16(Word32 L_var1)
-{
-#if ARMV5TE_ROUND
- Word16 result;
- asm (
- "QADD %[result], %[L_var1], %[bias]\n"
- "MOV %[result], %[result], ASR #16 \n"
- :[result]"=r"(result)
- :[L_var1]"r"(L_var1), [bias]"r"(0x8000)
- );
- return result;
-#else
- Word16 var_out;
- Word32 L_rounded;
-
- L_rounded = L_add (L_var1, (Word32) 0x00008000L);
- var_out = extract_h (L_rounded);
- return (var_out);
-#endif
-}
-#endif
-
-/* Mac, 1 */
-#if (L_MAC_IS_INLINE)
-__inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
-{
-#if ARMV5TE_L_MAC
- Word32 result;
- asm (
- "SMULBB %[result], %[var1], %[var2]\n"
- "QDADD %[result], %[L_var3], %[result]\n"
- :[result]"=&r"(result)
- : [L_var3]"r"(L_var3), [var1]"r"(var1), [var2]"r"(var2)
- );
- return result;
-#else
- Word32 L_var_out;
- Word32 L_product;
-
- L_product = L_mult(var1, var2);
- L_var_out = L_add (L_var3, L_product);
- return (L_var_out);
-#endif
-}
-#endif
-
-#if (L_ADD_IS_INLINE)
-__inline Word32 L_add (Word32 L_var1, Word32 L_var2)
-{
-#if ARMV5TE_L_ADD
- Word32 result;
- asm (
- "QADD %[result], %[L_var1], %[L_var2]\n"
- :[result]"=r"(result)
- :[L_var1]"r"(L_var1), [L_var2]"r"(L_var2)
- );
- return result;
-#else
- Word32 L_var_out;
-
- L_var_out = L_var1 + L_var2;
- if (((L_var1 ^ L_var2) & MIN_32) == 0)
- {
- if ((L_var_out ^ L_var1) & MIN_32)
- {
- L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
- }
- }
- return (L_var_out);
-#endif
-}
-#endif
-
-
-
-#if (MULT_R_IS_INLINE)
-__inline Word16 mult_r (Word16 var1, Word16 var2)
-{
- Word16 var_out;
- Word32 L_product_arr;
-
- L_product_arr = (Word32)var1 *(Word32)var2; /* product */
- L_product_arr += (Word32)0x00004000L; /* round */
- L_product_arr >>= 15; /* shift */
-
- var_out = saturate(L_product_arr);
-
- return (var_out);
-}
-#endif
-
-#if (SHR_R_IS_INLINE)
-__inline Word16 shr_r (Word16 var1, Word16 var2)
-{
- Word16 var_out;
-
- if (var2 > 15)
- {
- var_out = 0;
- }
- else
- {
- var_out = shr(var1, var2);
-
- if (var2 > 0)
- {
- if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
- {
- var_out++;
- }
- }
- }
-
- return (var_out);
-}
-#endif
-
-#if (MAC_R_IS_INLINE)
-__inline Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
-{
- Word16 var_out;
-
- L_var3 = L_mac (L_var3, var1, var2);
- var_out = (Word16)((L_var3 + 0x8000L) >> 16);
-
- return (var_out);
-}
-#endif
-
-#if (MSU_R_IS_INLINE)
-__inline Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
-{
- Word16 var_out;
-
- L_var3 = L_msu (L_var3, var1, var2);
- var_out = (Word16)((L_var3 + 0x8000L) >> 16);
-
- return (var_out);
-}
-#endif
-
-#if (L_SHR_R_IS_INLINE)
-__inline Word32 L_shr_r (Word32 L_var1, Word16 var2)
-{
- Word32 L_var_out;
-
- if (var2 > 31)
- {
- L_var_out = 0;
- }
- else
- {
- L_var_out = L_shr(L_var1, var2);
-
- if (var2 > 0)
- {
- if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
- {
- L_var_out++;
- }
- }
- }
-
- return (L_var_out);
-}
-#endif
-
-#if (EXTRACT_H_IS_INLINE)
-__inline Word16 extract_h (Word32 L_var1)
-{
- Word16 var_out;
-
- var_out = (Word16) (L_var1 >> 16);
-
- return (var_out);
-}
-#endif
-
-#if (EXTRACT_L_IS_INLINE)
-__inline Word16 extract_l(Word32 L_var1)
-{
- return (Word16) L_var1;
-}
-#endif
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c b/media/libstagefright/codecs/aacenc/basic_op/basicop2.c
deleted file mode 100644
index d43bbd9..0000000
--- a/media/libstagefright/codecs/aacenc/basic_op/basicop2.c
+++ /dev/null
@@ -1,1624 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: basicop2.c
-
- Content: Basic arithmetic operators.
-
-*******************************************************************************/
-
-#include "typedef.h"
-#include "basic_op.h"
-
-
-/*___________________________________________________________________________
- | |
- | Functions |
- |___________________________________________________________________________|
-*/
-
-/*___________________________________________________________________________
- | |
- | Function Name : saturate |
- | |
- | Purpose : |
- | |
- | Limit the 32 bit input to the range of a 16 bit word. |
- | |
- | Inputs : |
- | |
- | L_var1 |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-
-#if (!SATRUATE_IS_INLINE)
-Word16 saturate(Word32 L_var1)
-{
- Word16 var_out;
-
- if (L_var1 > 0X00007fffL)
- {
- var_out = MAX_16;
- }
- else if (L_var1 < (Word32) 0xffff8000L)
- {
- var_out = MIN_16;
- }
- else
- {
- var_out = extract_l(L_var1);
- }
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : add |
- | |
- | Purpose : |
- | |
- | Performs the addition (var1+var2) with overflow control and saturation;|
- | the 16 bit result is set at +32767 when overflow occurs or at -32768 |
- | when underflow occurs. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-
-#if (!ADD_IS_INLINE)
-Word16 add (Word16 var1, Word16 var2)
-{
- Word16 var_out;
- Word32 L_sum;
-
- L_sum = (Word32)var1 + (Word32)var2;
- var_out = saturate(L_sum);
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : sub |
- | |
- | Purpose : |
- | |
- | Performs the subtraction (var1+var2) with overflow control and satu- |
- | ration; the 16 bit result is set at +32767 when overflow occurs or at |
- | -32768 when underflow occurs. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-#if (!SUB_IS_INLINE)
-Word16 sub(Word16 var1, Word16 var2)
-{
- Word16 var_out;
- Word32 L_diff;
-
- L_diff = (Word32) var1 - var2;
- var_out = saturate(L_diff);
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : abs_s |
- | |
- | Purpose : |
- | |
- | Absolute value of var1; abs_s(-32768) = 32767. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-//Word16 abs_s (Word16 var1)
-//{
-// Word16 var_out;
-//
-// if (var1 == MIN_16)
-// {
-// var_out = MAX_16;
-// }
-// else
-// {
-// if (var1 < 0)
-// {
-// var_out = (Word16)-var1;
-// }
-// else
-// {
-// var_out = var1;
-// }
-// }
-//
-// return (var_out);
-//}
-
-
-/*___________________________________________________________________________
- | |
- | Function Name : shl |
- | |
- | Purpose : |
- | |
- | Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|
- | the var2 LSB of the result. If var2 is negative, arithmetically shift |
- | var1 right by -var2 with sign extension. Saturate the result in case of |
- | underflows or overflows. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-
-#if (!SHL_IS_INLINE)
-Word16 shl (Word16 var1, Word16 var2)
-{
- Word16 var_out;
- Word32 result;
-
- if (var2 < 0)
- {
- if (var2 < -16)
- var2 = -16;
- var_out = shr (var1, (Word16)-var2);
- }
- else
- {
- result = (Word32) var1 *((Word32) 1 << var2);
-
- if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
- {
- //Overflow = 1;
- var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
- }
- else
- {
- var_out = extract_l(result);
- }
- }
-
- return (var_out);
-}
-#endif
-// end
-
-/*___________________________________________________________________________
- | |
- | Function Name : shr |
- | |
- | Purpose : |
- | |
- | Arithmetically shift the 16 bit input var1 right var2 positions with |
- | sign extension. If var2 is negative, arithmetically shift var1 left by |
- | -var2 with sign extension. Saturate the result in case of underflows or |
- | overflows. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-
-#if (!SHR_IS_INLINE)
-Word16 shr (Word16 var1, Word16 var2)
-{
- Word16 var_out;
-
- if (var2 < 0)
- {
- if (var2 < -16)
- var2 = -16;
- var_out = shl (var1, (Word16)-var2);
- }
- else
- {
- if (var2 >= 15)
- {
- var_out = (Word16)((var1 < 0) ? -1 : 0);
- }
- else
- {
- if (var1 < 0)
- {
- var_out = (Word16)(~((~var1) >> var2));
- }
- else
- {
- var_out = (Word16)(var1 >> var2);
- }
- }
- }
-
- return (var_out);
-}
-#endif
-
-
-/*___________________________________________________________________________
- | |
- | Function Name : mult |
- | |
- | Purpose : |
- | |
- | Performs the multiplication of var1 by var2 and gives a 16 bit result |
- | which is scaled i.e.: |
- | mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and |
- | mult(-32768,-32768) = 32767. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-#if (!MULT_IS_INLINE)
-Word16 mult (Word16 var1, Word16 var2)
-{
- Word16 var_out;
- Word32 L_product;
-
- L_product = (Word32) var1 *(Word32) var2;
-
- L_product = (L_product & (Word32) 0xffff8000L) >> 15;
-
- if (L_product & (Word32) 0x00010000L)
- L_product = L_product | (Word32) 0xffff0000L;
-
- var_out = saturate(L_product);
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_mult |
- | |
- | Purpose : |
- | |
- | L_mult is the 32 bit result of the multiplication of var1 times var2 |
- | with one shift left i.e.: |
- | L_mult(var1,var2) = L_shl((var1 times var2),1) and |
- | L_mult(-32768,-32768) = 2147483647. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-
-#if (!L_MULT_IS_INLINE)
-Word32 L_mult(Word16 var1, Word16 var2)
-{
- Word32 L_var_out;
-
- L_var_out = (Word32) var1 *(Word32) var2;
-
- if (L_var_out != (Word32) 0x40000000L)
- {
- L_var_out <<= 1;
- }
- else
- {
- L_var_out = MAX_32;
- }
-
- return (L_var_out);
-}
-#endif
-// end
-
-/*___________________________________________________________________________
- | |
- | Function Name : negate |
- | |
- | Purpose : |
- | |
- | Negate var1 with saturation, saturate in the case where input is -32768:|
- | negate(var1) = sub(0,var1). |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-//Word16 negate (Word16 var1)
-//{
-// Word16 var_out;
-//
-// var_out = (Word16)((var1 == MIN_16) ? MAX_16 : -var1);
-//
-// return (var_out);
-//}
-
-
-/*___________________________________________________________________________
- | |
- | Function Name : extract_h |
- | |
- | Purpose : |
- | |
- | Return the 16 MSB of L_var1. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | L_var1 |
- | 32 bit long signed integer (Word32 ) whose value falls in the |
- | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-#if (!EXTRACT_H_IS_INLINE)
-Word16 extract_h (Word32 L_var1)
-{
- Word16 var_out;
-
- var_out = (Word16) (L_var1 >> 16);
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : extract_l |
- | |
- | Purpose : |
- | |
- | Return the 16 LSB of L_var1. |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | L_var1 |
- | 32 bit long signed integer (Word32 ) whose value falls in the |
- | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-#if (!EXTRACT_L_IS_INLINE)
-Word16 extract_l(Word32 L_var1)
-{
- Word16 var_out;
-
- var_out = (Word16) L_var1;
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : round |
- | |
- | Purpose : |
- | |
- | Round the lower 16 bits of the 32 bit input number into the MS 16 bits |
- | with saturation. Shift the resulting bits right by 16 and return the 16 |
- | bit number: |
- | round(L_var1) = extract_h(L_add(L_var1,32768)) |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | L_var1 |
- | 32 bit long signed integer (Word32 ) whose value falls in the |
- | range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-
-#if (!ROUND_IS_INLINE)
-Word16 round16(Word32 L_var1)
-{
- Word16 var_out;
- Word32 L_rounded;
-
- L_rounded = L_add (L_var1, (Word32) 0x00008000L);
- var_out = extract_h (L_rounded);
-
- return (var_out);
-}
-#endif
-// end
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_mac |
- | |
- | Purpose : |
- | |
- | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit |
- | result to L_var3 with saturation, return a 32 bit result: |
- | L_mac(L_var3,var1,var2) = L_add(L_var3,L_mult(var1,var2)). |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | L_var3 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-#if (!L_MSU_IS_INLINE)
-Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
-{
- Word32 L_var_out;
- Word32 L_product;
-
- L_product = L_mult(var1, var2);
- L_var_out = L_add (L_var3, L_product);
-
- return (L_var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_msu |
- | |
- | Purpose : |
- | |
- | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
- | bit result to L_var3 with saturation, return a 32 bit result: |
- | L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)). |
- | |
- | Complexity weight : 1 |
- | |
- | Inputs : |
- | |
- | L_var3 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-
-#if (!L_MSU_IS_INLINE)
-Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
-{
- Word32 L_var_out;
- Word32 L_product;
-
- L_product = L_mult(var1, var2);
- L_var_out = L_sub (L_var3, L_product);
-
- return (L_var_out);
-}
-#endif
-
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_add |
- | |
- | Purpose : |
- | |
- | 32 bits addition of the two 32 bits variables (L_var1+L_var2) with |
- | overflow control and saturation; the result is set at +2147483647 when |
- | overflow occurs or at -2147483648 when underflow occurs. |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | L_var1 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | L_var2 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-#if (!L_ADD_IS_INLINE)
-Word32 L_add (Word32 L_var1, Word32 L_var2)
-{
- Word32 L_var_out;
-
- L_var_out = L_var1 + L_var2;
-
- if (((L_var1 ^ L_var2) & MIN_32) == 0)
- {
- if ((L_var_out ^ L_var1) & MIN_32)
- {
- L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
- //Overflow = 1;
- }
- }
-
- return (L_var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_sub |
- | |
- | Purpose : |
- | |
- | 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with |
- | overflow control and saturation; the result is set at +2147483647 when |
- | overflow occurs or at -2147483648 when underflow occurs. |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | L_var1 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | L_var2 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-#if (!L_SUB_IS_INLINE)
-Word32 L_sub(Word32 L_var1, Word32 L_var2)
-{
- Word32 L_var_out;
-
- L_var_out = L_var1 - L_var2;
-
- if (((L_var1 ^ L_var2) & MIN_32) != 0)
- {
- if ((L_var_out ^ L_var1) & MIN_32)
- {
- L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
- //Overflow = 1;
- }
- }
-
- return (L_var_out);
-}
-#endif
-
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_negate |
- | |
- | Purpose : |
- | |
- | Negate the 32 bit variable L_var1 with saturation; saturate in the case |
- | where input is -2147483648 (0x8000 0000). |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | L_var1 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-//Word32 L_negate (Word32 L_var1)
-//{
-// Word32 L_var_out;
-//
-// L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1;
-//
-// return (L_var_out);
-//}
-
-
-/*___________________________________________________________________________
- | |
- | Function Name : mult_r |
- | |
- | Purpose : |
- | |
- | Same as mult with rounding, i.e.: |
- | mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and |
- | mult_r(-32768,-32768) = 32767. |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-#if (!MULT_R_IS_INLINE)
-Word16 mult_r (Word16 var1, Word16 var2)
-{
- Word16 var_out;
- Word32 L_product_arr;
-
- L_product_arr = (Word32) var1 *(Word32) var2; /* product */
- L_product_arr += (Word32) 0x00004000L; /* round */
- L_product_arr &= (Word32) 0xffff8000L;
- L_product_arr >>= 15; /* shift */
-
- if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */
- {
- L_product_arr |= (Word32) 0xffff0000L;
- }
- var_out = saturate(L_product_arr);
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_shl |
- | |
- | Purpose : |
- | |
- | Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero |
- | fill the var2 LSB of the result. If var2 is negative, arithmetically |
- | shift L_var1 right by -var2 with sign extension. Saturate the result in |
- | case of underflows or overflows. |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | L_var1 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-
-#if (!L_SHL_IS_INLINE)
-Word32 L_shl (Word32 L_var1, Word16 var2)
-{
- Word32 L_var_out = 0L;
-
- if (var2 <= 0)
- {
- L_var1 = L_shr(L_var1, (Word16)-var2);
- }
- else
- {
- for (; var2 > 0; var2--)
- {
- if (L_var1 > (Word32) 0X3fffffffL)
- {
- return MAX_32;
- }
- else
- {
- if (L_var1 < (Word32) 0xc0000000L)
- {
- return MIN_32;
- }
- }
- L_var1 <<= 1;
- }
- }
- return (L_var1);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_shr |
- | |
- | Purpose : |
- | |
- | Arithmetically shift the 32 bit input L_var1 right var2 positions with |
- | sign extension. If var2 is negative, arithmetically shift L_var1 left |
- | by -var2 and zero fill the -var2 LSB of the result. Saturate the result |
- | in case of underflows or overflows. |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | L_var1 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-
-#if (!L_SHR_IS_INLINE)
-Word32 L_shr (Word32 L_var1, Word16 var2)
-{
- Word32 L_var_out;
-
- if (var2 < 0)
- {
- L_var_out = L_shl (L_var1, (Word16)-var2);
- }
- else
- {
- if (var2 >= 31)
- {
- L_var_out = (L_var1 < 0L) ? -1 : 0;
- }
- else
- {
- if (L_var1 < 0)
- {
- L_var_out = ~((~L_var1) >> var2);
- }
- else
- {
- L_var_out = L_var1 >> var2;
- }
- }
- }
- return (L_var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : shr_r |
- | |
- | Purpose : |
- | |
- | Same as shr(var1,var2) but with rounding. Saturate the result in case of|
- | underflows or overflows : |
- | - If var2 is greater than zero : |
- | if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1)))) |
- | is equal to zero |
- | then |
- | shr_r(var1,var2) = shr(var1,var2) |
- | else |
- | shr_r(var1,var2) = add(shr(var1,var2),1) |
- | - If var2 is less than or equal to zero : |
- | shr_r(var1,var2) = shr(var1,var2). |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-#if (!SHR_R_IS_INLINE)
-Word16 shr_r (Word16 var1, Word16 var2)
-{
- Word16 var_out;
-
- if (var2 > 15)
- {
- var_out = 0;
- }
- else
- {
- var_out = shr (var1, var2);
-
- if (var2 > 0)
- {
- if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
- {
- var_out++;
- }
- }
- }
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : mac_r |
- | |
- | Purpose : |
- | |
- | Multiply var1 by var2 and shift the result left by 1. Add the 32 bit |
- | result to L_var3 with saturation. Round the LS 16 bits of the result |
- | into the MS 16 bits with saturation and shift the result right by 16. |
- | Return a 16 bit result. |
- | mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2)) |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | L_var3 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-#if (!MAC_R_IS_INLINE)
-Word16 mac_r (Word32 L_var3, Word16 var1, Word16 var2)
-{
- Word16 var_out;
-
- L_var3 = L_mac (L_var3, var1, var2);
- L_var3 = L_add (L_var3, (Word32) 0x00008000L);
- var_out = extract_h (L_var3);
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : msu_r |
- | |
- | Purpose : |
- | |
- | Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
- | bit result to L_var3 with saturation. Round the LS 16 bits of the res- |
- | ult into the MS 16 bits with saturation and shift the result right by |
- | 16. Return a 16 bit result. |
- | msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2)) |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | L_var3 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-#if (!MSU_R_IS_INLINE)
-Word16 msu_r (Word32 L_var3, Word16 var1, Word16 var2)
-{
- Word16 var_out;
-
- L_var3 = L_msu (L_var3, var1, var2);
- L_var3 = L_add (L_var3, (Word32) 0x00008000L);
- var_out = extract_h (L_var3);
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_deposit_h |
- | |
- | Purpose : |
- | |
- | Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The |
- | 16 LS bits of the output are zeroed. |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= var_out <= 0x7fff 0000. |
- |___________________________________________________________________________|
-*/
-//Word32 L_deposit_h (Word16 var1)
-//{
-// Word32 L_var_out;
-//
-// L_var_out = (Word32) var1 << 16;
-//
-// return (L_var_out);
-//}
-
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_deposit_l |
- | |
- | Purpose : |
- | |
- | Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The |
- | 16 MS bits of the output are sign extended. |
- | |
- | Complexity weight : 2 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0xFFFF 8000 <= var_out <= 0x0000 7fff. |
- |___________________________________________________________________________|
-*/
-//Word32 L_deposit_l (Word16 var1)
-//{
-// Word32 L_var_out;
-//
-// L_var_out = (Word32) var1;
-//
-// return (L_var_out);
-//}
-
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_shr_r |
- | |
- | Purpose : |
- | |
- | Same as L_shr(L_var1,var2) but with rounding. Saturate the result in |
- | case of underflows or overflows : |
- | - If var2 is greater than zero : |
- | if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|
- | is equal to zero |
- | then |
- | L_shr_r(L_var1,var2) = L_shr(L_var1,var2) |
- | else |
- | L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1) |
- | - If var2 is less than or equal to zero : |
- | L_shr_r(L_var1,var2) = L_shr(L_var1,var2). |
- | |
- | Complexity weight : 3 |
- | |
- | Inputs : |
- | |
- | L_var1 |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-#if (!L_SHR_R_IS_INLINE)
-Word32 L_shr_r (Word32 L_var1, Word16 var2)
-{
- Word32 L_var_out;
-
- if (var2 > 31)
- {
- L_var_out = 0;
- }
- else
- {
- L_var_out = L_shr (L_var1, var2);
-
- if (var2 > 0)
- {
- if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
- {
- L_var_out++;
- }
- }
- }
-
- return (L_var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : L_abs |
- | |
- | Purpose : |
- | |
- | Absolute value of L_var1; Saturate in case where the input is |
- | -214783648 |
- | |
- | Complexity weight : 3 |
- | |
- | Inputs : |
- | |
- | L_var1 |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | L_var_out |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x0000 0000 <= var_out <= 0x7fff ffff. |
- |___________________________________________________________________________|
-*/
-//Word32 L_abs (Word32 L_var1)
-//{
-// Word32 L_var_out;
-//
-// if (L_var1 == MIN_32)
-// {
-// L_var_out = MAX_32;
-// }
-// else
-// {
-// if (L_var1 < 0)
-// {
-// L_var_out = -L_var1;
-// }
-// else
-// {
-// L_var_out = L_var1;
-// }
-// }
-//
-// return (L_var_out);
-//}
-
-/*___________________________________________________________________________
- | |
- | Function Name : norm_s |
- | |
- | Purpose : |
- | |
- | Produces the number of left shift needed to normalize the 16 bit varia- |
- | ble var1 for positive values on the interval with minimum of 16384 and |
- | maximum of 32767, and for negative values on the interval with minimum |
- | of -32768 and maximum of -16384; in order to normalize the result, the |
- | following operation must be done : |
- | norm_var1 = shl(var1,norm_s(var1)). |
- | |
- | Complexity weight : 15 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0x0000 0000 <= var_out <= 0x0000 000f. |
- |___________________________________________________________________________|
-*/
-
-#if (!NORM_S_IS_INLINE)
-Word16 norm_s (Word16 var1)
-{
- Word16 var_out;
-
- if (var1 == 0)
- {
- var_out = 0;
- }
- else
- {
- if (var1 == -1)
- {
- var_out = 15;
- }
- else
- {
- if (var1 < 0)
- {
- var1 = (Word16)~var1;
- }
- for (var_out = 0; var1 < 0x4000; var_out++)
- {
- var1 <<= 1;
- }
- }
- }
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : div_s |
- | |
- | Purpose : |
- | |
- | Produces a result which is the fractional integer division of var1 by |
- | var2; var1 and var2 must be positive and var2 must be greater or equal |
- | to var1; the result is positive (leading bit equal to 0) and truncated |
- | to 16 bits. |
- | If var1 = var2 then div(var1,var2) = 32767. |
- | |
- | Complexity weight : 18 |
- | |
- | Inputs : |
- | |
- | var1 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0x0000 0000 <= var1 <= var2 and var2 != 0. |
- | |
- | var2 |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : var1 <= var2 <= 0x0000 7fff and var2 != 0. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
- | It's a Q15 value (point between b15 and b14). |
- |___________________________________________________________________________|
-*/
-
-#if (!DIV_S_IS_INLINE)
-Word16 div_s (Word16 var1, Word16 var2)
-{
- Word16 var_out = 0;
- Word16 iteration;
- Word32 L_num;
- Word32 L_denom;
-
- if (var1 == 0)
- {
- var_out = 0;
- }
- else
- {
- if (var1 == var2)
- {
- var_out = MAX_16;
- }
- else
- {
- L_num = L_deposit_l (var1);
- L_denom = L_deposit_l (var2);
-
- for (iteration = 0; iteration < 15; iteration++)
- {
- var_out <<= 1;
- L_num <<= 1;
-
- if (L_num >= L_denom)
- {
- L_num = L_sub(L_num, L_denom);
- var_out = add (var_out, 1);
- }
- }
- }
- }
-
- return (var_out);
-}
-#endif
-
-/*___________________________________________________________________________
- | |
- | Function Name : norm_l |
- | |
- | Purpose : |
- | |
- | Produces the number of left shifts needed to normalize the 32 bit varia-|
- | ble L_var1 for positive values on the interval with minimum of |
- | 1073741824 and maximum of 2147483647, and for negative values on the in-|
- | terval with minimum of -2147483648 and maximum of -1073741824; in order |
- | to normalize the result, the following operation must be done : |
- | norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). |
- | |
- | Complexity weight : 30 |
- | |
- | Inputs : |
- | |
- | L_var1 |
- | 32 bit long signed integer (Word32) whose value falls in the |
- | range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
- | |
- | Outputs : |
- | |
- | none |
- | |
- | Return Value : |
- | |
- | var_out |
- | 16 bit short signed integer (Word16) whose value falls in the |
- | range : 0x0000 0000 <= var_out <= 0x0000 001f. |
- |___________________________________________________________________________|
-*/
-
-#if (!NORM_L_IS_INLINE)
-Word16 norm_l (Word32 L_var1)
-{
- Word16 var_out;
-
- if (L_var1 == 0)
- {
- var_out = 0;
- }
- else
- {
- if (L_var1 == (Word32) 0xffffffffL)
- {
- var_out = 31;
- }
- else
- {
- if (L_var1 < 0)
- {
- L_var1 = ~L_var1;
- }
- for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
- {
- L_var1 <<= 1;
- }
- }
- }
-
- return (var_out);
-}
-#endif
-
diff --git a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c
deleted file mode 100644
index 78f032b..0000000
--- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: oper_32b.c
-
- Content: This file contains operations in double precision.
-
-*******************************************************************************/
-
-#include "typedef.h"
-#include "basic_op.h"
-#include "oper_32b.h"
-
-#define UNUSED(x) (void)(x)
-
-/*****************************************************************************
- * *
- * Function L_Extract() *
- * *
- * Extract from a 32 bit integer two 16 bit DPF. *
- * *
- * Arguments: *
- * *
- * L_32 : 32 bit integer. *
- * 0x8000 0000 <= L_32 <= 0x7fff ffff. *
- * hi : b16 to b31 of L_32 *
- * lo : (L_32 - hi<<16)>>1 *
- *****************************************************************************
-*/
-
-void L_Extract (Word32 L_32, Word16 *hi, Word16 *lo)
-{
- *hi = extract_h (L_32);
- *lo = extract_l (L_msu (L_shr (L_32, 1), *hi, 16384));
- return;
-}
-
-/*****************************************************************************
- * *
- * Function L_Comp() *
- * *
- * Compose from two 16 bit DPF a 32 bit integer. *
- * *
- * L_32 = hi<<16 + lo<<1 *
- * *
- * Arguments: *
- * *
- * hi msb *
- * lo lsf (with sign) *
- * *
- * Return Value : *
- * *
- * 32 bit long signed integer (Word32) whose value falls in the *
- * range : 0x8000 0000 <= L_32 <= 0x7fff fff0. *
- * *
- *****************************************************************************
-*/
-
-Word32 L_Comp (Word16 hi, Word16 lo)
-{
- Word32 L_32;
-
- L_32 = L_deposit_h (hi);
- return (L_mac (L_32, lo, 1)); /* = hi<<16 + lo<<1 */
-}
-
-/*****************************************************************************
- * Function Mpy_32() *
- * *
- * Multiply two 32 bit integers (DPF). The result is divided by 2**31 *
- * *
- * L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1 *
- * *
- * This operation can also be viewed as the multiplication of two Q31 *
- * number and the result is also in Q31. *
- * *
- * Arguments: *
- * *
- * hi1 hi part of first number *
- * lo1 lo part of first number *
- * hi2 hi part of second number *
- * lo2 lo part of second number *
- * *
- *****************************************************************************
-*/
-
-Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2)
-{
- Word32 L_32;
-
- L_32 = L_mult (hi1, hi2);
- L_32 = L_mac (L_32, mult (hi1, lo2), 1);
- L_32 = L_mac (L_32, mult (lo1, hi2), 1);
-
- return (L_32);
-}
-
-/*****************************************************************************
- * Function Mpy_32_16() *
- * *
- * Multiply a 16 bit integer by a 32 bit (DPF). The result is divided *
- * by 2**15 *
- * *
- * *
- * L_32 = (hi1*lo2)<<1 + ((lo1*lo2)>>15)<<1 *
- * *
- * Arguments: *
- * *
- * hi hi part of 32 bit number. *
- * lo lo part of 32 bit number. *
- * n 16 bit number. *
- * *
- *****************************************************************************
-*/
-
-Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n)
-{
- Word32 L_32;
-
- L_32 = L_mult (hi, n);
- L_32 = L_mac (L_32, mult (lo, n), 1);
-
- return (L_32);
-}
-
-/*****************************************************************************
- * *
- * Function Name : Div_32 *
- * *
- * Purpose : *
- * Fractional integer division of two 32 bit numbers. *
- * L_num / L_denom. *
- * L_num and L_denom must be positive and L_num < L_denom. *
- * L_denom = denom_hi<<16 + denom_lo<<1 *
- * denom_hi is a normalize number. *
- * *
- * Inputs : *
- * *
- * L_num *
- * 32 bit long signed integer (Word32) whose value falls in the *
- * range : 0x0000 0000 < L_num < L_denom *
- * *
- * L_denom = denom_hi<<16 + denom_lo<<1 (DPF) *
- * *
- * denom_hi *
- * 16 bit positive normalized integer whose value falls in the *
- * range : 0x4000 < hi < 0x7fff *
- * denom_lo *
- * 16 bit positive integer whose value falls in the *
- * range : 0 < lo < 0x7fff *
- * *
- * Return Value : *
- * *
- * L_div *
- * 32 bit long signed integer (Word32) whose value falls in the *
- * range : 0x0000 0000 <= L_div <= 0x7fff ffff. *
- * *
- * Algorithm: *
- * *
- * - find = 1/L_denom. *
- * First approximation: approx = 1 / denom_hi *
- * 1/L_denom = approx * (2.0 - L_denom * approx ) *
- * *
- * - result = L_num * (1/L_denom) *
- *****************************************************************************
-*/
-
-Word32 Div_32 (Word32 L_num, Word32 denom)
-{
- Word16 approx;
- Word32 L_32;
- /* First approximation: 1 / L_denom = 1/denom_hi */
-
- approx = div_s ((Word16) 0x3fff, denom >> 16);
-
- /* 1/L_denom = approx * (2.0 - L_denom * approx) */
-
- L_32 = L_mpy_ls (denom, approx);
-
- L_32 = L_sub ((Word32) 0x7fffffffL, L_32);
-
- L_32 = L_mpy_ls (L_32, approx);
- /* L_num * (1/L_denom) */
-
- L_32 = MULHIGH(L_32, L_num);
- L_32 = L_shl (L_32, 3);
-
- return (L_32);
-}
-
-/*!
-
- \brief calculates the log dualis times 4 of argument
- iLog4(x) = (Word32)(4 * log(value)/log(2.0))
-
- \return ilog4 value
-
-*/
-Word16 iLog4(Word32 value)
-{
- Word16 iLog4;
-
- if(value != 0){
- Word32 tmp;
- Word16 tmp16;
- iLog4 = norm_l(value);
- tmp = (value << iLog4);
- tmp16 = round16(tmp);
- tmp = L_mult(tmp16, tmp16);
- tmp16 = round16(tmp);
- tmp = L_mult(tmp16, tmp16);
- tmp16 = round16(tmp);
-
- iLog4 = (-(iLog4 << 2) - norm_s(tmp16)) - 1;
- }
- else {
- iLog4 = -128; /* -(INT_BITS*4); */
- }
-
- return iLog4;
-}
-
-#define step(shift) \
- if ((0x40000000l >> (shift)) + root <= value) \
- { \
- value -= (0x40000000l >> (shift)) + root; \
- root = (root >> 1) | (0x40000000l >> (shift)); \
- } else { \
- root = root >> 1; \
- }
-
-Word32 rsqrt(Word32 value, /*!< Operand to square root (0.0 ... 1) */
- Word32 accuracy) /*!< Number of valid bits that will be calculated */
-{
- Word32 root = 0;
- Word32 scale;
- UNUSED(accuracy);
-
- if(value < 0)
- return 0;
-
- scale = norm_l(value);
- if(scale & 1) scale--;
-
- value <<= scale;
-
- step( 0); step( 2); step( 4); step( 6);
- step( 8); step(10); step(12); step(14);
- step(16); step(18); step(20); step(22);
- step(24); step(26); step(28); step(30);
-
- scale >>= 1;
- if (root < value)
- ++root;
-
- root >>= scale;
- return root* 46334;
-}
-
-static const Word32 pow2Table[POW2_TABLE_SIZE] = {
-0x7fffffff, 0x7fa765ad, 0x7f4f08ae, 0x7ef6e8da,
-0x7e9f0606, 0x7e476009, 0x7deff6b6, 0x7d98c9e6,
-0x7d41d96e, 0x7ceb2523, 0x7c94acde, 0x7c3e7073,
-0x7be86fb9, 0x7b92aa88, 0x7b3d20b6, 0x7ae7d21a,
-0x7a92be8b, 0x7a3de5df, 0x79e947ef, 0x7994e492,
-0x7940bb9e, 0x78ecccec, 0x78991854, 0x78459dac,
-0x77f25cce, 0x779f5591, 0x774c87cc, 0x76f9f359,
-0x76a7980f, 0x765575c8, 0x76038c5b, 0x75b1dba2,
-0x75606374, 0x750f23ab, 0x74be1c20, 0x746d4cac,
-0x741cb528, 0x73cc556d, 0x737c2d55, 0x732c3cba,
-0x72dc8374, 0x728d015d, 0x723db650, 0x71eea226,
-0x719fc4b9, 0x71511de4, 0x7102ad80, 0x70b47368,
-0x70666f76, 0x7018a185, 0x6fcb096f, 0x6f7da710,
-0x6f307a41, 0x6ee382de, 0x6e96c0c3, 0x6e4a33c9,
-0x6dfddbcc, 0x6db1b8a8, 0x6d65ca38, 0x6d1a1057,
-0x6cce8ae1, 0x6c8339b2, 0x6c381ca6, 0x6bed3398,
-0x6ba27e66, 0x6b57fce9, 0x6b0daeff, 0x6ac39485,
-0x6a79ad56, 0x6a2ff94f, 0x69e6784d, 0x699d2a2c,
-0x69540ec9, 0x690b2601, 0x68c26fb1, 0x6879ebb6,
-0x683199ed, 0x67e97a34, 0x67a18c68, 0x6759d065,
-0x6712460b, 0x66caed35, 0x6683c5c3, 0x663ccf92,
-0x65f60a80, 0x65af766a, 0x6569132f, 0x6522e0ad,
-0x64dcdec3, 0x64970d4f, 0x64516c2e, 0x640bfb41,
-0x63c6ba64, 0x6381a978, 0x633cc85b, 0x62f816eb,
-0x62b39509, 0x626f4292, 0x622b1f66, 0x61e72b65,
-0x61a3666d, 0x615fd05f, 0x611c6919, 0x60d9307b,
-0x60962665, 0x60534ab7, 0x60109d51, 0x5fce1e12,
-0x5f8bccdb, 0x5f49a98c, 0x5f07b405, 0x5ec5ec26,
-0x5e8451d0, 0x5e42e4e3, 0x5e01a540, 0x5dc092c7,
-0x5d7fad59, 0x5d3ef4d7, 0x5cfe6923, 0x5cbe0a1c,
-0x5c7dd7a4, 0x5c3dd19c, 0x5bfdf7e5, 0x5bbe4a61,
-0x5b7ec8f2, 0x5b3f7377, 0x5b0049d4, 0x5ac14bea,
-0x5a82799a, 0x5a43d2c6, 0x5a055751, 0x59c7071c,
-0x5988e209, 0x594ae7fb, 0x590d18d3, 0x58cf7474,
-0x5891fac1, 0x5854ab9b, 0x581786e6, 0x57da8c83,
-0x579dbc57, 0x57611642, 0x57249a29, 0x56e847ef,
-0x56ac1f75, 0x567020a0, 0x56344b52, 0x55f89f70,
-0x55bd1cdb, 0x5581c378, 0x55469329, 0x550b8bd4,
-0x54d0ad5b, 0x5495f7a1, 0x545b6a8b, 0x542105fd,
-0x53e6c9db, 0x53acb607, 0x5372ca68, 0x533906e0,
-0x52ff6b55, 0x52c5f7aa, 0x528cabc3, 0x52538786,
-0x521a8ad7, 0x51e1b59a, 0x51a907b4, 0x5170810b,
-0x51382182, 0x50ffe8fe, 0x50c7d765, 0x508fec9c,
-0x50582888, 0x50208b0e, 0x4fe91413, 0x4fb1c37c,
-0x4f7a9930, 0x4f439514, 0x4f0cb70c, 0x4ed5ff00,
-0x4e9f6cd4, 0x4e69006e, 0x4e32b9b4, 0x4dfc988c,
-0x4dc69cdd, 0x4d90c68b, 0x4d5b157e, 0x4d25899c,
-0x4cf022ca, 0x4cbae0ef, 0x4c85c3f1, 0x4c50cbb8,
-0x4c1bf829, 0x4be7492b, 0x4bb2bea5, 0x4b7e587d,
-0x4b4a169c, 0x4b15f8e6, 0x4ae1ff43, 0x4aae299b,
-0x4a7a77d5, 0x4a46e9d6, 0x4a137f88, 0x49e038d0,
-0x49ad1598, 0x497a15c4, 0x4947393f, 0x49147fee,
-0x48e1e9ba, 0x48af768a, 0x487d2646, 0x484af8d6,
-0x4818ee22, 0x47e70611, 0x47b5408c, 0x47839d7b,
-0x47521cc6, 0x4720be55, 0x46ef8210, 0x46be67e0,
-0x468d6fae, 0x465c9961, 0x462be4e2, 0x45fb521a,
-0x45cae0f2, 0x459a9152, 0x456a6323, 0x453a564d,
-0x450a6abb, 0x44daa054, 0x44aaf702, 0x447b6ead,
-0x444c0740, 0x441cc0a3, 0x43ed9ac0, 0x43be9580,
-0x438fb0cb, 0x4360ec8d, 0x433248ae, 0x4303c517,
-0x42d561b4, 0x42a71e6c, 0x4278fb2b, 0x424af7da,
-0x421d1462, 0x41ef50ae, 0x41c1aca8, 0x41942839,
-0x4166c34c, 0x41397dcc, 0x410c57a2, 0x40df50b8,
-0x40b268fa, 0x4085a051, 0x4058f6a8, 0x402c6be9
-};
-
-/*!
-
- \brief calculates 2 ^ (x/y) for x<=0, y > 0, x <= 32768 * y
-
- avoids integer division
-
- \return
-*/
-Word32 pow2_xy(Word32 x, Word32 y)
-{
- UWord32 iPart;
- UWord32 fPart;
- Word32 res;
- Word32 tmp;
-
- tmp = -x;
- iPart = tmp / y;
- fPart = tmp - iPart*y;
- iPart = min(iPart,INT_BITS-1);
-
- res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart;
-
- return(res);
-}
diff --git a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h
deleted file mode 100644
index 6e5844f..0000000
--- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: oper_32b.h
-
- Content: Double precision operations
-
-*******************************************************************************/
-
-#ifndef __OPER_32b_H
-#define __OPER_32b_H
-
-#include "typedef.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define POW2_TABLE_BITS 8
-#define POW2_TABLE_SIZE (1<<POW2_TABLE_BITS)
-
-void L_Extract (Word32 L_32, Word16 *hi, Word16 *lo);
-Word32 L_Comp (Word16 hi, Word16 lo);
-Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2);
-Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n);
-Word32 Div_32 (Word32 L_num, Word32 denom);
-Word16 iLog4(Word32 value);
-Word32 rsqrt(Word32 value, Word32 accuracy);
-Word32 pow2_xy(Word32 x, Word32 y);
-
-__inline Word32 L_mpy_ls(Word32 L_var2, Word16 var1)
-{
- unsigned short swLow1;
- Word16 swHigh1;
- Word32 l_var_out;
-
- swLow1 = (unsigned short)(L_var2);
- swHigh1 = (Word16)(L_var2 >> 16);
-
- l_var_out = (long)swLow1 * (long)var1 >> 15;
-
- l_var_out += swHigh1 * var1 << 1;
-
- return(l_var_out);
-}
-
-__inline Word32 L_mpy_wx(Word32 L_var2, Word16 var1)
-{
-#if ARMV5TE_L_MPY_LS
- Word32 result;
- asm volatile(
- "SMULWB %[result], %[L_var2], %[var1] \n"
- :[result]"=r"(result)
- :[L_var2]"r"(L_var2), [var1]"r"(var1)
- );
- return result;
-#else
- unsigned short swLow1;
- Word16 swHigh1;
- Word32 l_var_out;
-
- swLow1 = (unsigned short)(L_var2);
- swHigh1 = (Word16)(L_var2 >> 16);
-
- l_var_out = (long)swLow1 * (long)var1 >> 16;
- l_var_out += swHigh1 * var1;
-
- return(l_var_out);
-#endif
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedef.h b/media/libstagefright/codecs/aacenc/basic_op/typedef.h
deleted file mode 100644
index b1f8225..0000000
--- a/media/libstagefright/codecs/aacenc/basic_op/typedef.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: typedef.h
-
- Content: type defined for defferent paltform
-
-*******************************************************************************/
-
-#ifndef typedef_h
-#define typedef_h "$Id $"
-
-#undef ORIGINAL_TYPEDEF_H /* define to get "original" ETSI version
- of typedef.h */
-
-#ifdef ORIGINAL_TYPEDEF_H
-/*
- * this is the original code from the ETSI file typedef.h
- */
-
-#if defined(__BORLANDC__) || defined(__WATCOMC__) || defined(_MSC_VER) || defined(__ZTC__)
-typedef signed char Word8;
-typedef short Word16;
-typedef long Word32;
-typedef int Flag;
-
-#elif defined(__sun)
-typedef signed char Word8;
-typedef short Word16;
-typedef long Word32;
-typedef int Flag;
-
-#elif defined(__unix__) || defined(__unix)
-typedef signed char Word8;
-typedef short Word16;
-typedef int Word32;
-typedef int Flag;
-
-#endif
-#else /* not original typedef.h */
-
-/*
- * use (improved) type definition file typdefs.h and add a "Flag" type
- */
-#include "typedefs.h"
-typedef int Flag;
-
-#endif
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h b/media/libstagefright/codecs/aacenc/basic_op/typedefs.h
deleted file mode 100644
index 80d350d..0000000
--- a/media/libstagefright/codecs/aacenc/basic_op/typedefs.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: typedefs.h
-
- Content: type defined or const defined
-
-*******************************************************************************/
-
-#ifndef typedefs_h
-#define typedefs_h "$Id $"
-
-#ifndef CHAR_BIT
-#define CHAR_BIT 8 /* number of bits in a char */
-#endif
-
-#ifndef VOAAC_SHRT_MAX
-#define VOAAC_SHRT_MAX (32767) /* maximum (signed) short value */
-#endif
-
-#ifndef VOAAC_SHRT_MIN
-#define VOAAC_SHRT_MIN (-32768) /* minimum (signed) short value */
-#endif
-
-/* Define NULL pointer value */
-#ifndef NULL
-#ifdef __cplusplus
-#define NULL 0
-#else
-#define NULL ((void *)0)
-#endif
-#endif
-
-#ifndef assert
-#define assert(_Expression) ((void)0)
-#endif
-
-#define __inline static __inline
-
-#define INT_BITS 32
-/*
-********************************************************************************
-* DEFINITION OF CONSTANTS
-********************************************************************************
-*/
-/*
- ********* define char type
- */
-typedef char Char;
-
-/*
- ********* define 8 bit signed/unsigned types & constants
- */
-typedef signed char Word8;
-typedef unsigned char UWord8;
-/*
- ********* define 16 bit signed/unsigned types & constants
- */
-typedef short Word16;
-typedef unsigned short UWord16;
-
-/*
- ********* define 32 bit signed/unsigned types & constants
- */
-typedef int Word32;
-typedef unsigned int UWord32;
-
-
-
-#ifndef _MSC_VER
-typedef long long Word64;
-typedef unsigned long long UWord64;
-#else
-typedef __int64 Word64;
-typedef unsigned __int64 UWord64;
-#endif
-
-#ifndef min
-#define min(a,b) ( (a) < (b) ? (a) : (b))
-#endif
-
-#ifndef max
-#define max(a,b) ( (a) > (b) ? (a) : (b))
-#endif
-
-#ifdef ARM_INASM
-#ifdef ARMV5_INASM
-#define ARMV5E_INASM 1
-#endif
-#define ARMV4_INASM 1
-#endif
-
-#if ARMV4_INASM
- #define ARMV5TE_SAT 1
- #define ARMV5TE_ADD 1
- #define ARMV5TE_SUB 1
- #define ARMV5TE_SHL 1
- #define ARMV5TE_SHR 1
- #define ARMV5TE_L_SHL 1
- #define ARMV5TE_L_SHR 1
-#endif//ARMV4
-#if ARMV5E_INASM
- #define ARMV5TE_L_ADD 1
- #define ARMV5TE_L_SUB 1
- #define ARMV5TE_L_MULT 1
- #define ARMV5TE_L_MAC 1
- #define ARMV5TE_L_MSU 1
-
-
- #define ARMV5TE_DIV_S 1
- #define ARMV5TE_ROUND 1
- #define ARMV5TE_MULT 1
-
- #define ARMV5TE_NORM_S 1
- #define ARMV5TE_NORM_L 1
- #define ARMV5TE_L_MPY_LS 1
-#endif
-#if ARMV6_INASM
- #undef ARMV5TE_ADD
- #define ARMV5TE_ADD 0
- #undef ARMV5TE_SUB
- #define ARMV5TE_SUB 0
- #define ARMV6_SAT 1
-#endif
-
-//basic operation functions optimization flags
-#define SATRUATE_IS_INLINE 1 //define saturate as inline function
-#define SHL_IS_INLINE 1 //define shl as inline function
-#define SHR_IS_INLINE 1 //define shr as inline function
-#define L_MULT_IS_INLINE 1 //define L_mult as inline function
-#define L_MSU_IS_INLINE 1 //define L_msu as inline function
-#define L_SUB_IS_INLINE 1 //define L_sub as inline function
-#define L_SHL_IS_INLINE 1 //define L_shl as inline function
-#define L_SHR_IS_INLINE 1 //define L_shr as inline function
-#define ADD_IS_INLINE 1 //define add as inline function //add, inline is the best
-#define SUB_IS_INLINE 1 //define sub as inline function //sub, inline is the best
-#define DIV_S_IS_INLINE 1 //define div_s as inline function
-#define MULT_IS_INLINE 1 //define mult as inline function
-#define NORM_S_IS_INLINE 1 //define norm_s as inline function
-#define NORM_L_IS_INLINE 1 //define norm_l as inline function
-#define ROUND_IS_INLINE 1 //define round as inline function
-#define L_MAC_IS_INLINE 1 //define L_mac as inline function
-#define L_ADD_IS_INLINE 1 //define L_add as inline function
-#define EXTRACT_H_IS_INLINE 1 //define extract_h as inline function
-#define EXTRACT_L_IS_INLINE 1 //define extract_l as inline function //???
-#define MULT_R_IS_INLINE 1 //define mult_r as inline function
-#define SHR_R_IS_INLINE 1 //define shr_r as inline function
-#define MAC_R_IS_INLINE 1 //define mac_r as inline function
-#define MSU_R_IS_INLINE 1 //define msu_r as inline function
-#define L_SHR_R_IS_INLINE 1 //define L_shr_r as inline function
-
-#define PREFIX voAACEnc
-#define LINK0(x, y, z) LINK1(x,y,z)
-#define LINK1(x,y,z) x##y##z
-#define ADD_PREFIX(func) LINK0(PREFIX, _, func)
-
-#define L_Extract ADD_PREFIX(L_Extract)
-#define L_Comp ADD_PREFIX(L_Comp)
-#define Mpy_32 ADD_PREFIX(Mpy_32)
-#define Mpy_32_16 ADD_PREFIX(Mpy_32_16)
-#define Div_32 ADD_PREFIX(Div_32)
-#define iLog4 ADD_PREFIX(iLog4)
-#define rsqrt ADD_PREFIX(rsqrt)
-#define pow2_xy ADD_PREFIX(pow2_xy)
-#define L_mpy_ls ADD_PREFIX(L_mpy_ls)
-#define L_mpy_wx ADD_PREFIX(L_mpy_wx)
-
-#define mem_malloc ADD_PREFIX(mem_malloc)
-#define mem_free ADD_PREFIX(mem_free)
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/doc/voAACEncoderSDK.pdf b/media/libstagefright/codecs/aacenc/doc/voAACEncoderSDK.pdf
deleted file mode 100644
index 874d0f7..0000000
--- a/media/libstagefright/codecs/aacenc/doc/voAACEncoderSDK.pdf
+++ /dev/null
Binary files differ
diff --git a/media/libstagefright/codecs/aacenc/inc/aac_rom.h b/media/libstagefright/codecs/aacenc/inc/aac_rom.h
deleted file mode 100644
index 0b6f656..0000000
--- a/media/libstagefright/codecs/aacenc/inc/aac_rom.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: aac_rom.h
-
- Content: constant tables
-
-*******************************************************************************/
-
-#ifndef ROM_H
-#define ROM_H
-
-#include "config.h"
-#include "psy_const.h"
-#include "tns_param.h"
-
-/*
- mdct
-*/
-extern const int ShortWindowSine[FRAME_LEN_SHORT/2];
-extern const int LongWindowKBD[FRAME_LEN_LONG/2];
-
-extern const unsigned char bitrevTab[17 + 129];
-extern const int cossintab[128 + 1024];
-
-#if defined (ARMV5E) && !defined (ARMV7Neon)
-extern const int twidTab64[(4*6 + 16*6)/2];
-extern const int twidTab512[(8*6 + 32*6 + 128*6)/2];
-#else
-extern const int twidTab64[4*6 + 16*6];
-extern const int twidTab512[8*6 + 32*6 + 128*6];
-#endif
-
-/*
- form factor
-*/
-extern const Word32 formfac_sqrttable[96];
-
-/*
- quantizer
-*/
-extern const Word32 mTab_3_4[512];
-extern const Word32 mTab_4_3[512];
-/*! $2^{-\frac{n}{16}}$ table */
-extern const Word16 pow2tominusNover16[17] ;
-
-extern const Word32 specExpMantTableComb_enc[4][14];
-extern const UWord8 specExpTableComb_enc[4][14];
-
-extern const Word16 quantBorders[4][4];
-//extern const Word16 quantRecon[3][4];
-extern const Word16 quantRecon[4][3];
-
-/*
- huffman
-*/
-extern const UWord16 huff_ltab1_2[3][3][3][3];
-extern const UWord16 huff_ltab3_4[3][3][3][3];
-extern const UWord16 huff_ltab5_6[9][9];
-extern const UWord16 huff_ltab7_8[8][8];
-extern const UWord16 huff_ltab9_10[13][13];
-extern const UWord16 huff_ltab11[17][17];
-extern const UWord16 huff_ltabscf[121];
-extern const UWord16 huff_ctab1[3][3][3][3];
-extern const UWord16 huff_ctab2[3][3][3][3];
-extern const UWord16 huff_ctab3[3][3][3][3];
-extern const UWord16 huff_ctab4[3][3][3][3];
-extern const UWord16 huff_ctab5[9][9];
-extern const UWord16 huff_ctab6[9][9];
-extern const UWord16 huff_ctab7[8][8];
-extern const UWord16 huff_ctab8[8][8];
-extern const UWord16 huff_ctab9[13][13];
-extern const UWord16 huff_ctab10[13][13];
-extern const UWord16 huff_ctab11[17][17];
-extern const UWord32 huff_ctabscf[121];
-
-
-
-/*
- misc
-*/
-extern const int sampRateTab[NUM_SAMPLE_RATES];
-extern const int BandwithCoefTab[8][NUM_SAMPLE_RATES];
-extern const int rates[8];
-extern const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES];
-extern const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES];
-extern const int sfBandTabShortOffset[NUM_SAMPLE_RATES];
-extern const short sfBandTabShort[76];
-extern const int sfBandTabLongOffset[NUM_SAMPLE_RATES];
-extern const short sfBandTabLong[325];
-
-extern const Word32 m_log2_table[INT_BITS];
-
-/*
- TNS
-*/
-extern const Word32 tnsCoeff3[8];
-extern const Word32 tnsCoeff3Borders[8];
-extern const Word32 tnsCoeff4[16];
-extern const Word32 tnsCoeff4Borders[16];
-extern const Word32 invSBF[24];
-extern const Word16 sideInfoTabLong[MAX_SFB_LONG + 1];
-extern const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1];
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h b/media/libstagefright/codecs/aacenc/inc/aacenc_core.h
deleted file mode 100644
index bb75b6d..0000000
--- a/media/libstagefright/codecs/aacenc/inc/aacenc_core.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: aacenc_core.h
-
- Content: aac encoder interface functions
-
-*******************************************************************************/
-
-#ifndef _aacenc_core_h_
-#define _aacenc_core_h_
-
-
-#include "typedef.h"
-#include "config.h"
-#include "bitenc.h"
-
-#include "psy_configuration.h"
-#include "psy_main.h"
-#include "qc_main.h"
-#include "psy_main.h"
-/*-------------------------- defines --------------------------------------*/
-
-
-/*-------------------- structure definitions ------------------------------*/
-typedef struct {
- Word32 sampleRate; /* audio file sample rate */
- Word32 bitRate; /* encoder bit rate in bits/sec */
- Word16 nChannelsIn; /* number of channels on input (1,2) */
- Word16 nChannelsOut; /* number of channels on output (1,2) */
- Word16 bandWidth; /* targeted audio bandwidth in Hz */
- Word16 adtsUsed; /* whether write adts header */
-} AACENC_CONFIG;
-
-
-typedef struct {
-
- AACENC_CONFIG config; /* Word16 size: 8 */
-
- ELEMENT_INFO elInfo; /* Word16 size: 4 */
-
- QC_STATE qcKernel; /* Word16 size: 6 + 5(PADDING) + 7(ELEMENT_BITS) + 54(ADJ_THR_STATE) = 72 */
- QC_OUT qcOut; /* Word16 size: MAX_CHANNELS*920(QC_OUT_CHANNEL) + 5(QC_OUT_ELEMENT) + 7 = 932 / 1852 */
-
- PSY_OUT psyOut; /* Word16 size: MAX_CHANNELS*186 + 2 = 188 / 374 */
- PSY_KERNEL psyKernel; /* Word16 size: 2587 / 4491 */
-
- struct BITSTREAMENCODER_INIT bseInit; /* Word16 size: 6 */
- struct BIT_BUF bitStream; /* Word16 size: 8 */
- HANDLE_BIT_BUF hBitStream;
- int initOK;
-
- short *intbuf;
- short *encbuf;
- short *inbuf;
- int enclen;
- int inlen;
- int intlen;
- int uselength;
-
- void *hCheck;
- VO_MEM_OPERATOR *voMemop;
- VO_MEM_OPERATOR voMemoprator;
-
-}AAC_ENCODER; /* Word16 size: 3809 / 6851 */
-
-/*-----------------------------------------------------------------------------
-
-functionname: AacInitDefaultConfig
-description: gives reasonable default configuration
-returns: ---
-
-------------------------------------------------------------------------------*/
-void AacInitDefaultConfig(AACENC_CONFIG *config);
-
-/*---------------------------------------------------------------------------
-
-functionname:AacEncOpen
-description: allocate and initialize a new encoder instance
-returns: AACENC_OK if success
-
----------------------------------------------------------------------------*/
-
-Word16 AacEncOpen (AAC_ENCODER *hAacEnc, /* pointer to an encoder handle, initialized on return */
- const AACENC_CONFIG config); /* pre-initialized config struct */
-
-Word16 AacEncEncode(AAC_ENCODER *hAacEnc,
- Word16 *timeSignal,
- const UWord8 *ancBytes, /*!< pointer to ancillary data bytes */
- Word16 *numAncBytes, /*!< number of ancillary Data Bytes, send as fill element */
- UWord8 *outBytes, /*!< pointer to output buffer */
- VO_U32 *numOutBytes /*!< number of bytes in output buffer */
- );
-
-/*---------------------------------------------------------------------------
-
-functionname:AacEncClose
-description: deallocate an encoder instance
-
----------------------------------------------------------------------------*/
-
-void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP); /* an encoder handle */
-
-#endif /* _aacenc_h_ */
diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr.h b/media/libstagefright/codecs/aacenc/inc/adj_thr.h
deleted file mode 100644
index 0f4bb5e..0000000
--- a/media/libstagefright/codecs/aacenc/inc/adj_thr.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: adj_thr.h
-
- Content: Threshold compensation function
-
-*******************************************************************************/
-
-#ifndef __ADJ_THR_H
-#define __ADJ_THR_H
-
-#include "adj_thr_data.h"
-#include "qc_data.h"
-#include "interface.h"
-
-Word16 bits2pe(const Word16 bits);
-
-Word32 AdjThrNew(ADJ_THR_STATE** phAdjThr,
- Word32 nElements);
-
-void AdjThrDelete(ADJ_THR_STATE *hAdjThr);
-
-void AdjThrInit(ADJ_THR_STATE *hAdjThr,
- const Word32 peMean,
- Word32 chBitrate);
-
-void AdjustThresholds(ADJ_THR_STATE *adjThrState,
- ATS_ELEMENT* AdjThrStateElement,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT *psyOutElement,
- Word16 *chBitDistribution,
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
- QC_OUT_ELEMENT* qcOE,
- ELEMENT_BITS* elBits,
- const Word16 nChannels,
- const Word16 maxBitFac);
-
-void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement,
- const Word16 dynBitsUsed);
-
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h b/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h
deleted file mode 100644
index 30132d8..0000000
--- a/media/libstagefright/codecs/aacenc/inc/adj_thr_data.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: adj_thr_data.h
-
- Content: Threshold compensation parameter
-
-*******************************************************************************/
-
-#ifndef __ADJ_THR_DATA_H
-#define __ADJ_THR_DATA_H
-
-#include "typedef.h"
-#include "psy_const.h"
-#include "line_pe.h"
-
-typedef struct {
- Word16 clipSaveLow, clipSaveHigh;
- Word16 minBitSave, maxBitSave;
- Word16 clipSpendLow, clipSpendHigh;
- Word16 minBitSpend, maxBitSpend;
-} BRES_PARAM;
-
-typedef struct {
- UWord8 modifyMinSnr;
- Word16 startSfbL, startSfbS;
-} AH_PARAM;
-
-typedef struct {
- Word32 maxRed;
- Word32 startRatio, maxRatio;
- Word32 redRatioFac;
- Word32 redOffs;
-} MINSNR_ADAPT_PARAM;
-
-typedef struct {
- /* parameters for bitreservoir control */
- Word16 peMin, peMax;
- /* constant offset to pe */
- Word16 peOffset;
- /* avoid hole parameters */
- AH_PARAM ahParam;
- /* paramters for adaptation of minSnr */
- MINSNR_ADAPT_PARAM minSnrAdaptParam;
- /* values for correction of pe */
- Word16 peLast;
- Word16 dynBitsLast;
- Word16 peCorrectionFactor;
-} ATS_ELEMENT;
-
-typedef struct {
- BRES_PARAM bresParamLong, bresParamShort; /* Word16 size: 2*8 */
- ATS_ELEMENT adjThrStateElem; /* Word16 size: 19 */
-} ADJ_THR_STATE;
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/band_nrg.h b/media/libstagefright/codecs/aacenc/inc/band_nrg.h
deleted file mode 100644
index 65453c0..0000000
--- a/media/libstagefright/codecs/aacenc/inc/band_nrg.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: band_nrg.h
-
- Content: Band/Line energy calculations functions
-
-*******************************************************************************/
-
-
-#ifndef _BAND_NRG_H
-#define _BAND_NRG_H
-
-#include "typedef.h"
-
-
-void CalcBandEnergy(const Word32 *mdctSpectrum,
- const Word16 *bandOffset,
- const Word16 numBands,
- Word32 *bandEnergy,
- Word32 *bandEnergySum);
-
-
-void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
- const Word32 *mdctSpectrumRight,
- const Word16 *bandOffset,
- const Word16 numBands,
- Word32 *bandEnergyMid,
- Word32 *bandEnergyMidSum,
- Word32 *bandEnergySide,
- Word32 *bandEnergySideSum);
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/bit_cnt.h b/media/libstagefright/codecs/aacenc/inc/bit_cnt.h
deleted file mode 100644
index 266a219..0000000
--- a/media/libstagefright/codecs/aacenc/inc/bit_cnt.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: bit_cnt.h
-
- Content: Huffman Bitcounter & coder structure and functions
-
-*******************************************************************************/
-
-#ifndef __BITCOUNT_H
-#define __BITCOUNT_H
-
-#include "bitbuffer.h"
-#include "basic_op.h"
-#define INVALID_BITCOUNT (MAX_16/4)
-
-/*
- code book number table
-*/
-
-enum codeBookNo{
- CODE_BOOK_ZERO_NO= 0,
- CODE_BOOK_1_NO= 1,
- CODE_BOOK_2_NO= 2,
- CODE_BOOK_3_NO= 3,
- CODE_BOOK_4_NO= 4,
- CODE_BOOK_5_NO= 5,
- CODE_BOOK_6_NO= 6,
- CODE_BOOK_7_NO= 7,
- CODE_BOOK_8_NO= 8,
- CODE_BOOK_9_NO= 9,
- CODE_BOOK_10_NO= 10,
- CODE_BOOK_ESC_NO= 11,
- CODE_BOOK_RES_NO= 12,
- CODE_BOOK_PNS_NO= 13
-};
-
-/*
- code book index table
-*/
-
-enum codeBookNdx{
- CODE_BOOK_ZERO_NDX=0,
- CODE_BOOK_1_NDX,
- CODE_BOOK_2_NDX,
- CODE_BOOK_3_NDX,
- CODE_BOOK_4_NDX,
- CODE_BOOK_5_NDX,
- CODE_BOOK_6_NDX,
- CODE_BOOK_7_NDX,
- CODE_BOOK_8_NDX,
- CODE_BOOK_9_NDX,
- CODE_BOOK_10_NDX,
- CODE_BOOK_ESC_NDX,
- CODE_BOOK_RES_NDX,
- CODE_BOOK_PNS_NDX,
- NUMBER_OF_CODE_BOOKS
-};
-
-/*
- code book lav table
-*/
-
-enum codeBookLav{
- CODE_BOOK_ZERO_LAV=0,
- CODE_BOOK_1_LAV=1,
- CODE_BOOK_2_LAV=1,
- CODE_BOOK_3_LAV=2,
- CODE_BOOK_4_LAV=2,
- CODE_BOOK_5_LAV=4,
- CODE_BOOK_6_LAV=4,
- CODE_BOOK_7_LAV=7,
- CODE_BOOK_8_LAV=7,
- CODE_BOOK_9_LAV=12,
- CODE_BOOK_10_LAV=12,
- CODE_BOOK_ESC_LAV=16,
- CODE_BOOK_SCF_LAV=60,
- CODE_BOOK_PNS_LAV=60
-};
-
-Word16 bitCount(const Word16 *aQuantSpectrum,
- const Word16 noOfSpecLines,
- Word16 maxVal,
- Word16 *bitCountLut);
-
-Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream);
-
-Word16 bitCountScalefactorDelta(Word16 delta);
-Word16 codeScalefactorDelta(Word16 scalefactor, HANDLE_BIT_BUF hBitstream);
-
-
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/bitbuffer.h b/media/libstagefright/codecs/aacenc/inc/bitbuffer.h
deleted file mode 100644
index 7c79f07..0000000
--- a/media/libstagefright/codecs/aacenc/inc/bitbuffer.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: bitbuffer.h
-
- Content: Bit Buffer Management structure and functions
-
-*******************************************************************************/
-
-#ifndef BITBUFFER_H
-#define BITBUFFER_H
-
-#include "typedef.h"
-
-
-enum direction
-{
- forwardDirection,
- backwardDirection
-};
-
-
-/*!
- The pointer 'pReadNext' points to the next available word, where bits can be read from. The pointer
- 'pWriteNext' points to the next available word, where bits can be written to. The pointer pBitBufBase
- points to the start of the bitstream buffer and the pointer pBitBufEnd points to the end of the bitstream
- buffer. The two pointers are used as lower-bound respectively upper-bound address for the modulo addressing
- mode.
-
- The element cntBits contains the currently available bits in the bit buffer. It will be incremented when
- bits are written to the bitstream buffer and decremented when bits are read from the bitstream buffer.
-*/
-struct BIT_BUF
-{
- UWord8 *pBitBufBase; /*!< pointer points to first position in bitstream buffer */
- UWord8 *pBitBufEnd; /*!< pointer points to last position in bitstream buffer */
-
- UWord8 *pWriteNext; /*!< pointer points to next available word in bitstream buffer to write */
-
- UWord32 cache;
-
- Word16 wBitPos; /*!< 31<=wBitPos<=0*/
- Word16 cntBits; /*!< number of available bits in the bitstream buffer
- write bits to bitstream buffer => increment cntBits
- read bits from bitstream buffer => decrement cntBits */
- Word16 size; /*!< size of bitbuffer in bits */
- Word16 isValid; /*!< indicates whether the instance has been initialized */
-}; /* size Word16: 8 */
-
-/*! Define pointer to bit buffer structure */
-typedef struct BIT_BUF *HANDLE_BIT_BUF;
-
-
-HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
- UWord8 *pBitBufBase,
- Word16 bitBufSize);
-
-
-void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf);
-
-
-Word16 GetBitsAvail(HANDLE_BIT_BUF hBitBuf);
-
-
-Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
- UWord32 writeValue,
- Word16 noBitsToWrite);
-
-void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
- UWord8 *pBitBufBase,
- Word16 bitBufSize);
-
-#define GetNrBitsAvailable(hBitBuf) ( (hBitBuf)->cntBits)
-#define GetNrBitsRead(hBitBuf) ((hBitBuf)->size-(hBitBuf)->cntBits)
-
-#endif /* BITBUFFER_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/bitenc.h b/media/libstagefright/codecs/aacenc/inc/bitenc.h
deleted file mode 100644
index 6a58aeb..0000000
--- a/media/libstagefright/codecs/aacenc/inc/bitenc.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: bitenc.h
-
- Content: Bitstream encoder structure and functions
-
-*******************************************************************************/
-
-#ifndef _BITENC_H
-#define _BITENC_H
-
-#include "qc_data.h"
-#include "tns.h"
-#include "channel_map.h"
-#include "interface.h"
-
-struct BITSTREAMENCODER_INIT
-{
- Word16 nChannels;
- Word32 bitrate;
- Word32 sampleRate;
- Word16 profile;
-};
-
-
-
-Word16 WriteBitstream (HANDLE_BIT_BUF hBitstream,
- ELEMENT_INFO elInfo,
- QC_OUT *qcOut,
- PSY_OUT *psyOut,
- Word16 *globUsedBits,
- const UWord8 *ancBytes,
- Word16 samplerate
- );
-
-#endif /* _BITENC_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/block_switch.h b/media/libstagefright/codecs/aacenc/inc/block_switch.h
deleted file mode 100644
index a4d3e8f..0000000
--- a/media/libstagefright/codecs/aacenc/inc/block_switch.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: block_switch.h
-
- Content: Block switching structure and functions
-
-*******************************************************************************/
-
-#ifndef _BLOCK_SWITCH_H
-#define _BLOCK_SWITCH_H
-
-#include "typedef.h"
-
-
-/****************** Defines ******************************/
-#define BLOCK_SWITCHING_IIR_LEN 2 /* Length of HighPass-FIR-Filter for Attack-Detection */
-#define BLOCK_SWITCH_WINDOWS TRANS_FAC /* number of windows for energy calculation */
-#define BLOCK_SWITCH_WINDOW_LEN FRAME_LEN_SHORT /* minimal granularity of energy calculation */
-
-
-
-/****************** Structures ***************************/
-typedef struct{
- Word32 invAttackRatio;
- Word16 windowSequence;
- Word16 nextwindowSequence;
- Flag attack;
- Flag lastattack;
- Word16 attackIndex;
- Word16 lastAttackIndex;
- Word16 noOfGroups;
- Word16 groupLen[TRANS_FAC];
- Word32 windowNrg[2][BLOCK_SWITCH_WINDOWS]; /* time signal energy in Subwindows (last and current) */
- Word32 windowNrgF[2][BLOCK_SWITCH_WINDOWS]; /* filtered time signal energy in segments (last and current) */
- Word32 iirStates[BLOCK_SWITCHING_IIR_LEN]; /* filter delay-line */
- Word32 maxWindowNrg; /* max energy in subwindows */
- Word32 accWindowNrg; /* recursively accumulated windowNrgF */
-}BLOCK_SWITCHING_CONTROL;
-
-
-
-
-
-Word16 InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
- const Word32 bitRate, const Word16 nChannels);
-
-Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
- Word16 *timeSignal,
- Word32 sampleRate,
- Word16 chIncrement);
-
-Word16 SyncBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft,
- BLOCK_SWITCHING_CONTROL *blockSwitchingControlRight,
- const Word16 noOfChannels);
-
-
-
-#endif /* #ifndef _BLOCK_SWITCH_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/channel_map.h b/media/libstagefright/codecs/aacenc/inc/channel_map.h
deleted file mode 100644
index c361feb..0000000
--- a/media/libstagefright/codecs/aacenc/inc/channel_map.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: channel_map.h
-
- Content: channel mapping functions
-
-*******************************************************************************/
-
-#ifndef _CHANNEL_MAP_H
-#define _CHANNEL_MAP_H
-
-#include "psy_const.h"
-#include "qc_data.h"
-
-Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo);
-
-Word16 InitElementBits(ELEMENT_BITS *elementBits,
- ELEMENT_INFO elInfo,
- Word32 bitrateTot,
- Word16 averageBitsTot,
- Word16 staticBitsTot);
-
-#endif /* CHANNEL_MAP_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/config.h b/media/libstagefright/codecs/aacenc/inc/config.h
deleted file mode 100644
index b0b4c26..0000000
--- a/media/libstagefright/codecs/aacenc/inc/config.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: config.h
-
- Content: aac encoder parameter
-
-*******************************************************************************/
-
-#ifndef _AACENC_CONFIG_H_
-#define _AACENC_CONFIG_H_
-
-#define MAX_CHANNELS 2
-
-#define AACENC_BLOCKSIZE 1024 /*! encoder only takes BLOCKSIZE samples at a time */
-#define AACENC_TRANS_FAC 8 /*! encoder short long ratio */
-
-
-#define MAXBITS_COEF 6144
-#define MINBITS_COEF 744
-
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/dyn_bits.h b/media/libstagefright/codecs/aacenc/inc/dyn_bits.h
deleted file mode 100644
index d3a8a67..0000000
--- a/media/libstagefright/codecs/aacenc/inc/dyn_bits.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: dyn_bits.h
-
- Content: Noiseless coder module structure and functions
-
-*******************************************************************************/
-
-#ifndef __DYN_BITS_H
-#define __DYN_BITS_H
-
-#include "psy_const.h"
-#include "tns.h"
-#include "bit_cnt.h"
-
-
-
-#define MAX_SECTIONS MAX_GROUPED_SFB
-#define SECT_ESC_VAL_LONG 31
-#define SECT_ESC_VAL_SHORT 7
-#define CODE_BOOK_BITS 4
-#define SECT_BITS_LONG 5
-#define SECT_BITS_SHORT 3
-
-typedef struct
-{
- Word16 codeBook;
- Word16 sfbStart;
- Word16 sfbCnt;
- Word16 sectionBits;
-}
-SECTION_INFO;
-
-
-
-
-typedef struct
-{
- Word16 blockType;
- Word16 noOfGroups;
- Word16 sfbCnt;
- Word16 maxSfbPerGroup;
- Word16 sfbPerGroup;
- Word16 noOfSections;
- SECTION_INFO sectionInfo[MAX_SECTIONS];
- Word16 sideInfoBits; /* sectioning bits */
- Word16 huffmanBits; /* huffman coded bits */
- Word16 scalefacBits; /* scalefac coded bits */
- Word16 firstScf; /* first scf to be coded */
- Word16 bitLookUp[MAX_SFB_LONG*(CODE_BOOK_ESC_NDX+1)];
- Word16 mergeGainLookUp[MAX_SFB_LONG];
-}
-SECTION_DATA; /* Word16 size: 10 + 60(MAX_SECTIONS)*4(SECTION_INFO) + 51(MAX_SFB_LONG)*12(CODE_BOOK_ESC_NDX+1) + 51(MAX_SFB_LONG) = 913 */
-
-
-Word16 BCInit(void);
-
-Word16 dynBitCount(const Word16 *quantSpectrum,
- const UWord16 *maxValueInSfb,
- const Word16 *scalefac,
- const Word16 blockType,
- const Word16 sfbCnt,
- const Word16 maxSfbPerGroup,
- const Word16 sfbPerGroup,
- const Word16 *sfbOffset,
- SECTION_DATA *sectionData);
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/grp_data.h b/media/libstagefright/codecs/aacenc/inc/grp_data.h
deleted file mode 100644
index 4c1b2cb..0000000
--- a/media/libstagefright/codecs/aacenc/inc/grp_data.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: grp_data.h
-
- Content: Short block grouping function
-
-*******************************************************************************/
-
-#ifndef __GRP_DATA_H__
-#define __GRP_DATA_H__
-#include "psy_data.h"
-#include "typedefs.h"
-
-void
-groupShortData(Word32 *mdctSpectrum,
- Word32 *tmpSpectrum,
- SFB_THRESHOLD *sfbThreshold,
- SFB_ENERGY *sfbEnergy,
- SFB_ENERGY *sfbEnergyMS,
- SFB_ENERGY *sfbSpreadedEnergy,
- const Word16 sfbCnt,
- const Word16 *sfbOffset,
- const Word16 *sfbMinSnr,
- Word16 *groupedSfbOffset,
- Word16 *maxSfbPerGroup,
- Word16 *groupedSfbMinSnr,
- const Word16 noOfGroups,
- const Word16 *groupLen);
-
-#endif /* _INTERFACE_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/interface.h b/media/libstagefright/codecs/aacenc/inc/interface.h
deleted file mode 100644
index a42e6a9..0000000
--- a/media/libstagefright/codecs/aacenc/inc/interface.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: interface.h
-
- Content: psychoaccoustic/quantizer structures and interface
-
-*******************************************************************************/
-
-#ifndef _INTERFACE_H
-#define _INTERFACE_H
-
-#include "config.h"
-#include "psy_const.h"
-#include "psy_data.h"
-#include "typedefs.h"
-
-
-enum
-{
- MS_NONE = 0,
- MS_SOME = 1,
- MS_ALL = 2
-};
-
-enum
-{
- MS_ON = 1
-};
-
-struct TOOLSINFO {
- Word16 msDigest;
- Word16 msMask[MAX_GROUPED_SFB];
-};
-
-
-typedef struct {
- Word16 sfbCnt;
- Word16 sfbPerGroup;
- Word16 maxSfbPerGroup;
- Word16 windowSequence;
- Word16 windowShape;
- Word16 groupingMask;
- Word16 sfbOffsets[MAX_GROUPED_SFB+1];
- Word16 mdctScale;
- Word32 *sfbEnergy;
- Word32 *sfbSpreadedEnergy;
- Word32 *sfbThreshold;
- Word32 *mdctSpectrum;
- Word32 sfbEnSumLR;
- Word32 sfbEnSumMS;
- Word32 sfbDist[MAX_GROUPED_SFB];
- Word32 sfbDistNew[MAX_GROUPED_SFB];
- Word16 sfbMinSnr[MAX_GROUPED_SFB];
- Word16 minSfMaxQuant[MAX_GROUPED_SFB];
- Word16 minScfCalculated[MAX_GROUPED_SFB];
- Word16 prevScfLast[MAX_GROUPED_SFB];
- Word16 prevScfNext[MAX_GROUPED_SFB];
- Word16 deltaPeLast[MAX_GROUPED_SFB];
- TNS_INFO tnsInfo;
-} PSY_OUT_CHANNEL; /* Word16 size: 14 + 60(MAX_GROUPED_SFB) + 112(TNS_INFO) = 186 */
-
-typedef struct {
- struct TOOLSINFO toolsInfo;
- Word16 groupedSfbOffset[MAX_CHANNELS][MAX_GROUPED_SFB+1]; /* plus one for last dummy offset ! */
- Word16 groupedSfbMinSnr[MAX_CHANNELS][MAX_GROUPED_SFB];
-} PSY_OUT_ELEMENT;
-
-typedef struct {
- /* information shared by both channels */
- PSY_OUT_ELEMENT psyOutElement;
- /* information specific to each channel */
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS];
-}PSY_OUT;
-
-void BuildInterface(Word32 *mdctSpectrum,
- const Word16 mdctScale,
- SFB_THRESHOLD *sfbThreshold,
- SFB_ENERGY *sfbEnergy,
- SFB_ENERGY *sfbSpreadedEnergy,
- const SFB_ENERGY_SUM sfbEnergySumLR,
- const SFB_ENERGY_SUM sfbEnergySumMS,
- const Word16 windowSequence,
- const Word16 windowShape,
- const Word16 sfbCnt,
- const Word16 *sfbOffset,
- const Word16 maxSfbPerGroup,
- const Word16 *groupedSfbMinSnr,
- const Word16 noOfGroups,
- const Word16 *groupLen,
- PSY_OUT_CHANNEL *psyOutCh);
-
-#endif /* _INTERFACE_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/line_pe.h b/media/libstagefright/codecs/aacenc/inc/line_pe.h
deleted file mode 100644
index 116d5a8..0000000
--- a/media/libstagefright/codecs/aacenc/inc/line_pe.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: line_pe.h
-
- Content: Perceptual entropie module structure and functions
-
-*******************************************************************************/
-
-#ifndef __LINE_PE_H
-#define __LINE_PE_H
-
-
-#include "psy_const.h"
-#include "interface.h"
-
-
-typedef struct {
- Word16 sfbLdEnergy[MAX_GROUPED_SFB]; /* 4*log(sfbEnergy)/log(2) */
- Word16 sfbNLines4[MAX_GROUPED_SFB]; /* 4*number of relevant lines in sfb */
- Word16 sfbPe[MAX_GROUPED_SFB]; /* pe for each sfb */
- Word16 sfbConstPart[MAX_GROUPED_SFB]; /* constant part for each sfb */
- Word16 sfbNActiveLines[MAX_GROUPED_SFB]; /* number of active lines in sfb */
- Word16 pe; /* sum of sfbPe */
- Word16 constPart; /* sum of sfbConstPart */
- Word16 nActiveLines; /* sum of sfbNActiveLines */
-} PE_CHANNEL_DATA; /* size Word16: 303 */
-
-
-typedef struct {
- PE_CHANNEL_DATA peChannelData[MAX_CHANNELS];
- Word16 pe;
- Word16 constPart;
- Word16 nActiveLines;
- Word16 offset;
- Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB];
- Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB];
- Word32 sfbPeFactors[MAX_CHANNELS][MAX_GROUPED_SFB];
-} PE_DATA; /* size Word16: 303 + 4 + 120 + 240 = 667 */
-
-
-
-
-void prepareSfbPe(PE_DATA *peData,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
- const Word16 nChannels,
- const Word16 peOffset);
-
-
-
-
-
-void calcSfbPe(PE_DATA *peData,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- const Word16 nChannels);
-
-
-
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/memalign.h b/media/libstagefright/codecs/aacenc/inc/memalign.h
deleted file mode 100644
index 30bbf45..0000000
--- a/media/libstagefright/codecs/aacenc/inc/memalign.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: memalign.h
-
- Content: Memory alloc alignments functions
-
-*******************************************************************************/
-
-#ifndef __VO_AACENC_MEM_ALIGN_H__
-#define __VO_AACENC_MEM_ALIGN_H__
-
-#include "voMem.h"
-#include "typedef.h"
-
-extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID);
-extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID);
-
-#endif /* __VO_MEM_ALIGN_H__ */
-
-
-
diff --git a/media/libstagefright/codecs/aacenc/inc/ms_stereo.h b/media/libstagefright/codecs/aacenc/inc/ms_stereo.h
deleted file mode 100644
index 3c03dea..0000000
--- a/media/libstagefright/codecs/aacenc/inc/ms_stereo.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: ms_stereo.h
-
- Content: Declaration MS stereo processing structure and functions
-
-*******************************************************************************/
-
-#ifndef __MS_STEREO_H__
-#define __MS_STEREO_H__
-#include "typedef.h"
-
-void MsStereoProcessing(Word32 *sfbEnergyLeft,
- Word32 *sfbEnergyRight,
- const Word32 *sfbEnergyMid,
- const Word32 *sfbEnergySide,
- Word32 *mdctSpectrumLeft,
- Word32 *mdctSpectrumRight,
- Word32 *sfbThresholdLeft,
- Word32 *sfbThresholdRight,
- Word32 *sfbSpreadedEnLeft,
- Word32 *sfbSpreadedEnRight,
- Word16 *msDigest,
- Word16 *msMask,
- const Word16 sfbCnt,
- const Word16 sfbPerGroup,
- const Word16 maxSfbPerGroup,
- const Word16 *sfbOffset);
-
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h b/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h
deleted file mode 100644
index e719ba7..0000000
--- a/media/libstagefright/codecs/aacenc/inc/pre_echo_control.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: pre_echo_control.h
-
- Content: Pre echo control functions
-
-*******************************************************************************/
-
-#ifndef __PRE_ECHO_CONTROL_H
-#define __PRE_ECHO_CONTROL_H
-
-#include "typedefs.h"
-
-void InitPreEchoControl(Word32 *pbThresholdnm1,
- Word16 numPb,
- Word32 *pbThresholdQuiet);
-
-
-void PreEchoControl(Word32 *pbThresholdNm1,
- Word16 numPb,
- Word32 maxAllowedIncreaseFactor,
- Word16 minRemainingThresholdFactor,
- Word32 *pbThreshold,
- Word16 mdctScale,
- Word16 mdctScalenm1);
-
-#endif
-
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_configuration.h b/media/libstagefright/codecs/aacenc/inc/psy_configuration.h
deleted file mode 100644
index f6981fa..0000000
--- a/media/libstagefright/codecs/aacenc/inc/psy_configuration.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: psy_configuration.h
-
- Content: Psychoaccoustic configuration structure and functions
-
-*******************************************************************************/
-
-#ifndef _PSY_CONFIGURATION_H
-#define _PSY_CONFIGURATION_H
-
-#include "typedefs.h"
-#include "psy_const.h"
-#include "tns.h"
-
-typedef struct{
-
- Word16 sfbCnt;
- Word16 sfbActive; /* number of sf bands containing energy after lowpass */
- const Word16 *sfbOffset;
-
- Word32 sfbThresholdQuiet[MAX_SFB_LONG];
-
- Word16 maxAllowedIncreaseFactor; /* preecho control */
- Word16 minRemainingThresholdFactor;
-
- Word16 lowpassLine;
- Word16 sampRateIdx;
- Word32 clipEnergy; /* for level dependend tmn */
-
- Word16 ratio;
- Word16 sfbMaskLowFactor[MAX_SFB_LONG];
- Word16 sfbMaskHighFactor[MAX_SFB_LONG];
-
- Word16 sfbMaskLowFactorSprEn[MAX_SFB_LONG];
- Word16 sfbMaskHighFactorSprEn[MAX_SFB_LONG];
-
-
- Word16 sfbMinSnr[MAX_SFB_LONG]; /* minimum snr (formerly known as bmax) */
-
- TNS_CONFIG tnsConf;
-
-}PSY_CONFIGURATION_LONG; /*Word16 size: 8 + 52 + 102 + 51 + 51 + 51 + 51 + 47 = 515 */
-
-
-typedef struct{
-
- Word16 sfbCnt;
- Word16 sfbActive; /* number of sf bands containing energy after lowpass */
- const Word16 *sfbOffset;
-
- Word32 sfbThresholdQuiet[MAX_SFB_SHORT];
-
- Word16 maxAllowedIncreaseFactor; /* preecho control */
- Word16 minRemainingThresholdFactor;
-
- Word16 lowpassLine;
- Word16 sampRateIdx;
- Word32 clipEnergy; /* for level dependend tmn */
-
- Word16 ratio;
- Word16 sfbMaskLowFactor[MAX_SFB_SHORT];
- Word16 sfbMaskHighFactor[MAX_SFB_SHORT];
-
- Word16 sfbMaskLowFactorSprEn[MAX_SFB_SHORT];
- Word16 sfbMaskHighFactorSprEn[MAX_SFB_SHORT];
-
-
- Word16 sfbMinSnr[MAX_SFB_SHORT]; /* minimum snr (formerly known as bmax) */
-
- TNS_CONFIG tnsConf;
-
-}PSY_CONFIGURATION_SHORT; /*Word16 size: 8 + 16 + 16 + 16 + 16 + 16 + 16 + 16 + 47 = 167 */
-
-
-/* Returns the sample rate index */
-Word32 GetSRIndex(Word32 sampleRate);
-
-
-Word16 InitPsyConfigurationLong(Word32 bitrate,
- Word32 samplerate,
- Word16 bandwidth,
- PSY_CONFIGURATION_LONG *psyConf);
-
-Word16 InitPsyConfigurationShort(Word32 bitrate,
- Word32 samplerate,
- Word16 bandwidth,
- PSY_CONFIGURATION_SHORT *psyConf);
-
-#endif /* _PSY_CONFIGURATION_H */
-
-
-
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_const.h b/media/libstagefright/codecs/aacenc/inc/psy_const.h
deleted file mode 100644
index 0b9f8c3..0000000
--- a/media/libstagefright/codecs/aacenc/inc/psy_const.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: psy_const.h
-
- Content: Global psychoacoustic constants structures
-
-*******************************************************************************/
-
-#ifndef _PSYCONST_H
-#define _PSYCONST_H
-
-#include "config.h"
-
-#define TRUE 1
-#define FALSE 0
-
-#define FRAME_LEN_LONG AACENC_BLOCKSIZE
-#define TRANS_FAC 8
-#define FRAME_LEN_SHORT (FRAME_LEN_LONG/TRANS_FAC)
-
-
-
-/* Block types */
-enum
-{
- LONG_WINDOW = 0,
- START_WINDOW,
- SHORT_WINDOW,
- STOP_WINDOW
-};
-
-/* Window shapes */
-enum
-{
- SINE_WINDOW = 0,
- KBD_WINDOW = 1
-};
-
-/*
- MS stuff
-*/
-enum
-{
- SI_MS_MASK_NONE = 0,
- SI_MS_MASK_SOME = 1,
- SI_MS_MASK_ALL = 2
-};
-
-#define MAX_NO_OF_GROUPS 4
-#define MAX_SFB_SHORT 15 /* 15 for a memory optimized implementation, maybe 16 for convenient debugging */
-#define MAX_SFB_LONG 51 /* 51 for a memory optimized implementation, maybe 64 for convenient debugging */
-#define MAX_SFB (MAX_SFB_SHORT > MAX_SFB_LONG ? MAX_SFB_SHORT : MAX_SFB_LONG) /* = MAX_SFB_LONG */
-#define MAX_GROUPED_SFB (MAX_NO_OF_GROUPS*MAX_SFB_SHORT > MAX_SFB_LONG ? \
- MAX_NO_OF_GROUPS*MAX_SFB_SHORT : MAX_SFB_LONG)
-
-#define BLOCK_SWITCHING_OFFSET (1*1024+3*128+64+128)
-#define BLOCK_SWITCHING_DATA_SIZE FRAME_LEN_LONG
-
-#define TRANSFORM_OFFSET_LONG 0
-#define TRANSFORM_OFFSET_SHORT 448
-
-#define LOG_NORM_PCM (-15)
-
-#define NUM_SAMPLE_RATES 12
-
-#endif /* _PSYCONST_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_data.h b/media/libstagefright/codecs/aacenc/inc/psy_data.h
deleted file mode 100644
index 3ea6a84..0000000
--- a/media/libstagefright/codecs/aacenc/inc/psy_data.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: psy_data.h
-
- Content: Psychoacoustic data and structures
-
-*******************************************************************************/
-
-#ifndef _PSY_DATA_H
-#define _PSY_DATA_H
-
-#include "block_switch.h"
-#include "tns.h"
-
-/*
- the structs can be implemented as unions
-*/
-
-typedef struct{
- Word32 sfbLong[MAX_GROUPED_SFB];
- Word32 sfbShort[TRANS_FAC][MAX_SFB_SHORT];
-}SFB_THRESHOLD; /* Word16 size: 260 */
-
-typedef struct{
- Word32 sfbLong[MAX_GROUPED_SFB];
- Word32 sfbShort[TRANS_FAC][MAX_SFB_SHORT];
-}SFB_ENERGY; /* Word16 size: 260 */
-
-typedef struct{
- Word32 sfbLong;
- Word32 sfbShort[TRANS_FAC];
-}SFB_ENERGY_SUM; /* Word16 size: 18 */
-
-
-typedef struct{
- BLOCK_SWITCHING_CONTROL blockSwitchingControl; /* block switching */
- Word16 *mdctDelayBuffer; /* mdct delay buffer [BLOCK_SWITCHING_OFFSET]*/
- Word32 sfbThresholdnm1[MAX_SFB]; /* PreEchoControl */
- Word16 mdctScalenm1; /* scale of last block's mdct (PreEchoControl) */
-
- SFB_THRESHOLD sfbThreshold; /* adapt */
- SFB_ENERGY sfbEnergy; /* sfb Energy */
- SFB_ENERGY sfbEnergyMS;
- SFB_ENERGY_SUM sfbEnergySum;
- SFB_ENERGY_SUM sfbEnergySumMS;
- SFB_ENERGY sfbSpreadedEnergy;
-
- Word32 *mdctSpectrum; /* mdct spectrum [FRAME_LEN_LONG] */
- Word16 mdctScale; /* scale of mdct */
-}PSY_DATA; /* Word16 size: 4 + 87 + 102 + 360 + 360 + 360 + 18 + 18 + 360 = 1669 */
-
-#endif /* _PSY_DATA_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/psy_main.h b/media/libstagefright/codecs/aacenc/inc/psy_main.h
deleted file mode 100644
index 2ccac60..0000000
--- a/media/libstagefright/codecs/aacenc/inc/psy_main.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: psy_main.h
-
- Content: Psychoacoustic major function block
-
-*******************************************************************************/
-
-#ifndef _PSYMAIN_H
-#define _PSYMAIN_H
-
-#include "psy_configuration.h"
-#include "qc_data.h"
-#include "memalign.h"
-
-/*
- psy kernel
-*/
-typedef struct {
- PSY_CONFIGURATION_LONG psyConfLong; /* Word16 size: 515 */
- PSY_CONFIGURATION_SHORT psyConfShort; /* Word16 size: 167 */
- PSY_DATA psyData[MAX_CHANNELS]; /* Word16 size: MAX_CHANNELS*1669*/
- TNS_DATA tnsData[MAX_CHANNELS]; /* Word16 size: MAX_CHANNELS*235 */
- Word32* pScratchTns;
- Word16 sampleRateIdx;
-}PSY_KERNEL; /* Word16 size: 2587 / 4491 */
-
-
-Word16 PsyNew( PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP);
-Word16 PsyDelete( PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP);
-
-Word16 PsyOutNew( PSY_OUT *hPsyOut, VO_MEM_OPERATOR *pMemOP);
-Word16 PsyOutDelete( PSY_OUT *hPsyOut, VO_MEM_OPERATOR *pMemOP);
-
-Word16 psyMainInit( PSY_KERNEL *hPsy,
- Word32 sampleRate,
- Word32 bitRate,
- Word16 channels,
- Word16 tnsMask,
- Word16 bandwidth);
-
-
-Word16 psyMain(Word16 nChannels, /*!< total number of channels */
- ELEMENT_INFO *elemInfo,
- Word16 *timeSignal, /*!< interleaved time signal */
- PSY_DATA psyData[MAX_CHANNELS],
- TNS_DATA tnsData[MAX_CHANNELS],
- PSY_CONFIGURATION_LONG* psyConfLong,
- PSY_CONFIGURATION_SHORT* psyConfShort,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT *psyOutElement,
- Word32 *pScratchTns,
- Word32 sampleRate);
-
-#endif /* _PSYMAIN_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/qc_data.h b/media/libstagefright/codecs/aacenc/inc/qc_data.h
deleted file mode 100644
index 109922d..0000000
--- a/media/libstagefright/codecs/aacenc/inc/qc_data.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: qc_data.h
-
- Content: Quantizing & coding structures
-
-*******************************************************************************/
-
-#ifndef _QC_DATA_H
-#define _QC_DATA_H
-
-#include "psy_const.h"
-#include "dyn_bits.h"
-#include "adj_thr_data.h"
-
-
-#define MAX_MODES 10
-
-typedef enum {
- MODE_INVALID = 0,
- MODE_1, /* mono */
- MODE_1_1, /* dual mono */
- MODE_2 /* stereo */
-} ENCODER_MODE;
-
-typedef enum {
- ID_SCE=0, /* Single Channel Element */
- ID_CPE=1, /* Channel Pair Element */
- ID_CCE=2, /* Coupling Channel Element */
- ID_LFE=3, /* LFE Channel Element */
- ID_DSE=4, /* current one DSE element for ancillary is supported */
- ID_PCE=5,
- ID_FIL=6,
- ID_END=7
-}ELEMENT_TYPE;
-
-typedef struct {
- ELEMENT_TYPE elType;
- Word16 instanceTag;
- Word16 nChannelsInEl;
- Word16 ChannelIndex[MAX_CHANNELS];
-} ELEMENT_INFO;
-
-typedef struct {
- Word32 paddingRest;
-} PADDING;
-
-
-/* Quantizing & coding stage */
-
-struct QC_INIT{
- ELEMENT_INFO *elInfo;
- Word16 maxBits; /* maximum number of bits in reservoir */
- Word16 averageBits; /* average number of bits we should use */
- Word16 bitRes;
- Word16 meanPe;
- Word32 chBitrate;
- Word16 maxBitFac;
- Word32 bitrate;
-
- PADDING padding;
-};
-
-typedef struct
-{
- Word16 *quantSpec; /* [FRAME_LEN_LONG]; */
- UWord16 *maxValueInSfb; /* [MAX_GROUPED_SFB]; */
- Word16 *scf; /* [MAX_GROUPED_SFB]; */
- Word16 globalGain;
- Word16 mdctScale;
- Word16 groupingMask;
- SECTION_DATA sectionData;
- Word16 windowShape;
-} QC_OUT_CHANNEL;
-
-typedef struct
-{
- Word16 adtsUsed;
- Word16 staticBitsUsed; /* for verification purposes */
- Word16 dynBitsUsed; /* for verification purposes */
- Word16 pe;
- Word16 ancBitsUsed;
- Word16 fillBits;
-} QC_OUT_ELEMENT;
-
-typedef struct
-{
- QC_OUT_CHANNEL qcChannel[MAX_CHANNELS];
- QC_OUT_ELEMENT qcElement;
- Word16 totStaticBitsUsed; /* for verification purposes */
- Word16 totDynBitsUsed; /* for verification purposes */
- Word16 totAncBitsUsed; /* for verification purposes */
- Word16 totFillBits;
- Word16 alignBits;
- Word16 bitResTot;
- Word16 averageBitsTot;
-} QC_OUT;
-
-typedef struct {
- Word32 chBitrate;
- Word16 averageBits; /* brutto -> look ancillary.h */
- Word16 maxBits;
- Word16 bitResLevel;
- Word16 maxBitResBits;
- Word16 relativeBits; /* Bits relative to total Bits scaled down by 2 */
-} ELEMENT_BITS;
-
-typedef struct
-{
- /* this is basically struct QC_INIT */
- Word16 averageBitsTot;
- Word16 maxBitsTot;
- Word16 globStatBits;
- Word16 nChannels;
- Word16 bitResTot;
-
- Word16 maxBitFac;
-
- PADDING padding;
-
- ELEMENT_BITS elementBits;
- ADJ_THR_STATE adjThr;
-
- Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB];
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB];
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB];
-} QC_STATE;
-
-#endif /* _QC_DATA_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/qc_main.h b/media/libstagefright/codecs/aacenc/inc/qc_main.h
deleted file mode 100644
index 8f83973..0000000
--- a/media/libstagefright/codecs/aacenc/inc/qc_main.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: qc_main.h
-
- Content: Quantizing & coding functions
-
-*******************************************************************************/
-
-#ifndef _QC_MAIN_H
-#define _QC_MAIN_H
-
-#include "qc_data.h"
-#include "interface.h"
-#include "memalign.h"
-
-/* Quantizing & coding stage */
-
-Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP);
-
-void QCOutDelete(QC_OUT *hQC, VO_MEM_OPERATOR *pMemOP);
-
-Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
-
-Word16 QCInit(QC_STATE *hQC,
- struct QC_INIT *init);
-
-void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP);
-
-
-Word16 QCMain(QC_STATE *hQC,
- ELEMENT_BITS* elBits,
- ATS_ELEMENT* adjThrStateElement,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */
- PSY_OUT_ELEMENT* psyOutElement,
- QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */
- QC_OUT_ELEMENT* qcOutElement,
- Word16 nChannels,
- Word16 ancillaryDataBytes); /* returns error code */
-
-void updateBitres(QC_STATE* qcKernel,
- QC_OUT* qcOut);
-
-Word16 FinalizeBitConsumption(QC_STATE *hQC,
- QC_OUT* qcOut);
-
-Word16 AdjustBitrate(QC_STATE *hQC,
- Word32 bitRate,
- Word32 sampleRate);
-
-#endif /* _QC_MAIN_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/quantize.h b/media/libstagefright/codecs/aacenc/inc/quantize.h
deleted file mode 100644
index 1cafef6..0000000
--- a/media/libstagefright/codecs/aacenc/inc/quantize.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: quantize.h
-
- Content: Quantization functions
-
-*******************************************************************************/
-
-#ifndef _QUANTIZE_H_
-#define _QUANTIZE_H_
-#include "typedefs.h"
-
-/* quantizing */
-
-#define MAX_QUANT 8191
-
-void QuantizeSpectrum(Word16 sfbCnt,
- Word16 maxSfbPerGroup,
- Word16 sfbPerGroup,
- Word16 *sfbOffset, Word32 *mdctSpectrum,
- Word16 globalGain, Word16 *scalefactors,
- Word16 *quantizedSpectrum);
-
-Word32 calcSfbDist(const Word32 *spec,
- Word16 sfbWidth,
- Word16 gain);
-
-#endif /* _QUANTIZE_H_ */
diff --git a/media/libstagefright/codecs/aacenc/inc/sf_estim.h b/media/libstagefright/codecs/aacenc/inc/sf_estim.h
deleted file mode 100644
index 997eba5..0000000
--- a/media/libstagefright/codecs/aacenc/inc/sf_estim.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: sf_estim.h
-
- Content: Scale factor estimation functions
-
-*******************************************************************************/
-
-#ifndef __SF_ESTIM_H__
-#define __SF_ESTIM_H__
-/*
- Scale factor estimation
- */
-#include "psy_const.h"
-#include "interface.h"
-#include "qc_data.h"
-
-void
-CalcFormFactor(Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- const Word16 nChannels);
-
-void
-EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS],
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
- const Word16 nChannels);
-#endif
diff --git a/media/libstagefright/codecs/aacenc/inc/spreading.h b/media/libstagefright/codecs/aacenc/inc/spreading.h
deleted file mode 100644
index 0c96fc7..0000000
--- a/media/libstagefright/codecs/aacenc/inc/spreading.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: spreading.h
-
- Content: Spreading of energy functions
-
-*******************************************************************************/
-
-#ifndef _SPREADING_H
-#define _SPREADING_H
-#include "typedefs.h"
-
-
-void SpreadingMax(const Word16 pbCnt,
- const Word16 *maskLowFactor,
- const Word16 *maskHighFactor,
- Word32 *pbSpreadedEnergy);
-
-#endif /* #ifndef _SPREADING_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/stat_bits.h b/media/libstagefright/codecs/aacenc/inc/stat_bits.h
deleted file mode 100644
index 9cddc1d..0000000
--- a/media/libstagefright/codecs/aacenc/inc/stat_bits.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: stat_bits.h
-
- Content: Static bit counter functions
-
-*******************************************************************************/
-
-#ifndef __STAT_BITS_H
-#define __STAT_BITS_H
-
-#include "psy_const.h"
-#include "interface.h"
-
-Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT *psyOutElement,
- Word16 nChannels,
- Word16 adtsUsed);
-
-#endif /* __STAT_BITS_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/tns.h b/media/libstagefright/codecs/aacenc/inc/tns.h
deleted file mode 100644
index 40cfaee..0000000
--- a/media/libstagefright/codecs/aacenc/inc/tns.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: tns.h
-
- Content: TNS structures
-
-*******************************************************************************/
-
-#ifndef _TNS_H
-#define _TNS_H
-
-#include "typedef.h"
-#include "psy_const.h"
-
-
-
-#define TNS_MAX_ORDER 12
-#define TNS_MAX_ORDER_SHORT 5
-
-#define FILTER_DIRECTION 0
-
-typedef struct{ /*stuff that is tabulated dependent on bitrate etc. */
- Word16 threshOn; /* min. prediction gain for using tns TABUL * 100*/
- Word32 lpcStartFreq; /* lowest freq for lpc TABUL*/
- Word32 lpcStopFreq; /* TABUL */
- Word32 tnsTimeResolution;
-}TNS_CONFIG_TABULATED;
-
-
-typedef struct { /*assigned at InitTime*/
- Word16 tnsActive;
- Word16 tnsMaxSfb;
-
- Word16 maxOrder; /* max. order of tns filter */
- Word16 tnsStartFreq; /* lowest freq. for tns filtering */
- Word16 coefRes;
-
- TNS_CONFIG_TABULATED confTab;
-
- Word32 acfWindow[TNS_MAX_ORDER+1];
-
- Word16 tnsStartBand;
- Word16 tnsStartLine;
-
- Word16 tnsStopBand;
- Word16 tnsStopLine;
-
- Word16 lpcStartBand;
- Word16 lpcStartLine;
-
- Word16 lpcStopBand;
- Word16 lpcStopLine;
-
- Word16 tnsRatioPatchLowestCb;
- Word16 tnsModifyBeginCb;
-
- Word16 threshold; /* min. prediction gain for using tns TABUL * 100 */
-
-}TNS_CONFIG;
-
-
-typedef struct {
- Word16 tnsActive;
- Word32 parcor[TNS_MAX_ORDER];
- Word16 predictionGain;
-} TNS_SUBBLOCK_INFO; /* Word16 size: 26 */
-
-typedef struct{
- TNS_SUBBLOCK_INFO subBlockInfo[TRANS_FAC];
-} TNS_DATA_SHORT;
-
-typedef struct{
- TNS_SUBBLOCK_INFO subBlockInfo;
-} TNS_DATA_LONG;
-
-typedef struct{
- TNS_DATA_LONG tnsLong;
- TNS_DATA_SHORT tnsShort;
-}TNS_DATA_RAW;
-
-typedef struct{
- Word16 numOfSubblocks;
- TNS_DATA_RAW dataRaw;
-}TNS_DATA; /* Word16 size: 1 + 8*26 + 26 = 235 */
-
-typedef struct{
- Word16 tnsActive[TRANS_FAC];
- Word16 coefRes[TRANS_FAC];
- Word16 length[TRANS_FAC];
- Word16 order[TRANS_FAC];
- Word16 coef[TRANS_FAC*TNS_MAX_ORDER_SHORT];
-}TNS_INFO; /* Word16 size: 72 */
-
-#endif /* _TNS_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/tns_func.h b/media/libstagefright/codecs/aacenc/inc/tns_func.h
deleted file mode 100644
index 02df24d..0000000
--- a/media/libstagefright/codecs/aacenc/inc/tns_func.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: tns_func.h
-
- Content: TNS functions
-
-*******************************************************************************/
-
-/*
- Temporal noise shaping
- */
-#ifndef _TNS_FUNC_H
-#define _TNS_FUNC_H
-#include "typedef.h"
-#include "psy_configuration.h"
-
-Word16 InitTnsConfigurationLong(Word32 bitrate,
- Word32 samplerate,
- Word16 channels,
- TNS_CONFIG *tnsConfig,
- PSY_CONFIGURATION_LONG *psyConfig,
- Word16 active);
-
-Word16 InitTnsConfigurationShort(Word32 bitrate,
- Word32 samplerate,
- Word16 channels,
- TNS_CONFIG *tnsConfig,
- PSY_CONFIGURATION_SHORT *psyConfig,
- Word16 active);
-
-Word32 TnsDetect(TNS_DATA* tnsData,
- TNS_CONFIG tC,
- Word32* pScratchTns,
- const Word16 sfbOffset[],
- Word32* spectrum,
- Word16 subBlockNumber,
- Word16 blockType,
- Word32 * sfbEnergy);
-
-void TnsSync(TNS_DATA *tnsDataDest,
- const TNS_DATA *tnsDataSrc,
- const TNS_CONFIG tC,
- const Word16 subBlockNumber,
- const Word16 blockType);
-
-Word16 TnsEncode(TNS_INFO* tnsInfo,
- TNS_DATA* tnsData,
- Word16 numOfSfb,
- TNS_CONFIG tC,
- Word16 lowPassLine,
- Word32* spectrum,
- Word16 subBlockNumber,
- Word16 blockType);
-
-void ApplyTnsMultTableToRatios(Word16 startCb,
- Word16 stopCb,
- TNS_SUBBLOCK_INFO subInfo,
- Word32 *thresholds);
-
-
-#endif /* _TNS_FUNC_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/tns_param.h b/media/libstagefright/codecs/aacenc/inc/tns_param.h
deleted file mode 100644
index 0aa33c3..0000000
--- a/media/libstagefright/codecs/aacenc/inc/tns_param.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: tns_param.h
-
- Content: TNS parameters
-
-*******************************************************************************/
-
-/*
- TNS parameters
- */
-#ifndef _TNS_PARAM_H
-#define _TNS_PARAM_H
-
-#include "tns.h"
-
-typedef struct{
- Word32 samplingRate;
- Word16 maxBandLong;
- Word16 maxBandShort;
-}TNS_MAX_TAB_ENTRY;
-
-typedef struct{
- Word32 bitRateFrom;
- Word32 bitRateTo;
- const TNS_CONFIG_TABULATED *paramMono_Long; /* contains TNS parameters */
- const TNS_CONFIG_TABULATED *paramMono_Short;
- const TNS_CONFIG_TABULATED *paramStereo_Long;
- const TNS_CONFIG_TABULATED *paramStereo_Short;
-}TNS_INFO_TAB;
-
-
-void GetTnsParam(TNS_CONFIG_TABULATED *tnsConfigTab,
- Word32 bitRate, Word16 channels, Word16 blockType);
-
-void GetTnsMaxBands(Word32 samplingRate, Word16 blockType, Word16* tnsMaxSfb);
-
-#endif /* _TNS_PARAM_H */
diff --git a/media/libstagefright/codecs/aacenc/inc/transform.h b/media/libstagefright/codecs/aacenc/inc/transform.h
deleted file mode 100644
index 311cef5..0000000
--- a/media/libstagefright/codecs/aacenc/inc/transform.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: transform.h
-
- Content: MDCT Transform functions
-
-*******************************************************************************/
-
-#ifndef __TRANSFORM_H__
-#define __TRANSFORM_H__
-
-#include "typedef.h"
-
-void Transform_Real(Word16 *mdctDelayBuffer,
- Word16 *timeSignal,
- Word16 chIncrement, /*! channel increment */
- Word32 *realOut,
- Word16 *mdctScale,
- Word16 windowSequence
- );
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/src/aac_rom.c b/media/libstagefright/codecs/aacenc/src/aac_rom.c
deleted file mode 100644
index f08f3a9..0000000
--- a/media/libstagefright/codecs/aacenc/src/aac_rom.c
+++ /dev/null
@@ -1,2363 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: aac_rom.c
-
- Content: constant tables
-
-*******************************************************************************/
-
-#include "aac_rom.h"
-
-#if defined (ARMV5E) && !defined (ARMV7Neon)
-
-/*
- * Q30 for 128 and 1024
- *
- * for (i = 0; i < num/4; i++) {
- * angle = (i + 0.125) * M_PI / num;
- * x = cos(angle) * (1 << 30);
- * x = sin(angle) * (1 << 30);
- *
- * angle = (num/2 - 1 - i + 0.125) * M_PI / num;
- * x = cos(angle) * (1 << 30);
- * x = sin(angle) * (1 << 30);
- * }
- */
-const int cossintab[128 + 1024] = {
- /* 128 */
- 0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776,
- 0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea,
- 0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796,
- 0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad,
- 0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179,
- 0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728,
- 0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88,
- 0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb,
- 0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2,
- 0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663,
- 0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e,
- 0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4,
- 0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222,
- 0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea,
- 0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a,
- 0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da,
- /* 1024 */
- 0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b,
- 0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b,
- 0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5,
- 0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec,
- 0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44,
- 0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5,
- 0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878,
- 0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265,
- 0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98,
- 0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f,
- 0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06,
- 0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f,
- 0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b,
- 0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac,
- 0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7,
- 0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2,
- 0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954,
- 0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7,
- 0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5,
- 0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79,
- 0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92,
- 0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e,
- 0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e,
- 0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4,
- 0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223,
- 0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181,
- 0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5,
- 0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5,
- 0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc,
- 0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965,
- 0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc,
- 0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920,
- 0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f,
- 0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c,
- 0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788,
- 0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778,
- 0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51,
- 0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a,
- 0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c,
- 0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480,
- 0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432,
- 0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef,
- 0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5,
- 0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84,
- 0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde,
- 0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145,
- 0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe,
- 0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e,
- 0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c,
- 0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2,
- 0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98,
- 0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c,
- 0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9,
- 0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e,
- 0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c,
- 0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2,
- 0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075,
- 0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8,
- 0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552,
- 0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08,
- 0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63,
- 0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be,
- 0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574,
- 0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1,
- 0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663,
- 0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b,
- 0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129,
- 0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f,
- 0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1,
- 0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74,
- 0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f,
- 0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a,
- 0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d,
- 0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324,
- 0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb,
- 0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f,
- 0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e,
- 0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9,
- 0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142,
- 0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb,
- 0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28,
- 0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f,
- 0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7,
- 0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7,
- 0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa,
- 0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b,
- 0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4,
- 0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135,
- 0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b,
- 0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608,
- 0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b,
- 0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8,
- 0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03,
- 0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621,
- 0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9,
- 0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2,
- 0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636,
- 0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef,
- 0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768,
- 0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f,
- 0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2,
- 0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df,
- 0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8,
- 0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e,
- 0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435,
- 0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1,
- 0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557,
- 0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee,
- 0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe,
- 0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620,
- 0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee,
- 0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04,
- 0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff,
- 0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d,
- 0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c,
- 0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c,
- 0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840,
- 0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a,
- 0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c,
- 0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d,
- 0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2,
- 0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543,
- 0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6,
- 0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556,
- 0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d,
- 0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7,
- 0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510,
- 0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6
-};
-
-
-const int twidTab512[(8*6 + 32*6 + 128*6)/2] = {
- 0x40000000, 0x40000000, 0x40000000, 0x3b20187d,
- 0x3ec50c7c, 0x3536238e, 0x2d412d41, 0x3b20187d,
- 0x187d3b20, 0x187d3b20, 0x3536238e, 0xf3843ec5,
- 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xe7833b20,
- 0x238e3536, 0xc13b0c7c, 0xd2bf2d41, 0x187d3b20,
- 0xc4e0e783, 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca,
-
- 0x40000000, 0x40000000, 0x40000000, 0x3fb10645,
- 0x3fec0323, 0x3f4e0964, 0x3ec50c7c, 0x3fb10645,
- 0x3d3e1294, 0x3d3e1294, 0x3f4e0964, 0x39da1b5d,
- 0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x38711e2b,
- 0x3e140f8c, 0x2f6b2afa, 0x3536238e, 0x3d3e1294,
- 0x28993179, 0x31792899, 0x3c42158f, 0x20e736e5,
- 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x28993179,
- 0x39da1b5d, 0x0f8c3e14, 0x238e3536, 0x38711e2b,
- 0x06453fb1, 0x1e2b3871, 0x36e520e7, 0xfcdd3fec,
- 0x187d3b20, 0x3536238e, 0xf3843ec5, 0x12943d3e,
- 0x3367261f, 0xea713c42, 0x0c7c3ec5, 0x31792899,
- 0xe1d53871, 0x06453fb1, 0x2f6b2afa, 0xd9e13367,
- 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf9bb3fb1,
- 0x2afa2f6b, 0xcc99261f, 0xf3843ec5, 0x28993179,
- 0xc78f1e2b, 0xed6c3d3e, 0x261f3367, 0xc3be158f,
- 0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe1d53871,
- 0x20e736e5, 0xc0140323, 0xdc723536, 0x1e2b3871,
- 0xc04ff9bb, 0xd7673179, 0x1b5d39da, 0xc1ecf074,
- 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xce872899,
- 0x158f3c42, 0xc91bdf19, 0xcaca238e, 0x12943d3e,
- 0xce87d767, 0xc78f1e2b, 0x0f8c3e14, 0xd506d095,
- 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc2c21294,
- 0x09643f4e, 0xe4a3c626, 0xc13b0c7c, 0x06453fb1,
- 0xed6cc2c2, 0xc04f0645, 0x03233fec, 0xf69cc0b2,
-
- 0x40000000, 0x40000000, 0x40000000, 0x3ffb0192,
- 0x3ffe00c9, 0x3ff4025b, 0x3fec0323, 0x3ffb0192,
- 0x3fd304b5, 0x3fd304b5, 0x3ff4025b, 0x3f9c070d,
- 0x3fb10645, 0x3fec0323, 0x3f4e0964, 0x3f8407d5,
- 0x3fe103ec, 0x3eeb0bb6, 0x3f4e0964, 0x3fd304b5,
- 0x3e710e05, 0x3f0e0af1, 0x3fc3057d, 0x3de2104f,
- 0x3ec50c7c, 0x3fb10645, 0x3d3e1294, 0x3e710e05,
- 0x3f9c070d, 0x3c8414d1, 0x3e140f8c, 0x3f8407d5,
- 0x3bb61708, 0x3dae1111, 0x3f6a089c, 0x3ad21937,
- 0x3d3e1294, 0x3f4e0964, 0x39da1b5d, 0x3cc51413,
- 0x3f2f0a2a, 0x38cf1d79, 0x3c42158f, 0x3f0e0af1,
- 0x37af1f8b, 0x3bb61708, 0x3eeb0bb6, 0x367c2192,
- 0x3b20187d, 0x3ec50c7c, 0x3536238e, 0x3a8219ef,
- 0x3e9c0d41, 0x33de257d, 0x39da1b5d, 0x3e710e05,
- 0x3274275f, 0x392a1cc6, 0x3e440ec9, 0x30f82934,
- 0x38711e2b, 0x3e140f8c, 0x2f6b2afa, 0x37af1f8b,
- 0x3de2104f, 0x2dce2cb2, 0x36e520e7, 0x3dae1111,
- 0x2c212e5a, 0x3612223d, 0x3d7711d3, 0x2a652ff1,
- 0x3536238e, 0x3d3e1294, 0x28993179, 0x345324da,
- 0x3d021354, 0x26c032ee, 0x3367261f, 0x3cc51413,
- 0x24da3453, 0x3274275f, 0x3c8414d1, 0x22e635a5,
- 0x31792899, 0x3c42158f, 0x20e736e5, 0x307629cd,
- 0x3bfd164c, 0x1edc3811, 0x2f6b2afa, 0x3bb61708,
- 0x1cc6392a, 0x2e5a2c21, 0x3b6c17c3, 0x1aa63a2f,
- 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x2c212e5a,
- 0x3ad21937, 0x164c3bfd, 0x2afa2f6b, 0x3a8219ef,
- 0x14133cc5, 0x29cd3076, 0x3a2f1aa6, 0x11d33d77,
- 0x28993179, 0x39da1b5d, 0x0f8c3e14, 0x275f3274,
- 0x39831c12, 0x0d413e9c, 0x261f3367, 0x392a1cc6,
- 0x0af13f0e, 0x24da3453, 0x38cf1d79, 0x089c3f6a,
- 0x238e3536, 0x38711e2b, 0x06453fb1, 0x223d3612,
- 0x38111edc, 0x03ec3fe1, 0x20e736e5, 0x37af1f8b,
- 0x01923ffb, 0x1f8b37af, 0x374b2039, 0xff373ffe,
- 0x1e2b3871, 0x36e520e7, 0xfcdd3fec, 0x1cc6392a,
- 0x367c2192, 0xfa833fc3, 0x1b5d39da, 0x3612223d,
- 0xf82b3f84, 0x19ef3a82, 0x35a522e6, 0xf5d63f2f,
- 0x187d3b20, 0x3536238e, 0xf3843ec5, 0x17083bb6,
- 0x34c62434, 0xf1373e44, 0x158f3c42, 0x345324da,
- 0xeeef3dae, 0x14133cc5, 0x33de257d, 0xecac3d02,
- 0x12943d3e, 0x3367261f, 0xea713c42, 0x11113dae,
- 0x32ee26c0, 0xe83d3b6c, 0x0f8c3e14, 0x3274275f,
- 0xe6113a82, 0x0e053e71, 0x31f727fd, 0xe3ee3983,
- 0x0c7c3ec5, 0x31792899, 0xe1d53871, 0x0af13f0e,
- 0x30f82934, 0xdfc7374b, 0x09643f4e, 0x307629cd,
- 0xddc33612, 0x07d53f84, 0x2ff12a65, 0xdbcc34c6,
- 0x06453fb1, 0x2f6b2afa, 0xd9e13367, 0x04b53fd3,
- 0x2ee32b8e, 0xd80331f7, 0x03233fec, 0x2e5a2c21,
- 0xd6333076, 0x01923ffb, 0x2dce2cb2, 0xd4722ee3,
- 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xfe6e3ffb,
- 0x2cb22dce, 0xd11d2b8e, 0xfcdd3fec, 0x2c212e5a,
- 0xcf8a29cd, 0xfb4b3fd3, 0x2b8e2ee3, 0xce0927fd,
- 0xf9bb3fb1, 0x2afa2f6b, 0xcc99261f, 0xf82b3f84,
- 0x2a652ff1, 0xcb3a2434, 0xf69c3f4e, 0x29cd3076,
- 0xc9ee223d, 0xf50f3f0e, 0x293430f8, 0xc8b52039,
- 0xf3843ec5, 0x28993179, 0xc78f1e2b, 0xf1fb3e71,
- 0x27fd31f7, 0xc67d1c12, 0xf0743e14, 0x275f3274,
- 0xc57e19ef, 0xeeef3dae, 0x26c032ee, 0xc49417c3,
- 0xed6c3d3e, 0x261f3367, 0xc3be158f, 0xebed3cc5,
- 0x257d33de, 0xc2fe1354, 0xea713c42, 0x24da3453,
- 0xc2521111, 0xe8f83bb6, 0x243434c6, 0xc1bc0ec9,
- 0xe7833b20, 0x238e3536, 0xc13b0c7c, 0xe6113a82,
- 0x22e635a5, 0xc0d10a2a, 0xe4a339da, 0x223d3612,
- 0xc07c07d5, 0xe33a392a, 0x2192367c, 0xc03d057d,
- 0xe1d53871, 0x20e736e5, 0xc0140323, 0xe07537af,
- 0x2039374b, 0xc00200c9, 0xdf1936e5, 0x1f8b37af,
- 0xc005fe6e, 0xddc33612, 0x1edc3811, 0xc01ffc14,
- 0xdc723536, 0x1e2b3871, 0xc04ff9bb, 0xdb263453,
- 0x1d7938cf, 0xc096f764, 0xd9e13367, 0x1cc6392a,
- 0xc0f2f50f, 0xd8a13274, 0x1c123983, 0xc164f2bf,
- 0xd7673179, 0x1b5d39da, 0xc1ecf074, 0xd6333076,
- 0x1aa63a2f, 0xc289ee2d, 0xd5062f6b, 0x19ef3a82,
- 0xc33bebed, 0xd3df2e5a, 0x19373ad2, 0xc403e9b4,
- 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xd1a62c21,
- 0x17c33b6c, 0xc5d1e55a, 0xd0952afa, 0x17083bb6,
- 0xc6d6e33a, 0xcf8a29cd, 0x164c3bfd, 0xc7efe124,
- 0xce872899, 0x158f3c42, 0xc91bdf19, 0xcd8c275f,
- 0x14d13c84, 0xca5bdd1a, 0xcc99261f, 0x14133cc5,
- 0xcbaddb26, 0xcbad24da, 0x13543d02, 0xcd12d940,
- 0xcaca238e, 0x12943d3e, 0xce87d767, 0xc9ee223d,
- 0x11d33d77, 0xd00fd59b, 0xc91b20e7, 0x11113dae,
- 0xd1a6d3df, 0xc8511f8b, 0x104f3de2, 0xd34ed232,
- 0xc78f1e2b, 0x0f8c3e14, 0xd506d095, 0xc6d61cc6,
- 0x0ec93e44, 0xd6cccf08, 0xc6261b5d, 0x0e053e71,
- 0xd8a1cd8c, 0xc57e19ef, 0x0d413e9c, 0xda83cc22,
- 0xc4e0187d, 0x0c7c3ec5, 0xdc72caca, 0xc44a1708,
- 0x0bb63eeb, 0xde6ec984, 0xc3be158f, 0x0af13f0e,
- 0xe075c851, 0xc33b1413, 0x0a2a3f2f, 0xe287c731,
- 0xc2c21294, 0x09643f4e, 0xe4a3c626, 0xc2521111,
- 0x089c3f6a, 0xe6c9c52e, 0xc1ec0f8c, 0x07d53f84,
- 0xe8f8c44a, 0xc18f0e05, 0x070d3f9c, 0xeb2fc37c,
- 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2, 0xc0f20af1,
- 0x057d3fc3, 0xefb1c21e, 0xc0b20964, 0x04b53fd3,
- 0xf1fbc18f, 0xc07c07d5, 0x03ec3fe1, 0xf44ac115,
- 0xc04f0645, 0x03233fec, 0xf69cc0b2, 0xc02d04b5,
- 0x025b3ff4, 0xf8f3c064, 0xc0140323, 0x01923ffb,
- 0xfb4bc02d, 0xc0050192, 0x00c93ffe, 0xfda5c00c
-};
-
-const int twidTab64[(4*6 + 16*6)/2] = {
- 0x40000000, 0x40000000, 0x40000000, 0x2d412d41,
- 0x3b20187d, 0x187d3b20, 0x00004000, 0x2d412d41,
- 0xd2bf2d41, 0xd2bf2d41, 0x187d3b20, 0xc4e0e783,
-
- 0x40000000, 0x40000000, 0x40000000, 0x3ec50c7c,
- 0x3fb10645, 0x3d3e1294, 0x3b20187d, 0x3ec50c7c,
- 0x3536238e, 0x3536238e, 0x3d3e1294, 0x28993179,
- 0x2d412d41, 0x3b20187d, 0x187d3b20, 0x238e3536,
- 0x38711e2b, 0x06453fb1, 0x187d3b20, 0x3536238e,
- 0xf3843ec5, 0x0c7c3ec5, 0x31792899, 0xe1d53871,
- 0x00004000, 0x2d412d41, 0xd2bf2d41, 0xf3843ec5,
- 0x28993179, 0xc78f1e2b, 0xe7833b20, 0x238e3536,
- 0xc13b0c7c, 0xdc723536, 0x1e2b3871, 0xc04ff9bb,
- 0xd2bf2d41, 0x187d3b20, 0xc4e0e783, 0xcaca238e,
- 0x12943d3e, 0xce87d767, 0xc4e0187d, 0x0c7c3ec5,
- 0xdc72caca, 0xc13b0c7c, 0x06453fb1, 0xed6cc2c2
-};
-
-#elif defined ARMV7Neon
-/*
- * Q29 for 128 and 1024
- *
- * for (i = 0; i < num/4; i++) {
- * angle = (i + 0.125) * M_PI / num;
- * x = cos(angle) * (1 << 29);
- * x = sin(angle) * (1 << 29);
- *
- * angle = (num/2 - 1 - i + 0.125) * M_PI / num;
- * x = cos(angle) * (1 << 29);
- * x = sin(angle) * (1 << 29);
- * }
- */
-const int cossintab[128 + 1024] = {
- /* 128 */
- 0x1ffff621, 0x001921f9, 0x00afea69, 0x1ffe1c68, 0x1ffce09d, 0x00e22a7a, 0x0178dbaa, 0x1ff753bb,
- 0x1ff4dc55, 0x01ab101c, 0x024192cf, 0x1feb9d25, 0x1fe7ea85, 0x0273b3e2, 0x0309f0e2, 0x1fdafa75,
- 0x1fd60d2e, 0x033bf6dd, 0x03d1d700, 0x1fc56e3b, 0x1fbf470f, 0x0403ba2b, 0x04992653, 0x1faafbcb,
- 0x1fa39bac, 0x04cadefe, 0x055fc022, 0x1f8ba738, 0x1f830f4a, 0x059146a1, 0x062585ca, 0x1f677557,
- 0x1f5da6ed, 0x0656d27a, 0x06ea58cd, 0x1f3e6bbc, 0x1f33685a, 0x071b6415, 0x07ae1ad2, 0x1f1090bd,
- 0x1f045a15, 0x07dedd20, 0x0870ada7, 0x1eddeb6a, 0x1ed0835f, 0x08a11f78, 0x0931f34d, 0x1ea68394,
- 0x1e97ec36, 0x09620d27, 0x09f1cdf5, 0x1e6a61c5, 0x1e5a9d55, 0x0a21886e, 0x0ab02009, 0x1e298f44,
- 0x1e18a030, 0x0adf73c6, 0x0b6ccc32, 0x1de4160f, 0x1dd1fef4, 0x0b9bb1e5, 0x0c27b555, 0x1d9a00de,
- 0x1d86c484, 0x0c5625c3, 0x0ce0bea2, 0x1d4b5b1b, 0x1d36fc7c, 0x0d0eb2a2, 0x0d97cb8f, 0x1cf830e9,
- 0x1ce2b328, 0x0dc53c0a, 0x0e4cbfe2, 0x1ca08f1a, 0x1c89f587, 0x0e79a5d7, 0x0eff7fb3, 0x1c448331,
- 0x1c2cd149, 0x0f2bd437, 0x0fafef73, 0x1be41b61, 0x1bcb54cb, 0x0fdbabae, 0x105df3ec, 0x1b7f6687,
- 0x1b658f15, 0x10891120, 0x11097249, 0x1b16742a, 0x1afb8fd9, 0x1133e9d0, 0x11b25017, 0x1aa9547a,
- 0x1a8d676e, 0x11dc1b65, 0x1258734d, 0x1a38184a, 0x1a1b26d3, 0x12818bef, 0x12fbc24b, 0x19c2d111,
- 0x19a4dfa4, 0x132421ec, 0x139c23e4, 0x194990e4, 0x192aa420, 0x13c3c44a, 0x14397f5b, 0x18cc6a75,
- 0x18ac871f, 0x14605a69, 0x14d3bc6d, 0x184b7112, 0x182a9c14, 0x14f9cc26, 0x156ac352, 0x17c6b89d,
- 0x17a4f708, 0x159001d6, 0x15fe7cbe, 0x173e558e, 0x171bac96, 0x1622e450, 0x168ed1eb, 0x16b25ced,
- /* 1024 */
- 0x1fffffd9, 0x0003243f, 0x0015fdba, 0x1ffff872, 0x1ffff382, 0x001c4637, 0x002f1fa6, 0x1fffdd4d,
- 0x1fffd36f, 0x0035681d, 0x00484175, 0x1fffae6c, 0x1fff9f9e, 0x004e89e3, 0x00616318, 0x1fff6bce,
- 0x1fff5811, 0x0067ab77, 0x007a847e, 0x1fff1572, 0x1ffefcc6, 0x0080cccc, 0x0093a599, 0x1ffeab5b,
- 0x1ffe8dbf, 0x0099edd2, 0x00acc658, 0x1ffe2d86, 0x1ffe0afc, 0x00b30e78, 0x00c5e6ad, 0x1ffd9bf6,
- 0x1ffd747c, 0x00cc2eb0, 0x00df0688, 0x1ffcf6aa, 0x1ffcca41, 0x00e54e6a, 0x00f825da, 0x1ffc3da2,
- 0x1ffc0c4b, 0x00fe6d97, 0x01114492, 0x1ffb70e0, 0x1ffb3a9a, 0x01178c27, 0x012a62a2, 0x1ffa9063,
- 0x1ffa552e, 0x0130aa0a, 0x01437ffa, 0x1ff99c2c, 0x1ff95c09, 0x0149c731, 0x015c9c8a, 0x1ff8943c,
- 0x1ff84f2b, 0x0162e38d, 0x0175b843, 0x1ff77893, 0x1ff72e94, 0x017bff0e, 0x018ed316, 0x1ff64932,
- 0x1ff5fa46, 0x019519a5, 0x01a7ecf2, 0x1ff5061b, 0x1ff4b240, 0x01ae3341, 0x01c105c9, 0x1ff3af4c,
- 0x1ff35684, 0x01c74bd5, 0x01da1d8c, 0x1ff244c8, 0x1ff1e713, 0x01e0634f, 0x01f33429, 0x1ff0c68f,
- 0x1ff063ed, 0x01f979a1, 0x020c4993, 0x1fef34a3, 0x1feecd14, 0x02128ebb, 0x02255db9, 0x1fed8f03,
- 0x1fed2287, 0x022ba28f, 0x023e708d, 0x1febd5b2, 0x1feb644a, 0x0244b50b, 0x025781fe, 0x1fea08b0,
- 0x1fe9925c, 0x025dc621, 0x027091fd, 0x1fe827fe, 0x1fe7acbe, 0x0276d5c1, 0x0289a07b, 0x1fe6339d,
- 0x1fe5b372, 0x028fe3dd, 0x02a2ad69, 0x1fe42b90, 0x1fe3a679, 0x02a8f063, 0x02bbb8b6, 0x1fe20fd6,
- 0x1fe185d5, 0x02c1fb46, 0x02d4c253, 0x1fdfe071, 0x1fdf5186, 0x02db0475, 0x02edca32, 0x1fdd9d64,
- 0x1fdd098e, 0x02f40be2, 0x0306d042, 0x1fdb46ae, 0x1fdaadee, 0x030d117c, 0x031fd474, 0x1fd8dc51,
- 0x1fd83ea8, 0x03261534, 0x0338d6b8, 0x1fd65e4f, 0x1fd5bbbd, 0x033f16fb, 0x0351d700, 0x1fd3ccaa,
- 0x1fd32530, 0x035816c1, 0x036ad53c, 0x1fd12763, 0x1fd07b00, 0x03711477, 0x0383d15c, 0x1fce6e7c,
- 0x1fcdbd31, 0x038a100e, 0x039ccb51, 0x1fcba1f5, 0x1fcaebc3, 0x03a30975, 0x03b5c30b, 0x1fc8c1d2,
- 0x1fc806b9, 0x03bc009f, 0x03ceb87c, 0x1fc5ce14, 0x1fc50e14, 0x03d4f57a, 0x03e7ab93, 0x1fc2c6bd,
- 0x1fc201d7, 0x03ede7f9, 0x04009c42, 0x1fbfabcd, 0x1fbee202, 0x0406d80b, 0x04198a78, 0x1fbc7d49,
- 0x1fbbae99, 0x041fc5a1, 0x04327628, 0x1fb93b31, 0x1fb8679c, 0x0438b0ac, 0x044b5f40, 0x1fb5e587,
- 0x1fb50d0e, 0x0451991d, 0x046445b2, 0x1fb27c4e, 0x1fb19ef1, 0x046a7ee3, 0x047d296f, 0x1faeff87,
- 0x1fae1d47, 0x048361f0, 0x04960a67, 0x1fab6f35, 0x1faa8813, 0x049c4235, 0x04aee88b, 0x1fa7cb5a,
- 0x1fa6df56, 0x04b51fa1, 0x04c7c3cb, 0x1fa413f8, 0x1fa32313, 0x04cdfa26, 0x04e09c18, 0x1fa04912,
- 0x1f9f534c, 0x04e6d1b4, 0x04f97163, 0x1f9c6aa9, 0x1f9b7003, 0x04ffa63c, 0x0512439d, 0x1f9878c1,
- 0x1f97793b, 0x051877af, 0x052b12b6, 0x1f94735b, 0x1f936ef6, 0x053145fd, 0x0543de9e, 0x1f905a7a,
- 0x1f8f5137, 0x054a1117, 0x055ca748, 0x1f8c2e21, 0x1f8b2000, 0x0562d8ee, 0x05756ca2, 0x1f87ee52,
- 0x1f86db55, 0x057b9d73, 0x058e2e9f, 0x1f839b10, 0x1f828336, 0x05945e95, 0x05a6ed2e, 0x1f7f345e,
- 0x1f7e17a8, 0x05ad1c47, 0x05bfa840, 0x1f7aba3e, 0x1f7998ad, 0x05c5d678, 0x05d85fc7, 0x1f762cb2,
- 0x1f750647, 0x05de8d19, 0x05f113b3, 0x1f718bbf, 0x1f70607a, 0x05f7401c, 0x0609c3f5, 0x1f6cd766,
- 0x1f6ba748, 0x060fef71, 0x0622707d, 0x1f680fab, 0x1f66dab5, 0x06289b08, 0x063b193c, 0x1f633490,
- 0x1f61fac3, 0x064142d3, 0x0653be23, 0x1f5e4619, 0x1f5d0775, 0x0659e6c2, 0x066c5f24, 0x1f594448,
- 0x1f5800ce, 0x067286c6, 0x0684fc2e, 0x1f542f21, 0x1f52e6d2, 0x068b22d0, 0x069d9532, 0x1f4f06a6,
- 0x1f4db983, 0x06a3bad0, 0x06b62a22, 0x1f49cadc, 0x1f4878e5, 0x06bc4eb9, 0x06cebaee, 0x1f447bc4,
- 0x1f4324fb, 0x06d4de79, 0x06e74786, 0x1f3f1963, 0x1f3dbdc8, 0x06ed6a03, 0x06ffcfdd, 0x1f39a3bc,
- 0x1f384350, 0x0705f147, 0x071853e3, 0x1f341ad2, 0x1f32b595, 0x071e7436, 0x0730d388, 0x1f2e7ea9,
- 0x1f2d149d, 0x0736f2c0, 0x07494ebd, 0x1f28cf43, 0x1f276069, 0x074f6cd7, 0x0761c574, 0x1f230ca5,
- 0x1f2198fd, 0x0767e26c, 0x077a379d, 0x1f1d36d2, 0x1f1bbe5d, 0x07805370, 0x0792a52a, 0x1f174dce,
- 0x1f15d08d, 0x0798bfd3, 0x07ab0e0a, 0x1f11519c, 0x1f0fcf91, 0x07b12786, 0x07c37230, 0x1f0b4240,
- 0x1f09bb6b, 0x07c98a7a, 0x07dbd18c, 0x1f051fbe, 0x1f03941f, 0x07e1e8a1, 0x07f42c0e, 0x1efeea19,
- 0x1efd59b3, 0x07fa41eb, 0x080c81a9, 0x1ef8a155, 0x1ef70c28, 0x0812964a, 0x0824d24d, 0x1ef24577,
- 0x1ef0ab84, 0x082ae5ad, 0x083d1dea, 0x1eebd682, 0x1eea37ca, 0x08433007, 0x08556473, 0x1ee5547a,
- 0x1ee3b0fe, 0x085b7548, 0x086da5d8, 0x1edebf64, 0x1edd1724, 0x0873b562, 0x0885e209, 0x1ed81742,
- 0x1ed66a41, 0x088bf044, 0x089e18f9, 0x1ed15c1a, 0x1ecfaa57, 0x08a425e1, 0x08b64a98, 0x1eca8def,
- 0x1ec8d76c, 0x08bc562a, 0x08ce76d8, 0x1ec3acc6, 0x1ec1f184, 0x08d4810f, 0x08e69da8, 0x1ebcb8a3,
- 0x1ebaf8a3, 0x08eca681, 0x08febefb, 0x1eb5b18a, 0x1eb3eccd, 0x0904c673, 0x0916dac2, 0x1eae977f,
- 0x1eacce07, 0x091ce0d4, 0x092ef0ed, 0x1ea76a87, 0x1ea59c55, 0x0934f596, 0x0947016e, 0x1ea02aa7,
- 0x1e9e57bb, 0x094d04aa, 0x095f0c36, 0x1e98d7e2, 0x1e97003e, 0x09650e01, 0x09771136, 0x1e91723e,
- 0x1e8f95e3, 0x097d118d, 0x098f1060, 0x1e89f9bf, 0x1e8818ad, 0x09950f3f, 0x09a709a4, 0x1e826e69,
- 0x1e8088a2, 0x09ad0707, 0x09befcf4, 0x1e7ad041, 0x1e78e5c7, 0x09c4f8d8, 0x09d6ea40, 0x1e731f4c,
- 0x1e71301f, 0x09dce4a1, 0x09eed17b, 0x1e6b5b8f, 0x1e6967b1, 0x09f4ca56, 0x0a06b296, 0x1e63850e,
- 0x1e618c80, 0x0a0ca9e6, 0x0a1e8d81, 0x1e5b9bce, 0x1e599e91, 0x0a248343, 0x0a36622e, 0x1e539fd4,
- 0x1e519dea, 0x0a3c565e, 0x0a4e308f, 0x1e4b9126, 0x1e498a8e, 0x0a542329, 0x0a65f894, 0x1e436fc7,
- 0x1e416485, 0x0a6be995, 0x0a7dba2f, 0x1e3b3bbd, 0x1e392bd1, 0x0a83a993, 0x0a957551, 0x1e32f50e,
- 0x1e30e079, 0x0a9b6315, 0x0aad29ec, 0x1e2a9bbd, 0x1e288281, 0x0ab3160c, 0x0ac4d7f1, 0x1e222fd1,
- 0x1e2011ee, 0x0acac26a, 0x0adc7f52, 0x1e19b14f, 0x1e178ec7, 0x0ae2681f, 0x0af41fff, 0x1e11203b,
- 0x1e0ef910, 0x0afa071d, 0x0b0bb9eb, 0x1e087c9b, 0x1e0650ce, 0x0b119f56, 0x0b234d07, 0x1dffc674,
- 0x1dfd9606, 0x0b2930bb, 0x0b3ad943, 0x1df6fdcc, 0x1df4c8bf, 0x0b40bb3e, 0x0b525e92, 0x1dee22a9,
- 0x1debe8fd, 0x0b583ecf, 0x0b69dce6, 0x1de5350f, 0x1de2f6c6, 0x0b6fbb62, 0x0b81542f, 0x1ddc3504,
- 0x1dd9f220, 0x0b8730e6, 0x0b98c45f, 0x1dd3228e, 0x1dd0db10, 0x0b9e9f4d, 0x0bb02d68, 0x1dc9fdb2,
- 0x1dc7b19b, 0x0bb6068a, 0x0bc78f3b, 0x1dc0c676, 0x1dbe75c8, 0x0bcd668e, 0x0bdee9ca, 0x1db77cdf,
- 0x1db5279c, 0x0be4bf4a, 0x0bf63d07, 0x1dae20f4, 0x1dabc71d, 0x0bfc10af, 0x0c0d88e2, 0x1da4b2ba,
- 0x1da25450, 0x0c135ab0, 0x0c24cd4e, 0x1d9b3237, 0x1d98cf3b, 0x0c2a9d3e, 0x0c3c0a3d, 0x1d919f70,
- 0x1d8f37e5, 0x0c41d84b, 0x0c533fa0, 0x1d87fa6d, 0x1d858e53, 0x0c590bc9, 0x0c6a6d68, 0x1d7e4332,
- 0x1d7bd28b, 0x0c7037a8, 0x0c819388, 0x1d7479c5, 0x1d720493, 0x0c875bdb, 0x0c98b1f0, 0x1d6a9e2e,
- 0x1d682472, 0x0c9e7854, 0x0cafc894, 0x1d60b070, 0x1d5e322c, 0x0cb58d04, 0x0cc6d764, 0x1d56b094,
- 0x1d542dc9, 0x0ccc99de, 0x0cddde53, 0x1d4c9e9f, 0x1d4a174f, 0x0ce39ed2, 0x0cf4dd52, 0x1d427a97,
- 0x1d3feec3, 0x0cfa9bd2, 0x0d0bd452, 0x1d384483, 0x1d35b42d, 0x0d1190d1, 0x0d22c347, 0x1d2dfc68,
- 0x1d2b6791, 0x0d287dc1, 0x0d39aa21, 0x1d23a24e, 0x1d2108f8, 0x0d3f6292, 0x0d5088d3, 0x1d19363a,
- 0x1d169867, 0x0d563f38, 0x0d675f4e, 0x1d0eb833, 0x1d0c15e4, 0x0d6d13a3, 0x0d7e2d85, 0x1d04283f,
- 0x1d018176, 0x0d83dfc6, 0x0d94f369, 0x1cf98666, 0x1cf6db24, 0x0d9aa393, 0x0dabb0ec, 0x1ceed2ad,
- 0x1cec22f4, 0x0db15efc, 0x0dc26600, 0x1ce40d1b, 0x1ce158ed, 0x0dc811f3, 0x0dd91298, 0x1cd935b7,
- 0x1cd67d15, 0x0ddebc69, 0x0defb6a5, 0x1cce4c87, 0x1ccb8f74, 0x0df55e51, 0x0e065219, 0x1cc35192,
- 0x1cc0900f, 0x0e0bf79c, 0x0e1ce4e6, 0x1cb844df, 0x1cb57eee, 0x0e22883e, 0x0e336eff, 0x1cad2675,
- 0x1caa5c17, 0x0e391027, 0x0e49f055, 0x1ca1f65b, 0x1c9f2792, 0x0e4f8f4b, 0x0e6068db, 0x1c96b497,
- 0x1c93e165, 0x0e66059a, 0x0e76d883, 0x1c8b6131, 0x1c888997, 0x0e7c7308, 0x0e8d3f3e, 0x1c7ffc2f,
- 0x1c7d202f, 0x0e92d787, 0x0ea39d00, 0x1c748599, 0x1c71a535, 0x0ea93308, 0x0eb9f1ba, 0x1c68fd75,
- 0x1c6618ae, 0x0ebf857d, 0x0ed03d5e, 0x1c5d63ca, 0x1c5a7aa4, 0x0ed5ceda, 0x0ee67fdf, 0x1c51b8a1,
- 0x1c4ecb1c, 0x0eec0f10, 0x0efcb92f, 0x1c45fc00, 0x1c430a1d, 0x0f024612, 0x0f12e941, 0x1c3a2ded,
- 0x1c3737b0, 0x0f1873d2, 0x0f291006, 0x1c2e4e72, 0x1c2b53db, 0x0f2e9842, 0x0f3f2d71, 0x1c225d94,
- 0x1c1f5ea6, 0x0f44b354, 0x0f554175, 0x1c165b5b, 0x1c135818, 0x0f5ac4fc, 0x0f6b4c03, 0x1c0a47cf,
- 0x1c074038, 0x0f70cd2a, 0x0f814d0e, 0x1bfe22f8, 0x1bfb170f, 0x0f86cbd3, 0x0f974489, 0x1bf1ecdb,
- 0x1beedca2, 0x0f9cc0e7, 0x0fad3265, 0x1be5a582, 0x1be290fb, 0x0fb2ac5a, 0x0fc31697, 0x1bd94cf4,
- 0x1bd63421, 0x0fc88e1e, 0x0fd8f10f, 0x1bcce337, 0x1bc9c61a, 0x0fde6626, 0x0feec1c0, 0x1bc06855,
- 0x1bbd46f0, 0x0ff43464, 0x1004889e, 0x1bb3dc55, 0x1bb0b6a9, 0x1009f8cb, 0x101a459a, 0x1ba73f3d,
- 0x1ba4154d, 0x101fb34d, 0x102ff8a8, 0x1b9a9117, 0x1b9762e4, 0x103563dc, 0x1045a1b9, 0x1b8dd1ea,
- 0x1b8a9f77, 0x104b0a6c, 0x105b40c1, 0x1b8101be, 0x1b7dcb0c, 0x1060a6ef, 0x1070d5b1, 0x1b74209b,
- 0x1b70e5ac, 0x10763958, 0x1086607e, 0x1b672e88, 0x1b63ef5f, 0x108bc19a, 0x109be119, 0x1b5a2b8e,
- 0x1b56e82c, 0x10a13fa6, 0x10b15775, 0x1b4d17b4, 0x1b49d01c, 0x10b6b371, 0x10c6c385, 0x1b3ff304,
- 0x1b3ca737, 0x10cc1cec, 0x10dc253c, 0x1b32bd84, 0x1b2f6d85, 0x10e17c0b, 0x10f17c8d, 0x1b25773d,
- 0x1b22230e, 0x10f6d0c0, 0x1106c96a, 0x1b182038, 0x1b14c7da, 0x110c1afe, 0x111c0bc6, 0x1b0ab87c,
- 0x1b075bf1, 0x11215ab8, 0x11314395, 0x1afd4012, 0x1af9df5d, 0x11368fe1, 0x114670c8, 0x1aefb702,
- 0x1aec5225, 0x114bba6b, 0x115b9354, 0x1ae21d54, 0x1adeb451, 0x1160da4b, 0x1170ab2a, 0x1ad47311,
- 0x1ad105e9, 0x1175ef72, 0x1185b83f, 0x1ac6b841, 0x1ac346f8, 0x118af9d4, 0x119aba84, 0x1ab8ecec,
- 0x1ab57784, 0x119ff964, 0x11afb1ee, 0x1aab111c, 0x1aa79796, 0x11b4ee14, 0x11c49e6f, 0x1a9d24d9,
- 0x1a99a737, 0x11c9d7d9, 0x11d97ff9, 0x1a8f282b, 0x1a8ba670, 0x11deb6a4, 0x11ee5682, 0x1a811b1b,
- 0x1a7d9549, 0x11f38a6a, 0x120321fa, 0x1a72fdb2, 0x1a6f73ca, 0x1208531c, 0x1217e256, 0x1a64cff8,
- 0x1a6141fd, 0x121d10af, 0x122c9789, 0x1a5691f5, 0x1a52ffeb, 0x1231c316, 0x12414186, 0x1a4843b4,
- 0x1a44ad9b, 0x12466a44, 0x1255e041, 0x1a39e53d, 0x1a364b17, 0x125b062b, 0x126a73ac, 0x1a2b7698,
- 0x1a27d868, 0x126f96c1, 0x127efbbb, 0x1a1cf7ce, 0x1a195597, 0x12841bf6, 0x12937861, 0x1a0e68e9,
- 0x1a0ac2ac, 0x129895c0, 0x12a7e991, 0x19ffc9f1, 0x19fc1fb1, 0x12ad0412, 0x12bc4f40, 0x19f11af0,
- 0x19ed6caf, 0x12c166de, 0x12d0a960, 0x19e25bee, 0x19dea9ae, 0x12d5be18, 0x12e4f7e5, 0x19d38cf4,
- 0x19cfd6b8, 0x12ea09b4, 0x12f93ac2, 0x19c4ae0c, 0x19c0f3d6, 0x12fe49a6, 0x130d71eb, 0x19b5bf3f,
- 0x19b20111, 0x13127de0, 0x13219d53, 0x19a6c096, 0x19a2fe73, 0x1326a656, 0x1335bcef, 0x1997b21b,
- 0x1993ec04, 0x133ac2fc, 0x1349d0b0, 0x198893d6, 0x1984c9ce, 0x134ed3c5, 0x135dd88c, 0x197965d0,
- 0x197597da, 0x1362d8a6, 0x1371d476, 0x196a2815, 0x19665632, 0x1376d191, 0x1385c461, 0x195adaab,
- 0x195704df, 0x138abe7b, 0x1399a841, 0x194b7d9e, 0x1947a3eb, 0x139e9f56, 0x13ad800a, 0x193c10f7,
- 0x1938335e, 0x13b27417, 0x13c14bb0, 0x192c94bf, 0x1928b343, 0x13c63cb2, 0x13d50b26, 0x191d08ff,
- 0x191923a3, 0x13d9f91b, 0x13e8be60, 0x190d6dc1, 0x19098488, 0x13eda944, 0x13fc6553, 0x18fdc310,
- 0x18f9d5fa, 0x14014d23, 0x140ffff1, 0x18ee08f4, 0x18ea1805, 0x1414e4aa, 0x14238e2f, 0x18de3f77,
- 0x18da4ab2, 0x14286fce, 0x14371001, 0x18ce66a3, 0x18ca6e0a, 0x143bee83, 0x144a855b, 0x18be7e82,
- 0x18ba8217, 0x144f60bd, 0x145dee30, 0x18ae871e, 0x18aa86e3, 0x1462c670, 0x14714a76, 0x189e8080,
- 0x189a7c78, 0x14761f8f, 0x14849a1f, 0x188e6ab2, 0x188a62e0, 0x14896c0f, 0x1497dd20, 0x187e45be,
- 0x187a3a25, 0x149cabe4, 0x14ab136d, 0x186e11af, 0x186a0250, 0x14afdf03, 0x14be3cfa, 0x185dce8e,
- 0x1859bb6c, 0x14c3055e, 0x14d159bc, 0x184d7c65, 0x18496583, 0x14d61eeb, 0x14e469a6, 0x183d1b3e,
- 0x1839009e, 0x14e92b9e, 0x14f76cad, 0x182cab24, 0x18288cc8, 0x14fc2b6a, 0x150a62c6, 0x181c2c20,
- 0x18180a0c, 0x150f1e45, 0x151d4be3, 0x180b9e3d, 0x18077873, 0x15220422, 0x153027fb, 0x17fb0185,
- 0x17f6d807, 0x1534dcf6, 0x1542f700, 0x17ea5602, 0x17e628d3, 0x1547a8b5, 0x1555b8e8, 0x17d99bbe,
- 0x17d56ae0, 0x155a6754, 0x15686da7, 0x17c8d2c4, 0x17c49e3b, 0x156d18c7, 0x157b1532, 0x17b7fb1f,
- 0x17b3c2ec, 0x157fbd03, 0x158daf7c, 0x17a714d7, 0x17a2d8fe, 0x159253fb, 0x15a03c7a, 0x17961ff9,
- 0x1791e07b, 0x15a4dda5, 0x15b2bc22, 0x17851c8e, 0x1780d96f, 0x15b759f5, 0x15c52e67, 0x17740aa1,
- 0x176fc3e3, 0x15c9c8e0, 0x15d7933f, 0x1762ea3d, 0x175e9fe2, 0x15dc2a5a, 0x15e9ea9d, 0x1751bb6b,
- 0x174d6d77, 0x15ee7e58, 0x15fc3477, 0x17407e37, 0x173c2cac, 0x1600c4cf, 0x160e70c1, 0x172f32ab,
- 0x172add8c, 0x1612fdb3, 0x16209f70, 0x171dd8d2, 0x17198021, 0x162528fa, 0x1632c078, 0x170c70b7,
- 0x17081477, 0x16374697, 0x1644d3d0, 0x16fafa64, 0x16f69a97, 0x16495680, 0x1656d96a, 0x16e975e4,
- 0x16e5128e, 0x165b58aa, 0x1668d13e, 0x16d7e341, 0x16d37c65, 0x166d4d0a, 0x167abb3e, 0x16c64288,
- 0x16c1d827, 0x167f3394, 0x168c9760, 0x16b493c2, 0x16b025e0, 0x16910c3d, 0x169e659a, 0x16a2d6fb
-};
-
-const int twidTab512[8*6 + 32*6 + 128*6] = {
- 0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf,
- 0x20000000, 0x00000000, 0x1f6297d0, 0x063e2e0f, 0x1d906bcf, 0x0c3ef153, 0x1a9b6629, 0x11c73b3a,
- 0x20000000, 0x00000000, 0x1a9b6629, 0x11c73b3a, 0x0c3ef153, 0x1d906bcf, 0xf9c1d1f1, 0x1f6297d0,
- 0x00000000, 0x20000000, 0xf3c10ead, 0x1d906bcf, 0xe95f619a, 0x16a09e66, 0xe26f9431, 0x0c3ef153,
- 0x16a09e66, 0x16a09e66, 0x11c73b3a, 0x1a9b6629, 0x0c3ef153, 0x1d906bcf, 0x063e2e0f, 0x1f6297d0,
- 0xe95f619a, 0x16a09e66, 0xe09d6830, 0x063e2e0f, 0xe26f9431, 0xf3c10ead, 0xee38c4c6, 0xe56499d7,
-
- 0x20000000, 0x00000000, 0x1fd88da4, 0x0322f4d8, 0x1f6297d0, 0x063e2e0f, 0x1e9f4157, 0x094a0317,
- 0x20000000, 0x00000000, 0x1ff621e3, 0x0191f65f, 0x1fd88da4, 0x0322f4d8, 0x1fa7557f, 0x04b2041c,
- 0x20000000, 0x00000000, 0x1fa7557f, 0x04b2041c, 0x1e9f4157, 0x094a0317, 0x1ced7af4, 0x0dae8805,
- 0x1d906bcf, 0x0c3ef153, 0x1c38b2f2, 0x0f15ae9c, 0x1a9b6629, 0x11c73b3a, 0x18bc806b, 0x144cf325,
- 0x1f6297d0, 0x063e2e0f, 0x1f0a7efc, 0x07c67e5f, 0x1e9f4157, 0x094a0317, 0x1e212105, 0x0ac7cd3b,
- 0x1a9b6629, 0x11c73b3a, 0x17b5df22, 0x157d6935, 0x144cf325, 0x18bc806b, 0x10738799, 0x1b728345,
- 0x16a09e66, 0x16a09e66, 0x144cf325, 0x18bc806b, 0x11c73b3a, 0x1a9b6629, 0x0f15ae9c, 0x1c38b2f2,
- 0x1d906bcf, 0x0c3ef153, 0x1ced7af4, 0x0dae8805, 0x1c38b2f2, 0x0f15ae9c, 0x1b728345, 0x10738799,
- 0x0c3ef153, 0x1d906bcf, 0x07c67e5f, 0x1f0a7efc, 0x0322f4d8, 0x1fd88da4, 0xfe6e09a1, 0x1ff621e3,
- 0x0c3ef153, 0x1d906bcf, 0x094a0317, 0x1e9f4157, 0x063e2e0f, 0x1f6297d0, 0x0322f4d8, 0x1fd88da4,
- 0x1a9b6629, 0x11c73b3a, 0x19b3e048, 0x130ff7fd, 0x18bc806b, 0x144cf325, 0x17b5df22, 0x157d6935,
- 0xf9c1d1f1, 0x1f6297d0, 0xf53832c5, 0x1e212105, 0xf0ea5164, 0x1c38b2f2, 0xecf00803, 0x19b3e048,
- 0x00000000, 0x20000000, 0xfcdd0b28, 0x1fd88da4, 0xf9c1d1f1, 0x1f6297d0, 0xf6b5fce9, 0x1e9f4157,
- 0x16a09e66, 0x16a09e66, 0x157d6935, 0x17b5df22, 0x144cf325, 0x18bc806b, 0x130ff7fd, 0x19b3e048,
- 0xe95f619a, 0x16a09e66, 0xe64c1fb8, 0x130ff7fd, 0xe3c74d0e, 0x0f15ae9c, 0xe1dedefb, 0x0ac7cd3b,
- 0xf3c10ead, 0x1d906bcf, 0xf0ea5164, 0x1c38b2f2, 0xee38c4c6, 0x1a9b6629, 0xebb30cdb, 0x18bc806b,
- 0x11c73b3a, 0x1a9b6629, 0x10738799, 0x1b728345, 0x0f15ae9c, 0x1c38b2f2, 0x0dae8805, 0x1ced7af4,
- 0xe09d6830, 0x063e2e0f, 0xe009de1d, 0x0191f65f, 0xe027725c, 0xfcdd0b28, 0xe0f58104, 0xf83981a1,
- 0xe95f619a, 0x16a09e66, 0xe7437f95, 0x144cf325, 0xe56499d7, 0x11c73b3a, 0xe3c74d0e, 0x0f15ae9c,
- 0x0c3ef153, 0x1d906bcf, 0x0ac7cd3b, 0x1e212105, 0x094a0317, 0x1e9f4157, 0x07c67e5f, 0x1f0a7efc,
- 0xe26f9431, 0xf3c10ead, 0xe48d7cbb, 0xef8c7867, 0xe7437f95, 0xebb30cdb, 0xea8296cb, 0xe84a20de,
- 0xe26f9431, 0x0c3ef153, 0xe160bea9, 0x094a0317, 0xe09d6830, 0x063e2e0f, 0xe027725c, 0x0322f4d8,
- 0x063e2e0f, 0x1f6297d0, 0x04b2041c, 0x1fa7557f, 0x0322f4d8, 0x1fd88da4, 0x0191f65f, 0x1ff621e3,
- 0xee38c4c6, 0xe56499d7, 0xf25177fb, 0xe312850c, 0xf6b5fce9, 0xe160bea9, 0xfb4dfbe4, 0xe058aa81,
-
- 0x20000000, 0x00000000, 0x1ffd8861, 0x00c90ab0, 0x1ff621e3, 0x0191f65f, 0x1fe9cdad, 0x025aa412,
- 0x20000000, 0x00000000, 0x1fff6217, 0x00648748, 0x1ffd8861, 0x00c90ab0, 0x1ffa72f0, 0x012d8657,
- 0x20000000, 0x00000000, 0x1ffa72f0, 0x012d8657, 0x1fe9cdad, 0x025aa412, 0x1fce15fd, 0x0386f0b9,
- 0x1fd88da4, 0x0322f4d8, 0x1fc26471, 0x03eac9cb, 0x1fa7557f, 0x04b2041c, 0x1f8764fa, 0x05788511,
- 0x1ff621e3, 0x0191f65f, 0x1ff09566, 0x01f656e8, 0x1fe9cdad, 0x025aa412, 0x1fe1cafd, 0x02beda01,
- 0x1fa7557f, 0x04b2041c, 0x1f7599a4, 0x05db7678, 0x1f38f3ac, 0x0702e09b, 0x1ef178a4, 0x0827dc07,
- 0x1f6297d0, 0x063e2e0f, 0x1f38f3ac, 0x0702e09b, 0x1f0a7efc, 0x07c67e5f, 0x1ed740e7, 0x0888e931,
- 0x1fd88da4, 0x0322f4d8, 0x1fce15fd, 0x0386f0b9, 0x1fc26471, 0x03eac9cb, 0x1fb57972, 0x044e7c34,
- 0x1e9f4157, 0x094a0317, 0x1e426a4b, 0x0a68f121, 0x1ddb13b7, 0x0b844298, 0x1d696174, 0x0c9b9532,
- 0x1e9f4157, 0x094a0317, 0x1e6288ec, 0x0a09ae4a, 0x1e212105, 0x0ac7cd3b, 0x1ddb13b7, 0x0b844298,
- 0x1fa7557f, 0x04b2041c, 0x1f97f925, 0x05155dac, 0x1f8764fa, 0x05788511, 0x1f7599a4, 0x05db7678,
- 0x1ced7af4, 0x0dae8805, 0x1c678b35, 0x0ebcbbae, 0x1bd7c0ac, 0x0fc5d26e, 0x1b3e4d3f, 0x10c9704d,
- 0x1d906bcf, 0x0c3ef153, 0x1d4134d1, 0x0cf7bca2, 0x1ced7af4, 0x0dae8805, 0x1c954b21, 0x0e63374d,
- 0x1f6297d0, 0x063e2e0f, 0x1f4e603b, 0x06a0a809, 0x1f38f3ac, 0x0702e09b, 0x1f2252f7, 0x0764d3f9,
- 0x1a9b6629, 0x11c73b3a, 0x19ef43ef, 0x12bedb26, 0x193a224a, 0x13affa29, 0x187c4010, 0x149a449c,
- 0x1c38b2f2, 0x0f15ae9c, 0x1bd7c0ac, 0x0fc5d26e, 0x1b728345, 0x10738799, 0x1b090a58, 0x111eb354,
- 0x1f0a7efc, 0x07c67e5f, 0x1ef178a4, 0x0827dc07, 0x1ed740e7, 0x0888e931, 0x1ebbd8c9, 0x08e9a220,
- 0x17b5df22, 0x157d6935, 0x16e74455, 0x16591926, 0x1610b755, 0x172d0838, 0x15328293, 0x17f8ece3,
- 0x1a9b6629, 0x11c73b3a, 0x1a29a7a0, 0x126d054d, 0x19b3e048, 0x130ff7fd, 0x193a224a, 0x13affa29,
- 0x1e9f4157, 0x094a0317, 0x1e817bab, 0x09aa0861, 0x1e6288ec, 0x0a09ae4a, 0x1e426a4b, 0x0a68f121,
- 0x144cf325, 0x18bc806b, 0x136058b1, 0x19777ef5, 0x126d054d, 0x1a29a7a0, 0x11734d64, 0x1ad2bc9e,
- 0x18bc806b, 0x144cf325, 0x183b0e0c, 0x14e6cabc, 0x17b5df22, 0x157d6935, 0x172d0838, 0x1610b755,
- 0x1e212105, 0x0ac7cd3b, 0x1dfeae62, 0x0b263eef, 0x1ddb13b7, 0x0b844298, 0x1db65262, 0x0be1d499,
- 0x10738799, 0x1b728345, 0x0f6e0ca9, 0x1c08c426, 0x0e63374d, 0x1c954b21, 0x0d536416, 0x1d17e774,
- 0x16a09e66, 0x16a09e66, 0x1610b755, 0x172d0838, 0x157d6935, 0x17b5df22, 0x14e6cabc, 0x183b0e0c,
- 0x1d906bcf, 0x0c3ef153, 0x1d696174, 0x0c9b9532, 0x1d4134d1, 0x0cf7bca2, 0x1d17e774, 0x0d536416,
- 0x0c3ef153, 0x1d906bcf, 0x0b263eef, 0x1dfeae62, 0x0a09ae4a, 0x1e6288ec, 0x08e9a220, 0x1ebbd8c9,
- 0x144cf325, 0x18bc806b, 0x13affa29, 0x193a224a, 0x130ff7fd, 0x19b3e048, 0x126d054d, 0x1a29a7a0,
- 0x1ced7af4, 0x0dae8805, 0x1cc1f0f4, 0x0e0924ec, 0x1c954b21, 0x0e63374d, 0x1c678b35, 0x0ebcbbae,
- 0x07c67e5f, 0x1f0a7efc, 0x06a0a809, 0x1f4e603b, 0x05788511, 0x1f8764fa, 0x044e7c34, 0x1fb57972,
- 0x11c73b3a, 0x1a9b6629, 0x111eb354, 0x1b090a58, 0x10738799, 0x1b728345, 0x0fc5d26e, 0x1bd7c0ac,
- 0x1c38b2f2, 0x0f15ae9c, 0x1c08c426, 0x0f6e0ca9, 0x1bd7c0ac, 0x0fc5d26e, 0x1ba5aa67, 0x101cfc87,
- 0x0322f4d8, 0x1fd88da4, 0x01f656e8, 0x1ff09566, 0x00c90ab0, 0x1ffd8861, 0xff9b78b8, 0x1fff6217,
- 0x0f15ae9c, 0x1c38b2f2, 0x0e63374d, 0x1c954b21, 0x0dae8805, 0x1ced7af4, 0x0cf7bca2, 0x1d4134d1,
- 0x1b728345, 0x10738799, 0x1b3e4d3f, 0x10c9704d, 0x1b090a58, 0x111eb354, 0x1ad2bc9e, 0x11734d64,
- 0xfe6e09a1, 0x1ff621e3, 0xfd4125ff, 0x1fe1cafd, 0xfc153635, 0x1fc26471, 0xfaeaa254, 0x1f97f925,
- 0x0c3ef153, 0x1d906bcf, 0x0b844298, 0x1ddb13b7, 0x0ac7cd3b, 0x1e212105, 0x0a09ae4a, 0x1e6288ec,
- 0x1a9b6629, 0x11c73b3a, 0x1a63091b, 0x121a7999, 0x1a29a7a0, 0x126d054d, 0x19ef43ef, 0x12bedb26,
- 0xf9c1d1f1, 0x1f6297d0, 0xf89b2c07, 0x1f2252f7, 0xf77716cf, 0x1ed740e7, 0xf655f79f, 0x1e817bab,
- 0x094a0317, 0x1e9f4157, 0x0888e931, 0x1ed740e7, 0x07c67e5f, 0x1f0a7efc, 0x0702e09b, 0x1f38f3ac,
- 0x19b3e048, 0x130ff7fd, 0x19777ef5, 0x136058b1, 0x193a224a, 0x13affa29, 0x18fbcca4, 0x13fed953,
- 0xf53832c5, 0x1e212105, 0xf41e2b67, 0x1db65262, 0xf308435e, 0x1d4134d1, 0xf1f6db14, 0x1cc1f0f4,
- 0x063e2e0f, 0x1f6297d0, 0x05788511, 0x1f8764fa, 0x04b2041c, 0x1fa7557f, 0x03eac9cb, 0x1fc26471,
- 0x18bc806b, 0x144cf325, 0x187c4010, 0x149a449c, 0x183b0e0c, 0x14e6cabc, 0x17f8ece3, 0x15328293,
- 0xf0ea5164, 0x1c38b2f2, 0xefe30379, 0x1ba5aa67, 0xeee14cac, 0x1b090a58, 0xede58667, 0x1a63091b,
- 0x0322f4d8, 0x1fd88da4, 0x025aa412, 0x1fe9cdad, 0x0191f65f, 0x1ff621e3, 0x00c90ab0, 0x1ffd8861,
- 0x17b5df22, 0x157d6935, 0x1771e75f, 0x15c77bbe, 0x172d0838, 0x1610b755, 0x16e74455, 0x16591926,
- 0xecf00803, 0x19b3e048, 0xec0126ad, 0x18fbcca4, 0xeb193544, 0x183b0e0c, 0xea388442, 0x1771e75f,
- 0x00000000, 0x20000000, 0xff36f550, 0x1ffd8861, 0xfe6e09a1, 0x1ff621e3, 0xfda55bee, 0x1fe9cdad,
- 0x16a09e66, 0x16a09e66, 0x16591926, 0x16e74455, 0x1610b755, 0x172d0838, 0x15c77bbe, 0x1771e75f,
- 0xe95f619a, 0x16a09e66, 0xe88e18a1, 0x15c77bbe, 0xe7c4f1f4, 0x14e6cabc, 0xe704335c, 0x13fed953,
- 0xfcdd0b28, 0x1fd88da4, 0xfc153635, 0x1fc26471, 0xfb4dfbe4, 0x1fa7557f, 0xfa877aef, 0x1f8764fa,
- 0x157d6935, 0x17b5df22, 0x15328293, 0x17f8ece3, 0x14e6cabc, 0x183b0e0c, 0x149a449c, 0x187c4010,
- 0xe64c1fb8, 0x130ff7fd, 0xe59cf6e5, 0x121a7999, 0xe4f6f5a8, 0x111eb354, 0xe45a5599, 0x101cfc87,
- 0xf9c1d1f1, 0x1f6297d0, 0xf8fd1f65, 0x1f38f3ac, 0xf83981a1, 0x1f0a7efc, 0xf77716cf, 0x1ed740e7,
- 0x144cf325, 0x18bc806b, 0x13fed953, 0x18fbcca4, 0x13affa29, 0x193a224a, 0x136058b1, 0x19777ef5,
- 0xe3c74d0e, 0x0f15ae9c, 0xe33e0f0c, 0x0e0924ec, 0xe2becb2f, 0x0cf7bca2, 0xe249ad9e, 0x0be1d499,
- 0xf6b5fce9, 0x1e9f4157, 0xf5f651b6, 0x1e6288ec, 0xf53832c5, 0x1e212105, 0xf47bbd68, 0x1ddb13b7,
- 0x130ff7fd, 0x19b3e048, 0x12bedb26, 0x19ef43ef, 0x126d054d, 0x1a29a7a0, 0x121a7999, 0x1a63091b,
- 0xe1dedefb, 0x0ac7cd3b, 0xe17e8455, 0x09aa0861, 0xe128bf19, 0x0888e931, 0xe0ddad09, 0x0764d3f9,
- 0xf3c10ead, 0x1d906bcf, 0xf308435e, 0x1d4134d1, 0xf25177fb, 0x1ced7af4, 0xf19cc8b3, 0x1c954b21,
- 0x11c73b3a, 0x1a9b6629, 0x11734d64, 0x1ad2bc9e, 0x111eb354, 0x1b090a58, 0x10c9704d, 0x1b3e4d3f,
- 0xe09d6830, 0x063e2e0f, 0xe06806db, 0x05155dac, 0xe03d9b8f, 0x03eac9cb, 0xe01e3503, 0x02beda01,
- 0xf0ea5164, 0x1c38b2f2, 0xf03a2d92, 0x1bd7c0ac, 0xef8c7867, 0x1b728345, 0xeee14cac, 0x1b090a58,
- 0x10738799, 0x1b728345, 0x101cfc87, 0x1ba5aa67, 0x0fc5d26e, 0x1bd7c0ac, 0x0f6e0ca9, 0x1c08c426,
- 0xe009de1d, 0x0191f65f, 0xe0009de9, 0x00648748, 0xe002779f, 0xff36f550, 0xe00f6a9a, 0xfe09a918,
- 0xee38c4c6, 0x1a9b6629, 0xed92fab3, 0x1a29a7a0, 0xecf00803, 0x19b3e048, 0xec5005d7, 0x193a224a,
- 0x0f15ae9c, 0x1c38b2f2, 0x0ebcbbae, 0x1c678b35, 0x0e63374d, 0x1c954b21, 0x0e0924ec, 0x1cc1f0f4,
- 0xe027725c, 0xfcdd0b28, 0xe04a868e, 0xfbb183cc, 0xe0789b06, 0xfa877aef, 0xe0b19fc5, 0xf95f57f7,
- 0xebb30cdb, 0x18bc806b, 0xeb193544, 0x183b0e0c, 0xea8296cb, 0x17b5df22, 0xe9ef48ab, 0x172d0838,
- 0x0dae8805, 0x1ced7af4, 0x0d536416, 0x1d17e774, 0x0cf7bca2, 0x1d4134d1, 0x0c9b9532, 0x1d696174,
- 0xe0f58104, 0xf83981a1, 0xe1442737, 0xf7165de0, 0xe19d7714, 0xf5f651b6, 0xe201519e, 0xf4d9c111,
- 0xe95f619a, 0x16a09e66, 0xe8d2f7c8, 0x1610b755, 0xe84a20de, 0x157d6935, 0xe7c4f1f4, 0x14e6cabc,
- 0x0c3ef153, 0x1d906bcf, 0x0be1d499, 0x1db65262, 0x0b844298, 0x1ddb13b7, 0x0b263eef, 0x1dfeae62,
- 0xe26f9431, 0xf3c10ead, 0xe2e8188c, 0xf2ac9bea, 0xe36ab4df, 0xf19cc8b3, 0xe3f73bda, 0xf091f357,
- 0xe7437f95, 0x144cf325, 0xe6c5ddb6, 0x13affa29, 0xe64c1fb8, 0x130ff7fd, 0xe5d65860, 0x126d054d,
- 0x0ac7cd3b, 0x1e212105, 0x0a68f121, 0x1e426a4b, 0x0a09ae4a, 0x1e6288ec, 0x09aa0861, 0x1e817bab,
- 0xe48d7cbb, 0xef8c7867, 0xe52d4362, 0xee8cb29c, 0xe5d65860, 0xed92fab3, 0xe688810b, 0xec9fa74f,
- 0xe56499d7, 0x11c73b3a, 0xe4f6f5a8, 0x111eb354, 0xe48d7cbb, 0x10738799, 0xe4283f54, 0x0fc5d26e,
- 0x094a0317, 0x1e9f4157, 0x08e9a220, 0x1ebbd8c9, 0x0888e931, 0x1ed740e7, 0x0827dc07, 0x1ef178a4,
- 0xe7437f95, 0xebb30cdb, 0xe807131d, 0xeacd7d6d, 0xe8d2f7c8, 0xe9ef48ab, 0xe9a6e6da, 0xe918bbab,
- 0xe3c74d0e, 0x0f15ae9c, 0xe36ab4df, 0x0e63374d, 0xe312850c, 0x0dae8805, 0xe2becb2f, 0x0cf7bca2,
- 0x07c67e5f, 0x1f0a7efc, 0x0764d3f9, 0x1f2252f7, 0x0702e09b, 0x1f38f3ac, 0x06a0a809, 0x1f4e603b,
- 0xea8296cb, 0xe84a20de, 0xeb65bb64, 0xe783bff0, 0xec5005d7, 0xe6c5ddb6, 0xed4124da, 0xe610bc11,
- 0xe26f9431, 0x0c3ef153, 0xe224ec49, 0x0b844298, 0xe1dedefb, 0x0ac7cd3b, 0xe19d7714, 0x0a09ae4a,
- 0x063e2e0f, 0x1f6297d0, 0x05db7678, 0x1f7599a4, 0x05788511, 0x1f8764fa, 0x05155dac, 0x1f97f925,
- 0xee38c4c6, 0xe56499d7, 0xef368fb3, 0xe4c1b2c1, 0xf03a2d92, 0xe4283f54, 0xf1434452, 0xe39874cb,
- 0xe160bea9, 0x094a0317, 0xe128bf19, 0x0888e931, 0xe0f58104, 0x07c67e5f, 0xe0c70c54, 0x0702e09b,
- 0x04b2041c, 0x1fa7557f, 0x044e7c34, 0x1fb57972, 0x03eac9cb, 0x1fc26471, 0x0386f0b9, 0x1fce15fd,
- 0xf25177fb, 0xe312850c, 0xf3646ace, 0xe2969e8c, 0xf47bbd68, 0xe224ec49, 0xf5970edf, 0xe1bd95b5,
- 0xe09d6830, 0x063e2e0f, 0xe0789b06, 0x05788511, 0xe058aa81, 0x04b2041c, 0xe03d9b8f, 0x03eac9cb,
- 0x0322f4d8, 0x1fd88da4, 0x02beda01, 0x1fe1cafd, 0x025aa412, 0x1fe9cdad, 0x01f656e8, 0x1ff09566,
- 0xf6b5fce9, 0xe160bea9, 0xf7d823f9, 0xe10e875c, 0xf8fd1f65, 0xe0c70c54, 0xfa248988, 0xe08a665c,
- 0xe027725c, 0x0322f4d8, 0xe0163253, 0x025aa412, 0xe009de1d, 0x0191f65f, 0xe002779f, 0x00c90ab0,
- 0x0191f65f, 0x1ff621e3, 0x012d8657, 0x1ffa72f0, 0x00c90ab0, 0x1ffd8861, 0x00648748, 0x1fff6217,
- 0xfb4dfbe4, 0xe058aa81, 0xfc790f47, 0xe031ea03, 0xfda55bee, 0xe0163253, 0xfed279a9, 0xe0058d10
-};
-
-const int twidTab64[4*6 + 16*6] = {
- 0x20000000, 0x00000000, 0x16a09e66, 0x16a09e66, 0x00000000, 0x20000000, 0xe95f619a, 0x16a09e66,
- 0x20000000, 0x00000000, 0x1d906bcf, 0x0c3ef153, 0x16a09e66, 0x16a09e66, 0x0c3ef153, 0x1d906bcf,
- 0x20000000, 0x00000000, 0x0c3ef153, 0x1d906bcf, 0xe95f619a, 0x16a09e66, 0xe26f9431, 0xf3c10ead,
-
- 0x20000000, 0x00000000, 0x1f6297d0, 0x063e2e0f, 0x1d906bcf, 0x0c3ef153, 0x1a9b6629, 0x11c73b3a,
- 0x20000000, 0x00000000, 0x1fd88da4, 0x0322f4d8, 0x1f6297d0, 0x063e2e0f, 0x1e9f4157, 0x094a0317,
- 0x20000000, 0x00000000, 0x1e9f4157, 0x094a0317, 0x1a9b6629, 0x11c73b3a, 0x144cf325, 0x18bc806b,
- 0x16a09e66, 0x16a09e66, 0x11c73b3a, 0x1a9b6629, 0x0c3ef153, 0x1d906bcf, 0x063e2e0f, 0x1f6297d0,
- 0x1d906bcf, 0x0c3ef153, 0x1c38b2f2, 0x0f15ae9c, 0x1a9b6629, 0x11c73b3a, 0x18bc806b, 0x144cf325,
- 0x0c3ef153, 0x1d906bcf, 0x0322f4d8, 0x1fd88da4, 0xf9c1d1f1, 0x1f6297d0, 0xf0ea5164, 0x1c38b2f2,
- 0x00000000, 0x20000000, 0xf9c1d1f1, 0x1f6297d0, 0xf3c10ead, 0x1d906bcf, 0xee38c4c6, 0x1a9b6629,
- 0x16a09e66, 0x16a09e66, 0x144cf325, 0x18bc806b, 0x11c73b3a, 0x1a9b6629, 0x0f15ae9c, 0x1c38b2f2,
- 0xe95f619a, 0x16a09e66, 0xe3c74d0e, 0x0f15ae9c, 0xe09d6830, 0x063e2e0f, 0xe027725c, 0xfcdd0b28,
- 0xe95f619a, 0x16a09e66, 0xe56499d7, 0x11c73b3a, 0xe26f9431, 0x0c3ef153, 0xe09d6830, 0x063e2e0f,
- 0x0c3ef153, 0x1d906bcf, 0x094a0317, 0x1e9f4157, 0x063e2e0f, 0x1f6297d0, 0x0322f4d8, 0x1fd88da4,
- 0xe26f9431, 0xf3c10ead, 0xe7437f95, 0xebb30cdb, 0xee38c4c6, 0xe56499d7, 0xf6b5fce9, 0xe160bea9
-};
-
-#else
-
-/*
- * Q30 for 128 and 1024
- *
- * for (i = 0; i < num/4; i++) {
- * angle = (i + 0.125) * M_PI / num;
- * x = cos(angle) * (1 << 30);
- * x = sin(angle) * (1 << 30);
- *
- * angle = (num/2 - 1 - i + 0.125) * M_PI / num;
- * x = cos(angle) * (1 << 30);
- * x = sin(angle) * (1 << 30);
- * }
- */
-const int cossintab[128 + 1024] = {
- /* 128 */
- 0x3fffec43, 0x003243f1, 0x015fd4d2, 0x3ffc38d1, 0x3ff9c13a, 0x01c454f5, 0x02f1b755, 0x3feea776,
- 0x3fe9b8a9, 0x03562038, 0x0483259d, 0x3fd73a4a, 0x3fcfd50b, 0x04e767c5, 0x0613e1c5, 0x3fb5f4ea,
- 0x3fac1a5b, 0x0677edbb, 0x07a3adff, 0x3f8adc77, 0x3f7e8e1e, 0x08077457, 0x09324ca7, 0x3f55f796,
- 0x3f473759, 0x0995bdfd, 0x0abf8043, 0x3f174e70, 0x3f061e95, 0x0b228d42, 0x0c4b0b94, 0x3eceeaad,
- 0x3ebb4ddb, 0x0cada4f5, 0x0dd4b19a, 0x3e7cd778, 0x3e66d0b4, 0x0e36c82a, 0x0f5c35a3, 0x3e212179,
- 0x3e08b42a, 0x0fbdba40, 0x10e15b4e, 0x3dbbd6d4, 0x3da106bd, 0x11423ef0, 0x1263e699, 0x3d4d0728,
- 0x3d2fd86c, 0x12c41a4f, 0x13e39be9, 0x3cd4c38b, 0x3cb53aaa, 0x144310dd, 0x15604013, 0x3c531e88,
- 0x3c314060, 0x15bee78c, 0x16d99864, 0x3bc82c1f, 0x3ba3fde7, 0x173763c9, 0x184f6aab, 0x3b3401bb,
- 0x3b0d8909, 0x18ac4b87, 0x19c17d44, 0x3a96b636, 0x3a6df8f8, 0x1a1d6544, 0x1b2f971e, 0x39f061d2,
- 0x39c5664f, 0x1b8a7815, 0x1c997fc4, 0x39411e33, 0x3913eb0e, 0x1cf34baf, 0x1dfeff67, 0x38890663,
- 0x3859a292, 0x1e57a86d, 0x1f5fdee6, 0x37c836c2, 0x3796a996, 0x1fb7575c, 0x20bbe7d8, 0x36fecd0e,
- 0x36cb1e2a, 0x21122240, 0x2212e492, 0x362ce855, 0x35f71fb1, 0x2267d3a0, 0x2364a02e, 0x3552a8f4,
- 0x351acedd, 0x23b836ca, 0x24b0e699, 0x34703095, 0x34364da6, 0x250317df, 0x25f78497, 0x3385a222,
- 0x3349bf48, 0x264843d9, 0x273847c8, 0x329321c7, 0x32554840, 0x27878893, 0x2872feb6, 0x3198d4ea,
- 0x31590e3e, 0x28c0b4d2, 0x29a778db, 0x3096e223, 0x30553828, 0x29f3984c, 0x2ad586a3, 0x2f8d713a,
- 0x2f49ee0f, 0x2b2003ac, 0x2bfcf97c, 0x2e7cab1c, 0x2e37592c, 0x2c45c8a0, 0x2d1da3d5, 0x2d64b9da,
- /* 1024 */
- 0x3fffffb1, 0x0006487f, 0x002bfb74, 0x3ffff0e3, 0x3fffe705, 0x00388c6e, 0x005e3f4c, 0x3fffba9b,
- 0x3fffa6de, 0x006ad03b, 0x009082ea, 0x3fff5cd8, 0x3fff3f3c, 0x009d13c5, 0x00c2c62f, 0x3ffed79b,
- 0x3ffeb021, 0x00cf56ef, 0x00f508fc, 0x3ffe2ae5, 0x3ffdf98c, 0x01019998, 0x01274b31, 0x3ffd56b5,
- 0x3ffd1b7e, 0x0133dba3, 0x01598cb1, 0x3ffc5b0c, 0x3ffc15f7, 0x01661cf0, 0x018bcd5b, 0x3ffb37ec,
- 0x3ffae8f9, 0x01985d60, 0x01be0d11, 0x3ff9ed53, 0x3ff99483, 0x01ca9cd4, 0x01f04bb4, 0x3ff87b44,
- 0x3ff81896, 0x01fcdb2e, 0x02228924, 0x3ff6e1bf, 0x3ff67534, 0x022f184d, 0x0254c544, 0x3ff520c5,
- 0x3ff4aa5d, 0x02615414, 0x0286fff3, 0x3ff33858, 0x3ff2b813, 0x02938e62, 0x02b93914, 0x3ff12878,
- 0x3ff09e56, 0x02c5c71a, 0x02eb7086, 0x3feef126, 0x3fee5d28, 0x02f7fe1c, 0x031da62b, 0x3fec9265,
- 0x3febf48b, 0x032a3349, 0x034fd9e5, 0x3fea0c35, 0x3fe96480, 0x035c6682, 0x03820b93, 0x3fe75e98,
- 0x3fe6ad08, 0x038e97a9, 0x03b43b17, 0x3fe48990, 0x3fe3ce26, 0x03c0c69e, 0x03e66852, 0x3fe18d1f,
- 0x3fe0c7da, 0x03f2f342, 0x04189326, 0x3fde6945, 0x3fdd9a27, 0x04251d77, 0x044abb73, 0x3fdb1e06,
- 0x3fda450f, 0x0457451d, 0x047ce11a, 0x3fd7ab64, 0x3fd6c894, 0x04896a16, 0x04af03fc, 0x3fd4115f,
- 0x3fd324b7, 0x04bb8c42, 0x04e123fa, 0x3fd04ffc, 0x3fcf597c, 0x04edab83, 0x051340f6, 0x3fcc673b,
- 0x3fcb66e4, 0x051fc7b9, 0x05455ad1, 0x3fc8571f, 0x3fc74cf3, 0x0551e0c7, 0x0577716b, 0x3fc41fac,
- 0x3fc30baa, 0x0583f68c, 0x05a984a6, 0x3fbfc0e3, 0x3fbea30c, 0x05b608eb, 0x05db9463, 0x3fbb3ac7,
- 0x3fba131b, 0x05e817c3, 0x060da083, 0x3fb68d5b, 0x3fb55bdc, 0x061a22f7, 0x063fa8e7, 0x3fb1b8a2,
- 0x3fb07d50, 0x064c2a67, 0x0671ad71, 0x3facbc9f, 0x3fab777b, 0x067e2df5, 0x06a3ae00, 0x3fa79954,
- 0x3fa64a5f, 0x06b02d81, 0x06d5aa77, 0x3fa24ec6, 0x3fa0f600, 0x06e228ee, 0x0707a2b7, 0x3f9cdcf7,
- 0x3f9b7a62, 0x0714201b, 0x073996a1, 0x3f9743eb, 0x3f95d787, 0x074612eb, 0x076b8616, 0x3f9183a5,
- 0x3f900d72, 0x0778013d, 0x079d70f7, 0x3f8b9c28, 0x3f8a1c29, 0x07a9eaf5, 0x07cf5726, 0x3f858d79,
- 0x3f8403ae, 0x07dbcff2, 0x08013883, 0x3f7f579b, 0x3f7dc405, 0x080db016, 0x083314f1, 0x3f78fa92,
- 0x3f775d31, 0x083f8b43, 0x0864ec4f, 0x3f727661, 0x3f70cf38, 0x08716159, 0x0896be80, 0x3f6bcb0e,
- 0x3f6a1a1c, 0x08a3323a, 0x08c88b65, 0x3f64f89b, 0x3f633de2, 0x08d4fdc6, 0x08fa52de, 0x3f5dff0e,
- 0x3f5c3a8f, 0x0906c3e0, 0x092c14ce, 0x3f56de6a, 0x3f551026, 0x09388469, 0x095dd116, 0x3f4f96b4,
- 0x3f4dbeac, 0x096a3f42, 0x098f8796, 0x3f4827f0, 0x3f464626, 0x099bf44c, 0x09c13831, 0x3f409223,
- 0x3f3ea697, 0x09cda368, 0x09f2e2c7, 0x3f38d552, 0x3f36e006, 0x09ff4c78, 0x0a24873a, 0x3f30f181,
- 0x3f2ef276, 0x0a30ef5e, 0x0a56256c, 0x3f28e6b6, 0x3f26ddec, 0x0a628bfa, 0x0a87bd3d, 0x3f20b4f5,
- 0x3f1ea26e, 0x0a94222f, 0x0ab94e8f, 0x3f185c43, 0x3f164001, 0x0ac5b1dc, 0x0aead944, 0x3f0fdca5,
- 0x3f0db6a9, 0x0af73ae5, 0x0b1c5d3d, 0x3f073621, 0x3f05066d, 0x0b28bd2a, 0x0b4dda5c, 0x3efe68bc,
- 0x3efc2f50, 0x0b5a388d, 0x0b7f5081, 0x3ef5747b, 0x3ef3315a, 0x0b8bacf0, 0x0bb0bf8f, 0x3eec5965,
- 0x3eea0c8e, 0x0bbd1a33, 0x0be22766, 0x3ee3177e, 0x3ee0c0f4, 0x0bee8038, 0x0c1387e9, 0x3ed9aecc,
- 0x3ed74e91, 0x0c1fdee1, 0x0c44e0f9, 0x3ed01f55, 0x3ecdb56a, 0x0c513610, 0x0c763278, 0x3ec66920,
- 0x3ec3f585, 0x0c8285a5, 0x0ca77c47, 0x3ebc8c31, 0x3eba0ee9, 0x0cb3cd84, 0x0cd8be47, 0x3eb2888f,
- 0x3eb0019c, 0x0ce50d8c, 0x0d09f85b, 0x3ea85e41, 0x3ea5cda3, 0x0d1645a0, 0x0d3b2a64, 0x3e9e0d4c,
- 0x3e9b7306, 0x0d4775a1, 0x0d6c5443, 0x3e9395b7, 0x3e90f1ca, 0x0d789d71, 0x0d9d75db, 0x3e88f788,
- 0x3e8649f5, 0x0da9bcf2, 0x0dce8f0d, 0x3e7e32c6, 0x3e7b7b90, 0x0ddad406, 0x0dff9fba, 0x3e734778,
- 0x3e70869f, 0x0e0be28e, 0x0e30a7c5, 0x3e6835a4, 0x3e656b2b, 0x0e3ce86b, 0x0e61a70f, 0x3e5cfd51,
- 0x3e5a2939, 0x0e6de580, 0x0e929d7a, 0x3e519e86, 0x3e4ec0d1, 0x0e9ed9af, 0x0ec38ae8, 0x3e46194a,
- 0x3e4331fa, 0x0ecfc4d9, 0x0ef46f3b, 0x3e3a6da4, 0x3e377cbb, 0x0f00a6df, 0x0f254a53, 0x3e2e9b9c,
- 0x3e2ba11b, 0x0f317fa5, 0x0f561c15, 0x3e22a338, 0x3e1f9f21, 0x0f624f0c, 0x0f86e460, 0x3e168480,
- 0x3e1376d5, 0x0f9314f5, 0x0fb7a317, 0x3e0a3f7b, 0x3e07283f, 0x0fc3d143, 0x0fe8581d, 0x3dfdd432,
- 0x3dfab365, 0x0ff483d7, 0x10190352, 0x3df142ab, 0x3dee1851, 0x10252c94, 0x1049a49a, 0x3de48aef,
- 0x3de15708, 0x1055cb5b, 0x107a3bd5, 0x3dd7ad05, 0x3dd46f94, 0x1086600e, 0x10aac8e6, 0x3dcaa8f5,
- 0x3dc761fc, 0x10b6ea90, 0x10db4baf, 0x3dbd7ec7, 0x3dba2e48, 0x10e76ac3, 0x110bc413, 0x3db02e84,
- 0x3dacd481, 0x1117e088, 0x113c31f3, 0x3da2b834, 0x3d9f54af, 0x11484bc2, 0x116c9531, 0x3d951bde,
- 0x3d91aed9, 0x1178ac53, 0x119cedaf, 0x3d87598c, 0x3d83e309, 0x11a9021d, 0x11cd3b50, 0x3d797145,
- 0x3d75f147, 0x11d94d02, 0x11fd7df6, 0x3d6b6313, 0x3d67d99b, 0x12098ce5, 0x122db583, 0x3d5d2efe,
- 0x3d599c0e, 0x1239c1a7, 0x125de1da, 0x3d4ed50f, 0x3d4b38aa, 0x1269eb2b, 0x128e02dc, 0x3d40554e,
- 0x3d3caf76, 0x129a0954, 0x12be186c, 0x3d31afc5, 0x3d2e007c, 0x12ca1c03, 0x12ee226c, 0x3d22e47c,
- 0x3d1f2bc5, 0x12fa231b, 0x131e20c0, 0x3d13f37e, 0x3d10315a, 0x132a1e7e, 0x134e1348, 0x3d04dcd2,
- 0x3d011145, 0x135a0e0e, 0x137df9e7, 0x3cf5a082, 0x3cf1cb8e, 0x1389f1af, 0x13add481, 0x3ce63e98,
- 0x3ce2603f, 0x13b9c943, 0x13dda2f7, 0x3cd6b71e, 0x3cd2cf62, 0x13e994ab, 0x140d652c, 0x3cc70a1c,
- 0x3cc318ff, 0x141953cb, 0x143d1b02, 0x3cb7379c, 0x3cb33d22, 0x14490685, 0x146cc45c, 0x3ca73fa9,
- 0x3ca33bd3, 0x1478acbc, 0x149c611d, 0x3c97224c, 0x3c93151d, 0x14a84652, 0x14cbf127, 0x3c86df8e,
- 0x3c82c909, 0x14d7d32a, 0x14fb745e, 0x3c76777b, 0x3c7257a2, 0x15075327, 0x152aeaa3, 0x3c65ea1c,
- 0x3c61c0f1, 0x1536c62b, 0x155a53d9, 0x3c55377b, 0x3c510501, 0x15662c18, 0x1589afe3, 0x3c445fa2,
- 0x3c4023dd, 0x159584d3, 0x15b8fea4, 0x3c33629d, 0x3c2f1d8e, 0x15c4d03e, 0x15e83fff, 0x3c224075,
- 0x3c1df21f, 0x15f40e3a, 0x161773d6, 0x3c10f935, 0x3c0ca19b, 0x16233eac, 0x16469a0d, 0x3bff8ce8,
- 0x3bfb2c0c, 0x16526176, 0x1675b286, 0x3bedfb99, 0x3be9917e, 0x1681767c, 0x16a4bd25, 0x3bdc4552,
- 0x3bd7d1fa, 0x16b07d9f, 0x16d3b9cc, 0x3bca6a1d, 0x3bc5ed8d, 0x16df76c3, 0x1702a85e, 0x3bb86a08,
- 0x3bb3e440, 0x170e61cc, 0x173188be, 0x3ba6451b, 0x3ba1b620, 0x173d3e9b, 0x17605ad0, 0x3b93fb63,
- 0x3b8f6337, 0x176c0d15, 0x178f1e76, 0x3b818ceb, 0x3b7ceb90, 0x179acd1c, 0x17bdd394, 0x3b6ef9be,
- 0x3b6a4f38, 0x17c97e93, 0x17ec7a0d, 0x3b5c41e8, 0x3b578e39, 0x17f8215e, 0x181b11c4, 0x3b496574,
- 0x3b44a8a0, 0x1826b561, 0x18499a9d, 0x3b36646e, 0x3b319e77, 0x18553a7d, 0x1878147a, 0x3b233ee1,
- 0x3b1e6fca, 0x1883b097, 0x18a67f3f, 0x3b0ff4d9, 0x3b0b1ca6, 0x18b21791, 0x18d4dad0, 0x3afc8663,
- 0x3af7a516, 0x18e06f50, 0x1903270f, 0x3ae8f38b, 0x3ae40926, 0x190eb7b7, 0x193163e1, 0x3ad53c5b,
- 0x3ad048e3, 0x193cf0a9, 0x195f9128, 0x3ac160e1, 0x3abc6458, 0x196b1a09, 0x198daec8, 0x3aad6129,
- 0x3aa85b92, 0x199933bb, 0x19bbbca6, 0x3a993d3e, 0x3a942e9d, 0x19c73da3, 0x19e9baa3, 0x3a84f52f,
- 0x3a7fdd86, 0x19f537a4, 0x1a17a8a5, 0x3a708906, 0x3a6b6859, 0x1a2321a2, 0x1a45868e, 0x3a5bf8d1,
- 0x3a56cf23, 0x1a50fb81, 0x1a735442, 0x3a47449c, 0x3a4211f0, 0x1a7ec524, 0x1aa111a6, 0x3a326c74,
- 0x3a2d30cd, 0x1aac7e6f, 0x1acebe9d, 0x3a1d7066, 0x3a182bc8, 0x1ada2746, 0x1afc5b0a, 0x3a08507f,
- 0x3a0302ed, 0x1b07bf8c, 0x1b29e6d2, 0x39f30ccc, 0x39edb649, 0x1b354727, 0x1b5761d8, 0x39dda55a,
- 0x39d845e9, 0x1b62bdf8, 0x1b84cc01, 0x39c81a36, 0x39c2b1da, 0x1b9023e5, 0x1bb22530, 0x39b26b6d,
- 0x39acfa2b, 0x1bbd78d2, 0x1bdf6d4a, 0x399c990d, 0x39971ee7, 0x1beabca1, 0x1c0ca432, 0x3986a324,
- 0x3981201e, 0x1c17ef39, 0x1c39c9cd, 0x397089bf, 0x396afddc, 0x1c45107c, 0x1c66ddfe, 0x395a4ceb,
- 0x3954b82e, 0x1c72204f, 0x1c93e0ab, 0x3943ecb6, 0x393e4f23, 0x1c9f1e96, 0x1cc0d1b6, 0x392d692f,
- 0x3927c2c9, 0x1ccc0b35, 0x1cedb106, 0x3916c262, 0x3911132d, 0x1cf8e611, 0x1d1a7e7d, 0x38fff85e,
- 0x38fa405e, 0x1d25af0d, 0x1d473a00, 0x38e90b31, 0x38e34a69, 0x1d52660f, 0x1d73e374, 0x38d1fae9,
- 0x38cc315d, 0x1d7f0afb, 0x1da07abc, 0x38bac795, 0x38b4f547, 0x1dab9db5, 0x1dccffbf, 0x38a37142,
- 0x389d9637, 0x1dd81e21, 0x1df9725f, 0x388bf7ff, 0x3886143b, 0x1e048c24, 0x1e25d282, 0x38745bdb,
- 0x386e6f60, 0x1e30e7a4, 0x1e52200c, 0x385c9ce3, 0x3856a7b6, 0x1e5d3084, 0x1e7e5ae2, 0x3844bb28,
- 0x383ebd4c, 0x1e8966a8, 0x1eaa82e9, 0x382cb6b7, 0x3826b030, 0x1eb589f7, 0x1ed69805, 0x38148f9f,
- 0x380e8071, 0x1ee19a54, 0x1f029a1c, 0x37fc45ef, 0x37f62e1d, 0x1f0d97a5, 0x1f2e8911, 0x37e3d9b7,
- 0x37ddb945, 0x1f3981ce, 0x1f5a64cb, 0x37cb4b04, 0x37c521f6, 0x1f6558b5, 0x1f862d2d, 0x37b299e7,
- 0x37ac6841, 0x1f911c3d, 0x1fb1e21d, 0x3799c66f, 0x37938c34, 0x1fbccc4d, 0x1fdd8381, 0x3780d0aa,
- 0x377a8ddf, 0x1fe868c8, 0x2009113c, 0x3767b8a9, 0x37616d51, 0x2013f196, 0x20348b35, 0x374e7e7b,
- 0x37482a9a, 0x203f6699, 0x205ff14f, 0x3735222f, 0x372ec5c9, 0x206ac7b8, 0x208b4372, 0x371ba3d4,
- 0x37153eee, 0x209614d9, 0x20b68181, 0x3702037c, 0x36fb9618, 0x20c14ddf, 0x20e1ab63, 0x36e84135,
- 0x36e1cb58, 0x20ec72b1, 0x210cc0fc, 0x36ce5d10, 0x36c7debd, 0x21178334, 0x2137c232, 0x36b4571b,
- 0x36add058, 0x21427f4d, 0x2162aeea, 0x369a2f69, 0x3693a038, 0x216d66e2, 0x218d870b, 0x367fe608,
- 0x36794e6e, 0x219839d8, 0x21b84a79, 0x36657b08, 0x365edb09, 0x21c2f815, 0x21e2f91a, 0x364aee7b,
- 0x3644461b, 0x21eda17f, 0x220d92d4, 0x36304070, 0x36298fb4, 0x221835fb, 0x2238178d, 0x361570f8,
- 0x360eb7e3, 0x2242b56f, 0x22628729, 0x35fa8023, 0x35f3beba, 0x226d1fc1, 0x228ce191, 0x35df6e03,
- 0x35d8a449, 0x229774d7, 0x22b726a8, 0x35c43aa7, 0x35bd68a1, 0x22c1b496, 0x22e15655, 0x35a8e621,
- 0x35a20bd3, 0x22ebdee5, 0x230b707e, 0x358d7081, 0x35868def, 0x2315f3a8, 0x23357509, 0x3571d9d9,
- 0x356aef08, 0x233ff2c8, 0x235f63dc, 0x35562239, 0x354f2f2c, 0x2369dc29, 0x23893cdd, 0x353a49b2,
- 0x35334e6f, 0x2393afb2, 0x23b2fff3, 0x351e5056, 0x35174ce0, 0x23bd6d48, 0x23dcad03, 0x35023636,
- 0x34fb2a92, 0x23e714d3, 0x240643f4, 0x34e5fb63, 0x34dee795, 0x2410a639, 0x242fc4ad, 0x34c99fef,
- 0x34c283fb, 0x243a215f, 0x24592f13, 0x34ad23eb, 0x34a5ffd5, 0x2463862c, 0x2482830d, 0x34908768,
- 0x34895b36, 0x248cd487, 0x24abc082, 0x3473ca79, 0x346c962f, 0x24b60c57, 0x24d4e757, 0x3456ed2f,
- 0x344fb0d1, 0x24df2d81, 0x24fdf775, 0x3439ef9c, 0x3432ab2e, 0x250837ed, 0x2526f0c1, 0x341cd1d2,
- 0x34158559, 0x25312b81, 0x254fd323, 0x33ff93e2, 0x33f83f62, 0x255a0823, 0x25789e80, 0x33e235df,
- 0x33dad95e, 0x2582cdbc, 0x25a152c0, 0x33c4b7db, 0x33bd535c, 0x25ab7c30, 0x25c9efca, 0x33a719e8,
- 0x339fad70, 0x25d41369, 0x25f27584, 0x33895c18, 0x3381e7ac, 0x25fc934b, 0x261ae3d6, 0x336b7e7e,
- 0x33640223, 0x2624fbbf, 0x26433aa7, 0x334d812d, 0x3345fce6, 0x264d4cac, 0x266b79dd, 0x332f6435,
- 0x3327d808, 0x267585f8, 0x2693a161, 0x331127ab, 0x3309939c, 0x269da78b, 0x26bbb119, 0x32f2cba1,
- 0x32eb2fb5, 0x26c5b14c, 0x26e3a8ec, 0x32d45029, 0x32ccac64, 0x26eda322, 0x270b88c2, 0x32b5b557,
- 0x32ae09be, 0x27157cf5, 0x27335082, 0x3296fb3d, 0x328f47d5, 0x273d3eac, 0x275b0014, 0x327821ee,
- 0x327066bc, 0x2764e82f, 0x27829760, 0x3259297d, 0x32516686, 0x278c7965, 0x27aa164c, 0x323a11fe,
- 0x32324746, 0x27b3f235, 0x27d17cc1, 0x321adb83, 0x3213090f, 0x27db5288, 0x27f8caa5, 0x31fb8620,
- 0x31f3abf5, 0x28029a45, 0x281fffe2, 0x31dc11e8, 0x31d4300b, 0x2829c954, 0x28471c5e, 0x31bc7eee,
- 0x31b49564, 0x2850df9d, 0x286e2002, 0x319ccd46, 0x3194dc14, 0x2877dd07, 0x28950ab6, 0x317cfd04,
- 0x3175042e, 0x289ec17a, 0x28bbdc61, 0x315d0e3b, 0x31550dc6, 0x28c58cdf, 0x28e294eb, 0x313d00ff,
- 0x3134f8f1, 0x28ec3f1e, 0x2909343e, 0x311cd564, 0x3114c5c0, 0x2912d81f, 0x292fba40, 0x30fc8b7d,
- 0x30f47449, 0x293957c9, 0x295626da, 0x30dc235e, 0x30d404a0, 0x295fbe06, 0x297c79f5, 0x30bb9d1c,
- 0x30b376d8, 0x29860abd, 0x29a2b378, 0x309af8ca, 0x3092cb05, 0x29ac3dd7, 0x29c8d34d, 0x307a367c,
- 0x3072013c, 0x29d2573c, 0x29eed95b, 0x30595648, 0x30511991, 0x29f856d5, 0x2a14c58b, 0x30385840,
- 0x30301418, 0x2a1e3c8a, 0x2a3a97c7, 0x30173c7a, 0x300ef0e5, 0x2a440844, 0x2a604ff5, 0x2ff6030a,
- 0x2fedb00d, 0x2a69b9ec, 0x2a85ee00, 0x2fd4ac04, 0x2fcc51a5, 0x2a8f516b, 0x2aab71d0, 0x2fb3377c,
- 0x2faad5c1, 0x2ab4cea9, 0x2ad0db4e, 0x2f91a589, 0x2f893c75, 0x2ada318e, 0x2af62a63, 0x2f6ff63d,
- 0x2f6785d7, 0x2aff7a05, 0x2b1b5ef8, 0x2f4e29af, 0x2f45b1fb, 0x2b24a7f6, 0x2b4078f5, 0x2f2c3ff2,
- 0x2f23c0f6, 0x2b49bb4a, 0x2b657844, 0x2f0a391d, 0x2f01b2de, 0x2b6eb3ea, 0x2b8a5cce, 0x2ee81543,
- 0x2edf87c6, 0x2b9391c0, 0x2baf267d, 0x2ec5d479, 0x2ebd3fc4, 0x2bb854b4, 0x2bd3d53a, 0x2ea376d6,
- 0x2e9adaee, 0x2bdcfcb0, 0x2bf868ed, 0x2e80fc6e, 0x2e785958, 0x2c01899e, 0x2c1ce181, 0x2e5e6556,
- 0x2e55bb17, 0x2c25fb66, 0x2c413edf, 0x2e3bb1a4, 0x2e330042, 0x2c4a51f3, 0x2c6580f1, 0x2e18e16d,
- 0x2e1028ed, 0x2c6e8d2e, 0x2c89a79f, 0x2df5f4c7, 0x2ded352f, 0x2c92ad01, 0x2cadb2d5, 0x2dd2ebc7,
- 0x2dca251c, 0x2cb6b155, 0x2cd1a27b, 0x2dafc683, 0x2da6f8ca, 0x2cda9a14, 0x2cf5767c, 0x2d8c8510,
- 0x2d83b04f, 0x2cfe6728, 0x2d192ec1, 0x2d692784, 0x2d604bc0, 0x2d22187a, 0x2d3ccb34, 0x2d45adf6
-};
-
-const int twidTab512[8*6 + 32*6 + 128*6] = {
- 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3b20d79e, 0x187de2a6,
- 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6,
- 0x187de2a6, 0x3b20d79e, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f,
- 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xe7821d5a, 0x3b20d79e,
- 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e,
- 0xc4df2862, 0xe7821d5a, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae,
-
- 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3fb11b47, 0x0645e9af,
- 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af,
- 0x3d3e82ad, 0x1294062e, 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009,
- 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x387165e3, 0x1e2b5d38,
- 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e,
- 0x2899e64a, 0x317900d6, 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a,
- 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2899e64a, 0x317900d6,
- 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38,
- 0x0645e9af, 0x3fb11b47, 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6,
- 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x1294062e, 0x3d3e82ad,
- 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a,
- 0xe1d4a2c8, 0x387165e3, 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f,
- 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf9ba1651, 0x3fb11b47,
- 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6,
- 0xc78e9a1d, 0x1e2b5d38, 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75,
- 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe1d4a2c8, 0x387165e3,
- 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3,
- 0xc04ee4b9, 0xf9ba1651, 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343,
- 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xce86ff2a, 0x2899e64a,
- 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad,
- 0xce86ff2a, 0xd76619b6, 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc,
- 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc2c17d53, 0x1294062e,
- 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47,
- 0xed6bf9d2, 0xc2c17d53, 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502,
-
- 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ffb10c1, 0x0192155f,
- 0x3ffec42d, 0x00c90e8f, 0x3ff4e5df, 0x025b0cae, 0x3fec43c6, 0x0323ecbe, 0x3ffb10c1, 0x0192155f,
- 0x3fd39b5a, 0x04b54824, 0x3fd39b5a, 0x04b54824, 0x3ff4e5df, 0x025b0cae, 0x3f9c2bfa, 0x070de171,
- 0x3fb11b47, 0x0645e9af, 0x3fec43c6, 0x0323ecbe, 0x3f4eaafe, 0x09640837, 0x3f84c8e1, 0x07d59395,
- 0x3fe12acb, 0x03ecadcf, 0x3eeb3347, 0x0bb6ecef, 0x3f4eaafe, 0x09640837, 0x3fd39b5a, 0x04b54824,
- 0x3e71e758, 0x0e05c135, 0x3f0ec9f4, 0x0af10a22, 0x3fc395f9, 0x057db402, 0x3de2f147, 0x104fb80e,
- 0x3ec52f9f, 0x0c7c5c1e, 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3e71e758, 0x0e05c135,
- 0x3f9c2bfa, 0x070de171, 0x3c84d496, 0x14d1e242, 0x3e14fdf7, 0x0f8cfcbd, 0x3f84c8e1, 0x07d59395,
- 0x3bb6276d, 0x17088530, 0x3dae81ce, 0x1111d262, 0x3f6af2e3, 0x089cf867, 0x3ad2c2e7, 0x19372a63,
- 0x3d3e82ad, 0x1294062e, 0x3f4eaafe, 0x09640837, 0x39daf5e8, 0x1b5d1009, 0x3cc511d8, 0x14135c94,
- 0x3f2ff249, 0x0a2abb58, 0x38cf1669, 0x1d79775b, 0x3c424209, 0x158f9a75, 0x3f0ec9f4, 0x0af10a22,
- 0x37af8158, 0x1f8ba4db, 0x3bb6276d, 0x17088530, 0x3eeb3347, 0x0bb6ecef, 0x367c9a7d, 0x2192e09a,
- 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e, 0x3536cc52, 0x238e7673, 0x3a8269a2, 0x19ef7943,
- 0x3e9cc076, 0x0d415012, 0x33de87de, 0x257db64b, 0x39daf5e8, 0x1b5d1009, 0x3e71e758, 0x0e05c135,
- 0x32744493, 0x275ff452, 0x392a9642, 0x1cc66e99, 0x3e44a5ee, 0x0ec9a7f2, 0x30f8801f, 0x29348937,
- 0x387165e3, 0x1e2b5d38, 0x3e14fdf7, 0x0f8cfcbd, 0x2f6bbe44, 0x2afad269, 0x37af8158, 0x1f8ba4db,
- 0x3de2f147, 0x104fb80e, 0x2dce88a9, 0x2cb2324b, 0x36e5068a, 0x20e70f32, 0x3dae81ce, 0x1111d262,
- 0x2c216eaa, 0x2e5a106f, 0x361214b0, 0x223d66a8, 0x3d77b191, 0x11d3443f, 0x2a650525, 0x2ff1d9c6,
- 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6, 0x34534f40, 0x24da0a99,
- 0x3d02f756, 0x135410c2, 0x26c0b162, 0x32eefde9, 0x3367c08f, 0x261feff9, 0x3cc511d8, 0x14135c94,
- 0x24da0a99, 0x34534f40, 0x32744493, 0x275ff452, 0x3c84d496, 0x14d1e242, 0x22e69ac7, 0x35a5793c,
- 0x317900d6, 0x2899e64a, 0x3c424209, 0x158f9a75, 0x20e70f32, 0x36e5068a, 0x30761c17, 0x29cd9577,
- 0x3bfd5cc4, 0x164c7ddd, 0x1edc1952, 0x3811884c, 0x2f6bbe44, 0x2afad269, 0x3bb6276d, 0x17088530,
- 0x1cc66e99, 0x392a9642, 0x2e5a106f, 0x2c216eaa, 0x3b6ca4c4, 0x17c3a931, 0x1aa6c82b, 0x3a2fcee8,
- 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x2c216eaa, 0x2e5a106f,
- 0x3ad2c2e7, 0x19372a63, 0x164c7ddd, 0x3bfd5cc4, 0x2afad269, 0x2f6bbe44, 0x3a8269a2, 0x19ef7943,
- 0x14135c94, 0x3cc511d8, 0x29cd9577, 0x30761c17, 0x3a2fcee8, 0x1aa6c82b, 0x11d3443f, 0x3d77b191,
- 0x2899e64a, 0x317900d6, 0x39daf5e8, 0x1b5d1009, 0x0f8cfcbd, 0x3e14fdf7, 0x275ff452, 0x32744493,
- 0x3983e1e7, 0x1c1249d8, 0x0d415012, 0x3e9cc076, 0x261feff9, 0x3367c08f, 0x392a9642, 0x1cc66e99,
- 0x0af10a22, 0x3f0ec9f4, 0x24da0a99, 0x34534f40, 0x38cf1669, 0x1d79775b, 0x089cf867, 0x3f6af2e3,
- 0x238e7673, 0x3536cc52, 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x223d66a8, 0x361214b0,
- 0x3811884c, 0x1edc1952, 0x03ecadcf, 0x3fe12acb, 0x20e70f32, 0x36e5068a, 0x37af8158, 0x1f8ba4db,
- 0x0192155f, 0x3ffb10c1, 0x1f8ba4db, 0x37af8158, 0x374b54ce, 0x2039f90e, 0xff36f171, 0x3ffec42d,
- 0x1e2b5d38, 0x387165e3, 0x36e5068a, 0x20e70f32, 0xfcdc1342, 0x3fec43c6, 0x1cc66e99, 0x392a9642,
- 0x367c9a7d, 0x2192e09a, 0xfa824bfe, 0x3fc395f9, 0x1b5d1009, 0x39daf5e8, 0x361214b0, 0x223d66a8,
- 0xf82a6c6b, 0x3f84c8e1, 0x19ef7943, 0x3a8269a2, 0x35a5793c, 0x22e69ac7, 0xf5d544a8, 0x3f2ff249,
- 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673, 0xf383a3e2, 0x3ec52f9f, 0x17088530, 0x3bb6276d,
- 0x34c61236, 0x2434f332, 0xf136580e, 0x3e44a5ee, 0x158f9a75, 0x3c424209, 0x34534f40, 0x24da0a99,
- 0xeeee2d9e, 0x3dae81ce, 0x14135c94, 0x3cc511d8, 0x33de87de, 0x257db64b, 0xecabef3e, 0x3d02f756,
- 0x1294062e, 0x3d3e82ad, 0x3367c08f, 0x261feff9, 0xea70658b, 0x3c424209, 0x1111d262, 0x3dae81ce,
- 0x32eefde9, 0x26c0b162, 0xe83c56cf, 0x3b6ca4c4, 0x0f8cfcbd, 0x3e14fdf7, 0x32744493, 0x275ff452,
- 0xe61086bd, 0x3a8269a2, 0x0e05c135, 0x3e71e758, 0x31f79947, 0x27fdb2a6, 0xe3edb628, 0x3983e1e7,
- 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3, 0x0af10a22, 0x3f0ec9f4,
- 0x30f8801f, 0x29348937, 0xdfc606f2, 0x374b54ce, 0x09640837, 0x3f4eaafe, 0x30761c17, 0x29cd9577,
- 0xddc29958, 0x361214b0, 0x07d59395, 0x3f84c8e1, 0x2ff1d9c6, 0x2a650525, 0xdbcb0cce, 0x34c61236,
- 0x0645e9af, 0x3fb11b47, 0x2f6bbe44, 0x2afad269, 0xd9e01007, 0x3367c08f, 0x04b54824, 0x3fd39b5a,
- 0x2ee3cebe, 0x2b8ef77c, 0xd8024d5a, 0x31f79947, 0x0323ecbe, 0x3fec43c6, 0x2e5a106f, 0x2c216eaa,
- 0xd6326a89, 0x30761c17, 0x0192155f, 0x3ffb10c1, 0x2dce88a9, 0x2cb2324b, 0xd4710884, 0x2ee3cebe,
- 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xfe6deaa1, 0x3ffb10c1,
- 0x2cb2324b, 0x2dce88a9, 0xd11c3142, 0x2b8ef77c, 0xfcdc1342, 0x3fec43c6, 0x2c216eaa, 0x2e5a106f,
- 0xcf89e3e9, 0x29cd9577, 0xfb4ab7dc, 0x3fd39b5a, 0x2b8ef77c, 0x2ee3cebe, 0xce0866b9, 0x27fdb2a6,
- 0xf9ba1651, 0x3fb11b47, 0x2afad269, 0x2f6bbe44, 0xcc983f71, 0x261feff9, 0xf82a6c6b, 0x3f84c8e1,
- 0x2a650525, 0x2ff1d9c6, 0xcb39edca, 0x2434f332, 0xf69bf7c9, 0x3f4eaafe, 0x29cd9577, 0x30761c17,
- 0xc9edeb50, 0x223d66a8, 0xf50ef5de, 0x3f0ec9f4, 0x29348937, 0x30f8801f, 0xc8b4ab32, 0x2039f90e,
- 0xf383a3e2, 0x3ec52f9f, 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xf1fa3ecb, 0x3e71e758,
- 0x27fdb2a6, 0x31f79947, 0xc67c1e19, 0x1c1249d8, 0xf0730343, 0x3e14fdf7, 0x275ff452, 0x32744493,
- 0xc57d965e, 0x19ef7943, 0xeeee2d9e, 0x3dae81ce, 0x26c0b162, 0x32eefde9, 0xc4935b3c, 0x17c3a931,
- 0xed6bf9d2, 0x3d3e82ad, 0x261feff9, 0x3367c08f, 0xc3bdbdf7, 0x158f9a75, 0xebeca36c, 0x3cc511d8,
- 0x257db64b, 0x33de87de, 0xc2fd08aa, 0x135410c2, 0xea70658b, 0x3c424209, 0x24da0a99, 0x34534f40,
- 0xc2517e32, 0x1111d262, 0xe8f77ad0, 0x3bb6276d, 0x2434f332, 0x34c61236, 0xc1bb5a12, 0x0ec9a7f2,
- 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52, 0xc13ad061, 0x0c7c5c1e, 0xe61086bd, 0x3a8269a2,
- 0x22e69ac7, 0x35a5793c, 0xc0d00db7, 0x0a2abb58, 0xe4a2eff7, 0x39daf5e8, 0x223d66a8, 0x361214b0,
- 0xc07b371f, 0x07d59395, 0xe3399167, 0x392a9642, 0x2192e09a, 0x367c9a7d, 0xc03c6a07, 0x057db402,
- 0xe1d4a2c8, 0x387165e3, 0x20e70f32, 0x36e5068a, 0xc013bc3a, 0x0323ecbe, 0xe0745b25, 0x37af8158,
- 0x2039f90e, 0x374b54ce, 0xc0013bd3, 0x00c90e8f, 0xdf18f0ce, 0x36e5068a, 0x1f8ba4db, 0x37af8158,
- 0xc004ef3f, 0xfe6deaa1, 0xddc29958, 0x361214b0, 0x1edc1952, 0x3811884c, 0xc01ed535, 0xfc135231,
- 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651, 0xdb25f567, 0x34534f40,
- 0x1d79775b, 0x38cf1669, 0xc0950d1d, 0xf7630799, 0xd9e01007, 0x3367c08f, 0x1cc66e99, 0x392a9642,
- 0xc0f1360c, 0xf50ef5de, 0xd8a00bae, 0x32744493, 0x1c1249d8, 0x3983e1e7, 0xc1633f8a, 0xf2beafee,
- 0xd76619b6, 0x317900d6, 0x1b5d1009, 0x39daf5e8, 0xc1eb0209, 0xf0730343, 0xd6326a89, 0x30761c17,
- 0x1aa6c82b, 0x3a2fcee8, 0xc2884e6f, 0xee2cbbc1, 0xd5052d97, 0x2f6bbe44, 0x19ef7943, 0x3a8269a2,
- 0xc33aee28, 0xebeca36c, 0xd3de9156, 0x2e5a106f, 0x19372a63, 0x3ad2c2e7, 0xc402a33c, 0xe9b38223,
- 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xd1a5ef91, 0x2c216eaa,
- 0x17c3a931, 0x3b6ca4c4, 0xc5d03118, 0xe55937d5, 0xd09441bc, 0x2afad269, 0x17088530, 0x3bb6276d,
- 0xc6d569be, 0xe3399167, 0xcf89e3e9, 0x29cd9577, 0x164c7ddd, 0x3bfd5cc4, 0xc7ee77b4, 0xe123e6ae,
- 0xce86ff2a, 0x2899e64a, 0x158f9a75, 0x3c424209, 0xc91af976, 0xdf18f0ce, 0xcd8bbb6d, 0x275ff452,
- 0x14d1e242, 0x3c84d496, 0xca5a86c4, 0xdd196539, 0xcc983f71, 0x261feff9, 0x14135c94, 0x3cc511d8,
- 0xcbacb0c0, 0xdb25f567, 0xcbacb0c0, 0x24da0a99, 0x135410c2, 0x3d02f756, 0xcd110217, 0xd93f4e9e,
- 0xcac933ae, 0x238e7673, 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc9edeb50, 0x223d66a8,
- 0x11d3443f, 0x3d77b191, 0xd00e263a, 0xd59afadb, 0xc91af976, 0x20e70f32, 0x1111d262, 0x3dae81ce,
- 0xd1a5ef91, 0xd3de9156, 0xc8507ea8, 0x1f8ba4db, 0x104fb80e, 0x3de2f147, 0xd34dcdb5, 0xd2317757,
- 0xc78e9a1d, 0x1e2b5d38, 0x0f8cfcbd, 0x3e14fdf7, 0xd5052d97, 0xd09441bc, 0xc6d569be, 0x1cc66e99,
- 0x0ec9a7f2, 0x3e44a5ee, 0xd6cb76c9, 0xcf077fe1, 0xc6250a18, 0x1b5d1009, 0x0e05c135, 0x3e71e758,
- 0xd8a00bae, 0xcd8bbb6d, 0xc57d965e, 0x19ef7943, 0x0d415012, 0x3e9cc076, 0xda8249b5, 0xcc217822,
- 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f, 0xdc71898d, 0xcac933ae, 0xc449d893, 0x17088530,
- 0x0bb6ecef, 0x3eeb3347, 0xde6d1f66, 0xc9836583, 0xc3bdbdf7, 0x158f9a75, 0x0af10a22, 0x3f0ec9f4,
- 0xe0745b25, 0xc8507ea8, 0xc33aee28, 0x14135c94, 0x0a2abb58, 0x3f2ff249, 0xe28688a5, 0xc730e997,
- 0xc2c17d53, 0x1294062e, 0x09640837, 0x3f4eaafe, 0xe4a2eff7, 0xc6250a18, 0xc2517e32, 0x1111d262,
- 0x089cf867, 0x3f6af2e3, 0xe6c8d59d, 0xc52d3d19, 0xc1eb0209, 0x0f8cfcbd, 0x07d59395, 0x3f84c8e1,
- 0xe8f77ad0, 0xc449d893, 0xc18e18a8, 0x0e05c135, 0x070de171, 0x3f9c2bfa, 0xeb2e1dbe, 0xc37b2b6a,
- 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53, 0xc0f1360c, 0x0af10a22,
- 0x057db402, 0x3fc395f9, 0xefb047f2, 0xc21d0eb9, 0xc0b15502, 0x09640837, 0x04b54824, 0x3fd39b5a,
- 0xf1fa3ecb, 0xc18e18a8, 0xc07b371f, 0x07d59395, 0x03ecadcf, 0x3fe12acb, 0xf4491311, 0xc114ccb9,
- 0xc04ee4b9, 0x0645e9af, 0x0323ecbe, 0x3fec43c6, 0xf69bf7c9, 0xc0b15502, 0xc02c64a6, 0x04b54824,
- 0x025b0cae, 0x3ff4e5df, 0xf8f21e8f, 0xc063d406, 0xc013bc3a, 0x0323ecbe, 0x0192155f, 0x3ffb10c1,
- 0xfb4ab7dc, 0xc02c64a6, 0xc004ef3f, 0x0192155f, 0x00c90e8f, 0x3ffec42d, 0xfda4f352, 0xc00b1a21
-};
-
-const int twidTab64[4*6 + 16*6] = {
- 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x2d413ccc, 0x2d413ccc,
- 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc,
- 0xd2bec334, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a,
-
- 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x40000000, 0x00000000, 0x3ec52f9f, 0x0c7c5c1e,
- 0x3fb11b47, 0x0645e9af, 0x3d3e82ad, 0x1294062e, 0x3b20d79e, 0x187de2a6, 0x3ec52f9f, 0x0c7c5c1e,
- 0x3536cc52, 0x238e7673, 0x3536cc52, 0x238e7673, 0x3d3e82ad, 0x1294062e, 0x2899e64a, 0x317900d6,
- 0x2d413ccc, 0x2d413ccc, 0x3b20d79e, 0x187de2a6, 0x187de2a6, 0x3b20d79e, 0x238e7673, 0x3536cc52,
- 0x387165e3, 0x1e2b5d38, 0x0645e9af, 0x3fb11b47, 0x187de2a6, 0x3b20d79e, 0x3536cc52, 0x238e7673,
- 0xf383a3e2, 0x3ec52f9f, 0x0c7c5c1e, 0x3ec52f9f, 0x317900d6, 0x2899e64a, 0xe1d4a2c8, 0x387165e3,
- 0x00000000, 0x40000000, 0x2d413ccc, 0x2d413ccc, 0xd2bec334, 0x2d413ccc, 0xf383a3e2, 0x3ec52f9f,
- 0x2899e64a, 0x317900d6, 0xc78e9a1d, 0x1e2b5d38, 0xe7821d5a, 0x3b20d79e, 0x238e7673, 0x3536cc52,
- 0xc13ad061, 0x0c7c5c1e, 0xdc71898d, 0x3536cc52, 0x1e2b5d38, 0x387165e3, 0xc04ee4b9, 0xf9ba1651,
- 0xd2bec334, 0x2d413ccc, 0x187de2a6, 0x3b20d79e, 0xc4df2862, 0xe7821d5a, 0xcac933ae, 0x238e7673,
- 0x1294062e, 0x3d3e82ad, 0xce86ff2a, 0xd76619b6, 0xc4df2862, 0x187de2a6, 0x0c7c5c1e, 0x3ec52f9f,
- 0xdc71898d, 0xcac933ae, 0xc13ad061, 0x0c7c5c1e, 0x0645e9af, 0x3fb11b47, 0xed6bf9d2, 0xc2c17d53
-};
-#endif //ARMV5E
-
-const int ShortWindowSine[FRAME_LEN_SHORT/2] ={
- 0x00c97fff, 0x025b7ffa, 0x03ed7ff1, 0x057f7fe2, 0x07117fce, 0x08a27fb5, 0x0a337f98, 0x0bc47f75,
- 0x0d547f4e, 0x0ee47f22, 0x10737ef0, 0x12017eba, 0x138f7e7f, 0x151c7e3f, 0x16a87dfb, 0x18337db1,
- 0x19be7d63, 0x1b477d0f, 0x1cd07cb7, 0x1e577c5a, 0x1fdd7bf9, 0x21627b92, 0x22e57b27, 0x24677ab7,
- 0x25e87a42, 0x276879c9, 0x28e5794a, 0x2a6278c8, 0x2bdc7840, 0x2d5577b4, 0x2ecc7723, 0x3042768e,
- 0x31b575f4, 0x33277556, 0x349774b3, 0x3604740b, 0x3770735f, 0x38d972af, 0x3a4071fa, 0x3ba57141,
- 0x3d087083, 0x3e686fc2, 0x3fc66efb, 0x41216e31, 0x427a6d62, 0x43d16c8f, 0x45246bb8, 0x46756add,
- 0x47c469fd, 0x490f691a, 0x4a586832, 0x4b9e6747, 0x4ce16657, 0x4e216564, 0x4f5e646c, 0x50986371,
- 0x51cf6272, 0x5303616f, 0x54336068, 0x55605f5e, 0x568a5e50, 0x57b15d3e, 0x58d45c29, 0x59f45b10
-};
-
-const int LongWindowKBD[FRAME_LEN_LONG/2]={
- 0x000a7fff, 0x000e7fff, 0x00127fff, 0x00157fff, 0x00197fff, 0x001c7fff, 0x00207fff, 0x00237fff,
- 0x00267fff, 0x002a7fff, 0x002d7fff, 0x00307fff, 0x00347fff, 0x00387fff, 0x003b7fff, 0x003f7fff,
- 0x00437fff, 0x00477fff, 0x004b7fff, 0x004f7fff, 0x00537fff, 0x00577fff, 0x005b7fff, 0x00607fff,
- 0x00647fff, 0x00697fff, 0x006d7fff, 0x00727fff, 0x00777fff, 0x007c7fff, 0x00817fff, 0x00867fff,
- 0x008b7fff, 0x00917fff, 0x00967fff, 0x009c7fff, 0x00a17fff, 0x00a77fff, 0x00ad7fff, 0x00b37fff,
- 0x00b97fff, 0x00bf7fff, 0x00c67fff, 0x00cc7fff, 0x00d37fff, 0x00da7fff, 0x00e07fff, 0x00e77fff,
- 0x00ee7fff, 0x00f57fff, 0x00fd7fff, 0x01047fff, 0x010c7fff, 0x01137fff, 0x011b7fff, 0x01237fff,
- 0x012b7fff, 0x01337fff, 0x013c7ffe, 0x01447ffe, 0x014d7ffe, 0x01567ffe, 0x015f7ffe, 0x01687ffe,
- 0x01717ffe, 0x017a7ffe, 0x01837ffe, 0x018d7ffe, 0x01977ffd, 0x01a17ffd, 0x01ab7ffd, 0x01b57ffd,
- 0x01bf7ffd, 0x01ca7ffd, 0x01d47ffd, 0x01df7ffc, 0x01ea7ffc, 0x01f57ffc, 0x02007ffc, 0x020c7ffc,
- 0x02177ffc, 0x02237ffb, 0x022f7ffb, 0x023b7ffb, 0x02477ffb, 0x02537ffb, 0x02607ffa, 0x026d7ffa,
- 0x027a7ffa, 0x02877ffa, 0x02947ff9, 0x02a17ff9, 0x02af7ff9, 0x02bc7ff9, 0x02ca7ff8, 0x02d87ff8,
- 0x02e77ff8, 0x02f57ff7, 0x03047ff7, 0x03127ff7, 0x03217ff6, 0x03317ff6, 0x03407ff5, 0x034f7ff5,
- 0x035f7ff5, 0x036f7ff4, 0x037f7ff4, 0x038f7ff3, 0x03a07ff3, 0x03b07ff2, 0x03c17ff2, 0x03d27ff1,
- 0x03e37ff1, 0x03f57ff0, 0x04067ff0, 0x04187fef, 0x042a7fef, 0x043c7fee, 0x044f7fed, 0x04617fed,
- 0x04747fec, 0x04877feb, 0x049a7feb, 0x04ae7fea, 0x04c17fe9, 0x04d57fe9, 0x04e97fe8, 0x04fd7fe7,
- 0x05127fe6, 0x05277fe5, 0x053b7fe5, 0x05507fe4, 0x05667fe3, 0x057b7fe2, 0x05917fe1, 0x05a77fe0,
- 0x05bd7fdf, 0x05d37fde, 0x05ea7fdd, 0x06017fdc, 0x06187fdb, 0x062f7fda, 0x06467fd9, 0x065e7fd7,
- 0x06767fd6, 0x068e7fd5, 0x06a67fd4, 0x06bf7fd2, 0x06d87fd1, 0x06f17fd0, 0x070a7fce, 0x07237fcd,
- 0x073d7fcc, 0x07577fca, 0x07717fc9, 0x078c7fc7, 0x07a67fc5, 0x07c17fc4, 0x07dc7fc2, 0x07f77fc0,
- 0x08137fbf, 0x082f7fbd, 0x084b7fbb, 0x08677fb9, 0x08847fb7, 0x08a07fb6, 0x08bd7fb4, 0x08da7fb2,
- 0x08f87faf, 0x09167fad, 0x09347fab, 0x09527fa9, 0x09707fa7, 0x098f7fa5, 0x09ae7fa2, 0x09cd7fa0,
- 0x09ec7f9d, 0x0a0c7f9b, 0x0a2c7f98, 0x0a4c7f96, 0x0a6c7f93, 0x0a8d7f91, 0x0aae7f8e, 0x0acf7f8b,
- 0x0af07f88, 0x0b127f85, 0x0b337f82, 0x0b557f7f, 0x0b787f7c, 0x0b9a7f79, 0x0bbd7f76, 0x0be07f73,
- 0x0c047f6f, 0x0c277f6c, 0x0c4b7f69, 0x0c6f7f65, 0x0c937f61, 0x0cb87f5e, 0x0cdd7f5a, 0x0d027f56,
- 0x0d277f53, 0x0d4d7f4f, 0x0d737f4b, 0x0d997f47, 0x0dbf7f43, 0x0de67f3e, 0x0e0c7f3a, 0x0e347f36,
- 0x0e5b7f31, 0x0e837f2d, 0x0eaa7f28, 0x0ed37f24, 0x0efb7f1f, 0x0f237f1a, 0x0f4c7f15, 0x0f757f10,
- 0x0f9f7f0b, 0x0fc87f06, 0x0ff27f01, 0x101c7efb, 0x10477ef6, 0x10717ef0, 0x109c7eeb, 0x10c87ee5,
- 0x10f37edf, 0x111f7eda, 0x114a7ed4, 0x11777ece, 0x11a37ec7, 0x11d07ec1, 0x11fd7ebb, 0x122a7eb4,
- 0x12577eae, 0x12857ea7, 0x12b37ea0, 0x12e17e9a, 0x130f7e93, 0x133e7e8c, 0x136d7e84, 0x139c7e7d,
- 0x13cc7e76, 0x13fb7e6e, 0x142b7e67, 0x145b7e5f, 0x148c7e57, 0x14bc7e4f, 0x14ed7e47, 0x151e7e3f,
- 0x15507e37, 0x15817e2e, 0x15b37e26, 0x15e57e1d, 0x16187e14, 0x164a7e0b, 0x167d7e02, 0x16b07df9,
- 0x16e47df0, 0x17177de6, 0x174b7ddd, 0x177f7dd3, 0x17b37dc9, 0x17e87dbf, 0x181d7db5, 0x18527dab,
- 0x18877da1, 0x18bc7d96, 0x18f27d8c, 0x19287d81, 0x195e7d76, 0x19957d6b, 0x19cb7d60, 0x1a027d54,
- 0x1a397d49, 0x1a717d3d, 0x1aa87d31, 0x1ae07d26, 0x1b187d19, 0x1b507d0d, 0x1b897d01, 0x1bc27cf4,
- 0x1bfb7ce8, 0x1c347cdb, 0x1c6d7cce, 0x1ca77cc1, 0x1ce17cb3, 0x1d1b7ca6, 0x1d557c98, 0x1d8f7c8a,
- 0x1dca7c7c, 0x1e057c6e, 0x1e407c60, 0x1e7b7c51, 0x1eb77c43, 0x1ef37c34, 0x1f2f7c25, 0x1f6b7c16,
- 0x1fa77c06, 0x1fe47bf7, 0x20217be7, 0x205e7bd7, 0x209b7bc7, 0x20d87bb7, 0x21167ba6, 0x21547b96,
- 0x21927b85, 0x21d07b74, 0x220e7b63, 0x224d7b52, 0x228c7b40, 0x22cb7b2e, 0x230a7b1c, 0x23497b0a,
- 0x23897af8, 0x23c87ae6, 0x24087ad3, 0x24487ac0, 0x24897aad, 0x24c97a9a, 0x250a7a86, 0x254b7a73,
- 0x258c7a5f, 0x25cd7a4b, 0x260e7a36, 0x26507a22, 0x26917a0d, 0x26d379f8, 0x271579e3, 0x275779ce,
- 0x279a79b8, 0x27dc79a3, 0x281f798d, 0x28627977, 0x28a57960, 0x28e8794a, 0x292b7933, 0x296f791c,
- 0x29b27905, 0x29f678ed, 0x2a3a78d6, 0x2a7e78be, 0x2ac278a6, 0x2b07788d, 0x2b4b7875, 0x2b90785c,
- 0x2bd47843, 0x2c19782a, 0x2c5e7810, 0x2ca477f7, 0x2ce977dd, 0x2d2e77c3, 0x2d7477a8, 0x2dba778e,
- 0x2dff7773, 0x2e457758, 0x2e8b773d, 0x2ed27721, 0x2f187706, 0x2f5e76ea, 0x2fa576cd, 0x2fec76b1,
- 0x30327694, 0x30797677, 0x30c0765a, 0x3107763d, 0x314e761f, 0x31967601, 0x31dd75e3, 0x322575c5,
- 0x326c75a6, 0x32b47588, 0x32fc7569, 0x33447549, 0x338c752a, 0x33d4750a, 0x341c74ea, 0x346474ca,
- 0x34ac74a9, 0x34f57488, 0x353d7467, 0x35857446, 0x35ce7424, 0x36177403, 0x365f73e1, 0x36a873be,
- 0x36f1739c, 0x373a7379, 0x37837356, 0x37cc7333, 0x3815730f, 0x385e72ec, 0x38a772c8, 0x38f172a3,
- 0x393a727f, 0x3983725a, 0x39cd7235, 0x3a167210, 0x3a6071ea, 0x3aa971c4, 0x3af3719e, 0x3b3c7178,
- 0x3b867151, 0x3bd0712b, 0x3c197104, 0x3c6370dc, 0x3cad70b5, 0x3cf7708d, 0x3d407065, 0x3d8a703c,
- 0x3dd47014, 0x3e1e6feb, 0x3e686fc2, 0x3eb16f98, 0x3efb6f6f, 0x3f456f45, 0x3f8f6f1b, 0x3fd96ef0,
- 0x40236ec6, 0x406d6e9b, 0x40b66e70, 0x41006e44, 0x414a6e19, 0x41946ded, 0x41de6dc1, 0x42286d94,
- 0x42716d68, 0x42bb6d3b, 0x43056d0d, 0x434f6ce0, 0x43986cb2, 0x43e26c84, 0x442c6c56, 0x44756c28,
- 0x44bf6bf9, 0x45086bca, 0x45526b9b, 0x459b6b6b, 0x45e56b3c, 0x462e6b0c, 0x46786adb, 0x46c16aab,
- 0x470a6a7a, 0x47536a49, 0x479c6a18, 0x47e569e7, 0x482e69b5, 0x48776983, 0x48c06951, 0x4909691e,
- 0x495268ec, 0x499b68b9, 0x49e36885, 0x4a2c6852, 0x4a74681e, 0x4abd67ea, 0x4b0567b6, 0x4b4d6782,
- 0x4b95674d, 0x4bde6718, 0x4c2666e3, 0x4c6d66ae, 0x4cb56678, 0x4cfd6642, 0x4d45660c, 0x4d8c65d6,
- 0x4dd4659f, 0x4e1b6568, 0x4e626531, 0x4ea964fa, 0x4ef064c3, 0x4f37648b, 0x4f7e6453, 0x4fc5641b,
- 0x500b63e2, 0x505263aa, 0x50986371, 0x50df6338, 0x512562fe, 0x516b62c5, 0x51b1628b, 0x51f66251,
- 0x523c6217, 0x528161dc, 0x52c761a2, 0x530c6167, 0x5351612c, 0x539660f1, 0x53db60b5, 0x54206079,
- 0x5464603d, 0x54a96001, 0x54ed5fc5, 0x55315f88, 0x55755f4b, 0x55b95f0e, 0x55fc5ed1, 0x56405e94,
- 0x56835e56, 0x56c75e18, 0x570a5dda, 0x574d5d9c, 0x578f5d5e, 0x57d25d1f, 0x58145ce0, 0x58565ca1,
- 0x58995c62, 0x58da5c23, 0x591c5be3, 0x595e5ba4, 0x599f5b64, 0x59e05b24, 0x5a215ae3, 0x5a625aa3
-};
-
-
-/*
- form factor
-*/
-/* sqrt(((i+(1<<(FF_SQRT_BITS-2)+0.5)/2^31) */
-const Word32 formfac_sqrttable[96] = {
- 0x000407f8, 0x000417b9, 0x0004273f, 0x0004368c, 0x000445a1, 0x00045483, 0x00046332, 0x000471b0,
- 0x00048000, 0x00048e22, 0x00049c1a, 0x0004a9e7, 0x0004b78c, 0x0004c50a, 0x0004d263, 0x0004df96,
- 0x0004eca7, 0x0004f995, 0x00050662, 0x0005130e, 0x00051f9c, 0x00052c0a, 0x0005385b, 0x00054490,
- 0x000550a8, 0x00055ca5, 0x00056888, 0x00057450, 0x00058000, 0x00058b96, 0x00059715, 0x0005a27c,
- 0x0005adcc, 0x0005b906, 0x0005c42b, 0x0005cf39, 0x0005da33, 0x0005e519, 0x0005efea, 0x0005faa8,
- 0x00060552, 0x00060fea, 0x00061a70, 0x000624e3, 0x00062f45, 0x00063996, 0x000643d5, 0x00064e04,
- 0x00065823, 0x00066231, 0x00066c30, 0x0006761f, 0x00068000, 0x000689d1, 0x00069393, 0x00069d47,
- 0x0006a6ed, 0x0006b085, 0x0006ba10, 0x0006c38d, 0x0006ccfc, 0x0006d65f, 0x0006dfb5, 0x0006e8fe,
- 0x0006f23b, 0x0006fb6c, 0x00070490, 0x00070da9, 0x000716b6, 0x00071fb8, 0x000728ae, 0x00073199,
- 0x00073a79, 0x0007434e, 0x00074c19, 0x000754d9, 0x00075d8e, 0x0007663a, 0x00076edb, 0x00077772,
- 0x00078000, 0x00078883, 0x000790fd, 0x0007996e, 0x0007a1d5, 0x0007aa33, 0x0007b288, 0x0007bad4,
- 0x0007c318, 0x0007cb52, 0x0007d384, 0x0007dbad, 0x0007e3ce, 0x0007ebe6, 0x0007f3f6, 0x0007fbfe
-};
-
-
-
-/*!
- \name quantizer and inverse quantizer tables
-
- \brief these tables are used for the non
- linear quantizer and inverse quantizer
-
-*/
-const Word32 mTab_3_4[512] = {
- 0x4c1bf829, 0x4c3880de, 0x4c550603, 0x4c71879c,
- 0x4c8e05aa, 0x4caa8030, 0x4cc6f72f, 0x4ce36aab,
- 0x4cffdaa4, 0x4d1c471d, 0x4d38b019, 0x4d55159a,
- 0x4d7177a1, 0x4d8dd631, 0x4daa314b, 0x4dc688f3,
- 0x4de2dd2a, 0x4dff2df2, 0x4e1b7b4d, 0x4e37c53d,
- 0x4e540bc5, 0x4e704ee6, 0x4e8c8ea3, 0x4ea8cafd,
- 0x4ec503f7, 0x4ee13992, 0x4efd6bd0, 0x4f199ab4,
- 0x4f35c640, 0x4f51ee75, 0x4f6e1356, 0x4f8a34e4,
- 0x4fa65321, 0x4fc26e10, 0x4fde85b2, 0x4ffa9a0a,
- 0x5016ab18, 0x5032b8e0, 0x504ec362, 0x506acaa1,
- 0x5086cea0, 0x50a2cf5e, 0x50becce0, 0x50dac725,
- 0x50f6be31, 0x5112b205, 0x512ea2a3, 0x514a900d,
- 0x51667a45, 0x5182614c, 0x519e4524, 0x51ba25cf,
- 0x51d60350, 0x51f1dda7, 0x520db4d6, 0x522988e0,
- 0x524559c6, 0x52612789, 0x527cf22d, 0x5298b9b1,
- 0x52b47e19, 0x52d03f65, 0x52ebfd98, 0x5307b8b4,
- 0x532370b9, 0x533f25aa, 0x535ad789, 0x53768656,
- 0x53923215, 0x53addac6, 0x53c9806b, 0x53e52306,
- 0x5400c298, 0x541c5f24, 0x5437f8ab, 0x54538f2e,
- 0x546f22af, 0x548ab330, 0x54a640b3, 0x54c1cb38,
- 0x54dd52c2, 0x54f8d753, 0x551458eb, 0x552fd78d,
- 0x554b5339, 0x5566cbf3, 0x558241bb, 0x559db492,
- 0x55b9247b, 0x55d49177, 0x55effb87, 0x560b62ad,
- 0x5626c6eb, 0x56422842, 0x565d86b4, 0x5678e242,
- 0x56943aee, 0x56af90b9, 0x56cae3a4, 0x56e633b2,
- 0x570180e4, 0x571ccb3b, 0x573812b8, 0x5753575e,
- 0x576e992e, 0x5789d829, 0x57a51450, 0x57c04da6,
- 0x57db842b, 0x57f6b7e1, 0x5811e8c9, 0x582d16e6,
- 0x58484238, 0x58636ac0, 0x587e9081, 0x5899b37c,
- 0x58b4d3b1, 0x58cff123, 0x58eb0bd3, 0x590623c2,
- 0x592138f2, 0x593c4b63, 0x59575b19, 0x59726812,
- 0x598d7253, 0x59a879da, 0x59c37eab, 0x59de80c6,
- 0x59f9802d, 0x5a147ce0, 0x5a2f76e2, 0x5a4a6e34,
- 0x5a6562d6, 0x5a8054cb, 0x5a9b4414, 0x5ab630b2,
- 0x5ad11aa6, 0x5aec01f1, 0x5b06e696, 0x5b21c895,
- 0x5b3ca7ef, 0x5b5784a6, 0x5b725ebc, 0x5b8d3631,
- 0x5ba80b06, 0x5bc2dd3e, 0x5bddacd9, 0x5bf879d8,
- 0x5c13443d, 0x5c2e0c09, 0x5c48d13e, 0x5c6393dc,
- 0x5c7e53e5, 0x5c99115a, 0x5cb3cc3c, 0x5cce848d,
- 0x5ce93a4e, 0x5d03ed80, 0x5d1e9e24, 0x5d394c3b,
- 0x5d53f7c7, 0x5d6ea0c9, 0x5d894742, 0x5da3eb33,
- 0x5dbe8c9e, 0x5dd92b84, 0x5df3c7e5, 0x5e0e61c3,
- 0x5e28f920, 0x5e438dfc, 0x5e5e2059, 0x5e78b037,
- 0x5e933d99, 0x5eadc87e, 0x5ec850e9, 0x5ee2d6da,
- 0x5efd5a53, 0x5f17db54, 0x5f3259e0, 0x5f4cd5f6,
- 0x5f674f99, 0x5f81c6c8, 0x5f9c3b87, 0x5fb6add4,
- 0x5fd11db3, 0x5feb8b23, 0x6005f626, 0x60205ebd,
- 0x603ac4e9, 0x605528ac, 0x606f8a05, 0x6089e8f7,
- 0x60a44583, 0x60be9fa9, 0x60d8f76b, 0x60f34cca,
- 0x610d9fc7, 0x6127f062, 0x61423e9e, 0x615c8a7a,
- 0x6176d3f9, 0x61911b1b, 0x61ab5fe1, 0x61c5a24d,
- 0x61dfe25f, 0x61fa2018, 0x62145b7a, 0x622e9485,
- 0x6248cb3b, 0x6262ff9d, 0x627d31ab, 0x62976167,
- 0x62b18ed1, 0x62cbb9eb, 0x62e5e2b6, 0x63000933,
- 0x631a2d62, 0x63344f45, 0x634e6edd, 0x63688c2b,
- 0x6382a730, 0x639cbfec, 0x63b6d661, 0x63d0ea90,
- 0x63eafc7a, 0x64050c1f, 0x641f1982, 0x643924a2,
- 0x64532d80, 0x646d341f, 0x6487387e, 0x64a13a9e,
- 0x64bb3a81, 0x64d53828, 0x64ef3393, 0x65092cc4,
- 0x652323bb, 0x653d1879, 0x65570b00, 0x6570fb50,
- 0x658ae96b, 0x65a4d550, 0x65bebf01, 0x65d8a680,
- 0x65f28bcc, 0x660c6ee8, 0x66264fd3, 0x66402e8f,
- 0x665a0b1c, 0x6673e57d, 0x668dbdb0, 0x66a793b8,
- 0x66c16795, 0x66db3949, 0x66f508d4, 0x670ed636,
- 0x6728a172, 0x67426a87, 0x675c3177, 0x6775f643,
- 0x678fb8eb, 0x67a97971, 0x67c337d5, 0x67dcf418,
- 0x67f6ae3b, 0x6810663f, 0x682a1c25, 0x6843cfed,
- 0x685d8199, 0x68773129, 0x6890de9f, 0x68aa89fa,
- 0x68c4333d, 0x68ddda67, 0x68f77f7a, 0x69112277,
- 0x692ac35e, 0x69446230, 0x695dfeee, 0x6977999a,
- 0x69913232, 0x69aac8ba, 0x69c45d31, 0x69ddef98,
- 0x69f77ff0, 0x6a110e3a, 0x6a2a9a77, 0x6a4424a8,
- 0x6a5daccc, 0x6a7732e6, 0x6a90b6f6, 0x6aaa38fd,
- 0x6ac3b8fb, 0x6add36f2, 0x6af6b2e2, 0x6b102ccd,
- 0x6b29a4b2, 0x6b431a92, 0x6b5c8e6f, 0x6b76004a,
- 0x6b8f7022, 0x6ba8ddf9, 0x6bc249d0, 0x6bdbb3a7,
- 0x6bf51b80, 0x6c0e815a, 0x6c27e537, 0x6c414718,
- 0x6c5aa6fd, 0x6c7404e7, 0x6c8d60d7, 0x6ca6bace,
- 0x6cc012cc, 0x6cd968d2, 0x6cf2bce1, 0x6d0c0ef9,
- 0x6d255f1d, 0x6d3ead4b, 0x6d57f985, 0x6d7143cc,
- 0x6d8a8c21, 0x6da3d283, 0x6dbd16f5, 0x6dd65976,
- 0x6def9a08, 0x6e08d8ab, 0x6e221560, 0x6e3b5027,
- 0x6e548902, 0x6e6dbff1, 0x6e86f4f5, 0x6ea0280e,
- 0x6eb9593e, 0x6ed28885, 0x6eebb5e3, 0x6f04e15a,
- 0x6f1e0aea, 0x6f373294, 0x6f505859, 0x6f697c39,
- 0x6f829e35, 0x6f9bbe4e, 0x6fb4dc85, 0x6fcdf8d9,
- 0x6fe7134d, 0x70002be0, 0x70194293, 0x70325767,
- 0x704b6a5d, 0x70647b76, 0x707d8ab1, 0x70969811,
- 0x70afa394, 0x70c8ad3d, 0x70e1b50c, 0x70fabb01,
- 0x7113bf1d, 0x712cc161, 0x7145c1ce, 0x715ec064,
- 0x7177bd24, 0x7190b80f, 0x71a9b124, 0x71c2a866,
- 0x71db9dd4, 0x71f49170, 0x720d8339, 0x72267331,
- 0x723f6159, 0x72584db0, 0x72713838, 0x728a20f1,
- 0x72a307db, 0x72bbecf9, 0x72d4d049, 0x72edb1ce,
- 0x73069187, 0x731f6f75, 0x73384b98, 0x735125f3,
- 0x7369fe84, 0x7382d54d, 0x739baa4e, 0x73b47d89,
- 0x73cd4efd, 0x73e61eab, 0x73feec94, 0x7417b8b8,
- 0x74308319, 0x74494bb6, 0x74621291, 0x747ad7aa,
- 0x74939b02, 0x74ac5c98, 0x74c51c6f, 0x74ddda86,
- 0x74f696de, 0x750f5178, 0x75280a54, 0x7540c174,
- 0x755976d7, 0x75722a7e, 0x758adc69, 0x75a38c9b,
- 0x75bc3b12, 0x75d4e7cf, 0x75ed92d4, 0x76063c21,
- 0x761ee3b6, 0x76378994, 0x76502dbc, 0x7668d02e,
- 0x768170eb, 0x769a0ff3, 0x76b2ad47, 0x76cb48e7,
- 0x76e3e2d5, 0x76fc7b10, 0x7715119a, 0x772da673,
- 0x7746399b, 0x775ecb13, 0x77775adc, 0x778fe8f6,
- 0x77a87561, 0x77c1001f, 0x77d98930, 0x77f21095,
- 0x780a964d, 0x78231a5b, 0x783b9cbd, 0x78541d75,
- 0x786c9c84, 0x788519e9, 0x789d95a6, 0x78b60fbb,
- 0x78ce8828, 0x78e6feef, 0x78ff740f, 0x7917e78a,
- 0x7930595f, 0x7948c990, 0x7961381d, 0x7979a506,
- 0x7992104c, 0x79aa79f0, 0x79c2e1f1, 0x79db4852,
- 0x79f3ad11, 0x7a0c1031, 0x7a2471b0, 0x7a3cd191,
- 0x7a552fd3, 0x7a6d8c76, 0x7a85e77d, 0x7a9e40e6,
- 0x7ab698b2, 0x7aceeee3, 0x7ae74378, 0x7aff9673,
- 0x7b17e7d2, 0x7b303799, 0x7b4885c5, 0x7b60d259,
- 0x7b791d55, 0x7b9166b9, 0x7ba9ae86, 0x7bc1f4bc,
- 0x7bda395c, 0x7bf27c66, 0x7c0abddb, 0x7c22fdbb,
- 0x7c3b3c07, 0x7c5378c0, 0x7c6bb3e5, 0x7c83ed78,
- 0x7c9c2579, 0x7cb45be9, 0x7ccc90c7, 0x7ce4c414,
- 0x7cfcf5d2, 0x7d152600, 0x7d2d549f, 0x7d4581b0,
- 0x7d5dad32, 0x7d75d727, 0x7d8dff8f, 0x7da6266a,
- 0x7dbe4bba, 0x7dd66f7d, 0x7dee91b6, 0x7e06b264,
- 0x7e1ed188, 0x7e36ef22, 0x7e4f0b34, 0x7e6725bd,
- 0x7e7f3ebd, 0x7e975636, 0x7eaf6c28, 0x7ec78093,
- 0x7edf9378, 0x7ef7a4d7, 0x7f0fb4b1, 0x7f27c307,
- 0x7f3fcfd8, 0x7f57db25, 0x7f6fe4ef, 0x7f87ed36,
- 0x7f9ff3fb, 0x7fb7f93e, 0x7fcffcff, 0x7fe7ff40
-};
-
-const Word32 mTab_4_3[512]={
- 0x32cbfd4a, 0x32eddd70, 0x330fc339, 0x3331aea3,
- 0x33539fac, 0x33759652, 0x33979294, 0x33b99470,
- 0x33db9be4, 0x33fda8ed, 0x341fbb8b, 0x3441d3bb,
- 0x3463f17c, 0x348614cc, 0x34a83da8, 0x34ca6c10,
- 0x34eca001, 0x350ed979, 0x35311877, 0x35535cfa,
- 0x3575a6fe, 0x3597f683, 0x35ba4b87, 0x35dca607,
- 0x35ff0603, 0x36216b78, 0x3643d665, 0x366646c7,
- 0x3688bc9e, 0x36ab37e8, 0x36cdb8a2, 0x36f03ecb,
- 0x3712ca62, 0x37355b64, 0x3757f1d1, 0x377a8da5,
- 0x379d2ee0, 0x37bfd580, 0x37e28184, 0x380532e8,
- 0x3827e9ad, 0x384aa5d0, 0x386d674f, 0x38902e2a,
- 0x38b2fa5d, 0x38d5cbe9, 0x38f8a2ca, 0x391b7eff,
- 0x393e6088, 0x39614761, 0x3984338a, 0x39a72501,
- 0x39ca1bc4, 0x39ed17d1, 0x3a101928, 0x3a331fc6,
- 0x3a562baa, 0x3a793cd2, 0x3a9c533d, 0x3abf6ee9,
- 0x3ae28fd5, 0x3b05b5ff, 0x3b28e165, 0x3b4c1206,
- 0x3b6f47e0, 0x3b9282f2, 0x3bb5c33a, 0x3bd908b7,
- 0x3bfc5368, 0x3c1fa349, 0x3c42f85b, 0x3c66529c,
- 0x3c89b209, 0x3cad16a2, 0x3cd08065, 0x3cf3ef51,
- 0x3d176364, 0x3d3adc9c, 0x3d5e5af8, 0x3d81de77,
- 0x3da56717, 0x3dc8f4d6, 0x3dec87b4, 0x3e101fae,
- 0x3e33bcc3, 0x3e575ef2, 0x3e7b063a, 0x3e9eb298,
- 0x3ec2640c, 0x3ee61a93, 0x3f09d62d, 0x3f2d96d8,
- 0x3f515c93, 0x3f75275b, 0x3f98f731, 0x3fbccc11,
- 0x3fe0a5fc, 0x400484ef, 0x402868ea, 0x404c51e9,
- 0x40703fee, 0x409432f5, 0x40b82afd, 0x40dc2806,
- 0x41002a0d, 0x41243111, 0x41483d12, 0x416c4e0d,
- 0x41906401, 0x41b47eed, 0x41d89ecf, 0x41fcc3a7,
- 0x4220ed72, 0x42451c30, 0x42694fde, 0x428d887d,
- 0x42b1c609, 0x42d60883, 0x42fa4fe8, 0x431e9c37,
- 0x4342ed70, 0x43674390, 0x438b9e96, 0x43affe82,
- 0x43d46351, 0x43f8cd03, 0x441d3b95, 0x4441af08,
- 0x44662758, 0x448aa487, 0x44af2690, 0x44d3ad75,
- 0x44f83933, 0x451cc9c8, 0x45415f35, 0x4565f977,
- 0x458a988d, 0x45af3c76, 0x45d3e531, 0x45f892bc,
- 0x461d4516, 0x4641fc3e, 0x4666b832, 0x468b78f2,
- 0x46b03e7c, 0x46d508cf, 0x46f9d7e9, 0x471eabca,
- 0x47438470, 0x476861d9, 0x478d4406, 0x47b22af3,
- 0x47d716a1, 0x47fc070e, 0x4820fc39, 0x4845f620,
- 0x486af4c3, 0x488ff820, 0x48b50035, 0x48da0d03,
- 0x48ff1e87, 0x492434c0, 0x49494fad, 0x496e6f4d,
- 0x4993939f, 0x49b8bca2, 0x49ddea54, 0x4a031cb4,
- 0x4a2853c1, 0x4a4d8f7a, 0x4a72cfde, 0x4a9814eb,
- 0x4abd5ea1, 0x4ae2acfd, 0x4b080000, 0x4b2d57a8,
- 0x4b52b3f3, 0x4b7814e1, 0x4b9d7a70, 0x4bc2e49f,
- 0x4be8536e, 0x4c0dc6db, 0x4c333ee4, 0x4c58bb89,
- 0x4c7e3cc9, 0x4ca3c2a2, 0x4cc94d14, 0x4ceedc1c,
- 0x4d146fbb, 0x4d3a07ef, 0x4d5fa4b6, 0x4d854611,
- 0x4daaebfd, 0x4dd09679, 0x4df64585, 0x4e1bf91f,
- 0x4e41b146, 0x4e676dfa, 0x4e8d2f38, 0x4eb2f501,
- 0x4ed8bf52, 0x4efe8e2b, 0x4f24618a, 0x4f4a3970,
- 0x4f7015d9, 0x4f95f6c6, 0x4fbbdc36, 0x4fe1c626,
- 0x5007b497, 0x502da787, 0x50539ef5, 0x50799ae1,
- 0x509f9b48, 0x50c5a02a, 0x50eba985, 0x5111b75a,
- 0x5137c9a6, 0x515de069, 0x5183fba2, 0x51aa1b4f,
- 0x51d03f70, 0x51f66803, 0x521c9508, 0x5242c67d,
- 0x5268fc62, 0x528f36b5, 0x52b57575, 0x52dbb8a2,
- 0x5302003a, 0x53284c3c, 0x534e9ca8, 0x5374f17c,
- 0x539b4ab7, 0x53c1a858, 0x53e80a5f, 0x540e70ca,
- 0x5434db98, 0x545b4ac8, 0x5481be5a, 0x54a8364b,
- 0x54ceb29c, 0x54f5334c, 0x551bb858, 0x554241c1,
- 0x5568cf85, 0x558f61a3, 0x55b5f81b, 0x55dc92eb,
- 0x56033212, 0x5629d590, 0x56507d63, 0x5677298a,
- 0x569dda05, 0x56c48ed3, 0x56eb47f2, 0x57120562,
- 0x5738c721, 0x575f8d2f, 0x5786578a, 0x57ad2633,
- 0x57d3f927, 0x57fad066, 0x5821abef, 0x58488bc0,
- 0x586f6fda, 0x5896583b, 0x58bd44e2, 0x58e435ce,
- 0x590b2aff, 0x59322473, 0x59592229, 0x59802420,
- 0x59a72a59, 0x59ce34d0, 0x59f54387, 0x5a1c567b,
- 0x5a436dac, 0x5a6a8919, 0x5a91a8c1, 0x5ab8cca3,
- 0x5adff4be, 0x5b072111, 0x5b2e519c, 0x5b55865e,
- 0x5b7cbf54, 0x5ba3fc80, 0x5bcb3ddf, 0x5bf28371,
- 0x5c19cd35, 0x5c411b2a, 0x5c686d4f, 0x5c8fc3a4,
- 0x5cb71e27, 0x5cde7cd7, 0x5d05dfb4, 0x5d2d46bd,
- 0x5d54b1f0, 0x5d7c214e, 0x5da394d4, 0x5dcb0c83,
- 0x5df28859, 0x5e1a0856, 0x5e418c78, 0x5e6914be,
- 0x5e90a129, 0x5eb831b7, 0x5edfc667, 0x5f075f38,
- 0x5f2efc29, 0x5f569d3a, 0x5f7e426a, 0x5fa5ebb7,
- 0x5fcd9921, 0x5ff54aa8, 0x601d004a, 0x6044ba06,
- 0x606c77dc, 0x609439ca, 0x60bbffd0, 0x60e3c9ee,
- 0x610b9821, 0x61336a6a, 0x615b40c8, 0x61831b39,
- 0x61aaf9bd, 0x61d2dc53, 0x61fac2fa, 0x6222adb2,
- 0x624a9c79, 0x62728f4f, 0x629a8633, 0x62c28123,
- 0x62ea8020, 0x63128329, 0x633a8a3c, 0x63629559,
- 0x638aa47f, 0x63b2b7ad, 0x63dacee2, 0x6402ea1e,
- 0x642b0960, 0x64532ca6, 0x647b53f1, 0x64a37f3f,
- 0x64cbae8f, 0x64f3e1e2, 0x651c1935, 0x65445488,
- 0x656c93db, 0x6594d72c, 0x65bd1e7b, 0x65e569c7,
- 0x660db90f, 0x66360c53, 0x665e6391, 0x6686bec9,
- 0x66af1dfa, 0x66d78123, 0x66ffe844, 0x6728535b,
- 0x6750c268, 0x6779356b, 0x67a1ac62, 0x67ca274c,
- 0x67f2a629, 0x681b28f9, 0x6843afb9, 0x686c3a6a,
- 0x6894c90b, 0x68bd5b9b, 0x68e5f219, 0x690e8c84,
- 0x69372add, 0x695fcd21, 0x69887350, 0x69b11d6a,
- 0x69d9cb6d, 0x6a027d5a, 0x6a2b332f, 0x6a53eceb,
- 0x6a7caa8d, 0x6aa56c16, 0x6ace3184, 0x6af6fad6,
- 0x6b1fc80c, 0x6b489925, 0x6b716e20, 0x6b9a46fd,
- 0x6bc323bb, 0x6bec0458, 0x6c14e8d5, 0x6c3dd130,
- 0x6c66bd69, 0x6c8fad80, 0x6cb8a172, 0x6ce19940,
- 0x6d0a94e9, 0x6d33946d, 0x6d5c97ca, 0x6d859eff,
- 0x6daeaa0d, 0x6dd7b8f1, 0x6e00cbad, 0x6e29e23e,
- 0x6e52fca4, 0x6e7c1adf, 0x6ea53cee, 0x6ece62cf,
- 0x6ef78c83, 0x6f20ba09, 0x6f49eb5f, 0x6f732085,
- 0x6f9c597b, 0x6fc59640, 0x6feed6d3, 0x70181b33,
- 0x70416360, 0x706aaf59, 0x7093ff1d, 0x70bd52ab,
- 0x70e6aa04, 0x71100525, 0x7139640f, 0x7162c6c1,
- 0x718c2d3a, 0x71b5977a, 0x71df057f, 0x72087749,
- 0x7231ecd8, 0x725b662a, 0x7284e33f, 0x72ae6417,
- 0x72d7e8b0, 0x7301710a, 0x732afd24, 0x73548cfe,
- 0x737e2097, 0x73a7b7ee, 0x73d15303, 0x73faf1d5,
- 0x74249462, 0x744e3aac, 0x7477e4b0, 0x74a1926e,
- 0x74cb43e6, 0x74f4f917, 0x751eb201, 0x75486ea1,
- 0x75722ef9, 0x759bf307, 0x75c5baca, 0x75ef8642,
- 0x7619556f, 0x7643284f, 0x766cfee2, 0x7696d928,
- 0x76c0b71f, 0x76ea98c7, 0x77147e20, 0x773e6728,
- 0x776853df, 0x77924445, 0x77bc3858, 0x77e63019,
- 0x78102b85, 0x783a2a9e, 0x78642d62, 0x788e33d1,
- 0x78b83de9, 0x78e24bab, 0x790c5d15, 0x79367228,
- 0x79608ae1, 0x798aa742, 0x79b4c748, 0x79deeaf4,
- 0x7a091245, 0x7a333d3a, 0x7a5d6bd2, 0x7a879e0e,
- 0x7ab1d3ec, 0x7adc0d6b, 0x7b064a8c, 0x7b308b4d,
- 0x7b5acfae, 0x7b8517ae, 0x7baf634c, 0x7bd9b289,
- 0x7c040563, 0x7c2e5bda, 0x7c58b5ec, 0x7c83139b,
- 0x7cad74e4, 0x7cd7d9c7, 0x7d024244, 0x7d2cae5a,
- 0x7d571e09, 0x7d81914f, 0x7dac082d, 0x7dd682a1,
- 0x7e0100ac, 0x7e2b824b, 0x7e560780, 0x7e809048,
- 0x7eab1ca5, 0x7ed5ac94, 0x7f004015, 0x7f2ad729,
- 0x7f5571cd, 0x7f801003, 0x7faab1c8, 0x7fd5571d
-};
-
-
-const Word32 invSBF[24] = {
- 0x3FFD34FC, 0x2D3F8000, 0x24F18C7E, 0x1FFE9A7E,
- 0x1C9DF10C, 0x1A1F851A, 0x182FE994, 0x169FC000,
- 0x15542AAA, 0x143C31C2, 0x134B1B6C, 0x127920BE,
- 0x11BF2FCC, 0x111A749E, 0x1085FC42, 0x0FFFA7BE,
- 0x0F855818, 0x0F14EE56, 0x0EAE6A78, 0x0E4EF886,
- 0x0DF69880, 0x0DA49568, 0x0D578542, 0x0D101D0C
-};
-
-const Word16 pow2tominusNover16[17] = {
- 0x7fff, 0x7a93, 0x7560, 0x7066,
- 0x6ba2, 0x6712, 0x62b4, 0x5e84,
- 0x5a82, 0x56ac, 0x52ff, 0x4f7b,
- 0x4c1c, 0x48e2, 0x45cb, 0x42d5,
- 0x4000
-};
-
-const Word16 sideInfoTabLong[MAX_SFB_LONG + 1] = {
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 9, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14, 14, 14, 14, 14,
- 14, 14, 14
-};
-
-const Word16 sideInfoTabShort[MAX_SFB_SHORT + 1] = {
- 7, 7, 7, 7, 7, 7, 7, 10, 10,
- 10, 10, 10, 10, 10, 13, 13
-};
-
-const Word32 specExpMantTableComb_enc[4][14] =
-{
- {0x40000000, 0x50a28be6, 0x6597fa95, 0x40000000,
- 0x50a28be6, 0x6597fa95, 0x40000000, 0x50a28be6,
- 0x6597fa95, 0x40000000, 0x50a28be6, 0x6597fa95,
- 0x40000000, 0x50a28be6},
-
- {0x4c1bf829, 0x5fe4435e, 0x78d0df9c, 0x4c1bf829,
- 0x5fe4435e, 0x78d0df9c, 0x4c1bf829, 0x5fe4435e,
- 0x78d0df9c, 0x4c1bf829, 0x5fe4435e, 0x78d0df9c,
- 0x4c1bf829, 0x5fe4435e},
-
- {0x5a82799a, 0x7208f81d, 0x47d66b0f, 0x5a82799a,
- 0x7208f81d, 0x47d66b0f, 0x5a82799a, 0x7208f81d,
- 0x47d66b0f, 0x5a82799a, 0x7208f81d, 0x47d66b0f,
- 0x5a82799a, 0x7208f81d},
-
- {0x6ba27e65, 0x43ce3e4b, 0x556e0424, 0x6ba27e65,
- 0x43ce3e4b, 0x556e0424, 0x6ba27e65, 0x43ce3e4b,
- 0x556e0424, 0x6ba27e65, 0x43ce3e4b, 0x556e0424,
- 0x6ba27e65, 0x43ce3e4b}
-};
-
-const UWord8 specExpTableComb_enc[4][14] =
-{
- {1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18},
- {1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18},
- {1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18},
- {1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19}
-};
-
-const Word16 quantBorders[4][4] = {
- /* pow(1.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
- {0x0400, 0x0ee7, 0x1c86, 0x2c0d},
- /* pow(2.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
- {0x04c2, 0x11b9, 0x21eb, 0x3463},
- /* pow(3.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
- {0x05a8, 0x1514, 0x2856, 0x3e4c},
- /* pow(4.0-0.4054, 4/3)/16 * pow(2, (0..3)/4) */
- {0x06ba, 0x1911, 0x2ff8, 0x4a16},
-};
-
-const Word16 quantRecon[4][3] = {
- {0x0800, 0x1429, 0x229d},
- {0x0983, 0x17f9, 0x292a},
- {0x0b50, 0x1c82, 0x30f4},
- {0x0d74, 0x21e7, 0x3a37},
-};
-
-const int sampRateTab[NUM_SAMPLE_RATES] = {
- 96000, 88200, 64000, 48000, 44100, 32000,
- 24000, 22050, 16000, 12000, 11025, 8000
-};
-
-
-const int rates[8] = {
- 160, 240, 320, 400, 480, 560, 640, 0
-};
-
-const int BandwithCoefTab[8][NUM_SAMPLE_RATES] = {
- { 7000, 7000, 4666, 3500, 3500, 2800, 2800, 2800, 2800, 2000, 2000, 2000},
- {12000, 12000, 8000, 6000, 6000, 6000, 4000, 4000, 4000, 3000, 3000, 3000},
- {18000, 18000, 12000, 9000, 9000, 9000, 7000, 7000, 7000, 5000, 5000, 5000},
- {20000, 20000, 16000, 12000, 12000, 12000, 9000, 9000, 9000, 6000, 6000, 6000},
- {20000, 20000, 18666, 14000, 14000, 14000, 10000, 10000, 10000, 7000, 7000, 7000},
- {20000, 20000, 20000, 16000, 16000, 16000, 12000, 12000, 12000, 8000, 8000, 8000},
- {20000, 20000, 20000, 20000, 20000, 20000, 15000, 15000, 15000, 10000, 10000, 10000},
- {20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000}
-};
-
-
-/* total number of scale factor bands in one window */
-const UWord8 sfBandTotalShort[NUM_SAMPLE_RATES] = {
- 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15
-};
-
-const UWord8 sfBandTotalLong[NUM_SAMPLE_RATES] = {
- 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40
-};
-
-/* scale factor band tables */
-const int sfBandTabShortOffset[NUM_SAMPLE_RATES] = {0, 0, 0, 13, 13, 13, 28, 28, 44, 44, 44, 60};
-
-const short sfBandTabShort[76] = {
- /* short block 64, 88, 96 kHz [13] */
- 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128,
-
- /* short block 32, 44, 48 kHz [15] */
- 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128,
-
- /* short block 22, 24 kHz [16] */
- 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128,
-
- /* short block 11, 12, 16 kHz [16] */
- 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128,
-
- /* short block 8 kHz [16] */
- 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
-};
-
-const int sfBandTabLongOffset[NUM_SAMPLE_RATES] = {0, 0, 42, 90, 90, 140, 192, 192, 240, 240, 240, 284};
-
-const short sfBandTabLong[325] = {
- /* long block 88, 96 kHz [42] */
- 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52,
- 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212,
- 240, 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024,
-
- /* long block 64 kHz [48] */
- 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64,
- 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, 304, 344, 384,
- 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, 864, 904, 944, 984, 1024,
-
- /* long block 44, 48 kHz [50] */
- 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88,
- 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448,
- 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024,
-
- /* long block 32 kHz [52] */
- 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96,
- 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512,
- 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992, 1024,
-
- /* long block 22, 24 kHz [48] */
- 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76,
- 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284,
- 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960, 1024,
-
- /* long block 11, 12, 16 kHz [44] */
- 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124,
- 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368,
- 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024,
-
- /* long block 8 kHz [41] */
- 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156,
- 172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420,
- 448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024
-};
-
-/*
- these tables are used only for counting and
- are stored in packed format
-*/
-const UWord16 huff_ltab1_2[3][3][3][3]=
-{
- {
- {
- {0x0b09,0x0907,0x0b09},
- {0x0a08,0x0706,0x0a08},
- {0x0b09,0x0908,0x0b09}
- },
- {
- {0x0a08,0x0706,0x0a07},
- {0x0706,0x0505,0x0706},
- {0x0907,0x0706,0x0a08}
- },
- {
- {0x0b09,0x0907,0x0b08},
- {0x0908,0x0706,0x0908},
- {0x0b09,0x0907,0x0b09}
- }
- },
- {
- {
- {0x0908,0x0706,0x0907},
- {0x0706,0x0505,0x0706},
- {0x0907,0x0706,0x0908}
- },
- {
- {0x0706,0x0505,0x0706},
- {0x0505,0x0103,0x0505},
- {0x0706,0x0505,0x0706}
- },
- {
- {0x0908,0x0706,0x0907},
- {0x0706,0x0505,0x0706},
- {0x0908,0x0706,0x0908}
- }
- },
- {
- {
- {0x0b09,0x0907,0x0b09},
- {0x0908,0x0706,0x0908},
- {0x0b08,0x0907,0x0b09}
- },
- {
- {0x0a08,0x0706,0x0907},
- {0x0706,0x0504,0x0706},
- {0x0908,0x0706,0x0a07}
- },
- {
- {0x0b09,0x0907,0x0b09},
- {0x0a07,0x0706,0x0908},
- {0x0b09,0x0907,0x0b09}
- }
- }
-};
-
-
-const UWord16 huff_ltab3_4[3][3][3][3]=
-{
- {
- {
- {0x0104,0x0405,0x0808},
- {0x0405,0x0504,0x0808},
- {0x0909,0x0908,0x0a0b}
- },
- {
- {0x0405,0x0605,0x0908},
- {0x0605,0x0604,0x0908},
- {0x0908,0x0907,0x0a0a}
- },
- {
- {0x0909,0x0a08,0x0d0b},
- {0x0908,0x0908,0x0b0a},
- {0x0b0b,0x0a0a,0x0c0b}
- }
- },
- {
- {
- {0x0404,0x0605,0x0a08},
- {0x0604,0x0704,0x0a08},
- {0x0a08,0x0a08,0x0c0a}
- },
- {
- {0x0504,0x0704,0x0b08},
- {0x0604,0x0704,0x0a07},
- {0x0908,0x0907,0x0b09}
- },
- {
- {0x0908,0x0a08,0x0d0a},
- {0x0807,0x0907,0x0c09},
- {0x0a0a,0x0b09,0x0c0a}
- }
- },
- {
- {
- {0x0808,0x0a08,0x0f0b},
- {0x0908,0x0b07,0x0f0a},
- {0x0d0b,0x0e0a,0x100c}
- },
- {
- {0x0808,0x0a07,0x0e0a},
- {0x0907,0x0a07,0x0e09},
- {0x0c0a,0x0c09,0x0f0b}
- },
- {
- {0x0b0b,0x0c0a,0x100c},
- {0x0a0a,0x0b09,0x0f0b},
- {0x0c0b,0x0c0a,0x0f0b}
- }
- }
-};
-
-const UWord16 huff_ltab5_6[9][9]=
-{
- {0x0d0b,0x0c0a,0x0b09,0x0b09,0x0a09,0x0b09,0x0b09,0x0c0a,0x0d0b},
- {0x0c0a,0x0b09,0x0a08,0x0907,0x0807,0x0907,0x0a08,0x0b09,0x0c0a},
- {0x0c09,0x0a08,0x0906,0x0806,0x0706,0x0806,0x0906,0x0a08,0x0b09},
- {0x0b09,0x0907,0x0806,0x0504,0x0404,0x0504,0x0806,0x0907,0x0b09},
- {0x0a09,0x0807,0x0706,0x0404,0x0104,0x0404,0x0706,0x0807,0x0b09},
- {0x0b09,0x0907,0x0806,0x0504,0x0404,0x0504,0x0806,0x0907,0x0b09},
- {0x0b09,0x0a08,0x0906,0x0806,0x0706,0x0806,0x0906,0x0a08,0x0b09},
- {0x0c0a,0x0b09,0x0a08,0x0907,0x0807,0x0907,0x0a07,0x0b08,0x0c0a},
- {0x0d0b,0x0c0a,0x0c09,0x0b09,0x0a09,0x0a09,0x0b09,0x0c0a,0x0d0b}
-};
-
-const UWord16 huff_ltab7_8[8][8]=
-{
- {0x0105,0x0304,0x0605,0x0706,0x0807,0x0908,0x0a09,0x0b0a},
- {0x0304,0x0403,0x0604,0x0705,0x0806,0x0807,0x0907,0x0908},
- {0x0605,0x0604,0x0704,0x0805,0x0806,0x0907,0x0907,0x0a08},
- {0x0706,0x0705,0x0805,0x0806,0x0906,0x0907,0x0a08,0x0a08},
- {0x0807,0x0806,0x0906,0x0906,0x0a07,0x0a07,0x0a08,0x0b09},
- {0x0908,0x0807,0x0906,0x0907,0x0a07,0x0a08,0x0b08,0x0b0a},
- {0x0a09,0x0907,0x0907,0x0a08,0x0a08,0x0b08,0x0c09,0x0c09},
- {0x0b0a,0x0a08,0x0a08,0x0a08,0x0b09,0x0b09,0x0c09,0x0c0a}
-};
-
-const UWord16 huff_ltab9_10[13][13]=
-{
- {0x0106,0x0305,0x0606,0x0806,0x0907,0x0a08,0x0a09,0x0b0a,0x0b0a,0x0c0a,0x0c0b,0x0d0b,0x0d0c},
- {0x0305,0x0404,0x0604,0x0705,0x0806,0x0807,0x0907,0x0a08,0x0a08,0x0a09,0x0b0a,0x0c0a,0x0c0b},
- {0x0606,0x0604,0x0705,0x0805,0x0806,0x0906,0x0a07,0x0a08,0x0a08,0x0b09,0x0c09,0x0c0a,0x0c0a},
- {0x0806,0x0705,0x0805,0x0905,0x0906,0x0a07,0x0a07,0x0b08,0x0b08,0x0b09,0x0c09,0x0c0a,0x0d0a},
- {0x0907,0x0806,0x0906,0x0906,0x0a06,0x0a07,0x0b07,0x0b08,0x0b08,0x0c09,0x0c09,0x0c0a,0x0d0a},
- {0x0a08,0x0907,0x0906,0x0a07,0x0b07,0x0b07,0x0b08,0x0c08,0x0b08,0x0c09,0x0c0a,0x0d0a,0x0d0b},
- {0x0b09,0x0907,0x0a07,0x0b07,0x0b07,0x0b08,0x0c08,0x0c09,0x0c09,0x0c09,0x0d0a,0x0d0a,0x0d0b},
- {0x0b09,0x0a08,0x0a08,0x0b08,0x0b08,0x0c08,0x0c09,0x0d09,0x0d09,0x0d0a,0x0d0a,0x0d0b,0x0d0b},
- {0x0b09,0x0a08,0x0a08,0x0b08,0x0b08,0x0b08,0x0c09,0x0c09,0x0d0a,0x0d0a,0x0e0a,0x0d0b,0x0e0b},
- {0x0b0a,0x0a09,0x0b09,0x0b09,0x0c09,0x0c09,0x0c09,0x0c0a,0x0d0a,0x0d0a,0x0e0b,0x0e0b,0x0e0c},
- {0x0c0a,0x0b09,0x0b09,0x0c09,0x0c09,0x0c0a,0x0d0a,0x0d0a,0x0d0a,0x0e0b,0x0e0b,0x0e0b,0x0f0c},
- {0x0c0b,0x0b0a,0x0c09,0x0c0a,0x0c0a,0x0d0a,0x0d0a,0x0d0a,0x0d0b,0x0e0b,0x0e0b,0x0f0b,0x0f0c},
- {0x0d0b,0x0c0a,0x0c0a,0x0c0a,0x0d0a,0x0d0a,0x0d0a,0x0d0b,0x0e0b,0x0e0c,0x0e0c,0x0e0c,0x0f0c}
-};
-
-const UWord16 huff_ltab11[17][17]=
-{
- {0x0004,0x0005,0x0006,0x0007,0x0008,0x0008,0x0009,0x000a,0x000a,0x000a,0x000b,0x000b,0x000c,0x000b,0x000c,0x000c,0x000a},
- {0x0005,0x0004,0x0005,0x0006,0x0007,0x0007,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000b,0x0008},
- {0x0006,0x0005,0x0005,0x0006,0x0007,0x0007,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x0008},
- {0x0007,0x0006,0x0006,0x0006,0x0007,0x0007,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x0008},
- {0x0008,0x0007,0x0007,0x0007,0x0007,0x0008,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x0008},
- {0x0008,0x0007,0x0007,0x0007,0x0007,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x0008},
- {0x0009,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x0008},
- {0x0009,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x0008},
- {0x000a,0x0009,0x0008,0x0008,0x0009,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x0008},
- {0x000a,0x0009,0x0009,0x0009,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x0008},
- {0x000b,0x0009,0x0009,0x0009,0x0009,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000a,0x000b,0x000b,0x0008},
- {0x000b,0x000a,0x0009,0x0009,0x000a,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x0008},
- {0x000b,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x0009},
- {0x000b,0x000a,0x0009,0x0009,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x000b,0x0009},
- {0x000b,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x000b,0x0009},
- {0x000c,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000a,0x000b,0x000b,0x000b,0x000b,0x000b,0x000b,0x000c,0x000c,0x0009},
- {0x0009,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0008,0x0009,0x0005}
-};
-
-const UWord16 huff_ltabscf[121]=
-{
- 0x0012,
- 0x0012,
- 0x0012,
- 0x0012,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0012,
- 0x0013,
- 0x0012,
- 0x0011,
- 0x0011,
- 0x0010,
- 0x0011,
- 0x0010,
- 0x0010,
- 0x0010,
- 0x0010,
- 0x000f,
- 0x000f,
- 0x000e,
- 0x000e,
- 0x000e,
- 0x000e,
- 0x000e,
- 0x000e,
- 0x000d,
- 0x000d,
- 0x000c,
- 0x000c,
- 0x000c,
- 0x000b,
- 0x000c,
- 0x000b,
- 0x000a,
- 0x000a,
- 0x000a,
- 0x0009,
- 0x0009,
- 0x0008,
- 0x0008,
- 0x0008,
- 0x0007,
- 0x0006,
- 0x0006,
- 0x0005,
- 0x0004,
- 0x0003,
- 0x0001,
- 0x0004,
- 0x0004,
- 0x0005,
- 0x0006,
- 0x0006,
- 0x0007,
- 0x0007,
- 0x0008,
- 0x0008,
- 0x0009,
- 0x0009,
- 0x000a,
- 0x000a,
- 0x000a,
- 0x000b,
- 0x000b,
- 0x000b,
- 0x000b,
- 0x000c,
- 0x000c,
- 0x000d,
- 0x000d,
- 0x000d,
- 0x000e,
- 0x000e,
- 0x0010,
- 0x000f,
- 0x0010,
- 0x000f,
- 0x0012,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013,
- 0x0013
-};
-
-
-const UWord16 huff_ctab1[3][3][3][3]=
-{
- {
- {
- {0x07f8,0x01f1,0x07fd},
- {0x03f5,0x0068,0x03f0},
- {0x07f7,0x01ec,0x07f5}
- },
- {
- {0x03f1,0x0072,0x03f4},
- {0x0074,0x0011,0x0076},
- {0x01eb,0x006c,0x03f6}
- },
- {
- {0x07fc,0x01e1,0x07f1},
- {0x01f0,0x0061,0x01f6},
- {0x07f2,0x01ea,0x07fb}
- }
- },
- {
- {
- {0x01f2,0x0069,0x01ed},
- {0x0077,0x0017,0x006f},
- {0x01e6,0x0064,0x01e5}
- },
- {
- {0x0067,0x0015,0x0062},
- {0x0012,0x0000,0x0014},
- {0x0065,0x0016,0x006d}
- },
- {
- {0x01e9,0x0063,0x01e4},
- {0x006b,0x0013,0x0071},
- {0x01e3,0x0070,0x01f3}
- }
- },
- {
- {
- {0x07fe,0x01e7,0x07f3},
- {0x01ef,0x0060,0x01ee},
- {0x07f0,0x01e2,0x07fa}
- },
- {
- {0x03f3,0x006a,0x01e8},
- {0x0075,0x0010,0x0073},
- {0x01f4,0x006e,0x03f7}
- },
- {
- {0x07f6,0x01e0,0x07f9},
- {0x03f2,0x0066,0x01f5},
- {0x07ff,0x01f7,0x07f4}
- }
- }
-};
-
-const UWord16 huff_ctab2[3][3][3][3]=
-{
- {
- {
- {0x01f3,0x006f,0x01fd},
- {0x00eb,0x0023,0x00ea},
- {0x01f7,0x00e8,0x01fa}
- },
- {
- {0x00f2,0x002d,0x0070},
- {0x0020,0x0006,0x002b},
- {0x006e,0x0028,0x00e9}
- },
- {
- {0x01f9,0x0066,0x00f8},
- {0x00e7,0x001b,0x00f1},
- {0x01f4,0x006b,0x01f5}
- }
- },
- {
- {
- {0x00ec,0x002a,0x006c},
- {0x002c,0x000a,0x0027},
- {0x0067,0x001a,0x00f5}
- },
- {
- {0x0024,0x0008,0x001f},
- {0x0009,0x0000,0x0007},
- {0x001d,0x000b,0x0030}
- },
- {
- {0x00ef,0x001c,0x0064},
- {0x001e,0x000c,0x0029},
- {0x00f3,0x002f,0x00f0}
- }
- },
- {
- {
- {0x01fc,0x0071,0x01f2},
- {0x00f4,0x0021,0x00e6},
- {0x00f7,0x0068,0x01f8}
- },
- {
- {0x00ee,0x0022,0x0065},
- {0x0031,0x0002,0x0026},
- {0x00ed,0x0025,0x006a}
- },
- {
- {0x01fb,0x0072,0x01fe},
- {0x0069,0x002e,0x00f6},
- {0x01ff,0x006d,0x01f6}
- }
- }
-};
-
-const UWord16 huff_ctab3[3][3][3][3]=
-{
- {
- {
- {0x0000,0x0009,0x00ef},
- {0x000b,0x0019,0x00f0},
- {0x01eb,0x01e6,0x03f2}
- },
- {
- {0x000a,0x0035,0x01ef},
- {0x0034,0x0037,0x01e9},
- {0x01ed,0x01e7,0x03f3}
- },
- {
- {0x01ee,0x03ed,0x1ffa},
- {0x01ec,0x01f2,0x07f9},
- {0x07f8,0x03f8,0x0ff8}
- }
- },
- {
- {
- {0x0008,0x0038,0x03f6},
- {0x0036,0x0075,0x03f1},
- {0x03eb,0x03ec,0x0ff4}
- },
- {
- {0x0018,0x0076,0x07f4},
- {0x0039,0x0074,0x03ef},
- {0x01f3,0x01f4,0x07f6}
- },
- {
- {0x01e8,0x03ea,0x1ffc},
- {0x00f2,0x01f1,0x0ffb},
- {0x03f5,0x07f3,0x0ffc}
- }
- },
- {
- {
- {0x00ee,0x03f7,0x7ffe},
- {0x01f0,0x07f5,0x7ffd},
- {0x1ffb,0x3ffa,0xffff}
- },
- {
- {0x00f1,0x03f0,0x3ffc},
- {0x01ea,0x03ee,0x3ffb},
- {0x0ff6,0x0ffa,0x7ffc}
- },
- {
- {0x07f2,0x0ff5,0xfffe},
- {0x03f4,0x07f7,0x7ffb},
- {0x0ff7,0x0ff9,0x7ffa}
- }
- }
-};
-
-const UWord16 huff_ctab4[3][3][3][3]=
-{
- {
- {
- {0x0007,0x0016,0x00f6},
- {0x0018,0x0008,0x00ef},
- {0x01ef,0x00f3,0x07f8}
- },
- {
- {0x0019,0x0017,0x00ed},
- {0x0015,0x0001,0x00e2},
- {0x00f0,0x0070,0x03f0}
- },
- {
- {0x01ee,0x00f1,0x07fa},
- {0x00ee,0x00e4,0x03f2},
- {0x07f6,0x03ef,0x07fd}
- }
- },
- {
- {
- {0x0005,0x0014,0x00f2},
- {0x0009,0x0004,0x00e5},
- {0x00f4,0x00e8,0x03f4}
- },
- {
- {0x0006,0x0002,0x00e7},
- {0x0003,0x0000,0x006b},
- {0x00e3,0x0069,0x01f3}
- },
- {
- {0x00eb,0x00e6,0x03f6},
- {0x006e,0x006a,0x01f4},
- {0x03ec,0x01f0,0x03f9}
- }
- },
- {
- {
- {0x00f5,0x00ec,0x07fb},
- {0x00ea,0x006f,0x03f7},
- {0x07f9,0x03f3,0x0fff}
- },
- {
- {0x00e9,0x006d,0x03f8},
- {0x006c,0x0068,0x01f5},
- {0x03ee,0x01f2,0x07f4}
- },
- {
- {0x07f7,0x03f1,0x0ffe},
- {0x03ed,0x01f1,0x07f5},
- {0x07fe,0x03f5,0x07fc}
- }
- }
-};
-const UWord16 huff_ctab5[9][9]=
-{
- {0x1fff,0x0ff7,0x07f4,0x07e8,0x03f1,0x07ee,0x07f9,0x0ff8,0x1ffd},
- {0x0ffd,0x07f1,0x03e8,0x01e8,0x00f0,0x01ec,0x03ee,0x07f2,0x0ffa},
- {0x0ff4,0x03ef,0x01f2,0x00e8,0x0070,0x00ec,0x01f0,0x03ea,0x07f3},
- {0x07eb,0x01eb,0x00ea,0x001a,0x0008,0x0019,0x00ee,0x01ef,0x07ed},
- {0x03f0,0x00f2,0x0073,0x000b,0x0000,0x000a,0x0071,0x00f3,0x07e9},
- {0x07ef,0x01ee,0x00ef,0x0018,0x0009,0x001b,0x00eb,0x01e9,0x07ec},
- {0x07f6,0x03eb,0x01f3,0x00ed,0x0072,0x00e9,0x01f1,0x03ed,0x07f7},
- {0x0ff6,0x07f0,0x03e9,0x01ed,0x00f1,0x01ea,0x03ec,0x07f8,0x0ff9},
- {0x1ffc,0x0ffc,0x0ff5,0x07ea,0x03f3,0x03f2,0x07f5,0x0ffb,0x1ffe}
-};
-
-const UWord16 huff_ctab6[9][9]=
-{
- {0x07fe,0x03fd,0x01f1,0x01eb,0x01f4,0x01ea,0x01f0,0x03fc,0x07fd},
- {0x03f6,0x01e5,0x00ea,0x006c,0x0071,0x0068,0x00f0,0x01e6,0x03f7},
- {0x01f3,0x00ef,0x0032,0x0027,0x0028,0x0026,0x0031,0x00eb,0x01f7},
- {0x01e8,0x006f,0x002e,0x0008,0x0004,0x0006,0x0029,0x006b,0x01ee},
- {0x01ef,0x0072,0x002d,0x0002,0x0000,0x0003,0x002f,0x0073,0x01fa},
- {0x01e7,0x006e,0x002b,0x0007,0x0001,0x0005,0x002c,0x006d,0x01ec},
- {0x01f9,0x00ee,0x0030,0x0024,0x002a,0x0025,0x0033,0x00ec,0x01f2},
- {0x03f8,0x01e4,0x00ed,0x006a,0x0070,0x0069,0x0074,0x00f1,0x03fa},
- {0x07ff,0x03f9,0x01f6,0x01ed,0x01f8,0x01e9,0x01f5,0x03fb,0x07fc}
-};
-
-const UWord16 huff_ctab7[8][8]=
-{
- {0x0000,0x0005,0x0037,0x0074,0x00f2,0x01eb,0x03ed,0x07f7},
- {0x0004,0x000c,0x0035,0x0071,0x00ec,0x00ee,0x01ee,0x01f5},
- {0x0036,0x0034,0x0072,0x00ea,0x00f1,0x01e9,0x01f3,0x03f5},
- {0x0073,0x0070,0x00eb,0x00f0,0x01f1,0x01f0,0x03ec,0x03fa},
- {0x00f3,0x00ed,0x01e8,0x01ef,0x03ef,0x03f1,0x03f9,0x07fb},
- {0x01ed,0x00ef,0x01ea,0x01f2,0x03f3,0x03f8,0x07f9,0x07fc},
- {0x03ee,0x01ec,0x01f4,0x03f4,0x03f7,0x07f8,0x0ffd,0x0ffe},
- {0x07f6,0x03f0,0x03f2,0x03f6,0x07fa,0x07fd,0x0ffc,0x0fff}
-};
-
-const UWord16 huff_ctab8[8][8]=
-{
- {0x000e,0x0005,0x0010,0x0030,0x006f,0x00f1,0x01fa,0x03fe},
- {0x0003,0x0000,0x0004,0x0012,0x002c,0x006a,0x0075,0x00f8},
- {0x000f,0x0002,0x0006,0x0014,0x002e,0x0069,0x0072,0x00f5},
- {0x002f,0x0011,0x0013,0x002a,0x0032,0x006c,0x00ec,0x00fa},
- {0x0071,0x002b,0x002d,0x0031,0x006d,0x0070,0x00f2,0x01f9},
- {0x00ef,0x0068,0x0033,0x006b,0x006e,0x00ee,0x00f9,0x03fc},
- {0x01f8,0x0074,0x0073,0x00ed,0x00f0,0x00f6,0x01f6,0x01fd},
- {0x03fd,0x00f3,0x00f4,0x00f7,0x01f7,0x01fb,0x01fc,0x03ff}
-};
-
-const UWord16 huff_ctab9[13][13]=
-{
- {0x0000,0x0005,0x0037,0x00e7,0x01de,0x03ce,0x03d9,0x07c8,0x07cd,0x0fc8,0x0fdd,0x1fe4,0x1fec},
- {0x0004,0x000c,0x0035,0x0072,0x00ea,0x00ed,0x01e2,0x03d1,0x03d3,0x03e0,0x07d8,0x0fcf,0x0fd5},
- {0x0036,0x0034,0x0071,0x00e8,0x00ec,0x01e1,0x03cf,0x03dd,0x03db,0x07d0,0x0fc7,0x0fd4,0x0fe4},
- {0x00e6,0x0070,0x00e9,0x01dd,0x01e3,0x03d2,0x03dc,0x07cc,0x07ca,0x07de,0x0fd8,0x0fea,0x1fdb},
- {0x01df,0x00eb,0x01dc,0x01e6,0x03d5,0x03de,0x07cb,0x07dd,0x07dc,0x0fcd,0x0fe2,0x0fe7,0x1fe1},
- {0x03d0,0x01e0,0x01e4,0x03d6,0x07c5,0x07d1,0x07db,0x0fd2,0x07e0,0x0fd9,0x0feb,0x1fe3,0x1fe9},
- {0x07c4,0x01e5,0x03d7,0x07c6,0x07cf,0x07da,0x0fcb,0x0fda,0x0fe3,0x0fe9,0x1fe6,0x1ff3,0x1ff7},
- {0x07d3,0x03d8,0x03e1,0x07d4,0x07d9,0x0fd3,0x0fde,0x1fdd,0x1fd9,0x1fe2,0x1fea,0x1ff1,0x1ff6},
- {0x07d2,0x03d4,0x03da,0x07c7,0x07d7,0x07e2,0x0fce,0x0fdb,0x1fd8,0x1fee,0x3ff0,0x1ff4,0x3ff2},
- {0x07e1,0x03df,0x07c9,0x07d6,0x0fca,0x0fd0,0x0fe5,0x0fe6,0x1feb,0x1fef,0x3ff3,0x3ff4,0x3ff5},
- {0x0fe0,0x07ce,0x07d5,0x0fc6,0x0fd1,0x0fe1,0x1fe0,0x1fe8,0x1ff0,0x3ff1,0x3ff8,0x3ff6,0x7ffc},
- {0x0fe8,0x07df,0x0fc9,0x0fd7,0x0fdc,0x1fdc,0x1fdf,0x1fed,0x1ff5,0x3ff9,0x3ffb,0x7ffd,0x7ffe},
- {0x1fe7,0x0fcc,0x0fd6,0x0fdf,0x1fde,0x1fda,0x1fe5,0x1ff2,0x3ffa,0x3ff7,0x3ffc,0x3ffd,0x7fff}
-};
-
-const UWord16 huff_ctab10[13][13]=
-{
- {0x0022,0x0008,0x001d,0x0026,0x005f,0x00d3,0x01cf,0x03d0,0x03d7,0x03ed,0x07f0,0x07f6,0x0ffd},
- {0x0007,0x0000,0x0001,0x0009,0x0020,0x0054,0x0060,0x00d5,0x00dc,0x01d4,0x03cd,0x03de,0x07e7},
- {0x001c,0x0002,0x0006,0x000c,0x001e,0x0028,0x005b,0x00cd,0x00d9,0x01ce,0x01dc,0x03d9,0x03f1},
- {0x0025,0x000b,0x000a,0x000d,0x0024,0x0057,0x0061,0x00cc,0x00dd,0x01cc,0x01de,0x03d3,0x03e7},
- {0x005d,0x0021,0x001f,0x0023,0x0027,0x0059,0x0064,0x00d8,0x00df,0x01d2,0x01e2,0x03dd,0x03ee},
- {0x00d1,0x0055,0x0029,0x0056,0x0058,0x0062,0x00ce,0x00e0,0x00e2,0x01da,0x03d4,0x03e3,0x07eb},
- {0x01c9,0x005e,0x005a,0x005c,0x0063,0x00ca,0x00da,0x01c7,0x01ca,0x01e0,0x03db,0x03e8,0x07ec},
- {0x01e3,0x00d2,0x00cb,0x00d0,0x00d7,0x00db,0x01c6,0x01d5,0x01d8,0x03ca,0x03da,0x07ea,0x07f1},
- {0x01e1,0x00d4,0x00cf,0x00d6,0x00de,0x00e1,0x01d0,0x01d6,0x03d1,0x03d5,0x03f2,0x07ee,0x07fb},
- {0x03e9,0x01cd,0x01c8,0x01cb,0x01d1,0x01d7,0x01df,0x03cf,0x03e0,0x03ef,0x07e6,0x07f8,0x0ffa},
- {0x03eb,0x01dd,0x01d3,0x01d9,0x01db,0x03d2,0x03cc,0x03dc,0x03ea,0x07ed,0x07f3,0x07f9,0x0ff9},
- {0x07f2,0x03ce,0x01e4,0x03cb,0x03d8,0x03d6,0x03e2,0x03e5,0x07e8,0x07f4,0x07f5,0x07f7,0x0ffb},
- {0x07fa,0x03ec,0x03df,0x03e1,0x03e4,0x03e6,0x03f0,0x07e9,0x07ef,0x0ff8,0x0ffe,0x0ffc,0x0fff}
-};
-
-const UWord16 huff_ctab11[17][17]=
-{
- {0x0000,0x0006,0x0019,0x003d,0x009c,0x00c6,0x01a7,0x0390,0x03c2,0x03df,0x07e6,0x07f3,0x0ffb,0x07ec,0x0ffa,0x0ffe,0x038e},
- {0x0005,0x0001,0x0008,0x0014,0x0037,0x0042,0x0092,0x00af,0x0191,0x01a5,0x01b5,0x039e,0x03c0,0x03a2,0x03cd,0x07d6,0x00ae},
- {0x0017,0x0007,0x0009,0x0018,0x0039,0x0040,0x008e,0x00a3,0x00b8,0x0199,0x01ac,0x01c1,0x03b1,0x0396,0x03be,0x03ca,0x009d},
- {0x003c,0x0015,0x0016,0x001a,0x003b,0x0044,0x0091,0x00a5,0x00be,0x0196,0x01ae,0x01b9,0x03a1,0x0391,0x03a5,0x03d5,0x0094},
- {0x009a,0x0036,0x0038,0x003a,0x0041,0x008c,0x009b,0x00b0,0x00c3,0x019e,0x01ab,0x01bc,0x039f,0x038f,0x03a9,0x03cf,0x0093},
- {0x00bf,0x003e,0x003f,0x0043,0x0045,0x009e,0x00a7,0x00b9,0x0194,0x01a2,0x01ba,0x01c3,0x03a6,0x03a7,0x03bb,0x03d4,0x009f},
- {0x01a0,0x008f,0x008d,0x0090,0x0098,0x00a6,0x00b6,0x00c4,0x019f,0x01af,0x01bf,0x0399,0x03bf,0x03b4,0x03c9,0x03e7,0x00a8},
- {0x01b6,0x00ab,0x00a4,0x00aa,0x00b2,0x00c2,0x00c5,0x0198,0x01a4,0x01b8,0x038c,0x03a4,0x03c4,0x03c6,0x03dd,0x03e8,0x00ad},
- {0x03af,0x0192,0x00bd,0x00bc,0x018e,0x0197,0x019a,0x01a3,0x01b1,0x038d,0x0398,0x03b7,0x03d3,0x03d1,0x03db,0x07dd,0x00b4},
- {0x03de,0x01a9,0x019b,0x019c,0x01a1,0x01aa,0x01ad,0x01b3,0x038b,0x03b2,0x03b8,0x03ce,0x03e1,0x03e0,0x07d2,0x07e5,0x00b7},
- {0x07e3,0x01bb,0x01a8,0x01a6,0x01b0,0x01b2,0x01b7,0x039b,0x039a,0x03ba,0x03b5,0x03d6,0x07d7,0x03e4,0x07d8,0x07ea,0x00ba},
- {0x07e8,0x03a0,0x01bd,0x01b4,0x038a,0x01c4,0x0392,0x03aa,0x03b0,0x03bc,0x03d7,0x07d4,0x07dc,0x07db,0x07d5,0x07f0,0x00c1},
- {0x07fb,0x03c8,0x03a3,0x0395,0x039d,0x03ac,0x03ae,0x03c5,0x03d8,0x03e2,0x03e6,0x07e4,0x07e7,0x07e0,0x07e9,0x07f7,0x0190},
- {0x07f2,0x0393,0x01be,0x01c0,0x0394,0x0397,0x03ad,0x03c3,0x03c1,0x03d2,0x07da,0x07d9,0x07df,0x07eb,0x07f4,0x07fa,0x0195},
- {0x07f8,0x03bd,0x039c,0x03ab,0x03a8,0x03b3,0x03b9,0x03d0,0x03e3,0x03e5,0x07e2,0x07de,0x07ed,0x07f1,0x07f9,0x07fc,0x0193},
- {0x0ffd,0x03dc,0x03b6,0x03c7,0x03cc,0x03cb,0x03d9,0x03da,0x07d3,0x07e1,0x07ee,0x07ef,0x07f5,0x07f6,0x0ffc,0x0fff,0x019d},
- {0x01c2,0x00b5,0x00a1,0x0096,0x0097,0x0095,0x0099,0x00a0,0x00a2,0x00ac,0x00a9,0x00b1,0x00b3,0x00bb,0x00c0,0x018f,0x0004}
-};
-
-const UWord32 huff_ctabscf[121]=
-{
- 0x0003ffe8,
- 0x0003ffe6,
- 0x0003ffe7,
- 0x0003ffe5,
- 0x0007fff5,
- 0x0007fff1,
- 0x0007ffed,
- 0x0007fff6,
- 0x0007ffee,
- 0x0007ffef,
- 0x0007fff0,
- 0x0007fffc,
- 0x0007fffd,
- 0x0007ffff,
- 0x0007fffe,
- 0x0007fff7,
- 0x0007fff8,
- 0x0007fffb,
- 0x0007fff9,
- 0x0003ffe4,
- 0x0007fffa,
- 0x0003ffe3,
- 0x0001ffef,
- 0x0001fff0,
- 0x0000fff5,
- 0x0001ffee,
- 0x0000fff2,
- 0x0000fff3,
- 0x0000fff4,
- 0x0000fff1,
- 0x00007ff6,
- 0x00007ff7,
- 0x00003ff9,
- 0x00003ff5,
- 0x00003ff7,
- 0x00003ff3,
- 0x00003ff6,
- 0x00003ff2,
- 0x00001ff7,
- 0x00001ff5,
- 0x00000ff9,
- 0x00000ff7,
- 0x00000ff6,
- 0x000007f9,
- 0x00000ff4,
- 0x000007f8,
- 0x000003f9,
- 0x000003f7,
- 0x000003f5,
- 0x000001f8,
- 0x000001f7,
- 0x000000fa,
- 0x000000f8,
- 0x000000f6,
- 0x00000079,
- 0x0000003a,
- 0x00000038,
- 0x0000001a,
- 0x0000000b,
- 0x00000004,
- 0x00000000,
- 0x0000000a,
- 0x0000000c,
- 0x0000001b,
- 0x00000039,
- 0x0000003b,
- 0x00000078,
- 0x0000007a,
- 0x000000f7,
- 0x000000f9,
- 0x000001f6,
- 0x000001f9,
- 0x000003f4,
- 0x000003f6,
- 0x000003f8,
- 0x000007f5,
- 0x000007f4,
- 0x000007f6,
- 0x000007f7,
- 0x00000ff5,
- 0x00000ff8,
- 0x00001ff4,
- 0x00001ff6,
- 0x00001ff8,
- 0x00003ff8,
- 0x00003ff4,
- 0x0000fff0,
- 0x00007ff4,
- 0x0000fff6,
- 0x00007ff5,
- 0x0003ffe2,
- 0x0007ffd9,
- 0x0007ffda,
- 0x0007ffdb,
- 0x0007ffdc,
- 0x0007ffdd,
- 0x0007ffde,
- 0x0007ffd8,
- 0x0007ffd2,
- 0x0007ffd3,
- 0x0007ffd4,
- 0x0007ffd5,
- 0x0007ffd6,
- 0x0007fff2,
- 0x0007ffdf,
- 0x0007ffe7,
- 0x0007ffe8,
- 0x0007ffe9,
- 0x0007ffea,
- 0x0007ffeb,
- 0x0007ffe6,
- 0x0007ffe0,
- 0x0007ffe1,
- 0x0007ffe2,
- 0x0007ffe3,
- 0x0007ffe4,
- 0x0007ffe5,
- 0x0007ffd7,
- 0x0007ffec,
- 0x0007fff4,
- 0x0007fff3
-};
-
-const Word32 m_log2_table[INT_BITS] = {
- 0x00000000,0x4ae00d00,0x2934f080,0x15c01a3f,
- 0x0b31fb80,0x05aeb4e0,0x02dcf2d0,0x016fe50c,
- 0x00b84e23,0x005c3e10,0x002e24ca,0x001713d6,
- 0x000b8a47,0x0005c53b,0x0002e2a3,0x00017153,
- 0x0000b8aa,0x00005c55,0x00002e2b,0x00001715,
- 0x00000b8b,0x000005c5,0x000002e3,0x00000171,
- 0x000000b9,0x0000005c,0x0000002e,0x00000017,
- 0x0000000c,0x00000006,0x00000003,0x00000001
-};
-
-
-/*
- 3 bit resolution
-*/
-const Word32 tnsCoeff3[8] =
-{
- 0x81f1d1d4,
- 0x9126147c,
- 0xadb922f7,
- 0xd438af09,
- 0x00000000,
- 0x37898087,
- 0x64130dfa,
- 0x7cca6ffb,
-};
-
-const Word32 tnsCoeff3Borders[8] =
-{
- 0x80000000, /* -4 */
- 0x87b826de, /* -3 */
- 0x9df24153, /* -2 */
- 0xbfffffe5, /* -1 */
- 0xe9c5e578, /* 0 */
- 0x1c7b90f0, /* 1 */
- 0x4fce83aa, /* 2 */
- 0x7352f2c4, /* 3 */
-};
-
-
-/*
- 4 bit resolution
-*/
-
-const Word32 tnsCoeff4[16] =
-{
- 0x808bc84b,
- 0x84e2e57d,
- 0x8d6b49fb,
- 0x99da9207,
- 0xa9c45707,
- 0xbc9dde78,
- 0xd1c2d4fc,
- 0xe87ae539,
- 0x00000000,
- 0x1a9cd9c0,
- 0x340ff23b,
- 0x4b3c8bf7,
- 0x5f1f5e80,
- 0x6ed9eb84,
- 0x79bc3880,
- 0x7f4c7e89
-};
-
-const Word32 tnsCoeff4Borders[16]=
-{
- 0x80000000, /* -8 */
- 0x822defef, /* -7 */
- 0x88a4bfe5, /* -6 */
- 0x932c159c, /* -5 */
- 0xa16827c1, /* -4 */
- 0xb2dcde26, /* -3 */
- 0xc6f20b91, /* -2 */
- 0xdcf89c64, /* -1 */
- 0xf4308ce1, /* 0 */
- 0x0d613054, /* 1 */
- 0x278dde80, /* 2 */
- 0x4000001b, /* 3 */
- 0x55a6127c, /* 4 */
- 0x678dde8f, /* 5 */
- 0x74ef0ed8, /* 6 */
- 0x7d33f0db /* 7 */
-};
-
-
-const unsigned char bitrevTab[17 + 129] =
-{
-/* 64 */
-0x01, 0x08, 0x02, 0x04, 0x03, 0x0c, 0x05, 0x0a, 0x07, 0x0e, 0x0b, 0x0d, 0x00, 0x06, 0x09, 0x0f,
-0x00,
-
-/* 512 */
-0x01, 0x40, 0x02, 0x20, 0x03, 0x60, 0x04, 0x10, 0x05, 0x50, 0x06, 0x30, 0x07, 0x70, 0x09, 0x48,
-0x0a, 0x28, 0x0b, 0x68, 0x0c, 0x18, 0x0d, 0x58, 0x0e, 0x38, 0x0f, 0x78, 0x11, 0x44, 0x12, 0x24,
-0x13, 0x64, 0x15, 0x54, 0x16, 0x34, 0x17, 0x74, 0x19, 0x4c, 0x1a, 0x2c, 0x1b, 0x6c, 0x1d, 0x5c,
-0x1e, 0x3c, 0x1f, 0x7c, 0x21, 0x42, 0x23, 0x62, 0x25, 0x52, 0x26, 0x32, 0x27, 0x72, 0x29, 0x4a,
-0x2b, 0x6a, 0x2d, 0x5a, 0x2e, 0x3a, 0x2f, 0x7a, 0x31, 0x46, 0x33, 0x66, 0x35, 0x56, 0x37, 0x76,
-0x39, 0x4e, 0x3b, 0x6e, 0x3d, 0x5e, 0x3f, 0x7e, 0x43, 0x61, 0x45, 0x51, 0x47, 0x71, 0x4b, 0x69,
-0x4d, 0x59, 0x4f, 0x79, 0x53, 0x65, 0x57, 0x75, 0x5b, 0x6d, 0x5f, 0x7d, 0x67, 0x73, 0x6f, 0x7b,
-0x00, 0x08, 0x14, 0x1c, 0x22, 0x2a, 0x36, 0x3e, 0x41, 0x49, 0x55, 0x5d, 0x63, 0x6b, 0x77, 0x7f,
-0x00,
-};
diff --git a/media/libstagefright/codecs/aacenc/src/aacenc.c b/media/libstagefright/codecs/aacenc/src/aacenc.c
deleted file mode 100644
index df17787..0000000
--- a/media/libstagefright/codecs/aacenc/src/aacenc.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: aacenc.c
-
- Content: aac encoder interface functions
-
-*******************************************************************************/
-
-#include "voAAC.h"
-#include "typedef.h"
-#include "aacenc_core.h"
-#include "aac_rom.h"
-#include "cmnMemory.h"
-#include "memalign.h"
-
-#define UNUSED(x) (void)(x)
-
-/**
-* Init the audio codec module and return codec handle
-* \param phCodec [OUT] Return the video codec handle
-* \param vType [IN] The codec type if the module support multi codec.
-* \param pUserData [IN] The init param. It is memory operator or alloced memory
-* \retval VO_ERR_NONE Succeeded.
-*/
-VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData)
-{
- AAC_ENCODER*hAacEnc;
- int error;
-
-#ifdef USE_DEAULT_MEM
- VO_MEM_OPERATOR voMemoprator;
-#endif
- VO_MEM_OPERATOR *pMemOP;
-
-#ifdef USE_DEAULT_MEM
- int interMem;
- interMem = 0;
-#endif
-
- UNUSED(vType);
-
- error = 0;
-
- /* init the memory operator */
- if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
- {
-#ifdef USE_DEAULT_MEM
- voMemoprator.Alloc = cmnMemAlloc;
- voMemoprator.Copy = cmnMemCopy;
- voMemoprator.Free = cmnMemFree;
- voMemoprator.Set = cmnMemSet;
- voMemoprator.Check = cmnMemCheck;
-
- interMem = 1;
-
- pMemOP = &voMemoprator;
-#else
- *phCodec = NULL;
- return VO_ERR_INVALID_ARG;
-#endif
- }
- else
- {
- pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
- }
-
- /* init the aac encoder handle */
- hAacEnc = (AAC_ENCODER*)mem_malloc(pMemOP, sizeof(AAC_ENCODER), 32, VO_INDEX_ENC_AAC);
- if(NULL == hAacEnc)
- {
- error = 1;
- }
-
- if(!error)
- {
- /* init the aac encoder intra memory */
- hAacEnc->intbuf = (short *)mem_malloc(pMemOP, AACENC_BLOCKSIZE*MAX_CHANNELS*sizeof(short), 32, VO_INDEX_ENC_AAC);
- if(NULL == hAacEnc->intbuf)
- {
- error = 1;
- }
- }
-
- if (!error) {
- /* init the aac encoder psychoacoustic */
- error = (PsyNew(&hAacEnc->psyKernel, MAX_CHANNELS, pMemOP) ||
- PsyOutNew(&hAacEnc->psyOut, pMemOP));
- }
-
- if (!error) {
- /* init the aac encoder quantization elements */
- error = QCOutNew(&hAacEnc->qcOut,MAX_CHANNELS, pMemOP);
- }
-
- if (!error) {
- /* init the aac encoder quantization state */
- error = QCNew(&hAacEnc->qcKernel, pMemOP);
- }
-
- /* uninit the aac encoder if error is nozero */
- if(error)
- {
- AacEncClose(hAacEnc, pMemOP);
- if(hAacEnc)
- {
- mem_free(pMemOP, hAacEnc, VO_INDEX_ENC_AAC);
- hAacEnc = NULL;
- }
- *phCodec = NULL;
- return VO_ERR_OUTOF_MEMORY;
- }
-
- /* init the aac encoder memory operator */
-#ifdef USE_DEAULT_MEM
- if(interMem)
- {
- hAacEnc->voMemoprator.Alloc = cmnMemAlloc;
- hAacEnc->voMemoprator.Copy = cmnMemCopy;
- hAacEnc->voMemoprator.Free = cmnMemFree;
- hAacEnc->voMemoprator.Set = cmnMemSet;
- hAacEnc->voMemoprator.Check = cmnMemCheck;
-
- pMemOP = &hAacEnc->voMemoprator;
- }
-#endif
- /* init the aac encoder default parameter */
- if(hAacEnc->initOK == 0)
- {
- AACENC_CONFIG config;
- config.adtsUsed = 1;
- config.bitRate = 128000;
- config.nChannelsIn = 2;
- config.nChannelsOut = 2;
- config.sampleRate = 44100;
- config.bandWidth = 20000;
-
- AacEncOpen(hAacEnc, config);
- }
-
- hAacEnc->voMemop = pMemOP;
-
- *phCodec = hAacEnc;
-
- return VO_ERR_NONE;
-}
-
-/**
-* Set input audio data.
-* \param hCodec [IN]] The Codec Handle which was created by Init function.
-* \param pInput [IN] The input buffer param.
-* \param pOutBuffer [OUT] The output buffer info.
-* \retval VO_ERR_NONE Succeeded.
-*/
-VO_U32 VO_API voAACEncSetInputData(VO_HANDLE hCodec, VO_CODECBUFFER * pInput)
-{
- AAC_ENCODER *hAacEnc;
- int length;
-
- if(NULL == hCodec || NULL == pInput || NULL == pInput->Buffer)
- {
- return VO_ERR_INVALID_ARG;
- }
-
- hAacEnc = (AAC_ENCODER *)hCodec;
-
- /* init input pcm buffer and length*/
- hAacEnc->inbuf = (short *)pInput->Buffer;
- hAacEnc->inlen = pInput->Length / sizeof(short);
- hAacEnc->uselength = 0;
-
- hAacEnc->encbuf = hAacEnc->inbuf;
- hAacEnc->enclen = hAacEnc->inlen;
-
- /* rebuild intra pcm buffer and length*/
- if(hAacEnc->intlen)
- {
- length = min(hAacEnc->config.nChannelsIn*AACENC_BLOCKSIZE - hAacEnc->intlen, hAacEnc->inlen);
- hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf + hAacEnc->intlen,
- hAacEnc->inbuf, length*sizeof(short));
-
- hAacEnc->encbuf = hAacEnc->intbuf;
- hAacEnc->enclen = hAacEnc->intlen + length;
-
- hAacEnc->inbuf += length;
- hAacEnc->inlen -= length;
- }
-
- return VO_ERR_NONE;
-}
-
-/**
-* Get the outut audio data
-* \param hCodec [IN]] The Codec Handle which was created by Init function.
-* \param pOutBuffer [OUT] The output audio data
-* \param pOutInfo [OUT] The dec module filled audio format and used the input size.
-* pOutInfo->InputUsed is total used the input size.
-* \retval VO_ERR_NONE Succeeded.
-* VO_ERR_INPUT_BUFFER_SMALL. The input was finished or the input data was not enought.
-*/
-VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput, VO_AUDIO_OUTPUTINFO * pOutInfo)
-{
- AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
- Word16 numAncDataBytes=0;
- Word32 inbuflen;
- int length;
- if(NULL == hAacEnc)
- return VO_ERR_INVALID_ARG;
-
- inbuflen = AACENC_BLOCKSIZE*hAacEnc->config.nChannelsIn;
-
- /* check the input pcm buffer and length*/
- if(NULL == hAacEnc->encbuf || hAacEnc->enclen < inbuflen)
- {
- length = hAacEnc->enclen;
- if(hAacEnc->intlen == 0)
- {
- hAacEnc->voMemop->Copy(VO_INDEX_ENC_AAC, hAacEnc->intbuf,
- hAacEnc->encbuf, length*sizeof(short));
- hAacEnc->uselength += length*sizeof(short);
- }
- else
- {
- hAacEnc->uselength += (length - hAacEnc->intlen)*sizeof(short);
- }
-
- hAacEnc->intlen = length;
-
- pOutput->Length = 0;
- if(pOutInfo)
- pOutInfo->InputUsed = hAacEnc->uselength;
- return VO_ERR_INPUT_BUFFER_SMALL;
- }
-
- /* check the output aac buffer and length*/
- if(NULL == pOutput || NULL == pOutput->Buffer || pOutput->Length < (6144/8)*hAacEnc->config.nChannelsOut/(sizeof(Word32)))
- return VO_ERR_OUTPUT_BUFFER_SMALL;
-
- /* aac encoder core function */
- AacEncEncode( hAacEnc,
- (Word16*)hAacEnc->encbuf,
- NULL,
- &numAncDataBytes,
- pOutput->Buffer,
- &pOutput->Length);
-
- /* update the input pcm buffer and length*/
- if(hAacEnc->intlen)
- {
- length = inbuflen - hAacEnc->intlen;
- hAacEnc->encbuf = hAacEnc->inbuf;
- hAacEnc->enclen = hAacEnc->inlen;
- hAacEnc->uselength += length*sizeof(short);
- hAacEnc->intlen = 0;
- }
- else
- {
- hAacEnc->encbuf = hAacEnc->encbuf + inbuflen;
- hAacEnc->enclen = hAacEnc->enclen - inbuflen;
- hAacEnc->uselength += inbuflen*sizeof(short);
- }
-
- /* update the output aac information */
- if(pOutInfo)
- {
- pOutInfo->Format.Channels = hAacEnc->config.nChannelsOut;
- pOutInfo->Format.SampleRate = hAacEnc->config.sampleRate;
- pOutInfo->Format.SampleBits = 16;
- pOutInfo->InputUsed = hAacEnc->uselength;
- }
-
- return VO_ERR_NONE;
-}
-
-/**
-* Uninit the Codec.
-* \param hCodec [IN]] The Codec Handle which was created by Init function.
-* \retval VO_ERR_NONE Succeeded.
-*/
-VO_U32 VO_API voAACEncUninit(VO_HANDLE hCodec)
-{
- AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
-
- if(NULL != hAacEnc)
- {
- /* close the aac encoder */
- AacEncClose(hAacEnc, hAacEnc->voMemop);
-
- /* free the aac encoder handle*/
- mem_free(hAacEnc->voMemop, hAacEnc, VO_INDEX_ENC_AAC);
- hAacEnc = NULL;
- }
-
- return VO_ERR_NONE;
-}
-
-/**
-* Set the param for special target.
-* \param hCodec [IN]] The Codec Handle which was created by Init function.
-* \param uParamID [IN] The param ID.
-* \param pData [IN] The param value depend on the ID>
-* \retval VO_ERR_NONE Succeeded.
-*/
-VO_U32 VO_API voAACEncSetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
-{
- AACENC_CONFIG config;
- AACENC_PARAM* pAAC_param;
- VO_AUDIO_FORMAT *pWAV_Format;
- AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;
- int ret, i, bitrate, tmp;
- int SampleRateIdx;
-
- if(NULL == hAacEnc)
- return VO_ERR_INVALID_ARG;
-
- switch(uParamID)
- {
- case VO_PID_AAC_ENCPARAM: /* init aac encoder parameter*/
- AacInitDefaultConfig(&config);
- if(pData == NULL)
- return VO_ERR_INVALID_ARG;
- pAAC_param = (AACENC_PARAM*)pData;
- config.adtsUsed = pAAC_param->adtsUsed;
- config.bitRate = pAAC_param->bitRate;
- config.nChannelsIn = pAAC_param->nChannels;
- config.nChannelsOut = pAAC_param->nChannels;
- config.sampleRate = pAAC_param->sampleRate;
-
- /* check the channel */
- if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS ||
- config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)
- return VO_ERR_AUDIO_UNSCHANNEL;
-
- /* check the samplerate */
- ret = -1;
- for(i = 0; i < NUM_SAMPLE_RATES; i++)
- {
- if(config.sampleRate == sampRateTab[i])
- {
- ret = 0;
- break;
- }
- }
- if(ret < 0)
- return VO_ERR_AUDIO_UNSSAMPLERATE;
-
- SampleRateIdx = i;
-
- tmp = 441;
- if(config.sampleRate%8000 == 0)
- tmp =480;
- /* check the bitrate */
- if(config.bitRate!=0 && ((config.bitRate/config.nChannelsOut < 4000) ||
- (config.bitRate/config.nChannelsOut > 160000) ||
- (config.bitRate > config.sampleRate*6*config.nChannelsOut)))
- {
- config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
-
- if(config.bitRate/config.nChannelsOut < 4000)
- config.bitRate = 4000 * config.nChannelsOut;
- else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)
- config.bitRate = config.sampleRate*6*config.nChannelsOut;
- else if(config.bitRate/config.nChannelsOut > 160000)
- config.bitRate = config.nChannelsOut*160000;
- }
-
- /* check the bandwidth */
- bitrate = config.bitRate / config.nChannelsOut;
- bitrate = bitrate * tmp / config.sampleRate;
-
- for (i = 0; rates[i]; i++)
- {
- if (rates[i] >= bitrate)
- break;
- }
-
- config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
-
- /* init aac encoder core */
- ret = AacEncOpen(hAacEnc, config);
- if(ret)
- return VO_ERR_AUDIO_UNSFEATURE;
- break;
- case VO_PID_AUDIO_FORMAT: /* init pcm channel and samplerate*/
- AacInitDefaultConfig(&config);
- if(pData == NULL)
- return VO_ERR_INVALID_ARG;
- pWAV_Format = (VO_AUDIO_FORMAT*)pData;
- config.adtsUsed = 1;
- config.nChannelsIn = pWAV_Format->Channels;
- config.nChannelsOut = pWAV_Format->Channels;
- config.sampleRate = pWAV_Format->SampleRate;
-
- /* check the channel */
- if(config.nChannelsIn< 1 || config.nChannelsIn > MAX_CHANNELS ||
- config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS || config.nChannelsIn < config.nChannelsOut)
- return VO_ERR_AUDIO_UNSCHANNEL;
-
- /* check the samplebits */
- if(pWAV_Format->SampleBits != 16)
- {
- return VO_ERR_AUDIO_UNSFEATURE;
- }
-
- /* check the samplerate */
- ret = -1;
- for(i = 0; i < NUM_SAMPLE_RATES; i++)
- {
- if(config.sampleRate == sampRateTab[i])
- {
- ret = 0;
- break;
- }
- }
- if(ret < 0)
- return VO_ERR_AUDIO_UNSSAMPLERATE;
-
- SampleRateIdx = i;
-
- /* update the bitrates */
- tmp = 441;
- if(config.sampleRate%8000 == 0)
- tmp =480;
-
- config.bitRate = 640*config.sampleRate/tmp*config.nChannelsOut;
-
- if(config.bitRate/config.nChannelsOut < 4000)
- config.bitRate = 4000 * config.nChannelsOut;
- else if(config.bitRate > config.sampleRate*6*config.nChannelsOut)
- config.bitRate = config.sampleRate*6*config.nChannelsOut;
- else if(config.bitRate/config.nChannelsOut > 160000)
- config.bitRate = config.nChannelsOut*160000;
-
- /* check the bandwidth */
- bitrate = config.bitRate / config.nChannelsOut;
- bitrate = bitrate * tmp / config.sampleRate;
-
- for (i = 0; rates[i]; i++)
- {
- if (rates[i] >= bitrate)
- break;
- }
-
- config.bandWidth = BandwithCoefTab[i][SampleRateIdx];
-
- /* init aac encoder core */
- ret = AacEncOpen(hAacEnc, config);
- if(ret)
- return VO_ERR_AUDIO_UNSFEATURE;
- break;
- default:
- return VO_ERR_WRONG_PARAM_ID;
- }
-
- return VO_ERR_NONE;
-}
-
-/**
-* Get the param for special target.
-* \param hCodec [IN]] The Codec Handle which was created by Init function.
-* \param uParamID [IN] The param ID.
-* \param pData [IN] The param value depend on the ID>
-* \retval VO_ERR_NONE Succeeded.
-*/
-VO_U32 VO_API voAACEncGetParam(VO_HANDLE hCodec, VO_S32 uParamID, VO_PTR pData)
-{
- UNUSED(hCodec);
- UNUSED(uParamID);
- UNUSED(pData);
-
- return VO_ERR_NONE;
-}
-
-/**
- * Get audio codec API interface
- * \param pEncHandle [out] Return the AAC Encoder handle.
- * \retval VO_ERR_OK Succeeded.
- */
-VO_S32 VO_API voGetAACEncAPI(VO_AUDIO_CODECAPI * pDecHandle)
-{
- if(pDecHandle == NULL)
- return VO_ERR_INVALID_ARG;
-
- pDecHandle->Init = voAACEncInit;
- pDecHandle->SetInputData = voAACEncSetInputData;
- pDecHandle->GetOutputData = voAACEncGetOutputData;
- pDecHandle->SetParam = voAACEncSetParam;
- pDecHandle->GetParam = voAACEncGetParam;
- pDecHandle->Uninit = voAACEncUninit;
-
- return VO_ERR_NONE;
-}
diff --git a/media/libstagefright/codecs/aacenc/src/aacenc_core.c b/media/libstagefright/codecs/aacenc/src/aacenc_core.c
deleted file mode 100644
index de452d4..0000000
--- a/media/libstagefright/codecs/aacenc/src/aacenc_core.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: aacenc_core.c
-
- Content: aac encoder core functions
-
-*******************************************************************************/
-
-#include "typedef.h"
-#include "aacenc_core.h"
-#include "bitenc.h"
-
-#include "psy_configuration.h"
-#include "psy_main.h"
-#include "qc_main.h"
-#include "psy_main.h"
-#include "channel_map.h"
-#include "aac_rom.h"
-
-/********************************************************************************
-*
-* function name: AacInitDefaultConfig
-* description: gives reasonable default configuration
-*
-**********************************************************************************/
-void AacInitDefaultConfig(AACENC_CONFIG *config)
-{
- /* default configurations */
- config->adtsUsed = 1;
- config->nChannelsIn = 2;
- config->nChannelsOut = 2;
- config->bitRate = 128000;
- config->bandWidth = 0;
-}
-
-/********************************************************************************
-*
-* function name: AacEncOpen
-* description: allocate and initialize a new encoder instance
-* returns: 0 if success
-*
-**********************************************************************************/
-Word16 AacEncOpen( AAC_ENCODER* hAacEnc, /* pointer to an encoder handle, initialized on return */
- const AACENC_CONFIG config /* pre-initialized config struct */
- )
-{
- Word32 error = 0;
- Word16 profile = 1;
-
- ELEMENT_INFO *elInfo = NULL;
-
- if (hAacEnc==0) {
- error=1;
- }
-
- if (!error) {
- hAacEnc->config = config;
- }
-
- if (!error) {
- error = InitElementInfo (config.nChannelsOut,
- &hAacEnc->elInfo);
- }
-
- if (!error) {
- elInfo = &hAacEnc->elInfo;
- }
-
- if (!error) {
- /* use or not tns tool for long and short block */
- Word16 tnsMask=3;
-
- /* init encoder psychoacoustic */
- error = psyMainInit(&hAacEnc->psyKernel,
- config.sampleRate,
- config.bitRate,
- elInfo->nChannelsInEl,
- tnsMask,
- hAacEnc->config.bandWidth);
- }
-
- /* use or not adts header */
- if(!error) {
- hAacEnc->qcOut.qcElement.adtsUsed = config.adtsUsed;
- }
-
- /* init encoder quantization */
- if (!error) {
- struct QC_INIT qcInit;
-
- /*qcInit.channelMapping = &hAacEnc->channelMapping;*/
- qcInit.elInfo = &hAacEnc->elInfo;
-
- qcInit.maxBits = (Word16) (MAXBITS_COEF*elInfo->nChannelsInEl);
- qcInit.bitRes = qcInit.maxBits;
- qcInit.averageBits = (Word16) ((config.bitRate * FRAME_LEN_LONG) / config.sampleRate);
-
- qcInit.padding.paddingRest = config.sampleRate;
-
- qcInit.meanPe = (Word16) ((10 * FRAME_LEN_LONG * hAacEnc->config.bandWidth) /
- (config.sampleRate>>1));
-
- qcInit.maxBitFac = (Word16) ((100 * (MAXBITS_COEF-MINBITS_COEF)* elInfo->nChannelsInEl)/
- (qcInit.averageBits?qcInit.averageBits:1));
-
- qcInit.bitrate = config.bitRate;
-
- error = QCInit(&hAacEnc->qcKernel, &qcInit);
- }
-
- /* init bitstream encoder */
- if (!error) {
- hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl;
- hAacEnc->bseInit.bitrate = config.bitRate;
- hAacEnc->bseInit.sampleRate = config.sampleRate;
- hAacEnc->bseInit.profile = profile;
- }
-
- return error;
-}
-
-/********************************************************************************
-*
-* function name: AacEncEncode
-* description: encode pcm to aac data core function
-* returns: 0 if success
-*
-**********************************************************************************/
-Word16 AacEncEncode(AAC_ENCODER *aacEnc, /*!< an encoder handle */
- Word16 *timeSignal, /*!< BLOCKSIZE*nChannels audio samples, interleaved */
- const UWord8 *ancBytes, /*!< pointer to ancillary data bytes */
- Word16 *numAncBytes, /*!< number of ancillary Data Bytes */
- UWord8 *outBytes, /*!< pointer to output buffer (must be large MINBITS_COEF/8*MAX_CHANNELS bytes) */
- VO_U32 *numOutBytes /*!< number of bytes in output buffer after processing */
- )
-{
- ELEMENT_INFO *elInfo = &aacEnc->elInfo;
- Word16 globUsedBits;
- Word16 ancDataBytes, ancDataBytesLeft;
-
- ancDataBytes = ancDataBytesLeft = *numAncBytes;
-
- /* init output aac data buffer and length */
- aacEnc->hBitStream = CreateBitBuffer(&aacEnc->bitStream, outBytes, *numOutBytes);
-
- /* psychoacoustic process */
- psyMain(aacEnc->config.nChannelsOut,
- elInfo,
- timeSignal,
- &aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]],
- &aacEnc->psyKernel.tnsData[elInfo->ChannelIndex[0]],
- &aacEnc->psyKernel.psyConfLong,
- &aacEnc->psyKernel.psyConfShort,
- &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]],
- &aacEnc->psyOut.psyOutElement,
- aacEnc->psyKernel.pScratchTns,
- aacEnc->config.sampleRate);
-
- /* adjust bitrate and frame length */
- AdjustBitrate(&aacEnc->qcKernel,
- aacEnc->config.bitRate,
- aacEnc->config.sampleRate);
-
- /* quantization and coding process */
- QCMain(&aacEnc->qcKernel,
- &aacEnc->qcKernel.elementBits,
- &aacEnc->qcKernel.adjThr.adjThrStateElem,
- &aacEnc->psyOut.psyOutChannel[elInfo->ChannelIndex[0]],
- &aacEnc->psyOut.psyOutElement,
- &aacEnc->qcOut.qcChannel[elInfo->ChannelIndex[0]],
- &aacEnc->qcOut.qcElement,
- elInfo->nChannelsInEl,
- min(ancDataBytesLeft,ancDataBytes));
-
- ancDataBytesLeft = ancDataBytesLeft - ancDataBytes;
-
- globUsedBits = FinalizeBitConsumption(&aacEnc->qcKernel,
- &aacEnc->qcOut);
-
- /* write bitstream process */
- WriteBitstream(aacEnc->hBitStream,
- *elInfo,
- &aacEnc->qcOut,
- &aacEnc->psyOut,
- &globUsedBits,
- ancBytes,
- aacEnc->psyKernel.sampleRateIdx);
-
- updateBitres(&aacEnc->qcKernel,
- &aacEnc->qcOut);
-
- /* write out the bitstream */
- *numOutBytes = GetBitsAvail(aacEnc->hBitStream) >> 3;
-
- return 0;
-}
-
-
-/********************************************************************************
-*
-* function name:AacEncClose
-* description: deallocate an encoder instance
-*
-**********************************************************************************/
-void AacEncClose (AAC_ENCODER* hAacEnc, VO_MEM_OPERATOR *pMemOP)
-{
- if (hAacEnc) {
- QCDelete(&hAacEnc->qcKernel, pMemOP);
-
- QCOutDelete(&hAacEnc->qcOut, pMemOP);
-
- PsyDelete(&hAacEnc->psyKernel, pMemOP);
-
- PsyOutDelete(&hAacEnc->psyOut, pMemOP);
-
- DeleteBitBuffer(&hAacEnc->hBitStream);
-
- if(hAacEnc->intbuf)
- {
- mem_free(pMemOP, hAacEnc->intbuf, VO_INDEX_ENC_AAC);
- hAacEnc->intbuf = NULL;
- }
- }
-}
diff --git a/media/libstagefright/codecs/aacenc/src/adj_thr.c b/media/libstagefright/codecs/aacenc/src/adj_thr.c
deleted file mode 100644
index 8b8be0e..0000000
--- a/media/libstagefright/codecs/aacenc/src/adj_thr.c
+++ /dev/null
@@ -1,1228 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: adj_thr.c
-
- Content: Threshold compensation functions
-
-*******************************************************************************/
-
-/* Include system headers before local headers - the local headers
- * redefine __inline, which can mess up definitions in libc headers if
- * they happen to use __inline. */
-#include <string.h>
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "adj_thr_data.h"
-#include "adj_thr.h"
-#include "qc_data.h"
-#include "line_pe.h"
-
-
-#define minSnrLimit 0x6666 /* 1 dB */
-#define PEBITS_COEF 0x170a /* 0.18*(1 << 15)*/
-
-#define HOLE_THR_LONG 0x2873 /* 0.316*(1 << 15) */
-#define HOLE_THR_SHORT 0x4000 /* 0.5 *(1 << 15) */
-
-#define MS_THRSPREAD_COEF 0x7333 /* 0.9 * (1 << 15) */
-
-#define MIN_SNR_COEF 0x651f /* 3.16* (1 << (15 - 2)) */
-
-/* values for avoid hole flag */
-enum _avoid_hole_state {
- NO_AH =0,
- AH_INACTIVE =1,
- AH_ACTIVE =2
-};
-
-/********************************************************************************
-*
-* function name:bits2pe
-* description: convert from bits to pe
-* pe = 1.18*desiredBits
-*
-**********************************************************************************/
-Word16 bits2pe(const Word16 bits) {
- return (bits + ((PEBITS_COEF * bits) >> 15));
-}
-
-/********************************************************************************
-*
-* function name:calcThreshExp
-* description: loudness calculation (threshold to the power of redExp)
-* thr(n)^0.25
-*
-**********************************************************************************/
-static void calcThreshExp(Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- const Word16 nChannels)
-{
- Word16 ch, sfb, sfbGrp;
- Word32 *pthrExp = NULL, *psfbThre;
- for (ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
- for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup)
- pthrExp = &(thrExp[ch][sfbGrp]);
- psfbThre = psyOutChan->sfbThreshold + sfbGrp;
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- *pthrExp = rsqrt(rsqrt(*psfbThre,INT_BITS),INT_BITS);
- pthrExp++; psfbThre++;
- }
- }
-}
-
-/********************************************************************************
-*
-* function name:adaptMinSnr
-* description: reduce minSnr requirements for bands with relative low energies
-*
-**********************************************************************************/
-static void adaptMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- MINSNR_ADAPT_PARAM *msaParam,
- const Word16 nChannels)
-{
- Word16 ch, sfb, sfbOffs;
- Word32 nSfb, avgEn;
- Word16 log_avgEn = 0;
- Word32 startRatio_x_avgEn = 0;
-
-
- for (ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL* psyOutChan = &psyOutChannel[ch];
-
- /* calc average energy per scalefactor band */
- avgEn = 0;
- nSfb = 0;
- for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfbOffs+sfb]);
- nSfb = nSfb + 1;
- }
- }
-
- if (nSfb > 0) {
- avgEn = avgEn / nSfb;
-
- log_avgEn = iLog4(avgEn);
- startRatio_x_avgEn = fixmul(msaParam->startRatio, avgEn);
- }
-
-
- /* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */
- for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup) {
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- if (psyOutChan->sfbEnergy[sfbOffs+sfb] < startRatio_x_avgEn) {
- Word16 dbRatio, minSnrRed;
- Word32 snrRed;
- Word16 newMinSnr;
-
- dbRatio = log_avgEn - logSfbEnergy[ch][sfbOffs+sfb];
- dbRatio = dbRatio + (dbRatio << 1);
-
- minSnrRed = 110 - ((dbRatio + (dbRatio << 1)) >> 2);
- minSnrRed = max(minSnrRed, 20); /* 110: (0.375(redOffs)+1)*80,
- 3: 0.00375(redRatioFac)*80
- 20: 0.25(maxRed) * 80 */
-
- snrRed = minSnrRed * iLog4((psyOutChan->sfbMinSnr[sfbOffs+sfb] << 16));
- /*
- snrRedI si now scaled by 80 (minSnrRed) and 4 (ffr_iLog4)
- */
-
- newMinSnr = round16(pow2_xy(snrRed,80*4));
-
- psyOutChan->sfbMinSnr[sfbOffs+sfb] = min(newMinSnr, minSnrLimit);
- }
- }
- }
- }
-
-}
-
-
-/********************************************************************************
-*
-* function name:initAvoidHoleFlag
-* description: determine bands where avoid hole is not necessary resp. possible
-*
-**********************************************************************************/
-static void initAvoidHoleFlag(Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT* psyOutElement,
- const Word16 nChannels,
- AH_PARAM *ahParam)
-{
- Word16 ch, sfb, sfbGrp, shift;
- Word32 threshold;
- Word32* psfbSpreadEn;
-
- for (ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
-
- if (psyOutChan->windowSequence != SHORT_WINDOW) {
- for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
- psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- *psfbSpreadEn = *psfbSpreadEn >> 1; /* 0.5 */
- ++psfbSpreadEn;
- }
- }
- }
- else {
- for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
- psfbSpreadEn = psyOutChan->sfbSpreadedEnergy + sfbGrp;
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- *psfbSpreadEn = (*psfbSpreadEn >> 1) + (*psfbSpreadEn >> 3); /* 0.63 */
- ++psfbSpreadEn;
- }
- }
- }
- }
-
- /* increase minSnr for local peaks, decrease it for valleys */
- if (ahParam->modifyMinSnr) {
- for(ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
-
- if (psyOutChan->windowSequence != SHORT_WINDOW)
- threshold = HOLE_THR_LONG;
- else
- threshold = HOLE_THR_SHORT;
-
- for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
- Word16 *psfbMinSnr = psyOutChan->sfbMinSnr + sfbGrp;
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- Word32 sfbEn, sfbEnm1, sfbEnp1, avgEn;
-
- if (sfb > 0)
- sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp+sfb-1];
- else
- sfbEnm1 = psyOutChan->sfbEnergy[sfbGrp];
-
- if (sfb < (psyOutChan->maxSfbPerGroup-1))
- sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb+1];
- else
- sfbEnp1 = psyOutChan->sfbEnergy[sfbGrp+sfb];
- avgEn = (sfbEnm1 + sfbEnp1) >> 1;
- sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb];
-
- if (sfbEn > avgEn && avgEn > 0) {
- Word32 tmpMinSnr;
- shift = norm_l(sfbEn);
- tmpMinSnr = Div_32(L_mpy_ls(avgEn, minSnrLimit) << shift, sfbEn << shift );
- tmpMinSnr = max(tmpMinSnr, HOLE_THR_LONG);
- tmpMinSnr = max(tmpMinSnr, threshold);
- *psfbMinSnr = min(*psfbMinSnr, tmpMinSnr);
- }
- /* valley ? */
-
- if ((sfbEn < (avgEn >> 1)) && (sfbEn > 0)) {
- Word32 tmpMinSnr;
- Word32 minSnrEn = L_mpy_wx(avgEn, *psfbMinSnr);
-
- if(minSnrEn < sfbEn) {
- shift = norm_l(sfbEn);
- tmpMinSnr = Div_32( minSnrEn << shift, sfbEn<<shift);
- }
- else {
- tmpMinSnr = MAX_16;
- }
- tmpMinSnr = min(minSnrLimit, tmpMinSnr);
-
- *psfbMinSnr =
- (min((tmpMinSnr >> 2), mult(*psfbMinSnr, MIN_SNR_COEF)) << 2);
- }
- psfbMinSnr++;
- }
- }
- }
- }
-
- /* stereo: adapt the minimum requirements sfbMinSnr of mid and
- side channels */
-
- if (nChannels == 2) {
- PSY_OUT_CHANNEL *psyOutChanM = &psyOutChannel[0];
- PSY_OUT_CHANNEL *psyOutChanS = &psyOutChannel[1];
- for (sfb=0; sfb<psyOutChanM->sfbCnt; sfb++) {
- if (psyOutElement->toolsInfo.msMask[sfb]) {
- Word32 sfbEnM = psyOutChanM->sfbEnergy[sfb];
- Word32 sfbEnS = psyOutChanS->sfbEnergy[sfb];
- Word32 maxSfbEn = max(sfbEnM, sfbEnS);
- Word32 maxThr = L_mpy_wx(maxSfbEn, psyOutChanM->sfbMinSnr[sfb]) >> 1;
-
- if(maxThr >= sfbEnM) {
- psyOutChanM->sfbMinSnr[sfb] = MAX_16;
- }
- else {
- shift = norm_l(sfbEnM);
- psyOutChanM->sfbMinSnr[sfb] = min(max(psyOutChanM->sfbMinSnr[sfb],
- round16(Div_32(maxThr<<shift, sfbEnM << shift))), minSnrLimit);
- }
-
- if(maxThr >= sfbEnS) {
- psyOutChanS->sfbMinSnr[sfb] = MAX_16;
- }
- else {
- shift = norm_l(sfbEnS);
- psyOutChanS->sfbMinSnr[sfb] = min(max(psyOutChanS->sfbMinSnr[sfb],
- round16(Div_32(maxThr << shift, sfbEnS << shift))), minSnrLimit);
- }
-
-
- if (sfbEnM > psyOutChanM->sfbSpreadedEnergy[sfb])
- psyOutChanS->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnS, MS_THRSPREAD_COEF);
-
- if (sfbEnS > psyOutChanS->sfbSpreadedEnergy[sfb])
- psyOutChanM->sfbSpreadedEnergy[sfb] = L_mpy_ls(sfbEnM, MS_THRSPREAD_COEF);
- }
- }
- }
-
-
- /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */
- for(ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
- for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
- Word16 *pahFlag = ahFlag[ch] + sfbGrp;
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
-
- if ((psyOutChan->sfbSpreadedEnergy[sfbGrp+sfb] > psyOutChan->sfbEnergy[sfbGrp+sfb]) ||
- (psyOutChan->sfbEnergy[sfbGrp+sfb] <= psyOutChan->sfbThreshold[sfbGrp+sfb]) ||
- (psyOutChan->sfbMinSnr[sfbGrp+sfb] == MAX_16)) {
- *pahFlag++ = NO_AH;
- }
- else {
- *pahFlag++ = AH_INACTIVE;
- }
- }
- for (sfb=psyOutChan->maxSfbPerGroup; sfb<psyOutChan->sfbPerGroup; sfb++) {
- *pahFlag++ = NO_AH;
- }
- }
- }
-}
-
-/********************************************************************************
-*
-* function name:calcPeNoAH
-* description: sum the pe data only for bands where avoid hole is inactive
-*
-**********************************************************************************/
-static void calcPeNoAH(Word16 *pe,
- Word16 *constPart,
- Word16 *nActiveLines,
- PE_DATA *peData,
- Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- const Word16 nChannels)
-{
- Word16 ch, sfb, sfbGrp;
- int ipe, iconstPart, inActiveLines;
-
- ipe = 0;
- iconstPart = 0;
- inActiveLines = 0;
- for(ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
- PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
- for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
-
- if (ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) {
- ipe = ipe + peChanData->sfbPe[sfbGrp+sfb];
- iconstPart = iconstPart + peChanData->sfbConstPart[sfbGrp+sfb];
- inActiveLines = inActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb];
- }
- }
- }
- }
-
- *pe = saturate(ipe);
- *constPart = saturate(iconstPart);
- *nActiveLines = saturate(inActiveLines);
-}
-
-/********************************************************************************
-*
-* function name:reduceThresholds
-* description: apply reduction formula
-*
-**********************************************************************************/
-static void reduceThresholds(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
- const Word16 nChannels,
- const Word32 redVal)
-{
- Word32 sfbThrReduced;
- Word32 *psfbEn, *psfbThr;
- Word16 ch, sfb, sfbGrp;
-
- for(ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
- for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
- psfbEn = psyOutChan->sfbEnergy + sfbGrp;
- psfbThr = psyOutChan->sfbThreshold + sfbGrp;
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
-
- if (*psfbEn > *psfbThr) {
- /* threshold reduction formula */
- Word32 tmp = thrExp[ch][sfbGrp+sfb] + redVal;
- tmp = fixmul(tmp, tmp);
- sfbThrReduced = fixmul(tmp, tmp);
- /* avoid holes */
- tmp = L_mpy_ls(*psfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
-
- if ((sfbThrReduced > tmp) &&
- (ahFlag[ch][sfbGrp+sfb] != NO_AH)){
- sfbThrReduced = max(tmp, *psfbThr);
- ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE;
- }
- *psfbThr = sfbThrReduced;
- }
-
- psfbEn++; psfbThr++;
- }
- }
- }
-}
-
-
-/********************************************************************************
-*
-* function name:correctThresh
-* description: if pe difference deltaPe between desired pe and real pe is small enough,
-* the difference can be distributed among the scale factor bands.
-*
-**********************************************************************************/
-static void correctThresh(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
- PE_DATA *peData,
- Word32 thrExp[MAX_CHANNELS][MAX_GROUPED_SFB],
- const Word32 redVal,
- const Word16 nChannels,
- const Word32 deltaPe)
-{
- Word16 ch, sfb, sfbGrp,shift;
- PSY_OUT_CHANNEL *psyOutChan;
- PE_CHANNEL_DATA *peChanData;
- Word32 deltaSfbPe;
- Word32 normFactor;
- Word32 *psfbPeFactors;
- Word16 *psfbNActiveLines, *pahFlag;
- Word32 sfbEn, sfbThr;
- Word32 sfbThrReduced;
-
- /* for each sfb calc relative factors for pe changes */
- normFactor = 1;
- for(ch=0; ch<nChannels; ch++) {
- psyOutChan = &psyOutChannel[ch];
- peChanData = &peData->peChannelData[ch];
- for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
- psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;
- psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;
- pahFlag = ahFlag[ch] + sfbGrp;
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- Word32 redThrExp = thrExp[ch][sfbGrp+sfb] + redVal;
-
- if (((*pahFlag < AH_ACTIVE) || (deltaPe > 0)) && (redThrExp > 0) && (redThrExp >= *psfbNActiveLines)) {
-
- *psfbPeFactors = (*psfbNActiveLines) * (0x7fffffff / redThrExp);
- normFactor = L_add(normFactor, *psfbPeFactors);
- }
- else {
- *psfbPeFactors = 0;
- }
- psfbPeFactors++;
- pahFlag++; psfbNActiveLines++;
- }
- }
- }
-
-
- /* calculate new thresholds */
- for(ch=0; ch<nChannels; ch++) {
- psyOutChan = &psyOutChannel[ch];
- peChanData = &peData->peChannelData[ch];
- for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){
- psfbPeFactors = peData->sfbPeFactors[ch] + sfbGrp;
- psfbNActiveLines = peChanData->sfbNActiveLines + sfbGrp;
- pahFlag = ahFlag[ch] + sfbGrp;
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- /* pe difference for this sfb */
- deltaSfbPe = *psfbPeFactors * deltaPe;
-
- /* thr3(n) = thr2(n)*2^deltaSfbPe/b(n) */
- if (*psfbNActiveLines > 0 && (normFactor* (*psfbNActiveLines)) != 0) {
- /* new threshold */
- Word32 thrFactor;
- sfbEn = psyOutChan->sfbEnergy[sfbGrp+sfb];
- sfbThr = psyOutChan->sfbThreshold[sfbGrp+sfb];
-
- if(deltaSfbPe >= 0){
- /*
- reduce threshold
- */
- thrFactor = pow2_xy(L_negate(deltaSfbPe), (normFactor* (*psfbNActiveLines)));
-
- sfbThrReduced = L_mpy_ls(sfbThr, round16(thrFactor));
- }
- else {
- /*
- increase threshold
- */
- thrFactor = pow2_xy(deltaSfbPe, (normFactor * (*psfbNActiveLines)));
-
-
- if(thrFactor > sfbThr) {
- shift = norm_l(thrFactor);
- sfbThrReduced = Div_32( sfbThr << shift, thrFactor<<shift );
- }
- else {
- sfbThrReduced = MAX_32;
- }
-
- }
-
- /* avoid hole */
- sfbEn = L_mpy_ls(sfbEn, psyOutChan->sfbMinSnr[sfbGrp+sfb]);
-
- if ((sfbThrReduced > sfbEn) &&
- (*pahFlag == AH_INACTIVE)) {
- sfbThrReduced = max(sfbEn, sfbThr);
- *pahFlag = AH_ACTIVE;
- }
-
- psyOutChan->sfbThreshold[sfbGrp+sfb] = sfbThrReduced;
- }
-
- pahFlag++; psfbNActiveLines++; psfbPeFactors++;
- }
- }
- }
-}
-
-
-/********************************************************************************
-*
-* function name:reduceMinSnr
-* description: if the desired pe can not be reached, reduce pe by reducing minSnr
-*
-**********************************************************************************/
-static void reduceMinSnr(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PE_DATA *peData,
- Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
- const Word16 nChannels,
- const Word16 desiredPe)
-{
- Word16 ch, sfb, sfbSubWin;
- Word16 deltaPe;
-
- /* start at highest freq down to 0 */
- sfbSubWin = psyOutChannel[0].maxSfbPerGroup;
- while (peData->pe > desiredPe && sfbSubWin > 0) {
-
- sfbSubWin = sfbSubWin - 1;
- /* loop over all subwindows */
- for (sfb=sfbSubWin; sfb<psyOutChannel[0].sfbCnt;
- sfb+=psyOutChannel[0].sfbPerGroup) {
- /* loop over all channels */
- PE_CHANNEL_DATA* peChan = peData->peChannelData;
- PSY_OUT_CHANNEL* psyOutCh = psyOutChannel;
- for (ch=0; ch<nChannels; ch++) {
- if (ahFlag[ch][sfb] != NO_AH &&
- psyOutCh->sfbMinSnr[sfb] < minSnrLimit) {
- psyOutCh->sfbMinSnr[sfb] = minSnrLimit;
- psyOutCh->sfbThreshold[sfb] =
- L_mpy_ls(psyOutCh->sfbEnergy[sfb], psyOutCh->sfbMinSnr[sfb]);
-
- /* calc new pe */
- deltaPe = ((peChan->sfbNLines4[sfb] + (peChan->sfbNLines4[sfb] >> 1)) >> 2) -
- peChan->sfbPe[sfb];
- peData->pe = peData->pe + deltaPe;
- peChan->pe = peChan->pe + deltaPe;
- }
- peChan += 1; psyOutCh += 1;
- }
- /* stop if enough has been saved */
-
- if (peData->pe <= desiredPe)
- break;
- }
- }
-}
-
-/********************************************************************************
-*
-* function name:allowMoreHoles
-* description: if the desired pe can not be reached, some more scalefactor bands
-* have to be quantized to zero
-*
-**********************************************************************************/
-static void allowMoreHoles(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT *psyOutElement,
- PE_DATA *peData,
- Word16 ahFlag[MAX_CHANNELS][MAX_GROUPED_SFB],
- const AH_PARAM *ahParam,
- const Word16 nChannels,
- const Word16 desiredPe)
-{
- Word16 ch, sfb;
- Word16 actPe, shift;
-
- actPe = peData->pe;
-
- /* for MS allow hole in the channel with less energy */
-
- if (nChannels==2 &&
- psyOutChannel[0].windowSequence==psyOutChannel[1].windowSequence) {
- PSY_OUT_CHANNEL *psyOutChanL = &psyOutChannel[0];
- PSY_OUT_CHANNEL *psyOutChanR = &psyOutChannel[1];
- for (sfb=0; sfb<psyOutChanL->sfbCnt; sfb++) {
- Word32 minEn;
-
- if (psyOutElement->toolsInfo.msMask[sfb]) {
- /* allow hole in side channel ? */
- minEn = L_mpy_ls(psyOutChanL->sfbEnergy[sfb], (minSnrLimit * psyOutChanL->sfbMinSnr[sfb]) >> 16);
-
- if (ahFlag[1][sfb] != NO_AH &&
- minEn > psyOutChanR->sfbEnergy[sfb]) {
- ahFlag[1][sfb] = NO_AH;
- psyOutChanR->sfbThreshold[sfb] = L_add(psyOutChanR->sfbEnergy[sfb], psyOutChanR->sfbEnergy[sfb]);
- actPe = actPe - peData->peChannelData[1].sfbPe[sfb];
- }
- /* allow hole in mid channel ? */
- else {
- minEn = L_mpy_ls(psyOutChanR->sfbEnergy[sfb], (minSnrLimit * psyOutChanR->sfbMinSnr[sfb]) >> 16);
-
- if (ahFlag[0][sfb]!= NO_AH &&
- minEn > psyOutChanL->sfbEnergy[sfb]) {
- ahFlag[0][sfb] = NO_AH;
- psyOutChanL->sfbThreshold[sfb] = L_add(psyOutChanL->sfbEnergy[sfb], psyOutChanL->sfbEnergy[sfb]);
- actPe = actPe - peData->peChannelData[0].sfbPe[sfb];
- }
- }
-
- if (actPe < desiredPe)
- break;
- }
- }
- }
-
- /* subsequently erase bands */
- if (actPe > desiredPe) {
- Word16 startSfb[2];
- Word32 avgEn, minEn;
- Word16 ahCnt;
- Word16 enIdx;
- Word16 enDiff;
- Word32 en[4];
- Word16 minSfb, maxSfb;
- Flag done;
-
- /* do not go below startSfb */
- for (ch=0; ch<nChannels; ch++) {
-
- if (psyOutChannel[ch].windowSequence != SHORT_WINDOW)
- startSfb[ch] = ahParam->startSfbL;
- else
- startSfb[ch] = ahParam->startSfbS;
- }
-
- avgEn = 0;
- minEn = MAX_32;
- ahCnt = 0;
- for (ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
- for (sfb=startSfb[ch]; sfb<psyOutChan->sfbCnt; sfb++) {
-
- if ((ahFlag[ch][sfb] != NO_AH) &&
- (psyOutChan->sfbEnergy[sfb] > psyOutChan->sfbThreshold[sfb])) {
- minEn = min(minEn, psyOutChan->sfbEnergy[sfb]);
- avgEn = L_add(avgEn, psyOutChan->sfbEnergy[sfb]);
- ahCnt++;
- }
- }
- }
-
- if(ahCnt) {
- Word32 iahCnt;
- shift = norm_l(ahCnt);
- iahCnt = Div_32( 1 << shift, ahCnt << shift );
- avgEn = fixmul(avgEn, iahCnt);
- }
-
- enDiff = iLog4(avgEn) - iLog4(minEn);
- /* calc some energy borders between minEn and avgEn */
- for (enIdx=0; enIdx<4; enIdx++) {
- Word32 enFac;
- enFac = ((6-(enIdx << 1)) * enDiff);
- en[enIdx] = fixmul(avgEn, pow2_xy(L_negate(enFac),7*4));
- }
-
- /* start with lowest energy border at highest sfb */
- maxSfb = psyOutChannel[0].sfbCnt - 1;
- minSfb = startSfb[0];
-
- if (nChannels == 2) {
- maxSfb = max(maxSfb, (psyOutChannel[1].sfbCnt - 1));
- minSfb = min(minSfb, startSfb[1]);
- }
-
- sfb = maxSfb;
- enIdx = 0;
- done = 0;
- while (!done) {
-
- for (ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
-
- if (sfb>=startSfb[ch] && sfb<psyOutChan->sfbCnt) {
- /* sfb energy below border ? */
-
- if (ahFlag[ch][sfb] != NO_AH && psyOutChan->sfbEnergy[sfb] < en[enIdx]){
- /* allow hole */
- ahFlag[ch][sfb] = NO_AH;
- psyOutChan->sfbThreshold[sfb] = L_add(psyOutChan->sfbEnergy[sfb], psyOutChan->sfbEnergy[sfb]);
- actPe = actPe - peData->peChannelData[ch].sfbPe[sfb];
- }
-
- if (actPe < desiredPe) {
- done = 1;
- break;
- }
- }
- }
- sfb = sfb - 1;
-
- if (sfb < minSfb) {
- /* restart with next energy border */
- sfb = maxSfb;
- enIdx = enIdx + 1;
-
- if (enIdx - 4 >= 0)
- done = 1;
- }
- }
- }
-}
-
-/********************************************************************************
-*
-* function name:adaptThresholdsToPe
-* description: two guesses for the reduction value and one final correction of the
-* thresholds
-*
-**********************************************************************************/
-static void adaptThresholdsToPe(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT *psyOutElement,
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- PE_DATA *peData,
- const Word16 nChannels,
- const Word16 desiredPe,
- AH_PARAM *ahParam,
- MINSNR_ADAPT_PARAM *msaParam)
-{
- Word16 noRedPe, redPe, redPeNoAH;
- Word16 constPart, constPartNoAH;
- Word16 nActiveLines, nActiveLinesNoAH;
- Word16 desiredPeNoAH;
- Word32 redVal, avgThrExp;
- Word32 iter;
-
- calcThreshExp(peData->thrExp, psyOutChannel, nChannels);
-
- adaptMinSnr(psyOutChannel, logSfbEnergy, msaParam, nChannels);
-
- initAvoidHoleFlag(peData->ahFlag, psyOutChannel, psyOutElement, nChannels, ahParam);
-
- noRedPe = peData->pe;
- constPart = peData->constPart;
- nActiveLines = peData->nActiveLines;
-
- /* first guess of reduction value t^0.25 = 2^((a-pen)/4*b) */
- avgThrExp = pow2_xy((constPart - noRedPe), (nActiveLines << 2));
-
- /* r1 = 2^((a-per)/4*b) - t^0.25 */
- redVal = pow2_xy((constPart - desiredPe), (nActiveLines << 2)) - avgThrExp;
-
- /* reduce thresholds */
- reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal);
-
- /* pe after first guess */
- calcSfbPe(peData, psyOutChannel, nChannels);
- redPe = peData->pe;
-
- iter = 0;
- do {
- /* pe for bands where avoid hole is inactive */
- calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH,
- peData, peData->ahFlag, psyOutChannel, nChannels);
-
- desiredPeNoAH = desiredPe -(redPe - redPeNoAH);
-
- if (desiredPeNoAH < 0) {
- desiredPeNoAH = 0;
- }
-
- /* second guess */
-
- if (nActiveLinesNoAH > 0) {
-
- avgThrExp = pow2_xy((constPartNoAH - redPeNoAH), (nActiveLinesNoAH << 2));
-
- redVal = (redVal + pow2_xy((constPartNoAH - desiredPeNoAH), (nActiveLinesNoAH << 2))) - avgThrExp;
-
- /* reduce thresholds */
- reduceThresholds(psyOutChannel, peData->ahFlag, peData->thrExp, nChannels, redVal);
- }
-
- calcSfbPe(peData, psyOutChannel, nChannels);
- redPe = peData->pe;
-
- iter = iter+1;
-
- } while ((20 * abs_s(redPe - desiredPe) > desiredPe) && (iter < 2));
-
-
- if ((100 * redPe < 115 * desiredPe)) {
- correctThresh(psyOutChannel, peData->ahFlag, peData, peData->thrExp, redVal,
- nChannels, desiredPe - redPe);
- }
- else {
- Word16 desiredPe105 = (105 * desiredPe) / 100;
- reduceMinSnr(psyOutChannel, peData, peData->ahFlag,
- nChannels, desiredPe105);
- allowMoreHoles(psyOutChannel, psyOutElement, peData, peData->ahFlag,
- ahParam, nChannels, desiredPe105);
- }
-}
-
-
-/*****************************************************************************
-*
-* function name: calcBitSave
-* description: Calculates percentage of bit save, see figure below
-* returns:
-* input: parameters and bitres-fullness
-* output: percentage of bit save
-*
-*****************************************************************************/
-static Word16 calcBitSave(Word16 fillLevel,
- const Word16 clipLow,
- const Word16 clipHigh,
- const Word16 minBitSave,
- const Word16 maxBitSave)
-{
- Word16 bitsave = 0;
-
- fillLevel = max(fillLevel, clipLow);
- fillLevel = min(fillLevel, clipHigh);
-
- if(clipHigh-clipLow)
- bitsave = (maxBitSave - (((maxBitSave-minBitSave)*(fillLevel-clipLow))/
- (clipHigh-clipLow)));
-
- return (bitsave);
-}
-
-
-
-/*****************************************************************************
-*
-* function name: calcBitSpend
-* description: Calculates percentage of bit spend, see figure below
-* returns:
-* input: parameters and bitres-fullness
-* output: percentage of bit spend
-*
-*****************************************************************************/
-static Word16 calcBitSpend(Word16 fillLevel,
- const Word16 clipLow,
- const Word16 clipHigh,
- const Word16 minBitSpend,
- const Word16 maxBitSpend)
-{
- Word16 bitspend = 1;
-
- fillLevel = max(fillLevel, clipLow);
- fillLevel = min(fillLevel, clipHigh);
-
- if(clipHigh-clipLow)
- bitspend = (minBitSpend + ((maxBitSpend - minBitSpend)*(fillLevel - clipLow) /
- (clipHigh-clipLow)));
-
- return (bitspend);
-}
-
-
-/*****************************************************************************
-*
-* function name: adjustPeMinMax()
-* description: adjusts peMin and peMax parameters over time
-* returns:
-* input: current pe, peMin, peMax
-* output: adjusted peMin/peMax
-*
-*****************************************************************************/
-static void adjustPeMinMax(const Word16 currPe,
- Word16 *peMin,
- Word16 *peMax)
-{
- Word16 minFacHi, maxFacHi, minFacLo, maxFacLo;
- Word16 diff;
- Word16 minDiff = extract_l(currPe / 6);
- minFacHi = 30;
- maxFacHi = 100;
- minFacLo = 14;
- maxFacLo = 7;
-
- diff = currPe - *peMax ;
-
- if (diff > 0) {
- *peMin = *peMin + ((diff * minFacHi) / 100);
- *peMax = *peMax + ((diff * maxFacHi) / 100);
- } else {
- diff = *peMin - currPe;
-
- if (diff > 0) {
- *peMin = *peMin - ((diff * minFacLo) / 100);
- *peMax = *peMax - ((diff * maxFacLo) / 100);
- } else {
- *peMin = *peMin + ((currPe - *peMin) * minFacHi / 100);
- *peMax = *peMax - ((*peMax - currPe) * maxFacLo / 100);
- }
- }
-
-
- if ((*peMax - *peMin) < minDiff) {
- Word16 partLo, partHi;
-
- partLo = max(0, (currPe - *peMin));
- partHi = max(0, (*peMax - currPe));
-
- *peMax = currPe + ((partHi * minDiff) / (partLo + partHi));
- *peMin = currPe - ((partLo * minDiff) / (partLo + partHi));
- *peMin = max(0, *peMin);
- }
-}
-
-
-/*****************************************************************************
-*
-* function name: BitresCalcBitFac
-* description: calculates factor of spending bits for one frame
-* 1.0 : take all frame dynpart bits
-* >1.0 : take all frame dynpart bits + bitres
-* <1.0 : put bits in bitreservoir
-* returns: BitFac*100
-* input: bitres-fullness, pe, blockType, parameter-settings
-* output:
-*
-*****************************************************************************/
-static Word16 bitresCalcBitFac( const Word16 bitresBits,
- const Word16 maxBitresBits,
- const Word16 pe,
- const Word16 windowSequence,
- const Word16 avgBits,
- const Word16 maxBitFac,
- ADJ_THR_STATE *AdjThr,
- ATS_ELEMENT *adjThrChan)
-{
- BRES_PARAM *bresParam;
- Word16 pex;
- Word16 fillLevel;
- Word16 bitSave, bitSpend, bitresFac;
-
- fillLevel = extract_l((100* bitresBits) / maxBitresBits);
-
- if (windowSequence != SHORT_WINDOW)
- bresParam = &(AdjThr->bresParamLong);
- else
- bresParam = &(AdjThr->bresParamShort);
-
- pex = max(pe, adjThrChan->peMin);
- pex = min(pex,adjThrChan->peMax);
-
- bitSave = calcBitSave(fillLevel,
- bresParam->clipSaveLow, bresParam->clipSaveHigh,
- bresParam->minBitSave, bresParam->maxBitSave);
-
- bitSpend = calcBitSpend(fillLevel,
- bresParam->clipSpendLow, bresParam->clipSpendHigh,
- bresParam->minBitSpend, bresParam->maxBitSpend);
-
- if(adjThrChan->peMax != adjThrChan->peMin)
- bitresFac = (100 - bitSave) + extract_l(((bitSpend + bitSave) * (pex - adjThrChan->peMin)) /
- (adjThrChan->peMax - adjThrChan->peMin));
- else
- bitresFac = 0x7fff;
-
- bitresFac = min(bitresFac,
- (100-30 + extract_l((100 * bitresBits) / avgBits)));
-
- bitresFac = min(bitresFac, maxBitFac);
-
- adjustPeMinMax(pe, &adjThrChan->peMin, &adjThrChan->peMax);
-
- return bitresFac;
-}
-
-/*****************************************************************************
-*
-* function name: AdjThrInit
-* description: init thresholds parameter
-*
-*****************************************************************************/
-void AdjThrInit(ADJ_THR_STATE *hAdjThr,
- const Word32 meanPe,
- Word32 chBitrate)
-{
- ATS_ELEMENT* atsElem = &hAdjThr->adjThrStateElem;
- MINSNR_ADAPT_PARAM *msaParam = &atsElem->minSnrAdaptParam;
-
- /* common for all elements: */
- /* parameters for bitres control */
- hAdjThr->bresParamLong.clipSaveLow = 20;
- hAdjThr->bresParamLong.clipSaveHigh = 95;
- hAdjThr->bresParamLong.minBitSave = -5;
- hAdjThr->bresParamLong.maxBitSave = 30;
- hAdjThr->bresParamLong.clipSpendLow = 20;
- hAdjThr->bresParamLong.clipSpendHigh = 95;
- hAdjThr->bresParamLong.minBitSpend = -10;
- hAdjThr->bresParamLong.maxBitSpend = 40;
-
- hAdjThr->bresParamShort.clipSaveLow = 20;
- hAdjThr->bresParamShort.clipSaveHigh = 75;
- hAdjThr->bresParamShort.minBitSave = 0;
- hAdjThr->bresParamShort.maxBitSave = 20;
- hAdjThr->bresParamShort.clipSpendLow = 20;
- hAdjThr->bresParamShort.clipSpendHigh = 75;
- hAdjThr->bresParamShort.minBitSpend = -5;
- hAdjThr->bresParamShort.maxBitSpend = 50;
-
- /* specific for each element: */
-
- /* parameters for bitres control */
- atsElem->peMin = extract_l(((80*meanPe) / 100));
- atsElem->peMax = extract_l(((120*meanPe) / 100));
-
- /* additional pe offset to correct pe2bits for low bitrates */
- atsElem->peOffset = 0;
- if (chBitrate < 32000) {
- atsElem->peOffset = max(50, (100 - extract_l((100 * chBitrate) / 32000)));
- }
-
- /* avoid hole parameters */
- if (chBitrate > 20000) {
- atsElem->ahParam.modifyMinSnr = TRUE;
- atsElem->ahParam.startSfbL = 15;
- atsElem->ahParam.startSfbS = 3;
- }
- else {
- atsElem->ahParam.modifyMinSnr = FALSE;
- atsElem->ahParam.startSfbL = 0;
- atsElem->ahParam.startSfbS = 0;
- }
-
- /* minSnr adaptation */
- /* maximum reduction of minSnr goes down to minSnr^maxRed */
- msaParam->maxRed = 0x20000000; /* *0.25f */
- /* start adaptation of minSnr for avgEn/sfbEn > startRatio */
- msaParam->startRatio = 0x0ccccccd; /* 10 */
- /* maximum minSnr reduction to minSnr^maxRed is reached for
- avgEn/sfbEn >= maxRatio */
- msaParam->maxRatio = 0x0020c49c; /* 1000 */
- /* helper variables to interpolate minSnr reduction for
- avgEn/sfbEn between startRatio and maxRatio */
-
- msaParam->redRatioFac = 0xfb333333; /* -0.75/20 */
-
- msaParam->redOffs = 0x30000000; /* msaParam->redRatioFac * 10*log10(msaParam->startRatio) */
-
-
- /* pe correction */
- atsElem->peLast = 0;
- atsElem->dynBitsLast = 0;
- atsElem->peCorrectionFactor = 100; /* 1.0 */
-
-}
-
-/*****************************************************************************
-*
-* function name: calcPeCorrection
-* description: calculates the desired perceptual entropy factor
-* It is between 0.85 and 1.15
-*
-*****************************************************************************/
-static void calcPeCorrection(Word16 *correctionFac,
- const Word16 peAct,
- const Word16 peLast,
- const Word16 bitsLast)
-{
- Word32 peAct100 = 100 * peAct;
- Word32 peLast100 = 100 * peLast;
- Word16 peBitsLast = bits2pe(bitsLast);
-
- if ((bitsLast > 0) &&
- (peAct100 < (150 * peLast)) && (peAct100 > (70 * peLast)) &&
- ((120 * peBitsLast) > peLast100 ) && (( 65 * peBitsLast) < peLast100))
- {
- Word16 newFac = (100 * peLast) / peBitsLast;
- /* dead zone */
-
- if (newFac < 100) {
- newFac = min(((110 * newFac) / 100), 100);
- newFac = max(newFac, 85);
- }
- else {
- newFac = max(((90 * newFac) / 100), 100);
- newFac = min(newFac, 115);
- }
-
- if ((newFac > 100 && *correctionFac < 100) ||
- (newFac < 100 && *correctionFac > 100)) {
- *correctionFac = 100;
- }
- /* faster adaptation towards 1.0, slower in the other direction */
-
- if ((*correctionFac < 100 && newFac < *correctionFac) ||
- (*correctionFac > 100 && newFac > *correctionFac))
- *correctionFac = (85 * *correctionFac + 15 * newFac) / 100;
- else
- *correctionFac = (70 * *correctionFac + 30 * newFac) / 100;
- *correctionFac = min(*correctionFac, 115);
- *correctionFac = max(*correctionFac, 85);
- }
- else {
- *correctionFac = 100;
- }
-}
-
-/********************************************************************************
-*
-* function name: AdjustThresholds
-* description: Adjust thresholds to the desired bitrate
-*
-**********************************************************************************/
-void AdjustThresholds(ADJ_THR_STATE *adjThrState,
- ATS_ELEMENT *AdjThrStateElement,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT *psyOutElement,
- Word16 *chBitDistribution,
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
- QC_OUT_ELEMENT *qcOE,
- ELEMENT_BITS *elBits,
- const Word16 nChannels,
- const Word16 maxBitFac)
-{
- PE_DATA peData;
- Word16 noRedPe, grantedPe, grantedPeCorr;
- Word16 curWindowSequence;
- Word16 bitFactor;
- Word16 avgBits = (elBits->averageBits - (qcOE->staticBitsUsed + qcOE->ancBitsUsed));
- Word16 bitresBits = elBits->bitResLevel;
- Word16 maxBitresBits = elBits->maxBits;
- Word16 sideInfoBits = (qcOE->staticBitsUsed + qcOE->ancBitsUsed);
- Word16 ch;
- memset(&peData, 0, sizeof(peData));
-
- prepareSfbPe(&peData, psyOutChannel, logSfbEnergy, sfbNRelevantLines, nChannels, AdjThrStateElement->peOffset);
-
- /* pe without reduction */
- calcSfbPe(&peData, psyOutChannel, nChannels);
- noRedPe = peData.pe;
-
-
- curWindowSequence = LONG_WINDOW;
-
- if (nChannels == 2) {
-
- if ((psyOutChannel[0].windowSequence == SHORT_WINDOW) ||
- (psyOutChannel[1].windowSequence == SHORT_WINDOW)) {
- curWindowSequence = SHORT_WINDOW;
- }
- }
- else {
- curWindowSequence = psyOutChannel[0].windowSequence;
- }
-
-
- /* bit factor */
- bitFactor = bitresCalcBitFac(bitresBits, maxBitresBits, noRedPe+5*sideInfoBits,
- curWindowSequence, avgBits, maxBitFac,
- adjThrState,
- AdjThrStateElement);
-
- /* desired pe */
- grantedPe = ((bitFactor * bits2pe(avgBits)) / 100);
-
- /* correction of pe value */
- calcPeCorrection(&(AdjThrStateElement->peCorrectionFactor),
- min(grantedPe, noRedPe),
- AdjThrStateElement->peLast,
- AdjThrStateElement->dynBitsLast);
- grantedPeCorr = (grantedPe * AdjThrStateElement->peCorrectionFactor) / 100;
-
-
- if (grantedPeCorr < noRedPe && noRedPe > peData.offset) {
- /* calc threshold necessary for desired pe */
- adaptThresholdsToPe(psyOutChannel,
- psyOutElement,
- logSfbEnergy,
- &peData,
- nChannels,
- grantedPeCorr,
- &AdjThrStateElement->ahParam,
- &AdjThrStateElement->minSnrAdaptParam);
- }
-
- /* calculate relative distribution */
- for (ch=0; ch<nChannels; ch++) {
- Word16 peOffsDiff = peData.pe - peData.offset;
- chBitDistribution[ch] = 200;
-
- if (peOffsDiff > 0) {
- Word32 temp = 1000 - (nChannels * 200);
- chBitDistribution[ch] = chBitDistribution[ch] +
- (temp * peData.peChannelData[ch].pe) / peOffsDiff;
- }
- }
-
- /* store pe */
- qcOE->pe = noRedPe;
-
- /* update last pe */
- AdjThrStateElement->peLast = grantedPe;
-}
-
-/********************************************************************************
-*
-* function name: AdjThrUpdate
-* description: save dynBitsUsed for correction of bits2pe relation
-*
-**********************************************************************************/
-void AdjThrUpdate(ATS_ELEMENT *AdjThrStateElement,
- const Word16 dynBitsUsed)
-{
- AdjThrStateElement->dynBitsLast = dynBitsUsed;
-}
-
-
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s
deleted file mode 100644
index e705197..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/AutoCorrelation_v5.s
+++ /dev/null
@@ -1,167 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: AutoCorrelation_v5.s
-@
-@ Content: AutoCorrelation function armv5 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
-
- .section .text
- .global AutoCorrelation
-
-AutoCorrelation:
- stmdb sp!, {r4 - r11, lr}
-
- sub r13, r13, #20
-
- mov r5, r0
- mov r7, r1
- mov r9, r3
- mov r2, r2, lsl #16
- mov r0, #0
- mov r4, r2, asr #16
- mov r8, #0
- cmp r4, #0
- ble L136
-
- cmp r4, #8
- mov r2, #0
- blt L133
-
- sub r12, r4, #8
-L132:
- ldr r6, [r5, r2]
- add r2, r2, #4
- smulbb r3, r6, r6
- ldr r1, [r5, r2]
- smultt r10, r6, r6
- mov r3, r3, asr #9
- smulbb r6, r1, r1
- mov r10, r10, asr #9
- qadd r0, r0, r3
- smultt r11, r1, r1
- add r2, r2, #4
- qadd r0, r0, r10
- mov r6, r6, asr #9
- mov r11, r11, asr #9
- ldr r1, [r5, r2]
- qadd r0, r0, r6
- smulbb r10, r1, r1
- smultt r6, r1, r1
- qadd r0, r0, r11
- mov r10, r10, asr #9
- mov r6, r6, asr #9
- qadd r0, r0, r10
- add r2, r2, #4
- add r8, r8, #6
-
- qadd r0, r0, r6
- cmp r8, r12
- blt L132
-L133:
- ldrsh r6, [r5, r2]
- mul r10, r6, r6
- add r2, r2, #2
- mov r1, r10, asr #9
- qadd r0, r0, r1
-L134:
- add r8, r8, #1
- cmp r8, r4
- blt L133
-L135:
-L136:
- str r0, [r7, #0]
- cmp r0, #0
- beq L1320
-L137:
- mov r2, r9, lsl #16
- mov r8, #1
- mov r2, r2, asr #16
- cmp r2, #1
- ble L1319
-L138:
-L139:
- sub r4, r4, #1
- mov r14, #0
- mov r3, #0
- cmp r4, #0
- ble L1317
-L1310:
- cmp r4, #6
- addlt r6, r5, r8, lsl #1
- blt L1314
-L1311:
- add r6, r5, r8, lsl #1
- sub r12, r4, #6
- str r8, [r13, #8]
- str r7, [r13, #4]
-L1312:
- mov r1, r3, lsl #1
- ldrsh r7, [r6, r1]
- ldrsh r10, [r5, r1]
- add r8, r1, r6
- add r9, r5, r1
- mul r7, r10, r7
- ldrsh r1, [r8, #2]
- ldrsh r10, [r8, #4]
- add r7, r14, r7, asr #9
- ldrsh r0, [r9, #2]
- ldrsh r11, [r9, #4]
- mul r1, r0, r1
- ldrsh r14, [r8, #6]
- mul r10, r11, r10
- add r7, r7, r1, asr #9
- ldrsh r8, [r8, #8]
- add r3, r3, #5
- ldrsh r11, [r9, #6]
- ldrsh r1, [r9, #8]
- mul r14, r11, r14
- add r7, r7, r10, asr #9
- mul r1, r1, r8
- add r14, r7, r14, asr #9
- cmp r3, r12
- add r14, r14, r1, asr #9
- ble L1312
-L1313:
- ldr r8, [r13, #8]
- ldr r7, [r13, #4]
-L1314:
-L1315:
- mov r12, r3, lsl #1
- ldrsh r9, [r6, r12]
- ldrsh r12, [r5, r12]
- add r3, r3, #1
- cmp r3, r4
- mul r12, r12, r9
- add r14, r14, r12, asr #9
- blt L1315
-L1316:
-L1317:
- str r14, [r7, +r8, lsl #2]
- add r8, r8, #1
- cmp r8, r2
- blt L139
-
-L1319:
-L1320:
- add r13, r13, #20
- ldmia sp!, {r4 - r11, pc}
-
- @ENDP @ |AutoCorrelation|
- .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s
deleted file mode 100644
index b30e8cb..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/CalcWindowEnergy_v5.s
+++ /dev/null
@@ -1,112 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: CalcWindowEnergy_v5.s
-@
-@ Content: CalcWindowEnergy function armv5 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
- .section .text
-
- .global CalcWindowEnergy
-
-CalcWindowEnergy:
- stmdb sp!, {r4 - r11, lr}
- sub r13, r13, #20
-
- mov r3, r3, lsl #16
- ldr r10, [r0, #168] @ states0 = blockSwitchingControl->iirStates[0];
- mov r3, r3, asr #16
- ldr r11, [r0, #172] @ states1 = blockSwitchingControl->iirStates[1];
-
- mov r2, r2, lsl #16
- ldr r12, hiPassCoeff @ Coeff0 = hiPassCoeff[0];
- mov r2, r2, asr #16
- ldr r14, hiPassCoeff + 4 @ Coeff1 = hiPassCoeff[1];
-
- mov r8, #0 @ w=0
- mov r5, #0 @ wOffset = 0;
-
-BLOCK_BEGIN:
- mov r6, #0 @ accuUE = 0;
- mov r7, #0 @ accuFE = 0;
- mov r4, #0 @ i=0
-
- str r8, [r13, #4]
- str r0, [r13, #8]
- str r3, [r13, #12]
-
-ENERGY_BEG:
- mov r9, r5, lsl #1
- ldrsh r9, [r1, r9] @ tempUnfiltered = timeSignal[tidx];
-
- add r5, r5, r2 @ tidx = tidx + chIncrement;
-
- smulwb r3, r14, r9 @ accu1 = L_mpy_ls(Coeff1, tempUnfiltered);
- smull r0, r8, r12, r11 @ accu2 = fixmul( Coeff0, states1 );
-
- mov r3, r3, lsl #1
- mov r8, r8, lsl #1
-
- sub r0, r3, r10 @ accu3 = accu1 - states0;
- sub r8, r0, r8 @ out = accu3 - accu2;
-
- mov r10, r3 @ states0 = accu1;
- mov r11, r8 @ states1 = out;
-
- mul r3, r9, r9
- mov r8, r8, asr #16
-
- add r4, r4, #1
- add r6, r6, r3, asr #7
-
- mul r9, r8, r8
- ldr r3, [r13, #12]
-
- add r7, r7, r9, asr #7
-
- cmp r4, r3
- blt ENERGY_BEG
-
- ldr r0, [r13, #8]
- ldr r8, [r13, #4]
-
-ENERGY_END:
- add r4, r0, r8, lsl #2
-
- str r6, [r4, #72]
- add r8, r8, #1
- str r7, [r4, #136]
-
- cmp r8, #8
- blt BLOCK_BEGIN
-
-BLOCK_END:
- str r10, [r0, #168]
- str r11, [r0, #172]
- mov r0, #1
-
- add r13, r13, #20
- ldmia sp!, {r4 - r11, pc}
-
-hiPassCoeff:
- .word 0xbec8b439
- .word 0x609d4952
-
- @ENDP
- .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s
deleted file mode 100644
index da21d5f..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/PrePostMDCT_v5.s
+++ /dev/null
@@ -1,131 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: PrePostMDCT_v5.s
-@
-@ Content: premdct and postmdct function armv5 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
- .section .text
- .global PreMDCT
-
-PreMDCT:
- stmdb sp!, {r4 - r11, lr}
-
- add r9, r0, r1, lsl #2
- sub r3, r9, #8
-
- movs r1, r1, asr #2
- beq PreMDCT_END
-
-PreMDCT_LOOP:
- ldr r8, [r2], #4
- ldr r9, [r2], #4
-
- ldrd r4, [r0]
- ldrd r6, [r3]
-
- smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
- smull r10, r12, r7, r8 @ MULHIGH(ti1, cosa)
-
- smull r14, r8, r7, r9 @ MULHIGH(ti1, sina)
- smull r7, r10, r4, r9 @ MULHIGH(tr1, sina)
-
- add r11, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
- sub r7, r12, r10 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)
-
- ldr r8, [r2], #4
- ldr r9, [r2], #4
-
- smull r14, r4, r6, r8 @ MULHIGH(tr2, cosa)
- smull r10, r12, r5, r8 @ MULHIGH(ti2, cosa)
-
- smull r14, r8, r5, r9 @ MULHIGH(ti2, sina)
- smull r5, r10, r6, r9 @ MULHIGH(tr2, sina)
-
- add r8, r8, r4
- sub r9, r12, r10
-
- mov r6, r11
-
- strd r6, [r0]
- strd r8, [r3]
-
- subs r1, r1, #1
- sub r3, r3, #8
- add r0, r0, #8
- bne PreMDCT_LOOP
-
-PreMDCT_END:
- ldmia sp!, {r4 - r11, pc}
- @ENDP @ |PreMDCT|
-
- .section .text
- .global PostMDCT
-
-PostMDCT:
- stmdb sp!, {r4 - r11, lr}
-
- add r9, r0, r1, lsl #2
- sub r3, r9, #8
-
- movs r1, r1, asr #2
- beq PostMDCT_END
-
-PostMDCT_LOOP:
- ldr r8, [r2], #4
- ldr r9, [r2], #4
-
- ldrd r4, [r0]
- ldrd r6, [r3]
-
- smull r14, r11, r4, r8 @ MULHIGH(tr1, cosa)
- smull r10, r12, r5, r8 @ MULHIGH(ti1, cosa)
-
- smull r14, r8, r5, r9 @ MULHIGH(ti1, sina)
- smull r5, r10, r4, r9 @ MULHIGH(tr1, sina)
-
- add r4, r11, r8 @ MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
- sub r11, r10, r12 @ MULHIGH(ti1, cosa) - MULHIGH(tr1, sina)@
-
- ldr r8, [r2], #4 @
- ldr r9, [r2], #4
-
- smull r14, r5, r6, r8 @ MULHIGH(tr2, cosa)
- smull r10, r12, r7, r8 @ MULHIGH(ti2, cosa)
-
- smull r14, r8, r7, r9 @ MULHIGH(ti2, sina)
- smull r7, r10, r6, r9 @ MULHIGH(tr2, sina)
-
- add r6, r8, r5 @ MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2)@
- sub r5, r10, r12 @ MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2)@
-
- mov r7, r11
-
- strd r4, [r0]
- strd r6, [r3]
-
- subs r1, r1, #1
- sub r3, r3, #8
- add r0, r0, #8
- bne PostMDCT_LOOP
-
-PostMDCT_END:
- ldmia sp!, {r4 - r11, pc}
- @ENDP @ |PostMDCT|
- .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s
deleted file mode 100644
index 4ca4f31..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/R4R8First_v5.s
+++ /dev/null
@@ -1,252 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: R4R8First_v5.s
-@
-@ Content: Radix8First and Radix4First function armv5 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
- .section .text
- .global Radix4First
-
-Radix4First:
- stmdb sp!, {r4 - r11, lr}
-
- movs r10, r1
- mov r11, r0
- beq Radix4First_END
-
-Radix4First_LOOP:
- ldrd r0, [r11]
- ldrd r2, [r11, #8]
- ldrd r4, [r11, #16]
- ldrd r6, [r11, #24]
-
- add r8, r0, r2
- add r9, r1, r3
-
- sub r0, r0, r2
- sub r1, r1, r3
-
- add r2, r4, r6
- add r3, r5, r7
-
- sub r4, r4, r6
- sub r5, r5, r7
-
- add r6, r8, r2
- add r7, r9, r3
-
- sub r8, r8, r2
- sub r9, r9, r3
-
- add r2, r0, r5
- sub r3, r1, r4
-
- sub r0, r0, r5
- add r1, r1, r4
-
- strd r6, [r11]
- strd r2, [r11, #8]
- strd r8, [r11, #16]
- strd r0, [r11, #24]
-
- subs r10, r10, #1
- add r11, r11, #32
- bne Radix4First_LOOP
-
-Radix4First_END:
- ldmia sp!, {r4 - r11, pc}
- @ENDP @ |Radix4First|
-
- .section .text
- .global Radix8First
-
-Radix8First:
- stmdb sp!, {r4 - r11, lr}
- sub sp, sp, #0x24
-
- mov r12, r1
- mov r14, r0
- cmp r12, #0
- beq Radix8First_END
-
-Radix8First_LOOP:
- ldrd r0, [r14]
- ldrd r2, [r14, #8]
- ldrd r4, [r14, #16]
- ldrd r6, [r14, #24]
-
- add r8, r0, r2 @ r0 = buf[0] + buf[2]@
- add r9, r1, r3 @ i0 = buf[1] + buf[3]@
-
- sub r0, r0, r2 @ r1 = buf[0] - buf[2]@
- sub r1, r1, r3 @ i1 = buf[1] - buf[3]@
-
- add r2, r4, r6 @ r2 = buf[4] + buf[6]@
- add r3, r5, r7 @ i2 = buf[5] + buf[7]@
-
- sub r4, r4, r6 @ r3 = buf[4] - buf[6]@
- sub r5, r5, r7 @ i3 = buf[5] - buf[7]@
-
- add r6, r8, r2 @ r4 = (r0 + r2) >> 1@
- add r7, r9, r3 @ i4 = (i0 + i2) >> 1@
-
- sub r8, r8, r2 @ r5 = (r0 - r2) >> 1@
- sub r9, r9, r3 @ i5 = (i0 - i2) >> 1@
-
- sub r2, r0, r5 @ r6 = (r1 - i3) >> 1@
- add r3, r1, r4 @ i6 = (i1 + r3) >> 1@
-
- add r0, r0, r5 @ r7 = (r1 + i3) >> 1@
- sub r1, r1, r4 @ i7 = (i1 - r3) >> 1@
-
- mov r6, r6, asr #1 @
- mov r7, r7, asr #1 @
-
- mov r8, r8, asr #1
- mov r9, r9, asr #1
-
- mov r2, r2, asr #1
- mov r3, r3, asr #1
-
- mov r0, r0, asr #1
- mov r1, r1, asr #1
-
- str r6, [sp]
- str r7, [sp, #4]
-
- str r8, [sp, #8]
- str r9, [sp, #12]
-
- str r2, [sp, #16]
- str r3, [sp, #20]
-
- str r0, [sp, #24]
- str r1, [sp, #28]
-
- ldrd r2, [r14, #32]
- ldrd r4, [r14, #40]
- ldrd r6, [r14, #48]
- ldrd r8, [r14, #56]
-
- add r0, r2, r4 @ r0 = buf[ 8] + buf[10]@
- add r1, r3, r5 @ i0 = buf[ 9] + buf[11]@
-
- sub r2, r2, r4 @ r1 = buf[ 8] - buf[10]@
- sub r3, r3, r5 @ i1 = buf[ 9] - buf[11]@
-
- add r4, r6, r8 @ r2 = buf[12] + buf[14]@
- add r5, r7, r9 @ i2 = buf[13] + buf[15]@
-
- sub r6, r6, r8 @ r3 = buf[12] - buf[14]@
- sub r7, r7, r9 @ i3 = buf[13] - buf[15]@
-
- add r8, r0, r4 @ t0 = (r0 + r2)
- add r9, r1, r5 @ t1 = (i0 + i2)
-
- sub r0, r0, r4 @ t2 = (r0 - r2)
- sub r1, r1, r5 @ t3 = (i0 - i2)
-
- mov r8, r8, asr #1
- ldr r4, [sp]
-
- mov r9, r9, asr #1
- ldr r5, [sp, #4]
-
- mov r0, r0, asr #1
- mov r1, r1, asr #1
-
- add r10, r4, r8 @ buf[ 0] = r4 + t0@
- add r11, r5, r9 @ buf[ 1] = i4 + t1@
-
- sub r4, r4, r8 @ buf[ 8] = r4 - t0@
- sub r5, r5, r9 @ buf[ 9] = i4 - t1@
-
- strd r10, [r14]
- strd r4, [r14, #32]
-
- ldr r10, [sp, #8]
- ldr r11, [sp, #12]
-
- add r4, r10, r1 @ buf[ 4] = r5 + t3@
- sub r5, r11, r0 @ buf[ 5] = i5 - t2@
-
- sub r10, r10, r1 @ buf[12] = r5 - t3@
- add r11, r11, r0 @ buf[13] = i5 + t2@
-
- strd r4, [r14, #16]
- strd r10, [r14, #48]
-
- sub r0, r2, r7 @ r0 = r1 - i3@
- add r1, r3, r6 @ i0 = i1 + r3@
-
- ldr r11, DATATab
-
- add r2, r2, r7 @ r2 = r1 + i3@
- sub r3, r3, r6 @ i2 = i1 - r3@
-
- sub r4, r0, r1 @ r0 - i0
- add r5, r0, r1 @ r0 + i0
-
- sub r0, r2, r3 @ r2 - i2
- add r1, r2, r3 @ r2 + i2
-
- smull r8, r6, r4, r11
- smull r9, r7, r5, r11
-
- ldr r2, [sp, #16]
- ldr r3, [sp, #20]
-
- smull r8, r4, r0, r11
- smull r9, r5, r1, r11
-
- ldr r10, [sp, #24]
- ldr r11, [sp, #28]
-
- sub r8, r2, r6
- sub r9, r3, r7
-
- add r2, r2, r6
- add r3, r3, r7
-
- add r6, r10, r5
- sub r7, r11, r4
-
- sub r0, r10, r5
- add r1, r11, r4
-
- strd r6, [r14, #8]
- strd r8, [r14, #24]
- strd r0, [r14, #40]
- strd r2, [r14, #56]
-
- subs r12, r12, #1
- add r14, r14, #64
-
- bne Radix8First_LOOP
-
-Radix8First_END:
- add sp, sp, #0x24
- ldmia sp!, {r4 - r11, pc}
-
-DATATab:
- .word 0x5a82799a
-
- @ENDP @ |Radix8First|
- .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s
deleted file mode 100644
index b59b967..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/Radix4FFT_v5.s
+++ /dev/null
@@ -1,169 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: Radix4FFT_v5.s
-@
-@ Content: Radix4FFT armv5 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- .section .text
- .global Radix4FFT
-
-Radix4FFT:
- stmdb sp!, {r4 - r11, lr}
- sub sp, sp, #32
-
- mov r1, r1, asr #2
- cmp r1, #0
- beq Radix4FFT_END
-
-Radix4FFT_LOOP1:
- mov r14, r0 @ xptr = buf@
- mov r10, r1 @ i = num@
- mov r9, r2, lsl #3 @ step = 2*bgn@
- cmp r10, #0
- str r0, [sp]
- str r1, [sp, #4]
- str r2, [sp, #8]
- str r3, [sp, #12]
- beq Radix4FFT_LOOP1_END
-
-Radix4FFT_LOOP2:
- mov r12, r3 @ csptr = twidTab@
- mov r11, r2 @ j = bgn
- cmp r11, #0
- str r10, [sp, #16]
- beq Radix4FFT_LOOP2_END
-
-Radix4FFT_LOOP3:
- str r11, [sp, #20]
-
- ldrd r0, [r14, #0] @ r0 = xptr[0]@ r1 = xptr[1]@
- add r14, r14, r9 @ xptr += step@
-
- ldrd r10, [r14, #0] @ r2 = xptr[0]@ r3 = xptr[1]@
- ldr r8, [r12], #4 @ cosxsinx = csptr[0]@
-
- smulwt r4, r10, r8 @ L_mpy_wx(cosx, t0)
- smulwt r3, r11, r8 @ L_mpy_wx(cosx, t1)
-
- smlawb r2, r11, r8, r4 @ r2 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
- smulwb r5, r10, r8 @ L_mpy_wx(sinx, t0)
-
- mov r10, r0, asr #2 @ t0 = r0 >> 2@
- mov r11, r1, asr #2 @ t1 = r1 >> 2@
-
- sub r3, r3, r5 @ r3 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
- add r14, r14, r9 @ xptr += step@
-
- sub r0, r10, r2 @ r0 = t0 - r2@
- sub r1, r11, r3 @ r1 = t1 - r3@
-
- add r2, r10, r2 @ r2 = t0 + r2@
- add r3, r11, r3 @ r3 = t1 + r3@
-
- str r2, [sp, #24]
- str r3, [sp, #28]
-
- ldrd r10, [r14, #0] @ r4 = xptr[0]@ r5 = xptr[1]@
- ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
-
- smulwt r6, r10, r8 @ L_mpy_wx(cosx, t0)
- smulwt r5, r11, r8 @ L_mpy_wx(cosx, t1)
-
- smlawb r4, r11, r8, r6 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
- smulwb r7, r10, r8 @ L_mpy_wx(sinx, t0)
-
- add r14, r14, r9 @ xptr += step@
- sub r5, r5, r7 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
-
- ldrd r10, [r14] @ r6 = xptr[0]@ r7 = xptr[1]@
- ldr r8, [r12], #4 @ cosxsinx = csptr[1]@
-
- smulwt r2, r10, r8 @ L_mpy_wx(cosx, t0)
- smulwt r7, r11, r8 @ L_mpy_wx(cosx, t1)
-
- smlawb r6, r11, r8, r2 @ r4 = L_mpy_wx(cosx, t0) + L_mpy_wx(sinx, t1)@
- smulwb r3, r10, r8 @ L_mpy_wx(sinx, t0)
-
- mov r10, r4 @ t0 = r4@
- mov r11, r5 @ t1 = r5@
-
- sub r7, r7, r3 @ r5 = L_mpy_wx(cosx, t1) - L_mpy_wx(sinx, t0)@
-
-
- add r4, r10, r6 @ r4 = t0 + r6@
- sub r5, r7, r11 @ r5 = r7 - t1@
-
- sub r6, r10, r6 @ r6 = t0 - r6@
- add r7, r7, r11 @ r7 = r7 + t1@
-
- ldr r2, [sp, #24]
- ldr r3, [sp, #28]
-
- add r10, r0, r5 @ xptr[0] = r0 + r5@
- add r11, r1, r6 @ xptr[0] = r1 + r6
-
- strd r10, [r14]
- sub r14, r14, r9 @ xptr -= step@
-
- sub r10, r2, r4 @ xptr[0] = r2 - r4@
- sub r11, r3, r7 @ xptr[1] = r3 - r7@
-
- strd r10, [r14]
- sub r14, r14, r9 @ xptr -= step@
-
- sub r10, r0, r5 @ xptr[0] = r0 - r5@
- sub r11, r1, r6 @ xptr[0] = r1 - r6
-
- strd r10, [r14]
- sub r14, r14, r9 @ xptr -= step@
-
- add r10, r2, r4 @ xptr[0] = r2 - r4@
- add r11, r3, r7 @ xptr[1] = r3 - r7@
-
- strd r10, [r14]
- add r14, r14, #8 @ xptr += 2@
-
- ldr r11, [sp, #20]
- subs r11, r11, #1
- bne Radix4FFT_LOOP3
-
-Radix4FFT_LOOP2_END:
- ldr r10, [sp, #16]
- ldr r3, [sp, #12]
- ldr r2, [sp, #8]
- rsb r8, r9, r9, lsl #2
- sub r10, r10, #1
- add r14, r14, r8
- cmp r10, #0
- bhi Radix4FFT_LOOP2
-
-Radix4FFT_LOOP1_END:
- ldr r0, [sp]
- ldr r1, [sp, #4]
- add r3, r3, r8, asr #1
- mov r2, r2, lsl #2
- movs r1, r1, asr #2
- bne Radix4FFT_LOOP1
-
-Radix4FFT_END:
- add sp, sp, #32
- ldmia sp!, {r4 - r11, pc}
-
- @ENDP @ |Radix4FFT|
- .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s
deleted file mode 100644
index 4789f6d..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV5E/band_nrg_v5.s
+++ /dev/null
@@ -1,204 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: band_nrg_v5.s
-@
-@ Content: CalcBandEnergy and CalcBandEnergyMS function armv5 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
- .section .text
-
- .global CalcBandEnergy
-
-CalcBandEnergy:
- stmdb sp!, {r4 - r11, lr}
-
- mov r2, r2, lsl #16
- ldr r12, [r13, #36]
- mov r9, #0
- mov r5, r2, asr #16
- mov r4, #0
- cmp r5, #0
- ble L212
-
-L22:
- mov r2, r4, lsl #1
- ldrsh r10, [r1, r2]
- add r11, r1, r2
- ldrsh r2, [r11, #2]
- mov r14, #0
- cmp r10, r2
- bge L28
-
-L23:
- ldr r11, [r0, +r10, lsl #2]
- add r10, r10, #1
- ldr r6, [r0, +r10, lsl #2]
- smull r11, r7, r11, r11
- add r10, r10, #1
- smull r6, r8, r6, r6
- ldr r11, [r0, +r10, lsl #2]
- qadd r14, r14, r7
- add r10, r10, #1
- smull r11, r7, r11, r11
- ldr r6, [r0, +r10, lsl #2]
- qadd r14, r14, r8
- smull r6, r8, r6, r6
- add r10, r10, #1
- qadd r14, r14, r7
- cmp r10, r2
- qadd r14, r14, r8
- blt L23
-
-L28:
- qadd r14, r14, r14
- str r14, [r3, +r4, lsl #2]
- add r4, r4, #1
- qadd r9, r9, r14
- cmp r4, r5
-
- blt L22
-
-L212:
- str r9, [r12, #0]
- ldmia sp!, {r4 - r11, pc}
-
- @ENDP ; |CalcBandEnergy|
-
- .global CalcBandEnergyMS
-
-CalcBandEnergyMS:
- stmdb sp!, {r4 - r11, lr}
- sub r13, r13, #24
-
- mov r12, #0
- mov r3, r3, lsl #16
- mov r14, #0
- mov r3, r3, asr #16
- cmp r3, #0
- mov r4, #0
- ble L315
-
-L32:
- mov r5, r4, lsl #1
- mov r6, #0
- ldrsh r10, [r2, r5]
- add r5, r2, r5
- mov r7, #0
- ldrsh r11, [r5, #2]
- cmp r10, r11
- bge L39
-
- str r3, [r13, #4]
- str r4, [r13, #8]
- str r12, [r13, #12]
- str r14, [r13, #16]
-
-L33:
- ldr r8, [r0, +r10, lsl #2]
- ldr r9, [r1, +r10, lsl #2]
- mov r8, r8, asr #1
- add r10, r10, #1
- mov r9, r9, asr #1
-
- ldr r12, [r0, +r10, lsl #2]
- add r5, r8, r9
- ldr r14, [r1, +r10, lsl #2]
- sub r8, r8, r9
-
- smull r5, r3, r5, r5
- mov r12, r12, asr #1
- smull r8, r4, r8, r8
- mov r14, r14, asr #1
-
- qadd r6, r6, r3
- add r5, r12, r14
- qadd r7, r7, r4
- sub r8, r12, r14
-
- smull r5, r3, r5, r5
- add r10, r10, #1
- smull r8, r4, r8, r8
-
- qadd r6, r6, r3
- qadd r7, r7, r4
-
- ldr r8, [r0, +r10, lsl #2]
- ldr r9, [r1, +r10, lsl #2]
- mov r8, r8, asr #1
- add r10, r10, #1
- mov r9, r9, asr #1
-
- ldr r12, [r0, +r10, lsl #2]
- add r5, r8, r9
- ldr r14, [r1, +r10, lsl #2]
- sub r8, r8, r9
-
- smull r5, r3, r5, r5
- mov r12, r12, asr #1
- smull r8, r4, r8, r8
- mov r14, r14, asr #1
-
- qadd r6, r6, r3
- add r5, r12, r14
- qadd r7, r7, r4
- sub r8, r12, r14
-
- smull r5, r3, r5, r5
- add r10, r10, #1
- smull r8, r4, r8, r8
-
- qadd r6, r6, r3
- qadd r7, r7, r4
-
- cmp r10, r11
-
- blt L33
-
- ldr r3, [r13, #4]
- ldr r4, [r13, #8]
- ldr r12, [r13, #12]
- ldr r14, [r13, #16]
-L39:
- qadd r6, r6, r6
- qadd r7, r7, r7
-
- ldr r8, [r13, #60]
- ldr r9, [r13, #68]
-
- qadd r12, r12, r6
- qadd r14, r14, r7
-
- str r6, [r8, +r4, lsl #2]
- str r7, [r9, +r4, lsl #2]
-
- add r4, r4, #1
- cmp r4, r3
- blt L32
-
-L315:
- ldr r8, [r13, #64]
- ldr r9, [r13, #72]
- str r12, [r8, #0]
- str r14, [r9, #0]
-
- add r13, r13, #24
- ldmia sp!, {r4 - r11, pc}
- @ENDP ; |CalcBandEnergyMS|
-
- .end
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s
deleted file mode 100644
index 7f6b881..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/PrePostMDCT_v7.s
+++ /dev/null
@@ -1,146 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: PrePostMDCT_v7.s
-@
-@ Content: premdct and postmdct function armv7 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
- .section .text
- .global PreMDCT
- .fnstart
-
-PreMDCT:
- stmdb sp!, {r4 - r11, lr}
- .save {r4 - r11, lr}
- fstmfdd sp!, {d8 - d15}
- .vsave {d8 - d15}
-
- add r9, r0, r1, lsl #2
- sub r3, r9, #32
-
- movs r1, r1, asr #2
- beq PreMDCT_END
-
-PreMDCT_LOOP:
- VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
- VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
- VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@
- VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
- VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@
-
- VREV64.32 Q8, Q7
- VREV64.32 Q9, Q6
-
-
- VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
- VQDMULH.S32 Q11, Q1, Q8 @ MULHIGH(sina, ti1)
- VQDMULH.S32 Q12, Q0, Q8 @ MULHIGH(cosa, ti1)
- VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
-
- VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
- VSUB.S32 Q1, Q12, Q13 @ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@
-
- VST2.I32 {d0, d1, d2, d3}, [r0]!
- sub r3, r3, #32
-
- VQDMULH.S32 Q10, Q2, Q9 @ MULHIGH(cosb, tr2)
- VQDMULH.S32 Q11, Q3, Q5 @ MULHIGH(sinb, ti2)
- VQDMULH.S32 Q12, Q2, Q5 @ MULHIGH(cosb, ti2)
- VQDMULH.S32 Q13, Q3, Q9 @ MULHIGH(sinb, tr2)
-
- VADD.S32 Q0, Q10, Q11 @ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
- VSUB.S32 Q1, Q12, Q13 @ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@
-
- VREV64.32 Q3, Q1
- VREV64.32 Q2, Q0
-
- VST2.I32 {d5, d7}, [r3]!
- VST2.I32 {d4, d6}, [r3]!
-
- subs r1, r1, #4
- sub r3, r3, #64
- bne PreMDCT_LOOP
-
-PreMDCT_END:
- fldmfdd sp!, {d8 - d15}
- ldmia sp!, {r4 - r11, pc}
- @ENDP @ |PreMDCT|
- .fnend
-
- .section .text
- .global PostMDCT
- .fnstart
-
-PostMDCT:
- stmdb sp!, {r4 - r11, lr}
- .save {r4 - r11, lr}
- fstmfdd sp!, {d8 - d15}
- .vsave {d8 - d15}
-
- add r9, r0, r1, lsl #2
- sub r3, r9, #32
-
- movs r1, r1, asr #2
- beq PostMDCT_END
-
-PostMDCT_LOOP:
- VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@
- VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@
- VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@
- VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
- VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@
-
- VREV64.32 Q8, Q6
- VREV64.32 Q9, Q7
-
- VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1)
- VQDMULH.S32 Q11, Q1, Q5 @ MULHIGH(sina, ti1)
- VQDMULH.S32 Q12, Q0, Q5 @ MULHIGH(cosa, ti1)
- VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1)
-
- VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@
- VSUB.S32 Q5, Q13, Q12 @ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@
-
- VQDMULH.S32 Q10, Q2, Q8 @ MULHIGH(cosb, tr2)
- VQDMULH.S32 Q11, Q3, Q9 @ MULHIGH(sinb, ti2)
- VQDMULH.S32 Q12, Q2, Q9 @ MULHIGH(cosb, ti2)
- VQDMULH.S32 Q13, Q3, Q8 @ MULHIGH(sinb, tr2)
-
- VADD.S32 Q4, Q10, Q11 @ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@
- VSUB.S32 Q1, Q13, Q12 @ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@
-
- VREV64.32 Q2, Q4
- VREV64.32 Q3, Q5
-
- sub r3, r3, #32
- VST2.I32 {d0, d1, d2, d3}, [r0]!
-
- VST2.I32 {d5, d7}, [r3]!
- VST2.I32 {d4, d6}, [r3]!
-
- subs r1, r1, #4
- sub r3, r3, #64
- bne PostMDCT_LOOP
-
-PostMDCT_END:
- fldmfdd sp!, {d8 - d15}
- ldmia sp!, {r4 - r11, pc}
-
- @ENDP @ |PostMDCT|
- .fnend
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s
deleted file mode 100644
index 03fa6a9..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/R4R8First_v7.s
+++ /dev/null
@@ -1,157 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: R4R8First_v7.s
-@
-@ Content: Radix8First and Radix4First function armv7 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
- .section .text
- .global Radix8First
- .fnstart
-
-Radix8First:
- stmdb sp!, {r4 - r11, lr}
- .save {r4 - r11, lr}
- fstmfdd sp!, {d8 - d15}
- .vsave {d8 - d15}
-
- ldr r3, SQRT1_2
- cmp r1, #0
-
- VDUP.I32 Q15, r3
- beq Radix8First_END
-
-Radix8First_LOOP:
- VLD1.I32 {d0, d1, d2, d3}, [r0]!
- VLD1.I32 {d8, d9, d10, d11}, [r0]!
-
- VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@i0 = buf[1] + buf[3]@
- VSUB.S32 d5, d0, d1 @ r1 = buf[0] - buf[2]@i1 = buf[1] - buf[3]@
- VSUB.S32 d7, d2, d3 @ r2 = buf[4] - buf[6]@i2 = buf[5] - buf[7]@
- VADD.S32 d6, d2, d3 @ r3 = buf[4] + buf[6]@i3 = buf[5] + buf[7]@
- VREV64.I32 d7, d7
-
- VADD.S32 Q0, Q2, Q3 @ r4 = (r0 + r2)@i4 = (i0 + i2)@i6 = (i1 + r3)@r7 = (r1 + i3)
- VSUB.S32 Q1, Q2, Q3 @ r5 = (r0 - r2)@i5 = (i0 - i2)@r6 = (r1 - i3)@i7 = (i1 - r3)@
-
- VREV64.I32 d3, d3
-
- VADD.S32 d4, d8, d9 @ r0 = buf[ 8] + buf[10]@i0 = buf[ 9] + buf[11]@
- VSUB.S32 d7, d10, d11 @ r1 = buf[12] - buf[14]@i1 = buf[13] - buf[15]@
- VADD.S32 d6, d10, d11 @ r2 = buf[12] + buf[14]@i2 = buf[13] + buf[15]@
- VREV64.I32 d7, d7
- VSUB.S32 d5, d8, d9 @ r3 = buf[ 8] - buf[10]@i3 = buf[ 9] - buf[11]@
-
- VTRN.32 d1, d3
-
- VADD.S32 Q4, Q2, Q3 @ t0 = (r0 + r2) >> 1@t1 = (i0 + i2) >> 1@i0 = i1 + r3@r2 = r1 + i3@
- VSUB.S32 Q5, Q2, Q3 @ t2 = (r0 - r2) >> 1@t3 = (i0 - i2) >> 1@r0 = r1 - i3@i2 = i1 - r3@
-
- VREV64.I32 d3, d3
-
- VSHR.S32 d8, d8, #1
- VSHR.S32 Q0, Q0, #1
- VREV64.I32 d10, d10
- VTRN.32 d11, d9
- VSHR.S32 Q1, Q1, #1
- VSHR.S32 d10, d10, #1
- VREV64.I32 d9, d9
-
- sub r0, r0, #0x40
-
- VADD.S32 d12, d0, d8
- VSUB.S32 d16, d0, d8
- VADD.S32 d14, d2, d10
- VSUB.S32 d18, d2, d10
-
- VSUB.S32 d4, d11, d9
- VADD.S32 d5, d11, d9
-
- VREV64.I32 d18, d18
-
- VQDMULH.S32 Q3, Q2, Q15
- VTRN.32 d14, d18
- VTRN.32 d6, d7
- VREV64.I32 d18, d18
-
- VSUB.S32 d15, d3, d6
- VREV64.I32 d7, d7
- VADD.S32 d19, d3, d6
- VADD.S32 d13, d1, d7
- VSUB.S32 d17, d1, d7
-
- VREV64.I32 d17, d17
- VTRN.32 d13, d17
- VREV64.I32 d17, d17
-
- subs r1, r1, #1
-
- VST1.I32 {d12, d13, d14, d15}, [r0]!
- VST1.I32 {d16, d17, d18, d19}, [r0]!
- bne Radix8First_LOOP
-
-Radix8First_END:
- fldmfdd sp!, {d8 - d15}
- ldmia sp!, {r4 - r11, pc}
-SQRT1_2:
- .word 0x2d413ccd
-
- @ENDP @ |Radix8First|
- .fnend
-
- .section .text
- .global Radix4First
- .fnstart
-
-Radix4First:
- stmdb sp!, {r4 - r11, lr}
- .save {r4 - r11, lr}
- fstmfdd sp!, {d8 - d15}
- .vsave {d8 - d15}
-
- cmp r1, #0
- beq Radix4First_END
-
-Radix4First_LOOP:
- VLD1.I32 {d0, d1, d2, d3}, [r0]
-
- VADD.S32 d4, d0, d1 @ r0 = buf[0] + buf[2]@ r1 = buf[1] + buf[3]@
- VSUB.S32 d5, d0, d1 @ r2 = buf[0] - buf[2]@ r3 = buf[1] - buf[3]@
- VSUB.S32 d7, d2, d3 @ r4 = buf[4] + buf[6]@ r5 = buf[5] + buf[7]@
- VADD.S32 d6, d2, d3 @ r6 = buf[4] - buf[6]@ r7 = buf[5] - buf[7]@
-
- VREV64.I32 d7, d7 @
-
- VADD.S32 Q4, Q2, Q3
- VSUB.S32 Q5, Q2, Q3
-
- VREV64.I32 d11, d11
- VTRN.32 d9, d11
- subs r1, r1, #1
- VREV64.I32 d11, d11
- VST1.I32 {d8, d9, d10, d11}, [r0]!
-
- bne Radix4First_LOOP
-
-Radix4First_END:
- fldmfdd sp!, {d8 - d15}
- ldmia sp!, {r4 - r11, pc}
-
- @ENDP @ |Radix4First|
- .fnend
diff --git a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s b/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s
deleted file mode 100644
index 431bc30..0000000
--- a/media/libstagefright/codecs/aacenc/src/asm/ARMV7/Radix4FFT_v7.s
+++ /dev/null
@@ -1,148 +0,0 @@
-@/*
-@ ** Copyright 2003-2010, VisualOn, Inc.
-@ **
-@ ** Licensed under the Apache License, Version 2.0 (the "License");
-@ ** you may not use this file except in compliance with the License.
-@ ** You may obtain a copy of the License at
-@ **
-@ ** http://www.apache.org/licenses/LICENSE-2.0
-@ **
-@ ** Unless required by applicable law or agreed to in writing, software
-@ ** distributed under the License is distributed on an "AS IS" BASIS,
-@ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@ ** See the License for the specific language governing permissions and
-@ ** limitations under the License.
-@ */
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-@ File: Radix4FFT_v7.s
-@
-@ Content: Radix4FFT armv7 assemble
-@
-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-
- .section .text
- .global Radix4FFT
- .fnstart
-
-Radix4FFT:
- stmdb sp!, {r4 - r11, lr}
- .save {r4 - r11, lr}
- fstmfdd sp!, {d8 - d15}
- .vsave {d8 - d15}
-
- mov r1, r1, asr #2
- cmp r1, #0
- beq Radix4FFT_END
-
-Radix4FFT_LOOP1:
- mov r5, r2, lsl #1
- mov r8, r0
- mov r7, r1
- mov r5, r5, lsl #2
- cmp r1, #0
- rsbeq r12, r5, r5, lsl #2
- beq Radix4FFT_LOOP1_END
-
- rsb r12, r5, r5, lsl #2
-
-Radix4FFT_LOOP2:
- mov r6, r3
- mov r4, r2
- cmp r2, #0
- beq Radix4FFT_LOOP2_END
-
-Radix4FFT_LOOP3:
- @r0 = xptr[0]@
- @r1 = xptr[1]@
- VLD2.I32 {D0, D1, D2, D3}, [r8]
- VLD2.I32 {D28, D29, D30, D31}, [r6]! @ cosx = csptr[0]@ sinx = csptr[1]@
-
- add r8, r8, r5 @ xptr += step@
- VLD2.I32 {D4, D5, D6,D7}, [r8] @ r2 = xptr[0]@ r3 = xptr[1]@
-
- VQDMULH.S32 Q10, Q2, Q14 @ MULHIGH(cosx, t0)
- VQDMULH.S32 Q11, Q3, Q15 @ MULHIGH(sinx, t1)
- VQDMULH.S32 Q12, Q3, Q14 @ MULHIGH(cosx, t1)
- VQDMULH.S32 Q13, Q2, Q15 @ MULHIGH(sinx, t0)
-
- VADD.S32 Q2, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
- VSUB.S32 Q3, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
-
- add r8, r8, r5 @ xptr += step@
- VSHR.S32 Q10, Q0, #2 @ t0 = r0 >> 2@
- VSHR.S32 Q11, Q1, #2 @ t1 = r1 >> 2@
-
- VSUB.S32 Q0, Q10, Q2 @ r0 = t0 - r2@
- VSUB.S32 Q1, Q11, Q3 @ r1 = t1 - r3@
- VADD.S32 Q2, Q10, Q2 @ r2 = t0 + r2@
- VADD.S32 Q3, Q11, Q3 @ r3 = t1 + r3@
-
- VLD2.I32 {D8, D9, D10, D11}, [r8]
- VLD2.I32 {D28, D29, D30, D31}, [r6]!
- add r8, r8, r5
-
- VQDMULH.S32 Q10, Q4, Q14 @ MULHIGH(cosx, t0)
- VQDMULH.S32 Q11, Q5, Q15 @ MULHIGH(sinx, t1)
- VQDMULH.S32 Q12, Q5, Q14 @ MULHIGH(cosx, t1)
- VQDMULH.S32 Q13, Q4, Q15 @ MULHIGH(sinx, t0)
-
- VADD.S32 Q8, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
- VSUB.S32 Q9, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
-
- VLD2.I32 {D12, D13, D14, D15}, [r8]
- VLD2.I32 {D28, D29, D30, D31}, [r6]!
-
- VQDMULH.S32 Q10, Q6, Q14 @ MULHIGH(cosx, t0)
- VQDMULH.S32 Q11, Q7, Q15 @ MULHIGH(sinx, t1)
- VQDMULH.S32 Q12, Q7, Q14 @ MULHIGH(cosx, t1)
- VQDMULH.S32 Q13, Q6, Q15 @ MULHIGH(sinx, t0)
-
- VADD.S32 Q6, Q10, Q11 @ MULHIGH(cosx, t0) + MULHIGH(sinx, t1)
- VSUB.S32 Q7, Q12, Q13 @ MULHIGH(cosx, t1) - MULHIGH(sinx, t0)
-
- VADD.S32 Q4, Q8, Q6 @ r4 = t0 + r6@
- VSUB.S32 Q5, Q7, Q9 @ r5 = r7 - t1@
- VSUB.S32 Q6, Q8, Q6 @ r6 = t0 - r6@
- VADD.S32 Q7, Q7, Q9 @ r7 = r7 + t1@
-
- VADD.S32 Q8, Q0, Q5 @ xptr[0] = r0 + r5@
- VADD.S32 Q9, Q1, Q6 @ xptr[1] = r1 + r6@
- VST2.I32 {D16, D17, D18, D19}, [r8]
-
- VSUB.S32 Q10, Q2, Q4 @ xptr[0] = r2 - r4@
- sub r8, r8, r5 @ xptr -= step@
- VSUB.S32 Q11, Q3, Q7 @ xptr[1] = r3 - r7@
- VST2.I32 {D20, D21, D22, D23}, [r8]
-
- VSUB.S32 Q8, Q0, Q5 @ xptr[0] = r0 - r5@
- sub r8, r8, r5 @ xptr -= step@
- VSUB.S32 Q9, Q1, Q6 @ xptr[1] = r1 - r6@
- VST2.I32 {D16, D17, D18, D19}, [r8]
-
- VADD.S32 Q10, Q2, Q4 @ xptr[0] = r2 + r4@
- sub r8, r8, r5 @ xptr -= step@
- VADD.S32 Q11, Q3, Q7 @ xptr[1] = r3 + r7@
- VST2.I32 {D20, D21, D22, D23}, [r8]!
-
- subs r4, r4, #4
- bne Radix4FFT_LOOP3
-
-Radix4FFT_LOOP2_END:
- add r8, r8, r12
- sub r7, r7, #1
- cmp r7, #0
- bhi Radix4FFT_LOOP2
-
-Radix4FFT_LOOP1_END:
- add r3, r12, r3
- mov r2, r2, lsl #2
- movs r1, r1, asr #2
- bne Radix4FFT_LOOP1
-
-Radix4FFT_END:
- fldmfdd sp!, {d8 - d15}
- ldmia sp!, {r4 - r11, pc}
-
- @ENDP @ |Radix4FFT|
- .fnend
diff --git a/media/libstagefright/codecs/aacenc/src/band_nrg.c b/media/libstagefright/codecs/aacenc/src/band_nrg.c
deleted file mode 100644
index e4034b8..0000000
--- a/media/libstagefright/codecs/aacenc/src/band_nrg.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: band_nrg.c
-
- Content: Band/Line energy calculations functions
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "band_nrg.h"
-
-#ifndef ARMV5E
-/********************************************************************************
-*
-* function name: CalcBandEnergy
-* description: Calc sfb-bandwise mdct-energies for left and right channel
-*
-**********************************************************************************/
-void CalcBandEnergy(const Word32 *mdctSpectrum,
- const Word16 *bandOffset,
- const Word16 numBands,
- Word32 *bandEnergy,
- Word32 *bandEnergySum)
-{
- Word32 i, j;
- Word32 accuSum = 0;
-
- for (i=0; i<numBands; i++) {
- Word32 accu = 0;
- for (j=bandOffset[i]; j<bandOffset[i+1]; j++)
- accu = L_add(accu, MULHIGH(mdctSpectrum[j], mdctSpectrum[j]));
-
- accu = L_add(accu, accu);
- accuSum = L_add(accuSum, accu);
- bandEnergy[i] = accu;
- }
- *bandEnergySum = accuSum;
-}
-
-/********************************************************************************
-*
-* function name: CalcBandEnergyMS
-* description: Calc sfb-bandwise mdct-energies for left add or minus right channel
-*
-**********************************************************************************/
-void CalcBandEnergyMS(const Word32 *mdctSpectrumLeft,
- const Word32 *mdctSpectrumRight,
- const Word16 *bandOffset,
- const Word16 numBands,
- Word32 *bandEnergyMid,
- Word32 *bandEnergyMidSum,
- Word32 *bandEnergySide,
- Word32 *bandEnergySideSum)
-{
-
- Word32 i, j;
- Word32 accuMidSum = 0;
- Word32 accuSideSum = 0;
-
-
- for(i=0; i<numBands; i++) {
- Word32 accuMid = 0;
- Word32 accuSide = 0;
- for (j=bandOffset[i]; j<bandOffset[i+1]; j++) {
- Word32 specm, specs;
- Word32 l, r;
-
- l = mdctSpectrumLeft[j] >> 1;
- r = mdctSpectrumRight[j] >> 1;
- specm = l + r;
- specs = l - r;
- accuMid = L_add(accuMid, MULHIGH(specm, specm));
- accuSide = L_add(accuSide, MULHIGH(specs, specs));
- }
-
- accuMid = L_add(accuMid, accuMid);
- accuSide = L_add(accuSide, accuSide);
- bandEnergyMid[i] = accuMid;
- accuMidSum = L_add(accuMidSum, accuMid);
- bandEnergySide[i] = accuSide;
- accuSideSum = L_add(accuSideSum, accuSide);
-
- }
- *bandEnergyMidSum = accuMidSum;
- *bandEnergySideSum = accuSideSum;
-}
-
-#endif
diff --git a/media/libstagefright/codecs/aacenc/src/bit_cnt.c b/media/libstagefright/codecs/aacenc/src/bit_cnt.c
deleted file mode 100644
index 65b035e..0000000
--- a/media/libstagefright/codecs/aacenc/src/bit_cnt.c
+++ /dev/null
@@ -1,885 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: bit_cnt.c
-
- Content: Huffman Bitcounter & coder functions
-
-*******************************************************************************/
-
-#include "bit_cnt.h"
-#include "aac_rom.h"
-
-#define HI_LTAB(a) ((a)>>8)
-#define LO_LTAB(a) ((a) & 0xff)
-
-#define EXPAND(a) ((((Word32)((a)&0xff00)) << 8)|(Word32)((a)&0xff))
-
-
-/*****************************************************************************
-*
-* function name: count1_2_3_4_5_6_7_8_9_10_11
-* description: counts tables 1-11
-* returns:
-* input: quantized spectrum
-* output: bitCount for tables 1-11
-*
-*****************************************************************************/
-
-static void count1_2_3_4_5_6_7_8_9_10_11(const Word16 *values,
- const Word16 width,
- Word16 *bitCount)
-{
- Word32 t0,t1,t2,t3,i;
- Word32 bc1_2,bc3_4,bc5_6,bc7_8,bc9_10;
- Word16 bc11,sc;
-
- bc1_2=0;
- bc3_4=0;
- bc5_6=0;
- bc7_8=0;
- bc9_10=0;
- bc11=0;
- sc=0;
-
- for(i=0;i<width;i+=4){
-
- t0= values[i+0];
- t1= values[i+1];
- t2= values[i+2];
- t3= values[i+3];
-
- /* 1,2 */
-
- bc1_2 = bc1_2 + EXPAND(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);
-
- /* 5,6 */
- bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]);
- bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t2+4][t3+4]);
-
- t0=ABS(t0);
- t1=ABS(t1);
- t2=ABS(t2);
- t3=ABS(t3);
-
-
- bc3_4 = bc3_4 + EXPAND(huff_ltab3_4[t0][t1][t2][t3]);
-
- bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]);
- bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t2][t3]);
-
- bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]);
- bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t2][t3]);
-
- bc11 = bc11 + huff_ltab11[t0][t1];
- bc11 = bc11 + huff_ltab11[t2][t3];
-
-
- sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0);
- }
-
- bitCount[1]=extract_h(bc1_2);
- bitCount[2]=extract_l(bc1_2);
- bitCount[3]=extract_h(bc3_4) + sc;
- bitCount[4]=extract_l(bc3_4) + sc;
- bitCount[5]=extract_h(bc5_6);
- bitCount[6]=extract_l(bc5_6);
- bitCount[7]=extract_h(bc7_8) + sc;
- bitCount[8]=extract_l(bc7_8) + sc;
- bitCount[9]=extract_h(bc9_10) + sc;
- bitCount[10]=extract_l(bc9_10) + sc;
- bitCount[11]=bc11 + sc;
-}
-
-
-/*****************************************************************************
-*
-* function name: count3_4_5_6_7_8_9_10_11
-* description: counts tables 3-11
-* returns:
-* input: quantized spectrum
-* output: bitCount for tables 3-11
-*
-*****************************************************************************/
-
-static void count3_4_5_6_7_8_9_10_11(const Word16 *values,
- const Word16 width,
- Word16 *bitCount)
-{
- Word32 t0,t1,t2,t3, i;
- Word32 bc3_4,bc5_6,bc7_8,bc9_10;
- Word16 bc11,sc;
-
- bc3_4=0;
- bc5_6=0;
- bc7_8=0;
- bc9_10=0;
- bc11=0;
- sc=0;
-
- for(i=0;i<width;i+=4){
-
- t0= values[i+0];
- t1= values[i+1];
- t2= values[i+2];
- t3= values[i+3];
-
- /*
- 5,6
- */
- bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]);
- bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t2+4][t3+4]);
-
- t0=ABS(t0);
- t1=ABS(t1);
- t2=ABS(t2);
- t3=ABS(t3);
-
-
- bc3_4 = bc3_4 + EXPAND(huff_ltab3_4[t0][t1][t2][t3]);
-
- bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]);
- bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t2][t3]);
-
- bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]);
- bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t2][t3]);
-
- bc11 = bc11 + huff_ltab11[t0][t1];
- bc11 = bc11 + huff_ltab11[t2][t3];
-
-
- sc = sc + (t0>0) + (t1>0) + (t2>0) + (t3>0);
- }
-
- bitCount[1]=INVALID_BITCOUNT;
- bitCount[2]=INVALID_BITCOUNT;
- bitCount[3]=extract_h(bc3_4) + sc;
- bitCount[4]=extract_l(bc3_4) + sc;
- bitCount[5]=extract_h(bc5_6);
- bitCount[6]=extract_l(bc5_6);
- bitCount[7]=extract_h(bc7_8) + sc;
- bitCount[8]=extract_l(bc7_8) + sc;
- bitCount[9]=extract_h(bc9_10) + sc;
- bitCount[10]=extract_l(bc9_10) + sc;
- bitCount[11]=bc11 + sc;
-
-}
-
-
-
-/*****************************************************************************
-*
-* function name: count5_6_7_8_9_10_11
-* description: counts tables 5-11
-* returns:
-* input: quantized spectrum
-* output: bitCount for tables 5-11
-*
-*****************************************************************************/
-static void count5_6_7_8_9_10_11(const Word16 *values,
- const Word16 width,
- Word16 *bitCount)
-{
-
- Word32 t0,t1,i;
- Word32 bc5_6,bc7_8,bc9_10;
- Word16 bc11,sc;
-
- bc5_6=0;
- bc7_8=0;
- bc9_10=0;
- bc11=0;
- sc=0;
-
- for(i=0;i<width;i+=2){
-
- t0 = values[i+0];
- t1 = values[i+1];
-
- bc5_6 = bc5_6 + EXPAND(huff_ltab5_6[t0+4][t1+4]);
-
- t0=ABS(t0);
- t1=ABS(t1);
-
- bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]);
- bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]);
- bc11 = bc11 + huff_ltab11[t0][t1];
-
-
- sc = sc + (t0>0) + (t1>0);
- }
- bitCount[1]=INVALID_BITCOUNT;
- bitCount[2]=INVALID_BITCOUNT;
- bitCount[3]=INVALID_BITCOUNT;
- bitCount[4]=INVALID_BITCOUNT;
- bitCount[5]=extract_h(bc5_6);
- bitCount[6]=extract_l(bc5_6);
- bitCount[7]=extract_h(bc7_8) + sc;
- bitCount[8]=extract_l(bc7_8) + sc;
- bitCount[9]=extract_h(bc9_10) + sc;
- bitCount[10]=extract_l(bc9_10) + sc;
- bitCount[11]=bc11 + sc;
-
-}
-
-
-/*****************************************************************************
-*
-* function name: count7_8_9_10_11
-* description: counts tables 7-11
-* returns:
-* input: quantized spectrum
-* output: bitCount for tables 7-11
-*
-*****************************************************************************/
-
-static void count7_8_9_10_11(const Word16 *values,
- const Word16 width,
- Word16 *bitCount)
-{
- Word32 t0,t1, i;
- Word32 bc7_8,bc9_10;
- Word16 bc11,sc;
-
- bc7_8=0;
- bc9_10=0;
- bc11=0;
- sc=0;
-
- for(i=0;i<width;i+=2){
-
- t0=ABS(values[i+0]);
- t1=ABS(values[i+1]);
-
- bc7_8 = bc7_8 + EXPAND(huff_ltab7_8[t0][t1]);
- bc9_10 = bc9_10 + EXPAND(huff_ltab9_10[t0][t1]);
- bc11 = bc11 + huff_ltab11[t0][t1];
-
-
- sc = sc + (t0>0) + (t1>0);
- }
- bitCount[1]=INVALID_BITCOUNT;
- bitCount[2]=INVALID_BITCOUNT;
- bitCount[3]=INVALID_BITCOUNT;
- bitCount[4]=INVALID_BITCOUNT;
- bitCount[5]=INVALID_BITCOUNT;
- bitCount[6]=INVALID_BITCOUNT;
- bitCount[7]=extract_h(bc7_8) + sc;
- bitCount[8]=extract_l(bc7_8) + sc;
- bitCount[9]=extract_h(bc9_10) + sc;
- bitCount[10]=extract_l(bc9_10) + sc;
- bitCount[11]=bc11 + sc;
-
-}
-
-/*****************************************************************************
-*
-* function name: count9_10_11
-* description: counts tables 9-11
-* returns:
-* input: quantized spectrum
-* output: bitCount for tables 9-11
-*
-*****************************************************************************/
-static void count9_10_11(const Word16 *values,
- const Word16 width,
- Word16 *bitCount)
-{
-
- Word32 t0,t1,i;
- Word32 bc9_10;
- Word16 bc11,sc;
-
- bc9_10=0;
- bc11=0;
- sc=0;
-
- for(i=0;i<width;i+=2){
-
- t0=ABS(values[i+0]);
- t1=ABS(values[i+1]);
-
-
- bc9_10 += EXPAND(huff_ltab9_10[t0][t1]);
- bc11 = bc11 + huff_ltab11[t0][t1];
-
-
- sc = sc + (t0>0) + (t1>0);
- }
- bitCount[1]=INVALID_BITCOUNT;
- bitCount[2]=INVALID_BITCOUNT;
- bitCount[3]=INVALID_BITCOUNT;
- bitCount[4]=INVALID_BITCOUNT;
- bitCount[5]=INVALID_BITCOUNT;
- bitCount[6]=INVALID_BITCOUNT;
- bitCount[7]=INVALID_BITCOUNT;
- bitCount[8]=INVALID_BITCOUNT;
- bitCount[9]=extract_h(bc9_10) + sc;
- bitCount[10]=extract_l(bc9_10) + sc;
- bitCount[11]=bc11 + sc;
-
-}
-
-/*****************************************************************************
-*
-* function name: count11
-* description: counts table 11
-* returns:
-* input: quantized spectrum
-* output: bitCount for table 11
-*
-*****************************************************************************/
- static void count11(const Word16 *values,
- const Word16 width,
- Word16 *bitCount)
-{
- Word32 t0,t1,i;
- Word16 bc11,sc;
-
- bc11=0;
- sc=0;
- for(i=0;i<width;i+=2){
- t0=ABS(values[i+0]);
- t1=ABS(values[i+1]);
- bc11 = bc11 + huff_ltab11[t0][t1];
-
-
- sc = sc + (t0>0) + (t1>0);
- }
-
- bitCount[1]=INVALID_BITCOUNT;
- bitCount[2]=INVALID_BITCOUNT;
- bitCount[3]=INVALID_BITCOUNT;
- bitCount[4]=INVALID_BITCOUNT;
- bitCount[5]=INVALID_BITCOUNT;
- bitCount[6]=INVALID_BITCOUNT;
- bitCount[7]=INVALID_BITCOUNT;
- bitCount[8]=INVALID_BITCOUNT;
- bitCount[9]=INVALID_BITCOUNT;
- bitCount[10]=INVALID_BITCOUNT;
- bitCount[11]=bc11 + sc;
-}
-
-/*****************************************************************************
-*
-* function name: countEsc
-* description: counts table 11 (with Esc)
-* returns:
-* input: quantized spectrum
-* output: bitCount for tables 11 (with Esc)
-*
-*****************************************************************************/
-
-static void countEsc(const Word16 *values,
- const Word16 width,
- Word16 *bitCount)
-{
- Word32 t0,t1,t00,t01,i;
- Word16 bc11,ec,sc;
-
- bc11=0;
- sc=0;
- ec=0;
- for(i=0;i<width;i+=2){
- t0=ABS(values[i+0]);
- t1=ABS(values[i+1]);
-
-
- sc = sc + (t0>0) + (t1>0);
-
- t00 = min(t0,16);
- t01 = min(t1,16);
- bc11 = bc11 + huff_ltab11[t00][t01];
-
-
- if(t0 >= 16){
- ec = ec + 5;
- while(sub(t0=(t0 >> 1), 16) >= 0) {
- ec = ec + 2;
- }
- }
-
-
- if(t1 >= 16){
- ec = ec + 5;
- while(sub(t1=(t1 >> 1), 16) >= 0) {
- ec = ec + 2;
- }
- }
- }
- bitCount[1]=INVALID_BITCOUNT;
- bitCount[2]=INVALID_BITCOUNT;
- bitCount[3]=INVALID_BITCOUNT;
- bitCount[4]=INVALID_BITCOUNT;
- bitCount[5]=INVALID_BITCOUNT;
- bitCount[6]=INVALID_BITCOUNT;
- bitCount[7]=INVALID_BITCOUNT;
- bitCount[8]=INVALID_BITCOUNT;
- bitCount[9]=INVALID_BITCOUNT;
- bitCount[10]=INVALID_BITCOUNT;
- bitCount[11]=bc11 + sc + ec;
-}
-
-
-typedef void (*COUNT_FUNCTION)(const Word16 *values,
- const Word16 width,
- Word16 *bitCount);
-
-static COUNT_FUNCTION countFuncTable[CODE_BOOK_ESC_LAV+1] =
- {
-
- count1_2_3_4_5_6_7_8_9_10_11, /* 0 */
- count1_2_3_4_5_6_7_8_9_10_11, /* 1 */
- count3_4_5_6_7_8_9_10_11, /* 2 */
- count5_6_7_8_9_10_11, /* 3 */
- count5_6_7_8_9_10_11, /* 4 */
- count7_8_9_10_11, /* 5 */
- count7_8_9_10_11, /* 6 */
- count7_8_9_10_11, /* 7 */
- count9_10_11, /* 8 */
- count9_10_11, /* 9 */
- count9_10_11, /* 10 */
- count9_10_11, /* 11 */
- count9_10_11, /* 12 */
- count11, /* 13 */
- count11, /* 14 */
- count11, /* 15 */
- countEsc /* 16 */
- };
-
-/*****************************************************************************
-*
-* function name: bitCount
-* description: count bits
-*
-*****************************************************************************/
-Word16 bitCount(const Word16 *values,
- const Word16 width,
- Word16 maxVal,
- Word16 *bitCount)
-{
- /*
- check if we can use codebook 0
- */
-
- if(maxVal == 0)
- bitCount[0] = 0;
- else
- bitCount[0] = INVALID_BITCOUNT;
-
- maxVal = min(maxVal, CODE_BOOK_ESC_LAV);
- countFuncTable[maxVal](values,width,bitCount);
-
- return(0);
-}
-
-/*****************************************************************************
-*
-* function name: codeValues
-* description: write huffum bits
-*
-*****************************************************************************/
-Word16 codeValues(Word16 *values, Word16 width, Word16 codeBook, HANDLE_BIT_BUF hBitstream)
-{
-
- Word32 i, t0, t1, t2, t3, t00, t01;
- UWord16 codeWord, codeLength;
- Word16 sign, signLength;
-
-
- switch (codeBook) {
- case CODE_BOOK_ZERO_NO:
- break;
-
- case CODE_BOOK_1_NO:
- for(i=0; i<width; i+=4) {
- t0 = values[i+0];
- t1 = values[i+1];
- t2 = values[i+2];
- t3 = values[i+3];
- codeWord = huff_ctab1[t0+1][t1+1][t2+1][t3+1];
- codeLength = HI_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);
- WriteBits(hBitstream, codeWord, codeLength);
- }
- break;
-
- case CODE_BOOK_2_NO:
- for(i=0; i<width; i+=4) {
- t0 = values[i+0];
- t1 = values[i+1];
- t2 = values[i+2];
- t3 = values[i+3];
- codeWord = huff_ctab2[t0+1][t1+1][t2+1][t3+1];
- codeLength = LO_LTAB(huff_ltab1_2[t0+1][t1+1][t2+1][t3+1]);
- WriteBits(hBitstream,codeWord,codeLength);
- }
- break;
-
- case CODE_BOOK_3_NO:
- for(i=0; i<width; i+=4) {
- sign=0;
- signLength=0;
- t0 = values[i+0];
-
- if(t0 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t0 < 0){
- sign|=1;
- t0=-t0;
- }
- }
- t1 = values[i+1];
-
- if(t1 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t1 < 0){
- sign|=1;
- t1=-t1;
- }
- }
- t2 = values[i+2];
-
- if(t2 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t2 < 0){
- sign|=1;
- t2=-t2;
- }
- }
- t3 = values[i+3];
- if(t3 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t3 < 0){
- sign|=1;
- t3=-t3;
- }
- }
-
- codeWord = huff_ctab3[t0][t1][t2][t3];
- codeLength = HI_LTAB(huff_ltab3_4[t0][t1][t2][t3]);
- WriteBits(hBitstream,codeWord,codeLength);
- WriteBits(hBitstream,sign,signLength);
- }
- break;
-
- case CODE_BOOK_4_NO:
- for(i=0; i<width; i+=4) {
- sign=0;
- signLength=0;
- t0 = values[i+0];
-
- if(t0 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
- if(t0 < 0){
- sign|=1;
- t0=-t0;
- }
- }
- t1 = values[i+1];
-
- if(t1 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t1 < 0){
- sign|=1;
- t1=-t1;
- }
- }
- t2 = values[i+2];
-
- if(t2 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t2 < 0){
- sign|=1;
- t2=-t2;
- }
- }
- t3 = values[i+3];
-
- if(t3 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t3 < 0){
- sign|=1;
- t3=-t3;
- }
- }
- codeWord = huff_ctab4[t0][t1][t2][t3];
- codeLength = LO_LTAB(huff_ltab3_4[t0][t1][t2][t3]);
- WriteBits(hBitstream,codeWord,codeLength);
- WriteBits(hBitstream,sign,signLength);
- }
- break;
-
- case CODE_BOOK_5_NO:
- for(i=0; i<width; i+=2) {
- t0 = values[i+0];
- t1 = values[i+1];
- codeWord = huff_ctab5[t0+4][t1+4];
- codeLength = HI_LTAB(huff_ltab5_6[t0+4][t1+4]);
- WriteBits(hBitstream,codeWord,codeLength);
- }
- break;
-
- case CODE_BOOK_6_NO:
- for(i=0; i<width; i+=2) {
- t0 = values[i+0];
- t1 = values[i+1];
- codeWord = huff_ctab6[t0+4][t1+4];
- codeLength = LO_LTAB(huff_ltab5_6[t0+4][t1+4]);
- WriteBits(hBitstream,codeWord,codeLength);
- }
- break;
-
- case CODE_BOOK_7_NO:
- for(i=0; i<width; i+=2){
- sign=0;
- signLength=0;
- t0 = values[i+0];
-
- if(t0 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t0 < 0){
- sign|=1;
- t0=-t0;
- }
- }
-
- t1 = values[i+1];
-
- if(t1 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t1 < 0){
- sign|=1;
- t1=-t1;
- }
- }
- codeWord = huff_ctab7[t0][t1];
- codeLength = HI_LTAB(huff_ltab7_8[t0][t1]);
- WriteBits(hBitstream,codeWord,codeLength);
- WriteBits(hBitstream,sign,signLength);
- }
- break;
-
- case CODE_BOOK_8_NO:
- for(i=0; i<width; i+=2) {
- sign=0;
- signLength=0;
- t0 = values[i+0];
-
- if(t0 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t0 < 0){
- sign|=1;
- t0=-t0;
- }
- }
-
- t1 = values[i+1];
-
- if(t1 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t1 < 0){
- sign|=1;
- t1=-t1;
- }
- }
- codeWord = huff_ctab8[t0][t1];
- codeLength = LO_LTAB(huff_ltab7_8[t0][t1]);
- WriteBits(hBitstream,codeWord,codeLength);
- WriteBits(hBitstream,sign,signLength);
- }
- break;
-
- case CODE_BOOK_9_NO:
- for(i=0; i<width; i+=2) {
- sign=0;
- signLength=0;
- t0 = values[i+0];
-
- if(t0 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t0 < 0){
- sign|=1;
- t0=-t0;
- }
- }
-
- t1 = values[i+1];
-
- if(t1 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t1 < 0){
- sign|=1;
- t1=-t1;
- }
- }
- codeWord = huff_ctab9[t0][t1];
- codeLength = HI_LTAB(huff_ltab9_10[t0][t1]);
- WriteBits(hBitstream,codeWord,codeLength);
- WriteBits(hBitstream,sign,signLength);
- }
- break;
-
- case CODE_BOOK_10_NO:
- for(i=0; i<width; i+=2) {
- sign=0;
- signLength=0;
- t0 = values[i+0];
-
- if(t0 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t0 < 0){
- sign|=1;
- t0=-t0;
- }
- }
-
- t1 = values[i+1];
-
- if(t1 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t1 < 0){
- sign|=1;
- t1=-t1;
- }
- }
- codeWord = huff_ctab10[t0][t1];
- codeLength = LO_LTAB(huff_ltab9_10[t0][t1]);
- WriteBits(hBitstream,codeWord,codeLength);
- WriteBits(hBitstream,sign,signLength);
- }
- break;
-
- case CODE_BOOK_ESC_NO:
- for(i=0; i<width; i+=2) {
- sign=0;
- signLength=0;
- t0 = values[i+0];
-
- if(t0 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t0 < 0){
- sign|=1;
- t0=-t0;
- }
- }
-
- t1 = values[i+1];
-
- if(t1 != 0){
- signLength = signLength + 1;
- sign = sign << 1;
-
- if(t1 < 0){
- sign|=1;
- t1=-t1;
- }
- }
- t00 = min(t0,16);
- t01 = min(t1,16);
-
- codeWord = huff_ctab11[t00][t01];
- codeLength = huff_ltab11[t00][t01];
- WriteBits(hBitstream,codeWord,codeLength);
- WriteBits(hBitstream,sign,signLength);
-
- if(t0 >= 16){
- Word16 n, p;
- n=0;
- p=t0;
- while(sub(p=(p >> 1), 16) >= 0){
-
- WriteBits(hBitstream,1,1);
- n = n + 1;
- }
- WriteBits(hBitstream,0,1);
- n = n + 4;
- WriteBits(hBitstream,(t0 - (1 << n)),n);
- }
-
- if(t1 >= 16){
- Word16 n, p;
- n=0;
- p=t1;
- while(sub(p=(p >> 1), 16) >= 0){
-
- WriteBits(hBitstream,1,1);
- n = n + 1;
- }
- WriteBits(hBitstream,0,1);
- n = n + 4;
- WriteBits(hBitstream,(t1 - (1 << n)),n);
- }
- }
- break;
-
- default:
- break;
- }
- return(0);
-}
-
-Word16 bitCountScalefactorDelta(Word16 delta)
-{
- return(huff_ltabscf[delta+CODE_BOOK_SCF_LAV]);
-}
-
-Word16 codeScalefactorDelta(Word16 delta, HANDLE_BIT_BUF hBitstream)
-{
- Word32 codeWord;
- Word16 codeLength;
-
-
- if(delta > CODE_BOOK_SCF_LAV || delta < -CODE_BOOK_SCF_LAV)
- return(1);
-
- codeWord = huff_ctabscf[delta + CODE_BOOK_SCF_LAV];
- codeLength = huff_ltabscf[delta + CODE_BOOK_SCF_LAV];
- WriteBits(hBitstream,codeWord,codeLength);
- return(0);
-}
diff --git a/media/libstagefright/codecs/aacenc/src/bitbuffer.c b/media/libstagefright/codecs/aacenc/src/bitbuffer.c
deleted file mode 100644
index 15eebd0..0000000
--- a/media/libstagefright/codecs/aacenc/src/bitbuffer.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: bitbuffer.c
-
- Content: Bit Buffer Management functions
-
-*******************************************************************************/
-
-#include "bitbuffer.h"
-
-/*****************************************************************************
-*
-* function name: CreateBitBuffer
-* description: create and init Bit Buffer Management
-*
-*****************************************************************************/
-HANDLE_BIT_BUF CreateBitBuffer(HANDLE_BIT_BUF hBitBuf,
- UWord8 *pBitBufBase,
- Word16 bitBufSize)
-{
- assert(bitBufSize*8 <= 32768);
-
- hBitBuf->pBitBufBase = pBitBufBase;
- hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
-
- hBitBuf->pWriteNext = pBitBufBase;
-
- hBitBuf->cache = 0;
-
- hBitBuf->wBitPos = 0;
- hBitBuf->cntBits = 0;
-
- hBitBuf->size = (bitBufSize << 3);
- hBitBuf->isValid = 1;
-
- return hBitBuf;
-}
-
-/*****************************************************************************
-*
-* function name: DeleteBitBuffer
-* description: uninit Bit Buffer Management
-*
-*****************************************************************************/
-void DeleteBitBuffer(HANDLE_BIT_BUF *hBitBuf)
-{
- if(*hBitBuf)
- (*hBitBuf)->isValid = 0;
- *hBitBuf = NULL;
-}
-
-/*****************************************************************************
-*
-* function name: ResetBitBuf
-* description: reset Bit Buffer Management
-*
-*****************************************************************************/
-void ResetBitBuf(HANDLE_BIT_BUF hBitBuf,
- UWord8 *pBitBufBase,
- Word16 bitBufSize)
-{
- hBitBuf->pBitBufBase = pBitBufBase;
- hBitBuf->pBitBufEnd = pBitBufBase + bitBufSize - 1;
-
-
- hBitBuf->pWriteNext = pBitBufBase;
-
- hBitBuf->wBitPos = 0;
- hBitBuf->cntBits = 0;
-
- hBitBuf->cache = 0;
-}
-
-/*****************************************************************************
-*
-* function name: CopyBitBuf
-* description: copy Bit Buffer Management
-*
-*****************************************************************************/
-void CopyBitBuf(HANDLE_BIT_BUF hBitBufSrc,
- HANDLE_BIT_BUF hBitBufDst)
-{
- *hBitBufDst = *hBitBufSrc;
-}
-
-/*****************************************************************************
-*
-* function name: GetBitsAvail
-* description: get available bits
-*
-*****************************************************************************/
-Word16 GetBitsAvail(HANDLE_BIT_BUF hBitBuf)
-{
- return hBitBuf->cntBits;
-}
-
-/*****************************************************************************
-*
-* function name: WriteBits
-* description: write bits to the buffer
-*
-*****************************************************************************/
-Word16 WriteBits(HANDLE_BIT_BUF hBitBuf,
- UWord32 writeValue,
- Word16 noBitsToWrite)
-{
- Word16 wBitPos;
-
- assert(noBitsToWrite <= (Word16)sizeof(Word32)*8);
-
- if(noBitsToWrite == 0)
- return noBitsToWrite;
-
- hBitBuf->cntBits += noBitsToWrite;
-
- wBitPos = hBitBuf->wBitPos;
- wBitPos += noBitsToWrite;
- writeValue &= ~(0xffffffff << noBitsToWrite); // Mask out everything except the lowest noBitsToWrite bits
- writeValue <<= 32 - wBitPos;
- writeValue |= hBitBuf->cache;
-
- while (wBitPos >= 8)
- {
- UWord8 tmp;
- tmp = (UWord8)((writeValue >> 24) & 0xFF);
-
- *hBitBuf->pWriteNext++ = tmp;
- writeValue <<= 8;
- wBitPos -= 8;
- }
-
- hBitBuf->wBitPos = wBitPos;
- hBitBuf->cache = writeValue;
-
- return noBitsToWrite;
-}
diff --git a/media/libstagefright/codecs/aacenc/src/bitenc.c b/media/libstagefright/codecs/aacenc/src/bitenc.c
deleted file mode 100644
index 9c81204..0000000
--- a/media/libstagefright/codecs/aacenc/src/bitenc.c
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: bitenc.c
-
- Content: Bitstream encoder functions
-
-*******************************************************************************/
-
-#include "bitenc.h"
-#include "bit_cnt.h"
-#include "dyn_bits.h"
-#include "qc_data.h"
-#include "interface.h"
-
-#define UNUSED(x) (void)(x)
-
-static const Word16 globalGainOffset = 100;
-static const Word16 icsReservedBit = 0;
-
-
-/*****************************************************************************
-*
-* function name: encodeSpectralData
-* description: encode spectral data
-* returns: spectral bits used
-*
-*****************************************************************************/
-static Word32 encodeSpectralData(Word16 *sfbOffset,
- SECTION_DATA *sectionData,
- Word16 *quantSpectrum,
- HANDLE_BIT_BUF hBitStream)
-{
- Word16 i,sfb;
- Word16 dbgVal;
- SECTION_INFO* psectioninfo;
- dbgVal = GetBitsAvail(hBitStream);
-
- for(i=0; i<sectionData->noOfSections; i++) {
- psectioninfo = &(sectionData->sectionInfo[i]);
- /*
- huffencode spectral data for this section
- */
- for(sfb=psectioninfo->sfbStart;
- sfb<psectioninfo->sfbStart+psectioninfo->sfbCnt;
- sfb++) {
- codeValues(quantSpectrum+sfbOffset[sfb],
- sfbOffset[sfb+1] - sfbOffset[sfb],
- psectioninfo->codeBook,
- hBitStream);
- }
- }
-
- return(GetBitsAvail(hBitStream)-dbgVal);
-}
-
-/*****************************************************************************
-*
-* function name:encodeGlobalGain
-* description: encodes Global Gain (common scale factor)
-* returns: none
-*
-*****************************************************************************/
-static void encodeGlobalGain(Word16 globalGain,
- Word16 logNorm,
- Word16 scalefac,
- HANDLE_BIT_BUF hBitStream)
-{
- WriteBits(hBitStream, ((globalGain - scalefac) + globalGainOffset-(logNorm << 2)), 8);
-}
-
-
-/*****************************************************************************
-*
-* function name:encodeIcsInfo
-* description: encodes Ics Info
-* returns: none
-*
-*****************************************************************************/
-
-static void encodeIcsInfo(Word16 blockType,
- Word16 windowShape,
- Word16 groupingMask,
- SECTION_DATA *sectionData,
- HANDLE_BIT_BUF hBitStream)
-{
- WriteBits(hBitStream,icsReservedBit,1);
- WriteBits(hBitStream,blockType,2);
- WriteBits(hBitStream,windowShape,1);
-
-
- switch(blockType){
- case LONG_WINDOW:
- case START_WINDOW:
- case STOP_WINDOW:
- WriteBits(hBitStream,sectionData->maxSfbPerGroup,6);
-
- /* No predictor data present */
- WriteBits(hBitStream, 0, 1);
- break;
-
- case SHORT_WINDOW:
- WriteBits(hBitStream,sectionData->maxSfbPerGroup,4);
-
- /*
- Write grouping bits
- */
- WriteBits(hBitStream,groupingMask,TRANS_FAC-1);
- break;
- }
-}
-
-/*****************************************************************************
-*
-* function name: encodeSectionData
-* description: encode section data (common Huffman codebooks for adjacent
-* SFB's)
-* returns: none
-*
-*****************************************************************************/
-static Word32 encodeSectionData(SECTION_DATA *sectionData,
- HANDLE_BIT_BUF hBitStream)
-{
- Word16 sectEscapeVal=0,sectLenBits=0;
- Word16 sectLen;
- Word16 i;
- Word16 dbgVal=GetBitsAvail(hBitStream);
-
-
-
- switch(sectionData->blockType)
- {
- case LONG_WINDOW:
- case START_WINDOW:
- case STOP_WINDOW:
- sectEscapeVal = SECT_ESC_VAL_LONG;
- sectLenBits = SECT_BITS_LONG;
- break;
-
- case SHORT_WINDOW:
- sectEscapeVal = SECT_ESC_VAL_SHORT;
- sectLenBits = SECT_BITS_SHORT;
- break;
- }
-
- for(i=0;i<sectionData->noOfSections;i++) {
- WriteBits(hBitStream,sectionData->sectionInfo[i].codeBook,4);
- sectLen = sectionData->sectionInfo[i].sfbCnt;
-
- while(sectLen >= sectEscapeVal) {
-
- WriteBits(hBitStream,sectEscapeVal,sectLenBits);
- sectLen = sectLen - sectEscapeVal;
- }
- WriteBits(hBitStream,sectLen,sectLenBits);
- }
- return(GetBitsAvail(hBitStream)-dbgVal);
-}
-
-/*****************************************************************************
-*
-* function name: encodeScaleFactorData
-* description: encode DPCM coded scale factors
-* returns: none
-*
-*****************************************************************************/
-static Word32 encodeScaleFactorData(UWord16 *maxValueInSfb,
- SECTION_DATA *sectionData,
- Word16 *scalefac,
- HANDLE_BIT_BUF hBitStream)
-{
- Word16 i,j,lastValScf,deltaScf;
- Word16 dbgVal = GetBitsAvail(hBitStream);
- SECTION_INFO* psectioninfo;
-
- lastValScf=scalefac[sectionData->firstScf];
-
- for(i=0;i<sectionData->noOfSections;i++){
- psectioninfo = &(sectionData->sectionInfo[i]);
- if (psectioninfo->codeBook != CODE_BOOK_ZERO_NO){
- for (j=psectioninfo->sfbStart;
- j<psectioninfo->sfbStart+psectioninfo->sfbCnt; j++){
-
- if(maxValueInSfb[j] == 0) {
- deltaScf = 0;
- }
- else {
- deltaScf = lastValScf - scalefac[j];
- lastValScf = scalefac[j];
- }
-
- if(codeScalefactorDelta(deltaScf,hBitStream)){
- return(1);
- }
- }
- }
-
- }
- return(GetBitsAvail(hBitStream)-dbgVal);
-}
-
-/*****************************************************************************
-*
-* function name:encodeMsInfo
-* description: encodes MS-Stereo Info
-* returns: none
-*
-*****************************************************************************/
-static void encodeMSInfo(Word16 sfbCnt,
- Word16 grpSfb,
- Word16 maxSfb,
- Word16 msDigest,
- Word16 *jsFlags,
- HANDLE_BIT_BUF hBitStream)
-{
- Word16 sfb, sfbOff;
-
-
- switch(msDigest)
- {
- case MS_NONE:
- WriteBits(hBitStream,SI_MS_MASK_NONE,2);
- break;
-
- case MS_ALL:
- WriteBits(hBitStream,SI_MS_MASK_ALL,2);
- break;
-
- case MS_SOME:
- WriteBits(hBitStream,SI_MS_MASK_SOME,2);
- for(sfbOff = 0; sfbOff < sfbCnt; sfbOff+=grpSfb) {
- for(sfb=0; sfb<maxSfb; sfb++) {
-
- if(jsFlags[sfbOff+sfb] & MS_ON) {
- WriteBits(hBitStream,1,1);
- }
- else{
- WriteBits(hBitStream,0,1);
- }
- }
- }
- break;
- }
-
-}
-
-/*****************************************************************************
-*
-* function name: encodeTnsData
-* description: encode TNS data (filter order, coeffs, ..)
-* returns: none
-*
-*****************************************************************************/
-static void encodeTnsData(TNS_INFO tnsInfo,
- Word16 blockType,
- HANDLE_BIT_BUF hBitStream) {
- Word16 i,k;
- Flag tnsPresent;
- Word16 numOfWindows;
- Word16 coefBits;
- Flag isShort;
-
-
- if (blockType==2) {
- isShort = 1;
- numOfWindows = TRANS_FAC;
- }
- else {
- isShort = 0;
- numOfWindows = 1;
- }
-
- tnsPresent=0;
- for (i=0; i<numOfWindows; i++) {
-
- if (tnsInfo.tnsActive[i]) {
- tnsPresent=1;
- }
- }
-
- if (tnsPresent==0) {
- WriteBits(hBitStream,0,1);
- }
- else{ /* there is data to be written*/
- WriteBits(hBitStream,1,1); /*data_present */
- for (i=0; i<numOfWindows; i++) {
-
- WriteBits(hBitStream,tnsInfo.tnsActive[i],(isShort?1:2));
-
- if (tnsInfo.tnsActive[i]) {
-
- WriteBits(hBitStream,((tnsInfo.coefRes[i] - 4)==0?1:0),1);
-
- WriteBits(hBitStream,tnsInfo.length[i],(isShort?4:6));
-
- WriteBits(hBitStream,tnsInfo.order[i],(isShort?3:5));
-
- if (tnsInfo.order[i]){
- WriteBits(hBitStream, FILTER_DIRECTION, 1);
-
- if(tnsInfo.coefRes[i] == 4) {
- coefBits = 3;
- for(k=0; k<tnsInfo.order[i]; k++) {
-
- if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 3 ||
- tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -4) {
- coefBits = 4;
- break;
- }
- }
- }
- else {
- coefBits = 2;
- for(k=0; k<tnsInfo.order[i]; k++) {
-
- if (tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] > 1 ||
- tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] < -2) {
- coefBits = 3;
- break;
- }
- }
- }
- WriteBits(hBitStream, tnsInfo.coefRes[i] - coefBits, 1); /*coef_compres*/
- for (k=0; k<tnsInfo.order[i]; k++ ) {
- static const Word16 rmask[] = {0,1,3,7,15};
-
- WriteBits(hBitStream,tnsInfo.coef[i*TNS_MAX_ORDER_SHORT+k] & rmask[coefBits],coefBits);
- }
- }
- }
- }
- }
-
-}
-
-/*****************************************************************************
-*
-* function name: encodeGainControlData
-* description: unsupported
-* returns: none
-*
-*****************************************************************************/
-static void encodeGainControlData(HANDLE_BIT_BUF hBitStream)
-{
- WriteBits(hBitStream,0,1);
-}
-
-/*****************************************************************************
-*
-* function name: encodePulseData
-* description: not supported yet (dummy)
-* returns: none
-*
-*****************************************************************************/
-static void encodePulseData(HANDLE_BIT_BUF hBitStream)
-{
- WriteBits(hBitStream,0,1);
-}
-
-
-/*****************************************************************************
-*
-* function name: WriteIndividualChannelStream
-* description: management of write process of individual channel stream
-* returns: none
-*
-*****************************************************************************/
-static void
-writeIndividualChannelStream(Flag commonWindow,
- Word16 mdctScale,
- Word16 windowShape,
- Word16 groupingMask,
- Word16 *sfbOffset,
- Word16 scf[],
- UWord16 *maxValueInSfb,
- Word16 globalGain,
- Word16 quantSpec[],
- SECTION_DATA *sectionData,
- HANDLE_BIT_BUF hBitStream,
- TNS_INFO tnsInfo)
-{
- Word16 logNorm;
-
- logNorm = LOG_NORM_PCM - (mdctScale + 1);
-
- encodeGlobalGain(globalGain, logNorm,scf[sectionData->firstScf], hBitStream);
-
-
- if(!commonWindow) {
- encodeIcsInfo(sectionData->blockType, windowShape, groupingMask, sectionData, hBitStream);
- }
-
- encodeSectionData(sectionData, hBitStream);
-
- encodeScaleFactorData(maxValueInSfb,
- sectionData,
- scf,
- hBitStream);
-
- encodePulseData(hBitStream);
-
- encodeTnsData(tnsInfo, sectionData->blockType, hBitStream);
-
- encodeGainControlData(hBitStream);
-
- encodeSpectralData(sfbOffset,
- sectionData,
- quantSpec,
- hBitStream);
-
-}
-
-/*****************************************************************************
-*
-* function name: writeSingleChannelElement
-* description: write single channel element to bitstream
-* returns: none
-*
-*****************************************************************************/
-static Word16 writeSingleChannelElement(Word16 instanceTag,
- Word16 *sfbOffset,
- QC_OUT_CHANNEL* qcOutChannel,
- HANDLE_BIT_BUF hBitStream,
- TNS_INFO tnsInfo)
-{
- WriteBits(hBitStream,ID_SCE,3);
- WriteBits(hBitStream,instanceTag,4);
- writeIndividualChannelStream(0,
- qcOutChannel->mdctScale,
- qcOutChannel->windowShape,
- qcOutChannel->groupingMask,
- sfbOffset,
- qcOutChannel->scf,
- qcOutChannel->maxValueInSfb,
- qcOutChannel->globalGain,
- qcOutChannel->quantSpec,
- &(qcOutChannel->sectionData),
- hBitStream,
- tnsInfo
- );
- return(0);
-}
-
-
-
-/*****************************************************************************
-*
-* function name: writeChannelPairElement
-* description:
-* returns: none
-*
-*****************************************************************************/
-static Word16 writeChannelPairElement(Word16 instanceTag,
- Word16 msDigest,
- Word16 msFlags[MAX_GROUPED_SFB],
- Word16 *sfbOffset[2],
- QC_OUT_CHANNEL qcOutChannel[2],
- HANDLE_BIT_BUF hBitStream,
- TNS_INFO tnsInfo[2])
-{
- WriteBits(hBitStream,ID_CPE,3);
- WriteBits(hBitStream,instanceTag,4);
- WriteBits(hBitStream,1,1); /* common window */
-
- encodeIcsInfo(qcOutChannel[0].sectionData.blockType,
- qcOutChannel[0].windowShape,
- qcOutChannel[0].groupingMask,
- &(qcOutChannel[0].sectionData),
- hBitStream);
-
- encodeMSInfo(qcOutChannel[0].sectionData.sfbCnt,
- qcOutChannel[0].sectionData.sfbPerGroup,
- qcOutChannel[0].sectionData.maxSfbPerGroup,
- msDigest,
- msFlags,
- hBitStream);
-
- writeIndividualChannelStream(1,
- qcOutChannel[0].mdctScale,
- qcOutChannel[0].windowShape,
- qcOutChannel[0].groupingMask,
- sfbOffset[0],
- qcOutChannel[0].scf,
- qcOutChannel[0].maxValueInSfb,
- qcOutChannel[0].globalGain,
- qcOutChannel[0].quantSpec,
- &(qcOutChannel[0].sectionData),
- hBitStream,
- tnsInfo[0]);
-
- writeIndividualChannelStream(1,
- qcOutChannel[1].mdctScale,
- qcOutChannel[1].windowShape,
- qcOutChannel[1].groupingMask,
- sfbOffset[1],
- qcOutChannel[1].scf,
- qcOutChannel[1].maxValueInSfb,
- qcOutChannel[1].globalGain,
- qcOutChannel[1].quantSpec,
- &(qcOutChannel[1].sectionData),
- hBitStream,
- tnsInfo[1]);
-
- return(0);
-}
-
-
-
-/*****************************************************************************
-*
-* function name: writeFillElement
-* description: write fill elements to bitstream
-* returns: none
-*
-*****************************************************************************/
-static void writeFillElement( const UWord8 *ancBytes,
- Word16 totFillBits,
- HANDLE_BIT_BUF hBitStream)
-{
- Word16 i;
- Word16 cnt,esc_count;
-
- /*
- Write fill Element(s):
- amount of a fill element can be 7+X*8 Bits, X element of [0..270]
- */
-
- while(totFillBits >= (3+4)) {
- cnt = min(((totFillBits - (3+4)) >> 3), ((1<<4)-1));
-
- WriteBits(hBitStream,ID_FIL,3);
- WriteBits(hBitStream,cnt,4);
-
- totFillBits = totFillBits - (3+4);
-
-
- if (cnt == (1<<4)-1) {
-
- esc_count = min( ((totFillBits >> 3) - ((1<<4)-1)), (1<<8)-1);
- WriteBits(hBitStream,esc_count,8);
- totFillBits = (totFillBits - 8);
- cnt = cnt + (esc_count - 1);
- }
-
- for(i=0;i<cnt;i++) {
-
- if(ancBytes)
- WriteBits(hBitStream, *ancBytes++,8);
- else
- WriteBits(hBitStream,0,8);
- totFillBits = totFillBits - 8;
- }
- }
-}
-
-/*****************************************************************************
-*
-* function name: WriteBitStream
-* description: main function of write bitsteam process
-* returns: 0 if success
-*
-*****************************************************************************/
-Word16 WriteBitstream (HANDLE_BIT_BUF hBitStream,
- ELEMENT_INFO elInfo,
- QC_OUT *qcOut,
- PSY_OUT *psyOut,
- Word16 *globUsedBits,
- const UWord8 *ancBytes,
- Word16 sampindex
- ) /* returns error code */
-{
- Word16 bitMarkUp;
- Word16 elementUsedBits;
- Word16 frameBits=0;
-
- UNUSED(ancBytes);
-
- /* struct bitbuffer bsWriteCopy; */
- bitMarkUp = GetBitsAvail(hBitStream);
- if(qcOut->qcElement.adtsUsed) /* write adts header*/
- {
- WriteBits(hBitStream, 0xFFF, 12); /* 12 bit Syncword */
- WriteBits(hBitStream, 1, 1); /* ID == 0 for MPEG4 AAC, 1 for MPEG2 AAC */
- WriteBits(hBitStream, 0, 2); /* layer == 0 */
- WriteBits(hBitStream, 1, 1); /* protection absent */
- WriteBits(hBitStream, 1, 2); /* profile */
- WriteBits(hBitStream, sampindex, 4); /* sampling rate */
- WriteBits(hBitStream, 0, 1); /* private bit */
- WriteBits(hBitStream, elInfo.nChannelsInEl, 3); /* ch. config (must be > 0) */
- /* simply using numChannels only works for
- 6 channels or less, else a channel
- configuration should be written */
- WriteBits(hBitStream, 0, 1); /* original/copy */
- WriteBits(hBitStream, 0, 1); /* home */
-
- /* Variable ADTS header */
- WriteBits(hBitStream, 0, 1); /* copyr. id. bit */
- WriteBits(hBitStream, 0, 1); /* copyr. id. start */
- WriteBits(hBitStream, *globUsedBits >> 3, 13);
- WriteBits(hBitStream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */
- WriteBits(hBitStream, 0, 2); /* raw data blocks (0+1=1) */
- }
-
- *globUsedBits=0;
-
- {
-
- Word16 *sfbOffset[2];
- TNS_INFO tnsInfo[2];
- elementUsedBits = 0;
-
- switch (elInfo.elType) {
-
- case ID_SCE: /* single channel */
- sfbOffset[0] = psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets;
- tnsInfo[0] = psyOut->psyOutChannel[elInfo.ChannelIndex[0]].tnsInfo;
-
- writeSingleChannelElement(elInfo.instanceTag,
- sfbOffset[0],
- &qcOut->qcChannel[elInfo.ChannelIndex[0]],
- hBitStream,
- tnsInfo[0]);
- break;
-
- case ID_CPE: /* channel pair */
- {
- Word16 msDigest;
- Word16 *msFlags = psyOut->psyOutElement.toolsInfo.msMask;
- msDigest = psyOut->psyOutElement.toolsInfo.msDigest;
- sfbOffset[0] =
- psyOut->psyOutChannel[elInfo.ChannelIndex[0]].sfbOffsets;
- sfbOffset[1] =
- psyOut->psyOutChannel[elInfo.ChannelIndex[1]].sfbOffsets;
-
- tnsInfo[0]=
- psyOut->psyOutChannel[elInfo.ChannelIndex[0]].tnsInfo;
- tnsInfo[1]=
- psyOut->psyOutChannel[elInfo.ChannelIndex[1]].tnsInfo;
- writeChannelPairElement(elInfo.instanceTag,
- msDigest,
- msFlags,
- sfbOffset,
- &qcOut->qcChannel[elInfo.ChannelIndex[0]],
- hBitStream,
- tnsInfo);
- }
- break;
-
- default:
- return(1);
-
- } /* switch */
-
- elementUsedBits = elementUsedBits - bitMarkUp;
- bitMarkUp = GetBitsAvail(hBitStream);
- frameBits = frameBits + elementUsedBits + bitMarkUp;
-
- }
-
- writeFillElement(NULL,
- qcOut->totFillBits,
- hBitStream);
-
- WriteBits(hBitStream,ID_END,3);
-
- /* byte alignement */
- WriteBits(hBitStream,0, (8 - (hBitStream->cntBits & 7)) & 7);
-
- *globUsedBits = *globUsedBits- bitMarkUp;
- bitMarkUp = GetBitsAvail(hBitStream);
- *globUsedBits = *globUsedBits + bitMarkUp;
- frameBits = frameBits + *globUsedBits;
-
-
- if (frameBits != (qcOut->totStaticBitsUsed+qcOut->totDynBitsUsed + qcOut->totAncBitsUsed +
- qcOut->totFillBits + qcOut->alignBits)) {
- return(-1);
- }
- return(0);
-}
diff --git a/media/libstagefright/codecs/aacenc/src/block_switch.c b/media/libstagefright/codecs/aacenc/src/block_switch.c
deleted file mode 100644
index 11bc7e7..0000000
--- a/media/libstagefright/codecs/aacenc/src/block_switch.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: block_switch.c
-
- Content: Block switching functions
-
-*******************************************************************************/
-
-#include "typedef.h"
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "psy_const.h"
-#include "block_switch.h"
-
-
-#define ENERGY_SHIFT (8 - 1)
-
-/**************** internal function prototypes ***********/
-static Word32
-SrchMaxWithIndex(const Word32 *in, Word16 *index, Word16 n);
-
-
-Word32
-CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
- Word16 *timeSignal,
- Word16 chIncrement,
- Word16 windowLen);
-
-
-
-/****************** Constants *****************************/
-
-
-/*
- IIR high pass coeffs
-*/
-const Word32 hiPassCoeff[BLOCK_SWITCHING_IIR_LEN] = {
- 0xbec8b439, 0x609d4952 /* -0.5095f, 0.7548f */
-};
-
-static const Word32 accWindowNrgFac = 0x26666666; /* factor for accumulating filtered window energies 0.3 */
-static const Word32 oneMinusAccWindowNrgFac = 0x5999999a; /* 0.7 */
-static const Word32 invAttackRatioHighBr = 0x0ccccccd; /* inverted lower ratio limit for attacks 0.1*/
-static const Word32 invAttackRatioLowBr = 0x072b020c; /* 0.056 */
-static const Word32 minAttackNrg = 0x00001e84; /* minimum energy for attacks 1e+6 */
-
-
-/****************** Routines ****************************/
-
-
-/*****************************************************************************
-*
-* function name: InitBlockSwitching
-* description: init Block Switching parameter.
-* returns: TRUE if success
-*
-**********************************************************************************/
-Word16 InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
- const Word32 bitRate, const Word16 nChannels)
-{
- /* select attackRatio */
-
- if ((sub(nChannels,1)==0 && L_sub(bitRate, 24000) > 0) ||
- (sub(nChannels,1)>0 && bitRate > (nChannels * 16000))) {
- blockSwitchingControl->invAttackRatio = invAttackRatioHighBr;
- }
- else {
- blockSwitchingControl->invAttackRatio = invAttackRatioLowBr;
- }
-
- return(TRUE);
-}
-
-static Word16 suggestedGroupingTable[TRANS_FAC][MAX_NO_OF_GROUPS] = {
- /* Attack in Window 0 */ {1, 3, 3, 1},
- /* Attack in Window 1 */ {1, 1, 3, 3},
- /* Attack in Window 2 */ {2, 1, 3, 2},
- /* Attack in Window 3 */ {3, 1, 3, 1},
- /* Attack in Window 4 */ {3, 1, 1, 3},
- /* Attack in Window 5 */ {3, 2, 1, 2},
- /* Attack in Window 6 */ {3, 3, 1, 1},
- /* Attack in Window 7 */ {3, 3, 1, 1}
-};
-
-/*****************************************************************************
-*
-* function name: BlockSwitching
-* description: detect this frame whether there is an attack
-* returns: TRUE if success
-*
-**********************************************************************************/
-Word16 BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
- Word16 *timeSignal,
- Word32 sampleRate,
- Word16 chIncrement)
-{
- Word32 i, w;
- Word32 enM1, enMax;
-
- /* Reset grouping info */
- for (i=0; i<TRANS_FAC; i++) {
- blockSwitchingControl->groupLen[i] = 0;
- }
-
-
- /* Search for position and amplitude of attack in last frame (1 windows delay) */
- blockSwitchingControl->maxWindowNrg = SrchMaxWithIndex( &blockSwitchingControl->windowNrg[0][BLOCK_SWITCH_WINDOWS-1],
- &blockSwitchingControl->attackIndex,
- BLOCK_SWITCH_WINDOWS);
-
- blockSwitchingControl->attackIndex = blockSwitchingControl->lastAttackIndex;
-
- /* Set grouping info */
- blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS;
-
- for (i=0; i<MAX_NO_OF_GROUPS; i++) {
- blockSwitchingControl->groupLen[i] = suggestedGroupingTable[blockSwitchingControl->attackIndex][i];
- }
-
- /* if the samplerate is less than 16000, it should be all the short block, avoid pre&post echo */
- if(sampleRate >= 16000) {
- /* Save current window energy as last window energy */
- for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
- blockSwitchingControl->windowNrg[0][w] = blockSwitchingControl->windowNrg[1][w];
- blockSwitchingControl->windowNrgF[0][w] = blockSwitchingControl->windowNrgF[1][w];
- }
-
-
- /* Calculate unfiltered and filtered energies in subwindows and combine to segments */
- CalcWindowEnergy(blockSwitchingControl, timeSignal, chIncrement, BLOCK_SWITCH_WINDOW_LEN);
-
- /* reset attack */
- blockSwitchingControl->attack = FALSE;
-
- enMax = 0;
- enM1 = blockSwitchingControl->windowNrgF[0][BLOCK_SWITCH_WINDOWS-1];
-
- for (w=0; w<BLOCK_SWITCH_WINDOWS; w++) {
- Word32 enM1_Tmp, accWindowNrg_Tmp, windowNrgF_Tmp;
- Word16 enM1_Shf, accWindowNrg_Shf, windowNrgF_Shf;
-
- accWindowNrg_Shf = norm_l(blockSwitchingControl->accWindowNrg);
- enM1_Shf = norm_l(enM1);
- windowNrgF_Shf = norm_l(blockSwitchingControl->windowNrgF[1][w]);
-
- accWindowNrg_Tmp = blockSwitchingControl->accWindowNrg << accWindowNrg_Shf;
- enM1_Tmp = enM1 << enM1_Shf;
- windowNrgF_Tmp = blockSwitchingControl->windowNrgF[1][w] << windowNrgF_Shf;
-
- /* a sliding average of the previous energies */
- blockSwitchingControl->accWindowNrg = (fixmul(oneMinusAccWindowNrgFac, accWindowNrg_Tmp) >> accWindowNrg_Shf) +
- (fixmul(accWindowNrgFac, enM1_Tmp) >> enM1_Shf);
-
-
- /* if the energy with the ratio is bigger than the average, and the attack and short block */
- if ((fixmul(windowNrgF_Tmp, blockSwitchingControl->invAttackRatio) >> windowNrgF_Shf) >
- blockSwitchingControl->accWindowNrg ) {
- blockSwitchingControl->attack = TRUE;
- blockSwitchingControl->lastAttackIndex = w;
- }
- enM1 = blockSwitchingControl->windowNrgF[1][w];
- enMax = max(enMax, enM1);
- }
-
- if (enMax < minAttackNrg) {
- blockSwitchingControl->attack = FALSE;
- }
- }
- else
- {
- blockSwitchingControl->attack = TRUE;
- }
-
- /* Check if attack spreads over frame border */
- if ((!blockSwitchingControl->attack) && (blockSwitchingControl->lastattack)) {
-
- if (blockSwitchingControl->attackIndex == TRANS_FAC-1) {
- blockSwitchingControl->attack = TRUE;
- }
-
- blockSwitchingControl->lastattack = FALSE;
- }
- else {
- blockSwitchingControl->lastattack = blockSwitchingControl->attack;
- }
-
- blockSwitchingControl->windowSequence = blockSwitchingControl->nextwindowSequence;
-
-
- if (blockSwitchingControl->attack) {
- blockSwitchingControl->nextwindowSequence = SHORT_WINDOW;
- }
- else {
- blockSwitchingControl->nextwindowSequence = LONG_WINDOW;
- }
-
- /* update short block group */
- if (blockSwitchingControl->nextwindowSequence == SHORT_WINDOW) {
-
- if (blockSwitchingControl->windowSequence== LONG_WINDOW) {
- blockSwitchingControl->windowSequence = START_WINDOW;
- }
-
- if (blockSwitchingControl->windowSequence == STOP_WINDOW) {
- blockSwitchingControl->windowSequence = SHORT_WINDOW;
- blockSwitchingControl->noOfGroups = 3;
- blockSwitchingControl->groupLen[0] = 3;
- blockSwitchingControl->groupLen[1] = 3;
- blockSwitchingControl->groupLen[2] = 2;
- }
- }
-
- /* update block type */
- if (blockSwitchingControl->nextwindowSequence == LONG_WINDOW) {
-
- if (blockSwitchingControl->windowSequence == SHORT_WINDOW) {
- blockSwitchingControl->nextwindowSequence = STOP_WINDOW;
- }
- }
-
- return(TRUE);
-}
-
-
-/*****************************************************************************
-*
-* function name: SrchMaxWithIndex
-* description: search for the biggest value in an array
-* returns: the max value
-*
-**********************************************************************************/
-static Word32 SrchMaxWithIndex(const Word32 in[], Word16 *index, Word16 n)
-{
- Word32 max;
- Word32 i, idx;
-
- /* Search maximum value in array and return index and value */
- max = 0;
- idx = 0;
-
- for (i = 0; i < n; i++) {
-
- if (in[i+1] > max) {
- max = in[i+1];
- idx = i;
- }
- }
- *index = idx;
-
- return(max);
-}
-
-/*****************************************************************************
-*
-* function name: CalcWindowEnergy
-* description: calculate the energy before iir-filter and after irr-filter
-* returns: TRUE if success
-*
-**********************************************************************************/
-#ifndef ARMV5E
-Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,
- Word16 *timeSignal,
- Word16 chIncrement,
- Word16 windowLen)
-{
- Word32 w, i, tidx;
- Word32 accuUE, accuFE;
- Word32 tempUnfiltered;
- Word32 tempFiltered;
- Word32 states0, states1;
- Word32 Coeff0, Coeff1;
-
-
- states0 = blockSwitchingControl->iirStates[0];
- states1 = blockSwitchingControl->iirStates[1];
- Coeff0 = hiPassCoeff[0];
- Coeff1 = hiPassCoeff[1];
- tidx = 0;
- for (w=0; w < BLOCK_SWITCH_WINDOWS; w++) {
-
- accuUE = 0;
- accuFE = 0;
-
- for(i=0; i<windowLen; i++) {
- Word32 accu1, accu2, accu3;
- Word32 out;
- tempUnfiltered = timeSignal[tidx];
- tidx = tidx + chIncrement;
-
- accu1 = L_mpy_ls(Coeff1, tempUnfiltered);
- accu2 = fixmul( Coeff0, states1 );
- accu3 = accu1 - states0;
- out = accu3 - accu2;
-
- states0 = accu1;
- states1 = out;
-
- tempFiltered = extract_h(out);
- accuUE += (tempUnfiltered * tempUnfiltered) >> ENERGY_SHIFT;
- accuFE += (tempFiltered * tempFiltered) >> ENERGY_SHIFT;
- }
-
- blockSwitchingControl->windowNrg[1][w] = accuUE;
- blockSwitchingControl->windowNrgF[1][w] = accuFE;
-
- }
-
- blockSwitchingControl->iirStates[0] = states0;
- blockSwitchingControl->iirStates[1] = states1;
-
- return(TRUE);
-}
-#endif
-
-static Word16 synchronizedBlockTypeTable[4][4] = {
- /* LONG_WINDOW START_WINDOW SHORT_WINDOW STOP_WINDOW */
- /* LONG_WINDOW */{LONG_WINDOW, START_WINDOW, SHORT_WINDOW, STOP_WINDOW},
- /* START_WINDOW */{START_WINDOW, START_WINDOW, SHORT_WINDOW, SHORT_WINDOW},
- /* SHORT_WINDOW */{SHORT_WINDOW, SHORT_WINDOW, SHORT_WINDOW, SHORT_WINDOW},
- /* STOP_WINDOW */{STOP_WINDOW, SHORT_WINDOW, SHORT_WINDOW, STOP_WINDOW}
-};
-
-
-/*****************************************************************************
-*
-* function name: SyncBlockSwitching
-* description: update block type and group value
-* returns: TRUE if success
-*
-**********************************************************************************/
-Word16 SyncBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft,
- BLOCK_SWITCHING_CONTROL *blockSwitchingControlRight,
- const Word16 nChannels)
-{
- Word16 i;
- Word16 patchType = LONG_WINDOW;
-
-
- if (nChannels == 1) { /* Mono */
- if (blockSwitchingControlLeft->windowSequence != SHORT_WINDOW) {
- blockSwitchingControlLeft->noOfGroups = 1;
- blockSwitchingControlLeft->groupLen[0] = 1;
-
- for (i=1; i<TRANS_FAC; i++) {
- blockSwitchingControlLeft->groupLen[i] = 0;
- }
- }
- }
- else { /* Stereo common Window */
- patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->windowSequence];
- patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->windowSequence];
-
- /* Set synchronized Blocktype */
- blockSwitchingControlLeft->windowSequence = patchType;
- blockSwitchingControlRight->windowSequence = patchType;
-
- /* Synchronize grouping info */
- if(patchType != SHORT_WINDOW) { /* Long Blocks */
- /* Set grouping info */
- blockSwitchingControlLeft->noOfGroups = 1;
- blockSwitchingControlRight->noOfGroups = 1;
- blockSwitchingControlLeft->groupLen[0] = 1;
- blockSwitchingControlRight->groupLen[0] = 1;
-
- for (i=1; i<TRANS_FAC; i++) {
- blockSwitchingControlLeft->groupLen[i] = 0;
- blockSwitchingControlRight->groupLen[i] = 0;
- }
- }
- else {
-
- if (blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) {
- /* Left Channel wins */
- blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups;
- for (i=0; i<TRANS_FAC; i++) {
- blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i];
- }
- }
- else {
- /* Right Channel wins */
- blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups;
- for (i=0; i<TRANS_FAC; i++) {
- blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i];
- }
- }
- }
- } /*endif Mono or Stereo */
-
- return(TRUE);
-}
diff --git a/media/libstagefright/codecs/aacenc/src/channel_map.c b/media/libstagefright/codecs/aacenc/src/channel_map.c
deleted file mode 100644
index f6552ed..0000000
--- a/media/libstagefright/codecs/aacenc/src/channel_map.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: channel_map.c
-
- Content: channel mapping functions
-
-*******************************************************************************/
-
-#include "channel_map.h"
-#include "bitenc.h"
-#include "psy_const.h"
-#include "qc_data.h"
-
-static const Word16 maxChannelBits = MAXBITS_COEF;
-
-static Word16 initElement(ELEMENT_INFO* elInfo, ELEMENT_TYPE elType)
-{
- Word16 error=0;
-
- elInfo->elType=elType;
-
- switch(elInfo->elType) {
-
- case ID_SCE:
- elInfo->nChannelsInEl=1;
-
- elInfo->ChannelIndex[0]=0;
-
- elInfo->instanceTag=0;
- break;
-
- case ID_CPE:
-
- elInfo->nChannelsInEl=2;
-
- elInfo->ChannelIndex[0]=0;
- elInfo->ChannelIndex[1]=1;
-
- elInfo->instanceTag=0;
- break;
-
- default:
- error=1;
- }
-
- return error;
-}
-
-
-Word16 InitElementInfo (Word16 nChannels, ELEMENT_INFO* elInfo)
-{
- Word16 error;
- error = 0;
-
- switch(nChannels) {
-
- case 1:
- initElement(elInfo, ID_SCE);
- break;
-
- case 2:
- initElement(elInfo, ID_CPE);
- break;
-
- default:
- error=4;
- }
-
- return error;
-}
-
-
-Word16 InitElementBits(ELEMENT_BITS *elementBits,
- ELEMENT_INFO elInfo,
- Word32 bitrateTot,
- Word16 averageBitsTot,
- Word16 staticBitsTot)
-{
- Word16 error;
- error = 0;
-
- switch(elInfo.nChannelsInEl) {
- case 1:
- elementBits->chBitrate = bitrateTot;
- elementBits->averageBits = averageBitsTot - staticBitsTot;
- elementBits->maxBits = maxChannelBits;
-
- elementBits->maxBitResBits = maxChannelBits - averageBitsTot;
- elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
- elementBits->bitResLevel = elementBits->maxBitResBits;
- elementBits->relativeBits = 0x4000; /* 1.0f/2 */
- break;
-
- case 2:
- elementBits->chBitrate = bitrateTot >> 1;
- elementBits->averageBits = averageBitsTot - staticBitsTot;
- elementBits->maxBits = maxChannelBits << 1;
-
- elementBits->maxBitResBits = (maxChannelBits << 1) - averageBitsTot;
- elementBits->maxBitResBits = elementBits->maxBitResBits - (elementBits->maxBitResBits & 7);
- elementBits->bitResLevel = elementBits->maxBitResBits;
- elementBits->relativeBits = 0x4000; /* 1.0f/2 */
- break;
-
- default:
- error = 1;
- }
- return error;
-}
diff --git a/media/libstagefright/codecs/aacenc/src/dyn_bits.c b/media/libstagefright/codecs/aacenc/src/dyn_bits.c
deleted file mode 100644
index e75b48f..0000000
--- a/media/libstagefright/codecs/aacenc/src/dyn_bits.c
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: dyn_bits.c
-
- Content: Noiseless coder module functions
-
-*******************************************************************************/
-
-#define LOG_TAG "NoiselessCoder"
-
-#include "log/log.h"
-
-#include "aac_rom.h"
-#include "dyn_bits.h"
-#include "bit_cnt.h"
-#include "psy_const.h"
-
-/*****************************************************************************
-*
-* function name: buildBitLookUp
-* description: count bits using all possible tables
-*
-*****************************************************************************/
-static void
-buildBitLookUp(const Word16 *quantSpectrum,
- const Word16 maxSfb,
- const Word16 *sfbOffset,
- const UWord16 *sfbMax,
- Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
- SECTION_INFO * sectionInfo)
-{
- Word32 i;
-
- for (i=0; i<maxSfb; i++) {
- Word16 sfbWidth, maxVal;
-
- sectionInfo[i].sfbCnt = 1;
- sectionInfo[i].sfbStart = i;
- sectionInfo[i].sectionBits = INVALID_BITCOUNT;
- sectionInfo[i].codeBook = -1;
- sfbWidth = sfbOffset[i + 1] - sfbOffset[i];
- maxVal = sfbMax[i];
- bitCount(quantSpectrum + sfbOffset[i], sfbWidth, maxVal, bitLookUp[i]);
- }
-}
-
-
-/*****************************************************************************
-*
-* function name: findBestBook
-* description: essential helper functions
-*
-*****************************************************************************/
-static Word16
-findBestBook(const Word16 *bc, Word16 *book)
-{
- Word32 minBits, j;
- minBits = INVALID_BITCOUNT;
-
- for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
-
- if (bc[j] < minBits) {
- minBits = bc[j];
- *book = j;
- }
- }
- return extract_l(minBits);
-}
-
-static Word16
-findMinMergeBits(const Word16 *bc1, const Word16 *bc2)
-{
- Word32 minBits, j, sum;
- minBits = INVALID_BITCOUNT;
-
- for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
- sum = bc1[j] + bc2[j];
- if (sum < minBits) {
- minBits = sum;
- }
- }
- return extract_l(minBits);
-}
-
-static void
-mergeBitLookUp(Word16 *bc1, const Word16 *bc2)
-{
- Word32 j;
-
- for (j=0; j<=CODE_BOOK_ESC_NDX; j++) {
- bc1[j] = min(bc1[j] + bc2[j], INVALID_BITCOUNT);
- }
-}
-
-static Word16
-findMaxMerge(const Word16 mergeGainLookUp[MAX_SFB_LONG],
- const SECTION_INFO *sectionInfo,
- const Word16 maxSfb, Word16 *maxNdx)
-{
- Word32 i, maxMergeGain;
- maxMergeGain = 0;
-
- for (i=0; i+sectionInfo[i].sfbCnt < maxSfb; i += sectionInfo[i].sfbCnt) {
-
- if (mergeGainLookUp[i] > maxMergeGain) {
- maxMergeGain = mergeGainLookUp[i];
- *maxNdx = i;
- }
- }
- return extract_l(maxMergeGain);
-}
-
-
-
-static Word16
-CalcMergeGain(const SECTION_INFO *sectionInfo,
- Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
- const Word16 *sideInfoTab,
- const Word16 ndx1,
- const Word16 ndx2)
-{
- Word32 SplitBits;
- Word32 MergeBits;
- Word32 MergeGain;
-
- /*
- Bit amount for splitted sections
- */
- SplitBits = sectionInfo[ndx1].sectionBits + sectionInfo[ndx2].sectionBits;
-
- MergeBits = sideInfoTab[sectionInfo[ndx1].sfbCnt + sectionInfo[ndx2].sfbCnt] +
- findMinMergeBits(bitLookUp[ndx1], bitLookUp[ndx2]);
- MergeGain = (SplitBits - MergeBits);
-
- return extract_l(MergeGain);
-}
-
-/*
- sectioning Stage 0:find minimum codbooks
-*/
-
-static void
-gmStage0(SECTION_INFO * sectionInfo,
- Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
- const Word16 maxSfb)
-{
- Word32 i;
-
- for (i=0; i<maxSfb; i++) {
- /* Side-Info bits will be calculated in Stage 1! */
-
- if (sectionInfo[i].sectionBits == INVALID_BITCOUNT) {
- sectionInfo[i].sectionBits = findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook));
- }
- }
-}
-
-/*
- sectioning Stage 1:merge all connected regions with the same code book and
- calculate side info
-*/
-
-static void
-gmStage1(SECTION_INFO * sectionInfo,
- Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
- const Word16 maxSfb,
- const Word16 *sideInfoTab)
-{
- SECTION_INFO * sectionInfo_s;
- SECTION_INFO * sectionInfo_e;
- Word32 mergeStart, mergeEnd;
- mergeStart = 0;
-
- do {
-
- sectionInfo_s = sectionInfo + mergeStart;
- for (mergeEnd=mergeStart+1; mergeEnd<maxSfb; mergeEnd++) {
- sectionInfo_e = sectionInfo + mergeEnd;
- if (sectionInfo_s->codeBook != sectionInfo_e->codeBook)
- break;
- sectionInfo_s->sfbCnt += 1;
- sectionInfo_s->sectionBits += sectionInfo_e->sectionBits;
-
- mergeBitLookUp(bitLookUp[mergeStart], bitLookUp[mergeEnd]);
- }
-
- sectionInfo_s->sectionBits += sideInfoTab[sectionInfo_s->sfbCnt];
- sectionInfo[mergeEnd - 1].sfbStart = sectionInfo_s->sfbStart; /* speed up prev search */
-
- mergeStart = mergeEnd;
-
-
- } while (mergeStart - maxSfb < 0);
-}
-
-/*
- sectioning Stage 2:greedy merge algorithm, merge connected sections with
- maximum bit gain until no more gain is possible
-*/
-static void
-gmStage2(SECTION_INFO *sectionInfo,
- Word16 mergeGainLookUp[MAX_SFB_LONG],
- Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
- const Word16 maxSfb,
- const Word16 *sideInfoTab)
-{
- Word16 i;
-
- for (i=0; i+sectionInfo[i].sfbCnt<maxSfb; i+=sectionInfo[i].sfbCnt) {
- mergeGainLookUp[i] = CalcMergeGain(sectionInfo,
- bitLookUp,
- sideInfoTab,
- i,
- (i + sectionInfo[i].sfbCnt));
- }
-
- while (TRUE) {
- Word16 maxMergeGain, maxNdx = 0, maxNdxNext, maxNdxLast;
-
- maxMergeGain = findMaxMerge(mergeGainLookUp, sectionInfo, maxSfb, &maxNdx);
-
-
- if (maxMergeGain <= 0)
- break;
-
-
- maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt;
-
- sectionInfo[maxNdx].sfbCnt = sectionInfo[maxNdx].sfbCnt + sectionInfo[maxNdxNext].sfbCnt;
- sectionInfo[maxNdx].sectionBits = sectionInfo[maxNdx].sectionBits +
- (sectionInfo[maxNdxNext].sectionBits - maxMergeGain);
-
-
- mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]);
-
-
- if (maxNdx != 0) {
- maxNdxLast = sectionInfo[maxNdx - 1].sfbStart;
- mergeGainLookUp[maxNdxLast] = CalcMergeGain(sectionInfo,
- bitLookUp,
- sideInfoTab,
- maxNdxLast,
- maxNdx);
- }
- maxNdxNext = maxNdx + sectionInfo[maxNdx].sfbCnt;
-
- sectionInfo[maxNdxNext - 1].sfbStart = sectionInfo[maxNdx].sfbStart;
-
-
- if (maxNdxNext - maxSfb < 0) {
- mergeGainLookUp[maxNdx] = CalcMergeGain(sectionInfo,
- bitLookUp,
- sideInfoTab,
- maxNdx,
- maxNdxNext);
- }
- }
-}
-
-/*
- count bits used by the noiseless coder
-*/
-static void
-noiselessCounter(SECTION_DATA *sectionData,
- Word16 mergeGainLookUp[MAX_SFB_LONG],
- Word16 bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
- const Word16 *quantSpectrum,
- const UWord16 *maxValueInSfb,
- const Word16 *sfbOffset,
- const Word32 blockType)
-{
- Word32 grpNdx, i;
- const Word16 *sideInfoTab = NULL;
- SECTION_INFO *sectionInfo;
-
- /*
- use appropriate side info table
- */
- switch (blockType)
- {
- case LONG_WINDOW:
- case START_WINDOW:
- case STOP_WINDOW:
- sideInfoTab = sideInfoTabLong;
- break;
- case SHORT_WINDOW:
- sideInfoTab = sideInfoTabShort;
- break;
- default:
- ALOGE("invalid blockType: %d", blockType);
- return;
- }
-
-
- sectionData->noOfSections = 0;
- sectionData->huffmanBits = 0;
- sectionData->sideInfoBits = 0;
-
-
- if (sectionData->maxSfbPerGroup == 0)
- return;
-
- /*
- loop trough groups
- */
- for (grpNdx=0; grpNdx<sectionData->sfbCnt; grpNdx+=sectionData->sfbPerGroup) {
-
- sectionInfo = sectionData->sectionInfo + sectionData->noOfSections;
-
- buildBitLookUp(quantSpectrum,
- sectionData->maxSfbPerGroup,
- sfbOffset + grpNdx,
- maxValueInSfb + grpNdx,
- bitLookUp,
- sectionInfo);
-
- /*
- 0.Stage
- */
- gmStage0(sectionInfo, bitLookUp, sectionData->maxSfbPerGroup);
-
- /*
- 1.Stage
- */
- gmStage1(sectionInfo, bitLookUp, sectionData->maxSfbPerGroup, sideInfoTab);
-
-
- /*
- 2.Stage
- */
- gmStage2(sectionInfo,
- mergeGainLookUp,
- bitLookUp,
- sectionData->maxSfbPerGroup,
- sideInfoTab);
-
-
- /*
- compress output, calculate total huff and side bits
- */
- for (i=0; i<sectionData->maxSfbPerGroup; i+=sectionInfo[i].sfbCnt) {
- findBestBook(bitLookUp[i], &(sectionInfo[i].codeBook));
- sectionInfo[i].sfbStart = sectionInfo[i].sfbStart + grpNdx;
-
- sectionData->huffmanBits = (sectionData->huffmanBits +
- (sectionInfo[i].sectionBits - sideInfoTab[sectionInfo[i].sfbCnt]));
- sectionData->sideInfoBits = (sectionData->sideInfoBits + sideInfoTab[sectionInfo[i].sfbCnt]);
- sectionData->sectionInfo[sectionData->noOfSections] = sectionInfo[i];
- sectionData->noOfSections = sectionData->noOfSections + 1;
- }
- }
-}
-
-
-/*******************************************************************************
-*
-* functionname: scfCount
-* returns : ---
-* description : count bits used by scalefactors.
-*
-********************************************************************************/
-static void scfCount(const Word16 *scalefacGain,
- const UWord16 *maxValueInSfb,
- SECTION_DATA * sectionData)
-
-{
- SECTION_INFO *psectionInfo;
- SECTION_INFO *psectionInfom;
-
- /* counter */
- Word32 i = 0; /* section counter */
- Word32 j = 0; /* sfb counter */
- Word32 k = 0; /* current section auxiliary counter */
- Word32 m = 0; /* other section auxiliary counter */
- Word32 n = 0; /* other sfb auxiliary counter */
-
- /* further variables */
- Word32 lastValScf = 0;
- Word32 deltaScf = 0;
- Flag found = 0;
- Word32 scfSkipCounter = 0;
-
-
- sectionData->scalefacBits = 0;
-
-
- if (scalefacGain == NULL) {
- return;
- }
-
- lastValScf = 0;
- sectionData->firstScf = 0;
-
- psectionInfo = sectionData->sectionInfo;
- for (i=0; i<sectionData->noOfSections; i++) {
-
- if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO) {
- sectionData->firstScf = psectionInfo->sfbStart;
- lastValScf = scalefacGain[sectionData->firstScf];
- break;
- }
- psectionInfo += 1;
- }
-
- psectionInfo = sectionData->sectionInfo;
- for (i=0; i<sectionData->noOfSections; i++, psectionInfo += 1) {
-
- if (psectionInfo->codeBook != CODE_BOOK_ZERO_NO
- && psectionInfo->codeBook != CODE_BOOK_PNS_NO) {
- for (j = psectionInfo->sfbStart;
- j < (psectionInfo->sfbStart + psectionInfo->sfbCnt); j++) {
- /* check if we can repeat the last value to save bits */
-
- if (maxValueInSfb[j] == 0) {
- found = 0;
-
- if (scfSkipCounter == 0) {
- /* end of section */
-
- if (j - ((psectionInfo->sfbStart + psectionInfo->sfbCnt) - 1) == 0) {
- found = 0;
- }
- else {
- for (k = j + 1; k < psectionInfo->sfbStart + psectionInfo->sfbCnt; k++) {
-
- if (maxValueInSfb[k] != 0) {
- int tmp = L_abs(scalefacGain[k] - lastValScf);
- found = 1;
-
- if ( tmp < CODE_BOOK_SCF_LAV) {
- /* save bits */
- deltaScf = 0;
- }
- else {
- /* do not save bits */
- deltaScf = lastValScf - scalefacGain[j];
- lastValScf = scalefacGain[j];
- scfSkipCounter = 0;
- }
- break;
- }
- /* count scalefactor skip */
- scfSkipCounter = scfSkipCounter + 1;
- }
- }
-
- psectionInfom = psectionInfo + 1;
- /* search for the next maxValueInSfb[] != 0 in all other sections */
- for (m = i + 1; (m < sectionData->noOfSections) && (found == 0); m++) {
-
- if ((psectionInfom->codeBook != CODE_BOOK_ZERO_NO) &&
- (psectionInfom->codeBook != CODE_BOOK_PNS_NO)) {
- for (n = psectionInfom->sfbStart;
- n < (psectionInfom->sfbStart + psectionInfom->sfbCnt); n++) {
-
- if (maxValueInSfb[n] != 0) {
- found = 1;
-
- if ( (abs_s(scalefacGain[n] - lastValScf) < CODE_BOOK_SCF_LAV)) {
- deltaScf = 0;
- }
- else {
- deltaScf = (lastValScf - scalefacGain[j]);
- lastValScf = scalefacGain[j];
- scfSkipCounter = 0;
- }
- break;
- }
- /* count scalefactor skip */
- scfSkipCounter = scfSkipCounter + 1;
- }
- }
-
- psectionInfom += 1;
- }
-
- if (found == 0) {
- deltaScf = 0;
- scfSkipCounter = 0;
- }
- }
- else {
- deltaScf = 0;
- scfSkipCounter = scfSkipCounter - 1;
- }
- }
- else {
- deltaScf = lastValScf - scalefacGain[j];
- lastValScf = scalefacGain[j];
- }
- sectionData->scalefacBits += bitCountScalefactorDelta(deltaScf);
- }
- }
- }
-}
-
-
-typedef Word16 (*lookUpTable)[CODE_BOOK_ESC_NDX + 1];
-
-
-Word16
-dynBitCount(const Word16 *quantSpectrum,
- const UWord16 *maxValueInSfb,
- const Word16 *scalefac,
- const Word16 blockType,
- const Word16 sfbCnt,
- const Word16 maxSfbPerGroup,
- const Word16 sfbPerGroup,
- const Word16 *sfbOffset,
- SECTION_DATA *sectionData)
-{
- sectionData->blockType = blockType;
- sectionData->sfbCnt = sfbCnt;
- sectionData->sfbPerGroup = sfbPerGroup;
- if(sfbPerGroup)
- sectionData->noOfGroups = sfbCnt/sfbPerGroup;
- else
- sectionData->noOfGroups = 0x7fff;
- sectionData->maxSfbPerGroup = maxSfbPerGroup;
-
- noiselessCounter(sectionData,
- sectionData->mergeGainLookUp,
- (lookUpTable)sectionData->bitLookUp,
- quantSpectrum,
- maxValueInSfb,
- sfbOffset,
- blockType);
-
- scfCount(scalefac,
- maxValueInSfb,
- sectionData);
-
-
- return (sectionData->huffmanBits + sectionData->sideInfoBits +
- sectionData->scalefacBits);
-}
-
diff --git a/media/libstagefright/codecs/aacenc/src/grp_data.c b/media/libstagefright/codecs/aacenc/src/grp_data.c
deleted file mode 100644
index edfb95b..0000000
--- a/media/libstagefright/codecs/aacenc/src/grp_data.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: grp_data.c
-
- Content: Short block grouping function
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "psy_const.h"
-#include "interface.h"
-#include "grp_data.h"
-
-/*****************************************************************************
-*
-* function name: groupShortData
-* description: group short data for next quantization and coding
-*
-**********************************************************************************/
-void
-groupShortData(Word32 *mdctSpectrum,
- Word32 *tmpSpectrum,
- SFB_THRESHOLD *sfbThreshold,
- SFB_ENERGY *sfbEnergy,
- SFB_ENERGY *sfbEnergyMS,
- SFB_ENERGY *sfbSpreadedEnergy,
- const Word16 sfbCnt,
- const Word16 *sfbOffset,
- const Word16 *sfbMinSnr,
- Word16 *groupedSfbOffset,
- Word16 *maxSfbPerGroup,
- Word16 *groupedSfbMinSnr,
- const Word16 noOfGroups,
- const Word16 *groupLen)
-{
- Word32 i, j;
- Word32 line;
- Word32 sfb;
- Word32 grp;
- Word32 wnd;
- Word32 offset;
- Word32 highestSfb;
-
- /* for short: regroup and */
- /* cumulate energies und thresholds group-wise . */
-
- /* calculate sfbCnt */
- highestSfb = 0;
- for (wnd=0; wnd<TRANS_FAC; wnd++) {
- for (sfb=sfbCnt - 1; sfb>=highestSfb; sfb--) {
- for (line=(sfbOffset[sfb + 1] - 1); line>=sfbOffset[sfb]; line--) {
-
- if (mdctSpectrum[wnd*FRAME_LEN_SHORT+line] != 0) break;
- }
-
- if (line >= sfbOffset[sfb]) break;
- }
- highestSfb = max(highestSfb, sfb);
- }
-
- if (highestSfb < 0) {
- highestSfb = 0;
- }
- *maxSfbPerGroup = highestSfb + 1;
-
- /* calculate sfbOffset */
- i = 0;
- offset = 0;
- for (grp = 0; grp < noOfGroups; grp++) {
- for (sfb = 0; sfb < sfbCnt; sfb++) {
- groupedSfbOffset[i] = offset + sfbOffset[sfb] * groupLen[grp];
- i += 1;
- }
- offset += groupLen[grp] * FRAME_LEN_SHORT;
- }
- groupedSfbOffset[i] = FRAME_LEN_LONG;
-
- /* calculate minSnr */
- i = 0;
- offset = 0;
- for (grp = 0; grp < noOfGroups; grp++) {
- for (sfb = 0; sfb < sfbCnt; sfb++) {
- groupedSfbMinSnr[i] = sfbMinSnr[sfb];
- i += 1;
- }
- offset += groupLen[grp] * FRAME_LEN_SHORT;
- }
-
-
- /* sum up sfbThresholds */
- wnd = 0;
- i = 0;
- for (grp = 0; grp < noOfGroups; grp++) {
- for (sfb = 0; sfb < sfbCnt; sfb++) {
- Word32 thresh = sfbThreshold->sfbShort[wnd][sfb];
- for (j=1; j<groupLen[grp]; j++) {
- thresh = L_add(thresh, sfbThreshold->sfbShort[wnd+j][sfb]);
- }
- sfbThreshold->sfbLong[i] = thresh;
- i += 1;
- }
- wnd += groupLen[grp];
- }
-
- /* sum up sfbEnergies left/right */
- wnd = 0;
- i = 0;
- for (grp = 0; grp < noOfGroups; grp++) {
- for (sfb = 0; sfb < sfbCnt; sfb++) {
- Word32 energy = sfbEnergy->sfbShort[wnd][sfb];
- for (j=1; j<groupLen[grp]; j++) {
- energy = L_add(energy, sfbEnergy->sfbShort[wnd+j][sfb]);
- }
- sfbEnergy->sfbLong[i] = energy;
- i += 1;
- }
- wnd += groupLen[grp];
- }
-
- /* sum up sfbEnergies mid/side */
- wnd = 0;
- i = 0;
- for (grp = 0; grp < noOfGroups; grp++) {
- for (sfb = 0; sfb < sfbCnt; sfb++) {
- Word32 energy = sfbEnergyMS->sfbShort[wnd][sfb];
- for (j=1; j<groupLen[grp]; j++) {
- energy = L_add(energy, sfbEnergyMS->sfbShort[wnd+j][sfb]);
- }
- sfbEnergyMS->sfbLong[i] = energy;
- i += 1;
- }
- wnd += groupLen[grp];
- }
-
- /* sum up sfbSpreadedEnergies */
- wnd = 0;
- i = 0;
- for (grp = 0; grp < noOfGroups; grp++) {
- for (sfb = 0; sfb < sfbCnt; sfb++) {
- Word32 energy = sfbSpreadedEnergy->sfbShort[wnd][sfb];
- for (j=1; j<groupLen[grp]; j++) {
- energy = L_add(energy, sfbSpreadedEnergy->sfbShort[wnd+j][sfb]);
- }
- sfbSpreadedEnergy->sfbLong[i] = energy;
- i += 1;
- }
- wnd += groupLen[grp];
- }
-
- /* re-group spectrum */
- wnd = 0;
- i = 0;
- for (grp = 0; grp < noOfGroups; grp++) {
- for (sfb = 0; sfb < sfbCnt; sfb++) {
- for (j = 0; j < groupLen[grp]; j++) {
- Word16 lineOffset = FRAME_LEN_SHORT * (wnd + j);
- for (line = lineOffset + sfbOffset[sfb]; line < lineOffset + sfbOffset[sfb+1]; line++) {
- tmpSpectrum[i] = mdctSpectrum[line];
- i = i + 1;
- }
- }
- }
- wnd += groupLen[grp];
- }
-
- for(i=0;i<FRAME_LEN_LONG;i+=4) {
- mdctSpectrum[i] = tmpSpectrum[i];
- mdctSpectrum[i+1] = tmpSpectrum[i+1];
- mdctSpectrum[i+2] = tmpSpectrum[i+2];
- mdctSpectrum[i+3] = tmpSpectrum[i+3];
- }
-}
-
diff --git a/media/libstagefright/codecs/aacenc/src/interface.c b/media/libstagefright/codecs/aacenc/src/interface.c
deleted file mode 100644
index d0ad433..0000000
--- a/media/libstagefright/codecs/aacenc/src/interface.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: interface.c
-
- Content: Interface psychoaccoustic/quantizer functions
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "psy_const.h"
-#include "interface.h"
-
-/*****************************************************************************
-*
-* function name: BuildInterface
-* description: update output parameter
-*
-**********************************************************************************/
-void BuildInterface(Word32 *groupedMdctSpectrum,
- const Word16 mdctScale,
- SFB_THRESHOLD *groupedSfbThreshold,
- SFB_ENERGY *groupedSfbEnergy,
- SFB_ENERGY *groupedSfbSpreadedEnergy,
- const SFB_ENERGY_SUM sfbEnergySumLR,
- const SFB_ENERGY_SUM sfbEnergySumMS,
- const Word16 windowSequence,
- const Word16 windowShape,
- const Word16 groupedSfbCnt,
- const Word16 *groupedSfbOffset,
- const Word16 maxSfbPerGroup,
- const Word16 *groupedSfbMinSnr,
- const Word16 noOfGroups,
- const Word16 *groupLen,
- PSY_OUT_CHANNEL *psyOutCh)
-{
- Word32 j;
- Word32 grp;
- Word32 mask;
- Word16 *tmpV;
-
- /*
- copy values to psyOut
- */
- psyOutCh->maxSfbPerGroup = maxSfbPerGroup;
- psyOutCh->sfbCnt = groupedSfbCnt;
- if(noOfGroups)
- psyOutCh->sfbPerGroup = groupedSfbCnt/ noOfGroups;
- else
- psyOutCh->sfbPerGroup = 0x7fff;
- psyOutCh->windowSequence = windowSequence;
- psyOutCh->windowShape = windowShape;
- psyOutCh->mdctScale = mdctScale;
- psyOutCh->mdctSpectrum = groupedMdctSpectrum;
- psyOutCh->sfbEnergy = groupedSfbEnergy->sfbLong;
- psyOutCh->sfbThreshold = groupedSfbThreshold->sfbLong;
- psyOutCh->sfbSpreadedEnergy = groupedSfbSpreadedEnergy->sfbLong;
-
- tmpV = psyOutCh->sfbOffsets;
- for(j=0; j<groupedSfbCnt + 1; j++) {
- *tmpV++ = groupedSfbOffset[j];
- }
-
- tmpV = psyOutCh->sfbMinSnr;
- for(j=0;j<groupedSfbCnt; j++) {
- *tmpV++ = groupedSfbMinSnr[j];
- }
-
- /* generate grouping mask */
- mask = 0;
- for (grp = 0; grp < noOfGroups; grp++) {
- mask = mask << 1;
- for (j=1; j<groupLen[grp]; j++) {
- mask = mask << 1;
- mask |= 1;
- }
- }
- psyOutCh->groupingMask = mask;
-
- if (windowSequence != SHORT_WINDOW) {
- psyOutCh->sfbEnSumLR = sfbEnergySumLR.sfbLong;
- psyOutCh->sfbEnSumMS = sfbEnergySumMS.sfbLong;
- }
- else {
- Word32 i;
- Word32 accuSumMS=0;
- Word32 accuSumLR=0;
- const Word32 *pSumMS = sfbEnergySumMS.sfbShort;
- const Word32 *pSumLR = sfbEnergySumLR.sfbShort;
-
- for (i=TRANS_FAC; i; i--) {
- accuSumLR = L_add(accuSumLR, *pSumLR); pSumLR++;
- accuSumMS = L_add(accuSumMS, *pSumMS); pSumMS++;
- }
- psyOutCh->sfbEnSumMS = accuSumMS;
- psyOutCh->sfbEnSumLR = accuSumLR;
- }
-}
diff --git a/media/libstagefright/codecs/aacenc/src/line_pe.c b/media/libstagefright/codecs/aacenc/src/line_pe.c
deleted file mode 100644
index 480dc28..0000000
--- a/media/libstagefright/codecs/aacenc/src/line_pe.c
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: line_pe.c
-
- Content: Perceptual entropie module functions
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "typedef.h"
-#include "line_pe.h"
-
-
-static const Word16 C1_I = 12; /* log(8.0)/log(2) *4 */
-static const Word32 C2_I = 10830; /* log(2.5)/log(2) * 1024 * 4 * 2 */
-static const Word16 C3_I = 573; /* (1-C2/C1) *1024 */
-
-
-/*****************************************************************************
-*
-* function name: prepareSfbPe
-* description: constants that do not change during successive pe calculations
-*
-**********************************************************************************/
-void prepareSfbPe(PE_DATA *peData,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
- const Word16 nChannels,
- const Word16 peOffset)
-{
- Word32 sfbGrp, sfb;
- Word32 ch;
-
- for(ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
- PE_CHANNEL_DATA *peChanData=&peData->peChannelData[ch];
- for(sfbGrp=0;sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup){
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- peChanData->sfbNLines4[sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb];
- sfbNRelevantLines[ch][sfbGrp+sfb] = sfbNRelevantLines[ch][sfbGrp+sfb] >> 2;
- peChanData->sfbLdEnergy[sfbGrp+sfb] = logSfbEnergy[ch][sfbGrp+sfb];
- }
- }
- }
- peData->offset = peOffset;
-}
-
-
-/*****************************************************************************
-*
-* function name: calcSfbPe
-* description: constPart is sfbPe without the threshold part n*ld(thr) or n*C3*ld(thr)
-*
-**********************************************************************************/
-void calcSfbPe(PE_DATA *peData,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- const Word16 nChannels)
-{
- Word32 ch;
- Word32 sfbGrp, sfb;
- Word32 nLines4;
- Word32 ldThr, ldRatio;
- Word32 pe, constPart, nActiveLines;
-
- peData->pe = peData->offset;
- peData->constPart = 0;
- peData->nActiveLines = 0;
- for(ch=0; ch<nChannels; ch++) {
- PSY_OUT_CHANNEL *psyOutChan = &psyOutChannel[ch];
- PE_CHANNEL_DATA *peChanData = &peData->peChannelData[ch];
- const Word32 *sfbEnergy = psyOutChan->sfbEnergy;
- const Word32 *sfbThreshold = psyOutChan->sfbThreshold;
-
- pe = 0;
- constPart = 0;
- nActiveLines = 0;
-
- for(sfbGrp=0; sfbGrp<psyOutChan->sfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) {
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- Word32 nrg = sfbEnergy[sfbGrp+sfb];
- Word32 thres = sfbThreshold[sfbGrp+sfb];
- Word32 sfbLDEn = peChanData->sfbLdEnergy[sfbGrp+sfb];
-
- if (nrg > thres) {
- ldThr = iLog4(thres);
-
- ldRatio = sfbLDEn - ldThr;
-
- nLines4 = peChanData->sfbNLines4[sfbGrp+sfb];
-
- /* sfbPe = nl*log2(en/thr)*/
- if (ldRatio >= C1_I) {
- peChanData->sfbPe[sfbGrp+sfb] = (nLines4*ldRatio + 8) >> 4;
- peChanData->sfbConstPart[sfbGrp+sfb] = ((nLines4*sfbLDEn)) >> 4;
- }
- else {
- /* sfbPe = nl*(c2 + c3*log2(en/thr))*/
- peChanData->sfbPe[sfbGrp+sfb] = extract_l((L_mpy_wx(
- (C2_I + C3_I * ldRatio * 2) << 4, nLines4) + 4) >> 3);
- peChanData->sfbConstPart[sfbGrp+sfb] = extract_l(( L_mpy_wx(
- (C2_I + C3_I * sfbLDEn * 2) << 4, nLines4) + 4) >> 3);
- nLines4 = (nLines4 * C3_I + (1024<<1)) >> 10;
- }
- peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines4 >> 2;
- }
- else {
- peChanData->sfbPe[sfbGrp+sfb] = 0;
- peChanData->sfbConstPart[sfbGrp+sfb] = 0;
- peChanData->sfbNActiveLines[sfbGrp+sfb] = 0;
- }
- pe = pe + peChanData->sfbPe[sfbGrp+sfb];
- constPart = constPart + peChanData->sfbConstPart[sfbGrp+sfb];
- nActiveLines = nActiveLines + peChanData->sfbNActiveLines[sfbGrp+sfb];
- }
- }
-
- peChanData->pe = saturate(pe);
- peChanData->constPart = saturate(constPart);
- peChanData->nActiveLines = saturate(nActiveLines);
-
-
- pe += peData->pe;
- peData->pe = saturate(pe);
- constPart += peData->constPart;
- peData->constPart = saturate(constPart);
- nActiveLines += peData->nActiveLines;
- peData->nActiveLines = saturate(nActiveLines);
- }
-}
diff --git a/media/libstagefright/codecs/aacenc/src/memalign.c b/media/libstagefright/codecs/aacenc/src/memalign.c
deleted file mode 100644
index bb266dc..0000000
--- a/media/libstagefright/codecs/aacenc/src/memalign.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-
-/*******************************************************************************
- File: mem_align.c
-
- Content: Memory alloc alignments functions
-
-*******************************************************************************/
-
-
-#include "memalign.h"
-#ifdef _MSC_VER
-#include <stddef.h>
-#else
-#include <stdint.h>
-#endif
-
-/*****************************************************************************
-*
-* function name: mem_malloc
-* description: malloc the alignments memory
-* returns: the point of the memory
-*
-**********************************************************************************/
-void *
-mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID)
-{
- int ret;
- unsigned char *mem_ptr;
- VO_MEM_INFO MemInfo;
-
- if (!alignment) {
-
- MemInfo.Flag = 0;
- MemInfo.Size = size + 1;
- ret = pMemop->Alloc(CodecID, &MemInfo);
- if(ret != 0)
- return 0;
- mem_ptr = (unsigned char *)MemInfo.VBuffer;
-
- pMemop->Set(CodecID, mem_ptr, 0, size + 1);
-
- *mem_ptr = (unsigned char)1;
-
- return ((void *)(mem_ptr+1));
- } else {
- unsigned char *tmp;
-
- MemInfo.Flag = 0;
- MemInfo.Size = size + alignment;
- ret = pMemop->Alloc(CodecID, &MemInfo);
- if(ret != 0)
- return 0;
-
- tmp = (unsigned char *)MemInfo.VBuffer;
-
- pMemop->Set(CodecID, tmp, 0, size + alignment);
-
- mem_ptr =
- (unsigned char *) ((intptr_t) (tmp + alignment - 1) &
- (~((intptr_t) (alignment - 1))));
-
- if (mem_ptr == tmp)
- mem_ptr += alignment;
-
- *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp);
-
- return ((void *)mem_ptr);
- }
-
- return(0);
-}
-
-
-/*****************************************************************************
-*
-* function name: mem_free
-* description: free the memory
-*
-*******************************************************************************/
-void
-mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID)
-{
-
- unsigned char *ptr;
-
- if (mem_ptr == 0)
- return;
-
- ptr = mem_ptr;
-
- ptr -= *(ptr - 1);
-
- pMemop->Free(CodecID, ptr);
-}
-
-
-
diff --git a/media/libstagefright/codecs/aacenc/src/ms_stereo.c b/media/libstagefright/codecs/aacenc/src/ms_stereo.c
deleted file mode 100644
index ca028dc..0000000
--- a/media/libstagefright/codecs/aacenc/src/ms_stereo.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: ms_stereo.c
-
- Content: MS stereo processing function
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "psy_const.h"
-#include "ms_stereo.h"
-
-
-/********************************************************************************
-*
-* function name: MsStereoProcessing
-* description: detect use ms stereo or not
-* if ((min(thrLn, thrRn)*min(thrLn, thrRn))/(enMn*enSn))
-* >= ((thrLn *thrRn)/(enLn*enRn)) then ms stereo
-*
-**********************************************************************************/
-void MsStereoProcessing(Word32 *sfbEnergyLeft,
- Word32 *sfbEnergyRight,
- const Word32 *sfbEnergyMid,
- const Word32 *sfbEnergySide,
- Word32 *mdctSpectrumLeft,
- Word32 *mdctSpectrumRight,
- Word32 *sfbThresholdLeft,
- Word32 *sfbThresholdRight,
- Word32 *sfbSpreadedEnLeft,
- Word32 *sfbSpreadedEnRight,
- Word16 *msDigest,
- Word16 *msMask,
- const Word16 sfbCnt,
- const Word16 sfbPerGroup,
- const Word16 maxSfbPerGroup,
- const Word16 *sfbOffset) {
- Word32 sfb,sfboffs, j;
- Word32 msMaskTrueSomewhere = 0;
- Word32 msMaskFalseSomewhere = 0;
-
- for (sfb=0; sfb<sfbCnt; sfb+=sfbPerGroup) {
- for (sfboffs=0;sfboffs<maxSfbPerGroup;sfboffs++) {
-
- Word32 temp;
- Word32 pnlr,pnms;
- Word32 minThreshold;
- Word32 thrL, thrR, nrgL, nrgR;
- Word32 idx, shift;
-
- idx = sfb + sfboffs;
-
- thrL = sfbThresholdLeft[idx];
- thrR = sfbThresholdRight[idx];
- nrgL = sfbEnergyLeft[idx];
- nrgR = sfbEnergyRight[idx];
-
- minThreshold = min(thrL, thrR);
-
- nrgL = max(nrgL,thrL) + 1;
- shift = norm_l(nrgL);
- nrgL = Div_32(thrL << shift, nrgL << shift);
- nrgR = max(nrgR,thrR) + 1;
- shift = norm_l(nrgR);
- nrgR = Div_32(thrR << shift, nrgR << shift);
-
- pnlr = fixmul(nrgL, nrgR);
-
- nrgL = sfbEnergyMid[idx];
- nrgR = sfbEnergySide[idx];
-
- nrgL = max(nrgL,minThreshold) + 1;
- shift = norm_l(nrgL);
- nrgL = Div_32(minThreshold << shift, nrgL << shift);
-
- nrgR = max(nrgR,minThreshold) + 1;
- shift = norm_l(nrgR);
- nrgR = Div_32(minThreshold << shift, nrgR << shift);
-
- pnms = fixmul(nrgL, nrgR);
-
- temp = pnms - pnlr;
- if( temp > 0 ){
-
- msMask[idx] = 1;
- msMaskTrueSomewhere = 1;
-
- for (j=sfbOffset[idx]; j<sfbOffset[idx+1]; j++) {
- Word32 left, right;
- left = (mdctSpectrumLeft[j] >> 1);
- right = (mdctSpectrumRight[j] >> 1);
- mdctSpectrumLeft[j] = left + right;
- mdctSpectrumRight[j] = left - right;
- }
-
- sfbThresholdLeft[idx] = minThreshold;
- sfbThresholdRight[idx] = minThreshold;
- sfbEnergyLeft[idx] = sfbEnergyMid[idx];
- sfbEnergyRight[idx] = sfbEnergySide[idx];
-
- sfbSpreadedEnRight[idx] = min(sfbSpreadedEnLeft[idx],sfbSpreadedEnRight[idx]) >> 1;
- sfbSpreadedEnLeft[idx] = sfbSpreadedEnRight[idx];
-
- }
- else {
- msMask[idx] = 0;
- msMaskFalseSomewhere = 1;
- }
- }
- if ( msMaskTrueSomewhere ) {
- if(msMaskFalseSomewhere ) {
- *msDigest = SI_MS_MASK_SOME;
- } else {
- *msDigest = SI_MS_MASK_ALL;
- }
- } else {
- *msDigest = SI_MS_MASK_NONE;
- }
- }
-
-}
diff --git a/media/libstagefright/codecs/aacenc/src/pre_echo_control.c b/media/libstagefright/codecs/aacenc/src/pre_echo_control.c
deleted file mode 100644
index 1406e11..0000000
--- a/media/libstagefright/codecs/aacenc/src/pre_echo_control.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: pre_echo_control.c
-
- Content: Pre echo control functions
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-
-#include "oper_32b.h"
-#include "pre_echo_control.h"
-
-
-/*****************************************************************************
-*
-* function name:InitPreEchoControl
-* description: init pre echo control parameter
-*
-*****************************************************************************/
-void InitPreEchoControl(Word32 *pbThresholdNm1,
- Word16 numPb,
- Word32 *pbThresholdQuiet)
-{
- Word16 pb;
-
- for(pb=0; pb<numPb; pb++) {
- pbThresholdNm1[pb] = pbThresholdQuiet[pb];
- }
-}
-
-/*****************************************************************************
-*
-* function name:PreEchoControl
-* description: update shreshold to avoid pre echo
-* thr(n) = max(rpmin*thrq(n), min(thrq(n), rpelev*thrq1(n)))
-*
-*
-*****************************************************************************/
-void PreEchoControl(Word32 *pbThresholdNm1,
- Word16 numPb,
- Word32 maxAllowedIncreaseFactor,
- Word16 minRemainingThresholdFactor,
- Word32 *pbThreshold,
- Word16 mdctScale,
- Word16 mdctScalenm1)
-{
- Word32 i;
- Word32 tmpThreshold1, tmpThreshold2;
- Word32 scaling;
-
- /* maxAllowedIncreaseFactor is hard coded to 2 */
- (void)maxAllowedIncreaseFactor;
-
- scaling = ((mdctScale - mdctScalenm1) << 1);
-
- if ( scaling > 0 ) {
- for(i = 0; i < numPb; i++) {
- tmpThreshold1 = pbThresholdNm1[i] >> (scaling-1);
- tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
-
- /* copy thresholds to internal memory */
- pbThresholdNm1[i] = pbThreshold[i];
-
-
- if(pbThreshold[i] > tmpThreshold1) {
- pbThreshold[i] = tmpThreshold1;
- }
-
- if(tmpThreshold2 > pbThreshold[i]) {
- pbThreshold[i] = tmpThreshold2;
- }
-
- }
- }
- else {
- scaling = -scaling;
- for(i = 0; i < numPb; i++) {
-
- tmpThreshold1 = pbThresholdNm1[i] << 1;
- tmpThreshold2 = L_mpy_ls(pbThreshold[i], minRemainingThresholdFactor);
-
- /* copy thresholds to internal memory */
- pbThresholdNm1[i] = pbThreshold[i];
-
-
- if(((pbThreshold[i] >> scaling) > tmpThreshold1)) {
- pbThreshold[i] = tmpThreshold1 << scaling;
- }
-
- if(tmpThreshold2 > pbThreshold[i]) {
- pbThreshold[i] = tmpThreshold2;
- }
-
- }
- }
-}
-
diff --git a/media/libstagefright/codecs/aacenc/src/psy_configuration.c b/media/libstagefright/codecs/aacenc/src/psy_configuration.c
deleted file mode 100644
index dd40f9b..0000000
--- a/media/libstagefright/codecs/aacenc/src/psy_configuration.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: psy_configuration.c
-
- Content: Psychoaccoustic configuration functions
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "psy_configuration.h"
-#include "adj_thr.h"
-#include "aac_rom.h"
-
-
-
-#define BARC_SCALE 100 /* integer barc values are scaled with 100 */
-#define LOG2_1000 301 /* log2*1000 */
-#define PI2_1000 1571 /* pi/2*1000*/
-#define ATAN_COEF1 3560 /* 1000/0.280872f*/
-#define ATAN_COEF2 281 /* 1000*0.280872f*/
-
-
-typedef struct{
- Word32 sampleRate;
- const UWord8 *paramLong;
- const UWord8 *paramShort;
-}SFB_INFO_TAB;
-
-static const Word16 ABS_LEV = 20;
-static const Word16 BARC_THR_QUIET[] = {15, 10, 7, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 3, 5, 10, 20, 30};
-
-
-
-static const Word16 max_bark = 24; /* maximum bark-value */
-static const Word16 maskLow = 30; /* in 1dB/bark */
-static const Word16 maskHigh = 15; /* in 1*dB/bark */
-static const Word16 c_ratio = 0x0029; /* pow(10.0f, -(29.0f/10.0f)) */
-
-static const Word16 maskLowSprEnLong = 30; /* in 1dB/bark */
-static const Word16 maskHighSprEnLong = 20; /* in 1dB/bark */
-static const Word16 maskHighSprEnLongLowBr = 15; /* in 1dB/bark */
-static const Word16 maskLowSprEnShort = 20; /* in 1dB/bark */
-static const Word16 maskHighSprEnShort = 15; /* in 1dB/bark */
-static const Word16 c_minRemainingThresholdFactor = 0x0148; /* 0.01 *(1 << 15)*/
-static const Word32 c_maxsnr = 0x66666666; /* upper limit is -1 dB */
-static const Word32 c_minsnr = 0x00624dd3; /* lower limit is -25 dB */
-
-static const Word32 c_maxClipEnergyLong = 0x77359400; /* 2.0e9f*/
-static const Word32 c_maxClipEnergyShort = 0x01dcd650; /* 2.0e9f/(AACENC_TRANS_FAC*AACENC_TRANS_FAC)*/
-
-
-Word32 GetSRIndex(Word32 sampleRate)
-{
- if (92017 <= sampleRate) return 0;
- if (75132 <= sampleRate) return 1;
- if (55426 <= sampleRate) return 2;
- if (46009 <= sampleRate) return 3;
- if (37566 <= sampleRate) return 4;
- if (27713 <= sampleRate) return 5;
- if (23004 <= sampleRate) return 6;
- if (18783 <= sampleRate) return 7;
- if (13856 <= sampleRate) return 8;
- if (11502 <= sampleRate) return 9;
- if (9391 <= sampleRate) return 10;
-
- return 11;
-}
-
-
-/*********************************************************************************
-*
-* function name: atan_1000
-* description: calculates 1000*atan(x/1000)
-* based on atan approx for x > 0
-* atan(x) = x/((float)1.0f+(float)0.280872f*x*x) if x < 1
-* = pi/2 - x/((float)0.280872f +x*x) if x >= 1
-* return: 1000*atan(x/1000)
-*
-**********************************************************************************/
-static Word16 atan_1000(Word32 val)
-{
- Word32 y;
-
-
- if(L_sub(val, 1000) < 0) {
- y = extract_l(((1000 * val) / (1000 + ((val * val) / ATAN_COEF1))));
- }
- else {
- y = PI2_1000 - ((1000 * val) / (ATAN_COEF2 + ((val * val) / 1000)));
- }
-
- return extract_l(y);
-}
-
-
-/*****************************************************************************
-*
-* function name: BarcLineValue
-* description: Calculates barc value for one frequency line
-* returns: barc value of line * BARC_SCALE
-* input: number of lines in transform, index of line to check, Fs
-* output:
-*
-*****************************************************************************/
-static Word16 BarcLineValue(Word16 noOfLines, Word16 fftLine, Word32 samplingFreq)
-{
- Word32 center_freq, temp, bvalFFTLine;
-
- /* center frequency of fft line */
- center_freq = (fftLine * samplingFreq) / (noOfLines << 1);
- temp = atan_1000((center_freq << 2) / (3*10));
- bvalFFTLine =
- (26600 * atan_1000((center_freq*76) / 100) + 7*temp*temp) / (2*1000*1000 / BARC_SCALE);
-
- return saturate(bvalFFTLine);
-}
-
-/*****************************************************************************
-*
-* function name: initThrQuiet
-* description: init thredhold in quiet
-*
-*****************************************************************************/
-static void initThrQuiet(Word16 numPb,
- const Word16 *pbOffset,
- Word16 *pbBarcVal,
- Word32 *pbThresholdQuiet) {
- Word16 i;
- Word16 barcThrQuiet;
-
- for(i=0; i<numPb; i++) {
- Word16 bv1, bv2;
-
-
- if (i>0)
- bv1 = (pbBarcVal[i] + pbBarcVal[i-1]) >> 1;
- else
- bv1 = pbBarcVal[i] >> 1;
-
-
- if (i < (numPb - 1))
- bv2 = (pbBarcVal[i] + pbBarcVal[i+1]) >> 1;
- else {
- bv2 = pbBarcVal[i];
- }
-
- bv1 = min((bv1 / BARC_SCALE), max_bark);
- bv2 = min((bv2 / BARC_SCALE), max_bark);
-
- barcThrQuiet = min(BARC_THR_QUIET[bv1], BARC_THR_QUIET[bv2]);
-
-
- /*
- we calculate
- pow(10.0f,(float)(barcThrQuiet - ABS_LEV)*0.1)*(float)ABS_LOW*(pbOffset[i+1] - pbOffset[i]);
- */
-
- pbThresholdQuiet[i] = pow2_xy((((barcThrQuiet - ABS_LEV) * 100) +
- LOG2_1000*(14+2*LOG_NORM_PCM)), LOG2_1000) * (pbOffset[i+1] - pbOffset[i]);
- }
-}
-
-
-/*****************************************************************************
-*
-* function name: initSpreading
-* description: init energy spreading parameter
-*
-*****************************************************************************/
-static void initSpreading(Word16 numPb,
- Word16 *pbBarcValue,
- Word16 *pbMaskLoFactor,
- Word16 *pbMaskHiFactor,
- Word16 *pbMaskLoFactorSprEn,
- Word16 *pbMaskHiFactorSprEn,
- const Word32 bitrate,
- const Word16 blockType)
-{
- Word16 i;
- Word16 maskLowSprEn, maskHighSprEn;
-
-
- if (sub(blockType, SHORT_WINDOW) != 0) {
- maskLowSprEn = maskLowSprEnLong;
-
- if (bitrate > 22000)
- maskHighSprEn = maskHighSprEnLong;
- else
- maskHighSprEn = maskHighSprEnLongLowBr;
- }
- else {
- maskLowSprEn = maskLowSprEnShort;
- maskHighSprEn = maskHighSprEnShort;
- }
-
- for(i=0; i<numPb; i++) {
-
- if (i > 0) {
- Word32 dbVal;
- Word16 dbark = pbBarcValue[i] - pbBarcValue[i-1];
-
- /*
- we calulate pow(10.0f, -0.1*dbVal/BARC_SCALE)
- */
- dbVal = (maskHigh * dbark);
- pbMaskHiFactor[i] = round16(pow2_xy(L_negate(dbVal), (Word32)LOG2_1000)); /* 0.301 log10(2) */
-
- dbVal = (maskLow * dbark);
- pbMaskLoFactor[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
-
-
- dbVal = (maskHighSprEn * dbark);
- pbMaskHiFactorSprEn[i] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
- dbVal = (maskLowSprEn * dbark);
- pbMaskLoFactorSprEn[i-1] = round16(pow2_xy(L_negate(dbVal),(Word32)LOG2_1000));
- }
- else {
- pbMaskHiFactor[i] = 0;
- pbMaskLoFactor[numPb-1] = 0;
-
- pbMaskHiFactorSprEn[i] = 0;
- pbMaskLoFactorSprEn[numPb-1] = 0;
- }
- }
-
-}
-
-
-/*****************************************************************************
-*
-* function name: initBarcValues
-* description: init bark value
-*
-*****************************************************************************/
-static void initBarcValues(Word16 numPb,
- const Word16 *pbOffset,
- Word16 numLines,
- Word32 samplingFrequency,
- Word16 *pbBval)
-{
- Word16 i;
- Word16 pbBval0, pbBval1;
-
- pbBval0 = 0;
-
- for(i=0; i<numPb; i++){
- pbBval1 = BarcLineValue(numLines, pbOffset[i+1], samplingFrequency);
- pbBval[i] = (pbBval0 + pbBval1) >> 1;
- pbBval0 = pbBval1;
- }
-}
-
-
-/*****************************************************************************
-*
-* function name: initMinSnr
-* description: calculate min snr parameter
-* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)
-*
-*****************************************************************************/
-static void initMinSnr(const Word32 bitrate,
- const Word32 samplerate,
- const Word16 numLines,
- const Word16 *sfbOffset,
- const Word16 *pbBarcVal,
- const Word16 sfbActive,
- Word16 *sfbMinSnr)
-{
- Word16 sfb;
- Word16 barcWidth;
- Word16 pePerWindow;
- Word32 pePart;
- Word32 snr;
- Word16 pbVal0, pbVal1, shift;
-
- /* relative number of active barks */
-
-
- pePerWindow = bits2pe(extract_l((bitrate * numLines) / samplerate));
-
- pbVal0 = 0;
-
- for (sfb=0; sfb<sfbActive; sfb++) {
-
- pbVal1 = (pbBarcVal[sfb] << 1) - pbVal0;
- barcWidth = pbVal1 - pbVal0;
- pbVal0 = pbVal1;
-
- /* allow at least 2.4% of pe for each active barc */
- pePart = ((pePerWindow * 24) * (max_bark * barcWidth)) /
- (pbBarcVal[sfbActive-1] * (sfbOffset[sfb+1] - sfbOffset[sfb]));
-
-
- pePart = min(pePart, 8400);
- pePart = max(pePart, 1400);
-
- /* minSnr(n) = 1/(2^sfbPemin(n)/w(n) - 1.5)*/
- /* we add an offset of 2^16 to the pow functions */
- /* 0xc000 = 1.5*(1 << 15)*/
-
- snr = pow2_xy((pePart - 16*1000),1000) - 0x0000c000;
-
- if(snr > 0x00008000)
- {
- shift = norm_l(snr);
- snr = Div_32(0x00008000 << shift, snr << shift);
- }
- else
- {
- snr = 0x7fffffff;
- }
-
- /* upper limit is -1 dB */
- snr = min(snr, c_maxsnr);
- /* lower limit is -25 dB */
- snr = max(snr, c_minsnr);
- sfbMinSnr[sfb] = round16(snr);
- }
-
-}
-
-/*****************************************************************************
-*
-* function name: InitPsyConfigurationLong
-* description: init long block psychoacoustic configuration
-*
-*****************************************************************************/
-Word16 InitPsyConfigurationLong(Word32 bitrate,
- Word32 samplerate,
- Word16 bandwidth,
- PSY_CONFIGURATION_LONG *psyConf)
-{
- Word32 samplerateindex;
- Word16 sfbBarcVal[MAX_SFB_LONG];
- Word16 sfb;
-
- /*
- init sfb table
- */
- samplerateindex = GetSRIndex(samplerate);
- psyConf->sfbCnt = sfBandTotalLong[samplerateindex];
- psyConf->sfbOffset = sfBandTabLong + sfBandTabLongOffset[samplerateindex];
- psyConf->sampRateIdx = samplerateindex;
-
- /*
- calculate barc values for each pb
- */
- initBarcValues(psyConf->sfbCnt,
- psyConf->sfbOffset,
- psyConf->sfbOffset[psyConf->sfbCnt],
- samplerate,
- sfbBarcVal);
-
- /*
- init thresholds in quiet
- */
- initThrQuiet(psyConf->sfbCnt,
- psyConf->sfbOffset,
- sfbBarcVal,
- psyConf->sfbThresholdQuiet);
-
- /*
- calculate spreading function
- */
- initSpreading(psyConf->sfbCnt,
- sfbBarcVal,
- psyConf->sfbMaskLowFactor,
- psyConf->sfbMaskHighFactor,
- psyConf->sfbMaskLowFactorSprEn,
- psyConf->sfbMaskHighFactorSprEn,
- bitrate,
- LONG_WINDOW);
-
- /*
- init ratio
- */
- psyConf->ratio = c_ratio;
-
- psyConf->maxAllowedIncreaseFactor = 2;
- psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor; /* 0.01 *(1 << 15)*/
-
- psyConf->clipEnergy = c_maxClipEnergyLong;
- psyConf->lowpassLine = extract_l((bandwidth<<1) * FRAME_LEN_LONG / samplerate);
-
- for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
- if (sub(psyConf->sfbOffset[sfb], psyConf->lowpassLine) >= 0)
- break;
- }
- psyConf->sfbActive = sfb;
-
- /*
- calculate minSnr
- */
- initMinSnr(bitrate,
- samplerate,
- psyConf->sfbOffset[psyConf->sfbCnt],
- psyConf->sfbOffset,
- sfbBarcVal,
- psyConf->sfbActive,
- psyConf->sfbMinSnr);
-
-
- return(0);
-}
-
-/*****************************************************************************
-*
-* function name: InitPsyConfigurationShort
-* description: init short block psychoacoustic configuration
-*
-*****************************************************************************/
-Word16 InitPsyConfigurationShort(Word32 bitrate,
- Word32 samplerate,
- Word16 bandwidth,
- PSY_CONFIGURATION_SHORT *psyConf)
-{
- Word32 samplerateindex;
- Word16 sfbBarcVal[MAX_SFB_SHORT];
- Word16 sfb;
- /*
- init sfb table
- */
- samplerateindex = GetSRIndex(samplerate);
- psyConf->sfbCnt = sfBandTotalShort[samplerateindex];
- psyConf->sfbOffset = sfBandTabShort + sfBandTabShortOffset[samplerateindex];
- psyConf->sampRateIdx = samplerateindex;
- /*
- calculate barc values for each pb
- */
- initBarcValues(psyConf->sfbCnt,
- psyConf->sfbOffset,
- psyConf->sfbOffset[psyConf->sfbCnt],
- samplerate,
- sfbBarcVal);
-
- /*
- init thresholds in quiet
- */
- initThrQuiet(psyConf->sfbCnt,
- psyConf->sfbOffset,
- sfbBarcVal,
- psyConf->sfbThresholdQuiet);
-
- /*
- calculate spreading function
- */
- initSpreading(psyConf->sfbCnt,
- sfbBarcVal,
- psyConf->sfbMaskLowFactor,
- psyConf->sfbMaskHighFactor,
- psyConf->sfbMaskLowFactorSprEn,
- psyConf->sfbMaskHighFactorSprEn,
- bitrate,
- SHORT_WINDOW);
-
- /*
- init ratio
- */
- psyConf->ratio = c_ratio;
-
- psyConf->maxAllowedIncreaseFactor = 2;
- psyConf->minRemainingThresholdFactor = c_minRemainingThresholdFactor;
-
- psyConf->clipEnergy = c_maxClipEnergyShort;
-
- psyConf->lowpassLine = extract_l(((bandwidth << 1) * FRAME_LEN_SHORT) / samplerate);
-
- for (sfb = 0; sfb < psyConf->sfbCnt; sfb++) {
-
- if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine)
- break;
- }
- psyConf->sfbActive = sfb;
-
- /*
- calculate minSnr
- */
- initMinSnr(bitrate,
- samplerate,
- psyConf->sfbOffset[psyConf->sfbCnt],
- psyConf->sfbOffset,
- sfbBarcVal,
- psyConf->sfbActive,
- psyConf->sfbMinSnr);
-
- return(0);
-}
-
diff --git a/media/libstagefright/codecs/aacenc/src/psy_main.c b/media/libstagefright/codecs/aacenc/src/psy_main.c
deleted file mode 100644
index 6f0679c..0000000
--- a/media/libstagefright/codecs/aacenc/src/psy_main.c
+++ /dev/null
@@ -1,815 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: psy_main.c
-
- Content: Psychoacoustic major functions
-
-*******************************************************************************/
-
-#include "typedef.h"
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "psy_const.h"
-#include "block_switch.h"
-#include "transform.h"
-#include "spreading.h"
-#include "pre_echo_control.h"
-#include "band_nrg.h"
-#include "psy_configuration.h"
-#include "psy_data.h"
-#include "ms_stereo.h"
-#include "interface.h"
-#include "psy_main.h"
-#include "grp_data.h"
-#include "tns_func.h"
-#include "memalign.h"
-
-#define UNUSED(x) (void)(x)
-
-/* long start short stop */
-static Word16 blockType2windowShape[] = {KBD_WINDOW,SINE_WINDOW,SINE_WINDOW,KBD_WINDOW};
-
-/*
- forward definitions
-*/
-static Word16 advancePsychLong(PSY_DATA* psyData,
- TNS_DATA* tnsData,
- PSY_CONFIGURATION_LONG *hPsyConfLong,
- PSY_OUT_CHANNEL* psyOutChannel,
- Word32 *pScratchTns,
- const TNS_DATA *tnsData2,
- const Word16 ch);
-
-static Word16 advancePsychLongMS (PSY_DATA psyData[MAX_CHANNELS],
- const PSY_CONFIGURATION_LONG *hPsyConfLong);
-
-static Word16 advancePsychShort(PSY_DATA* psyData,
- TNS_DATA* tnsData,
- const PSY_CONFIGURATION_SHORT *hPsyConfShort,
- PSY_OUT_CHANNEL* psyOutChannel,
- Word32 *pScratchTns,
- const TNS_DATA *tnsData2,
- const Word16 ch);
-
-static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS],
- const PSY_CONFIGURATION_SHORT *hPsyConfShort);
-
-
-/*****************************************************************************
-*
-* function name: PsyNew
-* description: allocates memory for psychoacoustic
-* returns: an error code
-* input: pointer to a psych handle
-*
-*****************************************************************************/
-Word16 PsyNew(PSY_KERNEL *hPsy, Word32 nChan, VO_MEM_OPERATOR *pMemOP)
-{
- Word16 i;
- Word32 *mdctSpectrum;
- Word32 *scratchTNS;
- Word16 *mdctDelayBuffer;
-
- mdctSpectrum = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
- if(NULL == mdctSpectrum)
- return 1;
-
- scratchTNS = (Word32 *)mem_malloc(pMemOP, nChan * FRAME_LEN_LONG * sizeof(Word32), 32, VO_INDEX_ENC_AAC);
- if(NULL == scratchTNS)
- {
- return 1;
- }
-
- mdctDelayBuffer = (Word16 *)mem_malloc(pMemOP, nChan * BLOCK_SWITCHING_OFFSET * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
- if(NULL == mdctDelayBuffer)
- {
- return 1;
- }
-
- for (i=0; i<nChan; i++){
- hPsy->psyData[i].mdctDelayBuffer = mdctDelayBuffer + i*BLOCK_SWITCHING_OFFSET;
- hPsy->psyData[i].mdctSpectrum = mdctSpectrum + i*FRAME_LEN_LONG;
- }
-
- hPsy->pScratchTns = scratchTNS;
-
- return 0;
-}
-
-
-/*****************************************************************************
-*
-* function name: PsyDelete
-* description: allocates memory for psychoacoustic
-* returns: an error code
-*
-*****************************************************************************/
-Word16 PsyDelete(PSY_KERNEL *hPsy, VO_MEM_OPERATOR *pMemOP)
-{
- Word32 nch;
-
- if(hPsy)
- {
- if(hPsy->psyData[0].mdctDelayBuffer)
- mem_free(pMemOP, hPsy->psyData[0].mdctDelayBuffer, VO_INDEX_ENC_AAC);
-
- if(hPsy->psyData[0].mdctSpectrum)
- mem_free(pMemOP, hPsy->psyData[0].mdctSpectrum, VO_INDEX_ENC_AAC);
-
- for (nch=0; nch<MAX_CHANNELS; nch++){
- hPsy->psyData[nch].mdctDelayBuffer = NULL;
- hPsy->psyData[nch].mdctSpectrum = NULL;
- }
-
- if(hPsy->pScratchTns)
- {
- mem_free(pMemOP, hPsy->pScratchTns, VO_INDEX_ENC_AAC);
- hPsy->pScratchTns = NULL;
- }
- }
-
- return 0;
-}
-
-
-/*****************************************************************************
-*
-* function name: PsyOutNew
-* description: allocates memory for psyOut struc
-* returns: an error code
-* input: pointer to a psych handle
-*
-*****************************************************************************/
-Word16 PsyOutNew(PSY_OUT *hPsyOut, VO_MEM_OPERATOR *pMemOP)
-{
- pMemOP->Set(VO_INDEX_ENC_AAC, hPsyOut, 0, sizeof(PSY_OUT));
- /*
- alloc some more stuff, tbd
- */
- return 0;
-}
-
-/*****************************************************************************
-*
-* function name: PsyOutDelete
-* description: allocates memory for psychoacoustic
-* returns: an error code
-*
-*****************************************************************************/
-Word16 PsyOutDelete(PSY_OUT *hPsyOut, VO_MEM_OPERATOR *pMemOP)
-{
- UNUSED(hPsyOut);
- UNUSED(pMemOP);
-
- return 0;
-}
-
-
-/*****************************************************************************
-*
-* function name: psyMainInit
-* description: initializes psychoacoustic
-* returns: an error code
-*
-*****************************************************************************/
-
-Word16 psyMainInit(PSY_KERNEL *hPsy,
- Word32 sampleRate,
- Word32 bitRate,
- Word16 channels,
- Word16 tnsMask,
- Word16 bandwidth)
-{
- Word16 ch, err;
- Word32 channelBitRate = bitRate/channels;
-
- err = InitPsyConfigurationLong(channelBitRate,
- sampleRate,
- bandwidth,
- &(hPsy->psyConfLong));
-
- if (!err) {
- hPsy->sampleRateIdx = hPsy->psyConfLong.sampRateIdx;
- err = InitTnsConfigurationLong(bitRate, sampleRate, channels,
- &hPsy->psyConfLong.tnsConf, &hPsy->psyConfLong, tnsMask&2);
- }
-
- if (!err)
- err = InitPsyConfigurationShort(channelBitRate,
- sampleRate,
- bandwidth,
- &hPsy->psyConfShort);
- if (!err) {
- err = InitTnsConfigurationShort(bitRate, sampleRate, channels,
- &hPsy->psyConfShort.tnsConf, &hPsy->psyConfShort, tnsMask&1);
- }
-
- if (!err)
- for(ch=0;ch < channels;ch++){
-
- InitBlockSwitching(&hPsy->psyData[ch].blockSwitchingControl,
- bitRate, channels);
-
- InitPreEchoControl(hPsy->psyData[ch].sfbThresholdnm1,
- hPsy->psyConfLong.sfbCnt,
- hPsy->psyConfLong.sfbThresholdQuiet);
- hPsy->psyData[ch].mdctScalenm1 = 0;
- }
-
- return(err);
-}
-
-/*****************************************************************************
-*
-* function name: psyMain
-* description: psychoacoustic main function
-* returns: an error code
-*
-* This function assumes that enough input data is in the modulo buffer.
-*
-*****************************************************************************/
-
-Word16 psyMain(Word16 nChannels,
- ELEMENT_INFO *elemInfo,
- Word16 *timeSignal,
- PSY_DATA psyData[MAX_CHANNELS],
- TNS_DATA tnsData[MAX_CHANNELS],
- PSY_CONFIGURATION_LONG *hPsyConfLong,
- PSY_CONFIGURATION_SHORT *hPsyConfShort,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT *psyOutElement,
- Word32 *pScratchTns,
- Word32 sampleRate)
-{
- Word16 maxSfbPerGroup[MAX_CHANNELS];
- Word16 mdctScalingArray[MAX_CHANNELS];
-
- Word16 ch; /* counts through channels */
- Word16 sfb; /* counts through scalefactor bands */
- Word16 line; /* counts through lines */
- Word16 channels;
- Word16 maxScale;
-
- channels = elemInfo->nChannelsInEl;
- maxScale = 0;
-
- /* block switching */
- for(ch = 0; ch < channels; ch++) {
- BlockSwitching(&psyData[ch].blockSwitchingControl,
- timeSignal+elemInfo->ChannelIndex[ch],
- sampleRate,
- nChannels);
- }
-
- /* synch left and right block type */
- SyncBlockSwitching(&psyData[0].blockSwitchingControl,
- &psyData[1].blockSwitchingControl,
- channels);
-
- /* transform
- and get maxScale (max mdctScaling) for all channels */
- for(ch=0; ch<channels; ch++) {
- Transform_Real(psyData[ch].mdctDelayBuffer,
- timeSignal+elemInfo->ChannelIndex[ch],
- nChannels,
- psyData[ch].mdctSpectrum,
- &(mdctScalingArray[ch]),
- psyData[ch].blockSwitchingControl.windowSequence);
- maxScale = max(maxScale, mdctScalingArray[ch]);
- }
-
- /* common scaling for all channels */
- for (ch=0; ch<channels; ch++) {
- Word16 scaleDiff = maxScale - mdctScalingArray[ch];
-
- if (scaleDiff > 0) {
- Word32 *Spectrum = psyData[ch].mdctSpectrum;
- for(line=0; line<FRAME_LEN_LONG; line++) {
- *Spectrum = (*Spectrum) >> scaleDiff;
- Spectrum++;
- }
- }
- psyData[ch].mdctScale = maxScale;
- }
-
- for (ch=0; ch<channels; ch++) {
-
- if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW) {
- /* update long block parameter */
- advancePsychLong(&psyData[ch],
- &tnsData[ch],
- hPsyConfLong,
- &psyOutChannel[ch],
- pScratchTns,
- &tnsData[1 - ch],
- ch);
-
- /* determine maxSfb */
- for (sfb=hPsyConfLong->sfbCnt-1; sfb>=0; sfb--) {
- for (line=hPsyConfLong->sfbOffset[sfb+1] - 1; line>=hPsyConfLong->sfbOffset[sfb]; line--) {
-
- if (psyData[ch].mdctSpectrum[line] != 0) break;
- }
- if (line >= hPsyConfLong->sfbOffset[sfb]) break;
- }
- maxSfbPerGroup[ch] = sfb + 1;
-
- /* Calc bandwise energies for mid and side channel
- Do it only if 2 channels exist */
-
- if (ch == 1)
- advancePsychLongMS(psyData, hPsyConfLong);
- }
- else {
- advancePsychShort(&psyData[ch],
- &tnsData[ch],
- hPsyConfShort,
- &psyOutChannel[ch],
- pScratchTns,
- &tnsData[1 - ch],
- ch);
-
- /* Calc bandwise energies for mid and side channel
- Do it only if 2 channels exist */
-
- if (ch == 1)
- advancePsychShortMS (psyData, hPsyConfShort);
- }
- }
-
- /* group short data */
- for(ch=0; ch<channels; ch++) {
-
- if (psyData[ch].blockSwitchingControl.windowSequence == SHORT_WINDOW) {
- groupShortData(psyData[ch].mdctSpectrum,
- pScratchTns,
- &psyData[ch].sfbThreshold,
- &psyData[ch].sfbEnergy,
- &psyData[ch].sfbEnergyMS,
- &psyData[ch].sfbSpreadedEnergy,
- hPsyConfShort->sfbCnt,
- hPsyConfShort->sfbOffset,
- hPsyConfShort->sfbMinSnr,
- psyOutElement->groupedSfbOffset[ch],
- &maxSfbPerGroup[ch],
- psyOutElement->groupedSfbMinSnr[ch],
- psyData[ch].blockSwitchingControl.noOfGroups,
- psyData[ch].blockSwitchingControl.groupLen);
- }
- }
-
-
-#if (MAX_CHANNELS>1)
- /*
- stereo Processing
- */
- if (channels == 2) {
- psyOutElement->toolsInfo.msDigest = MS_NONE;
- maxSfbPerGroup[0] = maxSfbPerGroup[1] = max(maxSfbPerGroup[0], maxSfbPerGroup[1]);
-
-
- if (psyData[0].blockSwitchingControl.windowSequence != SHORT_WINDOW)
- MsStereoProcessing(psyData[0].sfbEnergy.sfbLong,
- psyData[1].sfbEnergy.sfbLong,
- psyData[0].sfbEnergyMS.sfbLong,
- psyData[1].sfbEnergyMS.sfbLong,
- psyData[0].mdctSpectrum,
- psyData[1].mdctSpectrum,
- psyData[0].sfbThreshold.sfbLong,
- psyData[1].sfbThreshold.sfbLong,
- psyData[0].sfbSpreadedEnergy.sfbLong,
- psyData[1].sfbSpreadedEnergy.sfbLong,
- (Word16*)&psyOutElement->toolsInfo.msDigest,
- (Word16*)psyOutElement->toolsInfo.msMask,
- hPsyConfLong->sfbCnt,
- hPsyConfLong->sfbCnt,
- maxSfbPerGroup[0],
- (const Word16*)hPsyConfLong->sfbOffset);
- else
- MsStereoProcessing(psyData[0].sfbEnergy.sfbLong,
- psyData[1].sfbEnergy.sfbLong,
- psyData[0].sfbEnergyMS.sfbLong,
- psyData[1].sfbEnergyMS.sfbLong,
- psyData[0].mdctSpectrum,
- psyData[1].mdctSpectrum,
- psyData[0].sfbThreshold.sfbLong,
- psyData[1].sfbThreshold.sfbLong,
- psyData[0].sfbSpreadedEnergy.sfbLong,
- psyData[1].sfbSpreadedEnergy.sfbLong,
- (Word16*)&psyOutElement->toolsInfo.msDigest,
- (Word16*)psyOutElement->toolsInfo.msMask,
- psyData[0].blockSwitchingControl.noOfGroups*hPsyConfShort->sfbCnt,
- hPsyConfShort->sfbCnt,
- maxSfbPerGroup[0],
- (const Word16*)psyOutElement->groupedSfbOffset[0]);
- }
-
-#endif /* (MAX_CHANNELS>1) */
-
- /*
- build output
- */
- for(ch=0;ch<channels;ch++) {
-
- if (psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW)
- BuildInterface(psyData[ch].mdctSpectrum,
- psyData[ch].mdctScale,
- &psyData[ch].sfbThreshold,
- &psyData[ch].sfbEnergy,
- &psyData[ch].sfbSpreadedEnergy,
- psyData[ch].sfbEnergySum,
- psyData[ch].sfbEnergySumMS,
- psyData[ch].blockSwitchingControl.windowSequence,
- blockType2windowShape[psyData[ch].blockSwitchingControl.windowSequence],
- hPsyConfLong->sfbCnt,
- hPsyConfLong->sfbOffset,
- maxSfbPerGroup[ch],
- hPsyConfLong->sfbMinSnr,
- psyData[ch].blockSwitchingControl.noOfGroups,
- psyData[ch].blockSwitchingControl.groupLen,
- &psyOutChannel[ch]);
- else
- BuildInterface(psyData[ch].mdctSpectrum,
- psyData[ch].mdctScale,
- &psyData[ch].sfbThreshold,
- &psyData[ch].sfbEnergy,
- &psyData[ch].sfbSpreadedEnergy,
- psyData[ch].sfbEnergySum,
- psyData[ch].sfbEnergySumMS,
- SHORT_WINDOW,
- SINE_WINDOW,
- psyData[0].blockSwitchingControl.noOfGroups*hPsyConfShort->sfbCnt,
- psyOutElement->groupedSfbOffset[ch],
- maxSfbPerGroup[ch],
- psyOutElement->groupedSfbMinSnr[ch],
- psyData[ch].blockSwitchingControl.noOfGroups,
- psyData[ch].blockSwitchingControl.groupLen,
- &psyOutChannel[ch]);
- }
-
- return(0); /* no error */
-}
-
-/*****************************************************************************
-*
-* function name: advancePsychLong
-* description: psychoacoustic for long blocks
-*
-*****************************************************************************/
-
-static Word16 advancePsychLong(PSY_DATA* psyData,
- TNS_DATA* tnsData,
- PSY_CONFIGURATION_LONG *hPsyConfLong,
- PSY_OUT_CHANNEL* psyOutChannel,
- Word32 *pScratchTns,
- const TNS_DATA* tnsData2,
- const Word16 ch)
-{
- Word32 i;
- Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
- Word32 clipEnergy = hPsyConfLong->clipEnergy >> normEnergyShift;
- Word32 *data0, *data1, tdata;
-
- /* low pass */
- data0 = psyData->mdctSpectrum + hPsyConfLong->lowpassLine;
- for(i=hPsyConfLong->lowpassLine; i<FRAME_LEN_LONG; i++) {
- *data0++ = 0;
- }
-
- /* Calc sfb-bandwise mdct-energies for left and right channel */
- CalcBandEnergy( psyData->mdctSpectrum,
- hPsyConfLong->sfbOffset,
- hPsyConfLong->sfbActive,
- psyData->sfbEnergy.sfbLong,
- &psyData->sfbEnergySum.sfbLong);
-
- /*
- TNS detect
- */
- TnsDetect(tnsData,
- hPsyConfLong->tnsConf,
- pScratchTns,
- (const Word16*)hPsyConfLong->sfbOffset,
- psyData->mdctSpectrum,
- 0,
- psyData->blockSwitchingControl.windowSequence,
- psyData->sfbEnergy.sfbLong);
-
- /* TnsSync */
- if (ch == 1) {
- TnsSync(tnsData,
- tnsData2,
- hPsyConfLong->tnsConf,
- 0,
- psyData->blockSwitchingControl.windowSequence);
- }
-
- /* Tns Encoder */
- TnsEncode(&psyOutChannel->tnsInfo,
- tnsData,
- hPsyConfLong->sfbCnt,
- hPsyConfLong->tnsConf,
- hPsyConfLong->lowpassLine,
- psyData->mdctSpectrum,
- 0,
- psyData->blockSwitchingControl.windowSequence);
-
- /* first part of threshold calculation */
- data0 = psyData->sfbEnergy.sfbLong;
- data1 = psyData->sfbThreshold.sfbLong;
- for (i=hPsyConfLong->sfbCnt; i; i--) {
- tdata = L_mpy_ls(*data0++, hPsyConfLong->ratio);
- *data1++ = min(tdata, clipEnergy);
- }
-
- /* Calc sfb-bandwise mdct-energies for left and right channel again */
- if (tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive!=0) {
- Word16 tnsStartBand = hPsyConfLong->tnsConf.tnsStartBand;
- CalcBandEnergy( psyData->mdctSpectrum,
- hPsyConfLong->sfbOffset+tnsStartBand,
- hPsyConfLong->sfbActive - tnsStartBand,
- psyData->sfbEnergy.sfbLong+tnsStartBand,
- &psyData->sfbEnergySum.sfbLong);
-
- data0 = psyData->sfbEnergy.sfbLong;
- tdata = psyData->sfbEnergySum.sfbLong;
- for (i=0; i<tnsStartBand; i++)
- tdata += *data0++;
-
- psyData->sfbEnergySum.sfbLong = tdata;
- }
-
-
- /* spreading energy */
- SpreadingMax(hPsyConfLong->sfbCnt,
- hPsyConfLong->sfbMaskLowFactor,
- hPsyConfLong->sfbMaskHighFactor,
- psyData->sfbThreshold.sfbLong);
-
- /* threshold in quiet */
- data0 = psyData->sfbThreshold.sfbLong;
- data1 = hPsyConfLong->sfbThresholdQuiet;
- for (i=hPsyConfLong->sfbCnt; i; i--)
- {
- *data0 = max(*data0, (*data1 >> normEnergyShift));
- data0++; data1++;
- }
-
- /* preecho control */
- if (psyData->blockSwitchingControl.windowSequence == STOP_WINDOW) {
- data0 = psyData->sfbThresholdnm1;
- for (i=hPsyConfLong->sfbCnt; i; i--) {
- *data0++ = MAX_32;
- }
- psyData->mdctScalenm1 = 0;
- }
-
- PreEchoControl( psyData->sfbThresholdnm1,
- hPsyConfLong->sfbCnt,
- hPsyConfLong->maxAllowedIncreaseFactor,
- hPsyConfLong->minRemainingThresholdFactor,
- psyData->sfbThreshold.sfbLong,
- psyData->mdctScale,
- psyData->mdctScalenm1);
- psyData->mdctScalenm1 = psyData->mdctScale;
-
-
- if (psyData->blockSwitchingControl.windowSequence== START_WINDOW) {
- data0 = psyData->sfbThresholdnm1;
- for (i=hPsyConfLong->sfbCnt; i; i--) {
- *data0++ = MAX_32;
- }
- psyData->mdctScalenm1 = 0;
- }
-
- /* apply tns mult table on cb thresholds */
- ApplyTnsMultTableToRatios(hPsyConfLong->tnsConf.tnsRatioPatchLowestCb,
- hPsyConfLong->tnsConf.tnsStartBand,
- tnsData->dataRaw.tnsLong.subBlockInfo,
- psyData->sfbThreshold.sfbLong);
-
-
- /* spreaded energy */
- data0 = psyData->sfbSpreadedEnergy.sfbLong;
- data1 = psyData->sfbEnergy.sfbLong;
- for (i=hPsyConfLong->sfbCnt; i; i--) {
- //psyData->sfbSpreadedEnergy.sfbLong[i] = psyData->sfbEnergy.sfbLong[i];
- *data0++ = *data1++;
- }
-
- /* spreading energy */
- SpreadingMax(hPsyConfLong->sfbCnt,
- hPsyConfLong->sfbMaskLowFactorSprEn,
- hPsyConfLong->sfbMaskHighFactorSprEn,
- psyData->sfbSpreadedEnergy.sfbLong);
-
- return 0;
-}
-
-/*****************************************************************************
-*
-* function name: advancePsychLongMS
-* description: update mdct-energies for left add or minus right channel
-* for long block
-*
-*****************************************************************************/
-static Word16 advancePsychLongMS (PSY_DATA psyData[MAX_CHANNELS],
- const PSY_CONFIGURATION_LONG *hPsyConfLong)
-{
- CalcBandEnergyMS(psyData[0].mdctSpectrum,
- psyData[1].mdctSpectrum,
- hPsyConfLong->sfbOffset,
- hPsyConfLong->sfbActive,
- psyData[0].sfbEnergyMS.sfbLong,
- &psyData[0].sfbEnergySumMS.sfbLong,
- psyData[1].sfbEnergyMS.sfbLong,
- &psyData[1].sfbEnergySumMS.sfbLong);
-
- return 0;
-}
-
-
-/*****************************************************************************
-*
-* function name: advancePsychShort
-* description: psychoacoustic for short blocks
-*
-*****************************************************************************/
-
-static Word16 advancePsychShort(PSY_DATA* psyData,
- TNS_DATA* tnsData,
- const PSY_CONFIGURATION_SHORT *hPsyConfShort,
- PSY_OUT_CHANNEL* psyOutChannel,
- Word32 *pScratchTns,
- const TNS_DATA *tnsData2,
- const Word16 ch)
-{
- Word32 w;
- Word32 normEnergyShift = (psyData->mdctScale + 1) << 1; /* in reference code, mdct spectrum must be multipied with 2, so +1 */
- Word32 clipEnergy = hPsyConfShort->clipEnergy >> normEnergyShift;
- Word32 wOffset = 0;
- Word32 *data0;
- const Word32 *data1;
-
- for(w = 0; w < TRANS_FAC; w++) {
- Word32 i, tdata;
-
- /* low pass */
- data0 = psyData->mdctSpectrum + wOffset + hPsyConfShort->lowpassLine;
- for(i=hPsyConfShort->lowpassLine; i<FRAME_LEN_SHORT; i++){
- *data0++ = 0;
- }
-
- /* Calc sfb-bandwise mdct-energies for left and right channel */
- CalcBandEnergy( psyData->mdctSpectrum+wOffset,
- hPsyConfShort->sfbOffset,
- hPsyConfShort->sfbActive,
- psyData->sfbEnergy.sfbShort[w],
- &psyData->sfbEnergySum.sfbShort[w]);
- /*
- TNS
- */
- TnsDetect(tnsData,
- hPsyConfShort->tnsConf,
- pScratchTns,
- (const Word16*)hPsyConfShort->sfbOffset,
- psyData->mdctSpectrum+wOffset,
- w,
- psyData->blockSwitchingControl.windowSequence,
- psyData->sfbEnergy.sfbShort[w]);
-
- /* TnsSync */
- if (ch == 1) {
- TnsSync(tnsData,
- tnsData2,
- hPsyConfShort->tnsConf,
- w,
- psyData->blockSwitchingControl.windowSequence);
- }
-
- TnsEncode(&psyOutChannel->tnsInfo,
- tnsData,
- hPsyConfShort->sfbCnt,
- hPsyConfShort->tnsConf,
- hPsyConfShort->lowpassLine,
- psyData->mdctSpectrum+wOffset,
- w,
- psyData->blockSwitchingControl.windowSequence);
-
- /* first part of threshold calculation */
- data0 = psyData->sfbThreshold.sfbShort[w];
- data1 = psyData->sfbEnergy.sfbShort[w];
- for (i=hPsyConfShort->sfbCnt; i; i--) {
- tdata = L_mpy_ls(*data1++, hPsyConfShort->ratio);
- *data0++ = min(tdata, clipEnergy);
- }
-
- /* Calc sfb-bandwise mdct-energies for left and right channel again */
- if (tnsData->dataRaw.tnsShort.subBlockInfo[w].tnsActive != 0) {
- Word16 tnsStartBand = hPsyConfShort->tnsConf.tnsStartBand;
- CalcBandEnergy( psyData->mdctSpectrum+wOffset,
- hPsyConfShort->sfbOffset+tnsStartBand,
- (hPsyConfShort->sfbActive - tnsStartBand),
- psyData->sfbEnergy.sfbShort[w]+tnsStartBand,
- &psyData->sfbEnergySum.sfbShort[w]);
-
- tdata = psyData->sfbEnergySum.sfbShort[w];
- data0 = psyData->sfbEnergy.sfbShort[w];
- for (i=tnsStartBand; i; i--)
- tdata += *data0++;
-
- psyData->sfbEnergySum.sfbShort[w] = tdata;
- }
-
- /* spreading */
- SpreadingMax(hPsyConfShort->sfbCnt,
- hPsyConfShort->sfbMaskLowFactor,
- hPsyConfShort->sfbMaskHighFactor,
- psyData->sfbThreshold.sfbShort[w]);
-
-
- /* threshold in quiet */
- data0 = psyData->sfbThreshold.sfbShort[w];
- data1 = hPsyConfShort->sfbThresholdQuiet;
- for (i=hPsyConfShort->sfbCnt; i; i--)
- {
- *data0 = max(*data0, (*data1 >> normEnergyShift));
-
- data0++; data1++;
- }
-
-
- /* preecho */
- PreEchoControl( psyData->sfbThresholdnm1,
- hPsyConfShort->sfbCnt,
- hPsyConfShort->maxAllowedIncreaseFactor,
- hPsyConfShort->minRemainingThresholdFactor,
- psyData->sfbThreshold.sfbShort[w],
- psyData->mdctScale,
- w==0 ? psyData->mdctScalenm1 : psyData->mdctScale);
-
- /* apply tns mult table on cb thresholds */
- ApplyTnsMultTableToRatios( hPsyConfShort->tnsConf.tnsRatioPatchLowestCb,
- hPsyConfShort->tnsConf.tnsStartBand,
- tnsData->dataRaw.tnsShort.subBlockInfo[w],
- psyData->sfbThreshold.sfbShort[w]);
-
- /* spreaded energy */
- data0 = psyData->sfbSpreadedEnergy.sfbShort[w];
- data1 = psyData->sfbEnergy.sfbShort[w];
- for (i=hPsyConfShort->sfbCnt; i; i--) {
- *data0++ = *data1++;
- }
- SpreadingMax(hPsyConfShort->sfbCnt,
- hPsyConfShort->sfbMaskLowFactorSprEn,
- hPsyConfShort->sfbMaskHighFactorSprEn,
- psyData->sfbSpreadedEnergy.sfbShort[w]);
-
- wOffset += FRAME_LEN_SHORT;
- } /* for TRANS_FAC */
-
- psyData->mdctScalenm1 = psyData->mdctScale;
-
- return 0;
-}
-
-/*****************************************************************************
-*
-* function name: advancePsychShortMS
-* description: update mdct-energies for left add or minus right channel
-* for short block
-*
-*****************************************************************************/
-static Word16 advancePsychShortMS (PSY_DATA psyData[MAX_CHANNELS],
- const PSY_CONFIGURATION_SHORT *hPsyConfShort)
-{
- Word32 w, wOffset;
- wOffset = 0;
- for(w=0; w<TRANS_FAC; w++) {
- CalcBandEnergyMS(psyData[0].mdctSpectrum+wOffset,
- psyData[1].mdctSpectrum+wOffset,
- hPsyConfShort->sfbOffset,
- hPsyConfShort->sfbActive,
- psyData[0].sfbEnergyMS.sfbShort[w],
- &psyData[0].sfbEnergySumMS.sfbShort[w],
- psyData[1].sfbEnergyMS.sfbShort[w],
- &psyData[1].sfbEnergySumMS.sfbShort[w]);
- wOffset += FRAME_LEN_SHORT;
- }
-
- return 0;
-}
diff --git a/media/libstagefright/codecs/aacenc/src/qc_main.c b/media/libstagefright/codecs/aacenc/src/qc_main.c
deleted file mode 100644
index e5d78aa..0000000
--- a/media/libstagefright/codecs/aacenc/src/qc_main.c
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: qc_main.c
-
- Content: Quantizing & coding functions
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "qc_main.h"
-#include "quantize.h"
-#include "interface.h"
-#include "adj_thr.h"
-#include "sf_estim.h"
-#include "stat_bits.h"
-#include "bit_cnt.h"
-#include "dyn_bits.h"
-#include "channel_map.h"
-#include "memalign.h"
-
-#define UNUSED(x) (void)(x)
-
-typedef enum{
- FRAME_LEN_BYTES_MODULO = 1,
- FRAME_LEN_BYTES_INT = 2
-}FRAME_LEN_RESULT_MODE;
-
-static const Word16 maxFillElemBits = 7 + 270*8;
-
-/* forward declarations */
-
-static Word16 calcMaxValueInSfb(Word16 sfbCnt,
- Word16 maxSfbPerGroup,
- Word16 sfbPerGroup,
- Word16 sfbOffset[MAX_GROUPED_SFB],
- Word16 quantSpectrum[FRAME_LEN_LONG],
- UWord16 maxValue[MAX_GROUPED_SFB]);
-
-
-/*****************************************************************************
-*
-* function name: calcFrameLen
-* description: estimate the frame length according the bitrates
-*
-*****************************************************************************/
-static Word16 calcFrameLen(Word32 bitRate,
- Word32 sampleRate,
- FRAME_LEN_RESULT_MODE mode)
-{
-
- Word32 result;
- Word32 quot;
-
- result = (FRAME_LEN_LONG >> 3) * bitRate;
- quot = result / sampleRate;
-
-
- if (mode == FRAME_LEN_BYTES_MODULO) {
- result -= quot * sampleRate;
- }
- else { /* FRAME_LEN_BYTES_INT */
- result = quot;
- }
-
- return result;
-}
-
-/*****************************************************************************
-*
-* function name:framePadding
-* description: Calculates if padding is needed for actual frame
-* returns: paddingOn or not
-*
-*****************************************************************************/
-static Word16 framePadding(Word32 bitRate,
- Word32 sampleRate,
- Word32 *paddingRest)
-{
- Word16 paddingOn;
- Word16 difference;
-
- paddingOn = 0;
-
- difference = calcFrameLen( bitRate,
- sampleRate,
- FRAME_LEN_BYTES_MODULO );
- *paddingRest = *paddingRest - difference;
-
-
- if (*paddingRest <= 0 ) {
- paddingOn = 1;
- *paddingRest = *paddingRest + sampleRate;
- }
-
- return paddingOn;
-}
-
-
-/*********************************************************************************
-*
-* function name: QCOutNew
-* description: init qcout parameter
-* returns: 0 if success
-*
-**********************************************************************************/
-
-Word16 QCOutNew(QC_OUT *hQC, Word16 nChannels, VO_MEM_OPERATOR *pMemOP)
-{
- Word32 i;
- Word16 *quantSpec;
- Word16 *scf;
- UWord16 *maxValueInSfb;
-
- quantSpec = (Word16 *)mem_malloc(pMemOP, nChannels * FRAME_LEN_LONG * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
- if(NULL == quantSpec)
- return 1;
- scf = (Word16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(Word16), 32, VO_INDEX_ENC_AAC);
- if(NULL == scf)
- {
- return 1;
- }
- maxValueInSfb = (UWord16 *)mem_malloc(pMemOP, nChannels * MAX_GROUPED_SFB * sizeof(UWord16), 32, VO_INDEX_ENC_AAC);
- if(NULL == maxValueInSfb)
- {
- return 1;
- }
-
- for (i=0; i<nChannels; i++) {
- hQC->qcChannel[i].quantSpec = quantSpec + i*FRAME_LEN_LONG;
-
- hQC->qcChannel[i].maxValueInSfb = maxValueInSfb + i*MAX_GROUPED_SFB;
-
- hQC->qcChannel[i].scf = scf + i*MAX_GROUPED_SFB;
- }
-
- return 0;
-}
-
-
-/*********************************************************************************
-*
-* function name: QCOutDelete
-* description: unint qcout parameter
-* returns: 0 if success
-*
-**********************************************************************************/
-void QCOutDelete(QC_OUT* hQC, VO_MEM_OPERATOR *pMemOP)
-{
- Word32 i;
- if(hQC)
- {
- if(hQC->qcChannel[0].quantSpec)
- mem_free(pMemOP, hQC->qcChannel[0].quantSpec, VO_INDEX_ENC_AAC);
-
- if(hQC->qcChannel[0].maxValueInSfb)
- mem_free(pMemOP, hQC->qcChannel[0].maxValueInSfb, VO_INDEX_ENC_AAC);
-
- if(hQC->qcChannel[0].scf)
- mem_free(pMemOP, hQC->qcChannel[0].scf, VO_INDEX_ENC_AAC);
-
- for (i=0; i<MAX_CHANNELS; i++) {
- hQC->qcChannel[i].quantSpec = NULL;
-
- hQC->qcChannel[i].maxValueInSfb = NULL;
-
- hQC->qcChannel[i].scf = NULL;
- }
- }
-}
-
-/*********************************************************************************
-*
-* function name: QCNew
-* description: set QC to zero
-* returns: 0 if success
-*
-**********************************************************************************/
-Word16 QCNew(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
-{
- pMemOP->Set(VO_INDEX_ENC_AAC, hQC,0,sizeof(QC_STATE));
-
- return (0);
-}
-
-/*********************************************************************************
-*
-* function name: QCDelete
-* description: unint qcout parameter
-*
-**********************************************************************************/
-void QCDelete(QC_STATE *hQC, VO_MEM_OPERATOR *pMemOP)
-{
- UNUSED(hQC);
- UNUSED(pMemOP);
-}
-
-/*********************************************************************************
-*
-* function name: QCInit
-* description: init QD parameter
-* returns: 0 if success
-*
-**********************************************************************************/
-Word16 QCInit(QC_STATE *hQC,
- struct QC_INIT *init)
-{
- hQC->nChannels = init->elInfo->nChannelsInEl;
- hQC->maxBitsTot = init->maxBits;
- hQC->bitResTot = sub(init->bitRes, init->averageBits);
- hQC->averageBitsTot = init->averageBits;
- hQC->maxBitFac = init->maxBitFac;
-
- hQC->padding.paddingRest = init->padding.paddingRest;
-
- hQC->globStatBits = 3; /* for ID_END */
-
- /* channel elements init */
- InitElementBits(&hQC->elementBits,
- *init->elInfo,
- init->bitrate,
- init->averageBits,
- hQC->globStatBits);
-
- /* threshold parameter init */
- AdjThrInit(&hQC->adjThr,
- init->meanPe,
- hQC->elementBits.chBitrate);
-
- return 0;
-}
-
-
-/*********************************************************************************
-*
-* function name: QCMain
-* description: quantization and coding the spectrum
-* returns: 0 if success
-*
-**********************************************************************************/
-Word16 QCMain(QC_STATE* hQC,
- ELEMENT_BITS* elBits,
- ATS_ELEMENT* adjThrStateElement,
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS], /* may be modified in-place */
- PSY_OUT_ELEMENT* psyOutElement,
- QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS], /* out */
- QC_OUT_ELEMENT* qcOutElement,
- Word16 nChannels,
- Word16 ancillaryDataBytes)
-{
- Word16 maxChDynBits[MAX_CHANNELS];
- Word16 chBitDistribution[MAX_CHANNELS];
- Word32 ch;
-
- if (elBits->bitResLevel < 0) {
- return -1;
- }
-
- if (elBits->bitResLevel > elBits->maxBitResBits) {
- return -1;
- }
-
- qcOutElement->staticBitsUsed = countStaticBitdemand(psyOutChannel,
- psyOutElement,
- nChannels,
- qcOutElement->adtsUsed);
-
-
- if (ancillaryDataBytes) {
- qcOutElement->ancBitsUsed = 7 + (ancillaryDataBytes << 3);
-
- if (ancillaryDataBytes >= 15)
- qcOutElement->ancBitsUsed = qcOutElement->ancBitsUsed + 8;
- }
- else {
- qcOutElement->ancBitsUsed = 0;
- }
-
- CalcFormFactor(hQC->logSfbFormFactor, hQC->sfbNRelevantLines, hQC->logSfbEnergy, psyOutChannel, nChannels);
-
- /*adjust thresholds for the desired bitrate */
- AdjustThresholds(&hQC->adjThr,
- adjThrStateElement,
- psyOutChannel,
- psyOutElement,
- chBitDistribution,
- hQC->logSfbEnergy,
- hQC->sfbNRelevantLines,
- qcOutElement,
- elBits,
- nChannels,
- hQC->maxBitFac);
-
- /*estimate scale factors */
- EstimateScaleFactors(psyOutChannel,
- qcOutChannel,
- hQC->logSfbEnergy,
- hQC->logSfbFormFactor,
- hQC->sfbNRelevantLines,
- nChannels);
-
- /* condition to prevent empty bitreservoir */
- for (ch = 0; ch < nChannels; ch++) {
- Word32 maxDynBits;
- maxDynBits = elBits->averageBits + elBits->bitResLevel - 7; /* -7 bec. of align bits */
- maxDynBits = maxDynBits - qcOutElement->staticBitsUsed + qcOutElement->ancBitsUsed;
- maxChDynBits[ch] = extract_l(chBitDistribution[ch] * maxDynBits / 1000);
- }
-
- qcOutElement->dynBitsUsed = 0;
- for (ch = 0; ch < nChannels; ch++) {
- Word32 chDynBits;
- Flag constraintsFulfilled;
- Word32 iter;
- iter = 0;
- do {
- constraintsFulfilled = 1;
-
- QuantizeSpectrum(psyOutChannel[ch].sfbCnt,
- psyOutChannel[ch].maxSfbPerGroup,
- psyOutChannel[ch].sfbPerGroup,
- psyOutChannel[ch].sfbOffsets,
- psyOutChannel[ch].mdctSpectrum,
- qcOutChannel[ch].globalGain,
- qcOutChannel[ch].scf,
- qcOutChannel[ch].quantSpec);
-
- if (calcMaxValueInSfb(psyOutChannel[ch].sfbCnt,
- psyOutChannel[ch].maxSfbPerGroup,
- psyOutChannel[ch].sfbPerGroup,
- psyOutChannel[ch].sfbOffsets,
- qcOutChannel[ch].quantSpec,
- qcOutChannel[ch].maxValueInSfb) > MAX_QUANT) {
- constraintsFulfilled = 0;
- }
-
- chDynBits = dynBitCount(qcOutChannel[ch].quantSpec,
- qcOutChannel[ch].maxValueInSfb,
- qcOutChannel[ch].scf,
- psyOutChannel[ch].windowSequence,
- psyOutChannel[ch].sfbCnt,
- psyOutChannel[ch].maxSfbPerGroup,
- psyOutChannel[ch].sfbPerGroup,
- psyOutChannel[ch].sfbOffsets,
- &qcOutChannel[ch].sectionData);
-
- if (chDynBits >= maxChDynBits[ch]) {
- constraintsFulfilled = 0;
- }
-
- if (!constraintsFulfilled) {
- qcOutChannel[ch].globalGain = qcOutChannel[ch].globalGain + 1;
- }
-
- iter = iter + 1;
-
- } while(!constraintsFulfilled);
-
- qcOutElement->dynBitsUsed = qcOutElement->dynBitsUsed + chDynBits;
-
- qcOutChannel[ch].mdctScale = psyOutChannel[ch].mdctScale;
- qcOutChannel[ch].groupingMask = psyOutChannel[ch].groupingMask;
- qcOutChannel[ch].windowShape = psyOutChannel[ch].windowShape;
- }
-
- /* save dynBitsUsed for correction of bits2pe relation */
- AdjThrUpdate(adjThrStateElement, qcOutElement->dynBitsUsed);
-
- {
- Word16 bitResSpace = elBits->maxBitResBits - elBits->bitResLevel;
- Word16 deltaBitRes = elBits->averageBits -
- (qcOutElement->staticBitsUsed +
- qcOutElement->dynBitsUsed + qcOutElement->ancBitsUsed);
-
- qcOutElement->fillBits = max(0, (deltaBitRes - bitResSpace));
- }
-
- return 0; /* OK */
-}
-
-
-/*********************************************************************************
-*
-* function name: calcMaxValueInSfb
-* description: search the max Spectrum in one sfb
-*
-**********************************************************************************/
-static Word16 calcMaxValueInSfb(Word16 sfbCnt,
- Word16 maxSfbPerGroup,
- Word16 sfbPerGroup,
- Word16 sfbOffset[MAX_GROUPED_SFB],
- Word16 quantSpectrum[FRAME_LEN_LONG],
- UWord16 maxValue[MAX_GROUPED_SFB])
-{
- Word16 sfbOffs, sfb;
- Word16 maxValueAll;
-
- maxValueAll = 0;
-
- for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
- for (sfb = 0; sfb < maxSfbPerGroup; sfb++) {
- Word16 line;
- Word16 maxThisSfb;
- maxThisSfb = 0;
-
- for (line = sfbOffset[sfbOffs+sfb]; line < sfbOffset[sfbOffs+sfb+1]; line++) {
- Word16 absVal;
- absVal = abs_s(quantSpectrum[line]);
- maxThisSfb = max(maxThisSfb, absVal);
- }
-
- maxValue[sfbOffs+sfb] = maxThisSfb;
- maxValueAll = max(maxValueAll, maxThisSfb);
- }
- }
- return maxValueAll;
-}
-
-
-/*********************************************************************************
-*
-* function name: updateBitres
-* description: update bitreservoir
-*
-**********************************************************************************/
-void updateBitres(QC_STATE* qcKernel,
- QC_OUT* qcOut)
-
-{
- ELEMENT_BITS *elBits;
-
- qcKernel->bitResTot = 0;
-
- elBits = &qcKernel->elementBits;
-
-
- if (elBits->averageBits > 0) {
- /* constant bitrate */
- Word16 bitsUsed;
- bitsUsed = (qcOut->qcElement.staticBitsUsed + qcOut->qcElement.dynBitsUsed) +
- (qcOut->qcElement.ancBitsUsed + qcOut->qcElement.fillBits);
- elBits->bitResLevel = elBits->bitResLevel + (elBits->averageBits - bitsUsed);
- qcKernel->bitResTot = qcKernel->bitResTot + elBits->bitResLevel;
- }
- else {
- /* variable bitrate */
- elBits->bitResLevel = elBits->maxBits;
- qcKernel->bitResTot = qcKernel->maxBitsTot;
- }
-}
-
-/*********************************************************************************
-*
-* function name: FinalizeBitConsumption
-* description: count bits used
-*
-**********************************************************************************/
-Word16 FinalizeBitConsumption(QC_STATE *qcKernel,
- QC_OUT* qcOut)
-{
- Word32 nFullFillElem;
- Word32 totFillBits;
- Word16 diffBits;
- Word16 bitsUsed;
-
- totFillBits = 0;
-
- qcOut->totStaticBitsUsed = qcKernel->globStatBits;
- qcOut->totStaticBitsUsed += qcOut->qcElement.staticBitsUsed;
- qcOut->totDynBitsUsed = qcOut->qcElement.dynBitsUsed;
- qcOut->totAncBitsUsed = qcOut->qcElement.ancBitsUsed;
- qcOut->totFillBits = qcOut->qcElement.fillBits;
-
- if (qcOut->qcElement.fillBits) {
- totFillBits += qcOut->qcElement.fillBits;
- }
-
- nFullFillElem = (max((qcOut->totFillBits - 1), 0) / maxFillElemBits) * maxFillElemBits;
-
- qcOut->totFillBits = qcOut->totFillBits - nFullFillElem;
-
- /* check fill elements */
-
- if (qcOut->totFillBits > 0) {
- /* minimum Fillelement contains 7 (TAG + byte cnt) bits */
- qcOut->totFillBits = max(7, qcOut->totFillBits);
- /* fill element size equals n*8 + 7 */
- qcOut->totFillBits = qcOut->totFillBits + ((8 - ((qcOut->totFillBits - 7) & 0x0007)) & 0x0007);
- }
-
- qcOut->totFillBits = qcOut->totFillBits + nFullFillElem;
-
- /* now distribute extra fillbits and alignbits over channel elements */
- qcOut->alignBits = 7 - ((qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed +
- qcOut->totAncBitsUsed + qcOut->totFillBits - 1) & 0x0007);
-
-
- if ( (qcOut->alignBits + qcOut->totFillBits - totFillBits == 8) &&
- (qcOut->totFillBits > 8))
- qcOut->totFillBits = qcOut->totFillBits - 8;
-
-
- diffBits = qcOut->alignBits + qcOut->totFillBits - totFillBits;
-
- if(diffBits>=0) {
- qcOut->qcElement.fillBits += diffBits;
- }
-
- bitsUsed = qcOut->totDynBitsUsed + qcOut->totStaticBitsUsed + qcOut->totAncBitsUsed;
- bitsUsed = bitsUsed + qcOut->totFillBits + qcOut->alignBits;
-
- if (bitsUsed > qcKernel->maxBitsTot) {
- return -1;
- }
- return bitsUsed;
-}
-
-
-/*********************************************************************************
-*
-* function name: AdjustBitrate
-* description: adjusts framelength via padding on a frame to frame basis,
-* to achieve a bitrate that demands a non byte aligned
-* framelength
-* return: errorcode
-*
-**********************************************************************************/
-Word16 AdjustBitrate(QC_STATE *hQC,
- Word32 bitRate, /* total bitrate */
- Word32 sampleRate) /* output sampling rate */
-{
- Word16 paddingOn;
- Word16 frameLen;
- Word16 codeBits;
- Word16 codeBitsLast;
-
- /* Do we need a extra padding byte? */
- paddingOn = framePadding(bitRate,
- sampleRate,
- &hQC->padding.paddingRest);
-
- /* frame length */
- frameLen = paddingOn + calcFrameLen(bitRate,
- sampleRate,
- FRAME_LEN_BYTES_INT);
-
- frameLen = frameLen << 3;
- codeBitsLast = hQC->averageBitsTot - hQC->globStatBits;
- codeBits = frameLen - hQC->globStatBits;
-
- /* calculate bits for every channel element */
- if (codeBits != codeBitsLast) {
- Word16 totalBits = 0;
-
- hQC->elementBits.averageBits = (hQC->elementBits.relativeBits * codeBits) >> 16; /* relativeBits was scaled down by 2 */
- totalBits += hQC->elementBits.averageBits;
-
- hQC->elementBits.averageBits = hQC->elementBits.averageBits + (codeBits - totalBits);
- }
-
- hQC->averageBitsTot = frameLen;
-
- return 0;
-}
diff --git a/media/libstagefright/codecs/aacenc/src/quantize.c b/media/libstagefright/codecs/aacenc/src/quantize.c
deleted file mode 100644
index 0d0f550..0000000
--- a/media/libstagefright/codecs/aacenc/src/quantize.c
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: quantize.c
-
- Content: quantization functions
-
-*******************************************************************************/
-
-#include "typedef.h"
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "quantize.h"
-#include "aac_rom.h"
-
-#define MANT_DIGITS 9
-#define MANT_SIZE (1<<MANT_DIGITS)
-
-static const Word32 XROUND = 0x33e425af; /* final rounding constant (-0.0946f+ 0.5f) */
-
-
-/*****************************************************************************
-*
-* function name:pow34
-* description: calculate $x^{\frac{3}{4}}, for 0.5 < x < 1.0$.
-*
-*****************************************************************************/
-__inline Word32 pow34(Word32 x)
-{
- /* index table using MANT_DIGITS bits, but mask out the sign bit and the MSB
- which is always one */
- return mTab_3_4[(x >> (INT_BITS-2-MANT_DIGITS)) & (MANT_SIZE-1)];
-}
-
-
-/*****************************************************************************
-*
-* function name:quantizeSingleLine
-* description: quantizes spectrum
-* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
-*
-*****************************************************************************/
-static Word16 quantizeSingleLine(const Word16 gain, const Word32 absSpectrum)
-{
- Word32 e, minusFinalExp, finalShift;
- Word32 x;
- Word16 qua = 0;
-
-
- if (absSpectrum) {
- e = norm_l(absSpectrum);
- x = pow34(absSpectrum << e);
-
- /* calculate the final fractional exponent times 16 (was 3*(4*e + gain) + (INT_BITS-1)*16) */
- minusFinalExp = (e << 2) + gain;
- minusFinalExp = (minusFinalExp << 1) + minusFinalExp;
- minusFinalExp = minusFinalExp + ((INT_BITS-1) << 4);
-
- /* separate the exponent into a shift, and a multiply */
- finalShift = minusFinalExp >> 4;
-
- if (finalShift < INT_BITS) {
- x = L_mpy_wx(x, pow2tominusNover16[minusFinalExp & 15]);
-
- x += XROUND >> (INT_BITS - finalShift);
-
- /* shift and quantize */
- finalShift--;
-
- if(finalShift >= 0)
- x >>= finalShift;
- else
- x <<= (-finalShift);
-
- qua = saturate(x);
- }
- }
-
- return qua;
-}
-
-/*****************************************************************************
-*
-* function name:quantizeLines
-* description: quantizes spectrum lines
-* quaSpectrum = mdctSpectrum^3/4*2^(-(3/16)*gain)
-* input: global gain, number of lines to process, spectral data
-* output: quantized spectrum
-*
-*****************************************************************************/
-static void quantizeLines(const Word16 gain,
- const Word16 noOfLines,
- const Word32 *mdctSpectrum,
- Word16 *quaSpectrum)
-{
- Word32 line;
- Word32 m = gain&3;
- Word32 g = (gain >> 2) + 4;
- Word32 mdctSpeL;
- const Word16 *pquat;
- /* gain&3 */
-
- pquat = quantBorders[m];
-
- g += 16;
-
- if(g >= 0)
- {
- for (line=0; line<noOfLines; line++) {
- Word32 qua;
- qua = 0;
-
- mdctSpeL = mdctSpectrum[line];
-
- if (mdctSpeL) {
- Word32 sa;
- Word32 saShft;
-
- sa = L_abs(mdctSpeL);
- //saShft = L_shr(sa, 16 + g);
- saShft = sa >> g;
-
- if (saShft > pquat[0]) {
-
- if (saShft < pquat[1]) {
-
- qua = mdctSpeL>0 ? 1 : -1;
- }
- else {
-
- if (saShft < pquat[2]) {
-
- qua = mdctSpeL>0 ? 2 : -2;
- }
- else {
-
- if (saShft < pquat[3]) {
-
- qua = mdctSpeL>0 ? 3 : -3;
- }
- else {
- qua = quantizeSingleLine(gain, sa);
- /* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
-
- if (mdctSpeL < 0)
- qua = -qua;
- }
- }
- }
- }
- }
- quaSpectrum[line] = qua ;
- }
- }
- else
- {
- for (line=0; line<noOfLines; line++) {
- Word32 qua;
- qua = 0;
-
- mdctSpeL = mdctSpectrum[line];
-
- if (mdctSpeL) {
- Word32 sa;
- Word32 saShft;
-
- sa = L_abs(mdctSpeL);
- saShft = sa << g;
-
- if (saShft > pquat[0]) {
-
- if (saShft < pquat[1]) {
-
- qua = mdctSpeL>0 ? 1 : -1;
- }
- else {
-
- if (saShft < pquat[2]) {
-
- qua = mdctSpeL>0 ? 2 : -2;
- }
- else {
-
- if (saShft < pquat[3]) {
-
- qua = mdctSpeL>0 ? 3 : -3;
- }
- else {
- qua = quantizeSingleLine(gain, sa);
- /* adjust the sign. Since 0 < qua < 1, this cannot overflow. */
-
- if (mdctSpeL < 0)
- qua = -qua;
- }
- }
- }
- }
- }
- quaSpectrum[line] = qua ;
- }
- }
-
-}
-
-
-/*****************************************************************************
-*
-* function name:iquantizeLines
-* description: iquantizes spectrum lines without sign
-* mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain)
-* input: global gain, number of lines to process,quantized spectrum
-* output: spectral data
-*
-*****************************************************************************/
-static void iquantizeLines(const Word16 gain,
- const Word16 noOfLines,
- const Word16 *quantSpectrum,
- Word32 *mdctSpectrum)
-{
- Word32 iquantizermod;
- Word32 iquantizershift;
- Word32 line;
-
- iquantizermod = gain & 3;
- iquantizershift = gain >> 2;
-
- for (line=0; line<noOfLines; line++) {
-
- if( quantSpectrum[line] != 0 ) {
- Word32 accu;
- Word32 ex;
- Word32 tabIndex;
- Word32 specExp;
- Word32 s,t;
-
- accu = quantSpectrum[line];
-
- ex = norm_l(accu);
- accu = accu << ex;
- specExp = INT_BITS-1 - ex;
-
- tabIndex = (accu >> (INT_BITS-2-MANT_DIGITS)) & (~MANT_SIZE);
-
- /* calculate "mantissa" ^4/3 */
- s = mTab_4_3[tabIndex];
-
- /* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */
- t = specExpMantTableComb_enc[iquantizermod][specExp];
-
- /* multiply "mantissa" ^4/3 with exponent multiplier */
- accu = MULHIGH(s, t);
-
- /* get approperiate exponent shifter */
- specExp = specExpTableComb_enc[iquantizermod][specExp];
-
- specExp += iquantizershift + 1;
- if(specExp >= 0)
- mdctSpectrum[line] = accu << specExp;
- else
- mdctSpectrum[line] = accu >> (-specExp);
- }
- else {
- mdctSpectrum[line] = 0;
- }
- }
-}
-
-/*****************************************************************************
-*
-* function name: QuantizeSpectrum
-* description: quantizes the entire spectrum
-* returns:
-* input: number of scalefactor bands to be quantized, ...
-* output: quantized spectrum
-*
-*****************************************************************************/
-void QuantizeSpectrum(Word16 sfbCnt,
- Word16 maxSfbPerGroup,
- Word16 sfbPerGroup,
- Word16 *sfbOffset,
- Word32 *mdctSpectrum,
- Word16 globalGain,
- Word16 *scalefactors,
- Word16 *quantizedSpectrum)
-{
- Word32 sfbOffs, sfb;
-
- for(sfbOffs=0;sfbOffs<sfbCnt;sfbOffs+=sfbPerGroup) {
- Word32 sfbNext ;
- for (sfb = 0; sfb < maxSfbPerGroup; sfb = sfbNext) {
- Word16 scalefactor = scalefactors[sfbOffs+sfb];
- /* coalesce sfbs with the same scalefactor */
- for (sfbNext = sfb+1;
- sfbNext < maxSfbPerGroup && scalefactor == scalefactors[sfbOffs+sfbNext];
- sfbNext++) ;
-
- quantizeLines(globalGain - scalefactor,
- sfbOffset[sfbOffs+sfbNext] - sfbOffset[sfbOffs+sfb],
- mdctSpectrum + sfbOffset[sfbOffs+sfb],
- quantizedSpectrum + sfbOffset[sfbOffs+sfb]);
- }
- }
-}
-
-
-/*****************************************************************************
-*
-* function name:calcSfbDist
-* description: quantizes and requantizes lines to calculate distortion
-* input: number of lines to be quantized, ...
-* output: distortion
-*
-*****************************************************************************/
-Word32 calcSfbDist(const Word32 *spec,
- Word16 sfbWidth,
- Word16 gain)
-{
- Word32 line;
- Word32 dist;
- Word32 m = gain&3;
- Word32 g = (gain >> 2) + 4;
- Word32 g2 = (g << 1) + 1;
- const Word16 *pquat, *repquat;
- /* gain&3 */
-
- pquat = quantBorders[m];
- repquat = quantRecon[m];
-
- dist = 0;
- g += 16;
- if(g2 < 0 && g >= 0)
- {
- g2 = -g2;
- for(line=0; line<sfbWidth; line++) {
- if (spec[line]) {
- Word32 diff;
- Word32 distSingle;
- Word32 sa;
- Word32 saShft;
- sa = L_abs(spec[line]);
- //saShft = round16(L_shr(sa, g));
- //saShft = L_shr(sa, 16+g);
- saShft = sa >> g;
-
- if (saShft < pquat[0]) {
- distSingle = (saShft * saShft) >> g2;
- }
- else {
-
- if (saShft < pquat[1]) {
- diff = saShft - repquat[0];
- distSingle = (diff * diff) >> g2;
- }
- else {
-
- if (saShft < pquat[2]) {
- diff = saShft - repquat[1];
- distSingle = (diff * diff) >> g2;
- }
- else {
-
- if (saShft < pquat[3]) {
- diff = saShft - repquat[2];
- distSingle = (diff * diff) >> g2;
- }
- else {
- Word16 qua = quantizeSingleLine(gain, sa);
- Word32 iqval, diff32;
- /* now that we have quantized x, re-quantize it. */
- iquantizeLines(gain, 1, &qua, &iqval);
- diff32 = sa - iqval;
- distSingle = fixmul(diff32, diff32);
- }
- }
- }
- }
-
- dist = L_add(dist, distSingle);
- }
- }
- }
- else
- {
- for(line=0; line<sfbWidth; line++) {
- if (spec[line]) {
- Word32 diff;
- Word32 distSingle;
- Word32 sa;
- Word32 saShft;
- sa = L_abs(spec[line]);
- //saShft = round16(L_shr(sa, g));
- saShft = L_shr(sa, g);
-
- if (saShft < pquat[0]) {
- distSingle = L_shl((saShft * saShft), g2);
- }
- else {
-
- if (saShft < pquat[1]) {
- diff = saShft - repquat[0];
- distSingle = L_shl((diff * diff), g2);
- }
- else {
-
- if (saShft < pquat[2]) {
- diff = saShft - repquat[1];
- distSingle = L_shl((diff * diff), g2);
- }
- else {
-
- if (saShft < pquat[3]) {
- diff = saShft - repquat[2];
- distSingle = L_shl((diff * diff), g2);
- }
- else {
- Word16 qua = quantizeSingleLine(gain, sa);
- Word32 iqval, diff32;
- /* now that we have quantized x, re-quantize it. */
- iquantizeLines(gain, 1, &qua, &iqval);
- diff32 = sa - iqval;
- distSingle = fixmul(diff32, diff32);
- }
- }
- }
- }
- dist = L_add(dist, distSingle);
- }
- }
- }
-
- return dist;
-}
diff --git a/media/libstagefright/codecs/aacenc/src/sf_estim.c b/media/libstagefright/codecs/aacenc/src/sf_estim.c
deleted file mode 100644
index 78947e1..0000000
--- a/media/libstagefright/codecs/aacenc/src/sf_estim.c
+++ /dev/null
@@ -1,882 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: sf_estim.c
-
- Content: Scale factor estimation functions
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "sf_estim.h"
-#include "quantize.h"
-#include "bit_cnt.h"
-#include "aac_rom.h"
-
-static const Word16 MAX_SCF_DELTA = 60;
-
-/*!
-constants reference in comments
-
- C0 = 6.75f;
- C1 = -69.33295f; -16/3*log(MAX_QUANT+0.5-logCon)/log(2)
- C2 = 4.0f;
- C3 = 2.66666666f;
-
- PE_C1 = 3.0f; log(8.0)/log(2)
- PE_C2 = 1.3219281f; log(2.5)/log(2)
- PE_C3 = 0.5593573f; 1-C2/C1
-
-*/
-
-#define FF_SQRT_BITS 7
-#define FF_SQRT_TABLE_SIZE (1<<FF_SQRT_BITS - 1<<(FF_SQRT_BITS-2))
-#define COEF08_31 0x66666666 /* 0.8*(1 << 31) */
-#define PE_C1_8 24 /* PE_C1*8 */
-#define PE_C2_16 21 /* PE_C2*8/PE_C3 */
-#define PE_SCALE 0x059a /* 0.7 * (1 << (15 - 1 - 3))*/
-
-#define SCALE_ESTIMATE_COEF 0x5555 /* (8.8585/(4*log2(10))) * (1 << 15)*/
-
-/*********************************************************************************
-*
-* function name: formfac_sqrt
-* description: calculates sqrt(x)/256
-*
-**********************************************************************************/
-__inline Word32 formfac_sqrt(Word32 x)
-{
- Word32 y;
- Word32 preshift, postshift;
-
-
- if (x==0) return 0;
- preshift = norm_l(x) - (INT_BITS-1-FF_SQRT_BITS);
- postshift = preshift >> 1;
- preshift = postshift << 1;
- postshift = postshift + 8; /* sqrt/256 */
- if(preshift >= 0)
- y = x << preshift; /* now 1/4 <= y < 1 */
- else
- y = x >> (-preshift);
- y = formfac_sqrttable[y-32];
-
- if(postshift >= 0)
- y = y >> postshift;
- else
- y = y << (-postshift);
-
- return y;
-}
-
-
-/*********************************************************************************
-*
-* function name: CalcFormFactorChannel
-* description: calculate the form factor one channel
-* ffac(n) = sqrt(abs(X(k)) + sqrt(abs(X(k+1)) + ....
-*
-**********************************************************************************/
-static void
-CalcFormFactorChannel(Word16 *logSfbFormFactor,
- Word16 *sfbNRelevantLines,
- Word16 *logSfbEnergy,
- PSY_OUT_CHANNEL *psyOutChan)
-{
- Word32 sfbw, sfbw1;
- Word32 i, j;
- Word32 sfbOffs, sfb;
-
- sfbw = sfbw1 = 0;
- for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){
- for (sfb=0; sfb<psyOutChan->maxSfbPerGroup; sfb++) {
- i = sfbOffs+sfb;
-
- if (psyOutChan->sfbEnergy[i] > psyOutChan->sfbThreshold[i]) {
- Word32 accu, avgFormFactor,iSfbWidth;
- Word32 *mdctSpec;
- sfbw = psyOutChan->sfbOffsets[i+1] - psyOutChan->sfbOffsets[i];
- iSfbWidth = invSBF[(sfbw >> 2) - 1];
- mdctSpec = psyOutChan->mdctSpectrum + psyOutChan->sfbOffsets[i];
- accu = 0;
- /* calc sum of sqrt(spec) */
- for (j=sfbw; j; j--) {
- accu += formfac_sqrt(L_abs(*mdctSpec)); mdctSpec++;
- }
- logSfbFormFactor[i] = iLog4(accu);
- logSfbEnergy[i] = iLog4(psyOutChan->sfbEnergy[i]);
- avgFormFactor = fixmul(rsqrt(psyOutChan->sfbEnergy[i],INT_BITS), iSfbWidth);
- avgFormFactor = rsqrt((Word32)avgFormFactor,INT_BITS) >> 10;
- /* result is multiplied by 4 */
- if(avgFormFactor)
- sfbNRelevantLines[i] = accu / avgFormFactor;
- else
- sfbNRelevantLines[i] = 0x7fff;
- }
- else {
- /* set number of lines to zero */
- sfbNRelevantLines[i] = 0;
- }
- }
- }
-}
-
-/*********************************************************************************
-*
-* function name: improveScf
-* description: find better scalefactor with analysis by synthesis
-*
-**********************************************************************************/
-static Word16 improveScf(Word32 *spec,
- Word16 sfbWidth,
- Word32 thresh,
- Word16 scf,
- Word16 minScf,
- Word32 *dist,
- Word16 *minScfCalculated)
-{
- Word32 cnt;
- Word32 sfbDist;
- Word32 scfBest;
- Word32 thresh125 = L_add(thresh, (thresh >> 2));
-
- scfBest = scf;
-
- /* calc real distortion */
- sfbDist = calcSfbDist(spec, sfbWidth, scf);
- *minScfCalculated = scf;
- if(!sfbDist)
- return scfBest;
-
- if (sfbDist > thresh125) {
- Word32 scfEstimated;
- Word32 sfbDistBest;
- scfEstimated = scf;
- sfbDistBest = sfbDist;
-
- cnt = 0;
- while (sfbDist > thresh125 && (cnt < 3)) {
-
- scf = scf + 1;
- sfbDist = calcSfbDist(spec, sfbWidth, scf);
-
- if (sfbDist < sfbDistBest) {
- scfBest = scf;
- sfbDistBest = sfbDist;
- }
- cnt = cnt + 1;
- }
- cnt = 0;
- scf = scfEstimated;
- sfbDist = sfbDistBest;
- while ((sfbDist > thresh125) && (cnt < 1) && (scf > minScf)) {
-
- scf = scf - 1;
- sfbDist = calcSfbDist(spec, sfbWidth, scf);
-
- if (sfbDist < sfbDistBest) {
- scfBest = scf;
- sfbDistBest = sfbDist;
- }
- *minScfCalculated = scf;
- cnt = cnt + 1;
- }
- *dist = sfbDistBest;
- }
- else {
- Word32 sfbDistBest;
- Word32 sfbDistAllowed;
- Word32 thresh08 = fixmul(COEF08_31, thresh);
- sfbDistBest = sfbDist;
-
- if (sfbDist < thresh08)
- sfbDistAllowed = sfbDist;
- else
- sfbDistAllowed = thresh08;
- for (cnt=0; cnt<3; cnt++) {
- scf = scf + 1;
- sfbDist = calcSfbDist(spec, sfbWidth, scf);
-
- if (fixmul(COEF08_31,sfbDist) < sfbDistAllowed) {
- *minScfCalculated = scfBest + 1;
- scfBest = scf;
- sfbDistBest = sfbDist;
- }
- }
- *dist = sfbDistBest;
- }
-
- /* return best scalefactor */
- return scfBest;
-}
-
-/*********************************************************************************
-*
-* function name: countSingleScfBits
-* description: count single scf bits in huffum
-*
-**********************************************************************************/
-static Word16 countSingleScfBits(Word16 scf, Word16 scfLeft, Word16 scfRight)
-{
- Word16 scfBits;
-
- scfBits = bitCountScalefactorDelta(scfLeft - scf) +
- bitCountScalefactorDelta(scf - scfRight);
-
- return scfBits;
-}
-
-/*********************************************************************************
-*
-* function name: calcSingleSpecPe
-* description: ldRatio = log2(en(n)) - 0,375*scfGain(n)
-* nbits = 0.7*nLines*ldRation for ldRation >= c1
-* nbits = 0.7*nLines*(c2 + c3*ldRatio) for ldRation < c1
-*
-**********************************************************************************/
-static Word16 calcSingleSpecPe(Word16 scf, Word16 sfbConstPePart, Word16 nLines)
-{
- Word32 specPe;
- Word32 ldRatio;
- Word32 scf3;
-
- ldRatio = sfbConstPePart << 3; /* (sfbConstPePart -0.375*scf)*8 */
- scf3 = scf + scf + scf;
- ldRatio = ldRatio - scf3;
-
- if (ldRatio < PE_C1_8) {
- /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
- ldRatio = (ldRatio + PE_C2_16) >> 1;
- }
- specPe = nLines * ldRatio;
- specPe = (specPe * PE_SCALE) >> 14;
-
- return saturate(specPe);
-}
-
-
-/*********************************************************************************
-*
-* function name: countScfBitsDiff
-* description: count different scf bits used
-*
-**********************************************************************************/
-static Word16 countScfBitsDiff(Word16 *scfOld, Word16 *scfNew,
- Word16 sfbCnt, Word16 startSfb, Word16 stopSfb)
-{
- Word32 scfBitsDiff;
- Word32 sfb, sfbLast;
- Word32 sfbPrev, sfbNext;
-
- scfBitsDiff = 0;
- sfb = 0;
-
- /* search for first relevant sfb */
- sfbLast = startSfb;
- while (sfbLast < stopSfb && scfOld[sfbLast] == VOAAC_SHRT_MIN) {
-
- sfbLast = sfbLast + 1;
- }
- /* search for previous relevant sfb and count diff */
- sfbPrev = startSfb - 1;
- while ((sfbPrev>=0) && scfOld[sfbPrev] == VOAAC_SHRT_MIN) {
-
- sfbPrev = sfbPrev - 1;
- }
-
- if (sfbPrev>=0) {
- scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbPrev] - scfNew[sfbLast]) -
- bitCountScalefactorDelta(scfOld[sfbPrev] - scfOld[sfbLast]);
- }
- /* now loop through all sfbs and count diffs of relevant sfbs */
- for (sfb=sfbLast+1; sfb<stopSfb; sfb++) {
-
- if (scfOld[sfb] != VOAAC_SHRT_MIN) {
- scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfb]) -
- bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfb]);
- sfbLast = sfb;
- }
- }
- /* search for next relevant sfb and count diff */
- sfbNext = stopSfb;
- while (sfbNext < sfbCnt && scfOld[sfbNext] == VOAAC_SHRT_MIN) {
-
- sfbNext = sfbNext + 1;
- }
-
- if (sfbNext < sfbCnt)
- scfBitsDiff += bitCountScalefactorDelta(scfNew[sfbLast] - scfNew[sfbNext]) -
- bitCountScalefactorDelta(scfOld[sfbLast] - scfOld[sfbNext]);
-
- return saturate(scfBitsDiff);
-}
-
-static Word16 calcSpecPeDiff(Word16 *scfOld,
- Word16 *scfNew,
- Word16 *sfbConstPePart,
- Word16 *logSfbEnergy,
- Word16 *logSfbFormFactor,
- Word16 *sfbNRelevantLines,
- Word16 startSfb,
- Word16 stopSfb)
-{
- Word32 specPeDiff;
- Word32 sfb;
-
- specPeDiff = 0;
-
- /* loop through all sfbs and count pe difference */
- for (sfb=startSfb; sfb<stopSfb; sfb++) {
-
-
- if (scfOld[sfb] != VOAAC_SHRT_MIN) {
- Word32 ldRatioOld, ldRatioNew;
- Word32 scf3;
-
-
- if (sfbConstPePart[sfb] == MIN_16) {
- sfbConstPePart[sfb] = ((logSfbEnergy[sfb] -
- logSfbFormFactor[sfb]) + 11-8*4+3) >> 2;
- }
-
-
- ldRatioOld = sfbConstPePart[sfb] << 3;
- scf3 = scfOld[sfb] + scfOld[sfb] + scfOld[sfb];
- ldRatioOld = ldRatioOld - scf3;
- ldRatioNew = sfbConstPePart[sfb] << 3;
- scf3 = scfNew[sfb] + scfNew[sfb] + scfNew[sfb];
- ldRatioNew = ldRatioNew - scf3;
-
- if (ldRatioOld < PE_C1_8) {
- /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
- ldRatioOld = (ldRatioOld + PE_C2_16) >> 1;
- }
-
- if (ldRatioNew < PE_C1_8) {
- /* 21 : 2*8*PE_C2, 2*PE_C3 ~ 1*/
- ldRatioNew = (ldRatioNew + PE_C2_16) >> 1;
- }
-
- specPeDiff += sfbNRelevantLines[sfb] * (ldRatioNew - ldRatioOld);
- }
- }
-
- specPeDiff = (specPeDiff * PE_SCALE) >> 14;
-
- return saturate(specPeDiff);
-}
-
-
-/*********************************************************************************
-*
-* function name: assimilateSingleScf
-* description: searched for single scalefactor bands, where the number of bits gained
-* by using a smaller scfgain(n) is greater than the estimated increased
-* bit demand
-*
-**********************************************************************************/
-static void assimilateSingleScf(PSY_OUT_CHANNEL *psyOutChan,
- Word16 *scf,
- Word16 *minScf,
- Word32 *sfbDist,
- Word16 *sfbConstPePart,
- Word16 *logSfbEnergy,
- Word16 *logSfbFormFactor,
- Word16 *sfbNRelevantLines,
- Word16 *minScfCalculated,
- Flag restartOnSuccess)
-{
- Word16 sfbLast, sfbAct, sfbNext, scfAct, scfMin;
- Word16 *scfLast, *scfNext;
- Word32 sfbPeOld, sfbPeNew;
- Word32 sfbDistNew;
- Word32 j;
- Flag success;
- Word16 deltaPe, deltaPeNew, deltaPeTmp;
- Word16 *prevScfLast = psyOutChan->prevScfLast;
- Word16 *prevScfNext = psyOutChan->prevScfNext;
- Word16 *deltaPeLast = psyOutChan->deltaPeLast;
- Flag updateMinScfCalculated;
-
- success = 0;
- deltaPe = 0;
-
- for(j=0;j<psyOutChan->sfbCnt;j++){
- prevScfLast[j] = MAX_16;
- prevScfNext[j] = MAX_16;
- deltaPeLast[j] = MAX_16;
- }
-
- sfbLast = -1;
- sfbAct = -1;
- sfbNext = -1;
- scfLast = 0;
- scfNext = 0;
- scfMin = MAX_16;
- do {
- /* search for new relevant sfb */
- sfbNext = sfbNext + 1;
- while (sfbNext < psyOutChan->sfbCnt && scf[sfbNext] == MIN_16) {
-
- sfbNext = sfbNext + 1;
- }
-
- if ((sfbLast>=0) && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
- /* relevant scfs to the left and to the right */
- scfAct = scf[sfbAct];
- scfLast = scf + sfbLast;
- scfNext = scf + sfbNext;
- scfMin = min(*scfLast, *scfNext);
- }
- else {
-
- if (sfbLast == -1 && (sfbAct>=0) && sfbNext < psyOutChan->sfbCnt) {
- /* first relevant scf */
- scfAct = scf[sfbAct];
- scfLast = &scfAct;
- scfNext = scf + sfbNext;
- scfMin = *scfNext;
- }
- else {
-
- if ((sfbLast>=0) && (sfbAct>=0) && sfbNext == psyOutChan->sfbCnt) {
- /* last relevant scf */
- scfAct = scf[sfbAct];
- scfLast = scf + sfbLast;
- scfNext = &scfAct;
- scfMin = *scfLast;
- }
- }
- }
-
- if (sfbAct>=0)
- scfMin = max(scfMin, minScf[sfbAct]);
-
- if ((sfbAct >= 0) &&
- (sfbLast>=0 || sfbNext < psyOutChan->sfbCnt) &&
- scfAct > scfMin &&
- (*scfLast != prevScfLast[sfbAct] ||
- *scfNext != prevScfNext[sfbAct] ||
- deltaPe < deltaPeLast[sfbAct])) {
- success = 0;
-
- /* estimate required bits for actual scf */
- if (sfbConstPePart[sfbAct] == MIN_16) {
- sfbConstPePart[sfbAct] = logSfbEnergy[sfbAct] -
- logSfbFormFactor[sfbAct] + 11-8*4; /* 4*log2(6.75) - 32 */
-
- if (sfbConstPePart[sfbAct] < 0)
- sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] + 3;
- sfbConstPePart[sfbAct] = sfbConstPePart[sfbAct] >> 2;
- }
-
- sfbPeOld = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
- countSingleScfBits(scfAct, *scfLast, *scfNext);
- deltaPeNew = deltaPe;
- updateMinScfCalculated = 1;
- do {
- scfAct = scfAct - 1;
- /* check only if the same check was not done before */
-
- if (scfAct < minScfCalculated[sfbAct]) {
- sfbPeNew = calcSingleSpecPe(scfAct, sfbConstPePart[sfbAct], sfbNRelevantLines[sfbAct]) +
- countSingleScfBits(scfAct, *scfLast, *scfNext);
- /* use new scf if no increase in pe and
- quantization error is smaller */
- deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld;
-
- if (deltaPeTmp < 10) {
- sfbDistNew = calcSfbDist(psyOutChan->mdctSpectrum+
- psyOutChan->sfbOffsets[sfbAct],
- (psyOutChan->sfbOffsets[sfbAct+1] - psyOutChan->sfbOffsets[sfbAct]),
- scfAct);
- if (sfbDistNew < sfbDist[sfbAct]) {
- /* success, replace scf by new one */
- scf[sfbAct] = scfAct;
- sfbDist[sfbAct] = sfbDistNew;
- deltaPeNew = deltaPeTmp;
- success = 1;
- }
- /* mark as already checked */
-
- if (updateMinScfCalculated) {
- minScfCalculated[sfbAct] = scfAct;
- }
- }
- else {
- updateMinScfCalculated = 0;
- }
- }
-
- } while (scfAct > scfMin);
- deltaPe = deltaPeNew;
- /* save parameters to avoid multiple computations of the same sfb */
- prevScfLast[sfbAct] = *scfLast;
- prevScfNext[sfbAct] = *scfNext;
- deltaPeLast[sfbAct] = deltaPe;
- }
-
- if (success && restartOnSuccess) {
- /* start again at first sfb */
- sfbLast = -1;
- sfbAct = -1;
- sfbNext = -1;
- scfLast = 0;
- scfNext = 0;
- scfMin = MAX_16;
- success = 0;
- }
- else {
- /* shift sfbs for next band */
- sfbLast = sfbAct;
- sfbAct = sfbNext;
- }
-
- } while (sfbNext < psyOutChan->sfbCnt);
-}
-
-
-/*********************************************************************************
-*
-* function name: assimilateMultipleScf
-* description: scalefactor difference reduction
-*
-**********************************************************************************/
-static void assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan,
- Word16 *scf,
- Word16 *minScf,
- Word32 *sfbDist,
- Word16 *sfbConstPePart,
- Word16 *logSfbEnergy,
- Word16 *logSfbFormFactor,
- Word16 *sfbNRelevantLines)
-{
- Word32 sfb, startSfb, stopSfb, scfMin, scfMax, scfAct;
- Flag possibleRegionFound;
- Word32 deltaScfBits;
- Word32 deltaSpecPe;
- Word32 deltaPe, deltaPeNew;
- Word32 sfbCnt;
- Word32 *sfbDistNew = psyOutChan->sfbDistNew;
- Word16 *scfTmp = psyOutChan->prevScfLast;
-
- deltaPe = 0;
- sfbCnt = psyOutChan->sfbCnt;
-
- /* calc min and max scalfactors */
- scfMin = MAX_16;
- scfMax = MIN_16;
- for (sfb=0; sfb<sfbCnt; sfb++) {
-
- if (scf[sfb] != MIN_16) {
- scfMin = min(scfMin, scf[sfb]);
- scfMax = max(scfMax, scf[sfb]);
- }
- }
-
- if (scfMax != MIN_16) {
-
- scfAct = scfMax;
-
- do {
- scfAct = scfAct - 1;
- for (sfb=0; sfb<sfbCnt; sfb++) {
- scfTmp[sfb] = scf[sfb];
- }
- stopSfb = 0;
- do {
- sfb = stopSfb;
-
- while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] <= scfAct)) {
- sfb = sfb + 1;
- }
- startSfb = sfb;
- sfb = sfb + 1;
-
- while (sfb < sfbCnt && (scf[sfb] == MIN_16 || scf[sfb] > scfAct)) {
- sfb = sfb + 1;
- }
- stopSfb = sfb;
-
- possibleRegionFound = 0;
-
- if (startSfb < sfbCnt) {
- possibleRegionFound = 1;
- for (sfb=startSfb; sfb<stopSfb; sfb++) {
-
- if (scf[sfb]!=MIN_16) {
-
- if (scfAct < minScf[sfb]) {
- possibleRegionFound = 0;
- break;
- }
- }
- }
- }
-
-
- if (possibleRegionFound) { /* region found */
-
- /* replace scfs in region by scfAct */
- for (sfb=startSfb; sfb<stopSfb; sfb++) {
-
- if (scfTmp[sfb]!=MIN_16)
- scfTmp[sfb] = scfAct;
- }
-
- /* estimate change in bit demand for new scfs */
- deltaScfBits = countScfBitsDiff(scf,scfTmp,sfbCnt,startSfb,stopSfb);
- deltaSpecPe = calcSpecPeDiff(scf, scfTmp, sfbConstPePart,
- logSfbEnergy, logSfbFormFactor, sfbNRelevantLines,
- startSfb, stopSfb);
- deltaPeNew = deltaPe + deltaScfBits + deltaSpecPe;
-
-
- if (deltaPeNew < 10) {
- Word32 distOldSum, distNewSum;
-
- /* quantize and calc sum of new distortion */
- distOldSum = 0;
- distNewSum = 0;
- for (sfb=startSfb; sfb<stopSfb; sfb++) {
-
- if (scfTmp[sfb] != MIN_16) {
- distOldSum = L_add(distOldSum, sfbDist[sfb]);
-
- sfbDistNew[sfb] = calcSfbDist(psyOutChan->mdctSpectrum +
- psyOutChan->sfbOffsets[sfb],
- (psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]),
- scfAct);
-
-
- if (sfbDistNew[sfb] > psyOutChan->sfbThreshold[sfb]) {
- distNewSum = distOldSum << 1;
- break;
- }
- distNewSum = L_add(distNewSum, sfbDistNew[sfb]);
- }
- }
-
- if (distNewSum < distOldSum) {
- deltaPe = deltaPeNew;
- for (sfb=startSfb; sfb<stopSfb; sfb++) {
-
- if (scf[sfb]!=MIN_16) {
- scf[sfb] = scfAct;
- sfbDist[sfb] = sfbDistNew[sfb];
- }
- }
- }
- }
- }
- } while (stopSfb <= sfbCnt);
- } while (scfAct > scfMin);
- }
-}
-
-/*********************************************************************************
-*
-* function name: EstimateScaleFactorsChannel
-* description: estimate scale factors for one channel
-*
-**********************************************************************************/
-static void
-EstimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan,
- Word16 *scf,
- Word16 *globalGain,
- Word16 *logSfbEnergy,
- Word16 *logSfbFormFactor,
- Word16 *sfbNRelevantLines)
-{
- Word32 i, j;
- Word32 thresh, energy;
- Word32 energyPart, thresholdPart;
- Word32 scfInt, minScf, maxScf, maxAllowedScf, lastSf;
- Word32 maxSpec;
- Word32 *sfbDist = psyOutChan->sfbDist;
- Word16 *minSfMaxQuant = psyOutChan->minSfMaxQuant;
- Word16 *minScfCalculated = psyOutChan->minScfCalculated;
-
-
- for (i=0; i<psyOutChan->sfbCnt; i++) {
- Word32 sbfwith, sbfStart;
- Word32 *mdctSpec;
- thresh = psyOutChan->sfbThreshold[i];
- energy = psyOutChan->sfbEnergy[i];
-
- sbfStart = psyOutChan->sfbOffsets[i];
- sbfwith = psyOutChan->sfbOffsets[i+1] - sbfStart;
- mdctSpec = psyOutChan->mdctSpectrum+sbfStart;
-
- maxSpec = 0;
- /* maximum of spectrum */
- for (j=sbfwith; j; j-- ) {
- Word32 absSpec = L_abs(*mdctSpec); mdctSpec++;
- maxSpec |= absSpec;
- }
-
- /* scfs without energy or with thresh>energy are marked with MIN_16 */
- scf[i] = MIN_16;
- minSfMaxQuant[i] = MIN_16;
-
- if ((maxSpec > 0) && (energy > thresh)) {
-
- energyPart = logSfbFormFactor[i];
- thresholdPart = iLog4(thresh);
- /* -20 = 4*log2(6.75) - 32 */
- scfInt = ((thresholdPart - energyPart - 20) * SCALE_ESTIMATE_COEF) >> 15;
-
- minSfMaxQuant[i] = iLog4(maxSpec) - 68; /* 68 -16/3*log(MAX_QUANT+0.5-logCon)/log(2) + 1 */
-
-
- if (minSfMaxQuant[i] > scfInt) {
- scfInt = minSfMaxQuant[i];
- }
-
- /* find better scalefactor with analysis by synthesis */
- scfInt = improveScf(psyOutChan->mdctSpectrum+sbfStart,
- sbfwith,
- thresh, scfInt, minSfMaxQuant[i],
- &sfbDist[i], &minScfCalculated[i]);
-
- scf[i] = scfInt;
- }
- }
-
-
- /* scalefactor differece reduction */
- {
- Word16 sfbConstPePart[MAX_GROUPED_SFB];
- for(i=0;i<psyOutChan->sfbCnt;i++) {
- sfbConstPePart[i] = MIN_16;
- }
-
- assimilateSingleScf(psyOutChan, scf,
- minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
- logSfbFormFactor, sfbNRelevantLines, minScfCalculated, 1);
-
- assimilateMultipleScf(psyOutChan, scf,
- minSfMaxQuant, sfbDist, sfbConstPePart, logSfbEnergy,
- logSfbFormFactor, sfbNRelevantLines);
- }
-
- /* get max scalefac for global gain */
- maxScf = MIN_16;
- minScf = MAX_16;
- for (i=0; i<psyOutChan->sfbCnt; i++) {
-
- if (maxScf < scf[i]) {
- maxScf = scf[i];
- }
-
- if ((scf[i] != MIN_16) && (minScf > scf[i])) {
- minScf = scf[i];
- }
- }
- /* limit scf delta */
- maxAllowedScf = minScf + MAX_SCF_DELTA;
- for(i=0; i<psyOutChan->sfbCnt; i++) {
-
- if ((scf[i] != MIN_16) && (maxAllowedScf < scf[i])) {
- scf[i] = maxAllowedScf;
- }
- }
- /* new maxScf if any scf has been limited */
-
- if (maxAllowedScf < maxScf) {
- maxScf = maxAllowedScf;
- }
-
- /* calc loop scalefactors */
-
- if (maxScf > MIN_16) {
- *globalGain = maxScf;
- lastSf = 0;
-
- for(i=0; i<psyOutChan->sfbCnt; i++) {
-
- if (scf[i] == MIN_16) {
- scf[i] = lastSf;
- /* set band explicitely to zero */
- for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
- psyOutChan->mdctSpectrum[j] = 0;
- }
- }
- else {
- scf[i] = maxScf - scf[i];
- lastSf = scf[i];
- }
- }
- }
- else{
- *globalGain = 0;
- /* set spectrum explicitely to zero */
- for(i=0; i<psyOutChan->sfbCnt; i++) {
- scf[i] = 0;
- for (j=psyOutChan->sfbOffsets[i]; j<psyOutChan->sfbOffsets[i+1]; j++) {
- psyOutChan->mdctSpectrum[j] = 0;
- }
- }
- }
-}
-
-/*********************************************************************************
-*
-* function name: CalcFormFactor
-* description: estimate Form factors for all channel
-*
-**********************************************************************************/
-void
-CalcFormFactor(Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- const Word16 nChannels)
-{
- Word16 j;
-
- for (j=0; j<nChannels; j++) {
- CalcFormFactorChannel(logSfbFormFactor[j], sfbNRelevantLines[j], logSfbEnergy[j], &psyOutChannel[j]);
- }
-}
-
-/*********************************************************************************
-*
-* function name: EstimateScaleFactors
-* description: estimate scale factors for all channel
-*
-**********************************************************************************/
-void
-EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS],
- Word16 logSfbEnergy[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 logSfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
- Word16 sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
- const Word16 nChannels)
-{
- Word16 j;
-
- for (j=0; j<nChannels; j++) {
- EstimateScaleFactorsChannel(&psyOutChannel[j],
- qcOutChannel[j].scf,
- &(qcOutChannel[j].globalGain),
- logSfbEnergy[j],
- logSfbFormFactor[j],
- sfbNRelevantLines[j]);
- }
-}
-
diff --git a/media/libstagefright/codecs/aacenc/src/spreading.c b/media/libstagefright/codecs/aacenc/src/spreading.c
deleted file mode 100644
index aaf2fff..0000000
--- a/media/libstagefright/codecs/aacenc/src/spreading.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: spreading.c
-
- Content: Spreading of energy function
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "spreading.h"
-
-/*********************************************************************************
-*
-* function name: SpreadingMax
-* description: spreading the energy
-* higher frequencies thr(n) = max(thr(n), sh(n)*thr(n-1))
-* lower frequencies thr(n) = max(thr(n), sl(n)*thr(n+1))
-*
-**********************************************************************************/
-void SpreadingMax(const Word16 pbCnt,
- const Word16 *maskLowFactor,
- const Word16 *maskHighFactor,
- Word32 *pbSpreadedEnergy)
-{
- Word32 i;
-
- /* slope to higher frequencies */
- for (i=1; i<pbCnt; i++) {
- pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i],
- L_mpy_ls(pbSpreadedEnergy[i-1], maskHighFactor[i]));
- }
- /* slope to lower frequencies */
- for (i=pbCnt - 2; i>=0; i--) {
- pbSpreadedEnergy[i] = max(pbSpreadedEnergy[i],
- L_mpy_ls(pbSpreadedEnergy[i+1], maskLowFactor[i]));
- }
-}
diff --git a/media/libstagefright/codecs/aacenc/src/stat_bits.c b/media/libstagefright/codecs/aacenc/src/stat_bits.c
deleted file mode 100644
index c2bd8bd..0000000
--- a/media/libstagefright/codecs/aacenc/src/stat_bits.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: stat_bits.c
-
- Content: Static bit counter functions
-
-*******************************************************************************/
-
-#include "stat_bits.h"
-#include "bitenc.h"
-#include "tns.h"
-
-
-typedef enum {
- SI_ID_BITS =(3),
- SI_FILL_COUNT_BITS =(4),
- SI_FILL_ESC_COUNT_BITS =(8),
- SI_FILL_EXTENTION_BITS =(4),
- SI_FILL_NIBBLE_BITS =(4),
- SI_SCE_BITS =(4),
- SI_CPE_BITS =(5),
- SI_CPE_MS_MASK_BITS =(2) ,
- SI_ICS_INFO_BITS_LONG =(1+2+1+6+1),
- SI_ICS_INFO_BITS_SHORT =(1+2+1+4+7),
- SI_ICS_BITS =(8+1+1+1)
-} SI_BITS;
-
-
-/*********************************************************************************
-*
-* function name: countMsMaskBits
-* description: count ms stereo bits demand
-*
-**********************************************************************************/
-static Word16 countMsMaskBits(Word16 sfbCnt,
- Word16 sfbPerGroup,
- Word16 maxSfbPerGroup,
- struct TOOLSINFO *toolsInfo)
-{
- Word16 msBits, sfbOff, sfb;
- msBits = 0;
-
-
- switch(toolsInfo->msDigest) {
- case MS_NONE:
- case MS_ALL:
- break;
-
- case MS_SOME:
- for(sfbOff=0; sfbOff<sfbCnt; sfbOff+=sfbPerGroup)
- for(sfb=0; sfb<maxSfbPerGroup; sfb++)
- msBits += 1;
- break;
- }
- return(msBits);
-}
-
-/*********************************************************************************
-*
-* function name: tnsCount
-* description: count tns bit demand core function
-*
-**********************************************************************************/
-static Word16 tnsCount(TNS_INFO *tnsInfo, Word16 blockType)
-{
-
- Word32 i, k;
- Flag tnsPresent;
- Word32 numOfWindows;
- Word32 count;
- Word32 coefBits;
- Word16 *ptcoef;
-
- count = 0;
-
- if (blockType == 2)
- numOfWindows = 8;
- else
- numOfWindows = 1;
- tnsPresent = 0;
-
- for (i=0; i<numOfWindows; i++) {
-
- if (tnsInfo->tnsActive[i]!=0) {
- tnsPresent = 1;
- }
- }
-
- if (tnsPresent) {
- /* there is data to be written*/
- /*count += 1; */
- for (i=0; i<numOfWindows; i++) {
-
- if (blockType == 2)
- count += 1;
- else
- count += 2;
-
- if (tnsInfo->tnsActive[i]) {
- count += 1;
-
- if (blockType == 2) {
- count += 4;
- count += 3;
- }
- else {
- count += 6;
- count += 5;
- }
-
- if (tnsInfo->order[i]) {
- count += 1; /*direction*/
- count += 1; /*coef_compression */
-
- if (tnsInfo->coefRes[i] == 4) {
- ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
- coefBits = 3;
- for(k=0; k<tnsInfo->order[i]; k++) {
-
- if ((ptcoef[k] > 3) || (ptcoef[k] < -4)) {
- coefBits = 4;
- break;
- }
- }
- }
- else {
- coefBits = 2;
- ptcoef = tnsInfo->coef + i*TNS_MAX_ORDER_SHORT;
- for(k=0; k<tnsInfo->order[i]; k++) {
-
- if ((ptcoef[k] > 1) || (ptcoef[k] < -2)) {
- coefBits = 3;
- break;
- }
- }
- }
- for (k=0; k<tnsInfo->order[i]; k++ ) {
- count += coefBits;
- }
- }
- }
- }
- }
-
- return count;
-}
-
-/**********************************************************************************
-*
-* function name: countTnsBits
-* description: count tns bit demand
-*
-**********************************************************************************/
-static Word16 countTnsBits(TNS_INFO *tnsInfo,Word16 blockType)
-{
- return(tnsCount(tnsInfo, blockType));
-}
-
-/*********************************************************************************
-*
-* function name: countStaticBitdemand
-* description: count static bit demand include tns
-*
-**********************************************************************************/
-Word16 countStaticBitdemand(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
- PSY_OUT_ELEMENT *psyOutElement,
- Word16 channels,
- Word16 adtsUsed)
-{
- Word32 statBits;
- Word32 ch;
-
- statBits = 0;
-
- /* if adts used, add 56 bits */
- if(adtsUsed) statBits += 56;
-
-
- switch (channels) {
- case 1:
- statBits += SI_ID_BITS+SI_SCE_BITS+SI_ICS_BITS;
- statBits += countTnsBits(&(psyOutChannel[0].tnsInfo),
- psyOutChannel[0].windowSequence);
-
- switch(psyOutChannel[0].windowSequence){
- case LONG_WINDOW:
- case START_WINDOW:
- case STOP_WINDOW:
- statBits += SI_ICS_INFO_BITS_LONG;
- break;
- case SHORT_WINDOW:
- statBits += SI_ICS_INFO_BITS_SHORT;
- break;
- }
- break;
- case 2:
- statBits += SI_ID_BITS+SI_CPE_BITS+2*SI_ICS_BITS;
-
- statBits += SI_CPE_MS_MASK_BITS;
- statBits += countMsMaskBits(psyOutChannel[0].sfbCnt,
- psyOutChannel[0].sfbPerGroup,
- psyOutChannel[0].maxSfbPerGroup,
- &psyOutElement->toolsInfo);
-
- switch (psyOutChannel[0].windowSequence) {
- case LONG_WINDOW:
- case START_WINDOW:
- case STOP_WINDOW:
- statBits += SI_ICS_INFO_BITS_LONG;
- break;
- case SHORT_WINDOW:
- statBits += SI_ICS_INFO_BITS_SHORT;
- break;
- }
- for(ch=0; ch<2; ch++)
- statBits += countTnsBits(&(psyOutChannel[ch].tnsInfo),
- psyOutChannel[ch].windowSequence);
- break;
- }
-
- return statBits;
-}
-
diff --git a/media/libstagefright/codecs/aacenc/src/tns.c b/media/libstagefright/codecs/aacenc/src/tns.c
deleted file mode 100644
index 27c3971..0000000
--- a/media/libstagefright/codecs/aacenc/src/tns.c
+++ /dev/null
@@ -1,906 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: tns.c
-
- Content: Definition TNS tools functions
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "oper_32b.h"
-#include "assert.h"
-#include "aac_rom.h"
-#include "psy_const.h"
-#include "tns.h"
-#include "tns_param.h"
-#include "psy_configuration.h"
-#include "tns_func.h"
-
-#define UNUSED(x) (void)(x)
-
-#define TNS_MODIFY_BEGIN 2600 /* Hz */
-#define RATIO_PATCH_LOWER_BORDER 380 /* Hz */
-#define TNS_GAIN_THRESH 141 /* 1.41*100 */
-#define NORM_COEF 0x028f5c28
-
-static const Word32 TNS_PARCOR_THRESH = 0x0ccccccd; /* 0.1*(1 << 31) */
-/* Limit bands to > 2.0 kHz */
-static unsigned short tnsMinBandNumberLong[12] =
-{ 11, 12, 15, 16, 17, 20, 25, 26, 24, 28, 30, 31 };
-static unsigned short tnsMinBandNumberShort[12] =
-{ 2, 2, 2, 3, 3, 4, 6, 6, 8, 10, 10, 12 };
-
-/**************************************/
-/* Main/Low Profile TNS Parameters */
-/**************************************/
-static unsigned short tnsMaxBandsLongMainLow[12] =
-{ 31, 31, 34, 40, 42, 51, 46, 46, 42, 42, 42, 39 };
-
-static unsigned short tnsMaxBandsShortMainLow[12] =
-{ 9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14 };
-
-
-static void CalcWeightedSpectrum(const Word32 spectrum[],
- Word16 weightedSpectrum[],
- Word32* sfbEnergy,
- const Word16* sfbOffset, Word16 lpcStartLine,
- Word16 lpcStopLine, Word16 lpcStartBand,Word16 lpcStopBand,
- Word32 *pWork32);
-
-
-
-void AutoCorrelation(const Word16 input[], Word32 corr[],
- Word16 samples, Word16 corrCoeff);
-static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOfCoeff);
-
-static Word16 CalcTnsFilter(const Word16* signal, const Word32 window[], Word16 numOfLines,
- Word16 tnsOrder, Word32 parcor[]);
-
-
-static void Parcor2Index(const Word32 parcor[], Word16 index[], Word16 order,
- Word16 bitsPerCoeff);
-
-static void Index2Parcor(const Word16 index[], Word32 parcor[], Word16 order,
- Word16 bitsPerCoeff);
-
-
-
-static void AnalysisFilterLattice(const Word32 signal[], Word16 numOfLines,
- const Word32 parCoeff[], Word16 order,
- Word32 output[]);
-
-
-/**
-*
-* function name: FreqToBandWithRounding
-* description: Retrieve index of nearest band border
-* returnt: index
-*
-*/
-static Word16 FreqToBandWithRounding(Word32 freq, /*!< frequency in Hertz */
- Word32 fs, /*!< Sampling frequency in Hertz */
- Word16 numOfBands, /*!< total number of bands */
- const Word16 *bandStartOffset) /*!< table of band borders */
-{
- Word32 lineNumber, band;
- Word32 temp, shift;
-
- /* assert(freq >= 0); */
- shift = norm_l(fs);
- lineNumber = (extract_l(fixmul((bandStartOffset[numOfBands] << 2),Div_32(freq << shift,fs << shift))) + 1) >> 1;
-
- /* freq > fs/2 */
- temp = lineNumber - bandStartOffset[numOfBands] ;
- if (temp >= 0)
- return numOfBands;
-
- /* find band the line number lies in */
- for (band=0; band<numOfBands; band++) {
- temp = bandStartOffset[band + 1] - lineNumber;
- if (temp > 0) break;
- }
-
- temp = (lineNumber - bandStartOffset[band]);
- temp = (temp - (bandStartOffset[band + 1] - lineNumber));
- if ( temp > 0 )
- {
- band = band + 1;
- }
-
- return extract_l(band);
-}
-
-
-/**
-*
-* function name: InitTnsConfigurationLong
-* description: Fill TNS_CONFIG structure with sensible content for long blocks
-* returns: 0 if success
-*
-*/
-Word16 InitTnsConfigurationLong(Word32 bitRate, /*!< bitrate */
- Word32 sampleRate, /*!< Sampling frequency */
- Word16 channels, /*!< number of channels */
- TNS_CONFIG *tC, /*!< TNS Config struct (modified) */
- PSY_CONFIGURATION_LONG *pC, /*!< psy config struct */
- Word16 active) /*!< tns active flag */
-{
-
- Word32 bitratePerChannel __unused;
- tC->maxOrder = TNS_MAX_ORDER;
- tC->tnsStartFreq = 1275;
- tC->coefRes = 4;
-
- /* to avoid integer division */
- if ( sub(channels,2) == 0 ) {
- bitratePerChannel = bitRate >> 1;
- }
- else {
- bitratePerChannel = bitRate;
- }
-
- tC->tnsMaxSfb = tnsMaxBandsLongMainLow[pC->sampRateIdx];
-
- tC->tnsActive = active;
-
- /* now calc band and line borders */
- tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
- tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
-
- tC->tnsStartBand = FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
- pC->sfbCnt, (const Word16*)pC->sfbOffset);
-
- tC->tnsModifyBeginCb = FreqToBandWithRounding(TNS_MODIFY_BEGIN,
- sampleRate,
- pC->sfbCnt,
- (const Word16*)pC->sfbOffset);
-
- tC->tnsRatioPatchLowestCb = FreqToBandWithRounding(RATIO_PATCH_LOWER_BORDER,
- sampleRate,
- pC->sfbCnt,
- (const Word16*)pC->sfbOffset);
-
-
- tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
-
- tC->lpcStopBand = tnsMaxBandsLongMainLow[pC->sampRateIdx];
- tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
-
- tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
-
- tC->lpcStartBand = tnsMinBandNumberLong[pC->sampRateIdx];
-
- tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
-
- tC->threshold = TNS_GAIN_THRESH;
-
-
- return(0);
-}
-
-/**
-*
-* function name: InitTnsConfigurationShort
-* description: Fill TNS_CONFIG structure with sensible content for short blocks
-* returns: 0 if success
-*
-*/
-Word16 InitTnsConfigurationShort(Word32 bitRate, /*!< bitrate */
- Word32 sampleRate, /*!< Sampling frequency */
- Word16 channels, /*!< number of channels */
- TNS_CONFIG *tC, /*!< TNS Config struct (modified) */
- PSY_CONFIGURATION_SHORT *pC, /*!< psy config struct */
- Word16 active) /*!< tns active flag */
-{
- Word32 bitratePerChannel __unused;
- tC->maxOrder = TNS_MAX_ORDER_SHORT;
- tC->tnsStartFreq = 2750;
- tC->coefRes = 3;
-
- /* to avoid integer division */
- if ( sub(channels,2) == 0 ) {
- bitratePerChannel = L_shr(bitRate,1);
- }
- else {
- bitratePerChannel = bitRate;
- }
-
- tC->tnsMaxSfb = tnsMaxBandsShortMainLow[pC->sampRateIdx];
-
- tC->tnsActive = active;
-
- /* now calc band and line borders */
- tC->tnsStopBand = min(pC->sfbCnt, tC->tnsMaxSfb);
- tC->tnsStopLine = pC->sfbOffset[tC->tnsStopBand];
-
- tC->tnsStartBand=FreqToBandWithRounding(tC->tnsStartFreq, sampleRate,
- pC->sfbCnt, (const Word16*)pC->sfbOffset);
-
- tC->tnsModifyBeginCb = FreqToBandWithRounding(TNS_MODIFY_BEGIN,
- sampleRate,
- pC->sfbCnt,
- (const Word16*)pC->sfbOffset);
-
- tC->tnsRatioPatchLowestCb = FreqToBandWithRounding(RATIO_PATCH_LOWER_BORDER,
- sampleRate,
- pC->sfbCnt,
- (const Word16*)pC->sfbOffset);
-
-
- tC->tnsStartLine = pC->sfbOffset[tC->tnsStartBand];
-
- tC->lpcStopBand = tnsMaxBandsShortMainLow[pC->sampRateIdx];
-
- tC->lpcStopBand = min(tC->lpcStopBand, pC->sfbActive);
-
- tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand];
-
- tC->lpcStartBand = tnsMinBandNumberShort[pC->sampRateIdx];
-
- tC->lpcStartLine = pC->sfbOffset[tC->lpcStartBand];
-
- tC->threshold = TNS_GAIN_THRESH;
-
- return(0);
-}
-
-/**
-*
-* function name: TnsDetect
-* description: Calculate TNS filter and decide on TNS usage
-* returns: 0 if success
-*
-*/
-Word32 TnsDetect(TNS_DATA* tnsData, /*!< tns data structure (modified) */
- TNS_CONFIG tC, /*!< tns config structure */
- Word32* pScratchTns, /*!< pointer to scratch space */
- const Word16 sfbOffset[], /*!< scalefactor size and table */
- Word32* spectrum, /*!< spectral data */
- Word16 subBlockNumber, /*!< subblock num */
- Word16 blockType, /*!< blocktype (long or short) */
- Word32 * sfbEnergy) /*!< sfb-wise energy */
-{
-
- Word32 predictionGain;
- Word32 temp;
- Word32* pWork32 = &pScratchTns[subBlockNumber >> 8];
- Word16* pWeightedSpectrum = (Word16 *)&pScratchTns[subBlockNumber >> 8];
-
-
- if (tC.tnsActive) {
- CalcWeightedSpectrum(spectrum,
- pWeightedSpectrum,
- sfbEnergy,
- sfbOffset,
- tC.lpcStartLine,
- tC.lpcStopLine,
- tC.lpcStartBand,
- tC.lpcStopBand,
- pWork32);
-
- temp = blockType - SHORT_WINDOW;
- if ( temp != 0 ) {
- predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine],
- tC.acfWindow,
- tC.lpcStopLine - tC.lpcStartLine,
- tC.maxOrder,
- tnsData->dataRaw.tnsLong.subBlockInfo.parcor);
-
-
- temp = predictionGain - tC.threshold;
- if ( temp > 0 ) {
- tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 1;
- }
- else {
- tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
- }
-
- tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = predictionGain;
- }
- else{
-
- predictionGain = CalcTnsFilter( &pWeightedSpectrum[tC.lpcStartLine],
- tC.acfWindow,
- tC.lpcStopLine - tC.lpcStartLine,
- tC.maxOrder,
- tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].parcor);
-
- temp = predictionGain - tC.threshold;
- if ( temp > 0 ) {
- tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 1;
- }
- else {
- tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
- }
-
- tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = predictionGain;
- }
-
- }
- else{
-
- temp = blockType - SHORT_WINDOW;
- if ( temp != 0 ) {
- tnsData->dataRaw.tnsLong.subBlockInfo.tnsActive = 0;
- tnsData->dataRaw.tnsLong.subBlockInfo.predictionGain = 0;
- }
- else {
- tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].tnsActive = 0;
- tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber].predictionGain = 0;
- }
- }
-
- return(0);
-}
-
-
-/*****************************************************************************
-*
-* function name: TnsSync
-* description: update tns parameter
-*
-*****************************************************************************/
-void TnsSync(TNS_DATA *tnsDataDest,
- const TNS_DATA *tnsDataSrc,
- const TNS_CONFIG tC,
- const Word16 subBlockNumber,
- const Word16 blockType)
-{
- TNS_SUBBLOCK_INFO *sbInfoDest;
- const TNS_SUBBLOCK_INFO *sbInfoSrc;
- Word32 i, temp;
-
- temp = blockType - SHORT_WINDOW;
- if ( temp != 0 ) {
- sbInfoDest = &tnsDataDest->dataRaw.tnsLong.subBlockInfo;
- sbInfoSrc = &tnsDataSrc->dataRaw.tnsLong.subBlockInfo;
- }
- else {
- sbInfoDest = &tnsDataDest->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
- sbInfoSrc = &tnsDataSrc->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
- }
-
- if (100*abs_s(sbInfoDest->predictionGain - sbInfoSrc->predictionGain) <
- (3 * sbInfoDest->predictionGain)) {
- sbInfoDest->tnsActive = sbInfoSrc->tnsActive;
- for ( i=0; i< tC.maxOrder; i++) {
- sbInfoDest->parcor[i] = sbInfoSrc->parcor[i];
- }
- }
-}
-
-/*****************************************************************************
-*
-* function name: TnsEncode
-* description: do TNS filtering
-* returns: 0 if success
-*
-*****************************************************************************/
-Word16 TnsEncode(TNS_INFO* tnsInfo, /*!< tns info structure (modified) */
- TNS_DATA* tnsData, /*!< tns data structure (modified) */
- Word16 numOfSfb, /*!< number of scale factor bands */
- TNS_CONFIG tC, /*!< tns config structure */
- Word16 lowPassLine, /*!< lowpass line */
- Word32* spectrum, /*!< spectral data (modified) */
- Word16 subBlockNumber, /*!< subblock num */
- Word16 blockType) /*!< blocktype (long or short) */
-{
- Word32 i;
- Word32 temp_s;
- Word32 temp;
- TNS_SUBBLOCK_INFO *psubBlockInfo;
-
- temp_s = blockType - SHORT_WINDOW;
- if ( temp_s != 0) {
- psubBlockInfo = &tnsData->dataRaw.tnsLong.subBlockInfo;
- if (psubBlockInfo->tnsActive == 0) {
- tnsInfo->tnsActive[subBlockNumber] = 0;
- return(0);
- }
- else {
-
- Parcor2Index(psubBlockInfo->parcor,
- tnsInfo->coef,
- tC.maxOrder,
- tC.coefRes);
-
- Index2Parcor(tnsInfo->coef,
- psubBlockInfo->parcor,
- tC.maxOrder,
- tC.coefRes);
-
- for (i=tC.maxOrder - 1; i>=0; i--) {
- temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
- if ( temp > 0 )
- break;
- temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
- if ( temp < 0 )
- break;
- }
- tnsInfo->order[subBlockNumber] = i + 1;
-
-
- tnsInfo->tnsActive[subBlockNumber] = 1;
- for (i=subBlockNumber+1; i<TRANS_FAC; i++) {
- tnsInfo->tnsActive[i] = 0;
- }
- tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
- tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
-
-
- AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]),
- (min(tC.tnsStopLine,lowPassLine) - tC.tnsStartLine),
- psubBlockInfo->parcor,
- tnsInfo->order[subBlockNumber],
- &(spectrum[tC.tnsStartLine]));
-
- }
- } /* if (blockType!=SHORT_WINDOW) */
- else /*short block*/ {
- psubBlockInfo = &tnsData->dataRaw.tnsShort.subBlockInfo[subBlockNumber];
- if (psubBlockInfo->tnsActive == 0) {
- tnsInfo->tnsActive[subBlockNumber] = 0;
- return(0);
- }
- else {
-
- Parcor2Index(psubBlockInfo->parcor,
- &tnsInfo->coef[subBlockNumber*TNS_MAX_ORDER_SHORT],
- tC.maxOrder,
- tC.coefRes);
-
- Index2Parcor(&tnsInfo->coef[subBlockNumber*TNS_MAX_ORDER_SHORT],
- psubBlockInfo->parcor,
- tC.maxOrder,
- tC.coefRes);
- for (i=(tC.maxOrder - 1); i>=0; i--) {
- temp = psubBlockInfo->parcor[i] - TNS_PARCOR_THRESH;
- if ( temp > 0 )
- break;
-
- temp = psubBlockInfo->parcor[i] + TNS_PARCOR_THRESH;
- if ( temp < 0 )
- break;
- }
- tnsInfo->order[subBlockNumber] = i + 1;
-
- tnsInfo->tnsActive[subBlockNumber] = 1;
- tnsInfo->coefRes[subBlockNumber] = tC.coefRes;
- tnsInfo->length[subBlockNumber] = numOfSfb - tC.tnsStartBand;
-
-
- AnalysisFilterLattice(&(spectrum[tC.tnsStartLine]), (tC.tnsStopLine - tC.tnsStartLine),
- psubBlockInfo->parcor,
- tnsInfo->order[subBlockNumber],
- &(spectrum[tC.tnsStartLine]));
-
- }
- }
-
- return(0);
-}
-
-
-/*****************************************************************************
-*
-* function name: CalcWeightedSpectrum
-* description: Calculate weighted spectrum for LPC calculation
-*
-*****************************************************************************/
-static void CalcWeightedSpectrum(const Word32 spectrum[], /*!< input spectrum */
- Word16 weightedSpectrum[],
- Word32 *sfbEnergy, /*!< sfb energies */
- const Word16 *sfbOffset,
- Word16 lpcStartLine,
- Word16 lpcStopLine,
- Word16 lpcStartBand,
- Word16 lpcStopBand,
- Word32 *pWork32)
-{
- #define INT_BITS_SCAL 1<<(INT_BITS/2)
-
- Word32 i, sfb, shift;
- Word32 maxShift;
- Word32 tmp_s, tmp2_s;
- Word32 tmp, tmp2;
- Word32 maxWS;
- Word32 tnsSfbMean[MAX_SFB]; /* length [lpcStopBand-lpcStartBand] should be sufficient here */
-
- maxWS = 0;
-
- /* calc 1.0*2^-INT_BITS/2/sqrt(en) */
- for( sfb = lpcStartBand; sfb < lpcStopBand; sfb++) {
-
- tmp2 = sfbEnergy[sfb] - 2;
- if( tmp2 > 0) {
- tmp = rsqrt(sfbEnergy[sfb], INT_BITS);
- if(tmp > INT_BITS_SCAL)
- {
- shift = norm_l(tmp);
- tmp = Div_32( INT_BITS_SCAL << shift, tmp << shift );
- }
- else
- {
- tmp = 0x7fffffff;
- }
- }
- else {
- tmp = 0x7fffffff;
- }
- tnsSfbMean[sfb] = tmp;
- }
-
- /* spread normalized values from sfbs to lines */
- sfb = lpcStartBand;
- tmp = tnsSfbMean[sfb];
- for ( i=lpcStartLine; i<lpcStopLine; i++){
- tmp_s = sfbOffset[sfb + 1] - i;
- if ( tmp_s == 0 ) {
- sfb = sfb + 1;
- tmp2_s = sfb + 1 - lpcStopBand;
- if (tmp2_s <= 0) {
- tmp = tnsSfbMean[sfb];
- }
- }
- pWork32[i] = tmp;
- }
- /*filter down*/
- for (i=(lpcStopLine - 2); i>=lpcStartLine; i--){
- pWork32[i] = (pWork32[i] + pWork32[i + 1]) >> 1;
- }
- /* filter up */
- for (i=(lpcStartLine + 1); i<lpcStopLine; i++){
- pWork32[i] = (pWork32[i] + pWork32[i - 1]) >> 1;
- }
-
- /* weight and normalize */
- for (i=lpcStartLine; i<lpcStopLine; i++){
- pWork32[i] = MULHIGH(pWork32[i], spectrum[i]);
- maxWS |= L_abs(pWork32[i]);
- }
- maxShift = norm_l(maxWS);
-
- maxShift = 16 - maxShift;
- if(maxShift >= 0)
- {
- for (i=lpcStartLine; i<lpcStopLine; i++){
- weightedSpectrum[i] = pWork32[i] >> maxShift;
- }
- }
- else
- {
- maxShift = -maxShift;
- for (i=lpcStartLine; i<lpcStopLine; i++){
- weightedSpectrum[i] = saturate(pWork32[i] << maxShift);
- }
- }
-}
-
-
-
-
-/*****************************************************************************
-*
-* function name: CalcTnsFilter
-* description: LPC calculation for one TNS filter
-* returns: prediction gain
-* input: signal spectrum, acf window, no. of spectral lines,
-* max. TNS order, ptr. to reflection ocefficients
-* output: reflection coefficients
-*(half) window size must be larger than tnsOrder !!*
-******************************************************************************/
-
-static Word16 CalcTnsFilter(const Word16 *signal,
- const Word32 window[],
- Word16 numOfLines,
- Word16 tnsOrder,
- Word32 parcor[])
-{
- Word32 parcorWorkBuffer[2*TNS_MAX_ORDER+1];
- Word32 predictionGain;
- Word32 i;
- Word32 tnsOrderPlus1 = tnsOrder + 1;
-
- UNUSED(window);
-
- assert(tnsOrder <= TNS_MAX_ORDER); /* remove asserts later? (btg) */
-
- for(i=0;i<tnsOrder;i++) {
- parcor[i] = 0;
- }
-
- AutoCorrelation(signal, parcorWorkBuffer, numOfLines, tnsOrderPlus1);
-
- /* early return if signal is very low: signal prediction off, with zero parcor coeffs */
- if (parcorWorkBuffer[0] == 0)
- return 0;
-
- predictionGain = AutoToParcor(parcorWorkBuffer, parcor, tnsOrder);
-
- return(predictionGain);
-}
-
-/*****************************************************************************
-*
-* function name: AutoCorrelation
-* description: calc. autocorrelation (acf)
-* returns: -
-* input: input values, no. of input values, no. of acf values
-* output: acf values
-*
-*****************************************************************************/
-#ifndef ARMV5E
-void AutoCorrelation(const Word16 input[],
- Word32 corr[],
- Word16 samples,
- Word16 corrCoeff) {
- Word32 i, j, isamples;
- Word32 accu;
- Word32 scf;
-
- scf = 10 - 1;
-
- isamples = samples;
- /* calc first corrCoef: R[0] = sum { t[i] * t[i] } ; i = 0..N-1 */
- accu = 0;
- for(j=0; j<isamples; j++) {
- accu = L_add(accu, ((input[j] * input[j]) >> scf));
- }
- corr[0] = accu;
-
- /* early termination if all corr coeffs are likely going to be zero */
- if(corr[0] == 0) return ;
-
- /* calc all other corrCoef: R[j] = sum { t[i] * t[i+j] } ; i = 0..(N-j-1), j=1..p */
- for(i=1; i<corrCoeff; i++) {
- isamples = isamples - 1;
- accu = 0;
- for(j=0; j<isamples; j++) {
- accu = L_add(accu, ((input[j] * input[j+i]) >> scf));
- }
- corr[i] = accu;
- }
-}
-#endif
-
-/*****************************************************************************
-*
-* function name: AutoToParcor
-* description: conversion autocorrelation to reflection coefficients
-* returns: prediction gain
-* input: <order+1> input values, no. of output values (=order),
-* ptr. to workbuffer (required size: 2*order)
-* output: <order> reflection coefficients
-*
-*****************************************************************************/
-static Word16 AutoToParcor(Word32 workBuffer[], Word32 reflCoeff[], Word16 numOfCoeff) {
-
- Word32 i, j, shift;
- Word32 *pWorkBuffer; /* temp pointer */
- Word32 predictionGain = 0;
- Word32 num, denom;
- Word32 temp, workBuffer0;
-
-
- num = workBuffer[0];
- temp = workBuffer[numOfCoeff];
-
- for(i=0; i<numOfCoeff-1; i++) {
- workBuffer[i + numOfCoeff] = workBuffer[i + 1];
- }
- workBuffer[i + numOfCoeff] = temp;
-
- for(i=0; i<numOfCoeff; i++) {
- Word32 refc;
-
-
- if (workBuffer[0] < L_abs(workBuffer[i + numOfCoeff])) {
- return 0 ;
- }
- shift = norm_l(workBuffer[0]);
- workBuffer0 = Div_32(1 << shift, workBuffer[0] << shift);
- /* calculate refc = -workBuffer[numOfCoeff+i] / workBuffer[0]; -1 <= refc < 1 */
- refc = L_negate(fixmul(workBuffer[numOfCoeff + i], workBuffer0));
-
- reflCoeff[i] = refc;
-
- pWorkBuffer = &(workBuffer[numOfCoeff]);
-
- for(j=i; j<numOfCoeff; j++) {
- Word32 accu1, accu2;
- accu1 = L_add(pWorkBuffer[j], fixmul(refc, workBuffer[j - i]));
- accu2 = L_add(workBuffer[j - i], fixmul(refc, pWorkBuffer[j]));
- pWorkBuffer[j] = accu1;
- workBuffer[j - i] = accu2;
- }
- }
-
- denom = MULHIGH(workBuffer[0], NORM_COEF);
-
- if (denom != 0) {
- Word32 temp;
- shift = norm_l(denom);
- temp = Div_32(1 << shift, denom << shift);
- predictionGain = fixmul(num, temp);
- }
-
- return extract_l(predictionGain);
-}
-
-
-
-static Word16 Search3(Word32 parcor)
-{
- Word32 index = 0;
- Word32 i;
- Word32 temp;
-
- for (i=0;i<8;i++) {
- temp = L_sub( parcor, tnsCoeff3Borders[i]);
- if (temp > 0)
- index=i;
- }
- return extract_l(index - 4);
-}
-
-static Word16 Search4(Word32 parcor)
-{
- Word32 index = 0;
- Word32 i;
- Word32 temp;
-
-
- for (i=0;i<16;i++) {
- temp = L_sub(parcor, tnsCoeff4Borders[i]);
- if (temp > 0)
- index=i;
- }
- return extract_l(index - 8);
-}
-
-
-
-/*****************************************************************************
-*
-* functionname: Parcor2Index
-* description: quantization index for reflection coefficients
-*
-*****************************************************************************/
-static void Parcor2Index(const Word32 parcor[], /*!< parcor coefficients */
- Word16 index[], /*!< quantized coeff indices */
- Word16 order, /*!< filter order */
- Word16 bitsPerCoeff) { /*!< quantizer resolution */
- Word32 i;
- Word32 temp;
-
- for(i=0; i<order; i++) {
- temp = bitsPerCoeff - 3;
- if (temp == 0) {
- index[i] = Search3(parcor[i]);
- }
- else {
- index[i] = Search4(parcor[i]);
- }
- }
-}
-
-/*****************************************************************************
-*
-* functionname: Index2Parcor
-* description: Inverse quantization for reflection coefficients
-*
-*****************************************************************************/
-static void Index2Parcor(const Word16 index[], /*!< quantized values */
- Word32 parcor[], /*!< ptr. to reflection coefficients (output) */
- Word16 order, /*!< no. of coefficients */
- Word16 bitsPerCoeff) /*!< quantizer resolution */
-{
- Word32 i;
- Word32 temp;
-
- for (i=0; i<order; i++) {
- temp = bitsPerCoeff - 4;
- if ( temp == 0 ) {
- parcor[i] = tnsCoeff4[index[i] + 8];
- }
- else {
- parcor[i] = tnsCoeff3[index[i] + 4];
- }
- }
-}
-
-/*****************************************************************************
-*
-* functionname: FIRLattice
-* description: in place lattice filtering of spectral data
-* returns: pointer to modified data
-*
-*****************************************************************************/
-static Word32 FIRLattice(Word16 order, /*!< filter order */
- Word32 x, /*!< spectral data */
- Word32 *state_par, /*!< filter states */
- const Word32 *coef_par) /*!< filter coefficients */
-{
- Word32 i;
- Word32 accu,tmp,tmpSave;
-
- x = x >> 1;
- tmpSave = x;
-
- for (i=0; i<(order - 1); i++) {
-
- tmp = L_add(fixmul(coef_par[i], x), state_par[i]);
- x = L_add(fixmul(coef_par[i], state_par[i]), x);
-
- state_par[i] = tmpSave;
- tmpSave = tmp;
- }
-
- /* last stage: only need half operations */
- accu = fixmul(state_par[order - 1], coef_par[(order - 1)]);
- state_par[(order - 1)] = tmpSave;
-
- x = L_add(accu, x);
- x = L_add(x, x);
-
- return x;
-}
-
-/*****************************************************************************
-*
-* functionname: AnalysisFilterLattice
-* description: filters spectral lines with TNS filter
-*
-*****************************************************************************/
-static void AnalysisFilterLattice(const Word32 signal[], /*!< input spectrum */
- Word16 numOfLines, /*!< no. of lines */
- const Word32 parCoeff[],/*!< PARC coefficients */
- Word16 order, /*!< filter order */
- Word32 output[]) /*!< filtered signal values */
-{
-
- Word32 state_par[TNS_MAX_ORDER];
- Word32 j;
-
- for ( j=0; j<TNS_MAX_ORDER; j++ ) {
- state_par[j] = 0;
- }
-
- for(j=0; j<numOfLines; j++) {
- output[j] = FIRLattice(order,signal[j],state_par,parCoeff);
- }
-}
-
-/*****************************************************************************
-*
-* functionname: ApplyTnsMultTableToRatios
-* description: Change thresholds according to tns
-*
-*****************************************************************************/
-void ApplyTnsMultTableToRatios(Word16 startCb,
- Word16 stopCb,
- TNS_SUBBLOCK_INFO subInfo, /*!< TNS subblock info */
- Word32 *thresholds) /*!< thresholds (modified) */
-{
- Word32 i;
- if (subInfo.tnsActive) {
- for(i=startCb; i<stopCb; i++) {
- /* thresholds[i] * 0.25 */
- thresholds[i] = (thresholds[i] >> 2);
- }
- }
-}
diff --git a/media/libstagefright/codecs/aacenc/src/transform.c b/media/libstagefright/codecs/aacenc/src/transform.c
deleted file mode 100644
index 5de2b96..0000000
--- a/media/libstagefright/codecs/aacenc/src/transform.c
+++ /dev/null
@@ -1,677 +0,0 @@
-/*
- ** Copyright 2003-2010, VisualOn, Inc.
- **
- ** Licensed under the Apache License, Version 2.0 (the "License");
- ** you may not use this file except in compliance with the License.
- ** You may obtain a copy of the License at
- **
- ** http://www.apache.org/licenses/LICENSE-2.0
- **
- ** Unless required by applicable law or agreed to in writing, software
- ** distributed under the License is distributed on an "AS IS" BASIS,
- ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ** See the License for the specific language governing permissions and
- ** limitations under the License.
- */
-/*******************************************************************************
- File: transform.c
-
- Content: MDCT Transform functionss
-
-*******************************************************************************/
-
-#include "basic_op.h"
-#include "psy_const.h"
-#include "transform.h"
-#include "aac_rom.h"
-
-
-#define LS_TRANS ((FRAME_LEN_LONG-FRAME_LEN_SHORT)/2) /* 448 */
-#define SQRT1_2 0x5a82799a /* sqrt(1/2) in Q31 */
-#define swap2(p0,p1) \
- t = p0; t1 = *(&(p0)+1); \
- (p0) = p1; *(&(p0)+1) = *(&(p1)+1); \
- (p1) = t; *(&(p1)+1) = t1
-
-/*********************************************************************************
-*
-* function name: Shuffle
-* description: Shuffle points prepared function for fft
-*
-**********************************************************************************/
-static void Shuffle(int *buf, int num, const unsigned char* bitTab)
-{
- int *part0, *part1;
- int i, j;
- int t, t1;
-
- part0 = buf;
- part1 = buf + num;
-
- while ((i = *bitTab++) != 0) {
- j = *bitTab++;
-
- swap2(part0[4*i+0], part0[4*j+0]);
- swap2(part0[4*i+2], part1[4*j+0]);
- swap2(part1[4*i+0], part0[4*j+2]);
- swap2(part1[4*i+2], part1[4*j+2]);
- }
-
- do {
- swap2(part0[4*i+2], part1[4*i+0]);
- } while ((i = *bitTab++) != 0);
-}
-
-#if !defined(ARMV5E) && !defined(ARMV7Neon)
-
-/*****************************************************************************
-*
-* function name: Radix4First
-* description: Radix 4 point prepared function for fft
-*
-**********************************************************************************/
-static void Radix4First(int *buf, int num)
-{
- int r0, r1, r2, r3;
- int r4, r5, r6, r7;
-
- for (; num != 0; num--)
- {
- r0 = buf[0] + buf[2];
- r1 = buf[1] + buf[3];
- r2 = buf[0] - buf[2];
- r3 = buf[1] - buf[3];
- r4 = buf[4] + buf[6];
- r5 = buf[5] + buf[7];
- r6 = buf[4] - buf[6];
- r7 = buf[5] - buf[7];
-
- buf[0] = r0 + r4;
- buf[1] = r1 + r5;
- buf[4] = r0 - r4;
- buf[5] = r1 - r5;
- buf[2] = r2 + r7;
- buf[3] = r3 - r6;
- buf[6] = r2 - r7;
- buf[7] = r3 + r6;
-
- buf += 8;
- }
-}
-
-/*****************************************************************************
-*
-* function name: Radix8First
-* description: Radix 8 point prepared function for fft
-*
-**********************************************************************************/
-static void Radix8First(int *buf, int num)
-{
- int r0, r1, r2, r3;
- int i0, i1, i2, i3;
- int r4, r5, r6, r7;
- int i4, i5, i6, i7;
- int t0, t1, t2, t3;
-
- for ( ; num != 0; num--)
- {
- r0 = buf[0] + buf[2];
- i0 = buf[1] + buf[3];
- r1 = buf[0] - buf[2];
- i1 = buf[1] - buf[3];
- r2 = buf[4] + buf[6];
- i2 = buf[5] + buf[7];
- r3 = buf[4] - buf[6];
- i3 = buf[5] - buf[7];
-
- r4 = (r0 + r2) >> 1;
- i4 = (i0 + i2) >> 1;
- r5 = (r0 - r2) >> 1;
- i5 = (i0 - i2) >> 1;
- r6 = (r1 - i3) >> 1;
- i6 = (i1 + r3) >> 1;
- r7 = (r1 + i3) >> 1;
- i7 = (i1 - r3) >> 1;
-
- r0 = buf[ 8] + buf[10];
- i0 = buf[ 9] + buf[11];
- r1 = buf[ 8] - buf[10];
- i1 = buf[ 9] - buf[11];
- r2 = buf[12] + buf[14];
- i2 = buf[13] + buf[15];
- r3 = buf[12] - buf[14];
- i3 = buf[13] - buf[15];
-
- t0 = (r0 + r2) >> 1;
- t1 = (i0 + i2) >> 1;
- t2 = (r0 - r2) >> 1;
- t3 = (i0 - i2) >> 1;
-
- buf[ 0] = r4 + t0;
- buf[ 1] = i4 + t1;
- buf[ 8] = r4 - t0;
- buf[ 9] = i4 - t1;
- buf[ 4] = r5 + t3;
- buf[ 5] = i5 - t2;
- buf[12] = r5 - t3;
- buf[13] = i5 + t2;
-
- r0 = r1 - i3;
- i0 = i1 + r3;
- r2 = r1 + i3;
- i2 = i1 - r3;
-
- t0 = MULHIGH(SQRT1_2, r0 - i0);
- t1 = MULHIGH(SQRT1_2, r0 + i0);
- t2 = MULHIGH(SQRT1_2, r2 - i2);
- t3 = MULHIGH(SQRT1_2, r2 + i2);
-
- buf[ 6] = r6 - t0;
- buf[ 7] = i6 - t1;
- buf[14] = r6 + t0;
- buf[15] = i6 + t1;
- buf[ 2] = r7 + t3;
- buf[ 3] = i7 - t2;
- buf[10] = r7 - t3;
- buf[11] = i7 + t2;
-
- buf += 16;
- }
-}
-
-/*****************************************************************************
-*
-* function name: Radix4FFT
-* description: Radix 4 point fft core function
-*
-**********************************************************************************/
-static void Radix4FFT(int *buf, int num, int bgn, int *twidTab)
-{
- int r0, r1, r2, r3;
- int r4, r5, r6, r7;
- int t0, t1;
- int sinx, cosx;
- int i, j, step;
- int *xptr, *csptr;
-
- for (num >>= 2; num != 0; num >>= 2)
- {
- step = 2*bgn;
- xptr = buf;
-
- for (i = num; i != 0; i--)
- {
- csptr = twidTab;
-
- for (j = bgn; j != 0; j--)
- {
- r0 = xptr[0];
- r1 = xptr[1];
- xptr += step;
-
- t0 = xptr[0];
- t1 = xptr[1];
- cosx = csptr[0];
- sinx = csptr[1];
- r2 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*br + sin*bi */
- r3 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*bi - sin*br */
- xptr += step;
-
- t0 = r0 >> 2;
- t1 = r1 >> 2;
- r0 = t0 - r2;
- r1 = t1 - r3;
- r2 = t0 + r2;
- r3 = t1 + r3;
-
- t0 = xptr[0];
- t1 = xptr[1];
- cosx = csptr[2];
- sinx = csptr[3];
- r4 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */
- r5 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */
- xptr += step;
-
- t0 = xptr[0];
- t1 = xptr[1];
- cosx = csptr[4];
- sinx = csptr[5];
- r6 = MULHIGH(cosx, t0) + MULHIGH(sinx, t1); /* cos*cr + sin*ci */
- r7 = MULHIGH(cosx, t1) - MULHIGH(sinx, t0); /* cos*ci - sin*cr */
- csptr += 6;
-
- t0 = r4;
- t1 = r5;
- r4 = t0 + r6;
- r5 = r7 - t1;
- r6 = t0 - r6;
- r7 = r7 + t1;
-
- xptr[0] = r0 + r5;
- xptr[1] = r1 + r6;
- xptr -= step;
-
- xptr[0] = r2 - r4;
- xptr[1] = r3 - r7;
- xptr -= step;
-
- xptr[0] = r0 - r5;
- xptr[1] = r1 - r6;
- xptr -= step;
-
- xptr[0] = r2 + r4;
- xptr[1] = r3 + r7;
- xptr += 2;
- }
- xptr += 3*step;
- }
- twidTab += 3*step;
- bgn <<= 2;
- }
-}
-
-/*********************************************************************************
-*
-* function name: PreMDCT
-* description: prepare MDCT process for next FFT compute
-*
-**********************************************************************************/
-static void PreMDCT(int *buf0, int num, const int *csptr)
-{
- int i;
- int tr1, ti1, tr2, ti2;
- int cosa, sina, cosb, sinb;
- int *buf1;
-
- buf1 = buf0 + num - 1;
-
- for(i = num >> 2; i != 0; i--)
- {
- cosa = *csptr++;
- sina = *csptr++;
- cosb = *csptr++;
- sinb = *csptr++;
-
- tr1 = *(buf0 + 0);
- ti2 = *(buf0 + 1);
- tr2 = *(buf1 - 1);
- ti1 = *(buf1 + 0);
-
- *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
- *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1);
-
- *buf1-- = MULHIGH(cosb, ti2) - MULHIGH(sinb, tr2);
- *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
- }
-}
-
-/*********************************************************************************
-*
-* function name: PostMDCT
-* description: post MDCT process after next FFT for MDCT
-*
-**********************************************************************************/
-static void PostMDCT(int *buf0, int num, const int *csptr)
-{
- int i;
- int tr1, ti1, tr2, ti2;
- int cosa, sina, cosb, sinb;
- int *buf1;
-
- buf1 = buf0 + num - 1;
-
- for(i = num >> 2; i != 0; i--)
- {
- cosa = *csptr++;
- sina = *csptr++;
- cosb = *csptr++;
- sinb = *csptr++;
-
- tr1 = *(buf0 + 0);
- ti1 = *(buf0 + 1);
- ti2 = *(buf1 + 0);
- tr2 = *(buf1 - 1);
-
- *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1);
- *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1);
-
- *buf0++ = MULHIGH(sinb, tr2) - MULHIGH(cosb, ti2);
- *buf1-- = MULHIGH(cosb, tr2) + MULHIGH(sinb, ti2);
- }
-}
-#else
-void Radix4First(int *buf, int num);
-void Radix8First(int *buf, int num);
-void Radix4FFT(int *buf, int num, int bgn, int *twidTab);
-void PreMDCT(int *buf0, int num, const int *csptr);
-void PostMDCT(int *buf0, int num, const int *csptr);
-#endif
-
-
-/**********************************************************************************
-*
-* function name: Mdct_Long
-* description: the long block mdct, include long_start block, end_long block
-*
-**********************************************************************************/
-void Mdct_Long(int *buf)
-{
- PreMDCT(buf, 1024, cossintab + 128);
-
- Shuffle(buf, 512, bitrevTab + 17);
- Radix8First(buf, 512 >> 3);
- Radix4FFT(buf, 512 >> 3, 8, (int *)twidTab512);
-
- PostMDCT(buf, 1024, cossintab + 128);
-}
-
-
-/**********************************************************************************
-*
-* function name: Mdct_Short
-* description: the short block mdct
-*
-**********************************************************************************/
-void Mdct_Short(int *buf)
-{
- PreMDCT(buf, 128, cossintab);
-
- Shuffle(buf, 64, bitrevTab);
- Radix4First(buf, 64 >> 2);
- Radix4FFT(buf, 64 >> 2, 4, (int *)twidTab64);
-
- PostMDCT(buf, 128, cossintab);
-}
-
-
-/*****************************************************************************
-*
-* function name: shiftMdctDelayBuffer
-* description: the mdct delay buffer has a size of 1600,
-* so the calculation of LONG,STOP must be spilt in two
-* passes with 1024 samples and a mid shift,
-* the SHORT transforms can be completed in the delay buffer,
-* and afterwards a shift
-*
-**********************************************************************************/
-static void shiftMdctDelayBuffer(Word16 *mdctDelayBuffer, /*! start of mdct delay buffer */
- Word16 *timeSignal, /*! pointer to new time signal samples, interleaved */
- Word16 chIncrement /*! number of channels */
- )
-{
- Word32 i;
- Word16 *srBuf = mdctDelayBuffer;
- Word16 *dsBuf = mdctDelayBuffer+FRAME_LEN_LONG;
-
- for(i = 0; i < BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG; i+= 8)
- {
- *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++;
- *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++;
- *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++;
- *srBuf++ = *dsBuf++; *srBuf++ = *dsBuf++;
- }
-
- srBuf = mdctDelayBuffer + BLOCK_SWITCHING_OFFSET-FRAME_LEN_LONG;
- dsBuf = timeSignal;
-
- for(i=0; i<FRAME_LEN_LONG; i+=8)
- {
- *srBuf++ = *dsBuf; dsBuf += chIncrement;
- *srBuf++ = *dsBuf; dsBuf += chIncrement;
- *srBuf++ = *dsBuf; dsBuf += chIncrement;
- *srBuf++ = *dsBuf; dsBuf += chIncrement;
- *srBuf++ = *dsBuf; dsBuf += chIncrement;
- *srBuf++ = *dsBuf; dsBuf += chIncrement;
- *srBuf++ = *dsBuf; dsBuf += chIncrement;
- *srBuf++ = *dsBuf; dsBuf += chIncrement;
- }
-}
-
-
-/*****************************************************************************
-*
-* function name: getScalefactorOfShortVectorStride
-* description: Calculate max possible scale factor for input vector of shorts
-* returns: Maximum scale factor
-*
-**********************************************************************************/
-static Word16 getScalefactorOfShortVectorStride(const Word16 *vector, /*!< Pointer to input vector */
- Word16 len, /*!< Length of input vector */
- Word16 stride) /*!< Stride of input vector */
-{
- Word16 maxVal = 0;
- Word16 absVal;
- Word16 i;
-
- for(i=0; i<len; i++){
- absVal = abs_s(vector[i*stride]);
- maxVal |= absVal;
- }
-
- return( maxVal ? norm_s(maxVal) : 15);
-}
-
-
-/*****************************************************************************
-*
-* function name: Transform_Real
-* description: Calculate transform filter for input vector of shorts
-* returns: TRUE if success
-*
-**********************************************************************************/
-void Transform_Real(Word16 *mdctDelayBuffer,
- Word16 *timeSignal,
- Word16 chIncrement,
- Word32 *realOut,
- Word16 *mdctScale,
- Word16 blockType
- )
-{
- Word32 i,w;
- Word32 timeSignalSample;
- Word32 ws1,ws2;
- Word16 *dctIn0, *dctIn1;
- Word32 *outData0, *outData1;
- Word32 *winPtr;
-
- Word32 delayBufferSf,timeSignalSf,minSf;
-
- switch(blockType){
-
-
- case LONG_WINDOW:
- /*
- we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + 448 new timeSignal samples
- and get the biggest scale factor for next calculate more precise
- */
- delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1);
- timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
- minSf = min(delayBufferSf,timeSignalSf);
- minSf = min(minSf,14);
-
- dctIn0 = mdctDelayBuffer;
- dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
- outData0 = realOut + FRAME_LEN_LONG/2;
-
- /* add windows and pre add for mdct to last buffer*/
- winPtr = (int *)LongWindowKBD;
- for(i=0;i<FRAME_LEN_LONG/2;i++){
- timeSignalSample = (*dctIn0++) << minSf;
- ws1 = timeSignalSample * (*winPtr >> 16);
- timeSignalSample = (*dctIn1--) << minSf;
- ws2 = timeSignalSample * (*winPtr & 0xffff);
- winPtr ++;
- /* shift 2 to avoid overflow next */
- *outData0++ = (ws1 >> 2) - (ws2 >> 2);
- }
-
- shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
-
- /* add windows and pre add for mdct to new buffer*/
- dctIn0 = mdctDelayBuffer;
- dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
- outData0 = realOut + FRAME_LEN_LONG/2 - 1;
- winPtr = (int *)LongWindowKBD;
- for(i=0;i<FRAME_LEN_LONG/2;i++){
- timeSignalSample = (*dctIn0++) << minSf;
- ws1 = timeSignalSample * (*winPtr & 0xffff);
- timeSignalSample = (*dctIn1--) << minSf;
- ws2 = timeSignalSample * (*winPtr >> 16);
- winPtr++;
- /* shift 2 to avoid overflow next */
- *outData0-- = -((ws1 >> 2) + (ws2 >> 2));
- }
-
- Mdct_Long(realOut);
- /* update scale factor */
- minSf = 14 - minSf;
- *mdctScale=minSf;
- break;
-
- case START_WINDOW:
- /*
- we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no timeSignal samples
- and get the biggest scale factor for next calculate more precise
- */
- minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer,BLOCK_SWITCHING_OFFSET,1);
- minSf = min(minSf,14);
-
- dctIn0 = mdctDelayBuffer;
- dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
- outData0 = realOut + FRAME_LEN_LONG/2;
- winPtr = (int *)LongWindowKBD;
-
- /* add windows and pre add for mdct to last buffer*/
- for(i=0;i<FRAME_LEN_LONG/2;i++){
- timeSignalSample = (*dctIn0++) << minSf;
- ws1 = timeSignalSample * (*winPtr >> 16);
- timeSignalSample = (*dctIn1--) << minSf;
- ws2 = timeSignalSample * (*winPtr & 0xffff);
- winPtr ++;
- *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
- }
-
- shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
-
- outData0 = realOut + FRAME_LEN_LONG/2 - 1;
- for(i=0;i<LS_TRANS;i++){
- *outData0-- = -mdctDelayBuffer[i] << (15 - 2 + minSf);
- }
-
- /* add windows and pre add for mdct to new buffer*/
- dctIn0 = mdctDelayBuffer + LS_TRANS;
- dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
- outData0 = realOut + FRAME_LEN_LONG/2 - 1 -LS_TRANS;
- winPtr = (int *)ShortWindowSine;
- for(i=0;i<FRAME_LEN_SHORT/2;i++){
- timeSignalSample= (*dctIn0++) << minSf;
- ws1 = timeSignalSample * (*winPtr & 0xffff);
- timeSignalSample= (*dctIn1--) << minSf;
- ws2 = timeSignalSample * (*winPtr >> 16);
- winPtr++;
- *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
- }
-
- Mdct_Long(realOut);
- /* update scale factor */
- minSf = 14 - minSf;
- *mdctScale= minSf;
- break;
-
- case STOP_WINDOW:
- /*
- we access BLOCK_SWITCHING_OFFSET-LS_TRANS (1600-448 ) delay buffer samples + 448 new timeSignal samples
- and get the biggest scale factor for next calculate more precise
- */
- delayBufferSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+LS_TRANS,BLOCK_SWITCHING_OFFSET-LS_TRANS,1);
- timeSignalSf = getScalefactorOfShortVectorStride(timeSignal,2*FRAME_LEN_LONG-BLOCK_SWITCHING_OFFSET,chIncrement);
- minSf = min(delayBufferSf,timeSignalSf);
- minSf = min(minSf,13);
-
- outData0 = realOut + FRAME_LEN_LONG/2;
- dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
- for(i=0;i<LS_TRANS;i++){
- *outData0++ = -(*dctIn1--) << (15 - 2 + minSf);
- }
-
- /* add windows and pre add for mdct to last buffer*/
- dctIn0 = mdctDelayBuffer + LS_TRANS;
- dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1 - LS_TRANS;
- outData0 = realOut + FRAME_LEN_LONG/2 + LS_TRANS;
- winPtr = (int *)ShortWindowSine;
- for(i=0;i<FRAME_LEN_SHORT/2;i++){
- timeSignalSample = (*dctIn0++) << minSf;
- ws1 = timeSignalSample * (*winPtr >> 16);
- timeSignalSample= (*dctIn1--) << minSf;
- ws2 = timeSignalSample * (*winPtr & 0xffff);
- winPtr++;
- *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
- }
-
- shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
-
- /* add windows and pre add for mdct to new buffer*/
- dctIn0 = mdctDelayBuffer;
- dctIn1 = mdctDelayBuffer + FRAME_LEN_LONG - 1;
- outData0 = realOut + FRAME_LEN_LONG/2 - 1;
- winPtr = (int *)LongWindowKBD;
- for(i=0;i<FRAME_LEN_LONG/2;i++){
- timeSignalSample= (*dctIn0++) << minSf;
- ws1 = timeSignalSample *(*winPtr & 0xffff);
- timeSignalSample= (*dctIn1--) << minSf;
- ws2 = timeSignalSample * (*winPtr >> 16);
- *outData0-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
- winPtr++;
- }
-
- Mdct_Long(realOut);
- minSf = 14 - minSf;
- *mdctScale= minSf; /* update scale factor */
- break;
-
- case SHORT_WINDOW:
- /*
- we access BLOCK_SWITCHING_OFFSET (1600 ) delay buffer samples + no new timeSignal samples
- and get the biggest scale factor for next calculate more precise
- */
- minSf = getScalefactorOfShortVectorStride(mdctDelayBuffer+TRANSFORM_OFFSET_SHORT,9*FRAME_LEN_SHORT,1);
- minSf = min(minSf,10);
-
-
- for(w=0;w<TRANS_FAC;w++){
- dctIn0 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT;
- dctIn1 = mdctDelayBuffer+w*FRAME_LEN_SHORT+TRANSFORM_OFFSET_SHORT + FRAME_LEN_SHORT-1;
- outData0 = realOut + FRAME_LEN_SHORT/2;
- outData1 = realOut + FRAME_LEN_SHORT/2 - 1;
-
- winPtr = (int *)ShortWindowSine;
- for(i=0;i<FRAME_LEN_SHORT/2;i++){
- timeSignalSample= *dctIn0 << minSf;
- ws1 = timeSignalSample * (*winPtr >> 16);
- timeSignalSample= *dctIn1 << minSf;
- ws2 = timeSignalSample * (*winPtr & 0xffff);
- *outData0++ = (ws1 >> 2) - (ws2 >> 2); /* shift 2 to avoid overflow next */
-
- timeSignalSample= *(dctIn0 + FRAME_LEN_SHORT) << minSf;
- ws1 = timeSignalSample * (*winPtr & 0xffff);
- timeSignalSample= *(dctIn1 + FRAME_LEN_SHORT) << minSf;
- ws2 = timeSignalSample * (*winPtr >> 16);
- *outData1-- = -((ws1 >> 2) + (ws2 >> 2)); /* shift 2 to avoid overflow next */
-
- winPtr++;
- dctIn0++;
- dctIn1--;
- }
-
- Mdct_Short(realOut);
- realOut += FRAME_LEN_SHORT;
- }
-
- minSf = 11 - minSf;
- *mdctScale = minSf; /* update scale factor */
-
- shiftMdctDelayBuffer(mdctDelayBuffer,timeSignal,chIncrement);
- break;
- }
-}
-
diff --git a/media/libstagefright/codecs/amrwbenc/Android.bp b/media/libstagefright/codecs/amrwbenc/Android.bp
index 5c5a122..eb27388 100644
--- a/media/libstagefright/codecs/amrwbenc/Android.bp
+++ b/media/libstagefright/codecs/amrwbenc/Android.bp
@@ -75,7 +75,7 @@
instruction_set: "arm",
- armv7_a_neon: {
+ neon: {
exclude_srcs: [
"src/asm/ARMV5E/convolve_opt.s",
"src/asm/ARMV5E/cor_h_vec_opt.s",
diff --git a/media/libstagefright/codecs/on2/h264dec/Android.bp b/media/libstagefright/codecs/on2/h264dec/Android.bp
index 95c2075..6d558b6 100644
--- a/media/libstagefright/codecs/on2/h264dec/Android.bp
+++ b/media/libstagefright/codecs/on2/h264dec/Android.bp
@@ -35,7 +35,7 @@
arm: {
instruction_set: "arm",
- armv7_a_neon: {
+ neon: {
cflags: [
"-DH264DEC_NEON",
"-DH264DEC_OMXDL",
diff --git a/media/libstagefright/foundation/Android.bp b/media/libstagefright/foundation/Android.bp
index 91462c8..657f02c 100644
--- a/media/libstagefright/foundation/Android.bp
+++ b/media/libstagefright/foundation/Android.bp
@@ -1,7 +1,9 @@
cc_library_shared {
name: "libstagefright_foundation",
vendor_available: true,
-
+ vndk: {
+ enabled: true,
+ },
include_dirs: [
"frameworks/av/include",
"frameworks/native/include",
diff --git a/media/libstagefright/include/AACEncoder.h b/media/libstagefright/include/AACEncoder.h
deleted file mode 100644
index 462e905..0000000
--- a/media/libstagefright/include/AACEncoder.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef AAC_ENCODER_H
-#define AAC_ENCODER_H
-
-#include <media/stagefright/MediaSource.h>
-#include <media/stagefright/MetaData.h>
-
-struct VO_AUDIO_CODECAPI;
-struct VO_MEM_OPERATOR;
-
-namespace android {
-
-class MediaBufferGroup;
-
-class AACEncoder: public BnMediaSource {
- public:
- AACEncoder(const sp<IMediaSource> &source, const sp<MetaData> &meta);
-
- virtual status_t start(MetaData *params);
- virtual status_t stop();
- virtual sp<MetaData> getFormat();
- virtual status_t read(
- MediaBuffer **buffer, const ReadOptions *options);
-
-
- protected:
- virtual ~AACEncoder();
-
- private:
- sp<IMediaSource> mSource;
- sp<MetaData> mMeta;
- bool mStarted;
- MediaBufferGroup *mBufferGroup;
- MediaBuffer *mInputBuffer;
- status_t mInitCheck;
- int32_t mSampleRate;
- int32_t mChannels;
- int32_t mBitRate;
- int32_t mFrameCount;
-
- int64_t mAnchorTimeUs;
- int64_t mNumInputSamples;
-
- enum {
- kNumSamplesPerFrame = 1024,
- };
-
- int16_t *mInputFrame;
-
- uint8_t mAudioSpecificConfigData[2]; // auido specific data
- void *mEncoderHandle;
- VO_AUDIO_CODECAPI *mApiHandle;
- VO_MEM_OPERATOR *mMemOperator;
-
- status_t setAudioSpecificConfigData();
- status_t initCheck();
-
- AACEncoder& operator=(const AACEncoder &rhs);
- AACEncoder(const AACEncoder& copy);
-
-};
-
-}
-
-#endif //#ifndef AAC_ENCODER_H
-
diff --git a/media/libstagefright/include/MPEG4Extractor.h b/media/libstagefright/include/MPEG4Extractor.h
index f847119..1efe6b9 100644
--- a/media/libstagefright/include/MPEG4Extractor.h
+++ b/media/libstagefright/include/MPEG4Extractor.h
@@ -82,6 +82,9 @@
sp<SampleTable> sampleTable;
bool includes_expensive_metadata;
bool skipTrack;
+ bool has_elst;
+ int64_t elst_media_time;
+ uint64_t elst_segment_duration;
};
Vector<SidxEntry> mSidxEntries;
diff --git a/media/libstagefright/include/media/stagefright/DataUriSource.h b/media/libstagefright/include/media/stagefright/DataUriSource.h
deleted file mode 100644
index d223c06..0000000
--- a/media/libstagefright/include/media/stagefright/DataUriSource.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef DATA_URI_SOURCE_H_
-
-#define DATA_URI_SOURCE_H_
-
-#include <stdio.h>
-
-#include <media/stagefright/DataSource.h>
-#include <media/stagefright/MediaErrors.h>
-#include <media/stagefright/foundation/AString.h>
-
-namespace android {
-
-class DataUriSource : public DataSource {
-public:
- DataUriSource(const char *uri);
-
- virtual status_t initCheck() const {
- return mInited;
- }
-
- virtual ssize_t readAt(off64_t offset, void *data, size_t size);
-
- virtual status_t getSize(off64_t *size) {
- if (mInited != OK) {
- return mInited;
- }
-
- *size = mData.size();
- return OK;
- }
-
- virtual String8 getUri() {
- return mDataUri;
- }
-
- virtual String8 getMIMEType() const {
- return mMimeType;
- }
-
-protected:
- virtual ~DataUriSource() {
- // Nothing to delete.
- }
-
-private:
- const String8 mDataUri;
-
- String8 mMimeType;
- // Use AString because individual bytes may not be valid UTF8 chars.
- AString mData;
- status_t mInited;
-
- // Disallow copy and assign.
- DataUriSource(const DataUriSource &);
- DataUriSource &operator=(const DataUriSource &);
-};
-
-} // namespace android
-
-#endif // DATA_URI_SOURCE_H_
diff --git a/media/libstagefright/matroska/MatroskaExtractor.cpp b/media/libstagefright/matroska/MatroskaExtractor.cpp
index 813a257..4b38906 100644
--- a/media/libstagefright/matroska/MatroskaExtractor.cpp
+++ b/media/libstagefright/matroska/MatroskaExtractor.cpp
@@ -140,6 +140,7 @@
enum Type {
AVC,
AAC,
+ HEVC,
OTHER
};
@@ -148,7 +149,7 @@
Type mType;
bool mIsAudio;
BlockIterator mBlockIter;
- ssize_t mNALSizeLen; // for type AVC
+ ssize_t mNALSizeLen; // for type AVC or HEVC
List<MediaBuffer *> mPendingFrames;
@@ -244,6 +245,19 @@
} else {
ALOGE("No mNALSizeLen");
}
+ } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_HEVC)) {
+ mType = HEVC;
+
+ uint32_t dummy;
+ const uint8_t *hvcc;
+ size_t hvccSize;
+ if (meta->findData(kKeyHVCC, &dummy, (const void **)&hvcc, &hvccSize)
+ && hvccSize >= 22u) {
+ mNALSizeLen = 1 + (hvcc[14+7] & 3);
+ ALOGV("mNALSizeLen = %zu", mNALSizeLen);
+ } else {
+ ALOGE("No mNALSizeLen");
+ }
} else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
mType = AAC;
}
@@ -692,7 +706,7 @@
MediaBuffer *frame = *mPendingFrames.begin();
mPendingFrames.erase(mPendingFrames.begin());
- if (mType != AVC || mNALSizeLen == 0) {
+ if ((mType != AVC && mType != HEVC) || mNALSizeLen == 0) {
if (targetSampleTimeUs >= 0ll) {
frame->meta_data()->setInt64(
kKeyTargetTime, targetSampleTimeUs);
@@ -1293,6 +1307,14 @@
if (!strcmp("V_MPEG4/ISO/AVC", codecID)) {
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
meta->setData(kKeyAVCC, 0, codecPrivate, codecPrivateSize);
+ } else if (!strcmp("V_MPEGH/ISO/HEVC", codecID)) {
+ meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_HEVC);
+ if (codecPrivateSize > 0) {
+ meta->setData(kKeyHVCC, kTypeHVCC, codecPrivate, codecPrivateSize);
+ } else {
+ ALOGW("HEVC is detected, but does not have configuration.");
+ continue;
+ }
} else if (!strcmp("V_MPEG4/ISO/ASP", codecID)) {
if (codecPrivateSize > 0) {
meta->setCString(
diff --git a/media/libstagefright/omx/GraphicBufferSource.cpp b/media/libstagefright/omx/GraphicBufferSource.cpp
index ef4d745..d85ef89 100644
--- a/media/libstagefright/omx/GraphicBufferSource.cpp
+++ b/media/libstagefright/omx/GraphicBufferSource.cpp
@@ -956,28 +956,40 @@
Mutex::Autolock lock(mMutex);
uint64_t slotMask;
- if (mConsumer->getReleasedBuffers(&slotMask) != NO_ERROR) {
- ALOGW("onBuffersReleased: unable to get released buffer set");
+ uint64_t releaseMask;
+ if (mConsumer->getReleasedBuffers(&releaseMask) != NO_ERROR) {
slotMask = 0xffffffffffffffffULL;
+ ALOGW("onBuffersReleased: unable to get released buffer set");
+ } else {
+ slotMask = releaseMask;
+ ALOGV("onBuffersReleased: 0x%016" PRIx64, slotMask);
}
- ALOGV("onBuffersReleased: 0x%016" PRIx64, slotMask);
-
+ AString unpopulated;
for (int i = 0; i < BufferQueue::NUM_BUFFER_SLOTS; i++) {
if ((slotMask & 0x01) != 0) {
- discardBufferInSlot_l(i);
+ if (!discardBufferInSlot_l(i)) {
+ if (!unpopulated.empty()) {
+ unpopulated.append(", ");
+ }
+ unpopulated.append(i);
+ }
}
slotMask >>= 1;
}
+ if (!unpopulated.empty()) {
+ ALOGW("released unpopulated slots: [%s]", unpopulated.c_str());
+ }
}
-void GraphicBufferSource::discardBufferInSlot_l(GraphicBufferSource::slot_id i) {
+bool GraphicBufferSource::discardBufferInSlot_l(GraphicBufferSource::slot_id i) {
ssize_t bsi = mBufferSlots.indexOfKey(i);
if (bsi < 0) {
- ALOGW("releasing an unpopulated slot: %d", i);
+ return false;
} else {
discardBufferAtSlotIndex_l(bsi);
mBufferSlots.removeItemsAt(bsi);
+ return true;
}
}
diff --git a/media/libstagefright/omx/GraphicBufferSource.h b/media/libstagefright/omx/GraphicBufferSource.h
index 29b51a8..009691d 100644
--- a/media/libstagefright/omx/GraphicBufferSource.h
+++ b/media/libstagefright/omx/GraphicBufferSource.h
@@ -264,8 +264,8 @@
void onBufferAcquired_l(const VideoBuffer &buffer);
// marks the buffer at the slot no longer cached, and accounts for the outstanding
- // acquire count
- void discardBufferInSlot_l(slot_id i);
+ // acquire count. Returns true if the slot was populated; otherwise, false.
+ bool discardBufferInSlot_l(slot_id i);
// marks the buffer at the slot index no longer cached, and accounts for the outstanding
// acquire count
diff --git a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
index d89cb99..5bae7e8 100644
--- a/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
+++ b/media/libstagefright/omx/SimpleSoftOMXComponent.cpp
@@ -459,7 +459,12 @@
state = OMX_StateLoaded;
}
- CHECK_EQ((int)mState, (int)mTargetState);
+ if (mState != mTargetState) {
+ ALOGE("State change to state %d requested while still transitioning from state %d to %d",
+ state, mState, mTargetState);
+ notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
+ return;
+ }
switch (mState) {
case OMX_StateLoaded:
diff --git a/media/libstagefright/rtsp/ARTPSource.cpp b/media/libstagefright/rtsp/ARTPSource.cpp
index 576a0a4..4827cd2 100644
--- a/media/libstagefright/rtsp/ARTPSource.cpp
+++ b/media/libstagefright/rtsp/ARTPSource.cpp
@@ -43,7 +43,10 @@
const sp<AMessage> ¬ify)
: mID(id),
mHighestSeqNumber(0),
+ mPrevExpected(0),
+ mBaseSeqNumber(0),
mNumBuffersReceived(0),
+ mPrevNumBuffersReceived(0),
mLastNTPTime(0),
mLastNTPTimeUpdateUs(0),
mIssueFIRRequests(false),
@@ -107,6 +110,7 @@
if (mNumBuffersReceived++ == 0) {
mHighestSeqNumber = seqNum;
+ mBaseSeqNumber = seqNum;
mQueue.push_back(buffer);
return true;
}
@@ -226,6 +230,22 @@
return;
}
+ uint8_t fraction = 0;
+
+ // According to appendix A.3 in RFC 3550
+ uint32_t expected = mHighestSeqNumber - mBaseSeqNumber + 1;
+ int64_t intervalExpected = expected - mPrevExpected;
+ int64_t intervalReceived = mNumBuffersReceived - mPrevNumBuffersReceived;
+ int64_t intervalPacketLost = intervalExpected - intervalReceived;
+
+ if (intervalExpected > 0 && intervalPacketLost > 0) {
+ fraction = (intervalPacketLost << 8) / intervalExpected;
+ }
+
+ mPrevExpected = expected;
+ mPrevNumBuffersReceived = mNumBuffersReceived;
+ int32_t cumulativePacketLost = (int32_t)expected - mNumBuffersReceived;
+
uint8_t *data = buffer->data() + buffer->size();
data[0] = 0x80 | 1;
@@ -242,11 +262,11 @@
data[10] = (mID >> 8) & 0xff;
data[11] = mID & 0xff;
- data[12] = 0x00; // fraction lost
+ data[12] = fraction; // fraction lost
- data[13] = 0x00; // cumulative lost
- data[14] = 0x00;
- data[15] = 0x00;
+ data[13] = cumulativePacketLost >> 16; // cumulative lost
+ data[14] = (cumulativePacketLost >> 8) & 0xff;
+ data[15] = cumulativePacketLost & 0xff;
data[16] = mHighestSeqNumber >> 24;
data[17] = (mHighestSeqNumber >> 16) & 0xff;
diff --git a/media/libstagefright/rtsp/ARTPSource.h b/media/libstagefright/rtsp/ARTPSource.h
index b70f94e..f44e83f 100644
--- a/media/libstagefright/rtsp/ARTPSource.h
+++ b/media/libstagefright/rtsp/ARTPSource.h
@@ -49,7 +49,10 @@
private:
uint32_t mID;
uint32_t mHighestSeqNumber;
+ uint32_t mPrevExpected;
+ uint32_t mBaseSeqNumber;
int32_t mNumBuffersReceived;
+ int32_t mPrevNumBuffersReceived;
List<sp<ABuffer> > mQueue;
sp<ARTPAssembler> mAssembler;
diff --git a/media/mtp/Android.bp b/media/mtp/Android.bp
index 5d5ae49..543ad5c 100644
--- a/media/mtp/Android.bp
+++ b/media/mtp/Android.bp
@@ -17,13 +17,13 @@
cc_library_shared {
name: "libmtp",
srcs: [
- "AsyncIO.cpp",
"MtpDataPacket.cpp",
"MtpDebug.cpp",
"MtpDevHandle.cpp",
"MtpDevice.cpp",
"MtpDeviceInfo.cpp",
"MtpEventPacket.cpp",
+ "MtpFfsCompatHandle.cpp",
"MtpFfsHandle.cpp",
"MtpObjectInfo.cpp",
"MtpPacket.cpp",
@@ -35,6 +35,7 @@
"MtpStorageInfo.cpp",
"MtpStringBuffer.cpp",
"MtpUtils.cpp",
+ "PosixAsyncIO.cpp",
],
export_include_dirs: ["."],
cflags: [
@@ -45,6 +46,7 @@
"-Werror",
],
shared_libs: [
+ "libasyncio",
"libbase",
"libutils",
"liblog",
diff --git a/media/mtp/AsyncIO.cpp b/media/mtp/AsyncIO.cpp
deleted file mode 100644
index bfb07dc..0000000
--- a/media/mtp/AsyncIO.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <android-base/logging.h>
-#include <condition_variable>
-#include <memory>
-#include <mutex>
-#include <queue>
-
-#include "AsyncIO.h"
-
-namespace {
-
-void read_func(struct aiocb *aiocbp) {
- aiocbp->ret = TEMP_FAILURE_RETRY(pread(aiocbp->aio_fildes,
- aiocbp->aio_buf, aiocbp->aio_nbytes, aiocbp->aio_offset));
- if (aiocbp->ret == -1) aiocbp->error = errno;
-}
-
-void write_func(struct aiocb *aiocbp) {
- aiocbp->ret = TEMP_FAILURE_RETRY(pwrite(aiocbp->aio_fildes,
- aiocbp->aio_buf, aiocbp->aio_nbytes, aiocbp->aio_offset));
- if (aiocbp->ret == -1) aiocbp->error = errno;
-}
-
-void splice_read_func(struct aiocb *aiocbp) {
- loff_t long_offset = aiocbp->aio_offset;
- aiocbp->ret = TEMP_FAILURE_RETRY(splice(aiocbp->aio_fildes,
- &long_offset, aiocbp->aio_sink,
- NULL, aiocbp->aio_nbytes, 0));
- if (aiocbp->ret == -1) aiocbp->error = errno;
-}
-
-void splice_write_func(struct aiocb *aiocbp) {
- loff_t long_offset = aiocbp->aio_offset;
- aiocbp->ret = TEMP_FAILURE_RETRY(splice(aiocbp->aio_fildes, NULL,
- aiocbp->aio_sink, &long_offset,
- aiocbp->aio_nbytes, 0));
- if (aiocbp->ret == -1) aiocbp->error = errno;
-}
-
-std::queue<std::unique_ptr<struct aiocb>> queue;
-std::mutex queue_lock;
-std::condition_variable queue_cond;
-std::condition_variable write_cond;
-int done = 1;
-void splice_write_pool_func(int) {
- while(1) {
- std::unique_lock<std::mutex> lk(queue_lock);
- queue_cond.wait(lk, []{return !queue.empty() || done;});
- if (queue.empty() && done) {
- return;
- }
- std::unique_ptr<struct aiocb> aiocbp = std::move(queue.front());
- queue.pop();
- lk.unlock();
- write_cond.notify_one();
- splice_write_func(aiocbp.get());
- close(aiocbp->aio_fildes);
- }
-}
-
-void write_pool_func(int) {
- while(1) {
- std::unique_lock<std::mutex> lk(queue_lock);
- queue_cond.wait(lk, []{return !queue.empty() || done;});
- if (queue.empty() && done) {
- return;
- }
- std::unique_ptr<struct aiocb> aiocbp = std::move(queue.front());
- queue.pop();
- lk.unlock();
- write_cond.notify_one();
- aiocbp->ret = TEMP_FAILURE_RETRY(pwrite(aiocbp->aio_fildes,
- aiocbp->aio_pool_buf.get(), aiocbp->aio_nbytes, aiocbp->aio_offset));
- if (aiocbp->ret == -1) aiocbp->error = errno;
- }
-}
-
-constexpr int NUM_THREADS = 1;
-constexpr int MAX_QUEUE_SIZE = 10;
-std::thread pool[NUM_THREADS];
-
-} // end anonymous namespace
-
-aiocb::~aiocb() {
- CHECK(!thread.joinable());
-}
-
-void aio_pool_init(void(f)(int)) {
- CHECK(done == 1);
- done = 0;
- for (int i = 0; i < NUM_THREADS; i++) {
- pool[i] = std::thread(f, i);
- }
-}
-
-void aio_pool_splice_init() {
- aio_pool_init(splice_write_pool_func);
-}
-
-void aio_pool_write_init() {
- aio_pool_init(write_pool_func);
-}
-
-void aio_pool_end() {
- done = 1;
- for (int i = 0; i < NUM_THREADS; i++) {
- std::unique_lock<std::mutex> lk(queue_lock);
- lk.unlock();
- queue_cond.notify_one();
- }
-
- for (int i = 0; i < NUM_THREADS; i++) {
- pool[i].join();
- }
-}
-
-// used for both writes and splices depending on which init was used before.
-int aio_pool_write(struct aiocb *aiocbp) {
- std::unique_lock<std::mutex> lk(queue_lock);
- write_cond.wait(lk, []{return queue.size() < MAX_QUEUE_SIZE;});
- queue.push(std::unique_ptr<struct aiocb>(aiocbp));
- lk.unlock();
- queue_cond.notify_one();
- return 0;
-}
-
-int aio_read(struct aiocb *aiocbp) {
- aiocbp->thread = std::thread(read_func, aiocbp);
- return 0;
-}
-
-int aio_write(struct aiocb *aiocbp) {
- aiocbp->thread = std::thread(write_func, aiocbp);
- return 0;
-}
-
-int aio_splice_read(struct aiocb *aiocbp) {
- aiocbp->thread = std::thread(splice_read_func, aiocbp);
- return 0;
-}
-
-int aio_splice_write(struct aiocb *aiocbp) {
- aiocbp->thread = std::thread(splice_write_func, aiocbp);
- return 0;
-}
-
-int aio_error(const struct aiocb *aiocbp) {
- return aiocbp->error;
-}
-
-ssize_t aio_return(struct aiocb *aiocbp) {
- return aiocbp->ret;
-}
-
-int aio_suspend(struct aiocb *aiocbp[], int n,
- const struct timespec *) {
- for (int i = 0; i < n; i++) {
- aiocbp[i]->thread.join();
- }
- return 0;
-}
-
-int aio_cancel(int, struct aiocb *) {
- // Not implemented
- return -1;
-}
-
diff --git a/media/mtp/AsyncIO.h b/media/mtp/AsyncIO.h
deleted file mode 100644
index ed80828..0000000
--- a/media/mtp/AsyncIO.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _ASYNCIO_H
-#define _ASYNCIO_H
-
-#include <fcntl.h>
-#include <linux/aio_abi.h>
-#include <memory>
-#include <signal.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <time.h>
-#include <thread>
-#include <unistd.h>
-
-/**
- * Provides a subset of POSIX aio operations, as well
- * as similar operations with splice and threadpools.
- */
-
-struct aiocb {
- int aio_fildes; // Assumed to be the source for splices
- void *aio_buf; // Unused for splices
-
- // Used for threadpool operations only, freed automatically
- std::unique_ptr<char[]> aio_pool_buf;
-
- off_t aio_offset;
- size_t aio_nbytes;
-
- int aio_sink; // Unused for non splice r/w
-
- // Used internally
- std::thread thread;
- ssize_t ret;
- int error;
-
- ~aiocb();
-};
-
-// Submit a request for IO to be completed
-int aio_read(struct aiocb *);
-int aio_write(struct aiocb *);
-int aio_splice_read(struct aiocb *);
-int aio_splice_write(struct aiocb *);
-
-// Suspend current thread until given IO is complete, at which point
-// its return value and any errors can be accessed
-// All submitted requests must have a corresponding suspend.
-// aiocb->aio_buf must refer to valid memory until after the suspend call
-int aio_suspend(struct aiocb *[], int, const struct timespec *);
-int aio_error(const struct aiocb *);
-ssize_t aio_return(struct aiocb *);
-
-// (Currently unimplemented)
-int aio_cancel(int, struct aiocb *);
-
-// Initialize a threadpool to perform IO. Only one pool can be
-// running at a time.
-void aio_pool_write_init();
-void aio_pool_splice_init();
-// Suspend current thread until all queued work is complete, then ends the threadpool
-void aio_pool_end();
-// Submit IO work for the threadpool to complete. Memory associated with the work is
-// freed automatically when the work is complete.
-int aio_pool_write(struct aiocb *);
-
-#endif // ASYNCIO_H
-
diff --git a/media/mtp/IMtpHandle.h b/media/mtp/IMtpHandle.h
index 0557596..c65bdd0 100644
--- a/media/mtp/IMtpHandle.h
+++ b/media/mtp/IMtpHandle.h
@@ -18,13 +18,13 @@
#include <linux/usb/f_mtp.h>
-constexpr char FFS_MTP_EP0[] = "/dev/usb-ffs/mtp/ep0";
+namespace android {
class IMtpHandle {
public:
// Return number of bytes read/written, or -1 and errno is set
- virtual int read(void *data, int len) = 0;
- virtual int write(const void *data, int len) = 0;
+ virtual int read(void *data, size_t len) = 0;
+ virtual int write(const void *data, size_t len) = 0;
// Return 0 if send/receive is successful, or -1 and errno is set
virtual int receiveFile(mtp_file_range mfr, bool zero_packet) = 0;
@@ -40,8 +40,7 @@
virtual ~IMtpHandle() {}
};
-IMtpHandle *get_ffs_handle();
-IMtpHandle *get_mtp_handle();
+}
#endif // _IMTP_HANDLE_H
diff --git a/media/mtp/MtpDataPacket.h b/media/mtp/MtpDataPacket.h
index a449d6f..1ddb821 100644
--- a/media/mtp/MtpDataPacket.h
+++ b/media/mtp/MtpDataPacket.h
@@ -20,12 +20,12 @@
#include "MtpPacket.h"
#include "mtp.h"
-class IMtpHandle;
struct usb_device;
struct usb_request;
namespace android {
+class IMtpHandle;
class MtpStringBuffer;
class MtpDataPacket : public MtpPacket {
diff --git a/media/mtp/MtpDatabase.h b/media/mtp/MtpDatabase.h
index 4e6ac7a..c7021df 100644
--- a/media/mtp/MtpDatabase.h
+++ b/media/mtp/MtpDatabase.h
@@ -103,6 +103,9 @@
virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property) = 0;
+ virtual MtpResponseCode moveObject(MtpObjectHandle handle, MtpObjectHandle newParent,
+ MtpString& newPath) = 0;
+
virtual void sessionStarted() = 0;
virtual void sessionEnded() = 0;
diff --git a/media/mtp/MtpDevHandle.cpp b/media/mtp/MtpDevHandle.cpp
index 9aa0aec..6aa57ac 100644
--- a/media/mtp/MtpDevHandle.cpp
+++ b/media/mtp/MtpDevHandle.cpp
@@ -14,57 +14,37 @@
* limitations under the License.
*/
-#include <utils/Log.h>
-#include <fcntl.h>
-#include <sys/stat.h>
+#include <android-base/logging.h>
#include <cutils/properties.h>
#include <dirent.h>
#include <errno.h>
+#include <fcntl.h>
#include <linux/usb/ch9.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/endian.h>
#include <unistd.h>
-#include <android-base/logging.h>
-#include <android-base/unique_fd.h>
-#include "IMtpHandle.h"
+#include "MtpDevHandle.h"
+
+namespace android {
constexpr char mtp_dev_path[] = "/dev/mtp_usb";
-class MtpDevHandle : public IMtpHandle {
-private:
- android::base::unique_fd mFd;
-
-public:
- MtpDevHandle();
- ~MtpDevHandle();
- int read(void *data, int len);
- int write(const void *data, int len);
-
- int receiveFile(mtp_file_range mfr, bool);
- int sendFile(mtp_file_range mfr);
- int sendEvent(mtp_event me);
-
- int start();
- void close();
-
- int configure(bool ptp);
-};
-
MtpDevHandle::MtpDevHandle()
: mFd(-1) {};
MtpDevHandle::~MtpDevHandle() {}
-int MtpDevHandle::read(void *data, int len) {
+int MtpDevHandle::read(void *data, size_t len) {
return ::read(mFd, data, len);
}
-int MtpDevHandle::write(const void *data, int len) {
+int MtpDevHandle::write(const void *data, size_t len) {
return ::write(mFd, data, len);
}
@@ -81,7 +61,7 @@
}
int MtpDevHandle::start() {
- mFd = android::base::unique_fd(TEMP_FAILURE_RETRY(open(mtp_dev_path, O_RDWR)));
+ mFd.reset(TEMP_FAILURE_RETRY(open(mtp_dev_path, O_RDWR)));
if (mFd == -1) return -1;
return 0;
}
@@ -95,6 +75,4 @@
return 0;
}
-IMtpHandle *get_mtp_handle() {
- return new MtpDevHandle();
-}
+} // namespace android
diff --git a/media/mtp/MtpDevHandle.h b/media/mtp/MtpDevHandle.h
new file mode 100644
index 0000000..b0480ed
--- /dev/null
+++ b/media/mtp/MtpDevHandle.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _MTP_DEV_HANDLE_H
+#define _MTP_DEV_HANDLE_H
+
+#include <android-base/unique_fd.h>
+#include "IMtpHandle.h"
+
+namespace android {
+
+class MtpDevHandle : public IMtpHandle {
+private:
+ android::base::unique_fd mFd;
+
+public:
+ MtpDevHandle();
+ ~MtpDevHandle();
+ int read(void *data, size_t len);
+ int write(const void *data, size_t len);
+
+ int receiveFile(mtp_file_range mfr, bool);
+ int sendFile(mtp_file_range mfr);
+ int sendEvent(mtp_event me);
+
+ int start();
+ void close();
+
+ int configure(bool ptp);
+};
+
+} // namespace android
+
+#endif // _MTP_FFS_HANDLE_H
diff --git a/media/mtp/MtpFfsCompatHandle.cpp b/media/mtp/MtpFfsCompatHandle.cpp
new file mode 100644
index 0000000..3dd73f3
--- /dev/null
+++ b/media/mtp/MtpFfsCompatHandle.cpp
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <android-base/properties.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <linux/usb/ch9.h>
+#include <linux/usb/functionfs.h>
+#include <mutex>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/endian.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "PosixAsyncIO.h"
+#include "MtpFfsCompatHandle.h"
+#include "mtp.h"
+
+#define FUNCTIONFS_ENDPOINT_ALLOC _IOR('g', 231, __u32)
+
+namespace {
+
+// Must be divisible by all max packet size values
+constexpr int MAX_FILE_CHUNK_SIZE = 3145728;
+
+// Safe values since some devices cannot handle large DMAs
+// To get good performance, override these with
+// higher values per device using the properties
+// sys.usb.ffs.max_read and sys.usb.ffs.max_write
+constexpr int USB_FFS_MAX_WRITE = MTP_BUFFER_SIZE;
+constexpr int USB_FFS_MAX_READ = MTP_BUFFER_SIZE;
+
+static_assert(USB_FFS_MAX_WRITE > 0, "Max r/w values must be > 0!");
+static_assert(USB_FFS_MAX_READ > 0, "Max r/w values must be > 0!");
+
+constexpr unsigned int MAX_MTP_FILE_SIZE = 0xFFFFFFFF;
+
+constexpr size_t ENDPOINT_ALLOC_RETRIES = 10;
+
+} // anonymous namespace
+
+namespace android {
+
+MtpFfsCompatHandle::MtpFfsCompatHandle() :
+ mMaxWrite(USB_FFS_MAX_WRITE),
+ mMaxRead(USB_FFS_MAX_READ) {}
+
+MtpFfsCompatHandle::~MtpFfsCompatHandle() {}
+
+int MtpFfsCompatHandle::writeHandle(int fd, const void* data, size_t len) {
+ int ret = 0;
+ const char* buf = static_cast<const char*>(data);
+ while (len > 0) {
+ int write_len = std::min(mMaxWrite, len);
+ int n = TEMP_FAILURE_RETRY(::write(fd, buf, write_len));
+
+ if (n < 0) {
+ PLOG(ERROR) << "write ERROR: fd = " << fd << ", n = " << n;
+ return -1;
+ } else if (n < write_len) {
+ errno = EIO;
+ PLOG(ERROR) << "less written than expected";
+ return -1;
+ }
+ buf += n;
+ len -= n;
+ ret += n;
+ }
+ return ret;
+}
+
+int MtpFfsCompatHandle::readHandle(int fd, void* data, size_t len) {
+ int ret = 0;
+ char* buf = static_cast<char*>(data);
+ while (len > 0) {
+ int read_len = std::min(mMaxRead, len);
+ int n = TEMP_FAILURE_RETRY(::read(fd, buf, read_len));
+ if (n < 0) {
+ PLOG(ERROR) << "read ERROR: fd = " << fd << ", n = " << n;
+ return -1;
+ }
+ ret += n;
+ if (n < read_len) // done reading early
+ break;
+ buf += n;
+ len -= n;
+ }
+ return ret;
+}
+
+int MtpFfsCompatHandle::start() {
+ mLock.lock();
+
+ if (!openEndpoints())
+ return -1;
+
+ for (unsigned i = 0; i < NUM_IO_BUFS; i++) {
+ mIobuf[i].bufs.resize(MAX_FILE_CHUNK_SIZE);
+ posix_madvise(mIobuf[i].bufs.data(), MAX_FILE_CHUNK_SIZE,
+ POSIX_MADV_SEQUENTIAL | POSIX_MADV_WILLNEED);
+ }
+
+ // Get device specific r/w size
+ mMaxWrite = android::base::GetIntProperty("sys.usb.ffs.max_write", USB_FFS_MAX_WRITE);
+ mMaxRead = android::base::GetIntProperty("sys.usb.ffs.max_read", USB_FFS_MAX_READ);
+
+ size_t attempts = 0;
+ while (mMaxWrite >= USB_FFS_MAX_WRITE && mMaxRead >= USB_FFS_MAX_READ &&
+ attempts < ENDPOINT_ALLOC_RETRIES) {
+ // If larger contiguous chunks of memory aren't available, attempt to try
+ // smaller allocations.
+ if (ioctl(mBulkIn, FUNCTIONFS_ENDPOINT_ALLOC, static_cast<__u32>(mMaxWrite)) ||
+ ioctl(mBulkOut, FUNCTIONFS_ENDPOINT_ALLOC, static_cast<__u32>(mMaxRead))) {
+ if (errno == ENODEV) {
+ // Driver hasn't enabled endpoints yet.
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ attempts += 1;
+ continue;
+ }
+ mMaxWrite /= 2;
+ mMaxRead /=2;
+ } else {
+ return 0;
+ }
+ }
+ // Try to start MtpServer anyway, with the smallest max r/w values
+ mMaxWrite = USB_FFS_MAX_WRITE;
+ mMaxRead = USB_FFS_MAX_READ;
+ PLOG(ERROR) << "Functionfs could not allocate any memory!";
+ return 0;
+}
+
+int MtpFfsCompatHandle::read(void* data, size_t len) {
+ return readHandle(mBulkOut, data, len);
+}
+
+int MtpFfsCompatHandle::write(const void* data, size_t len) {
+ return writeHandle(mBulkIn, data, len);
+}
+
+int MtpFfsCompatHandle::receiveFile(mtp_file_range mfr, bool zero_packet) {
+ // When receiving files, the incoming length is given in 32 bits.
+ // A >4G file is given as 0xFFFFFFFF
+ uint32_t file_length = mfr.length;
+ uint64_t offset = mfr.offset;
+ int packet_size = getPacketSize(mBulkOut);
+
+ unsigned char *data = mIobuf[0].bufs.data();
+ unsigned char *data2 = mIobuf[1].bufs.data();
+
+ struct aiocb aio;
+ aio.aio_fildes = mfr.fd;
+ aio.aio_buf = nullptr;
+ struct aiocb *aiol[] = {&aio};
+ int ret = -1;
+ size_t length;
+ bool read = false;
+ bool write = false;
+
+ posix_fadvise(mfr.fd, 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE);
+
+ // Break down the file into pieces that fit in buffers
+ while (file_length > 0 || write) {
+ if (file_length > 0) {
+ length = std::min(static_cast<uint32_t>(MAX_FILE_CHUNK_SIZE), file_length);
+
+ // Read data from USB, handle errors after waiting for write thread.
+ ret = readHandle(mBulkOut, data, length);
+
+ if (file_length != MAX_MTP_FILE_SIZE && ret < static_cast<int>(length)) {
+ ret = -1;
+ errno = EIO;
+ }
+ read = true;
+ }
+
+ if (write) {
+ // get the return status of the last write request
+ aio_suspend(aiol, 1, nullptr);
+
+ int written = aio_return(&aio);
+ if (written == -1) {
+ errno = aio_error(&aio);
+ return -1;
+ }
+ if (static_cast<size_t>(written) < aio.aio_nbytes) {
+ errno = EIO;
+ return -1;
+ }
+ write = false;
+ }
+
+ // If there was an error reading above
+ if (ret == -1) {
+ return -1;
+ }
+
+ if (read) {
+ if (file_length == MAX_MTP_FILE_SIZE) {
+ // For larger files, receive until a short packet is received.
+ if (static_cast<size_t>(ret) < length) {
+ file_length = 0;
+ }
+ } else {
+ file_length -= ret;
+ }
+ // Enqueue a new write request
+ aio_prepare(&aio, data, length, offset);
+ aio_write(&aio);
+
+ offset += ret;
+ std::swap(data, data2);
+
+ write = true;
+ read = false;
+ }
+ }
+ // Receive an empty packet if size is a multiple of the endpoint size.
+ if (ret % packet_size == 0 || zero_packet) {
+ if (TEMP_FAILURE_RETRY(::read(mBulkOut, data, packet_size)) != 0) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int MtpFfsCompatHandle::sendFile(mtp_file_range mfr) {
+ uint64_t file_length = mfr.length;
+ uint32_t given_length = std::min(static_cast<uint64_t>(MAX_MTP_FILE_SIZE),
+ file_length + sizeof(mtp_data_header));
+ uint64_t offset = mfr.offset;
+ int packet_size = getPacketSize(mBulkIn);
+
+ // If file_length is larger than a size_t, truncating would produce the wrong comparison.
+ // Instead, promote the left side to 64 bits, then truncate the small result.
+ int init_read_len = std::min(
+ static_cast<uint64_t>(packet_size - sizeof(mtp_data_header)), file_length);
+
+ unsigned char *data = mIobuf[0].bufs.data();
+ unsigned char *data2 = mIobuf[1].bufs.data();
+
+ posix_fadvise(mfr.fd, 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE);
+
+ struct aiocb aio;
+ aio.aio_fildes = mfr.fd;
+ struct aiocb *aiol[] = {&aio};
+ int ret, length;
+ int error = 0;
+ bool read = false;
+ bool write = false;
+
+ // Send the header data
+ mtp_data_header *header = reinterpret_cast<mtp_data_header*>(data);
+ header->length = htole32(given_length);
+ header->type = htole16(2); /* data packet */
+ header->command = htole16(mfr.command);
+ header->transaction_id = htole32(mfr.transaction_id);
+
+ // Some hosts don't support header/data separation even though MTP allows it
+ // Handle by filling first packet with initial file data
+ if (TEMP_FAILURE_RETRY(pread(mfr.fd, reinterpret_cast<char*>(data) +
+ sizeof(mtp_data_header), init_read_len, offset))
+ != init_read_len) return -1;
+ if (writeHandle(mBulkIn, data, sizeof(mtp_data_header) + init_read_len) == -1) return -1;
+ file_length -= init_read_len;
+ offset += init_read_len;
+ ret = init_read_len + sizeof(mtp_data_header);
+
+ // Break down the file into pieces that fit in buffers
+ while (file_length > 0) {
+ if (read) {
+ // Wait for the previous read to finish
+ aio_suspend(aiol, 1, nullptr);
+ ret = aio_return(&aio);
+ if (ret == -1) {
+ errno = aio_error(&aio);
+ return -1;
+ }
+ if (static_cast<size_t>(ret) < aio.aio_nbytes) {
+ errno = EIO;
+ return -1;
+ }
+
+ file_length -= ret;
+ offset += ret;
+ std::swap(data, data2);
+ read = false;
+ write = true;
+ }
+
+ if (error == -1) {
+ return -1;
+ }
+
+ if (file_length > 0) {
+ length = std::min(static_cast<uint64_t>(MAX_FILE_CHUNK_SIZE), file_length);
+ // Queue up another read
+ aio_prepare(&aio, data, length, offset);
+ aio_read(&aio);
+ read = true;
+ }
+
+ if (write) {
+ if (writeHandle(mBulkIn, data2, ret) == -1) {
+ error = -1;
+ }
+ write = false;
+ }
+ }
+
+ if (ret % packet_size == 0) {
+ // If the last packet wasn't short, send a final empty packet
+ if (TEMP_FAILURE_RETRY(::write(mBulkIn, data, 0)) != 0) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+} // namespace android
+
diff --git a/media/mtp/MtpFfsCompatHandle.h b/media/mtp/MtpFfsCompatHandle.h
new file mode 100644
index 0000000..cd61482
--- /dev/null
+++ b/media/mtp/MtpFfsCompatHandle.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _MTP_FFS_COMPAT_HANDLE_H
+#define _MTP_FFS_COMPAT_HANDLE_H
+
+#include <MtpFfsHandle.h>
+
+namespace android {
+
+template <class T> class MtpFfsHandleTest;
+
+class MtpFfsCompatHandle : public MtpFfsHandle {
+ template <class T> friend class android::MtpFfsHandleTest;
+private:
+ int writeHandle(int fd, const void *data, size_t len);
+ int readHandle(int fd, void *data, size_t len);
+
+ size_t mMaxWrite;
+ size_t mMaxRead;
+
+public:
+ int read(void* data, size_t len) override;
+ int write(const void* data, size_t len) override;
+ int receiveFile(mtp_file_range mfr, bool zero_packet) override;
+ int sendFile(mtp_file_range mfr) override;
+
+ /**
+ * Open ffs endpoints and allocate necessary kernel and user memory.
+ * Will sleep until endpoints are enabled, for up to 1 second.
+ */
+ int start() override;
+
+ MtpFfsCompatHandle();
+ ~MtpFfsCompatHandle();
+};
+
+} // namespace android
+
+#endif // _MTP_FFS_COMPAT_HANDLE_H
+
diff --git a/media/mtp/MtpFfsHandle.cpp b/media/mtp/MtpFfsHandle.cpp
index c50af2f..965985d 100644
--- a/media/mtp/MtpFfsHandle.cpp
+++ b/media/mtp/MtpFfsHandle.cpp
@@ -16,32 +16,29 @@
#include <android-base/logging.h>
#include <android-base/properties.h>
+#include <asyncio/AsyncIO.h>
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/usb/ch9.h>
#include <linux/usb/functionfs.h>
-#include <mutex>
+#include <memory>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/endian.h>
+#include <sys/eventfd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
+#include <sys/poll.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
-#include <vector>
-#include "AsyncIO.h"
+#include "PosixAsyncIO.h"
#include "MtpFfsHandle.h"
#include "mtp.h"
-#define cpu_to_le16(x) htole16(x)
-#define cpu_to_le32(x) htole32(x)
-
-#define FUNCTIONFS_ENDPOINT_ALLOC _IOR('g', 231, __u32)
-
namespace {
constexpr char FFS_MTP_EP_IN[] = "/dev/usb-ffs/mtp/ep1";
@@ -51,23 +48,18 @@
constexpr int MAX_PACKET_SIZE_FS = 64;
constexpr int MAX_PACKET_SIZE_HS = 512;
constexpr int MAX_PACKET_SIZE_SS = 1024;
+constexpr int MAX_PACKET_SIZE_EV = 28;
-// Must be divisible by all max packet size values
-constexpr int MAX_FILE_CHUNK_SIZE = 3145728;
+constexpr unsigned AIO_BUFS_MAX = 128;
+constexpr unsigned AIO_BUF_LEN = 16384;
-// Safe values since some devices cannot handle large DMAs
-// To get good performance, override these with
-// higher values per device using the properties
-// sys.usb.ffs.max_read and sys.usb.ffs.max_write
-constexpr int USB_FFS_MAX_WRITE = MTP_BUFFER_SIZE;
-constexpr int USB_FFS_MAX_READ = MTP_BUFFER_SIZE;
+constexpr unsigned FFS_NUM_EVENTS = 5;
-static_assert(USB_FFS_MAX_WRITE > 0, "Max r/w values must be > 0!");
-static_assert(USB_FFS_MAX_READ > 0, "Max r/w values must be > 0!");
+constexpr unsigned MAX_FILE_CHUNK_SIZE = AIO_BUFS_MAX * AIO_BUF_LEN;
-constexpr unsigned int MAX_MTP_FILE_SIZE = 0xFFFFFFFF;
+constexpr uint32_t MAX_MTP_FILE_SIZE = 0xFFFFFFFF;
-constexpr size_t ENDPOINT_ALLOC_RETRIES = 10;
+struct timespec ZERO_TIMEOUT = { 0, 0 };
struct func_desc {
struct usb_interface_descriptor intf;
@@ -102,8 +94,11 @@
__le32 fs_count;
__le32 hs_count;
__le32 ss_count;
+ __le32 os_count;
struct func_desc fs_descs, hs_descs;
struct ss_func_desc ss_descs;
+ struct usb_os_desc_header os_header;
+ struct usb_ext_compat_desc os_desc;
} __attribute__((packed));
const struct usb_interface_descriptor mtp_interface_desc = {
@@ -143,12 +138,12 @@
.wMaxPacketSize = MAX_PACKET_SIZE_FS,
};
-const struct usb_endpoint_descriptor_no_audio fs_intr = {
+const struct usb_endpoint_descriptor_no_audio intr = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
.bEndpointAddress = 3 | USB_DIR_IN,
.bmAttributes = USB_ENDPOINT_XFER_INT,
- .wMaxPacketSize = MAX_PACKET_SIZE_FS,
+ .wMaxPacketSize = MAX_PACKET_SIZE_EV,
.bInterval = 6,
};
@@ -168,15 +163,6 @@
.wMaxPacketSize = MAX_PACKET_SIZE_HS,
};
-const struct usb_endpoint_descriptor_no_audio hs_intr = {
- .bLength = USB_DT_ENDPOINT_SIZE,
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = 3 | USB_DIR_IN,
- .bmAttributes = USB_ENDPOINT_XFER_INT,
- .wMaxPacketSize = MAX_PACKET_SIZE_HS,
- .bInterval = 6,
-};
-
const struct usb_endpoint_descriptor_no_audio ss_sink = {
.bLength = USB_DT_ENDPOINT_SIZE,
.bDescriptorType = USB_DT_ENDPOINT,
@@ -193,15 +179,6 @@
.wMaxPacketSize = MAX_PACKET_SIZE_SS,
};
-const struct usb_endpoint_descriptor_no_audio ss_intr = {
- .bLength = USB_DT_ENDPOINT_SIZE,
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = 3 | USB_DIR_IN,
- .bmAttributes = USB_ENDPOINT_XFER_INT,
- .wMaxPacketSize = MAX_PACKET_SIZE_SS,
- .bInterval = 6,
-};
-
const struct usb_ss_ep_comp_descriptor ss_sink_comp = {
.bLength = sizeof(ss_sink_comp),
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
@@ -223,14 +200,14 @@
.intf = mtp_interface_desc,
.sink = fs_sink,
.source = fs_source,
- .intr = fs_intr,
+ .intr = intr,
};
const struct func_desc mtp_hs_descriptors = {
.intf = mtp_interface_desc,
.sink = hs_sink,
.source = hs_source,
- .intr = hs_intr,
+ .intr = intr,
};
const struct ss_func_desc mtp_ss_descriptors = {
@@ -239,7 +216,7 @@
.sink_comp = ss_sink_comp,
.source = ss_source,
.source_comp = ss_source_comp,
- .intr = ss_intr,
+ .intr = intr,
.intr_comp = ss_intr_comp,
};
@@ -247,14 +224,14 @@
.intf = ptp_interface_desc,
.sink = fs_sink,
.source = fs_source,
- .intr = fs_intr,
+ .intr = intr,
};
const struct func_desc ptp_hs_descriptors = {
.intf = ptp_interface_desc,
.sink = hs_sink,
.source = hs_source,
- .intr = hs_intr,
+ .intr = intr,
};
const struct ss_func_desc ptp_ss_descriptors = {
@@ -263,7 +240,7 @@
.sink_comp = ss_sink_comp,
.source = ss_source,
.source_comp = ss_source_comp,
- .intr = ss_intr,
+ .intr = intr,
.intr_comp = ss_intr_comp,
};
@@ -276,24 +253,62 @@
} __attribute__((packed)) lang0;
} __attribute__((packed)) strings = {
.header = {
- .magic = cpu_to_le32(FUNCTIONFS_STRINGS_MAGIC),
- .length = cpu_to_le32(sizeof(strings)),
- .str_count = cpu_to_le32(1),
- .lang_count = cpu_to_le32(1),
+ .magic = htole32(FUNCTIONFS_STRINGS_MAGIC),
+ .length = htole32(sizeof(strings)),
+ .str_count = htole32(1),
+ .lang_count = htole32(1),
},
.lang0 = {
- .code = cpu_to_le16(0x0409),
+ .code = htole16(0x0409),
.str1 = STR_INTERFACE,
},
};
+struct usb_os_desc_header mtp_os_desc_header = {
+ .interface = htole32(1),
+ .dwLength = htole32(sizeof(usb_os_desc_header) + sizeof(usb_ext_compat_desc)),
+ .bcdVersion = htole16(1),
+ .wIndex = htole16(4),
+ .bCount = htole16(1),
+ .Reserved = htole16(0),
+};
+
+struct usb_ext_compat_desc mtp_os_desc_compat = {
+ .bFirstInterfaceNumber = 0,
+ .Reserved1 = htole32(1),
+ .CompatibleID = { 'M', 'T', 'P' },
+ .SubCompatibleID = {0},
+ .Reserved2 = {0},
+};
+
+struct usb_ext_compat_desc ptp_os_desc_compat = {
+ .bFirstInterfaceNumber = 0,
+ .Reserved1 = htole32(1),
+ .CompatibleID = { 'P', 'T', 'P' },
+ .SubCompatibleID = {0},
+ .Reserved2 = {0},
+};
+
+struct mtp_device_status {
+ uint16_t wLength;
+ uint16_t wCode;
+};
+
} // anonymous namespace
namespace android {
-MtpFfsHandle::MtpFfsHandle() :
- mMaxWrite(USB_FFS_MAX_WRITE),
- mMaxRead(USB_FFS_MAX_READ) {}
+int MtpFfsHandle::getPacketSize(int ffs_fd) {
+ struct usb_endpoint_descriptor desc;
+ if (ioctl(ffs_fd, FUNCTIONFS_ENDPOINT_DESC, reinterpret_cast<unsigned long>(&desc))) {
+ PLOG(ERROR) << "Could not get FFS bulk-in descriptor";
+ return MAX_PACKET_SIZE_HS;
+ } else {
+ return desc.wMaxPacketSize;
+ }
+}
+
+MtpFfsHandle::MtpFfsHandle() {}
MtpFfsHandle::~MtpFfsHandle() {}
@@ -303,21 +318,62 @@
mBulkOut.reset();
}
+bool MtpFfsHandle::openEndpoints() {
+ if (mBulkIn < 0) {
+ mBulkIn.reset(TEMP_FAILURE_RETRY(open(FFS_MTP_EP_IN, O_RDWR)));
+ if (mBulkIn < 0) {
+ PLOG(ERROR) << FFS_MTP_EP_IN << ": cannot open bulk in ep";
+ return false;
+ }
+ }
+
+ if (mBulkOut < 0) {
+ mBulkOut.reset(TEMP_FAILURE_RETRY(open(FFS_MTP_EP_OUT, O_RDWR)));
+ if (mBulkOut < 0) {
+ PLOG(ERROR) << FFS_MTP_EP_OUT << ": cannot open bulk out ep";
+ return false;
+ }
+ }
+
+ if (mIntr < 0) {
+ mIntr.reset(TEMP_FAILURE_RETRY(open(FFS_MTP_EP_INTR, O_RDWR)));
+ if (mIntr < 0) {
+ PLOG(ERROR) << FFS_MTP_EP_INTR << ": cannot open intr ep";
+ return false;
+ }
+ }
+ return true;
+}
+
+void MtpFfsHandle::advise(int fd) {
+ for (unsigned i = 0; i < NUM_IO_BUFS; i++) {
+ if (posix_madvise(mIobuf[i].bufs.data(), MAX_FILE_CHUNK_SIZE,
+ POSIX_MADV_SEQUENTIAL | POSIX_MADV_WILLNEED) < 0)
+ PLOG(ERROR) << "Failed to madvise";
+ }
+ if (posix_fadvise(fd, 0, 0,
+ POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE | POSIX_FADV_WILLNEED) < 0)
+ PLOG(ERROR) << "Failed to fadvise";
+}
+
bool MtpFfsHandle::initFunctionfs() {
ssize_t ret;
struct desc_v1 v1_descriptor;
struct desc_v2 v2_descriptor;
- v2_descriptor.header.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2);
- v2_descriptor.header.length = cpu_to_le32(sizeof(v2_descriptor));
+ v2_descriptor.header.magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC_V2);
+ v2_descriptor.header.length = htole32(sizeof(v2_descriptor));
v2_descriptor.header.flags = FUNCTIONFS_HAS_FS_DESC | FUNCTIONFS_HAS_HS_DESC |
- FUNCTIONFS_HAS_SS_DESC;
+ FUNCTIONFS_HAS_SS_DESC | FUNCTIONFS_HAS_MS_OS_DESC;
v2_descriptor.fs_count = 4;
v2_descriptor.hs_count = 4;
v2_descriptor.ss_count = 7;
+ v2_descriptor.os_count = 1;
v2_descriptor.fs_descs = mPtp ? ptp_fs_descriptors : mtp_fs_descriptors;
v2_descriptor.hs_descs = mPtp ? ptp_hs_descriptors : mtp_hs_descriptors;
v2_descriptor.ss_descs = mPtp ? ptp_ss_descriptors : mtp_ss_descriptors;
+ v2_descriptor.os_header = mtp_os_desc_header;
+ v2_descriptor.os_desc = mPtp ? ptp_os_desc_compat : mtp_os_desc_compat;
if (mControl < 0) { // might have already done this before
mControl.reset(TEMP_FAILURE_RETRY(open(FFS_MTP_EP0, O_RDWR)));
@@ -328,8 +384,8 @@
ret = TEMP_FAILURE_RETRY(::write(mControl, &v2_descriptor, sizeof(v2_descriptor)));
if (ret < 0) {
- v1_descriptor.header.magic = cpu_to_le32(FUNCTIONFS_DESCRIPTORS_MAGIC);
- v1_descriptor.header.length = cpu_to_le32(sizeof(v1_descriptor));
+ v1_descriptor.header.magic = htole32(FUNCTIONFS_DESCRIPTORS_MAGIC);
+ v1_descriptor.header.length = htole32(sizeof(v1_descriptor));
v1_descriptor.header.fs_count = 4;
v1_descriptor.header.hs_count = 4;
v1_descriptor.fs_descs = mPtp ? ptp_fs_descriptors : mtp_fs_descriptors;
@@ -347,8 +403,6 @@
goto err;
}
}
- if (mBulkIn > -1 || mBulkOut > -1 || mIntr > -1)
- LOG(WARNING) << "Endpoints were not closed before configure!";
return true;
@@ -361,130 +415,152 @@
mControl.reset();
}
-int MtpFfsHandle::writeHandle(int fd, const void* data, int len) {
- LOG(VERBOSE) << "MTP about to write fd = " << fd << ", len=" << len;
- int ret = 0;
- const char* buf = static_cast<const char*>(data);
- while (len > 0) {
- int write_len = std::min(mMaxWrite, len);
- int n = TEMP_FAILURE_RETRY(::write(fd, buf, write_len));
-
- if (n < 0) {
- PLOG(ERROR) << "write ERROR: fd = " << fd << ", n = " << n;
- return -1;
- } else if (n < write_len) {
- errno = EIO;
- PLOG(ERROR) << "less written than expected";
- return -1;
- }
- buf += n;
- len -= n;
- ret += n;
+int MtpFfsHandle::doAsync(void* data, size_t len, bool read) {
+ struct io_event ioevs[1];
+ if (len > AIO_BUF_LEN) {
+ LOG(ERROR) << "Mtp read/write too large " << len;
+ errno = EINVAL;
+ return -1;
}
+ mIobuf[0].buf[0] = reinterpret_cast<unsigned char*>(data);
+ if (iobufSubmit(&mIobuf[0], read ? mBulkOut : mBulkIn, len, read) == -1)
+ return -1;
+ int ret = waitEvents(&mIobuf[0], 1, ioevs, nullptr);
+ mIobuf[0].buf[0] = mIobuf[0].bufs.data();
return ret;
}
-int MtpFfsHandle::readHandle(int fd, void* data, int len) {
- LOG(VERBOSE) << "MTP about to read fd = " << fd << ", len=" << len;
+int MtpFfsHandle::read(void* data, size_t len) {
+ return doAsync(data, len, true);
+}
+
+int MtpFfsHandle::write(const void* data, size_t len) {
+ return doAsync(const_cast<void*>(data), len, false);
+}
+
+int MtpFfsHandle::handleEvent() {
+
+ std::vector<usb_functionfs_event> events(FFS_NUM_EVENTS);
+ usb_functionfs_event *event = events.data();
+ int nbytes = TEMP_FAILURE_RETRY(::read(mControl, event,
+ events.size() * sizeof(usb_functionfs_event)));
+ if (nbytes == -1) {
+ return -1;
+ }
int ret = 0;
- char* buf = static_cast<char*>(data);
- while (len > 0) {
- int read_len = std::min(mMaxRead, len);
- int n = TEMP_FAILURE_RETRY(::read(fd, buf, read_len));
- if (n < 0) {
- PLOG(ERROR) << "read ERROR: fd = " << fd << ", n = " << n;
- return -1;
- }
- ret += n;
- if (n < read_len) // done reading early
+ for (size_t n = nbytes / sizeof *event; n; --n, ++event) {
+ switch (event->type) {
+ case FUNCTIONFS_BIND:
+ case FUNCTIONFS_ENABLE:
+ case FUNCTIONFS_RESUME:
+ ret = 0;
+ errno = 0;
break;
- buf += n;
- len -= n;
- }
- return ret;
-}
-
-int MtpFfsHandle::spliceReadHandle(int fd, int pipe_out, int len) {
- LOG(VERBOSE) << "MTP about to splice read fd = " << fd << ", len=" << len;
- int ret = 0;
- loff_t dummyoff;
- while (len > 0) {
- int read_len = std::min(mMaxRead, len);
- dummyoff = 0;
- int n = TEMP_FAILURE_RETRY(splice(fd, &dummyoff, pipe_out, nullptr, read_len, 0));
- if (n < 0) {
- PLOG(ERROR) << "splice read ERROR: fd = " << fd << ", n = " << n;
- return -1;
- }
- ret += n;
- if (n < read_len) // done reading early
+ case FUNCTIONFS_SUSPEND:
+ case FUNCTIONFS_UNBIND:
+ case FUNCTIONFS_DISABLE:
+ errno = ESHUTDOWN;
+ ret = -1;
break;
- len -= n;
+ case FUNCTIONFS_SETUP:
+ if (handleControlRequest(&event->u.setup) == -1)
+ ret = -1;
+ break;
+ default:
+ LOG(ERROR) << "Mtp Event " << event->type << " (unknown)";
+ }
}
return ret;
}
-int MtpFfsHandle::read(void* data, int len) {
- return readHandle(mBulkOut, data, len);
-}
+int MtpFfsHandle::handleControlRequest(const struct usb_ctrlrequest *setup) {
+ uint8_t type = setup->bRequestType;
+ uint8_t code = setup->bRequest;
+ uint16_t length = setup->wLength;
+ uint16_t index = setup->wIndex;
+ uint16_t value = setup->wValue;
+ std::vector<char> buf;
+ buf.resize(length);
+ int ret = 0;
-int MtpFfsHandle::write(const void* data, int len) {
- return writeHandle(mBulkIn, data, len);
+ if (!(type & USB_DIR_IN)) {
+ if (::read(mControl, buf.data(), length) != length) {
+ PLOG(ERROR) << "Mtp error ctrlreq read data";
+ }
+ }
+
+ if ((type & USB_TYPE_MASK) == USB_TYPE_CLASS && index == 0 && value == 0) {
+ switch(code) {
+ case MTP_REQ_RESET:
+ case MTP_REQ_CANCEL:
+ errno = ECANCELED;
+ ret = -1;
+ break;
+ case MTP_REQ_GET_DEVICE_STATUS:
+ {
+ if (length < sizeof(struct mtp_device_status) + 4) {
+ errno = EINVAL;
+ return -1;
+ }
+ struct mtp_device_status *st = reinterpret_cast<struct mtp_device_status*>(buf.data());
+ st->wLength = htole16(sizeof(st));
+ if (mCanceled) {
+ st->wLength += 4;
+ st->wCode = MTP_RESPONSE_TRANSACTION_CANCELLED;
+ uint16_t *endpoints = reinterpret_cast<uint16_t*>(st + 1);
+ endpoints[0] = ioctl(mBulkIn, FUNCTIONFS_ENDPOINT_REVMAP);
+ endpoints[1] = ioctl(mBulkOut, FUNCTIONFS_ENDPOINT_REVMAP);
+ mCanceled = false;
+ } else {
+ st->wCode = MTP_RESPONSE_OK;
+ }
+ length = st->wLength;
+ break;
+ }
+ default:
+ LOG(ERROR) << "Unrecognized Mtp class request! " << code;
+ }
+ } else {
+ LOG(ERROR) << "Unrecognized request type " << type;
+ }
+
+ if (type & USB_DIR_IN) {
+ if (::write(mControl, buf.data(), length) != length) {
+ PLOG(ERROR) << "Mtp error ctrlreq write data";
+ }
+ }
+ return 0;
}
int MtpFfsHandle::start() {
mLock.lock();
- mBulkIn.reset(TEMP_FAILURE_RETRY(open(FFS_MTP_EP_IN, O_RDWR)));
- if (mBulkIn < 0) {
- PLOG(ERROR) << FFS_MTP_EP_IN << ": cannot open bulk in ep";
+ if (!openEndpoints())
return -1;
- }
- mBulkOut.reset(TEMP_FAILURE_RETRY(open(FFS_MTP_EP_OUT, O_RDWR)));
- if (mBulkOut < 0) {
- PLOG(ERROR) << FFS_MTP_EP_OUT << ": cannot open bulk out ep";
- return -1;
- }
-
- mIntr.reset(TEMP_FAILURE_RETRY(open(FFS_MTP_EP_INTR, O_RDWR)));
- if (mIntr < 0) {
- PLOG(ERROR) << FFS_MTP_EP0 << ": cannot open intr ep";
- return -1;
- }
-
- mBuffer1.resize(MAX_FILE_CHUNK_SIZE);
- mBuffer2.resize(MAX_FILE_CHUNK_SIZE);
- posix_madvise(mBuffer1.data(), MAX_FILE_CHUNK_SIZE,
- POSIX_MADV_SEQUENTIAL | POSIX_MADV_WILLNEED);
- posix_madvise(mBuffer2.data(), MAX_FILE_CHUNK_SIZE,
- POSIX_MADV_SEQUENTIAL | POSIX_MADV_WILLNEED);
-
- // Get device specific r/w size
- mMaxWrite = android::base::GetIntProperty("sys.usb.ffs.max_write", USB_FFS_MAX_WRITE);
- mMaxRead = android::base::GetIntProperty("sys.usb.ffs.max_read", USB_FFS_MAX_READ);
-
- size_t attempts = 0;
- while (mMaxWrite >= USB_FFS_MAX_WRITE && mMaxRead >= USB_FFS_MAX_READ &&
- attempts < ENDPOINT_ALLOC_RETRIES) {
- // If larger contiguous chunks of memory aren't available, attempt to try
- // smaller allocations.
- if (ioctl(mBulkIn, FUNCTIONFS_ENDPOINT_ALLOC, static_cast<__u32>(mMaxWrite)) ||
- ioctl(mBulkOut, FUNCTIONFS_ENDPOINT_ALLOC, static_cast<__u32>(mMaxRead))) {
- if (errno == ENODEV) {
- // Driver hasn't enabled endpoints yet.
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
- attempts += 1;
- continue;
- }
- mMaxWrite /= 2;
- mMaxRead /=2;
- } else {
- return 0;
+ for (unsigned i = 0; i < NUM_IO_BUFS; i++) {
+ mIobuf[i].bufs.resize(MAX_FILE_CHUNK_SIZE);
+ mIobuf[i].iocb.resize(AIO_BUFS_MAX);
+ mIobuf[i].iocbs.resize(AIO_BUFS_MAX);
+ mIobuf[i].buf.resize(AIO_BUFS_MAX);
+ for (unsigned j = 0; j < AIO_BUFS_MAX; j++) {
+ mIobuf[i].buf[j] = mIobuf[i].bufs.data() + j * AIO_BUF_LEN;
+ mIobuf[i].iocb[j] = &mIobuf[i].iocbs[j];
}
}
- // Try to start MtpServer anyway, with the smallest max r/w values
- PLOG(ERROR) << "Functionfs could not allocate any memory!";
+
+ memset(&mCtx, 0, sizeof(mCtx));
+ if (io_setup(AIO_BUFS_MAX, &mCtx) < 0) {
+ PLOG(ERROR) << "unable to setup aio";
+ return -1;
+ }
+ mEventFd.reset(eventfd(0, EFD_NONBLOCK));
+ mPollFds[0].fd = mControl;
+ mPollFds[0].events = POLLIN;
+ mPollFds[1].fd = mEventFd;
+ mPollFds[1].events = POLLIN;
+
+ mCanceled = false;
return 0;
}
@@ -506,227 +582,389 @@
if (!initFunctionfs()) {
ret = -1;
}
+
mLock.unlock();
return ret;
}
void MtpFfsHandle::close() {
+ io_destroy(mCtx);
closeEndpoints();
mLock.unlock();
}
-/* Read from USB and write to a local file. */
-int MtpFfsHandle::receiveFile(mtp_file_range mfr, bool zero_packet) {
- // When receiving files, the incoming length is given in 32 bits.
- // A >4G file is given as 0xFFFFFFFF
- uint32_t file_length = mfr.length;
- uint64_t offset = mfr.offset;
- struct usb_endpoint_descriptor mBulkOut_desc;
- int packet_size;
+int MtpFfsHandle::waitEvents(struct io_buffer *buf, int min_events, struct io_event *events,
+ int *counter) {
+ int num_events = 0;
+ int ret = 0;
+ int error = 0;
- if (ioctl(mBulkOut, FUNCTIONFS_ENDPOINT_DESC, reinterpret_cast<unsigned long>(&mBulkOut_desc))) {
- PLOG(ERROR) << "Could not get FFS bulk-out descriptor";
- packet_size = MAX_PACKET_SIZE_HS;
- } else {
- packet_size = mBulkOut_desc.wMaxPacketSize;
+ while (num_events < min_events) {
+ if (poll(mPollFds, 2, 0) == -1) {
+ PLOG(ERROR) << "Mtp error during poll()";
+ return -1;
+ }
+ if (mPollFds[0].revents & POLLIN) {
+ mPollFds[0].revents = 0;
+ if (handleEvent() == -1) {
+ error = errno;
+ }
+ }
+ if (mPollFds[1].revents & POLLIN) {
+ mPollFds[1].revents = 0;
+ uint64_t ev_cnt = 0;
+
+ if (::read(mEventFd, &ev_cnt, sizeof(ev_cnt)) == -1) {
+ PLOG(ERROR) << "Mtp unable to read eventfd";
+ error = errno;
+ continue;
+ }
+
+ // It's possible that io_getevents will return more events than the eventFd reported,
+ // since events may appear in the time between the calls. In this case, the eventFd will
+ // show up as readable next iteration, but there will be fewer or no events to actually
+ // wait for. Thus we never want io_getevents to block.
+ int this_events = TEMP_FAILURE_RETRY(io_getevents(mCtx, 0, AIO_BUFS_MAX, events, &ZERO_TIMEOUT));
+ if (this_events == -1) {
+ PLOG(ERROR) << "Mtp error getting events";
+ error = errno;
+ }
+ // Add up the total amount of data and find errors on the way.
+ for (unsigned j = 0; j < static_cast<unsigned>(this_events); j++) {
+ if (events[j].res < 0) {
+ errno = -events[j].res;
+ PLOG(ERROR) << "Mtp got error event at " << j << " and " << buf->actual << " total";
+ error = errno;
+ }
+ ret += events[j].res;
+ }
+ num_events += this_events;
+ if (counter)
+ *counter += this_events;
+ }
+ if (error) {
+ errno = error;
+ ret = -1;
+ break;
+ }
+ }
+ return ret;
+}
+
+void MtpFfsHandle::cancelTransaction() {
+ // Device cancels by stalling both bulk endpoints.
+ if (::read(mBulkIn, nullptr, 0) != -1 || errno != EBADMSG)
+ PLOG(ERROR) << "Mtp stall failed on bulk in";
+ if (::write(mBulkOut, nullptr, 0) != -1 || errno != EBADMSG)
+ PLOG(ERROR) << "Mtp stall failed on bulk out";
+ mCanceled = true;
+ errno = ECANCELED;
+}
+
+int MtpFfsHandle::cancelEvents(struct iocb **iocb, struct io_event *events, unsigned start,
+ unsigned end) {
+ // Some manpages for io_cancel are out of date and incorrect.
+ // io_cancel will return -EINPROGRESS on success and does
+ // not place the event in the given memory. We have to use
+ // io_getevents to wait for all the events we cancelled.
+ int ret = 0;
+ unsigned num_events = 0;
+ int save_errno = errno;
+ errno = 0;
+
+ for (unsigned j = start; j < end; j++) {
+ if (io_cancel(mCtx, iocb[j], nullptr) != -1 || errno != EINPROGRESS) {
+ PLOG(ERROR) << "Mtp couldn't cancel request " << j;
+ } else {
+ num_events++;
+ }
+ }
+ if (num_events != end - start) {
+ ret = -1;
+ errno = EIO;
+ }
+ int evs = TEMP_FAILURE_RETRY(io_getevents(mCtx, num_events, AIO_BUFS_MAX, events, nullptr));
+ if (static_cast<unsigned>(evs) != num_events) {
+ PLOG(ERROR) << "Mtp couldn't cancel all requests, got " << evs;
+ ret = -1;
}
- char *data = mBuffer1.data();
- char *data2 = mBuffer2.data();
+ uint64_t ev_cnt = 0;
+ if (num_events && ::read(mEventFd, &ev_cnt, sizeof(ev_cnt)) == -1)
+ PLOG(ERROR) << "Mtp Unable to read event fd";
+
+ if (ret == 0) {
+ // Restore errno since it probably got overriden with EINPROGRESS.
+ errno = save_errno;
+ }
+ return ret;
+}
+
+int MtpFfsHandle::iobufSubmit(struct io_buffer *buf, int fd, unsigned length, bool read) {
+ int ret = 0;
+ buf->actual = AIO_BUFS_MAX;
+ for (unsigned j = 0; j < AIO_BUFS_MAX; j++) {
+ unsigned rq_length = std::min(AIO_BUF_LEN, length - AIO_BUF_LEN * j);
+ io_prep(buf->iocb[j], fd, buf->buf[j], rq_length, 0, read);
+ buf->iocb[j]->aio_flags |= IOCB_FLAG_RESFD;
+ buf->iocb[j]->aio_resfd = mEventFd;
+
+ // Not enough data, so table is truncated.
+ if (rq_length < AIO_BUF_LEN || length == AIO_BUF_LEN * (j + 1)) {
+ buf->actual = j + 1;
+ break;
+ }
+ }
+
+ ret = io_submit(mCtx, buf->actual, buf->iocb.data());
+ if (ret != static_cast<int>(buf->actual)) {
+ PLOG(ERROR) << "Mtp io_submit got " << ret << " expected " << buf->actual;
+ if (ret != -1) {
+ errno = EIO;
+ }
+ ret = -1;
+ }
+ return ret;
+}
+
+int MtpFfsHandle::receiveFile(mtp_file_range mfr, bool zero_packet) {
+ // When receiving files, the incoming length is given in 32 bits.
+ // A >=4G file is given as 0xFFFFFFFF
+ uint32_t file_length = mfr.length;
+ uint64_t offset = mfr.offset;
struct aiocb aio;
aio.aio_fildes = mfr.fd;
aio.aio_buf = nullptr;
struct aiocb *aiol[] = {&aio};
- int ret = -1;
- size_t length;
- bool read = false;
- bool write = false;
- posix_fadvise(mfr.fd, 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE);
+ int ret = -1;
+ unsigned i = 0;
+ size_t length;
+ struct io_event ioevs[AIO_BUFS_MAX];
+ bool has_write = false;
+ bool error = false;
+ bool write_error = false;
+ int packet_size = getPacketSize(mBulkOut);
+ bool short_packet = false;
+ advise(mfr.fd);
// Break down the file into pieces that fit in buffers
- while (file_length > 0 || write) {
+ while (file_length > 0 || has_write) {
+ // Queue an asynchronous read from USB.
if (file_length > 0) {
length = std::min(static_cast<uint32_t>(MAX_FILE_CHUNK_SIZE), file_length);
-
- // Read data from USB, handle errors after waiting for write thread.
- ret = readHandle(mBulkOut, data, length);
-
- if (file_length != MAX_MTP_FILE_SIZE && ret < static_cast<int>(length)) {
- ret = -1;
- errno = EIO;
- }
- read = true;
+ if (iobufSubmit(&mIobuf[i], mBulkOut, length, true) == -1)
+ error = true;
}
- if (write) {
- // get the return status of the last write request
+ // Get the return status of the last write request.
+ if (has_write) {
aio_suspend(aiol, 1, nullptr);
-
int written = aio_return(&aio);
- if (written == -1) {
- errno = aio_error(&aio);
- return -1;
- }
if (static_cast<size_t>(written) < aio.aio_nbytes) {
- errno = EIO;
- return -1;
+ errno = written == -1 ? aio_error(&aio) : EIO;
+ PLOG(ERROR) << "Mtp error writing to disk";
+ write_error = true;
}
- write = false;
+ has_write = false;
}
- // If there was an error reading above
- if (ret == -1) {
+ if (error) {
return -1;
}
- if (read) {
+ // Get the result of the read request, and queue a write to disk.
+ if (file_length > 0) {
+ unsigned num_events = 0;
+ ret = 0;
+ unsigned short_i = mIobuf[i].actual;
+ while (num_events < short_i) {
+ // Get all events up to the short read, if there is one.
+ // We must wait for each event since data transfer could end at any time.
+ int this_events = 0;
+ int event_ret = waitEvents(&mIobuf[i], 1, ioevs, &this_events);
+ num_events += this_events;
+
+ if (event_ret == -1) {
+ cancelEvents(mIobuf[i].iocb.data(), ioevs, num_events, mIobuf[i].actual);
+ return -1;
+ }
+ ret += event_ret;
+ for (int j = 0; j < this_events; j++) {
+ // struct io_event contains a pointer to the associated struct iocb as a __u64.
+ if (static_cast<__u64>(ioevs[j].res) <
+ reinterpret_cast<struct iocb*>(ioevs[j].obj)->aio_nbytes) {
+ // We've found a short event. Store the index since
+ // events won't necessarily arrive in the order they are queued.
+ short_i = (ioevs[j].obj - reinterpret_cast<uint64_t>(mIobuf[i].iocbs.data()))
+ / sizeof(struct iocb) + 1;
+ short_packet = true;
+ }
+ }
+ }
+ if (short_packet) {
+ if (cancelEvents(mIobuf[i].iocb.data(), ioevs, short_i, mIobuf[i].actual)) {
+ write_error = true;
+ }
+ }
if (file_length == MAX_MTP_FILE_SIZE) {
// For larger files, receive until a short packet is received.
if (static_cast<size_t>(ret) < length) {
file_length = 0;
}
+ } else if (ret < static_cast<int>(length)) {
+ // If file is less than 4G and we get a short packet, it's an error.
+ errno = EIO;
+ LOG(ERROR) << "Mtp got unexpected short packet";
+ return -1;
} else {
- // Receive an empty packet if size is a multiple of the endpoint size.
file_length -= ret;
}
+
+ if (write_error) {
+ cancelTransaction();
+ return -1;
+ }
+
// Enqueue a new write request
- aio.aio_buf = data;
- aio.aio_sink = mfr.fd;
- aio.aio_offset = offset;
- aio.aio_nbytes = ret;
+ aio_prepare(&aio, mIobuf[i].bufs.data(), ret, offset);
aio_write(&aio);
offset += ret;
- std::swap(data, data2);
-
- write = true;
- read = false;
+ i = (i + 1) % NUM_IO_BUFS;
+ has_write = true;
}
}
- if (ret % packet_size == 0 || zero_packet) {
- if (TEMP_FAILURE_RETRY(::read(mBulkOut, data, packet_size)) != 0) {
+ if ((ret % packet_size == 0 && !short_packet) || zero_packet) {
+ // Receive an empty packet if size is a multiple of the endpoint size
+ // and we didn't already get an empty packet from the header or large file.
+ if (read(mIobuf[0].bufs.data(), packet_size) != 0) {
return -1;
}
}
return 0;
}
-/* Read from a local file and send over USB. */
int MtpFfsHandle::sendFile(mtp_file_range mfr) {
uint64_t file_length = mfr.length;
uint32_t given_length = std::min(static_cast<uint64_t>(MAX_MTP_FILE_SIZE),
file_length + sizeof(mtp_data_header));
uint64_t offset = mfr.offset;
- struct usb_endpoint_descriptor mBulkIn_desc;
- int packet_size;
-
- if (ioctl(mBulkIn, FUNCTIONFS_ENDPOINT_DESC, reinterpret_cast<unsigned long>(&mBulkIn_desc))) {
- PLOG(ERROR) << "Could not get FFS bulk-in descriptor";
- packet_size = MAX_PACKET_SIZE_HS;
- } else {
- packet_size = mBulkIn_desc.wMaxPacketSize;
- }
+ int packet_size = getPacketSize(mBulkIn);
// If file_length is larger than a size_t, truncating would produce the wrong comparison.
// Instead, promote the left side to 64 bits, then truncate the small result.
int init_read_len = std::min(
static_cast<uint64_t>(packet_size - sizeof(mtp_data_header)), file_length);
- char *data = mBuffer1.data();
- char *data2 = mBuffer2.data();
-
- posix_fadvise(mfr.fd, 0, 0, POSIX_FADV_SEQUENTIAL | POSIX_FADV_NOREUSE);
+ advise(mfr.fd);
struct aiocb aio;
aio.aio_fildes = mfr.fd;
struct aiocb *aiol[] = {&aio};
- int ret, length;
- int error = 0;
- bool read = false;
- bool write = false;
+ int ret = 0;
+ int length, num_read;
+ unsigned i = 0;
+ struct io_event ioevs[AIO_BUFS_MAX];
+ bool error = false;
+ bool has_write = false;
// Send the header data
- mtp_data_header *header = reinterpret_cast<mtp_data_header*>(data);
- header->length = __cpu_to_le32(given_length);
- header->type = __cpu_to_le16(2); /* data packet */
- header->command = __cpu_to_le16(mfr.command);
- header->transaction_id = __cpu_to_le32(mfr.transaction_id);
+ mtp_data_header *header = reinterpret_cast<mtp_data_header*>(mIobuf[0].bufs.data());
+ header->length = htole32(given_length);
+ header->type = htole16(2); // data packet
+ header->command = htole16(mfr.command);
+ header->transaction_id = htole32(mfr.transaction_id);
// Some hosts don't support header/data separation even though MTP allows it
// Handle by filling first packet with initial file data
- if (TEMP_FAILURE_RETRY(pread(mfr.fd, reinterpret_cast<char*>(data) +
+ if (TEMP_FAILURE_RETRY(pread(mfr.fd, mIobuf[0].bufs.data() +
sizeof(mtp_data_header), init_read_len, offset))
!= init_read_len) return -1;
- if (writeHandle(mBulkIn, data, sizeof(mtp_data_header) + init_read_len) == -1) return -1;
+ if (write(mIobuf[0].bufs.data(), sizeof(mtp_data_header) + init_read_len) == -1)
+ return -1;
file_length -= init_read_len;
offset += init_read_len;
ret = init_read_len + sizeof(mtp_data_header);
// Break down the file into pieces that fit in buffers
- while(file_length > 0) {
- if (read) {
- // Wait for the previous read to finish
- aio_suspend(aiol, 1, nullptr);
- ret = aio_return(&aio);
- if (ret == -1) {
- errno = aio_error(&aio);
- return -1;
- }
- if (static_cast<size_t>(ret) < aio.aio_nbytes) {
- errno = EIO;
- return -1;
- }
-
- file_length -= ret;
- offset += ret;
- std::swap(data, data2);
- read = false;
- write = true;
+ while(file_length > 0 || has_write) {
+ if (file_length > 0) {
+ // Queue up a read from disk.
+ length = std::min(static_cast<uint64_t>(MAX_FILE_CHUNK_SIZE), file_length);
+ aio_prepare(&aio, mIobuf[i].bufs.data(), length, offset);
+ aio_read(&aio);
}
- if (error == -1) {
- return -1;
+ if (has_write) {
+ // Wait for usb write. Cancel unwritten portion if there's an error.
+ int num_events = 0;
+ if (waitEvents(&mIobuf[(i-1)%NUM_IO_BUFS], mIobuf[(i-1)%NUM_IO_BUFS].actual, ioevs,
+ &num_events) != ret) {
+ error = true;
+ cancelEvents(mIobuf[(i-1)%NUM_IO_BUFS].iocb.data(), ioevs, num_events,
+ mIobuf[(i-1)%NUM_IO_BUFS].actual);
+ }
+ has_write = false;
}
if (file_length > 0) {
- length = std::min(static_cast<uint64_t>(MAX_FILE_CHUNK_SIZE), file_length);
- // Queue up another read
- aio.aio_buf = data;
- aio.aio_offset = offset;
- aio.aio_nbytes = length;
- aio_read(&aio);
- read = true;
+ // Wait for the previous read to finish
+ aio_suspend(aiol, 1, nullptr);
+ num_read = aio_return(&aio);
+ if (static_cast<size_t>(num_read) < aio.aio_nbytes) {
+ errno = num_read == -1 ? aio_error(&aio) : EIO;
+ PLOG(ERROR) << "Mtp error reading from disk";
+ cancelTransaction();
+ return -1;
+ }
+
+ file_length -= num_read;
+ offset += num_read;
+
+ if (error) {
+ return -1;
+ }
+
+ // Queue up a write to usb.
+ if (iobufSubmit(&mIobuf[i], mBulkIn, num_read, false) == -1) {
+ return -1;
+ }
+ has_write = true;
+ ret = num_read;
}
- if (write) {
- if (writeHandle(mBulkIn, data2, ret) == -1) {
- error = -1;
- }
- write = false;
- }
+ i = (i + 1) % NUM_IO_BUFS;
}
if (ret % packet_size == 0) {
// If the last packet wasn't short, send a final empty packet
- if (TEMP_FAILURE_RETRY(::write(mBulkIn, data, 0)) != 0) {
+ if (write(mIobuf[0].bufs.data(), 0) != 0) {
return -1;
}
}
-
return 0;
}
int MtpFfsHandle::sendEvent(mtp_event me) {
+ // Mimic the behavior of f_mtp by sending the event async.
+ // Events aren't critical to the connection, so we don't need to check the return value.
+ char *temp = new char[me.length];
+ memcpy(temp, me.data, me.length);
+ me.data = temp;
+ std::thread t([this, me]() { return this->doSendEvent(me); });
+ t.detach();
+ return 0;
+}
+
+void MtpFfsHandle::doSendEvent(mtp_event me) {
unsigned length = me.length;
- int ret = writeHandle(mIntr, me.data, length);
- return static_cast<unsigned>(ret) == length ? 0 : -1;
+ int ret = ::write(mIntr, me.data, length);
+ if (static_cast<unsigned>(ret) != length)
+ PLOG(ERROR) << "Mtp error sending event thread!";
+ delete[] reinterpret_cast<char*>(me.data);
}
} // namespace android
-IMtpHandle *get_ffs_handle() {
- return new android::MtpFfsHandle();
-}
-
diff --git a/media/mtp/MtpFfsHandle.h b/media/mtp/MtpFfsHandle.h
index 98669ff..2f90bd1 100644
--- a/media/mtp/MtpFfsHandle.h
+++ b/media/mtp/MtpFfsHandle.h
@@ -18,25 +18,51 @@
#define _MTP_FFS_HANDLE_H
#include <android-base/unique_fd.h>
+#include <linux/aio_abi.h>
+#include <mutex>
+#include <sys/poll.h>
+#include <time.h>
+#include <thread>
+#include <vector>
+
#include <IMtpHandle.h>
namespace android {
-class MtpFfsHandleTest;
+constexpr char FFS_MTP_EP0[] = "/dev/usb-ffs/mtp/ep0";
+
+constexpr int NUM_IO_BUFS = 2;
+
+struct io_buffer {
+ std::vector<struct iocb> iocbs; // Holds memory for all iocbs. Not used directly.
+ std::vector<struct iocb*> iocb; // Pointers to individual iocbs, for syscalls
+ std::vector<unsigned char> bufs; // A large buffer, used with filesystem io
+ std::vector<unsigned char*> buf; // Pointers within the larger buffer, for syscalls
+ unsigned actual; // The number of buffers submitted for this request
+};
+
+template <class T> class MtpFfsHandleTest;
class MtpFfsHandle : public IMtpHandle {
- friend class android::MtpFfsHandleTest;
-private:
- int writeHandle(int fd, const void *data, int len);
- int readHandle(int fd, void *data, int len);
- int spliceReadHandle(int fd, int fd_out, int len);
+ template <class T> friend class android::MtpFfsHandleTest;
+protected:
bool initFunctionfs();
void closeConfig();
void closeEndpoints();
+ void advise(int fd);
+ int handleControlRequest(const struct usb_ctrlrequest *request);
+ int doAsync(void* data, size_t len, bool read);
+ int handleEvent();
+ void cancelTransaction();
+ void doSendEvent(mtp_event me);
+ bool openEndpoints();
+
+ static int getPacketSize(int ffs_fd);
bool mPtp;
+ bool mCanceled;
- std::timed_mutex mLock;
+ std::timed_mutex mLock; // protects configure() vs main loop
android::base::unique_fd mControl;
// "in" from the host's perspective => sink for mtp server
@@ -45,28 +71,35 @@
android::base::unique_fd mBulkOut;
android::base::unique_fd mIntr;
- int mMaxWrite;
- int mMaxRead;
+ aio_context_t mCtx;
- std::vector<char> mBuffer1;
- std::vector<char> mBuffer2;
+ android::base::unique_fd mEventFd;
+ struct pollfd mPollFds[2];
+
+ struct io_buffer mIobuf[NUM_IO_BUFS];
+
+ // Submit an io request of given length. Return amount submitted or -1.
+ int iobufSubmit(struct io_buffer *buf, int fd, unsigned length, bool read);
+
+ // Cancel submitted requests from start to end in the given array. Return 0 or -1.
+ int cancelEvents(struct iocb **iocb, struct io_event *events, unsigned start, unsigned end);
+
+ // Wait for at minimum the given number of events. Returns the amount of data in the returned
+ // events. Increments counter by the number of events returned.
+ int waitEvents(struct io_buffer *buf, int min_events, struct io_event *events, int *counter);
public:
- int read(void *data, int len);
- int write(const void *data, int len);
+ int read(void *data, size_t len) override;
+ int write(const void *data, size_t len) override;
- int receiveFile(mtp_file_range mfr, bool zero_packet);
- int sendFile(mtp_file_range mfr);
- int sendEvent(mtp_event me);
+ int receiveFile(mtp_file_range mfr, bool zero_packet) override;
+ int sendFile(mtp_file_range mfr) override;
+ int sendEvent(mtp_event me) override;
- /**
- * Open ffs endpoints and allocate necessary kernel and user memory.
- * Will sleep until endpoints are enabled, for up to 1 second.
- */
- int start();
- void close();
+ int start() override;
+ void close() override;
- int configure(bool ptp);
+ int configure(bool ptp) override;
MtpFfsHandle();
~MtpFfsHandle();
@@ -85,5 +118,5 @@
} // namespace android
-#endif // _MTP_FF_HANDLE_H
+#endif // _MTP_FFS_HANDLE_H
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index 2180462..236f3a9 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -31,6 +31,9 @@
#include "MtpDebug.h"
#include "MtpDatabase.h"
+#include "MtpDevHandle.h"
+#include "MtpFfsCompatHandle.h"
+#include "MtpFfsHandle.h"
#include "MtpObjectInfo.h"
#include "MtpProperty.h"
#include "MtpServer.h"
@@ -64,8 +67,8 @@
MTP_OPERATION_SET_DEVICE_PROP_VALUE,
MTP_OPERATION_RESET_DEVICE_PROP_VALUE,
// MTP_OPERATION_TERMINATE_OPEN_CAPTURE,
-// MTP_OPERATION_MOVE_OBJECT,
-// MTP_OPERATION_COPY_OBJECT,
+ MTP_OPERATION_MOVE_OBJECT,
+ MTP_OPERATION_COPY_OBJECT,
MTP_OPERATION_GET_PARTIAL_OBJECT,
// MTP_OPERATION_INITIATE_OPEN_CAPTURE,
MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED,
@@ -125,16 +128,21 @@
IMtpHandle* MtpServer::sHandle = nullptr;
int MtpServer::configure(bool usePtp) {
+ bool ffs_ok = access(FFS_MTP_EP0, W_OK) == 0;
if (sHandle == nullptr) {
- bool ffs_ok = access(FFS_MTP_EP0, W_OK) == 0;
- sHandle = ffs_ok ? get_ffs_handle() : get_mtp_handle();
+ if (ffs_ok) {
+ bool aio_compat = android::base::GetBoolProperty("sys.usb.ffs.aio_compat", false);
+ sHandle = aio_compat ? new MtpFfsCompatHandle() : new MtpFfsHandle();
+ } else {
+ sHandle = new MtpDevHandle();
+ }
}
-
- int ret = sHandle->configure(usePtp);
- if (ret) ALOGE("Failed to configure MTP driver!");
- else android::base::SetProperty("sys.usb.ffs.mtp.ready", "1");
-
- return ret;
+ if (sHandle->configure(usePtp)) {
+ ALOGE("Failed to configure Mtp driver!");
+ return -1;
+ }
+ android::base::SetProperty("sys.usb.ffs.mtp.ready", "1");
+ return 0;
}
void MtpServer::addStorage(MtpStorage* storage) {
@@ -429,6 +437,12 @@
case MTP_OPERATION_DELETE_OBJECT:
response = doDeleteObject();
break;
+ case MTP_OPERATION_COPY_OBJECT:
+ response = doCopyObject();
+ break;
+ case MTP_OPERATION_MOVE_OBJECT:
+ response = doMoveObject();
+ break;
case MTP_OPERATION_GET_OBJECT_PROP_DESC:
response = doGetObjectPropDesc();
break;
@@ -878,6 +892,7 @@
length = fileLength - offset;
const char* filePath = (const char *)pathBuf;
+ ALOGV("sending partial %s %" PRIu64 " %" PRIu32, filePath, offset, length);
mtp_file_range mfr;
mfr.fd = open(filePath, O_RDONLY);
if (mfr.fd < 0) {
@@ -1011,6 +1026,137 @@
return MTP_RESPONSE_OK;
}
+MtpResponseCode MtpServer::doMoveObject() {
+ if (!hasStorage())
+ return MTP_RESPONSE_GENERAL_ERROR;
+ if (mRequest.getParameterCount() < 3)
+ return MTP_RESPONSE_INVALID_PARAMETER;
+ MtpObjectHandle objectHandle = mRequest.getParameter(1);
+ MtpStorageID storageID = mRequest.getParameter(2);
+ MtpStorage* storage = getStorage(storageID);
+ MtpObjectHandle parent = mRequest.getParameter(3);
+ if (!storage)
+ return MTP_RESPONSE_INVALID_STORAGE_ID;
+ MtpString path;
+ MtpResponseCode result;
+
+ MtpString fromPath;
+ int64_t fileLength;
+ MtpObjectFormat format;
+ MtpObjectInfo info(objectHandle);
+ result = mDatabase->getObjectInfo(objectHandle, info);
+ if (result != MTP_RESPONSE_OK)
+ return result;
+ result = mDatabase->getObjectFilePath(objectHandle, fromPath, fileLength, format);
+ if (result != MTP_RESPONSE_OK)
+ return result;
+
+ // special case the root
+ if (parent == 0) {
+ path = storage->getPath();
+ } else {
+ int64_t parentLength;
+ MtpObjectFormat parentFormat;
+ result = mDatabase->getObjectFilePath(parent, path, parentLength, parentFormat);
+ if (result != MTP_RESPONSE_OK)
+ return result;
+ if (parentFormat != MTP_FORMAT_ASSOCIATION)
+ return MTP_RESPONSE_INVALID_PARENT_OBJECT;
+ }
+
+ if (path[path.size() - 1] != '/')
+ path += "/";
+ path += info.mName;
+
+ result = mDatabase->moveObject(objectHandle, parent, path);
+ if (result != MTP_RESPONSE_OK)
+ return result;
+
+ if (info.mStorageID == storageID) {
+ ALOGV("Moving file from %s to %s", (const char*)fromPath, (const char*)path);
+ if (rename(fromPath, path)) {
+ ALOGE("rename() failed from %s to %s", (const char*)fromPath, (const char*)path);
+ result = MTP_RESPONSE_GENERAL_ERROR;
+ }
+ } else {
+ ALOGV("Moving across storages from %s to %s", (const char*)fromPath, (const char*)path);
+ if (copyFile(fromPath, path)) {
+ result = MTP_RESPONSE_GENERAL_ERROR;
+ } else {
+ deletePath(fromPath);
+ }
+ }
+
+ // If the move failed, undo the database change
+ if (result != MTP_RESPONSE_OK)
+ if (mDatabase->moveObject(objectHandle, info.mParent, fromPath) != MTP_RESPONSE_OK)
+ ALOGE("Couldn't undo failed move");
+
+ return result;
+}
+
+MtpResponseCode MtpServer::doCopyObject() {
+ if (!hasStorage())
+ return MTP_RESPONSE_GENERAL_ERROR;
+ MtpResponseCode result = MTP_RESPONSE_OK;
+ if (mRequest.getParameterCount() < 3)
+ return MTP_RESPONSE_INVALID_PARAMETER;
+ MtpObjectHandle objectHandle = mRequest.getParameter(1);
+ MtpStorageID storageID = mRequest.getParameter(2);
+ MtpStorage* storage = getStorage(storageID);
+ MtpObjectHandle parent = mRequest.getParameter(3);
+ if (!storage)
+ return MTP_RESPONSE_INVALID_STORAGE_ID;
+ MtpString path;
+
+ MtpString fromPath;
+ int64_t fileLength;
+ MtpObjectFormat format;
+ MtpObjectInfo info(objectHandle);
+ result = mDatabase->getObjectInfo(objectHandle, info);
+ if (result != MTP_RESPONSE_OK)
+ return result;
+ result = mDatabase->getObjectFilePath(objectHandle, fromPath, fileLength, format);
+ if (result != MTP_RESPONSE_OK)
+ return result;
+
+ // special case the root
+ if (parent == 0) {
+ path = storage->getPath();
+ } else {
+ int64_t parentLength;
+ MtpObjectFormat parentFormat;
+ result = mDatabase->getObjectFilePath(parent, path, parentLength, parentFormat);
+ if (result != MTP_RESPONSE_OK)
+ return result;
+ if (parentFormat != MTP_FORMAT_ASSOCIATION)
+ return MTP_RESPONSE_INVALID_PARENT_OBJECT;
+ }
+
+ // check space first
+ if ((uint64_t) fileLength > storage->getFreeSpace())
+ return MTP_RESPONSE_STORAGE_FULL;
+
+ if (path[path.size() - 1] != '/')
+ path += "/";
+ path += info.mName;
+
+ MtpObjectHandle handle = mDatabase->beginSendObject((const char*)path,
+ format, parent, storageID, fileLength, info.mDateModified);
+ if (handle == kInvalidObjectHandle) {
+ return MTP_RESPONSE_GENERAL_ERROR;
+ }
+
+ ALOGV("Copying file from %s to %s", (const char*)fromPath, (const char*)path);
+ if (copyFile(fromPath, path)) {
+ result = MTP_RESPONSE_GENERAL_ERROR;
+ }
+
+ mDatabase->endSendObject(path, handle, format, result);
+ mResponse.setParameter(1, handle);
+ return result;
+}
+
MtpResponseCode MtpServer::doSendObject() {
if (!hasStorage())
return MTP_RESPONSE_GENERAL_ERROR;
@@ -1115,65 +1261,6 @@
return result;
}
-static void deleteRecursive(const char* path) {
- char pathbuf[PATH_MAX];
- size_t pathLength = strlen(path);
- if (pathLength >= sizeof(pathbuf) - 1) {
- ALOGE("path too long: %s\n", path);
- }
- strcpy(pathbuf, path);
- if (pathbuf[pathLength - 1] != '/') {
- pathbuf[pathLength++] = '/';
- }
- char* fileSpot = pathbuf + pathLength;
- int pathRemaining = sizeof(pathbuf) - pathLength - 1;
-
- DIR* dir = opendir(path);
- if (!dir) {
- ALOGE("opendir %s failed: %s", path, strerror(errno));
- return;
- }
-
- struct dirent* entry;
- while ((entry = readdir(dir))) {
- const char* name = entry->d_name;
-
- // ignore "." and ".."
- if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) {
- continue;
- }
-
- int nameLength = strlen(name);
- if (nameLength > pathRemaining) {
- ALOGE("path %s/%s too long\n", path, name);
- continue;
- }
- strcpy(fileSpot, name);
-
- if (entry->d_type == DT_DIR) {
- deleteRecursive(pathbuf);
- rmdir(pathbuf);
- } else {
- unlink(pathbuf);
- }
- }
- closedir(dir);
-}
-
-static void deletePath(const char* path) {
- struct stat statbuf;
- if (stat(path, &statbuf) == 0) {
- if (S_ISDIR(statbuf.st_mode)) {
- deleteRecursive(path);
- rmdir(path);
- } else {
- unlink(path);
- }
- } else {
- ALOGE("deletePath stat failed for %s: %s", path, strerror(errno));
- }
-}
-
MtpResponseCode MtpServer::doDeleteObject() {
if (!hasStorage())
return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h
index 08a9e4a..aafc753 100644
--- a/media/mtp/MtpServer.h
+++ b/media/mtp/MtpServer.h
@@ -161,6 +161,8 @@
MtpResponseCode doSendObjectInfo();
MtpResponseCode doSendObject();
MtpResponseCode doDeleteObject();
+ MtpResponseCode doMoveObject();
+ MtpResponseCode doCopyObject();
MtpResponseCode doGetObjectPropDesc();
MtpResponseCode doGetDevicePropDesc();
MtpResponseCode doSendPartialObject();
diff --git a/media/mtp/MtpUtils.cpp b/media/mtp/MtpUtils.cpp
index ebf3601..036ffe7 100644
--- a/media/mtp/MtpUtils.cpp
+++ b/media/mtp/MtpUtils.cpp
@@ -16,13 +16,23 @@
#define LOG_TAG "MtpUtils"
+#include <android-base/logging.h>
+#include <android-base/unique_fd.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <sys/sendfile.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include <stdio.h>
#include <time.h>
+#include <unistd.h>
#include "MtpUtils.h"
namespace android {
+constexpr unsigned long FILE_COPY_SIZE = 262144;
+
/*
DateTime strings follow a compatible subset of the definition found in ISO 8601, and
take the form of a Unicode string formatted as: "YYYYMMDDThhmmss.s". In this
@@ -78,4 +88,101 @@
tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}
+int copyFile(const char *fromPath, const char *toPath) {
+ auto start = std::chrono::steady_clock::now();
+
+ android::base::unique_fd fromFd(open(fromPath, O_RDONLY));
+ if (fromFd == -1) {
+ PLOG(ERROR) << "Failed to open copy from " << fromPath;
+ return -1;
+ }
+ android::base::unique_fd toFd(open(toPath, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR));
+ if (toFd == -1) {
+ PLOG(ERROR) << "Failed to open copy to " << toPath;
+ return -1;
+ }
+ off_t offset = 0;
+
+ struct stat sstat = {};
+ if (stat(fromPath, &sstat) == -1)
+ return -1;
+
+ off_t length = sstat.st_size;
+ int ret = 0;
+
+ while (offset < length) {
+ ssize_t transfer_length = std::min(length - offset, (off_t) FILE_COPY_SIZE);
+ ret = sendfile(toFd, fromFd, &offset, transfer_length);
+ if (ret != transfer_length) {
+ ret = -1;
+ PLOG(ERROR) << "Copying failed!";
+ break;
+ }
+ }
+ auto end = std::chrono::steady_clock::now();
+ std::chrono::duration<double> diff = end - start;
+ LOG(INFO) << "Copied a file with MTP. Time: " << diff.count() << " s, Size: " << length <<
+ ", Rate: " << ((double) length) / diff.count() << " bytes/s";
+ return ret == -1 ? -1 : 0;
+}
+
+void deleteRecursive(const char* path) {
+ char pathbuf[PATH_MAX];
+ size_t pathLength = strlen(path);
+ if (pathLength >= sizeof(pathbuf) - 1) {
+ LOG(ERROR) << "path too long: " << path;
+ }
+ strcpy(pathbuf, path);
+ if (pathbuf[pathLength - 1] != '/') {
+ pathbuf[pathLength++] = '/';
+ }
+ char* fileSpot = pathbuf + pathLength;
+ int pathRemaining = sizeof(pathbuf) - pathLength - 1;
+
+ DIR* dir = opendir(path);
+ if (!dir) {
+ PLOG(ERROR) << "opendir " << path << " failed";
+ return;
+ }
+
+ struct dirent* entry;
+ while ((entry = readdir(dir))) {
+ const char* name = entry->d_name;
+
+ // ignore "." and ".."
+ if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) {
+ continue;
+ }
+
+ int nameLength = strlen(name);
+ if (nameLength > pathRemaining) {
+ LOG(ERROR) << "path " << path << "/" << name << " too long";
+ continue;
+ }
+ strcpy(fileSpot, name);
+
+ if (entry->d_type == DT_DIR) {
+ deleteRecursive(pathbuf);
+ rmdir(pathbuf);
+ } else {
+ unlink(pathbuf);
+ }
+ }
+ closedir(dir);
+}
+
+void deletePath(const char* path) {
+ struct stat statbuf;
+ if (stat(path, &statbuf) == 0) {
+ if (S_ISDIR(statbuf.st_mode)) {
+ deleteRecursive(path);
+ rmdir(path);
+ } else {
+ unlink(path);
+ }
+ } else {
+ PLOG(ERROR) << "deletePath stat failed for " << path;;
+ }
+}
+
} // namespace android
diff --git a/media/mtp/MtpUtils.h b/media/mtp/MtpUtils.h
index 61f9055..a2bb7e1 100644
--- a/media/mtp/MtpUtils.h
+++ b/media/mtp/MtpUtils.h
@@ -24,6 +24,10 @@
bool parseDateTime(const char* dateTime, time_t& outSeconds);
void formatDateTime(time_t seconds, char* buffer, int bufferLength);
+int copyFile(const char *fromPath, const char *toPath);
+void deleteRecursive(const char* path);
+void deletePath(const char* path);
+
}; // namespace android
#endif // _MTP_UTILS_H
diff --git a/media/mtp/PosixAsyncIO.cpp b/media/mtp/PosixAsyncIO.cpp
new file mode 100644
index 0000000..e67c568
--- /dev/null
+++ b/media/mtp/PosixAsyncIO.cpp
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+#include <condition_variable>
+#include <memory>
+#include <mutex>
+#include <queue>
+#include <unistd.h>
+
+#include "PosixAsyncIO.h"
+
+namespace {
+
+void read_func(struct aiocb *aiocbp) {
+ aiocbp->ret = TEMP_FAILURE_RETRY(pread(aiocbp->aio_fildes,
+ aiocbp->aio_buf, aiocbp->aio_nbytes, aiocbp->aio_offset));
+ if (aiocbp->ret == -1) aiocbp->error = errno;
+}
+
+void write_func(struct aiocb *aiocbp) {
+ aiocbp->ret = TEMP_FAILURE_RETRY(pwrite(aiocbp->aio_fildes,
+ aiocbp->aio_buf, aiocbp->aio_nbytes, aiocbp->aio_offset));
+ if (aiocbp->ret == -1) aiocbp->error = errno;
+}
+
+} // end anonymous namespace
+
+aiocb::~aiocb() {
+ CHECK(!thread.joinable());
+}
+
+int aio_read(struct aiocb *aiocbp) {
+ aiocbp->thread = std::thread(read_func, aiocbp);
+ return 0;
+}
+
+int aio_write(struct aiocb *aiocbp) {
+ aiocbp->thread = std::thread(write_func, aiocbp);
+ return 0;
+}
+
+int aio_error(const struct aiocb *aiocbp) {
+ return aiocbp->error;
+}
+
+ssize_t aio_return(struct aiocb *aiocbp) {
+ return aiocbp->ret;
+}
+
+int aio_suspend(struct aiocb *aiocbp[], int n,
+ const struct timespec *) {
+ for (int i = 0; i < n; i++) {
+ aiocbp[i]->thread.join();
+ }
+ return 0;
+}
+
+void aio_prepare(struct aiocb *aiocbp, void* buf, size_t count, off_t offset) {
+ aiocbp->aio_buf = buf;
+ aiocbp->aio_offset = offset;
+ aiocbp->aio_nbytes = count;
+}
diff --git a/media/mtp/PosixAsyncIO.h b/media/mtp/PosixAsyncIO.h
new file mode 100644
index 0000000..590aaef
--- /dev/null
+++ b/media/mtp/PosixAsyncIO.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _POSIXASYNCIO_H
+#define _POSIXASYNCIO_H
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <time.h>
+#include <thread>
+#include <unistd.h>
+
+/**
+ * Provides a subset of POSIX aio operations.
+ */
+
+struct aiocb {
+ int aio_fildes;
+ void *aio_buf;
+
+ off_t aio_offset;
+ size_t aio_nbytes;
+
+ // Used internally
+ std::thread thread;
+ ssize_t ret;
+ int error;
+
+ ~aiocb();
+};
+
+// Submit a request for IO to be completed
+int aio_read(struct aiocb *);
+int aio_write(struct aiocb *);
+
+// Suspend current thread until given IO is complete, at which point
+// its return value and any errors can be accessed
+// All submitted requests must have a corresponding suspend.
+// aiocb->aio_buf must refer to valid memory until after the suspend call
+int aio_suspend(struct aiocb *[], int, const struct timespec *);
+int aio_error(const struct aiocb *);
+ssize_t aio_return(struct aiocb *);
+
+// Helper method for setting aiocb members
+void aio_prepare(struct aiocb *, void*, size_t, off_t);
+
+#endif // POSIXASYNCIO_H
+
diff --git a/media/mtp/mtp.h b/media/mtp/mtp.h
index adfb102..644780f 100644
--- a/media/mtp/mtp.h
+++ b/media/mtp/mtp.h
@@ -493,4 +493,10 @@
#define MTP_ASSOCIATION_TYPE_UNDEFINED 0x0000
#define MTP_ASSOCIATION_TYPE_GENERIC_FOLDER 0x0001
+// MTP class reqeusts
+#define MTP_REQ_CANCEL 0x64
+#define MTP_REQ_GET_EXT_EVENT_DATA 0x65
+#define MTP_REQ_RESET 0x66
+#define MTP_REQ_GET_DEVICE_STATUS 0x67
+
#endif // _MTP_H
diff --git a/media/mtp/tests/Android.bp b/media/mtp/tests/Android.bp
index fe7018b..0750208 100644
--- a/media/mtp/tests/Android.bp
+++ b/media/mtp/tests/Android.bp
@@ -31,8 +31,9 @@
}
cc_test {
- name: "async_io_test",
- srcs: ["AsyncIO_test.cpp"],
+ name: "posix_async_io_test",
+ test_suites: ["device-tests"],
+ srcs: ["PosixAsyncIO_test.cpp"],
shared_libs: [
"libbase",
"libmtp",
diff --git a/media/mtp/tests/AsyncIO_test.cpp b/media/mtp/tests/AsyncIO_test.cpp
deleted file mode 100644
index b5f4538..0000000
--- a/media/mtp/tests/AsyncIO_test.cpp
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#define LOG_TAG "AsyncIO_test.cpp"
-
-#include <android-base/test_utils.h>
-#include <fcntl.h>
-#include <gtest/gtest.h>
-#include <string>
-#include <unistd.h>
-#include <utils/Log.h>
-
-#include "AsyncIO.h"
-
-namespace android {
-
-constexpr int TEST_PACKET_SIZE = 512;
-constexpr int POOL_COUNT = 10;
-
-static const std::string dummyDataStr =
- "/*\n * Copyright 2015 The Android Open Source Project\n *\n * Licensed un"
- "der the Apache License, Version 2.0 (the \"License\");\n * you may not us"
- "e this file except in compliance with the License.\n * You may obtain a c"
- "opy of the License at\n *\n * http://www.apache.org/licenses/LICENSE"
- "-2.0\n *\n * Unless required by applicable law or agreed to in writing, s"
- "oftware\n * distributed under the License is distributed on an \"AS IS\" "
- "BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express o"
- "r implied.\n * Se";
-
-
-class AsyncIOTest : public ::testing::Test {
-protected:
- TemporaryFile dummy_file;
-
- AsyncIOTest() {}
- ~AsyncIOTest() {}
-};
-
-TEST_F(AsyncIOTest, testRead) {
- char buf[TEST_PACKET_SIZE + 1];
- buf[TEST_PACKET_SIZE] = '\0';
- EXPECT_EQ(write(dummy_file.fd, dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
- struct aiocb aio;
- struct aiocb *aiol[] = {&aio};
- aio.aio_fildes = dummy_file.fd;
- aio.aio_buf = buf;
- aio.aio_offset = 0;
- aio.aio_nbytes = TEST_PACKET_SIZE;
-
- EXPECT_EQ(aio_read(&aio), 0);
- EXPECT_EQ(aio_suspend(aiol, 1, nullptr), 0);
- EXPECT_EQ(aio_return(&aio), TEST_PACKET_SIZE);
- EXPECT_STREQ(buf, dummyDataStr.c_str());
-}
-
-TEST_F(AsyncIOTest, testWrite) {
- char buf[TEST_PACKET_SIZE + 1];
- buf[TEST_PACKET_SIZE] = '\0';
- struct aiocb aio;
- struct aiocb *aiol[] = {&aio};
- aio.aio_fildes = dummy_file.fd;
- aio.aio_buf = const_cast<char*>(dummyDataStr.c_str());
- aio.aio_offset = 0;
- aio.aio_nbytes = TEST_PACKET_SIZE;
-
- EXPECT_EQ(aio_write(&aio), 0);
- EXPECT_EQ(aio_suspend(aiol, 1, nullptr), 0);
- EXPECT_EQ(aio_return(&aio), TEST_PACKET_SIZE);
- EXPECT_EQ(read(dummy_file.fd, buf, TEST_PACKET_SIZE), TEST_PACKET_SIZE);
- EXPECT_STREQ(buf, dummyDataStr.c_str());
-}
-
-TEST_F(AsyncIOTest, testError) {
- char buf[TEST_PACKET_SIZE + 1];
- buf[TEST_PACKET_SIZE] = '\0';
- struct aiocb aio;
- struct aiocb *aiol[] = {&aio};
- aio.aio_fildes = -1;
- aio.aio_buf = const_cast<char*>(dummyDataStr.c_str());
- aio.aio_offset = 0;
- aio.aio_nbytes = TEST_PACKET_SIZE;
-
- EXPECT_EQ(aio_write(&aio), 0);
- EXPECT_EQ(aio_suspend(aiol, 1, nullptr), 0);
- EXPECT_EQ(aio_return(&aio), -1);
- EXPECT_EQ(aio_error(&aio), EBADF);
-}
-
-TEST_F(AsyncIOTest, testSpliceRead) {
- char buf[TEST_PACKET_SIZE + 1];
- buf[TEST_PACKET_SIZE] = '\0';
- int pipeFd[2];
- EXPECT_EQ(pipe(pipeFd), 0);
- EXPECT_EQ(write(dummy_file.fd, dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
- struct aiocb aio;
- struct aiocb *aiol[] = {&aio};
- aio.aio_fildes = dummy_file.fd;
- aio.aio_sink = pipeFd[1];
- aio.aio_offset = 0;
- aio.aio_nbytes = TEST_PACKET_SIZE;
-
- EXPECT_EQ(aio_splice_read(&aio), 0);
- EXPECT_EQ(aio_suspend(aiol, 1, nullptr), 0);
- EXPECT_EQ(aio_return(&aio), TEST_PACKET_SIZE);
-
- EXPECT_EQ(read(pipeFd[0], buf, TEST_PACKET_SIZE), TEST_PACKET_SIZE);
- EXPECT_STREQ(buf, dummyDataStr.c_str());
-}
-
-TEST_F(AsyncIOTest, testSpliceWrite) {
- char buf[TEST_PACKET_SIZE + 1];
- buf[TEST_PACKET_SIZE] = '\0';
- int pipeFd[2];
- EXPECT_EQ(pipe(pipeFd), 0);
- EXPECT_EQ(write(pipeFd[1], dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
- struct aiocb aio;
- struct aiocb *aiol[] = {&aio};
- aio.aio_fildes = pipeFd[0];
- aio.aio_sink = dummy_file.fd;
- aio.aio_offset = 0;
- aio.aio_nbytes = TEST_PACKET_SIZE;
-
- EXPECT_EQ(aio_splice_write(&aio), 0);
- EXPECT_EQ(aio_suspend(aiol, 1, nullptr), 0);
- EXPECT_EQ(aio_return(&aio), TEST_PACKET_SIZE);
- EXPECT_EQ(read(dummy_file.fd, buf, TEST_PACKET_SIZE), TEST_PACKET_SIZE);
- EXPECT_STREQ(buf, dummyDataStr.c_str());
-}
-
-TEST_F(AsyncIOTest, testPoolWrite) {
- aio_pool_write_init();
- char buf[TEST_PACKET_SIZE * POOL_COUNT + 1];
- buf[TEST_PACKET_SIZE * POOL_COUNT] = '\0';
-
- for (int i = 0; i < POOL_COUNT; i++) {
- struct aiocb *aiop = new struct aiocb;
- aiop->aio_fildes = dummy_file.fd;
- aiop->aio_pool_buf = std::unique_ptr<char[]>(new char[TEST_PACKET_SIZE]);
- memcpy(aiop->aio_pool_buf.get(), dummyDataStr.c_str(), TEST_PACKET_SIZE);
- aiop->aio_offset = i * TEST_PACKET_SIZE;
- aiop->aio_nbytes = TEST_PACKET_SIZE;
- EXPECT_EQ(aio_pool_write(aiop), 0);
- }
- aio_pool_end();
- EXPECT_EQ(read(dummy_file.fd, buf, TEST_PACKET_SIZE * POOL_COUNT), TEST_PACKET_SIZE * POOL_COUNT);
-
- std::stringstream ss;
- for (int i = 0; i < POOL_COUNT; i++)
- ss << dummyDataStr;
-
- EXPECT_STREQ(buf, ss.str().c_str());
-}
-
-TEST_F(AsyncIOTest, testSplicePoolWrite) {
- aio_pool_splice_init();
- char buf[TEST_PACKET_SIZE * POOL_COUNT + 1];
- buf[TEST_PACKET_SIZE * POOL_COUNT] = '\0';
-
- for (int i = 0; i < POOL_COUNT; i++) {
- int pipeFd[2];
- EXPECT_EQ(pipe(pipeFd), 0);
- EXPECT_EQ(write(pipeFd[1], dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
- struct aiocb *aiop = new struct aiocb;
- aiop->aio_fildes = pipeFd[0];
- aiop->aio_sink = dummy_file.fd;
- aiop->aio_offset = i * TEST_PACKET_SIZE;
- aiop->aio_nbytes = TEST_PACKET_SIZE;
- EXPECT_EQ(aio_pool_write(aiop), 0);
- }
- aio_pool_end();
- EXPECT_EQ(read(dummy_file.fd, buf, TEST_PACKET_SIZE * POOL_COUNT), TEST_PACKET_SIZE * POOL_COUNT);
-
- std::stringstream ss;
- for (int i = 0; i < POOL_COUNT; i++)
- ss << dummyDataStr;
-
- EXPECT_STREQ(buf, ss.str().c_str());
-}
-
-} // namespace android
diff --git a/media/mtp/tests/MtpFfsHandle_test.cpp b/media/mtp/tests/MtpFfsHandle_test.cpp
index 554f867..8d7301d 100644
--- a/media/mtp/tests/MtpFfsHandle_test.cpp
+++ b/media/mtp/tests/MtpFfsHandle_test.cpp
@@ -26,12 +26,11 @@
#include <utils/Log.h>
#include "MtpFfsHandle.h"
+#include "MtpFfsCompatHandle.h"
namespace android {
-constexpr int MAX_FILE_CHUNK_SIZE = 3 * 1024 * 1024;
-
-constexpr int TEST_PACKET_SIZE = 512;
+constexpr int TEST_PACKET_SIZE = 500;
constexpr int SMALL_MULT = 30;
constexpr int MED_MULT = 510;
@@ -43,17 +42,19 @@
"-2.0\n *\n * Unless required by applicable law or agreed to in writing, s"
"oftware\n * distributed under the License is distributed on an \"AS IS\" "
"BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express o"
- "r implied.\n * Se";
+ "r im";
/**
* Functional tests for the MtpFfsHandle class. Ensures header and data integrity
* by mocking ffs endpoints as pipes to capture input / output.
*/
+template <class T>
class MtpFfsHandleTest : public ::testing::Test {
protected:
- std::unique_ptr<IMtpHandle> handle;
+ std::unique_ptr<MtpFfsHandle> handle;
// Pipes for reading endpoint data
+ android::base::unique_fd control;
android::base::unique_fd bulk_in;
android::base::unique_fd bulk_out;
android::base::unique_fd intr;
@@ -62,88 +63,144 @@
MtpFfsHandleTest() {
int fd[2];
- handle = std::unique_ptr<IMtpHandle>(get_ffs_handle());
- MtpFfsHandle *ffs_handle = static_cast<MtpFfsHandle*>(handle.get());
- EXPECT_TRUE(ffs_handle != NULL);
+ handle = std::make_unique<T>();
+
+ EXPECT_EQ(pipe(fd), 0);
+ handle->mControl.reset(fd[0]);
+ control.reset(fd[1]);
EXPECT_EQ(pipe(fd), 0);
EXPECT_EQ(fcntl(fd[0], F_SETPIPE_SZ, 1048576), 1048576);
bulk_in.reset(fd[0]);
- ffs_handle->mBulkIn.reset(fd[1]);
+ handle->mBulkIn.reset(fd[1]);
EXPECT_EQ(pipe(fd), 0);
EXPECT_EQ(fcntl(fd[0], F_SETPIPE_SZ, 1048576), 1048576);
bulk_out.reset(fd[1]);
- ffs_handle->mBulkOut.reset(fd[0]);
+ handle->mBulkOut.reset(fd[0]);
EXPECT_EQ(pipe(fd), 0);
intr.reset(fd[0]);
- ffs_handle->mIntr.reset(fd[1]);
+ handle->mIntr.reset(fd[1]);
- ffs_handle->mBuffer1.resize(MAX_FILE_CHUNK_SIZE);
- ffs_handle->mBuffer2.resize(MAX_FILE_CHUNK_SIZE);
+ handle->start();
}
- ~MtpFfsHandleTest() {}
+ ~MtpFfsHandleTest() {
+ handle->close();
+ }
};
-TEST_F(MtpFfsHandleTest, testRead) {
- EXPECT_EQ(write(bulk_out, dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
+typedef ::testing::Types<MtpFfsHandle, MtpFfsCompatHandle> mtpHandles;
+TYPED_TEST_CASE(MtpFfsHandleTest, mtpHandles);
+
+TYPED_TEST(MtpFfsHandleTest, testRead) {
+ EXPECT_EQ(write(this->bulk_out, dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
char buf[TEST_PACKET_SIZE + 1];
buf[TEST_PACKET_SIZE] = '\0';
- EXPECT_EQ(handle->read(buf, TEST_PACKET_SIZE), TEST_PACKET_SIZE);
+ EXPECT_EQ(this->handle->read(buf, TEST_PACKET_SIZE), TEST_PACKET_SIZE);
EXPECT_STREQ(buf, dummyDataStr.c_str());
}
-TEST_F(MtpFfsHandleTest, testWrite) {
+TYPED_TEST(MtpFfsHandleTest, testWrite) {
char buf[TEST_PACKET_SIZE + 1];
buf[TEST_PACKET_SIZE] = '\0';
- EXPECT_EQ(handle->write(dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
- EXPECT_EQ(read(bulk_in, buf, TEST_PACKET_SIZE), TEST_PACKET_SIZE);
+ EXPECT_EQ(this->handle->write(dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
+ EXPECT_EQ(read(this->bulk_in, buf, TEST_PACKET_SIZE), TEST_PACKET_SIZE);
EXPECT_STREQ(buf, dummyDataStr.c_str());
}
-TEST_F(MtpFfsHandleTest, testReceiveFileSmall) {
+TYPED_TEST(MtpFfsHandleTest, testReceiveFileEmpty) {
+ std::stringstream ss;
+ mtp_file_range mfr;
+ int size = 0;
+ char buf[size + 1];
+ buf[size] = '\0';
+
+ mfr.offset = 0;
+ mfr.length = size;
+ mfr.fd = this->dummy_file.fd;
+
+ EXPECT_EQ(write(this->bulk_out, ss.str().c_str(), size), size);
+ EXPECT_EQ(this->handle->receiveFile(mfr, false), 0);
+
+ EXPECT_EQ(read(this->dummy_file.fd, buf, size), size);
+}
+
+TYPED_TEST(MtpFfsHandleTest, testReceiveFileSmall) {
std::stringstream ss;
mtp_file_range mfr;
int size = TEST_PACKET_SIZE * SMALL_MULT;
char buf[size + 1];
buf[size] = '\0';
+ mfr.offset = 0;
mfr.length = size;
- mfr.fd = dummy_file.fd;
+ mfr.fd = this->dummy_file.fd;
for (int i = 0; i < SMALL_MULT; i++)
ss << dummyDataStr;
- EXPECT_EQ(write(bulk_out, ss.str().c_str(), size), size);
- EXPECT_EQ(handle->receiveFile(mfr, false), 0);
+ EXPECT_EQ(write(this->bulk_out, ss.str().c_str(), size), size);
+ EXPECT_EQ(this->handle->receiveFile(mfr, false), 0);
- EXPECT_EQ(read(dummy_file.fd, buf, size), size);
+ EXPECT_EQ(read(this->dummy_file.fd, buf, size), size);
EXPECT_STREQ(buf, ss.str().c_str());
}
-TEST_F(MtpFfsHandleTest, testReceiveFileMed) {
+TYPED_TEST(MtpFfsHandleTest, testReceiveFileMed) {
std::stringstream ss;
mtp_file_range mfr;
int size = TEST_PACKET_SIZE * MED_MULT;
char buf[size + 1];
buf[size] = '\0';
+ mfr.offset = 0;
mfr.length = size;
- mfr.fd = dummy_file.fd;
+ mfr.fd = this->dummy_file.fd;
for (int i = 0; i < MED_MULT; i++)
ss << dummyDataStr;
- EXPECT_EQ(write(bulk_out, ss.str().c_str(), size), size);
- EXPECT_EQ(handle->receiveFile(mfr, false), 0);
+ EXPECT_EQ(write(this->bulk_out, ss.str().c_str(), size), size);
+ EXPECT_EQ(this->handle->receiveFile(mfr, false), 0);
- EXPECT_EQ(read(dummy_file.fd, buf, size), size);
+ EXPECT_EQ(read(this->dummy_file.fd, buf, size), size);
EXPECT_STREQ(buf, ss.str().c_str());
}
-TEST_F(MtpFfsHandleTest, testSendFileSmall) {
+TYPED_TEST(MtpFfsHandleTest, testReceiveFileMedPartial) {
+ std::stringstream ss;
+ mtp_file_range mfr;
+ int size = TEST_PACKET_SIZE * MED_MULT;
+ char buf[size + 1];
+ buf[size] = '\0';
+
+ mfr.fd = this->dummy_file.fd;
+ for (int i = 0; i < MED_MULT; i++)
+ ss << dummyDataStr;
+
+ EXPECT_EQ(write(this->bulk_out, ss.str().c_str(), size), size);
+
+ std::random_device rd;
+ std::mt19937 gen(rd());
+ std::uniform_int_distribution<> dis(1, TEST_PACKET_SIZE);
+ int offset = 0;
+ while (offset != size) {
+ mfr.offset = offset;
+ int length = std::min(size - offset, dis(gen));
+ mfr.length = length;
+
+ EXPECT_EQ(this->handle->receiveFile(mfr, false), 0);
+ offset += length;
+ }
+
+ EXPECT_EQ(read(this->dummy_file.fd, buf, size), size);
+
+ EXPECT_STREQ(buf, ss.str().c_str());
+}
+
+TYPED_TEST(MtpFfsHandleTest, testSendFileSmall) {
std::stringstream ss;
mtp_file_range mfr;
mfr.command = 42;
@@ -154,14 +211,14 @@
buf[size + sizeof(mtp_data_header)] = '\0';
mfr.length = size;
- mfr.fd = dummy_file.fd;
+ mfr.fd = this->dummy_file.fd;
for (int i = 0; i < SMALL_MULT; i++)
ss << dummyDataStr;
- EXPECT_EQ(write(dummy_file.fd, ss.str().c_str(), size), size);
- EXPECT_EQ(handle->sendFile(mfr), 0);
+ EXPECT_EQ(write(this->dummy_file.fd, ss.str().c_str(), size), size);
+ EXPECT_EQ(this->handle->sendFile(mfr), 0);
- EXPECT_EQ(read(bulk_in, buf, size + sizeof(mtp_data_header)),
+ EXPECT_EQ(read(this->bulk_in, buf, size + sizeof(mtp_data_header)),
static_cast<long>(size + sizeof(mtp_data_header)));
struct mtp_data_header *header = reinterpret_cast<struct mtp_data_header*>(buf);
@@ -172,7 +229,7 @@
EXPECT_EQ(header->transaction_id, static_cast<unsigned int>(1337));
}
-TEST_F(MtpFfsHandleTest, testSendFileMed) {
+TYPED_TEST(MtpFfsHandleTest, testSendFileMed) {
std::stringstream ss;
mtp_file_range mfr;
mfr.command = 42;
@@ -183,14 +240,14 @@
buf[size + sizeof(mtp_data_header)] = '\0';
mfr.length = size;
- mfr.fd = dummy_file.fd;
+ mfr.fd = this->dummy_file.fd;
for (int i = 0; i < MED_MULT; i++)
ss << dummyDataStr;
- EXPECT_EQ(write(dummy_file.fd, ss.str().c_str(), size), size);
- EXPECT_EQ(handle->sendFile(mfr), 0);
+ EXPECT_EQ(write(this->dummy_file.fd, ss.str().c_str(), size), size);
+ EXPECT_EQ(this->handle->sendFile(mfr), 0);
- EXPECT_EQ(read(bulk_in, buf, size + sizeof(mtp_data_header)),
+ EXPECT_EQ(read(this->bulk_in, buf, size + sizeof(mtp_data_header)),
static_cast<long>(size + sizeof(mtp_data_header)));
struct mtp_data_header *header = reinterpret_cast<struct mtp_data_header*>(buf);
@@ -201,10 +258,10 @@
EXPECT_EQ(header->transaction_id, static_cast<unsigned int>(1337));
}
-TEST_F(MtpFfsHandleTest, testSendFileMedPartial) {
+TYPED_TEST(MtpFfsHandleTest, testSendFileMedPartial) {
std::stringstream ss;
mtp_file_range mfr;
- mfr.fd = dummy_file.fd;
+ mfr.fd = this->dummy_file.fd;
mfr.command = 42;
mfr.transaction_id = 1337;
int size = TEST_PACKET_SIZE * MED_MULT;
@@ -214,7 +271,7 @@
for (int i = 0; i < MED_MULT; i++)
ss << dummyDataStr;
- EXPECT_EQ(write(dummy_file.fd, ss.str().c_str(), size), size);
+ EXPECT_EQ(write(this->dummy_file.fd, ss.str().c_str(), size), size);
std::random_device rd;
std::mt19937 gen(rd());
@@ -225,9 +282,9 @@
int length = std::min(size - offset, dis(gen));
mfr.length = length;
char temp_buf[length + sizeof(mtp_data_header)];
- EXPECT_EQ(handle->sendFile(mfr), 0);
+ EXPECT_EQ(this->handle->sendFile(mfr), 0);
- EXPECT_EQ(read(bulk_in, temp_buf, length + sizeof(mtp_data_header)),
+ EXPECT_EQ(read(this->bulk_in, temp_buf, length + sizeof(mtp_data_header)),
static_cast<long>(length + sizeof(mtp_data_header)));
struct mtp_data_header *header = reinterpret_cast<struct mtp_data_header*>(temp_buf);
@@ -241,7 +298,7 @@
EXPECT_STREQ(buf, ss.str().c_str());
}
-TEST_F(MtpFfsHandleTest, testSendFileEmpty) {
+TYPED_TEST(MtpFfsHandleTest, testSendFileEmpty) {
mtp_file_range mfr;
mfr.command = 42;
mfr.transaction_id = 1337;
@@ -251,11 +308,11 @@
buf[size + sizeof(mtp_data_header)] = '\0';
mfr.length = size;
- mfr.fd = dummy_file.fd;
+ mfr.fd = this->dummy_file.fd;
- EXPECT_EQ(handle->sendFile(mfr), 0);
+ EXPECT_EQ(this->handle->sendFile(mfr), 0);
- EXPECT_EQ(read(bulk_in, buf, size + sizeof(mtp_data_header)),
+ EXPECT_EQ(read(this->bulk_in, buf, size + sizeof(mtp_data_header)),
static_cast<long>(size + sizeof(mtp_data_header)));
struct mtp_data_header *header = reinterpret_cast<struct mtp_data_header*>(buf);
@@ -265,15 +322,15 @@
EXPECT_EQ(header->transaction_id, static_cast<unsigned int>(1337));
}
-TEST_F(MtpFfsHandleTest, testSendEvent) {
+TYPED_TEST(MtpFfsHandleTest, testSendEvent) {
struct mtp_event event;
event.length = TEST_PACKET_SIZE;
event.data = const_cast<char*>(dummyDataStr.c_str());
char buf[TEST_PACKET_SIZE + 1];
buf[TEST_PACKET_SIZE] = '\0';
- handle->sendEvent(event);
- read(intr, buf, TEST_PACKET_SIZE);
+ this->handle->sendEvent(event);
+ read(this->intr, buf, TEST_PACKET_SIZE);
EXPECT_STREQ(buf, dummyDataStr.c_str());
}
diff --git a/media/mtp/tests/PosixAsyncIO_test.cpp b/media/mtp/tests/PosixAsyncIO_test.cpp
new file mode 100644
index 0000000..63b9a35
--- /dev/null
+++ b/media/mtp/tests/PosixAsyncIO_test.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define LOG_TAG "PosixAsyncIO_test.cpp"
+
+#include <android-base/test_utils.h>
+#include <fcntl.h>
+#include <gtest/gtest.h>
+#include <string>
+#include <unistd.h>
+#include <utils/Log.h>
+
+#include "PosixAsyncIO.h"
+
+namespace android {
+
+constexpr int TEST_PACKET_SIZE = 512;
+
+static const std::string dummyDataStr =
+ "/*\n * Copyright 2015 The Android Open Source Project\n *\n * Licensed un"
+ "der the Apache License, Version 2.0 (the \"License\");\n * you may not us"
+ "e this file except in compliance with the License.\n * You may obtain a c"
+ "opy of the License at\n *\n * http://www.apache.org/licenses/LICENSE"
+ "-2.0\n *\n * Unless required by applicable law or agreed to in writing, s"
+ "oftware\n * distributed under the License is distributed on an \"AS IS\" "
+ "BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express o"
+ "r implied.\n * Se";
+
+
+class PosixAsyncIOTest : public ::testing::Test {
+protected:
+ TemporaryFile dummy_file;
+
+ PosixAsyncIOTest() {}
+ ~PosixAsyncIOTest() {}
+};
+
+TEST_F(PosixAsyncIOTest, testRead) {
+ char buf[TEST_PACKET_SIZE + 1];
+ buf[TEST_PACKET_SIZE] = '\0';
+ EXPECT_EQ(write(dummy_file.fd, dummyDataStr.c_str(), TEST_PACKET_SIZE), TEST_PACKET_SIZE);
+ struct aiocb aio;
+ struct aiocb *aiol[] = {&aio};
+ aio.aio_fildes = dummy_file.fd;
+ aio.aio_buf = buf;
+ aio.aio_offset = 0;
+ aio.aio_nbytes = TEST_PACKET_SIZE;
+
+ EXPECT_EQ(aio_read(&aio), 0);
+ EXPECT_EQ(aio_suspend(aiol, 1, nullptr), 0);
+ EXPECT_EQ(aio_return(&aio), TEST_PACKET_SIZE);
+ EXPECT_STREQ(buf, dummyDataStr.c_str());
+}
+
+TEST_F(PosixAsyncIOTest, testWrite) {
+ char buf[TEST_PACKET_SIZE + 1];
+ buf[TEST_PACKET_SIZE] = '\0';
+ struct aiocb aio;
+ struct aiocb *aiol[] = {&aio};
+ aio.aio_fildes = dummy_file.fd;
+ aio.aio_buf = const_cast<char*>(dummyDataStr.c_str());
+ aio.aio_offset = 0;
+ aio.aio_nbytes = TEST_PACKET_SIZE;
+
+ EXPECT_EQ(aio_write(&aio), 0);
+ EXPECT_EQ(aio_suspend(aiol, 1, nullptr), 0);
+ EXPECT_EQ(aio_return(&aio), TEST_PACKET_SIZE);
+ EXPECT_EQ(read(dummy_file.fd, buf, TEST_PACKET_SIZE), TEST_PACKET_SIZE);
+ EXPECT_STREQ(buf, dummyDataStr.c_str());
+}
+
+TEST_F(PosixAsyncIOTest, testError) {
+ char buf[TEST_PACKET_SIZE + 1];
+ buf[TEST_PACKET_SIZE] = '\0';
+ struct aiocb aio;
+ struct aiocb *aiol[] = {&aio};
+ aio.aio_fildes = -1;
+ aio.aio_buf = const_cast<char*>(dummyDataStr.c_str());
+ aio.aio_offset = 0;
+ aio.aio_nbytes = TEST_PACKET_SIZE;
+
+ EXPECT_EQ(aio_write(&aio), 0);
+ EXPECT_EQ(aio_suspend(aiol, 1, nullptr), 0);
+ EXPECT_EQ(aio_return(&aio), -1);
+ EXPECT_EQ(aio_error(&aio), EBADF);
+}
+
+} // namespace android
diff --git a/media/ndk/include/media/NdkImage.h b/media/ndk/include/media/NdkImage.h
index d7443be..d301d83 100644
--- a/media/ndk/include/media/NdkImage.h
+++ b/media/ndk/include/media/NdkImage.h
@@ -44,11 +44,7 @@
#include <android/hardware_buffer.h>
#endif /* __ANDROID_API__ >= 26 */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if __ANDROID_API__ >= 24
+__BEGIN_DECLS
/**
* AImage is an opaque type that provides access to image generated by {@link AImageReader}.
@@ -513,6 +509,8 @@
int32_t bottom;
} AImageCropRect;
+#if __ANDROID_API__ >= 24
+
/**
* Return the image back the the system and delete the AImage object from memory.
*
@@ -758,9 +756,7 @@
#endif /* __ANDROID_API__ >= 26 */
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif //_NDK_IMAGE_H
diff --git a/media/ndk/include/media/NdkImageReader.h b/media/ndk/include/media/NdkImageReader.h
index 59ae507..c9c7a6b 100644
--- a/media/ndk/include/media/NdkImageReader.h
+++ b/media/ndk/include/media/NdkImageReader.h
@@ -42,11 +42,7 @@
#include "NdkMediaError.h"
#include "NdkImage.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if __ANDROID_API__ >= 24
+__BEGIN_DECLS
/**
* AImage is an opaque type that allows direct application access to image data rendered into a
@@ -54,6 +50,8 @@
*/
typedef struct AImageReader AImageReader;
+#if __ANDROID_API__ >= 24
+
/**
* Create a new reader for images of the desired size and format.
*
@@ -436,10 +434,7 @@
#endif /* __ANDROID_API__ >= 26 */
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif //_NDK_IMAGE_READER_H
diff --git a/media/ndk/include/media/NdkMediaCodec.h b/media/ndk/include/media/NdkMediaCodec.h
index 637bf9b..144de2d 100644
--- a/media/ndk/include/media/NdkMediaCodec.h
+++ b/media/ndk/include/media/NdkMediaCodec.h
@@ -27,19 +27,18 @@
#ifndef _NDK_MEDIA_CODEC_H
#define _NDK_MEDIA_CODEC_H
+#include <stdint.h>
#include <sys/cdefs.h>
#include "NdkMediaCrypto.h"
#include "NdkMediaError.h"
#include "NdkMediaFormat.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
+__BEGIN_DECLS
struct ANativeWindow;
+typedef struct ANativeWindow ANativeWindow;
-#if __ANDROID_API__ >= 21
struct AMediaCodec;
typedef struct AMediaCodec AMediaCodec;
@@ -61,6 +60,8 @@
AMEDIACODEC_INFO_TRY_AGAIN_LATER = -1
};
+#if __ANDROID_API__ >= 21
+
/**
* Create codec by name. Use this if you know the exact codec you want to use.
* When configuring, you will need to specify whether to use the codec as an
@@ -130,17 +131,46 @@
*/
ssize_t AMediaCodec_dequeueInputBuffer(AMediaCodec*, int64_t timeoutUs);
-/**
- * Send the specified buffer to the codec for processing.
+/*
+ * __USE_FILE_OFFSET64 changes the type of off_t in LP32, which changes the ABI
+ * of these declarations to not match the platform. In that case, define these
+ * APIs in terms of int32_t instead. Passing an off_t in this situation will
+ * result in silent truncation unless the user builds with -Wconversion, but the
+ * only alternative it to not expose them at all for this configuration, which
+ * makes the whole API unusable.
+ *
+ * https://github.com/android-ndk/ndk/issues/459
*/
-media_status_t AMediaCodec_queueInputBuffer(AMediaCodec*,
- size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags);
+#if defined(__USE_FILE_OFFSET64) && !defined(__LP64__)
+#define _off_t_compat int32_t
+#else
+#define _off_t_compat off_t
+#endif /* defined(__USE_FILE_OFFSET64) && !defined(__LP64__) */
+
+#if (defined(__cplusplus) && __cplusplus >= 201103L) || \
+ __STDC_VERSION__ >= 201112L
+#include <assert.h>
+static_assert(sizeof(_off_t_compat) == sizeof(long),
+ "_off_t_compat does not match the NDK ABI. See "
+ "https://github.com/android-ndk/ndk/issues/459.");
+#endif
/**
* Send the specified buffer to the codec for processing.
*/
-media_status_t AMediaCodec_queueSecureInputBuffer(AMediaCodec*,
- size_t idx, off_t offset, AMediaCodecCryptoInfo*, uint64_t time, uint32_t flags);
+media_status_t AMediaCodec_queueInputBuffer(AMediaCodec*, size_t idx,
+ _off_t_compat offset, size_t size,
+ uint64_t time, uint32_t flags);
+
+/**
+ * Send the specified buffer to the codec for processing.
+ */
+media_status_t AMediaCodec_queueSecureInputBuffer(AMediaCodec*, size_t idx,
+ _off_t_compat offset,
+ AMediaCodecCryptoInfo*,
+ uint64_t time, uint32_t flags);
+
+#undef _off_t_compat
/**
* Get the index of the next available buffer of processed data.
@@ -179,6 +209,8 @@
media_status_t AMediaCodec_releaseOutputBufferAtTime(
AMediaCodec *mData, size_t idx, int64_t timestampNs);
+#if __ANDROID_API__ >= 26
+
/**
* Creates a Surface that can be used as the input to encoder, in place of input buffers
*
@@ -249,7 +281,7 @@
*/
media_status_t AMediaCodec_signalEndOfInputStream(AMediaCodec *mData);
-
+#endif /* __ANDROID_API__ >= 26 */
typedef enum {
AMEDIACODECRYPTOINFO_MODE_CLEAR = 0,
@@ -331,8 +363,6 @@
#endif /* __ANDROID_API__ >= 21 */
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif //_NDK_MEDIA_CODEC_H
diff --git a/media/ndk/include/media/NdkMediaCrypto.h b/media/ndk/include/media/NdkMediaCrypto.h
index 9236765..d31dbdc 100644
--- a/media/ndk/include/media/NdkMediaCrypto.h
+++ b/media/ndk/include/media/NdkMediaCrypto.h
@@ -32,17 +32,15 @@
#include <sys/types.h>
#include <stdbool.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if __ANDROID_API__ >= 21
+__BEGIN_DECLS
struct AMediaCrypto;
typedef struct AMediaCrypto AMediaCrypto;
typedef uint8_t AMediaUUID[16];
+#if __ANDROID_API__ >= 21
+
bool AMediaCrypto_isCryptoSchemeSupported(const AMediaUUID uuid);
bool AMediaCrypto_requiresSecureDecoderComponent(const char *mime);
@@ -53,8 +51,6 @@
#endif /* __ANDROID_API__ >= 21 */
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif // _NDK_MEDIA_CRYPTO_H
diff --git a/media/ndk/include/media/NdkMediaDrm.h b/media/ndk/include/media/NdkMediaDrm.h
index cba4380..9e9f4c3 100644
--- a/media/ndk/include/media/NdkMediaDrm.h
+++ b/media/ndk/include/media/NdkMediaDrm.h
@@ -33,11 +33,7 @@
#include "NdkMediaError.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if __ANDROID_API__ >= 21
+__BEGIN_DECLS
struct AMediaDrm;
typedef struct AMediaDrm AMediaDrm;
@@ -52,7 +48,6 @@
typedef AMediaDrmByteArray AMediaDrmKeySetId;
typedef AMediaDrmByteArray AMediaDrmSecureStop;
-
typedef enum AMediaDrmEventType {
/**
* This event type indicates that the app needs to request a certificate from
@@ -83,6 +78,7 @@
typedef void (*AMediaDrmEventListener)(AMediaDrm *, const AMediaDrmSessionId *sessionId,
AMediaDrmEventType eventType, int extra, const uint8_t *data, size_t dataSize);
+#if __ANDROID_API__ >= 21
/**
* Query if the given scheme identified by its UUID is supported on this device, and
@@ -452,8 +448,6 @@
#endif /* __ANDROID_API__ >= 21 */
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif //_NDK_MEDIA_DRM_H
diff --git a/media/ndk/include/media/NdkMediaError.h b/media/ndk/include/media/NdkMediaError.h
index 1b51364..da61b64 100644
--- a/media/ndk/include/media/NdkMediaError.h
+++ b/media/ndk/include/media/NdkMediaError.h
@@ -30,11 +30,7 @@
#include <sys/cdefs.h>
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if __ANDROID_API__ >= 21
+__BEGIN_DECLS
typedef enum {
AMEDIA_OK = 0,
@@ -67,10 +63,6 @@
} media_status_t;
-#endif /* __ANDROID_API__ >= 21 */
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif // _NDK_MEDIA_ERROR_H
diff --git a/media/ndk/include/media/NdkMediaExtractor.h b/media/ndk/include/media/NdkMediaExtractor.h
index c3180dc..bf0e46d 100644
--- a/media/ndk/include/media/NdkMediaExtractor.h
+++ b/media/ndk/include/media/NdkMediaExtractor.h
@@ -35,15 +35,12 @@
#include "NdkMediaFormat.h"
#include "NdkMediaCrypto.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if __ANDROID_API__ >= 21
+__BEGIN_DECLS
struct AMediaExtractor;
typedef struct AMediaExtractor AMediaExtractor;
+#if __ANDROID_API__ >= 21
/**
* Create new media extractor
@@ -163,8 +160,6 @@
#endif /* __ANDROID_API__ >= 21 */
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif // _NDK_MEDIA_EXTRACTOR_H
diff --git a/media/ndk/include/media/NdkMediaFormat.h b/media/ndk/include/media/NdkMediaFormat.h
index a2a21d2..018ab76 100644
--- a/media/ndk/include/media/NdkMediaFormat.h
+++ b/media/ndk/include/media/NdkMediaFormat.h
@@ -32,15 +32,13 @@
#include "NdkMediaError.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if __ANDROID_API__ >= 21
+__BEGIN_DECLS
struct AMediaFormat;
typedef struct AMediaFormat AMediaFormat;
+#if __ANDROID_API__ >= 21
+
AMediaFormat *AMediaFormat_new();
media_status_t AMediaFormat_delete(AMediaFormat*);
@@ -109,8 +107,6 @@
#endif /* __ANDROID_API__ >= 21 */
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif // _NDK_MEDIA_FORMAT_H
diff --git a/media/ndk/include/media/NdkMediaMuxer.h b/media/ndk/include/media/NdkMediaMuxer.h
index 25987a2..1ecd1ca 100644
--- a/media/ndk/include/media/NdkMediaMuxer.h
+++ b/media/ndk/include/media/NdkMediaMuxer.h
@@ -35,11 +35,7 @@
#include "NdkMediaError.h"
#include "NdkMediaFormat.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if __ANDROID_API__ >= 21
+__BEGIN_DECLS
struct AMediaMuxer;
typedef struct AMediaMuxer AMediaMuxer;
@@ -49,6 +45,8 @@
AMEDIAMUXER_OUTPUT_FORMAT_WEBM = 1,
} OutputFormat;
+#if __ANDROID_API__ >= 21
+
/**
* Create new media muxer
*/
@@ -117,8 +115,6 @@
#endif /* __ANDROID_API__ >= 21 */
-#ifdef __cplusplus
-} // extern "C"
-#endif
+__END_DECLS
#endif // _NDK_MEDIA_MUXER_H
diff --git a/radio/OWNERS b/radio/OWNERS
new file mode 100644
index 0000000..4b38a35
--- /dev/null
+++ b/radio/OWNERS
@@ -0,0 +1,2 @@
+elaurent@google.com
+twasilczyk@google.com
diff --git a/services/OWNERS b/services/OWNERS
new file mode 100644
index 0000000..d500dce
--- /dev/null
+++ b/services/OWNERS
@@ -0,0 +1,4 @@
+elaurent@google.com
+etalvala@google.com
+gkasten@android.com
+hunga@google.com
diff --git a/services/camera/OWNERS b/services/camera/OWNERS
new file mode 100644
index 0000000..18acfee
--- /dev/null
+++ b/services/camera/OWNERS
@@ -0,0 +1,6 @@
+cychen@google.com
+epeev@google.com
+etalvala@google.com
+shuzhenwang@google.com
+yinchiayeh@google.com
+zhijunhe@google.com
diff --git a/services/camera/libcameraservice/api1/client2/Parameters.cpp b/services/camera/libcameraservice/api1/client2/Parameters.cpp
index a305bc7..1addcdd 100644
--- a/services/camera/libcameraservice/api1/client2/Parameters.cpp
+++ b/services/camera/libcameraservice/api1/client2/Parameters.cpp
@@ -2200,6 +2200,14 @@
normalizedXToArray(meteringAreas[j].right);
reqMeteringAreas[i + 3] =
normalizedYToArray(meteringAreas[j].bottom);
+ // Requested size may be zero by rounding error with/without zooming.
+ // The ae regions should be at least 1 if metering width/height is not zero.
+ if (reqMeteringAreas[i + 0] == reqMeteringAreas[i + 2]) {
+ reqMeteringAreas[i + 2]++;
+ }
+ if (reqMeteringAreas[i + 1] == reqMeteringAreas[i + 3]) {
+ reqMeteringAreas[i + 3]++;
+ }
} else {
reqMeteringAreas[i + 0] = 0;
reqMeteringAreas[i + 1] = 0;
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index 5addaf1..a02090b 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -1339,7 +1339,7 @@
desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag);
}
- descriptor = desc;
+ descriptor = std::move(desc);
return OK;
}
diff --git a/services/camera/libcameraservice/device1/CameraHardwareInterface.cpp b/services/camera/libcameraservice/device1/CameraHardwareInterface.cpp
index 469c86c..0fae598 100644
--- a/services/camera/libcameraservice/device1/CameraHardwareInterface.cpp
+++ b/services/camera/libcameraservice/device1/CameraHardwareInterface.cpp
@@ -108,58 +108,78 @@
ALOGE("%s: CameraHeapMemory has FD %d (expect >= 0)", __FUNCTION__, memPoolId);
return 0;
}
+ std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
mHidlMemPoolMap.insert(std::make_pair(memPoolId, mem));
return memPoolId;
}
hardware::Return<void> CameraHardwareInterface::unregisterMemory(uint32_t memId) {
- if (mHidlMemPoolMap.count(memId) == 0) {
- ALOGE("%s: memory pool ID %d not found", __FUNCTION__, memId);
- return hardware::Void();
+ camera_memory_t* mem = nullptr;
+ {
+ std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
+ if (mHidlMemPoolMap.count(memId) == 0) {
+ ALOGE("%s: memory pool ID %d not found", __FUNCTION__, memId);
+ return hardware::Void();
+ }
+ mem = mHidlMemPoolMap.at(memId);
+ mHidlMemPoolMap.erase(memId);
}
- camera_memory_t* mem = mHidlMemPoolMap.at(memId);
sPutMemory(mem);
- mHidlMemPoolMap.erase(memId);
return hardware::Void();
}
hardware::Return<void> CameraHardwareInterface::dataCallback(
DataCallbackMsg msgType, uint32_t data, uint32_t bufferIndex,
const hardware::camera::device::V1_0::CameraFrameMetadata& metadata) {
- if (mHidlMemPoolMap.count(data) == 0) {
- ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
- return hardware::Void();
+ camera_memory_t* mem = nullptr;
+ {
+ std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
+ if (mHidlMemPoolMap.count(data) == 0) {
+ ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
+ return hardware::Void();
+ }
+ mem = mHidlMemPoolMap.at(data);
}
camera_frame_metadata_t md;
md.number_of_faces = metadata.faces.size();
md.faces = (camera_face_t*) metadata.faces.data();
- sDataCb((int32_t) msgType, mHidlMemPoolMap.at(data), bufferIndex, &md, this);
+ sDataCb((int32_t) msgType, mem, bufferIndex, &md, this);
return hardware::Void();
}
hardware::Return<void> CameraHardwareInterface::dataCallbackTimestamp(
DataCallbackMsg msgType, uint32_t data,
uint32_t bufferIndex, int64_t timestamp) {
- if (mHidlMemPoolMap.count(data) == 0) {
- ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
- return hardware::Void();
+ camera_memory_t* mem = nullptr;
+ {
+ std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
+ if (mHidlMemPoolMap.count(data) == 0) {
+ ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
+ return hardware::Void();
+ }
+ mem = mHidlMemPoolMap.at(data);
}
- sDataCbTimestamp(timestamp, (int32_t) msgType, mHidlMemPoolMap.at(data), bufferIndex, this);
+ sDataCbTimestamp(timestamp, (int32_t) msgType, mem, bufferIndex, this);
return hardware::Void();
}
hardware::Return<void> CameraHardwareInterface::handleCallbackTimestamp(
DataCallbackMsg msgType, const hidl_handle& frameData, uint32_t data,
uint32_t bufferIndex, int64_t timestamp) {
- if (mHidlMemPoolMap.count(data) == 0) {
- ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
- return hardware::Void();
+ camera_memory_t* mem = nullptr;
+ {
+ std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
+ if (mHidlMemPoolMap.count(data) == 0) {
+ ALOGE("%s: memory pool ID %d not found", __FUNCTION__, data);
+ return hardware::Void();
+ }
+ mem = mHidlMemPoolMap.at(data);
}
- sp<CameraHeapMemory> mem(static_cast<CameraHeapMemory *>(mHidlMemPoolMap.at(data)->handle));
+ sp<CameraHeapMemory> heapMem(static_cast<CameraHeapMemory *>(mem->handle));
VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*)
- mem->mBuffers[bufferIndex]->pointer();
+ heapMem->mBuffers[bufferIndex]->pointer();
md->pHandle = const_cast<native_handle_t*>(frameData.getNativeHandle());
- sDataCbTimestamp(timestamp, (int32_t) msgType, mHidlMemPoolMap.at(data), bufferIndex, this);
+ sDataCbTimestamp(timestamp, (int32_t) msgType, mem, bufferIndex, this);
return hardware::Void();
}
@@ -168,27 +188,28 @@
const hardware::hidl_vec<hardware::camera::device::V1_0::HandleTimestampMessage>& messages) {
std::vector<android::HandleTimestampMessage> msgs;
msgs.reserve(messages.size());
+ {
+ std::lock_guard<std::mutex> lock(mHidlMemPoolMapLock);
+ for (const auto& hidl_msg : messages) {
+ if (mHidlMemPoolMap.count(hidl_msg.data) == 0) {
+ ALOGE("%s: memory pool ID %d not found", __FUNCTION__, hidl_msg.data);
+ return hardware::Void();
+ }
+ sp<CameraHeapMemory> mem(
+ static_cast<CameraHeapMemory *>(mHidlMemPoolMap.at(hidl_msg.data)->handle));
- for (const auto& hidl_msg : messages) {
- if (mHidlMemPoolMap.count(hidl_msg.data) == 0) {
- ALOGE("%s: memory pool ID %d not found", __FUNCTION__, hidl_msg.data);
- return hardware::Void();
+ if (hidl_msg.bufferIndex >= mem->mNumBufs) {
+ ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
+ hidl_msg.bufferIndex, mem->mNumBufs);
+ return hardware::Void();
+ }
+ VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*)
+ mem->mBuffers[hidl_msg.bufferIndex]->pointer();
+ md->pHandle = const_cast<native_handle_t*>(hidl_msg.frameData.getNativeHandle());
+
+ msgs.push_back({hidl_msg.timestamp, mem->mBuffers[hidl_msg.bufferIndex]});
}
- sp<CameraHeapMemory> mem(
- static_cast<CameraHeapMemory *>(mHidlMemPoolMap.at(hidl_msg.data)->handle));
-
- if (hidl_msg.bufferIndex >= mem->mNumBufs) {
- ALOGE("%s: invalid buffer index %d, max allowed is %d", __FUNCTION__,
- hidl_msg.bufferIndex, mem->mNumBufs);
- return hardware::Void();
- }
- VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*)
- mem->mBuffers[hidl_msg.bufferIndex]->pointer();
- md->pHandle = const_cast<native_handle_t*>(hidl_msg.frameData.getNativeHandle());
-
- msgs.push_back({hidl_msg.timestamp, mem->mBuffers[hidl_msg.bufferIndex]});
}
-
mDataCbTimestampBatch((int32_t) msgType, msgs, mCbUser);
return hardware::Void();
}
diff --git a/services/camera/libcameraservice/device1/CameraHardwareInterface.h b/services/camera/libcameraservice/device1/CameraHardwareInterface.h
index 1c38d00..2f1e2e9 100644
--- a/services/camera/libcameraservice/device1/CameraHardwareInterface.h
+++ b/services/camera/libcameraservice/device1/CameraHardwareInterface.h
@@ -523,6 +523,7 @@
uint64_t mNextBufferId = 1;
static const uint64_t BUFFER_ID_NO_BUFFER = 0;
+ std::mutex mHidlMemPoolMapLock; // protecting mHidlMemPoolMap
std::unordered_map<int, camera_memory_t*> mHidlMemPoolMap;
};
diff --git a/services/mediacodec/OWNERS b/services/mediacodec/OWNERS
new file mode 100644
index 0000000..c716cce
--- /dev/null
+++ b/services/mediacodec/OWNERS
@@ -0,0 +1,2 @@
+jeffv@google.com
+marcone@google.com
diff --git a/services/mediacodec/seccomp_policy/mediacodec-arm.policy b/services/mediacodec/seccomp_policy/mediacodec-arm.policy
index cbd7fb9..a751b4c 100644
--- a/services/mediacodec/seccomp_policy/mediacodec-arm.policy
+++ b/services/mediacodec/seccomp_policy/mediacodec-arm.policy
@@ -53,6 +53,7 @@
fstatat64: 1
ugetrlimit: 1
getdents64: 1
+getrandom: 1
# for attaching to debuggerd on process crash
sigaction: 1
@@ -68,3 +69,4 @@
recvmsg: 1
getpid: 1
gettid: 1
+process_vm_readv: 1
diff --git a/services/mediadrm/OWNERS b/services/mediadrm/OWNERS
new file mode 100644
index 0000000..6d3b533
--- /dev/null
+++ b/services/mediadrm/OWNERS
@@ -0,0 +1,2 @@
+jtinker@google.com
+marcone@google.com
diff --git a/services/mediaextractor/OWNERS b/services/mediaextractor/OWNERS
new file mode 100644
index 0000000..c716cce
--- /dev/null
+++ b/services/mediaextractor/OWNERS
@@ -0,0 +1,2 @@
+jeffv@google.com
+marcone@google.com
diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy b/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy
index 23d349d..4fa69d7 100644
--- a/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy
+++ b/services/mediaextractor/seccomp_policy/mediaextractor-arm.policy
@@ -39,6 +39,7 @@
getegid32: 1
getgroups32: 1
nanosleep: 1
+getrandom: 1
# for FileSource
readlinkat: 1
@@ -61,3 +62,4 @@
ppoll: 1
getpid: 1
gettid: 1
+process_vm_readv: 1
diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy b/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy
index 42e0d75..d1278a9 100644
--- a/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy
+++ b/services/mediaextractor/seccomp_policy/mediaextractor-arm64.policy
@@ -28,10 +28,10 @@
rt_sigreturn: 1
getrlimit: 1
nanosleep: 1
+getrandom: 1
# for FileSource
readlinkat: 1
-_llseek: 1
# for attaching to debuggerd on process crash
tgkill: 1
@@ -52,3 +52,4 @@
ppoll: 1
getpid: 1
gettid: 1
+process_vm_readv: 1
diff --git a/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy b/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy
index 76403f2..3b37f92 100644
--- a/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy
+++ b/services/mediaextractor/seccomp_policy/mediaextractor-x86.policy
@@ -37,6 +37,7 @@
getegid32: 1
getgroups32: 1
nanosleep: 1
+getrandom: 1
# for FileSource
readlinkat: 1
@@ -56,6 +57,7 @@
getdents64: 1
pipe2: 1
ppoll: 1
+process_vm_readv: 1
# Required by AddressSanitizer
gettid: 1
diff --git a/services/medialog/OWNERS b/services/medialog/OWNERS
new file mode 100644
index 0000000..fb8b8ee
--- /dev/null
+++ b/services/medialog/OWNERS
@@ -0,0 +1,3 @@
+elaurent@google.com
+gkasten@android.com
+hunga@google.com
diff --git a/services/mediaresourcemanager/OWNERS b/services/mediaresourcemanager/OWNERS
new file mode 100644
index 0000000..82abf8f
--- /dev/null
+++ b/services/mediaresourcemanager/OWNERS
@@ -0,0 +1 @@
+dwkang@google.com
diff --git a/services/minijail/Android.mk b/services/minijail/Android.mk
index b6fcacc..6b35d91 100644
--- a/services/minijail/Android.mk
+++ b/services/minijail/Android.mk
@@ -13,7 +13,7 @@
LOCAL_MODULE := libavservices_minijail_vendor
LOCAL_VENDOR_MODULE := true
LOCAL_SRC_FILES := minijail.cpp
-LOCAL_SHARED_LIBRARIES := libbase libminijail_vendor
+LOCAL_SHARED_LIBRARIES := libbase libminijail
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)
diff --git a/services/oboeservice/SharedMemoryProxy.cpp b/services/oboeservice/SharedMemoryProxy.cpp
index fc4532c..fb991bb 100644
--- a/services/oboeservice/SharedMemoryProxy.cpp
+++ b/services/oboeservice/SharedMemoryProxy.cpp
@@ -16,12 +16,14 @@
#define LOG_TAG "AAudioService"
//#define LOG_NDEBUG 0
-#include <utils/Log.h>
+#include <log/log.h>
+
+#include <errno.h>
+#include <string.h>
#include <aaudio/AAudio.h>
#include "SharedMemoryProxy.h"
-using namespace android;
using namespace aaudio;
SharedMemoryProxy::~SharedMemoryProxy()
diff --git a/services/radio/OWNERS b/services/radio/OWNERS
new file mode 100644
index 0000000..eb9549a
--- /dev/null
+++ b/services/radio/OWNERS
@@ -0,0 +1,3 @@
+elaurent@google.com
+hunga@google.com
+twasilczyk@google.com
diff --git a/services/soundtrigger/OWNERS b/services/soundtrigger/OWNERS
new file mode 100644
index 0000000..e83f6b9
--- /dev/null
+++ b/services/soundtrigger/OWNERS
@@ -0,0 +1,2 @@
+elaurent@google.com
+thorntonc@google.com
diff --git a/soundtrigger/OWNERS b/soundtrigger/OWNERS
new file mode 100644
index 0000000..e83f6b9
--- /dev/null
+++ b/soundtrigger/OWNERS
@@ -0,0 +1,2 @@
+elaurent@google.com
+thorntonc@google.com
diff --git a/tools/OWNERS b/tools/OWNERS
new file mode 100644
index 0000000..6dcb035
--- /dev/null
+++ b/tools/OWNERS
@@ -0,0 +1 @@
+gkasten@android.com