diff options
author | superdump <[email protected]> | 2007-08-28 22:04:52 +0000 |
---|---|---|
committer | superdump <[email protected]> | 2007-08-28 22:04:52 +0000 |
commit | 3341802977083ccebf81a6b1306ae7ac6180fe5d (patch) | |
tree | 85ad3f212b5a78d8f877c16a87cfe658da62899c | |
parent | dd7450318b4abdcbda12ec7b2c52e9f51a96f4a9 (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.c | 48 |
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 ); } /** |