Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (8)
......@@ -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;
......
......@@ -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) */
......
......@@ -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();
}
......
......@@ -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;
......
......@@ -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 );
......