OSDN Git Service

Excises xvid from libhb because it's not worthy. Having two different MPEG-4 Part...
[handbrake-jp/handbrake-jp-git.git] / libhb / work.c
index d5d314c..848c798 100644 (file)
@@ -106,6 +106,7 @@ hb_work_object_t * hb_codec_encoder( int codec )
         case HB_ACODEC_FAAC:   return hb_get_work( WORK_ENCFAAC );
         case HB_ACODEC_LAME:   return hb_get_work( WORK_ENCLAME );
         case HB_ACODEC_VORBIS: return hb_get_work( WORK_ENCVORBIS );
+        case HB_ACODEC_CA_AAC:  return hb_get_work( WORK_ENC_CA_AAC );
     }
     return NULL;
 }
@@ -186,20 +187,19 @@ void hb_display_job_info( hb_job_t * job )
         hb_log( "     + bitrate %d kbps", title->video_bitrate / 1000 );
     }
     
-    if( job->vfr)
-    {
-        hb_log( "   + frame rate: %.3f fps -> variable fps",
-            (float) title->rate / (float) title->rate_base );
-    }
-    else if( !job->cfr )
+    if( !job->cfr )
     {
         hb_log( "   + frame rate: same as source (around %.3f fps)",
             (float) title->rate / (float) title->rate_base );
     }
     else
     {
-        hb_log( "   + frame rate: %.3f fps -> constant %.3f fps",
-            (float) title->rate / (float) title->rate_base, (float) job->vrate / (float) job->vrate_base );
+        static const char *frtypes[] = {
+            "", "constant", "peak rate limited to"
+        };
+        hb_log( "   + frame rate: %.3f fps -> %s %.3f fps",
+            (float) title->rate / (float) title->rate_base, frtypes[job->cfr],
+            (float) job->vrate / (float) job->vrate_base );
     }
 
     if( job->anamorphic.mode )
@@ -244,10 +244,6 @@ void hb_display_job_info( hb_job_t * job )
                 hb_log( "   + encoder: FFmpeg" );
                 break;
 
-            case HB_VCODEC_XVID:
-                hb_log( "   + encoder: XviD" );
-                break;
-
             case HB_VCODEC_X264:
                 hb_log( "   + encoder: x264" );
                 if( job->x264opts != NULL && *job->x264opts != '\0' )
@@ -265,7 +261,7 @@ void hb_display_job_info( hb_job_t * job )
         }
         else if( job->vquality > 1 )
         {
-            hb_log( "     + quality: %.0f %s", job->vquality, job->crf && job->vcodec == HB_VCODEC_X264 ? "(RF)" : "(QP)" ); 
+            hb_log( "     + quality: %.2f %s", job->vquality, job->crf && job->vcodec == HB_VCODEC_X264 ? "(RF)" : "(QP)" ); 
         }
         else
         {
@@ -273,13 +269,18 @@ void hb_display_job_info( hb_job_t * job )
         }
     }
 
-    for( i=0; i < hb_list_count(title->list_subtitle); i++ )
+    for( i=0; i < hb_list_count( title->list_subtitle ); i++ )
     {
         subtitle =  hb_list_item( title->list_subtitle, i );
 
         if( subtitle )
         {
-            hb_log( " * subtitle track %i, %s (id %x)", job->subtitle+1, subtitle->lang, subtitle->id);
+            hb_log( " * subtitle track %i, %s (id %x) %s [%s] -> %s ", subtitle->track, subtitle->lang, subtitle->id,
+                    subtitle->format == PICTURESUB ? "Picture" : "Text",
+                    subtitle->source == VOBSUB ? "VOBSUB" : 
+                    ((subtitle->source == CC608SUB ||
+                      subtitle->source == CC708SUB) ? "CC" : "SRT"),
+                    subtitle->dest == RENDERSUB ? "Render/Burn in" : "Pass-Through");
         }
     }
 
@@ -325,8 +326,9 @@ void hb_display_job_info( hb_job_t * job )
             else
             {
                 hb_log( "   + encoder: %s", ( audio->config.out.codec == HB_ACODEC_FAAC ) ?
-                    "faac" : ( ( audio->config.out.codec == HB_ACODEC_LAME ) ? "lame" :
-                    "vorbis" ) );
+                    "faac" : ( ( audio->config.out.codec == HB_ACODEC_LAME ) ?
+                    "lame" : ( ( audio->config.out.codec == HB_ACODEC_CA_AAC ) ?
+                              "ca_aac" : "vorbis"  ) ) );
                 hb_log( "     + bitrate: %d kbps, samplerate: %d Hz", audio->config.out.bitrate, audio->config.out.samplerate );            
             }
         }
@@ -402,16 +404,19 @@ static void do_job( hb_job_t * job, int cpu_count )
         hb_log( "New dimensions %i * %i", job->width, job->height );
     }
 
-    if( ( job->mux & HB_MUX_AVI ) || job->cfr )
+    if( job->mux & HB_MUX_AVI )
     {
-        /* VFR detelecine is not compatible with AVI or constant frame rates. */
-        job->vfr = 0;
+        // The concept of variable frame rate video was a bit too advanced
+        // for Microsoft so AVI doesn't support it. Since almost all dvd
+        // video is VFR we have to convert it to constant frame rate to
+        // put it in an AVI container. So duplicate, drop and
+        // otherwise trash video frames to appease the gods of Redmond.
+        job->cfr = 1;
     }
 
-    if ( job->vfr )
+    if ( job->cfr == 0 )
     {
-        /* Ensure we're using "Same as source" FPS,
-           aka VFR, if we're doing VFR detelecine. */
+        /* Ensure we're using "Same as source" FPS */
         job->vrate_base = title->rate_base;
     }
 
@@ -447,9 +452,6 @@ static void do_job( hb_job_t * job, int cpu_count )
         case HB_VCODEC_FFMPEG:
             w = hb_get_work( WORK_ENCAVCODEC );
             break;
-        case HB_VCODEC_XVID:
-            w = hb_get_work( WORK_ENCXVID );
-            break;
         case HB_VCODEC_X264:
             w = hb_get_work( WORK_ENCX264 );
             break;
@@ -483,8 +485,10 @@ static void do_job( hb_job_t * job, int cpu_count )
 
         if( subtitle )
         {
-            subtitle->fifo_in  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
-            subtitle->fifo_raw = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
+            subtitle->fifo_in   = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
+            subtitle->fifo_raw  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
+            subtitle->fifo_sync = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
+            subtitle->fifo_out  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
 
             /*
              * Disable forced subtitles if we didn't find any in the scan
@@ -492,23 +496,48 @@ static void do_job( hb_job_t * job, int cpu_count )
              *
              * select_subtitle implies that we did a scan.
              */
-            if( !job->indepth_scan && job->subtitle_force &&
+            if( !job->indepth_scan && subtitle->force &&
                 job->select_subtitle )
             {
                 if( subtitle->forced_hits == 0 )
                 {
-                    job->subtitle_force = 0;
+                    subtitle->force = 0;
                 }
             }
 
-            if (!job->indepth_scan || job->subtitle_force) {
+            if( (!job->indepth_scan || subtitle->force) && 
+                subtitle->source == VOBSUB ) {
                 /*
                  * Don't add threads for subtitles when we are scanning, unless
                  * looking for forced subtitles.
                  */
-                w = hb_get_work( WORK_DECSUB );
+                w = hb_get_work( WORK_DECVOBSUB );
                 w->fifo_in  = subtitle->fifo_in;
                 w->fifo_out = subtitle->fifo_raw;
+                w->subtitle = subtitle;
+                hb_list_add( job->list_work, w );
+            }
+
+            if( !job->indepth_scan && subtitle->source == CC608SUB )
+            {
+                w = hb_get_work( WORK_DECCC608 );
+                w->fifo_in  = subtitle->fifo_in;
+                w->fifo_out = subtitle->fifo_raw;
+                hb_list_add( job->list_work, w );
+            }
+
+            if( !job->indepth_scan && 
+                subtitle->format == PICTURESUB
+                && subtitle->dest == PASSTHRUSUB )
+            {
+                /*
+                 * Passing through a subtitle picture, this will have to
+                 * be rle encoded before muxing.
+                 */
+                w = hb_get_work( WORK_ENCVOBSUB );
+                w->fifo_in  = subtitle->fifo_sync;
+                w->fifo_out = subtitle->fifo_out;
+                w->subtitle = subtitle;
                 hb_list_add( job->list_work, w );
             }
         }
@@ -576,7 +605,8 @@ static void do_job( hb_job_t * job, int cpu_count )
             /* sense-check the requested mixdown */
 
             if( audio->config.out.mixdown == 0 &&
-                audio->config.out.codec != HB_ACODEC_AC3 )
+                audio->config.out.codec != HB_ACODEC_AC3 && 
+                audio->config.out.codec != HB_ACODEC_DCA )
             {
                 /*
                  * Mixdown wasn't specified and this is not pass-through,
@@ -719,7 +749,7 @@ static void do_job( hb_job_t * job, int cpu_count )
         audio->priv.fifo_in   = hb_fifo_init( 32 );
         audio->priv.fifo_raw  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
         audio->priv.fifo_sync = hb_fifo_init( 32 );
-        audio->priv.fifo_out  = hb_fifo_init( FIFO_CPU_MULT * cpu_count );
+        audio->priv.fifo_out  = hb_fifo_init( 8 * FIFO_CPU_MULT * cpu_count );
 
 
         /*
@@ -742,7 +772,8 @@ static void do_job( hb_job_t * job, int cpu_count )
         /*
          * Audio Encoder Thread
          */
-        if( audio->config.out.codec != HB_ACODEC_AC3 )
+        if( audio->config.out.codec != HB_ACODEC_AC3 &&
+            audio->config.out.codec != HB_ACODEC_DCA )
         {
             /*
              * Add the encoder thread if not doing AC-3 pass through
@@ -853,6 +884,8 @@ cleanup:
         {
             hb_fifo_close( &subtitle->fifo_in );
             hb_fifo_close( &subtitle->fifo_raw );
+            hb_fifo_close( &subtitle->fifo_sync );
+            hb_fifo_close( &subtitle->fifo_out );
         }
     }
     for( i = 0; i < hb_list_count( title->list_audio ); i++ )