OSDN Git Service

LinGui: fix me_method/me_range dependency
[handbrake-jp/handbrake-jp-git.git] / libhb / hb.c
index 06b4893..31b45c2 100644 (file)
@@ -277,8 +277,11 @@ void hb_set_cpu_count( hb_handle_t * h, int cpu_count )
  * @param h Handle to hb_handle_t
  * @param path location of VIDEO_TS folder.
  * @param title_index Desired title to scan.  0 for all titles.
+ * @param preview_count Number of preview images to generate.
+ * @param store_previews Whether or not to write previews to disk.
  */
-void hb_scan( hb_handle_t * h, const char * path, int title_index )
+void hb_scan( hb_handle_t * h, const char * path, int title_index,
+              int preview_count, int store_previews )
 {
     hb_title_t * title;
 
@@ -290,7 +293,8 @@ void hb_scan( hb_handle_t * h, const char * path, int title_index )
     }
 
     hb_log( "hb_scan: path=%s, title_index=%d", path, title_index );
-    h->scan_thread = hb_scan_init( h, path, title_index, h->list_title );
+    h->scan_thread = hb_scan_init( h, path, title_index, h->list_title,
+                                   preview_count, store_previews );
 }
 
 /**
@@ -321,16 +325,18 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     AVPicture            pic_in, pic_preview, pic_deint, pic_crop, pic_scale;
     struct SwsContext  * context;
     int                  i;
+    int                  rgb_width = ((job->width + 7) >> 3) << 3;
+    int                  preview_size;
 
     swsflags = SWS_LANCZOS;
 #ifndef __x86_64__
     swsflags |= SWS_ACCURATE_RND;
 #endif  /* __x86_64__ */
 
-    buf1 = malloc( title->width * title->height * 3 / 2 );
-    buf2 = malloc( title->width * title->height * 3 / 2 );
-    buf3 = malloc( title->width * title->height * 3 / 2 );
-    buf4 = malloc( title->width * title->height * 4 );
+    buf1 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, title->width, title->height ) );
+    buf2 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, title->width, title->height ) );
+    buf3 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, job->width, job->height ) );
+    buf4 = av_malloc( avpicture_get_size( PIX_FMT_RGBA32, rgb_width, job->height ) );
     avpicture_fill( &pic_in, buf1, PIX_FMT_YUV420P,
                     title->width, title->height );
     avpicture_fill( &pic_deint, buf2, PIX_FMT_YUV420P,
@@ -338,7 +344,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     avpicture_fill( &pic_scale, buf3, PIX_FMT_YUV420P,
                     job->width, job->height );
     avpicture_fill( &pic_preview, buf4, PIX_FMT_RGBA32,
-                    job->width, job->height );
+                    rgb_width, job->height );
 
     // Allocate the AVPicture frames and fill in
 
@@ -354,7 +360,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
         return;
     }
 
-    fread( buf1, title->width * title->height * 3 / 2, 1, file );
+    fread( buf1, avpicture_get_size( PIX_FMT_YUV420P, title->width, title->height), 1, file );
     fclose( file );
 
     if( job->deinterlace )
@@ -386,8 +392,8 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     sws_freeContext( context );
 
     // Get preview context
-    context = sws_getContext(job->width, job->height, PIX_FMT_YUV420P,
-                              job->width, job->height, PIX_FMT_RGBA32,
+    context = sws_getContext(rgb_width, job->height, PIX_FMT_YUV420P,
+                              rgb_width, job->height, PIX_FMT_RGBA32,
                               swsflags, NULL, NULL, NULL);
 
     // Create preview
@@ -407,6 +413,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     }
 
     /* Draw the picture, centered, and draw the cropping zone */
+    preview_size = pic_preview.linesize[0];
     pen = buffer + ( title->height - job->height ) *
         ( title->width + 2 ) * 2 + ( title->width - job->width ) * 2;
     memset( pen, 0xFF, 4 * ( job->width + 2 ) );
@@ -417,7 +424,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
         nextLine = pen + 4 * ( title->width + 2 );
         memset( pen, 0xFF, 4 );
         pen += 4;
-        memcpy( pen, buf4 + 4 * job->width * i, 4 * job->width );
+        memcpy( pen, buf4 + preview_size * i, 4 * job->width );
         pen += 4 * job->width;
         memset( pen, 0xFF, 4 );
         pen = nextLine;
@@ -566,7 +573,7 @@ void hb_set_anamorphic_size( hb_job_t * job,
     int cropped_height = title->height - job->crop[0] - job->crop[1] ;
     double storage_aspect = (double)cropped_width / (double)cropped_height;
     int width = job->width;
-    int height; // Gets set later, ignore user value
+    int height; // Gets set later, ignore user job->height value
     int mod = job->modulus;
     double aspect = title->aspect;
 
@@ -580,22 +587,11 @@ void hb_set_anamorphic_size( hb_job_t * job,
     */
 
     if ( job->maxWidth && (job->maxWidth < job->width) )
-            width = job->maxWidth;
+        width = job->maxWidth;
 
-    height = (double)width / storage_aspect;
+    height = ((double)width / storage_aspect) + 0.5;
     if ( job->maxHeight && (job->maxHeight < height) )
-    {
         height = job->maxHeight;
-    }
-    else
-    {
-        height = (double)width / storage_aspect;
-    }
-
-
-    /* Time to get picture dimensions that divide cleanly.
-       These variables will store temporary dimensions as we iterate. */
-    int i, w, h;
 
     /* In case the user specified a modulus, use it */
     if (job->modulus)
@@ -603,55 +599,16 @@ void hb_set_anamorphic_size( hb_job_t * job,
     else
         mod = 16;
 
-    /* Iterate through multiples of mod to find one close to job->width. */
-    for( i = 1;; i++ )
-    {
-        w = mod * i;
-
-        if (w < width)
-        {
-            if ( ( width - w ) <= ( mod / 2 ) )
-                /* We'll take a width that's
-                   smaller, but close enough. */
-                break;
-        }
-        if (w == width)
-            /* Mod 16 dimensions, how nice! */
-            break;
-        if( w > width )
-        {
-            if ( ( w - width ) < (mod/2) )
-                /* We'll take a width that's bigger, if we have to. */
-                break;
-        }
-    }
-    width  = mod * (i);
-
-    /* Now do the same for a mod-friendly value near job->height. */
-    for( i = 1;; i++)
-    {
-        h = i * mod;
-
-        if (h < height)
-            {
-                if ( ( height - h ) <= ( mod / 2 ))
-                    /* Go with a smaller height,
-                       if it's close enough.    */
-                    break;
-            }
-        if (h == height)
-            /* Mod 16 dimensions, how nice! */
-            break;
-
-        if ( h > height)
-        {
-            if ( ( h - height ) < ( mod / 2 ))
-                /* Use a taller height if necessary */
-                break;
-        }
-    }
-    height = mod  * (i);
+    /* Time to get picture dimensions that divide cleanly.*/
+    width  = MULTIPLE_MOD( width, mod);
+    height = MULTIPLE_MOD( height, mod);
 
+    /* Verify these new dimensions don't violate max height and width settings */
+    if ( job->maxWidth && (job->maxWidth < job->width) )
+        width = job->maxWidth;
+    if ( job->maxHeight && (job->maxHeight < height) )
+        height = job->maxHeight;
+    
     int pixel_aspect_width = job->pixel_aspect_width;
     int pixel_aspect_height = job->pixel_aspect_height;
     
@@ -863,6 +820,34 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
         hb_list_add( title_copy->list_chapter, chapter_copy );
     }
 
+    /*
+     * Copy the metadata
+     */
+    if( title->metadata )
+    {
+        title_copy->metadata = malloc( sizeof( hb_metadata_t ) );
+        
+        if( title_copy->metadata ) 
+        {
+            memcpy( title_copy->metadata, title->metadata, sizeof( hb_metadata_t ) );
+
+            /*
+             * Need to copy the artwork seperatly (TODO).
+             */
+            if( title->metadata->coverart )
+            {
+                title_copy->metadata->coverart = malloc( title->metadata->coverart_size );
+                if( title_copy->metadata->coverart )
+                {
+                    memcpy( title_copy->metadata->coverart, title->metadata->coverart,
+                            title->metadata->coverart_size );
+                } else {
+                    title_copy->metadata->coverart_size = 0; 
+                }
+            }
+        }
+    }
+
     /* Copy the audio track(s) we want */
     title_copy->list_audio = hb_list_init();