Obj-C SDK Cleanup

This CL separates the files under sdk/objc into logical directories, replacing
the previous file layout under Framework/.

A long term goal is to have some system set up to generate the files under
sdk/objc/api (the PeerConnection API wrappers) from the C++ code. In the shorter
term the goal is to abstract out shared concepts from these classes in order to
make them as uniform as possible.

The separation into base/, components/, and helpers/ are to differentiate between
the base layer's common protocols, various utilities and the actual platform
specific components.

The old directory layout that resembled a framework's internal layout is not
necessary, since it is generated by the framework target when building it.

Bug: webrtc:9627
Change-Id: Ib084fd83f050ae980649ca99e841f4fb0580bd8f
Reviewed-on: https://webrtc-review.googlesource.com/94142
Reviewed-by: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Reviewed-by: Henrik Andreassson <henrika@webrtc.org>
Commit-Queue: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24493}
diff --git a/sdk/objc/components/renderer/opengl/RTCNV12TextureCache.m b/sdk/objc/components/renderer/opengl/RTCNV12TextureCache.m
new file mode 100644
index 0000000..19213e5
--- /dev/null
+++ b/sdk/objc/components/renderer/opengl/RTCNV12TextureCache.m
@@ -0,0 +1,111 @@
+/*
+ *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#import "RTCNV12TextureCache.h"
+
+#import "base/RTCVideoFrame.h"
+#import "base/RTCVideoFrameBuffer.h"
+#import "components/video_frame_buffer/RTCCVPixelBuffer.h"
+
+@implementation RTCNV12TextureCache {
+  CVOpenGLESTextureCacheRef _textureCache;
+  CVOpenGLESTextureRef _yTextureRef;
+  CVOpenGLESTextureRef _uvTextureRef;
+}
+
+- (GLuint)yTexture {
+  return CVOpenGLESTextureGetName(_yTextureRef);
+}
+
+- (GLuint)uvTexture {
+  return CVOpenGLESTextureGetName(_uvTextureRef);
+}
+
+- (instancetype)initWithContext:(EAGLContext *)context {
+  if (self = [super init]) {
+    CVReturn ret = CVOpenGLESTextureCacheCreate(
+        kCFAllocatorDefault, NULL,
+#if COREVIDEO_USE_EAGLCONTEXT_CLASS_IN_API
+        context,
+#else
+        (__bridge void *)context,
+#endif
+        NULL, &_textureCache);
+    if (ret != kCVReturnSuccess) {
+      self = nil;
+    }
+  }
+  return self;
+}
+
+- (BOOL)loadTexture:(CVOpenGLESTextureRef *)textureOut
+        pixelBuffer:(CVPixelBufferRef)pixelBuffer
+         planeIndex:(int)planeIndex
+        pixelFormat:(GLenum)pixelFormat {
+  const int width = CVPixelBufferGetWidthOfPlane(pixelBuffer, planeIndex);
+  const int height = CVPixelBufferGetHeightOfPlane(pixelBuffer, planeIndex);
+
+  if (*textureOut) {
+    CFRelease(*textureOut);
+    *textureOut = nil;
+  }
+  CVReturn ret = CVOpenGLESTextureCacheCreateTextureFromImage(
+      kCFAllocatorDefault, _textureCache, pixelBuffer, NULL, GL_TEXTURE_2D, pixelFormat, width,
+      height, pixelFormat, GL_UNSIGNED_BYTE, planeIndex, textureOut);
+  if (ret != kCVReturnSuccess) {
+    CFRelease(*textureOut);
+    *textureOut = nil;
+    return NO;
+  }
+  NSAssert(CVOpenGLESTextureGetTarget(*textureOut) == GL_TEXTURE_2D,
+           @"Unexpected GLES texture target");
+  glBindTexture(GL_TEXTURE_2D, CVOpenGLESTextureGetName(*textureOut));
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+  return YES;
+}
+
+- (BOOL)uploadFrameToTextures:(RTCVideoFrame *)frame {
+  NSAssert([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]],
+           @"frame must be CVPixelBuffer backed");
+  RTCCVPixelBuffer *rtcPixelBuffer = (RTCCVPixelBuffer *)frame.buffer;
+  CVPixelBufferRef pixelBuffer = rtcPixelBuffer.pixelBuffer;
+  return [self loadTexture:&_yTextureRef
+               pixelBuffer:pixelBuffer
+                planeIndex:0
+               pixelFormat:GL_LUMINANCE] &&
+         [self loadTexture:&_uvTextureRef
+               pixelBuffer:pixelBuffer
+                planeIndex:1
+               pixelFormat:GL_LUMINANCE_ALPHA];
+}
+
+- (void)releaseTextures {
+  if (_uvTextureRef) {
+    CFRelease(_uvTextureRef);
+    _uvTextureRef = nil;
+  }
+  if (_yTextureRef) {
+    CFRelease(_yTextureRef);
+    _yTextureRef = nil;
+  }
+}
+
+- (void)dealloc {
+  [self releaseTextures];
+  if (_textureCache) {
+    CFRelease(_textureCache);
+    _textureCache = nil;
+  }
+}
+
+@end