diff options
author | ritsuka <[email protected]> | 2013-11-04 07:09:50 +0000 |
---|---|---|
committer | ritsuka <[email protected]> | 2013-11-04 07:09:50 +0000 |
commit | 85df20369cf73f5115a1707a47a7ac52f2881efb (patch) | |
tree | 65f37715730a25b1a4456e0c1930bbc28c8bc2e5 /macosx | |
parent | d0bfc7cd9a4df6c6277f78161241ec8b93cac8f5 (diff) |
MacGUI: Refactor HBPreviewController. Rename the actual class to HBPreviewController, and move the image and video creation code to a separate HBPreviewGenerator class. Update the preview duration list as Rodeo suggested.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@5874 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'macosx')
-rw-r--r-- | macosx/Controller.h | 2 | ||||
-rw-r--r-- | macosx/Controller.m | 11 | ||||
-rw-r--r-- | macosx/English.lproj/PicturePreview.xib | 2479 | ||||
-rw-r--r-- | macosx/HBPreviewController.h | 127 | ||||
-rw-r--r-- | macosx/HBPreviewController.m | 1822 | ||||
-rw-r--r-- | macosx/HBPreviewGenerator.h | 33 | ||||
-rw-r--r-- | macosx/HBPreviewGenerator.m | 423 | ||||
-rw-r--r-- | macosx/HandBrake.xcodeproj/project.pbxproj | 6 | ||||
-rw-r--r-- | macosx/PictureController.m | 31 |
9 files changed, 2270 insertions, 2664 deletions
diff --git a/macosx/Controller.h b/macosx/Controller.h index cd6cd016c..dc36ccc27 100644 --- a/macosx/Controller.h +++ b/macosx/Controller.h @@ -57,7 +57,7 @@ BOOL fIsDragging; HBPictureController * fPictureController; /* Picture Preview */ - PreviewController * fPreviewController; + HBPreviewController * fPreviewController; /* x264 Presets Box */ NSArray * fX264PresetNames; diff --git a/macosx/Controller.m b/macosx/Controller.m index 413963b1d..cd3f98bfa 100644 --- a/macosx/Controller.m +++ b/macosx/Controller.m @@ -209,9 +209,9 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It // Set the Growl Delegate [GrowlApplicationBridge setGrowlDelegate: self]; /* Init others controllers */ - [fPictureController setHandle: fHandle]; [fPictureController setDelegate: self]; - + [fPictureController setHandle: fHandle]; + [fQueueController setHandle: fQueueEncodeLibhb]; [fQueueController setHBController: self]; @@ -1941,7 +1941,9 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It // Notify Subtitles that there's no title [fSubtitlesDelegate resetWithTitle:nil]; [fSubtitlesTable reloadData]; - + + [fPictureController setTitle:NULL]; + // Notify anyone interested (audio controller) that there's no title [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: HBTitleChangedNotification @@ -2077,6 +2079,9 @@ static NSString * ChooseSourceIdentifier = @"Choose Source It [fChapterTitlesDelegate resetWithTitle:nil]; [fChapterTable reloadData]; + // Notify PictureController that there's no title + [fPictureController setTitle:NULL]; + // Notify anyone interested (audio controller) that there's no title [[NSNotificationCenter defaultCenter] postNotification: [NSNotification notificationWithName: HBTitleChangedNotification diff --git a/macosx/English.lproj/PicturePreview.xib b/macosx/English.lproj/PicturePreview.xib index 3740cac7e..2f0f337e3 100644 --- a/macosx/English.lproj/PicturePreview.xib +++ b/macosx/English.lproj/PicturePreview.xib @@ -1,26 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> -<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> +<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00"> <data> - <int key="IBDocument.SystemTarget">1050</int> - <string key="IBDocument.SystemVersion">12D61</string> - <string key="IBDocument.InterfaceBuilderVersion">3084</string> - <string key="IBDocument.AppKitVersion">1187.37</string> - <string key="IBDocument.HIToolboxVersion">626.00</string> - <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.QTKitIBPlugin</string> - </object> - <object class="NSArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>3084</string> - <string>2053</string> - </object> - </object> - <object class="NSArray" key="IBDocument.IntegratedClassDependencies"> - <bool key="EncodedWithXMLCoder">YES</bool> + <int key="IBDocument.SystemTarget">1060</int> + <string key="IBDocument.SystemVersion">13A603</string> + <string key="IBDocument.InterfaceBuilderVersion">4511</string> + <string key="IBDocument.AppKitVersion">1265</string> + <string key="IBDocument.HIToolboxVersion">695.00</string> + <dictionary class="NSMutableDictionary" key="IBDocument.PluginVersions"> + <string key="com.apple.InterfaceBuilder.CocoaPlugin">4511</string> + <string key="com.apple.QTKitIBPlugin">3336</string> + </dictionary> + <array key="IBDocument.IntegratedClassDependencies"> <string>NSBox</string> <string>NSButton</string> <string>NSButtonCell</string> @@ -37,60 +27,52 @@ <string>NSView</string> <string>NSWindowTemplate</string> <string>QTMovieView</string> - </object> - <object class="NSArray" key="IBDocument.PluginDependencies"> - <bool key="EncodedWithXMLCoder">YES</bool> + </array> + <array key="IBDocument.PluginDependencies"> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.QTKitIBPlugin</string> - </object> + </array> <object class="NSMutableDictionary" key="IBDocument.Metadata"> <string key="NS.key.0">PluginDependencyRecalculationVersion</string> <integer value="1" key="NS.object.0"/> </object> - <object class="NSMutableArray" key="IBDocument.RootObjects" id="273418435"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSCustomObject" id="355312334"> - <string key="NSClassName">PreviewController</string> + <array class="NSMutableArray" key="IBDocument.RootObjects" id="24783728"> + <object class="NSCustomObject" id="1036052779"> + <string key="NSClassName">HBPreviewController</string> </object> - <object class="NSCustomObject" id="844574444"> + <object class="NSCustomObject" id="525801383"> <string key="NSClassName">FirstResponder</string> </object> - <object class="NSCustomObject" id="837220151"> + <object class="NSCustomObject" id="460582123"> <string key="NSClassName">NSApplication</string> </object> - <object class="NSWindowTemplate" id="616825745"> + <object class="NSWindowTemplate" id="133213351"> <int key="NSWindowStyleMask">7</int> <int key="NSWindowBacking">2</int> <string key="NSWindowRect">{{142, 519}, {490, 360}}</string> <int key="NSWTFlags">1886913536</int> <string key="NSWindowTitle">HandBrake Preview</string> <string key="NSWindowClass">NSPanel</string> - <object class="NSMutableString" key="NSViewClass"> - <characters key="NS.bytes">View</characters> - </object> + <nil key="NSViewClass"/> <nil key="NSUserInterfaceItemIdentifier"/> - <object class="NSView" key="NSWindowView" id="49161063"> + <object class="NSView" key="NSWindowView" id="929670820"> <reference key="NSNextResponder"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="QTMovieView" id="48693112"> - <reference key="NSNextResponder" ref="49161063"/> - <int key="NSvFlags">274</int> - <object class="NSMutableSet" key="NSDragTypes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="set.sortedObjects"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>Apple URL pasteboard type</string> - <string>CorePasteboardFlavorType 0x6D6F6F76</string> - <string>NSFilenamesPboardType</string> - <string>QTMoviePasteboardType</string> - </object> - </object> + <int key="NSvFlags">1810</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="QTMovieView" id="703812881"> + <reference key="NSNextResponder" ref="929670820"/> + <int key="NSvFlags">1810</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <set class="NSMutableSet" key="NSDragTypes"> + <string>Apple URL pasteboard type</string> + <string>CorePasteboardFlavorType 0x6D6F6F76</string> + <string>NSFilenamesPboardType</string> + <string>QTMoviePasteboardType</string> + </set> <string key="NSFrameSize">{490, 360}</string> - <reference key="NSSuperview" ref="49161063"/> + <reference key="NSSuperview" ref="929670820"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="768906858"/> + <reference key="NSNextKeyView" ref="758551503"/> <object class="NSColor" key="kCoderFillColor"> <int key="NSColorSpace">1</int> <bytes key="NSRGB">MC44MDAwMDAwMSAwLjgwMDAwMDAxIDAuODAwMDAwMDEAA</bytes> @@ -100,163 +82,120 @@ <nil key="kCoderMovie"/> <boolean value="NO" key="kCoderEditable"/> </object> - <object class="NSBox" id="92351498"> - <reference key="NSNextResponder" ref="49161063"/> - <int key="NSvFlags">-2147483611</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSView" id="385854969"> - <reference key="NSNextResponder" ref="92351498"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSButton" id="798240356"> - <reference key="NSNextResponder" ref="385854969"/> - <int key="NSvFlags">292</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> + <object class="NSBox" id="717764450"> + <reference key="NSNextResponder" ref="929670820"/> + <int key="NSvFlags">-2147482075</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSView" id="378084343"> + <reference key="NSNextResponder" ref="717764450"/> + <int key="NSvFlags">1810</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSButton" id="314619144"> + <reference key="NSNextResponder" ref="378084343"/> + <int key="NSvFlags">1828</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{17, 11}, {77, 16}}</string> - <reference key="NSSuperview" ref="385854969"/> + <reference key="NSSuperview" ref="378084343"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="66510867"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> + <reference key="NSNextKeyView" ref="794567820"/> + <string key="NSHuggingPriority">{250, 750}</string> <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="975305481"> + <object class="NSButtonCell" key="NSCell" id="992719048"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">134479872</int> <string key="NSContents">Live Preview</string> <object class="NSFont" key="NSSupport" id="22"> - <string key="NSName">LucidaGrande</string> + <string key="NSName">.LucidaGrandeUI</string> <double key="NSSize">9</double> <int key="NSfFlags">3614</int> </object> - <reference key="NSControlView" ref="798240356"/> + <reference key="NSControlView" ref="314619144"/> <int key="NSButtonFlags">-2038284288</int> <int key="NSButtonFlags2">129</int> - <reference key="NSAlternateImage" ref="22"/> + <object class="NSFont" key="NSAlternateImage" id="563492427"> + <string key="NSName">.LucidaGrandeUI</string> + <double key="NSSize">9</double> + <int key="NSfFlags">16</int> + </object> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSButton" id="141370142"> - <reference key="NSNextResponder" ref="385854969"/> - <int key="NSvFlags">289</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <string key="NSFrame">{{370, 11}, {59, 16}}</string> - <reference key="NSSuperview" ref="385854969"/> + <object class="NSButton" id="394714670"> + <reference key="NSNextResponder" ref="378084343"/> + <int key="NSvFlags">1825</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{380, 11}, {59, 16}}</string> + <reference key="NSSuperview" ref="378084343"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="700607930"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> + <reference key="NSNextKeyView" ref="432685731"/> + <string key="NSHuggingPriority">{250, 750}</string> <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="606007744"> + <object class="NSButtonCell" key="NSCell" id="690045799"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">134479872</int> <string key="NSContents">Settings</string> <reference key="NSSupport" ref="22"/> - <reference key="NSControlView" ref="141370142"/> + <reference key="NSControlView" ref="394714670"/> <int key="NSButtonFlags">-2038284288</int> <int key="NSButtonFlags2">129</int> - <reference key="NSAlternateImage" ref="22"/> + <reference key="NSAlternateImage" ref="563492427"/> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSButton" id="81685190"> - <reference key="NSNextResponder" ref="385854969"/> - <int key="NSvFlags">289</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <string key="NSFrame">{{272, 11}, {92, 16}}</string> - <reference key="NSSuperview" ref="385854969"/> + <object class="NSButton" id="327371770"> + <reference key="NSNextResponder" ref="378084343"/> + <int key="NSvFlags">1825</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{282, 11}, {92, 16}}</string> + <reference key="NSSuperview" ref="378084343"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="141370142"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> + <reference key="NSNextKeyView" ref="394714670"/> + <string key="NSHuggingPriority">{250, 750}</string> <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="847033897"> + <object class="NSButtonCell" key="NSCell" id="992244150"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">134479872</int> <string key="NSContents">Scale To Screen</string> <reference key="NSSupport" ref="22"/> - <reference key="NSControlView" ref="81685190"/> + <reference key="NSControlView" ref="327371770"/> <int key="NSButtonFlags">-2038284288</int> <int key="NSButtonFlags2">129</int> - <object class="NSFont" key="NSAlternateImage" id="354866114"> - <string key="NSName">LucidaGrande</string> - <double key="NSSize">9</double> - <int key="NSfFlags">16</int> - </object> + <reference key="NSAlternateImage" ref="563492427"/> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSTextField" id="66510867"> - <reference key="NSNextResponder" ref="385854969"/> - <int key="NSvFlags">289</int> - <string key="NSFrame">{{108, 14}, {75, 11}}</string> - <reference key="NSSuperview" ref="385854969"/> + <object class="NSTextField" id="794567820"> + <reference key="NSNextResponder" ref="378084343"/> + <int key="NSvFlags">1825</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{118, 14}, {75, 11}}</string> + <reference key="NSSuperview" ref="378084343"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="598619000"/> + <reference key="NSNextKeyView" ref="967936319"/> <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="567286013"> + <object class="NSTextFieldCell" key="NSCell" id="779976102"> <int key="NSCellFlags">68157504</int> <int key="NSCellFlags2">71566336</int> <string key="NSContents">Duration (sec):</string> - <object class="NSFont" key="NSSupport" id="811969608"> - <string key="NSName">LucidaGrande-Bold</string> + <object class="NSFont" key="NSSupport" id="23"> + <string key="NSName">.LucidaGrandeUI-Bold</string> <double key="NSSize">9</double> - <int key="NSfFlags">16</int> + <int key="NSfFlags">3871</int> </object> - <reference key="NSControlView" ref="66510867"/> - <object class="NSColor" key="NSBackgroundColor" id="407686733"> + <reference key="NSControlView" ref="794567820"/> + <object class="NSColor" key="NSBackgroundColor" id="80757536"> <int key="NSColorSpace">6</int> <string key="NSCatalogName">System</string> <string key="NSColorName">controlColor</string> @@ -265,92 +204,81 @@ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> </object> </object> - <object class="NSColor" key="NSTextColor" id="978544139"> + <object class="NSColor" key="NSTextColor" id="95597977"> <int key="NSColorSpace">1</int> <bytes key="NSRGB">MSAxIDEAA</bytes> </object> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSTextFieldAlignmentRectInsetsVersion">1</int> </object> - <object class="NSPopUpButton" id="598619000"> - <reference key="NSNextResponder" ref="385854969"/> - <int key="NSvFlags">289</int> - <string key="NSFrame">{{187, 12}, {58, 15}}</string> - <reference key="NSSuperview" ref="385854969"/> + <object class="NSPopUpButton" id="967936319"> + <reference key="NSNextResponder" ref="378084343"/> + <int key="NSvFlags">1825</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{197, 12}, {58, 15}}</string> + <reference key="NSSuperview" ref="378084343"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="81685190"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> + <reference key="NSNextKeyView" ref="327371770"/> <bool key="NSEnabled">YES</bool> - <object class="NSPopUpButtonCell" key="NSCell" id="953108737"> + <object class="NSPopUpButtonCell" key="NSCell" id="531663027"> <int key="NSCellFlags">-2076180416</int> <int key="NSCellFlags2">264192</int> <reference key="NSSupport" ref="22"/> - <reference key="NSControlView" ref="598619000"/> + <reference key="NSControlView" ref="967936319"/> <int key="NSButtonFlags">109199360</int> <int key="NSButtonFlags2">1</int> + <reference key="NSAlternateImage" ref="563492427"/> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> <int key="NSPeriodicDelay">400</int> <int key="NSPeriodicInterval">75</int> - <object class="NSMenuItem" key="NSMenuItem" id="372655630"> - <reference key="NSMenu" ref="501672847"/> + <object class="NSMenuItem" key="NSMenuItem" id="861000877"> + <reference key="NSMenu" ref="164247414"/> <string key="NSTitle">Item 1</string> <string key="NSKeyEquiv"/> <int key="NSKeyEquivModMask">1048576</int> <int key="NSMnemonicLoc">2147483647</int> <int key="NSState">1</int> - <object class="NSCustomResource" key="NSOnImage" id="858043985"> + <object class="NSCustomResource" key="NSOnImage" id="141778911"> <string key="NSClassName">NSImage</string> <string key="NSResourceName">NSMenuCheckmark</string> </object> - <object class="NSCustomResource" key="NSMixedImage" id="700487240"> + <object class="NSCustomResource" key="NSMixedImage" id="186550871"> <string key="NSClassName">NSImage</string> <string key="NSResourceName">NSMenuMixedState</string> </object> <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="953108737"/> + <reference key="NSTarget" ref="531663027"/> </object> <bool key="NSMenuItemRespectAlignment">YES</bool> - <object class="NSMenu" key="NSMenu" id="501672847"> + <object class="NSMenu" key="NSMenu" id="164247414"> <string key="NSTitle">OtherViews</string> - <object class="NSMutableArray" key="NSMenuItems"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="372655630"/> - <object class="NSMenuItem" id="607756368"> - <reference key="NSMenu" ref="501672847"/> + <array class="NSMutableArray" key="NSMenuItems"> + <reference ref="861000877"/> + <object class="NSMenuItem" id="831823711"> + <reference key="NSMenu" ref="164247414"/> <string key="NSTitle">Item 2</string> <string key="NSKeyEquiv"/> <int key="NSKeyEquivModMask">1048576</int> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="858043985"/> - <reference key="NSMixedImage" ref="700487240"/> + <reference key="NSOnImage" ref="141778911"/> + <reference key="NSMixedImage" ref="186550871"/> <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="953108737"/> + <reference key="NSTarget" ref="531663027"/> </object> - <object class="NSMenuItem" id="272743761"> - <reference key="NSMenu" ref="501672847"/> + <object class="NSMenuItem" id="105051198"> + <reference key="NSMenu" ref="164247414"/> <string key="NSTitle">Item 3</string> <string key="NSKeyEquiv"/> <int key="NSKeyEquivModMask">1048576</int> <int key="NSMnemonicLoc">2147483647</int> - <reference key="NSOnImage" ref="858043985"/> - <reference key="NSMixedImage" ref="700487240"/> + <reference key="NSOnImage" ref="141778911"/> + <reference key="NSMixedImage" ref="186550871"/> <string key="NSAction">_popUpItemAction:</string> - <reference key="NSTarget" ref="953108737"/> + <reference key="NSTarget" ref="531663027"/> </object> - </object> + </array> </object> <int key="NSPreferredEdge">1</int> <bool key="NSUsesItemFromMenu">YES</bool> @@ -359,33 +287,20 @@ </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSSlider" id="396925210"> - <reference key="NSNextResponder" ref="385854969"/> - <int key="NSvFlags">290</int> - <string key="NSFrame">{{18, 39}, {410, 16}}</string> - <reference key="NSSuperview" ref="385854969"/> + <object class="NSSlider" id="175162618"> + <reference key="NSNextResponder" ref="378084343"/> + <int key="NSvFlags">1826</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{18, 39}, {420, 16}}</string> + <reference key="NSSuperview" ref="378084343"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="798240356"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> + <reference key="NSNextKeyView" ref="314619144"/> <bool key="NSEnabled">YES</bool> - <object class="NSSliderCell" key="NSCell" id="639767004"> + <object class="NSSliderCell" key="NSCell" id="955137720"> <int key="NSCellFlags">67371264</int> <int key="NSCellFlags2">262144</int> - <string key="NSContents"/> <reference key="NSSupport" ref="22"/> - <reference key="NSControlView" ref="396925210"/> + <reference key="NSControlView" ref="175162618"/> <double key="NSMaxValue">9</double> <double key="NSMinValue">0.0</double> <double key="NSValue">0.0</double> @@ -397,72 +312,76 @@ </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSTextField" id="628196212"> - <reference key="NSNextResponder" ref="385854969"/> - <int key="NSvFlags">290</int> - <string key="NSFrame">{{15, 55}, {420, 20}}</string> - <reference key="NSSuperview" ref="385854969"/> + <object class="NSTextField" id="142474899"> + <reference key="NSNextResponder" ref="378084343"/> + <int key="NSvFlags">1826</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{15, 55}, {430, 20}}</string> + <reference key="NSSuperview" ref="378084343"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="396925210"/> + <reference key="NSNextKeyView" ref="175162618"/> <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="921881842"> + <object class="NSTextFieldCell" key="NSCell" id="974297610"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">4325376</int> <string key="NSContents"/> - <object class="NSFont" key="NSSupport" id="476446081"> - <string key="NSName">LucidaGrande-Bold</string> + <object class="NSFont" key="NSSupport" id="27"> + <string key="NSName">.LucidaGrandeUI-Bold</string> <double key="NSSize">11</double> - <int key="NSfFlags">16</int> + <int key="NSfFlags">3357</int> </object> - <reference key="NSControlView" ref="628196212"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="407686733"/> - <reference key="NSTextColor" ref="978544139"/> + <reference key="NSControlView" ref="142474899"/> + <reference key="NSBackgroundColor" ref="80757536"/> + <reference key="NSTextColor" ref="95597977"/> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSTextFieldAlignmentRectInsetsVersion">1</int> </object> - <object class="NSTextField" id="245200984"> - <reference key="NSNextResponder" ref="385854969"/> - <int key="NSvFlags">290</int> - <string key="NSFrame">{{15, 77}, {416, 12}}</string> - <reference key="NSSuperview" ref="385854969"/> + <object class="NSTextField" id="543553084"> + <reference key="NSNextResponder" ref="378084343"/> + <int key="NSvFlags">1826</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{15, 77}, {426, 12}}</string> + <reference key="NSSuperview" ref="378084343"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="628196212"/> + <reference key="NSNextKeyView" ref="142474899"/> <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="1032360651"> + <object class="NSTextFieldCell" key="NSCell" id="185807734"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">4456448</int> <string key="NSContents"/> - <reference key="NSSupport" ref="811969608"/> - <reference key="NSControlView" ref="245200984"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="407686733"/> - <reference key="NSTextColor" ref="978544139"/> + <reference key="NSSupport" ref="23"/> + <reference key="NSControlView" ref="543553084"/> + <reference key="NSBackgroundColor" ref="80757536"/> + <reference key="NSTextColor" ref="95597977"/> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSTextFieldAlignmentRectInsetsVersion">1</int> </object> - </object> - <string key="NSFrame">{{2, 2}, {446, 96}}</string> - <reference key="NSSuperview" ref="92351498"/> + </array> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{2, 2}, {456, 96}}</string> + <reference key="NSSuperview" ref="717764450"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="245200984"/> + <reference key="NSNextKeyView" ref="543553084"/> </object> - </object> + </array> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{15, 132}, {460, 100}}</string> - <reference key="NSSuperview" ref="49161063"/> + <reference key="NSSuperview" ref="929670820"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="385854969"/> + <reference key="NSNextKeyView" ref="378084343"/> <string key="NSOffsets">{0, 0}</string> <object class="NSTextFieldCell" key="NSTitleCell"> <int key="NSCellFlags">67108864</int> - <int key="NSCellFlags2">0</int> + <int key="NSCellFlags2">134217728</int> <string key="NSContents">Picture Controls</string> - <object class="NSFont" key="NSSupport" id="26"> - <string key="NSName">LucidaGrande</string> + <object class="NSFont" key="NSSupport"> + <string key="NSName">.LucidaGrandeUI</string> <double key="NSSize">11</double> - <int key="NSfFlags">3100</int> + <int key="NSfFlags">1558</int> </object> - <object class="NSColor" key="NSBackgroundColor" id="384686844"> + <object class="NSColor" key="NSBackgroundColor" id="3673183"> <int key="NSColorSpace">6</int> <string key="NSCatalogName">System</string> <string key="NSColorName">textBackgroundColor</string> @@ -473,10 +392,10 @@ </object> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgAA</bytes> </object> </object> - <reference key="NSContentView" ref="385854969"/> + <reference key="NSContentView" ref="378084343"/> <int key="NSBorderType">1</int> <int key="NSBoxType">4</int> <int key="NSTitlePosition">0</int> @@ -492,42 +411,27 @@ <bytes key="NSRGB">MCAwIDAgMC42AA</bytes> </object> </object> - <object class="NSBox" id="700607930"> - <reference key="NSNextResponder" ref="49161063"/> - <int key="NSvFlags">-2147483611</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSView" id="1068222891"> - <reference key="NSNextResponder" ref="700607930"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSSlider" id="886140787"> - <reference key="NSNextResponder" ref="1068222891"/> - <int key="NSvFlags">290</int> - <string key="NSFrame">{{16, 16}, {355, 21}}</string> - <reference key="NSSuperview" ref="1068222891"/> + <object class="NSBox" id="432685731"> + <reference key="NSNextResponder" ref="929670820"/> + <int key="NSvFlags">-2147482075</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSView" id="592392656"> + <reference key="NSNextResponder" ref="432685731"/> + <int key="NSvFlags">1810</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSSlider" id="222326321"> + <reference key="NSNextResponder" ref="592392656"/> + <int key="NSvFlags">1826</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{16, 16}, {337, 21}}</string> + <reference key="NSSuperview" ref="592392656"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="964331174"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> + <reference key="NSNextKeyView" ref="351711265"/> <bool key="NSEnabled">YES</bool> - <object class="NSSliderCell" key="NSCell" id="493667684"> - <int key="NSCellFlags">67371264</int> + <object class="NSSliderCell" key="NSCell" id="1050734698"> + <int key="NSCellFlags">262400</int> <int key="NSCellFlags2">0</int> - <string key="NSContents"/> - <reference key="NSControlView" ref="886140787"/> + <reference key="NSControlView" ref="222326321"/> <double key="NSMaxValue">100</double> <double key="NSMinValue">0.0</double> <double key="NSValue">0.0</double> @@ -539,28 +443,26 @@ </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSButton" id="102183813"> - <reference key="NSNextResponder" ref="1068222891"/> - <int key="NSvFlags">268</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> + <object class="NSButton" id="152429490"> + <reference key="NSNextResponder" ref="592392656"/> + <int key="NSvFlags">1804</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{205, 43}, {36, 36}}</string> - <reference key="NSSuperview" ref="1068222891"/> + <reference key="NSSuperview" ref="592392656"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="894608246"/> + <reference key="NSNextKeyView" ref="384131700"/> <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="19809002"> + <object class="NSButtonCell" key="NSCell" id="444106871"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">134217728</int> <string key="NSContents"/> - <object class="NSFont" key="NSSupport" id="353643025"> - <string key="NSName">LucidaGrande</string> + <object class="NSFont" key="NSSupport" id="954502975"> + <string key="NSName">.LucidaGrandeUI</string> <double key="NSSize">13</double> <int key="NSfFlags">1044</int> </object> - <reference key="NSControlView" ref="102183813"/> - <int key="NSButtonFlags">-931921920</int> + <reference key="NSControlView" ref="152429490"/> + <int key="NSButtonFlags">-935067648</int> <int key="NSButtonFlags2">134</int> <object class="NSCustomResource" key="NSNormalImage"> <string key="NSClassName">NSImage</string> @@ -572,28 +474,26 @@ </object> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSButton" id="897614796"> - <reference key="NSNextResponder" ref="1068222891"/> - <int key="NSvFlags">268</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> + <object class="NSButton" id="147746186"> + <reference key="NSNextResponder" ref="592392656"/> + <int key="NSvFlags">1804</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{163, 48}, {32, 26}}</string> - <reference key="NSSuperview" ref="1068222891"/> + <reference key="NSSuperview" ref="592392656"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="102183813"/> + <reference key="NSNextKeyView" ref="152429490"/> <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="913339095"> + <object class="NSButtonCell" key="NSCell" id="778199390"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">134217728</int> <string key="NSContents"/> - <reference key="NSSupport" ref="353643025"/> - <reference key="NSControlView" ref="897614796"/> + <reference key="NSSupport" ref="954502975"/> + <reference key="NSControlView" ref="147746186"/> <int key="NSButtonFlags">-2041839616</int> <int key="NSButtonFlags2">134</int> <object class="NSCustomResource" key="NSNormalImage"> @@ -602,28 +502,26 @@ </object> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSButton" id="894608246"> - <reference key="NSNextResponder" ref="1068222891"/> - <int key="NSvFlags">268</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> + <object class="NSButton" id="384131700"> + <reference key="NSNextResponder" ref="592392656"/> + <int key="NSvFlags">1804</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{251, 48}, {32, 26}}</string> - <reference key="NSSuperview" ref="1068222891"/> + <reference key="NSSuperview" ref="592392656"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="630042886"/> + <reference key="NSNextKeyView" ref="1029861158"/> <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="117507013"> + <object class="NSButtonCell" key="NSCell" id="328702140"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">134479872</int> <string key="NSContents"/> <reference key="NSSupport" ref="22"/> - <reference key="NSControlView" ref="894608246"/> + <reference key="NSControlView" ref="384131700"/> <int key="NSButtonFlags">-2042363904</int> <int key="NSButtonFlags2">134</int> <object class="NSCustomResource" key="NSNormalImage"> @@ -632,95 +530,88 @@ </object> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSButton" id="630042886"> - <reference key="NSNextResponder" ref="1068222891"/> - <int key="NSvFlags">292</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> + <object class="NSButton" id="1029861158"> + <reference key="NSNextResponder" ref="592392656"/> + <int key="NSvFlags">1828</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{348, 53}, {81, 16}}</string> - <reference key="NSSuperview" ref="1068222891"/> + <reference key="NSSuperview" ref="592392656"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="886140787"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> + <reference key="NSNextKeyView" ref="222326321"/> + <string key="NSHuggingPriority">{250, 750}</string> <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="999505395"> + <object class="NSButtonCell" key="NSCell" id="666432193"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">134479872</int> <string key="NSContents">Still Previews</string> <reference key="NSSupport" ref="22"/> - <reference key="NSControlView" ref="630042886"/> + <reference key="NSControlView" ref="1029861158"/> <int key="NSButtonFlags">-2038284288</int> <int key="NSButtonFlags2">129</int> - <reference key="NSAlternateImage" ref="22"/> + <reference key="NSAlternateImage" ref="563492427"/> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSTextField" id="964331174"> - <reference key="NSNextResponder" ref="1068222891"/> - <int key="NSvFlags">290</int> - <string key="NSFrame">{{364, 19}, {67, 14}}</string> - <reference key="NSSuperview" ref="1068222891"/> + <object class="NSTextField" id="351711265"> + <reference key="NSNextResponder" ref="592392656"/> + <int key="NSvFlags">1826</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{347, 19}, {94, 14}}</string> + <reference key="NSSuperview" ref="592392656"/> <reference key="NSWindow"/> <reference key="NSNextKeyView"/> <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="113790059"> + <object class="NSTextFieldCell" key="NSCell" id="88587267"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">71565312</int> <string key="NSContents">00:00:00</string> - <reference key="NSSupport" ref="476446081"/> - <reference key="NSControlView" ref="964331174"/> - <bool key="NSDrawsBackground">YES</bool> - <reference key="NSBackgroundColor" ref="407686733"/> - <reference key="NSTextColor" ref="978544139"/> + <reference key="NSSupport" ref="27"/> + <reference key="NSControlView" ref="351711265"/> + <reference key="NSBackgroundColor" ref="80757536"/> + <reference key="NSTextColor" ref="95597977"/> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSTextFieldAlignmentRectInsetsVersion">1</int> </object> - </object> - <string key="NSFrame">{{2, 2}, {446, 96}}</string> - <reference key="NSSuperview" ref="700607930"/> + </array> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{2, 2}, {456, 96}}</string> + <reference key="NSSuperview" ref="432685731"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="897614796"/> + <reference key="NSNextKeyView" ref="147746186"/> </object> - </object> + </array> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{15, 30}, {460, 100}}</string> - <reference key="NSSuperview" ref="49161063"/> + <reference key="NSSuperview" ref="929670820"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="1068222891"/> + <reference key="NSNextKeyView" ref="592392656"/> <string key="NSOffsets">{0, 0}</string> <object class="NSTextFieldCell" key="NSTitleCell"> <int key="NSCellFlags">67108864</int> - <int key="NSCellFlags2">0</int> + <int key="NSCellFlags2">134217728</int> <string key="NSContents">Playback Controls</string> - <reference key="NSSupport" ref="26"/> - <reference key="NSBackgroundColor" ref="384686844"/> + <object class="NSFont" key="NSSupport"> + <string key="NSName">.LucidaGrandeUI</string> + <double key="NSSize">11</double> + <int key="NSfFlags">1558</int> + </object> + <reference key="NSBackgroundColor" ref="3673183"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgAA</bytes> </object> </object> - <reference key="NSContentView" ref="1068222891"/> + <reference key="NSContentView" ref="592392656"/> <int key="NSBorderType">1</int> <int key="NSBoxType">4</int> <int key="NSTitlePosition">0</int> @@ -736,125 +627,105 @@ <bytes key="NSRGB">MCAwIDAgMC42AA</bytes> </object> </object> - <object class="NSBox" id="768906858"> - <reference key="NSNextResponder" ref="49161063"/> - <int key="NSvFlags">-2147483611</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSView" id="1067699710"> - <reference key="NSNextResponder" ref="768906858"/> - <int key="NSvFlags">274</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSProgressIndicator" id="196868285"> - <reference key="NSNextResponder" ref="1067699710"/> - <int key="NSvFlags">1280</int> + <object class="NSBox" id="758551503"> + <reference key="NSNextResponder" ref="929670820"/> + <int key="NSvFlags">-2147482075</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSView" id="396186102"> + <reference key="NSNextResponder" ref="758551503"/> + <int key="NSvFlags">1810</int> + <array class="NSMutableArray" key="NSSubviews"> + <object class="NSProgressIndicator" id="721434635"> + <reference key="NSNextResponder" ref="396186102"/> + <int key="NSvFlags">1792</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{18, 26}, {346, 12}}</string> - <reference key="NSSuperview" ref="1067699710"/> + <reference key="NSSuperview" ref="396186102"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="569473100"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> - <int key="NSpiFlags">16650</int> + <reference key="NSNextKeyView" ref="982988884"/> + <int key="NSpiFlags">16654</int> <double key="NSMaxValue">100</double> </object> - <object class="NSButton" id="569473100"> - <reference key="NSNextResponder" ref="1067699710"/> - <int key="NSvFlags">265</int> - <object class="NSMutableArray" key="NSSubviews"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <string key="NSFrame">{{371, 24}, {58, 16}}</string> - <reference key="NSSuperview" ref="1067699710"/> + <object class="NSButton" id="982988884"> + <reference key="NSNextResponder" ref="396186102"/> + <int key="NSvFlags">1801</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{381, 24}, {58, 16}}</string> + <reference key="NSSuperview" ref="396186102"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="92351498"/> - <object class="NSArray" key="NSViewContentFilters"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="CIColorMonochrome"> - <object class="CIColor" key="CI_inputColor"> - <float key="red">0.70196080207824707</float> - <float key="green">0.70196080207824707</float> - <float key="blue">0.70196080207824707</float> - <float key="alpha">1</float> - </object> - <integer value="1" key="CI_inputIntensity"/> - <bool key="CIEnabled">YES</bool> - </object> - </object> + <reference key="NSNextKeyView" ref="717764450"/> + <string key="NSHuggingPriority">{250, 750}</string> <bool key="NSEnabled">YES</bool> - <object class="NSButtonCell" key="NSCell" id="908165435"> + <object class="NSButtonCell" key="NSCell" id="481130630"> <int key="NSCellFlags">67108864</int> <int key="NSCellFlags2">134479872</int> <string key="NSContents">Cancel</string> <reference key="NSSupport" ref="22"/> - <reference key="NSControlView" ref="569473100"/> + <reference key="NSControlView" ref="982988884"/> <int key="NSButtonFlags">-2038284288</int> <int key="NSButtonFlags2">129</int> - <reference key="NSAlternateImage" ref="354866114"/> + <reference key="NSAlternateImage" ref="563492427"/> <string key="NSAlternateContents"/> <string key="NSKeyEquivalent"/> - <int key="NSPeriodicDelay">200</int> - <int key="NSPeriodicInterval">25</int> + <int key="NSPeriodicDelay">400</int> + <int key="NSPeriodicInterval">75</int> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> </object> - <object class="NSTextField" id="986015194"> - <reference key="NSNextResponder" ref="1067699710"/> - <int key="NSvFlags">256</int> + <object class="NSTextField" id="774269445"> + <reference key="NSNextResponder" ref="396186102"/> + <int key="NSvFlags">1792</int> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{15, 59}, {406, 14}}</string> - <reference key="NSSuperview" ref="1067699710"/> + <reference key="NSSuperview" ref="396186102"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="196868285"/> + <reference key="NSNextKeyView" ref="721434635"/> <bool key="NSEnabled">YES</bool> - <object class="NSTextFieldCell" key="NSCell" id="304208899"> + <object class="NSTextFieldCell" key="NSCell" id="547191345"> <int key="NSCellFlags">68157504</int> <int key="NSCellFlags2">4326400</int> <string key="NSContents">Preparing Preview</string> - <reference key="NSSupport" ref="476446081"/> - <reference key="NSControlView" ref="986015194"/> + <reference key="NSSupport" ref="27"/> + <reference key="NSControlView" ref="774269445"/> <object class="NSColor" key="NSBackgroundColor"> <int key="NSColorSpace">2</int> <bytes key="NSRGB">MC45MDE5NjA4NSAwLjkwMTk2MDg1IDAuOTAxOTYwODUgMAA</bytes> </object> - <reference key="NSTextColor" ref="978544139"/> + <reference key="NSTextColor" ref="95597977"/> </object> <bool key="NSAllowsLogicalLayoutDirection">NO</bool> + <int key="NSTextFieldAlignmentRectInsetsVersion">1</int> </object> - </object> - <string key="NSFrame">{{2, 2}, {446, 96}}</string> - <reference key="NSSuperview" ref="768906858"/> + </array> + <object class="NSPSMatrix" key="NSFrameMatrix"/> + <string key="NSFrame">{{2, 2}, {456, 96}}</string> + <reference key="NSSuperview" ref="758551503"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="986015194"/> + <reference key="NSNextKeyView" ref="774269445"/> </object> - </object> + </array> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrame">{{15, 235}, {460, 100}}</string> - <reference key="NSSuperview" ref="49161063"/> + <reference key="NSSuperview" ref="929670820"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="1067699710"/> + <reference key="NSNextKeyView" ref="396186102"/> <string key="NSOffsets">{0, 0}</string> <object class="NSTextFieldCell" key="NSTitleCell"> <int key="NSCellFlags">67108864</int> - <int key="NSCellFlags2">0</int> + <int key="NSCellFlags2">134217728</int> <string key="NSContents">Encoding Controls</string> - <reference key="NSSupport" ref="26"/> - <reference key="NSBackgroundColor" ref="384686844"/> + <object class="NSFont" key="NSSupport"> + <string key="NSName">.LucidaGrandeUI</string> + <double key="NSSize">11</double> + <int key="NSfFlags">1558</int> + </object> + <reference key="NSBackgroundColor" ref="3673183"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgAA</bytes> </object> </object> - <reference key="NSContentView" ref="1067699710"/> + <reference key="NSContentView" ref="396186102"/> <int key="NSBorderType">1</int> <int key="NSBoxType">4</int> <int key="NSTitlePosition">0</int> @@ -870,1247 +741,979 @@ <bytes key="NSRGB">MCAwIDAgMC42AA</bytes> </object> </object> - </object> + </array> + <object class="NSPSMatrix" key="NSFrameMatrix"/> <string key="NSFrameSize">{490, 360}</string> <reference key="NSSuperview"/> <reference key="NSWindow"/> - <reference key="NSNextKeyView" ref="48693112"/> + <reference key="NSNextKeyView" ref="703812881"/> </object> <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string> <string key="NSMaxSize">{10000000000000, 10000000000000}</string> <bool key="NSWindowIsRestorable">YES</bool> </object> - </object> + </array> <object class="IBObjectContainer" key="IBDocument.Objects"> - <object class="NSMutableArray" key="connectionRecords"> - <bool key="EncodedWithXMLCoder">YES</bool> + <bool key="usesAutoincrementingIDs">NO</bool> + <array class="NSMutableArray" key="connectionRecords"> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">window</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="616825745"/> + <string key="label">fCancelPreviewMovieButton</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="982988884"/> </object> - <int key="connectionID">184</int> + <string key="id">263</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> <string key="label">fCreatePreviewMovieButton</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="798240356"/> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="314619144"/> </object> - <int key="connectionID">217</int> + <string key="id">217</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fscaleInfoField</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="245200984"/> + <string key="label">fEncodingControlBox</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="758551503"/> </object> - <int key="connectionID">282</int> + <string key="id">253</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fPreviewMovieLengthPopUp</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="598619000"/> + <string key="label">fGoToBeginningButton</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="147746186"/> </object> - <int key="connectionID">232</int> + <string key="id">380</string> </object> <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">previewDurationPopUpChanged:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="598619000"/> + <object class="IBOutletConnection" key="connection"> + <string key="label">fGoToEndButton</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="384131700"/> </object> - <int key="connectionID">233</int> + <string key="id">381</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fPictureControlBox</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="92351498"/> + <string key="label">fGoToStillPreviewButton</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="1029861158"/> </object> - <int key="connectionID">254</int> + <string key="id">368</string> </object> <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">pictureSliderChanged:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="396925210"/> + <object class="IBOutletConnection" key="connection"> + <string key="label">fInfoField</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="142474899"/> </object> - <int key="connectionID">212</int> + <string key="id">73</string> </object> <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">createMoviePreview:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="798240356"/> + <object class="IBOutletConnection" key="connection"> + <string key="label">fMovieCreationProgressIndicator</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="721434635"/> </object> - <int key="connectionID">218</int> + <string key="id">214</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fPictureSettingsToggleButton</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="141370142"/> + <string key="label">fMovieInfoField</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="351711265"/> </object> - <int key="connectionID">273</int> + <string key="id">374</string> </object> <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleScaleToScreen:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="81685190"/> + <object class="IBOutletConnection" key="connection"> + <string key="label">fMoviePlaybackControlBox</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="432685731"/> </object> - <int key="connectionID">279</int> + <string key="id">363</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fScaleToScreenToggleButton</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="81685190"/> + <string key="label">fMovieScrubberSlider</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="222326321"/> </object> - <int key="connectionID">277</int> + <string key="id">371</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fPictureSlider</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="396925210"/> + <string key="label">fMovieView</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="703812881"/> </object> - <int key="connectionID">211</int> + <string key="id">208</string> </object> <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">showPictureSettings:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="141370142"/> + <object class="IBOutletConnection" key="connection"> + <string key="label">fPictureControlBox</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="717764450"/> </object> - <int key="connectionID">274</int> + <string key="id">254</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fInfoField</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="628196212"/> + <string key="label">fPictureSettingsToggleButton</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="394714670"/> </object> - <int key="connectionID">73</int> + <string key="id">273</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fGoToBeginningButton</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="897614796"/> + <string key="label">fPictureSlider</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="175162618"/> </object> - <int key="connectionID">380</int> + <string key="id">211</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fMovieScrubberSlider</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="886140787"/> + <string key="label">fPlayPauseButton</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="152429490"/> </object> - <int key="connectionID">371</int> + <string key="id">364</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fMovieInfoField</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="964331174"/> + <string key="label">fPreviewMovieLengthPopUp</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="967936319"/> </object> - <int key="connectionID">374</int> + <string key="id">232</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fGoToEndButton</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="894608246"/> + <string key="label">fPreviewMovieStatusField</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="774269445"/> </object> - <int key="connectionID">381</int> + <string key="id">225</string> </object> <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">moviePlaybackGoToEnd:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="894608246"/> + <object class="IBOutletConnection" key="connection"> + <string key="label">fScaleToScreenToggleButton</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="327371770"/> </object> - <int key="connectionID">383</int> + <string key="id">277</string> </object> <object class="IBConnectionRecord"> - <object class="IBActionConnection" key="connection"> - <string key="label">toggleMoviePreviewPlayPause:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="102183813"/> + <object class="IBOutletConnection" key="connection"> + <string key="label">fscaleInfoField</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="543553084"/> </object> - <int key="connectionID">370</int> + <string key="id">282</string> </object> <object class="IBConnectionRecord"> <object class="IBOutletConnection" key="connection"> - <string key="label">fPlayPauseButton</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="102183813"/> + <string key="label">window</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="133213351"/> </object> - <int key="connectionID">364</int> + <string key="id">184</string> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">moviePlaybackGoToBeginning:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="897614796"/> + <string key="label">createMoviePreview:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="314619144"/> </object> - <int key="connectionID">382</int> + <string key="id">218</string> </object> <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">fGoToStillPreviewButton</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="630042886"/> + <object class="IBActionConnection" key="connection"> + <string key="label">showPictureSettings:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="394714670"/> </object> - <int key="connectionID">368</int> + <string key="id">274</string> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">previewScrubberChanged:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="886140787"/> + <string key="label">toggleScaleToScreen:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="327371770"/> </object> - <int key="connectionID">384</int> + <string key="id">279</string> </object> <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">fMoviePlaybackControlBox</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="700607930"/> + <object class="IBActionConnection" key="connection"> + <string key="label">previewDurationPopUpChanged:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="967936319"/> </object> - <int key="connectionID">363</int> + <string key="id">233</string> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">showPicturesPreview:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="630042886"/> + <string key="label">pictureSliderChanged:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="175162618"/> </object> - <int key="connectionID">396</int> + <string key="id">212</string> </object> <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">fMovieCreationProgressIndicator</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="196868285"/> + <object class="IBActionConnection" key="connection"> + <string key="label">previewScrubberChanged:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="222326321"/> </object> - <int key="connectionID">214</int> + <string key="id">384</string> </object> <object class="IBConnectionRecord"> <object class="IBActionConnection" key="connection"> - <string key="label">cancelCreateMoviePreview:</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="569473100"/> + <string key="label">toggleMoviePreviewPlayPause:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="152429490"/> </object> - <int key="connectionID">395</int> + <string key="id">370</string> </object> <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">fPreviewMovieStatusField</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="986015194"/> + <object class="IBActionConnection" key="connection"> + <string key="label">moviePlaybackGoToBeginning:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="147746186"/> </object> - <int key="connectionID">225</int> + <string key="id">382</string> </object> <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">fCancelPreviewMovieButton</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="569473100"/> + <object class="IBActionConnection" key="connection"> + <string key="label">moviePlaybackGoToEnd:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="384131700"/> </object> - <int key="connectionID">263</int> + <string key="id">383</string> </object> <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">fEncodingControlBox</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="768906858"/> + <object class="IBActionConnection" key="connection"> + <string key="label">showPicturesPreview:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="1029861158"/> </object> - <int key="connectionID">253</int> + <string key="id">396</string> </object> <object class="IBConnectionRecord"> - <object class="IBOutletConnection" key="connection"> - <string key="label">fMovieView</string> - <reference key="source" ref="355312334"/> - <reference key="destination" ref="48693112"/> + <object class="IBActionConnection" key="connection"> + <string key="label">cancelCreateMoviePreview:</string> + <reference key="source" ref="1036052779"/> + <reference key="destination" ref="982988884"/> </object> - <int key="connectionID">208</int> + <string key="id">395</string> </object> - </object> + </array> <object class="IBMutableOrderedSet" key="objectRecords"> - <object class="NSArray" key="orderedObjects"> - <bool key="EncodedWithXMLCoder">YES</bool> + <array key="orderedObjects"> <object class="IBObjectRecord"> - <int key="objectID">0</int> - <object class="NSArray" key="object" id="0"> - <bool key="EncodedWithXMLCoder">YES</bool> - </object> - <reference key="children" ref="273418435"/> + <string key="id">0</string> + <array key="object" id="0"/> + <reference key="children" ref="24783728"/> <nil key="parent"/> </object> <object class="IBObjectRecord"> - <int key="objectID">-2</int> - <reference key="object" ref="355312334"/> + <string key="id">-2</string> + <reference key="object" ref="1036052779"/> <reference key="parent" ref="0"/> <string key="objectName">File's Owner</string> </object> <object class="IBObjectRecord"> - <int key="objectID">-1</int> - <reference key="object" ref="844574444"/> + <string key="id">-1</string> + <reference key="object" ref="525801383"/> <reference key="parent" ref="0"/> <string key="objectName">First Responder</string> </object> <object class="IBObjectRecord"> - <int key="objectID">-3</int> - <reference key="object" ref="837220151"/> + <string key="id">-3</string> + <reference key="object" ref="460582123"/> <reference key="parent" ref="0"/> <string key="objectName">Application</string> </object> <object class="IBObjectRecord"> - <int key="objectID">5</int> - <reference key="object" ref="616825745"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="49161063"/> - </object> + <string key="id">5</string> + <reference key="object" ref="133213351"/> + <array class="NSMutableArray" key="children"> + <reference ref="929670820"/> + </array> <reference key="parent" ref="0"/> <string key="objectName">PreviewPanel</string> </object> <object class="IBObjectRecord"> - <int key="objectID">6</int> - <reference key="object" ref="49161063"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="700607930"/> - <reference ref="768906858"/> - <reference ref="92351498"/> - <reference ref="48693112"/> - </object> - <reference key="parent" ref="616825745"/> + <string key="id">6</string> + <reference key="object" ref="929670820"/> + <array class="NSMutableArray" key="children"> + <reference ref="703812881"/> + <reference ref="717764450"/> + <reference ref="432685731"/> + <reference ref="758551503"/> + </array> + <reference key="parent" ref="133213351"/> </object> <object class="IBObjectRecord"> - <int key="objectID">335</int> - <reference key="object" ref="700607930"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="102183813"/> - <reference ref="894608246"/> - <reference ref="897614796"/> - <reference ref="964331174"/> - <reference ref="886140787"/> - <reference ref="630042886"/> - </object> - <reference key="parent" ref="49161063"/> + <string key="id">207</string> + <reference key="object" ref="703812881"/> + <reference key="parent" ref="929670820"/> </object> <object class="IBObjectRecord"> - <int key="objectID">365</int> - <reference key="object" ref="630042886"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="999505395"/> - </object> - <reference key="parent" ref="700607930"/> + <string key="id">251</string> + <reference key="object" ref="717764450"/> + <array class="NSMutableArray" key="children"> + <reference ref="314619144"/> + <reference ref="394714670"/> + <reference ref="327371770"/> + <reference ref="794567820"/> + <reference ref="967936319"/> + <reference ref="175162618"/> + <reference ref="142474899"/> + <reference ref="543553084"/> + </array> + <reference key="parent" ref="929670820"/> </object> <object class="IBObjectRecord"> - <int key="objectID">375</int> - <reference key="object" ref="897614796"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="913339095"/> - </object> - <reference key="parent" ref="700607930"/> + <string key="id">215</string> + <reference key="object" ref="314619144"/> + <array class="NSMutableArray" key="children"> + <reference ref="992719048"/> + </array> + <reference key="parent" ref="717764450"/> </object> <object class="IBObjectRecord"> - <int key="objectID">378</int> - <reference key="object" ref="894608246"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="117507013"/> - </object> - <reference key="parent" ref="700607930"/> + <string key="id">216</string> + <reference key="object" ref="992719048"/> + <reference key="parent" ref="314619144"/> </object> <object class="IBObjectRecord"> - <int key="objectID">361</int> - <reference key="object" ref="102183813"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="19809002"/> - </object> - <reference key="parent" ref="700607930"/> + <string key="id">271</string> + <reference key="object" ref="394714670"/> + <array class="NSMutableArray" key="children"> + <reference ref="690045799"/> + </array> + <reference key="parent" ref="717764450"/> </object> <object class="IBObjectRecord"> - <int key="objectID">372</int> - <reference key="object" ref="964331174"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="113790059"/> - </object> - <reference key="parent" ref="700607930"/> + <string key="id">272</string> + <reference key="object" ref="690045799"/> + <reference key="parent" ref="394714670"/> </object> <object class="IBObjectRecord"> - <int key="objectID">341</int> - <reference key="object" ref="886140787"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="493667684"/> - </object> - <reference key="parent" ref="700607930"/> + <string key="id">275</string> + <reference key="object" ref="327371770"/> + <array class="NSMutableArray" key="children"> + <reference ref="992244150"/> + </array> + <reference key="parent" ref="717764450"/> </object> <object class="IBObjectRecord"> - <int key="objectID">346</int> - <reference key="object" ref="493667684"/> - <reference key="parent" ref="886140787"/> + <string key="id">276</string> + <reference key="object" ref="992244150"/> + <reference key="parent" ref="327371770"/> </object> <object class="IBObjectRecord"> - <int key="objectID">373</int> - <reference key="object" ref="113790059"/> - <reference key="parent" ref="964331174"/> + <string key="id">234</string> + <reference key="object" ref="794567820"/> + <array class="NSMutableArray" key="children"> + <reference ref="779976102"/> + </array> + <reference key="parent" ref="717764450"/> </object> <object class="IBObjectRecord"> - <int key="objectID">362</int> - <reference key="object" ref="19809002"/> - <reference key="parent" ref="102183813"/> + <string key="id">235</string> + <reference key="object" ref="779976102"/> + <reference key="parent" ref="794567820"/> </object> <object class="IBObjectRecord"> - <int key="objectID">379</int> - <reference key="object" ref="117507013"/> - <reference key="parent" ref="894608246"/> + <string key="id">226</string> + <reference key="object" ref="967936319"/> + <array class="NSMutableArray" key="children"> + <reference ref="531663027"/> + </array> + <reference key="parent" ref="717764450"/> </object> <object class="IBObjectRecord"> - <int key="objectID">376</int> - <reference key="object" ref="913339095"/> - <reference key="parent" ref="897614796"/> + <string key="id">227</string> + <reference key="object" ref="531663027"/> + <array class="NSMutableArray" key="children"> + <reference ref="164247414"/> + </array> + <reference key="parent" ref="967936319"/> </object> <object class="IBObjectRecord"> - <int key="objectID">366</int> - <reference key="object" ref="999505395"/> - <reference key="parent" ref="630042886"/> + <string key="id">228</string> + <reference key="object" ref="164247414"/> + <array class="NSMutableArray" key="children"> + <reference ref="861000877"/> + <reference ref="831823711"/> + <reference ref="105051198"/> + </array> + <reference key="parent" ref="531663027"/> </object> <object class="IBObjectRecord"> - <int key="objectID">252</int> - <reference key="object" ref="768906858"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="569473100"/> - <reference ref="986015194"/> - <reference ref="196868285"/> - </object> - <reference key="parent" ref="49161063"/> + <string key="id">231</string> + <reference key="object" ref="861000877"/> + <reference key="parent" ref="164247414"/> </object> <object class="IBObjectRecord"> - <int key="objectID">261</int> - <reference key="object" ref="569473100"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="908165435"/> - </object> - <reference key="parent" ref="768906858"/> + <string key="id">230</string> + <reference key="object" ref="831823711"/> + <reference key="parent" ref="164247414"/> </object> <object class="IBObjectRecord"> - <int key="objectID">223</int> - <reference key="object" ref="986015194"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="304208899"/> - </object> - <reference key="parent" ref="768906858"/> + <string key="id">229</string> + <reference key="object" ref="105051198"/> + <reference key="parent" ref="164247414"/> </object> <object class="IBObjectRecord"> - <int key="objectID">213</int> - <reference key="object" ref="196868285"/> - <reference key="parent" ref="768906858"/> + <string key="id">209</string> + <reference key="object" ref="175162618"/> + <array class="NSMutableArray" key="children"> + <reference ref="955137720"/> + </array> + <reference key="parent" ref="717764450"/> </object> <object class="IBObjectRecord"> - <int key="objectID">224</int> - <reference key="object" ref="304208899"/> - <reference key="parent" ref="986015194"/> + <string key="id">210</string> + <reference key="object" ref="955137720"/> + <reference key="parent" ref="175162618"/> </object> <object class="IBObjectRecord"> - <int key="objectID">262</int> - <reference key="object" ref="908165435"/> - <reference key="parent" ref="569473100"/> + <string key="id">38</string> + <reference key="object" ref="142474899"/> + <array class="NSMutableArray" key="children"> + <reference ref="974297610"/> + </array> + <reference key="parent" ref="717764450"/> </object> <object class="IBObjectRecord"> - <int key="objectID">251</int> - <reference key="object" ref="92351498"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="66510867"/> - <reference ref="598619000"/> - <reference ref="141370142"/> - <reference ref="798240356"/> - <reference ref="81685190"/> - <reference ref="245200984"/> - <reference ref="396925210"/> - <reference ref="628196212"/> - </object> - <reference key="parent" ref="49161063"/> + <string key="id">165</string> + <reference key="object" ref="974297610"/> + <reference key="parent" ref="142474899"/> </object> <object class="IBObjectRecord"> - <int key="objectID">38</int> - <reference key="object" ref="628196212"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="921881842"/> - </object> - <reference key="parent" ref="92351498"/> + <string key="id">280</string> + <reference key="object" ref="543553084"/> + <array class="NSMutableArray" key="children"> + <reference ref="185807734"/> + </array> + <reference key="parent" ref="717764450"/> </object> <object class="IBObjectRecord"> - <int key="objectID">165</int> - <reference key="object" ref="921881842"/> - <reference key="parent" ref="628196212"/> + <string key="id">281</string> + <reference key="object" ref="185807734"/> + <reference key="parent" ref="543553084"/> </object> <object class="IBObjectRecord"> - <int key="objectID">209</int> - <reference key="object" ref="396925210"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="639767004"/> - </object> - <reference key="parent" ref="92351498"/> + <string key="id">335</string> + <reference key="object" ref="432685731"/> + <array class="NSMutableArray" key="children"> + <reference ref="222326321"/> + <reference ref="152429490"/> + <reference ref="147746186"/> + <reference ref="384131700"/> + <reference ref="1029861158"/> + <reference ref="351711265"/> + </array> + <reference key="parent" ref="929670820"/> </object> <object class="IBObjectRecord"> - <int key="objectID">210</int> - <reference key="object" ref="639767004"/> - <reference key="parent" ref="396925210"/> + <string key="id">341</string> + <reference key="object" ref="222326321"/> + <array class="NSMutableArray" key="children"> + <reference ref="1050734698"/> + </array> + <reference key="parent" ref="432685731"/> </object> <object class="IBObjectRecord"> - <int key="objectID">280</int> - <reference key="object" ref="245200984"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="1032360651"/> - </object> - <reference key="parent" ref="92351498"/> + <string key="id">346</string> + <reference key="object" ref="1050734698"/> + <reference key="parent" ref="222326321"/> </object> <object class="IBObjectRecord"> - <int key="objectID">281</int> - <reference key="object" ref="1032360651"/> - <reference key="parent" ref="245200984"/> + <string key="id">361</string> + <reference key="object" ref="152429490"/> + <array class="NSMutableArray" key="children"> + <reference ref="444106871"/> + </array> + <reference key="parent" ref="432685731"/> </object> <object class="IBObjectRecord"> - <int key="objectID">275</int> - <reference key="object" ref="81685190"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="847033897"/> - </object> - <reference key="parent" ref="92351498"/> + <string key="id">362</string> + <reference key="object" ref="444106871"/> + <reference key="parent" ref="152429490"/> </object> <object class="IBObjectRecord"> - <int key="objectID">276</int> - <reference key="object" ref="847033897"/> - <reference key="parent" ref="81685190"/> + <string key="id">375</string> + <reference key="object" ref="147746186"/> + <array class="NSMutableArray" key="children"> + <reference ref="778199390"/> + </array> + <reference key="parent" ref="432685731"/> </object> <object class="IBObjectRecord"> - <int key="objectID">215</int> - <reference key="object" ref="798240356"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="975305481"/> - </object> - <reference key="parent" ref="92351498"/> + <string key="id">376</string> + <reference key="object" ref="778199390"/> + <reference key="parent" ref="147746186"/> </object> <object class="IBObjectRecord"> - <int key="objectID">216</int> - <reference key="object" ref="975305481"/> - <reference key="parent" ref="798240356"/> + <string key="id">378</string> + <reference key="object" ref="384131700"/> + <array class="NSMutableArray" key="children"> + <reference ref="328702140"/> + </array> + <reference key="parent" ref="432685731"/> </object> <object class="IBObjectRecord"> - <int key="objectID">271</int> - <reference key="object" ref="141370142"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="606007744"/> - </object> - <reference key="parent" ref="92351498"/> + <string key="id">379</string> + <reference key="object" ref="328702140"/> + <reference key="parent" ref="384131700"/> </object> <object class="IBObjectRecord"> - <int key="objectID">272</int> - <reference key="object" ref="606007744"/> - <reference key="parent" ref="141370142"/> + <string key="id">365</string> + <reference key="object" ref="1029861158"/> + <array class="NSMutableArray" key="children"> + <reference ref="666432193"/> + </array> + <reference key="parent" ref="432685731"/> </object> <object class="IBObjectRecord"> - <int key="objectID">226</int> - <reference key="object" ref="598619000"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="953108737"/> - </object> - <reference key="parent" ref="92351498"/> + <string key="id">366</string> + <reference key="object" ref="666432193"/> + <reference key="parent" ref="1029861158"/> </object> <object class="IBObjectRecord"> - <int key="objectID">227</int> - <reference key="object" ref="953108737"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="501672847"/> - </object> - <reference key="parent" ref="598619000"/> + <string key="id">372</string> + <reference key="object" ref="351711265"/> + <array class="NSMutableArray" key="children"> + <reference ref="88587267"/> + </array> + <reference key="parent" ref="432685731"/> </object> <object class="IBObjectRecord"> - <int key="objectID">228</int> - <reference key="object" ref="501672847"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="272743761"/> - <reference ref="607756368"/> - <reference ref="372655630"/> - </object> - <reference key="parent" ref="953108737"/> + <string key="id">373</string> + <reference key="object" ref="88587267"/> + <reference key="parent" ref="351711265"/> </object> <object class="IBObjectRecord"> - <int key="objectID">231</int> - <reference key="object" ref="372655630"/> - <reference key="parent" ref="501672847"/> + <string key="id">252</string> + <reference key="object" ref="758551503"/> + <array class="NSMutableArray" key="children"> + <reference ref="721434635"/> + <reference ref="982988884"/> + <reference ref="774269445"/> + </array> + <reference key="parent" ref="929670820"/> </object> <object class="IBObjectRecord"> - <int key="objectID">230</int> - <reference key="object" ref="607756368"/> - <reference key="parent" ref="501672847"/> + <string key="id">213</string> + <reference key="object" ref="721434635"/> + <reference key="parent" ref="758551503"/> </object> <object class="IBObjectRecord"> - <int key="objectID">229</int> - <reference key="object" ref="272743761"/> - <reference key="parent" ref="501672847"/> + <string key="id">261</string> + <reference key="object" ref="982988884"/> + <array class="NSMutableArray" key="children"> + <reference ref="481130630"/> + </array> + <reference key="parent" ref="758551503"/> </object> <object class="IBObjectRecord"> - <int key="objectID">234</int> - <reference key="object" ref="66510867"/> - <object class="NSMutableArray" key="children"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference ref="567286013"/> - </object> - <reference key="parent" ref="92351498"/> + <string key="id">262</string> + <reference key="object" ref="481130630"/> + <reference key="parent" ref="982988884"/> </object> <object class="IBObjectRecord"> - <int key="objectID">235</int> - <reference key="object" ref="567286013"/> - <reference key="parent" ref="66510867"/> + <string key="id">223</string> + <reference key="object" ref="774269445"/> + <array class="NSMutableArray" key="children"> + <reference ref="547191345"/> + </array> + <reference key="parent" ref="758551503"/> </object> <object class="IBObjectRecord"> - <int key="objectID">207</int> - <reference key="object" ref="48693112"/> - <reference key="parent" ref="49161063"/> + <string key="id">224</string> + <reference key="object" ref="547191345"/> + <reference key="parent" ref="774269445"/> </object> - </object> + </array> </object> - <object class="NSMutableDictionary" key="flattenedProperties"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>-1.IBPluginDependency</string> - <string>-2.IBPluginDependency</string> - <string>-3.IBPluginDependency</string> - <string>165.IBPluginDependency</string> - <string>207.IBPluginDependency</string> - <string>209.IBPluginDependency</string> - <string>210.IBPluginDependency</string> - <string>213.IBPluginDependency</string> - <string>215.IBAttributePlaceholdersKey</string> - <string>215.IBPluginDependency</string> - <string>215.IBViewIntegration.shadowBlurRadius</string> - <string>215.IBViewIntegration.shadowColor</string> - <string>215.IBViewIntegration.shadowOffsetHeight</string> - <string>215.IBViewIntegration.shadowOffsetWidth</string> - <string>216.IBPluginDependency</string> - <string>223.IBPluginDependency</string> - <string>224.IBPluginDependency</string> - <string>226.IBAttributePlaceholdersKey</string> - <string>226.IBPluginDependency</string> - <string>227.IBPluginDependency</string> - <string>228.IBPluginDependency</string> - <string>229.IBPluginDependency</string> - <string>230.IBPluginDependency</string> - <string>231.IBPluginDependency</string> - <string>234.IBPluginDependency</string> - <string>235.IBPluginDependency</string> - <string>251.IBPluginDependency</string> - <string>251.IBViewIntegration.shadowBlurRadius</string> - <string>251.IBViewIntegration.shadowColor</string> - <string>251.IBViewIntegration.shadowOffsetHeight</string> - <string>251.IBViewIntegration.shadowOffsetWidth</string> - <string>252.IBPluginDependency</string> - <string>252.IBViewIntegration.shadowBlurRadius</string> - <string>252.IBViewIntegration.shadowColor</string> - <string>252.IBViewIntegration.shadowOffsetHeight</string> - <string>252.IBViewIntegration.shadowOffsetWidth</string> - <string>261.IBAttributePlaceholdersKey</string> - <string>261.IBPluginDependency</string> - <string>262.IBPluginDependency</string> - <string>271.IBAttributePlaceholdersKey</string> - <string>271.IBPluginDependency</string> - <string>271.IBViewIntegration.shadowBlurRadius</string> - <string>271.IBViewIntegration.shadowColor</string> - <string>271.IBViewIntegration.shadowOffsetHeight</string> - <string>271.IBViewIntegration.shadowOffsetWidth</string> - <string>272.IBPluginDependency</string> - <string>275.IBAttributePlaceholdersKey</string> - <string>275.IBPluginDependency</string> - <string>275.IBViewIntegration.shadowBlurRadius</string> - <string>275.IBViewIntegration.shadowColor</string> - <string>275.IBViewIntegration.shadowOffsetHeight</string> - <string>275.IBViewIntegration.shadowOffsetWidth</string> - <string>276.IBPluginDependency</string> - <string>280.IBPluginDependency</string> - <string>281.IBPluginDependency</string> - <string>335.IBPluginDependency</string> - <string>335.IBViewIntegration.shadowBlurRadius</string> - <string>335.IBViewIntegration.shadowColor</string> - <string>335.IBViewIntegration.shadowOffsetHeight</string> - <string>335.IBViewIntegration.shadowOffsetWidth</string> - <string>341.IBPluginDependency</string> - <string>346.IBPluginDependency</string> - <string>361.IBAttributePlaceholdersKey</string> - <string>361.IBPluginDependency</string> - <string>362.IBPluginDependency</string> - <string>365.IBAttributePlaceholdersKey</string> - <string>365.IBPluginDependency</string> - <string>365.IBViewIntegration.shadowBlurRadius</string> - <string>365.IBViewIntegration.shadowColor</string> - <string>365.IBViewIntegration.shadowOffsetHeight</string> - <string>365.IBViewIntegration.shadowOffsetWidth</string> - <string>366.IBPluginDependency</string> - <string>372.IBPluginDependency</string> - <string>373.IBPluginDependency</string> - <string>375.IBAttributePlaceholdersKey</string> - <string>375.IBPluginDependency</string> - <string>376.IBPluginDependency</string> - <string>378.IBAttributePlaceholdersKey</string> - <string>378.IBPluginDependency</string> - <string>379.IBPluginDependency</string> - <string>38.IBPluginDependency</string> - <string>5.IBPluginDependency</string> - <string>5.IBWindowTemplateEditedContentRect</string> - <string>6.IBPluginDependency</string> - <string>6.IBViewIntegration.shadowBlurRadius</string> - <string>6.IBViewIntegration.shadowColor</string> - <string>6.IBViewIntegration.shadowOffsetHeight</string> - <string>6.IBViewIntegration.shadowOffsetWidth</string> - </object> - <object class="NSArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.QTKitIBPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="798240356"/> - <string key="toolTip">Encode And Play Back A Live Preview At Your Current Settings</string> - </object> + <dictionary class="NSMutableDictionary" key="flattenedProperties"> + <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="-1.showNotes"/> + <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="-2.showNotes"/> + <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="-3.showNotes"/> + <string key="165.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="165.showNotes"/> + <string key="207.IBPluginDependency">com.apple.QTKitIBPlugin</string> + <reference key="207.IBUserGuides" ref="0"/> + <boolean value="NO" key="207.showNotes"/> + <string key="209.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="209.IBUserGuides" ref="0"/> + <boolean value="NO" key="209.showNotes"/> + <string key="210.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="210.showNotes"/> + <string key="213.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="213.IBUserGuides" ref="0"/> + <boolean value="NO" key="213.showNotes"/> + <object class="NSMutableDictionary" key="215.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="314619144"/> + <string key="toolTip">Encode And Play Back A Live Preview At Your Current Settings</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="0"/> - <object class="NSColor" id="864448722"> - <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MAA</bytes> - </object> - <integer value="0"/> - <integer value="0"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="598619000"/> - <string key="toolTip">Select The Length Of Live Preview to Encode</string> - </object> + </object> + <string key="215.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="215.IBUserGuides" ref="0"/> + <boolean value="NO" key="215.showNotes"/> + <string key="216.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="216.showNotes"/> + <string key="223.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="223.IBUserGuides" ref="0"/> + <boolean value="NO" key="223.showNotes"/> + <string key="224.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="224.showNotes"/> + <object class="NSMutableDictionary" key="226.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="967936319"/> + <string key="toolTip">Select The Length Of Live Preview to Encode</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="0"/> - <reference ref="864448722"/> - <integer value="0"/> - <integer value="0"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="0"/> - <reference ref="864448722"/> - <integer value="0"/> - <integer value="0"/> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="569473100"/> - <string key="toolTip">Cancel Live Preview Encode</string> - </object> + </object> + <string key="226.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="226.IBUserGuides" ref="0"/> + <boolean value="NO" key="226.showNotes"/> + <string key="227.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="227.showNotes"/> + <string key="228.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="228.showNotes"/> + <string key="229.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="229.showNotes"/> + <string key="230.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="230.showNotes"/> + <string key="231.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="231.showNotes"/> + <string key="234.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="234.IBUserGuides" ref="0"/> + <boolean value="NO" key="234.showNotes"/> + <string key="235.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="235.showNotes"/> + <string key="251.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="251.IBUserGuides" ref="0"/> + <boolean value="NO" key="251.showNotes"/> + <string key="252.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="252.IBUserGuides" ref="0"/> + <boolean value="NO" key="252.showNotes"/> + <object class="NSMutableDictionary" key="261.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="982988884"/> + <string key="toolTip">Cancel Live Preview Encode</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="141370142"/> - <string key="toolTip">Show Picture Settings Inspector</string> - </object> + </object> + <string key="261.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="261.IBUserGuides" ref="0"/> + <boolean value="NO" key="261.showNotes"/> + <string key="262.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="262.showNotes"/> + <object class="NSMutableDictionary" key="271.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="394714670"/> + <string key="toolTip">Show Picture Settings Inspector</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="0"/> - <reference ref="864448722"/> - <integer value="0"/> - <integer value="0"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="81685190"/> - <string key="toolTip">Scale Preview To Screen</string> - </object> + </object> + <string key="271.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="271.IBUserGuides" ref="0"/> + <boolean value="NO" key="271.showNotes"/> + <string key="272.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="272.showNotes"/> + <object class="NSMutableDictionary" key="275.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="327371770"/> + <string key="toolTip">Scale Preview To Screen</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="0"/> - <reference ref="864448722"/> - <integer value="0"/> - <integer value="0"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="0"/> - <reference ref="864448722"/> - <integer value="0"/> - <integer value="0"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="102183813"/> - <string key="toolTip">Toggle Play/Pause</string> - </object> + </object> + <string key="275.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="275.IBUserGuides" ref="0"/> + <boolean value="NO" key="275.showNotes"/> + <string key="276.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="276.showNotes"/> + <string key="280.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="280.IBUserGuides" ref="0"/> + <boolean value="NO" key="280.showNotes"/> + <string key="281.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="281.showNotes"/> + <string key="335.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="335.IBUserGuides" ref="0"/> + <boolean value="NO" key="335.showNotes"/> + <string key="341.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="341.IBUserGuides" ref="0"/> + <boolean value="NO" key="341.showNotes"/> + <string key="346.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="346.showNotes"/> + <object class="NSMutableDictionary" key="361.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="152429490"/> + <string key="toolTip">Toggle Play/Pause</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="630042886"/> - <string key="toolTip">Show Still Previews</string> - </object> + </object> + <string key="361.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="361.IBUserGuides" ref="0"/> + <boolean value="NO" key="361.showNotes"/> + <string key="362.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="362.showNotes"/> + <object class="NSMutableDictionary" key="365.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="1029861158"/> + <string key="toolTip">Show Still Previews</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <integer value="0"/> - <reference ref="864448722"/> - <integer value="0"/> - <integer value="0"/> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="897614796"/> - <string key="toolTip">Go To Beginning</string> - </object> + </object> + <string key="365.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="365.IBUserGuides" ref="0"/> + <boolean value="NO" key="365.showNotes"/> + <string key="366.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="366.showNotes"/> + <string key="372.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="372.IBUserGuides" ref="0"/> + <boolean value="NO" key="372.showNotes"/> + <string key="373.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="373.showNotes"/> + <object class="NSMutableDictionary" key="375.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="147746186"/> + <string key="toolTip">Go To Beginning</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <object class="NSMutableDictionary"> - <string key="NS.key.0">ToolTip</string> - <object class="IBToolTipAttribute" key="NS.object.0"> - <string key="name">ToolTip</string> - <reference key="object" ref="894608246"/> - <string key="toolTip">Go To End</string> - </object> + </object> + <string key="375.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="375.IBUserGuides" ref="0"/> + <boolean value="NO" key="375.showNotes"/> + <string key="376.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="376.showNotes"/> + <object class="NSMutableDictionary" key="378.IBAttributePlaceholdersKey"> + <string key="NS.key.0">ToolTip</string> + <object class="IBToolTipAttribute" key="NS.object.0"> + <string key="name">ToolTip</string> + <reference key="object" ref="384131700"/> + <string key="toolTip">Go To End</string> </object> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{262, 474}, {490, 360}}</string> - <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <real value="0.0"/> - <reference ref="864448722"/> - <real value="0.0"/> - <real value="0.0"/> </object> - </object> - <object class="NSMutableDictionary" key="unlocalizedProperties"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference key="dict.sortedKeys" ref="0"/> - <reference key="dict.values" ref="0"/> - </object> + <string key="378.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="378.IBUserGuides" ref="0"/> + <boolean value="NO" key="378.showNotes"/> + <string key="379.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="379.showNotes"/> + <string key="38.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="38.IBUserGuides" ref="0"/> + <boolean value="NO" key="38.showNotes"/> + <boolean value="NO" key="5.IBNSWindowAutoPositionCentersHorizontal"/> + <boolean value="NO" key="5.IBNSWindowAutoPositionCentersVertical"/> + <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <boolean value="NO" key="5.showNotes"/> + <string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string> + <reference key="6.IBUserGuides" ref="0"/> + <boolean value="NO" key="6.showNotes"/> + </dictionary> + <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/> <nil key="activeLocalization"/> - <object class="NSMutableDictionary" key="localizations"> - <bool key="EncodedWithXMLCoder">YES</bool> - <reference key="dict.sortedKeys" ref="0"/> - <reference key="dict.values" ref="0"/> - </object> + <dictionary class="NSMutableDictionary" key="localizations"/> <nil key="sourceID"/> - <int key="maxID">396</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> - <object class="NSMutableArray" key="referencedPartialClassDescriptions"> - <bool key="EncodedWithXMLCoder">YES</bool> + <array class="NSMutableArray" key="referencedPartialClassDescriptions"> <object class="IBPartialClassDescription"> - <string key="className">PreviewController</string> + <string key="className">HBPreviewController</string> <string key="superclassName">NSWindowController</string> - <object class="NSMutableDictionary" key="actions"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>cancelCreateMoviePreview:</string> - <string>createMoviePreview:</string> - <string>moviePlaybackGoBackwardOneFrame:</string> - <string>moviePlaybackGoForwardOneFrame:</string> - <string>moviePlaybackGoToBeginning:</string> - <string>moviePlaybackGoToEnd:</string> - <string>pictureSliderChanged:</string> - <string>previewDurationPopUpChanged:</string> - <string>previewScrubberChanged:</string> - <string>settingsChanged:</string> - <string>showMoviePreview:</string> - <string>showPictureSettings:</string> - <string>showPicturesPreview:</string> - <string>toggleMoviePreviewPlayPause:</string> - <string>toggleScaleToScreen:</string> + <dictionary class="NSMutableDictionary" key="actions"> + <string key="cancelCreateMoviePreview:">id</string> + <string key="createMoviePreview:">id</string> + <string key="moviePlaybackGoToBeginning:">id</string> + <string key="moviePlaybackGoToEnd:">id</string> + <string key="pictureSliderChanged:">id</string> + <string key="previewDurationPopUpChanged:">id</string> + <string key="previewScrubberChanged:">id</string> + <string key="showPictureSettings:">id</string> + <string key="showPicturesPreview:">id</string> + <string key="showWindow:">id</string> + <string key="toggleMoviePreviewPlayPause:">id</string> + <string key="toggleScaleToScreen:">id</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="actionInfosByName"> + <object class="IBActionInfo" key="cancelCreateMoviePreview:"> + <string key="name">cancelCreateMoviePreview:</string> + <string key="candidateClassName">id</string> </object> - <object class="NSArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>NSString</string> - <string>id</string> - <string>id</string> - <string>id</string> - <string>id</string> + <object class="IBActionInfo" key="createMoviePreview:"> + <string key="name">createMoviePreview:</string> + <string key="candidateClassName">id</string> </object> - </object> - <object class="NSMutableDictionary" key="actionInfosByName"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>cancelCreateMoviePreview:</string> - <string>createMoviePreview:</string> - <string>moviePlaybackGoBackwardOneFrame:</string> - <string>moviePlaybackGoForwardOneFrame:</string> - <string>moviePlaybackGoToBeginning:</string> - <string>moviePlaybackGoToEnd:</string> - <string>pictureSliderChanged:</string> - <string>previewDurationPopUpChanged:</string> - <string>previewScrubberChanged:</string> - <string>settingsChanged:</string> - <string>showMoviePreview:</string> - <string>showPictureSettings:</string> - <string>showPicturesPreview:</string> - <string>toggleMoviePreviewPlayPause:</string> - <string>toggleScaleToScreen:</string> + <object class="IBActionInfo" key="moviePlaybackGoToBeginning:"> + <string key="name">moviePlaybackGoToBeginning:</string> + <string key="candidateClassName">id</string> </object> - <object class="NSArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBActionInfo"> - <string key="name">cancelCreateMoviePreview:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">createMoviePreview:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">moviePlaybackGoBackwardOneFrame:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">moviePlaybackGoForwardOneFrame:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">moviePlaybackGoToBeginning:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">moviePlaybackGoToEnd:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">pictureSliderChanged:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">previewDurationPopUpChanged:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">previewScrubberChanged:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">settingsChanged:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">showMoviePreview:</string> - <string key="candidateClassName">NSString</string> - </object> - <object class="IBActionInfo"> - <string key="name">showPictureSettings:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">showPicturesPreview:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">toggleMoviePreviewPlayPause:</string> - <string key="candidateClassName">id</string> - </object> - <object class="IBActionInfo"> - <string key="name">toggleScaleToScreen:</string> - <string key="candidateClassName">id</string> - </object> + <object class="IBActionInfo" key="moviePlaybackGoToEnd:"> + <string key="name">moviePlaybackGoToEnd:</string> + <string key="candidateClassName">id</string> </object> - </object> - <object class="NSMutableDictionary" key="outlets"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>fCancelPreviewMovieButton</string> - <string>fCreatePreviewMovieButton</string> - <string>fEncodingControlBox</string> - <string>fGoBackwardOneFrameButton</string> - <string>fGoForwardOneFrameButton</string> - <string>fGoToBeginningButton</string> - <string>fGoToEndButton</string> - <string>fGoToStillPreviewButton</string> - <string>fInfoField</string> - <string>fMovieCreationProgressIndicator</string> - <string>fMovieInfoField</string> - <string>fMoviePlaybackControlBox</string> - <string>fMovieScrubberSlider</string> - <string>fMovieView</string> - <string>fPictureControlBox</string> - <string>fPictureSettingsToggleButton</string> - <string>fPictureSlider</string> - <string>fPlayPauseButton</string> - <string>fPreviewMovieLengthPopUp</string> - <string>fPreviewMovieStatusField</string> - <string>fScaleToScreenToggleButton</string> - <string>fShowPreviewMovieButton</string> - <string>fscaleInfoField</string> + <object class="IBActionInfo" key="pictureSliderChanged:"> + <string key="name">pictureSliderChanged:</string> + <string key="candidateClassName">id</string> </object> - <object class="NSArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSButton</string> - <string>NSButton</string> - <string>NSBox</string> - <string>NSButton</string> - <string>NSButton</string> - <string>NSButton</string> - <string>NSButton</string> - <string>NSButton</string> - <string>NSTextField</string> - <string>NSProgressIndicator</string> - <string>NSTextField</string> - <string>NSBox</string> - <string>NSSlider</string> - <string>QTMovieView</string> - <string>NSBox</string> - <string>NSButton</string> - <string>NSSlider</string> - <string>NSButton</string> - <string>NSPopUpButton</string> - <string>NSTextField</string> - <string>NSButton</string> - <string>NSButton</string> - <string>NSTextField</string> + <object class="IBActionInfo" key="previewDurationPopUpChanged:"> + <string key="name">previewDurationPopUpChanged:</string> + <string key="candidateClassName">id</string> </object> - </object> - <object class="NSMutableDictionary" key="toOneOutletInfosByName"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>fCancelPreviewMovieButton</string> - <string>fCreatePreviewMovieButton</string> - <string>fEncodingControlBox</string> - <string>fGoBackwardOneFrameButton</string> - <string>fGoForwardOneFrameButton</string> - <string>fGoToBeginningButton</string> - <string>fGoToEndButton</string> - <string>fGoToStillPreviewButton</string> - <string>fInfoField</string> - <string>fMovieCreationProgressIndicator</string> - <string>fMovieInfoField</string> - <string>fMoviePlaybackControlBox</string> - <string>fMovieScrubberSlider</string> - <string>fMovieView</string> - <string>fPictureControlBox</string> - <string>fPictureSettingsToggleButton</string> - <string>fPictureSlider</string> - <string>fPlayPauseButton</string> - <string>fPreviewMovieLengthPopUp</string> - <string>fPreviewMovieStatusField</string> - <string>fScaleToScreenToggleButton</string> - <string>fShowPreviewMovieButton</string> - <string>fscaleInfoField</string> + <object class="IBActionInfo" key="previewScrubberChanged:"> + <string key="name">previewScrubberChanged:</string> + <string key="candidateClassName">id</string> </object> - <object class="NSArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="IBToOneOutletInfo"> - <string key="name">fCancelPreviewMovieButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fCreatePreviewMovieButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fEncodingControlBox</string> - <string key="candidateClassName">NSBox</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fGoBackwardOneFrameButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fGoForwardOneFrameButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fGoToBeginningButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fGoToEndButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fGoToStillPreviewButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fInfoField</string> - <string key="candidateClassName">NSTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fMovieCreationProgressIndicator</string> - <string key="candidateClassName">NSProgressIndicator</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fMovieInfoField</string> - <string key="candidateClassName">NSTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fMoviePlaybackControlBox</string> - <string key="candidateClassName">NSBox</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fMovieScrubberSlider</string> - <string key="candidateClassName">NSSlider</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fMovieView</string> - <string key="candidateClassName">QTMovieView</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fPictureControlBox</string> - <string key="candidateClassName">NSBox</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fPictureSettingsToggleButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fPictureSlider</string> - <string key="candidateClassName">NSSlider</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fPlayPauseButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fPreviewMovieLengthPopUp</string> - <string key="candidateClassName">NSPopUpButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fPreviewMovieStatusField</string> - <string key="candidateClassName">NSTextField</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fScaleToScreenToggleButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fShowPreviewMovieButton</string> - <string key="candidateClassName">NSButton</string> - </object> - <object class="IBToOneOutletInfo"> - <string key="name">fscaleInfoField</string> - <string key="candidateClassName">NSTextField</string> - </object> + <object class="IBActionInfo" key="showPictureSettings:"> + <string key="name">showPictureSettings:</string> + <string key="candidateClassName">id</string> </object> - </object> + <object class="IBActionInfo" key="showPicturesPreview:"> + <string key="name">showPicturesPreview:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="showWindow:"> + <string key="name">showWindow:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="toggleMoviePreviewPlayPause:"> + <string key="name">toggleMoviePreviewPlayPause:</string> + <string key="candidateClassName">id</string> + </object> + <object class="IBActionInfo" key="toggleScaleToScreen:"> + <string key="name">toggleScaleToScreen:</string> + <string key="candidateClassName">id</string> + </object> + </dictionary> + <dictionary class="NSMutableDictionary" key="outlets"> + <string key="fEncodingControlBox">NSBox</string> + <string key="fInfoField">NSTextField</string> + <string key="fMovieCreationProgressIndicator">NSProgressIndicator</string> + <string key="fMovieInfoField">NSTextField</string> + <string key="fMoviePlaybackControlBox">NSBox</string> + <string key="fMovieScrubberSlider">NSSlider</string> + <string key="fMovieView">QTMovieView</string> + <string key="fPictureControlBox">NSBox</string> + <string key="fPictureSlider">NSSlider</string> + <string key="fPlayPauseButton">NSButton</string> + <string key="fPreviewMovieLengthPopUp">NSPopUpButton</string> + <string key="fPreviewMovieStatusField">NSTextField</string> + <string key="fScaleToScreenToggleButton">NSButton</string> + <string key="fscaleInfoField">NSTextField</string> + </dictionary> + <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName"> + <object class="IBToOneOutletInfo" key="fEncodingControlBox"> + <string key="name">fEncodingControlBox</string> + <string key="candidateClassName">NSBox</string> + </object> + <object class="IBToOneOutletInfo" key="fInfoField"> + <string key="name">fInfoField</string> + <string key="candidateClassName">NSTextField</string> + </object> + <object class="IBToOneOutletInfo" key="fMovieCreationProgressIndicator"> + <string key="name">fMovieCreationProgressIndicator</string> + <string key="candidateClassName">NSProgressIndicator</string> + </object> + <object class="IBToOneOutletInfo" key="fMovieInfoField"> + <string key="name">fMovieInfoField</string> + <string key="candidateClassName">NSTextField</string> + </object> + <object class="IBToOneOutletInfo" key="fMoviePlaybackControlBox"> + <string key="name">fMoviePlaybackControlBox</string> + <string key="candidateClassName">NSBox</string> + </object> + <object class="IBToOneOutletInfo" key="fMovieScrubberSlider"> + <string key="name">fMovieScrubberSlider</string> + <string key="candidateClassName">NSSlider</string> + </object> + <object class="IBToOneOutletInfo" key="fMovieView"> + <string key="name">fMovieView</string> + <string key="candidateClassName">QTMovieView</string> + </object> + <object class="IBToOneOutletInfo" key="fPictureControlBox"> + <string key="name">fPictureControlBox</string> + <string key="candidateClassName">NSBox</string> + </object> + <object class="IBToOneOutletInfo" key="fPictureSlider"> + <string key="name">fPictureSlider</string> + <string key="candidateClassName">NSSlider</string> + </object> + <object class="IBToOneOutletInfo" key="fPlayPauseButton"> + <string key="name">fPlayPauseButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo" key="fPreviewMovieLengthPopUp"> + <string key="name">fPreviewMovieLengthPopUp</string> + <string key="candidateClassName">NSPopUpButton</string> + </object> + <object class="IBToOneOutletInfo" key="fPreviewMovieStatusField"> + <string key="name">fPreviewMovieStatusField</string> + <string key="candidateClassName">NSTextField</string> + </object> + <object class="IBToOneOutletInfo" key="fScaleToScreenToggleButton"> + <string key="name">fScaleToScreenToggleButton</string> + <string key="candidateClassName">NSButton</string> + </object> + <object class="IBToOneOutletInfo" key="fscaleInfoField"> + <string key="name">fscaleInfoField</string> + <string key="candidateClassName">NSTextField</string> + </object> + </dictionary> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBProjectSource</string> - <string key="minorKey">./Classes/PreviewController.h</string> + <string key="minorKey">./Classes/HBPreviewController.h</string> </object> </object> - </object> + </array> </object> <int key="IBDocument.localizationMode">0</int> <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string> + <bool key="IBDocument.previouslyAttemptedUpgradeToXcode5">YES</bool> <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies"> <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> - <integer value="1050" key="NS.object.0"/> + <integer value="1060" key="NS.object.0"/> + </object> + <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults"> + <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string> + <real value="1060" key="NS.object.0"/> </object> <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies"> <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string> - <integer value="3000" key="NS.object.0"/> + <integer value="4600" key="NS.object.0"/> </object> <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool> <int key="IBDocument.defaultPropertyAccessControl">3</int> - <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> - <bool key="EncodedWithXMLCoder">YES</bool> - <object class="NSArray" key="dict.sortedKeys"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>NSMenuCheckmark</string> - <string>NSMenuMixedState</string> - <string>next-p</string> - <string>pause-p</string> - <string>play-p</string> - <string>prev-p</string> - </object> - <object class="NSArray" key="dict.values"> - <bool key="EncodedWithXMLCoder">YES</bool> - <string>{11, 11}</string> - <string>{10, 3}</string> - <string>{48, 48}</string> - <string>{48, 48}</string> - <string>{48, 48}</string> - <string>{48, 48}</string> - </object> - </object> + <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes"> + <string key="NSMenuCheckmark">{11, 11}</string> + <string key="NSMenuMixedState">{10, 3}</string> + <string key="next-p">{48, 48}</string> + <string key="pause-p">{48, 48}</string> + <string key="play-p">{48, 48}</string> + <string key="prev-p">{48, 48}</string> + </dictionary> </data> </archive> diff --git a/macosx/HBPreviewController.h b/macosx/HBPreviewController.h index 99a8c3393..ed7fd19ab 100644 --- a/macosx/HBPreviewController.h +++ b/macosx/HBPreviewController.h @@ -1,130 +1,23 @@ /* $Id: HBPreviewController.h,v 1.6 2005/04/14 20:40:05 titer Exp $ - This file is part of the HandBrake source code. - Homepage: <http://handbrake.fr/>. - It may be used under the terms of the GNU General Public License. */ + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ #import <Cocoa/Cocoa.h> - #include "hb.h" -/* Needed for Quicktime movie previews */ -#import <QTKit/QTKit.h> @class HBController; -@interface PreviewController : NSWindowController <NSWindowDelegate> -{ - hb_handle_t * fHandle; - hb_title_t * fTitle; - - HBController * fHBController; // reference to HBController - - NSMutableDictionary * fPicturePreviews; // NSImages, one for each preview libhb creates, created lazily - int fPicture; - - CALayer * fWhiteBackground; - CALayer * fPictureLayer; - IBOutlet NSBox * fPictureControlBox; - IBOutlet NSBox * fEncodingControlBox; - IBOutlet NSBox * fMoviePlaybackControlBox; - - IBOutlet NSSlider * fPictureSlider; - IBOutlet NSTextField * fInfoField; - IBOutlet NSTextField * fscaleInfoField; - - CGFloat backingScaleFactor; - - /* Hud Control Overlay */ - NSTimer * fHudTimer; - int hudTimerSeconds; - - /* Full Screen Mode Toggle */ - BOOL scaleToScreen; - IBOutlet NSButton * fScaleToScreenToggleButton; - IBOutlet NSButton * fPictureSettingsToggleButton; - - /* Movie Previews */ - QTMovie * aMovie; - IBOutlet QTMovieView * fMovieView; - /* Playback Panel Controls */ - IBOutlet NSButton * fPlayPauseButton; - IBOutlet NSButton * fGoToBeginningButton; - IBOutlet NSButton * fGoToEndButton; - IBOutlet NSButton * fGoForwardOneFrameButton; - IBOutlet NSButton * fGoBackwardOneFrameButton; - IBOutlet NSSlider * fMovieScrubberSlider; - IBOutlet NSButton * fGoToStillPreviewButton; - IBOutlet NSTextField * fMovieInfoField; - NSTimer * fMovieTimer; - - IBOutlet NSButton * fCreatePreviewMovieButton; - IBOutlet NSButton * fCancelPreviewMovieButton; - IBOutlet NSButton * fShowPreviewMovieButton; - NSString * fPreviewMoviePath; - IBOutlet NSProgressIndicator * fMovieCreationProgressIndicator; - hb_handle_t * fPreviewLibhb; // private libhb for creating previews - NSInteger fEncodeState; - NSTimer * fLibhbTimer; // timer for retrieving state from libhb - IBOutlet NSTextField * fPreviewMovieStatusField; - IBOutlet NSPopUpButton * fPreviewMovieLengthPopUp; // popup of choices for length of preview in seconds -} - -@property (nonatomic, readwrite) BOOL deinterlacePreview; - -- (void) SetHandle: (hb_handle_t *) handle; -- (void) SetTitle: (hb_title_t *) title; -- (void) setHBController: (HBController *)controller; -- (void) displayPreview; - -- (IBAction) settingsChanged: (id) sender; -- (IBAction) pictureSliderChanged: (id) sender; -- (IBAction) showPictureSettings:(id)sender; -- (NSString*) pictureSizeInfoString; - -- (IBAction) toggleScaleToScreen:(id)sender; +@interface HBPreviewController : NSWindowController <NSWindowDelegate> -/* HUD overlay */ -- (void) enableHudControls; -- (void) disableHudControls; +@property (nonatomic) BOOL deinterlacePreview; +@property (nonatomic, readonly) NSString *pictureSizeInfoString; -- (void) startHudTimer; -- (void) stopHudTimer; +@property (nonatomic, assign) HBController *delegate; +@property (nonatomic, assign) hb_handle_t *handle; +@property (nonatomic, assign) hb_title_t *title; -/* Movie Previews */ -- (void) startReceivingLibhbNotifications; -- (void) stopReceivingLibhbNotifications; +- (void) reload; -- (void) installMovieCallbacks; -- (void) removeMovieCallbacks; - -- (IBAction) cancelCreateMoviePreview: (id) sender; -- (IBAction) createMoviePreview: (id) sender; -- (void) libhbStateChanged: (hb_state_t ) state; -- (IBAction) showMoviePreview: (NSString *) path; -- (IBAction) showPicturesPreview: (id) sender; -- (IBAction) toggleMoviePreviewPlayPause: (id) sender; -- (IBAction) moviePlaybackGoToBeginning: (id) sender; -- (IBAction) moviePlaybackGoToEnd: (id) sender; -- (IBAction) moviePlaybackGoBackwardOneFrame: (id) sender; -- (IBAction) moviePlaybackGoForwardOneFrame: (id) sender; - -- (void) initPreviewScrubberForMovie; -- (void) adjustPreviewScrubberForCurrentMovieTime; -- (IBAction) previewScrubberChanged: (id) sender; -- (BOOL) isPlaying; - -- (void) startMovieTimer; -- (void) stopMovieTimer; - -- (NSString*) SMTPETimecode: (QTTime)time; -- (QTTime)SliderToQTTime:(double)time; - -- (IBAction) previewDurationPopUpChanged: (id) sender; - -- (NSImage *) makeImageForPicture: (NSInteger)pictureIndex - libhb:(hb_handle_t*)handle - title:(hb_title_t*)title; -- (NSImage *) imageForPicture: (NSInteger) pictureIndex; -- (void) purgeImageCache; @end - diff --git a/macosx/HBPreviewController.m b/macosx/HBPreviewController.m index 49e01fd87..8cca74037 100644 --- a/macosx/HBPreviewController.m +++ b/macosx/HBPreviewController.m @@ -1,38 +1,135 @@ /* $Id: HBPreviewController.mm,v 1.11 2005/08/01 15:10:44 titer Exp $ - This file is part of the HandBrake source code. - Homepage: <http://handbrake.fr/>. - It may be used under the terms of the GNU General Public License. */ + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ #import "HBPreviewController.h" +#import "HBPreviewGenerator.h" #import "Controller.h" +#import <QTKit/QTKit.h> -#define BORDER_SIZE 2.0 +@implementation QTMovieView (HBQTMovieViewExtensions) -@implementation QTMovieView (HBExtensions) -- (void) mouseMoved:(NSEvent *)theEvent +- (void) mouseMoved: (NSEvent *) theEvent { [super mouseMoved:theEvent]; } + +@end + +@implementation QTMovie (HBQTMovieExtensions) + +- (BOOL) isPlaying +{ + if ([self rate]) + return YES; + else + return NO; +} + +- (NSString *) timecode +{ + QTTime time = [self currentTime]; + double timeInSeconds = (double)time.timeValue / time.timeScale; + UInt16 seconds = fmod(timeInSeconds, 60.0); + UInt16 minutes = fmod(timeInSeconds / 60.0, 60.0); + UInt16 hours = timeInSeconds / (60.0 * 60.0); + UInt16 milliseconds = (timeInSeconds - (int) timeInSeconds) * 1000; + return [NSString stringWithFormat:@"%02d:%02d:%02d.%03d", hours, minutes, seconds, milliseconds]; +} + +- (void) setCurrentTimeDouble: (double) value +{ + long timeScale = [[self attributeForKey:QTMovieTimeScaleAttribute] longValue]; + [self setCurrentTime:QTMakeTime(value * timeScale, timeScale)]; +} + @end #if MAC_OS_X_VERSION_MAX_ALLOWED < 1070 @interface NSWindow(HBExtensions) - @property (readonly) CGFloat backingScaleFactor; - @end #endif -@interface PreviewController (Private) +#define BORDER_SIZE 2.0 +#define MIN_WIDTH 480.0 +#define MIN_HEIGHT 360.0 + +#define ANIMATION_DUR 0.2 + +typedef enum ViewMode : NSUInteger { + ViewModePicturePreview, + ViewModeEncoding, + ViewModeMoviePreview +} ViewMode; + +@interface HBPreviewController () <HBPreviewGeneratorDelegate> +{ + /* HUD boxes */ + IBOutlet NSBox * fPictureControlBox; + IBOutlet NSBox * fEncodingControlBox; + IBOutlet NSBox * fMoviePlaybackControlBox; + + IBOutlet NSSlider * fPictureSlider; + IBOutlet NSTextField * fInfoField; + IBOutlet NSTextField * fscaleInfoField; + + /* Full Screen Mode Toggle */ + IBOutlet NSButton * fScaleToScreenToggleButton; + + /* Movie Previews */ + IBOutlet QTMovieView * fMovieView; + /* Playback Panel Controls */ + IBOutlet NSButton * fPlayPauseButton; + IBOutlet NSSlider * fMovieScrubberSlider; + IBOutlet NSTextField * fMovieInfoField; + + IBOutlet NSProgressIndicator * fMovieCreationProgressIndicator; + IBOutlet NSTextField * fPreviewMovieStatusField; + + /* Popup of choices for length of preview in seconds */ + IBOutlet NSPopUpButton * fPreviewMovieLengthPopUp; +} + +@property (nonatomic) CALayer *backLayer; +@property (nonatomic) CALayer *pictureLayer; + +@property (nonatomic) CGFloat backingScaleFactor; + +@property (nonatomic) ViewMode currentViewMode; +@property (nonatomic) BOOL scaleToScreen; + +@property (nonatomic, retain) NSTimer *hudTimer; + +@property (nonatomic, retain) HBPreviewGenerator *generator; +@property (nonatomic) NSUInteger pictureIndex; + +@property (nonatomic, retain) QTMovie *movie; +@property (nonatomic, retain) NSTimer *movieTimer; + +/* Pictures HUD actions */ +- (IBAction) previewDurationPopUpChanged: (id) sender; +- (IBAction) pictureSliderChanged: (id) sender; +- (IBAction) showPictureSettings:(id)sender; +- (IBAction) toggleScaleToScreen:(id)sender; + +- (IBAction) cancelCreateMoviePreview: (id) sender; +- (IBAction) createMoviePreview: (id) sender; + +/* Movie HUD actions */ +- (IBAction) showPicturesPreview: (id) sender; +- (IBAction) toggleMoviePreviewPlayPause: (id) sender; +- (IBAction) moviePlaybackGoToBeginning: (id) sender; +- (IBAction) moviePlaybackGoToEnd: (id) sender; +- (IBAction) previewScrubberChanged: (id) sender; -- (NSSize)optimalViewSizeForImageSize: (NSSize)imageSize; -- (void)resizeWindowForViewSize: (NSSize)viewSize; @end -@implementation PreviewController +@implementation HBPreviewController -- (id)init +- (id) init { if (self = [super initWithWindowNibName:@"PicturePreview"]) { @@ -45,21 +142,12 @@ // If/when we switch a lot of this stuff to bindings, this can probably // go away. [self window]; - - fPicturePreviews = [[NSMutableDictionary alloc] init]; - /* Init libhb with check for updates libhb style set to "0" so its ignored and lets sparkle take care of it */ - int loggingLevel = [[[NSUserDefaults standardUserDefaults] objectForKey:@"LoggingLevel"] intValue]; - fPreviewLibhb = hb_init(loggingLevel, 0); - } - return self; -} -- (void)setHBController: (HBController *)controller -{ - fHBController = controller; + } + return self; } -- (void)awakeFromNib +- (void) awakeFromNib { [[self window] setDelegate:self]; @@ -68,274 +156,563 @@ [self setWindowFrameAutosaveName:@"Preview"]; [[self window] setExcludedFromWindowsMenu:YES]; - + /* lets set the preview window to accept mouse moved events */ [[self window] setAcceptsMouseMovedEvents:YES]; - [self startReceivingLibhbNotifications]; - - hudTimerSeconds = 0; + /* we set the progress indicator to not use threaded animation * as it causes a conflict with the qtmovieview's controllerbar - */ + */ [fMovieCreationProgressIndicator setUsesThreadedAnimation:NO]; - - /* we set the preview length popup in seconds */ - [fPreviewMovieLengthPopUp removeAllItems]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"15"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"30"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"45"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"60"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"90"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"105"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"120"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"135"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"150"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"165"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"180"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"195"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"210"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"225"]; - [fPreviewMovieLengthPopUp addItemWithTitle: @"240"]; [fMovieView setHidden:YES]; [fMovieView setDelegate:self]; + [fMovieView setControllerVisible:NO]; + + /* we set the preview length popup in seconds */ + [fPreviewMovieLengthPopUp removeAllItems]; + [fPreviewMovieLengthPopUp addItemsWithTitles:@[@"15", @"30", @"45", @"60", @"90", + @"120", @"150", @"180", @"210", @"240"]]; + + if ([[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewLength"]) + [fPreviewMovieLengthPopUp selectItemWithTitle:[[NSUserDefaults standardUserDefaults] + objectForKey:@"PreviewLength"]]; + if (![fPreviewMovieLengthPopUp selectedItem]) + /* currently hard set default to 15 seconds */ + [fPreviewMovieLengthPopUp selectItemAtIndex: 0]; /* Setup our layers for core animation */ [[[self window] contentView] setWantsLayer:YES]; [fPictureControlBox setWantsLayer:YES]; [fEncodingControlBox setWantsLayer:YES]; [fMoviePlaybackControlBox setWantsLayer:YES]; - - fWhiteBackground = [CALayer layer]; - [fWhiteBackground setBounds:CGRectMake(0.0, 0.0, 480.0, 360.0)]; - [fWhiteBackground setPosition:CGPointMake([[[self window] contentView] frame].size.width /2, - [[[self window] contentView] frame].size.height /2)]; - - [fWhiteBackground setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; + + self.backLayer = [CALayer layer]; + [self.backLayer setBounds:CGRectMake(0.0, 0.0, MIN_WIDTH, MIN_HEIGHT)]; + [self.backLayer setPosition:CGPointMake([[[self window] contentView] frame].size.width /2, + [[[self window] contentView] frame].size.height /2)]; + + [self.backLayer setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; CGColorRef white = CGColorCreateGenericRGB(1.0, 1.0, 1.0, 1.0); - [fWhiteBackground setBackgroundColor: white]; + [self.backLayer setBackgroundColor: white]; CFRelease(white); - [fWhiteBackground setShadowOpacity:0.5f]; - [fWhiteBackground setShadowOffset:CGSizeMake(0, 0)]; + [self.backLayer setShadowOpacity:0.5f]; + [self.backLayer setShadowOffset:CGSizeMake(0, 0)]; - fPictureLayer = [CALayer layer]; - [fPictureLayer setBounds:CGRectMake(0.0, 0.0, 476.0, 356.0)]; - [fPictureLayer setPosition:CGPointMake([[[self window] contentView] frame].size.width /2, - [[[self window] contentView] frame].size.height /2)]; - - [fPictureLayer setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; + self.pictureLayer = [CALayer layer]; + [self.pictureLayer setBounds:CGRectMake(0.0, 0.0, MIN_WIDTH - (BORDER_SIZE * 2), MIN_HEIGHT - (BORDER_SIZE * 2))]; + [self.pictureLayer setPosition:CGPointMake([[[self window] contentView] frame].size.width /2, + [[[self window] contentView] frame].size.height /2)]; - NSMutableDictionary *actions = [NSMutableDictionary - dictionaryWithDictionary:[fPictureLayer actions]]; + [self.pictureLayer setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; // Disable fade on contents change + NSMutableDictionary *actions = [NSMutableDictionary + dictionaryWithDictionary:[self.pictureLayer actions]]; + [actions setObject:[NSNull null] forKey:@"contents"]; - [fPictureLayer setActions:actions]; + [self.pictureLayer setActions:actions]; - [[[[self window] contentView] layer] insertSublayer:fWhiteBackground below: [fMovieView layer]]; - [[[[self window] contentView] layer] insertSublayer:fPictureLayer below: [fMovieView layer]]; + [[[[self window] contentView] layer] insertSublayer:self.backLayer below: [fMovieView layer]]; + [[[[self window] contentView] layer] insertSublayer:self.pictureLayer below: [fMovieView layer]]; /* relocate our hud origins */ NSPoint hudControlBoxOrigin = [fMoviePlaybackControlBox frame].origin; [fPictureControlBox setFrameOrigin:hudControlBoxOrigin]; [fEncodingControlBox setFrameOrigin:hudControlBoxOrigin]; [fMoviePlaybackControlBox setFrameOrigin:hudControlBoxOrigin]; - + + /* set the current scale factor */ if( [[self window] respondsToSelector:@selector( backingScaleFactor )] ) - backingScaleFactor = [[self window] backingScaleFactor]; + self.backingScaleFactor = [[self window] backingScaleFactor]; else - backingScaleFactor = 1.0; - - [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(titleChanged:) name: HBTitleChangedNotification object:nil]; + self.backingScaleFactor = 1.0; } -- (void) titleChanged: (NSNotification *) aNotification +- (void) setTitle: (hb_title_t *) title { - /* Notification from HBController, only used to stop - * an encoding while the HBController is scanning a new title - */ - [self cancelCreateMoviePreview:self]; + _title = title; + + [self.generator cancel]; + self.generator = nil; + + if (_title) + { + /* alloc and init a generator for the current title */ + self.generator = [[[HBPreviewGenerator alloc] initWithHandle:self.handle andTitle:self.title] autorelease]; + + /* adjust the preview slider length */ + [fPictureSlider setMaxValue: self.generator.imagesCount - 1.0]; + [fPictureSlider setNumberOfTickMarks: self.generator.imagesCount]; + + [self displayPreview]; + } } -- (void)windowWillClose:(NSNotification *)aNotification +- (void) reload { - /* Upon closing the preview window, we make sure we clean up any - * preview movie that might be playing or encoding. However, first - * make sure we have a preview picture before calling pictureSliderChanged - * to go back to still previews .. just in case nothing is loaded up like in - * a Launch, cancel new scan then quit type scenario. - */ + if (self.title) + { + // Purge the existing picture previews so they get recreated the next time + // they are needed. + [self.generator purgeImageCache]; + [self switchViewToMode:ViewModePicturePreview]; + [self displayPreview]; + } +} - if (fEncodeState || [self isPlaying]) +- (void) showWindow: (id) sender +{ + if (self.currentViewMode == ViewModeMoviePreview) + { + [self startMovieTimer]; + } + + [super showWindow:sender]; +} + +- (void) windowWillClose: (NSNotification *) aNotification +{ + if (self.currentViewMode == ViewModeEncoding) { [self cancelCreateMoviePreview:self]; + } + else if (self.currentViewMode == ViewModeMoviePreview) + { [fMovieView pause:self]; [self stopMovieTimer]; } - hudTimerSeconds = 0; [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"PreviewWindowIsOpen"]; } -- (void) dealloc +- (void) windowDidChangeBackingProperties: (NSNotification *) notification { - hb_stop(fPreviewLibhb); - if (fPreviewMoviePath) + NSWindow *theWindow = (NSWindow *)[notification object]; + + CGFloat newBackingScaleFactor = [theWindow backingScaleFactor]; + CGFloat oldBackingScaleFactor = [[[notification userInfo] + objectForKey:@"NSBackingPropertyOldScaleFactorKey"] + doubleValue]; + + if (newBackingScaleFactor != oldBackingScaleFactor) { - [[NSFileManager defaultManager] removeItemAtPath:fPreviewMoviePath error:nil]; - [fPreviewMoviePath release]; + // Scale factor changed, update the preview window + // to the new situation + self.backingScaleFactor = newBackingScaleFactor; + if (self.title) + [self reload]; } - - [fLibhbTimer invalidate]; - [fLibhbTimer release]; - - [fHudTimer invalidate]; - [fHudTimer release]; - - [fMovieTimer invalidate]; - [fMovieTimer release]; - - [fPicturePreviews release]; - - hb_close(&fPreviewLibhb); - - [self removeMovieCallbacks]; - - [super dealloc]; } -- (void) SetHandle: (hb_handle_t *) handle +/** + * Given the size of the preview image to be shown, returns the best possible + * size for the view. + */ +- (NSSize) optimalViewSizeForImageSize: (NSSize) imageSize { - fHandle = handle; - - /* adjust the preview slider length */ - /* We use our advance pref to determine how many previews we scanned */ - int hb_num_previews = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewsNumber"] intValue]; - [fPictureSlider setMaxValue: hb_num_previews - 1.0]; - [fPictureSlider setNumberOfTickMarks: hb_num_previews]; - - if ([[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewLength"]) + CGFloat minWidth = MIN_WIDTH; + CGFloat minHeight = MIN_HEIGHT; + + NSSize screenSize = [[[self window] screen] visibleFrame].size; + CGFloat maxWidth = screenSize.width; + CGFloat maxHeight = screenSize.height; + + NSSize resultSize = imageSize; + CGFloat resultPar = resultSize.width / resultSize.height; + + //note, a mbp 15" at 1440 x 900 is a 1.6 ar + CGFloat screenAspect = screenSize.width / screenSize.height; + + if ( resultSize.width > maxWidth || resultSize.height > maxHeight ) { - [fPreviewMovieLengthPopUp selectItemWithTitle:[[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewLength"]]; + // Source is larger than screen in one or more dimensions + if ( resultPar > screenAspect ) + { + // Source aspect wider than screen aspect, snap to max width and vary height + resultSize.width = maxWidth; + resultSize.height = (maxWidth / resultPar); + } + else + { + // Source aspect narrower than screen aspect, snap to max height vary width + resultSize.height = maxHeight; + resultSize.width = (maxHeight * resultPar); + } } - else + + // If necessary, grow to minimum dimensions to ensure controls overlay is not obstructed + if ( resultSize.width < minWidth ) + resultSize.width = minWidth; + if ( resultSize.height < minHeight ) + resultSize.height = minHeight; + + return resultSize; +} + +/** + * Resizes the entire window to accomodate a view of a particular size. + */ +- (void) resizeWindowForViewSize: (NSSize) viewSize +{ + // Figure out the deltas for the new frame area + NSSize currentSize = [[[self window] contentView] frame].size; + CGFloat deltaX = viewSize.width - currentSize.width; + CGFloat deltaY = viewSize.height - currentSize.height; + + // Now resize the whole panel by those same deltas, but don't exceed the min + NSRect frame = [[self window] frame]; + NSSize maxSize = [[[self window] screen] visibleFrame].size; + + /* if we are not Scale To Screen, put an 10% of visible screen on the window */ + if (self.scaleToScreen == NO) { - /* currently hard set default to 15 seconds */ - [fPreviewMovieLengthPopUp selectItemAtIndex: 0]; + maxSize.width = maxSize.width * 0.90; + maxSize.height = maxSize.height * 0.90; + } + + /* Set our min size to the storage size */ + NSSize minSize; + minSize.width = self.title->width / self.backingScaleFactor; + minSize.height = self.title->height / self.backingScaleFactor; + + frame.size.width += deltaX; + frame.size.height += deltaY; + if( frame.size.width < minSize.width ) + { + frame.size.width = minSize.width; + deltaX = frame.size.width - currentSize.width; + } + if( frame.size.height < minSize.height ) + { + frame.size.height = minSize.height; + //deltaY = frame.size.height - currentSize.height; + } + /* compare frame to max size of screen */ + + if( frame.size.width > maxSize.width ) + { + frame.size.width = maxSize.width; + } + + if( frame.size.height > maxSize.height ) + { + frame.size.height = maxSize.height; + } + + // But now the sheet is off-center, so also shift the origin to center it and + // keep the top aligned. + if (frame.size.width != [[self window] frame].size.width) + frame.origin.x -= (deltaX / 2.0); + + /* Since upon launch we can open up the preview window if it was open + * the last time we quit (and at the size it was) we want to make + * sure that upon resize we do not have the window off the screen + * So check the origin against the screen origin and adjust if + * necessary. + */ + NSSize screenSize = [[[self window] screen] visibleFrame].size; + NSPoint screenOrigin = [[[self window] screen] visibleFrame].origin; + if (screenSize.height < frame.size.height) + { + frame.size.height = screenSize.height; } + if (screenSize.width < frame.size.width) + { + frame.size.width = screenSize.width; + } + + /* our origin is off the screen to the left*/ + if (frame.origin.x < screenOrigin.x) + { + /* so shift our origin to the right */ + frame.origin.x = screenOrigin.x; + } + else if ((frame.origin.x + frame.size.width) > (screenOrigin.x + screenSize.width)) + { + /* the right side of the preview is off the screen, so shift to the left */ + frame.origin.x = (screenOrigin.x + screenSize.width) - frame.size.width; + } + + if (self.scaleToScreen == YES) + { + /* our origin is off the screen to the top*/ + if (frame.origin.y < screenOrigin.y) + { + /* so shift our origin to the bottom */ + frame.origin.y = screenOrigin.y; + } + else if ((frame.origin.y + frame.size.height) > (screenOrigin.y + screenSize.height)) + { + /* the top side of the preview is off the screen, so shift to the bottom */ + frame.origin.y = (screenOrigin.y + screenSize.height) - frame.size.height; + } + } + + [[self window] setFrame:frame display:YES animate:YES]; +} + + +/** + * Enable/Disable an arbitrary number of UI elements. + * @param boxes an array of UI elements + * @param indexes a set of indexes of the elements in boxes to be enabled + */ +- (void) toggleBoxes: (NSArray *) boxes usingIndexes: (NSIndexSet *) indexes +{ + [NSAnimationContext beginGrouping]; + [[NSAnimationContext currentContext] setDuration:ANIMATION_DUR]; + + [boxes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [[obj animator] setHidden:([indexes containsIndex:idx]) ? NO : YES]; + }]; + + [NSAnimationContext endGrouping]; } -- (void) SetTitle: (hb_title_t *) title +/** + * Switch the preview controller to one of his view mode: + * ViewModePicturePreview, ViewModeEncoding, ViewModeMoviePreview + * This methods is the only way to change the mode, do not try otherwise. + * @param mode ViewMode mode + */ +- (void) switchViewToMode: (ViewMode) mode { - fTitle = title; - fPicture = 0; + switch (mode) { + case ViewModePicturePreview: + { + if (self.currentViewMode == ViewModeEncoding) + { + [self.generator cancel]; + [self toggleBoxes:@[fPictureControlBox, fEncodingControlBox] + usingIndexes:[NSIndexSet indexSetWithIndex:0]]; + [fMovieCreationProgressIndicator stopAnimation:self]; + } + else if (self.currentViewMode == ViewModeMoviePreview) + { + /* Stop playback and remove the observers */ + [fMovieView pause:self]; + [self stopMovieTimer]; + [self removeMovieObservers]; + + [self toggleBoxes:@[fPictureControlBox, fMoviePlaybackControlBox, fMovieView] + usingIndexes:[NSIndexSet indexSetWithIndex:0]]; + + /* Release the movie */ + [fMovieView setMovie:nil]; + self.movie = nil; + } + + break; + } + + case ViewModeEncoding: + { + [fMovieCreationProgressIndicator setDoubleValue:0]; + [fMovieCreationProgressIndicator startAnimation:self]; + [self toggleBoxes:@[fEncodingControlBox, fPictureControlBox, fMoviePlaybackControlBox] + usingIndexes:[NSIndexSet indexSetWithIndex:0]]; + + break; + } - [self settingsChanged:nil]; + case ViewModeMoviePreview: + { + [self toggleBoxes:@[fMovieView, fMoviePlaybackControlBox, fEncodingControlBox, fPictureControlBox] + usingIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)]]; + + [fMovieCreationProgressIndicator stopAnimation:self]; + [self initPreviewScrubberForMovie]; + [self startMovieTimer]; + + /* Install movie notifications */ + [self addMovieObservers]; + } + break; + + default: + break; + } + + self.currentViewMode = mode; } -- (void)windowDidChangeBackingProperties:(NSNotification *)notification { - - NSWindow *theWindow = (NSWindow *)[notification object]; - - CGFloat newBackingScaleFactor = [theWindow backingScaleFactor]; - CGFloat oldBackingScaleFactor = [[[notification userInfo] - objectForKey:@"NSBackingPropertyOldScaleFactorKey"] - doubleValue]; - if( newBackingScaleFactor != oldBackingScaleFactor ) +- (void) dealloc +{ + [_hudTimer invalidate]; + [_hudTimer release]; + + [_movieTimer invalidate]; + [_movieTimer release]; + + [_generator cancel]; + [_generator release]; + + [self removeMovieObservers]; + + [super dealloc]; +} + +#pragma mark - +#pragma mark Hud Control Overlay + +- (void) mouseMoved: (NSEvent *) theEvent +{ + [super mouseMoved:theEvent]; + NSPoint mouseLoc = [theEvent locationInWindow]; + + /* Test for mouse location to show/hide hud controls */ + if (self.currentViewMode != ViewModeEncoding && self.title) { - // Scale factor changed, update the preview window - // to the new situation - backingScaleFactor = newBackingScaleFactor; - if (fTitle) - [self pictureSliderChanged:self]; + /* Since we are not encoding, verify which control hud to show + * or hide based on aMovie ( aMovie indicates we need movie controls ) + */ + NSBox *hudBoxToShow; + if (self.currentViewMode == !ViewModeMoviePreview) // No movie loaded up + { + hudBoxToShow = fPictureControlBox; + } + else // We have a movie + { + hudBoxToShow = fMoviePlaybackControlBox; + } + + if (NSPointInRect(mouseLoc, [hudBoxToShow frame])) + { + [[hudBoxToShow animator] setHidden: NO]; + [self stopHudTimer]; + } + else if (NSPointInRect(mouseLoc, [[[self window] contentView] frame])) + { + [[hudBoxToShow animator] setHidden: NO]; + [self startHudTimer]; + } + else + { + [[hudBoxToShow animator] setHidden: YES]; + } + } +} + +- (void) startHudTimer +{ + if (self.hudTimer) + { + [self.hudTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:8.0]]; + } + else + { + self.hudTimer = [NSTimer scheduledTimerWithTimeInterval:8.0 target:self selector:@selector(hudTimerFired:) + userInfo:nil repeats:YES]; } } -// Adjusts the window to draw the current picture (fPicture) adjusting its size as -// necessary to display as much of the picture as possible. +- (void) stopHudTimer +{ + [self.hudTimer invalidate]; + self.hudTimer = nil; +} + +- (void) hudTimerFired: (NSTimer *)theTimer +{ + /* Regardless which control box is active, after the timer + * period we want either one to fade to hidden. + */ + [[fPictureControlBox animator] setHidden: YES]; + [[fMoviePlaybackControlBox animator] setHidden: YES]; + [self stopHudTimer]; +} + +#pragma mark - +#pragma mark Still previews mode + +/** + * Adjusts the window to draw the current picture (fPicture) adjusting its size as + * necessary to display as much of the picture as possible. + */ - (void) displayPreview { - hb_job_t * job = fTitle->job; + hb_title_t *title = self.title; - NSImage *fPreviewImage = [self imageForPicture: fPicture]; + NSImage *fPreviewImage = [self.generator imageAtIndex:self.pictureIndex]; NSSize imageScaledSize = [fPreviewImage size]; - [fPictureLayer setContents:fPreviewImage]; + [self.pictureLayer setContents:fPreviewImage]; - NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height ); + NSSize displaySize = NSMakeSize( ( CGFloat )title->width, ( CGFloat )title->height ); NSString *sizeInfoString; /* Set the picture size display fields below the Preview Picture*/ int output_width, output_height, output_par_width, output_par_height; int display_width; - if( fTitle->job->anamorphic.mode == 1 ) // Original PAR Implementation + if( title->job->anamorphic.mode == 1 ) // Original PAR Implementation { - output_width = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3]; - output_height = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1]; - display_width = output_width * fTitle->job->anamorphic.par_width / fTitle->job->anamorphic.par_height; + output_width = title->width-title->job->crop[2]-title->job->crop[3]; + output_height = title->height-title->job->crop[0]-title->job->crop[1]; + display_width = output_width * title->job->anamorphic.par_width / title->job->anamorphic.par_height; sizeInfoString = [NSString stringWithFormat: @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Strict", - fTitle->width, fTitle->height, output_width, output_height, display_width, output_height]; - + title->width, title->height, output_width, output_height, display_width, output_height]; + displaySize.width = display_width; - displaySize.height = fTitle->height; + displaySize.height = title->height; imageScaledSize.width = display_width; imageScaledSize.height = output_height; } - else if (fTitle->job->anamorphic.mode == 2) // Loose Anamorphic + else if (title->job->anamorphic.mode == 2) // Loose Anamorphic { - hb_set_anamorphic_size(job, &output_width, &output_height, &output_par_width, &output_par_height); + hb_set_anamorphic_size(title->job, &output_width, &output_height, &output_par_width, &output_par_height); display_width = output_width * output_par_width / output_par_height; sizeInfoString = [NSString stringWithFormat: @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Loose", - fTitle->width, fTitle->height, output_width, output_height, display_width, output_height]; - + title->width, title->height, output_width, output_height, display_width, output_height]; + displaySize.width = display_width; - displaySize.height = fTitle->height; + displaySize.height = title->height; imageScaledSize.width = display_width; imageScaledSize.height = output_height; } - else if (fTitle->job->anamorphic.mode == 3) // Custom Anamorphic + else if (title->job->anamorphic.mode == 3) // Custom Anamorphic { - hb_set_anamorphic_size(job, &output_width, &output_height, &output_par_width, &output_par_height); + hb_set_anamorphic_size(title->job, &output_width, &output_height, &output_par_width, &output_par_height); sizeInfoString = [NSString stringWithFormat: @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Custom", - fTitle->width, fTitle->height, output_width, output_height, fTitle->job->anamorphic.dar_width, fTitle->job->anamorphic.dar_height]; - - displaySize.width = fTitle->job->anamorphic.dar_width + fTitle->job->crop[2] + fTitle->job->crop[3] ; - displaySize.height = fTitle->job->anamorphic.dar_height + fTitle->job->crop[0] + fTitle->job->crop[1]; - imageScaledSize.width = (int)fTitle->job->anamorphic.dar_width; - imageScaledSize.height = (int)fTitle->job->height; + title->width, title->height, output_width, output_height, title->job->anamorphic.dar_width, title->job->anamorphic.dar_height]; + + displaySize.width = title->job->anamorphic.dar_width + title->job->crop[2] + title->job->crop[3] ; + displaySize.height = title->job->anamorphic.dar_height + title->job->crop[0] + title->job->crop[1]; + imageScaledSize.width = (int)title->job->anamorphic.dar_width; + imageScaledSize.height = (int)title->job->height; } else // No Anamorphic { sizeInfoString = [NSString stringWithFormat: - @"Source: %dx%d, Output: %dx%d", fTitle->width, fTitle->height, - fTitle->job->width, fTitle->job->height]; - - displaySize.width = fTitle->width; - displaySize.height = fTitle->height; - imageScaledSize.width = fTitle->job->width; - imageScaledSize.height = fTitle->job->height; + @"Source: %dx%d, Output: %dx%d", title->width, title->height, + title->job->width, title->job->height]; + + displaySize.width = title->width; + displaySize.height = title->height; + imageScaledSize.width = title->job->width; + imageScaledSize.height = title->job->height; } - if( backingScaleFactor != 1.0 ) + if (self.backingScaleFactor != 1.0) { // HiDPI mode usually display everything // with douple pixel count, but we don't // want to double the size of the video - displaySize.height /= backingScaleFactor; - displaySize.width /= backingScaleFactor; - imageScaledSize.height /= backingScaleFactor; - imageScaledSize.width /= backingScaleFactor; + displaySize.height /= self.backingScaleFactor; + displaySize.width /= self.backingScaleFactor; + imageScaledSize.height /= self.backingScaleFactor; + imageScaledSize.width /= self.backingScaleFactor; } // Get the optimal view size for the image NSSize viewSize = [self optimalViewSizeForImageSize:displaySize]; viewSize.width += BORDER_SIZE * 2; viewSize.height += BORDER_SIZE * 2; - + NSSize windowSize; - if (scaleToScreen == YES) + if (self.scaleToScreen == YES) // Scale the window to the max possible size windowSize = [[[self window] screen] visibleFrame].size; else @@ -347,14 +724,14 @@ areaSize.width -= BORDER_SIZE * 2; areaSize.height -= BORDER_SIZE * 2; - if (scaleToScreen == YES) + if (self.scaleToScreen == YES) { /* We are in Scale To Screen mode so, we have to get the ratio for height and width against the window *size so we can scale from there. */ CGFloat pictureAspectRatio = imageScaledSize.width / imageScaledSize.height; CGFloat areaAspectRatio = areaSize.width / areaSize.height; - + if (pictureAspectRatio > areaAspectRatio) { viewSize.width = areaSize.width; @@ -375,7 +752,7 @@ { CGFloat pictureAspectRatio = imageScaledSize.width / imageScaledSize.height; CGFloat areaAspectRatio = areaSize.width / areaSize.height; - + if (pictureAspectRatio > areaAspectRatio) { viewSize.width = areaSize.width; @@ -390,27 +767,26 @@ } // Resize the CALayers - [fWhiteBackground setBounds:CGRectMake(0, 0, viewSize.width + (BORDER_SIZE * 2), viewSize.height + (BORDER_SIZE * 2))]; - [fPictureLayer setBounds:CGRectMake(0, 0, viewSize.width, viewSize.height)]; + [self.backLayer setBounds:CGRectMake(0, 0, viewSize.width + (BORDER_SIZE * 2), viewSize.height + (BORDER_SIZE * 2))]; + [self.pictureLayer setBounds:CGRectMake(0, 0, viewSize.width, viewSize.height)]; NSString *scaleString; - CGFloat scale = ( ( CGFloat )[fPictureLayer frame].size.width) / ( ( CGFloat )imageScaledSize.width); + CGFloat scale = ( ( CGFloat )[self.pictureLayer frame].size.width) / ( ( CGFloat )imageScaledSize.width); if (scale * 100.0 != 100) - scaleString = [NSString stringWithFormat: - NSLocalizedString( @" (%.0f%% actual size)", - @"String shown when a preview is scaled" ), scale * 100.0]; + scaleString = [NSString stringWithFormat:@" (%.0f%% actual size)", scale * 100.0]; else scaleString = @"(Actual size)"; - - if (scaleToScreen == YES) + + if (_scaleToScreen == YES) scaleString = [scaleString stringByAppendingString:@" Scaled To Screen"]; /* Set the info fields in the hud controller */ [fInfoField setStringValue: [NSString stringWithFormat: @"%@", sizeInfoString]]; - + [fscaleInfoField setStringValue: [NSString stringWithFormat: @"%@", scaleString]]; + /* Set the info field in the window title bar */ [[self window] setTitle:[NSString stringWithFormat: @"Preview - %@ %@",sizeInfoString, scaleString]]; } @@ -419,519 +795,149 @@ { [[NSUserDefaults standardUserDefaults] setObject:[fPreviewMovieLengthPopUp titleOfSelectedItem] forKey:@"PreviewLength"]; } - -- (IBAction) settingsChanged: (id) sender -{ - // Purge the existing picture previews so they get recreated the next time - // they are needed. - [self purgeImageCache]; - [self pictureSliderChanged:nil]; -} -- (IBAction) pictureSliderChanged: (id) sender +- (void) setDeinterlacePreview: (BOOL) deinterlacePreview { - /* Run cancelCreateMoviePreview in case a preview is being encoded and then cancel if so */ - [self cancelCreateMoviePreview:nil]; - - // Show the picture view - if (aMovie) - { - [fMoviePlaybackControlBox setHidden:YES]; - [fMovieView pause:nil]; - [fMovieView setHidden:YES]; - [fMovieView setMovie:nil]; - aMovie = nil; - } - - int newPicture = [fPictureSlider intValue]; - if (newPicture != fPicture) - { - fPicture = newPicture; - } - [self displayPreview]; - + _deinterlacePreview = deinterlacePreview; + self.generator.deinterlace = deinterlacePreview; } -- (IBAction)showWindow:(id)sender -{ - if (aMovie) - [self startMovieTimer]; - - [super showWindow:sender]; -} -- (NSString*) pictureSizeInfoString -{ - return [fInfoField stringValue]; -} - -- (IBAction)showPictureSettings:(id)sender -{ - [fHBController showPicturePanel:self]; -} - -#pragma mark Hud Control Overlay -/* enableHudControls and disableHudControls are used to sync enableUI - * in HBController so that during a scan we do not attempt to access source - * images, etc. which can cause a crash. In general this ui behavior will mirror - * the main window ui's enableUI method and in fact is called from there */ -- (void) enableHudControls -{ - [fPictureSlider setEnabled:YES]; - [fScaleToScreenToggleButton setEnabled:YES]; - [fCreatePreviewMovieButton setEnabled:YES]; - [fGoToStillPreviewButton setEnabled:YES]; -} - -- (void) disableHudControls -{ - [fPictureSlider setEnabled:NO]; - [fScaleToScreenToggleButton setEnabled:NO]; - [fCreatePreviewMovieButton setEnabled:NO]; - [fGoToStillPreviewButton setEnabled:NO]; -} - -- (void) mouseMoved:(NSEvent *)theEvent -{ - [super mouseMoved:theEvent]; - NSPoint mouseLoc = [theEvent locationInWindow]; - - /* Test for mouse location to show/hide hud controls */ - if( fEncodeState != 1 ) - { - /* Since we are not encoding, verify which control hud to show - * or hide based on aMovie ( aMovie indicates we need movie controls ) - */ - NSBox *hudBoxToShow; - if ( aMovie == nil ) // No movie loaded up - { - hudBoxToShow = fPictureControlBox; - } - else // We have a movie - { - hudBoxToShow = fMoviePlaybackControlBox; - } - - if( NSPointInRect( mouseLoc, [fPictureControlBox frame] ) ) - { - [[hudBoxToShow animator] setHidden: NO]; - [self stopHudTimer]; - } - else if( NSPointInRect( mouseLoc, [[[self window] contentView] frame] ) ) - { - [[hudBoxToShow animator] setHidden: NO]; - [self startHudTimer]; - } - else - { - [[hudBoxToShow animator] setHidden: YES]; - } - } -} - -- (void) startHudTimer -{ - if( fHudTimer ) { - [fHudTimer invalidate]; - [fHudTimer release]; - } - fHudTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hudTimerFired:) userInfo:nil repeats:YES]; - [fHudTimer retain]; -} - -- (void) stopHudTimer -{ - if( fHudTimer ) - { - [fHudTimer invalidate]; - [fHudTimer release]; - fHudTimer = nil; - hudTimerSeconds = 0; - } -} - -- (void) hudTimerFired: (NSTimer*)theTimer +- (IBAction) pictureSliderChanged: (id) sender { - hudTimerSeconds++; - if( hudTimerSeconds >= 10 ) - { - /* Regardless which control box is active, after the timer - * period we want either one to fade to hidden. - */ - [[fPictureControlBox animator] setHidden: YES]; - [[fMoviePlaybackControlBox animator] setHidden: YES]; - [self stopHudTimer]; + if ((self.pictureIndex != [fPictureSlider intValue] || !sender) && self.title) { + self.pictureIndex = [fPictureSlider intValue]; + [self displayPreview]; } } -- (IBAction)toggleScaleToScreen:(id)sender +- (IBAction) toggleScaleToScreen: (id) sender { - if (scaleToScreen == YES) + if (self.scaleToScreen == YES) { - scaleToScreen = NO; + self.scaleToScreen = NO; /* make sure we are set to a still preview */ - [self pictureSliderChanged:nil]; + [self displayPreview]; [fScaleToScreenToggleButton setTitle:@"Scale To Screen"]; } else { - scaleToScreen = YES; + self.scaleToScreen = YES; /* make sure we are set to a still preview */ - [self pictureSliderChanged:nil]; + [self displayPreview]; [fScaleToScreenToggleButton setTitle:@"Actual Scale"]; } - -} - -#pragma mark Still Preview Image Processing - -// This function converts an image created by libhb (specified via pictureIndex) into -// an NSImage suitable for the GUI code to use. If removeBorders is YES, -// makeImageForPicture crops the image generated by libhb stripping off the gray -// border around the content. This is the low-level method that generates the image. -// -imageForPicture calls this function whenever it can't find an image in its cache. -- (NSImage *) makeImageForPicture: (NSInteger)pictureIndex - libhb:(hb_handle_t*)handle - title:(hb_title_t*)title -{ - static uint8_t * buffer; - static int bufferSize; - - // Make sure we have a big enough buffer to receive the image from libhb. libhb - int dstWidth = title->job->width; - int dstHeight = title->job->height; - - int newSize; - newSize = dstWidth * dstHeight * 4; - if( bufferSize < newSize ) - { - bufferSize = newSize; - buffer = (uint8_t *) realloc( buffer, bufferSize ); - } - - // Enable and the disable deinterlace just for preview if deinterlace - // or decomb filters are enabled - int deinterlaceStatus = title->job->deinterlace; - - if (self.deinterlacePreview) - title->job->deinterlace = 1; - - hb_get_preview( handle, title->job, (int)pictureIndex, buffer ); - - title->job->deinterlace = deinterlaceStatus; - - // Create an NSBitmapImageRep and copy the libhb image into it, converting it from - // libhb's format to one suitable for NSImage. Along the way, we'll strip off the - // border around libhb's image. - - // The image data returned by hb_get_preview is 4 bytes per pixel, BGRA format. - // Alpha is ignored. - - NSBitmapFormat bitmapFormat = (NSBitmapFormat)NSAlphaFirstBitmapFormat; - NSBitmapImageRep * imgrep = [[[NSBitmapImageRep alloc] - initWithBitmapDataPlanes:nil - pixelsWide:dstWidth - pixelsHigh:dstHeight - bitsPerSample:8 - samplesPerPixel:3 // ignore alpha - hasAlpha:NO - isPlanar:NO - colorSpaceName:NSCalibratedRGBColorSpace - bitmapFormat:bitmapFormat - bytesPerRow:dstWidth * 4 - bitsPerPixel:32] autorelease]; - - UInt32 * src = (UInt32 *)buffer; - UInt32 * dst = (UInt32 *)[imgrep bitmapData]; - int r, c; - for (r = 0; r < dstHeight; r++) - { - for (c = 0; c < dstWidth; c++) -#if TARGET_RT_LITTLE_ENDIAN - *dst++ = Endian32_Swap(*src++); -#else - *dst++ = *src++; -#endif - } - - NSImage * img = [[[NSImage alloc] initWithSize: NSMakeSize(dstWidth, dstHeight)] autorelease]; - [img addRepresentation:imgrep]; - - return img; } -// Returns the preview image for the specified index, retrieving it from its internal -// cache or by calling makeImageForPicture if it is not cached. Generally, you should -// use imageForPicture so that images are cached. Calling makeImageForPicture will -// always generate a new copy of the image. -- (NSImage *) imageForPicture: (NSInteger) pictureIndex +- (NSString *) pictureSizeInfoString { - // The preview for the specified index may not currently exist, so this method - // generates it if necessary. - NSNumber * key = [NSNumber numberWithInteger:pictureIndex]; - NSImage * theImage = [fPicturePreviews objectForKey:key]; - if (!theImage) - { - theImage = [self makeImageForPicture:pictureIndex libhb:fHandle title:fTitle]; - [fPicturePreviews setObject:theImage forKey:key]; - } - return theImage; + return [fInfoField stringValue]; } -// Purges all images from the cache. The next call to imageForPicture will cause a new -// image to be generated. -- (void) purgeImageCache +- (IBAction) showPictureSettings: (id) sender { - [fPicturePreviews removeAllObjects]; + [self.delegate showPicturePanel:self]; } -#pragma mark Movie Preview +#pragma mark - +#pragma mark Movie preview mode -- (IBAction) cancelCreateMoviePreview: (id) sender -{ - hb_state_t s; - hb_get_state2(fPreviewLibhb, &s); - - if (fEncodeState && (s.state == HB_STATE_WORKING || - s.state == HB_STATE_PAUSED)) - { - fEncodeState = 2; - hb_stop(fPreviewLibhb); - hb_system_sleep_allow(fPreviewLibhb); - [NSAnimationContext beginGrouping]; - [[NSAnimationContext currentContext] setDuration:0.2]; - [[fEncodingControlBox animator] setHidden:YES]; - [[fPictureControlBox animator] setHidden:NO]; - [NSAnimationContext endGrouping]; +- (void) updateProgress: (double) progress info: (NSString *) progressInfo { + [fPreviewMovieStatusField setStringValue: progressInfo]; - return; - } + [fMovieCreationProgressIndicator setIndeterminate: NO]; + [fMovieCreationProgressIndicator setDoubleValue: progress]; } -- (IBAction) createMoviePreview: (id) sender -{ - /* Rip or Cancel ? */ - hb_state_t s; - hb_get_state2( fPreviewLibhb, &s ); - - /* we use controller.mm's prepareJobForPreview to go ahead and set all of our settings - * however, we want to use a temporary destination field of course - * so that we do not put our temp preview in the users chosen - * directory */ - - hb_job_t * job = fTitle->job; - - /* We run our current setting through prepeareJob in Controller.mm - * just as if it were a regular encode */ - - [fHBController prepareJobForPreview]; - - /* Make sure we have a Preview sub directory with our pidnum attached */ - NSString *PreviewDirectory = [NSString stringWithFormat:@"~/Library/Application Support/HandBrake/Previews/%d", [fHBController getPidnum]]; - PreviewDirectory = [PreviewDirectory stringByExpandingTildeInPath]; - if( ![[NSFileManager defaultManager] fileExistsAtPath:PreviewDirectory] ) - { - [[NSFileManager defaultManager] createDirectoryAtPath:PreviewDirectory - withIntermediateDirectories:NO - attributes:nil - error:nil]; - } - /* Destination file. We set this to our preview directory - * changing the extension appropriately.*/ - if (fTitle->job->mux & HB_MUX_MASK_MP4) // MP4 file - { - /* we use .m4v for our mp4 files so that ac3 and chapters in mp4 will play properly */ - fPreviewMoviePath = [PreviewDirectory stringByAppendingString:@"/preview_temp.m4v"]; - } - else if (fTitle->job->mux & HB_MUX_MASK_MKV) // MKV file - { - fPreviewMoviePath = [PreviewDirectory stringByAppendingString:@"/preview_temp.mkv"]; - } - - fPreviewMoviePath = [[fPreviewMoviePath stringByExpandingTildeInPath]retain]; - - /* See if there is an existing preview file, if so, delete it */ - if( ![[NSFileManager defaultManager] fileExistsAtPath:fPreviewMoviePath] ) - { - [[NSFileManager defaultManager] removeItemAtPath:fPreviewMoviePath error:nil]; - } - - /* We now direct our preview encode to fPreviewMoviePath */ - hb_job_set_file(fTitle->job, [fPreviewMoviePath UTF8String]); - - /* We use our advance pref to determine how many previews to scan */ - int hb_num_previews = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewsNumber"] intValue]; - job->start_at_preview = fPicture + 1; - job->seek_points = hb_num_previews; - - /* we use the preview duration popup to get the specified - * number of seconds for the preview encode. - */ - - job->pts_to_stop = [[fPreviewMovieLengthPopUp titleOfSelectedItem] intValue] * 90000LL; - - /* lets go ahead and send it off to libhb - * Note: unlike a full encode, we only send 1 pass regardless if the final encode calls for 2 passes. - * this should suffice for a fairly accurate short preview and cuts our preview generation time in half. - * However we also need to take into account the indepth scan for subtitles. - */ - /* - * If scanning we need to do some extra setup of the job. - */ - if( job->indepth_scan == 1 ) +- (void) didCreateMovieAtURL: (NSURL *) fileURL +{ + /* Load the new movie into fMovieView */ + if (fileURL) { - char *x264opts_tmp; - - /* - * When subtitle scan is enabled do a fast pre-scan job - * which will determine which subtitles to enable, if any. - */ - job->pass = -1; - x264opts_tmp = job->advanced_opts; - - job->advanced_opts = NULL; - job->indepth_scan = 1; - /* - * Add the pre-scan job - */ - hb_add( fPreviewLibhb, job ); - job->advanced_opts = x264opts_tmp; - } - /* Go ahead and perform the actual encoding preview scan */ - job->indepth_scan = 0; - job->pass = 0; - hb_add( fPreviewLibhb, job ); + NSError *outError; + NSDictionary *movieAttributes = @{QTMovieURLAttribute: fileURL, + QTMovieAskUnresolvedDataRefsAttribute: @(NO), + @"QTMovieOpenForPlaybackAttribute": @(YES), + @"QTMovieOpenAsyncRequiredAttribute": @(NO), + @"QTMovieOpenAsyncOKAttribute": @(NO), + @"QTMovieIsSteppableAttribute": @(YES), + QTMovieApertureModeAttribute: QTMovieApertureModeClean}; + + QTMovie *movie = [[[QTMovie alloc] initWithAttributes:movieAttributes error:&outError] autorelease]; + + if (!movie) + { + [self.delegate writeToActivityLog: "showMoviePreview: Unable to open movie"]; + [self switchViewToMode:ViewModePicturePreview]; + } + else + { + /* Scale the fMovieView to the picture player size */ + [fMovieView setFrameSize:[self.pictureLayer frame].size]; + [fMovieView setFrameOrigin:[self.pictureLayer frame].origin]; - /* we need to clean up the various lists after the job(s) have been set */ - hb_job_reset( job ); + [fMovieView setMovie:movie]; + [movie setDelegate:self]; - [fMovieCreationProgressIndicator setDoubleValue:0]; + // get and enable subtitles + NSArray *subtitlesArray = [movie tracksOfMediaType: @"sbtl"]; + if (subtitlesArray && [subtitlesArray count]) + { + // enable the first tx3g subtitle track + [[subtitlesArray objectAtIndex: 0] setEnabled: YES]; + } + else + { + // Perian subtitles + subtitlesArray = [movie tracksOfMediaType: QTMediaTypeVideo]; + if (subtitlesArray && ([subtitlesArray count] >= 2)) + { + // track 0 should be video, other video tracks should + // be subtitles; force-enable the first subs track + [[subtitlesArray objectAtIndex: 1] setEnabled: YES]; + } + } - [NSAnimationContext beginGrouping]; - [[NSAnimationContext currentContext] setDuration:0.2]; - [[fEncodingControlBox animator] setHidden: NO]; - [[fPictureControlBox animator] setHidden: YES]; - [NSAnimationContext endGrouping]; + // to actually play the movie + self.movie = movie; - /* Let fPreviewLibhb do the job */ - fEncodeState = 1; - hb_system_sleep_prevent(fPreviewLibhb); - hb_start(fPreviewLibhb); - -} + [self switchViewToMode:ViewModeMoviePreview]; -- (void) startReceivingLibhbNotifications -{ - if (!fLibhbTimer) - { - fLibhbTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(libhbTimerFired:) userInfo:nil repeats:YES]; - [fLibhbTimer retain]; + [fMovieView play:movie]; + } } } -- (void) stopReceivingLibhbNotifications -{ - if (fLibhbTimer) - { - [fLibhbTimer invalidate]; - [fLibhbTimer release]; - fLibhbTimer = nil; - } -} -- (void) libhbTimerFired: (NSTimer*)theTimer +- (IBAction) cancelCreateMoviePreview: (id) sender { - hb_state_t s; - hb_get_state( fPreviewLibhb, &s ); - [self libhbStateChanged: s]; + [self switchViewToMode:ViewModePicturePreview]; } -- (void) libhbStateChanged: (hb_state_t)state +- (IBAction) createMoviePreview: (id) sender { - switch( state.state ) - { - case HB_STATE_IDLE: - case HB_STATE_SCANNING: - case HB_STATE_SCANDONE: - break; - - case HB_STATE_WORKING: - { -#define p state.param.working - NSMutableString * string; - /* Update text field */ - string = [NSMutableString stringWithFormat: NSLocalizedString( @"Encoding preview: %.2f %%", @"" ), 100.0 * p.progress]; - - if( p.seconds > -1 ) - { - [string appendFormat: - NSLocalizedString( @" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)", @"" ), - p.rate_cur, p.rate_avg, p.hours, p.minutes, p.seconds]; - } - [fPreviewMovieStatusField setStringValue: string]; - - [fMovieCreationProgressIndicator setIndeterminate: NO]; - /* Update slider */ - [fMovieCreationProgressIndicator setDoubleValue: 100.0 * p.progress]; - - break; - - } -#undef p - -#define p state.param.muxing - case HB_STATE_MUXING: - { - // Update fMovieCreationProgressIndicator - [fMovieCreationProgressIndicator setIndeterminate: YES]; - [fMovieCreationProgressIndicator startAnimation: nil]; - [fPreviewMovieStatusField setStringValue: NSLocalizedString( @"Muxing Preview ...", @"" )]; - break; - } -#undef p - case HB_STATE_PAUSED: - [fMovieCreationProgressIndicator stopAnimation: nil]; - break; - - case HB_STATE_WORKDONE: - { - // Delete all remaining jobs since libhb doesn't do this on its own. - hb_job_t * job; - while( ( job = hb_job(fPreviewLibhb, 0) ) ) - hb_rem( fHandle, job ); - - [fPreviewMovieStatusField setStringValue: @""]; - [fMovieCreationProgressIndicator stopAnimation: nil]; - - if (fEncodeState != 2) - { - // Show the movie view - [self showMoviePreview:fPreviewMoviePath]; - } - - fEncodeState = 0; - /* Done encoding, allow system sleep for the preview handle */ - hb_system_sleep_allow(fPreviewLibhb); - break; - } - } + if (!self.generator) + return; + + self.generator.delegate = self; + [self.delegate prepareJobForPreview]; + [self.generator createMovieAsyncWithImageIndex:self.pictureIndex + andDuration:[[fPreviewMovieLengthPopUp titleOfSelectedItem] intValue]]; + + [self switchViewToMode:ViewModeEncoding]; } - (IBAction) toggleMoviePreviewPlayPause: (id) sender { /* make sure a movie is even loaded up */ - if (aMovie != nil) + if (self.movie) { - /* For some stupid reason there is no "isPlaying" method for a QTMovie - * object, given that, we detect the rate to determine whether the movie - * is playing or not. - */ - if ([self isPlaying]) // we are playing + if ([self.movie isPlaying]) // we are playing { - [fMovieView pause:aMovie]; + [fMovieView pause:self.movie]; [fPlayPauseButton setState: NSOnState]; } else // we are paused or stopped { - [fMovieView play:aMovie]; + [fMovieView play:self.movie]; [fPlayPauseButton setState: NSOffState]; } } @@ -939,322 +945,134 @@ - (IBAction) moviePlaybackGoToBeginning: (id) sender { - /* make sure a movie is even loaded up */ - if (aMovie != nil) - { - [fMovieView gotoBeginning:aMovie]; - } + [fMovieView gotoBeginning:self.movie]; } - (IBAction) moviePlaybackGoToEnd: (id) sender { - /* make sure a movie is even loaded up */ - if (aMovie != nil) - { - [fMovieView gotoEnd:aMovie]; - } -} - -- (IBAction) moviePlaybackGoBackwardOneFrame: (id) sender -{ - /* make sure a movie is even loaded up */ - if (aMovie != nil) - { - [fMovieView pause:aMovie]; // Pause the movie - [fMovieView stepBackward:aMovie]; - } -} - -- (IBAction) moviePlaybackGoForwardOneFrame: (id) sender -{ - /* make sure a movie is even loaded up */ - if (aMovie != nil) - { - [fMovieView pause:aMovie]; // Pause the movie - [fMovieView stepForward:aMovie]; - } + [fMovieView gotoEnd:self.movie]; } - (void) startMovieTimer { - if( fMovieTimer ) { - [fMovieTimer invalidate]; - [fMovieTimer release]; - } - fMovieTimer = [NSTimer scheduledTimerWithTimeInterval:0.10 target:self selector:@selector(movieTimerFired:) userInfo:nil repeats:YES]; - [fMovieTimer retain]; + if (!self.movieTimer) + { + self.movieTimer = [NSTimer scheduledTimerWithTimeInterval:0.09 target:self + selector:@selector(movieTimerFired:) + userInfo:nil repeats:YES]; + } } - (void) stopMovieTimer { - if( fMovieTimer ) - { - [fMovieTimer invalidate]; - [fMovieTimer release]; - fMovieTimer = nil; - } + [self.movieTimer invalidate]; + self.movieTimer = nil; } -- (void) movieTimerFired: (NSTimer*)theTimer +- (void) movieTimerFired: (NSTimer *)theTimer { - if (aMovie != nil) + if (self.movie != nil) { [self adjustPreviewScrubberForCurrentMovieTime]; - [fMovieInfoField setStringValue: [self SMTPETimecode:[aMovie currentTime]]]; + [fMovieInfoField setStringValue: [self.movie timecode]]; } } - (IBAction) showPicturesPreview: (id) sender { - [fMovieView pause:self]; - [self stopMovieTimer]; - - [NSAnimationContext beginGrouping]; - [[NSAnimationContext currentContext] setDuration:0.2]; - [[fMoviePlaybackControlBox animator] setHidden:YES]; - [[fMovieView animator] setHidden:YES]; - [[fPictureControlBox animator] setHidden:NO]; - [NSAnimationContext endGrouping]; - - [fMovieView setMovie:nil]; - aMovie = nil; + [self switchViewToMode:ViewModePicturePreview]; } +#pragma mark - +#pragma mark Movie Playback Scrubber -- (IBAction) showMoviePreview: (NSString *) path +// Initialize the preview scrubber min/max to appropriate values for the current movie +- (void) initPreviewScrubberForMovie { - /* Since the gray background for the still images is part of - * fPictureView, lets leave the picture view visible and postion - * the fMovieView over the image portion of fPictureView so - * we retain the gray cropping border we have already established - * with the still previews - */ - - /* Load the new movie into fMovieView */ - if (path) - { - NSError *outError; - NSURL *movieUrl = [NSURL fileURLWithPath:path]; - NSDictionary *movieAttributes = [NSDictionary dictionaryWithObjectsAndKeys: - movieUrl, QTMovieURLAttribute, - [NSNumber numberWithBool:NO], QTMovieAskUnresolvedDataRefsAttribute, - [NSNumber numberWithBool:YES], @"QTMovieOpenForPlaybackAttribute", - [NSNumber numberWithBool:NO], @"QTMovieOpenAsyncRequiredAttribute", - [NSNumber numberWithBool:NO], @"QTMovieOpenAsyncOKAttribute", - [NSNumber numberWithBool:YES], @"QTMovieIsSteppableAttribute", - QTMovieApertureModeClean, QTMovieApertureModeAttribute, - nil]; - - aMovie = [[[QTMovie alloc] initWithAttributes:movieAttributes error:&outError] autorelease]; - - if (!aMovie) - { - [fHBController writeToActivityLog: "showMoviePreview: Unable to open movie"]; - } - else - { - NSRect movieBounds; - - [fMovieView setControllerVisible:NO]; - - /* we get some size information from the preview movie */ - NSSize movieSize = [[aMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue]; - movieBounds = [fMovieView movieBounds]; - movieBounds.size.height = movieSize.height; - /* We also get our view size to use for scaling fMovieView's size */ - NSSize scaledMovieViewSize = [fPictureLayer frame].size; - movieBounds.size.width = movieSize.width; - - /* we need to account for an issue where the scaledMovieViewSize > the window size */ - if (scaledMovieViewSize.height > [[self window] frame].size.height) - { - [fHBController writeToActivityLog: "showMoviePreview: Our window is not tall enough to show the controller bar ..."]; - } - - /* Scale the fMovieView to scaledMovieViewSize */ - [fMovieView setFrameSize:scaledMovieViewSize]; - - /*set our origin try using fPictureViewArea or fPictureView */ - NSPoint origin = [fPictureLayer frame].origin; - origin.x += trunc( ( [fPictureLayer frame].size.width - - [fMovieView frame].size.width ) / 2.0 ); - origin.y += trunc( ( ( [fPictureLayer frame].size.height - - [fMovieView frame].size.height ) / 2.0 ) ); - - [fMovieView setFrameOrigin:origin]; - [fMovieView setMovie:aMovie]; - - // get and enable subtitles - NSArray *subtitlesArray; - subtitlesArray = [aMovie tracksOfMediaType: @"sbtl"]; - if( subtitlesArray && [subtitlesArray count] ) - { - // enable the first TX3G subtitle track - [[subtitlesArray objectAtIndex: 0] setEnabled: YES]; - } - else - { - // Perian subtitles - subtitlesArray = [aMovie tracksOfMediaType: QTMediaTypeVideo]; - if( subtitlesArray && ( [subtitlesArray count] >= 2 ) ) - { - // track 0 should be video, other video tracks should - // be subtitles; force-enable the first subs track - [[subtitlesArray objectAtIndex: 1] setEnabled: YES]; - } - } - - // to actually play the movie - [NSAnimationContext beginGrouping]; - [[NSAnimationContext currentContext] setDuration:0.2]; - [[fEncodingControlBox animator] setHidden: YES]; - [[fMovieView animator] setHidden:NO]; - [[fMoviePlaybackControlBox animator] setHidden: NO]; - [NSAnimationContext endGrouping]; + QTTime duration = [self.movie duration]; + CGFloat result = duration.timeValue / duration.timeScale; - [self initPreviewScrubberForMovie]; - [self startMovieTimer]; - /* Install amovie notifications */ - [aMovie setDelegate:self]; - [self installMovieCallbacks]; - [fMovieView play:aMovie]; - } - } + [fMovieScrubberSlider setMinValue:0.0]; + [fMovieScrubberSlider setMaxValue: result]; + [fMovieScrubberSlider setDoubleValue: 0.0]; } -#pragma mark *** Movie Playback Scrubber and time code methods *** - -// Initialize the preview scrubber min/max to appropriate values for the current movie --(void) initPreviewScrubberForMovie +- (void) adjustPreviewScrubberForCurrentMovieTime { - if (aMovie) - { - QTTime duration = [aMovie duration]; - CGFloat result = duration.timeValue / duration.timeScale; - - [fMovieScrubberSlider setMinValue:0.0]; - [fMovieScrubberSlider setMaxValue: result]; - [fMovieScrubberSlider setDoubleValue: 0.0]; - } -} + QTTime time = [self.movie currentTime]; --(void) adjustPreviewScrubberForCurrentMovieTime -{ - if (aMovie) - { - QTTime time = [aMovie currentTime]; - - CGFloat result = (CGFloat)time.timeValue / (CGFloat)time.timeScale;; - [fMovieScrubberSlider setDoubleValue:result]; - } + CGFloat result = (CGFloat)time.timeValue / (CGFloat)time.timeScale;; + [fMovieScrubberSlider setDoubleValue:result]; } - (IBAction) previewScrubberChanged: (id) sender { - if (aMovie) - { - [fMovieView pause:aMovie]; - QTTime time = [self SliderToQTTime:[fMovieScrubberSlider doubleValue]]; - [aMovie setCurrentTime:time]; - [fMovieInfoField setStringValue: [self SMTPETimecode:time]]; - } + [fMovieView pause:self.movie]; + [self.movie setCurrentTimeDouble:[fMovieScrubberSlider doubleValue]]; + [fMovieInfoField setStringValue: [self.movie timecode]]; } -- (BOOL) isPlaying -{ - if (aMovie != nil) - { - /* For some stupid reason there is no "isPlaying" method for a QTMovie - * object, given that, we detect the rate to determine whether the movie - * is playing or not. - */ - if ([aMovie rate] != 0.0f) // we are playing - return YES; - else // we are paused or stopped - return NO; - } - return NO; -} - -#pragma mark *** Movie Notifications *** +#pragma mark - +#pragma mark Movie Notifications -- (void) installMovieCallbacks +- (void) addMovieObservers { - /*Notification for any time the movie rate changes */ + /* Notification for any time the movie rate changes */ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieRateDidChange:) name:@"QTMovieRateDidChangeNotification" - object:aMovie]; - /*Notification for when the movie ends */ - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(movieDidEnd:) - name:@"QTMovieDidEndNotification" - object:aMovie]; + object:self.movie]; } -- (void)removeMovieCallbacks +- (void) removeMovieObservers { - if (aMovie) - { - /*Notification for any time the movie rate changes */ - [[NSNotificationCenter defaultCenter] removeObserver:self - name:@"QTMovieRateDidChangeNotification" - object:aMovie]; - /*Notification for when the movie ends */ - [[NSNotificationCenter defaultCenter] removeObserver:self - name:@"QTMovieDidEndNotification" - object:aMovie]; - } + /*Notification for any time the movie rate changes */ + [[NSNotificationCenter defaultCenter] removeObserver:self + name:@"QTMovieRateDidChangeNotification" + object:self.movie]; } -- (void)movieRateDidChange:(NSNotification *)notification +- (void) movieRateDidChange: (NSNotification *) notification { - if (aMovie != nil) - { - if ([self isPlaying]) - [fPlayPauseButton setState: NSOnState]; - else - [fPlayPauseButton setState: NSOffState]; - } + if ([self.movie isPlaying]) + [fPlayPauseButton setState: NSOnState]; + else + [fPlayPauseButton setState: NSOffState]; } -/* This notification is not currently used. However we should keep it "just in case" as - * live preview playback is enhanced. - */ -- (void)movieDidEnd:(NSNotification *)notification -{ - //[fHBController writeToActivityLog: "Movie DidEnd Notification Received"]; -} +#pragma mark - +#pragma mark Keyboard and mouse wheel control /* fMovieView Keyboard controls */ -- (void)keyDown:(NSEvent *)event +- (void) keyDown: (NSEvent *) event { unichar key = [[event charactersIgnoringModifiers] characterAtIndex:0]; + QTMovie *movie = self.movie; - if (aMovie) + if (movie) { if (key == 32) { - if ([self isPlaying]) - [fMovieView pause:aMovie]; + if ([movie isPlaying]) + [fMovieView pause:movie]; else - [fMovieView play:aMovie]; + [fMovieView play:movie]; } else if (key == 'k') - [fMovieView pause:aMovie]; + [fMovieView pause:movie]; else if (key == 'l') { - float rate = [aMovie rate]; + float rate = [movie rate]; rate += 1.0f; - [fMovieView play:aMovie]; - [aMovie setRate:rate]; + [fMovieView play:movie]; + [movie setRate:rate]; } else if (key == 'j') { - float rate = [aMovie rate]; + float rate = [movie rate]; rate -= 1.0f; - [fMovieView play:aMovie]; - [aMovie setRate:rate]; + [fMovieView play:movie]; + [movie setRate:rate]; } else if ([event modifierFlags] & NSAlternateKeyMask && key == NSLeftArrowFunctionKey) [fMovieView gotoBeginning:self]; @@ -1267,16 +1085,16 @@ else [super keyDown:event]; } - else if (!fEncodeState) + else if (self.currentViewMode != ViewModeEncoding) { if (key == NSLeftArrowFunctionKey) { - [fPictureSlider setIntegerValue:fPicture > [fPictureSlider minValue] ? fPicture - 1 : fPicture]; + [fPictureSlider setIntegerValue:self.pictureIndex > [fPictureSlider minValue] ? self.pictureIndex - 1 : self.pictureIndex]; [self pictureSliderChanged:self]; } else if (key == NSRightArrowFunctionKey) { - [fPictureSlider setIntegerValue:fPicture < [fPictureSlider maxValue] ? fPicture + 1 : fPicture]; + [fPictureSlider setIntegerValue:self.pictureIndex < [fPictureSlider maxValue] ? self.pictureIndex + 1 : self.pictureIndex]; [self pictureSliderChanged:self]; } else @@ -1286,209 +1104,21 @@ [super keyDown:event]; } -- (void)scrollWheel:(NSEvent *)theEvent +- (void) scrollWheel: (NSEvent *) theEvent { - if (!fEncodeState) + if (self.currentViewMode != ViewModeEncoding) { if ([theEvent deltaY] < 0) { - [fPictureSlider setIntegerValue:fPicture < [fPictureSlider maxValue] ? fPicture + 1 : fPicture]; + [fPictureSlider setIntegerValue:self.pictureIndex < [fPictureSlider maxValue] ? self.pictureIndex + 1 : self.pictureIndex]; [self pictureSliderChanged:self]; } else if ([theEvent deltaY] > 0) { - [fPictureSlider setIntegerValue:fPicture > [fPictureSlider minValue] ? fPicture - 1 : fPicture]; + [fPictureSlider setIntegerValue:self.pictureIndex > [fPictureSlider minValue] ? self.pictureIndex - 1 : self.pictureIndex]; [self pictureSliderChanged:self]; } } } -#pragma mark *** QTTime Utilities *** - - // convert a time value (long) to a QTTime structure --(QTTime)SliderToQTTime:(double)value -{ - long timeScale = [[aMovie attributeForKey:QTMovieTimeScaleAttribute] longValue]; - return QTMakeTime(value * timeScale, timeScale); -} - -/* Since MacOSX Leopard QTKit has taken over some responsibility for assessing movie playback - * information from the old QuickTime carbon api ( time code information as well as fps, etc.). - * However, the QTKit devs at apple were not really big on documentation and further ... - * QuickTimes ability to playback HB's largely variable framerate output makes perfectly frame - * accurate information at best convoluted. Still, for the purpose of a custom hud based custom - * playback scrubber slider this has so far proven to be as accurate as I have found. To say it - * could use some better accuracy is not understating it enough probably. - * Most of this was gleaned from this obscure Apple Mail list thread: - * http://www.mailinglistarchive.com/[email protected]/msg05642.html - * Now as we currently do not show a QTKit control bar with scrubber for display sizes > container - * size, this seems to facilitate playback control from the HB custom HUD controller fairly close - * to the built in controller bar. - * Further work needs to be done to try to get accurate frame by frame playback display if we want it. - * Note that the keyboard commands for frame by frame step through etc. work as always. - */ - -// Returns a human readable string from the currentTime of movie playback -- (NSString*) SMTPETimecode:(QTTime)time -{ - NSString *smtpeTimeCodeString; - int days, hour, minute, second, frame; - long long result; - - result = time.timeValue / time.timeScale; // second - frame = (int)(time.timeValue % time.timeScale) / 100; - - second = result % 60; - - result = result / 60; // minute - minute = result % 60; - - result = result / 60; // hour - hour = result % 24; - days = (int)result; - - smtpeTimeCodeString = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second]; // hh:mm:ss - return smtpeTimeCodeString; -} - -@end - -@implementation PreviewController (Private) - -// -// -[PictureController(Private) optimalViewSizeForImageSize:] -// -// Given the size of the preview image to be shown, returns the best possible -// size for the view. -// -- (NSSize)optimalViewSizeForImageSize: (NSSize)imageSize -{ - // The min size is 480x360 - CGFloat minWidth = 480.0; - CGFloat minHeight = 360.0; - - NSSize screenSize = [[[self window] screen] visibleFrame].size; - CGFloat maxWidth = screenSize.width; - CGFloat maxHeight = screenSize.height; - - NSSize resultSize = imageSize; - CGFloat resultPar = resultSize.width / resultSize.height; - - //note, a mbp 15" at 1440 x 900 is a 1.6 ar - CGFloat screenAspect = screenSize.width / screenSize.height; - - if ( resultSize.width > maxWidth || resultSize.height > maxHeight ) - { - // Source is larger than screen in one or more dimensions - if ( resultPar > screenAspect ) - { - // Source aspect wider than screen aspect, snap to max width and vary height - resultSize.width = maxWidth; - resultSize.height = (maxWidth / resultPar); - } - else - { - // Source aspect narrower than screen aspect, snap to max height vary width - resultSize.height = maxHeight; - resultSize.width = (maxHeight * resultPar); - } - } - - // If necessary, grow to minimum dimensions to ensure controls overlay is not obstructed - if ( resultSize.width < minWidth ) - resultSize.width = minWidth; - if ( resultSize.height < minHeight ) - resultSize.height = minHeight; - - return resultSize; -} - -// -// -[PictureController(Private) resizeWindowForViewSize:] -// -// Resizes the entire window to accomodate a view of a particular size. -// -- (void)resizeWindowForViewSize: (NSSize)viewSize -{ - // Figure out the deltas for the new frame area - NSSize currentSize = [[[self window] contentView] frame].size; - CGFloat deltaX = viewSize.width - currentSize.width; - CGFloat deltaY = viewSize.height - currentSize.height; - - // Now resize the whole panel by those same deltas, but don't exceed the min - NSRect frame = [[self window] frame]; - NSSize maxSize = [[[self window] screen] visibleFrame].size; - /* if we are not Scale To Screen, put an 10% of visible screen on the window */ - if (scaleToScreen == NO ) - { - maxSize.width = maxSize.width * 0.90; - maxSize.height = maxSize.height * 0.90; - } - - /* Set our min size to the storage size */ - NSSize minSize; - minSize.width = fTitle->width / backingScaleFactor; - minSize.height = fTitle->height / backingScaleFactor; - - frame.size.width += deltaX; - frame.size.height += deltaY; - if( frame.size.width < minSize.width ) - { - frame.size.width = minSize.width; - deltaX = frame.size.width - currentSize.width; - } - if( frame.size.height < minSize.height ) - { - frame.size.height = minSize.height; - deltaY = frame.size.height - currentSize.height; - } - /* compare frame to max size of screen */ - - if( frame.size.width > maxSize.width ) - { - frame.size.width = maxSize.width; - } - - if( frame.size.height > maxSize.height ) - { - frame.size.height = maxSize.height; - } - - // But now the sheet is off-center, so also shift the origin to center it and - // keep the top aligned. - if( frame.size.width != [[self window] frame].size.width ) - frame.origin.x -= (deltaX / 2.0); - - /* Since upon launch we can open up the preview window if it was open - * the last time we quit (and at the size it was) we want to make - * sure that upon resize we do not have the window off the screen - * So check the origin against the screen origin and adjust if - * necessary. - */ - NSSize screenSize = [[[self window] screen] visibleFrame].size; - NSPoint screenOrigin = [[[self window] screen] frame].origin; - if (screenSize.height < frame.size.height) - { - frame.size.height = screenSize.height; - } - if (screenSize.width < frame.size.width) - { - frame.size.width = screenSize.width; - } - - /* our origin is off the screen to the left*/ - if (frame.origin.x < screenOrigin.x) - { - /* so shift our origin to the right */ - frame.origin.x = screenOrigin.x; - } - else if ((frame.origin.x + frame.size.width) > (screenOrigin.x + screenSize.width)) - { - /* the right side of the preview is off the screen, so shift to the left */ - frame.origin.x = (screenOrigin.x + screenSize.width) - frame.size.width; - } - - [[self window] setFrame:frame display:YES animate:YES]; -} - @end diff --git a/macosx/HBPreviewGenerator.h b/macosx/HBPreviewGenerator.h new file mode 100644 index 000000000..e17114c45 --- /dev/null +++ b/macosx/HBPreviewGenerator.h @@ -0,0 +1,33 @@ +/* HBPreviewGenerator.h $ + + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ + +#import <Cocoa/Cocoa.h> +#include "hb.h" + +@protocol HBPreviewGeneratorDelegate <NSObject> + +- (void) didCreateMovieAtURL: (NSURL *) fileURL; +- (void) updateProgress: (double) progress info: (NSString *) progressInfo; + +@end + +@interface HBPreviewGenerator : NSObject + +@property (nonatomic, assign) id <HBPreviewGeneratorDelegate> delegate; +@property (nonatomic) BOOL deinterlace; + +- (id) initWithHandle: (hb_handle_t *) handle andTitle: (hb_title_t *) title; + +/* Still image generator */ +- (NSImage *) imageAtIndex: (NSUInteger) index; +- (NSUInteger) imagesCount; +- (void) purgeImageCache; + +/* Video generator */ +- (BOOL) createMovieAsyncWithImageIndex: (NSUInteger) index andDuration: (NSUInteger) duration; +- (void) cancel; + +@end diff --git a/macosx/HBPreviewGenerator.m b/macosx/HBPreviewGenerator.m new file mode 100644 index 000000000..99ca20f86 --- /dev/null +++ b/macosx/HBPreviewGenerator.m @@ -0,0 +1,423 @@ +/* HBPreviewGenerator.m $ + + This file is part of the HandBrake source code. + Homepage: <http://handbrake.fr/>. + It may be used under the terms of the GNU General Public License. */ +// + +#import "HBPreviewGenerator.h" +#import "Controller.h" + +typedef enum EncodeState : NSUInteger { + EncodeStateIdle, + EncodeStateWorking, + EncodeStateCancelled, +} EncodeState; + +@interface HBPreviewGenerator () + +@property (nonatomic, readonly, retain) NSMutableDictionary *picturePreviews; +@property (nonatomic, readonly) NSUInteger imagesCount; +@property (nonatomic, readonly) hb_handle_t *handle; +@property (nonatomic, readonly) hb_title_t *title; + +@property (nonatomic) hb_handle_t *privateHandle; +@property (nonatomic) NSTimer *timer; +@property (nonatomic) EncodeState encodeState; + +@property (nonatomic, retain) NSURL *fileURL; + +@end + +@implementation HBPreviewGenerator + +- (id) initWithHandle: (hb_handle_t *) handle andTitle: (hb_title_t *) title +{ + self = [super init]; + if (self) + { + _handle = handle; + _title = title; + _picturePreviews = [[NSMutableDictionary alloc] init]; + _imagesCount = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PreviewsNumber"] intValue]; + } + return self; +} + +#pragma mark - +#pragma mark Preview images + +/** + * Returns the picture preview at the specified index + * + * @param index picture index in title. + */ +- (NSImage *) imageAtIndex: (NSUInteger) index +{ + if (index >= self.imagesCount) + return nil; + + // The preview for the specified index may not currently exist, so this method + // generates it if necessary. + NSImage *theImage = [self.picturePreviews objectForKey:@(index)]; + + if (!theImage) + { + theImage = [HBPreviewGenerator makeImageForPicture:index + libhb:self.handle + title:self.title + deinterlace:self.deinterlace]; + [self.picturePreviews setObject:theImage forKey:@(index)]; + } + + return theImage; +} + +/** + * Purges all images from the cache. The next call to imageAtIndex: will cause a new + * image to be generated. + */ +- (void) purgeImageCache +{ + [self.picturePreviews removeAllObjects]; +} + +/** + * This function converts an image created by libhb (specified via pictureIndex) into + * an NSImage suitable for the GUI code to use. If removeBorders is YES, + * makeImageForPicture crops the image generated by libhb stripping off the gray + * border around the content. This is the low-level method that generates the image. + * -imageForPicture calls this function whenever it can't find an image in its cache. + * + * @param picture Index in title. + * @param h Handle to hb_handle_t. + * @param title Handle to hb_title_t of desired title. + */ ++ (NSImage *) makeImageForPicture: (NSUInteger) pictureIndex + libhb: (hb_handle_t *) handle + title: (hb_title_t *) title + deinterlace: (BOOL) deinterlace +{ + static uint8_t *buffer; + static int bufferSize; + + // Make sure we have a big enough buffer to receive the image from libhb + int dstWidth = title->job->width; + int dstHeight = title->job->height; + + int newSize = dstWidth * dstHeight * 4; + if (!buffer || bufferSize < newSize) + { + bufferSize = newSize; + buffer = (uint8_t *) realloc( buffer, bufferSize ); + } + + // Enable and the disable deinterlace just for preview if deinterlace + // or decomb filters are enabled + int deinterlaceStatus = title->job->deinterlace; + if (deinterlace) title->job->deinterlace = 1; + + hb_get_preview( handle, title->job, (int)pictureIndex, buffer ); + + // Reset deinterlace status + title->job->deinterlace = deinterlaceStatus; + + // Create an NSBitmapImageRep and copy the libhb image into it, converting it from + // libhb's format to one suitable for NSImage. Along the way, we'll strip off the + // border around libhb's image. + + // The image data returned by hb_get_preview is 4 bytes per pixel, BGRA format. + // Alpha is ignored. + + NSBitmapFormat bitmapFormat = (NSBitmapFormat)NSAlphaFirstBitmapFormat; + NSBitmapImageRep * imgrep = [[[NSBitmapImageRep alloc] + initWithBitmapDataPlanes:nil + pixelsWide:dstWidth + pixelsHigh:dstHeight + bitsPerSample:8 + samplesPerPixel:3 // ignore alpha + hasAlpha:NO + isPlanar:NO + colorSpaceName:NSCalibratedRGBColorSpace + bitmapFormat:bitmapFormat + bytesPerRow:dstWidth * 4 + bitsPerPixel:32] autorelease]; + + UInt32 * src = (UInt32 *)buffer; + UInt32 * dst = (UInt32 *)[imgrep bitmapData]; + int r, c; + for (r = 0; r < dstHeight; r++) + { + for (c = 0; c < dstWidth; c++) +#if TARGET_RT_LITTLE_ENDIAN + *dst++ = Endian32_Swap(*src++); +#else + *dst++ = *src++; +#endif + } + + NSImage * img = [[[NSImage alloc] initWithSize: NSMakeSize(dstWidth, dstHeight)] autorelease]; + [img addRepresentation:imgrep]; + + return img; +} + +#pragma mark - +#pragma mark Preview movie + ++ (NSString *) appSupportPath +{ + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSString *appSupportPath = nil; + + NSArray *allPaths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, + NSUserDomainMask, + YES ); + if ([allPaths count]) + appSupportPath = [[allPaths objectAtIndex:0] stringByAppendingPathComponent:@"HandBrake"]; + + if (![fileManager fileExistsAtPath:appSupportPath]) + [fileManager createDirectoryAtPath:appSupportPath withIntermediateDirectories:YES attributes:nil error:NULL]; + + return appSupportPath; +} + ++ (NSURL *) generateFileURLForType:(NSString *) type +{ + NSString *previewDirectory = [NSString stringWithFormat:@"%@/Previews/%d", [HBPreviewGenerator appSupportPath], getpid()]; + + if (![[NSFileManager defaultManager] fileExistsAtPath:previewDirectory]) + { + if (![[NSFileManager defaultManager] createDirectoryAtPath:previewDirectory + withIntermediateDirectories:NO + attributes:nil + error:nil]) + return nil; + } + + return [[NSURL fileURLWithPath:previewDirectory] + URLByAppendingPathComponent:[NSString stringWithFormat:@"preview_temp.%@", type]]; +} + +/** + * This function start the encode of a movie preview, the delegate will be + * called with the updated the progress info and the fileURL. + * The called must call HBController prepareJobForPreview before this. + * + * @param index picture index in title. + * @param duration the duration in seconds of the preview movie. + */ +- (BOOL) createMovieAsyncWithImageIndex: (NSUInteger) index andDuration: (NSUInteger) duration; +{ + /* return if an encoding if already started */ + if (self.encodeState || index >= self.imagesCount) + return NO; + + hb_job_t *job = self.title->job; + + /* Generate the file url and directories. */ + if (job->mux & HB_MUX_MASK_MP4) + { + /* we use .m4v for our mp4 files so that ac3 and chapters in mp4 will play properly */ + self.fileURL = [HBPreviewGenerator generateFileURLForType:@"m4v"]; + } + else if (job->mux & HB_MUX_MASK_MKV) + { + self.fileURL = [HBPreviewGenerator generateFileURLForType:@"mkv"]; + } + + /* return if we couldn't get the fileURL */ + if (!self.fileURL) + return NO; + + /* See if there is an existing preview file, if so, delete it */ + if (![[NSFileManager defaultManager] fileExistsAtPath:[self.fileURL path]]) + { + [[NSFileManager defaultManager] removeItemAtPath:[self.fileURL path] error:NULL]; + } + + /* We now direct our preview encode to fileURL path */ + hb_job_set_file(job, [[self.fileURL path] UTF8String]); + + /* We use our advance pref to determine how many previews to scan */ + job->start_at_preview = (int)index + 1; + job->seek_points = (int)self.imagesCount; + job->pts_to_stop = duration * 90000LL; + + /* lets go ahead and send it off to libhb + * Note: unlike a full encode, we only send 1 pass regardless if the final encode calls for 2 passes. + * this should suffice for a fairly accurate short preview and cuts our preview generation time in half. + * However we also need to take into account the indepth scan for subtitles. + */ + + int loggingLevel = [[[NSUserDefaults standardUserDefaults] objectForKey:@"LoggingLevel"] intValue]; + self.privateHandle = hb_init(loggingLevel, 0); + + /* If scanning we need to do some extra setup of the job. */ + if (job->indepth_scan == 1) + { + char *x264opts_tmp; + /* When subtitle scan is enabled do a fast pre-scan job + * which will determine which subtitles to enable, if any. */ + job->pass = -1; + x264opts_tmp = job->advanced_opts; + + job->advanced_opts = NULL; + job->indepth_scan = 1; + + /* Add the pre-scan job */ + hb_add(self.privateHandle, job); + job->advanced_opts = x264opts_tmp; + } + + /* Go ahead and perform the actual encoding preview scan */ + job->indepth_scan = 0; + job->pass = 0; + + hb_add(self.privateHandle, job); + + /* we need to clean up the various lists after the job(s) have been set */ + hb_job_reset(job); + + /* start the actual encode */ + self.encodeState = EncodeStateWorking; + hb_system_sleep_prevent(self.privateHandle); + + [self startHBTimer]; + + hb_start(self.privateHandle); + + return YES; +} + +/** + * Cancels the encoding process + */ +- (void) cancel +{ + if (self.privateHandle) + { + hb_state_t s; + hb_get_state2(self.privateHandle, &s); + + if (self.encodeState && (s.state == HB_STATE_WORKING || + s.state == HB_STATE_PAUSED)) + { + self.encodeState = EncodeStateCancelled; + hb_stop(self.privateHandle); + hb_system_sleep_allow(self.privateHandle); + } + } +} + +- (void) startHBTimer +{ + if (!self.timer) + { + self.timer = [NSTimer scheduledTimerWithTimeInterval:0.5 + target:self + selector:@selector(updateState) + userInfo:nil + repeats:YES]; + } +} + +- (void) stopHBTimer +{ + [self.timer invalidate]; + self.timer = nil; +} + +- (void) updateState +{ + hb_state_t s; + hb_get_state(self.privateHandle, &s); + + switch( s.state ) + { + case HB_STATE_IDLE: + case HB_STATE_SCANNING: + case HB_STATE_SCANDONE: + break; + + case HB_STATE_WORKING: + { + NSMutableString *info = [NSMutableString stringWithFormat: @"Encoding preview: %.2f %%", 100.0 * s.param.working.progress]; + + if( s.param.working.seconds > -1 ) + { + [info appendFormat:@" (%.2f fps, avg %.2f fps, ETA %02dh%02dm%02ds)", + s.param.working.rate_cur, s.param.working.rate_avg, s.param.working.hours, + s.param.working.minutes, s.param.working.seconds]; + } + + double progress = 100.0 * s.param.working.progress; + + [self.delegate updateProgress:progress info:info]; + + break; + } + + case HB_STATE_MUXING: + { + NSString *info = @"Muxing Preview…"; + double progress = 100.0; + + [self.delegate updateProgress:progress info:info]; + + break; + } + + case HB_STATE_PAUSED: + break; + + case HB_STATE_WORKDONE: + { + [self stopHBTimer]; + + // Delete all remaining jobs since libhb doesn't do this on its own. + hb_job_t * job; + while( ( job = hb_job(self.privateHandle, 0) ) ) + hb_rem( self.handle, job ); + + hb_system_sleep_allow(self.privateHandle); + hb_stop(self.privateHandle); + hb_close(&_privateHandle); + self.privateHandle = NULL; + + /* Encode done, call the delegate and close libhb handle */ + if (self.encodeState != EncodeStateCancelled) + { + [self.delegate didCreateMovieAtURL:self.fileURL]; + } + + self.encodeState = EncodeStateIdle; + + break; + } + } +} + +#pragma mark - + +- (void) dealloc +{ + [_timer invalidate]; + [_timer release]; + _timer = nil; + + if (_privateHandle) { + hb_system_sleep_allow(self.privateHandle); + hb_stop(_privateHandle); + hb_close(&_privateHandle); + } + + [_fileURL release]; + _fileURL = nil; + [_picturePreviews release]; + _picturePreviews = nil; + + [super dealloc]; +} + +@end diff --git a/macosx/HandBrake.xcodeproj/project.pbxproj b/macosx/HandBrake.xcodeproj/project.pbxproj index 149933459..147e4100f 100644 --- a/macosx/HandBrake.xcodeproj/project.pbxproj +++ b/macosx/HandBrake.xcodeproj/project.pbxproj @@ -122,6 +122,7 @@ 27D6C77314B102DA00B785E4 /* libxml2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C74014B102DA00B785E4 /* libxml2.a */; }; 3490BCB41614CF8D002A5AD7 /* HandBrake.icns in Resources */ = {isa = PBXBuildFile; fileRef = 3490BCB31614CF8D002A5AD7 /* HandBrake.icns */; }; 46AB433515F98A2B009C0961 /* DockTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 46AB433415F98A2B009C0961 /* DockTextField.m */; }; + A9D1E41718262364002F6424 /* HBPreviewGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = A9D1E41618262364002F6424 /* HBPreviewGenerator.m */; }; A9E1467B16BC2ABD00C307BC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9E1467A16BC2ABD00C307BC /* QuartzCore.framework */; }; A9E1468016BC2AD800C307BC /* next-p.pdf in Resources */ = {isa = PBXBuildFile; fileRef = A9E1467C16BC2AD800C307BC /* next-p.pdf */; }; A9E1468116BC2AD800C307BC /* pause-p.pdf in Resources */ = {isa = PBXBuildFile; fileRef = A9E1467D16BC2AD800C307BC /* pause-p.pdf */; }; @@ -315,6 +316,8 @@ 34FF2FC014EEC363004C2400 /* HBAdvancedController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAdvancedController.h; sourceTree = "<group>"; }; 46AB433315F98A2B009C0961 /* DockTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DockTextField.h; sourceTree = "<group>"; }; 46AB433415F98A2B009C0961 /* DockTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DockTextField.m; sourceTree = "<group>"; }; + A9D1E41518262364002F6424 /* HBPreviewGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPreviewGenerator.h; sourceTree = "<group>"; }; + A9D1E41618262364002F6424 /* HBPreviewGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBPreviewGenerator.m; sourceTree = "<group>"; }; A9E1467A16BC2ABD00C307BC /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = "<absolute>"; }; A9E1467C16BC2AD800C307BC /* next-p.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "next-p.pdf"; sourceTree = "<group>"; }; A9E1467D16BC2AD800C307BC /* pause-p.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "pause-p.pdf"; sourceTree = "<group>"; }; @@ -561,6 +564,8 @@ 273F20A214ADBE670021BE6D /* HBPresets.m */, 273F20A314ADBE670021BE6D /* HBPreviewController.h */, 273F20A414ADBE670021BE6D /* HBPreviewController.m */, + A9D1E41518262364002F6424 /* HBPreviewGenerator.h */, + A9D1E41618262364002F6424 /* HBPreviewGenerator.m */, 273F20A514ADBE670021BE6D /* HBQueueController.h */, 273F20A614ADBE670021BE6D /* HBQueueController.mm */, 273F20A714ADBE670021BE6D /* HBSubtitles.h */, @@ -897,6 +902,7 @@ 273F20B514ADBE670021BE6D /* HBPreferencesController.m in Sources */, 273F20B614ADBE670021BE6D /* HBPresets.m in Sources */, 273F20B714ADBE670021BE6D /* HBPreviewController.m in Sources */, + A9D1E41718262364002F6424 /* HBPreviewGenerator.m in Sources */, 273F20B814ADBE670021BE6D /* HBQueueController.mm in Sources */, 273F20B914ADBE670021BE6D /* HBSubtitles.m in Sources */, 273F20BA14ADBE670021BE6D /* PictureController.m in Sources */, diff --git a/macosx/PictureController.m b/macosx/PictureController.m index e5b30844a..7bf9bf404 100644 --- a/macosx/PictureController.m +++ b/macosx/PictureController.m @@ -12,7 +12,7 @@ { hb_title_t * fTitle; - PreviewController * fPreviewController; + HBPreviewController * fPreviewController; /* Picture Sizing */ IBOutlet NSTabView * fSizeFilterView; @@ -126,7 +126,7 @@ _decombCustomString = @""; _denoiseCustomString = @""; - fPreviewController = [[PreviewController alloc] init]; + fPreviewController = [[HBPreviewController alloc] init]; } return self; @@ -191,12 +191,19 @@ - (void) setHandle: (hb_handle_t *) handle { - [fPreviewController SetHandle: handle]; - [fPreviewController setHBController:(HBController *)self.delegate]; + [fPreviewController setHandle: handle]; + [fPreviewController setDelegate:(HBController *)self.delegate]; } - (void) setTitle: (hb_title_t *) title { + fTitle = title; + + if (!title) { + [fPreviewController setTitle:NULL]; + return; + } + hb_job_t * job = title->job; fTitle = title; @@ -257,8 +264,9 @@ titleParWidth = job->anamorphic.par_width; titleParHeight = job->anamorphic.par_height; - [fPreviewController SetTitle:title]; + [fPreviewController setTitle:title]; + [self FilterSettingsChanged:nil]; [self settingsChanged:nil]; } @@ -504,7 +512,7 @@ - (void) reloadStillPreview { - [fPreviewController SetTitle:fTitle]; + [fPreviewController reload]; } #pragma mark - @@ -570,6 +578,9 @@ - (IBAction) settingsChanged: (id) sender { + if (!fTitle) + return; + hb_job_t * job = fTitle->job; /* if we are anything but strict anamorphic */ @@ -1038,6 +1049,9 @@ - (IBAction) FilterSettingsChanged: (id) sender { + if (!fTitle) + return; + self.detelecine = [fDetelecinePopUp indexOfSelectedItem]; [self adjustFilterDisplay:fDetelecinePopUp]; @@ -1070,10 +1084,9 @@ { fPreviewController.deinterlacePreview = NO; } - + self.grayscale = [fGrayscaleCheck state]; - - + if (sender != nil) { [self.delegate pictureSettingsDidChange]; |