summaryrefslogtreecommitdiffstats
path: root/libhb/work.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhb/work.c')
-rw-r--r--libhb/work.c61
1 files changed, 38 insertions, 23 deletions
diff --git a/libhb/work.c b/libhb/work.c
index 6c0be24e3..c22585313 100644
--- a/libhb/work.c
+++ b/libhb/work.c
@@ -6,11 +6,6 @@
#include "hb.h"
-struct hb_work_object_s
-{
- HB_WORK_COMMON;
-};
-
typedef struct
{
hb_list_t * jobs;
@@ -56,6 +51,27 @@ static void work_func( void * _work )
free( work );
}
+static hb_work_object_t * getWork( int id )
+{
+ switch( id )
+ {
+ case WORK_SYNC: return &hb_sync;
+ case WORK_DECMPEG2: return &hb_decmpeg2;
+ case WORK_DECSUB: return &hb_decsub;
+ case WORK_RENDER: return &hb_render;
+ case WORK_ENCAVCODEC: return &hb_encavcodec;
+ case WORK_ENCXVID: return &hb_encxvid;
+ case WORK_ENCX264: return &hb_encx264;
+ case WORK_DECA52: return &hb_deca52;
+ case WORK_DECAVCODEC: return &hb_decavcodec;
+ case WORK_DECLPCM: return &hb_declpcm;
+ case WORK_ENCFAAC: return &hb_encfaac;
+ case WORK_ENCLAME: return &hb_enclame;
+ case WORK_ENCVORBIS: return &hb_encvorbis;
+ }
+ return NULL;
+}
+
static void do_job( hb_job_t * job, int cpu_count )
{
hb_title_t * title;
@@ -98,41 +114,39 @@ static void do_job( hb_job_t * job, int cpu_count )
job->fifo_mpeg4 = hb_fifo_init( 8 );
/* Synchronization */
- w = hb_work_sync_init( job );
+ hb_list_add( job->list_work, ( w = getWork( WORK_SYNC ) ) );
w->fifo_in = NULL;
w->fifo_out = NULL;
- hb_list_add( job->list_work, w );
/* Video decoder */
- w = hb_work_decmpeg2_init( job );
+ hb_list_add( job->list_work, ( w = getWork( WORK_DECMPEG2 ) ) );
w->fifo_in = job->fifo_mpeg2;
w->fifo_out = job->fifo_raw;
- hb_list_add( job->list_work, w );
/* Video renderer */
- w = hb_work_render_init( job );
+ hb_list_add( job->list_work, ( w = getWork( WORK_RENDER ) ) );
w->fifo_in = job->fifo_sync;
w->fifo_out = job->fifo_render;
- hb_list_add( job->list_work, w );
/* Video encoder */
switch( job->vcodec )
{
case HB_VCODEC_FFMPEG:
hb_log( " + encoder FFmpeg" );
- w = hb_work_encavcodec_init( job );
+ w = getWork( WORK_ENCAVCODEC );
break;
case HB_VCODEC_XVID:
hb_log( " + encoder XviD" );
- w = hb_work_encxvid_init( job );
+ w = getWork( WORK_ENCXVID );
break;
case HB_VCODEC_X264:
hb_log( " + encoder x264" );
- w = hb_work_encx264_init( job );
+ w = getWork( WORK_ENCX264 );
break;
}
w->fifo_in = job->fifo_render;
w->fifo_out = job->fifo_mpeg4;
+ w->config = &job->config;
hb_list_add( job->list_work, w );
subtitle = hb_list_item( title->list_subtitle, 0 );
@@ -143,10 +157,9 @@ static void do_job( hb_job_t * job, int cpu_count )
subtitle->fifo_in = hb_fifo_init( 8 );
subtitle->fifo_raw = hb_fifo_init( 8 );
- w = hb_work_decsub_init( job );
+ hb_list_add( job->list_work, ( w = getWork( WORK_DECSUB ) ) );
w->fifo_in = subtitle->fifo_in;
w->fifo_out = subtitle->fifo_raw;
- hb_list_add( job->list_work, w );
}
if( job->acodec & HB_ACODEC_AC3 )
@@ -174,13 +187,13 @@ static void do_job( hb_job_t * job, int cpu_count )
switch( audio->codec )
{
case HB_ACODEC_AC3:
- w = hb_work_deca52_init( job, audio );
+ w = getWork( WORK_DECA52 );
break;
case HB_ACODEC_MPGA:
- w = hb_work_decavcodec_init( job, audio );
+ w = getWork( WORK_DECAVCODEC );
break;
case HB_ACODEC_LPCM:
- w = hb_work_declpcm_init( job, audio );
+ w = getWork( WORK_DECLPCM );
break;
}
w->fifo_in = audio->fifo_in;
@@ -190,19 +203,20 @@ static void do_job( hb_job_t * job, int cpu_count )
switch( job->acodec )
{
case HB_ACODEC_FAAC:
- w = hb_work_encfaac_init( job, audio );
+ w = getWork( WORK_ENCFAAC );
break;
case HB_ACODEC_LAME:
- w = hb_work_enclame_init( job, audio );
+ w = getWork( WORK_ENCLAME );
break;
case HB_ACODEC_VORBIS:
- w = hb_work_encvorbis_init( job, audio );
+ w = getWork( WORK_ENCVORBIS );
break;
}
if( job->acodec != HB_ACODEC_AC3 )
{
w->fifo_in = audio->fifo_sync;
w->fifo_out = audio->fifo_out;
+ w->config = &audio->config;
hb_list_add( job->list_work, w );
}
}
@@ -219,6 +233,7 @@ static void do_job( hb_job_t * job, int cpu_count )
w->lock = hb_lock_init();
w->used = 0;
w->time = 0;
+ w->init( w, job );
}
job->done = 0;
@@ -272,7 +287,7 @@ static void do_job( hb_job_t * job, int cpu_count )
{
hb_list_rem( job->list_work, w );
hb_lock_close( &w->lock );
- w->close( &w );
+ w->close( w );
}
/* Close fifos */