]> git.sesse.net Git - vlc/blobdiff - modules/codec/araw.c
Major change of the channels management. p_format->i_channels disappeares
[vlc] / modules / codec / araw.c
index 912d1e0305fe2eff606145b5eb7fc0351450bafc..fd702664e075707d642be5f910ef0f738d03b77e 100644 (file)
@@ -2,7 +2,7 @@
  * araw.c: Pseudo audio decoder; for raw pcm data
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: araw.c,v 1.1 2002/10/14 21:59:44 fenrir Exp $
+ * $Id: araw.c,v 1.7 2002/11/14 22:38:47 massiot Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *      
@@ -52,7 +52,7 @@ typedef struct adec_thread_s
     waveformatex_t  format;
 
     /* The bit stream structure handles the PES stream at the bit level */
-    bit_stream_t        bit_stream;
+//    bit_stream_t        bit_stream;
 
     /* Input properties */
     decoder_fifo_t *p_fifo;
@@ -84,6 +84,18 @@ vlc_module_begin();
     set_callbacks( OpenDecoder, NULL );
 vlc_module_end();
 
+
+static int pi_channels_maps[6] =
+{
+    0,
+    AOUT_CHAN_CENTER,
+    AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT,
+    AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER,
+    AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT,
+    AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
+     | AOUT_CHAN_REARLEFT | AOUT_CHAN_REARLEFT 
+};
+
 /*****************************************************************************
  * OpenDecoder: probe the decoder and return score
  *****************************************************************************
@@ -182,50 +194,10 @@ static void GetWaveFormatEx( waveformatex_t *p_wh,
     }
 }
 
-/* get the first pes from fifo */
-static pes_packet_t *PESGetFirst( decoder_fifo_t *p_fifo )
-{
-    pes_packet_t *p_pes;
-
-    vlc_mutex_lock( &p_fifo->data_lock );
-
-    /* if fifo is empty wait */ 
-    while( !p_fifo->p_first )
-    {
-        if( p_fifo->b_die )
-        {
-            vlc_mutex_unlock( &p_fifo->data_lock );
-            return NULL;
-        }
-        vlc_cond_wait( &p_fifo->data_wait, &p_fifo->data_lock );
-    }
-    p_pes = p_fifo->p_first;
-
-    vlc_mutex_unlock( &p_fifo->data_lock );
-
-    return p_pes;
-}
-static int PESGetSize( pes_packet_t *p_pes )
-{
-    data_packet_t *p_data;
-    int i_size = 0;
-
-    if( !p_pes )
-    {
-        return( 0 );
-    }
-
-    for( p_data = p_pes->p_first; p_data != NULL; p_data = p_data->p_next )
-    {
-        i_size += p_data->p_payload_end - p_data->p_payload_start;
-    }
-
-    return( i_size );
-}
-
 /*****************************************************************************
  * InitThread: initialize data before entering main loop
  *****************************************************************************/
+
 static int InitThread( adec_thread_t * p_adec )
 {
 
@@ -264,14 +236,25 @@ static int InitThread( adec_thread_t * p_adec )
         case( 4 ):
             p_adec->output_format.i_format = VLC_FOURCC('s','3','2','l');
             break;
-
         case( 1 ):
+            p_adec->output_format.i_format = VLC_FOURCC('u','8',' ',' ');
+            break;
         default:
             msg_Err( p_adec->p_fifo, "bad parameters(bits/sample)" );
             return( -1 );
     }
     p_adec->output_format.i_rate = p_adec->format.i_samplespersec;
-    p_adec->output_format.i_channels = p_adec->format.i_channels;
+
+    if( p_adec->format.i_channels <= 0 || 
+            p_adec->format.i_channels > 5 )
+    {
+        msg_Err( p_adec->p_fifo, "bad channels count(1-5)" );
+        return( -1 );
+    }
+
+    p_adec->output_format.i_physical_channels = 
+            p_adec->output_format.i_original_channels =
+            pi_channels_maps[p_adec->format.i_channels];
     p_adec->p_aout = NULL;
     p_adec->p_aout_input = NULL;
 
@@ -287,12 +270,44 @@ static int InitThread( adec_thread_t * p_adec )
     }
 
     /* Init the BitStream */
-    InitBitstream( &p_adec->bit_stream, p_adec->p_fifo,
-                   NULL, NULL );
+//    InitBitstream( &p_adec->bit_stream, p_adec->p_fifo,
+//                   NULL, NULL );
 
     return( 0 );
 }
 
+static void GetPESData( u8 *p_buf, int i_max, pes_packet_t *p_pes )
+{
+    int i_copy;
+    int i_count;
+
+    data_packet_t   *p_data;
+
+    i_count = 0;
+    p_data = p_pes->p_first;
+    while( p_data != NULL && i_count < i_max )
+    {
+
+        i_copy = __MIN( p_data->p_payload_end - p_data->p_payload_start, i_max - i_count );
+        
+        if( i_copy > 0 )
+        {
+            memcpy( p_buf,
+                    p_data->p_payload_start,
+                    i_copy );
+        }
+
+        p_data = p_data->p_next;
+        i_count += i_copy;
+        p_buf   += i_copy;
+    }
+
+    if( i_count < i_max )
+    {
+        memset( p_buf, 0, i_max - i_count );
+    }
+}
+
 /*****************************************************************************
  * DecodeThread: decodes a frame
  *****************************************************************************/
@@ -301,12 +316,18 @@ static void DecodeThread( adec_thread_t *p_adec )
     aout_buffer_t   *p_aout_buffer;
     int             i_samples; // per channels
     int             i_size;
+
     pes_packet_t    *p_pes;
 
     /* **** get samples count **** */
-    p_pes = PESGetFirst( p_adec->p_fifo );
-    
-    i_size = PESGetSize( p_pes );
+    input_ExtractPES( p_adec->p_fifo, &p_pes );
+    if( !p_pes )
+    {
+        p_adec->p_fifo->b_error = 1;
+        return;
+    }
+    i_size = p_pes->i_pes_size;
+
     if( p_adec->format.i_blockalign > 0 )
     {
         i_size -= i_size % p_adec->format.i_blockalign;
@@ -349,11 +370,13 @@ static void DecodeThread( adec_thread_t *p_adec )
     p_aout_buffer->start_date = aout_DateGet( &p_adec->date );
     p_aout_buffer->end_date = aout_DateIncrement( &p_adec->date,
                                                   i_samples );
-    GetChunk( &p_adec->bit_stream,
-              p_aout_buffer->p_buffer,
-              p_aout_buffer->i_nb_bytes );
+
+    GetPESData( p_aout_buffer->p_buffer, p_aout_buffer->i_nb_bytes, p_pes );
 
     aout_DecPlay( p_adec->p_aout, p_adec->p_aout_input, p_aout_buffer );
+
+
+    input_DeletePES( p_adec->p_fifo->p_packets_mgt, p_pes );
 }