]> git.sesse.net Git - vlc/commitdiff
Added decoder_New/Delete/Link/UnlinkPicture helpers.
authorLaurent Aimar <fenrir@videolan.org>
Thu, 23 Oct 2008 20:00:54 +0000 (22:00 +0200)
committerLaurent Aimar <fenrir@videolan.org>
Thu, 23 Oct 2008 20:01:59 +0000 (22:01 +0200)
20 files changed:
include/vlc_codec.h
modules/codec/avcodec/video.c
modules/codec/cdg.c
modules/codec/dirac.c
modules/codec/dmo/dmo.c
modules/codec/fake.c
modules/codec/libmpeg2.c
modules/codec/mash.cpp
modules/codec/png.c
modules/codec/quicktime.c
modules/codec/rawvideo.c
modules/codec/realvideo.c
modules/codec/schroedinger.c
modules/codec/sdl_image.c
modules/codec/tarkin.c
modules/codec/theora.c
modules/codec/xvmc/xxmc.c
modules/misc/stats/decoder.c
src/input/decoder.c
src/libvlccore.sym

index 80ca5995b7fc1ed357e6a2e2effba5b5f81869cc..5003e63f8a82922774368182e562e799fd7a3b08 100644 (file)
@@ -81,29 +81,28 @@ struct decoder_t
      * globaly, not necessary for the current packet */
     block_t *           ( * pf_get_cc )      ( decoder_t *, bool pb_present[4] );
 
-    /*
-     * Buffers allocation
-     */
-
-    /* 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 * );
-
     /*
      * Owner fields
+     * XXX You MUST not use them directly.
      */
 
+    /* Video output callbacks
+     * XXX use decoder_NewPicture/decoder_DeletePicture
+     * and decoder_LinkPicture/decoder_UnlinkPicture */
+    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 * );
+
     /* Audio output callbacks
      * XXX use decoder_NewAudioBuffer/decoder_DeleteAudioBuffer */
-    aout_buffer_t * ( * pf_aout_buffer_new) ( decoder_t *, int );
-    void            ( * pf_aout_buffer_del) ( decoder_t *, aout_buffer_t * );
+    aout_buffer_t  *(*pf_aout_buffer_new)( decoder_t *, int );
+    void            (*pf_aout_buffer_del)( decoder_t *, aout_buffer_t * );
 
     /* SPU output callbacks
      * XXX use decoder_NewSubpicture and decoder_DeleteSubpicture */
-    subpicture_t   *(*pf_spu_buffer_new) ( decoder_t * );
-    void            (*pf_spu_buffer_del) ( decoder_t *, subpicture_t * );
+    subpicture_t   *(*pf_spu_buffer_new)( decoder_t * );
+    void            (*pf_spu_buffer_del)( decoder_t *, subpicture_t * );
 
     /* Input attachments
      * XXX use decoder_GetInputAttachments */
@@ -166,6 +165,30 @@ struct encoder_t
  */
 
 
+/**
+ * This function will return a new picture usable by a decoder as an output
+ * buffer. You have to release it using decoder_DeletePicture or by returning
+ * it to the caller as a pf_decode_video return value.
+ */
+VLC_EXPORT( picture_t *, decoder_NewPicture, ( decoder_t * ) );
+
+/**
+ * This function will release a picture create by decoder_NewPicture.
+ */
+VLC_EXPORT( void, decoder_DeletePicture, ( decoder_t *, picture_t *p_picture ) );
+
+/**
+ * This function will increase the picture reference count.
+ * (picture_Hold is not usable.)
+ */
+VLC_EXPORT( void, decoder_LinkPicture, ( decoder_t *, picture_t * ) );
+
+/**
+ * This function will decrease the picture reference count.
+ * (picture_Release is not usable.)
+ */
+VLC_EXPORT( void, decoder_UnlinkPicture, ( decoder_t *, picture_t * ) );
+
 /**
  * This function will return a new audio buffer usable by a decoder as an
  * output buffer. You have to release it using decoder_DeleteAudioBuffer
index bd018e7043d860ab20c5b01a36937f16407b9eb6..5c63fa262fae3de4951768bebc89d2ba166f1368 100644 (file)
@@ -165,7 +165,7 @@ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
         p_dec->fmt_out.video.i_frame_rate_base = p_context->time_base.num;
     }
 
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
 
     return p_pic;
 }
@@ -609,7 +609,7 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
             /* Do not display the picture */
             p_pic = (picture_t *)p_sys->p_ff_pic->opaque;
             if( !b_drawpicture && p_pic )
-                p_dec->pf_vout_buffer_del( p_dec, p_pic );
+                decoder_DeletePicture( p_dec, p_pic );
 
             ffmpeg_NextPts( p_dec );
             continue;
@@ -699,7 +699,7 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
         }
         else
         {
-            p_dec->pf_vout_buffer_del( p_dec, p_pic );
+            decoder_DeletePicture( p_dec, p_pic );
         }
     }
 
@@ -914,7 +914,7 @@ static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
 
     if( p_ff_pic->reference != 0 )
     {
-        p_dec->pf_picture_link( p_dec, p_pic );
+        decoder_LinkPicture( p_dec, p_pic );
     }
 
     /* FIXME what is that, should give good value */
@@ -996,7 +996,7 @@ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context,
 
     if( p_ff_pic->reference != 0 )
     {
-        p_dec->pf_picture_unlink( p_dec, p_pic );
+        decoder_UnlinkPicture( p_dec, p_pic );
     }
 }
 
index af912284ef4be3e4db7d6a55ba35137fb467eec1..ae0f5bacd822e4fd9c3386b7c22e73f36b371901 100644 (file)
@@ -153,7 +153,7 @@ static picture_t *Decode( decoder_t *p_dec, block_t **pp_block )
     }
 
     /* Get a new picture */
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
     if( !p_pic )
         goto error;
 
index f621090ec24dd365a62dd516f412f8c584550880..87fb11bba1a634def1bc026d08952fa5ed73b659 100644 (file)
@@ -168,7 +168,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec )
         p_sys->p_dirac->src_params.frame_rate.denominator;
 
     /* Get a new picture */
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
 
     if( p_pic == NULL ) return NULL;
     p_pic->b_progressive = !p_sys->p_dirac->src_params.source_sampling;
index f107f135438d9d734fc0e26ce7d8640453198c14..cb077976c58b2d076d7878e6f7406985293909b7 100644 (file)
@@ -953,7 +953,7 @@ static void *DecBlock( decoder_t *p_dec, block_t **pp_block )
     if( p_dec->fmt_out.i_cat == VIDEO_ES )
     {
         /* Get a new picture */
-        picture_t *p_pic = p_dec->pf_vout_buffer_new( p_dec );
+        picture_t *p_pic = decoder_NewPicture( p_dec );
         if( !p_pic ) return NULL;
 
         CopyPicture( p_pic, block_out.p_buffer );
index 0409b70699f8942990f2cc81410e3e6dfdfe578a..5974564a90c4a616e3c27173fa98094eb35d8ae0 100644 (file)
@@ -345,7 +345,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     picture_t *p_pic;
 
     if( pp_block == NULL || !*pp_block ) return NULL;
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
     if( p_pic == NULL )
     {
         msg_Err( p_dec, "cannot get picture" );
index 429f10f27393270ba3a043eda10c07f1296b565e..2c8ddecf0d482245df0b60b0e69ce0464d655c56 100644 (file)
@@ -341,7 +341,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. */
-            p_dec->pf_picture_link( p_dec, p_pic );
+            decoder_LinkPicture( p_dec, p_pic );
 
             if( p_sys->p_synchro )
             {
@@ -509,8 +509,8 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
             if( p_sys->p_info->discard_fbuf &&
                 p_sys->p_info->discard_fbuf->id )
             {
-                p_dec->pf_picture_unlink( p_dec,
-                                          p_sys->p_info->discard_fbuf->id );
+                decoder_UnlinkPicture( p_dec,
+                                       p_sys->p_info->discard_fbuf->id );
             }
 
             /* For still frames */
@@ -639,7 +639,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
         VLC_FOURCC('I','4','2','0') : VLC_FOURCC('I','4','2','2');
 
     /* Get a new picture */
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
 
     if( p_pic == NULL ) return NULL;
 
@@ -650,7 +650,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;
 
-    p_dec->pf_picture_link( p_dec, p_pic );
+    decoder_LinkPicture( p_dec, p_pic );
 
     pp_buf[0] = p_pic->p[0].p_pixels;
     pp_buf[1] = p_pic->p[1].p_pixels;
index 244ee101fd446a6cc2fb8f8aef37cfa9932ef774..7895eb6427965d3e1601750c79decb01e4505216 100644 (file)
@@ -202,7 +202,7 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 //    p_sys->p_decoder->sync();
     if( p_block->i_flags & BLOCK_FLAG_END_OF_FRAME )
     {
-        p_pic = p_dec->pf_vout_buffer_new( p_dec );
+        p_pic = decoder_NewPicture( p_dec );
         if( !p_pic )
         {
             block_Release( p_block );
index 7ed1c03e6c9e1b58202064ab6a1a5d15b5fefe0c..7fe5f0794d53a40f7640d58b60ef3445ba7b2033 100644 (file)
@@ -206,7 +206,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     }
 
     /* Get a new picture */
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
     if( !p_pic ) goto error;
 
     /* Decode picture */
index 78531f4ec37fdb9cdd9ad3e528dbbd3644b434b9..e4e24cf359e45c927431f8057067a182bc6e8b10 100644 (file)
@@ -924,7 +924,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
  
     vlc_mutex_lock( &qt_mutex );
 
-    if( ( p_pic = p_dec->pf_vout_buffer_new( p_dec ) ) )
+    if( ( p_pic = decoder_NewPicture( p_dec ) ) )
     {
         p_sys->decpar.data                  = (Ptr)p_block->p_buffer;
         p_sys->decpar.bufferSize            = p_block->i_buffer;
index c1498644df2659eb9b0803bedc629ee968974eac..a83a40f54e1e893659a4b415caa2fb5834fa88cf 100644 (file)
@@ -289,7 +289,7 @@ static picture_t *DecodeFrame( decoder_t *p_dec, block_t *p_block )
     picture_t *p_pic;
 
     /* Get a new picture */
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
     if( !p_pic )
     {
         block_Release( p_block );
index cc907e22291639c590a45824980e069214ec4aff..04d7e8467632cbb1c13a49b30d9d7e069ec6550f 100644 (file)
@@ -463,7 +463,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
 
     vlc_mutex_lock( &rm_mutex );
 
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
 
     if ( p_pic )
     {
index b89e7dfa9847aafced5ee0740e2628af66c1ca15..1725e3602b17e50cb32846ba08e0ff410b40c08b 100644 (file)
@@ -256,7 +256,7 @@ static void SchroFrameFree( SchroFrame *frame, void *priv)
     if( !p_free )
         return;
 
-    p_free->p_dec->pf_vout_buffer_del( p_free->p_dec, p_free->p_pic );
+    decoder_DeletePicture( p_free->p_dec, p_free->p_pic );
     free(p_free);
     (void)frame;
 }
@@ -274,7 +274,7 @@ static SchroFrame *CreateSchroFrameFromPic( decoder_t *p_dec )
     if( !p_schroframe )
         return NULL;
 
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
 
     if( !p_pic )
         return NULL;
index 82022e8873ebecde84bfd913f6e2901ebe3b4684..dcc558d25661a706e2bedea6920b047d461e7ecd 100644 (file)
@@ -171,7 +171,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                                      / p_surface->h;
 
     /* Get a new picture. */
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
     if ( p_pic == NULL ) goto error;
 
     switch ( p_surface->format->BitsPerPixel )
index a408ba9cc7e5666571a0f11b0078a2e15bbfd862..5b86788da131077a71ff0fe95a3ebceaa03c4c98 100644 (file)
@@ -266,7 +266,7 @@ static picture_t *DecodePacket( decoder_t *p_dec, block_t **pp_block,
         p_dec->fmt_out.i_codec = i_chroma;
 
         /* Get a new picture */
-        if( (p_pic = p_dec->pf_vout_buffer_new( p_dec )) )
+        if( (p_pic = decoder_NewPicture( p_dec )) )
         {
             tarkin_CopyPicture( p_dec, p_pic, rgb, i_stride );
 
index b3d2e9e0ee1a61eef8f07b05c836e9cc80a01c70..b6411c93a788ba85951922246b65c12de779282b 100644 (file)
@@ -495,7 +495,7 @@ static picture_t *DecodePacket( decoder_t *p_dec, ogg_packet *p_oggpacket )
         return NULL;
 
     /* Get a new picture */
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
     if( !p_pic ) return NULL;
 
     theora_CopyPicture( p_dec, p_pic, &yuv );
index 47adf0cd2be0ee5ec474b1815c675651cf07c4da..7941bc8e1d52d81a35112b2bfa845776e76e65ec 100644 (file)
@@ -378,7 +378,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                 mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );
 
                 p_pic->date = 0;
-                p_dec->pf_picture_link( p_dec, p_pic );
+                decoder_LinkPicture( p_dec, p_pic );
 
                 if( p_sys->p_synchro )
                 {
@@ -531,7 +531,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
                 if( p_sys->p_info->discard_fbuf &&
                     p_sys->p_info->discard_fbuf->id )
                 {
-                    p_dec->pf_picture_unlink( p_dec, p_sys->p_info->discard_fbuf->id );
+                    decoder_UnlinkPicture( p_dec, p_sys->p_info->discard_fbuf->id );
                 }
                 /* For still frames */
                 //if( state == STATE_END && p_pic ) p_pic->b_force = true;
@@ -703,7 +703,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
         fflush(p_sys->f_wd_nb);
     }
 #endif
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
 
     if( p_pic == NULL ) return NULL;
 
@@ -716,7 +716,7 @@ static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf )
     p_pic->format.i_frame_rate = p_dec->fmt_out.video.i_frame_rate;
     p_pic->format.i_frame_rate_base = p_dec->fmt_out.video.i_frame_rate_base;
 
-    p_dec->pf_picture_link( p_dec, p_pic );
+    decoder_LinkPicture( p_dec, p_pic );
 
     pp_buf[0] = p_pic->p[0].p_pixels;
     pp_buf[1] = p_pic->p[1].p_pixels;
index 2f899ba42c1f87bf083f6594471d6659a0b95647..dbe13d8ea6aee2a667eb898047f0b4c4adbcf5c8 100644 (file)
@@ -72,7 +72,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
     p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR;
     p_dec->fmt_out.i_codec = VLC_FOURCC('I','4','2','0');
 
-    p_pic = p_dec->pf_vout_buffer_new( p_dec );
+    p_pic = decoder_NewPicture( p_dec );
 
     if( p_block->i_buffer == kBufferSize )
     {
index b6054cba1a675ddabee18f37a5ef3576afb56d13..ef10f4c772ec93c2f27ad59c3b4ddbf8e4a13fc1 100644 (file)
@@ -161,6 +161,26 @@ struct decoder_owner_sys_t
 /*****************************************************************************
  * Public functions
  *****************************************************************************/
+picture_t *decoder_NewPicture( decoder_t *p_decoder )
+{
+    picture_t *p_picture = p_decoder->pf_vout_buffer_new( p_decoder );
+    if( !p_picture )
+        msg_Warn( p_decoder, "can't get output picture" );
+    return p_picture;
+}
+void decoder_DeletePicture( decoder_t *p_decoder, picture_t *p_picture )
+{
+    p_decoder->pf_vout_buffer_del( p_decoder, p_picture );
+}
+void decoder_LinkPicture( decoder_t *p_decoder, picture_t *p_picture )
+{
+    p_decoder->pf_picture_link( p_decoder, p_picture );
+}
+void decoder_UnlinkPicture( decoder_t *p_decoder, picture_t *p_picture )
+{
+    p_decoder->pf_picture_unlink( p_decoder, p_picture );
+}
+
 aout_buffer_t *decoder_NewAudioBuffer( decoder_t *p_decoder, int i_size )
 {
     if( !p_decoder->pf_aout_buffer_new )
@@ -169,8 +189,6 @@ aout_buffer_t *decoder_NewAudioBuffer( decoder_t *p_decoder, int i_size )
 }
 void decoder_DeleteAudioBuffer( decoder_t *p_decoder, aout_buffer_t *p_buffer )
 {
-    if( !p_decoder->pf_aout_buffer_del )
-        return;
     p_decoder->pf_aout_buffer_del( p_decoder, p_buffer );
 }
 
index 8eac704cb17e880c9ba0e98778bbd79c6ff0675d..e88d1759a3862f2d0cf7e0e42a53c974a7422b0b 100644 (file)
@@ -78,11 +78,14 @@ date_Init
 date_Move
 date_Set
 decoder_DeleteAudioBuffer
+decoder_DeletePicture
 decoder_DeleteSubpicture
 decoder_GetDisplayDate
 decoder_GetDisplayRate
 decoder_GetInputAttachments
+decoder_LinkPicture
 decoder_NewAudioBuffer
+decoder_NewPicture
 decoder_NewSubpicture
 decoder_SynchroChoose
 decoder_SynchroDate
@@ -93,6 +96,7 @@ decoder_SynchroNewPicture
 decoder_SynchroRelease
 decoder_SynchroReset
 decoder_SynchroTrash
+decoder_UnlinkPicture
 decode_URI
 decode_URI_duplicate
 demux_PacketizerDestroy