diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerController.m b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerController.m index 9a9e6e9e2d92cc3517231777adaf238568eb7d8f..e480874f06734d5f93d0f49ec5a7a536ed924ab1 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerController.m +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerController.m @@ -12,6 +12,7 @@ @implementation IJKFFPlayerController { NSURL *_url; IjkMediaPlayer *_mediaPlayer; + IJKFFPlayerMessagePool *_msgPool; } @synthesize view = _view; @@ -29,6 +30,8 @@ _url = aUrl; _mediaPlayer = ijkmp_ios_create(media_player_msg_loop); + _msgPool = [[IJKFFPlayerMessagePool alloc] init]; + ijkmp_set_weak_thiz(_mediaPlayer, (__bridge_retained void *) self); IJKSDLGLView *glView = [[IJKSDLGLView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; @@ -205,6 +208,12 @@ NSLog(@"unknown FFP_MSG_xxx(%d)", avmsg->what); break; } + + [_msgPool recycle:msg]; +} + +- (IJKFFPlayerMessage *) obtainMessage { + return [_msgPool obtain]; } inline static IJKFFPlayerController *ffplayerRetain(void *arg) { @@ -219,7 +228,10 @@ int media_player_msg_loop(void* arg) while (ffpController && true) { @autoreleasepool { - IJKFFPlayerMessage *msg = [[IJKFFPlayerMessage alloc] init]; + IJKFFPlayerMessage *msg = [ffpController obtainMessage]; + if (!msg) + break; + int retval = ijkmp_get_msg(mp, &msg->_msg, 1); if (retval < 0) break; diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerDef.h b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerDef.h index c27556d785a14060f76c5d273be5ec8c016fd350..4b7075997c15bdb99cd21872aef53a11c28daf40 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerDef.h +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerDef.h @@ -16,6 +16,14 @@ @end +@interface IJKFFPlayerMessagePool : NSObject + +- (IJKFFPlayerMessagePool *)init; +- (IJKFFPlayerMessage *) obtain; +- (void) recycle:(IJKFFPlayerMessage *)msg; + +@end + struct IJKSize { NSInteger width; diff --git a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerDef.m b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerDef.m index 9ffa7856ef1d55d1558b712e0f3ed58f48c05fd0..5beeb3e409507ee90132f4fd5aae4516e2aae388 100644 --- a/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerDef.m +++ b/ios/IJKMediaPlayer/IJKMediaPlayer/IJKFFPlayerDef.m @@ -9,4 +9,48 @@ #import "IJKFFPlayerDef.h" @implementation IJKFFPlayerMessage +@end + +@implementation IJKFFPlayerMessagePool{ + NSMutableArray *_array; +} + +- (IJKFFPlayerMessagePool *)init +{ + self = [super init]; + if (self) { + _array = [[NSMutableArray alloc] init]; + } + return self; +} + +- (IJKFFPlayerMessage *) obtain +{ + IJKFFPlayerMessage *msg = nil; + + @synchronized(self) { + NSUInteger count = [_array count]; + if (count > 0) { + msg = [_array objectAtIndex:count - 1]; + [_array removeLastObject]; + } + } + + if (!msg) + msg = [[IJKFFPlayerMessage alloc] init]; + + return msg; +} + +- (void) recycle:(IJKFFPlayerMessage *)msg +{ + if (!msg) + return; + + @synchronized(self) { + if ([_array count] <= 10) + [_array addObject:msg]; + } +} + @end \ No newline at end of file