Allow conversion of GlTextureBuffer to CVPixelBufferRef
This means that, if an iOS application sends in a GlTextureBuffer but expects a CVPixelBufferRef as output, everything will work even if the graph just forwards the same input. Also, access by Metal calculators will also work transparently. PiperOrigin-RevId: 488812748
This commit is contained in:
parent
fe66de3714
commit
4c874fe4cd
|
@ -226,7 +226,13 @@ cc_library(
|
||||||
# depend on having an indirect image_frame dependency, need to be
|
# depend on having an indirect image_frame dependency, need to be
|
||||||
# fixed first.
|
# fixed first.
|
||||||
"//mediapipe/framework/formats:image_frame",
|
"//mediapipe/framework/formats:image_frame",
|
||||||
|
] + select({
|
||||||
|
"//conditions:default": [],
|
||||||
|
":platform_ios_with_gpu": [
|
||||||
|
":gl_texture_util",
|
||||||
|
":gpu_buffer_storage_cv_pixel_buffer",
|
||||||
],
|
],
|
||||||
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
|
@ -344,6 +350,25 @@ cc_library(
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
mediapipe_cc_test(
|
||||||
|
name = "gpu_buffer_storage_cv_pixel_buffer_test",
|
||||||
|
size = "small",
|
||||||
|
timeout = "moderate",
|
||||||
|
srcs = ["gpu_buffer_storage_cv_pixel_buffer_test.cc"],
|
||||||
|
platforms = ["ios"],
|
||||||
|
deps = [
|
||||||
|
":gl_texture_buffer",
|
||||||
|
":gl_texture_util",
|
||||||
|
":gpu_buffer",
|
||||||
|
":gpu_buffer_storage_cv_pixel_buffer",
|
||||||
|
":gpu_test_base",
|
||||||
|
"//mediapipe/framework/port:gtest_main",
|
||||||
|
"//mediapipe/framework/tool:test_util",
|
||||||
|
"//mediapipe/objc:util",
|
||||||
|
"@com_google_absl//absl/strings",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "cv_texture_cache_manager",
|
name = "cv_texture_cache_manager",
|
||||||
srcs = ["cv_texture_cache_manager.cc"],
|
srcs = ["cv_texture_cache_manager.cc"],
|
||||||
|
|
|
@ -18,6 +18,11 @@
|
||||||
#include "mediapipe/gpu/gl_texture_view.h"
|
#include "mediapipe/gpu/gl_texture_view.h"
|
||||||
#include "mediapipe/gpu/gpu_buffer_storage_image_frame.h"
|
#include "mediapipe/gpu/gpu_buffer_storage_image_frame.h"
|
||||||
|
|
||||||
|
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
#include "mediapipe/gpu/gl_texture_util.h"
|
||||||
|
#include "mediapipe/gpu/gpu_buffer_storage_cv_pixel_buffer.h"
|
||||||
|
#endif // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
|
||||||
namespace mediapipe {
|
namespace mediapipe {
|
||||||
|
|
||||||
std::unique_ptr<GlTextureBuffer> GlTextureBuffer::Wrap(
|
std::unique_ptr<GlTextureBuffer> GlTextureBuffer::Wrap(
|
||||||
|
@ -380,4 +385,28 @@ static auto kConverterRegistration2 =
|
||||||
.RegisterConverter<GpuBufferStorageImageFrame, GlTextureBuffer>(
|
.RegisterConverter<GpuBufferStorageImageFrame, GlTextureBuffer>(
|
||||||
ConvertFromImageFrame);
|
ConvertFromImageFrame);
|
||||||
|
|
||||||
|
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
|
||||||
|
static std::shared_ptr<GpuBufferStorageCvPixelBuffer> ConvertToCvPixelBuffer(
|
||||||
|
std::shared_ptr<GlTextureBuffer> buf) {
|
||||||
|
auto output = absl::make_unique<GpuBufferStorageCvPixelBuffer>(
|
||||||
|
buf->width(), buf->height(), buf->format());
|
||||||
|
buf->GetProducerContext()->Run([buf, &output] {
|
||||||
|
TempGlFramebuffer framebuffer;
|
||||||
|
auto src = buf->GetReadView(internal::types<GlTextureView>{}, nullptr, 0);
|
||||||
|
auto dst =
|
||||||
|
output->GetWriteView(internal::types<GlTextureView>{}, nullptr, 0);
|
||||||
|
CopyGlTexture(src, dst);
|
||||||
|
glFlush();
|
||||||
|
});
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
static auto kConverterRegistrationCvpb =
|
||||||
|
internal::GpuBufferStorageRegistry::Get()
|
||||||
|
.RegisterConverter<GlTextureBuffer, GpuBufferStorageCvPixelBuffer>(
|
||||||
|
ConvertToCvPixelBuffer);
|
||||||
|
|
||||||
|
#endif // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
|
||||||
} // namespace mediapipe
|
} // namespace mediapipe
|
||||||
|
|
Loading…
Reference in New Issue
Block a user