diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj index 6f03fea1..3c806db3 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 34BDCD651D10F4E100F51996 /* CSFFMpegCaptureViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34BDCD631D10F4E100F51996 /* CSFFMpegCaptureViewController.m */; }; 34BDCD661D10F4E100F51996 /* CSFFMpegCaptureViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 34BDCD641D10F4E100F51996 /* CSFFMpegCaptureViewController.xib */; }; 34BDCD7D1D14178800F51996 /* CSFFMpegPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34BDCD7C1D14178800F51996 /* CSFFMpegPlayer.m */; }; + 34BDCD7F1D1FE4A700F51996 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 34BDCD7E1D1FE4A700F51996 /* Media.xcassets */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -39,6 +40,7 @@ 34BDCD641D10F4E100F51996 /* CSFFMpegCaptureViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CSFFMpegCaptureViewController.xib; sourceTree = ""; }; 34BDCD7B1D14178800F51996 /* CSFFMpegPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSFFMpegPlayer.h; sourceTree = ""; }; 34BDCD7C1D14178800F51996 /* CSFFMpegPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSFFMpegPlayer.m; sourceTree = ""; }; + 34BDCD7E1D1FE4A700F51996 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -55,6 +57,7 @@ 343C79B11D0C763A00B36EEC = { isa = PBXGroup; children = ( + 34BDCD7E1D1FE4A700F51996 /* Media.xcassets */, 343C79E91D0C769100B36EEC /* PluginHeaders */, 343C79BC1D0C763A00B36EEC /* CSFFMpegCapturePlugin */, 343C79BB1D0C763A00B36EEC /* Products */, @@ -163,6 +166,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 34BDCD7F1D1FE4A700F51996 /* Media.xcassets in Resources */, 34BDCD661D10F4E100F51996 /* CSFFMpegCaptureViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.h index 6a39672c..13116aec 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.h @@ -44,7 +44,6 @@ } -@property (strong) NSString *inputPath; @property (strong) CSPcmPlayer *pcmPlayer; @property (strong) CSFFMpegPlayer *player; @@ -55,5 +54,12 @@ @property (assign) double currentMovieDuration; +-(void)queuePath:(NSString *)path; + +-(void)pause; +-(void)play; +-(void)mute; +-(void)next; +-(void)back; @end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m index fc3cab5d..9d4771fb 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCapture.m @@ -10,7 +10,6 @@ @implementation CSFFMpegCapture -@synthesize inputPath = _inputPath; @synthesize currentMovieTime = _currentMovieTime; -(instancetype) init @@ -44,6 +43,60 @@ return self; } +-(void)encodeWithCoder:(NSCoder *)aCoder +{ + NSMutableArray *queuePaths = [[NSMutableArray alloc] init]; + + for (CSFFMpegInput *inp in self.player.inputQueue) + { + [queuePaths addObject:inp.mediaPath]; + } + + [aCoder encodeObject:queuePaths forKey:@"queuePaths"]; + + CSFFMpegInput *nowPlaying = self.player.currentlyPlaying; + + NSString *nPath = nil; + + if (nowPlaying) + { + nPath = nowPlaying.mediaPath; + } + + [aCoder encodeObject:nPath forKey:@"nowPlayingPath"]; + +} + + +-(instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [self init]) + { + + CSFFMpegInput *nowPlayingInput = nil; + NSString *nowPlayingPath = [aDecoder decodeObjectForKey:@"nowPlayingPath"]; + + NSArray *paths = [aDecoder decodeObjectForKey:@"queuePaths"]; + for (NSString *mPath in paths) + { + CSFFMpegInput *newInput = [[CSFFMpegInput alloc] initWithMediaPath:mPath]; + [self.player enqueueItem:newInput]; + if (nowPlayingPath && [newInput.mediaPath isEqualToString:nowPlayingPath]) + { + nowPlayingInput = newInput; + } + } + + if (nowPlayingInput) + { + self.player.currentlyPlaying = nowPlayingInput; + } + } + + return self; +} + + +(NSString *)label { return @"FFMPegPlayer"; @@ -76,25 +129,58 @@ } --(NSString *)inputPath +-(void)queuePath:(NSString *)path { - return _inputPath; -} - - --(void)setInputPath:(NSString *)inputPath -{ - _inputPath = inputPath; - if (!self.player.pcmPlayer && self.pcmPlayer) { self.player.pcmPlayer = self.pcmPlayer; } - CSFFMpegInput *newItem = [[CSFFMpegInput alloc] initWithMediaPath:_inputPath]; + CSFFMpegInput *newItem = [[CSFFMpegInput alloc] initWithMediaPath:path]; [self.player enqueueItem:newItem ]; - [self.player play]; +} + +-(void)pause +{ + if (self.player) + { + [self.player pause]; + } +} + + +-(void)play +{ + if (self.player) + { + [self.player play]; + } +} + + +-(void)mute +{ + if (self.player) + { + self.player.muted = !self.player.muted; + } +} + +-(void)next +{ + if (self.player) + { + [self.player next]; + } +} + +-(void)back +{ + if (self.player) + { + [self.player back]; + } } diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h index 7519da7f..2f323e53 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.h @@ -12,11 +12,17 @@ @interface CSFFMpegCaptureViewController : NSViewController @property (weak) CSFFMpegCapture *captureObj; +@property (weak) IBOutlet NSSegmentedControl *playlistControl; +@property (strong) IBOutlet NSArrayController *queueArrayController; + + +- (IBAction)queueTableDoubleClick:(NSTableView *)sender; - (IBAction)chooseFile:(id)sender; - (IBAction)nextAction:(id)sender; - (IBAction)sliderValueChanged:(id)sender; - (IBAction)pauseAction:(id)sender; +- (IBAction)tableControlAction:(NSSegmentedControl *)sender; @end diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m index 4a9647c7..9dc31371 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.m @@ -17,39 +17,95 @@ - (void)viewDidLoad { [super viewDidLoad]; // Do view setup here. + if (self.captureObj && self.captureObj.player) + { + self.captureObj.player.pauseStateChanged = ^{ + [self pauseStateChanged]; + }; + } } +- (IBAction)queueTableDoubleClick:(NSTableView *)sender +{ + CSFFMpegInput *inp = [self.queueArrayController.arrangedObjects objectAtIndex:sender.clickedRow]; + if (inp) + { + [self.captureObj.player playAndAddItem:inp]; + } +} + + + - (IBAction)chooseFile:(id)sender { NSOpenPanel *panel = [NSOpenPanel openPanel]; panel.canChooseDirectories = NO; - panel.canCreateDirectories = YES; + panel.canCreateDirectories = NO; panel.canChooseFiles = YES; - panel.allowsMultipleSelection = NO; + panel.allowsMultipleSelection = YES; [panel beginWithCompletionHandler:^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { - self.captureObj.inputPath = panel.URL.path; + for (NSURL *openURL in panel.URLs) + { + [self.captureObj queuePath:openURL.path]; + } } }]; } -- (IBAction)pauseAction:(id)sender +- (IBAction)tableControlAction:(NSSegmentedControl *)sender { - [self.captureObj.player pause]; + NSUInteger clicked = sender.selectedSegment; + + switch (clicked) + { + case 0: + [self.queueArrayController removeObjectsAtArrangedObjectIndexes:self.queueArrayController.selectionIndexes]; + break; + case 1: + [self.captureObj back]; + break; + case 2: + if (!self.captureObj.player.playing || self.captureObj.player.paused) + { + [self.captureObj play]; + } else { + [self.captureObj pause]; + } + break; + case 3: + [self.captureObj next]; + break; + } } -- (IBAction)nextAction:(id)sender -{ - [self.captureObj.player next]; -} +-(void)pauseStateChanged +{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.captureObj.player.paused) + { + NSImage *playImage = [[NSBundle bundleForClass:[self class]] imageForResource:@"play"]; + + [self.playlistControl setImage:playImage forSegment:2]; + + } else { + NSImage *pauseImage = [[NSBundle bundleForClass:[self class]] imageForResource:@"pause"]; + + [self.playlistControl setImage:pauseImage forSegment:2]; + + } + }); + + +} - (IBAction)sliderValueChanged:(id)sender { NSEvent *event = [[NSApplication sharedApplication] currentEvent]; @@ -59,15 +115,12 @@ if (startingDrag) { - self.captureObj.player.muted = YES; - self.captureObj.player.seeking = YES; + [self.captureObj mute]; } if (endingDrag) { - self.captureObj.player.muted = NO; - self.captureObj.player.seeking = NO; - self.captureObj.player.audio_needs_restart = YES; + [self.captureObj mute]; } } diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib index da16199d..a6a15488 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegCaptureViewController.xib @@ -7,6 +7,8 @@ + + @@ -16,59 +18,28 @@ - - - - - - - - - + - - - - - - + - + - - + + - + @@ -82,7 +53,7 @@ - + @@ -93,7 +64,7 @@ - + @@ -105,14 +76,16 @@ + + + + + + + + + + + + + - + @@ -132,7 +116,7 @@ - + @@ -140,29 +124,70 @@ - - - - + + + + + + + + + + + + + + + + + + + + - + + - + + + + @@ -175,4 +200,10 @@ + + + + + + diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h index 2dc473c9..ed356147 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.h @@ -90,6 +90,7 @@ struct frame_message { @property (assign) NSSize dimensions; @property (assign) double duration; +@property (strong) NSString *shortName; -(AVFrame *)consumeFrame:(int *)error_out; diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m index 7075ddba..abd09af3 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegInput.m @@ -30,8 +30,6 @@ _seek_queue = dispatch_queue_create("SEEK QUEUE", DISPATCH_QUEUE_SERIAL); - av_thread_message_queue_alloc(&_video_message_queue, 300, sizeof(struct frame_message)); - av_thread_message_queue_alloc(&_audio_message_queue, 4096 , sizeof(struct frame_message)); } return self; } @@ -41,6 +39,7 @@ if (self = [self init]) { self.mediaPath = mediaPath; + self.shortName = [mediaPath lastPathComponent]; } return self; @@ -55,9 +54,28 @@ return NO; } - - - + + if (!_video_message_queue) + { + av_thread_message_queue_alloc(&_video_message_queue, 300, sizeof(struct frame_message)); + } + + if (!_audio_message_queue) + { + av_thread_message_queue_alloc(&_audio_message_queue, 4096 , sizeof(struct frame_message)); + } + + av_thread_message_queue_set_err_recv(_video_message_queue, 0); + av_thread_message_queue_set_err_recv(_audio_message_queue, 0); + av_thread_message_queue_set_err_send(_video_message_queue, 0); + av_thread_message_queue_set_err_send(_audio_message_queue, 0); + + + + + + + AVCodecContext *v_codec_ctx_orig = NULL; AVCodecContext *a_codec_ctx_orig = NULL; avformat_open_input(&_format_ctx, self.mediaPath.UTF8String, NULL, NULL); @@ -111,8 +129,17 @@ } + self.is_ready = NO; + _stop_request = NO; + self.is_draining = NO; + _video_done = NO; + _audio_done = NO; + + self.duration = _format_ctx->duration / (double)AV_TIME_BASE; + + [self readAndDecodeVideoFrames:bufferVideoFrames]; @@ -338,6 +365,12 @@ -(AVFrame *)consumeFrame:(int *)error_out { + if (!_video_message_queue) + { + return NULL; + } + + if (_video_done) { return NULL; @@ -366,6 +399,7 @@ //You should run this is a gcd queue/block + -(void)readAndDecodeVideoFrames:(int)frameCnt { @@ -389,12 +423,10 @@ while (do_audio || do_video) { - if (_stop_request) { [self closeMedia]; _stop_request = NO; - return; } @@ -602,6 +634,8 @@ return ret; } + + -(void) closeMedia { diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h index 2c5a7ef4..1c0de254 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.h @@ -24,6 +24,8 @@ bool _nextFlag; int64_t _first_video_pts; bool _flushAudio; + int _doneDirection; + CSFFMpegInput *_forceNextInput; @@ -40,6 +42,8 @@ @property (assign) AudioStreamBasicDescription *asbd; @property (copy, nonatomic) void (^itemStarted)(CSFFMpegInput *); +@property (copy, nonatomic) void (^pauseStateChanged)(); + @property (assign) double lastVideoTime; @property (assign) double videoDuration; @property (assign) bool muted; @@ -51,11 +55,16 @@ -(void)nextItem; +-(void)previousItem; -(void)enqueueItem:(CSFFMpegInput *)item; -(void)play; -(void)stop; -(void)next; -(void)pause; +-(void)back; +-(void)playAndAddItem:(CSFFMpegInput *)item; + + -(void)seek:(double)toTime; -(void)startAudio; diff --git a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m index 8aad2418..7cb96cf7 100644 --- a/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m +++ b/CSFFMpegCapturePlugin/CSFFMpegCapturePlugin/CSFFMpegPlayer.m @@ -23,6 +23,7 @@ _inputQueue = [[NSMutableArray alloc] init]; _nextFlag = NO; _muted = NO; + _doneDirection = 1; } @@ -67,9 +68,8 @@ } --(void)nextItem +-(CSFFMpegInput *)preChangeItem { - CSFFMpegInput *useItem; _nextFlag = NO; @synchronized (self) { @@ -89,22 +89,99 @@ } } + if (useItem) + { + [useItem closeMedia]; + } + + + return useItem; + +} + + +-(void)previousItem +{ + CSFFMpegInput *useItem = [self preChangeItem]; + + if (!self.playing) + { + return; + } + + NSInteger currentIdx = 0; + + currentIdx = [_inputQueue indexOfObject:useItem]; + + currentIdx--; + + if (currentIdx < 0) + { + currentIdx = _inputQueue.count-1; + } + + + + CSFFMpegInput *nextItem = [_inputQueue objectAtIndex:currentIdx]; + if (nextItem) + { + [self playItem:nextItem]; + //[self removeObjectFromInputQueueAtIndex:0]; + + } + +} + + +-(void)nextItem +{ + CSFFMpegInput *useItem = [self preChangeItem]; + if (!self.playing) { return; } - CSFFMpegInput *nextItem = _inputQueue.firstObject; + NSUInteger currentIdx = 0; + + currentIdx = [_inputQueue indexOfObject:useItem]; + + currentIdx++; + + if (currentIdx >= _inputQueue.count) + { + currentIdx = 0; + } + + CSFFMpegInput *nextItem = [_inputQueue objectAtIndex:currentIdx]; if (nextItem) { [self playItem:nextItem]; - [self removeObjectFromInputQueueAtIndex:0]; + //[self removeObjectFromInputQueueAtIndex:0]; } } +-(void)playAndAddItem:(CSFFMpegInput *)item; +{ + if ([_inputQueue indexOfObject:item] == NSNotFound) + { + [self enqueueItem:item]; + } + + if (!self.playing) + { + self.currentlyPlaying = item; + [self playItem:item]; + } else { + _forceNextInput = item; + [self.currentlyPlaying stop]; + } +} + + -(void)seek:(double)toTime { if (self.currentlyPlaying) @@ -155,17 +232,36 @@ { [self nextItem]; - + } else { + [self playItem:self.currentlyPlaying]; + } + + if (self.paused) + { + [self pause]; } } -(void)next { _flushAudio = YES; + _doneDirection = 1; [self.currentlyPlaying stop]; - } +-(void)back +{ + _flushAudio = YES; + if (self.lastVideoTime >= 1.5) + { + [self seek:0.0]; + } else { + _doneDirection = -1; + [self.currentlyPlaying stop]; + } +} + + -(void)stop { self.playing = NO; @@ -253,7 +349,6 @@ if (!self.playing) break; } - NSLog(@"OUT OF LOOP"); _audio_done = YES; [self inputDone]; } @@ -270,9 +365,15 @@ } else { self.paused = YES; } + + if (self.pauseStateChanged) + { + self.pauseStateChanged(); + } } + -(CVPixelBufferRef)frameForMediaTime:(CFTimeInterval)mediaTime { CSFFMpegInput *_useInput; @@ -286,12 +387,6 @@ return nil; } - /* - if (!self.playing) - { - return nil; - }*/ - AVFrame *use_frame = NULL; CVPixelBufferRef ret = nil; @@ -407,7 +502,17 @@ { [self.currentlyPlaying stop]; + if (_forceNextInput) + { + [self preChangeItem]; + [self playItem:_forceNextInput]; + _forceNextInput = nil; + } else if (_doneDirection > 0) { [self nextItem]; + } else if (_doneDirection < 0) { + [self previousItem]; + } + } } diff --git a/CSFFMpegCapturePlugin/Media.xcassets/Contents.json b/CSFFMpegCapturePlugin/Media.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/CSFFMpegCapturePlugin/Media.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/Contents.json b/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/Contents.json new file mode 100644 index 00000000..3c0493aa --- /dev/null +++ b/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "fastforward.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/fastforward.png b/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/fastforward.png new file mode 100644 index 00000000..a64f2fa0 Binary files /dev/null and b/CSFFMpegCapturePlugin/Media.xcassets/fastforward.imageset/fastforward.png differ diff --git a/CSFFMpegCapturePlugin/Media.xcassets/pause.imageset/Contents.json b/CSFFMpegCapturePlugin/Media.xcassets/pause.imageset/Contents.json new file mode 100644 index 00000000..6aa82cf0 --- /dev/null +++ b/CSFFMpegCapturePlugin/Media.xcassets/pause.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "pause.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/CSFFMpegCapturePlugin/Media.xcassets/pause.imageset/pause.png b/CSFFMpegCapturePlugin/Media.xcassets/pause.imageset/pause.png new file mode 100644 index 00000000..35fc06a5 Binary files /dev/null and b/CSFFMpegCapturePlugin/Media.xcassets/pause.imageset/pause.png differ diff --git a/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/Contents.json b/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/Contents.json new file mode 100644 index 00000000..5f85e051 --- /dev/null +++ b/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "play.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/play.png b/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/play.png new file mode 100644 index 00000000..3e22aaa8 Binary files /dev/null and b/CSFFMpegCapturePlugin/Media.xcassets/play.imageset/play.png differ diff --git a/CSFFMpegCapturePlugin/Media.xcassets/rewind.imageset/Contents.json b/CSFFMpegCapturePlugin/Media.xcassets/rewind.imageset/Contents.json new file mode 100644 index 00000000..436dce70 --- /dev/null +++ b/CSFFMpegCapturePlugin/Media.xcassets/rewind.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "rewind.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/CSFFMpegCapturePlugin/Media.xcassets/rewind.imageset/rewind.png b/CSFFMpegCapturePlugin/Media.xcassets/rewind.imageset/rewind.png new file mode 100644 index 00000000..401ffde0 Binary files /dev/null and b/CSFFMpegCapturePlugin/Media.xcassets/rewind.imageset/rewind.png differ diff --git a/CocoaSplit/en.lproj/MainMenu.xib b/CocoaSplit/en.lproj/MainMenu.xib index e017de20..0e00ebb6 100644 --- a/CocoaSplit/en.lproj/MainMenu.xib +++ b/CocoaSplit/en.lproj/MainMenu.xib @@ -403,7 +403,7 @@ - + @@ -581,7 +581,7 @@ - - + @@ -630,7 +630,7 @@ - - - - - - - - + @@ -1558,14 +1558,14 @@ - + - + - + @@ -1597,7 +1597,7 @@ - + - + - + @@ -1676,7 +1676,7 @@ - +