Merge "MTP: Improve argument checking in SendObjectInfo"
diff --git a/include/camera/CameraHardwareInterface.h b/include/camera/CameraHardwareInterface.h
index 16f572c..3c6c94f 100644
--- a/include/camera/CameraHardwareInterface.h
+++ b/include/camera/CameraHardwareInterface.h
@@ -28,8 +28,6 @@
namespace android {
-class Overlay;
-
/**
* The size of image for display.
*/
@@ -130,12 +128,6 @@
virtual status_t startPreview() = 0;
/**
- * Only used if overlays are used for camera preview.
- */
- virtual bool useOverlay() {return false;}
- virtual status_t setOverlay(const sp<Overlay> &overlay) {return BAD_VALUE;}
-
- /**
* Stop a previously started preview.
*/
virtual void stopPreview() = 0;
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 0aba347..d37c22d 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -121,10 +121,16 @@
kOutputBuffersAreUnreadable = 8192,
};
+ enum BufferStatus {
+ OWNED_BY_US,
+ OWNED_BY_COMPONENT,
+ OWNED_BY_NATIVE_WINDOW,
+ OWNED_BY_CLIENT,
+ };
+
struct BufferInfo {
IOMX::buffer_id mBuffer;
- bool mOwnedByComponent;
- bool mOwnedByNativeWindow;
+ BufferStatus mStatus;
sp<IMemory> mMem;
size_t mSize;
void *mData;
@@ -248,9 +254,9 @@
status_t freeBuffer(OMX_U32 portIndex, size_t bufIndex);
- void drainInputBuffer(IOMX::buffer_id buffer);
+ bool drainInputBuffer(IOMX::buffer_id buffer);
void fillOutputBuffer(IOMX::buffer_id buffer);
- void drainInputBuffer(BufferInfo *info);
+ bool drainInputBuffer(BufferInfo *info);
void fillOutputBuffer(BufferInfo *info);
void drainInputBuffers();
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 3108e4e..4bf922f 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -1650,8 +1650,7 @@
}
info.mBuffer = buffer;
- info.mOwnedByComponent = false;
- info.mOwnedByNativeWindow = false;
+ info.mStatus = OWNED_BY_US;
info.mMem = mem;
info.mMediaBuffer = NULL;
@@ -1759,8 +1758,7 @@
info.mData = NULL;
info.mSize = def.nBufferSize;
info.mBuffer = bufferId;
- info.mOwnedByComponent = false;
- info.mOwnedByNativeWindow = false;
+ info.mStatus = OWNED_BY_US;
info.mMem = NULL;
info.mMediaBuffer = new MediaBuffer(graphicBuffer);
info.mMediaBuffer->setObserver(this);
@@ -1794,7 +1792,7 @@
}
status_t OMXCodec::cancelBufferToNativeWindow(BufferInfo *info) {
- CHECK(!info->mOwnedByNativeWindow);
+ CHECK_EQ((int)info->mStatus, (int)OWNED_BY_US);
CODEC_LOGV("Calling cancelBuffer on buffer %p", info->mBuffer);
int err = mNativeWindow->cancelBuffer(
mNativeWindow.get(), info->mMediaBuffer->graphicBuffer().get());
@@ -1804,7 +1802,7 @@
setState(ERROR);
return err;
}
- info->mOwnedByNativeWindow = true;
+ info->mStatus = OWNED_BY_NATIVE_WINDOW;
return OK;
}
@@ -1839,8 +1837,8 @@
}
// The native window no longer owns the buffer.
- CHECK(bufInfo->mOwnedByNativeWindow);
- bufInfo->mOwnedByNativeWindow = false;
+ CHECK_EQ((int)bufInfo->mStatus, (int)OWNED_BY_NATIVE_WINDOW);
+ bufInfo->mStatus = OWNED_BY_US;
return bufInfo;
}
@@ -1871,13 +1869,13 @@
}
CHECK(i < buffers->size());
- if (!(*buffers)[i].mOwnedByComponent) {
+ if ((*buffers)[i].mStatus != OWNED_BY_COMPONENT) {
LOGW("We already own input buffer %p, yet received "
"an EMPTY_BUFFER_DONE.", buffer);
}
BufferInfo* info = &buffers->editItemAt(i);
- info->mOwnedByComponent = false;
+ info->mStatus = OWNED_BY_US;
// Buffer could not be released until empty buffer done is called.
if (info->mMediaBuffer != NULL) {
@@ -1926,12 +1924,12 @@
CHECK(i < buffers->size());
BufferInfo *info = &buffers->editItemAt(i);
- if (!info->mOwnedByComponent) {
+ if (info->mStatus != OWNED_BY_COMPONENT) {
LOGW("We already own output buffer %p, yet received "
"a FILL_BUFFER_DONE.", buffer);
}
- info->mOwnedByComponent = false;
+ info->mStatus = OWNED_BY_US;
if (mPortStatus[kPortIndexOutput] == DISABLING) {
CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);
@@ -2400,7 +2398,7 @@
size_t OMXCodec::countBuffersWeOwn(const Vector<BufferInfo> &buffers) {
size_t n = 0;
for (size_t i = 0; i < buffers.size(); ++i) {
- if (!buffers[i].mOwnedByComponent) {
+ if (buffers[i].mStatus != OWNED_BY_COMPONENT) {
++n;
}
}
@@ -2417,11 +2415,12 @@
for (size_t i = buffers->size(); i-- > 0;) {
BufferInfo *info = &buffers->editItemAt(i);
- if (onlyThoseWeOwn && info->mOwnedByComponent) {
+ if (onlyThoseWeOwn && info->mStatus == OWNED_BY_COMPONENT) {
continue;
}
- CHECK_EQ((int)info->mOwnedByComponent, (int)false);
+ CHECK(info->mStatus == OWNED_BY_US
+ || info->mStatus == OWNED_BY_NATIVE_WINDOW);
CODEC_LOGV("freeing buffer %p on port %ld", info->mBuffer, portIndex);
@@ -2454,7 +2453,7 @@
// Cancel the buffer if it belongs to an ANativeWindow.
sp<GraphicBuffer> graphicBuffer = info->mMediaBuffer->graphicBuffer();
- if (!info->mOwnedByNativeWindow && graphicBuffer != 0) {
+ if (info->mStatus == OWNED_BY_US && graphicBuffer != 0) {
err = cancelBufferToNativeWindow(info);
}
@@ -2559,7 +2558,7 @@
Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexOutput];
for (size_t i = 0; i < buffers->size(); ++i) {
BufferInfo *info = &buffers->editItemAt(i);
- if (!info->mOwnedByNativeWindow) {
+ if (info->mStatus == OWNED_BY_US) {
fillOutputBuffer(&buffers->editItemAt(i));
}
}
@@ -2570,15 +2569,17 @@
Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput];
for (size_t i = 0; i < buffers->size(); ++i) {
- drainInputBuffer(&buffers->editItemAt(i));
+ if (!drainInputBuffer(&buffers->editItemAt(i))) {
+ break;
+ }
}
}
-void OMXCodec::drainInputBuffer(BufferInfo *info) {
- CHECK_EQ((int)info->mOwnedByComponent, (int)false);
+bool OMXCodec::drainInputBuffer(BufferInfo *info) {
+ CHECK_EQ((int)info->mStatus, (int)OWNED_BY_US);
if (mSignalledEOS) {
- return;
+ return false;
}
if (mCodecSpecificDataIndex < mCodecSpecificData.size()) {
@@ -2614,14 +2615,14 @@
0);
CHECK_EQ(err, (status_t)OK);
- info->mOwnedByComponent = true;
+ info->mStatus = OWNED_BY_COMPONENT;
++mCodecSpecificDataIndex;
- return;
+ return true;
}
if (mPaused) {
- return;
+ return false;
}
status_t err;
@@ -2631,6 +2632,7 @@
size_t offset = 0;
int32_t n = 0;
+
for (;;) {
MediaBuffer *srcBuffer;
MediaSource::ReadOptions options;
@@ -2689,7 +2691,7 @@
srcBuffer = NULL;
setState(ERROR);
- return;
+ return false;
}
mLeftOverBuffer = srcBuffer;
@@ -2699,9 +2701,15 @@
bool releaseBuffer = true;
if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) {
CHECK(mOMXLivesLocally && offset == 0);
- OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer;
+
+ OMX_BUFFERHEADERTYPE *header =
+ (OMX_BUFFERHEADERTYPE *)info->mBuffer;
+
CHECK(header->pBuffer == info->mData);
- header->pBuffer = (OMX_U8 *) srcBuffer->data() + srcBuffer->range_offset();
+
+ header->pBuffer =
+ (OMX_U8 *)srcBuffer->data() + srcBuffer->range_offset();
+
releaseBuffer = false;
info->mMediaBuffer = srcBuffer;
} else {
@@ -2710,7 +2718,8 @@
info->mMediaBuffer = srcBuffer;
}
memcpy((uint8_t *)info->mData + offset,
- (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
+ (const uint8_t *)srcBuffer->data()
+ + srcBuffer->range_offset(),
srcBuffer->range_length());
}
@@ -2766,10 +2775,10 @@
if (err != OK) {
setState(ERROR);
- return;
+ return false;
}
- info->mOwnedByComponent = true;
+ info->mStatus = OWNED_BY_COMPONENT;
// This component does not ever signal the EOS flag on output buffers,
// Thanks for nothing.
@@ -2777,10 +2786,12 @@
mNoMoreOutputData = true;
mBufferFilled.signal();
}
+
+ return true;
}
void OMXCodec::fillOutputBuffer(BufferInfo *info) {
- CHECK_EQ((int)info->mOwnedByComponent, (int)false);
+ CHECK_EQ((int)info->mStatus, (int)OWNED_BY_US);
if (mNoMoreOutputData) {
CODEC_LOGV("There is no more output data available, not "
@@ -2793,7 +2804,6 @@
if (graphicBuffer != 0) {
// When using a native buffer we need to lock the buffer before
// giving it to OMX.
- CHECK(!info->mOwnedByNativeWindow);
CODEC_LOGV("Calling lockBuffer on %p", info->mBuffer);
int err = mNativeWindow->lockBuffer(mNativeWindow.get(),
graphicBuffer.get());
@@ -2816,19 +2826,20 @@
return;
}
- info->mOwnedByComponent = true;
+ info->mStatus = OWNED_BY_COMPONENT;
}
-void OMXCodec::drainInputBuffer(IOMX::buffer_id buffer) {
+bool OMXCodec::drainInputBuffer(IOMX::buffer_id buffer) {
Vector<BufferInfo> *buffers = &mPortBuffers[kPortIndexInput];
for (size_t i = 0; i < buffers->size(); ++i) {
if ((*buffers)[i].mBuffer == buffer) {
- drainInputBuffer(&buffers->editItemAt(i));
- return;
+ return drainInputBuffer(&buffers->editItemAt(i));
}
}
CHECK(!"should not be here.");
+
+ return false;
}
void OMXCodec::fillOutputBuffer(IOMX::buffer_id buffer) {
@@ -3374,6 +3385,9 @@
mFilledBuffers.erase(mFilledBuffers.begin());
BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);
+ CHECK_EQ((int)info->mStatus, (int)OWNED_BY_US);
+ info->mStatus = OWNED_BY_CLIENT;
+
info->mMediaBuffer->add_ref();
*buffer = info->mMediaBuffer;
@@ -3389,6 +3403,10 @@
if (info->mMediaBuffer == buffer) {
CHECK_EQ((int)mPortStatus[kPortIndexOutput], (int)ENABLED);
+ CHECK_EQ((int)info->mStatus, (int)OWNED_BY_CLIENT);
+
+ info->mStatus = OWNED_BY_US;
+
if (buffer->graphicBuffer() == 0) {
fillOutputBuffer(info);
} else {
@@ -3402,10 +3420,10 @@
if (err < 0) {
return;
}
- } else {
- info->mOwnedByNativeWindow = true;
}
+ info->mStatus = OWNED_BY_NATIVE_WINDOW;
+
// Dequeue the next buffer from the native window.
BufferInfo *nextBufInfo = dequeueBufferFromNativeWindow();
if (nextBufInfo == 0) {
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index c28de93..ee3eefc 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -144,7 +144,10 @@
static_cast<MediaSource::ReadOptions::SeekMode>(seekMode);
int64_t thumbNailTime;
- if (frameTimeUs < 0 && trackMeta->findInt64(kKeyThumbnailTime, &thumbNailTime)) {
+ if (frameTimeUs < 0) {
+ if (!trackMeta->findInt64(kKeyThumbnailTime, &thumbNailTime)) {
+ thumbNailTime = 0;
+ }
options.setSeekTo(thumbNailTime, mode);
} else {
thumbNailTime = -1;
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index f1fa0ff..98b934c 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -31,7 +31,6 @@
#include <media/AudioSystem.h>
#include <media/mediaplayer.h>
#include <surfaceflinger/ISurface.h>
-#include <ui/Overlay.h>
#include <utils/Errors.h>
#include <utils/Log.h>
#include <utils/String16.h>
@@ -306,7 +305,6 @@
mCameraId = cameraId;
mCameraFacing = cameraFacing;
mClientPid = clientPid;
- mUseOverlay = mHardware->useOverlay();
mMsgEnabled = 0;
mHardware->setCallbacks(notifyCallback,
dataCallback,
@@ -317,26 +315,16 @@
enableMsgType(CAMERA_MSG_ERROR |
CAMERA_MSG_ZOOM |
CAMERA_MSG_FOCUS);
- mOverlayW = 0;
- mOverlayH = 0;
// Callback is disabled by default
mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP;
mOrientation = getOrientation(0, mCameraFacing == CAMERA_FACING_FRONT);
- mOrientationChanged = false;
mPlayShutterSound = true;
cameraService->setCameraBusy(cameraId);
cameraService->loadSound();
LOG1("Client::Client X (pid %d)", callingPid);
}
-static void *unregister_surface(void *arg) {
- ISurface *surface = (ISurface *)arg;
- surface->unregisterBuffers();
- IPCThreadState::self()->flushCommands();
- return NULL;
-}
-
// tear down the client
CameraService::Client::~Client() {
int callingPid = getCallingPid();
@@ -455,10 +443,7 @@
mHardware->cancelPicture();
// Release the hardware resources.
mHardware->release();
- // Release the held overlay resources.
- if (mUseOverlay) {
- mOverlayRef = 0;
- }
+
// Release the held ANativeWindow resources.
if (mPreviewWindow != 0) {
mPreviewWindow = 0;
@@ -491,12 +476,6 @@
if (mSurface != 0) {
LOG1("clearing old preview surface %p", mSurface.get());
- if (mUseOverlay) {
- // Force the destruction of any previous overlay
- sp<Overlay> dummy;
- mHardware->setOverlay(dummy);
- mOverlayRef = 0;
- }
}
if (surface != 0) {
mSurface = getISurface(surface);
@@ -504,13 +483,10 @@
mSurface = 0;
}
mPreviewWindow = surface;
- mOverlayRef = 0;
- // If preview has been already started, set overlay or register preview
+ // If preview has been already started, register preview
// buffers now.
if (mHardware->previewEnabled()) {
- if (mUseOverlay) {
- result = setOverlay();
- } else if (mPreviewWindow != 0) {
+ if (mPreviewWindow != 0) {
native_window_set_buffers_transform(mPreviewWindow.get(),
mOrientation);
result = mHardware->setPreviewWindow(mPreviewWindow);
@@ -520,55 +496,6 @@
return result;
}
-status_t CameraService::Client::setOverlay() {
- int w, h;
- CameraParameters params(mHardware->getParameters());
- params.getPreviewSize(&w, &h);
-
- if (w != mOverlayW || h != mOverlayH || mOrientationChanged) {
- // Force the destruction of any previous overlay
- sp<Overlay> dummy;
- mHardware->setOverlay(dummy);
- mOverlayRef = 0;
- mOrientationChanged = false;
- }
-
- status_t result = NO_ERROR;
- if (mSurface == 0) {
- result = mHardware->setOverlay(NULL);
- } else {
- if (mOverlayRef == 0) {
- // FIXME:
- // Surfaceflinger may hold onto the previous overlay reference for some
- // time after we try to destroy it. retry a few times. In the future, we
- // should make the destroy call block, or possibly specify that we can
- // wait in the createOverlay call if the previous overlay is in the
- // process of being destroyed.
- for (int retry = 0; retry < 50; ++retry) {
- mOverlayRef = mSurface->createOverlay(w, h, OVERLAY_FORMAT_DEFAULT,
- mOrientation);
- if (mOverlayRef != 0) break;
- LOGW("Overlay create failed - retrying");
- usleep(20000);
- }
- if (mOverlayRef == 0) {
- LOGE("Overlay Creation Failed!");
- return -EINVAL;
- }
- result = mHardware->setOverlay(new Overlay(mOverlayRef));
- }
- }
- if (result != NO_ERROR) {
- LOGE("mHardware->setOverlay() failed with status %d\n", result);
- return result;
- }
-
- mOverlayW = w;
- mOverlayH = h;
-
- return result;
-}
-
// set the preview callback flag to affect how the received frames from
// preview are handled.
void CameraService::Client::setPreviewCallbackFlag(int callback_flag) {
@@ -630,21 +557,13 @@
return NO_ERROR;
}
- if (mUseOverlay) {
- // If preview display has been set, set overlay now.
- if (mSurface != 0) {
- result = setOverlay();
- }
- if (result != NO_ERROR) return result;
- result = mHardware->startPreview();
- } else {
- if (mPreviewWindow != 0) {
- native_window_set_buffers_transform(mPreviewWindow.get(),
- mOrientation);
- }
- mHardware->setPreviewWindow(mPreviewWindow);
- result = mHardware->startPreview();
+ if (mPreviewWindow != 0) {
+ native_window_set_buffers_transform(mPreviewWindow.get(),
+ mOrientation);
}
+ mHardware->setPreviewWindow(mPreviewWindow);
+ result = mHardware->startPreview();
+
return result;
}
@@ -853,7 +772,6 @@
if (mOrientation != orientation) {
mOrientation = orientation;
- if (mOverlayRef != 0) mOrientationChanged = true;
}
return OK;
} else if (cmd == CAMERA_CMD_ENABLE_SHUTTER_SOUND) {
@@ -1047,7 +965,7 @@
// It takes some time before yuvPicture callback to be called.
// Register the buffer for raw image here to reduce latency.
- if (mSurface != 0 && !mUseOverlay) {
+ if (mSurface != 0) {
int w, h;
CameraParameters params(mHardware->getParameters());
if (size == NULL) {
@@ -1059,11 +977,6 @@
h &= ~1;
LOG1("Snapshot image width=%d, height=%d", w, h);
}
- // FIXME: don't use hardcoded format constants here
- ISurface::BufferHeap buffers(w, h, w, h,
- HAL_PIXEL_FORMAT_YCrCb_420_SP, mOrientation, 0,
- mHardware->getRawHeap());
-
IPCThreadState::self()->flushCommands();
}
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index 60e0d04..d78d7e5 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -130,7 +130,6 @@
// these are internal functions used to set up preview buffers
status_t registerPreviewBuffers();
- status_t setOverlay();
// camera operation mode
enum camera_mode {
@@ -175,14 +174,8 @@
int mCameraFacing; // immutable after constructor
pid_t mClientPid;
sp<CameraHardwareInterface> mHardware; // cleared after disconnect()
- bool mUseOverlay; // immutable after constructor
- sp<OverlayRef> mOverlayRef;
- int mOverlayW;
- int mOverlayH;
int mPreviewCallbackFlag;
int mOrientation; // Current display orientation
- // True if display orientation has been changed. This is only used in overlay.
- int mOrientationChanged;
bool mPlayShutterSound;
// Ensures atomicity among the public methods