From 498644e645cf8489f0594dafc1fed17e5d178b66 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Thu, 5 Apr 2018 13:07:39 +0200 Subject: [PATCH] Quick Look in the Xcode Debugger for Obj-C frame buffer classes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement debugQuickLookObject for RTCI420Buffers and RTCCVPixelBuffers. Also draw gradients consistently regardless of endianness in the unit tests for RTCCVPixelBuffers and ObjCVideoTrackSource. Bug: webrtc:9007 Change-Id: Ia5a3d0905a763efc190165471983061fc07551f2 Reviewed-on: https://webrtc-review.googlesource.com/64987 Commit-Queue: Anders Carlsson Reviewed-by: Kári Helgason Cr-Commit-Position: refs/heads/master@{#22746} --- .../Classes/Video/RTCCVPixelBuffer.mm | 20 +++++++++- .../Framework/Classes/Video/RTCI420Buffer.mm | 37 ++++++++++++++++++- .../UnitTests/frame_buffer_helpers.mm | 5 ++- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm b/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm index f572ae24d4..f854c91edc 100644 --- a/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm +++ b/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm @@ -13,9 +13,13 @@ #include "common_video/libyuv/include/webrtc_libyuv.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" - #include "third_party/libyuv/include/libyuv.h" +#if !defined(NDEBUG) && defined(WEBRTC_IOS) +#import +#import +#endif + @implementation RTCCVPixelBuffer { int _width; int _height; @@ -244,6 +248,20 @@ return i420Buffer; } +#pragma mark - Debugging + +#if !defined(NDEBUG) && defined(WEBRTC_IOS) +- (id)debugQuickLookObject { + CGImageRef cgImage; + VTCreateCGImageFromCVPixelBuffer(_pixelBuffer, NULL, &cgImage); + UIImage *image = [UIImage imageWithCGImage:cgImage scale:1.0 orientation:UIImageOrientationUp]; + CGImageRelease(cgImage); + return image; +} +#endif + +#pragma mark - Private + - (void)cropAndScaleNV12To:(CVPixelBufferRef)outputPixelBuffer withTempBuffer:(uint8_t*)tmpBuffer { // Prepare output pointers. CVReturn cvRet = CVPixelBufferLockBaseAddress(outputPixelBuffer, 0); diff --git a/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm b/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm index 2848f2b45e..65f3d5ad41 100644 --- a/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm +++ b/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm @@ -8,10 +8,15 @@ * be found in the AUTHORS file in the root of the source tree. */ -#import "WebRTC/RTCVideoFrameBuffer.h" +#import "RTCI420Buffer+Private.h" #include "api/video/i420_buffer.h" +#if !defined(NDEBUG) && defined(WEBRTC_IOS) +#import +#include "third_party/libyuv/include/libyuv.h" +#endif + @implementation RTCI420Buffer { @protected rtc::scoped_refptr _i420Buffer; @@ -89,12 +94,42 @@ return self; } +#pragma mark - Private + - (rtc::scoped_refptr)nativeI420Buffer { return _i420Buffer; } +#pragma mark - Debugging + +#if !defined(NDEBUG) && defined(WEBRTC_IOS) +- (id)debugQuickLookObject { + UIGraphicsBeginImageContext(CGSizeMake(_i420Buffer->width(), _i420Buffer->height())); + CGContextRef c = UIGraphicsGetCurrentContext(); + uint8_t *ctxData = (uint8_t *)CGBitmapContextGetData(c); + + libyuv::I420ToARGB(_i420Buffer->DataY(), + _i420Buffer->StrideY(), + _i420Buffer->DataU(), + _i420Buffer->StrideU(), + _i420Buffer->DataV(), + _i420Buffer->StrideV(), + ctxData, + _i420Buffer->width() * 4, + _i420Buffer->width(), + _i420Buffer->height()); + + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return image; +} +#endif + @end +#pragma mark - + @implementation RTCMutableI420Buffer - (uint8_t *)mutableDataY { diff --git a/sdk/objc/Framework/UnitTests/frame_buffer_helpers.mm b/sdk/objc/Framework/UnitTests/frame_buffer_helpers.mm index 862ead4af9..c6a7550fac 100644 --- a/sdk/objc/Framework/UnitTests/frame_buffer_helpers.mm +++ b/sdk/objc/Framework/UnitTests/frame_buffer_helpers.mm @@ -18,13 +18,16 @@ void DrawGradientInRGBPixelBuffer(CVPixelBufferRef pixelBuffer) { size_t width = CVPixelBufferGetWidth(pixelBuffer); size_t height = CVPixelBufferGetHeight(pixelBuffer); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + int byteOrder = CVPixelBufferGetPixelFormatType(pixelBuffer) == kCVPixelFormatType_32ARGB ? + kCGBitmapByteOrder32Little : + 0; CGContextRef cgContext = CGBitmapContextCreate(baseAddr, width, height, 8, CVPixelBufferGetBytesPerRow(pixelBuffer), colorSpace, - kCGImageAlphaNoneSkipLast); + byteOrder | kCGImageAlphaNoneSkipLast); // Create a gradient CGFloat colors[] = {