Skip to content

Commit

Permalink
feat(Apple): support set CicadaRenderDelegate
Browse files Browse the repository at this point in the history
  • Loading branch information
skufly authored and pingkai committed May 12, 2020
1 parent 2d46589 commit 839f3a0
Show file tree
Hide file tree
Showing 8 changed files with 110 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#import "CicadaErrorModel+string.h"
#import "AFNetworking.h"

@interface CicadaPlayerViewController ()<CicadaDemoViewDelegate,CicadaSettingAndConfigViewDelegate,CicadaDelegate,CicadaAudioSessionDelegate>
@interface CicadaPlayerViewController ()<CicadaDemoViewDelegate,CicadaSettingAndConfigViewDelegate,CicadaDelegate,CicadaAudioSessionDelegate, CicadaRenderDelegate>

/**
播放视图
Expand Down Expand Up @@ -108,6 +108,8 @@ - (void)viewDidLoad {
self.player.enableHardwareDecoder = [CicadaTool isHardware];
self.player.playerView = self.CicadaView.playerView;
self.player.delegate = self;
//enable to test render delegate
// self.player.renderDelegate = self;
self.player.scalingMode = CICADA_SCALINGMODE_SCALEASPECTFIT;
[self.settingAndConfigView setVolume:self.player.volume/2];
[self setConfig];
Expand Down Expand Up @@ -796,4 +798,17 @@ - (BOOL)setCategory:(AVAudioSessionCategory)category mode:(AVAudioSessionMode)mo
return NO;
}

- (BOOL)onVideoPixelBuffer:(CVPixelBufferRef)pixelBuffer pts:(int64_t)pts
{
NSLog(@"receive HW frame:%p pts:%lld", pixelBuffer, pts);
return NO;
}

- (BOOL)onVideoRawBuffer:(uint8_t **)buffer lineSize:(int32_t *)lineSize pts:(int64_t)pts width:(int32_t)width height:(int32_t)height
{
NSLog(@"receive SW frame:%p pts:%lld line0:%d line1:%d line2:%d width:%d, height:%d", buffer, pts,
lineSize[0], lineSize[1], lineSize[2], width, height);
return NO;
}

@end
4 changes: 4 additions & 0 deletions platform/Apple/source/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ set(SOURCE_LIST
CicadaSource.h
CicadaDelegate.h
CicadaErrorCode.h
CicadaRenderDelegate.h
CicadaRenderCBWrapper.h
CicadaRenderCBWrapper.mm
${TOP_DIR}/framework/render/audio/Apple/CicadaAudioSessionDelegate.h
thumbnail/CicadaThumbnail.h
thumbnail/CicadaThumbnail.mm
Expand Down Expand Up @@ -102,6 +105,7 @@ set(PUBLIC_HEADERS
CicadaPlayerSDK.h
CicadaDelegate.h
CicadaErrorCode.h
CicadaRenderDelegate.h
${TOP_DIR}/framework/render/audio/Apple/CicadaAudioSessionDelegate.h
)

Expand Down
6 changes: 6 additions & 0 deletions platform/Apple/source/CicadaPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#import <Foundation/Foundation.h>
#import "CicadaDelegate.h"
#import "CicadaRenderDelegate.h"
#import "CicadaSource.h"
#import "CicadaDef.h"
#import "CicadaMediaInfo.h"
Expand Down Expand Up @@ -504,6 +505,11 @@ OBJC_EXPORT
*/
@property (nonatomic, weak) id<CicadaDelegate> delegate;

/**
* 设置渲染回调。
*/
@property(nonatomic, weak) id <CicadaRenderDelegate> renderDelegate;

- (void)setInnerDelegate:(id<CicadaDelegate>) delegate;

/**
Expand Down
9 changes: 9 additions & 0 deletions platform/Apple/source/CicadaPlayer.mm
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#import "thumbnail/CicadaThumbnail.h"
#import "CicadaOCHelper.h"
#import "AFAudioSession.h"
#import "CicadaRenderCBWrapper.h"

using namespace std;
using namespace Cicada;
Expand Down Expand Up @@ -417,6 +418,14 @@ - (void)stop
[self resetProperty];
}

- (void) setRenderDelegate:(id<CicadaRenderDelegate>)theDelegate
{
_renderDelegate = theDelegate;
if (self.player) {
self.player->SetOnRenderFrameCallback(CicadaRenderCBWrapper::OnRenderFrame, (__bridge void*)theDelegate);
}
}

- (void)setInnerDelegate:(id<CicadaDelegate>) delegate
{
mHelper->setDelegate(delegate);
Expand Down
2 changes: 2 additions & 0 deletions platform/Apple/source/CicadaPlayerSDK.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,5 @@
#import <CicadaPlayerSDK/CicadaPlayerGlobalSettings.h>
#import <CicadaPlayerSDK/CicadaSyncPlayerClient.h>
#import <CicadaPlayerSDK/CicadaSyncPlayerServer.h>
#import <CicadaPlayerSDK/CicadaAudioSessionDelegate.h>
#import <CicadaPlayerSDK/CicadaRenderDelegate.h>
13 changes: 13 additions & 0 deletions platform/Apple/source/CicadaRenderCBWrapper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

#ifndef CicadaRenderCBWrapper_H
#define CicadaRenderCBWrapper_H

class IAFFrame;

class CicadaRenderCBWrapper {
public:
static bool OnRenderFrame(void *userData, IAFFrame *frame);
};


#endif //CicadaRenderCBWrapper_H
37 changes: 37 additions & 0 deletions platform/Apple/source/CicadaRenderCBWrapper.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#import "CicadaRenderCBWrapper.h"
#import <base/media/PBAFFrame.h>
#import "CicadaRenderDelegate.h"

bool CicadaRenderCBWrapper::OnRenderFrame(void *userData, IAFFrame *frame)
{
id<CicadaRenderDelegate> delegate = (__bridge id<CicadaRenderDelegate>)userData;
if (nullptr == delegate) {
return false;
}

if (frame->getType() == IAFFrame::FrameTypeVideo) {
switch (frame->getInfo().format) {
case AF_PIX_FMT_APPLE_PIXEL_BUFFER: {
auto *ppBFrame = dynamic_cast<PBAFFrame *>(frame);
CVPixelBufferRef pixelBuffer = ppBFrame->getPixelBuffer();
if ([delegate respondsToSelector:@selector(onVideoPixelBuffer:pts:)]){
return [delegate onVideoPixelBuffer:pixelBuffer pts:frame->getInfo().pts];
}
break;
}
case AF_PIX_FMT_YUV420P:
if ([delegate respondsToSelector:@selector(onVideoPixelBuffer:pts:)]){
return [delegate onVideoRawBuffer:frame->getData()
lineSize:frame->getLineSize()
pts:frame->getInfo().pts
width:frame->getInfo().video.width
height:frame->getInfo().video.height];
}
break;
default:
break;
}
}

return false;
}
23 changes: 23 additions & 0 deletions platform/Apple/source/CicadaRenderDelegate.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@

#import <Foundation/Foundation.h>

@protocol CicadaRenderDelegate <NSObject>
@optional

/**
* 视频硬解渲染帧回调
* @param pixelBuffer 渲染帧
* @param pts 渲染帧pts
* @return 返回YES则SDK不再显示(暂不支持);返回NO则SDK渲染模块继续渲染
*/
- (BOOL)onVideoPixelBuffer:(CVPixelBufferRef)pixelBuffer pts:(int64_t)pts;

/**
* 视频软解渲染帧回调
* @param pixelBuffer 渲染帧
* @param pts 渲染帧pts
* @return 返回YES则SDK不再显示(暂不支持);返回NO则SDK渲染模块继续渲染
*/
- (BOOL)onVideoRawBuffer:(uint8_t **)buffer lineSize:(int32_t *)lineSize pts:(int64_t)pts width:(int32_t)width height:(int32_t)height;

@end

0 comments on commit 839f3a0

Please sign in to comment.