Skip to content

Commit

Permalink
[Mac/iOS] feat: Add RTCYUVHelper for darwin. (#28)
Browse files Browse the repository at this point in the history
* feat: Add RTCYUVHelper for darwin.

* chore: Add newline end of files.
  • Loading branch information
cloudwebrtc committed Jun 5, 2023
1 parent 89117a2 commit 3808ee0
Show file tree
Hide file tree
Showing 3 changed files with 302 additions and 0 deletions.
5 changes: 5 additions & 0 deletions sdk/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -143,12 +143,15 @@ if (is_ios || is_mac) {
"objc/helpers/RTCDispatcher+Private.h",
"objc/helpers/RTCDispatcher.h",
"objc/helpers/RTCDispatcher.m",
"objc/helpers/RTCYUVHelper.h",
"objc/helpers/RTCYUVHelper.mm",
"objc/helpers/scoped_cftyperef.h",
]

deps = [
":base_objc",
"../rtc_base:checks",
"//third_party/libyuv",
]

absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
Expand Down Expand Up @@ -1324,6 +1327,7 @@ if (is_ios || is_mac) {
"objc/components/video_frame_buffer/RTCCVPixelBuffer.h",
"objc/helpers/RTCCameraPreviewView.h",
"objc/helpers/RTCDispatcher.h",
"objc/helpers/RTCYUVHelper.h",
"objc/helpers/UIDevice+RTCDevice.h",
"objc/api/peerconnection/RTCAudioSource.h",
"objc/api/peerconnection/RTCAudioTrack.h",
Expand Down Expand Up @@ -1521,6 +1525,7 @@ if (is_ios || is_mac) {
"objc/components/video_codec/RTCVideoEncoderH264.h",
"objc/components/video_frame_buffer/RTCCVPixelBuffer.h",
"objc/helpers/RTCDispatcher.h",
"objc/helpers/RTCYUVHelper.h",
# Added for Simulcast support
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.h",
"objc/api/video_codec/RTCVideoEncoderSimulcast.h",
Expand Down
118 changes: 118 additions & 0 deletions sdk/objc/helpers/RTCYUVHelper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/*
* Copyright 2016 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 <Foundation/Foundation.h>

#import "RTCMacros.h"
#import "RTCVideoFrame.h"

RTC_OBJC_EXPORT
@interface RTC_OBJC_TYPE (RTCYUVHelper) : NSObject

- (instancetype)init NS_UNAVAILABLE;

+ (void)I420Rotate:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstY:(uint8_t*)dstY
dstStrideY:(int)dstStrideY
dstU:(uint8_t*)dstU
dstStrideU:(int)dstStrideU
dstV:(uint8_t*)dstV
dstStrideV:(int)dstStrideV
width:(int)width
width:(int)height
mode:(RTCVideoRotation)mode;

+ (int)I420ToNV12:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstY:(uint8_t*)dstY
dstStrideY:(int)dstStrideY
dstUV:(uint8_t*)dstUV
dstStrideUV:(int)dstStrideUV
width:(int)width
width:(int)height;

+ (int)I420ToNV21:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstY:(uint8_t*)dstY
dstStrideY:(int)dstStrideY
dstUV:(uint8_t*)dstUV
dstStrideUV:(int)dstStrideUV
width:(int)width
width:(int)height;

+ (int)I420ToARGB:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstARGB:(uint8_t*)dstARGB
dstStrideARGB:(int)dstStrideARGB
width:(int)width
height:(int)height;

+ (int)I420ToBGRA:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstBGRA:(uint8_t*)dstBGRA
dstStrideBGRA:(int)dstStrideBGRA
width:(int)width
height:(int)height;

+ (int)I420ToABGR:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstABGR:(uint8_t*)dstABGR
dstStrideABGR:(int)dstStrideABGR
width:(int)width
height:(int)height;

+ (int)I420ToRGBA:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstRGBA:(uint8_t*)dstRGBA
dstStrideRGBA:(int)dstStrideRGBA
width:(int)width
height:(int)height;

+ (int)I420ToRGB24:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstRGB24:(uint8_t*)dstRGB24
dstStrideRGB24:(int)dstStrideRGB24
width:(int)width
height:(int)height;

@end
179 changes: 179 additions & 0 deletions sdk/objc/helpers/RTCYUVHelper.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
/*
* Copyright 2016 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 "RTCYUVHelper.h"

#include "third_party/libyuv/include/libyuv.h"

@implementation RTC_OBJC_TYPE (RTCYUVHelper)

+ (void)I420Rotate:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstY:(uint8_t*)dstY
dstStrideY:(int)dstStrideY
dstU:(uint8_t*)dstU
dstStrideU:(int)dstStrideU
dstV:(uint8_t*)dstV
dstStrideV:(int)dstStrideV
width:(int)width
width:(int)height
mode:(RTCVideoRotation)mode {
libyuv::I420Rotate(srcY,
srcStrideY,
srcU,
srcStrideU,
srcV,
srcStrideV,
dstY,
dstStrideY,
dstU,
dstStrideU,
dstV,
dstStrideV,
width,
height,
(libyuv::RotationMode)mode);
}

+ (int)I420ToNV12:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstY:(uint8_t*)dstY
dstStrideY:(int)dstStrideY
dstUV:(uint8_t*)dstUV
dstStrideUV:(int)dstStrideUV
width:(int)width
width:(int)height {
return libyuv::I420ToNV12(srcY,
srcStrideY,
srcU,
srcStrideU,
srcV,
srcStrideV,
dstY,
dstStrideY,
dstUV,
dstStrideUV,
width,
height);
}

+ (int)I420ToNV21:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstY:(uint8_t*)dstY
dstStrideY:(int)dstStrideY
dstUV:(uint8_t*)dstUV
dstStrideUV:(int)dstStrideUV
width:(int)width
width:(int)height {
return libyuv::I420ToNV21(srcY,
srcStrideY,
srcU,
srcStrideU,
srcV,
srcStrideV,
dstY,
dstStrideY,
dstUV,
dstStrideUV,
width,
height);
}

+ (int)I420ToARGB:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstARGB:(uint8_t*)dstARGB
dstStrideARGB:(int)dstStrideARGB
width:(int)width
height:(int)height {
return libyuv::I420ToARGB(
srcY, srcStrideY, srcU, srcStrideU, srcV, srcStrideV, dstARGB, dstStrideARGB, width, height);
}

+ (int)I420ToBGRA:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstBGRA:(uint8_t*)dstBGRA
dstStrideBGRA:(int)dstStrideBGRA
width:(int)width
height:(int)height {
return libyuv::I420ToBGRA(
srcY, srcStrideY, srcU, srcStrideU, srcV, srcStrideV, dstBGRA, dstStrideBGRA, width, height);
}

+ (int)I420ToABGR:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstABGR:(uint8_t*)dstABGR
dstStrideABGR:(int)dstStrideABGR
width:(int)width
height:(int)height {
return libyuv::I420ToABGR(
srcY, srcStrideY, srcU, srcStrideU, srcV, srcStrideV, dstABGR, dstStrideABGR, width, height);
}

+ (int)I420ToRGBA:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstRGBA:(uint8_t*)dstRGBA
dstStrideRGBA:(int)dstStrideRGBA
width:(int)width
height:(int)height {
return libyuv::I420ToRGBA(
srcY, srcStrideY, srcU, srcStrideU, srcV, srcStrideV, dstRGBA, dstStrideRGBA, width, height);
}

+ (int)I420ToRGB24:(const uint8_t*)srcY
srcStrideY:(int)srcStrideY
srcU:(const uint8_t*)srcU
srcStrideU:(int)srcStrideU
srcV:(const uint8_t*)srcV
srcStrideV:(int)srcStrideV
dstRGB24:(uint8_t*)dstRGB24
dstStrideRGB24:(int)dstStrideRGB24
width:(int)width
height:(int)height {
return libyuv::I420ToRGB24(srcY,
srcStrideY,
srcU,
srcStrideU,
srcV,
srcStrideV,
dstRGB24,
dstStrideRGB24,
width,
height);
}

@end

0 comments on commit 3808ee0

Please sign in to comment.