Merge "CCodec: revise resource releases" into rvc-dev

gugelfrei
Wonsik Kim 4 years ago committed by Android (Google) Code Review
commit 48779be75d

@ -1379,7 +1379,7 @@ void CCodec::initiateStop() {
state->set(STOPPING); state->set(STOPPING);
} }
mChannel->stop(); mChannel->reset();
(new AMessage(kWhatStop, this))->post(); (new AMessage(kWhatStop, this))->post();
} }
@ -1406,9 +1406,6 @@ void CCodec::stop() {
// TODO: convert err into status_t // TODO: convert err into status_t
mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL); mCallback->onError(UNKNOWN_ERROR, ACTION_CODE_FATAL);
} }
// Assure buffers are not owned when stop() was called without flush().
std::list<std::unique_ptr<C2Work>> flushedWork;
mChannel->flush(flushedWork);
{ {
Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig); Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
@ -1468,7 +1465,7 @@ void CCodec::initiateRelease(bool sendCallback /* = true */) {
} }
} }
mChannel->stop(); mChannel->reset();
// thiz holds strong ref to this while the thread is running. // thiz holds strong ref to this while the thread is running.
sp<CCodec> thiz(this); sp<CCodec> thiz(this);
std::thread([thiz, sendCallback] { thiz->release(sendCallback); }).detach(); std::thread([thiz, sendCallback] { thiz->release(sendCallback); }).detach();
@ -1495,6 +1492,7 @@ void CCodec::release(bool sendCallback) {
state->set(RELEASED); state->set(RELEASED);
state->comp.reset(); state->comp.reset();
} }
(new AMessage(kWhatRelease, this))->post();
if (sendCallback) { if (sendCallback) {
mCallback->onReleaseCompleted(); mCallback->onReleaseCompleted();
} }
@ -1759,6 +1757,12 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
flush(); flush();
break; break;
} }
case kWhatRelease: {
mChannel->release();
mClient.reset();
mClientListener.reset();
break;
}
case kWhatCreateInputSurface: { case kWhatCreateInputSurface: {
// Surface operations may be briefly blocking. // Surface operations may be briefly blocking.
setDeadline(now, 1500ms, "createInputSurface"); setDeadline(now, 1500ms, "createInputSurface");

@ -713,7 +713,7 @@ void CCodecBufferChannel::feedInputBufferIfAvailableInternal() {
return; return;
} else { } else {
Mutexed<Output>::Locked output(mOutput); Mutexed<Output>::Locked output(mOutput);
if (output->buffers->numClientBuffers() >= output->numSlots) { if (!output->buffers || output->buffers->numClientBuffers() >= output->numSlots) {
return; return;
} }
} }
@ -1401,6 +1401,30 @@ void CCodecBufferChannel::stop() {
} }
} }
void CCodecBufferChannel::reset() {
stop();
{
Mutexed<Input>::Locked input(mInput);
input->buffers.reset(new DummyInputBuffers(""));
}
{
Mutexed<Output>::Locked output(mOutput);
output->buffers.reset();
}
}
void CCodecBufferChannel::release() {
mComponent.reset();
mInputAllocator.reset();
mOutputSurface.lock()->surface.clear();
{
Mutexed<BlockPools>::Locked blockPools{mBlockPools};
blockPools->inputPool.reset();
blockPools->outputPoolIntf.reset();
}
}
void CCodecBufferChannel::flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) { void CCodecBufferChannel::flush(const std::list<std::unique_ptr<C2Work>> &flushedWork) {
ALOGV("[%s] flush", mName); ALOGV("[%s] flush", mName);
{ {
@ -1431,7 +1455,9 @@ void CCodecBufferChannel::flush(const std::list<std::unique_ptr<C2Work>> &flushe
} }
{ {
Mutexed<Output>::Locked output(mOutput); Mutexed<Output>::Locked output(mOutput);
output->buffers->flush(flushedWork); if (output->buffers) {
output->buffers->flush(flushedWork);
}
} }
mReorderStash.lock()->flush(); mReorderStash.lock()->flush();
mPipelineWatcher.lock()->flush(); mPipelineWatcher.lock()->flush();
@ -1469,20 +1495,25 @@ bool CCodecBufferChannel::handleWork(
std::unique_ptr<C2Work> work, std::unique_ptr<C2Work> work,
const sp<AMessage> &outputFormat, const sp<AMessage> &outputFormat,
const C2StreamInitDataInfo::output *initData) { const C2StreamInitDataInfo::output *initData) {
if (outputFormat != nullptr) { {
Mutexed<Output>::Locked output(mOutput); Mutexed<Output>::Locked output(mOutput);
ALOGD("[%s] onWorkDone: output format changed to %s", if (!output->buffers) {
mName, outputFormat->debugString().c_str()); return false;
output->buffers->setFormat(outputFormat); }
if (outputFormat != nullptr) {
AString mediaType; ALOGD("[%s] onWorkDone: output format changed to %s",
if (outputFormat->findString(KEY_MIME, &mediaType) mName, outputFormat->debugString().c_str());
&& mediaType == MIMETYPE_AUDIO_RAW) { output->buffers->setFormat(outputFormat);
int32_t channelCount;
int32_t sampleRate; AString mediaType;
if (outputFormat->findInt32(KEY_CHANNEL_COUNT, &channelCount) if (outputFormat->findString(KEY_MIME, &mediaType)
&& outputFormat->findInt32(KEY_SAMPLE_RATE, &sampleRate)) { && mediaType == MIMETYPE_AUDIO_RAW) {
output->buffers->updateSkipCutBuffer(sampleRate, channelCount); int32_t channelCount;
int32_t sampleRate;
if (outputFormat->findInt32(KEY_CHANNEL_COUNT, &channelCount)
&& outputFormat->findInt32(KEY_SAMPLE_RATE, &sampleRate)) {
output->buffers->updateSkipCutBuffer(sampleRate, channelCount);
}
} }
} }
} }
@ -1606,6 +1637,9 @@ bool CCodecBufferChannel::handleWork(
size_t numInputSlots = mInput.lock()->numSlots; size_t numInputSlots = mInput.lock()->numSlots;
{ {
Mutexed<Output>::Locked output(mOutput); Mutexed<Output>::Locked output(mOutput);
if (!output->buffers) {
return false;
}
output->outputDelay = outputDelay.value; output->outputDelay = outputDelay.value;
numOutputSlots = outputDelay.value + kSmoothnessFactor; numOutputSlots = outputDelay.value + kSmoothnessFactor;
if (output->numSlots < numOutputSlots) { if (output->numSlots < numOutputSlots) {
@ -1695,7 +1729,7 @@ bool CCodecBufferChannel::handleWork(
if (initData != nullptr) { if (initData != nullptr) {
Mutexed<Output>::Locked output(mOutput); Mutexed<Output>::Locked output(mOutput);
if (output->buffers->registerCsd(initData, &index, &outBuffer) == OK) { if (output->buffers && output->buffers->registerCsd(initData, &index, &outBuffer) == OK) {
outBuffer->meta()->setInt64("timeUs", timestamp.peek()); outBuffer->meta()->setInt64("timeUs", timestamp.peek());
outBuffer->meta()->setInt32("flags", MediaCodec::BUFFER_FLAG_CODECCONFIG); outBuffer->meta()->setInt32("flags", MediaCodec::BUFFER_FLAG_CODECCONFIG);
ALOGV("[%s] onWorkDone: csd index = %zu [%p]", mName, index, outBuffer.get()); ALOGV("[%s] onWorkDone: csd index = %zu [%p]", mName, index, outBuffer.get());
@ -1758,6 +1792,9 @@ void CCodecBufferChannel::sendOutputBuffers() {
} }
Mutexed<Output>::Locked output(mOutput); Mutexed<Output>::Locked output(mOutput);
if (!output->buffers) {
return;
}
status_t err = output->buffers->registerBuffer(entry.buffer, &index, &outBuffer); status_t err = output->buffers->registerBuffer(entry.buffer, &index, &outBuffer);
if (err != OK) { if (err != OK) {
bool outputBuffersChanged = false; bool outputBuffersChanged = false;

@ -138,6 +138,16 @@ public:
*/ */
void stop(); void stop();
/**
* Stop queueing buffers to the component and release all buffers.
*/
void reset();
/**
* Release all resources.
*/
void release();
void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork); void flush(const std::list<std::unique_ptr<C2Work>> &flushedWork);
/** /**

@ -416,7 +416,7 @@ public:
size_t *index, size_t *index,
sp<Codec2Buffer> *buffer, sp<Codec2Buffer> *buffer,
std::function<bool(const sp<Codec2Buffer> &)> match = std::function<bool(const sp<Codec2Buffer> &)> match =
[](const sp<Codec2Buffer> &) { return true; }); [](const sp<Codec2Buffer> &buffer) { return (buffer != nullptr); });
/** /**
* Return the buffer from the client, and get the C2Buffer object back from * Return the buffer from the client, and get the C2Buffer object back from

@ -2641,6 +2641,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
} }
mResourceManagerProxy->removeClient(); mResourceManagerProxy->removeClient();
mReleaseSurface.reset();
if (mReplyID != nullptr) { if (mReplyID != nullptr) {
(new AMessage)->postReply(mReplyID); (new AMessage)->postReply(mReplyID);

Loading…
Cancel
Save