OSDN Git Service

- Roll back avpicture_alloc to malloc + avpicture_fill. This fixes the MacGUI preview...
authorsuperdump <superdump@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Tue, 28 Aug 2007 22:04:52 +0000 (22:04 +0000)
committersuperdump <superdump@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Tue, 28 Aug 2007 22:04:52 +0000 (22:04 +0000)
- Free the sws context after its use to avoid a memleak.

Both alterations courtesy of BradleyS. Kudos.

git-svn-id: svn://localhost/HandBrake/trunk@889 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/hb.c

index 57afabf..e90daeb 100644 (file)
@@ -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 );
 }
 
 /**