summaryrefslogtreecommitdiffstats
path: root/core/X264Enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/X264Enc.c')
-rw-r--r--core/X264Enc.c126
1 files changed, 57 insertions, 69 deletions
diff --git a/core/X264Enc.c b/core/X264Enc.c
index 50b9ab8bf..be8d76709 100644
--- a/core/X264Enc.c
+++ b/core/X264Enc.c
@@ -1,4 +1,4 @@
-/* $Id: X264Enc.c,v 1.3 2003/12/26 20:03:27 titer Exp $
+/* $Id: X264Enc.c,v 1.8 2004/05/02 16:25:00 titer Exp $
This file is part of the HandBrake source code.
Homepage: <http://handbrake.m0k.org/>.
@@ -9,79 +9,69 @@
/* x264 */
#include "x264.h"
-typedef struct HBX264Enc
+struct HBWork
{
HB_WORK_COMMON_MEMBERS
HBHandle *handle;
HBTitle *title;
- HBBuffer *buffer;
-
x264_t *h;
x264_picture_t picture;
-} HBX264Enc;
+};
/* Local prototypes */
static int HBX264EncWork( HBWork * );
-HBWork *HBX264EncInit( HBHandle * handle, HBTitle * title )
+HBWork * HBX264EncInit( HBHandle * handle, HBTitle * title )
{
- HBX264Enc *f = malloc( sizeof( HBX264Enc ) );
+ HBWork * w = malloc( sizeof( HBWork ) );
- if( f )
+ if( w )
{
x264_param_t param;
- f->name = strdup( "X264Enc" );
- f->work = HBX264EncWork;
-
- f->handle = handle;
- f->title = title;
+ w->name = strdup( "X264Enc" );
+ w->work = HBX264EncWork;
- f->buffer = NULL;
+ w->handle = handle;
+ w->title = title;
x264_param_default( &param );
param.i_width = title->outWidth;
param.i_height= title->outHeight;
- param.i_iframe = 5 * title->rate / title->rateBase;
- /* FIXME */
- param.b_deblocking_filter = 0;
- param.i_me = 1;
-
- if( ( f->h = x264_encoder_open( &param ) ) == NULL )
+ param.i_iframe = 20 * title->rate / title->rateBase;
+ param.i_idrframe = 1;
+ param.b_cabac = 0;
+ param.analyse.inter =
+ X264_ANALYSE_I16x16|X264_ANALYSE_I4x4|X264_ANALYSE_P16x16|
+ X264_ANALYSE_P16x8|X264_ANALYSE_P8x16|X264_ANALYSE_P8x8|
+ X264_ANALYSE_SMART_PSUB;
+
+ if( ( w->h = x264_encoder_open( &param ) ) == NULL )
{
HBLog( "x264: x264_encoder_new failed" );
return NULL;
}
- memset( &f->picture, 0, sizeof( x264_picture_t ) );
- f->picture.i_width = param.i_width;
- f->picture.i_height = param.i_height;
- f->picture.i_plane = 3;
+ memset( &w->picture, 0, sizeof( x264_picture_t ) );
+ w->picture.i_width = param.i_width;
+ w->picture.i_height = param.i_height;
+ w->picture.i_plane = 3;
HBLog( "x264: opening with %dx%d iframes=%d", param.i_width, param.i_height, param.i_iframe );
}
- return (HBWork*) f;
+ return w;
}
-void HBX264EncClose( HBWork **_f )
+void HBX264EncClose( HBWork ** _w )
{
- HBX264Enc *f = (HBX264Enc*) *_f;
-
- x264_encoder_close( f->h );
-
- if( f->buffer )
- {
- HBBufferClose( &f->buffer );
- }
-
- free( f->name );
-
- free( f );
-
- *_f = NULL;
+ HBWork * w = *_w;
+ x264_encoder_close( w->h );
+ free( w->name );
+ free( w );
+ *_w = NULL;
}
/* TODO trash buffer->pass == 1
@@ -90,29 +80,22 @@ void HBX264EncClose( HBWork **_f )
*/
static int HBX264EncWork( HBWork * w )
{
- HBX264Enc * f = (HBX264Enc*) w;
- HBTitle * title = f->title;
+ HBTitle * title = w->title;
- HBBuffer * frame;
- int didSomething = 0;
+ HBBuffer * frame, * buffer;
x264_nal_t *nal;
int i_nal;
int i;
- if( f->buffer )
+ if( HBFifoIsHalfFull( title->outFifo ) )
{
- if( !HBFifoPush( title->outFifo, &f->buffer ) )
- {
- /* nothing done */
- return 0;
- }
- didSomething = 1;
+ return 0;
}
- if( ( frame = HBFifoPop( title->scaledFifo ) ) == NULL )
+ if( !( frame = HBFifoPop( title->scaledFifo ) ) )
{
- return didSomething;
+ return 0;
}
if( frame->pass == 1 )
@@ -122,46 +105,51 @@ static int HBX264EncWork( HBWork * w )
return 1;
}
- f->picture.i_stride[0] = title->outWidth;
- f->picture.i_stride[1] = title->outWidth/2;
- f->picture.i_stride[2] = title->outWidth/2;
+ w->picture.i_stride[0] = title->outWidth;
+ w->picture.i_stride[1] = title->outWidth/2;
+ w->picture.i_stride[2] = title->outWidth/2;
- f->picture.plane[0] = frame->data;
- f->picture.plane[1] = &f->picture.plane[0][title->outWidth*title->outHeight];
- f->picture.plane[2] = &f->picture.plane[1][title->outWidth*title->outHeight/4];
+ w->picture.plane[0] = frame->data;
+ w->picture.plane[1] = &w->picture.plane[0][title->outWidth*title->outHeight];
+ w->picture.plane[2] = &w->picture.plane[1][title->outWidth*title->outHeight/4];
- x264_encoder_encode( f->h, &nal, &i_nal, &f->picture );
+ x264_encoder_encode( w->h, &nal, &i_nal, &w->picture );
- f->buffer = HBBufferInit( 3 * title->outWidth * title->outHeight / 2 ); /* FIXME */
- f->buffer->keyFrame = 0;
- f->buffer->position = frame->position;
- f->buffer->size = 0;
+ buffer = HBBufferInit( 3 * title->outWidth * title->outHeight / 2 ); /* FIXME */
+ buffer->keyFrame = 0;
+ buffer->position = frame->position;
+ buffer->size = 0;
for( i = 0; i < i_nal; i++ )
{
- int i_data = f->buffer->alloc - f->buffer->size;
+ int i_data = buffer->alloc - buffer->size;
int i_size;
- i_size = x264_nal_encode( &f->buffer->data[f->buffer->size],
+ i_size = x264_nal_encode( &buffer->data[buffer->size],
&i_data, 1, &nal[i] );
if( i_size <= 0 )
{
fprintf( stderr, "#################### error" );
}
- f->buffer->size += i_size;
+ buffer->size += i_size;
if( nal[i].i_ref_idc == NAL_PRIORITY_HIGH ||
nal[i].i_ref_idc == NAL_PRIORITY_HIGHEST )
{
- f->buffer->keyFrame = 1;
+ buffer->keyFrame = 1;
}
}
/* Inform the GUI about the current position */
- HBPosition( f->handle, frame->position );
+ HBPosition( w->handle, frame->position );
HBBufferClose( &frame );
+ if( !HBFifoPush( title->outFifo, &buffer ) )
+ {
+ HBLog( "HBX264Enc: HBFifoPush failed" );
+ }
+
return 1;
}