Merge "Fix integer overflows" into nyc-dev
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h
index d14bb7b..f4d0acd 100644
--- a/include/media/stagefright/ACodec.h
+++ b/include/media/stagefright/ACodec.h
@@ -250,6 +250,8 @@
bool mUsingNativeWindow;
sp<ANativeWindow> mNativeWindow;
int mNativeWindowUsageBits;
+ android_native_rect_t mLastNativeWindowCrop;
+ int32_t mLastNativeWindowDataSpace;
sp<AMessage> mConfigFormat;
sp<AMessage> mInputFormat;
sp<AMessage> mOutputFormat;
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 99996ed..bb4497b 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -498,6 +498,7 @@
mNode(0),
mUsingNativeWindow(false),
mNativeWindowUsageBits(0),
+ mLastNativeWindowDataSpace(HAL_DATASPACE_UNKNOWN),
mIsVideo(false),
mIsEncoder(false),
mFatalError(false),
@@ -540,6 +541,8 @@
mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false;
mInputEOSResult = OK;
+ memset(&mLastNativeWindowCrop, 0, sizeof(mLastNativeWindowCrop));
+
changeState(mUninitializedState);
}
@@ -973,6 +976,9 @@
usage |= kVideoGrallocUsage;
*finalUsage = usage;
+ memset(&mLastNativeWindowCrop, 0, sizeof(mLastNativeWindowCrop));
+ mLastNativeWindowDataSpace = HAL_DATASPACE_UNKNOWN;
+
ALOGV("gralloc usage: %#x(OMX) => %#x(ACodec)", omxUsage, usage);
return setNativeWindowSizeFormatAndUsage(
nativeWindow,
@@ -5999,6 +6005,10 @@
}
mCodec->addKeyFormatChangesToRenderBufferNotification(reply);
mCodec->sendFormatChange();
+ } else if (rangeLength > 0 && mCodec->mNativeWindow != NULL) {
+ // If potentially rendering onto a surface, always save key format data (crop &
+ // data space) so that we can set it if and once the buffer is rendered.
+ mCodec->addKeyFormatChangesToRenderBufferNotification(reply);
}
if (mCodec->usingMetadataOnEncoderOutput()) {
@@ -6099,15 +6109,19 @@
}
android_native_rect_t crop;
- if (msg->findRect("crop", &crop.left, &crop.top, &crop.right, &crop.bottom)) {
+ if (msg->findRect("crop", &crop.left, &crop.top, &crop.right, &crop.bottom)
+ && memcmp(&crop, &mCodec->mLastNativeWindowCrop, sizeof(crop)) != 0) {
+ mCodec->mLastNativeWindowCrop = crop;
status_t err = native_window_set_crop(mCodec->mNativeWindow.get(), &crop);
ALOGW_IF(err != NO_ERROR, "failed to set crop: %d", err);
}
int32_t dataSpace;
- if (msg->findInt32("dataspace", &dataSpace)) {
+ if (msg->findInt32("dataspace", &dataSpace)
+ && dataSpace != mCodec->mLastNativeWindowDataSpace) {
status_t err = native_window_set_buffers_data_space(
mCodec->mNativeWindow.get(), (android_dataspace)dataSpace);
+ mCodec->mLastNativeWindowDataSpace = dataSpace;
ALOGW_IF(err != NO_ERROR, "failed to set dataspace: %d", err);
}