webrtc_m130/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm

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

189 lines
6.9 KiB
Plaintext
Raw Normal View History

Revert "Revert "Revert "Revert "Support more formats in RTCVideoFrame"""" This reverts commit 1cfeb435427a2fa677a495e34c882096efc193d0. Reason for revert: Fix unit test Original change's description: > Revert "Revert "Revert "Support more formats in RTCVideoFrame""" > > This reverts commit 7583390d1a3a7c4e9a77da0d77250abac0c34d1d. > > Reason for revert: Breaks unit tests > > Original change's description: > > 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} > > TBR=magjed@webrtc.org,andersc@webrtc.org > > Change-Id: Id12f33698eb02041607cb9a5c54f37f01bfac5b1 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:7785 > Reviewed-on: https://chromium-review.googlesource.com/544840 > Reviewed-by: Anders Carlsson <andersc@webrtc.org> > Commit-Queue: Anders Carlsson <andersc@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#18718} TBR=magjed@webrtc.org,andersc@webrtc.org Change-Id: I184303ecba8db91ef7de709f982a295a2efe92eb Bug: webrtc:7785 Reviewed-on: https://chromium-review.googlesource.com/544841 Commit-Queue: Magnus Jedvert <magjed@webrtc.org> Reviewed-by: Anders Carlsson <andersc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#18731}
2017-06-22 15:26:30 +02:00
/*
* 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 "WebRTC/RTCVideoFrameBuffer.h"
#include "common_video/libyuv/include/webrtc_libyuv.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
Revert "Revert "Revert "Revert "Support more formats in RTCVideoFrame"""" This reverts commit 1cfeb435427a2fa677a495e34c882096efc193d0. Reason for revert: Fix unit test Original change's description: > Revert "Revert "Revert "Support more formats in RTCVideoFrame""" > > This reverts commit 7583390d1a3a7c4e9a77da0d77250abac0c34d1d. > > Reason for revert: Breaks unit tests > > Original change's description: > > 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} > > TBR=magjed@webrtc.org,andersc@webrtc.org > > Change-Id: Id12f33698eb02041607cb9a5c54f37f01bfac5b1 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:7785 > Reviewed-on: https://chromium-review.googlesource.com/544840 > Reviewed-by: Anders Carlsson <andersc@webrtc.org> > Commit-Queue: Anders Carlsson <andersc@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#18718} TBR=magjed@webrtc.org,andersc@webrtc.org Change-Id: I184303ecba8db91ef7de709f982a295a2efe92eb Bug: webrtc:7785 Reviewed-on: https://chromium-review.googlesource.com/544841 Commit-Queue: Magnus Jedvert <magjed@webrtc.org> Reviewed-by: Anders Carlsson <andersc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#18731}
2017-06-22 15:26:30 +02:00
@implementation RTCCVPixelBuffer {
int _width;
int _height;
int _bufferWidth;
int _bufferHeight;
int _cropWidth;
int _cropHeight;
}
@synthesize pixelBuffer = _pixelBuffer;
@synthesize cropX = _cropX;
@synthesize cropY = _cropY;
Revert "Revert "Revert "Revert "Support more formats in RTCVideoFrame"""" This reverts commit 1cfeb435427a2fa677a495e34c882096efc193d0. Reason for revert: Fix unit test Original change's description: > Revert "Revert "Revert "Support more formats in RTCVideoFrame""" > > This reverts commit 7583390d1a3a7c4e9a77da0d77250abac0c34d1d. > > Reason for revert: Breaks unit tests > > Original change's description: > > 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} > > TBR=magjed@webrtc.org,andersc@webrtc.org > > Change-Id: Id12f33698eb02041607cb9a5c54f37f01bfac5b1 > No-Presubmit: true > No-Tree-Checks: true > No-Try: true > Bug: webrtc:7785 > Reviewed-on: https://chromium-review.googlesource.com/544840 > Reviewed-by: Anders Carlsson <andersc@webrtc.org> > Commit-Queue: Anders Carlsson <andersc@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#18718} TBR=magjed@webrtc.org,andersc@webrtc.org Change-Id: I184303ecba8db91ef7de709f982a295a2efe92eb Bug: webrtc:7785 Reviewed-on: https://chromium-review.googlesource.com/544841 Commit-Queue: Magnus Jedvert <magjed@webrtc.org> Reviewed-by: Anders Carlsson <andersc@webrtc.org> Cr-Commit-Position: refs/heads/master@{#18731}
2017-06-22 15:26:30 +02:00
- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer {
return [self initWithPixelBuffer:pixelBuffer
adaptedWidth:CVPixelBufferGetWidth(pixelBuffer)
adaptedHeight:CVPixelBufferGetHeight(pixelBuffer)
cropWidth:CVPixelBufferGetWidth(pixelBuffer)
cropHeight:CVPixelBufferGetHeight(pixelBuffer)
cropX:0
cropY:0];
}
- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
adaptedWidth:(int)adaptedWidth
adaptedHeight:(int)adaptedHeight
cropWidth:(int)cropWidth
cropHeight:(int)cropHeight
cropX:(int)cropX
cropY:(int)cropY {
if (self = [super init]) {
_width = adaptedWidth;
_height = adaptedHeight;
_pixelBuffer = pixelBuffer;
_bufferWidth = CVPixelBufferGetWidth(_pixelBuffer);
_bufferHeight = CVPixelBufferGetHeight(_pixelBuffer);
_cropWidth = cropWidth;
_cropHeight = cropHeight;
// Can only crop at even pixels.
_cropX = cropX & ~1;
_cropY = cropY & ~1;
CVBufferRetain(_pixelBuffer);
}
return self;
}
- (void)dealloc {
CVBufferRelease(_pixelBuffer);
}
- (int)width {
return _width;
}
- (int)height {
return _height;
}
- (BOOL)requiresCropping {
return _cropWidth != _bufferWidth || _cropHeight != _bufferHeight;
}
- (BOOL)requiresScalingToWidth:(int)width height:(int)height {
return _cropWidth != width || _cropHeight != height;
}
- (int)bufferSizeForCroppingAndScalingToWidth:(int)width height:(int)height {
int srcChromaWidth = (_cropWidth + 1) / 2;
int srcChromaHeight = (_cropHeight + 1) / 2;
int dstChromaWidth = (width + 1) / 2;
int dstChromaHeight = (height + 1) / 2;
return srcChromaWidth * srcChromaHeight * 2 + dstChromaWidth * dstChromaHeight * 2;
}
- (BOOL)cropAndScaleTo:(CVPixelBufferRef)outputPixelBuffer withTempBuffer:(uint8_t*)tmpBuffer {
// Prepare output pointers.
RTC_DCHECK_EQ(CVPixelBufferGetPixelFormatType(outputPixelBuffer),
kCVPixelFormatType_420YpCbCr8BiPlanarFullRange);
CVReturn cvRet = CVPixelBufferLockBaseAddress(outputPixelBuffer, 0);
if (cvRet != kCVReturnSuccess) {
LOG(LS_ERROR) << "Failed to lock base address: " << cvRet;
return NO;
}
const int dstWidth = CVPixelBufferGetWidth(outputPixelBuffer);
const int dstHeight = CVPixelBufferGetHeight(outputPixelBuffer);
uint8_t* dstY =
reinterpret_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(outputPixelBuffer, 0));
const int dstYStride = CVPixelBufferGetBytesPerRowOfPlane(outputPixelBuffer, 0);
uint8_t* dstUV =
reinterpret_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(outputPixelBuffer, 1));
const int dstUVStride = CVPixelBufferGetBytesPerRowOfPlane(outputPixelBuffer, 1);
// Prepare source pointers.
const OSType srcPixelFormat = CVPixelBufferGetPixelFormatType(_pixelBuffer);
RTC_DCHECK(srcPixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ||
srcPixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
CVPixelBufferLockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
const uint8_t* srcY =
static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 0));
const int srcYStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 0);
const uint8_t* srcUV =
static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 1));
const int srcUVStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 1);
// Crop just by modifying pointers.
srcY += srcYStride * _cropY + _cropX;
srcUV += srcUVStride * (_cropY / 2) + _cropX;
webrtc::NV12Scale(tmpBuffer,
srcY,
srcYStride,
srcUV,
srcUVStride,
_cropWidth,
_cropHeight,
dstY,
dstYStride,
dstUV,
dstUVStride,
dstWidth,
dstHeight);
CVPixelBufferUnlockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
CVPixelBufferUnlockBaseAddress(outputPixelBuffer, 0);
return YES;
}
- (id<RTCI420Buffer>)toI420 {
const OSType pixelFormat = CVPixelBufferGetPixelFormatType(_pixelBuffer);
RTC_DCHECK(pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ||
pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
CVPixelBufferLockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
const uint8_t* srcY =
static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 0));
const int srcYStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 0);
const uint8_t* srcUV =
static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 1));
const int srcUVStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 1);
// Crop just by modifying pointers.
srcY += srcYStride * _cropY + _cropX;
srcUV += srcUVStride * (_cropY / 2) + _cropX;
// TODO(magjed): Use a frame buffer pool.
webrtc::NV12ToI420Scaler nv12ToI420Scaler;
RTCMutableI420Buffer* i420Buffer =
[[RTCMutableI420Buffer alloc] initWithWidth:[self width] height:[self height]];
nv12ToI420Scaler.NV12ToI420Scale(srcY,
srcYStride,
srcUV,
srcUVStride,
_cropWidth,
_cropHeight,
i420Buffer.mutableDataY,
i420Buffer.strideY,
i420Buffer.mutableDataU,
i420Buffer.strideU,
i420Buffer.mutableDataV,
i420Buffer.strideV,
i420Buffer.width,
i420Buffer.height);
CVPixelBufferUnlockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
return i420Buffer;
}
@end