Hugo Beauzée-Luyssen pushed to branch 3.0.x at VideoLAN / VLC
Commits: 264b6c63 by Francois Cartegnie at 2021-11-11T11:56:36+00:00 packetizer: dts: test and return sync word (cherry picked from commit e23d066b5183f6cf6d75f1fbab5d938bd4dc5452) Signed-off-by: Marvin Scholz <[email protected]> - - - - - 05150278 by Francois Cartegnie at 2021-11-11T11:56:36+00:00 packetizer_helper: add custom state offset (cherry picked from commit 0ab18a89d6cbef7d88a77061334f59d7d84cf2de) Signed-off-by: Marvin Scholz <[email protected]> - - - - - 340583eb by Francois Cartegnie at 2021-11-11T11:56:36+00:00 packetizer: dts: store substream header size (cherry picked from commit fcea1a345187062c49cf6747c8bff3106f3e5bf4) Signed-off-by: Marvin Scholz <[email protected]> - - - - - 73ec8e89 by Francois Cartegnie at 2021-11-11T11:56:36+00:00 packetizer: dts: handle substream in a dedicated state (cherry picked from commit 516246a4bc518386c56854b90aa2a2db3522c8a0) Signed-off-by: Marvin Scholz <[email protected]> - - - - - 865f5423 by Francois Cartegnie at 2021-11-11T11:56:36+00:00 packetizer: dts: split second sync substream state (cherry picked from commit 1f42cfc37622602babf1f50338a19981150f2457) Signed-off-by: Marvin Scholz <[email protected]> - - - - - ee3c348a by Francois Cartegnie at 2021-11-11T11:56:36+00:00 packetizer: dts: renaming and store second header (cherry picked from commit 4b0798f6875d48c90641dfa5106bf4d0f9f6a7ce) Signed-off-by: Marvin Scholz <[email protected]> - - - - - 6572382a by Francois Cartegnie at 2021-11-11T11:56:36+00:00 packetizer: dts: add LBR header parser (cherry picked from commit 60cca0eadead0682e6625f825f6c7294999a49ee) Signed-off-by: Marvin Scholz <[email protected]> - - - - - a108715f by Francois Cartegnie at 2021-11-11T11:56:36+00:00 packetizer: dts: handle LBR (fix #21973) (cherry picked from commit ddf8716a0d749e9af01b6d1a32f6f99ab7aed340) Signed-off-by: Marvin Scholz <[email protected]> - - - - - 5 changed files: - modules/audio_filter/converter/tospdif.c - modules/packetizer/dts.c - modules/packetizer/dts_header.c - modules/packetizer/dts_header.h - modules/packetizer/packetizer_helper.h Changes: ===================================== 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; ===================================== modules/packetizer/dts.c ===================================== @@ -68,10 +68,16 @@ struct decoder_sys_t mtime_t i_pts; bool b_discontinuity; - vlc_dts_header_t dts; + vlc_dts_header_t first, second; size_t i_input_size; }; +enum +{ + STATE_SYNC_SUBSTREAM_EXTENSIONS = STATE_CUSTOM_FIRST, + STATE_NEXT_SYNC_SUBSTREAM_EXTENSIONS, +}; + static void PacketizeFlush( decoder_t *p_dec ) { decoder_sys_t *p_sys = p_dec->p_sys; @@ -87,33 +93,33 @@ static block_t *GetOutBuffer( decoder_t *p_dec ) decoder_sys_t *p_sys = p_dec->p_sys; if( !p_sys->b_date_set - || p_dec->fmt_out.audio.i_rate != p_sys->dts.i_rate ) + || p_dec->fmt_out.audio.i_rate != p_sys->first.i_rate ) { msg_Dbg( p_dec, "DTS samplerate:%d bitrate:%d", - p_sys->dts.i_rate, p_sys->dts.i_bitrate ); + p_sys->first.i_rate, p_sys->first.i_bitrate ); - date_Init( &p_sys->end_date, p_sys->dts.i_rate, 1 ); + date_Init( &p_sys->end_date, p_sys->first.i_rate, 1 ); date_Set( &p_sys->end_date, p_sys->i_pts ); p_sys->b_date_set = true; } - p_dec->fmt_out.audio.i_rate = p_sys->dts.i_rate; - if( p_dec->fmt_out.audio.i_bytes_per_frame < p_sys->dts.i_frame_size ) - p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->dts.i_frame_size; - p_dec->fmt_out.audio.i_frame_length = p_sys->dts.i_frame_length; + p_dec->fmt_out.audio.i_rate = p_sys->first.i_rate; + if( p_dec->fmt_out.audio.i_bytes_per_frame < p_sys->first.i_frame_size ) + p_dec->fmt_out.audio.i_bytes_per_frame = p_sys->first.i_frame_size; + p_dec->fmt_out.audio.i_frame_length = p_sys->first.i_frame_length; - p_dec->fmt_out.audio.i_chan_mode = p_sys->dts.i_chan_mode; - p_dec->fmt_out.audio.i_physical_channels = p_sys->dts.i_physical_channels; + p_dec->fmt_out.audio.i_chan_mode = p_sys->first.i_chan_mode; + p_dec->fmt_out.audio.i_physical_channels = p_sys->first.i_physical_channels; p_dec->fmt_out.audio.i_channels = popcount( p_dec->fmt_out.audio.i_physical_channels ); - p_dec->fmt_out.i_bitrate = p_sys->dts.i_bitrate; + p_dec->fmt_out.i_bitrate = p_sys->first.i_bitrate; block_t *p_block = block_Alloc( p_sys->i_input_size ); if( p_block == NULL ) return NULL; - p_block->i_nb_samples = p_sys->dts.i_frame_length; + p_block->i_nb_samples = p_sys->first.i_frame_length; p_block->i_pts = p_block->i_dts = date_Get( &p_sys->end_date ); p_block->i_length = date_Increment( &p_sys->end_date, p_block->i_nb_samples ) - p_block->i_pts; @@ -198,7 +204,7 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) } /* Check if frame is valid and get frame info */ - if( vlc_dts_header_Parse( &p_sys->dts, p_header, + if( vlc_dts_header_Parse( &p_sys->first, p_header, VLC_DTS_HEADER_SIZE ) != VLC_SUCCESS ) { msg_Dbg( p_dec, "emulated sync word" ); @@ -207,20 +213,56 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) break; } - if( p_sys->dts.b_substream ) + if( p_sys->first.syncword == DTS_SYNC_SUBSTREAM ) + p_sys->i_state = STATE_SYNC_SUBSTREAM_EXTENSIONS; + else + p_sys->i_state = STATE_NEXT_SYNC; + p_sys->i_input_size = p_sys->i_next_offset = p_sys->first.i_frame_size; + break; + + case STATE_SYNC_SUBSTREAM_EXTENSIONS: + /* Peek into the substream extension (sync + header size < frame_size) */ + if( block_PeekOffsetBytes( &p_sys->bytestream, + p_sys->first.i_substream_header_size, + p_header, + VLC_DTS_HEADER_SIZE ) != VLC_SUCCESS ) + { + /* Need more data */ + return NULL; + } + + vlc_dts_header_t xssheader; + if( vlc_dts_header_Parse( &xssheader, p_header, + VLC_DTS_HEADER_SIZE ) != VLC_SUCCESS ) { - msg_Warn( p_dec, "substream without the paired core stream, " - "skip it" ); + msg_Dbg( p_dec, "emulated substream sync word, can't find extension" ); + block_SkipByte( &p_sys->bytestream ); p_sys->i_state = STATE_NOSYNC; - if( block_SkipBytes( &p_sys->bytestream, - p_sys->dts.i_frame_size ) != VLC_SUCCESS ) - return NULL; break; } - p_sys->i_input_size = p_sys->i_next_offset = p_sys->dts.i_frame_size; - p_sys->i_state = STATE_NEXT_SYNC; - /* fallthrough */ + if( xssheader.syncword == DTS_SYNC_SUBSTREAM_LBR ) + { + /* + * LBR exists as independant SUBSTREAM. It is seen valid + * only when SUBSTREAM[LBR]..SUBTREAM. + * CORE...SUBSTREAM is regular extension. + * SUBSTREAM...CORE is sync issue. + */ + p_dec->fmt_out.i_profile = PROFILE_DTS_EXPRESS; + p_sys->first.i_rate = xssheader.i_rate; + p_sys->first.i_frame_length = xssheader.i_frame_length; + p_sys->i_state = STATE_NEXT_SYNC; + break; + } + + msg_Warn( p_dec, "substream without the paired core stream, skip it" ); + p_sys->i_state = STATE_NOSYNC; + p_dec->fmt_out.i_profile = PROFILE_DTS; + if( block_SkipBytes( &p_sys->bytestream, + p_sys->first.i_frame_size ) != VLC_SUCCESS ) + return NULL; + break; case STATE_NEXT_SYNC: /* Check if next expected frame contains the sync word */ @@ -250,13 +292,13 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) if( !vlc_dts_header_IsSync( p_header, VLC_DTS_HEADER_SIZE ) ) { /* Even frame size is likely incorrect FSIZE #18166 */ - if( (p_sys->dts.i_frame_size % 2) && p_sys->i_next_offset > 0 && + if( (p_sys->first.i_frame_size % 2) && p_sys->i_next_offset > 0 && block_PeekOffsetBytes( &p_sys->bytestream, p_sys->i_next_offset - 1, p_header, VLC_DTS_HEADER_SIZE ) == 0 && vlc_dts_header_IsSync( p_header, VLC_DTS_HEADER_SIZE ) ) { - p_sys->i_input_size = p_sys->i_next_offset = p_sys->dts.i_frame_size - 1; + p_sys->i_input_size = p_sys->i_next_offset = p_sys->first.i_frame_size - 1; /* reenter */ break; } @@ -269,19 +311,34 @@ static block_t *PacketizeBlock( decoder_t *p_dec, block_t **pp_block ) /* Check if a DTS substream packet is located just after * the core packet */ - if( p_sys->i_next_offset == p_sys->dts.i_frame_size ) + if( p_sys->i_next_offset == p_sys->first.i_frame_size && + vlc_dts_header_Parse( &p_sys->second, + p_header, VLC_DTS_HEADER_SIZE ) == VLC_SUCCESS && + p_sys->second.syncword == DTS_SYNC_SUBSTREAM ) { - 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 ) - { - p_dec->fmt_out.i_profile = PROFILE_DTS_HD; - p_sys->i_input_size += next_header.i_frame_size; - } + p_sys->i_state = STATE_NEXT_SYNC_SUBSTREAM_EXTENSIONS; } - p_sys->i_state = STATE_GET_DATA; + else + { + p_dec->fmt_out.i_profile = PROFILE_DTS; + p_sys->i_state = STATE_GET_DATA; + } + } + break; + + case STATE_NEXT_SYNC_SUBSTREAM_EXTENSIONS: + assert(p_sys->second.syncword == DTS_SYNC_SUBSTREAM); + if( p_sys->first.syncword == DTS_SYNC_SUBSTREAM ) + { + /* First substream must have been LBR */ + p_dec->fmt_out.i_profile = PROFILE_DTS_EXPRESS; + } + else /* Otherwise that's core + extensions, we need to output both */ + { + p_dec->fmt_out.i_profile = PROFILE_DTS_HD; + p_sys->i_input_size += p_sys->second.i_frame_size; } + p_sys->i_state = STATE_GET_DATA; break; case STATE_GET_DATA: @@ -355,7 +412,8 @@ static int Open( vlc_object_t *p_this ) p_sys->i_pts = VLC_TS_INVALID; p_sys->b_date_set = false; p_sys->b_discontinuity = false; - memset(&p_sys->dts, 0, sizeof(vlc_dts_header_t)); + memset(&p_sys->first, 0, sizeof(vlc_dts_header_t)); + memset(&p_sys->second, 0, sizeof(vlc_dts_header_t)); block_BytestreamInit( &p_sys->bytestream ); /* Set output properties (passthrough only) */ ===================================== modules/packetizer/dts_header.c ===================================== @@ -95,42 +95,35 @@ 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; + if( memcmp( p_buf, "\x0A\x80\x19\x21", 4 ) == 0 ) + return DTS_SYNC_SUBSTREAM_LBR; + else + 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 ) @@ -244,6 +237,49 @@ static uint16_t dca_get_channels( uint8_t i_amode, bool b_lfe, return i_physical_channels; } +static uint8_t dca_get_LBR_channels( uint16_t nuSpkrActivityMask, + uint16_t *pi_chans ) +{ + uint16_t i_physical_channels = 0; + uint8_t i_channels = 0; + + static const struct + { + int phy; + uint8_t nb; + } bitmask[16] = { + /* table 7-10 */ + { AOUT_CHAN_CENTER, 1 }, + { AOUT_CHANS_FRONT, 2 }, + { AOUT_CHANS_MIDDLE, 2 }, + { AOUT_CHAN_LFE, 1 }, + { AOUT_CHAN_REARCENTER, 1 }, + { 0, 2 }, + { AOUT_CHANS_REAR, 2 }, + { 0, 1 }, + { 0, 1 }, + { 0, 2 }, + { AOUT_CHANS_FRONT, 2 }, + { AOUT_CHANS_MIDDLE, 2 }, + { 0, 1 }, + { 0, 2 }, + { 0, 1 }, + { 0, 2 }, + }; + + for( int i=0 ; nuSpkrActivityMask; nuSpkrActivityMask >>= 1 ) + { + if( nuSpkrActivityMask & 1 ) + { + i_physical_channels |= bitmask[i].phy; + i_channels += bitmask[i].nb; + } + ++i; + } + *pi_chans = i_physical_channels; + return i_channels; +} + static int dts_header_ParseSubstream( vlc_dts_header_t *p_header, const void *p_buffer ) { @@ -252,24 +288,65 @@ static int dts_header_ParseSubstream( vlc_dts_header_t *p_header, bs_skip( &s, 32 /*SYNCEXTSSH*/ + 8 /*UserDefinedBits*/ + 2 /*nExtSSIndex*/ ); uint8_t bHeaderSizeType = bs_read1( &s ); uint32_t nuBits4ExSSFsize; + uint16_t nuExtSSHeaderSize; if( bHeaderSizeType == 0 ) { - bs_skip( &s, 8 /*nuBits4Header*/ ); + nuExtSSHeaderSize = bs_read( &s, 8 /*nuBits4Header*/ ); nuBits4ExSSFsize = bs_read( &s, 16 ); } else { - bs_skip( &s, 12 /*nuBits4Header*/ ); + nuExtSSHeaderSize = bs_read( &s, 12 /*nuBits4Header*/ ); 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_substream_header_size = nuExtSSHeaderSize + 1; p_header->i_frame_size = nuBits4ExSSFsize + 1; return VLC_SUCCESS; } +static int dts_header_ParseLBRExtSubstream( vlc_dts_header_t *p_header, + const void *p_buffer ) +{ + bs_t s; + bs_init( &s, p_buffer, VLC_DTS_HEADER_SIZE ); + bs_skip( &s, 32 /*SYNCEXTSSH*/ ); + uint8_t ucFmtInfoCode = bs_read( &s, 8 ); + if( ucFmtInfoCode != 0x02 /*LBR_HDRCODE_DECODERINIT*/ ) + return VLC_EGENERIC; + p_header->i_rate = bs_read( &s, 8 ); + /* See ETSI TS 102 114, table 9-3 */ + const unsigned int LBRsamplerates[] = { + 8000, 16000, 32000, + 0, 0, + 22050, 44100, + 0, 0, 0, + 12000, 24000, 48000, + }; + if(p_header->i_rate >= ARRAY_SIZE(LBRsamplerates)) + return VLC_EGENERIC; + p_header->i_rate = LBRsamplerates[p_header->i_rate]; + if( p_header->i_rate < 16000 ) + p_header->i_frame_length = 1024; + else if( p_header->i_rate < 32000 ) + p_header->i_frame_length = 2048; + else + p_header->i_frame_length = 4096; + + uint16_t i_spkrmask = bs_read( &s, 16 ); + dca_get_LBR_channels( i_spkrmask, &p_header->i_physical_channels ); + bs_skip( &s, 16 ); + bs_skip( &s, 8 ); + uint16_t nLBRBitRateMSnybbles = bs_read( &s, 8 ); + bs_skip( &s, 16 ); + uint16_t nLBRScaledBitRate_LSW = bs_read( &s, 16 ); + p_header->i_bitrate = nLBRScaledBitRate_LSW | ((nLBRBitRateMSnybbles & 0xF0) << 12); + 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 ); @@ -289,12 +366,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; @@ -316,50 +393,51 @@ 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 ); + case DTS_SYNC_SUBSTREAM_LBR: + return dts_header_ParseLBRExtSubstream( p_header, p_buffer ); default: vlc_assert_unreachable(); } ===================================== modules/packetizer/dts_header.h ===================================== @@ -27,15 +27,28 @@ #define PROFILE_DTS_INVALID -1 #define PROFILE_DTS 0 #define PROFILE_DTS_HD 1 +#define PROFILE_DTS_EXPRESS 2 + +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, + /* Substreams internal syncs */ + DTS_SYNC_SUBSTREAM_LBR, +}; 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; unsigned int i_frame_length; + uint32_t i_substream_header_size; uint16_t i_physical_channels; uint16_t i_chan_mode; } vlc_dts_header_t; ===================================== modules/packetizer/packetizer_helper.h ===================================== @@ -33,7 +33,8 @@ enum STATE_HEADER, STATE_NEXT_SYNC, STATE_GET_DATA, - STATE_SEND_DATA + STATE_SEND_DATA, + STATE_CUSTOM_FIRST, }; typedef void (*packetizer_reset_t)( void *p_private, bool b_broken ); View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/dfb2c62402b4441b411724e35298093f8546b474...a108715f1d0f6e7c878a5b9ba01c799f08dc78f3 -- View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/dfb2c62402b4441b411724e35298093f8546b474...a108715f1d0f6e7c878a5b9ba01c799f08dc78f3 You're receiving this email because of your account on code.videolan.org.
_______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
