vlc | branch: master | Francois Cartegnie <[email protected]> | Mon Mar 11 15:10:49 2019 +0100| [e23d066b5183f6cf6d75f1fbab5d938bd4dc5452] | committer: Francois Cartegnie
packetizer: dts: test and return sync word > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e23d066b5183f6cf6d75f1fbab5d938bd4dc5452 --- modules/audio_filter/converter/tospdif.c | 3 +- modules/packetizer/dts.c | 4 +- modules/packetizer/dts_header.c | 63 +++++++++++++------------------- modules/packetizer/dts_header.h | 13 ++++++- 4 files changed, 41 insertions(+), 42 deletions(-) diff --git a/modules/audio_filter/converter/tospdif.c b/modules/audio_filter/converter/tospdif.c index 9e9213f660..c468af79d6 100644 --- a/modules/audio_filter/converter/tospdif.c +++ b/modules/audio_filter/converter/tospdif.c @@ -414,7 +414,8 @@ static int write_buffer_dts( filter_t *p_filter, block_t *p_in_buf ) return SPDIF_ERROR; } - if( core.b_14b ) + if( core.syncword == DTS_SYNC_CORE_14BITS_BE || + core.syncword == DTS_SYNC_CORE_14BITS_LE ) { if( p_in_buf->i_buffer > p_in_buf->i_nb_samples * 4 ) return SPDIF_ERROR; diff --git a/modules/packetizer/dts.c b/modules/packetizer/dts.c index 89cb202523..c4204a6e31 100644 --- a/modules/packetizer/dts.c +++ b/modules/packetizer/dts.c @@ -208,7 +208,7 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) break; } - if( p_sys->dts.b_substream ) + if( p_sys->dts.syncword == DTS_SYNC_SUBSTREAM ) { msg_Warn( p_dec, "substream without the paired core stream, " "skip it" ); @@ -275,7 +275,7 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) vlc_dts_header_t next_header; if( vlc_dts_header_Parse( &next_header, p_header, VLC_DTS_HEADER_SIZE ) - == VLC_SUCCESS && next_header.b_substream ) + == VLC_SUCCESS && next_header.syncword == DTS_SYNC_SUBSTREAM ) { p_dec->fmt_out.i_profile = PROFILE_DTS_HD; p_sys->i_input_size += next_header.i_frame_size; diff --git a/modules/packetizer/dts_header.c b/modules/packetizer/dts_header.c index e1c905c7e2..3f24b1d602 100644 --- a/modules/packetizer/dts_header.c +++ b/modules/packetizer/dts_header.c @@ -94,42 +94,32 @@ static int Buf14To16( uint8_t *p_out, const uint8_t *p_in, int i_in, int i_le, return i_out; } -enum dts_bitsteam_type { - DTS_SYNC_CORE_BE, - DTS_SYNC_CORE_LE, - DTS_SYNC_CORE_14BITS_BE, - DTS_SYNC_CORE_14BITS_LE, - DTS_SYNC_SUBSTREAM, -}; - -static bool dts_header_IsSync( const uint8_t *p_buf, - enum dts_bitsteam_type *p_bitstream_type ) +static enum vlc_dts_syncword_e dts_header_getSyncword( const uint8_t *p_buf ) { if( memcmp( p_buf, "\x7F\xFE\x80\x01", 4 ) == 0 ) - *p_bitstream_type = DTS_SYNC_CORE_BE; + return DTS_SYNC_CORE_BE; else if( memcmp( p_buf, "\xFE\x7F\x01\x80", 4 ) == 0 ) - *p_bitstream_type = DTS_SYNC_CORE_LE; + return DTS_SYNC_CORE_LE; else if( memcmp( p_buf, "\x64\x58\x20\x25", 4 ) == 0 ) - *p_bitstream_type = DTS_SYNC_SUBSTREAM; + return DTS_SYNC_SUBSTREAM; else if( memcmp( p_buf, "\x1F\xFF\xE8\x00", 4 ) == 0 && p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 ) - *p_bitstream_type = DTS_SYNC_CORE_14BITS_BE; + return DTS_SYNC_CORE_14BITS_BE; else if( memcmp( p_buf, "\xFF\x1F\x00\xE8", 4 ) == 0 && (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 ) - *p_bitstream_type = DTS_SYNC_CORE_14BITS_LE; + return DTS_SYNC_CORE_14BITS_LE; else - return false; - return true; + return DTS_SYNC_NONE; } bool vlc_dts_header_IsSync( const void *p_buf, size_t i_buf ) { return i_buf >= 6 - && dts_header_IsSync( p_buf, &(enum dts_bitsteam_type) { 0 } ); + && dts_header_getSyncword( p_buf ) != DTS_SYNC_NONE; } static unsigned int dca_get_samplerate( uint8_t i_sfreq ) @@ -262,13 +252,13 @@ static int dts_header_ParseSubstream( vlc_dts_header_t *p_header, nuBits4ExSSFsize = bs_read( &s, 20 ); } memset( p_header, 0, sizeof(*p_header) ); - p_header->b_substream = true; + p_header->syncword = DTS_SYNC_SUBSTREAM; p_header->i_frame_size = nuBits4ExSSFsize + 1; return VLC_SUCCESS; } static int dts_header_ParseCore( vlc_dts_header_t *p_header, - const void *p_buffer, bool b_14b ) + const void *p_buffer) { bs_t s; bs_init( &s, p_buffer, VLC_DTS_HEADER_SIZE ); @@ -288,12 +278,12 @@ static int dts_header_ParseCore( vlc_dts_header_t *p_header, bool b_lfe = i_lff == 1 || i_lff == 2; - p_header->b_substream = false; - p_header->b_14b = b_14b; p_header->i_rate = dca_get_samplerate( i_sfreq ); p_header->i_bitrate = dca_get_bitrate( i_rate ); - p_header->i_frame_size = !b_14b ? ( i_fsize + 1 ) - : ( i_fsize + 1 ) * 16 / 14; + p_header->i_frame_size = i_fsize + 1; + if( p_header->syncword == DTS_SYNC_CORE_14BITS_LE || + p_header->syncword == DTS_SYNC_CORE_14BITS_BE ) + p_header->i_frame_size = p_header->i_frame_size * 16 / 14; /* See ETSI TS 102 114, table 5-2 */ p_header->i_frame_length = (i_nblks + 1) * 32; p_header->i_chan_mode = 0; @@ -315,47 +305,46 @@ ssize_t vlc_dts_header_Convert14b16b( void *p_dst, size_t i_dst, if( i_src <= VLC_DTS_HEADER_SIZE || i_size > i_dst ) return -1; - enum dts_bitsteam_type bitstream_type; - if( !dts_header_IsSync( p_src, &bitstream_type ) ) + enum vlc_dts_syncword_e syncword = dts_header_getSyncword( p_src ); + if( syncword == DTS_SYNC_NONE ) return -1; - if( bitstream_type != DTS_SYNC_CORE_14BITS_BE - && bitstream_type != DTS_SYNC_CORE_14BITS_LE ) + if( syncword != DTS_SYNC_CORE_14BITS_BE + && syncword != DTS_SYNC_CORE_14BITS_LE ) return -1; int i_ret = Buf14To16( p_dst, p_src, i_src, - bitstream_type == DTS_SYNC_CORE_14BITS_LE, b_out_le ); + syncword == DTS_SYNC_CORE_14BITS_LE, b_out_le ); return i_ret; } int vlc_dts_header_Parse( vlc_dts_header_t *p_header, const void *p_buffer, size_t i_buffer) { - enum dts_bitsteam_type bitstream_type; - if( i_buffer < VLC_DTS_HEADER_SIZE ) return VLC_EGENERIC; - if( !dts_header_IsSync( p_buffer, &bitstream_type ) ) + p_header->syncword = dts_header_getSyncword( p_buffer ); + if( p_header->syncword == DTS_SYNC_NONE ) return VLC_EGENERIC; - switch( bitstream_type ) + switch( p_header->syncword ) { case DTS_SYNC_CORE_LE: { uint8_t conv_buf[VLC_DTS_HEADER_SIZE]; BufLeToBe( conv_buf, p_buffer, VLC_DTS_HEADER_SIZE ); - return dts_header_ParseCore( p_header, conv_buf, false ); + return dts_header_ParseCore( p_header, conv_buf ); } case DTS_SYNC_CORE_BE: - return dts_header_ParseCore( p_header, p_buffer, false ); + return dts_header_ParseCore( p_header, p_buffer ); case DTS_SYNC_CORE_14BITS_BE: case DTS_SYNC_CORE_14BITS_LE: { uint8_t conv_buf[VLC_DTS_HEADER_SIZE]; Buf14To16( conv_buf, p_buffer, VLC_DTS_HEADER_SIZE, - bitstream_type == DTS_SYNC_CORE_14BITS_LE, 0 ); - return dts_header_ParseCore( p_header, conv_buf, true ); + p_header->syncword == DTS_SYNC_CORE_14BITS_LE, 0 ); + return dts_header_ParseCore( p_header, conv_buf ); } case DTS_SYNC_SUBSTREAM: return dts_header_ParseSubstream( p_header, p_buffer ); diff --git a/modules/packetizer/dts_header.h b/modules/packetizer/dts_header.h index 2fa537379d..203cec67b1 100644 --- a/modules/packetizer/dts_header.h +++ b/modules/packetizer/dts_header.h @@ -27,10 +27,19 @@ #define PROFILE_DTS 0 #define PROFILE_DTS_HD 1 +enum vlc_dts_syncword_e +{ + DTS_SYNC_NONE = 0, + DTS_SYNC_CORE_BE, + DTS_SYNC_CORE_LE, + DTS_SYNC_CORE_14BITS_BE, + DTS_SYNC_CORE_14BITS_LE, + DTS_SYNC_SUBSTREAM, +}; + typedef struct { - bool b_substream; - bool b_14b; + enum vlc_dts_syncword_e syncword; unsigned int i_rate; unsigned int i_bitrate; unsigned int i_frame_size; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
