OSDN Git Service

CLI: SubRip Subtitle import
[handbrake-jp/handbrake-jp-git.git] / libhb / hb.c
index 661e1df..898650a 100644 (file)
@@ -5,7 +5,7 @@ struct hb_handle_s
 {
     /* The "Check for update" thread */
     int            build;
-    char           version[16];
+    char           version[32];
     hb_thread_t  * update_thread;
 
     /* This thread's only purpose is to check other threads'
@@ -38,6 +38,11 @@ struct hb_handle_s
     /* For MacGui active queue
        increments each time the scan thread completes*/
     int            scanCount;
+    
+    /* Stash of persistent data between jobs, for stuff
+       like correcting frame count and framerate estimates
+       on multi-pass encodes where frames get dropped.     */
+    hb_interjob_t * interjob;
 
 };
 
@@ -86,7 +91,7 @@ void hb_register( hb_work_object_t * w )
  * @param update_check signals libhb to check for updated version from HandBrake website.
  * @return Handle to hb_handle_t for use on all subsequent calls to libhb.
  */
-hb_handle_t * hb_init_real( int verbose, int update_check )
+hb_handle_t * hb_init( int verbose, int update_check )
 {
     hb_handle_t * h = calloc( sizeof( hb_handle_t ), 1 );
     uint64_t      date;
@@ -142,6 +147,8 @@ hb_handle_t * hb_init_real( int verbose, int update_check )
 
     h->pause_lock = hb_lock_init();
 
+    h->interjob = calloc( sizeof( hb_interjob_t ), 1 );
+
     /* libavcodec */
     hb_avcodec_init();
 
@@ -150,11 +157,31 @@ hb_handle_t * hb_init_real( int verbose, int update_check )
     h->die         = 0;
     h->main_thread = hb_thread_init( "libhb", thread_func, h,
                                      HB_NORMAL_PRIORITY );
+    hb_register( &hb_sync );
+       hb_register( &hb_decmpeg2 );
+       hb_register( &hb_decvobsub );
+    hb_register( &hb_encvobsub );
+    hb_register( &hb_deccc608 );
+    hb_register( &hb_decsrtsub );
+       hb_register( &hb_render );
+       hb_register( &hb_encavcodec );
+       hb_register( &hb_encx264 );
+    hb_register( &hb_enctheora );
+       hb_register( &hb_deca52 );
+       hb_register( &hb_decdca );
+       hb_register( &hb_decavcodec );
+       hb_register( &hb_decavcodecv );
+       hb_register( &hb_decavcodecvi );
+       hb_register( &hb_decavcodecai );
+       hb_register( &hb_declpcm );
+       hb_register( &hb_encfaac );
+       hb_register( &hb_enclame );
+       hb_register( &hb_encvorbis );
+#ifdef __APPLE__
+       hb_register( &hb_encca_aac );
+#endif
 
     return h;
-
-       /* Set the scan count to start at 0 */
-       //scan_count = 0;
 }
 
 /**
@@ -230,13 +257,13 @@ hb_handle_t * hb_init_dl( int verbose, int update_check )
     hb_register( &hb_sync );
        hb_register( &hb_decmpeg2 );
        hb_register( &hb_decvobsub );
-        hb_register( &hb_encvobsub );
-        hb_register( &hb_deccc608 );
+    hb_register( &hb_encvobsub );
+    hb_register( &hb_deccc608 );
+    hb_register( &hb_decsrtsub );
        hb_register( &hb_render );
        hb_register( &hb_encavcodec );
-       hb_register( &hb_encxvid );
        hb_register( &hb_encx264 );
-        hb_register( &hb_enctheora );
+    hb_register( &hb_enctheora );
        hb_register( &hb_deca52 );
        hb_register( &hb_decdca );
        hb_register( &hb_decavcodec );
@@ -247,6 +274,9 @@ hb_handle_t * hb_init_dl( int verbose, int update_check )
        hb_register( &hb_encfaac );
        hb_register( &hb_enclame );
        hb_register( &hb_encvorbis );
+#ifdef __APPLE__
+       hb_register( &hb_encca_aac );
+#endif
 
        return h;
 }
@@ -398,14 +428,14 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     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, rgb_width, job->height ) );
-    buf4 = av_malloc( avpicture_get_size( PIX_FMT_RGBA32, rgb_width, job->height ) );
+    buf4 = av_malloc( avpicture_get_size( PIX_FMT_RGB32, rgb_width, job->height ) );
     avpicture_fill( &pic_in, buf1, PIX_FMT_YUV420P,
                     title->width, title->height );
     avpicture_fill( &pic_deint, buf2, PIX_FMT_YUV420P,
                     title->width, title->height );
     avpicture_fill( &pic_scale, buf3, PIX_FMT_YUV420P,
                     rgb_width, job->height );
-    avpicture_fill( &pic_preview, buf4, PIX_FMT_RGBA32,
+    avpicture_fill( &pic_preview, buf4, PIX_FMT_RGB32,
                     rgb_width, job->height );
 
     // Allocate the AVPicture frames and fill in
@@ -415,7 +445,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     hb_get_tempory_filename( h, filename, "%" PRIxPTR "%d",
                              (intptr_t) title, picture );
 
-    file = fopen( filename, "r" );
+    file = fopen( filename, "rb" );
     if( !file )
     {
         hb_log( "hb_get_preview: fopen failed" );
@@ -441,7 +471,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
     context = sws_getContext(title->width  - (job->crop[2] + job->crop[3]),
                              title->height - (job->crop[0] + job->crop[1]),
                              PIX_FMT_YUV420P,
-                             rgb_width, job->height, PIX_FMT_YUV420P,
+                             job->width, job->height, PIX_FMT_YUV420P,
                              swsflags, NULL, NULL, NULL);
 
     // Scale
@@ -455,7 +485,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
 
     // Get preview context
     context = sws_getContext(rgb_width, job->height, PIX_FMT_YUV420P,
-                              rgb_width, job->height, PIX_FMT_RGBA32,
+                              rgb_width, job->height, PIX_FMT_RGB32,
                               swsflags, NULL, NULL, NULL);
 
     // Create preview
@@ -768,12 +798,24 @@ void hb_set_anamorphic_size( hb_job_t * job,
             }
             else
             {
-                /* We first need the display ar.
-                   That's the source display width divided by the source height after cropping.
-                   Then we multiple the output height by that to get the pixel aspect width,
-                   and the pixel aspect height is the storage width.*/
-                pixel_aspect_width = height * source_display_width / cropped_height;
-                pixel_aspect_height = width;
+                /* If we're doing ana 3 and not specifying a DAR, care needs to be taken.
+                   This indicates a PAR is potentially being set by the interface. But
+                   this is an output PAR, to correct a source, and it should not be assumed
+                   that it properly creates a display aspect ratio when applied to the source,
+                   which could easily be stored in a different resolution. */
+                if( job->anamorphic.keep_display_aspect )
+                {
+                    /* We can ignore the possibility of a PAR change */
+                    pixel_aspect_width = height * ( (double)source_display_width / (double)cropped_height );
+                    pixel_aspect_height = width;
+                }
+                else
+                {
+                    int output_display_width = width * (double)pixel_aspect_width /
+                        (double)pixel_aspect_height;
+                    pixel_aspect_width = output_display_width;
+                    pixel_aspect_height = width;
+                }
             }
             
             /* Back to caller */
@@ -974,7 +1016,7 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
     title_copy->list_subtitle = hb_list_init();
 
     /*
-     * The following code is confusing, there are three ways in which
+     * The following code is confusing, there are two ways in which
      * we select subtitles and it depends on whether this is single or
      * two pass mode.
      *
@@ -982,17 +1024,13 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
      * scans all subtitles of that language. The second pass does not
      * select any because they are set at the end of the first pass.
      *
-     * native_language may have a preferred language, in which case we
-     * may be switching the language we want for the subtitles in the
-     * first pass of a single pass, or the second pass of a two pass.
-     *
      * We may have manually selected a subtitle, in which case that is
      * selected in the first pass of a single pass, or the second of a
      * two pass.
      */
     memset( audio_lang, 0, sizeof( audio_lang ) );
 
-    if ( job->indepth_scan || job->native_language ) {
+    if ( job->indepth_scan ) {
 
         /*
          * Find the first audio language that is being encoded
@@ -1005,35 +1043,6 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
                 break;
             }
         }
-
-        /*
-         * In all cases switch the language if we need to to our native
-         * language.
-         */
-        if( job->native_language )
-        {
-            if( strncasecmp( job->native_language, audio_lang,
-                             sizeof( audio_lang ) ) != 0 )
-            {
-
-                if( job->pass != 2 )
-                {
-                    hb_log( "Enabled subtitles in native language '%s', audio is in '%s'",
-                            job->native_language, audio_lang);
-                }
-                /*
-                 * The main audio track is not in our native language, so switch
-                 * the subtitles to use our native language instead.
-                 */
-                strncpy( audio_lang, job->native_language, sizeof( audio_lang ) );
-            } else {
-                /*
-                 * native language is irrelevent, free it.
-                 */
-                free( job->native_language );
-                job->native_language = NULL;
-            }
-        }
     }
 
     /*
@@ -1045,7 +1054,8 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
         for( i=0; i < hb_list_count( title->list_subtitle ); i++ )
         {
             subtitle = hb_list_item( title->list_subtitle, i );
-            if( strcmp( subtitle->iso639_2, audio_lang ) == 0 )
+            if( strcmp( subtitle->iso639_2, audio_lang ) == 0 &&
+                subtitle->source == VOBSUB )
             {
                 /*
                  * Matched subtitle language with audio language, so
@@ -1057,14 +1067,6 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
                 subtitle_copy = malloc( sizeof( hb_subtitle_t ) );
                 memcpy( subtitle_copy, subtitle, sizeof( hb_subtitle_t ) );
                 hb_list_add( title_copy->list_subtitle, subtitle_copy );
-                if ( job->native_language ) {
-                    /*
-                     * With native language just select the
-                     * first match in our langiage, not all of
-                     * them. Subsequent ones are likely to be commentary
-                     */
-                    break;
-                }
             }
         }
     } else {
@@ -1072,57 +1074,17 @@ void hb_add( hb_handle_t * h, hb_job_t * job )
          * Not doing a subtitle scan in this pass, but maybe we are in the
          * first pass?
          */
-        if( job->select_subtitle )
+        if( job->pass != 1 )
         {
             /*
-             * Don't add subtitles here, we'll add them via select_subtitle
-             * at the end of the subtitle_scan.
-             */
-        } else {
-            /*
-             * Definitely not doing a subtitle scan.
+             * Copy all of them from the input job, to the title_copy/job_copy.
              */
-            if( job->pass != 1 && job->native_language )
-            {
-                /*
-                 * We are not doing a subtitle scan but do want the
-                 * native langauge subtitle selected, so select it
-                 * for pass 0 or pass 2 of a two pass.
-                 */
-                for( i=0; i < hb_list_count( title->list_subtitle ); i++ )
+            for(  i = 0; i < hb_list_count(job->list_subtitle); i++ ) {
+                if( ( subtitle = hb_list_item( job->list_subtitle, i ) ) )
                 {
-                    subtitle = hb_list_item( title->list_subtitle, i );
-                    if( strcmp( subtitle->iso639_2, audio_lang ) == 0 )
-                    {
-                        /*
-                         * Matched subtitle language with audio language, so
-                         * add this to our list to scan.
-                         */
-                        subtitle_copy = malloc( sizeof( hb_subtitle_t ) );
-                        memcpy( subtitle_copy, subtitle, sizeof( hb_subtitle_t ) );
-                        hb_list_add( title_copy->list_subtitle, subtitle_copy );
-                        break;
-                    }
-                }
-            } else {
-                /*
-                 * Manually selected subtitles, in which case only
-                 * bother adding them for pass 0 or pass 2 of a two
-                 * pass.
-                 */
-                if( job->pass != 1 )
-                {
-                    /*
-                     * Copy all of them from the input job, to the title_copy/job_copy.
-                     */
-                    for(  i = 0; i < hb_list_count(job->list_subtitle); i++ ) {
-                        if( ( subtitle = hb_list_item( job->list_subtitle, i ) ) )
-                        {
-                            subtitle_copy = malloc( sizeof( hb_subtitle_t ) );
-                            memcpy( subtitle_copy, subtitle, sizeof( hb_subtitle_t ) );
-                            hb_list_add( title_copy->list_subtitle, subtitle_copy );
-                        }
-                    }
+                    subtitle_copy = malloc( sizeof( hb_subtitle_t ) );
+                    memcpy( subtitle_copy, subtitle, sizeof( hb_subtitle_t ) );
+                    hb_list_add( title_copy->list_subtitle, subtitle_copy );
                 }
             }
         }
@@ -1301,7 +1263,7 @@ int hb_get_scancount( hb_handle_t * h)
  }
 
 /**
- * Closes access to libhb by freeing the hb_handle_t handle ontained in hb_init_real.
+ * Closes access to libhb by freeing the hb_handle_t handle ontained in hb_init.
  * @param _h Pointer to handle to hb_handle_t.
  */
 void hb_close( hb_handle_t ** _h )
@@ -1464,3 +1426,9 @@ void hb_set_state( hb_handle_t * h, hb_state_t * s )
     hb_unlock( h->state_lock );
     hb_unlock( h->pause_lock );
 }
+
+/* Passes a pointer to persistent data */
+hb_interjob_t * hb_interjob_get( hb_handle_t * h )
+{
+    return h->interjob;
+}