Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1131)

Unified Diff: ppapi/proxy/ppb_image_data_proxy.cc

Issue 13771020: Add Pepper VideoReader and VideoWriter plumbing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ImageData management, depends on 14170012 Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ppapi/proxy/ppb_image_data_proxy.cc
diff --git a/ppapi/proxy/ppb_image_data_proxy.cc b/ppapi/proxy/ppb_image_data_proxy.cc
index acd1ce4ca9817ceb4bf12efbb73168ae8d48a0e9..d27deaf58ba90d53d9d45a188ed9b69f2b6d271e 100644
--- a/ppapi/proxy/ppb_image_data_proxy.cc
+++ b/ppapi/proxy/ppb_image_data_proxy.cc
@@ -519,6 +519,62 @@ bool PPB_ImageData_Proxy::OnMessageReceived(const IPC::Message& msg) {
}
#if !defined(OS_NACL)
+// static
+PP_Resource PPB_ImageData_Proxy::CreateImageData(
+ PP_Instance instance,
+ PP_ImageDataFormat format,
+ const PP_Size& size,
+ bool init_to_zero,
+ bool is_nacl_plugin,
+ PP_ImageDataDesc* desc,
+ IPC::PlatformFileForTransit* image_handle,
+ uint32_t* byte_count) {
+ HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
+ if (!dispatcher)
+ return 0;
+
+ thunk::EnterResourceCreation enter(instance);
+ if (enter.failed())
+ return 0;
+
+ PP_Resource result = 0;
+ PP_Bool clear = init_to_zero ? PP_TRUE : PP_FALSE;
+ if (is_nacl_plugin) {
+ result = enter.functions()->CreateImageDataNaCl(
+ instance, static_cast<PP_ImageDataFormat>(format), &size, clear);
yzshen1 2013/05/01 23:18:33 the static_cast is not needed. (and line 547)
bbudge 2013/05/02 21:39:06 Done.
+ } else {
+ result = enter.functions()->CreateImageData(
+ instance, static_cast<PP_ImageDataFormat>(format), &size, clear);
+ }
+ if (!result)
+ return 0;
+
+ thunk::EnterResourceNoLock<PPB_ImageData_API> enter_resource(result, false);
+ if (enter_resource.object()->Describe(desc) != PP_TRUE)
yzshen1 2013/05/01 23:18:33 In this case and line 557, shall we release the PP
bbudge 2013/05/02 21:39:06 Done.
+ DVLOG(1) << "CreateImageData failed: could not Describe";
+
+ int local_fd = 0;
+ if (enter_resource.object()->GetSharedMemory(&local_fd, byte_count) != PP_OK)
+ DVLOG(1) << "CreateImageData failed: could not GetSharedMemory";
+
+#if defined(OS_WIN)
+ *image_handle = dispatcher->ShareHandleWithRemote(
+ reinterpret_cast<HANDLE>(static_cast<intptr_t>(local_fd)), false);
+#elif defined(OS_MACOSX) || defined(OS_ANDROID)
+ *image_handle = dispatcher->ShareHandleWithRemote(local_fd, false);
+#elif defined(OS_POSIX)
+ // On X Windows, a non-nacl handle is a SysV shared memory key.
+ if (is_nacl_plugin)
+ *image_handle = dispatcher->ShareHandleWithRemote(local_fd, false);
+ else
+ *image_handle = IPC::PlatformFileForTransit(local_fd, false);
+#else
+ #error Not implemented.
+#endif
+
+ return result;
+}
+
void PPB_ImageData_Proxy::OnHostMsgCreate(PP_Instance instance,
int32_t format,
const PP_Size& size,
@@ -526,36 +582,29 @@ void PPB_ImageData_Proxy::OnHostMsgCreate(PP_Instance instance,
HostResource* result,
std::string* image_data_desc,
ImageHandle* result_image_handle) {
- *result_image_handle = ImageData::NullHandle();
-
- thunk::EnterResourceCreation enter(instance);
- if (enter.failed())
- return;
-
- PP_Resource resource = enter.functions()->CreateImageData(
- instance, static_cast<PP_ImageDataFormat>(format), &size, init_to_zero);
- if (!resource)
- return;
- result->SetHostResource(instance, resource);
-
- // Get the description, it's just serialized as a string.
- thunk::EnterResourceNoLock<PPB_ImageData_API> enter_resource(resource, false);
PP_ImageDataDesc desc;
- if (enter_resource.object()->Describe(&desc) == PP_TRUE) {
+ IPC::PlatformFileForTransit image_handle;
+ uint32_t byte_count;
+ PP_Resource resource = CreateImageData(
+ instance,
yzshen1 2013/05/01 23:18:33 nit: The indent is a little bit unusual.
bbudge 2013/05/02 21:39:06 Done.
+ static_cast<PP_ImageDataFormat>(format),
+ size,
+ true /* init_to_zero */,
+ false /* is_nacl_plugin */,
+ &desc, &image_handle, &byte_count);
+ result->SetHostResource(instance, resource);
+ if (resource) {
image_data_desc->resize(sizeof(PP_ImageDataDesc));
memcpy(&(*image_data_desc)[0], &desc, sizeof(PP_ImageDataDesc));
- }
-
- // Get the shared memory handle.
- uint32_t byte_count = 0;
- int32_t handle = 0;
- if (enter_resource.object()->GetSharedMemory(&handle, &byte_count) == PP_OK) {
-#if defined(OS_WIN)
- ImageHandle ih = ImageData::HandleFromInt(handle);
- *result_image_handle = dispatcher()->ShareHandleWithRemote(ih, false);
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_ANDROID)
+ *result_image_handle = image_handle;
#else
- *result_image_handle = ImageData::HandleFromInt(handle);
-#endif // defined(OS_WIN)
+ // On X Windows ImageHandle is a SysV shared memory key.
+ *result_image_handle = image_handle.fd;
+#endif
+ } else {
+ image_data_desc->clear();
+ *result_image_handle = ImageData::NullHandle();
}
}
@@ -567,47 +616,26 @@ void PPB_ImageData_Proxy::OnHostMsgCreateNaCl(
HostResource* result,
std::string* image_data_desc,
ppapi::proxy::SerializedHandle* result_image_handle) {
- result_image_handle->set_null_shmem();
- HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
- if (!dispatcher)
- return;
-
- thunk::EnterResourceCreation enter(instance);
- if (enter.failed())
- return;
+ PP_ImageDataDesc desc;
+ IPC::PlatformFileForTransit image_handle;
+ uint32_t byte_count;
+ PP_Resource resource = CreateImageData(
+ instance,
+ static_cast<PP_ImageDataFormat>(format),
+ size,
+ true /* init_to_zero */,
+ true /* is_nacl_plugin */,
+ &desc, &image_handle, &byte_count);
- PP_Resource resource = enter.functions()->CreateImageDataNaCl(
- instance, static_cast<PP_ImageDataFormat>(format), &size, init_to_zero);
- if (!resource)
- return;
result->SetHostResource(instance, resource);
-
- // Get the description, it's just serialized as a string.
- thunk::EnterResourceNoLock<PPB_ImageData_API> enter_resource(resource, false);
- if (enter_resource.failed())
- return;
- PP_ImageDataDesc desc;
- if (enter_resource.object()->Describe(&desc) == PP_TRUE) {
+ if (resource) {
image_data_desc->resize(sizeof(PP_ImageDataDesc));
memcpy(&(*image_data_desc)[0], &desc, sizeof(PP_ImageDataDesc));
+ result_image_handle->set_shmem(image_handle, byte_count);
+ } else {
+ image_data_desc->clear();
+ result_image_handle->set_null_shmem();
}
- int local_fd;
- uint32_t byte_count;
- if (enter_resource.object()->GetSharedMemory(&local_fd, &byte_count) != PP_OK)
- return;
- // TODO(dmichael): Change trusted interface to return a PP_FileHandle, those
- // casts are ugly.
- base::PlatformFile platform_file =
-#if defined(OS_WIN)
- reinterpret_cast<HANDLE>(static_cast<intptr_t>(local_fd));
-#elif defined(OS_POSIX)
- local_fd;
-#else
- #error Not implemented.
-#endif // defined(OS_WIN)
- result_image_handle->set_shmem(
- dispatcher->ShareHandleWithRemote(platform_file, false),
- byte_count);
}
#endif // !defined(OS_NACL)

Powered by Google App Engine
This is Rietveld 408576698