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);
}
mChannel->stop();
mChannel->reset();
(new AMessage(kWhatStop, this))->post();
}
@ -1406,9 +1406,6 @@ void CCodec::stop() {
// TODO: convert err into status_t
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);
@ -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.
sp<CCodec> thiz(this);
std::thread([thiz, sendCallback] { thiz->release(sendCallback); }).detach();
@ -1495,6 +1492,7 @@ void CCodec::release(bool sendCallback) {
state->set(RELEASED);
state->comp.reset();
}
(new AMessage(kWhatRelease, this))->post();
if (sendCallback) {
mCallback->onReleaseCompleted();
}
@ -1759,6 +1757,12 @@ void CCodec::onMessageReceived(const sp<AMessage> &msg) {
flush();
break;
}
case kWhatRelease: {
mChannel->release();
mClient.reset();
mClientListener.reset();
break;
}
case kWhatCreateInputSurface: {
// Surface operations may be briefly blocking.
setDeadline(now, 1500ms, "createInputSurface");

@ -713,7 +713,7 @@ void CCodecBufferChannel::feedInputBufferIfAvailableInternal() {
return;
} else {
Mutexed<Output>::Locked output(mOutput);
if (output->buffers->numClientBuffers() >= output->numSlots) {
if (!output->buffers || output->buffers->numClientBuffers() >= output->numSlots) {
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) {
ALOGV("[%s] flush", mName);
{
@ -1431,7 +1455,9 @@ void CCodecBufferChannel::flush(const std::list<std::unique_ptr<C2Work>> &flushe
}
{
Mutexed<Output>::Locked output(mOutput);
output->buffers->flush(flushedWork);
if (output->buffers) {
output->buffers->flush(flushedWork);
}
}
mReorderStash.lock()->flush();
mPipelineWatcher.lock()->flush();
@ -1469,20 +1495,25 @@ 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 (!output->buffers) {
return false;
}
if (outputFormat != nullptr) {
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);
}
}
}
}
@ -1606,6 +1637,9 @@ bool CCodecBufferChannel::handleWork(
size_t numInputSlots = mInput.lock()->numSlots;
{
Mutexed<Output>::Locked output(mOutput);
if (!output->buffers) {
return false;
}
output->outputDelay = outputDelay.value;
numOutputSlots = outputDelay.value + kSmoothnessFactor;
if (output->numSlots < numOutputSlots) {
@ -1695,7 +1729,7 @@ bool CCodecBufferChannel::handleWork(
if (initData != nullptr) {
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()->setInt32("flags", MediaCodec::BUFFER_FLAG_CODECCONFIG);
ALOGV("[%s] onWorkDone: csd index = %zu [%p]", mName, index, outBuffer.get());
@ -1758,6 +1792,9 @@ void CCodecBufferChannel::sendOutputBuffers() {
}
Mutexed<Output>::Locked output(mOutput);
if (!output->buffers) {
return;
}
status_t err = output->buffers->registerBuffer(entry.buffer, &index, &outBuffer);
if (err != OK) {
bool outputBuffersChanged = false;

@ -138,6 +138,16 @@ public:
*/
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);
/**

@ -416,7 +416,7 @@ public:
size_t *index,
sp<Codec2Buffer> *buffer,
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

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

Loading…
Cancel
Save