[vlc-commits] converter/tospdif: convert DTS 14bit to DTS 16bit

Thomas Guillem git at videolan.org
Wed Jul 11 13:36:31 CEST 2018


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Wed Jul 11 13:01:40 2018 +0200| [7af9abbecb62f8b77640786a222a78ea6ee29cf2] | committer: Thomas Guillem

converter/tospdif: convert DTS 14bit to DTS 16bit

DTS inside WAV (@44.1kHZ) use 14bits words and have a fsize of 4096 bytes for
1024 samples. This means there is no room to put the IEC61937 header (IEC frame
size = 4096 = fsize = 1024 samples x 4).

Before this commit, we sent the IEC61937 frame without the header, this worked
only for some receivers.

This commit converts the 14bit sample to 16bit in order to have room for the
IEC61937 header. The new fsize is 4096*14/16 = 3584, so there is room for the 8
bytes header (plus 0 padding until 4096).

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

 modules/audio_filter/converter/tospdif.c | 61 +++++++++++++++++++-------------
 1 file changed, 36 insertions(+), 25 deletions(-)

diff --git a/modules/audio_filter/converter/tospdif.c b/modules/audio_filter/converter/tospdif.c
index 20da0894bc..21ffb1c2ac 100644
--- a/modules/audio_filter/converter/tospdif.c
+++ b/modules/audio_filter/converter/tospdif.c
@@ -195,21 +195,19 @@ static void write_finalize( filter_t *p_filter, uint16_t i_data_type,
 {
     filter_sys_t *p_sys = p_filter->p_sys;
     assert( p_sys->p_out_buf != NULL );
+    assert( i_data_type != 0 );
     uint8_t *p_out = p_sys->p_out_buf->p_buffer;
 
     /* S/PDIF header */
-    if( i_data_type != 0 )
-    {
-        assert( p_sys->i_out_offset > SPDIF_HEADER_SIZE );
-        assert( i_length_mul == 1 || i_length_mul == 8 );
-
-        set_16( p_filter, &p_out[0], 0xf872 ); /* syncword 1 */
-        set_16( p_filter, &p_out[2], 0x4e1f ); /* syncword 2 */
-        set_16( p_filter, &p_out[4], i_data_type ); /* data type */
-        /* length in bits or bytes */
-        set_16( p_filter, &p_out[6],
-                  ( p_sys->i_out_offset - SPDIF_HEADER_SIZE ) * i_length_mul );
-    }
+    assert( p_sys->i_out_offset > SPDIF_HEADER_SIZE );
+    assert( i_length_mul == 1 || i_length_mul == 8 );
+
+    set_16( p_filter, &p_out[0], 0xf872 ); /* syncword 1 */
+    set_16( p_filter, &p_out[2], 0x4e1f ); /* syncword 2 */
+    set_16( p_filter, &p_out[4], i_data_type ); /* data type */
+    /* length in bits or bytes */
+    set_16( p_filter, &p_out[6],
+              ( p_sys->i_out_offset - SPDIF_HEADER_SIZE ) * i_length_mul );
 
     /* 0 padding */
     if( p_sys->i_out_offset < p_sys->p_out_buf->i_buffer )
@@ -417,23 +415,36 @@ static int write_buffer_dts( filter_t *p_filter, block_t *p_in_buf )
         return SPDIF_ERROR;
     }
 
-    if( p_in_buf->i_buffer == p_in_buf->i_nb_samples * 4 )
+    if( core.b_14b )
     {
-        /* No enough room to put the S/PDIF header. This is the case for DTS
-         * inside WAV. */
-        i_data_type = 0;
-    }
-    else if( p_in_buf->i_buffer + SPDIF_HEADER_SIZE > p_in_buf->i_nb_samples * 4 )
-        return SPDIF_ERROR;
+        if( p_in_buf->i_buffer > p_in_buf->i_nb_samples * 4 )
+            return SPDIF_ERROR;
+        if( write_init( p_filter, p_in_buf, p_in_buf->i_nb_samples * 4,
+                        p_in_buf->i_nb_samples ) )
+            return SPDIF_ERROR;
 
-    if( write_init( p_filter, p_in_buf, p_in_buf->i_nb_samples * 4,
-                    p_in_buf->i_nb_samples ) )
-        return SPDIF_ERROR;
+        uint8_t *p_out = &p_sys->p_out_buf->p_buffer[p_sys->i_out_offset];
+        ssize_t i_size = vlc_dts_header_Convert14b16b( p_out,
+                            p_sys->p_out_buf->i_buffer - p_sys->i_out_offset,
+                            p_in_buf->p_buffer, p_in_buf->i_buffer,
+                            p_filter->fmt_out.audio.i_format == VLC_CODEC_SPDIFL );
+        if( i_size < 0 )
+            return SPDIF_ERROR;
 
-    if( i_data_type == 0 )
-        p_sys->i_out_offset = 0;
+        p_sys->i_out_offset += i_size;
+        p_sys->p_out_buf->i_length += p_in_buf->i_length;
+    }
+    else
+    {
+        if( p_in_buf->i_buffer + SPDIF_HEADER_SIZE > p_in_buf->i_nb_samples * 4 )
+            return SPDIF_ERROR;
+
+        if( write_init( p_filter, p_in_buf, p_in_buf->i_nb_samples * 4,
+                        p_in_buf->i_nb_samples ) )
+            return SPDIF_ERROR;
+        write_buffer( p_filter, p_in_buf );
+    }
 
-    write_buffer( p_filter, p_in_buf );
     write_finalize( p_filter, i_data_type, 8 /* in bits */ );
     return SPDIF_SUCCESS;
 }



More information about the vlc-commits mailing list