Merge "libmediandk: replace libnativehelper to libnativehelper_lazy" into sc-dev
diff --git a/media/codec2/components/aac/C2SoftAacDec.cpp b/media/codec2/components/aac/C2SoftAacDec.cpp
index f3341ab..3e6b0ff 100644
--- a/media/codec2/components/aac/C2SoftAacDec.cpp
+++ b/media/codec2/components/aac/C2SoftAacDec.cpp
@@ -877,10 +877,14 @@
work->worklets.front()->output.configUpdate.push_back(
C2Param::Copy(currentBoostFactor));
- C2StreamDrcCompressionModeTuning::input currentCompressMode(0u,
- (C2Config::drc_compression_mode_t) compressMode);
- work->worklets.front()->output.configUpdate.push_back(
- C2Param::Copy(currentCompressMode));
+ if (android_get_device_api_level() < __ANDROID_API_S__) {
+ // We used to report DRC compression mode in the output format
+ // in Q and R, but stopped doing that in S
+ C2StreamDrcCompressionModeTuning::input currentCompressMode(0u,
+ (C2Config::drc_compression_mode_t) compressMode);
+ work->worklets.front()->output.configUpdate.push_back(
+ C2Param::Copy(currentCompressMode));
+ }
C2StreamDrcEncodedTargetLevelTuning::input currentEncodedTargetLevel(0u,
(C2FloatValue) (encTargetLevel*-0.25));
diff --git a/media/codec2/sfplugin/CCodecConfig.cpp b/media/codec2/sfplugin/CCodecConfig.cpp
index 79c6227..5decb99 100644
--- a/media/codec2/sfplugin/CCodecConfig.cpp
+++ b/media/codec2/sfplugin/CCodecConfig.cpp
@@ -765,21 +765,13 @@
// convert to compression type and add default
add(ConfigMapper(KEY_AAC_DRC_HEAVY_COMPRESSION, C2_PARAMKEY_DRC_COMPRESSION_MODE, "value")
- .limitTo(D::AUDIO & D::DECODER & (D::CONFIG | D::PARAM | D::READ))
- .withMappers([](C2Value v) -> C2Value {
+ .limitTo(D::AUDIO & D::DECODER & (D::CONFIG | D::PARAM))
+ .withMapper([](C2Value v) -> C2Value {
int32_t value;
if (!v.get(&value) || value < 0) {
value = property_get_int32(PROP_DRC_OVERRIDE_HEAVY, DRC_DEFAULT_MOBILE_DRC_HEAVY);
}
return value == 1 ? C2Config::DRC_COMPRESSION_HEAVY : C2Config::DRC_COMPRESSION_LIGHT;
- },[](C2Value v) -> C2Value {
- int32_t value;
- if (v.get(&value)) {
- return value;
- }
- else {
- return C2Value();
- }
}));
// convert to dBFS and add default
diff --git a/media/codecs/amrnb/enc/src/pitch_fr.cpp b/media/codecs/amrnb/enc/src/pitch_fr.cpp
index 5a846fa..584f79b 100644
--- a/media/codecs/amrnb/enc/src/pitch_fr.cpp
+++ b/media/codecs/amrnb/enc/src/pitch_fr.cpp
@@ -570,12 +570,14 @@
Word16 corr[], /* i : normalized correlation */
Word16 flag3, /* i : subsample resolution
(3: =1 / 6: =0) */
- Flag *pOverflow
+ Flag *pOverflow,
+ enum Mode mode
)
{
Word16 i;
Word16 max;
Word16 corr_int;
+ Word16 minPitch;
/* Test the fractions around T0 and choose the one which maximizes */
/* the interpolated normalized correlation. */
@@ -593,14 +595,22 @@
}
}
+ minPitch = (mode == MR122) ? PIT_MIN_MR122 : PIT_MIN;
if (flag3 == 0)
{
/* Limit the fraction value in the interval [-2,-1,0,1,2,3] */
if (*frac == -3)
{
- *frac = 3;
- (*lag)--;
+ if (*lag > minPitch)
+ {
+ *frac = 3;
+ (*lag)--;
+ }
+ else
+ {
+ *frac = -2;
+ }
}
}
else
@@ -609,13 +619,27 @@
if (*frac == -2)
{
- *frac = 1;
- (*lag)--;
+ if (*lag > minPitch)
+ {
+ *frac = 1;
+ (*lag)--;
+ }
+ else
+ {
+ *frac = -1;
+ }
}
- if (*frac == 2)
+ else if (*frac == 2)
{
- *frac = -1;
- (*lag)++;
+ if (*lag < PIT_MAX)
+ {
+ *frac = -1;
+ (*lag)++;
+ }
+ else
+ {
+ *frac = 1;
+ }
}
}
}
@@ -1533,20 +1557,20 @@
/* normal search in fractions around T0 */
- searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);
+ searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow, mode);
}
else if (lag == (tmp_lag - 2))
{
/* limit search around T0 to the right side */
frac = 0;
- searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);
+ searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow, mode);
}
else if (lag == (tmp_lag + 1))
{
/* limit search around T0 to the left side */
last_frac = 0;
- searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);
+ searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow, mode);
}
else
{
@@ -1556,7 +1580,7 @@
}
else
/* test the fractions around T0 */
- searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow);
+ searchFrac(&lag, &frac, last_frac, corr, flag3, pOverflow, mode);
}
/*-----------------------------------------------------------------------*
diff --git a/media/codecs/mp3dec/src/pvmp3_framedecoder.cpp b/media/codecs/mp3dec/src/pvmp3_framedecoder.cpp
index 15d2feb..5cf1ed3 100644
--- a/media/codecs/mp3dec/src/pvmp3_framedecoder.cpp
+++ b/media/codecs/mp3dec/src/pvmp3_framedecoder.cpp
@@ -598,18 +598,10 @@
}
else
{
- int32 tmp1 = *(ptr++);
- for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--) /* read main data. */
+ for (int32 nBytes = temp; nBytes != 0; nBytes--) /* read main data. */
{
- int32 tmp2 = *(ptr++);
- fillDataBuf(&pVars->mainDataStream, tmp1);
- fillDataBuf(&pVars->mainDataStream, tmp2);
- tmp1 = *(ptr++);
- }
-
- if (temp&1)
- {
- fillDataBuf(&pVars->mainDataStream, tmp1);
+ int32 tmp = *(ptr++);
+ fillDataBuf(&pVars->mainDataStream, tmp);
}
/* adjust circular buffer counter */
@@ -618,14 +610,9 @@
}
else
{
- for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--) /* read main data. */
+ for (int32 nBytes = temp; nBytes != 0; nBytes--) /* read main data. */
{
fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++ , BUFSIZE)));
- fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++ , BUFSIZE)));
- }
- if (temp&1)
- {
- fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset , BUFSIZE)));
}
}
diff --git a/media/libeffects/preprocessing/tests/Android.bp b/media/libeffects/preprocessing/tests/Android.bp
index 5e8255a..ff897e8 100644
--- a/media/libeffects/preprocessing/tests/Android.bp
+++ b/media/libeffects/preprocessing/tests/Android.bp
@@ -18,6 +18,7 @@
"libaudioeffects",
"libhardware_headers",
],
+ gtest: false,
}
cc_test {
@@ -29,4 +30,5 @@
"-Werror",
"-Wextra",
],
+ gtest: false,
}
diff --git a/media/libmediaplayerservice/tests/stagefrightRecorder/AndroidTest.xml b/media/libmediaplayerservice/tests/stagefrightRecorder/AndroidTest.xml
new file mode 100644
index 0000000..427026d
--- /dev/null
+++ b/media/libmediaplayerservice/tests/stagefrightRecorder/AndroidTest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<configuration description="Test module config for StagefrightRecorder unit tests">
+ <option name="test-suite-tag" value="StagefrightRecorderTest" />
+ <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer">
+ <option name="force-root" value="true" />
+ </target_preparer>
+ <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
+ <option name="cleanup" value="true" />
+ <option name="push"
+ value="StagefrightRecorderTest->/data/local/tmp/StagefrightRecorderTest" />
+ </target_preparer>
+
+ <test class="com.android.tradefed.testtype.GTest" >
+ <option name="native-test-device-path" value="/data/local/tmp" />
+ <option name="module-name" value="StagefrightRecorderTest" />
+ </test>
+</configuration>
diff --git a/media/libmediatranscoding/transcoder/MediaSampleReaderNDK.cpp b/media/libmediatranscoding/transcoder/MediaSampleReaderNDK.cpp
index 1a6e7ed..8d36e31 100644
--- a/media/libmediatranscoding/transcoder/MediaSampleReaderNDK.cpp
+++ b/media/libmediatranscoding/transcoder/MediaSampleReaderNDK.cpp
@@ -98,6 +98,9 @@
mTrackCursors[mExtractorTrackIndex].next.reset();
}
+ // Update the extractor's sample index even if this track reaches EOS, so that the other tracks
+ // are not given an incorrect extractor position.
+ mExtractorSampleIndex++;
if (!AMediaExtractor_advance(mExtractor)) {
LOG(DEBUG) << " EOS in advanceExtractor_l";
mEosReached = true;
@@ -108,7 +111,6 @@
}
mExtractorTrackIndex = AMediaExtractor_getSampleTrackIndex(mExtractor);
- mExtractorSampleIndex++;
SampleCursor& cursor = mTrackCursors[mExtractorTrackIndex];
if (mExtractorSampleIndex > cursor.previous.index) {
diff --git a/media/libmediatranscoding/transcoder/tests/MediaSampleReaderNDKTests.cpp b/media/libmediatranscoding/transcoder/tests/MediaSampleReaderNDKTests.cpp
index 11af0b1..3a499e5 100644
--- a/media/libmediatranscoding/transcoder/tests/MediaSampleReaderNDKTests.cpp
+++ b/media/libmediatranscoding/transcoder/tests/MediaSampleReaderNDKTests.cpp
@@ -272,6 +272,38 @@
compareSamples(tester.getSamples());
}
+/** Reads all samples except the last in each track, before finishing. */
+TEST_F(MediaSampleReaderNDKTests, TestLastSampleBeforeEOS) {
+ LOG(DEBUG) << "TestLastSampleBeforeEOS Starts";
+ initExtractorSamples();
+
+ { // Natural track order
+ SampleAccessTester tester{mSourceFd, mFileSize};
+ for (int trackIndex = 0; trackIndex < mTrackCount; ++trackIndex) {
+ tester.readSamplesAsync(trackIndex, mExtractorSamples[trackIndex].size() - 1);
+ }
+ tester.waitForTracks();
+ for (int trackIndex = 0; trackIndex < mTrackCount; ++trackIndex) {
+ tester.readSamplesAsync(trackIndex, SAMPLE_COUNT_ALL);
+ tester.waitForTrack(trackIndex);
+ }
+ compareSamples(tester.getSamples());
+ }
+
+ { // Reverse track order
+ SampleAccessTester tester{mSourceFd, mFileSize};
+ for (int trackIndex = mTrackCount - 1; trackIndex >= 0; --trackIndex) {
+ tester.readSamplesAsync(trackIndex, mExtractorSamples[trackIndex].size() - 1);
+ }
+ tester.waitForTracks();
+ for (int trackIndex = mTrackCount - 1; trackIndex >= 0; --trackIndex) {
+ tester.readSamplesAsync(trackIndex, SAMPLE_COUNT_ALL);
+ tester.waitForTrack(trackIndex);
+ }
+ compareSamples(tester.getSamples());
+ }
+}
+
/** Reads all samples from all tracks sequentially. */
TEST_F(MediaSampleReaderNDKTests, TestSequentialSampleAccess) {
LOG(DEBUG) << "TestSequentialSampleAccess Starts";
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 7606d7d..3204217 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -4802,6 +4802,7 @@
ATRACE_ASYNC_BEGIN("still capture", mNextRequests[i].halRequest.frame_number);
}
+ e = camera_metadata_ro_entry_t();
find_camera_metadata_ro_entry(settings, ANDROID_CONTROL_ENABLE_ZSL, &e);
if ((e.count > 0) && (e.data.u8[0] == ANDROID_CONTROL_ENABLE_ZSL_TRUE)) {
isZslCapture = true;
diff --git a/services/tuner/TunerDemux.cpp b/services/tuner/TunerDemux.cpp
index 8346992..ba8d6a7 100644
--- a/services/tuner/TunerDemux.cpp
+++ b/services/tuner/TunerDemux.cpp
@@ -222,6 +222,8 @@
}
Result res = mDemux->close();
+ mDemux = NULL;
+
if (res != Result::SUCCESS) {
return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}
diff --git a/services/tuner/TunerDescrambler.cpp b/services/tuner/TunerDescrambler.cpp
index 6b2889d..16338db 100644
--- a/services/tuner/TunerDescrambler.cpp
+++ b/services/tuner/TunerDescrambler.cpp
@@ -97,6 +97,8 @@
}
Result res = mDescrambler->close();
+ mDescrambler = NULL;
+
if (res != Result::SUCCESS) {
return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}
diff --git a/services/tuner/TunerDvr.cpp b/services/tuner/TunerDvr.cpp
index c7227b6..db4e07b 100644
--- a/services/tuner/TunerDvr.cpp
+++ b/services/tuner/TunerDvr.cpp
@@ -154,6 +154,8 @@
}
Result res = mDvr->close();
+ mDvr = NULL;
+
if (res != Result::SUCCESS) {
return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
}
diff --git a/services/tuner/TunerFilter.cpp b/services/tuner/TunerFilter.cpp
index aee864d..dc9d246 100644
--- a/services/tuner/TunerFilter.cpp
+++ b/services/tuner/TunerFilter.cpp
@@ -542,6 +542,9 @@
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
}
Result res = mFilter->close();
+ mFilter = NULL;
+ mFilter_1_1 = NULL;
+
if (res != Result::SUCCESS) {
return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}
diff --git a/services/tuner/TunerFrontend.cpp b/services/tuner/TunerFrontend.cpp
index 68c35f6..74b5519 100644
--- a/services/tuner/TunerFrontend.cpp
+++ b/services/tuner/TunerFrontend.cpp
@@ -278,11 +278,13 @@
}
Result status = mFrontend->close();
- if (status == Result::SUCCESS) {
- return Status::ok();
- }
+ mFrontend = NULL;
+ mFrontend_1_1 = NULL;
- return Status::fromServiceSpecificError(static_cast<int32_t>(status));
+ if (status != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
+ }
+ return Status::ok();
}
Status TunerFrontend::getStatus(const vector<int32_t>& statusTypes,
diff --git a/services/tuner/TunerLnb.cpp b/services/tuner/TunerLnb.cpp
index 0bfa3fd..4a5acf5 100644
--- a/services/tuner/TunerLnb.cpp
+++ b/services/tuner/TunerLnb.cpp
@@ -97,8 +97,13 @@
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
}
- Result status = mLnb->close();
- return Status::fromServiceSpecificError(static_cast<int32_t>(status));
+ Result res = mLnb->close();
+ mLnb = NULL;
+
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
}
/////////////// ILnbCallback ///////////////////////
diff --git a/services/tuner/TunerTimeFilter.cpp b/services/tuner/TunerTimeFilter.cpp
index dce76d2..25e1ad9 100644
--- a/services/tuner/TunerTimeFilter.cpp
+++ b/services/tuner/TunerTimeFilter.cpp
@@ -18,6 +18,9 @@
#include "TunerTimeFilter.h"
+using ::android::hardware::tv::tuner::V1_0::Result;
+using ::android::hardware::tv::tuner::V1_1::Constant64Bit;
+
namespace android {
TunerTimeFilter::TunerTimeFilter(sp<ITimeFilter> timeFilter) {
@@ -28,23 +31,76 @@
mTimeFilter = NULL;
}
-Status TunerTimeFilter::setTimeStamp(int64_t /*timeStamp*/) {
- return Status::ok();
+Status TunerTimeFilter::setTimeStamp(int64_t timeStamp) {
+ if (mTimeFilter == NULL) {
+ ALOGE("ITimeFilter is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result status = mTimeFilter->setTimeStamp(timeStamp);
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}
Status TunerTimeFilter::clearTimeStamp() {
- return Status::ok();
+ if (mTimeFilter == NULL) {
+ ALOGE("ITimeFilter is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result status = mTimeFilter->clearTimeStamp();
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}
-Status TunerTimeFilter::getSourceTime(int64_t* /*_aidl_return*/) {
- return Status::ok();
+Status TunerTimeFilter::getSourceTime(int64_t* _aidl_return) {
+ if (mTimeFilter == NULL) {
+ *_aidl_return = (int64_t)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+ ALOGE("ITimeFilter is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result status;
+ mTimeFilter->getSourceTime(
+ [&](Result r, uint64_t t) {
+ status = r;
+ *_aidl_return = t;
+ });
+ if (status != Result::SUCCESS) {
+ *_aidl_return = (int64_t)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+ }
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}
-Status TunerTimeFilter::getTimeStamp(int64_t* /*_aidl_return*/) {
- return Status::ok();
+Status TunerTimeFilter::getTimeStamp(int64_t* _aidl_return) {
+ if (mTimeFilter == NULL) {
+ *_aidl_return = (int64_t)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+ ALOGE("ITimeFilter is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result status;
+ mTimeFilter->getTimeStamp(
+ [&](Result r, uint64_t t) {
+ status = r;
+ *_aidl_return = t;
+ });
+ if (status != Result::SUCCESS) {
+ *_aidl_return = (int64_t)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP;
+ }
+ return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}
Status TunerTimeFilter::close() {
+ if (mTimeFilter == NULL) {
+ ALOGE("ITimeFilter is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res = mTimeFilter->close();
+ mTimeFilter = NULL;
+
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
return Status::ok();
}
} // namespace android
diff --git a/services/tuner/TunerTimeFilter.h b/services/tuner/TunerTimeFilter.h
index 50b8f54..d675319 100644
--- a/services/tuner/TunerTimeFilter.h
+++ b/services/tuner/TunerTimeFilter.h
@@ -19,6 +19,7 @@
#include <aidl/android/media/tv/tuner/BnTunerTimeFilter.h>
#include <android/hardware/tv/tuner/1.0/ITimeFilter.h>
+#include <android/hardware/tv/tuner/1.1/types.h>
#include <media/stagefright/foundation/ADebug.h>
#include <utils/Log.h>