Implement CVPixelBufferRef access as a view.
PiperOrigin-RevId: 488798216
This commit is contained in:
parent
4bda012bba
commit
b308c0dd5e
|
@ -93,8 +93,11 @@ internal::GpuBufferStorage& GpuBuffer::GetStorageForViewOrDie(
|
||||||
#if !MEDIAPIPE_DISABLE_GPU
|
#if !MEDIAPIPE_DISABLE_GPU
|
||||||
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
CVPixelBufferRef GetCVPixelBufferRef(const GpuBuffer& buffer) {
|
CVPixelBufferRef GetCVPixelBufferRef(const GpuBuffer& buffer) {
|
||||||
auto p = buffer.internal_storage<GpuBufferStorageCvPixelBuffer>();
|
if (buffer.GetStorageForView(
|
||||||
if (p) return **p;
|
kTypeId<internal::ViewProvider<CVPixelBufferRef>>,
|
||||||
|
/*for_writing=*/false) != nullptr) {
|
||||||
|
return *buffer.GetReadView<CVPixelBufferRef>();
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
#endif // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
#endif // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
|
|
@ -179,6 +179,10 @@ class GpuBuffer {
|
||||||
// This is mutable because view methods that do not change the contents may
|
// This is mutable because view methods that do not change the contents may
|
||||||
// still need to allocate new storages.
|
// still need to allocate new storages.
|
||||||
mutable std::vector<std::shared_ptr<internal::GpuBufferStorage>> storages_;
|
mutable std::vector<std::shared_ptr<internal::GpuBufferStorage>> storages_;
|
||||||
|
|
||||||
|
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
friend CVPixelBufferRef GetCVPixelBufferRef(const GpuBuffer& buffer);
|
||||||
|
#endif // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool GpuBuffer::operator==(std::nullptr_t other) const {
|
inline bool GpuBuffer::operator==(std::nullptr_t other) const {
|
||||||
|
|
|
@ -12,10 +12,27 @@ namespace mediapipe {
|
||||||
|
|
||||||
class GlContext;
|
class GlContext;
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
template <>
|
||||||
|
class ViewProvider<CVPixelBufferRef> {
|
||||||
|
public:
|
||||||
|
virtual ~ViewProvider() = default;
|
||||||
|
virtual CFHolder<CVPixelBufferRef> GetReadView(
|
||||||
|
internal::types<CVPixelBufferRef>,
|
||||||
|
std::shared_ptr<GpuBuffer> gpu_buffer) const = 0;
|
||||||
|
virtual CFHolder<CVPixelBufferRef> GetWriteView(
|
||||||
|
internal::types<CVPixelBufferRef>,
|
||||||
|
std::shared_ptr<GpuBuffer> gpu_buffer) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
class GpuBufferStorageCvPixelBuffer
|
class GpuBufferStorageCvPixelBuffer
|
||||||
: public internal::GpuBufferStorageImpl<
|
: public internal::GpuBufferStorageImpl<
|
||||||
GpuBufferStorageCvPixelBuffer, internal::ViewProvider<GlTextureView>,
|
GpuBufferStorageCvPixelBuffer, internal::ViewProvider<GlTextureView>,
|
||||||
internal::ViewProvider<ImageFrame>>,
|
internal::ViewProvider<ImageFrame>,
|
||||||
|
internal::ViewProvider<CVPixelBufferRef>>,
|
||||||
public CFHolder<CVPixelBufferRef> {
|
public CFHolder<CVPixelBufferRef> {
|
||||||
public:
|
public:
|
||||||
using CFHolder<CVPixelBufferRef>::CFHolder;
|
using CFHolder<CVPixelBufferRef>::CFHolder;
|
||||||
|
@ -44,6 +61,12 @@ class GpuBufferStorageCvPixelBuffer
|
||||||
std::shared_ptr<ImageFrame> GetWriteView(
|
std::shared_ptr<ImageFrame> GetWriteView(
|
||||||
internal::types<ImageFrame>,
|
internal::types<ImageFrame>,
|
||||||
std::shared_ptr<GpuBuffer> gpu_buffer) override;
|
std::shared_ptr<GpuBuffer> gpu_buffer) override;
|
||||||
|
CFHolder<CVPixelBufferRef> GetReadView(
|
||||||
|
internal::types<CVPixelBufferRef>,
|
||||||
|
std::shared_ptr<GpuBuffer> gpu_buffer) const override;
|
||||||
|
CFHolder<CVPixelBufferRef> GetWriteView(
|
||||||
|
internal::types<CVPixelBufferRef>,
|
||||||
|
std::shared_ptr<GpuBuffer> gpu_buffer) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GlTextureView GetTexture(std::shared_ptr<GpuBuffer> gpu_buffer, int plane,
|
GlTextureView GetTexture(std::shared_ptr<GpuBuffer> gpu_buffer, int plane,
|
||||||
|
@ -51,6 +74,16 @@ class GpuBufferStorageCvPixelBuffer
|
||||||
void ViewDoneWriting(const GlTextureView& view);
|
void ViewDoneWriting(const GlTextureView& view);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline CFHolder<CVPixelBufferRef> GpuBufferStorageCvPixelBuffer::GetReadView(
|
||||||
|
internal::types<CVPixelBufferRef>,
|
||||||
|
std::shared_ptr<GpuBuffer> gpu_buffer) const {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
inline CFHolder<CVPixelBufferRef> GpuBufferStorageCvPixelBuffer::GetWriteView(
|
||||||
|
internal::types<CVPixelBufferRef>, std::shared_ptr<GpuBuffer> gpu_buffer) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
// These functions enable backward-compatible construction of a GpuBuffer from
|
// These functions enable backward-compatible construction of a GpuBuffer from
|
||||||
// CVPixelBufferRef without having to expose that type in the main GpuBuffer
|
// CVPixelBufferRef without having to expose that type in the main GpuBuffer
|
||||||
|
|
Loading…
Reference in New Issue
Block a user