Project import generated by Copybara.
GitOrigin-RevId: 73d686c40057684f8bfaca285368bf1813f9fc26
This commit is contained in:
+12
-1
@@ -11,6 +11,7 @@ cc_library(
|
||||
"//mediapipe:apple": ["CFHolder.h"],
|
||||
"//conditions:default": [],
|
||||
}),
|
||||
features = ["layering_check"],
|
||||
visibility = ["//mediapipe/framework:mediapipe_internal"],
|
||||
)
|
||||
|
||||
@@ -18,7 +19,10 @@ cc_library(
|
||||
name = "util",
|
||||
srcs = ["util.cc"],
|
||||
hdrs = ["util.h"],
|
||||
features = ["-parse_headers"],
|
||||
features = [
|
||||
"-parse_headers",
|
||||
"layering_check",
|
||||
],
|
||||
linkopts = [
|
||||
"-framework Accelerate",
|
||||
"-framework CoreFoundation",
|
||||
@@ -123,6 +127,13 @@ objc_library(
|
||||
"CoreVideo",
|
||||
],
|
||||
visibility = ["//mediapipe/framework:mediapipe_internal"],
|
||||
deps = [
|
||||
] + select({
|
||||
"//mediapipe:ios": [
|
||||
],
|
||||
"//mediapipe:macos": [
|
||||
],
|
||||
}),
|
||||
)
|
||||
|
||||
objc_library(
|
||||
|
||||
@@ -24,10 +24,6 @@
|
||||
|
||||
@class MPPGraph;
|
||||
|
||||
namespace mediapipe {
|
||||
struct GpuSharedData;
|
||||
} // namespace mediapipe
|
||||
|
||||
/// A delegate that can receive frames from a MediaPipe graph.
|
||||
@protocol MPPGraphDelegate <NSObject>
|
||||
|
||||
|
||||
@@ -169,7 +169,7 @@ void CallFrameDelegate(void* wrapperVoid, const std::string& streamName,
|
||||
wrapper->_framesInFlight--;
|
||||
CVPixelBufferRef pixelBuffer;
|
||||
if (packetType == MPPPacketTypePixelBuffer)
|
||||
pixelBuffer = packet.Get<mediapipe::GpuBuffer>().GetCVPixelBufferRef();
|
||||
pixelBuffer = mediapipe::GetCVPixelBufferRef(packet.Get<mediapipe::GpuBuffer>());
|
||||
else
|
||||
pixelBuffer = packet.Get<mediapipe::Image>().GetCVPixelBufferRef();
|
||||
if ([wrapper.delegate
|
||||
|
||||
+21
-9
@@ -279,9 +279,12 @@ absl::StatusOr<CFHolder<CVPixelBufferRef>> CreateCVPixelBufferWithoutPool(
|
||||
return MakeCFHolderAdopting(buffer);
|
||||
}
|
||||
|
||||
void ReleaseMediaPipePacket(void* refcon, const void* base_address) {
|
||||
auto packet = (mediapipe::Packet*)refcon;
|
||||
delete packet;
|
||||
/// When storing a shared_ptr in a CVPixelBuffer's refcon, this can be
|
||||
/// used as a CVPixelBufferReleaseBytesCallback. This keeps the data
|
||||
/// alive while the CVPixelBuffer is in use.
|
||||
static void ReleaseSharedPtr(void* refcon, const void* base_address) {
|
||||
auto ptr = (std::shared_ptr<void>*)refcon;
|
||||
delete ptr;
|
||||
}
|
||||
|
||||
CVPixelBufferRef CreateCVPixelBufferForImageFramePacket(
|
||||
@@ -307,10 +310,18 @@ absl::Status CreateCVPixelBufferForImageFramePacket(
|
||||
return ::mediapipe::InvalidArgumentErrorBuilder(MEDIAPIPE_LOC)
|
||||
<< "out_buffer cannot be NULL";
|
||||
}
|
||||
CFHolder<CVPixelBufferRef> pixel_buffer;
|
||||
auto image_frame = std::const_pointer_cast<mediapipe::ImageFrame>(
|
||||
mediapipe::SharedPtrWithPacket<mediapipe::ImageFrame>(
|
||||
image_frame_packet));
|
||||
ASSIGN_OR_RETURN(*out_buffer, CreateCVPixelBufferForImageFrame(
|
||||
image_frame, can_overwrite));
|
||||
return absl::OkStatus();
|
||||
}
|
||||
|
||||
auto packet_copy = absl::make_unique<mediapipe::Packet>(image_frame_packet);
|
||||
const auto& frame = packet_copy->Get<mediapipe::ImageFrame>();
|
||||
absl::StatusOr<CFHolder<CVPixelBufferRef>> CreateCVPixelBufferForImageFrame(
|
||||
std::shared_ptr<mediapipe::ImageFrame> image_frame, bool can_overwrite) {
|
||||
CFHolder<CVPixelBufferRef> pixel_buffer;
|
||||
const auto& frame = *image_frame;
|
||||
void* frame_data =
|
||||
const_cast<void*>(reinterpret_cast<const void*>(frame.PixelData()));
|
||||
|
||||
@@ -366,17 +377,18 @@ absl::Status CreateCVPixelBufferForImageFramePacket(
|
||||
<< "CVPixelBufferUnlockBaseAddress failed: " << status;
|
||||
} else {
|
||||
CVPixelBufferRef pixel_buffer_temp;
|
||||
auto holder = absl::make_unique<std::shared_ptr<void>>(image_frame);
|
||||
status = CVPixelBufferCreateWithBytes(
|
||||
NULL, frame.Width(), frame.Height(), pixel_format, frame_data,
|
||||
frame.WidthStep(), ReleaseMediaPipePacket, packet_copy.release(),
|
||||
frame.WidthStep(), ReleaseSharedPtr, holder.get(),
|
||||
GetCVPixelBufferAttributesForGlCompatibility(), &pixel_buffer_temp);
|
||||
RET_CHECK(status == kCVReturnSuccess)
|
||||
<< "failed to create pixel buffer: " << status;
|
||||
holder.release(); // will be deleted by ReleaseSharedPtr
|
||||
pixel_buffer.adopt(pixel_buffer_temp);
|
||||
}
|
||||
|
||||
*out_buffer = pixel_buffer;
|
||||
return absl::OkStatus();
|
||||
return pixel_buffer;
|
||||
}
|
||||
|
||||
absl::StatusOr<CFHolder<CVPixelBufferRef>> CreateCVPixelBufferCopyingImageFrame(
|
||||
|
||||
@@ -59,11 +59,6 @@ vImage_Error vImageRGBAToGray(const vImage_Buffer* src, vImage_Buffer* dst);
|
||||
vImage_Error vImageConvertCVPixelBuffers(CVPixelBufferRef src,
|
||||
CVPixelBufferRef dst);
|
||||
|
||||
/// When storing a mediapipe::Packet* in a CVPixelBuffer's refcon, this can be
|
||||
/// used as a CVPixelBufferReleaseBytesCallback. This keeps the packet's data
|
||||
/// alive while the CVPixelBuffer is in use.
|
||||
void ReleaseMediaPipePacket(void* refcon, const void* base_address);
|
||||
|
||||
// Create a CVPixelBuffer without using a pool. See pixel_buffer_pool_util.h
|
||||
// for creation functions that use pools.
|
||||
CVReturn CreateCVPixelBufferWithoutPool(int width, int height, OSType cv_format,
|
||||
@@ -88,6 +83,9 @@ absl::Status CreateCVPixelBufferForImageFramePacket(
|
||||
CFHolder<CVPixelBufferRef>* out_buffer);
|
||||
absl::StatusOr<CFHolder<CVPixelBufferRef>> CreateCVPixelBufferCopyingImageFrame(
|
||||
const mediapipe::ImageFrame& image_frame);
|
||||
absl::StatusOr<CFHolder<CVPixelBufferRef>> CreateCVPixelBufferForImageFrame(
|
||||
std::shared_ptr<mediapipe::ImageFrame> image_frame,
|
||||
bool can_overwrite = false);
|
||||
|
||||
/// Creates a CVPixelBuffer with a copy of the contents of the CGImage.
|
||||
absl::Status CreateCVPixelBufferFromCGImage(
|
||||
|
||||
Reference in New Issue
Block a user