Merge "Increase the memory limit of media.extractor to 20%." into nyc-dev
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index adc267a..8725dfe 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -396,11 +396,22 @@
}
Mutex::Autolock _l(mLock);
if (mPlayer == 0) return INVALID_OPERATION;
+
+ if (rate.mSpeed != 0.f && !(mCurrentState & MEDIA_PLAYER_STARTED)
+ && (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED
+ | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
+ mPlayer->setLooping(mLoop);
+ mPlayer->setVolume(mLeftVolume, mRightVolume);
+ mPlayer->setAuxEffectSendLevel(mSendLevel);
+ }
+
status_t err = mPlayer->setPlaybackSettings(rate);
if (err == OK) {
if (rate.mSpeed == 0.f && mCurrentState == MEDIA_PLAYER_STARTED) {
mCurrentState = MEDIA_PLAYER_PAUSED;
- } else if (rate.mSpeed != 0.f && mCurrentState == MEDIA_PLAYER_PAUSED) {
+ } else if (rate.mSpeed != 0.f
+ && (mCurrentState & (MEDIA_PLAYER_PREPARED | MEDIA_PLAYER_PAUSED
+ | MEDIA_PLAYER_PLAYBACK_COMPLETE))) {
mCurrentState = MEDIA_PLAYER_STARTED;
}
}
diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
index 5723e0e..ff76bc8 100644
--- a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
+++ b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp
@@ -648,12 +648,15 @@
signalError = true;
} else {
adtsHeaderSize = (protectionAbsent ? 7 : 9);
+ if (aac_frame_length < adtsHeaderSize) {
+ signalError = true;
+ } else {
+ inBuffer[0] = (UCHAR *)adtsHeader + adtsHeaderSize;
+ inBufferLength[0] = aac_frame_length - adtsHeaderSize;
- inBuffer[0] = (UCHAR *)adtsHeader + adtsHeaderSize;
- inBufferLength[0] = aac_frame_length - adtsHeaderSize;
-
- inHeader->nOffset += adtsHeaderSize;
- inHeader->nFilledLen -= adtsHeaderSize;
+ inHeader->nOffset += adtsHeaderSize;
+ inHeader->nFilledLen -= adtsHeaderSize;
+ }
}
}
diff --git a/media/libstagefright/codecs/hevcdec/SoftHEVC.cpp b/media/libstagefright/codecs/hevcdec/SoftHEVC.cpp
index ad67372..0215a11 100644
--- a/media/libstagefright/codecs/hevcdec/SoftHEVC.cpp
+++ b/media/libstagefright/codecs/hevcdec/SoftHEVC.cpp
@@ -444,6 +444,9 @@
if (NULL == mCodecCtx) {
if (OK != initDecoder()) {
+ ALOGE("Failed to initialize decoder");
+ notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
+ mSignalledError = true;
return;
}
}
@@ -530,6 +533,25 @@
IV_API_CALL_STATUS_T status;
status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op);
+ bool unsupportedResolution =
+ (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_dec_op.u4_error_code & 0xFF));
+
+ /* Check for unsupported dimensions */
+ if (unsupportedResolution) {
+ ALOGE("Unsupported resolution : %dx%d", mWidth, mHeight);
+ notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
+ mSignalledError = true;
+ return;
+ }
+
+ bool allocationFailed = (IVD_MEM_ALLOC_FAILED == (s_dec_op.u4_error_code & 0xFF));
+ if (allocationFailed) {
+ ALOGE("Allocation failure in decoder");
+ notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
+ mSignalledError = true;
+ return;
+ }
+
bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF));
GETTIME(&mTimeEnd, NULL);
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 91f21c1..cd60ab5 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -794,19 +794,12 @@
if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) {
res = configureStreamsLocked();
- // Stream configuration failed due to unsupported configuration.
- // Device back to unconfigured state. Client might try other configuraitons
- if (res == BAD_VALUE && mStatus == STATUS_UNCONFIGURED) {
- CLOGE("No streams configured");
- return NULL;
- }
- // Stream configuration failed for other reason. Fatal.
+ // Stream configuration failed. Client might try other configuraitons.
if (res != OK) {
- SET_ERR_L("Can't set up streams: %s (%d)", strerror(-res), res);
+ CLOGE("Can't set up streams: %s (%d)", strerror(-res), res);
return NULL;
- }
- // Stream configuration successfully configure to empty stream configuration.
- if (mStatus == STATUS_UNCONFIGURED) {
+ } else if (mStatus == STATUS_UNCONFIGURED) {
+ // Stream configuration successfully configure to empty stream configuration.
CLOGE("No streams configured");
return NULL;
}
@@ -1823,6 +1816,33 @@
return false;
}
+void Camera3Device::cancelStreamsConfigurationLocked() {
+ int res = OK;
+ if (mInputStream != NULL && mInputStream->isConfiguring()) {
+ res = mInputStream->cancelConfiguration();
+ if (res != OK) {
+ CLOGE("Can't cancel configuring input stream %d: %s (%d)",
+ mInputStream->getId(), strerror(-res), res);
+ }
+ }
+
+ for (size_t i = 0; i < mOutputStreams.size(); i++) {
+ sp<Camera3OutputStreamInterface> outputStream = mOutputStreams.editValueAt(i);
+ if (outputStream->isConfiguring()) {
+ res = outputStream->cancelConfiguration();
+ if (res != OK) {
+ CLOGE("Can't cancel configuring output stream %d: %s (%d)",
+ outputStream->getId(), strerror(-res), res);
+ }
+ }
+ }
+
+ // Return state to that at start of call, so that future configures
+ // properly clean things up
+ internalUpdateStatusLocked(STATUS_UNCONFIGURED);
+ mNeedConfig = true;
+}
+
status_t Camera3Device::configureStreamsLocked() {
ATRACE_CALL();
status_t res;
@@ -1862,7 +1882,8 @@
camera3_stream_t *inputStream;
inputStream = mInputStream->startConfiguration();
if (inputStream == NULL) {
- SET_ERR_L("Can't start input stream configuration");
+ CLOGE("Can't start input stream configuration");
+ cancelStreamsConfigurationLocked();
return INVALID_OPERATION;
}
streams.add(inputStream);
@@ -1881,7 +1902,8 @@
camera3_stream_t *outputStream;
outputStream = mOutputStreams.editValueAt(i)->startConfiguration();
if (outputStream == NULL) {
- SET_ERR_L("Can't start output stream configuration");
+ CLOGE("Can't start output stream configuration");
+ cancelStreamsConfigurationLocked();
return INVALID_OPERATION;
}
streams.add(outputStream);
@@ -1898,35 +1920,8 @@
if (res == BAD_VALUE) {
// HAL rejected this set of streams as unsupported, clean up config
// attempt and return to unconfigured state
- if (mInputStream != NULL && mInputStream->isConfiguring()) {
- res = mInputStream->cancelConfiguration();
- if (res != OK) {
- SET_ERR_L("Can't cancel configuring input stream %d: %s (%d)",
- mInputStream->getId(), strerror(-res), res);
- return res;
- }
- }
-
- for (size_t i = 0; i < mOutputStreams.size(); i++) {
- sp<Camera3OutputStreamInterface> outputStream =
- mOutputStreams.editValueAt(i);
- if (outputStream->isConfiguring()) {
- res = outputStream->cancelConfiguration();
- if (res != OK) {
- SET_ERR_L(
- "Can't cancel configuring output stream %d: %s (%d)",
- outputStream->getId(), strerror(-res), res);
- return res;
- }
- }
- }
-
- // Return state to that at start of call, so that future configures
- // properly clean things up
- internalUpdateStatusLocked(STATUS_UNCONFIGURED);
- mNeedConfig = true;
-
- ALOGV("%s: Camera %d: Stream configuration failed", __FUNCTION__, mId);
+ CLOGE("Set of requested inputs/outputs not supported by HAL");
+ cancelStreamsConfigurationLocked();
return BAD_VALUE;
} else if (res != OK) {
// Some other kind of error from configure_streams - this is not
@@ -1943,9 +1938,10 @@
if (mInputStream != NULL && mInputStream->isConfiguring()) {
res = mInputStream->finishConfiguration(mHal3Device);
if (res != OK) {
- SET_ERR_L("Can't finish configuring input stream %d: %s (%d)",
+ CLOGE("Can't finish configuring input stream %d: %s (%d)",
mInputStream->getId(), strerror(-res), res);
- return res;
+ cancelStreamsConfigurationLocked();
+ return BAD_VALUE;
}
}
@@ -1955,9 +1951,10 @@
if (outputStream->isConfiguring()) {
res = outputStream->finishConfiguration(mHal3Device);
if (res != OK) {
- SET_ERR_L("Can't finish configuring output stream %d: %s (%d)",
+ CLOGE("Can't finish configuring output stream %d: %s (%d)",
outputStream->getId(), strerror(-res), res);
- return res;
+ cancelStreamsConfigurationLocked();
+ return BAD_VALUE;
}
}
}
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index 2bf2b12..2aca57d 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -367,6 +367,11 @@
status_t configureStreamsLocked();
/**
+ * Cancel stream configuration that did not finish successfully.
+ */
+ void cancelStreamsConfigurationLocked();
+
+ /**
* Add a dummy stream to the current stream set as a workaround for
* not allowing 0 streams in the camera HAL spec.
*/