summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2008-11-07 00:22:48 +0000
committerjstebbins <[email protected]>2008-11-07 00:22:48 +0000
commite9c85188d91e55e7287e2388fcda8edb2991f333 (patch)
treec415018533bc9e40b17a3a1b995e24510c4d57c0
parent1a0740cc1cf84f5a6ac3375bc5a5c6a78c912745 (diff)
clean up picture allocation in hb_get_preview and fix minor picture corruption
that happens when the width is not divisible by 8. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@1901 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/hb.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/libhb/hb.c b/libhb/hb.c
index fa52320ad..713c82580 100644
--- a/libhb/hb.c
+++ b/libhb/hb.c
@@ -321,16 +321,18 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
AVPicture pic_in, pic_preview, pic_deint, pic_crop, pic_scale;
struct SwsContext * context;
int i;
+ int rgb_width = ((job->width + 7) >> 3) << 3;
+ int preview_size;
swsflags = SWS_LANCZOS;
#ifndef __x86_64__
swsflags |= SWS_ACCURATE_RND;
#endif /* __x86_64__ */
- 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 );
+ buf1 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, title->width, title->height ) );
+ buf2 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, title->width, title->height ) );
+ buf3 = av_malloc( avpicture_get_size( PIX_FMT_YUV420P, job->width, job->height ) );
+ buf4 = av_malloc( avpicture_get_size( PIX_FMT_RGBA32, rgb_width, job->height ) );
avpicture_fill( &pic_in, buf1, PIX_FMT_YUV420P,
title->width, title->height );
avpicture_fill( &pic_deint, buf2, PIX_FMT_YUV420P,
@@ -338,7 +340,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
avpicture_fill( &pic_scale, buf3, PIX_FMT_YUV420P,
job->width, job->height );
avpicture_fill( &pic_preview, buf4, PIX_FMT_RGBA32,
- job->width, job->height );
+ rgb_width, job->height );
// Allocate the AVPicture frames and fill in
@@ -354,7 +356,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
return;
}
- fread( buf1, title->width * title->height * 3 / 2, 1, file );
+ fread( buf1, avpicture_get_size( PIX_FMT_YUV420P, title->width, title->height), 1, file );
fclose( file );
if( job->deinterlace )
@@ -386,8 +388,8 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
sws_freeContext( context );
// Get preview context
- context = sws_getContext(job->width, job->height, PIX_FMT_YUV420P,
- job->width, job->height, PIX_FMT_RGBA32,
+ context = sws_getContext(rgb_width, job->height, PIX_FMT_YUV420P,
+ rgb_width, job->height, PIX_FMT_RGBA32,
swsflags, NULL, NULL, NULL);
// Create preview
@@ -407,6 +409,7 @@ void hb_get_preview( hb_handle_t * h, hb_title_t * title, int picture,
}
/* Draw the picture, centered, and draw the cropping zone */
+ preview_size = pic_preview.linesize[0];
pen = buffer + ( title->height - job->height ) *
( title->width + 2 ) * 2 + ( title->width - job->width ) * 2;
memset( pen, 0xFF, 4 * ( job->width + 2 ) );
@@ -417,7 +420,7 @@ 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, buf4 + 4 * job->width * i, 4 * job->width );
+ memcpy( pen, buf4 + preview_size * i, 4 * job->width );
pen += 4 * job->width;
memset( pen, 0xFF, 4 );
pen = nextLine;