OSDN Git Service

srt: change format string from "utf8" to "utf-8"
[handbrake-jp/handbrake-jp-git.git] / macosx / HBPreviewController.mm
index cea2a1e..622caad 100644 (file)
@@ -7,6 +7,13 @@
 #import "HBPreviewController.h"
 #import "Controller.h"
 
+@implementation QTMovieView ( HBQTkitExt )
+- (void) mouseMoved:(NSEvent *)theEvent
+{
+    [super mouseMoved:theEvent];
+}
+@end
+
 @interface PreviewController (Private)
 
 - (NSSize)optimalViewSizeForImageSize: (NSSize)imageSize;
     
     isFullScreen = NO;
     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];
     
     /* Setup our layers for core animation */
     [fPictureViewArea setWantsLayer:YES];
     [fPictureView setWantsLayer:YES];
-    
-    [fMovieView setWantsLayer:YES];
-    
+
     [fCancelPreviewMovieButton setWantsLayer:YES];
     [fMovieCreationProgressIndicator setWantsLayer:YES];
-    
+
     [fPictureControlBox setWantsLayer:YES];
-    [fPictureSlider setWantsLayer:YES];
-    [fFullScreenToggleButton setWantsLayer:YES];
-    [fPictureSettingsToggleButton setWantsLayer:YES];
-    [fScaleToScreenToggleButton setWantsLayer:YES];
-    [fCreatePreviewMovieButton setWantsLayer:YES];
-    
     [fEncodingControlBox setWantsLayer:YES];
-    
-    [fShowPreviewMovieButton setWantsLayer:YES];
+       [fMovieView setWantsLayer:YES];
+       [fMovieView setHidden:YES];
+    [fMovieView setDelegate:self];
+
+    /* Since the xib has everything off center for easy acess
+     * we align our views and windows here we an align to anything
+     * since it will actually change later upon source load, but
+     * for convenience we will use the fPictureViewArea
+     */
+     
+     /* Align the still preview image view to the picture box */
+     [fPictureView setFrameSize:[fPictureViewArea frame].size];
+     [fMovieView setFrameSize:[fPictureViewArea frame].size];
+     //[fPreviewWindow setFrameSize:[fPictureViewArea frame].size];
     
     
 }
 - (BOOL)acceptsMouseMovedEvents
 {
-return YES;
+    return YES;
 }
 
 - (void)windowWillClose:(NSNotification *)aNotification
 {
-    
-    
     /* Upon Closing the picture window, we make sure we clean up any
      * preview movie that might be playing
      */
-    play_movie = NO;
     hb_stop( fPreviewLibhb );
     isEncoding = NO;
     // Show the picture view
     [fPictureView setHidden:NO];
     [fMovieView pause:nil];
     [fMovieView setHidden:YES];
-    
+       [fMovieView setMovie:nil];
+
     isFullScreen = NO;
     hudTimerSeconds = 0;
     [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"PreviewWindowIsOpen"];
@@ -128,7 +141,6 @@ return YES;
 
 - (BOOL)windowShouldClose:(id)fPictureWindow
 {
-     
      return YES;
 }
 
@@ -208,81 +220,149 @@ return YES;
 // necessary to display as much of the picture as possible.
 - (void) displayPreview
 {
-     hb_job_t * job = fTitle->job;
+    hb_job_t * job = fTitle->job;
     /* lets make sure that the still picture view is not hidden and that 
      * the movie preview is 
      */
     [fMovieView pause:nil];
     [fMovieView setHidden:YES];
+       [fMovieView setMovie:nil];
     [fMovieCreationProgressIndicator stopAnimation: nil];
     [fMovieCreationProgressIndicator setHidden: YES];
     
     [fPictureView setHidden:NO];
-    [fPictureView setImage: [self imageForPicture: fPicture]];
+    
+    //[fHBController writeToActivityLog: "displayPreview called"];
+    
+    NSImage *fPreviewImage = [self imageForPicture: fPicture];
+    NSSize imageScaledSize = [fPreviewImage size];
+    [fPictureView setImage: fPreviewImage];
     
     NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height );
+    NSString *sizeInfoString;
     /* Set the picture size display fields below the Preview Picture*/
     if( fTitle->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;
-        [fInfoField setStringValue:[NSString stringWithFormat:
-                                    @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Strict",
-                                    fTitle->width, fTitle->height, output_width, output_height, display_width, output_height]];
-        displaySize.width *= ( ( CGFloat )fTitle->job->anamorphic.par_width ) / ( ( CGFloat )fTitle->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];
+        
+        displaySize.width = display_width;
+        displaySize.height = fTitle->height;
+        imageScaledSize.width = display_width;
+        imageScaledSize.height = output_height;   
     }
     else if (fTitle->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(job, &output_width, &output_height, &output_par_width, &output_par_height);
         display_width = output_width * output_par_width / output_par_height;
-        [fInfoField setStringValue:[NSString stringWithFormat:
-                                    @"Source: %dx%d, Output: %dx%d, Anamorphic: %dx%d Loose",
-                                    fTitle->width, fTitle->height, output_width, output_height, display_width, output_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];
         
         displaySize.width = display_width;
+        displaySize.height = fTitle->height;
+        imageScaledSize.width = display_width;
+        imageScaledSize.height = output_height;
     }
+    else if (fTitle->job->anamorphic.mode == 3) // Custom Anamorphic
+    {
+        hb_set_anamorphic_size(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 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;   
+    } 
     else // No Anamorphic
     {
-        [fInfoField setStringValue: [NSString stringWithFormat:
-                                     @"Source: %dx%d, Output: %dx%d", fTitle->width, fTitle->height,
-                                     fTitle->job->width, fTitle->job->height]];
+        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;
     }
     
-    
     NSSize viewSize = [self optimalViewSizeForImageSize:displaySize];
+    
+    /* Initially set our preview image here */
+    /*
+    if (scaleToScreen == YES)
+    {
+        viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width);
+        viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height);
+        [fPreviewImage setSize: viewSize];
+        //[fPictureView setFrameSize: viewSize];
+    }
+    
+    else
+    {
+        [fPreviewImage setSize: imageScaledSize];
+        [fPictureView setFrameSize: imageScaledSize];
+    }
+    [fPictureView setImage: fPreviewImage];
+    // center it vertically and horizontally
+    NSPoint origin = [fPictureViewArea frame].origin;
+    origin.y += ([fPictureViewArea frame].size.height -
+                 [fPictureView frame].size.height) / 2.0;
+    
+    origin.x += ([fPictureViewArea frame].size.width -
+                 [fPictureView frame].size.width) / 2.0;
+    [fPictureView setFrameOrigin:origin]; 
+    */
     /* we also need to take into account scaling to full screen to activate switching the view size */
     if( [self viewNeedsToResizeToSize:viewSize])
     {
-        /* In the case of loose anamorphic, do not resize the window when scaling down */
-        // FIX ME: we need a new way to do this as we do not havefWidthField anymore
-        //if (fTitle->job->anamorphic.mode != 2 || [fWidthField intValue] == fTitle->width)
-        if (fTitle->job->anamorphic.mode != 2 || (fTitle->job->anamorphic.mode == 2 && output_width == fTitle->width))
+        if (fTitle->job->anamorphic.mode != 2 || (fTitle->job->anamorphic.mode == 2 && fTitle->width == fTitle->job->width))
         {
             [self resizeSheetForViewSize:viewSize];
-            [self setViewSize:viewSize];
+            //[self setViewSize:viewSize];
+            
         }
+    }   
+    
+    viewSize.width = viewSize.width - (viewSize.width - imageScaledSize.width);
+    viewSize.height = viewSize.height - (viewSize.height - imageScaledSize.height);
+    [self setViewSize:viewSize];
+    
+    /* special case for scaleToScreen */
+    if (scaleToScreen == YES)
+    {
+        [fPreviewImage setSize: viewSize];
+        [fPictureView setImage: fPreviewImage];
     }
     
+    NSString *scaleString;
     
-    // Show the scaled text (use the height to check since the width can vary
-    // with anamorphic video).
-    if( ( ( int )viewSize.height ) != fTitle->height )
+    if( imageScaledSize.height > [fPictureView frame].size.height)
     {
-        CGFloat scale = viewSize.width / ( ( CGFloat ) fTitle->width );
-        NSString *scaleString = [NSString stringWithFormat:
-                                 NSLocalizedString( @" (Preview scaled to %.0f%% actual size)",
-                                                   @"String shown when a preview is scaled" ),
-                                 scale * 100.0];
-        [fscaleInfoField setStringValue: [NSString stringWithFormat:
-                                          @"%@", scaleString]];
-        
+        CGFloat scale = ( ( CGFloat )[fPictureView frame].size.width) / ( ( CGFloat )imageScaledSize.width);        
+        scaleString = [NSString stringWithFormat:
+                       NSLocalizedString( @" (Scaled to %.0f%% actual size)",
+                                         @"String shown when a preview is scaled" ), scale * 100.0];
     }
     else
     {
-        [fscaleInfoField setStringValue: @""];
+        scaleString = @"";
     }
-
+    /* 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]];
 }
 
 - (IBAction) previewDurationPopUpChanged: (id) sender
@@ -297,10 +377,6 @@ return YES;
          // Purge the existing picture previews so they get recreated the next time
         // they are needed.
         [self purgeImageCache];
-        /* We actually call displayPreview now from pictureSliderChanged which keeps
-         * our picture preview slider in sync with the previews being shown
-         */
-        //[self displayPreview];
         [self pictureSliderChanged:nil];
 }
 
@@ -310,6 +386,7 @@ return YES;
     [fPictureView setHidden:NO];
     [fMovieView pause:nil];
     [fMovieView setHidden:YES];
+       [fMovieView setMovie:nil];
     [fEncodingControlBox setHidden: YES];
     
     int newPicture = [fPictureSlider intValue];
@@ -323,13 +400,9 @@ return YES;
 
 - (IBAction)showPreviewPanel: (id)sender forTitle: (hb_title_t *)title
 {
-    [self SetTitle:title];
-    
     if ([fPreviewWindow isVisible])
     {
-        
         [fPreviewWindow close];
-        
     }
     else
     {
@@ -338,10 +411,7 @@ return YES;
         [fPreviewWindow setAcceptsMouseMovedEvents:YES];
         isFullScreen = NO;
         scaleToScreen = NO;
-        hudTimerSeconds = 0;
         [self pictureSliderChanged:nil];
-        [self startHudTimer];
-        
     }
     
 }
@@ -360,38 +430,38 @@ return YES;
 - (void) mouseMoved:(NSEvent *)theEvent
 {
     [super mouseMoved:theEvent];
+    NSPoint mouseLoc = [theEvent locationInWindow];
     
-    if (isEncoding == NO)
-    {    
-        if (hudTimerSeconds == 0)
+    /* Test for mouse location to show/hide hud controls */
+    if( isEncoding == NO ) {
+        if( NSPointInRect( mouseLoc, [fPictureControlBox frame] ) )
         {
-            hudTimerSeconds ++;
-            [self startHudTimer];
+            [[fPictureControlBox animator] setHidden: NO];
+            [self stopHudTimer];
         }
-        
-        if (hudTimerSeconds > 20)
+               else if( NSPointInRect( mouseLoc, [fPictureViewArea frame] ) )
         {
-            
-            
-            [self stopHudTimer];
-            [self showHideHudControls];
+            [[fPictureControlBox animator] setHidden: NO];
+            [self startHudTimer];
         }
-        
-    }
+        else
+            [[fPictureControlBox animator] setHidden: YES];
+       }
 }
 
 - (void) startHudTimer
 {
-    if (!fHudTimer)
-    {
-        fHudTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hudTimerFired:) userInfo:nil repeats:YES];
-        [fHudTimer retain];
-    }
+       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)
+    if( fHudTimer )
     {
         [fHudTimer invalidate];
         [fHudTimer release];
@@ -402,73 +472,13 @@ return YES;
 
 - (void) hudTimerFired: (NSTimer*)theTimer
 {
-    hudTimerSeconds ++;
-    [self showHideHudControls];
-
-}
-
-- (void) showHideHudControls
-{
-    /* Test for mouse location to show/hide hud controls */
-    NSPoint    mouseLoc;
-    NSRect     targetFrame;
-    NSRect     controlBoxFrame;
-    targetFrame = [fPictureViewArea frame];
-    controlBoxFrame = [fPictureControlBox frame];
-    
-    if (isFullScreen)
-    {
-        mouseLoc = [fFullScreenWindow mouseLocationOutsideOfEventStream];
-        [fScaleToScreenToggleButton setHidden:NO];
-    }
-    else
-    {
-        mouseLoc = [fPreviewWindow mouseLocationOutsideOfEventStream];
-        [fScaleToScreenToggleButton setHidden:YES];
-    }
-    
-    /* if the pointer is inside the picture view areas but not
-     * in the controlbox, check the hudTimerSeconds to see if
-     * its in the allowable time span
-     */
-    if ( hudTimerSeconds > 0 && hudTimerSeconds < 20)
-    {
-        
-        if (isEncoding == NO)
-        {
-            if (NSPointInRect (mouseLoc, controlBoxFrame))
-            {
-                /* Mouse is over the preview area so show hud controls so just
-                 * reset the timer to keep the control box visible
-                */
-                [fPictureControlBox setHidden: NO];
-                hudTimerSeconds = 1;
-                return;
-            }
-            /* Re-verify we are within the target frame */
-            if (NSPointInRect (mouseLoc, targetFrame))
-            {
-                /* Mouse is over the preview area so show hud controls */
-                [[fPictureControlBox animator] setHidden: NO];
-                /* increment our timer by one */
-                hudTimerSeconds ++;
-            }
-            else
-            {
-                [[fPictureControlBox animator] setHidden: YES];
-                [self stopHudTimer];
-            }
-        }
-        
-    }
-    else
-    {
+    hudTimerSeconds++;
+    if( hudTimerSeconds >= 10 ) {
         [[fPictureControlBox animator] setHidden: YES];
+        [self stopHudTimer];
     }
-    
 }
 
-
 #pragma mark Fullscreen Mode
 
 - (IBAction)toggleScreenMode:(id)sender
@@ -499,14 +509,6 @@ return YES;
         [self pictureSliderChanged:nil];
         [fScaleToScreenToggleButton setTitle:@">-<"];
     }
-    
-    /* Actually perform the scaling */
-    /*
-    NSSize displaySize = NSMakeSize( ( CGFloat )fTitle->width, ( CGFloat )fTitle->height );
-    NSSize viewSize = [self optimalViewSizeForImageSize:displaySize];
-    [self resizeSheetForViewSize:viewSize];
-    [self setViewSize:viewSize];
-    */
 }
 
 - (BOOL)fullScreen
@@ -601,7 +603,6 @@ return YES;
         /* make sure we are set to a still preview */
         [self pictureSliderChanged:nil];
         
-        //[fPreviewWindow setAcceptsMouseMovedEvents:NO];
         [fFullScreenWindow setAcceptsMouseMovedEvents:YES];
         
         
@@ -689,141 +690,61 @@ return YES;
 + (NSImage *) makeImageForPicture: (int)pictureIndex
                 libhb:(hb_handle_t*)handle
                 title:(hb_title_t*)title
-                removeBorders:(BOOL)removeBorders
 {
-    if (removeBorders)
+    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 )
     {
-        //     |<---------- title->width ----------->|
-        //     |   |<---- title->job->width ---->|   |
-        //     |   |                             |   |
-        //     .......................................
-        //     ....+-----------------------------+....
-        //     ....|                             |....<-- gray border
-        //     ....|                             |....
-        //     ....|                             |....
-        //     ....|                             |<------- image
-        //     ....|                             |....
-        //     ....|                             |....
-        //     ....|                             |....
-        //     ....|                             |....
-        //     ....|                             |....
-        //     ....+-----------------------------+....
-        //     .......................................
-
-        static uint8_t * buffer;
-        static int bufferSize;
-
-        // Make sure we have a big enough buffer to receive the image from libhb. libhb
-        // creates images with a one-pixel border around the original content. Hence we
-        // add 2 pixels horizontally and vertically to the buffer size.
-        int srcWidth = title->width + 2;
-        int srcHeight= title->height + 2;
-        int newSize;
-        newSize = srcWidth * srcHeight * 4;
-        if( bufferSize < newSize )
-        {
-            bufferSize = newSize;
-            buffer     = (uint8_t *) realloc( buffer, bufferSize );
-        }
+        bufferSize = newSize;
+        buffer     = (uint8_t *) realloc( buffer, bufferSize );
+    }
 
-        hb_get_preview( handle, title, pictureIndex, buffer );
+    hb_get_preview( handle, title, pictureIndex, buffer );
 
-        // 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.
+    // 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.
         
-        int dstWidth = title->job->width;
-        int dstHeight = title->job->height;
-        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];
-
-        int borderTop = (srcHeight - dstHeight) / 2;
-        int borderLeft = (srcWidth - dstWidth) / 2;
+    // The image data returned by hb_get_preview is 4 bytes per pixel, BGRA format.
+    // Alpha is ignored.
         
-        UInt32 * src = (UInt32 *)buffer;
-        UInt32 * dst = (UInt32 *)[imgrep bitmapData];
-        src += borderTop * srcWidth;    // skip top rows in src to get to first row of dst
-        src += borderLeft;              // skip left pixels in src to get to first pixel of dst
-        for (int r = 0; r < dstHeight; r++)
-        {
-            for (int c = 0; c < dstWidth; c++)
-#if TARGET_RT_LITTLE_ENDIAN
-                *dst++ = Endian32_Swap(*src++);
-#else
-                *dst++ = *src++;
-#endif
-            src += (srcWidth - dstWidth);   // skip to next row in src
-        }
-
-        NSImage * img = [[[NSImage alloc] initWithSize: NSMakeSize(dstWidth, dstHeight)] autorelease];
-        [img addRepresentation:imgrep];
-
-        return img;
-    }
-    else
+    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];
+    for (int r = 0; r < dstHeight; r++)
     {
-        // Make sure we have big enough buffer
-        static uint8_t * buffer;
-        static int bufferSize;
-
-        int newSize;
-        newSize = ( title->width + 2 ) * (title->height + 2 ) * 4;
-        if( bufferSize < newSize )
-        {
-            bufferSize = newSize;
-            buffer     = (uint8_t *) realloc( buffer, bufferSize );
-        }
-
-        hb_get_preview( handle, title, pictureIndex, buffer );
-
-        // The image data returned by hb_get_preview is 4 bytes per pixel, BGRA format.
-        // We'll copy that into an NSImage swapping it to ARGB in the process. Alpha is
-        // ignored.
-        int width = title->width + 2;      // hblib adds a one-pixel border to the image
-        int height = title->height + 2;
-        int numPixels = width * height;
-        NSBitmapFormat bitmapFormat = (NSBitmapFormat)NSAlphaFirstBitmapFormat;
-        NSBitmapImageRep * imgrep = [[[NSBitmapImageRep alloc]
-                initWithBitmapDataPlanes:nil
-                pixelsWide:width
-                pixelsHigh:height
-                bitsPerSample:8
-                samplesPerPixel:3   // ignore alpha
-                hasAlpha:NO
-                isPlanar:NO
-                colorSpaceName:NSCalibratedRGBColorSpace
-                bitmapFormat:bitmapFormat
-                bytesPerRow:width * 4
-                bitsPerPixel:32] autorelease];
-
-        UInt32 * src = (UInt32 *)buffer;
-        UInt32 * dst = (UInt32 *)[imgrep bitmapData];
-        for (int i = 0; i < numPixels; i++)
+        for (int c = 0; c < dstWidth; c++)
 #if TARGET_RT_LITTLE_ENDIAN
             *dst++ = Endian32_Swap(*src++);
 #else
             *dst++ = *src++;
 #endif
+    }
 
-        NSImage * img = [[[NSImage alloc] initWithSize: NSMakeSize(width, height)] autorelease];
-        [img addRepresentation:imgrep];
+    NSImage * img = [[[NSImage alloc] initWithSize: NSMakeSize(dstWidth, dstHeight)] autorelease];
+    [img addRepresentation:imgrep];
 
-        return img;
-    }
+    return img;
 }
 
 // Returns the preview image for the specified index, retrieving it from its internal
@@ -838,7 +759,7 @@ return YES;
     NSImage * theImage = [fPicturePreviews objectForKey:key];
     if (!theImage)
     {
-        theImage = [PreviewController makeImageForPicture:pictureIndex libhb:fHandle title:fTitle removeBorders: NO];
+        theImage = [PreviewController makeImageForPicture:pictureIndex libhb:fHandle title:fTitle];
         [fPicturePreviews setObject:theImage forKey:key];
     }
     return theImage;
@@ -868,12 +789,11 @@ return YES;
     
     if(sender == fCancelPreviewMovieButton && (s.state == HB_STATE_WORKING || s.state == HB_STATE_PAUSED))
        {
-        
-        play_movie = NO;
         hb_stop( fPreviewLibhb );
         [fPictureView setHidden:NO];
         [fMovieView pause:nil];
         [fMovieView setHidden:YES];
+               [fMovieView setMovie:nil];
         [fPictureSlider setHidden:NO];
         isEncoding = NO;
         
@@ -939,7 +859,33 @@ return YES;
     /* 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 )
+    {
+        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->x264opts;
+        
+        job->x264opts = NULL;
+        job->indepth_scan = 1;  
+        /*
+         * Add the pre-scan job
+         */
+        hb_add( fPreviewLibhb, job );
+        job->x264opts = x264opts_tmp;
+    }                  
+    /* Go ahead and perform the actual encoding preview scan */
+    job->indepth_scan = 0;
+    job->pass = 0;
     hb_add( fPreviewLibhb, job );
     
     [fEncodingControlBox setHidden: NO];
@@ -949,9 +895,7 @@ return YES;
     [fPreviewMovieStatusField setHidden: NO];
     
     isEncoding = YES;
-    
-    play_movie = YES;
-    
+
     /* Let fPreviewLibhb do the job */
     hb_start( fPreviewLibhb );
        
@@ -1050,21 +994,14 @@ return YES;
             isEncoding = NO;
             /* we make sure the picture slider and preview match */
             [self pictureSliderChanged:nil];
-            
-            
+
             // Show the movie view
-            if (play_movie)
-            {
             [self showMoviePreview:fPreviewMoviePath];
-            }
-            
             [fCreatePreviewMovieButton setTitle: @"Live Preview"];
-            
-            
+
             break;
         }
     }
-       
 }
 
 - (IBAction) showMoviePreview: (NSString *) path
@@ -1075,103 +1012,100 @@ return YES;
      * we retain the gray cropping border  we have already established
      * with the still previews
      */
-    [fMovieView setHidden:NO];
-    
-    /* Load the new movie into fMovieView */
-    QTMovie * aMovie;
-    NSRect movieBounds;
-    if (path)
-    {
-        [fMovieView setControllerVisible: YES];
-        /* let's make sure there is no movie currently set */
-        [fMovieView setMovie:nil];
-        
-        aMovie = [QTMovie movieWithFile:path error:nil];
-
-        /* we get some size information from the preview movie */
-        NSSize movieSize= [[aMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
-        movieBounds = [fMovieView movieBounds];
-        movieBounds.size.height = movieSize.height;
-
-        if ([fMovieView isControllerVisible])
-            movieBounds.size.height += [fMovieView controllerBarHeight];
-        /* since for whatever the reason I cannot seem to get the [fMovieView controllerBarHeight]
-         * For now just use 15 for additional height as it seems to line up well
-         */
-        movieBounds.size.height += 15;
-
-        movieBounds.size.width = movieSize.width;
 
-        /* We need to find out if the preview movie needs to be scaled down so
-         * that it doesn't overflow our available viewing container (just like for image
-         * in -displayPreview) for HD sources, etc. [fPictureViewArea frame].size.height*/
-        if( ((int)movieBounds.size.height) > [fPictureView frame].size.height || scaleToScreen == YES)
-        {
-            /* The preview movie would be larger than the available viewing area
-             * in the preview movie, so we go ahead and scale it down to the same size
-             * as the still preview  or we readjust our window to allow for the added height if need be
-             */
-            NSSize displaySize = NSMakeSize( (float)movieBounds.size.width, (float)movieBounds.size.height );
-            NSSize viewSize = [self optimalViewSizeForImageSize:displaySize];
-            if( [self viewNeedsToResizeToSize:viewSize] )
+    /* Load the new movie into fMovieView */
+    if (path) {
+               QTMovie * aMovie;
+               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",
+                                                                                QTMovieApertureModeClean, QTMovieApertureModeAttribute,
+                                                                                nil];
+
+        aMovie = [[[QTMovie alloc] initWithAttributes:movieAttributes error:&outError] autorelease];
+
+               if (!aMovie) {
+                       NSLog(@"Unable to open movie");
+               }
+        else {
+            NSRect movieBounds;
+            /* we get some size information from the preview movie */
+            NSSize movieSize= [[aMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
+            movieBounds = [fMovieView movieBounds];
+            movieBounds.size.height = movieSize.height;
+            
+            if ([fMovieView isControllerVisible]) {
+                CGFloat controllerBarHeight = [fMovieView controllerBarHeight];
+                if ( controllerBarHeight != 0 ) //Check if QTKit return a real value or not.
+                    movieBounds.size.height += controllerBarHeight;
+                else
+                    movieBounds.size.height += 15;
+            }
+            
+            movieBounds.size.width = movieSize.width;
+            
+            /* We need to find out if the preview movie needs to be scaled down so
+             * that it doesn't overflow our available viewing container (just like for image
+             * in -displayPreview) for HD sources, etc. [fPictureViewArea frame].size.height*/
+            if( (movieBounds.size.height) > [fPictureViewArea frame].size.height || scaleToScreen == YES )
+            {
+                /* The preview movie would be larger than the available viewing area
+                 * in the preview movie, so we go ahead and scale it down to the same size
+                 * as the still preview  or we readjust our window to allow for the added height if need be
+                 */
+                NSSize displaySize = NSMakeSize( ( CGFloat ) movieBounds.size.width, ( CGFloat ) movieBounds.size.height );
+                NSSize viewSize = [self optimalViewSizeForImageSize:displaySize];
+                if( [self viewNeedsToResizeToSize:viewSize] ) {
+                    [self resizeSheetForViewSize:viewSize];
+                    [self setViewSize:viewSize];
+                }
+                [fMovieView setFrameSize:viewSize];
+            }
+            else
             {
-                
-                [self resizeSheetForViewSize:viewSize];
-                [self setViewSize:viewSize];
-                
+                /* Since the preview movie is smaller than the available viewing area
+                 * we can go ahead and use the preview movies native size */
+                [fMovieView setFrameSize:movieBounds.size];
             }
             
-            [fMovieView setPreservesAspectRatio:YES];
-            [fMovieView setFrameSize:viewSize];
-        }
-        else
-        {
-            /* Since the preview movie is smaller than the available viewing area
-             * we can go ahead and use the preview movies native size */
-            [fMovieView setFrameSize:movieBounds.size];
-
-        }
-        
-
-        
-
-        // lets reposition the movie if need be
-        
-        NSPoint origin = [fPictureViewArea frame].origin;
-        origin.x += trunc(([fPictureViewArea frame].size.width -
-                           [fMovieView frame].size.width) / 2.0);
-        /* We need to detect whether or not we are currently less than the available height.*/
-        if (movieBounds.size.height < [fPictureView frame].size.height)
-        {
-        /* If we are, we are adding 15 to the height to allow for the controller bar so
-         * we need to subtract half of that for the origin.y to get the controller bar
-         * below the movie to it lines up vertically with where our still preview was
-         */
-        origin.y += trunc((([fPictureViewArea frame].size.height -
-                            [fMovieView frame].size.height) / 2.0) - 7.5);
-        }
-        else
-        {
-        /* if we are >= to the height of the picture view area, the controller bar
-         * gets taken care of with picture resizing, so we do not want to offset the height
-         */
-        origin.y += trunc(([fPictureViewArea frame].size.height -
-                            [fMovieView frame].size.height) / 2.0);
+            //lets reposition the movie if need be
+            
+            NSPoint origin = [fPictureViewArea frame].origin;
+            origin.x += trunc( ( [fPictureViewArea frame].size.width -
+                                [fMovieView frame].size.width ) / 2.0 );
+            /* We need to detect whether or not we are currently less than the available height.*/
+            if( movieBounds.size.height < [fPictureView frame].size.height )
+            {
+                /* If we are, we are adding 15 to the height to allow for the controller bar so
+                 * we need to subtract half of that for the origin.y to get the controller bar
+                 * below the movie to it lines up vertically with where our still preview was
+                 */
+                origin.y += trunc( ( ( [fPictureViewArea frame].size.height -
+                                      [fMovieView frame].size.height ) / 2.0 ) - 7.5 );
+            }
+            else
+            {
+                /* if we are >= to the height of the picture view area, the controller bar
+                 * gets taken care of with picture resizing, so we do not want to offset the height
+                 */
+                origin.y += trunc( ( [fPictureViewArea frame].size.height -
+                                    [fMovieView frame].size.height ) / 2.0 );
+            }
+            [fMovieView setFrameOrigin:origin];
+            [fMovieView setMovie:aMovie];
+            [fMovieView setHidden:NO];
+            // to actually play the movie
+            [fMovieView play:aMovie];
         }
-        [fMovieView setFrameOrigin:origin]; 
-        
-        [fMovieView setMovie:aMovie];
-        /// to actually play the movie
-        [fMovieView play:aMovie];
     }
-    else
-    {
-        aMovie = nil;
-    }       
     isEncoding = NO;
 }
 
-
 @end
 
 @implementation PreviewController (Private)
@@ -1236,8 +1170,6 @@ return YES;
     
     if (scaleToScreen == YES)
     {
-        //CGFloat scaleToScreenWidth;
-        //CGFloat scaleToScreenHeight;
         CGFloat screenAspect;
         CGFloat viewAreaAspect; 
         //note, a mbp 15" at 1440 x 900 is a 1.6 ar
@@ -1346,34 +1278,46 @@ return YES;
 // Assumes resizeSheetForViewSize: has already been called.
 //
 - (void)setViewSize: (NSSize)viewSize
-{
+{   
+    /* special case for scaleToScreen */
+    if (scaleToScreen == YES)
+    {
+        /* for scaleToScreen, we expand the fPictureView to fit the entire screen */
+        NSSize areaSize = [fPictureViewArea frame].size;
+        CGFloat viewSizeAspect = viewSize.width / viewSize.height;
+        if (viewSizeAspect > 1.0) // we are wider than taller, so expand the width to fill the area and scale the height
+        {
+            viewSize.width = areaSize.width;
+            viewSize.height = viewSize.width / viewSizeAspect;
+        }
+        else
+        {
+            viewSize.height = areaSize.height;
+            viewSize.width = viewSize.height * viewSizeAspect;
+        }
+        
+    }
+
     [fPictureView setFrameSize:viewSize];
-    
-    // center it vertically
+
+    // center it vertically and horizontally
     NSPoint origin = [fPictureViewArea frame].origin;
     origin.y += ([fPictureViewArea frame].size.height -
                  [fPictureView frame].size.height) / 2.0;
-    [fPictureView setFrameOrigin:origin];
-    
-    NSPoint controlboxorigin = [fPictureView frame].origin;
-    
-    /* for now, put the origin.y 100 above the bottom of the fPictureView */
-    controlboxorigin.y += 100;
     
-    controlboxorigin.x += ([fPictureViewArea frame].size.width -
-                 [fPictureControlBox frame].size.width) / 2.0;
-    /* requires that thefPictureControlBox and the fEncodingControlBox
-     * are the same width to line up.
-     */
-    [fPictureControlBox setFrameOrigin:controlboxorigin];
-    [fEncodingControlBox setFrameOrigin:controlboxorigin];
+    origin.x += ([fPictureViewArea frame].size.width -
+                 [fPictureView frame].size.width) / 2.0; 
+
+    origin.x = floor( origin.x );
+    origin.y = floor( origin.y );
     
+    [fPictureView setFrameOrigin:origin];
 }
 
 
 - (BOOL)viewNeedsToResizeToSize: (NSSize)newSize
 {
-    NSSize viewSize = [fPictureView frame].size;
+    NSSize viewSize = [fPictureViewArea frame].size;
     return (newSize.width != viewSize.width || newSize.height != viewSize.height);
 }