]> git.sesse.net Git - vlc/blobdiff - src/misc/image.c
s/picture_Yield/picture_Hold/
[vlc] / src / misc / image.c
index 09c399f6504b499b6815a1e2f3709a108e424683..826bcc81c85ab84d9a321404ac8cc6461369e749 100644 (file)
@@ -70,9 +70,6 @@ static filter_t *CreateFilter( vlc_object_t *, es_format_t *,
 static void DeleteFilter( filter_t * );
 
 static vlc_fourcc_t Ext2Fourcc( const char * );
-
-static void video_release_buffer_dummy( picture_t *p_pic );
-
 /*static const char *Fourcc2Ext( vlc_fourcc_t );*/
 
 /**
@@ -142,8 +139,8 @@ static picture_t *ImageRead( image_handler_t *p_image, block_t *p_block,
     while( (p_tmp = p_image->p_dec->pf_decode_video( p_image->p_dec, &p_block ))
              != NULL )
     {
-        if ( p_pic != NULL )
-            p_pic->pf_release( p_pic );
+        if( p_pic != NULL )
+            picture_Release( p_pic );
         p_pic = p_tmp;
     }
 
@@ -191,7 +188,7 @@ static picture_t *ImageRead( image_handler_t *p_image, block_t *p_block,
 
             if( !p_image->p_filter )
             {
-                p_pic->pf_release( p_pic );
+                picture_Release( p_pic );
                 return NULL;
             }
         }
@@ -319,7 +316,8 @@ static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic,
             p_image->p_filter->fmt_out.video = p_image->p_enc->fmt_in.video;
         }
 
-        p_pic->i_refcount++; /* pf_video_filter() will call pf_release() */
+        picture_Hold( p_pic );
+
         p_tmp_pic =
             p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
 
@@ -448,21 +446,16 @@ static picture_t *ImageConvert( image_handler_t *p_image, picture_t *p_pic,
         p_image->p_filter->fmt_out.video = *p_fmt_out;
     }
 
-    /* We have to override the current release scheme for p_pic.
-     * (You cannot suppose what pf_release will do or even if it
-     * is defined) */
-    void (*pf_sav_release)( picture_t * ) = p_pic->pf_release;
+    picture_Hold( p_pic );
 
-    p_pic->pf_release = video_release_buffer_dummy;
     p_pif = p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
-    p_pic->pf_release = pf_sav_release;
 
     if( p_fmt_in->i_chroma == p_fmt_out->i_chroma &&
         p_fmt_in->i_width == p_fmt_out->i_width &&
         p_fmt_in->i_height == p_fmt_out->i_height )
     {
         /* Duplicate image */
-        p_pif->pf_release( p_pif ); /* XXX: Better fix must be possible */
+        picture_Release( p_pif ); /* XXX: Better fix must be possible */
         p_pif = p_image->p_filter->pf_vout_buffer_new( p_image->p_filter );
         if( p_pif ) vout_CopyPicture( p_image->p_parent, p_pif, p_pic );
     }
@@ -500,7 +493,8 @@ static picture_t *ImageFilter( image_handler_t *p_image, picture_t *p_pic,
         p_image->p_filter->fmt_out.video = *p_fmt;
     }
 
-    p_pic->i_refcount++; /* pf_video_filter() will call pf_release() */
+    picture_Hold( p_pic );
+
     return p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic );
 }
 
@@ -508,7 +502,7 @@ static picture_t *ImageFilter( image_handler_t *p_image, picture_t *p_pic,
  * Misc functions
  *
  */
-static struct
+static const struct
 {
     vlc_fourcc_t i_codec;
     const char *psz_ext;
@@ -572,62 +566,34 @@ static const char *Fourcc2Ext( vlc_fourcc_t i_codec )
 }
 */
 
-static void video_release_buffer_dummy( picture_t *p_pic )
-{
-    VLC_UNUSED( p_pic );
-}
-static void video_release_buffer( picture_t *p_pic )
-{
-    if( --p_pic->i_refcount > 0 ) return;
-
-    free( p_pic->p_data_orig );
-    free( p_pic->p_sys );
-    free( p_pic );
-}
-
 static picture_t *video_new_buffer( decoder_t *p_dec )
 {
-    picture_t *p_pic = malloc( sizeof(picture_t) );
-
     p_dec->fmt_out.video.i_chroma = p_dec->fmt_out.i_codec;
-    vout_AllocatePicture( VLC_OBJECT(p_dec), p_pic,
-                          p_dec->fmt_out.video.i_chroma,
-                          p_dec->fmt_out.video.i_width,
-                          p_dec->fmt_out.video.i_height,
-                          p_dec->fmt_out.video.i_aspect );
-
-    if( !p_pic->i_planes )
-    {
-        free( p_pic );
-        return 0;
-    }
-
-    p_pic->i_refcount = 1;
-    p_pic->pf_release = video_release_buffer;
-    p_pic->i_status = RESERVED_PICTURE;
-    p_pic->p_sys = NULL;
-
-    return p_pic;
+    return picture_New( p_dec->fmt_out.video.i_chroma,
+                        p_dec->fmt_out.video.i_width,
+                        p_dec->fmt_out.video.i_height,
+                        p_dec->fmt_out.video.i_aspect );
 }
 
 static void video_del_buffer( decoder_t *p_dec, picture_t *p_pic )
 {
-    (void)p_dec;
-    free( p_pic->p_data_orig );
-    free( p_pic->p_sys );
-    free( p_pic );
+    if( p_pic->i_refcount != 1 )
+        msg_Err( p_dec, "invalid picture reference count" );
+
+    p_pic->i_refcount = 0;
+    picture_Delete( p_pic );
 }
 
 static void video_link_picture( decoder_t *p_dec, picture_t *p_pic )
 {
     (void)p_dec;
-    p_pic->i_refcount++;
+    picture_Hold( p_pic );
 }
 
 static void video_unlink_picture( decoder_t *p_dec, picture_t *p_pic )
 {
-    (void)p_dec; (void)p_pic;
-    video_release_buffer( p_pic );
+    (void)p_dec;
+    picture_Release( p_pic );
 }
 
 static decoder_t *CreateDecoder( vlc_object_t *p_this, video_format_t *fmt )