webrtc_m130/webrtc/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.m

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

112 lines
3.3 KiB
Mathematica
Raw Normal View History

/*
* 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 "WebRTC/RTCVideoFrame.h"
Revert "Revert "Support more formats in RTCVideoFrame"" This reverts commit 0789dab2cbd1617e94d7300e375163d42345f3d4. Reason for revert: Include obc_corevideoframebuffer target Original change's description: > Revert "Support more formats in RTCVideoFrame" > > This reverts commit bd2220a9c496ef2e8567b68d4be9435a110bdc34. > > Reason for revert: Broke external clients > > Original change's description: > > Support more formats in RTCVideoFrame > > > > Implement Obj-C version of webrtc::VideoFrameBuffer and use that in > > RTCVideoFrame. > > > > Bug: webrtc:7785 > > Change-Id: I49f42bcf451dd6769b3a79a65fe7b400dce22677 > > Reviewed-on: https://chromium-review.googlesource.com/536773 > > Commit-Queue: Anders Carlsson <andersc@webrtc.org> > > Reviewed-by: Magnus Jedvert <magjed@webrtc.org> > > Cr-Commit-Position: refs/heads/master@{#18691} > > TBR=magjed@webrtc.org,andersc@webrtc.org > > Change-Id: Id765dd9543ed0613a6b2de108b268c3501025fcd > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:7785 > Reviewed-on: https://chromium-review.googlesource.com/542837 > Reviewed-by: Anders Carlsson <andersc@webrtc.org> > Commit-Queue: Anders Carlsson <andersc@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#18697} TBR=magjed@webrtc.org,andersc@webrtc.org Change-Id: I1ef5313b4a6c56eb8c7fd02d95db62c4e3c00255 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: webrtc:7785 Reviewed-on: https://chromium-review.googlesource.com/542838 Commit-Queue: Anders Carlsson <andersc@webrtc.org> Reviewed-by: Anders Carlsson <andersc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#18716}
2017-06-21 10:53:19 +02:00
#import "WebRTC/RTCVideoFrameBuffer.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 {
Revert "Revert "Support more formats in RTCVideoFrame"" This reverts commit 0789dab2cbd1617e94d7300e375163d42345f3d4. Reason for revert: Include obc_corevideoframebuffer target Original change's description: > Revert "Support more formats in RTCVideoFrame" > > This reverts commit bd2220a9c496ef2e8567b68d4be9435a110bdc34. > > Reason for revert: Broke external clients > > Original change's description: > > Support more formats in RTCVideoFrame > > > > Implement Obj-C version of webrtc::VideoFrameBuffer and use that in > > RTCVideoFrame. > > > > Bug: webrtc:7785 > > Change-Id: I49f42bcf451dd6769b3a79a65fe7b400dce22677 > > Reviewed-on: https://chromium-review.googlesource.com/536773 > > Commit-Queue: Anders Carlsson <andersc@webrtc.org> > > Reviewed-by: Magnus Jedvert <magjed@webrtc.org> > > Cr-Commit-Position: refs/heads/master@{#18691} > > TBR=magjed@webrtc.org,andersc@webrtc.org > > Change-Id: Id765dd9543ed0613a6b2de108b268c3501025fcd > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:7785 > Reviewed-on: https://chromium-review.googlesource.com/542837 > Reviewed-by: Anders Carlsson <andersc@webrtc.org> > Commit-Queue: Anders Carlsson <andersc@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#18697} TBR=magjed@webrtc.org,andersc@webrtc.org Change-Id: I1ef5313b4a6c56eb8c7fd02d95db62c4e3c00255 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: webrtc:7785 Reviewed-on: https://chromium-review.googlesource.com/542838 Commit-Queue: Anders Carlsson <andersc@webrtc.org> Reviewed-by: Anders Carlsson <andersc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#18716}
2017-06-21 10:53:19 +02:00
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