diff options
Diffstat (limited to 'core/XvidEnc.c')
-rw-r--r-- | core/XvidEnc.c | 247 |
1 files changed, 0 insertions, 247 deletions
diff --git a/core/XvidEnc.c b/core/XvidEnc.c deleted file mode 100644 index 4c06da69e..000000000 --- a/core/XvidEnc.c +++ /dev/null @@ -1,247 +0,0 @@ -/* $Id: XvidEnc.c,v 1.26 2004/05/12 17:21:24 titer Exp $ - - This file is part of the HandBrake source code. - Homepage: <http://handbrake.m0k.org/>. - It may be used under the terms of the GNU General Public License. */ - -#include "HBInternal.h" - -#include "xvid.h" - -struct HBWork -{ - HB_WORK_COMMON_MEMBERS - - HBHandle * handle; - HBTitle * title; - - char file[1024]; - void * xvid; - xvid_enc_frame_t frame; - int pass; -}; - -/* Local prototypes */ -static int XvidEncWork( HBWork * ); - -HBWork * HBXvidEncInit( HBHandle * handle, HBTitle * title ) -{ - HBWork * w; - if( !( w = malloc( sizeof( HBWork ) ) ) ) - { - HBLog( "HBXvidEncInit: malloc() failed, gonna crash" ); - return NULL; - } - - w->name = strdup( "XvidEnc" ); - w->work = XvidEncWork; - - w->handle = handle; - w->title = title; - - memset( w->file, 0, 1024 ); -#ifndef HB_CYGWIN - snprintf( w->file, 1023, "/tmp/HB.%d.xvid.log", - HBGetPid( w->handle ) ); -#else - snprintf( w->file, 1023, "C:\\HB.%d.xvid.log", - HBGetPid( w->handle ) ); -#endif - - w->xvid = NULL; - w->pass = 42; - - return w; -} - -void HBXvidEncClose( HBWork ** _w ) -{ - HBWork * w = *_w; - - if( w->xvid ) - { - HBLog( "HBXvidEnc: closing libxvidcore (pass %d)", - w->pass ); - xvid_encore( w->xvid, XVID_ENC_DESTROY, NULL, NULL); - } - if( w->title->esConfig ) - { - free( w->title->esConfig ); - w->title->esConfig = NULL; - w->title->esConfigLength = 0; - } - - free( w->name ); - free( w ); - *_w = NULL; -} - -static int XvidEncWork( HBWork * w ) -{ - HBTitle * title = w->title; - HBBuffer * scaledBuffer; - HBBuffer * mpeg4Buffer; - - if( HBFifoIsHalfFull( title->outFifo ) ) - { - return 0; - } - - if( !( scaledBuffer = HBFifoPop( title->scaledFifo ) ) ) - { - return 0; - } - - /* Init or re-init if needed */ - if( scaledBuffer->pass != w->pass ) - { - xvid_gbl_init_t xvid_gbl_init; - xvid_enc_create_t xvid_enc_create; - xvid_plugin_single_t single; - xvid_plugin_2pass1_t rc2pass1; - xvid_plugin_2pass2_t rc2pass2; - xvid_enc_plugin_t plugins[7]; - - if( w->xvid ) - { - HBLog( "HBXvidEnc: closing libxvidcore (pass %d)", - w->pass ); - xvid_encore( w->xvid, XVID_ENC_DESTROY, NULL, NULL); - } - - w->pass = scaledBuffer->pass; - HBLog( "HBXvidEnc: opening libxvidcore (pass %d)", w->pass ); - - memset( &xvid_gbl_init, 0, sizeof( xvid_gbl_init ) ); - xvid_gbl_init.version = XVID_VERSION; - xvid_global( NULL, XVID_GBL_INIT, &xvid_gbl_init, NULL ); - - memset(&xvid_enc_create, 0, sizeof(xvid_enc_create)); - xvid_enc_create.version = XVID_VERSION; - xvid_enc_create.width = title->outWidth; - xvid_enc_create.height = title->outHeight; - xvid_enc_create.zones = NULL; - xvid_enc_create.num_zones = 0; - xvid_enc_create.plugins = plugins; - xvid_enc_create.num_plugins = 0; - - if( !w->pass ) - { - memset( &single, 0, sizeof( single ) ); - single.version = XVID_VERSION; - single.bitrate = 1024 * title->bitrate; - plugins[xvid_enc_create.num_plugins].func = xvid_plugin_single; - plugins[xvid_enc_create.num_plugins].param = &single; - xvid_enc_create.num_plugins++; - } - else if( w->pass == 1 ) - { - memset( &rc2pass1, 0, sizeof( rc2pass1 ) ); - rc2pass1.version = XVID_VERSION; - rc2pass1.filename = w->file; - plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass1; - plugins[xvid_enc_create.num_plugins].param = &rc2pass1; - xvid_enc_create.num_plugins++; - } - else if( w->pass == 2 ) - { - memset(&rc2pass2, 0, sizeof(xvid_plugin_2pass2_t)); - rc2pass2.version = XVID_VERSION; - rc2pass2.filename = w->file; - rc2pass2.bitrate = 1024 * title->bitrate; - plugins[xvid_enc_create.num_plugins].func = xvid_plugin_2pass2; - plugins[xvid_enc_create.num_plugins].param = &rc2pass2; - xvid_enc_create.num_plugins++; - } - - xvid_enc_create.num_threads = 0; - xvid_enc_create.fincr = title->rateBase; - xvid_enc_create.fbase = title->rate; - xvid_enc_create.max_key_interval = 10 * title->rate / title->rateBase; - xvid_enc_create.max_bframes = 0; - xvid_enc_create.bquant_ratio = 150; - xvid_enc_create.bquant_offset = 100; - xvid_enc_create.frame_drop_ratio = 0; - xvid_enc_create.global = 0; - - xvid_encore( NULL, XVID_ENC_CREATE, &xvid_enc_create, NULL ); - w->xvid = xvid_enc_create.handle; - } - - mpeg4Buffer = HBBufferInit( title->outWidth * - title->outHeight * 3 / 2 ); - mpeg4Buffer->position = scaledBuffer->position; - - memset( &w->frame, 0, sizeof( w->frame ) ); - w->frame.version = XVID_VERSION; - w->frame.bitstream = mpeg4Buffer->data; - w->frame.length = -1; - w->frame.input.plane[0] = scaledBuffer->data; - w->frame.input.csp = XVID_CSP_I420; - w->frame.input.stride[0] = title->outWidth; - w->frame.vol_flags = 0; - w->frame.vop_flags = XVID_VOP_HALFPEL | XVID_VOP_INTER4V | - XVID_VOP_TRELLISQUANT | XVID_VOP_HQACPRED; - w->frame.type = XVID_TYPE_AUTO; - w->frame.quant = 0; - w->frame.motion = XVID_ME_ADVANCEDDIAMOND16 | XVID_ME_HALFPELREFINE16 | - XVID_ME_EXTSEARCH16 | XVID_ME_ADVANCEDDIAMOND8 | - XVID_ME_HALFPELREFINE8 | XVID_ME_EXTSEARCH8 | - XVID_ME_CHROMA_PVOP | XVID_ME_CHROMA_BVOP; - w->frame.quant_intra_matrix = NULL; - w->frame.quant_inter_matrix = NULL; - - mpeg4Buffer->size = xvid_encore( w->xvid, XVID_ENC_ENCODE, - &w->frame, NULL ); - mpeg4Buffer->keyFrame = ( w->frame.out_flags & XVID_KEYFRAME ); - - /* Inform the GUI about the current position */ - HBPosition( w->handle, scaledBuffer->position ); - - HBBufferClose( &scaledBuffer ); - - if( w->pass == 1 ) - { - HBBufferClose( &mpeg4Buffer ); - return 1; - } - - if( !title->esConfig ) - { - int volStart, vopStart; - for( volStart = 0; ; volStart++ ) - { - if( mpeg4Buffer->data[volStart] == 0x0 && - mpeg4Buffer->data[volStart+1] == 0x0 && - mpeg4Buffer->data[volStart+2] == 0x1 && - mpeg4Buffer->data[volStart+3] == 0x20 ) - { - break; - } - } - for( vopStart = volStart + 4; ; vopStart++ ) - { - if( mpeg4Buffer->data[vopStart] == 0x0 && - mpeg4Buffer->data[vopStart+1] == 0x0 && - mpeg4Buffer->data[vopStart+2] == 0x1 && - mpeg4Buffer->data[vopStart+3] == 0xB6 ) - { - break; - } - } - - HBLog( "XvidEnc: VOL size is %d bytes", vopStart - volStart ); - title->esConfig = malloc( vopStart - volStart ); - title->esConfigLength = vopStart - volStart; - memcpy( title->esConfig, mpeg4Buffer->data + volStart, - vopStart - volStart ); - } - - if( !HBFifoPush( title->outFifo, &mpeg4Buffer ) ) - { - HBLog( "HBXvidEnc: HBFifoPush failed" ); - } - - return 1; -} - |