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 (3)
  • Alaric Senat's avatar
    sout: hls: keep up segmentation with stream time · d981176d
    Alaric Senat authored and Steve Lhomme's avatar Steve Lhomme committed
    Allow multiple segments to be output by the same pass.
    This is mainly to handle parallel tracks that differ in segment sizes,
    if one has its muxer outputting very small segments against a track with
    the maximal segment size, the small segments must be output at a faster
    rate.
    
    This work is in preparation of the I-frame based segmentation where this
    behavior will likely exist.
    d981176d
  • Alaric Senat's avatar
    sout: hls: implement I-frame segmentation · 9f3b4e6e
    Alaric Senat authored and Steve Lhomme's avatar Steve Lhomme committed
    This patch implements a best effort algorithm to try and start segments
    with an I-Frame. While optional in the RFC, this guarantees sane seeking
    points and no artifacts on the first connection of clients in the middle
    of the stream.
    
    Obviously, the input of the module should be a feed that has a GOP
    generally smaller than the requested segment size, otherwise, the
    algorithm will fall back to the old behavior and create a segment that
    isn't self decodable.
    
    This is still preparation work for the new Chromecast backend, in
    particular to support seeking in the exposed media window.
    
    Refs #27391
    9f3b4e6e
  • Alaric Senat's avatar
    sout: hls: signal user when segments aren't self decodable · e759f7e7
    Alaric Senat authored and Steve Lhomme's avatar Steve Lhomme committed
    Segments not starting with a sync point are legal in the HLS ref.
    However, using them as a seek point is hazardous. Warn the user that
    their stream might have issues fixable by adapting the encoding
    parameters.
    e759f7e7
......@@ -96,6 +96,11 @@ typedef struct hls_playlist
bool ended;
/**
* Total duration of the muxed data.
*/
vlc_tick_t muxed_duration;
struct vlc_list node;
} hls_playlist_t;
......@@ -146,6 +151,10 @@ typedef struct
struct hls_storage *manifest;
httpd_url_t *http_manifest;
/**
* Global advancement of the stream in media time.
*/
vlc_tick_t elapsed_stream_time;
vlc_tick_t first_pcr;
size_t current_memory_cached;
......@@ -471,23 +480,42 @@ static hls_block_chain_t ExtractCommonSegment(hls_block_chain_t *muxed_output,
{
hls_block_chain_t segment = {.begin = muxed_output->begin};
vlc_tick_t gop_length = 0;
block_t *prev = NULL;
block_t *segment_end = NULL;
for (block_t *it = muxed_output->begin; it != NULL; it = it->p_next)
{
if (segment.length + it->i_length > max_segment_length)
if (it->i_flags & BLOCK_FLAG_HEADER)
{
muxed_output->begin = it;
if (prev != NULL)
prev->p_next = NULL;
return segment;
segment_end = prev;
segment.length += gop_length;
gop_length = 0;
}
segment.length += it->i_length;
muxed_output->length -= it->i_length;
if (segment.length + gop_length + it->i_length > max_segment_length)
{
if (segment_end == NULL)
{
segment_end = prev;
segment.length += gop_length;
gop_length = 0;
}
break;
}
gop_length += it->i_length;
prev = it;
}
hls_block_chain_Reset(muxed_output);
if (segment_end != NULL)
{
muxed_output->begin = segment_end->p_next;
segment_end->p_next = NULL;
muxed_output->length -= segment.length;
}
else
{
segment.length = gop_length;
hls_block_chain_Reset(muxed_output);
}
return segment;
}
......@@ -522,6 +550,14 @@ static hls_block_chain_t ExtractSegment(hls_playlist_t *playlist)
return ExtractCommonSegment(&playlist->muxed_output, seglen);
}
static bool IsSegmentSelfDecodable(const hls_block_chain_t *segment)
{
if (segment->begin == NULL)
return false;
return segment->begin->i_flags & BLOCK_FLAG_HEADER;
}
static int ExtractAndAddSegment(hls_playlist_t *playlist,
sout_stream_sys_t *sys)
{
......@@ -536,6 +572,8 @@ static int ExtractAndAddSegment(hls_playlist_t *playlist,
hls_storage_GetSize(to_be_removed->storage);
}
const bool self_decodable = IsSegmentSelfDecodable(&segment);
const vlc_tick_t length = segment.length;
const int status = hls_segment_queue_NewSegment(
&playlist->segments, segment.begin, segment.length);
if (unlikely(status != VLC_SUCCESS))
......@@ -545,6 +583,25 @@ static int ExtractAndAddSegment(hls_playlist_t *playlist,
playlist->segments.total_segments + 1);
return status;
}
playlist->muxed_duration += length;
if (!self_decodable)
{
vlc_warning(
playlist->logger,
"Segment '%u' does not start with a synchronization frame. It will "
"not be decodable on its own and will likely fail as a seek point.",
playlist->segments.total_segments);
if (playlist->type != HLS_PLAYLIST_TYPE_WEBVTT)
{
vlc_warning(
playlist->logger,
"It is probably due to a GOP being too large to fit in %" PRIi64
"s segments. Please adjust your encoding parameters or set a "
"larger segment size.",
SEC_FROM_VLC_TICK(playlist->config->segment_length));
}
}
vlc_debug(playlist->logger,
"Segment '%u' created",
......@@ -613,8 +670,14 @@ static ssize_t AccessOutWrite(sout_access_out_t *access, block_t *block)
{
hls_playlists_foreach (it)
{
if (ExtractAndAddSegment(it, sys) != VLC_SUCCESS)
return -1;
while (IsSegmentReady(it->type,
&it->muxed_output,
sys->config.segment_length) &&
it->muxed_duration < sys->elapsed_stream_time)
{
if (ExtractAndAddSegment(it, sys) != VLC_SUCCESS)
return -1;
}
}
}
return size;
......@@ -664,7 +727,7 @@ static sout_mux_t *CreatePlaylistMuxer(sout_access_out_t *access,
switch(type)
{
case HLS_PLAYLIST_TYPE_TS:
return sout_MuxNew(access, "ts");
return sout_MuxNew(access, "ts{use-key-frames}");
case HLS_PLAYLIST_TYPE_WEBVTT:
return CreateSubtitleSegmenter(access, config);
}
......@@ -692,6 +755,7 @@ static hls_playlist_t *CreatePlaylist(sout_stream_t *stream,
playlist->type = type;
playlist->config = &sys->config;
playlist->ended = false;
playlist->muxed_duration = 0;
playlist->url = FormatPlaylistManifestURL(playlist);
if (unlikely(playlist->url == NULL))
......@@ -904,14 +968,15 @@ static void SetPCR(sout_stream_t *stream, vlc_tick_t pcr)
return;
}
const vlc_tick_t stream_time = pcr - sys->first_pcr;
sys->elapsed_stream_time = pcr - sys->first_pcr;
const hls_playlist_t *playlist;
vlc_list_foreach_const (playlist, &sys->media_playlists, node)
{
if (playlist->type != HLS_PLAYLIST_TYPE_WEBVTT)
continue;
hls_sub_segmenter_SignalStreamUpdate(playlist->mux, stream_time);
hls_sub_segmenter_SignalStreamUpdate(playlist->mux,
sys->elapsed_stream_time);
}
}
......@@ -1054,6 +1119,7 @@ static int Open(vlc_object_t *this)
vlc_list_init(&sys->variant_playlists);
vlc_list_init(&sys->media_playlists);
sys->elapsed_stream_time = 0;
sys->first_pcr = VLC_TICK_INVALID;
sys->current_memory_cached = 0;
......