Merge changes Ie06e73e5,I7ac6b5b0

* changes:
  free all buffers when ANativeWindow::disconnect is called
  return correct value from query after connecting a surface
This commit is contained in:
Mathias Agopian
2011-08-09 15:23:19 -07:00
committed by Android (Google) Code Review
9 changed files with 48 additions and 11 deletions

View File

@@ -111,7 +111,12 @@ protected:
//
// This method will fail if the connect was previously called on the
// SurfaceTexture and no corresponding disconnect call was made.
virtual status_t connect(int api) = 0;
//
// outWidth, outHeight and outTransform are filled with the default width
// and height of the window and current transform applied to buffers,
// respectively.
virtual status_t connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) = 0;
// disconnect attempts to disconnect a client API from the SurfaceTexture.
// Calling this method will cause any subsequent calls to other

View File

@@ -106,7 +106,8 @@ public:
//
// This method will fail if the connect was previously called on the
// SurfaceTexture and no corresponding disconnect call was made.
virtual status_t connect(int api);
virtual status_t connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform);
// disconnect attempts to disconnect a client API from the SurfaceTexture.
// Calling this method will cause any subsequent calls to other

View File

@@ -133,7 +133,8 @@ public:
//
// This method will fail if the connect was previously called on the
// SurfaceMediaSource and no corresponding disconnect call was made.
virtual status_t connect(int api);
virtual status_t connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform);
// disconnect attempts to disconnect a client API from the SurfaceMediaSource.
// Calling this method will cause any subsequent calls to other

View File

@@ -162,11 +162,15 @@ public:
return result;
}
virtual status_t connect(int api) {
virtual status_t connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
Parcel data, reply;
data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
data.writeInt32(api);
remote()->transact(CONNECT, data, &reply);
*outWidth = reply.readInt32();
*outHeight = reply.readInt32();
*outTransform = reply.readInt32();
status_t result = reply.readInt32();
return result;
}
@@ -283,7 +287,12 @@ status_t BnSurfaceTexture::onTransact(
case CONNECT: {
CHECK_INTERFACE(ISurfaceTexture, data, reply);
int api = data.readInt32();
status_t res = connect(api);
uint32_t outWidth, outHeight, outTransform;
status_t res = connect(api,
&outWidth, &outHeight, &outTransform);
reply->writeInt32(outWidth);
reply->writeInt32(outHeight);
reply->writeInt32(outTransform);
reply->writeInt32(res);
return NO_ERROR;
} break;

View File

@@ -548,7 +548,8 @@ status_t SurfaceTexture::setTransform(uint32_t transform) {
return OK;
}
status_t SurfaceTexture::connect(int api) {
status_t SurfaceTexture::connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
LOGV("SurfaceTexture::connect(this=%p, %d)", this, api);
Mutex::Autolock lock(mMutex);
@@ -569,6 +570,9 @@ status_t SurfaceTexture::connect(int api) {
err = -EINVAL;
} else {
mConnectedApi = api;
*outWidth = mDefaultWidth;
*outHeight = mDefaultHeight;
*outTransform = 0;
}
break;
default:
@@ -595,6 +599,7 @@ status_t SurfaceTexture::disconnect(int api) {
case NATIVE_WINDOW_API_CAMERA:
if (mConnectedApi == api) {
mConnectedApi = NO_CONNECTED_API;
freeAllBuffers();
} else {
LOGE("disconnect: connected to another api (cur=%d, req=%d)",
mConnectedApi, api);

View File

@@ -385,7 +385,8 @@ int SurfaceTextureClient::dispatchUnlockAndPost(va_list args) {
int SurfaceTextureClient::connect(int api) {
LOGV("SurfaceTextureClient::connect");
Mutex::Autolock lock(mMutex);
int err = mSurfaceTexture->connect(api);
int err = mSurfaceTexture->connect(api,
&mDefaultWidth, &mDefaultHeight, &mTransformHint);
if (!err && api == NATIVE_WINDOW_API_CPU) {
mConnectedToCpu = true;
}

View File

@@ -371,7 +371,8 @@ status_t SurfaceMediaSource::setSynchronousMode(bool enabled) {
return err;
}
status_t SurfaceMediaSource::connect(int api) {
status_t SurfaceMediaSource::connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
LOGV("SurfaceMediaSource::connect");
Mutex::Autolock lock(mMutex);
status_t err = NO_ERROR;
@@ -384,6 +385,9 @@ status_t SurfaceMediaSource::connect(int api) {
err = -EINVAL;
} else {
mConnectedApi = api;
*outWidth = mDefaultWidth;
*outHeight = mDefaultHeight;
*outTransform = 0;
}
break;
default:

View File

@@ -86,9 +86,19 @@ status_t SurfaceTextureLayer::dequeueBuffer(int *buf,
return res;
}
status_t SurfaceTextureLayer::connect(int api) {
status_t err = SurfaceTexture::connect(api);
status_t SurfaceTextureLayer::connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
status_t err = SurfaceTexture::connect(api,
outWidth, outHeight, outTransform);
if (err == NO_ERROR) {
sp<Layer> layer(mLayer.promote());
if (layer != NULL) {
uint32_t orientation = layer->getOrientation();
if (orientation & Transform::ROT_INVALID) {
orientation = 0;
}
*outTransform = orientation;
}
switch(api) {
case NATIVE_WINDOW_API_MEDIA:
case NATIVE_WINDOW_API_CAMERA:

View File

@@ -51,7 +51,8 @@ protected:
virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h,
uint32_t format, uint32_t usage);
virtual status_t connect(int api);
virtual status_t connect(int api,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform);
};
// ---------------------------------------------------------------------------