[vlc-commits] rawvideo: avoid casting function pointers

Rémi Denis-Courmont git at videolan.org
Thu Apr 3 22:57:29 CEST 2014


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Apr  3 23:56:27 2014 +0300| [470602d5cfc6b1069ab2a0591271345b9550d7d0] | committer: Rémi Denis-Courmont

rawvideo: avoid casting function pointers

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=470602d5cfc6b1069ab2a0591271345b9550d7d0
---

 modules/codec/rawvideo.c |  115 +++++++++++++++++++++-------------------------
 1 file changed, 53 insertions(+), 62 deletions(-)

diff --git a/modules/codec/rawvideo.c b/modules/codec/rawvideo.c
index c364059..331c216 100644
--- a/modules/codec/rawvideo.c
+++ b/modules/codec/rawvideo.c
@@ -37,9 +37,6 @@
  *****************************************************************************/
 struct decoder_sys_t
 {
-    /* Module mode */
-    bool b_packetizer;
-
     /*
      * Input properties
      */
@@ -60,12 +57,7 @@ struct decoder_sys_t
  ****************************************************************************/
 static int  OpenDecoder   ( vlc_object_t * );
 static int  OpenPacketizer( vlc_object_t * );
-static void CloseDecoder  ( vlc_object_t * );
-
-static void *DecodeBlock  ( decoder_t *, block_t ** );
-
-static picture_t *DecodeFrame( decoder_t *, block_t * );
-static block_t   *SendFrame  ( decoder_t *, block_t * );
+static void CloseCommon   ( vlc_object_t * );
 
 /*****************************************************************************
  * Module descriptor
@@ -75,21 +67,19 @@ vlc_module_begin ()
     set_capability( "decoder", 50 )
     set_category( CAT_INPUT )
     set_subcategory( SUBCAT_INPUT_VCODEC )
-    set_callbacks( OpenDecoder, CloseDecoder )
+    set_callbacks( OpenDecoder, CloseCommon )
 
     add_submodule ()
     set_description( N_("Pseudo raw video packetizer") )
     set_capability( "packetizer", 100 )
-    set_callbacks( OpenPacketizer, CloseDecoder )
+    set_callbacks( OpenPacketizer, CloseCommon )
 vlc_module_end ()
 
-/*****************************************************************************
- * OpenDecoder: probe the decoder and return score
- *****************************************************************************/
-static int OpenDecoder( vlc_object_t *p_this )
+/**
+ * Common initialization for decoder and packetizer
+ */
+static int OpenCommon( decoder_t *p_dec )
 {
-    decoder_t *p_dec = (decoder_t*)p_this;
-
     const vlc_chroma_description_t *dsc =
         vlc_fourcc_GetChromaDescription( p_dec->fmt_in.i_codec );
     if( dsc == NULL || dsc->plane_count == 0 )
@@ -144,27 +134,10 @@ static int OpenDecoder( vlc_object_t *p_this )
         p_sys->size += pitch * lines;
     }
 
-    /* Set callbacks */
-    p_dec->pf_decode_video = (picture_t *(*)(decoder_t *, block_t **))
-        DecodeBlock;
-    p_dec->pf_packetize    = (block_t *(*)(decoder_t *, block_t **))
-        DecodeBlock;
     p_dec->p_sys           = p_sys;
-
     return VLC_SUCCESS;
 }
 
-static int OpenPacketizer( vlc_object_t *p_this )
-{
-    decoder_t *p_dec = (decoder_t*)p_this;
-
-    int i_ret = OpenDecoder( p_this );
-
-    if( i_ret == VLC_SUCCESS ) p_dec->p_sys->b_packetizer = true;
-
-    return i_ret;
-}
-
 /****************************************************************************
  * DecodeBlock: the whole thing
  ****************************************************************************
@@ -173,13 +146,11 @@ static int OpenPacketizer( vlc_object_t *p_this )
 static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
-    block_t *p_block;
-    void *p_buf;
-
-    if( !pp_block || !*pp_block ) return NULL;
 
-    p_block = *pp_block;
+    if( pp_block == NULL || *pp_block == NULL )
+        return NULL;
 
+    block_t *p_block = *pp_block;
 
     if( p_block->i_pts <= VLC_TS_INVALID && p_block->i_dts <= VLC_TS_INVALID &&
         !date_Get( &p_sys->pts ) )
@@ -212,20 +183,8 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
         return NULL;
     }
 
-    if( p_sys->b_packetizer )
-    {
-        p_buf = SendFrame( p_dec, p_block );
-    }
-    else
-    {
-        p_buf = DecodeFrame( p_dec, p_block );
-    }
-
-    /* Date management: 1 frame per packet */
-    date_Increment( &p_sys->pts, 1 );
     *pp_block = NULL;
-
-    return p_buf;
+    return p_block;
 }
 
 /*****************************************************************************
@@ -272,14 +231,17 @@ static void FillPicture( decoder_t *p_dec, block_t *p_block, picture_t *p_pic )
 /*****************************************************************************
  * DecodeFrame: decodes a video frame.
  *****************************************************************************/
-static picture_t *DecodeFrame( decoder_t *p_dec, block_t *p_block )
+static picture_t *DecodeFrame( decoder_t *p_dec, block_t **pp_block )
 {
+    block_t *p_block = DecodeBlock( p_dec, pp_block );
+    if( p_block == NULL )
+        return NULL;
+
     decoder_sys_t *p_sys = p_dec->p_sys;
-    picture_t *p_pic;
 
     /* Get a new picture */
-    p_pic = decoder_NewPicture( p_dec );
-    if( !p_pic )
+    picture_t *p_pic = decoder_NewPicture( p_dec );
+    if( p_pic == NULL )
     {
         block_Release( p_block );
         return NULL;
@@ -287,7 +249,10 @@ static picture_t *DecodeFrame( decoder_t *p_dec, block_t *p_block )
 
     FillPicture( p_dec, p_block, p_pic );
 
-    p_pic->date = date_Get( &p_sys->pts );
+    /* Date management: 1 frame per packet */
+    p_pic->date = date_Get( &p_dec->p_sys->pts );
+    date_Increment( &p_sys->pts, 1 );
+
     if( p_block->i_flags & BLOCK_FLAG_INTERLACED_MASK )
     {
         p_pic->b_progressive = false;
@@ -304,14 +269,30 @@ static picture_t *DecodeFrame( decoder_t *p_dec, block_t *p_block )
     return p_pic;
 }
 
+static int OpenDecoder( vlc_object_t *p_this )
+{
+    decoder_t *p_dec = (decoder_t *)p_this;
+
+    int ret = OpenCommon( p_dec );
+    if( ret == VLC_SUCCESS )
+        p_dec->pf_decode_video = DecodeFrame;
+    return ret;
+}
+
 /*****************************************************************************
  * SendFrame: send a video frame to the stream output.
  *****************************************************************************/
-static block_t *SendFrame( decoder_t *p_dec, block_t *p_block )
+static block_t *SendFrame( decoder_t *p_dec, block_t **pp_block )
 {
+    block_t *p_block = DecodeBlock( p_dec, pp_block );
+    if( p_block == NULL )
+        return NULL;
+
     decoder_sys_t *p_sys = p_dec->p_sys;
 
+    /* Date management: 1 frame per packet */
     p_block->i_dts = p_block->i_pts = date_Get( &p_sys->pts );
+    date_Increment( &p_sys->pts, 1 );
 
     if( p_sys->b_invert )
     {
@@ -344,10 +325,20 @@ static block_t *SendFrame( decoder_t *p_dec, block_t *p_block )
     return p_block;
 }
 
-/*****************************************************************************
- * CloseDecoder: decoder destruction
- *****************************************************************************/
-static void CloseDecoder( vlc_object_t *p_this )
+static int OpenPacketizer( vlc_object_t *p_this )
+{
+    decoder_t *p_dec = (decoder_t *)p_this;
+
+    int ret = OpenCommon( p_dec );
+    if( ret == VLC_SUCCESS )
+        p_dec->pf_packetize = SendFrame;
+    return ret;
+}
+
+/**
+ * Common deinitialization
+ */
+static void CloseCommon( vlc_object_t *p_this )
 {
     decoder_t *p_dec = (decoder_t*)p_this;
     free( p_dec->p_sys );



More information about the vlc-commits mailing list