Factor out CvPixelBufferPoolWrapper
This is platform-specific and does not need to live in the main multi_pool sources. PiperOrigin-RevId: 488781934
This commit is contained in:
parent
ab2dd779e7
commit
0d273dd11a
|
@ -356,6 +356,26 @@ cc_library(
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "cv_pixel_buffer_pool_wrapper",
|
||||||
|
srcs = ["cv_pixel_buffer_pool_wrapper.cc"],
|
||||||
|
hdrs = ["cv_pixel_buffer_pool_wrapper.h"],
|
||||||
|
copts = select({
|
||||||
|
"//conditions:default": [],
|
||||||
|
"//mediapipe:apple": [
|
||||||
|
"-x objective-c++",
|
||||||
|
"-fobjc-arc",
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
deps = [
|
||||||
|
":gpu_buffer",
|
||||||
|
":pixel_buffer_pool_util",
|
||||||
|
"//mediapipe/framework/port:logging",
|
||||||
|
"//mediapipe/objc:CFHolder",
|
||||||
|
"@com_google_absl//absl/synchronization",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "gpu_buffer_storage_image_frame",
|
name = "gpu_buffer_storage_image_frame",
|
||||||
hdrs = ["gpu_buffer_storage_image_frame.h"],
|
hdrs = ["gpu_buffer_storage_image_frame.h"],
|
||||||
|
@ -631,12 +651,14 @@ cc_library(
|
||||||
":gl_texture_buffer_pool",
|
":gl_texture_buffer_pool",
|
||||||
],
|
],
|
||||||
"//mediapipe:ios": [
|
"//mediapipe:ios": [
|
||||||
|
":cv_pixel_buffer_pool_wrapper",
|
||||||
":cv_texture_cache_manager",
|
":cv_texture_cache_manager",
|
||||||
":pixel_buffer_pool_util",
|
":pixel_buffer_pool_util",
|
||||||
"//mediapipe/objc:CFHolder",
|
"//mediapipe/objc:CFHolder",
|
||||||
"//mediapipe/objc:util",
|
"//mediapipe/objc:util",
|
||||||
],
|
],
|
||||||
"//mediapipe:macos": [
|
"//mediapipe:macos": [
|
||||||
|
":cv_pixel_buffer_pool_wrapper",
|
||||||
":cv_texture_cache_manager",
|
":cv_texture_cache_manager",
|
||||||
":pixel_buffer_pool_util",
|
":pixel_buffer_pool_util",
|
||||||
":gl_texture_buffer",
|
":gl_texture_buffer",
|
||||||
|
|
71
mediapipe/gpu/cv_pixel_buffer_pool_wrapper.cc
Normal file
71
mediapipe/gpu/cv_pixel_buffer_pool_wrapper.cc
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
// Copyright 2019 The MediaPipe Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#include "mediapipe/gpu/cv_pixel_buffer_pool_wrapper.h"
|
||||||
|
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "CoreFoundation/CFBase.h"
|
||||||
|
#include "mediapipe/framework/port/logging.h"
|
||||||
|
#include "mediapipe/objc/CFHolder.h"
|
||||||
|
|
||||||
|
namespace mediapipe {
|
||||||
|
|
||||||
|
CvPixelBufferPoolWrapper::CvPixelBufferPoolWrapper(int width, int height,
|
||||||
|
GpuBufferFormat format,
|
||||||
|
CFTimeInterval maxAge) {
|
||||||
|
OSType cv_format = CVPixelFormatForGpuBufferFormat(format);
|
||||||
|
CHECK_NE(cv_format, -1) << "unsupported pixel format";
|
||||||
|
pool_ = MakeCFHolderAdopting(
|
||||||
|
/* keep count is 0 because the age param keeps buffers around anyway */
|
||||||
|
CreateCVPixelBufferPool(width, height, cv_format, 0, maxAge));
|
||||||
|
}
|
||||||
|
|
||||||
|
GpuBuffer CvPixelBufferPoolWrapper::GetBuffer(std::function<void(void)> flush) {
|
||||||
|
CVPixelBufferRef buffer;
|
||||||
|
int threshold = 1;
|
||||||
|
NSMutableDictionary* auxAttributes =
|
||||||
|
[NSMutableDictionary dictionaryWithCapacity:1];
|
||||||
|
CVReturn err;
|
||||||
|
bool tried_flushing = false;
|
||||||
|
while (1) {
|
||||||
|
auxAttributes[(id)kCVPixelBufferPoolAllocationThresholdKey] = @(threshold);
|
||||||
|
err = CVPixelBufferPoolCreatePixelBufferWithAuxAttributes(
|
||||||
|
kCFAllocatorDefault, *pool_, (__bridge CFDictionaryRef)auxAttributes,
|
||||||
|
&buffer);
|
||||||
|
if (err != kCVReturnWouldExceedAllocationThreshold) break;
|
||||||
|
if (flush && !tried_flushing) {
|
||||||
|
// Call the flush function to potentially release old holds on buffers
|
||||||
|
// and try again to create a pixel buffer.
|
||||||
|
// This is used to flush CV texture caches, which may retain buffers until
|
||||||
|
// flushed.
|
||||||
|
flush();
|
||||||
|
tried_flushing = true;
|
||||||
|
} else {
|
||||||
|
++threshold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CHECK(!err) << "Error creating pixel buffer: " << err;
|
||||||
|
count_ = threshold;
|
||||||
|
return GpuBuffer(MakeCFHolderAdopting(buffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CvPixelBufferPoolWrapper::GetDebugString() const {
|
||||||
|
auto description = MakeCFHolderAdopting(CFCopyDescription(*pool_));
|
||||||
|
return [(__bridge NSString*)*description UTF8String];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CvPixelBufferPoolWrapper::Flush() { CVPixelBufferPoolFlush(*pool_, 0); }
|
||||||
|
|
||||||
|
} // namespace mediapipe
|
50
mediapipe/gpu/cv_pixel_buffer_pool_wrapper.h
Normal file
50
mediapipe/gpu/cv_pixel_buffer_pool_wrapper.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
// Copyright 2019 The MediaPipe Authors.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// This class lets calculators allocate GpuBuffers of various sizes, caching
|
||||||
|
// and reusing them as needed. It does so by automatically creating and using
|
||||||
|
// platform-specific buffer pools for the requested sizes.
|
||||||
|
//
|
||||||
|
// This class is not meant to be used directly by calculators, but is instead
|
||||||
|
// used by GlCalculatorHelper to allocate buffers.
|
||||||
|
|
||||||
|
#ifndef MEDIAPIPE_GPU_CV_PIXEL_BUFFER_POOL_WRAPPER_H_
|
||||||
|
#define MEDIAPIPE_GPU_CV_PIXEL_BUFFER_POOL_WRAPPER_H_
|
||||||
|
|
||||||
|
#include "CoreFoundation/CFBase.h"
|
||||||
|
#include "mediapipe/gpu/gpu_buffer.h"
|
||||||
|
#include "mediapipe/gpu/pixel_buffer_pool_util.h"
|
||||||
|
#include "mediapipe/objc/CFHolder.h"
|
||||||
|
|
||||||
|
namespace mediapipe {
|
||||||
|
|
||||||
|
class CvPixelBufferPoolWrapper {
|
||||||
|
public:
|
||||||
|
CvPixelBufferPoolWrapper(int width, int height, GpuBufferFormat format,
|
||||||
|
CFTimeInterval maxAge);
|
||||||
|
GpuBuffer GetBuffer(std::function<void(void)> flush);
|
||||||
|
|
||||||
|
int GetBufferCount() const { return count_; }
|
||||||
|
std::string GetDebugString() const;
|
||||||
|
|
||||||
|
void Flush();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CFHolder<CVPixelBufferPoolRef> pool_;
|
||||||
|
int count_ = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace mediapipe
|
||||||
|
|
||||||
|
#endif // MEDIAPIPE_GPU_CV_PIXEL_BUFFER_POOL_WRAPPER_H_
|
|
@ -45,55 +45,10 @@ static constexpr int kRequestCountScrubInterval = 50;
|
||||||
|
|
||||||
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
|
||||||
CvPixelBufferPoolWrapper::CvPixelBufferPoolWrapper(
|
|
||||||
const GpuBufferMultiPool::BufferSpec& spec, CFTimeInterval maxAge) {
|
|
||||||
OSType cv_format = CVPixelFormatForGpuBufferFormat(spec.format);
|
|
||||||
CHECK_NE(cv_format, -1) << "unsupported pixel format";
|
|
||||||
pool_ = MakeCFHolderAdopting(
|
|
||||||
/* keep count is 0 because the age param keeps buffers around anyway */
|
|
||||||
CreateCVPixelBufferPool(spec.width, spec.height, cv_format, 0, maxAge));
|
|
||||||
}
|
|
||||||
|
|
||||||
GpuBuffer CvPixelBufferPoolWrapper::GetBuffer(std::function<void(void)> flush) {
|
|
||||||
CVPixelBufferRef buffer;
|
|
||||||
int threshold = 1;
|
|
||||||
NSMutableDictionary* auxAttributes =
|
|
||||||
[NSMutableDictionary dictionaryWithCapacity:1];
|
|
||||||
CVReturn err;
|
|
||||||
bool tried_flushing = false;
|
|
||||||
while (1) {
|
|
||||||
auxAttributes[(id)kCVPixelBufferPoolAllocationThresholdKey] = @(threshold);
|
|
||||||
err = CVPixelBufferPoolCreatePixelBufferWithAuxAttributes(
|
|
||||||
kCFAllocatorDefault, *pool_, (__bridge CFDictionaryRef)auxAttributes,
|
|
||||||
&buffer);
|
|
||||||
if (err != kCVReturnWouldExceedAllocationThreshold) break;
|
|
||||||
if (flush && !tried_flushing) {
|
|
||||||
// Call the flush function to potentially release old holds on buffers
|
|
||||||
// and try again to create a pixel buffer.
|
|
||||||
// This is used to flush CV texture caches, which may retain buffers until
|
|
||||||
// flushed.
|
|
||||||
flush();
|
|
||||||
tried_flushing = true;
|
|
||||||
} else {
|
|
||||||
++threshold;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CHECK(!err) << "Error creating pixel buffer: " << err;
|
|
||||||
count_ = threshold;
|
|
||||||
return GpuBuffer(MakeCFHolderAdopting(buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CvPixelBufferPoolWrapper::GetDebugString() const {
|
|
||||||
auto description = MakeCFHolderAdopting(CFCopyDescription(*pool_));
|
|
||||||
return [(__bridge NSString*)*description UTF8String];
|
|
||||||
}
|
|
||||||
|
|
||||||
void CvPixelBufferPoolWrapper::Flush() { CVPixelBufferPoolFlush(*pool_, 0); }
|
|
||||||
|
|
||||||
std::shared_ptr<GpuBufferMultiPool::SimplePool>
|
std::shared_ptr<GpuBufferMultiPool::SimplePool>
|
||||||
GpuBufferMultiPool::MakeSimplePool(const GpuBufferMultiPool::BufferSpec& spec) {
|
GpuBufferMultiPool::MakeSimplePool(const GpuBufferMultiPool::BufferSpec& spec) {
|
||||||
return std::make_shared<CvPixelBufferPoolWrapper>(spec,
|
return std::make_shared<CvPixelBufferPoolWrapper>(
|
||||||
kMaxInactiveBufferAge);
|
spec.width, spec.height, spec.format, kMaxInactiveBufferAge);
|
||||||
}
|
}
|
||||||
|
|
||||||
GpuBuffer GpuBufferMultiPool::GetBufferWithoutPool(const BufferSpec& spec) {
|
GpuBuffer GpuBufferMultiPool::GetBufferWithoutPool(const BufferSpec& spec) {
|
||||||
|
|
|
@ -31,9 +31,11 @@
|
||||||
#include "mediapipe/gpu/pixel_buffer_pool_util.h"
|
#include "mediapipe/gpu/pixel_buffer_pool_util.h"
|
||||||
#endif // __APPLE__
|
#endif // __APPLE__
|
||||||
|
|
||||||
#if !MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
#include "mediapipe/gpu/cv_pixel_buffer_pool_wrapper.h"
|
||||||
|
#else
|
||||||
#include "mediapipe/gpu/gl_texture_buffer_pool.h"
|
#include "mediapipe/gpu/gl_texture_buffer_pool.h"
|
||||||
#endif // !MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
#endif // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
||||||
|
|
||||||
namespace mediapipe {
|
namespace mediapipe {
|
||||||
|
|
||||||
|
@ -93,24 +95,6 @@ class GpuBufferMultiPool {
|
||||||
std::function<void(void)> flush_platform_caches_;
|
std::function<void(void)> flush_platform_caches_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
|
||||||
class CvPixelBufferPoolWrapper {
|
|
||||||
public:
|
|
||||||
CvPixelBufferPoolWrapper(const GpuBufferMultiPool::BufferSpec& spec,
|
|
||||||
CFTimeInterval maxAge);
|
|
||||||
GpuBuffer GetBuffer(std::function<void(void)> flush);
|
|
||||||
|
|
||||||
int GetBufferCount() const { return count_; }
|
|
||||||
std::string GetDebugString() const;
|
|
||||||
|
|
||||||
void Flush();
|
|
||||||
|
|
||||||
private:
|
|
||||||
CFHolder<CVPixelBufferPoolRef> pool_;
|
|
||||||
int count_ = 0;
|
|
||||||
};
|
|
||||||
#endif // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
|
|
||||||
|
|
||||||
// BufferSpec equality operators
|
// BufferSpec equality operators
|
||||||
inline bool operator==(const GpuBufferMultiPool::BufferSpec& lhs,
|
inline bool operator==(const GpuBufferMultiPool::BufferSpec& lhs,
|
||||||
const GpuBufferMultiPool::BufferSpec& rhs) {
|
const GpuBufferMultiPool::BufferSpec& rhs) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user