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 (12)
......@@ -137,7 +137,7 @@ typedef struct
} avi_index_t;
static void avi_index_Init( avi_index_t * );
static void avi_index_Clean( avi_index_t * );
static void avi_index_Append( avi_index_t *, uint64_t *, avi_entry_t * );
static int64_t avi_index_Append( avi_index_t *, uint64_t *, avi_entry_t * );
typedef struct
{
......@@ -210,11 +210,9 @@ static vlc_tick_t AVI_GetDPTS ( avi_track_t *, int64_t i_count );
static vlc_tick_t AVI_GetPTS ( avi_track_t * );
static int AVI_StreamChunkFind( demux_t *, unsigned int i_stream );
static int AVI_StreamChunkSet ( demux_t *,
unsigned int i_stream, unsigned int i_ck );
static int AVI_StreamBytesSet ( demux_t *,
unsigned int i_stream, uint64_t i_byte );
static int AVI_StreamChunkFind( demux_t *, avi_track_t * );
static int AVI_StreamChunkSet ( demux_t *, avi_track_t *, unsigned int i_ck );
static int AVI_StreamBytesSet ( demux_t *, avi_track_t *, uint64_t i_byte );
vlc_fourcc_t AVI_FourccGetCodec( unsigned int i_cat, vlc_fourcc_t );
static int AVI_GetKeyFlag ( vlc_fourcc_t , uint8_t * );
......@@ -988,26 +986,36 @@ error:
*****************************************************************************/
static block_t * ReadFrame( demux_t *p_demux, const avi_track_t *tk,
const unsigned int i_header, const int i_size )
uint32_t i_header, uint32_t i_osize )
{
block_t *p_frame = vlc_stream_Block( p_demux->s, __EVEN( i_size ) );
if ( !p_frame ) return p_frame;
if( i_size % 2 ) /* read was padded on word boundary */
/* skip header */
if( i_header )
{
p_frame->i_buffer--;
assert(i_header % 8 == 0);
ssize_t i_skip = vlc_stream_Read( p_demux->s, NULL, i_header );
if( i_skip < 0 || (size_t) i_skip < i_header )
return NULL;
}
if( i_header >= p_frame->i_buffer || tk->i_width_bytes > INT32_MAX - 3 )
/* read size padded on word boundary */
uint32_t i_size = __EVEN(i_osize);
if( i_size == 0 )
return block_Alloc(0); /* vlc_stream_Block can't read/alloc 0 sized */
block_t *p_frame = vlc_stream_Block( p_demux->s, i_size );
if ( !p_frame )
return p_frame;
if( i_osize == i_size - 1 )
p_frame->i_buffer--;
if( tk->i_width_bytes > INT32_MAX - 3 )
{
p_frame->i_buffer = 0;
return p_frame;
}
/* skip header */
p_frame->p_buffer += i_header;
p_frame->i_buffer -= i_header;
const unsigned int i_stride_bytes = (tk->i_width_bytes + 3) & ~3;
if ( !tk->i_width_bytes || !i_stride_bytes )
......@@ -1231,7 +1239,6 @@ static int Demux_Seekable( demux_t *p_demux )
block_t *p_frame;
int64_t i_pos;
unsigned int i;
size_t i_size;
/* search for first chunk to be read */
for( i = 0, b_done = true, i_pos = -1; i < p_sys->i_track; i++ )
......@@ -1333,11 +1340,14 @@ static int Demux_Seekable( demux_t *p_demux )
index.i_pos = avi_pk.i_pos;
index.i_length = avi_pk.i_size;
index.i_lengthtotal = index.i_length;
avi_index_Append( &tk->idx, &p_sys->i_movi_lastchunk_pos, &index );
int64_t i_indexid = avi_index_Append( &tk->idx, &p_sys->i_movi_lastchunk_pos, &index );
/* do we will read this data ? */
if( AVI_GetDPTS( tk, toread[i_track].i_toread ) > -p_sys->i_read_increment )
if( i_indexid >= 0 &&
AVI_GetDPTS( tk, toread[i_track].i_toread ) > -p_sys->i_read_increment )
{
tk->i_idxposc = (unsigned int) i_indexid;
tk->i_idxposb = 0;
break;
}
else
......@@ -1361,11 +1371,16 @@ static int Demux_Seekable( demux_t *p_demux )
/* Set the track to use */
tk = p_sys->track[i_track];
size_t i_size;
unsigned i_ck_remaining_bytes = tk->idx.p_entry[tk->i_idxposc].i_length -
tk->i_idxposb;
/* read those data */
if( tk->i_samplesize )
{
int64_t i_toread;
/* remaining bytes to read inside the current read increment */
if( ( i_toread = toread[i_track].i_toread ) <= 0 )
{
if( tk->i_samplesize > 1 )
......@@ -1374,26 +1389,23 @@ static int Demux_Seekable( demux_t *p_demux )
}
else
{
/* refill current read increment */
i_toread = AVI_PTSToByte( tk, 20 * 1000 );
i_toread = __MAX( i_toread, 100 );
}
}
i_size = __MIN( tk->idx.p_entry[tk->i_idxposc].i_length -
tk->i_idxposb,
(size_t) i_toread );
i_size = __MIN( i_ck_remaining_bytes, (size_t) i_toread );
}
else
{
i_size = tk->idx.p_entry[tk->i_idxposc].i_length;
assert(tk->i_idxposb == 0);
i_size = i_ck_remaining_bytes;
}
if( tk->i_idxposb == 0 )
{
i_size += 8; /* need to read and skip header */
}
/* need to read and skip tag/header */
const uint8_t i_header = ( tk->i_idxposb == 0 ) ? 8 : 0;
if( ( p_frame = ReadFrame( p_demux, tk,
( tk->i_idxposb == 0 ) ? 8 : 0, i_size ) )==NULL )
if( ( p_frame = ReadFrame( p_demux, tk, i_header, i_size ) )==NULL )
{
msg_Warn( p_demux, "failed reading data" );
tk->b_eof = false;
......@@ -1406,18 +1418,14 @@ static int Demux_Seekable( demux_t *p_demux )
{
p_frame->i_flags = BLOCK_FLAG_TYPE_I;
}
else
else if( tk->fmt.i_cat == VIDEO_ES )
{
p_frame->i_flags = BLOCK_FLAG_TYPE_PB;
}
/* read data */
/* advance chunk/byte pointers */
if( tk->i_samplesize )
{
if( tk->i_idxposb == 0 )
{
i_size -= 8;
}
toread[i_track].i_toread -= i_size;
tk->i_idxposb += i_size;
if( tk->i_idxposb >=
......@@ -1427,18 +1435,18 @@ static int Demux_Seekable( demux_t *p_demux )
tk->i_idxposc++;
}
}
else
else /* full chunk */
{
int i_length = tk->idx.p_entry[tk->i_idxposc].i_length;
/* Goto to next chunk */
tk->i_idxposc++;
if( tk->fmt.i_cat == AUDIO_ES )
{
tk->i_blockno += tk->i_blocksize > 0 ? ( i_length + tk->i_blocksize - 1 ) / tk->i_blocksize : 1;
tk->i_blockno += tk->i_blocksize > 0 ? ( i_size + tk->i_blocksize - 1 ) / tk->i_blocksize : 1;
}
toread[i_track].i_toread--;
}
/* check new chunk and set new read pos */
if( tk->i_idxposc < tk->idx.i_size)
{
toread[i_track].i_posf =
......@@ -1449,7 +1457,7 @@ static int Demux_Seekable( demux_t *p_demux )
}
}
else
else /* all chunks read for this track */
{
toread[i_track].i_posf = -1;
}
......@@ -1566,7 +1574,7 @@ static int Demux_UnSeekable( demux_t *p_demux )
AVI_GetPTS( p_stream_master ) )< 2 * CLOCK_FREQ )
{
/* load it and send to decoder */
block_t *p_frame = ReadFrame( p_demux, p_stream, 8, avi_pk.i_size + 8 ) ;
block_t *p_frame = ReadFrame( p_demux, p_stream, 8, avi_pk.i_size ) ;
if( p_frame == NULL )
{
return VLC_DEMUXER_EGENERIC;
......@@ -1642,13 +1650,12 @@ static int Seek( demux_t *p_demux, vlc_tick_t i_date, int i_percent, bool b_accu
if( !p_sys->i_length )
{
avi_track_t *p_stream = NULL;
unsigned i_stream = 0;
uint64_t i_pos;
if ( !p_sys->i_movi_lastchunk_pos && /* set when index is successfully loaded */
! ( p_sys->i_avih_flags & AVIF_ISINTERLEAVED ) )
{
msg_Err( p_demux, "seeking without index at %d%%"
msg_Warn( p_demux, "seeking without index at %d%%"
" only works for interleaved files", i_percent );
goto failandresetpos;
}
......@@ -1671,7 +1678,6 @@ static int Seek( demux_t *p_demux, vlc_tick_t i_date, int i_percent, bool b_accu
continue;
p_stream = p_track;
i_stream = i;
if( !p_track->b_eof )
break;
}
......@@ -1682,7 +1688,7 @@ static int Seek( demux_t *p_demux, vlc_tick_t i_date, int i_percent, bool b_accu
}
/* be sure that the index exist */
if( AVI_StreamChunkSet( p_demux, i_stream, 0 ) )
if( AVI_StreamChunkSet( p_demux, p_stream, 0 ) )
{
msg_Warn( p_demux, "cannot seek" );
goto failandresetpos;
......@@ -1693,7 +1699,7 @@ static int Seek( demux_t *p_demux, vlc_tick_t i_date, int i_percent, bool b_accu
{
/* search after i_idxposc */
if( AVI_StreamChunkSet( p_demux,
i_stream, p_stream->i_idxposc + 1 ) )
p_stream, p_stream->i_idxposc + 1 ) )
{
msg_Warn( p_demux, "cannot seek" );
goto failandresetpos;
......@@ -1965,7 +1971,7 @@ static vlc_tick_t AVI_GetPTS( avi_track_t *tk )
return AVI_GetDPTS( tk, tk->i_idxposc );
}
static int AVI_StreamChunkFind( demux_t *p_demux, unsigned int i_stream )
static int AVI_StreamChunkFind( demux_t *p_demux, avi_track_t *tk )
{
demux_sys_t *p_sys = p_demux->p_sys;
avi_packet_t avi_pk;
......@@ -2025,7 +2031,7 @@ static int AVI_StreamChunkFind( demux_t *p_demux, unsigned int i_stream )
index.i_lengthtotal = index.i_length;
avi_index_Append( &tk_pk->idx, &p_sys->i_movi_lastchunk_pos, &index );
if( avi_pk.i_stream == i_stream )
if( tk_pk == tk )
{
return VLC_SUCCESS;
}
......@@ -2039,12 +2045,9 @@ static int AVI_StreamChunkFind( demux_t *p_demux, unsigned int i_stream )
}
/* be sure that i_ck will be a valid index entry */
static int AVI_StreamChunkSet( demux_t *p_demux, unsigned int i_stream,
static int AVI_StreamChunkSet( demux_t *p_demux, avi_track_t *p_stream,
unsigned int i_ck )
{
demux_sys_t *p_sys = p_demux->p_sys;
avi_track_t *p_stream = p_sys->track[i_stream];
p_stream->i_idxposc = i_ck;
p_stream->i_idxposb = 0;
......@@ -2054,7 +2057,7 @@ static int AVI_StreamChunkSet( demux_t *p_demux, unsigned int i_stream,
do
{
p_stream->i_idxposc++;
if( AVI_StreamChunkFind( p_demux, i_stream ) )
if( AVI_StreamChunkFind( p_demux, p_stream ) )
{
return VLC_EGENERIC;
}
......@@ -2067,12 +2070,9 @@ static int AVI_StreamChunkSet( demux_t *p_demux, unsigned int i_stream,
/* XXX FIXME up to now, we assume that all chunk are one after one */
static int AVI_StreamBytesSet( demux_t *p_demux,
unsigned int i_stream,
avi_track_t *p_stream,
uint64_t i_byte )
{
demux_sys_t *p_sys = p_demux->p_sys;
avi_track_t *p_stream = p_sys->track[i_stream];
if( ( p_stream->idx.i_size > 0 )
&&( i_byte < p_stream->idx.p_entry[p_stream->idx.i_size - 1].i_lengthtotal +
p_stream->idx.p_entry[p_stream->idx.i_size - 1].i_length ) )
......@@ -2115,7 +2115,7 @@ static int AVI_StreamBytesSet( demux_t *p_demux,
do
{
p_stream->i_idxposc++;
if( AVI_StreamChunkFind( p_demux, i_stream ) )
if( AVI_StreamChunkFind( p_demux, p_stream ) )
{
return VLC_EGENERIC;
}
......@@ -2135,35 +2135,28 @@ static int AVI_TrackSeek( demux_t *p_demux,
{
demux_sys_t *p_sys = p_demux->p_sys;
avi_track_t *tk = p_sys->track[i_stream];
#define p_stream p_sys->track[i_stream]
vlc_tick_t i_oldpts;
i_oldpts = AVI_GetPTS( p_stream );
i_oldpts = AVI_GetPTS( tk );
if( !p_stream->i_samplesize )
if( !tk->i_samplesize )
{
if( AVI_StreamChunkSet( p_demux,
i_stream,
AVI_PTSToChunk( p_stream, i_date ) ) )
if( AVI_StreamChunkSet( p_demux, tk, AVI_PTSToChunk( tk, i_date ) ) )
{
return VLC_EGENERIC;
}
if( p_stream->fmt.i_cat == AUDIO_ES )
if( tk->fmt.i_cat == AUDIO_ES )
{
unsigned int i;
tk->i_blockno = 0;
for( i = 0; i < tk->i_idxposc; i++ )
if( tk->i_blocksize > 0 )
{
if( tk->i_blocksize > 0 )
{
tk->i_blockno = tk->i_idxposc;
}
else
{
tk->i_blockno = 0;
for( unsigned int i = 0; i < tk->i_idxposc; i++ )
tk->i_blockno += ( tk->idx.p_entry[i].i_length + tk->i_blocksize - 1 ) / tk->i_blocksize;
}
else
{
tk->i_blockno++;
}
}
}
......@@ -2173,18 +2166,15 @@ static int AVI_TrackSeek( demux_t *p_demux,
i_oldpts > i_date ? ">" : "<",
i_date );
if( p_stream->fmt.i_cat == VIDEO_ES )
if( tk->fmt.i_cat == VIDEO_ES )
{
/* search key frame */
//if( i_date < i_oldpts || 1 )
{
while( p_stream->i_idxposc > 0 &&
!( p_stream->idx.p_entry[p_stream->i_idxposc].i_flags &
AVIIF_KEYFRAME ) )
while( tk->i_idxposc > 0 &&
!( tk->idx.p_entry[tk->i_idxposc].i_flags & AVIIF_KEYFRAME ) )
{
if( AVI_StreamChunkSet( p_demux,
i_stream,
p_stream->i_idxposc - 1 ) )
if( AVI_StreamChunkSet( p_demux, tk, tk->i_idxposc - 1 ) )
{
return VLC_EGENERIC;
}
......@@ -2193,13 +2183,10 @@ static int AVI_TrackSeek( demux_t *p_demux,
#if 0
else
{
while( p_stream->i_idxposc < p_stream->idx.i_size &&
!( p_stream->idx.p_entry[p_stream->i_idxposc].i_flags &
AVIIF_KEYFRAME ) )
while( tk->i_idxposc < tk->idx.i_size &&
!( tk->idx.p_entry[tk->i_idxposc].i_flags & AVIIF_KEYFRAME ) )
{
if( AVI_StreamChunkSet( p_demux,
i_stream,
p_stream->i_idxposc + 1 ) )
if( AVI_StreamChunkSet( p_demux, tk, tk->i_idxposc + 1 ) )
{
return VLC_EGENERIC;
}
......@@ -2210,15 +2197,12 @@ static int AVI_TrackSeek( demux_t *p_demux,
}
else
{
if( AVI_StreamBytesSet( p_demux,
i_stream,
AVI_PTSToByte( p_stream, i_date ) ) )
if( AVI_StreamBytesSet( p_demux, tk, AVI_PTSToByte( tk, i_date ) ) )
{
return VLC_EGENERIC;
}
}
return VLC_SUCCESS;
#undef p_stream
}
/****************************************************************************
......@@ -2445,21 +2429,32 @@ static void avi_index_Clean( avi_index_t *p_index )
{
free( p_index->p_entry );
}
static void avi_index_Append( avi_index_t *p_index, uint64_t *pi_last_pos,
avi_entry_t *p_entry )
#define MAX_INDEX_ENTRIES __MIN(SIZE_MAX/sizeof(avi_entry_t), UINT32_MAX)
#define INDEX_EXTENT 16384
static int64_t avi_index_Append( avi_index_t *p_index, uint64_t *pi_last_pos,
avi_entry_t *p_entry )
{
/* Update last chunk position */
if( *pi_last_pos < p_entry->i_pos )
*pi_last_pos = p_entry->i_pos;
if( p_index->i_size == MAX_INDEX_ENTRIES )
return -1;
/* add the entry */
if( p_index->i_size >= p_index->i_max )
{
p_index->i_max += 16384;
if( MAX_INDEX_ENTRIES - INDEX_EXTENT > p_index->i_max )
p_index->i_max += INDEX_EXTENT;
else
p_index->i_max = MAX_INDEX_ENTRIES;
p_index->p_entry = realloc_or_free( p_index->p_entry,
p_index->i_max * sizeof( *p_index->p_entry ) );
p_index->i_max * sizeof(avi_entry_t) );
if( !p_index->p_entry )
return;
{
avi_index_Init( p_index );
return -1;
}
}
/* calculate cumulate length */
if( p_index->i_size > 0 )
......@@ -2474,6 +2469,7 @@ static void avi_index_Append( avi_index_t *p_index, uint64_t *pi_last_pos,
}
p_index->p_entry[p_index->i_size++] = *p_entry;
return p_index->i_size - 1;
}
static int AVI_IndexFind_idx1( demux_t *p_demux,
......@@ -2654,7 +2650,6 @@ static void AVI_IndexLoad_indx( demux_t *p_demux,
avi_chunk_list_t *p_strl;
avi_chunk_indx_t *p_indx;
#define p_stream p_sys->track[i_stream]
p_strl = AVI_ChunkFind( p_hdrl, AVIFOURCC_strl, i_stream, true );
p_indx = AVI_ChunkFind( p_strl, AVIFOURCC_indx, 0, false );
......@@ -2693,7 +2688,6 @@ static void AVI_IndexLoad_indx( demux_t *p_demux,
{
msg_Warn( p_demux, "unknown type index(0x%x)", p_indx->i_indextype );
}
#undef p_stream
}
}
......@@ -2745,7 +2739,7 @@ static void AVI_IndexLoad( demux_t *p_demux )
b_key = p_index->p_entry[j].i_flags & AVIIF_KEYFRAME;
if( !b_key )
{
msg_Err( p_demux, "no key frame set for track %u", i );
msg_Warn( p_demux, "no key frame set for track %u", i );
for( unsigned j = 0; j < p_index->i_size; j++ )
p_index->p_entry[j].i_flags |= AVIIF_KEYFRAME;
}
......