OSDN Git Service

x264 bump to r1338-19977e9
[handbrake-jp/handbrake-jp-git.git] / macosx / InstantHandBrake / ExpressController.m
index c2192a9..37ab8b0 100644 (file)
@@ -1,3 +1,7 @@
+/* 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 "ExpressController.h"
 
 #define INSERT_STRING       @"Insert a DVD"
@@ -8,6 +12,8 @@
 
 #define p fState->param
 
+#import "Device.h"
+
 @interface ExpressController (Private)
 
 - (void) openUpdateDrives: (NSDictionary *) drives;
@@ -15,6 +21,7 @@
     returnCode contextInfo: (void *) contextInfo;
 - (void) openEnable: (BOOL) b;
 
+- (id) updatePopUpIcon: (id) value;
 - (void) convertShow;
 - (void) convertEnable: (BOOL) b;
 
@@ -32,7 +39,7 @@
     /* NSToolbar initializations */
     fToolbar = [[NSToolbar alloc] initWithIdentifier: @"InstantHandBrake Toolbar"];
     [fToolbar setDelegate: self];
-    [fToolbar setAllowsUserCustomization: YES];
+    [fToolbar setAllowsUserCustomization: NO];
     [fToolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel];
     [fToolbar setVisible:NO];
     [fWindow setShowsToolbarButton:NO];
@@ -63,7 +70,7 @@
     [tableColumn setDataCell: buttonCell];
 
     /* Preferences */
-    fConvertFolderString = [NSString stringWithFormat:@"%@/Desktop", NSHomeDirectory()];
+    fConvertFolderString = [NSHomeDirectory() stringByAppendingPathComponent:@"Desktop"];
     [fConvertFolderString retain];
 }
 
@@ -75,6 +82,8 @@
     fState = [fCore hb_state];
     fList   = hb_get_titles( fHandle );
     
+    fDevice = [[DeviceController alloc] init];
+    
     [[NSNotificationCenter defaultCenter] addObserver:self
     selector:@selector(scanningSource:)
     name:@"HBCoreScanningNotification" object:nil];
     [[NSNotificationCenter defaultCenter] addObserver:self
     selector:@selector(workDone:)
     name:@"HBCoreWorkDoneNotification" object:nil];
+    
+    [GrowlApplicationBridge setGrowlDelegate: self];
 }
 
 - (void) applicationWillTerminate: (NSNotification *) n
     [fCore close];
 }
 
+- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
+{
+    if( !flag ) {
+        [fWindow  makeKeyAndOrderFront:nil];
+        return YES;
+    }
+    return NO;
+}
+
 - (NSToolbarItem *) toolbar: (NSToolbar *) toolbar itemForItemIdentifier: (NSString *) ident
                     willBeInsertedIntoToolbar: (BOOL) flag
 {
                         title->seconds];
             }
         }
+        else if( [[col identifier] isEqualToString: @"Size"] )
+        {
+            return [NSString stringWithFormat:@"-"];
+        }
     }
     return nil;
 }
 - (void) openShow: (id) sender
 {
     NSRect frame  = [fWindow frame];
-    float  offset = [fConvertView frame].size.height -
-                    [fOpenView frame].size.height;
+    float  offset = [fConvertView frame].size.height -
+                    [fOpenView frame].size.height ) * [fWindow userSpaceScaleFactor];
 
     frame.origin.y    += offset;
     frame.size.height -= offset;
     [self openEnable: NO];
     [fOpenIndicator setIndeterminate: YES];
     [fOpenIndicator startAnimation: nil];
-    [fOpenProgressField setStringValue: @"Opening..."];
+    [fOpenProgressField setStringValue: NSLocalizedString( @"Opening...", @"Opening...") ];
     [fDriveDetector stop];
 
     if( [fOpenMatrix selectedRow] )
     }
 }
 
+- (void) selectFolderSheetShow: (id) sender
+{
+    NSOpenPanel * panel = [NSOpenPanel openPanel];
+
+    [panel setPrompt: NSLocalizedString(@"Select", @"Convert -> Save panel prompt")];
+    [panel setAllowsMultipleSelection: NO];
+    [panel setCanChooseFiles: NO];
+    [panel setCanChooseDirectories: YES];
+    [panel setCanCreateDirectories: YES];
+
+    [panel beginSheetForDirectory: nil file: nil types: nil
+        modalForWindow: fWindow modalDelegate: self didEndSelector:
+        @selector(selectFolderSheetClosed:returnCode:contextInfo:) contextInfo: nil];
+}
+
+- (void) selectFolderSheetClosed: (NSOpenPanel *) sheet returnCode: (int)
+    returnCode contextInfo: (void *) contextInfo
+{
+    if( returnCode != NSOKButton )
+        return;
+
+    if( fConvertFolderString )
+        [fConvertFolderString release];
+    fConvertFolderString = [[[sheet filenames] objectAtIndex: 0] retain];
+    [[fConvertFolderPopUp itemAtIndex: 0] setTitle: [fConvertFolderString lastPathComponent]];
+    [fConvertFolderPopUp selectItemAtIndex:0];
+    
+    NSMenuItem * item = [fConvertFolderPopUp itemAtIndex: 0];
+    [item setImage: [self updatePopUpIcon:fConvertFolderString]];
+    
+}
+
 - (void) convertGo: (id) sender
 {
     int i, j;
+    Preset * currentPreset = [[[fDevice devicesList] objectAtIndex:[fConvertFormatPopUp indexOfSelectedItem]] firstPreset];
 
     for( i = 0; i < hb_list_count( fList ); i++ )
     {
         hb_title_t * title = hb_list_item( fList, i );
         hb_job_t   * job   = title->job;
 
-        int pixels = 307200;
+               int maxwidth = [currentPreset maxWidth];
+        int maxheight = [currentPreset maxHeight];
+        int pixels = maxwidth * maxheight;
                int aspect = title->aspect;
-               if( [fConvertAspectPopUp indexOfSelectedItem] == 1)
+        
+               if( [fConvertAspectPopUp indexOfSelectedItem] == 1 )
                {
             aspect = 4 * HB_ASPECT_BASE / 3;
                }
+        else if ( [fConvertAspectPopUp indexOfSelectedItem] == 2 )
+        {
+            aspect = 16 * HB_ASPECT_BASE / 9;
+        }
 
-               int maxwidth = 640;
-               job->vbitrate = 1000;
-               if( [fConvertMaxWidthPopUp indexOfSelectedItem] == 1)
-               {
-            maxwidth = 320;
-                       job->vbitrate = 500;
-               }
-               job->deinterlace = 1;
+               job->vbitrate = [currentPreset videoBitRate];
                
-               do
+        if( [fConvertMaxWidthPopUp indexOfSelectedItem] == 2 )
                {
-                       hb_set_size( job, aspect, pixels );
-                       pixels -= 10;
-               } while(job->width > maxwidth);
-               
-        if( [fConvertFormatPopUp indexOfSelectedItem] == 0 )
+            maxwidth = 480;
+                       job->vbitrate /= 1.5;
+        }
+        else if ( [fConvertMaxWidthPopUp indexOfSelectedItem] == 3 )
         {
-            /* iPod / H.264 */
-            job->mux        = HB_MUX_IPOD;
-            job->vcodec     = HB_VCODEC_X264;
-                       job->h264_level = 30;
-            job->x264opts   = "bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:subq=6:no-fast-pskip=1";
+            maxwidth = 320;
+                       job->vbitrate /= 2;
         }
-        else if( [fConvertFormatPopUp indexOfSelectedItem] == 1 )
+        
+        if ( [fConvertAspectPopUp indexOfSelectedItem] > 0 )
         {
-            /* PSP / MPEG-4 */
-            job->mux        = HB_MUX_PSP;
-            job->vrate      = 27000000;
-            job->vrate_base = 900900;   /* 29.97 fps */
-            job->vcodec     = HB_VCODEC_FFMPEG;
-            job->vbitrate   = 600;
-            pixels          = 76800;
-            job->arate      = 24000;
-            job->abitrate   = 96;
-            aspect          = 16 * HB_ASPECT_BASE / 9;
-
-                       if( [fConvertAspectPopUp indexOfSelectedItem] )
-                       {
-                               aspect = -1;
-                       }
-
-                       hb_set_size( job, aspect, pixels );
+            do
+            {
+                hb_set_size( job, aspect, pixels );
+                pixels -= 10;
+            } while(job->width > maxwidth || job->height > maxheight);
         }
         else
         {
-            job->mux      = HB_MUX_MP4;
-            job->vcodec   = HB_VCODEC_X264;
-            job->x264opts = "bframes=3:ref=1:subq=5:me=umh:no-fast-pskip=1:trellis=1:cabac=0";
-            job->abitrate = 128;
-            job->vbitrate = 1500;
+            /* Reset job->crop values */
+            memcpy( job->crop, job->title->crop, 4 * sizeof( int ) );
+            job->width = maxwidth;
+            hb_fix_aspect( job, HB_KEEP_WIDTH );
         }
-
+               
+        job->mux        = [currentPreset muxer];
+        job->vcodec     = [currentPreset videoCodec];
+        job->x264opts = (char *)calloc(1024, 1); /* Fixme, this just leaks */  
+        strcpy(job->x264opts, [[currentPreset videoCodecOptions] UTF8String]);
+        job->chapter_markers = 1;
         job->vquality = -1.0;
 
         const char * lang;
                [fConvertAudioPopUp selectItemWithTitle: @"English"];
         
         if ( [fConvertAudioPopUp selectedItem] == nil )
-            [fConvertAudioPopUp selectItemWithTitle: @"Unknown"];
+            [fConvertAudioPopUp selectItemAtIndex:0];
 
         /* Update subtitle popup */
         hb_subtitle_t * subtitle;
         }
     }
     [fConvertTableView reloadData];
+    
+    NSEnumerator * enumerator;
+    Device * device;
+    enumerator = [[fDevice devicesList] objectEnumerator];
+    
+    while( ( device = [enumerator nextObject] ) )
+        [fConvertFormatPopUp addItemWithTitle:[device name]];
 
     NSRect frame  = [fWindow frame];
-    float  offset = [fConvertView frame].size.height -
-                    [fOpenView frame].size.height;
-    float hoffset = [fConvertView frame].size.width -
-                    [fOpenView frame].size.width;
+    float  offset = ( [fConvertView frame].size.height -
+                    [fOpenView frame].size.height ) * [fWindow userSpaceScaleFactor];;
     frame.origin.y    -= offset;
     frame.size.height += offset;
-    frame.size.width += hoffset;
     [fWindow setContentView: fEmptyView];
     [fWindow setFrame: frame display: YES animate: YES];
     [fToolbar setVisible:YES];
     [fWindow setContentView: fConvertView];
 
-    /* Folder popup */
     NSMenuItem * item = [fConvertFolderPopUp itemAtIndex: 0];
     [item setTitle: [fConvertFolderString lastPathComponent]];
-    NSImage * image32 = [[NSWorkspace sharedWorkspace] iconForFile:
-        fConvertFolderString];
-    NSImage * image16 = [[NSImage alloc] initWithSize:
-        NSMakeSize(16,16)];
-    [image16 lockFocus];
-    [[NSGraphicsContext currentContext]
-        setImageInterpolation: NSImageInterpolationHigh];
-    [image32 drawInRect: NSMakeRect(0,0,16,16)
-        fromRect: NSMakeRect(0,0,32,32) operation: NSCompositeCopy
-        fraction: 1.0];
-    [image16 unlockFocus];                                                      
-    [item setImage: image16];
-    [image16 release];
-
+    [item setImage: [self updatePopUpIcon:fConvertFolderString]];
+    
     [self convertEnable: YES];
 }
 
     [icon release];
 }
 
+- (id) updatePopUpIcon: (id) value
+{
+    if (!value)
+        return nil;
+    
+    NSImage * icon;
+    
+    icon = [[NSWorkspace sharedWorkspace] iconForFile: value];
+    
+    [icon setScalesWhenResized: YES];
+    [icon setSize: NSMakeSize(16.0 , 16.0)];
+    
+    return icon;
+}
+
 - (void) working: (NSNotification *) n
 {
    float progress_total = ( p.working.progress + p.working.job_cur - 1 ) / p.working.job_count;