Merge "Codec2BufferUtils: add support for more color aspects" into sc-dev
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index 8fe48c2..716b550 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -1,6 +1,8 @@
[Hook Scripts]
mainline_hook = ${REPO_ROOT}/frameworks/av/tools/mainline_hook_partial.sh ${REPO_ROOT} ${PREUPLOAD_FILES}
+hidden_api_txt_checksorted_hook = ${REPO_ROOT}/tools/platform-compat/hiddenapi/checksorted_sha.sh ${PREUPLOAD_COMMIT} ${REPO_ROOT}
+
[Builtin Hooks]
clang_format = true
diff --git a/apex/Android.bp b/apex/Android.bp
index a86d2b9..b9abd12 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -98,6 +98,35 @@
name: "com.android.media-bootclasspath-fragment",
contents: ["updatable-media"],
apex_available: ["com.android.media"],
+
+ api: {
+ stub_libs: [
+ // Stubs for the APIs provided by updatable-media. This has to be
+ // specified explicitly because updatable-media is not a
+ // java_sdk_library.
+ "framework-media",
+ ],
+ },
+
+ // The bootclasspath_fragments that provide APIs on which this depends.
+ fragments: [
+ {
+ apex: "com.android.art",
+ module: "art-bootclasspath-fragment",
+ },
+ ],
+
+ // Additional stubs libraries that this fragment's contents use which are
+ // not provided by another bootclasspath_fragment.
+ additional_stubs: [
+ "android-non-updatable",
+ ],
+
+ // Additional hidden API flag files to override the defaults. This must only be
+ // modified by the Soong or platform compat team.
+ hidden_api: {
+ max_target_o_low_priority: ["hiddenapi/hiddenapi-max-target-o-low-priority.txt"],
+ },
}
// Encapsulate the contributions made by the com.android.media to the systemserverclasspath.
diff --git a/apex/hiddenapi/OWNERS b/apex/hiddenapi/OWNERS
new file mode 100644
index 0000000..ac8a2b6
--- /dev/null
+++ b/apex/hiddenapi/OWNERS
@@ -0,0 +1,5 @@
+# soong-team@ as the hiddenapi files are tightly coupled with Soong
+file:platform/build/soong:/OWNERS
+
+# compat-team@ for changes to hiddenapi files
+file:tools/platform-compat:/OWNERS
diff --git a/apex/hiddenapi/hiddenapi-max-target-o-low-priority.txt b/apex/hiddenapi/hiddenapi-max-target-o-low-priority.txt
new file mode 100644
index 0000000..32bbb10
--- /dev/null
+++ b/apex/hiddenapi/hiddenapi-max-target-o-low-priority.txt
@@ -0,0 +1,6 @@
+Landroid/media/MediaSession2$ControllerInfo;-><init>(Landroid/content/Context;IILjava/lang/String;Landroid/os/IInterface;)V
+Landroid/media/MediaSession2$ControllerInfo;->getPackageName()Ljava/lang/String;
+Landroid/media/MediaSession2$ControllerInfo;->getProvider()Landroid/media/update/MediaSession2Provider$ControllerInfoProvider;
+Landroid/media/MediaSession2$ControllerInfo;->getUid()I
+Landroid/media/MediaSession2$ControllerInfo;->isTrusted()Z
+Landroid/media/MediaSession2$ControllerInfo;->mProvider:Landroid/media/update/MediaSession2Provider$ControllerInfoProvider;
diff --git a/media/codec2/components/aac/C2SoftAacDec.cpp b/media/codec2/components/aac/C2SoftAacDec.cpp
index f948dd4..342d771 100644
--- a/media/codec2/components/aac/C2SoftAacDec.cpp
+++ b/media/codec2/components/aac/C2SoftAacDec.cpp
@@ -289,13 +289,14 @@
mOutputDelayRingBufferFilled = 0;
mBuffersInfo.clear();
- // To make the codec behave the same before and after a reset, we need to invalidate the
- // streaminfo struct. This does that:
- mStreamInfo->sampleRate = 0; // TODO: mStreamInfo is read only
-
+ status_t status = UNKNOWN_ERROR;
+ if (mAACDecoder) {
+ aacDecoder_Close(mAACDecoder);
+ status = initDecoder();
+ }
mSignalledError = false;
- return C2_OK;
+ return status == OK ? C2_OK : C2_CORRUPTED;
}
void C2SoftAacDec::onReset() {
diff --git a/media/codec2/components/amr_nb_wb/C2SoftAmrDec.cpp b/media/codec2/components/amr_nb_wb/C2SoftAmrDec.cpp
index 70a2da5..e92d38d 100644
--- a/media/codec2/components/amr_nb_wb/C2SoftAmrDec.cpp
+++ b/media/codec2/components/amr_nb_wb/C2SoftAmrDec.cpp
@@ -143,7 +143,7 @@
if (!mIsWide) {
Speech_Decode_Frame_reset(mAmrHandle);
} else {
- pvDecoder_AmrWb_Reset(mAmrHandle, 0 /* reset_all */);
+ pvDecoder_AmrWb_Reset(mAmrHandle, 1 /* reset_all */);
}
mSignalledError = false;
mSignalledOutputEos = false;
diff --git a/media/codec2/components/opus/C2SoftOpusEnc.cpp b/media/codec2/components/opus/C2SoftOpusEnc.cpp
index b47275f..370d33c 100644
--- a/media/codec2/components/opus/C2SoftOpusEnc.cpp
+++ b/media/codec2/components/opus/C2SoftOpusEnc.cpp
@@ -78,6 +78,19 @@
.build());
addParameter(
+ DefineParam(mBitrateMode, C2_PARAMKEY_BITRATE_MODE)
+ .withDefault(new C2StreamBitrateModeTuning::output(
+ 0u, C2Config::BITRATE_VARIABLE))
+ .withFields({
+ C2F(mBitrateMode, value).oneOf({
+ C2Config::BITRATE_CONST,
+ C2Config::BITRATE_VARIABLE})
+ })
+ .withSetter(
+ Setter<decltype(*mBitrateMode)>::StrictValueWithNoDeps)
+ .build());
+
+ addParameter(
DefineParam(mBitrate, C2_PARAMKEY_BITRATE)
.withDefault(new C2StreamBitrateInfo::output(0u, 128000))
.withFields({C2F(mBitrate, value).inRange(500, 512000)})
@@ -100,12 +113,14 @@
uint32_t getSampleRate() const { return mSampleRate->value; }
uint32_t getChannelCount() const { return mChannelCount->value; }
uint32_t getBitrate() const { return mBitrate->value; }
+ uint32_t getBitrateMode() const { return mBitrateMode->value; }
uint32_t getComplexity() const { return mComplexity->value; }
private:
std::shared_ptr<C2StreamSampleRateInfo::input> mSampleRate;
std::shared_ptr<C2StreamChannelCountInfo::input> mChannelCount;
std::shared_ptr<C2StreamBitrateInfo::output> mBitrate;
+ std::shared_ptr<C2StreamBitrateModeTuning::output> mBitrateMode;
std::shared_ptr<C2StreamComplexityTuning::output> mComplexity;
std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mInputMaxBufSize;
};
@@ -135,6 +150,7 @@
mSampleRate = mIntf->getSampleRate();
mChannelCount = mIntf->getChannelCount();
uint32_t bitrate = mIntf->getBitrate();
+ uint32_t bitrateMode = mIntf->getBitrateMode();
int complexity = mIntf->getComplexity();
mNumSamplesPerFrame = mSampleRate / (1000 / mFrameDurationMs);
mNumPcmBytesPerInputFrame =
@@ -189,14 +205,24 @@
return C2_BAD_VALUE;
}
- // Constrained VBR
- if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR(1) != OPUS_OK)) {
- ALOGE("failed to set vbr type");
- return C2_BAD_VALUE;
- }
- if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR_CONSTRAINT(1) !=
- OPUS_OK)) {
- ALOGE("failed to set vbr constraint");
+ if (bitrateMode == C2Config::BITRATE_VARIABLE) {
+ // Constrained VBR
+ if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR(1) != OPUS_OK)) {
+ ALOGE("failed to set vbr type");
+ return C2_BAD_VALUE;
+ }
+ if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR_CONSTRAINT(1) !=
+ OPUS_OK)) {
+ ALOGE("failed to set vbr constraint");
+ return C2_BAD_VALUE;
+ }
+ } else if (bitrateMode == C2Config::BITRATE_CONST) {
+ if (opus_multistream_encoder_ctl(mEncoder, OPUS_SET_VBR(0) != OPUS_OK)) {
+ ALOGE("failed to set cbr type");
+ return C2_BAD_VALUE;
+ }
+ } else {
+ ALOGE("unknown bitrate mode");
return C2_BAD_VALUE;
}
diff --git a/media/codec2/hidl/1.0/vts/functional/audio/VtsHalMediaC2V1_0TargetAudioDecTest.cpp b/media/codec2/hidl/1.0/vts/functional/audio/VtsHalMediaC2V1_0TargetAudioDecTest.cpp
index 58a568e..abd8b2d 100644
--- a/media/codec2/hidl/1.0/vts/functional/audio/VtsHalMediaC2V1_0TargetAudioDecTest.cpp
+++ b/media/codec2/hidl/1.0/vts/functional/audio/VtsHalMediaC2V1_0TargetAudioDecTest.cpp
@@ -36,13 +36,13 @@
using CsdFlushTestParameters = std::tuple<std::string, std::string, bool>;
static std::vector<CsdFlushTestParameters> gCsdFlushTestParameters;
-struct CompToURL {
+struct CompToFiles {
std::string mime;
- std::string mURL;
- std::string info;
+ std::string inputFile;
+ std::string infoFile;
};
-std::vector<CompToURL> gCompToURL = {
+std::vector<CompToFiles> gCompToFiles = {
{"mp4a-latm", "bbb_aac_stereo_128kbps_48000hz.aac", "bbb_aac_stereo_128kbps_48000hz.info"},
{"mp4a-latm", "bbb_aac_stereo_128kbps_48000hz.aac",
"bbb_aac_stereo_128kbps_48000hz_multi_frame.info"},
@@ -110,6 +110,15 @@
mTimestampUs = 0u;
mWorkResult = C2_OK;
mTimestampDevTest = false;
+
+ bool valid = getFileNames(mStreamIndex);
+ if (!valid) {
+ GTEST_SKIP() << "No test file for mime " << mMime << " index: " << mStreamIndex;
+ }
+ ALOGV("mStreamIndex : %zu", mStreamIndex);
+ ALOGV("mInputFile : %s", mInputFile.c_str());
+ ALOGV("mInfoFile : %s", mInfoFile.c_str());
+
if (mDisableTest) std::cout << "[ WARN ] Test Disabled \n";
}
@@ -126,7 +135,7 @@
virtual void validateTimestampList(int32_t* bitStreamInfo);
- void GetURLForComponent(char* mURL, char* info, size_t streamIndex = 0);
+ bool getFileNames(size_t streamIndex = 0);
struct outputMetaData {
uint64_t timestampUs;
@@ -193,6 +202,10 @@
std::shared_ptr<android::Codec2Client::Listener> mListener;
std::shared_ptr<android::Codec2Client::Component> mComponent;
+ std::string mInputFile;
+ std::string mInfoFile;
+ size_t mStreamIndex = 0;
+
protected:
static void description(const std::string& description) {
RecordProperty("description", description);
@@ -204,6 +217,7 @@
void getParams() {
mInstanceName = std::get<0>(GetParam());
mComponentName = std::get<1>(GetParam());
+ mStreamIndex = 0;
}
};
@@ -285,18 +299,20 @@
}
// LookUpTable of clips and metadata for component testing
-void Codec2AudioDecHidlTestBase::GetURLForComponent(char* mURL, char* info, size_t streamIndex) {
+bool Codec2AudioDecHidlTestBase::getFileNames(size_t streamIndex) {
int streamCount = 0;
- for (size_t i = 0; i < gCompToURL.size(); ++i) {
- if (mMime.find(gCompToURL[i].mime) != std::string::npos) {
+
+ for (size_t i = 0; i < gCompToFiles.size(); ++i) {
+ if (mMime.find(gCompToFiles[i].mime) != std::string::npos) {
if (streamCount == streamIndex) {
- strcat(mURL, gCompToURL[i].mURL.c_str());
- strcat(info, gCompToURL[i].info.c_str());
- return;
+ mInputFile = sResourceDir + gCompToFiles[i].inputFile;
+ mInfoFile = sResourceDir + gCompToFiles[i].infoFile;
+ return true;
}
streamCount++;
}
}
+ return false;
}
void decodeNFrames(const std::shared_ptr<android::Codec2Client::Component>& component,
@@ -429,6 +445,7 @@
void getParams() {
mInstanceName = std::get<0>(GetParam());
mComponentName = std::get<1>(GetParam());
+ mStreamIndex = std::get<2>(GetParam());
}
};
@@ -436,22 +453,12 @@
description("Decodes input file");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- uint32_t streamIndex = std::get<2>(GetParam());
bool signalEOS = std::get<3>(GetParam());
mTimestampDevTest = true;
- char mURL[512], info[512];
android::Vector<FrameInfo> Info;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info, streamIndex);
- if (!strcmp(mURL, sResourceDir.c_str())) {
- ALOGV("EMPTY INPUT sResourceDir.c_str() %s mURL %s ", sResourceDir.c_str(), mURL);
- return;
- }
-
- int32_t numCsds = populateInfoVector(info, &Info, mTimestampDevTest, &mTimestampUslist);
- ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << info;
+ int32_t numCsds = populateInfoVector(mInfoFile, &Info, mTimestampDevTest, &mTimestampUslist);
+ ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << mInfoFile;
// Reset total no of frames received
mFramesReceived = 0;
@@ -468,9 +475,8 @@
return;
}
ASSERT_EQ(mComponent->start(), C2_OK);
- ALOGV("mURL : %s", mURL);
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
ASSERT_NO_FATAL_FAILURE(decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, &Info, 0,
@@ -507,15 +513,10 @@
description("Test Request for thumbnail");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512], info[512];
android::Vector<FrameInfo> Info;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info);
-
- int32_t numCsds = populateInfoVector(info, &Info, mTimestampDevTest, &mTimestampUslist);
- ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << info;
+ int32_t numCsds = populateInfoVector(mInfoFile, &Info, mTimestampDevTest, &mTimestampUslist);
+ ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << mInfoFile;
int32_t bitStreamInfo[2] = {0};
if (mMime.find("raw") != std::string::npos) {
@@ -529,7 +530,6 @@
return;
}
ASSERT_EQ(mComponent->start(), C2_OK);
- ALOGV("mURL : %s", mURL);
// request EOS for thumbnail
// signal EOS flag with last frame
@@ -542,7 +542,7 @@
} while (!(flags & SYNC_FRAME));
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
ASSERT_NO_FATAL_FAILURE(decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, &Info, 0,
@@ -599,15 +599,10 @@
TEST_P(Codec2AudioDecHidlTest, FlushTest) {
description("Tests Flush calls");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512], info[512];
android::Vector<FrameInfo> Info;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info);
-
- int32_t numCsds = populateInfoVector(info, &Info, mTimestampDevTest, &mTimestampUslist);
- ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << info;
+ int32_t numCsds = populateInfoVector(mInfoFile, &Info, mTimestampDevTest, &mTimestampUslist);
+ ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << mInfoFile;
int32_t bitStreamInfo[2] = {0};
if (mMime.find("raw") != std::string::npos) {
@@ -629,9 +624,8 @@
verifyFlushOutput(flushedWork, mWorkQueue, mFlushedIndices, mQueueLock));
ASSERT_EQ(mWorkQueue.size(), MAX_INPUT_BUFFERS);
- ALOGV("mURL : %s", mURL);
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
// Decode 30 frames and flush.
uint32_t numFramesFlushed = FLUSH_INTERVAL;
@@ -684,15 +678,10 @@
description("Decode with multiple empty input frames");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512], info[512];
std::ifstream eleStream, eleInfo;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info);
-
- eleInfo.open(info);
- ASSERT_EQ(eleInfo.is_open(), true) << mURL << " - file not found";
+ eleInfo.open(mInfoFile);
+ ASSERT_EQ(eleInfo.is_open(), true) << mInputFile << " - file not found";
android::Vector<FrameInfo> Info;
int bytesCount = 0;
uint32_t frameId = 0;
@@ -730,8 +719,7 @@
return;
}
ASSERT_EQ(mComponent->start(), C2_OK);
- ALOGV("mURL : %s", mURL);
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
ASSERT_NO_FATAL_FAILURE(decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, &Info, 0,
@@ -759,6 +747,7 @@
void getParams() {
mInstanceName = std::get<0>(GetParam());
mComponentName = std::get<1>(GetParam());
+ mStreamIndex = 0;
}
};
@@ -768,19 +757,9 @@
description("Tests codecs for flush at different states");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512], info[512];
android::Vector<FrameInfo> Info;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info);
- if (!strcmp(mURL, sResourceDir.c_str())) {
- ALOGV("EMPTY INPUT sResourceDir.c_str() %s mURL %s ", sResourceDir.c_str(), mURL);
- return;
- }
- ALOGV("mURL : %s", mURL);
-
- int32_t numCsds = populateInfoVector(info, &Info, mTimestampDevTest, &mTimestampUslist);
+ int32_t numCsds = populateInfoVector(mInfoFile, &Info, mTimestampDevTest, &mTimestampUslist);
ASSERT_GE(numCsds, 0) << "Error in parsing input info file";
int32_t bitStreamInfo[2] = {0};
@@ -797,7 +776,7 @@
ASSERT_EQ(mComponent->start(), C2_OK);
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
bool signalEOS = false;
diff --git a/media/codec2/hidl/1.0/vts/functional/audio/VtsHalMediaC2V1_0TargetAudioEncTest.cpp b/media/codec2/hidl/1.0/vts/functional/audio/VtsHalMediaC2V1_0TargetAudioEncTest.cpp
index 92b53a0..d77b943 100644
--- a/media/codec2/hidl/1.0/vts/functional/audio/VtsHalMediaC2V1_0TargetAudioEncTest.cpp
+++ b/media/codec2/hidl/1.0/vts/functional/audio/VtsHalMediaC2V1_0TargetAudioEncTest.cpp
@@ -84,6 +84,17 @@
mWorkResult = C2_OK;
mOutputSize = 0u;
getInputMaxBufSize();
+
+ c2_status_t status = getChannelCount(&mNumChannels);
+ ASSERT_EQ(status, C2_OK) << "Unable to get supported channel count";
+
+ status = getSampleRate(&mSampleRate);
+ ASSERT_EQ(status, C2_OK) << "Unable to get supported sample rate";
+
+ status = getSamplesPerFrame(mNumChannels, &mSamplesPerFrame);
+ ASSERT_EQ(status, C2_OK) << "Unable to get supported number of samples per frame";
+
+ getFile(mNumChannels, mSampleRate);
}
virtual void TearDown() override {
@@ -97,7 +108,11 @@
// Get the test parameters from GetParam call.
virtual void getParams() {}
- void GetURLForComponent(char* mURL, int32_t channelCount, int32_t sampleRate);
+ c2_status_t getChannelCount(int32_t* nChannels);
+ c2_status_t getSampleRate(int32_t* nSampleRate);
+ c2_status_t getSamplesPerFrame(int32_t nChannels, int32_t* samplesPerFrame);
+
+ void getFile(int32_t channelCount, int32_t sampleRate);
// callback function to process onWorkDone received by Listener
void handleWorkDone(std::list<std::unique_ptr<C2Work>>& workItems) {
@@ -145,6 +160,12 @@
std::shared_ptr<android::Codec2Client::Listener> mListener;
std::shared_ptr<android::Codec2Client::Component> mComponent;
+ int32_t mNumChannels;
+ int32_t mSampleRate;
+ int32_t mSamplesPerFrame;
+
+ std::string mInputFile;
+
protected:
static void description(const std::string& description) {
RecordProperty("description", description);
@@ -222,14 +243,13 @@
return false;
}
-c2_status_t getChannelCount(const std::shared_ptr<android::Codec2Client::Component>& component,
- int32_t* nChannels) {
+c2_status_t Codec2AudioEncHidlTestBase::getChannelCount(int32_t* nChannels) {
std::unique_ptr<C2StreamChannelCountInfo::input> channelCount =
std::make_unique<C2StreamChannelCountInfo::input>();
std::vector<C2FieldSupportedValuesQuery> validValueInfos = {
C2FieldSupportedValuesQuery::Current(
C2ParamField(channelCount.get(), &C2StreamChannelCountInfo::value))};
- c2_status_t c2err = component->querySupportedValues(validValueInfos, C2_DONT_BLOCK);
+ c2_status_t c2err = mComponent->querySupportedValues(validValueInfos, C2_DONT_BLOCK);
if (c2err != C2_OK || validValueInfos.size() != 1u) {
ALOGE("querySupportedValues_vb failed for channelCount");
return c2err;
@@ -264,13 +284,11 @@
}
return C2_OK;
}
-
-c2_status_t getSampleRate(const std::shared_ptr<android::Codec2Client::Component>& component,
- int32_t* nSampleRate) {
- // Use the default sample rate for components
+c2_status_t Codec2AudioEncHidlTestBase::getSampleRate(int32_t* nSampleRate) {
+ // Use the default sample rate for mComponents
std::vector<std::unique_ptr<C2Param>> queried;
- c2_status_t c2err = component->query({}, {C2StreamSampleRateInfo::input::PARAM_TYPE},
- C2_DONT_BLOCK, &queried);
+ c2_status_t c2err = mComponent->query({}, {C2StreamSampleRateInfo::input::PARAM_TYPE},
+ C2_DONT_BLOCK, &queried);
if (c2err != C2_OK || queried.size() == 0) return c2err;
size_t offset = sizeof(C2Param);
@@ -280,11 +298,11 @@
return C2_OK;
}
-c2_status_t getSamplesPerFrame(const std::shared_ptr<android::Codec2Client::Component>& component,
- int32_t nChannels, int32_t* samplesPerFrame) {
+c2_status_t Codec2AudioEncHidlTestBase::getSamplesPerFrame(int32_t nChannels,
+ int32_t* samplesPerFrame) {
std::vector<std::unique_ptr<C2Param>> queried;
- c2_status_t c2err = component->query({}, {C2StreamMaxBufferSizeInfo::input::PARAM_TYPE},
- C2_DONT_BLOCK, &queried);
+ c2_status_t c2err = mComponent->query({}, {C2StreamMaxBufferSizeInfo::input::PARAM_TYPE},
+ C2_DONT_BLOCK, &queried);
if (c2err != C2_OK || queried.size() == 0) return c2err;
size_t offset = sizeof(C2Param);
@@ -295,24 +313,8 @@
return C2_OK;
}
-// Get config params for a component
-bool getConfigParams(const std::shared_ptr<android::Codec2Client::Component>& component,
- int32_t* nChannels, int32_t* nSampleRate, int32_t* samplesPerFrame) {
- c2_status_t status = getChannelCount(component, nChannels);
- if (status != C2_OK) return false;
-
- status = getSampleRate(component, nSampleRate);
- if (status != C2_OK) return false;
-
- status = getSamplesPerFrame(component, *nChannels, samplesPerFrame);
- if (status != C2_OK) return false;
-
- return true;
-}
-
// LookUpTable of clips and metadata for component testing
-void Codec2AudioEncHidlTestBase::GetURLForComponent(char* mURL, int32_t channelCount,
- int32_t sampleRate) {
+void Codec2AudioEncHidlTestBase::getFile(int32_t channelCount, int32_t sampleRate) {
std::string rawInput = "bbb_raw_1ch_8khz_s16le.raw";
if (channelCount == 1 && sampleRate == 16000) {
rawInput = "bbb_raw_1ch_16khz_s16le.raw";
@@ -320,7 +322,7 @@
rawInput = "bbb_raw_2ch_48khz_s16le.raw";
}
- strcat(mURL, rawInput.c_str());
+ mInputFile = sResourceDir + rawInput;
}
void encodeNFrames(const std::shared_ptr<android::Codec2Client::Component>& component,
@@ -440,38 +442,23 @@
bool signalEOS = std::get<2>(GetParam());
// Ratio w.r.t to mInputMaxBufSize
int32_t inputMaxBufRatio = std::get<3>(GetParam());
+ mSamplesPerFrame = ((mInputMaxBufSize / inputMaxBufRatio) / (mNumChannels * 2));
- int32_t nChannels;
- int32_t nSampleRate;
- int32_t samplesPerFrame;
+ ALOGV("signalEOS %d mInputMaxBufSize %d mSamplesPerFrame %d", signalEOS, mInputMaxBufSize,
+ mSamplesPerFrame);
- if (!getConfigParams(mComponent, &nChannels, &nSampleRate, &samplesPerFrame)) {
- std::cout << "Failed to get the config params for " << mComponentName << "\n";
- std::cout << "[ WARN ] Test Skipped \n";
- return;
- }
-
- samplesPerFrame = ((mInputMaxBufSize / inputMaxBufRatio) / (nChannels * 2));
- ALOGV("signalEOS %d mInputMaxBufSize %d samplesPerFrame %d", signalEOS, mInputMaxBufSize,
- samplesPerFrame);
-
- if (!setupConfigParam(mComponent, nChannels, nSampleRate)) {
- std::cout << "[ WARN ] Test Skipped \n";
- return;
- }
- char mURL[512];
- strcpy(mURL, sResourceDir.c_str());
- GetURLForComponent(mURL, nChannels, nSampleRate);
+ ASSERT_TRUE(setupConfigParam(mComponent, mNumChannels, mSampleRate))
+ << "Unable to configure for channels: " << mNumChannels << " and sampling rate "
+ << mSampleRate;
ASSERT_EQ(mComponent->start(), C2_OK);
std::ifstream eleStream;
uint32_t numFrames = 16;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
- ALOGV("mURL : %s", mURL);
ASSERT_NO_FATAL_FAILURE(encodeNFrames(
mComponent, mQueueLock, mQueueCondition, mWorkQueue, mFlushedIndices, mLinearPool,
- eleStream, numFrames, samplesPerFrame, nChannels, nSampleRate, false, signalEOS));
+ eleStream, numFrames, mSamplesPerFrame, mNumChannels, mSampleRate, false, signalEOS));
// If EOS is not sent, sending empty input with EOS flag
if (!signalEOS) {
@@ -545,30 +532,17 @@
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
mFlushedIndices.clear();
- int32_t nChannels;
- int32_t nSampleRate;
- int32_t samplesPerFrame;
- if (!getConfigParams(mComponent, &nChannels, &nSampleRate, &samplesPerFrame)) {
- std::cout << "Failed to get the config params for " << mComponentName << "\n";
- std::cout << "[ WARN ] Test Skipped \n";
- return;
- }
-
- if (!setupConfigParam(mComponent, nChannels, nSampleRate)) {
- std::cout << "[ WARN ] Test Skipped \n";
- return;
- }
- char mURL[512];
- strcpy(mURL, sResourceDir.c_str());
- GetURLForComponent(mURL, nChannels, nSampleRate);
+ ASSERT_TRUE(setupConfigParam(mComponent, mNumChannels, mSampleRate))
+ << "Unable to configure for channels: " << mNumChannels << " and sampling rate "
+ << mSampleRate;
ASSERT_EQ(mComponent->start(), C2_OK);
std::ifstream eleStream;
uint32_t numFramesFlushed = 30;
uint32_t numFrames = 128;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
// flush
std::list<std::unique_ptr<C2Work>> flushedWork;
@@ -577,10 +551,9 @@
ASSERT_NO_FATAL_FAILURE(
verifyFlushOutput(flushedWork, mWorkQueue, mFlushedIndices, mQueueLock));
ASSERT_EQ(mWorkQueue.size(), MAX_INPUT_BUFFERS);
- ALOGV("mURL : %s", mURL);
ASSERT_NO_FATAL_FAILURE(encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, numFramesFlushed,
- samplesPerFrame, nChannels, nSampleRate));
+ mSamplesPerFrame, mNumChannels, mSampleRate));
err = mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
ASSERT_EQ(err, C2_OK);
waitOnInputConsumption(mQueueLock, mQueueCondition, mWorkQueue,
@@ -590,8 +563,8 @@
ASSERT_EQ(mWorkQueue.size(), MAX_INPUT_BUFFERS);
ASSERT_NO_FATAL_FAILURE(encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream,
- numFrames - numFramesFlushed, samplesPerFrame, nChannels,
- nSampleRate, true));
+ numFrames - numFramesFlushed, mSamplesPerFrame,
+ mNumChannels, mSampleRate, true));
eleStream.close();
err = mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
ASSERT_EQ(err, C2_OK);
@@ -609,33 +582,20 @@
description("Encodes input file for different channel count");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- int32_t nSampleRate;
- int32_t samplesPerFrame;
- int32_t nChannels;
int32_t numFrames = 16;
int32_t maxChannelCount = 8;
- if (!getConfigParams(mComponent, &nChannels, &nSampleRate, &samplesPerFrame)) {
- std::cout << "Failed to get the config params for " << mComponentName << "\n";
- std::cout << "[ WARN ] Test Skipped \n";
- return;
- }
- char mURL[512];
- strcpy(mURL, sResourceDir.c_str());
- GetURLForComponent(mURL, nChannels, nSampleRate);
-
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
- ASSERT_EQ(eleStream.is_open(), true) << mURL << " file not found";
- ALOGV("mURL : %s", mURL);
+ eleStream.open(mInputFile, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true) << mInputFile << " file not found";
uint64_t prevOutputSize = 0u;
uint32_t prevChannelCount = 0u;
// Looping through the maximum number of channel count supported by encoder
- for (nChannels = 1; nChannels < maxChannelCount; nChannels++) {
+ for (int32_t nChannels = 1; nChannels < maxChannelCount; nChannels++) {
ALOGV("Configuring encoder %s for channel count = %d", mComponentName.c_str(), nChannels);
- if (!setupConfigParam(mComponent, nChannels, nSampleRate)) {
+ if (!setupConfigParam(mComponent, nChannels, mSampleRate)) {
std::cout << "[ WARN ] Test Skipped \n";
return;
}
@@ -656,9 +616,9 @@
// To check if the input stream is sufficient to encode for the higher channel count
struct stat buf;
- stat(mURL, &buf);
+ stat(mInputFile.c_str(), &buf);
size_t fileSize = buf.st_size;
- int32_t bytesCount = (samplesPerFrame * nChannels * 2) * numFrames;
+ int32_t bytesCount = (mSamplesPerFrame * nChannels * 2) * numFrames;
if (fileSize < bytesCount) {
std::cout << "[ WARN ] Test Skipped for ChannelCount " << nChannels
<< " because of insufficient input data\n";
@@ -669,7 +629,7 @@
ASSERT_NO_FATAL_FAILURE(encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, numFrames,
- samplesPerFrame, nChannels, nSampleRate));
+ mSamplesPerFrame, nChannels, mSampleRate));
// mDisableTest will be set if buffer was not fetched properly.
// This may happen when config params is not proper but config succeeded
@@ -711,24 +671,11 @@
description("Encodes input file for different SampleRate");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- int32_t nSampleRate;
- int32_t samplesPerFrame;
- int32_t nChannels;
int32_t numFrames = 16;
- if (!getConfigParams(mComponent, &nChannels, &nSampleRate, &samplesPerFrame)) {
- std::cout << "Failed to get the config params for " << mComponentName << "\n";
- std::cout << "[ WARN ] Test Skipped \n";
- return;
- }
- char mURL[512];
- strcpy(mURL, sResourceDir.c_str());
- GetURLForComponent(mURL, nChannels, nSampleRate);
-
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
- ASSERT_EQ(eleStream.is_open(), true) << mURL << " file not found";
- ALOGV("mURL : %s", mURL);
+ eleStream.open(mInputFile, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true) << mInputFile << " file not found";
int32_t sampleRateValues[] = {1000, 8000, 16000, 24000, 48000, 96000, 192000};
@@ -737,7 +684,7 @@
for (int32_t nSampleRate : sampleRateValues) {
ALOGV("Configuring encoder %s for SampleRate = %d", mComponentName.c_str(), nSampleRate);
- if (!setupConfigParam(mComponent, nChannels, nSampleRate)) {
+ if (!setupConfigParam(mComponent, mNumChannels, nSampleRate)) {
std::cout << "[ WARN ] Test Skipped \n";
return;
}
@@ -759,9 +706,9 @@
// To check if the input stream is sufficient to encode for the higher SampleRate
struct stat buf;
- stat(mURL, &buf);
+ stat(mInputFile.c_str(), &buf);
size_t fileSize = buf.st_size;
- int32_t bytesCount = (samplesPerFrame * nChannels * 2) * numFrames;
+ int32_t bytesCount = (mSamplesPerFrame * mNumChannels * 2) * numFrames;
if (fileSize < bytesCount) {
std::cout << "[ WARN ] Test Skipped for SampleRate " << nSampleRate
<< " because of insufficient input data\n";
@@ -772,7 +719,7 @@
ASSERT_NO_FATAL_FAILURE(encodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, numFrames,
- samplesPerFrame, nChannels, nSampleRate));
+ mSamplesPerFrame, mNumChannels, nSampleRate));
// mDisableTest will be set if buffer was not fetched properly.
// This may happen when config params is not proper but config succeeded
diff --git a/media/codec2/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoDecTest.cpp b/media/codec2/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoDecTest.cpp
index 8d917b3..c331d0b 100644
--- a/media/codec2/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoDecTest.cpp
+++ b/media/codec2/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoDecTest.cpp
@@ -43,13 +43,13 @@
using CsdFlushTestParameters = std::tuple<std::string, std::string, bool>;
static std::vector<CsdFlushTestParameters> gCsdFlushTestParameters;
-struct CompToURL {
+struct CompToFiles {
std::string mime;
- std::string mURL;
- std::string info;
- std::string chksum;
+ std::string inputFile;
+ std::string infoFile;
+ std::string chksumFile;
};
-std::vector<CompToURL> gCompToURL = {
+std::vector<CompToFiles> gCompToFiles = {
{"avc", "bbb_avc_176x144_300kbps_60fps.h264", "bbb_avc_176x144_300kbps_60fps.info",
"bbb_avc_176x144_300kbps_60fps_chksum.md5"},
{"avc", "bbb_avc_640x360_768kbps_30fps.h264", "bbb_avc_640x360_768kbps_30fps.info",
@@ -92,8 +92,8 @@
// google.codec2 Video test setup
virtual void SetUp() override {
getParams();
+
mDisableTest = false;
- ALOGV("Codec2VideoDecHidlTest SetUp");
mClient = android::Codec2Client::CreateFromService(
mInstanceName.c_str(),
!bool(android::Codec2Client::CreateFromService("default", true)));
@@ -135,6 +135,15 @@
mDisableTest = true;
}
+ bool valid = getFileNames(mStreamIndex);
+ if (!valid) {
+ GTEST_SKIP() << "No test file for mime " << mMime << " index: " << mStreamIndex;
+ }
+ ALOGV("mStreamIndex : %zu", mStreamIndex);
+ ALOGV("mInputFile : %s", mInputFile.c_str());
+ ALOGV("mInfoFile : %s", mInfoFile.c_str());
+ ALOGV("mChksumFile : %s", mChksumFile.c_str());
+
if (mDisableTest) std::cout << "[ WARN ] Test Disabled \n";
}
@@ -149,8 +158,7 @@
// Get the test parameters from GetParam call.
virtual void getParams() {}
- void GetURLChksmForComponent(char* mURL, char* info, char* chksum, size_t streamIndex);
- void GetURLForComponent(char* mURL, char* info, size_t streamIndex = 0);
+ bool getFileNames(size_t streamIndex = 0);
/* Calculate the CKSUM for the data in inbuf */
void calc_md5_cksum(uint8_t* pu1_inbuf, uint32_t u4_stride, uint32_t u4_width,
@@ -311,6 +319,11 @@
std::shared_ptr<android::Codec2Client::Listener> mListener;
std::shared_ptr<android::Codec2Client::Component> mComponent;
+ std::string mInputFile;
+ std::string mInfoFile;
+ std::string mChksumFile;
+ size_t mStreamIndex = 0;
+
protected:
static void description(const std::string& description) {
RecordProperty("description", description);
@@ -322,6 +335,7 @@
void getParams() {
mInstanceName = std::get<0>(GetParam());
mComponentName = std::get<1>(GetParam());
+ mStreamIndex = 0;
}
};
@@ -358,27 +372,24 @@
// number of elementary streams per component
#define STREAM_COUNT 3
-// LookUpTable of clips, metadata and chksum for component testing
-void Codec2VideoDecHidlTestBase::GetURLChksmForComponent(char* mURL, char* info, char* chksum,
- size_t streamIndex) {
+// number of elementary streams required for adaptive testing
+#define ADAPTIVE_STREAM_COUNT 2
+// LookUpTable of clips, metadata and mChksumFile for component testing
+bool Codec2VideoDecHidlTestBase::getFileNames(size_t streamIndex) {
int streamCount = 0;
- for (size_t i = 0; i < gCompToURL.size(); ++i) {
- if (mMime.find(gCompToURL[i].mime) != std::string::npos) {
+
+ for (size_t i = 0; i < gCompToFiles.size(); ++i) {
+ if (mMime.find(gCompToFiles[i].mime) != std::string::npos) {
if (streamCount == streamIndex) {
- strcat(mURL, gCompToURL[i].mURL.c_str());
- strcat(info, gCompToURL[i].info.c_str());
- strcat(chksum, gCompToURL[i].chksum.c_str());
- return;
+ mInputFile = sResourceDir + gCompToFiles[i].inputFile;
+ mInfoFile = sResourceDir + gCompToFiles[i].infoFile;
+ mChksumFile = sResourceDir + gCompToFiles[i].chksumFile;
+ return true;
}
streamCount++;
}
}
-}
-
-void Codec2VideoDecHidlTestBase::GetURLForComponent(char* mURL, char* info, size_t streamIndex) {
- char chksum[512];
- strcpy(chksum, sResourceDir.c_str());
- GetURLChksmForComponent(mURL, info, chksum, streamIndex);
+ return false;
}
void decodeNFrames(const std::shared_ptr<android::Codec2Client::Component>& component,
@@ -529,6 +540,7 @@
void getParams() {
mInstanceName = std::get<0>(GetParam());
mComponentName = std::get<1>(GetParam());
+ mStreamIndex = std::get<2>(GetParam());
}
};
@@ -537,24 +549,13 @@
description("Decodes input file");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- uint32_t streamIndex = std::get<2>(GetParam());
bool signalEOS = std::get<3>(GetParam());
mTimestampDevTest = true;
- char mURL[512], info[512], chksum[512];
android::Vector<FrameInfo> Info;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- strcpy(chksum, sResourceDir.c_str());
-
- GetURLChksmForComponent(mURL, info, chksum, streamIndex);
- if (!(strcmp(mURL, sResourceDir.c_str())) || !(strcmp(info, sResourceDir.c_str()))) {
- ALOGV("Skipping Test, Stream not available");
- return;
- }
mMd5Enable = true;
- if (!strcmp(chksum, sResourceDir.c_str())) mMd5Enable = false;
+ if (!mChksumFile.compare(sResourceDir)) mMd5Enable = false;
uint32_t format = HAL_PIXEL_FORMAT_YCBCR_420_888;
if (!configPixelFormat(format)) {
@@ -565,23 +566,22 @@
mFlushedIndices.clear();
mTimestampUslist.clear();
- int32_t numCsds = populateInfoVector(info, &Info, mTimestampDevTest, &mTimestampUslist);
- ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << info;
+ int32_t numCsds = populateInfoVector(mInfoFile, &Info, mTimestampDevTest, &mTimestampUslist);
+ ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << mInfoFile;
ASSERT_EQ(mComponent->start(), C2_OK);
// Reset total no of frames received
mFramesReceived = 0;
mTimestampUs = 0;
- ALOGV("mURL : %s", mURL);
+
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
size_t refChksmSize = 0;
std::ifstream refChksum;
if (mMd5Enable) {
- ALOGV("chksum file name: %s", chksum);
- refChksum.open(chksum, std::ifstream::binary | std::ifstream::ate);
+ refChksum.open(mChksumFile, std::ifstream::binary | std::ifstream::ate);
ASSERT_EQ(refChksum.is_open(), true);
refChksmSize = refChksum.tellg();
refChksum.seekg(0, std::ifstream::beg);
@@ -650,20 +650,17 @@
uint32_t timestampOffset = 0;
uint32_t offset = 0;
android::Vector<FrameInfo> Info;
- for (uint32_t i = 0; i < STREAM_COUNT * 2; i++) {
- char mURL[512], info[512];
+ for (uint32_t i = 0; i < ADAPTIVE_STREAM_COUNT * 2; i++) {
std::ifstream eleStream, eleInfo;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info, i % STREAM_COUNT);
- if (!(strcmp(mURL, sResourceDir.c_str())) || !(strcmp(info, sResourceDir.c_str()))) {
+ bool valid = getFileNames(i % ADAPTIVE_STREAM_COUNT);
+ if (!valid) {
ALOGV("Stream not available, skipping this index");
continue;
}
- eleInfo.open(info);
- ASSERT_EQ(eleInfo.is_open(), true) << mURL << " - file not found";
+ eleInfo.open(mInfoFile);
+ ASSERT_EQ(eleInfo.is_open(), true) << mInputFile << " - file not found";
int bytesCount = 0;
uint32_t flags = 0;
uint32_t timestamp = 0;
@@ -690,8 +687,7 @@
// Reset Total frames before second decode loop
// mFramesReceived = 0;
- ALOGV("mURL : %s", mURL);
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
ASSERT_NO_FATAL_FAILURE(decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, &Info,
@@ -747,15 +743,9 @@
description("Test Request for thumbnail");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512], info[512];
android::Vector<FrameInfo> Info;
-
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info);
-
- int32_t numCsds = populateInfoVector(info, &Info, mTimestampDevTest, &mTimestampUslist);
- ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << info;
+ int32_t numCsds = populateInfoVector(mInfoFile, &Info, mTimestampDevTest, &mTimestampUslist);
+ ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << mInfoFile;
uint32_t flags = 0;
for (size_t i = 0; i < MAX_ITERATIONS; i++) {
@@ -772,7 +762,7 @@
} while (!(flags & SYNC_FRAME));
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
ASSERT_NO_FATAL_FAILURE(decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, &Info, 0,
@@ -834,19 +824,12 @@
ASSERT_EQ(mComponent->start(), C2_OK);
- char mURL[512], info[512];
android::Vector<FrameInfo> Info;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info);
-
mFlushedIndices.clear();
- int32_t numCsds = populateInfoVector(info, &Info, mTimestampDevTest, &mTimestampUslist);
- ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << info;
-
- ALOGV("mURL : %s", mURL);
+ int32_t numCsds = populateInfoVector(mInfoFile, &Info, mTimestampDevTest, &mTimestampUslist);
+ ASSERT_GE(numCsds, 0) << "Error in parsing input info file: " << mInfoFile;
// flush
std::list<std::unique_ptr<C2Work>> flushedWork;
@@ -857,7 +840,7 @@
ASSERT_EQ(mWorkQueue.size(), MAX_INPUT_BUFFERS);
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
// Decode 30 frames and flush. here 30 is chosen to ensure there is a key
// frame after this so that the below section can be covered for all
@@ -910,15 +893,10 @@
description("Decode with multiple empty input frames");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512], info[512];
std::ifstream eleStream, eleInfo;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info);
-
- eleInfo.open(info);
- ASSERT_EQ(eleInfo.is_open(), true) << mURL << " - file not found";
+ eleInfo.open(mInfoFile);
+ ASSERT_EQ(eleInfo.is_open(), true) << mInputFile << " - file not found";
android::Vector<FrameInfo> Info;
int bytesCount = 0;
uint32_t frameId = 0;
@@ -946,8 +924,7 @@
eleInfo.close();
ASSERT_EQ(mComponent->start(), C2_OK);
- ALOGV("mURL : %s", mURL);
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
ASSERT_NO_FATAL_FAILURE(decodeNFrames(mComponent, mQueueLock, mQueueCondition, mWorkQueue,
mFlushedIndices, mLinearPool, eleStream, &Info, 0,
@@ -973,6 +950,7 @@
void getParams() {
mInstanceName = std::get<0>(GetParam());
mComponentName = std::get<1>(GetParam());
+ mStreamIndex = 0;
}
};
@@ -982,22 +960,15 @@
description("Tests codecs for flush at different states");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512], info[512];
-
android::Vector<FrameInfo> Info;
- strcpy(mURL, sResourceDir.c_str());
- strcpy(info, sResourceDir.c_str());
- GetURLForComponent(mURL, info);
-
- int32_t numCsds = populateInfoVector(info, &Info, mTimestampDevTest, &mTimestampUslist);
+ int32_t numCsds = populateInfoVector(mInfoFile, &Info, mTimestampDevTest, &mTimestampUslist);
ASSERT_GE(numCsds, 0) << "Error in parsing input info file";
ASSERT_EQ(mComponent->start(), C2_OK);
- ALOGV("mURL : %s", mURL);
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
bool flushedDecoder = false;
bool signalEOS = false;
diff --git a/media/codec2/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoEncTest.cpp b/media/codec2/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoEncTest.cpp
index c557de1..6a00edd 100644
--- a/media/codec2/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoEncTest.cpp
+++ b/media/codec2/hidl/1.0/vts/functional/video/VtsHalMediaC2V1_0TargetVideoEncTest.cpp
@@ -95,9 +95,10 @@
mMinWidth = INT32_MAX;
mMinHeight = INT32_MAX;
- ASSERT_EQ(getMaxMinResolutionSupported(mComponent), C2_OK);
+ ASSERT_EQ(getMaxMinResolutionSupported(), C2_OK);
mWidth = std::max(std::min(mWidth, mMaxWidth), mMinWidth);
mHeight = std::max(std::min(mHeight, mMaxHeight), mMinHeight);
+ ALOGV("mWidth %d mHeight %d", mWidth, mHeight);
C2SecureModeTuning secureModeTuning{};
mComponent->query({&secureModeTuning}, {}, C2_MAY_BLOCK, nullptr);
@@ -106,6 +107,7 @@
mDisableTest = true;
}
+ getFile();
if (mDisableTest) std::cout << "[ WARN ] Test Disabled \n";
}
@@ -119,10 +121,9 @@
// Get the test parameters from GetParam call.
virtual void getParams() {}
-
+ void getFile();
bool setupConfigParam(int32_t nWidth, int32_t nHeight, int32_t nBFrame = 0);
- c2_status_t getMaxMinResolutionSupported(
- const std::shared_ptr<android::Codec2Client::Component>& component);
+ c2_status_t getMaxMinResolutionSupported();
// callback function to process onWorkDone received by Listener
void handleWorkDone(std::list<std::unique_ptr<C2Work>>& workItems) {
@@ -215,6 +216,8 @@
std::shared_ptr<android::Codec2Client::Listener> mListener;
std::shared_ptr<android::Codec2Client::Component> mComponent;
+ std::string mInputFile;
+
protected:
static void description(const std::string& description) {
RecordProperty("description", description);
@@ -284,9 +287,8 @@
return true;
}
-// LookUpTable of clips for component testing
-void GetURLForComponent(char* URL) {
- strcat(URL, "bbb_352x288_420p_30fps_32frames.yuv");
+void Codec2VideoEncHidlTestBase::getFile() {
+ mInputFile = sResourceDir + "bbb_352x288_420p_30fps_32frames.yuv";
}
void fillByteBuffer(char* inputBuffer, char* mInputData, uint32_t nWidth, int32_t nHeight) {
@@ -439,8 +441,7 @@
}
};
-c2_status_t Codec2VideoEncHidlTestBase::getMaxMinResolutionSupported(
- const std::shared_ptr<android::Codec2Client::Component>& component) {
+c2_status_t Codec2VideoEncHidlTestBase::getMaxMinResolutionSupported() {
std::unique_ptr<C2StreamPictureSizeInfo::input> param =
std::make_unique<C2StreamPictureSizeInfo::input>();
std::vector<C2FieldSupportedValuesQuery> validValueInfos = {
@@ -448,7 +449,7 @@
C2ParamField(param.get(), &C2StreamPictureSizeInfo::width)),
C2FieldSupportedValuesQuery::Current(
C2ParamField(param.get(), &C2StreamPictureSizeInfo::height))};
- c2_status_t c2err = component->querySupportedValues(validValueInfos, C2_MAY_BLOCK);
+ c2_status_t c2err = mComponent->querySupportedValues(validValueInfos, C2_MAY_BLOCK);
if (c2err != C2_OK || validValueInfos.size() != 2u) {
ALOGE("querySupportedValues_vb failed for pictureSize");
return c2err;
@@ -491,19 +492,14 @@
description("Encodes input file");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512];
bool signalEOS = std::get<3>(GetParam());
// Send an empty frame to receive CSD data from encoder.
bool sendEmptyFirstFrame = std::get<3>(GetParam());
mConfigBPictures = std::get<4>(GetParam());
- strcpy(mURL, sResourceDir.c_str());
- GetURLForComponent(mURL);
-
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
- ASSERT_EQ(eleStream.is_open(), true) << mURL << " file not found";
- ALOGV("mURL : %s", mURL);
+ eleStream.open(mInputFile, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true) << mInputFile << " file not found";
mTimestampUs = 0;
mTimestampDevTest = true;
@@ -640,11 +636,6 @@
description("Test Request for flush");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512];
-
- strcpy(mURL, sResourceDir.c_str());
- GetURLForComponent(mURL);
-
if (!setupConfigParam(mWidth, mHeight)) {
ASSERT_TRUE(false) << "Failed while configuring height and width for " << mComponentName;
}
@@ -655,9 +646,9 @@
std::ifstream eleStream;
uint32_t numFramesFlushed = 10;
uint32_t numFrames = ENC_NUM_FRAMES;
- eleStream.open(mURL, std::ifstream::binary);
+ eleStream.open(mInputFile, std::ifstream::binary);
ASSERT_EQ(eleStream.is_open(), true);
- ALOGV("mURL : %s", mURL);
+
// flush
std::list<std::unique_ptr<C2Work>> flushedWork;
c2_status_t err = mComponent->flush(C2Component::FLUSH_COMPONENT, &flushedWork);
@@ -820,15 +811,9 @@
description("Encodes input file for different bitrates");
if (mDisableTest) GTEST_SKIP() << "Test is disabled";
- char mURL[512];
-
- strcpy(mURL, sResourceDir.c_str());
- GetURLForComponent(mURL);
-
std::ifstream eleStream;
- eleStream.open(mURL, std::ifstream::binary);
- ASSERT_EQ(eleStream.is_open(), true) << mURL << " file not found";
- ALOGV("mURL : %s", mURL);
+ eleStream.open(mInputFile, std::ifstream::binary);
+ ASSERT_EQ(eleStream.is_open(), true) << mInputFile << " file not found";
mFlushedIndices.clear();
diff --git a/media/codec2/sfplugin/Codec2Buffer.cpp b/media/codec2/sfplugin/Codec2Buffer.cpp
index 34e6a88..691bab1 100644
--- a/media/codec2/sfplugin/Codec2Buffer.cpp
+++ b/media/codec2/sfplugin/Codec2Buffer.cpp
@@ -679,17 +679,20 @@
std::shared_ptr<C2Buffer> GraphicMetadataBuffer::asC2Buffer() {
#ifdef __LP64__
static std::once_flag s_checkOnce;
- static bool s_64bitonly {false};
+ static bool s_is64bitOk {true};
std::call_once(s_checkOnce, [&](){
const std::string abi32list =
::android::base::GetProperty("ro.product.cpu.abilist32", "");
- if (abi32list.empty()) {
- s_64bitonly = true;
+ if (!abi32list.empty()) {
+ int32_t inputSurfaceSetting =
+ ::android::base::GetIntProperty("debug.stagefright.c2inputsurface", int32_t(0));
+ s_is64bitOk = inputSurfaceSetting != 0;
}
});
- if (!s_64bitonly) {
- ALOGE("GraphicMetadataBuffer does not work in 32+64 system if compiled as 64-bit object");
+ if (!s_is64bitOk) {
+ ALOGE("GraphicMetadataBuffer does not work in 32+64 system if compiled as 64-bit object"\
+ "when debug.stagefright.c2inputsurface is set to 0");
return nullptr;
}
#endif
diff --git a/media/libaaudio/include/aaudio/AAudio.h b/media/libaaudio/include/aaudio/AAudio.h
index 6ca5fc8..4b08295 100644
--- a/media/libaaudio/include/aaudio/AAudio.h
+++ b/media/libaaudio/include/aaudio/AAudio.h
@@ -82,7 +82,9 @@
/**
* This format uses 24-bit samples packed into 3 bytes.
- * The bytes are in the native endian order.
+ * The bytes are in little-endian order, so the least significant byte
+ * comes first in the byte array.
+ *
* The maximum range of the data is -8388608 (0x800000)
* to 8388607 (0x7FFFFF).
*
diff --git a/media/libstagefright/data/media_codecs_sw.xml b/media/libstagefright/data/media_codecs_sw.xml
index a32bc26..a4e3425 100644
--- a/media/libstagefright/data/media_codecs_sw.xml
+++ b/media/libstagefright/data/media_codecs_sw.xml
@@ -237,7 +237,7 @@
<Limit name="sample-rate" ranges="8000,12000,16000,24000,48000" />
<Limit name="bitrate" range="500-512000" />
<Limit name="complexity" range="0-10" default="5" />
- <Feature name="bitrate-modes" value="CBR" />
+ <Feature name="bitrate-modes" value="CBR,VBR" />
</MediaCodec>
<MediaCodec name="c2.android.h263.encoder" type="video/3gpp">
<Alias name="OMX.google.h263.encoder" />
diff --git a/media/mediaserver/Android.bp b/media/mediaserver/Android.bp
index 3e4e4932..79b192e 100644
--- a/media/mediaserver/Android.bp
+++ b/media/mediaserver/Android.bp
@@ -53,9 +53,12 @@
"frameworks/av/services/mediaresourcemanager",
],
- // mediaserver has only been verified on 32-bit, see b/126502613
- // use "prefer32" to *only* enable 64-bit builds on 64-bit-only lunch
- // targets, which allows them to reach 'boot_complete'.
+ // By default mediaserver runs in 32-bit to save memory, except
+ // on 64-bit-only lunch targets.
+ // ****************************************************************
+ // TO ENABLE 64-BIT MEDIASERVER ON MIXED 32/64-BIT DEVICES, COMMENT
+ // OUT THE FOLLOWING LINE:
+ // ****************************************************************
compile_multilib: "prefer32",
init_rc: ["mediaserver.rc"],
diff --git a/services/camera/libcameraservice/api2/HeicCompositeStream.cpp b/services/camera/libcameraservice/api2/HeicCompositeStream.cpp
index 582001d..a73ffb9 100644
--- a/services/camera/libcameraservice/api2/HeicCompositeStream.cpp
+++ b/services/camera/libcameraservice/api2/HeicCompositeStream.cpp
@@ -16,6 +16,7 @@
#define LOG_TAG "Camera3-HeicCompositeStream"
#define ATRACE_TAG ATRACE_TAG_CAMERA
+#define ALIGN(x, mask) ( ((x) + (mask) - 1) & ~((mask) - 1) )
//#define LOG_NDEBUG 0
#include <linux/memfd.h>
@@ -1380,7 +1381,9 @@
mOutputWidth = width;
mOutputHeight = height;
mAppSegmentMaxSize = calcAppSegmentMaxSize(cameraDevice->info());
- mMaxHeicBufferSize = mOutputWidth * mOutputHeight * 3 / 2 + mAppSegmentMaxSize;
+ mMaxHeicBufferSize =
+ ALIGN(mOutputWidth, HeicEncoderInfoManager::kGridWidth) *
+ ALIGN(mOutputHeight, HeicEncoderInfoManager::kGridHeight) * 3 / 2 + mAppSegmentMaxSize;
return OK;
}
diff --git a/services/camera/libcameraservice/api2/HeicEncoderInfoManager.h b/services/camera/libcameraservice/api2/HeicEncoderInfoManager.h
index 58edba2..a65be9c 100644
--- a/services/camera/libcameraservice/api2/HeicEncoderInfoManager.h
+++ b/services/camera/libcameraservice/api2/HeicEncoderInfoManager.h
@@ -38,6 +38,7 @@
bool isSizeSupported(int32_t width, int32_t height,
bool* useHeic, bool* useGrid, int64_t* stall, AString* hevcName) const;
+ // kGridWidth and kGridHeight should be 2^n
static const auto kGridWidth = 512;
static const auto kGridHeight = 512;
private:
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 578a32f..aefc75e 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -779,16 +779,21 @@
}
lines = String8(" In-flight requests:\n");
- if (mInFlightMap.size() == 0) {
- lines.append(" None\n");
- } else {
- for (size_t i = 0; i < mInFlightMap.size(); i++) {
- InFlightRequest r = mInFlightMap.valueAt(i);
- lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata"
- " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i),
- r.shutterTimestamp, r.haveResultMetadata ? "true" : "false",
- r.numBuffersLeft);
+ if (mInFlightLock.try_lock()) {
+ if (mInFlightMap.size() == 0) {
+ lines.append(" None\n");
+ } else {
+ for (size_t i = 0; i < mInFlightMap.size(); i++) {
+ InFlightRequest r = mInFlightMap.valueAt(i);
+ lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata"
+ " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i),
+ r.shutterTimestamp, r.haveResultMetadata ? "true" : "false",
+ r.numBuffersLeft);
+ }
}
+ mInFlightLock.unlock();
+ } else {
+ lines.append(" Failed to acquire In-flight lock!\n");
}
write(fd, lines.string(), lines.size());