]> git.sesse.net Git - vlc/commitdiff
Properly malloc(), memcpy() and free() the quantizer matrix. (Somebody please patch...
authorAntoine Cellerier <dionoea@videolan.org>
Wed, 3 Sep 2008 20:47:03 +0000 (22:47 +0200)
committerAntoine Cellerier <dionoea@videolan.org>
Wed, 3 Sep 2008 20:48:19 +0000 (22:48 +0200)
include/vlc_vout.h
modules/codec/avcodec/video.c
modules/stream_out/mosaic_bridge.c
modules/stream_out/transcode.c
src/input/decoder.c
src/video_output/video_output.c
src/video_output/vout_pictures.c

index fa3685813908a70f332577724dbeb129f0428472..dde94956470082c46c253f411ba7d32180f0e19c 100644 (file)
@@ -160,6 +160,17 @@ static inline void picture_Release( picture_t *p_picture )
         p_picture->pf_release( p_picture );
 }
 
+/**
+ * Cleanup quantization matrix data and set to 0
+ */
+static inline void picture_CleanupQuant( picture_t *p_pic )
+{
+    free( p_pic->p_q );
+    p_pic->p_q = NULL;
+    p_pic->i_qstride = 0;
+    p_pic->i_qtype = 0;
+}
+
 /**
  * This function will copy all picture dynamic properties.
  */
index 8b1076fa8d7bfa91865062992fecd6581861a3cc..f089504c8d16e7f54d6f85f8025afa13512f5cc9 100644 (file)
@@ -651,15 +651,10 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
             p_pic->b_top_field_first = p_sys->p_ff_pic->top_field_first;
 
             p_pic->i_qstride = p_sys->p_ff_pic->qstride;
-#if 1
-            p_pic->p_q = p_sys->p_ff_pic->qscale_table; /* XXX: is this dangerous? shouldn't be since the ff pics are never freed ... but you never know */
-#else
-            /* FIXME: this leaks p_q */
             int i_mb_h = ( p_pic->format.i_height + 15 ) / 16;
             p_pic->p_q = malloc( p_pic->i_qstride * i_mb_h );
             memcpy( p_pic->p_q, p_sys->p_ff_pic->qscale_table,
                     p_pic->i_qstride * i_mb_h );
-#endif
             switch( p_sys->p_ff_pic->qscale_type )
             {
                 case FF_QSCALE_TYPE_MPEG1:
index a28986ca5608d8f3db91213d7c1aa0fd3db9bddd..c619b7fd1615ae43695a5a3cf9de01c17cffd9ff 100644 (file)
@@ -90,6 +90,7 @@ static void ReleasePicture( picture_t *p_pic )
     }
     else
     {
+        free( p_pic->p_q );
         free( p_pic->p_data_orig );
         free( p_pic );
     }
index ea7527bf3ab8d56b82cca1b23b02368d8d528bf4..b9e27ec69dc904ab832f652b2c0fb2df064e6587 100644 (file)
@@ -2278,6 +2278,7 @@ static void video_del_buffer( vlc_object_t *p_this, picture_t *p_pic )
     VLC_UNUSED(p_this);
     if( p_pic )
     {
+        free( p_pic->p_q );
         free( p_pic->p_data_orig );
         free( p_pic->p_sys );
         free( p_pic );
@@ -2289,6 +2290,7 @@ static void video_del_buffer_decoder( decoder_t *p_decoder, picture_t *p_pic )
     VLC_UNUSED(p_decoder);
     p_pic->i_refcount = 0;
     p_pic->i_status = DESTROYED_PICTURE;
+    picture_CleanupQuant( p_pic );
 }
 
 static void video_del_buffer_filter( filter_t *p_filter, picture_t *p_pic )
@@ -2296,6 +2298,7 @@ static void video_del_buffer_filter( filter_t *p_filter, picture_t *p_pic )
     VLC_UNUSED(p_filter);
     p_pic->i_refcount = 0;
     p_pic->i_status = DESTROYED_PICTURE;
+    picture_CleanupQuant( p_pic );
 }
 
 static void video_link_picture_decoder( decoder_t *p_dec, picture_t *p_pic )
index 18876a61547f4b967d850f6b77ad686eab53a561..49df3abd4668542f0000fe081c1fefb9052895d8 100644 (file)
@@ -709,6 +709,7 @@ static void VoutDisplayedPicture( vout_thread_t *p_vout, picture_t *p_pic )
     else
     {
         p_pic->i_status = DESTROYED_PICTURE;
+        picture_CleanupQuant( p_pic );
         p_vout->i_heap_size--;
     }
 
index 8e11b0825e7194d1b0dd6b022b442feac572950b..93094ce7b375642fb8a846bff7fb3698adab5378 100644 (file)
@@ -1253,6 +1253,7 @@ static void DropPicture( vout_thread_t *p_vout, picture_t *p_picture )
         /* Destroy the picture without displaying it */
         p_picture->i_status = DESTROYED_PICTURE;
         p_vout->i_heap_size--;
+        picture_CleanupQuant( p_picture );
     }
     vlc_mutex_unlock( &p_vout->picture_lock );
 }
index 81f29ba1fceb7e07726a76b1f5cadd49f57671ff..568d196b021c4f51f5d9e197e333c1d158137e87 100644 (file)
@@ -262,6 +262,7 @@ void vout_DestroyPicture( vout_thread_t *p_vout, picture_t *p_pic )
 
     p_pic->i_status = DESTROYED_PICTURE;
     p_vout->i_heap_size--;
+    picture_CleanupQuant( p_pic );
 
     vlc_mutex_unlock( &p_vout->picture_lock );
 }
@@ -294,6 +295,7 @@ void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic )
     {
         p_pic->i_status = DESTROYED_PICTURE;
         p_vout->i_heap_size--;
+        picture_CleanupQuant( p_pic );
     }
 
     vlc_mutex_unlock( &p_vout->picture_lock );
@@ -1045,6 +1047,7 @@ void picture_Delete( picture_t *p_picture )
 {
     assert( p_picture && p_picture->i_refcount == 0 );
 
+    free( p_picture->p_q );
     free( p_picture->p_data_orig );
     free( p_picture->p_sys );
     free( p_picture );
@@ -1097,4 +1100,3 @@ void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src )
  *
  *****************************************************************************/
 
-