summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/encx264.c33
1 files changed, 15 insertions, 18 deletions
diff --git a/libhb/encx264.c b/libhb/encx264.c
index 0ba54dfa1..fe9a11f82 100644
--- a/libhb/encx264.c
+++ b/libhb/encx264.c
@@ -48,7 +48,7 @@ struct hb_work_private_s
hb_job_t * job;
x264_t * x264;
x264_picture_t pic_in;
- uint8_t *x264_allocated_pic;
+ uint8_t * grey_data;
uint32_t frames_in;
uint32_t frames_out;
@@ -314,11 +314,20 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job )
memcpy(w->config->h264.pps, nal[1].p_payload + 4, nal[1].i_payload - 4);
w->config->h264.pps_length = nal[1].i_payload - 4;
- x264_picture_alloc( &pv->pic_in, X264_CSP_I420,
- job->width, job->height );
+ x264_picture_init( &pv->pic_in );
+ pv->pic_in.img.i_csp = X264_CSP_I420;
+ pv->pic_in.img.i_plane = 3;
+ pv->pic_in.img.i_stride[0] = job->width;
pv->pic_in.img.i_stride[2] = pv->pic_in.img.i_stride[1] = ( ( job->width + 1 ) >> 1 );
- pv->x264_allocated_pic = pv->pic_in.img.plane[0];
+
+ if( job->grayscale )
+ {
+ int uvsize = ( (job->width + 1) >> 1 ) * ( (job->height + 1) >> 1 );
+ pv->grey_data = malloc( uvsize );
+ memset( pv->grey_data, 0x80, uvsize );
+ pv->pic_in.img.plane[1] = pv->pic_in.img.plane[2] = pv->grey_data;
+ }
return 0;
}
@@ -332,12 +341,7 @@ void encx264Close( hb_work_object_t * w )
hb_log( "encx264: %u frames had to be split (%u in, %u out)",
pv->frames_split, pv->frames_in, pv->frames_out );
}
- /*
- * Patch the x264 allocated data back in so that x264 can free it
- * we have been using our own buffers during the encode to avoid copying.
- */
- pv->pic_in.img.plane[0] = pv->x264_allocated_pic;
- x264_picture_clean( &pv->pic_in );
+ free( pv->grey_data );
x264_encoder_close( pv->x264 );
free( pv );
w->private_data = NULL;
@@ -487,13 +491,7 @@ static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
pv->pic_in.img.plane[0] = in->data;
int uvsize = ( (job->width + 1) >> 1 ) * ( (job->height + 1) >> 1 );
- if( job->grayscale )
- {
- /* XXX x264 has currently no option for grayscale encoding */
- memset( pv->pic_in.img.plane[1], 0x80, uvsize );
- memset( pv->pic_in.img.plane[2], 0x80, uvsize );
- }
- else
+ if( !job->grayscale )
{
/* Point x264 at our buffers (Y)UV data */
pv->pic_in.img.plane[1] = in->data + job->width * job->height;
@@ -519,7 +517,6 @@ static hb_buffer_t *x264_encode( hb_work_object_t *w, hb_buffer_t *in )
{
pv->pic_in.i_type = X264_TYPE_AUTO;
}
- pv->pic_in.i_qpplus1 = 0;
/* XXX this is temporary debugging code to check that the upstream
* modules (render & sync) have generated a continuous, self-consistent