X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fencxvid.c;h=18961dc28eed3f28a13f2934d6674bb36e85c570;hb=533776bbad20db93fe964bc69975f108b2a30888;hp=a874d9f00fd4832a26d1cea1433f8a7a1a69c9dc;hpb=cdba71d1dca214142fdcca4c52f7672252752c2e;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/encxvid.c b/libhb/encxvid.c index a874d9f0..18961dc2 100644 --- a/libhb/encxvid.c +++ b/libhb/encxvid.c @@ -1,36 +1,36 @@ /* $Id: encxvid.c,v 1.10 2005/03/09 23:28:39 titer Exp $ This file is part of the HandBrake source code. - Homepage: . + Homepage: . It may be used under the terms of the GNU General Public License. */ #include "hb.h" #include "xvid.h" -struct hb_work_object_s +int encxvidInit( hb_work_object_t *, hb_job_t * ); +int encxvidWork( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** ); +void encxvidClose( hb_work_object_t * ); + +hb_work_object_t hb_encxvid = { - HB_WORK_COMMON; + WORK_ENCXVID, + "MPEG-4 encoder (libxvidcore)", + encxvidInit, + encxvidWork, + encxvidClose +}; +struct hb_work_private_s +{ hb_job_t * job; void * xvid; char filename[1024]; int quant; + int configDone; }; -/*********************************************************************** - * Local prototypes - **********************************************************************/ -static void Close( hb_work_object_t ** _w ); -static int Work( hb_work_object_t * w, hb_buffer_t ** buf_in, - hb_buffer_t ** buf_out ); - -/*********************************************************************** - * hb_work_encxvid_init - *********************************************************************** - * - **********************************************************************/ -hb_work_object_t * hb_work_encxvid_init( hb_job_t * job ) +int encxvidInit( hb_work_object_t * w, hb_job_t * job ) { xvid_gbl_init_t xvid_gbl_init; xvid_enc_create_t create; @@ -39,15 +39,13 @@ hb_work_object_t * hb_work_encxvid_init( hb_job_t * job ) xvid_plugin_2pass2_t rc2pass2; xvid_enc_plugin_t plugins[1]; - hb_work_object_t * w = calloc( sizeof( hb_work_object_t ), 1 ); - w->name = strdup( "MPEG-4 encoder (libxvidcore)" ); - w->work = Work; - w->close = Close; + hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) ); + w->private_data = pv; - w->job = job; + pv->job = job; - memset( w->filename, 0, 1024 ); - hb_get_tempory_filename( job->h, w->filename, "xvid.log" ); + memset( pv->filename, 0, 1024 ); + hb_get_tempory_filename( job->h, pv->filename, "xvid.log" ); memset( &xvid_gbl_init, 0, sizeof( xvid_gbl_init ) ); xvid_gbl_init.version = XVID_VERSION; @@ -69,14 +67,14 @@ hb_work_object_t * hb_work_encxvid_init( hb_job_t * job ) { /* Rate control */ single.bitrate = 1000 * job->vbitrate; - w->quant = 0; + pv->quant = 0; } else { /* Constant quantizer */ - w->quant = 31 - job->vquality * 30; + pv->quant = 31 - job->vquality * 30; hb_log( "encxvid: encoding at constant quantizer %d", - w->quant ); + pv->quant ); } plugins[0].func = xvid_plugin_single; plugins[0].param = &single; @@ -85,7 +83,7 @@ hb_work_object_t * hb_work_encxvid_init( hb_job_t * job ) case 1: memset( &rc2pass1, 0, sizeof( rc2pass1 ) ); rc2pass1.version = XVID_VERSION; - rc2pass1.filename = w->filename; + rc2pass1.filename = pv->filename; plugins[0].func = xvid_plugin_2pass1; plugins[0].param = &rc2pass1; break; @@ -93,7 +91,7 @@ hb_work_object_t * hb_work_encxvid_init( hb_job_t * job ) case 2: memset( &rc2pass2, 0, sizeof( rc2pass2 ) ); rc2pass2.version = XVID_VERSION; - rc2pass2.filename = w->filename; + rc2pass2.filename = pv->filename; rc2pass2.bitrate = 1000 * job->vbitrate; plugins[0].func = xvid_plugin_2pass2; plugins[0].param = &rc2pass2; @@ -114,9 +112,9 @@ hb_work_object_t * hb_work_encxvid_init( hb_job_t * job ) create.global = 0; xvid_encore( NULL, XVID_ENC_CREATE, &create, NULL ); - w->xvid = create.handle; + pv->xvid = create.handle; - return w; + return 0; } /*********************************************************************** @@ -124,19 +122,18 @@ hb_work_object_t * hb_work_encxvid_init( hb_job_t * job ) *********************************************************************** * **********************************************************************/ -static void Close( hb_work_object_t ** _w ) +void encxvidClose( hb_work_object_t * w ) { - hb_work_object_t * w = *_w; + hb_work_private_t * pv = w->private_data; - if( w->xvid ) + if( pv->xvid ) { - hb_log( "encxvid: closing libxvidcore" ); - xvid_encore( w->xvid, XVID_ENC_DESTROY, NULL, NULL); + hb_deep_log( 2, "encxvid: closing libxvidcore" ); + xvid_encore( pv->xvid, XVID_ENC_DESTROY, NULL, NULL); } - free( w->name ); - free( w ); - *_w = NULL; + free( pv ); + w->private_data = NULL; } /*********************************************************************** @@ -144,13 +141,22 @@ static void Close( hb_work_object_t ** _w ) *********************************************************************** * **********************************************************************/ -static int Work( hb_work_object_t * w, hb_buffer_t ** buf_in, +int encxvidWork( hb_work_object_t * w, hb_buffer_t ** buf_in, hb_buffer_t ** buf_out ) { - hb_job_t * job = w->job; + hb_work_private_t * pv = w->private_data; + hb_job_t * job = pv->job; xvid_enc_frame_t frame; hb_buffer_t * in = *buf_in, * buf; + if ( in->size <= 0 ) + { + /* EOF on input - send it downstream & say we're done */ + *buf_out = in; + *buf_in = NULL; + return HB_WORK_DONE; + } + /* Should be way too large */ buf = hb_buffer_init( 3 * job->width * job->height / 2 ); buf->start = in->start; @@ -167,12 +173,19 @@ static int Work( hb_work_object_t * w, hb_buffer_t ** buf_in, frame.vol_flags = 0; frame.vop_flags = XVID_VOP_HALFPEL | XVID_VOP_INTER4V | XVID_VOP_TRELLISQUANT | XVID_VOP_HQACPRED; + if( job->pixel_ratio ) + { + frame.par = XVID_PAR_EXT; + frame.par_width = job->pixel_aspect_width; + frame.par_height = job->pixel_aspect_height; + } + if( job->grayscale ) { frame.vop_flags |= XVID_VOP_GREYSCALE; } frame.type = XVID_TYPE_AUTO; - frame.quant = w->quant; + frame.quant = pv->quant; frame.motion = XVID_ME_ADVANCEDDIAMOND16 | XVID_ME_HALFPELREFINE16 | XVID_ME_EXTSEARCH16 | XVID_ME_ADVANCEDDIAMOND8 | XVID_ME_HALFPELREFINE8 | XVID_ME_EXTSEARCH8 | @@ -180,11 +193,10 @@ static int Work( hb_work_object_t * w, hb_buffer_t ** buf_in, frame.quant_intra_matrix = NULL; frame.quant_inter_matrix = NULL; - buf->size = xvid_encore( w->xvid, XVID_ENC_ENCODE, &frame, NULL ); - buf->key = ( frame.out_flags & XVID_KEYFRAME ); + buf->size = xvid_encore( pv->xvid, XVID_ENC_ENCODE, &frame, NULL ); + buf->frametype = ( frame.out_flags & XVID_KEYFRAME ) ? HB_FRAME_KEY : HB_FRAME_REF; -#define c job->config.mpeg4 - if( !c.config ) + if( !pv->configDone ) { int vol_start, vop_start; for( vol_start = 0; ; vol_start++ ) @@ -208,12 +220,12 @@ static int Work( hb_work_object_t * w, hb_buffer_t ** buf_in, } } - hb_log( "encxvid: VOL size is %d bytes", vop_start - vol_start ); - c.config = malloc( vop_start - vol_start ); - c.config_length = vop_start - vol_start; - memcpy( c.config, &buf->data[vol_start], c.config_length ); + hb_deep_log( 2, "encxvid: VOL size is %d bytes", vop_start - vol_start ); + job->config.mpeg4.length = vop_start - vol_start; + memcpy( job->config.mpeg4.bytes, &buf->data[vol_start], + job->config.mpeg4.length ); + pv->configDone = 1; } -#undef c *buf_out = buf;