diff --git a/ios/IJKMediaPlayer/IJKMediaFramework/IJKMediaFramework.h b/ios/IJKMediaPlayer/IJKMediaFramework/IJKMediaFramework.h index d0bc5265d3..9493e19d52 100644 --- a/ios/IJKMediaPlayer/IJKMediaFramework/IJKMediaFramework.h +++ b/ios/IJKMediaPlayer/IJKMediaFramework/IJKMediaFramework.h @@ -33,6 +33,7 @@ FOUNDATION_EXPORT const unsigned char IJKMediaFrameworkVersionString[]; #import #import #import +#import #import #import #import diff --git a/ios/IJKMediaPlayer/IJKMediaFrameworkWithSSL/IJKMediaFrameworkWithSSL.h b/ios/IJKMediaPlayer/IJKMediaFrameworkWithSSL/IJKMediaFrameworkWithSSL.h index 5680be283e..44cd301486 100644 --- a/ios/IJKMediaPlayer/IJKMediaFrameworkWithSSL/IJKMediaFrameworkWithSSL.h +++ b/ios/IJKMediaPlayer/IJKMediaFrameworkWithSSL/IJKMediaFrameworkWithSSL.h @@ -19,6 +19,7 @@ FOUNDATION_EXPORT const unsigned char IJKMediaFrameworkWithSSLVersionString[]; #import #import #import +#import #import #import #import diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj b/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj index 0f023aecb6..6fef8f9a23 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj +++ b/ios/IJKMediaPlayer/IJKMediaPlayer.xcodeproj/project.pbxproj @@ -7,6 +7,15 @@ objects = { /* Begin PBXBuildFile section */ + 215FF44B22B7E83500FAAD0E /* IJKFFMediaPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 215FF44922B7E83500FAAD0E /* IJKFFMediaPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 215FF44C22B7E83500FAAD0E /* IJKFFMediaPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 215FF44922B7E83500FAAD0E /* IJKFFMediaPlayer.h */; }; + 215FF44D22B7E83500FAAD0E /* IJKFFMediaPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 215FF44A22B7E83500FAAD0E /* IJKFFMediaPlayer.m */; }; + 215FF44E22B7E83500FAAD0E /* IJKFFMediaPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 215FF44A22B7E83500FAAD0E /* IJKFFMediaPlayer.m */; }; + 215FF44F22B7E83500FAAD0E /* IJKFFMediaPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 215FF44A22B7E83500FAAD0E /* IJKFFMediaPlayer.m */; }; + 21DAA1592298FEBB007B0784 /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5450AF8B1E63E59300568494 /* libcrypto.a */; }; + 21DAA15A2298FEBE007B0784 /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5450AF8C1E63E59300568494 /* libssl.a */; }; + 21DAA15B2298FEC7007B0784 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5450AF8F1E63E59800568494 /* libz.tbd */; }; + 21DAA15D2298FED6007B0784 /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 21DAA15C2298FED6007B0784 /* libbz2.tbd */; }; 4D32BC811F906E3A00CE9F03 /* IJKSDLGLViewProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D32BC801F906E3600CE9F03 /* IJKSDLGLViewProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4D32BC821F906E3B00CE9F03 /* IJKSDLGLViewProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D32BC801F906E3600CE9F03 /* IJKSDLGLViewProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4DA7F6891F2B1E270032A499 /* ijkiourlhook.c in Sources */ = {isa = PBXBuildFile; fileRef = 4DA7F6881F2B1E270032A499 /* ijkiourlhook.c */; }; @@ -271,6 +280,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 215FF44922B7E83500FAAD0E /* IJKFFMediaPlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IJKFFMediaPlayer.h; sourceTree = ""; }; + 215FF44A22B7E83500FAAD0E /* IJKFFMediaPlayer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IJKFFMediaPlayer.m; sourceTree = ""; }; + 21DAA15C2298FED6007B0784 /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; }; 454316201A66493700676070 /* ffpipeline_ios.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ffpipeline_ios.c; path = ijkmedia/ijkplayer/ios/pipeline/ffpipeline_ios.c; sourceTree = ""; }; 454316211A66493700676070 /* ffpipeline_ios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ffpipeline_ios.h; path = ijkmedia/ijkplayer/ios/pipeline/ffpipeline_ios.h; sourceTree = ""; }; 454316221A66493700676070 /* ffpipenode_ios_videotoolbox_vdec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ffpipenode_ios_videotoolbox_vdec.h; path = ijkmedia/ijkplayer/ios/pipeline/ffpipenode_ios_videotoolbox_vdec.h; sourceTree = ""; }; @@ -487,6 +499,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 21DAA15D2298FED6007B0784 /* libbz2.tbd in Frameworks */, + 21DAA15B2298FEC7007B0784 /* libz.tbd in Frameworks */, + 21DAA15A2298FEBE007B0784 /* libssl.a in Frameworks */, + 21DAA1592298FEBB007B0784 /* libcrypto.a in Frameworks */, E653C6F61BCE5A750016835A /* libavcodec.a in Frameworks */, E653C6F81BCE5A750016835A /* libavfilter.a in Frameworks */, E653C6FA1BCE5A750016835A /* libavformat.a in Frameworks */, @@ -656,6 +672,7 @@ E6903EBB17EAF6C500CFD954 /* Frameworks */ = { isa = PBXGroup; children = ( + 21DAA15C2298FED6007B0784 /* libbz2.tbd */, 5450AF8F1E63E59800568494 /* libz.tbd */, 5450AF8B1E63E59300568494 /* libcrypto.a */, 5450AF8C1E63E59300568494 /* libssl.a */, @@ -674,6 +691,8 @@ E66F8DE617EFD9C300354D80 /* IJKFFMoviePlayerController.m */, E6F727B917F2D9D30043623F /* IJKFFMoviePlayerDef.h */, E6F727BA17F2D9D30043623F /* IJKFFMoviePlayerDef.m */, + 215FF44922B7E83500FAAD0E /* IJKFFMediaPlayer.h */, + 215FF44A22B7E83500FAAD0E /* IJKFFMediaPlayer.m */, E62139BC180FA89A00553533 /* IJKFFOptions.h */, E62139BD180FA89A00553533 /* IJKFFOptions.m */, E6903FCC17EAFC6100CFD954 /* ijkmedia */, @@ -967,6 +986,7 @@ 5450B0251E63EA4300568494 /* ijkdict.h in Headers */, 5450B0261E63EA4300568494 /* IJKAVMoviePlayerController.h in Headers */, 5450B0271E63EA4300568494 /* ijksdl_gles2.h in Headers */, + 215FF44C22B7E83500FAAD0E /* IJKFFMediaPlayer.h in Headers */, 5450B0281E63EA4300568494 /* ijksdl_egl.h in Headers */, 549385C41E640456001AE08D /* IJKMediaFrameworkWithSSL.h in Headers */, 5450B0291E63EA4300568494 /* ff_ffplay_options.h in Headers */, @@ -1008,6 +1028,7 @@ E654EAE81B6B295200B0F2D0 /* IJKAVMoviePlayerController.h in Headers */, E6C459841C7030AA004831EC /* ijksdl_gles2.h in Headers */, E6C459BB1C706A13004831EC /* ijksdl_egl.h in Headers */, + 215FF44B22B7E83500FAAD0E /* IJKFFMediaPlayer.h in Headers */, E6C459BD1C7089AB004831EC /* ff_ffplay_options.h in Headers */, E654EA8F1B6B27E600B0F2D0 /* IJKMediaFramework.h in Headers */, E6C2E7BE1C92BD3600E59229 /* IJKKVOController.h in Headers */, @@ -1223,6 +1244,7 @@ 5450AFE31E63EA4300568494 /* ijklivehook.c in Sources */, 5450AFE41E63EA4300568494 /* ijkurlhook.c in Sources */, 5450AFE51E63EA4300568494 /* IJKVideoToolBoxSync.m in Sources */, + 215FF44E22B7E83500FAAD0E /* IJKFFMediaPlayer.m in Sources */, 5450AFE61E63EA4300568494 /* IJKMediaPlayback.m in Sources */, 5450AFE71E63EA4300568494 /* ijkdict.c in Sources */, 5450AFE81E63EA4300568494 /* ff_ffpipeline.c in Sources */, @@ -1314,6 +1336,7 @@ E69BE5721B946FF600AFBA3F /* ijklivehook.c in Sources */, 54A029BA1D4700E6001C61C1 /* ijkurlhook.c in Sources */, 5407EC2E1DF81D2600457BFE /* IJKVideoToolBoxSync.m in Sources */, + 215FF44D22B7E83500FAAD0E /* IJKFFMediaPlayer.m in Sources */, E654EAA51B6B283700B0F2D0 /* IJKMediaPlayback.m in Sources */, 54CF8A491E15287D00309DD5 /* ijkdict.c in Sources */, E654EAB01B6B285900B0F2D0 /* ff_ffpipeline.c in Sources */, @@ -1371,6 +1394,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 215FF44F22B7E83500FAAD0E /* IJKFFMediaPlayer.m in Sources */, E654EA9C1B6B27E600B0F2D0 /* IJKMediaFrameworkTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1426,7 +1450,7 @@ "$(inherited)", "\"$(SRCROOT)/../build/universal/lib\"", ); - MACH_O_TYPE = mh_dylib; + MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ( "-read_only_relocs", @@ -1477,7 +1501,7 @@ "$(inherited)", "\"$(SRCROOT)/../build/universal/lib\"", ); - MACH_O_TYPE = mh_dylib; + MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ( "-read_only_relocs", diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMediaPlayer.h b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMediaPlayer.h new file mode 100644 index 0000000000..93e5740d33 --- /dev/null +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMediaPlayer.h @@ -0,0 +1,56 @@ +/* + * IJKFFMoviePlayerDef.m + * + * Copyright (c) 2019 Befovy + * + * This file is part of ijkPlayer. + * + * ijkPlayer is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * ijkPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with ijkPlayer; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#import +#import "IJKFFOptions.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface IJKFFMediaPlayer : NSObject + + +- (IJKFFMediaPlayer *)init; + +@property (readonly, nonatomic) int videoWidth; +@property (readonly, nonatomic) int videoHeight; +@property (readonly, nonatomic) int videoSarNum; +@property (readonly, nonatomic) int videoSarDen; + +- (void) setDataSource:(NSString *)url; +- (void) prepareAsync; +- (void) start; +- (void) stop; +- (void) pause; +- (BOOL) isPlaying; +- (void) shutdown; + +- (void)setOptionValue:(NSString *)value + forKey:(NSString *)key + ofCategory:(IJKFFOptionCategory)category; + +- (void)setOptionIntValue:(int64_t)value + forKey:(NSString *)key + ofCategory:(IJKFFOptionCategory)category; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMediaPlayer.m b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMediaPlayer.m new file mode 100644 index 0000000000..65e2b71e7e --- /dev/null +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFMediaPlayer.m @@ -0,0 +1,219 @@ +/* + * IJKFFMoviePlayerDef.m + * + * Copyright (c) 2019 Befovy + * + * This file is part of ijkPlayer. + * + * ijkPlayer is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * ijkPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with ijkPlayer; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#import "IJKFFMediaPlayer.h" + +#import "IJKFFMoviePlayerDef.h" +#import "IJKAudioKit.h" +#import "IJKFFOptions.h" +#import "ijkplayer/ijkplayer.h" + + +@interface IJKFFWeakHolder : NSObject +@property (nonatomic, weak) id object; +@end + +@implementation IJKFFWeakHolder +@end + + +@implementation IJKFFMediaPlayer { + IjkMediaPlayer* _nativeMediaPlayer; + IJKFFMoviePlayerMessagePool *_msgPool; + + NSString *_dataSource; + int _videoWidth; + int _videoHeight; + int _videoSarNum; + int _videoSarDen; +} + +- (IJKFFMoviePlayerMessage *) obtainMessage { + return [_msgPool obtain]; +} + +inline static IJKFFMediaPlayer *ffplayerRetain(void *arg) { + return (__bridge_transfer IJKFFMediaPlayer *) arg; +} + +int ff_media_player_msg_loop(void* arg) +{ + @autoreleasepool { + IjkMediaPlayer *mp = (IjkMediaPlayer*)arg; + __weak IJKFFMediaPlayer *ffPlayer = ffplayerRetain(ijkmp_set_weak_thiz(mp, NULL)); + while (ffPlayer) { + @autoreleasepool { + IJKFFMoviePlayerMessage *msg = [ffPlayer obtainMessage]; + if (!msg) + break; + + int retval = ijkmp_get_msg(mp, &msg->_msg, 1); + if (retval < 0) + break; + + // block-get should never return 0 + assert(retval > 0); + [ffPlayer performSelectorOnMainThread:@selector(postEvent:) withObject:msg waitUntilDone:NO]; + } + } + + // retained in prepare_async, before SDL_CreateThreadEx + ijkmp_dec_ref_p(&mp); + return 0; + } +} + +- (IJKFFMediaPlayer *)init +{ + self = [super init]; + if (self) { + ijkmp_global_init(); + _msgPool = [[IJKFFMoviePlayerMessagePool alloc] init]; + + [self nativeSetup]; + + ijkmp_set_option(_nativeMediaPlayer, IJKMP_OPT_CATEGORY_PLAYER, "overlay-format", "fcc-_es2"); + + [[IJKAudioKit sharedInstance] setupAudioSession]; + } + return self; +} + +- (void) nativeSetup +{ + _nativeMediaPlayer = ijkmp_ios_create(ff_media_player_msg_loop); + + IJKFFWeakHolder *weakHolder = [[IJKFFWeakHolder alloc] init]; + weakHolder.object = self; + + ijkmp_set_weak_thiz(_nativeMediaPlayer, (__bridge_retained void *) self); + ijkmp_set_inject_opaque(_nativeMediaPlayer, (__bridge_retained void *) weakHolder); + ijkmp_set_ijkio_inject_opaque(_nativeMediaPlayer, (__bridge_retained void *) weakHolder); +} + +- (void)postEvent: (IJKFFMoviePlayerMessage *)msg +{ + if (!msg) + return; + + AVMessage *avmsg = &msg->_msg; + switch (avmsg->what) { + case FFP_MSG_FLUSH: + break; + case FFP_MSG_ERROR: + break; + case FFP_MSG_PREPARED: + break; + + default: + break; + } + [_msgPool recycle:msg]; +} + + +- (void) setSurface +{ + +} + +- (void) prepareAsync +{ + ijkmp_prepare_async(_nativeMediaPlayer); +} + +- (void) setDataSource:(NSString *)url +{ + _dataSource = url; + ijkmp_set_data_source(_nativeMediaPlayer, [url UTF8String]); +} + + +- (void) start +{ + ijkmp_start(_nativeMediaPlayer); +} + +- (void) stop +{ + ijkmp_stop(_nativeMediaPlayer); +} + +- (void) pause +{ + ijkmp_pause(_nativeMediaPlayer); +} + + +- (BOOL) isPlaying +{ + return ijkmp_is_playing(_nativeMediaPlayer); +} + +- (long) getCurrentPosition +{ + return ijkmp_get_current_position(_nativeMediaPlayer); +} + +- (long) getDuration +{ + return ijkmp_get_duration(_nativeMediaPlayer); +} + +- (void) seekTo:(long) msec +{ + ijkmp_seek_to(_nativeMediaPlayer, msec); +} + +- (void) shutdown +{ + ijkmp_shutdown(_nativeMediaPlayer); + + __unused id weakPlayer = (__bridge_transfer IJKFFMediaPlayer*)ijkmp_set_weak_thiz(_nativeMediaPlayer, NULL); + __unused id weakHolder = (__bridge_transfer IJKFFWeakHolder*)ijkmp_set_inject_opaque(_nativeMediaPlayer, NULL); + __unused id weakijkHolder = (__bridge_transfer IJKFFWeakHolder*)ijkmp_set_ijkio_inject_opaque(_nativeMediaPlayer, NULL); + ijkmp_dec_ref_p(&_nativeMediaPlayer); +} + +- (void) reset +{ + [self shutdown]; + [self nativeSetup]; +} + + +- (void)setOptionValue:(NSString *)value + forKey:(NSString *)key + ofCategory:(IJKFFOptionCategory)category +{ + ijkmp_set_option(_nativeMediaPlayer, category, [key UTF8String], [value UTF8String]); +} + +- (void)setOptionIntValue:(int64_t)value + forKey:(NSString *)key + ofCategory:(IJKFFOptionCategory)category +{ + ijkmp_set_option_int(_nativeMediaPlayer, category, [key UTF8String], value); +} + + +@end diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/ijkmedia/ijksdl/ios/IJKSDLGLView.m b/ios/IJKMediaPlayer/IJKMediaPlayer/ijkmedia/ijksdl/ios/IJKSDLGLView.m index c3162776e0..0a9b15e110 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/ijkmedia/ijksdl/ios/IJKSDLGLView.m +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/ijkmedia/ijksdl/ios/IJKSDLGLView.m @@ -61,6 +61,7 @@ @implementation IJKSDLGLView { BOOL _didLockedDueToMovedToWindow; BOOL _shouldLockWhileBeingMovedToWindow; NSMutableArray *_registeredNotifications; + CAEAGLLayer *_eaglLayer; IJKSDLGLViewApplicationState _applicationState; } @@ -140,17 +141,12 @@ - (BOOL)setupEAGLContext:(EAGLContext *)context return YES; } -- (CAEAGLLayer *)eaglLayer -{ - return (CAEAGLLayer*) self.layer; -} - - (BOOL)setupGL { if (_didSetupGL) return YES; - CAEAGLLayer *eaglLayer = (CAEAGLLayer*) self.layer; + CAEAGLLayer *eaglLayer = _eaglLayer; eaglLayer.opaque = YES; eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, @@ -190,6 +186,7 @@ - (BOOL)setupGLOnce if (![self tryLockGLActive]) return NO; + _eaglLayer = (CAEAGLLayer*) self.layer; BOOL didSetupGL = [self setupGL]; [self unlockGLActive]; return didSetupGL; @@ -206,10 +203,12 @@ - (BOOL)isApplicationActive UIApplicationState appState = [UIApplication sharedApplication].applicationState; switch (appState) { case UIApplicationStateActive: + _applicationState = IJKSDLGLViewApplicationForegroundState; return YES; case UIApplicationStateInactive: case UIApplicationStateBackground: default: + _applicationState = IJKSDLGLViewApplicationBackgroundState; return NO; } } @@ -371,14 +370,14 @@ - (void)displayInternal: (SDL_VoutOverlay *) overlay return; } - [[self eaglLayer] setContentsScale:_scaleFactor]; + [_eaglLayer setContentsScale:_scaleFactor]; if (_isRenderBufferInvalidated) { NSLog(@"IJKSDLGLView: renderbufferStorage fromDrawable\n"); _isRenderBufferInvalidated = NO; glBindRenderbuffer(GL_RENDERBUFFER, _renderbuffer); - [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; + [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_backingWidth); glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight); IJK_GLES2_Renderer_setGravity(_renderer, _rendererGravity, _backingWidth, _backingHeight);