Quick Look in the Xcode Debugger for Obj-C frame buffer classes.

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 <andersc@webrtc.org>
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22746}
diff --git a/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm b/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm
index f572ae2..f854c91 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 <UIKit/UIKit.h>
+#import <VideoToolbox/VideoToolbox.h>
+#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 2848f2b..65f3d5a 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 <UIKit/UIKit.h>
+#include "third_party/libyuv/include/libyuv.h"
+#endif
+
 @implementation RTCI420Buffer {
  @protected
   rtc::scoped_refptr<webrtc::I420BufferInterface> _i420Buffer;
@@ -89,12 +94,42 @@
   return self;
 }
 
+#pragma mark - Private
+
 - (rtc::scoped_refptr<webrtc::I420BufferInterface>)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 862ead4..c6a7550 100644
--- a/sdk/objc/Framework/UnitTests/frame_buffer_helpers.mm
+++ b/sdk/objc/Framework/UnitTests/frame_buffer_helpers.mm
@@ -18,13 +18,16 @@
   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[] = {