summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsuperdump <[email protected]>2007-08-28 22:04:52 +0000
committersuperdump <[email protected]>2007-08-28 22:04:52 +0000
commit3341802977083ccebf81a6b1306ae7ac6180fe5d (patch)
tree85ad3f212b5a78d8f877c16a87cfe658da62899c
parentdd7450318b4abdcbda12ec7b2c52e9f51a96f4a9 (diff)
- Roll back avpicture_alloc to malloc + avpicture_fill. This fixes the MacGUI preview window crashing.
- Free the sws context after its use to avoid a memleak. Both alterations courtesy of BradleyS. Kudos. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@889 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/hb.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/libhb/hb.c b/libhb/hb.c
index 57afabfbc..e90daeb0d 100644
--- a/libhb/hb.c
+++ b/libhb/hb.c
@@ -311,14 +311,26 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
hb_job_t * job = title->job;
char filename[1024];
FILE * file;
- uint8_t * pen;
+ uint8_t * buf1, * buf2, * buf3, * buf4, * pen;
uint32_t * p32;
AVPicture pic_in, pic_preview, pic_deint, pic_crop, pic_scale;
struct SwsContext * context;
int i;
+ buf1 = malloc( title->width * title->height * 3 / 2 );
+ buf2 = malloc( title->width * title->height * 3 / 2 );
+ buf3 = malloc( title->width * title->height * 3 / 2 );
+ buf4 = malloc( title->width * title->height * 4 );
+ avpicture_fill( &pic_in, buf1, PIX_FMT_YUV420P,
+ title->width, title->height );
+ avpicture_fill( &pic_deint, buf2, PIX_FMT_YUV420P,
+ title->width, title->height );
+ avpicture_fill( &pic_scale, buf3, PIX_FMT_YUV420P,
+ job->width, job->height );
+ avpicture_fill( &pic_preview, buf4, PIX_FMT_RGBA32,
+ job->width, job->height );
+
// Allocate the AVPicture frames and fill in
- avpicture_alloc( &pic_in, PIX_FMT_YUV420P, title->width, title->height );
memset( filename, 0, 1024 );
@@ -332,44 +344,51 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
return;
}
- fread( pic_in.data[0], title->width * title->height * 3 / 2, 1, file );
+ fread( buf1, title->width * title->height * 3 / 2, 1, file );
fclose( file );
if( job->deinterlace )
{
- // Allocate picture to deinterlace into and deinterlace
- avpicture_alloc( &pic_deint, PIX_FMT_YUV420P, title->width, title->height );
+ // Deinterlace and crop
avpicture_deinterlace( &pic_deint, &pic_in, PIX_FMT_YUV420P, title->width, title->height );
-
av_picture_crop( &pic_crop, &pic_deint, PIX_FMT_YUV420P, job->crop[0], job->crop[2] );
}
else
{
+ // Crop
av_picture_crop( &pic_crop, &pic_in, PIX_FMT_YUV420P, job->crop[0], job->crop[2] );
}
- // Allocate picture to scale into, get scaling context and scale
- avpicture_alloc( &pic_scale, PIX_FMT_YUV420P, job->width, job->height );
+ // Get scaling context
context = sws_getContext(title->width - (job->crop[2] + job->crop[3]),
title->height - (job->crop[0] + job->crop[1]),
PIX_FMT_YUV420P,
job->width, job->height, PIX_FMT_YUV420P,
SWS_LANCZOS, NULL, NULL, NULL);
+
+ // Scale
sws_scale(context,
pic_crop.data, pic_crop.linesize,
0, title->height - (job->crop[0] + job->crop[1]),
pic_scale.data, pic_scale.linesize);
- // Allocate RGBA32 preview picture and create preview
- avpicture_alloc( &pic_preview, PIX_FMT_RGBA32, job->width, job->height );
+ // Free context
+ sws_freeContext( context );
+
+ // Get preview context
context = sws_getContext(job->width, job->height, PIX_FMT_YUV420P,
job->width, job->height, PIX_FMT_RGBA32,
SWS_LANCZOS, NULL, NULL, NULL);
+
+ // Create preview
sws_scale(context,
pic_scale.data, pic_scale.linesize,
0, job->height,
pic_preview.data, pic_preview.linesize);
+ // Free context
+ sws_freeContext( context );
+
/* Gray background */
p32 = (uint32_t *) buffer;
for( i = 0; i < ( title->width + 2 ) * ( title->height + 2 ); i++ )
@@ -388,17 +407,22 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
nextLine = pen + 4 * ( title->width + 2 );
memset( pen, 0xFF, 4 );
pen += 4;
- memcpy( pen, pic_preview.data[0] + 4 * job->width * i, 4 * job->width );
+ memcpy( pen, buf4 + 4 * job->width * i, 4 * job->width );
pen += 4 * job->width;
memset( pen, 0xFF, 4 );
pen = nextLine;
}
memset( pen, 0xFF, 4 * ( job->width + 2 ) );
+ // Clean up
avpicture_free( &pic_preview );
avpicture_free( &pic_scale );
- if( job->deinterlace ) avpicture_free( &pic_deint );
+ avpicture_free( &pic_deint );
avpicture_free( &pic_in );
+ free( buf1 );
+ free( buf2 );
+ free( buf3 );
+ free( buf4 );
}
/**