Merge changes I835ec033,I11aa8f88
* changes:
AudioResampler: Add downsampling filter response test
AudioResampler: Minor test code fixes
diff --git a/apex/ld.config.txt b/apex/ld.config.txt
index d50b353..2daeeac 100644
--- a/apex/ld.config.txt
+++ b/apex/ld.config.txt
@@ -48,7 +48,7 @@
# TODO: replace the following when apex has a way to auto-generate this list
# namespace.default.link.platform.shared_libs = %LLNDK_LIBRARIES%
# namespace.default.link.platform.shared_libs += %SANITIZER_RUNTIME_LIBRARIES%
-namespace.default.link.platform.shared_libs = libEGL.so:libGLESv1_CM.so:libGLESv2.so:libGLESv3.so:libRS.so:libandroid_net.so:libc.so:libclang_rt.asan-aarch64-android.so:libclang_rt.asan-arm-android.so:libclang_rt.hwasan-aarch64-android.so:libclang_rt.asan-i686-android.so:libclang_rt.asan-x86_64-android.so:libdl.so:libft2.so:liblog.so:libm.so:libmediandk.so:libnativewindow.so:libneuralnetworks.so:libsync.so:libvndksupport.so:libvulkan.so
+namespace.default.link.platform.shared_libs = libEGL.so:libGLESv1_CM.so:libGLESv2.so:libGLESv3.so:libRS.so:libandroid_net.so:libc.so:libcgrouprc.so:libclang_rt.asan-aarch64-android.so:libclang_rt.asan-arm-android.so:libclang_rt.hwasan-aarch64-android.so:libclang_rt.asan-i686-android.so:libclang_rt.asan-x86_64-android.so:libdl.so:libft2.so:liblog.so:libm.so:libmediandk.so:libnativewindow.so:libneuralnetworks.so:libsync.so:libvndksupport.so:libvulkan.so
# FIXME: b/129552044
namespace.default.link.platform.shared_libs += libz.so
diff --git a/media/libaaudio/include/aaudio/AAudio.h b/media/libaaudio/include/aaudio/AAudio.h
index 1c1df6c..ee5d089 100644
--- a/media/libaaudio/include/aaudio/AAudio.h
+++ b/media/libaaudio/include/aaudio/AAudio.h
@@ -510,11 +510,11 @@
* Request an audio device identified device using an ID.
* On Android, for example, the ID could be obtained from the Java AudioManager.
*
- * The default, if you do not call this function, is AAUDIO_UNSPECIFIED,
+ * The default, if you do not call this function, is {@link #AAUDIO_UNSPECIFIED},
* in which case the primary device will be used.
*
* @param builder reference provided by AAudio_createStreamBuilder()
- * @param deviceId device identifier or AAUDIO_UNSPECIFIED
+ * @param deviceId device identifier or {@link #AAUDIO_UNSPECIFIED}
*/
AAUDIO_API void AAudioStreamBuilder_setDeviceId(AAudioStreamBuilder* builder,
int32_t deviceId) __INTRODUCED_IN(26);
diff --git a/media/libaaudio/libaaudio.map.txt b/media/libaaudio/libaaudio.map.txt
index cbf5921..a87ede3 100644
--- a/media/libaaudio/libaaudio.map.txt
+++ b/media/libaaudio/libaaudio.map.txt
@@ -20,6 +20,7 @@
AAudioStreamBuilder_setUsage; # introduced=28
AAudioStreamBuilder_setContentType; # introduced=28
AAudioStreamBuilder_setInputPreset; # introduced=28
+ AAudioStreamBuilder_setAllowedCapturePolicy; # introduced=29
AAudioStreamBuilder_setSessionId; # introduced=28
AAudioStreamBuilder_openStream;
AAudioStreamBuilder_delete;
@@ -49,6 +50,7 @@
AAudioStream_getUsage; # introduced=28
AAudioStream_getContentType; # introduced=28
AAudioStream_getInputPreset; # introduced=28
+ AAudioStream_getAllowedCapturePolicy; # introduced=29
AAudioStream_getFramesWritten;
AAudioStream_getFramesRead;
AAudioStream_getSessionId; # introduced=28
diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp
index a713900..d78d729 100644
--- a/media/libstagefright/AudioSource.cpp
+++ b/media/libstagefright/AudioSource.cpp
@@ -431,19 +431,17 @@
void AudioSource::queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs) {
const size_t bufferSize = buffer->range_length();
const size_t frameSize = mRecord->frameSize();
- const int64_t timestampUs =
- mPrevSampleTimeUs +
- ((1000000LL * (bufferSize / frameSize)) +
- (mSampleRate >> 1)) / mSampleRate;
-
if (mNumFramesReceived == 0) {
buffer->meta_data().setInt64(kKeyAnchorTime, mStartTimeUs);
}
-
+ mNumFramesReceived += bufferSize / frameSize;
+ const int64_t timestampUs =
+ mStartTimeUs +
+ ((1000000LL * mNumFramesReceived) +
+ (mSampleRate >> 1)) / mSampleRate;
buffer->meta_data().setInt64(kKeyTime, mPrevSampleTimeUs);
buffer->meta_data().setInt64(kKeyDriftTime, timeUs - mInitialReadTimeUs);
mPrevSampleTimeUs = timestampUs;
- mNumFramesReceived += bufferSize / frameSize;
mBuffersReceived.push_back(buffer);
mFrameAvailableCondition.signal();
}
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 1ec419a..2f13dc9 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -72,6 +72,7 @@
static const int64_t kInitialDelayTimeUs = 700000LL;
static const int64_t kMaxMetadataSize = 0x4000000LL; // 64MB max per-frame metadata size
static const int64_t kMaxCttsOffsetTimeUs = 30 * 60 * 1000000LL; // 30 minutes
+static const size_t kESDSScratchBufferSize = 10; // kMaxAtomSize in Mpeg4Extractor 64MB
static const char kMetaKey_Version[] = "com.android.version";
static const char kMetaKey_Manufacturer[] = "com.android.manufacturer";
@@ -3882,22 +3883,52 @@
mOwner->endBox();
}
+static void generateEsdsSize(size_t dataLength, size_t* sizeGenerated, uint8_t* buffer) {
+ size_t offset = 0, cur = 0;
+ size_t more = 0x00;
+ *sizeGenerated = 0;
+ /* Start with the LSB(7 bits) of dataLength and build the byte sequence upto MSB.
+ * Continuation flag(most significant bit) will be set on the first N-1 bytes.
+ */
+ do {
+ buffer[cur++] = (dataLength & 0x7f) | more;
+ dataLength >>= 7;
+ more = 0x80;
+ ++(*sizeGenerated);
+ } while (dataLength > 0u);
+ --cur;
+ // Reverse the newly formed byte sequence.
+ while (cur > offset) {
+ uint8_t tmp = buffer[cur];
+ buffer[cur--] = buffer[offset];
+ buffer[offset++] = tmp;
+ }
+}
+
void MPEG4Writer::Track::writeMp4aEsdsBox() {
- mOwner->beginBox("esds");
CHECK(mCodecSpecificData);
CHECK_GT(mCodecSpecificDataSize, 0u);
- // Make sure all sizes encode to a single byte.
- CHECK_LT(mCodecSpecificDataSize + 23, 128u);
+ uint8_t sizeESDBuffer[kESDSScratchBufferSize];
+ uint8_t sizeDCDBuffer[kESDSScratchBufferSize];
+ uint8_t sizeDSIBuffer[kESDSScratchBufferSize];
+ size_t sizeESD = 0;
+ size_t sizeDCD = 0;
+ size_t sizeDSI = 0;
+ generateEsdsSize(mCodecSpecificDataSize, &sizeDSI, sizeDSIBuffer);
+ generateEsdsSize(mCodecSpecificDataSize + sizeDSI + 14, &sizeDCD, sizeDCDBuffer);
+ generateEsdsSize(mCodecSpecificDataSize + sizeDSI + sizeDCD + 21, &sizeESD, sizeESDBuffer);
+
+ mOwner->beginBox("esds");
mOwner->writeInt32(0); // version=0, flags=0
mOwner->writeInt8(0x03); // ES_DescrTag
- mOwner->writeInt8(23 + mCodecSpecificDataSize);
+ mOwner->write(sizeESDBuffer, sizeESD);
mOwner->writeInt16(0x0000);// ES_ID
mOwner->writeInt8(0x00);
mOwner->writeInt8(0x04); // DecoderConfigDescrTag
- mOwner->writeInt8(15 + mCodecSpecificDataSize);
+ mOwner->write(sizeDCDBuffer, sizeDCD);
mOwner->writeInt8(0x40); // objectTypeIndication ISO/IEC 14492-2
mOwner->writeInt8(0x15); // streamType AudioStream
@@ -3912,7 +3943,7 @@
mOwner->writeInt32(avgBitrate);
mOwner->writeInt8(0x05); // DecoderSpecificInfoTag
- mOwner->writeInt8(mCodecSpecificDataSize);
+ mOwner->write(sizeDSIBuffer, sizeDSI);
mOwner->write(mCodecSpecificData, mCodecSpecificDataSize);
static const uint8_t kData2[] = {
@@ -3929,20 +3960,27 @@
CHECK(mCodecSpecificData);
CHECK_GT(mCodecSpecificDataSize, 0u);
- // Make sure all sizes encode to a single byte.
- CHECK_LT(23 + mCodecSpecificDataSize, 128u);
+ uint8_t sizeESDBuffer[kESDSScratchBufferSize];
+ uint8_t sizeDCDBuffer[kESDSScratchBufferSize];
+ uint8_t sizeDSIBuffer[kESDSScratchBufferSize];
+ size_t sizeESD = 0;
+ size_t sizeDCD = 0;
+ size_t sizeDSI = 0;
+ generateEsdsSize(mCodecSpecificDataSize, &sizeDSI, sizeDSIBuffer);
+ generateEsdsSize(mCodecSpecificDataSize + sizeDSI + 14, &sizeDCD, sizeDCDBuffer);
+ generateEsdsSize(mCodecSpecificDataSize + sizeDSI + sizeDCD + 21, &sizeESD, sizeESDBuffer);
mOwner->beginBox("esds");
mOwner->writeInt32(0); // version=0, flags=0
mOwner->writeInt8(0x03); // ES_DescrTag
- mOwner->writeInt8(23 + mCodecSpecificDataSize);
+ mOwner->write(sizeESDBuffer, sizeESD);
mOwner->writeInt16(0x0000); // ES_ID
mOwner->writeInt8(0x1f);
mOwner->writeInt8(0x04); // DecoderConfigDescrTag
- mOwner->writeInt8(15 + mCodecSpecificDataSize);
+ mOwner->write(sizeDCDBuffer, sizeDCD);
mOwner->writeInt8(0x20); // objectTypeIndication ISO/IEC 14492-2
mOwner->writeInt8(0x11); // streamType VisualStream
@@ -3960,7 +3998,7 @@
mOwner->writeInt8(0x05); // DecoderSpecificInfoTag
- mOwner->writeInt8(mCodecSpecificDataSize);
+ mOwner->write(sizeDSIBuffer, sizeDSI);
mOwner->write(mCodecSpecificData, mCodecSpecificDataSize);
static const uint8_t kData2[] = {
diff --git a/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp b/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp
index 41a9e98..621fda8 100644
--- a/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp
+++ b/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp
@@ -67,6 +67,7 @@
int bytesRead = fread(header, 1, kFileHeaderSize, fpInput);
if (bytesRead != kFileHeaderSize || memcmp(header, "#!AMR\n", kFileHeaderSize)) {
fprintf(stderr, "Invalid AMR-NB file\n");
+ fclose(fpInput);
return 1;
}
@@ -79,6 +80,7 @@
SNDFILE *handle = sf_open(argv[2], SFM_WRITE, &sfInfo);
if(!handle){
fprintf(stderr, "Could not create %s\n", argv[2]);
+ fclose(fpInput);
return 1;
}
@@ -87,6 +89,8 @@
int err = GSMInitDecode(&amrHandle, (Word8*)"AMRNBDecoder");
if(err != 0){
fprintf(stderr, "Error creating AMR-NB decoder instance\n");
+ fclose(fpInput);
+ sf_close(handle);
return 1;
}
diff --git a/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c b/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c
index 7c094f3..7282de4 100644
--- a/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c
+++ b/media/libstagefright/codecs/amrwbenc/SampleCode/AMRWB_E_SAMPLE.c
@@ -134,14 +134,16 @@
if(handle == 0)
{
printf("open dll error......");
- return -1;
+ ret = -1;
+ goto safe_exit;
}
pfunc = dlsym(handle, "voGetAMRWBEncAPI");
if(pfunc == 0)
{
printf("open function error......");
- return -1;
+ ret = -1;
+ goto safe_exit;
}
pGetAPI = (VOGETAUDIOENCAPI)pfunc;
@@ -150,7 +152,8 @@
if(returnCode)
{
printf("get APIs error......");
- return -1;
+ ret = -1;
+ goto safe_exit;
}
#else
ret = voGetAMRWBEncAPI(&AudioAPI);
@@ -253,7 +256,8 @@
fclose(fdst);
#ifdef LINUX
- dlclose(handle);
+ if (handle)
+ dlclose(handle);
#endif
return ret;
diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
index 8f15016..1b812c0 100644
--- a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp
@@ -147,7 +147,10 @@
}
switch (mixMatch(policyMix.get(), i, attributes, uid)) {
- case MixMatchStatus::INVALID_MIX: return BAD_VALUE; // TODO: Do we really want to abort?
+ case MixMatchStatus::INVALID_MIX:
+ // The mix has contradictory rules, ignore it
+ // TODO: reject invalid mix at registration
+ continue;
case MixMatchStatus::NO_MATCH:
ALOGV("%s: Mix %zu: does not match", __func__, i);
continue; // skip the mix