Merge "Propagate error signalled by the source all the way to the output EOS notification."
This commit is contained in:
committed by
Android (Google) Code Review
commit
48719dc622
@@ -113,6 +113,7 @@ private:
|
||||
|
||||
Vector<BufferInfo> mBuffers[2];
|
||||
bool mPortEOS[2];
|
||||
status_t mInputEOSResult;
|
||||
|
||||
List<sp<AMessage> > mDeferredQueue;
|
||||
|
||||
|
||||
@@ -110,7 +110,11 @@ bool NuPlayer::HTTPLiveSource::feedMoreTSData() {
|
||||
if (n == -EWOULDBLOCK) {
|
||||
break;
|
||||
} else if (n < 0) {
|
||||
LOGI("input data EOS reached.");
|
||||
if (n != ERROR_END_OF_STREAM) {
|
||||
LOGI("input data EOS reached, error %d", n);
|
||||
} else {
|
||||
LOGI("input data EOS reached.");
|
||||
}
|
||||
mTSParser->signalEOS(n);
|
||||
mEOS = true;
|
||||
break;
|
||||
|
||||
@@ -272,7 +272,18 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
|
||||
}
|
||||
}
|
||||
} else if (what == ACodec::kWhatEOS) {
|
||||
mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
|
||||
int32_t err;
|
||||
CHECK(codecRequest->findInt32("err", &err));
|
||||
|
||||
if (err == ERROR_END_OF_STREAM) {
|
||||
LOGV("got %s decoder EOS", audio ? "audio" : "video");
|
||||
} else {
|
||||
LOGV("got %s decoder EOS w/ error %d",
|
||||
audio ? "audio" : "video",
|
||||
err);
|
||||
}
|
||||
|
||||
mRenderer->queueEOS(audio, err);
|
||||
} else if (what == ACodec::kWhatFlushCompleted) {
|
||||
bool needShutdown;
|
||||
|
||||
@@ -397,7 +408,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
|
||||
if (finalResult == ERROR_END_OF_STREAM) {
|
||||
LOGV("reached %s EOS", audio ? "audio" : "video");
|
||||
} else {
|
||||
LOGE("%s track encountered an error (0x%08x)",
|
||||
LOGE("%s track encountered an error (%d)",
|
||||
audio ? "audio" : "video", finalResult);
|
||||
|
||||
notifyListener(
|
||||
|
||||
@@ -323,6 +323,7 @@ ACodec::ACodec()
|
||||
mFlushingState = new FlushingState(this);
|
||||
|
||||
mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false;
|
||||
mInputEOSResult = OK;
|
||||
|
||||
changeState(mUninitializedState);
|
||||
}
|
||||
@@ -1347,7 +1348,10 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
|
||||
case KEEP_BUFFERS:
|
||||
{
|
||||
if (buffer == NULL) {
|
||||
mCodec->mPortEOS[kPortIndexInput] = true;
|
||||
if (!mCodec->mPortEOS[kPortIndexInput]) {
|
||||
mCodec->mPortEOS[kPortIndexInput] = true;
|
||||
mCodec->mInputEOSResult = err;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1398,8 +1402,14 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
|
||||
|
||||
getMoreInputDataIfPossible();
|
||||
} else if (!mCodec->mPortEOS[kPortIndexInput]) {
|
||||
LOGV("[%s] Signalling EOS on the input port",
|
||||
mCodec->mComponentName.c_str());
|
||||
if (err != ERROR_END_OF_STREAM) {
|
||||
LOGV("[%s] Signalling EOS on the input port "
|
||||
"due to error %d",
|
||||
mCodec->mComponentName.c_str(), err);
|
||||
} else {
|
||||
LOGV("[%s] Signalling EOS on the input port",
|
||||
mCodec->mComponentName.c_str());
|
||||
}
|
||||
|
||||
LOGV("[%s] calling emptyBuffer %p signalling EOS",
|
||||
mCodec->mComponentName.c_str(), bufferID);
|
||||
@@ -1416,6 +1426,7 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
|
||||
info->mStatus = BufferInfo::OWNED_BY_COMPONENT;
|
||||
|
||||
mCodec->mPortEOS[kPortIndexInput] = true;
|
||||
mCodec->mInputEOSResult = err;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1523,6 +1534,7 @@ bool ACodec::BaseState::onOMXFillBufferDone(
|
||||
if (flags & OMX_BUFFERFLAG_EOS) {
|
||||
sp<AMessage> notify = mCodec->mNotify->dup();
|
||||
notify->setInt32("what", ACodec::kWhatEOS);
|
||||
notify->setInt32("err", mCodec->mInputEOSResult);
|
||||
notify->post();
|
||||
|
||||
mCodec->mPortEOS[kPortIndexOutput] = true;
|
||||
@@ -1721,6 +1733,8 @@ void ACodec::UninitializedState::onSetup(
|
||||
mCodec->mPortEOS[kPortIndexInput] =
|
||||
mCodec->mPortEOS[kPortIndexOutput] = false;
|
||||
|
||||
mCodec->mInputEOSResult = OK;
|
||||
|
||||
mCodec->configureCodec(mime.c_str(), msg);
|
||||
|
||||
sp<RefBase> obj;
|
||||
@@ -2371,6 +2385,8 @@ void ACodec::FlushingState::changeStateIfWeOwnAllBuffers() {
|
||||
mCodec->mPortEOS[kPortIndexInput] =
|
||||
mCodec->mPortEOS[kPortIndexOutput] = false;
|
||||
|
||||
mCodec->mInputEOSResult = OK;
|
||||
|
||||
mCodec->changeState(mCodec->mExecutingState);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user