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:
committed by
Android (Google) Code Review
commit
f6d08b9528
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user