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;