OSDN Git Service

dvdnav: fix crash when poorly masterd disc has no menus
[handbrake-jp/handbrake-jp-git.git] / macosx / InstantHandBrake / ExpressController.m
index f47a7c2..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;
@@ -33,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];
@@ -64,7 +70,7 @@
     [tableColumn setDataCell: buttonCell];
 
     /* Preferences */
-    fConvertFolderString = [NSString stringWithFormat:@"%@/Desktop", NSHomeDirectory()];
+    fConvertFolderString = [NSHomeDirectory() stringByAppendingPathComponent:@"Desktop"];
     [fConvertFolderString retain];
 }
 
@@ -76,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] )
 {
     NSOpenPanel * panel = [NSOpenPanel openPanel];
 
-    [panel setPrompt: NSLocalizedString(@"Select", "Convert -> Save panel prompt")];
+    [panel setPrompt: NSLocalizedString(@"Select", @"Convert -> Save panel prompt")];
     [panel setAllowsMultipleSelection: NO];
     [panel setCanChooseFiles: NO];
     [panel setCanChooseDirectories: YES];
 - (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];
     icon = [[NSWorkspace sharedWorkspace] iconForFile: value];
     
     [icon setScalesWhenResized: YES];
-    [icon setSize: NSMakeSize(16.0, 16.0)];
+    [icon setSize: NSMakeSize(16.0 , 16.0)];
     
     return icon;
 }