Merge "Benchmark: Fixing error propgation for Async callback" am: bcb857727f am: 9cd4858198

am: f99e3416e4

Change-Id: I1ca2adc6238c995aed2f3a9b9b4e6b069d8d724b
gugelfrei
Ray Essick 5 years ago committed by android-build-merger
commit 8df0bd80ae

@ -56,10 +56,10 @@ void OnFormatChangedCB(AMediaCodec *codec, void *userdata, AMediaFormat *format)
void OnErrorCB(AMediaCodec *codec, void *userdata, media_status_t err, int32_t actionCode,
const char *detail) {
(void)codec;
ALOGV("OnErrorCB: err(%d), actionCode(%d), detail(%s)", err, actionCode, detail);
ALOGE("OnErrorCB: err(%d), actionCode(%d), detail(%s)", err, actionCode, detail);
CallBackHandle *self = (CallBackHandle *)userdata;
self->mSawError = true;
self->mIOQueue.push([self, codec, err]() { self->onError(codec, err); });
}
AMediaCodec *createMediaCodec(AMediaFormat *format, const char *mime, string codecName,

@ -87,6 +87,10 @@ class CallBackHandle {
(void)codec;
(void)format;
}
virtual void onError(AMediaCodec *codec, media_status_t err) {
(void)codec;
(void)err;
}
virtual void onOutputAvailable(AMediaCodec *codec, int32_t index,
AMediaCodecBufferInfo *bufferInfo) {
(void)codec;

@ -32,8 +32,8 @@ tuple<ssize_t, uint32_t, int64_t> readSampleData(uint8_t *inputBuffer, int32_t &
int64_t timestamp = frameInfo[frameID].presentationTimeUs;
ssize_t bytesCount = frameInfo[frameID].size;
if (bufSize < bytesCount) {
ALOGE("Error : insufficient resource");
return make_tuple(0, AMEDIACODEC_ERROR_INSUFFICIENT_RESOURCE, 0);
ALOGE("Error : Buffer size is insufficient to read sample");
return make_tuple(0, AMEDIA_ERROR_MALFORMED, 0);
}
memcpy(buf, inputBuffer + offset, bytesCount);
@ -54,6 +54,7 @@ void Decoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
size_t bufSize;
uint8_t *buf = AMediaCodec_getInputBuffer(mCodec, bufIdx, &bufSize);
if (!buf) {
mErrorCode = AMEDIA_ERROR_IO;
mSignalledError = true;
mDecoderDoneCondition.notify_one();
return;
@ -64,7 +65,8 @@ void Decoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
int64_t presentationTimeUs = 0;
tie(bytesRead, flag, presentationTimeUs) = readSampleData(
mInputBuffer, mOffset, mFrameMetaData, buf, mNumInputFrame, bufSize);
if (flag == AMEDIACODEC_ERROR_INSUFFICIENT_RESOURCE) {
if (flag == AMEDIA_ERROR_MALFORMED) {
mErrorCode = (media_status_t)flag;
mSignalledError = true;
mDecoderDoneCondition.notify_one();
return;
@ -74,9 +76,10 @@ void Decoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
ALOGV("%s bytesRead : %zd presentationTimeUs : %" PRId64 " mSawInputEOS : %s", __FUNCTION__,
bytesRead, presentationTimeUs, mSawInputEOS ? "TRUE" : "FALSE");
int status = AMediaCodec_queueInputBuffer(mCodec, bufIdx, 0 /* offset */, bytesRead,
presentationTimeUs, flag);
media_status_t status = AMediaCodec_queueInputBuffer(mCodec, bufIdx, 0 /* offset */,
bytesRead, presentationTimeUs, flag);
if (AMEDIA_OK != status) {
mErrorCode = status;
mSignalledError = true;
mDecoderDoneCondition.notify_one();
return;
@ -127,6 +130,16 @@ void Decoder::onFormatChanged(AMediaCodec *mediaCodec, AMediaFormat *format) {
}
}
void Decoder::onError(AMediaCodec *mediaCodec, media_status_t err) {
ALOGV("In %s", __func__);
if (mediaCodec == mCodec && mediaCodec) {
ALOGE("Received Error %d", err);
mErrorCode = err;
mSignalledError = true;
mDecoderDoneCondition.notify_one();
}
}
void Decoder::setupDecoder() {
if (!mFormat) mFormat = mExtractor->getFormat();
}
@ -168,7 +181,8 @@ int32_t Decoder::decode(uint8_t *inputBuffer, vector<AMediaCodecBufferInfo> &fra
ssize_t inIdx = AMediaCodec_dequeueInputBuffer(mCodec, kQueueDequeueTimeoutUs);
if (inIdx < 0 && inIdx != AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
ALOGE("AMediaCodec_dequeueInputBuffer returned invalid index %zd\n", inIdx);
return AMEDIA_ERROR_IO;
mErrorCode = (media_status_t)inIdx;
return mErrorCode;
} else if (inIdx >= 0) {
mStats->addInputTime();
onInputAvailable(mCodec, inIdx);
@ -188,13 +202,18 @@ int32_t Decoder::decode(uint8_t *inputBuffer, vector<AMediaCodecBufferInfo> &fra
} else if (!(outIdx == AMEDIACODEC_INFO_TRY_AGAIN_LATER ||
outIdx == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED)) {
ALOGE("AMediaCodec_dequeueOutputBuffer returned invalid index %zd\n", outIdx);
return AMEDIA_ERROR_IO;
mErrorCode = (media_status_t)outIdx;
return mErrorCode;
}
}
} else {
unique_lock<mutex> lock(mMutex);
mDecoderDoneCondition.wait(lock, [this]() { return (mSawOutputEOS || mSignalledError); });
}
if (mSignalledError) {
ALOGE("Received Error while Decoding");
return mErrorCode;
}
if (codecName.empty()) {
char *decName;

@ -38,6 +38,7 @@ class Decoder : public CallBackHandle {
mSawInputEOS(false),
mSawOutputEOS(false),
mSignalledError(false),
mErrorCode(AMEDIA_OK),
mInputBuffer(nullptr),
mOutFp(nullptr) {
mExtractor = new Extractor();
@ -61,6 +62,8 @@ class Decoder : public CallBackHandle {
void onFormatChanged(AMediaCodec *codec, AMediaFormat *format) override;
void onError(AMediaCodec *mediaCodec, media_status_t err) override;
void onOutputAvailable(AMediaCodec *codec, int32_t index,
AMediaCodecBufferInfo *bufferInfo) override;
@ -82,6 +85,7 @@ class Decoder : public CallBackHandle {
bool mSawInputEOS;
bool mSawOutputEOS;
bool mSignalledError;
media_status_t mErrorCode;
int32_t mOffset;
uint8_t *mInputBuffer;

@ -34,6 +34,7 @@ void Encoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
size_t bufSize = 0;
char *buf = (char *)AMediaCodec_getInputBuffer(mCodec, bufIdx, &bufSize);
if (!buf) {
mErrorCode = AMEDIA_ERROR_IO;
mSignalledError = true;
mEncoderDoneCondition.notify_one();
return;
@ -41,6 +42,7 @@ void Encoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
if (mInputBufferSize < mOffset) {
ALOGE("Out of bound access of input buffer\n");
mErrorCode = AMEDIA_ERROR_MALFORMED;
mSignalledError = true;
mEncoderDoneCondition.notify_one();
return;
@ -51,6 +53,7 @@ void Encoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
}
if (bufSize < bytesRead) {
ALOGE("bytes to read %zu bufSize %zu \n", bytesRead, bufSize);
mErrorCode = AMEDIA_ERROR_MALFORMED;
mSignalledError = true;
mEncoderDoneCondition.notify_one();
return;
@ -58,6 +61,7 @@ void Encoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
if (bytesRead < mParams.frameSize && mNumInputFrame < mParams.numFrames - 1) {
ALOGE("Partial frame at frameID %d bytesRead %zu frameSize %d total numFrames %d\n",
mNumInputFrame, bytesRead, mParams.frameSize, mParams.numFrames);
mErrorCode = AMEDIA_ERROR_MALFORMED;
mSignalledError = true;
mEncoderDoneCondition.notify_one();
return;
@ -66,6 +70,7 @@ void Encoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
size_t bytesgcount = mEleStream->gcount();
if (bytesgcount != bytesRead) {
ALOGE("bytes to read %zu actual bytes read %zu \n", bytesRead, bytesgcount);
mErrorCode = AMEDIA_ERROR_MALFORMED;
mSignalledError = true;
mEncoderDoneCondition.notify_one();
return;
@ -89,9 +94,10 @@ void Encoder::onInputAvailable(AMediaCodec *mediaCodec, int32_t bufIdx) {
ALOGV("%s bytesRead : %zd presentationTimeUs : %" PRIu64 " mSawInputEOS : %s", __FUNCTION__,
bytesRead, presentationTimeUs, mSawInputEOS ? "TRUE" : "FALSE");
int status = AMediaCodec_queueInputBuffer(mCodec, bufIdx, 0 /* offset */, bytesRead,
presentationTimeUs, flag);
media_status_t status = AMediaCodec_queueInputBuffer(mCodec, bufIdx, 0 /* offset */,
bytesRead, presentationTimeUs, flag);
if (AMEDIA_OK != status) {
mErrorCode = status;
mSignalledError = true;
mEncoderDoneCondition.notify_one();
return;
@ -133,6 +139,16 @@ void Encoder::onFormatChanged(AMediaCodec *mediaCodec, AMediaFormat *format) {
}
}
void Encoder::onError(AMediaCodec *mediaCodec, media_status_t err) {
ALOGV("In %s", __func__);
if (mediaCodec == mCodec && mediaCodec) {
ALOGE("Received Error %d", err);
mErrorCode = err;
mSignalledError = true;
mEncoderDoneCondition.notify_one();
}
}
void Encoder::setupEncoder() {
if (!mFormat) mFormat = AMediaFormat_new();
}
@ -235,7 +251,8 @@ int32_t Encoder::encode(string &codecName, ifstream &eleStream, size_t eleSize,
ssize_t inIdx = AMediaCodec_dequeueInputBuffer(mCodec, kQueueDequeueTimeoutUs);
if (inIdx < 0 && inIdx != AMEDIACODEC_INFO_TRY_AGAIN_LATER) {
ALOGE("AMediaCodec_dequeueInputBuffer returned invalid index %zd\n", inIdx);
return AMEDIA_ERROR_IO;
mErrorCode = (media_status_t)inIdx;
return mErrorCode;
} else if (inIdx >= 0) {
mStats->addInputTime();
onInputAvailable(mCodec, inIdx);
@ -255,13 +272,18 @@ int32_t Encoder::encode(string &codecName, ifstream &eleStream, size_t eleSize,
} else if (!(outIdx == AMEDIACODEC_INFO_TRY_AGAIN_LATER ||
outIdx == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED)) {
ALOGE("AMediaCodec_dequeueOutputBuffer returned invalid index %zd\n", outIdx);
return AMEDIA_ERROR_IO;
mErrorCode = (media_status_t)outIdx;
return mErrorCode;
}
}
} else {
unique_lock<mutex> lock(mMutex);
mEncoderDoneCondition.wait(lock, [this]() { return (mSawOutputEOS || mSignalledError); });
}
if (mSignalledError) {
ALOGE("Received Error while Encoding");
return mErrorCode;
}
if (codecName.empty()) {
char *encName;

@ -49,7 +49,8 @@ class Encoder : public CallBackHandle {
mNumOutputFrame(0),
mSawInputEOS(false),
mSawOutputEOS(false),
mSignalledError(false) {}
mSignalledError(false),
mErrorCode(AMEDIA_OK) {}
virtual ~Encoder() {}
@ -65,6 +66,8 @@ class Encoder : public CallBackHandle {
void onFormatChanged(AMediaCodec *codec, AMediaFormat *format) override;
void onError(AMediaCodec *mediaCodec, media_status_t err) override;
void onOutputAvailable(AMediaCodec *codec, int32_t index,
AMediaCodecBufferInfo *bufferInfo) override;
@ -83,6 +86,7 @@ class Encoder : public CallBackHandle {
bool mSawInputEOS;
bool mSawOutputEOS;
bool mSignalledError;
media_status_t mErrorCode;
char *mMime;
int32_t mOffset;

@ -93,7 +93,7 @@ TEST_P(DecoderTest, Decode) {
decoder->setupDecoder();
status = decoder->decode(inputBuffer, frameInfo, codecName, asyncMode);
if (status != AMEDIA_OK) {
cout << "[ WARN ] Test Skipped. Decode returned error \n";
cout << "[ WARN ] Test Failed. Decode returned error " << status << endl;
free(inputBuffer);
return;
}

@ -143,7 +143,11 @@ TEST_P(EncoderTest, Encode) {
string codecName = get<1>(params);
bool asyncMode = get<2>(params);
status = encoder->encode(codecName, eleStream, eleSize, asyncMode, encParams, (char *)mime);
ASSERT_EQ(status, 0);
if (status != AMEDIA_OK) {
cout << "[ WARN ] Test Failed. Encode returned error " << status << endl;
free(inputBuffer);
return;
}
encoder->deInitCodec();
cout << "codec : " << codecName << endl;
string inputReference = get<0>(params);

Loading…
Cancel
Save