Merge "Signal minimum quality needs to underlying codec" into sc-dev
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/utils/Codec2BufferUtils.cpp b/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
index 0966988..5f87c66 100644
--- a/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
+++ b/media/codec2/sfplugin/utils/Codec2BufferUtils.cpp
@@ -507,9 +507,21 @@
};
}
+// Matrix coefficient to convert RGB to Planar YUV data.
+// Each sub-array represents the 3X3 coeff used with R, G and B
+static const int16_t bt601Matrix[2][3][3] = {
+ { { 76, 150, 29 }, { -43, -85, 128 }, { 128, -107, -21 } }, /* RANGE_FULL */
+ { { 66, 129, 25 }, { -38, -74, 112 }, { 112, -94, -18 } }, /* RANGE_LIMITED */
+};
+
+static const int16_t bt709Matrix[2][3][3] = {
+ { { 54, 183, 18 }, { -29, -99, 128 }, { 128, -116, -12 } }, /* RANGE_FULL */
+ { { 47, 157, 16 }, { -26, -86, 112 }, { 112, -102, -10 } }, /* RANGE_LIMITED */
+};
+
status_t ConvertRGBToPlanarYUV(
uint8_t *dstY, size_t dstStride, size_t dstVStride, size_t bufferSize,
- const C2GraphicView &src) {
+ const C2GraphicView &src, C2Color::matrix_t colorMatrix, C2Color::range_t colorRange) {
CHECK(dstY != nullptr);
CHECK((src.width() & 1) == 0);
CHECK((src.height() & 1) == 0);
@@ -527,28 +539,38 @@
const uint8_t *pGreen = src.data()[C2PlanarLayout::PLANE_G];
const uint8_t *pBlue = src.data()[C2PlanarLayout::PLANE_B];
-#define CLIP3(x,y,z) (((z) < (x)) ? (x) : (((z) > (y)) ? (y) : (z)))
+ // set default range as limited
+ if (colorRange != C2Color::RANGE_FULL && colorRange != C2Color::RANGE_LIMITED) {
+ colorRange = C2Color::RANGE_LIMITED;
+ }
+ const int16_t (*weights)[3] =
+ (colorMatrix == C2Color::MATRIX_BT709) ?
+ bt709Matrix[colorRange - 1] : bt601Matrix[colorRange - 1];
+ uint8_t zeroLvl = colorRange == C2Color::RANGE_FULL ? 0 : 16;
+ uint8_t maxLvlLuma = colorRange == C2Color::RANGE_FULL ? 255 : 235;
+ uint8_t maxLvlChroma = colorRange == C2Color::RANGE_FULL ? 255 : 240;
+
+#define CLIP3(min,v,max) (((v) < (min)) ? (min) : (((max) > (v)) ? (v) : (max)))
for (size_t y = 0; y < src.height(); ++y) {
for (size_t x = 0; x < src.width(); ++x) {
- uint8_t red = *pRed;
- uint8_t green = *pGreen;
- uint8_t blue = *pBlue;
+ uint8_t r = *pRed;
+ uint8_t g = *pGreen;
+ uint8_t b = *pBlue;
- // using ITU-R BT.601 conversion matrix
- unsigned luma =
- CLIP3(0, (((red * 66 + green * 129 + blue * 25) >> 8) + 16), 255);
+ unsigned luma = ((r * weights[0][0] + g * weights[0][1] + b * weights[0][2]) >> 8) +
+ zeroLvl;
- dstY[x] = luma;
+ dstY[x] = CLIP3(zeroLvl, luma, maxLvlLuma);
if ((x & 1) == 0 && (y & 1) == 0) {
- unsigned U =
- CLIP3(0, (((-red * 38 - green * 74 + blue * 112) >> 8) + 128), 255);
+ unsigned U = ((r * weights[1][0] + g * weights[1][1] + b * weights[1][2]) >> 8) +
+ 128;
- unsigned V =
- CLIP3(0, (((red * 112 - green * 94 - blue * 18) >> 8) + 128), 255);
+ unsigned V = ((r * weights[2][0] + g * weights[2][1] + b * weights[2][2]) >> 8) +
+ 128;
- dstU[x >> 1] = U;
- dstV[x >> 1] = V;
+ dstU[x >> 1] = CLIP3(zeroLvl, U, maxLvlChroma);
+ dstV[x >> 1] = CLIP3(zeroLvl, V, maxLvlChroma);
}
pRed += layout.planes[C2PlanarLayout::PLANE_R].colInc;
pGreen += layout.planes[C2PlanarLayout::PLANE_G].colInc;
diff --git a/media/codec2/sfplugin/utils/Codec2BufferUtils.h b/media/codec2/sfplugin/utils/Codec2BufferUtils.h
index af29e81..9fa642d 100644
--- a/media/codec2/sfplugin/utils/Codec2BufferUtils.h
+++ b/media/codec2/sfplugin/utils/Codec2BufferUtils.h
@@ -18,6 +18,7 @@
#define CODEC2_BUFFER_UTILS_H_
#include <C2Buffer.h>
+#include <C2Config.h>
#include <C2ParamDef.h>
#include <media/hardware/VideoAPI.h>
@@ -39,7 +40,8 @@
*/
status_t ConvertRGBToPlanarYUV(
uint8_t *dstY, size_t dstStride, size_t dstVStride, size_t bufferSize,
- const C2GraphicView &src);
+ const C2GraphicView &src, C2Color::matrix_t colorMatrix = C2Color::MATRIX_BT601,
+ C2Color::range_t colorRange = C2Color::RANGE_LIMITED);
/**
* Returns a planar YUV 420 8-bit media image descriptor.
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: