diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2020-03-19 23:58:02 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-03-19 23:58:02 +0000 |
| commit | da52cc201ecf857b2f2ff1fb5596cc730d7bf47c (patch) | |
| tree | ebcd3a8dd1f86a30be0bb235b90d72eaecdf73b2 | |
| parent | 7f82d1a74e77e0a89fd8431dbaf68f9b8e8b7118 (diff) | |
| parent | 04bcc9b67e4bfb6092c9cb38c6bec6aeb0167519 (diff) | |
| download | frameworks_av-da52cc201ecf857b2f2ff1fb5596cc730d7bf47c.tar.gz frameworks_av-da52cc201ecf857b2f2ff1fb5596cc730d7bf47c.tar.bz2 frameworks_av-da52cc201ecf857b2f2ff1fb5596cc730d7bf47c.zip | |
Merge "RESTRICT AUTOMERGE CCodec: make config consistent before/after flush" into qt-qpr1-dev
| -rw-r--r-- | media/codec2/sfplugin/CCodec.cpp | 21 | ||||
| -rw-r--r-- | media/codec2/sfplugin/CCodec.h | 2 | ||||
| -rw-r--r-- | media/codec2/sfplugin/CCodecBufferChannel.cpp | 38 |
3 files changed, 38 insertions, 23 deletions
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp index 4a31953a80..78ddd6d569 100644 --- a/media/codec2/sfplugin/CCodec.cpp +++ b/media/codec2/sfplugin/CCodec.cpp @@ -1286,7 +1286,8 @@ void CCodec::start() { { Mutexed<Config>::Locked config(mConfig); inputFormat = config->mInputFormat; - outputFormat = config->mOutputFormat; + // start triggers format dup + outputFormat = config->mOutputFormat = config->mOutputFormat->dup(); if (config->mInputSurface) { err2 = config->mInputSurface->start(); } @@ -1295,6 +1296,8 @@ void CCodec::start() { mCallback->onError(err2, ACTION_CODE_FATAL); return; } + // We're not starting after flush. + (void)mSentConfigAfterResume.test_and_set(); err2 = mChannel->start(inputFormat, outputFormat); if (err2 != OK) { mCallback->onError(err2, ACTION_CODE_FATAL); @@ -1523,18 +1526,26 @@ void CCodec::flush() { } void CCodec::signalResume() { - auto setResuming = [this] { + std::shared_ptr<Codec2Client::Component> comp; + auto setResuming = [this, &comp] { Mutexed<State>::Locked state(mState); if (state->get() != FLUSHED) { return UNKNOWN_ERROR; } state->set(RESUMING); + comp = state->comp; return OK; }; if (tryAndReportOnError(setResuming) != OK) { return; } + mSentConfigAfterResume.clear(); + { + Mutexed<Config>::Locked config(mConfig); + config->queryConfiguration(comp); + } + (void)mChannel->start(nullptr, nullptr); { @@ -1730,7 +1741,7 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { // handle configuration changes in work done Mutexed<Config>::Locked config(mConfig); - bool changed = false; + bool changed = !mSentConfigAfterResume.test_and_set(); Config::Watcher<C2StreamInitDataInfo::output> initData = config->watch<C2StreamInitDataInfo::output>(); if (!work->worklets.empty() @@ -1762,7 +1773,9 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) { ++stream; } - changed = config->updateConfiguration(updates, config->mOutputDomain); + if (config->updateConfiguration(updates, config->mOutputDomain)) { + changed = true; + } // copy standard infos to graphic buffers if not already present (otherwise, we // may overwrite the actual intermediate value with a final value) diff --git a/media/codec2/sfplugin/CCodec.h b/media/codec2/sfplugin/CCodec.h index b0b3c4f175..a580d1d20c 100644 --- a/media/codec2/sfplugin/CCodec.h +++ b/media/codec2/sfplugin/CCodec.h @@ -17,6 +17,7 @@ #ifndef C_CODEC_H_ #define C_CODEC_H_ +#include <atomic> #include <chrono> #include <list> #include <memory> @@ -175,6 +176,7 @@ private: typedef CCodecConfig Config; Mutexed<Config> mConfig; Mutexed<std::list<std::unique_ptr<C2Work>>> mWorkDoneQueue; + std::atomic_flag mSentConfigAfterResume; friend class CCodecCallbackImpl; diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp index 2efb9871e4..4ee6c1cd4f 100644 --- a/media/codec2/sfplugin/CCodecBufferChannel.cpp +++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp @@ -1072,7 +1072,7 @@ status_t CCodecBufferChannel::start( } else { output->buffers.reset(new LinearOutputBuffers(mName)); } - output->buffers->setFormat(outputFormat->dup()); + output->buffers->setFormat(outputFormat); // Try to set output surface to created block pool if given. @@ -1276,6 +1276,24 @@ bool CCodecBufferChannel::handleWork( std::unique_ptr<C2Work> work, const sp<AMessage> &outputFormat, const C2StreamInitDataInfo::output *initData) { + if (outputFormat != nullptr) { + Mutexed<Output>::Locked output(mOutput); + ALOGD("[%s] onWorkDone: output format changed to %s", + mName, outputFormat->debugString().c_str()); + output->buffers->setFormat(outputFormat); + + AString mediaType; + if (outputFormat->findString(KEY_MIME, &mediaType) + && mediaType == MIMETYPE_AUDIO_RAW) { + int32_t channelCount; + int32_t sampleRate; + if (outputFormat->findInt32(KEY_CHANNEL_COUNT, &channelCount) + && outputFormat->findInt32(KEY_SAMPLE_RATE, &sampleRate)) { + output->buffers->updateSkipCutBuffer(sampleRate, channelCount); + } + } + } + if ((work->input.ordinal.frameIndex - mFirstValidFrameIndex.load()).peek() < 0) { // Discard frames from previous generation. ALOGD("[%s] Discard frames from previous generation.", mName); @@ -1453,24 +1471,6 @@ bool CCodecBufferChannel::handleWork( } } - if (outputFormat != nullptr) { - Mutexed<Output>::Locked output(mOutput); - ALOGD("[%s] onWorkDone: output format changed to %s", - mName, outputFormat->debugString().c_str()); - output->buffers->setFormat(outputFormat); - - AString mediaType; - if (outputFormat->findString(KEY_MIME, &mediaType) - && mediaType == MIMETYPE_AUDIO_RAW) { - int32_t channelCount; - int32_t sampleRate; - if (outputFormat->findInt32(KEY_CHANNEL_COUNT, &channelCount) - && outputFormat->findInt32(KEY_SAMPLE_RATE, &sampleRate)) { - output->buffers->updateSkipCutBuffer(sampleRate, channelCount); - } - } - } - int32_t flags = 0; if (worklet->output.flags & C2FrameData::FLAG_END_OF_STREAM) { flags |= MediaCodec::BUFFER_FLAG_EOS; |
