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 (5)
......@@ -49,13 +49,20 @@ struct vlc_aout_stream
atomic_bool drained;
_Atomic vlc_tick_t drain_deadline;
struct
{
bool draining;
block_t **fifo_last;
block_t *fifo_first;
} discontinuity;
struct
{
struct vlc_clock_t *clock;
float rate; /**< Play-out speed rate */
vlc_tick_t resamp_start_drift; /**< Resampler drift absolute value */
int resamp_type; /**< Resampler mode (FIXME: redundant / resampling) */
bool discontinuity;
bool played;
vlc_tick_t request_delay;
vlc_tick_t delay;
} sync;
......@@ -155,9 +162,98 @@ static int stream_GetDelay(vlc_aout_stream *stream, vlc_tick_t *delay)
return 0;
}
static void stream_Discontinuity(vlc_aout_stream *stream)
static bool stream_IsDrained(vlc_aout_stream *stream)
{
audio_output_t *aout = aout_stream_aout(stream);
if (aout->drain == NULL)
{
vlc_tick_t drain_deadline =
atomic_load_explicit(&stream->drain_deadline, memory_order_relaxed);
return drain_deadline != VLC_TICK_INVALID
&& vlc_tick_now() >= drain_deadline;
}
else
return atomic_load_explicit(&stream->drained, memory_order_relaxed);
}
static int stream_StartDiscontinuity(vlc_aout_stream *stream, block_t *block)
{
stream->sync.discontinuity = true;
audio_output_t *aout = aout_stream_aout(stream);
assert(!stream->discontinuity.draining);
/* Changing timings of the stream module while playing is an intricate
* task, therefore modules don't handle any PTS discontinuity.
*
* The PTS discontinuity is handled in the core:
*
* - Drain the current stream in case of discontinuity
* - Check from future Play() calls if the stream is drained
* - Keep blocks in a list while waiting for the drain
* - Flush when the stream is finally drained
* - Play back all blocks that were saved
*/
msg_Dbg(aout, "discontinuity: at %"PRId64" us, draining output",
block->i_pts);
vlc_aout_stream_Drain(stream);
stream->discontinuity.draining = true;
stream->discontinuity.fifo_first = NULL;
stream->discontinuity.fifo_last = &stream->discontinuity.fifo_first;
block->i_flags &= ~ BLOCK_FLAG_DISCONTINUITY;
block_ChainLastAppend(&stream->discontinuity.fifo_last, block);
return AOUT_DEC_SUCCESS;
}
static void stream_ResetDiscontinuity(vlc_aout_stream *stream)
{
block_ChainRelease(stream->discontinuity.fifo_first);
stream->discontinuity.draining = false;
}
static int stream_HandleDiscontinuity(vlc_aout_stream *stream, block_t *block)
{
audio_output_t *aout = aout_stream_aout(stream);
block_ChainLastAppend(&stream->discontinuity.fifo_last, block);
/* Will play back all blocks once the draining is finished */
if (!stream_IsDrained(stream))
return AOUT_DEC_SUCCESS;
/* Keep block list and stats before flushing */
int count;
vlc_tick_t length;
block_ChainProperties(stream->discontinuity.fifo_first, &count, NULL,
&length);
block = stream->discontinuity.fifo_first;
msg_Dbg(aout, "discontinuity: flushing output");
/* Reset the discontinuity state, and flush */
stream->discontinuity.draining = false;
vlc_aout_stream_Flush(stream);
msg_Dbg(aout, "discontinuity: playing back %d blocks for a total length of "
"%"PRId64" us", count, length);
/* Play back all blocks past the discontinuity */
for (block_t *next; block != NULL; block = next)
{
next = block->p_next;
block->p_next = NULL;
vlc_aout_stream_Play(stream, block);
}
return AOUT_DEC_SUCCESS;
}
static void stream_ResetTimings(vlc_aout_stream *stream)
{
stream->sync.played = false;
vlc_mutex_lock(&stream->timing.lock);
stream->timing.first_pts = VLC_TICK_INVALID;
......@@ -203,6 +299,9 @@ static void stream_Reset(vlc_aout_stream *stream)
stream->sync.request_delay = stream->sync.delay;
stream->sync.delay = 0;
}
if (stream->discontinuity.draining)
stream_ResetDiscontinuity(stream);
}
stream->timing.rate_audio_ts = VLC_TICK_INVALID;
......@@ -212,7 +311,7 @@ static void stream_Reset(vlc_aout_stream *stream)
atomic_store_explicit(&stream->drain_deadline, VLC_TICK_INVALID,
memory_order_relaxed);
stream_Discontinuity(stream);
stream_ResetTimings(stream);
}
/**
......@@ -278,7 +377,9 @@ vlc_aout_stream * vlc_aout_stream_New(audio_output_t *p_aout,
stream->sync.rate = 1.f;
stream->sync.resamp_type = AOUT_RESAMPLING_NONE;
stream->sync.delay = stream->sync.request_delay = 0;
stream_Discontinuity(stream);
stream->discontinuity.draining = false;
stream_ResetTimings(stream);
atomic_init (&stream->buffers_lost, 0);
atomic_init (&stream->buffers_played, 0);
......@@ -343,6 +444,9 @@ void vlc_aout_stream_Delete (vlc_aout_stream *stream)
if (stream->volume != NULL)
aout_volume_Delete(stream->volume);
if (stream->discontinuity.draining)
stream_ResetDiscontinuity(stream);
free(stream);
}
......@@ -502,13 +606,13 @@ static void stream_HandleDrift(vlc_aout_stream *stream, vlc_tick_t drift,
* is not portable, not supported by some hardware and often unsafe/buggy
* where supported. The other alternative is to flush the buffers
* completely. */
if (drift > (stream->sync.discontinuity ? 0
: lroundf(+3 * AOUT_MAX_PTS_DELAY / rate)))
if (drift > (stream->sync.played ?
lroundf(+3 * AOUT_MAX_PTS_DELAY / rate) : 0))
{
if (tracer != NULL)
vlc_tracer_TraceEvent(tracer, "RENDER", stream->str_id, "late_flush");
if (!stream->sync.discontinuity)
if (stream->sync.played)
msg_Warn (aout, "playback way too late (%"PRId64"): "
"flushing buffers", drift);
else
......@@ -522,10 +626,10 @@ static void stream_HandleDrift(vlc_aout_stream *stream, vlc_tick_t drift,
/* Early audio output.
* This is rare except at startup when the buffers are still empty. */
if (drift < (stream->sync.discontinuity ? 0
: lroundf(-3 * AOUT_MAX_PTS_ADVANCE / rate)))
if (drift < (stream->sync.played ?
lroundf(-3 * AOUT_MAX_PTS_ADVANCE / rate) : 0))
{
if (!stream->sync.discontinuity)
if (stream->sync.played)
{
if (tracer != NULL)
vlc_tracer_TraceEvent(tracer, "RENDER", stream->str_id, "early_silence");
......@@ -536,7 +640,6 @@ static void stream_HandleDrift(vlc_aout_stream *stream, vlc_tick_t drift,
stream_Silence(stream, -drift, audio_ts);
stream_StopResampling(stream);
stream->sync.discontinuity = true;
drift = 0;
}
......@@ -656,7 +759,7 @@ static void stream_Synchronize(vlc_aout_stream *stream, vlc_tick_t system_now,
if (stream_GetDelay(stream, &delay) != 0)
return; /* nothing can be done if timing is unknown */
if (stream->sync.discontinuity)
if (!stream->sync.played)
{
/* Chicken-egg situation for some aout modules that can't be
* started deferred (like alsa). These modules will start to play
......@@ -731,13 +834,16 @@ int vlc_aout_stream_Play(vlc_aout_stream *stream, block_t *block)
block->i_length = vlc_tick_from_samples( block->i_nb_samples,
stream->input_format.i_rate );
if (stream->discontinuity.draining)
return stream_HandleDiscontinuity(stream, block);
if (block->i_flags & BLOCK_FLAG_DISCONTINUITY && stream->sync.played)
return stream_StartDiscontinuity(stream, block);
int ret = stream_CheckReady (stream);
if (unlikely(ret == AOUT_DEC_FAILED))
goto drop; /* Pipeline is unrecoverably broken :-( */
if (block->i_flags & BLOCK_FLAG_DISCONTINUITY)
stream_Discontinuity(stream);
if (stream->filters)
{
if (atomic_load_explicit(&owner->vp.update, memory_order_relaxed))
......@@ -783,14 +889,14 @@ int vlc_aout_stream_Play(vlc_aout_stream *stream, block_t *block)
vlc_audio_meter_Process(&owner->meter, block, play_date);
/* Output */
stream->sync.discontinuity = false;
stream->sync.played = true;
stream->timing.played_samples += block->i_nb_samples;
aout->play(aout, block, play_date);
atomic_fetch_add_explicit(&stream->buffers_played, 1, memory_order_relaxed);
return ret;
drop:
stream_Discontinuity(stream);
stream_ResetTimings(stream);
block_Release (block);
atomic_fetch_add_explicit(&stream->buffers_lost, 1, memory_order_relaxed);
return ret;
......@@ -889,17 +995,11 @@ void vlc_aout_stream_NotifyDrained(vlc_aout_stream *stream)
bool vlc_aout_stream_IsDrained(vlc_aout_stream *stream)
{
audio_output_t *aout = aout_stream_aout(stream);
/* The internal draining state should not mess with the public one */
if (stream->discontinuity.draining)
return false;
if (aout->drain == NULL)
{
vlc_tick_t drain_deadline =
atomic_load_explicit(&stream->drain_deadline, memory_order_relaxed);
return drain_deadline != VLC_TICK_INVALID
&& vlc_tick_now() >= drain_deadline;
}
else
return atomic_load_explicit(&stream->drained, memory_order_relaxed);
return stream_IsDrained(stream);
}
void vlc_aout_stream_Drain(vlc_aout_stream *stream)
......@@ -909,6 +1009,21 @@ void vlc_aout_stream_Drain(vlc_aout_stream *stream)
if (!stream->mixer_format.i_format)
return;
if (unlikely(stream->discontinuity.draining))
{
if (stream->discontinuity.fifo_first != NULL)
{
vlc_tick_t length;
block_ChainProperties(stream->discontinuity.fifo_first, NULL, NULL,
&length);
msg_Err(aout, "draining while handling a discontinuity not handled"
", losing %"PRId64 " us of audio", length); /* FIXME */
}
stream_ResetDiscontinuity(stream);
return;
}
struct vlc_tracer *tracer = aout_stream_tracer(stream);
if (tracer != NULL)
......