]> git.sesse.net Git - vlc/blobdiff - src/input/decoder.c
* ALL: use rgb mask members in video_format_t.
[vlc] / src / input / decoder.c
index 345c47024f3f9f844da115fd0c4052ed9492ef04..3eee0e8fecd121037cc88fd7f05d3b35ce0c7b74 100644 (file)
@@ -5,7 +5,7 @@
  * $Id$
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
- *          Gildas Bazin <gbazin@netcourrier.com>
+ *          Gildas Bazin <gbazin@videolan.org>
  *          Laurent Aimar <fenrir@via.ecp.fr>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -235,9 +235,9 @@ void input_DecoderDecode( decoder_t * p_dec, block_t *p_block )
     }
     else
     {
-        if( p_dec->b_error || p_block->i_buffer <= 0 )
+        if( p_dec->b_error || (p_block && p_block->i_buffer <= 0) )
         {
-            block_Release( p_block );
+            if( p_block ) block_Release( p_block );
         }
         else
         {
@@ -503,7 +503,9 @@ static int DecoderThread( decoder_t * p_dec )
  */
 static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
 {
-    if( p_block->i_buffer <= 0 )
+    int i_rate = p_block ? p_block->i_rate : 1000;
+
+    if( p_block && p_block->i_buffer <= 0 )
     {
         block_Release( p_block );
         return VLC_SUCCESS;
@@ -513,13 +515,14 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
     {
         block_t *p_sout_block;
 
-        while( (p_sout_block = p_dec->pf_packetize( p_dec, &p_block )) )
+        while( ( p_sout_block =
+                     p_dec->pf_packetize( p_dec, p_block ? &p_block : 0 ) ) )
         {
             if( !p_dec->p_owner->p_sout_input )
             {
                 es_format_Copy( &p_dec->p_owner->sout, &p_dec->fmt_out );
 
-                p_dec->p_owner->sout.i_group =p_dec->fmt_in.i_group;
+                p_dec->p_owner->sout.i_group = p_dec->fmt_in.i_group;
                 p_dec->p_owner->sout.i_id = p_dec->fmt_in.i_id;
                 if( p_dec->fmt_in.psz_language )
                 {
@@ -548,9 +551,10 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
 
             while( p_sout_block )
             {
-                block_t       *p_next = p_sout_block->p_next;
+                block_t *p_next = p_sout_block->p_next;
 
                 p_sout_block->p_next = NULL;
+                p_sout_block->i_rate = i_rate;
 
                 sout_InputSendBuffer( p_dec->p_owner->p_sout_input,
                                       p_sout_block );
@@ -589,6 +593,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
                 {
                     block_t *p_next = p_packetized_block->p_next;
                     p_packetized_block->p_next = NULL;
+                    p_packetized_block->i_rate = i_rate;
 
                     while( (p_aout_buf = p_dec->pf_decode_audio( p_dec,
                                                        &p_packetized_block )) )
@@ -624,6 +629,7 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
                 {
                     block_t *p_next = p_packetized_block->p_next;
                     p_packetized_block->p_next = NULL;
+                    p_packetized_block->i_rate = i_rate;
 
                     while( (p_pic = p_dec->pf_decode_video( p_dec,
                                                        &p_packetized_block )) )
@@ -674,8 +680,6 @@ static int DecoderDecode( decoder_t *p_dec, block_t *p_block )
  */
 static void DeleteDecoder( decoder_t * p_dec )
 {
-    vlc_object_detach( p_dec );
-
     msg_Dbg( p_dec, "killing decoder fourcc `%4.4s', %d PES in FIFO",
              (char*)&p_dec->fmt_in.i_codec,
              p_dec->p_owner->p_fifo->i_depth );
@@ -684,7 +688,7 @@ static void DeleteDecoder( decoder_t * p_dec )
     block_FifoEmpty( p_dec->p_owner->p_fifo );
     block_FifoRelease( p_dec->p_owner->p_fifo );
 
-   /* Cleanup */
+    /* Cleanup */
     if( p_dec->p_owner->p_aout_input )
         aout_DecDelete( p_dec->p_owner->p_aout, p_dec->p_owner->p_aout_input );
 
@@ -739,6 +743,8 @@ static void DeleteDecoder( decoder_t * p_dec )
         vlc_object_destroy( p_dec->p_owner->p_packetizer );
     }
 
+    vlc_object_detach( p_dec );
+
     free( p_dec->p_owner );
 }
 
@@ -823,6 +829,13 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
             p_dec->b_error = VLC_TRUE;
             return NULL;
         }
+
+        if( p_sys->video.i_rmask )
+            p_sys->p_vout->render.i_rmask = p_sys->video.i_rmask;
+        if( p_sys->video.i_gmask )
+            p_sys->p_vout->render.i_gmask = p_sys->video.i_gmask;
+        if( p_sys->video.i_bmask )
+            p_sys->p_vout->render.i_bmask = p_sys->video.i_bmask;
     }
 
     /* Get a new picture */