}
w->status = w->work( w, &buf_in, NULL );
+ if( buf_in )
+ {
+ hb_buffer_close( &buf_in );
+ }
}
}
muxer->private_data->track = mux->ntracks;
muxer->fifo_in = job->fifo_mpeg4;
add_mux_track( mux, job->mux_data, 1 );
- muxer->done = &job->done;
- muxer->thread = hb_thread_init( muxer->name, mux_loop, muxer, HB_NORMAL_PRIORITY );
+ muxer->done = &muxer->private_data->mux->done;
for( i = 0; i < hb_list_count( title->list_audio ); i++ )
{
***********************************************************************
* Initialize the work object
**********************************************************************/
-int hb_sync_init( hb_job_t * job )
+hb_work_object_t * hb_sync_init( hb_job_t * job )
{
hb_title_t * title = job->title;
hb_chapter_t * chapter;
hb_work_private_t * pv;
hb_sync_video_t * sync;
hb_work_object_t * w;
+ hb_work_object_t * ret = NULL;
pv = calloc( 1, sizeof( hb_work_private_t ) );
sync = &pv->type.video;
pv->common->start_found = 1;
}
- w = hb_get_work( WORK_SYNC_VIDEO );
+ ret = w = hb_get_work( WORK_SYNC_VIDEO );
w->private_data = pv;
w->fifo_in = job->fifo_raw;
w->fifo_out = job->fifo_sync;
}
sync->count_frames_max = duration * title->rate / title->rate_base / 90000;
}
- hb_list_add( job->list_work, w );
hb_log( "sync: expecting %d video frames", sync->count_frames_max );
for ( i = 0; i < pv->common->pts_count; i++ )
pv->common->first_pts[i] = INT64_MAX;
- return 0;
+ return ret;
}
/***********************************************************************
/* Update UI */
UpdateState( w );
-
+
return HB_WORK_OK;
}
hb_job_t * job = pv->job;
hb_sync_audio_t * sync = &pv->type.audio;
hb_buffer_t * buf;
- //hb_fifo_t * fifo;
int64_t start;
*buf_out = NULL;
(int)((start - sync->next_pts) / 90),
w->audio->id, start, sync->next_pts );
InsertSilence( w, start - sync->next_pts );
- *buf_out = buf;
- return HB_WORK_OK;
}
/*
hb_title_t * title;
int i, j;
hb_work_object_t * w;
+ hb_work_object_t * sync;
hb_work_object_t * muxer;
hb_interjob_t * interjob;
}
/* Synchronization */
- if( hb_sync_init( job ) )
- {
- hb_error( "Failure to initialise sync" );
- *job->die = 1;
- goto cleanup;
- }
+ sync = hb_sync_init( job );
/* Video decoder */
int vcodec = title->video_codec? title->video_codec : WORK_DECMPEG2;
/* Video renderer */
hb_list_add( job->list_work, ( w = hb_get_work( WORK_RENDER ) ) );
w->fifo_in = job->fifo_sync;
- w->fifo_out = job->fifo_render;
+ if( !job->indepth_scan )
+ w->fifo_out = job->fifo_render;
+ else
+ w->fifo_out = NULL;
if( !job->indepth_scan )
{
job->done = 0;
/* Launch processing threads */
- for( i = 1; i < hb_list_count( job->list_work ); i++ )
+ for( i = 0; i < hb_list_count( job->list_work ); i++ )
{
w = hb_list_item( job->list_work, i );
w->done = &job->done;
HB_LOW_PRIORITY );
}
- // The muxer requires track information that's set up by the encoder
- // init routines so we have to init the muxer last.
- muxer = job->indepth_scan? NULL : hb_muxer_init( job );
+ if ( job->indepth_scan )
+ {
+ muxer = NULL;
+ w = sync;
+ sync->done = &job->done;
+ }
+ else
+ {
+ sync->done = &job->done;
+ sync->thread_sleep_interval = 10;
+ if( sync->init( w, job ) )
+ {
+ hb_error( "Failure to initialise thread '%s'", w->name );
+ *job->die = 1;
+ goto cleanup;
+ }
+ sync->thread = hb_thread_init( sync->name, work_loop, sync,
+ HB_LOW_PRIORITY );
- w = hb_list_item( job->list_work, 0 );
- while( !*job->die && w->status != HB_WORK_DONE )
+ // The muxer requires track information that's set up by the encoder
+ // init routines so we have to init the muxer last.
+ muxer = hb_muxer_init( job );
+ w = muxer;
+ }
+
+ while ( !*job->die && !*w->done && w->status != HB_WORK_DONE )
{
hb_buffer_t * buf_in, * buf_out;
break;
}
+ buf_out = NULL;
w->status = w->work( w, &buf_in, &buf_out );
if( buf_in )
{
hb_buffer_close( &buf_in );
}
+ if ( buf_out && w->fifo_out == NULL )
+ {
+ hb_buffer_close( &buf_out );
+ }
if( buf_out )
{
while ( !*job->die )
}
}
}
- hb_list_rem( job->list_work, w );
- w->close( w );
- free( w );
+
+ job->done = 1;
+ if( muxer != NULL )
+ {
+ muxer->close( muxer );
+ free( muxer );
+
+ if( sync->thread != NULL )
+ {
+ hb_thread_close( &sync->thread );
+ sync->close( sync );
+ }
+ free( sync );
+ }
hb_handle_t * h = job->h;
hb_state_t state;
cleanup:
/* Stop the write thread (thread_close will block until the muxer finishes) */
- if( muxer != NULL )
- {
- hb_thread_close( &muxer->thread );
- muxer->close( muxer );
- }
-
job->done = 1;
/* Close work objects */
{
hb_buffer_close( &buf_in );
}
+ if ( buf_out && w->fifo_out == NULL )
+ {
+ hb_buffer_close( &buf_out );
+ }
if( buf_out )
{
while ( !*w->done )
}
}
}
+ // Consume data in incoming fifo till job complete so that
+ // residual data does not stall the pipeline
+ while( !*w->done )
+ {
+ buf_in = hb_fifo_get_wait( w->fifo_in );
+ if ( buf_in != NULL )
+ hb_buffer_close( &buf_in );
+ }
}