]> git.sesse.net Git - vlc/commitdiff
* src/input/input_dec.c, include/vlc_codec.h: added 2 callbacks in the decoder_t...
authorGildas Bazin <gbazin@videolan.org>
Mon, 24 Nov 2003 23:22:01 +0000 (23:22 +0000)
committerGildas Bazin <gbazin@videolan.org>
Mon, 24 Nov 2003 23:22:01 +0000 (23:22 +0000)
* modules/codec/libmpeg2.c: restored pictures linking/unlinking code.
* modules/codec/ffmpeg/video.c: idem and reenabled direct rendering even when the hurry-up mode is activated as it doesn't seem to create a problem anymore with recent ffmpeg.

include/vlc_codec.h
modules/codec/ffmpeg/video.c
modules/codec/libmpeg2.c
src/input/input_dec.c

index 090718638529d5ec698b5e748916f85356808009..452cabc2692973ab55e671186eb665daebe6041c 100644 (file)
@@ -2,7 +2,7 @@
  * vlc_codec.h: codec related structures
  *****************************************************************************
  * Copyright (C) 1999-2003 VideoLAN
- * $Id: vlc_codec.h,v 1.5 2003/11/24 00:39:00 fenrir Exp $
+ * $Id: vlc_codec.h,v 1.6 2003/11/24 23:22:01 gbazin Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *
@@ -70,6 +70,8 @@ struct decoder_t
     /* Video output callbacks */
     picture_t     * ( * pf_vout_buffer_new) ( decoder_t * );
     void            ( * pf_vout_buffer_del) ( decoder_t *, picture_t * );
+    void            ( * pf_picture_link)    ( decoder_t *, picture_t * );
+    void            ( * pf_picture_unlink)  ( decoder_t *, picture_t * );
 
 
     /* Private structure for the owner of the decoder */
index ab7744ee7748c2c8b9f03ef23cc4935f26340eca..2baf7d9db57bd5864ec9bf03596265cdc15c24bf 100644 (file)
@@ -2,7 +2,7 @@
  * video.c: video decoder using the ffmpeg library
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: video.c,v 1.52 2003/11/24 00:39:01 fenrir Exp $
+ * $Id: video.c,v 1.53 2003/11/24 23:22:01 gbazin Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *          Gildas Bazin <gbazin@netcourrier.com>
@@ -265,7 +265,7 @@ int E_(InitVideoDec)( decoder_t *p_dec, AVCodecContext *p_context,
 #endif
 
     /* ffmpeg doesn't properly release old pictures when frames are skipped */
-    if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = 0;
+    //if( p_sys->b_hurry_up ) p_sys->b_direct_rendering = 0;
     if( p_sys->b_direct_rendering )
     {
         msg_Dbg( p_dec, "using direct rendering" );
@@ -686,7 +686,7 @@ static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
 
     if( p_ff_pic->reference != 0 )
     {
-      //vout_LinkPicture( p_sys->p_vout, p_pic );
+        p_dec->pf_picture_link( p_dec, p_pic );
     }
 
     /* FIXME what is that, should give good value */
@@ -716,6 +716,6 @@ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context,
 
     if( p_ff_pic->reference != 0 )
     {
-      //vout_UnlinkPicture( p_sys->p_vout, p_pic );
+        p_dec->pf_picture_unlink( p_dec, p_pic );
     }
 }
index e827145668241cedd2b5b9fd751363cfae2b4a38..2262cc17b474274d4afbc948e389c636af39fe0a 100755 (executable)
@@ -2,7 +2,7 @@
  * libmpeg2.c: mpeg2 video decoder module making use of libmpeg2.
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: libmpeg2.c,v 1.34 2003/11/22 23:39:14 fenrir Exp $
+ * $Id: libmpeg2.c,v 1.35 2003/11/24 23:22:01 gbazin Exp $
  *
  * Authors: Gildas Bazin <gbazin@netcourrier.com>
  *          Christophe Massiot <massiot@via.ecp.fr>
@@ -287,7 +287,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
             /* For some reason, libmpeg2 will put this pic twice in
              * discard_picture. This can be considered a bug in libmpeg2. */
-            //vout_LinkPicture( p_sys->p_vout, p_pic );
+            p_dec->pf_picture_link( p_dec, p_pic );
 
             if( p_sys->p_synchro )
             {
@@ -376,6 +376,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 
         case STATE_END:
         case STATE_SLICE:
+            p_pic = NULL;
             if( p_sys->p_info->display_fbuf
                 && p_sys->p_info->display_fbuf->id )
             {
@@ -396,17 +397,16 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                     p_sys->p_picture_to_destroy = NULL;
                     p_pic->date = 0;
                 }
-           return p_pic; /* FIXME */
             }
 
             if( p_sys->p_info->discard_fbuf &&
                 p_sys->p_info->discard_fbuf->id )
             {
-               //p_pic = (picture_t *)p_sys->p_info->discard_fbuf->id;
-                //vout_UnlinkPicture( p_sys->p_vout, p_pic );
+                p_dec->pf_picture_unlink( p_dec,
+                                          p_sys->p_info->discard_fbuf->id );
             }
 
-           //return p_pic; /* FIXME */
+           if( p_pic ) return p_pic;
 
             break;
 
@@ -512,7 +512,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
     p_pic->i_nb_fields = p_sys->p_info->current_picture != NULL ?
         p_sys->p_info->current_picture->nb_fields : 2;
 
-    //vout_LinkPicture( p_sys->p_vout, p_pic );
+    p_dec->pf_picture_link( p_dec, p_pic );
 
     pp_buf[0] = p_pic->p[0].p_pixels;
     pp_buf[1] = p_pic->p[1].p_pixels;
index 4af17995c7b085a17d64657b5347e8f0e6aaa4ce..2b10010eea37a8a2f4f7af774ad3dbcef8b67bf1 100644 (file)
@@ -2,7 +2,7 @@
  * input_dec.c: Functions for the management of decoders
  *****************************************************************************
  * Copyright (C) 1999-2001 VideoLAN
- * $Id: input_dec.c,v 1.78 2003/11/24 03:30:38 fenrir Exp $
+ * $Id: input_dec.c,v 1.79 2003/11/24 23:22:01 gbazin Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Gildas Bazin <gbazin@netcourrier.com>
@@ -51,6 +51,8 @@ static void aout_del_buffer( decoder_t *, aout_buffer_t * );
 
 static picture_t *vout_new_buffer( decoder_t * );
 static void vout_del_buffer( decoder_t *, picture_t * );
+static void vout_link_picture( decoder_t *, picture_t * );
+static void vout_unlink_picture( decoder_t *, picture_t * );
 
 static es_format_t null_es_format = {0};
 
@@ -436,6 +438,8 @@ static decoder_t * CreateDecoder( input_thread_t * p_input,
     p_dec->pf_aout_buffer_del = aout_del_buffer;
     p_dec->pf_vout_buffer_new = vout_new_buffer;
     p_dec->pf_vout_buffer_del = vout_del_buffer;
+    p_dec->pf_picture_link    = vout_link_picture;
+    p_dec->pf_picture_unlink  = vout_unlink_picture;
 
     vlc_object_attach( p_dec, p_input );
 
@@ -589,19 +593,17 @@ static void DeleteDecoder( decoder_t * p_dec )
     {
         int i_pic;
 
+#define p_pic p_dec->p_owner->p_vout->render.pp_picture[i_pic]
         /* Hack to make sure all the the pictures are freed by the decoder */
         for( i_pic = 0; i_pic < p_dec->p_owner->p_vout->render.i_pictures;
              i_pic++ )
         {
-            if( p_dec->p_owner->p_vout->render.pp_picture[i_pic]->i_status ==
-                RESERVED_PICTURE )
-                vout_DestroyPicture( p_dec->p_owner->p_vout,
-                    p_dec->p_owner->p_vout->render.pp_picture[i_pic] );
-            if( p_dec->p_owner->p_vout->render.pp_picture[i_pic]->i_refcount
-                > 0 )
-                vout_UnlinkPicture( p_dec->p_owner->p_vout,
-                    p_dec->p_owner->p_vout->render.pp_picture[i_pic] );
+            if( p_pic->i_status == RESERVED_PICTURE )
+                vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic );
+            if( p_pic->i_refcount > 0 )
+                vout_UnlinkPicture( p_dec->p_owner->p_vout, p_pic );
         }
+#undef p_pic
 
         /* We are about to die. Reattach video output to p_vlc. */
         vout_Request( p_dec, p_dec->p_owner->p_vout, 0, 0, 0, 0 );
@@ -699,10 +701,39 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
     /* Get a new picture */
     while( !(p_pic = vout_CreatePicture( p_sys->p_vout, 0, 0, 0 ) ) )
     {
+        int i_pic;
+
         if( p_dec->b_die || p_dec->b_error )
         {
             return NULL;
         }
+
+#define p_pic p_dec->p_owner->p_vout->render.pp_picture[i_pic]
+        /* Check the decoder doesn't leak pictures */
+        for( i_pic = 0; i_pic < p_dec->p_owner->p_vout->render.i_pictures;
+             i_pic++ )
+        {
+            if( p_pic->i_status != DISPLAYED_PICTURE &&
+                p_pic->i_status != RESERVED_PICTURE ) break;
+
+            if( !p_pic->i_refcount ) break;
+        }
+        if( i_pic == p_dec->p_owner->p_vout->render.i_pictures )
+        {
+            msg_Err( p_dec, "decoder is leaking pictures, reseting the heap" );
+
+            /* Just free all the pictures */
+            for( i_pic = 0; i_pic < p_dec->p_owner->p_vout->render.i_pictures;
+                 i_pic++ )
+            {
+                if( p_pic->i_status == RESERVED_PICTURE )
+                    vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic );
+                if( p_pic->i_refcount > 0 )
+                vout_UnlinkPicture( p_dec->p_owner->p_vout, p_pic );
+            }
+        }
+#undef p_pic
+
         msleep( VOUT_OUTMEM_SLEEP );
     }
 
@@ -713,3 +744,13 @@ static void vout_del_buffer( decoder_t *p_dec, picture_t *p_pic )
 {
     vout_DestroyPicture( p_dec->p_owner->p_vout, p_pic );
 }
+
+static void vout_link_picture( decoder_t *p_dec, picture_t *p_pic )
+{
+    vout_LinkPicture( p_dec->p_owner->p_vout, p_pic );
+}
+
+static void vout_unlink_picture( decoder_t *p_dec, picture_t *p_pic )
+{
+    vout_UnlinkPicture( p_dec->p_owner->p_vout, p_pic );
+}