audio_filter/converter/dtstospdif.c: Fix odd frame sized DTS conversion to SPDIF...
authorPierre d'Herbemont <pdherbemont@videolan.org>
Sun, 30 Dec 2007 04:25:04 +0000 (04:25 +0000)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Sun, 30 Dec 2007 04:25:04 +0000 (04:25 +0000)
THANKS
modules/audio_filter/converter/dtstospdif.c

diff --git a/THANKS b/THANKS
index 252943b..1979d8c 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -122,6 +122,7 @@ Jonas Larsen <jonas at vrt.dk> - Danish translation
 Jouni Kähkönen - Finnish translation
 Julien Blache <jb at technologeek.org> - disc ejection code
 Julien Plissonneau Duquène - JACK audio input module 
+Julien Robert <jul at mac.com> - DTS to SPDIF fixes.
 Kang Jeong-Hee <keizie at gmail dot com> - Korean translation
 Kenneth Ostby <kenneo -at- idi -dot- ntnu -dot- no> - Audioscrobbler plugin
 Kenneth Self <kens at campoz DoT. fslife _dOt co dOT- uk> - BDA capture plugin
index ac1e647..81c35d7 100644 (file)
@@ -156,6 +156,7 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter,
 
     for( i_frame = 0; i_frame < 3; i_frame++ )
     {
+        uint16_t i_length_padded = i_length;
         byte_t * p_out = p_out_buf->p_buffer + (i_frame * i_fz);
         byte_t * p_in = p_filter->p_sys->p_buf + (i_frame * i_length);
 
@@ -170,7 +171,7 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter,
         if( p_filter->output.i_format == VLC_FOURCC('s','p','d','b') )
         {
             p_filter->p_libvlc->pf_memcpy( p_out, p_sync_be, 6 );
-            p_out[5] = i_ac5_spdif_type;
+            p_out[4] = i_ac5_spdif_type;
             p_out[6] = (( i_length ) >> 5 ) & 0xFF;
             p_out[7] = ( i_length << 3 ) & 0xFF;
         }
@@ -202,6 +203,13 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter,
                 p_tmp += 2; p_in += 2;
             }
 #endif
+            /* If i_length is odd, we have to adjust swapping a bit.. */
+            if( i_length & 1 )
+            {
+                p_out[8+i_length-1] = 0;
+                p_out[8+i_length] = p_in[i_length-1];
+                i_length_padded++;
+            }
         }
         else
         {
@@ -210,8 +218,8 @@ static void DoWork( aout_instance_t * p_aout, aout_filter_t * p_filter,
 
         if( i_fz > i_length + 8 )
         {
-            p_filter->p_libvlc->pf_memset( p_out + 8 + i_length, 0,
-                                        i_fz - i_length - 8 );
+            p_filter->p_libvlc->pf_memset( p_out + 8 + i_length_padded, 0,
+                                        i_fz - i_length_padded - 8 );
         }
     }