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;
}
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 )
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' )
}
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
{
}
}
- 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");
}
}
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 );
}
}
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;
}
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;
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
*
* 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 );
}
}
/* 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,
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 );
/*
/*
* 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
{
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++ )