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 (23)
Showing
with 198 additions and 174 deletions
......@@ -22,6 +22,7 @@
#define VLC_PLAYLIST_NEW_H
#include <vlc_common.h>
#include <vlc_preparser.h>
# ifdef __cplusplus
extern "C" {
......@@ -154,6 +155,19 @@ struct vlc_playlist_sort_criterion
enum vlc_playlist_sort_order order;
};
/** Preparsing depth */
enum vlc_playlist_preparsing
{
/** Don't parse anything */
VLC_PLAYLIST_PREPARSING_DISABLED,
/** Auto parse items but don't auto-parse sub items */
VLC_PLAYLIST_PREPARSING_ENABLED,
/** Auto parse sub items of items (1 level depth) */
VLC_PLAYLIST_PREPARSING_COLLAPSE,
/** Auto parse all sub items recursively */
VLC_PLAYLIST_PREPARSING_RECURSIVE,
};
/**
* Action when a media is stopped
*
......@@ -359,10 +373,14 @@ vlc_playlist_item_GetId(vlc_playlist_item_t *);
* Create a new playlist.
*
* \param parent a VLC object
* \param rec preparsing depth
* \param preparse_max_threads the maximum number of threads used to parse, must be >= 1
* \param preparse_timeout default timeout of the preparser, 0 for no limits.
* \return a pointer to a valid playlist instance, or NULL if an error occurred
*/
VLC_API VLC_USED vlc_playlist_t *
vlc_playlist_New(vlc_object_t *parent);
vlc_playlist_New(vlc_object_t *parent, enum vlc_playlist_preparsing rec,
unsigned preparse_max_threads, vlc_tick_t preparse_timeout);
/**
* Delete a playlist.
......@@ -896,17 +914,6 @@ vlc_playlist_PlayAt(vlc_playlist_t *playlist, size_t index)
return vlc_playlist_Start(playlist);
}
/**
* Preparse a media, and expand it in the playlist on subitems added.
*
* \param playlist the playlist (not necessarily locked)
* \param media the media to preparse
* \param parse_subitems true to parse subitems (from a folder or a playlist file)
*/
VLC_API void
vlc_playlist_Preparse(vlc_playlist_t *playlist, input_item_t *media,
bool parse_subitems);
/**
* Export the playlist to a file.
*
......
......@@ -81,9 +81,13 @@ struct vlc_metadata_cbs {
* This function creates the preparser object and thread.
*
* @param obj the parent object
* @param max_threads the maximum number of threads used to parse, must be >= 1
* @param default_timeout default timeout of the preparser, 0 for no limits.
* @return a valid preparser object or NULL in case of error
*/
VLC_API vlc_preparser_t *vlc_preparser_New( vlc_object_t *obj );
VLC_API vlc_preparser_t *vlc_preparser_New( vlc_object_t *obj,
unsigned max_threads,
vlc_tick_t default_timeout );
/**
* This function enqueues the provided item to be preparsed or fetched.
......@@ -137,14 +141,6 @@ VLC_API void vlc_preparser_Delete( vlc_preparser_t *preparser );
*/
VLC_API void vlc_preparser_Deactivate( vlc_preparser_t *preparser );
/**
* Recover the main preparser from libvlc
*
* @param libvlc valid libvlc object
* @return the main preparser (can be NULL)
*/
VLC_API vlc_preparser_t *libvlc_GetMainPreparser(libvlc_int_t *libvlc);
/** @} vlc_preparser */
#endif
......
......@@ -28,6 +28,8 @@
#include <vlc_modules.h>
#include <vlc/vlc.h>
#include <vlc_preparser.h>
#include <vlc_thumbnailer.h>
#include <vlc_interface.h>
#include <stdarg.h>
......@@ -78,6 +80,11 @@ libvlc_instance_t * libvlc_new( int argc, const char *const *argv )
p_new->p_libvlc_int = p_libvlc_int;
vlc_atomic_rc_init( &p_new->ref_count );
p_new->p_callback_list = NULL;
vlc_mutex_init(&p_new->lazy_init_lock);
p_new->parser = NULL;
p_new->thumbnailer = NULL;
return p_new;
error:
......@@ -99,6 +106,12 @@ void libvlc_release( libvlc_instance_t *p_instance )
if(vlc_atomic_rc_dec( &p_instance->ref_count ))
{
libvlc_Quit( p_instance->p_libvlc_int );
if (p_instance->parser != NULL)
vlc_preparser_Delete(p_instance->parser);
if (p_instance->thumbnailer != NULL)
vlc_thumbnailer_Release(p_instance->thumbnailer);
libvlc_InternalCleanup( p_instance->p_libvlc_int );
libvlc_InternalDestroy( p_instance->p_libvlc_int );
free( p_instance );
......@@ -235,4 +248,46 @@ int64_t libvlc_clock(void)
return US_FROM_VLC_TICK(vlc_tick_now());
}
vlc_preparser_t *libvlc_get_preparser(libvlc_instance_t *instance)
{
vlc_mutex_lock(&instance->lazy_init_lock);
vlc_preparser_t *parser = instance->parser;
if (parser == NULL)
{
/* Temporary: the 2 following variables will be configured directly
* with future libvlc_parser API */
int max_threads = var_InheritInteger(instance->p_libvlc_int, "preparse-threads");
if (max_threads < 1)
max_threads = 1;
vlc_tick_t default_timeout =
VLC_TICK_FROM_MS(var_InheritInteger(instance->p_libvlc_int, "preparse-timeout"));
if (default_timeout < 0)
default_timeout = 0;
parser = instance->parser =
vlc_preparser_New(VLC_OBJECT(instance->p_libvlc_int), max_threads,
default_timeout);
}
vlc_mutex_unlock(&instance->lazy_init_lock);
return parser;
}
vlc_thumbnailer_t *libvlc_get_thumbnailer(libvlc_instance_t *instance)
{
vlc_mutex_lock(&instance->lazy_init_lock);
vlc_thumbnailer_t *thumb = instance->thumbnailer;
if (thumb == NULL)
{
thumb = instance->thumbnailer =
vlc_thumbnailer_Create(VLC_OBJECT(instance->p_libvlc_int));
}
vlc_mutex_unlock(&instance->lazy_init_lock);
return thumb;
}
const char vlc_module_name[] = "libvlc";
......@@ -35,6 +35,9 @@
#include <vlc_arrays.h>
#include <vlc_threads.h>
typedef struct vlc_preparser_t vlc_preparser_t;
typedef struct vlc_thumbnailer_t vlc_thumbnailer_t;
/* Note well: this header is included from LibVLC core.
* Therefore, static inline functions MUST NOT call LibVLC functions here
* (this can cause linkage failure on some platforms). */
......@@ -99,6 +102,11 @@ struct libvlc_instance_t
libvlc_int_t *p_libvlc_int;
vlc_atomic_rc_t ref_count;
struct libvlc_callback_entry_list_t *p_callback_list;
vlc_mutex_t lazy_init_lock;
vlc_preparser_t *parser;
vlc_thumbnailer_t *thumbnailer;
struct
{
void (*cb) (void *, int, const libvlc_log_t *, const char *, va_list);
......@@ -144,4 +152,7 @@ static inline vlc_tick_t vlc_tick_from_libvlc_time(libvlc_time_t time)
return VLC_TICK_FROM_MS(time);
}
vlc_preparser_t *libvlc_get_preparser(libvlc_instance_t *instance);
vlc_thumbnailer_t *libvlc_get_thumbnailer(libvlc_instance_t *instance);
#endif
......@@ -740,8 +740,7 @@ int libvlc_media_parse_request(libvlc_instance_t *inst, libvlc_media_t *media,
|| expected == libvlc_media_parsed_status_done)
return -1;
libvlc_int_t *libvlc = inst->p_libvlc_int;
vlc_preparser_t *parser = libvlc_GetMainPreparser(libvlc);
vlc_preparser_t *parser = libvlc_get_preparser(inst);
if (unlikely(parser == NULL))
return -1;
......@@ -789,10 +788,9 @@ int libvlc_media_parse_request(libvlc_instance_t *inst, libvlc_media_t *media,
void
libvlc_media_parse_stop(libvlc_instance_t *inst, libvlc_media_t *media)
{
libvlc_int_t *libvlc = inst->p_libvlc_int;
vlc_preparser_t *parser = libvlc_GetMainPreparser(libvlc);
if (unlikely(parser != NULL))
vlc_preparser_Cancel(parser, media);
vlc_preparser_t *parser = libvlc_get_preparser(inst);
assert(parser != NULL);
vlc_preparser_Cancel(parser, media);
}
// Get Parsed status for media descriptor object
......@@ -911,8 +909,8 @@ libvlc_media_thumbnail_request_by_time( libvlc_instance_t *inst,
{
assert( md );
libvlc_priv_t *p_priv = libvlc_priv(inst->p_libvlc_int);
if( unlikely( p_priv->p_thumbnailer == NULL ) )
vlc_thumbnailer_t *thumb = libvlc_get_thumbnailer(inst);
if (unlikely(thumb == NULL))
return NULL;
libvlc_media_thumbnail_request_t *req = malloc( sizeof( *req ) );
......@@ -926,7 +924,7 @@ libvlc_media_thumbnail_request_by_time( libvlc_instance_t *inst,
req->type = picture_type;
req->crop = crop;
libvlc_media_retain( md );
req->req = vlc_thumbnailer_RequestByTime( p_priv->p_thumbnailer,
req->req = vlc_thumbnailer_RequestByTime( thumb,
vlc_tick_from_libvlc_time( time ),
speed == libvlc_media_thumbnail_seek_fast ?
VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE,
......@@ -954,8 +952,8 @@ libvlc_media_thumbnail_request_by_pos( libvlc_instance_t *inst,
{
assert( md );
libvlc_priv_t *priv = libvlc_priv(inst->p_libvlc_int);
if( unlikely( priv->p_thumbnailer == NULL ) )
vlc_thumbnailer_t *thumb = libvlc_get_thumbnailer(inst);
if (unlikely(thumb == NULL))
return NULL;
libvlc_media_thumbnail_request_t *req = malloc( sizeof( *req ) );
......@@ -969,7 +967,7 @@ libvlc_media_thumbnail_request_by_pos( libvlc_instance_t *inst,
req->crop = crop;
req->type = picture_type;
libvlc_media_retain( md );
req->req = vlc_thumbnailer_RequestByPos( priv->p_thumbnailer, pos,
req->req = vlc_thumbnailer_RequestByPos( thumb, pos,
speed == libvlc_media_thumbnail_seek_fast ?
VLC_THUMBNAILER_SEEK_FAST : VLC_THUMBNAILER_SEEK_PRECISE,
md->p_input_item,
......@@ -988,9 +986,10 @@ libvlc_media_thumbnail_request_by_pos( libvlc_instance_t *inst,
// Destroy a thumbnail request
void libvlc_media_thumbnail_request_destroy( libvlc_media_thumbnail_request_t *req )
{
libvlc_priv_t *p_priv = libvlc_priv(req->instance->p_libvlc_int);
assert( p_priv->p_thumbnailer != NULL );
vlc_thumbnailer_DestroyRequest( p_priv->p_thumbnailer, req->req );
vlc_thumbnailer_t *thumb = libvlc_get_thumbnailer(req->instance);
assert(thumb != NULL);
vlc_thumbnailer_DestroyRequest( thumb, req->req );
libvlc_media_release( req->md );
libvlc_release(req->instance);
free( req );
......
......@@ -79,7 +79,6 @@ extern NSString * const VLCInputItemCommonDataDifferingFlagString;
- (void)parseInputItem;
- (void)cancelParsing;
- (int)preparseInputItem;
- (int)writeMetadataToFile;
- (void)thumbnailWithSize:(NSSize)size
......
......@@ -35,10 +35,6 @@
NSString *VLCInputItemParsingSucceeded = @"VLCInputItemParsingSucceeded";
NSString *VLCInputItemParsingFailed = @"VLCInputItemParsingFailed";
NSString *VLCInputItemSubtreeAdded = @"VLCInputItemSubtreeAdded";
NSString *VLCInputItemPreparsingSkipped = @"VLCInputItemPreparsingSkipped";
NSString *VLCInputItemPreparsingFailed = @"VLCInputItemPreparsingFailed";
NSString *VLCInputItemPreparsingTimeOut = @"VLCInputItemPreparsingTimeOut";
NSString *VLCInputItemPreparsingSucceeded = @"VLCInputItemPreparsingSucceeded";
NSString * const VLCInputItemCommonDataDifferingFlagString = @"<differing>";
@interface VLCInputItem()
......@@ -48,7 +44,6 @@ NSString * const VLCInputItemCommonDataDifferingFlagString = @"<differing>";
- (void)parsingEnded:(int)status;
- (void)subTreeAdded:(input_item_node_t *)p_node;
- (void)preparsingEnded:(enum input_item_preparse_status)status;
@end
......@@ -76,21 +71,6 @@ static const struct input_item_parser_cbs_t parserCallbacks =
cb_subtree_added,
};
static void cb_preparse_ended(input_item_t *p_item, enum input_item_preparse_status status, void *p_data)
{
VLC_UNUSED(p_item);
dispatch_async(dispatch_get_main_queue(), ^{
VLCInputItem *inputItem = (__bridge VLCInputItem *)p_data;
[inputItem preparsingEnded:status];
});
}
static const struct vlc_metadata_cbs preparseCallbacks = {
cb_preparse_ended,
NULL,
cb_subtree_added,
};
@implementation VLCInputItem
- (instancetype)initWithInputItem:(struct input_item_t *)p_inputItem
......@@ -526,6 +506,8 @@ static const struct vlc_metadata_cbs preparseCallbacks = {
.cbs_data = (__bridge void *) self,
};
if (_p_parserID)
input_item_parser_id_Release(_p_parserID);
_p_parserID = input_item_Parse(VLC_OBJECT(getIntf()), _vlcInputItem, &cfg);
}
......@@ -564,44 +546,6 @@ static const struct vlc_metadata_cbs preparseCallbacks = {
return YES;
}
- (void)preparsingEnded:(enum input_item_preparse_status)status
{
NSNotificationCenter *notificationCenter = NSNotificationCenter.defaultCenter;
switch (status) {
case ITEM_PREPARSE_SKIPPED:
[notificationCenter postNotificationName:VLCInputItemPreparsingSkipped object:self];
break;
case ITEM_PREPARSE_FAILED:
[notificationCenter postNotificationName:VLCInputItemPreparsingFailed object:self];
break;
case ITEM_PREPARSE_TIMEOUT:
[notificationCenter postNotificationName:VLCInputItemPreparsingTimeOut object:self];
case ITEM_PREPARSE_DONE:
default:
[notificationCenter postNotificationName:VLCInputItemPreparsingSucceeded object:self];
break;
}
}
- (int)preparseInputItem
{
if (!_vlcInputItem) {
return VLC_ENOENT;
}
vlc_preparser_t *parser = libvlc_GetMainPreparser(vlc_object_instance(getIntf()));
if (unlikely(parser == NULL))
return VLC_ENOMEM;
return vlc_preparser_Push(parser, _vlcInputItem,
META_REQUEST_OPTION_SCOPE_ANY |
META_REQUEST_OPTION_FETCH_LOCAL |
META_REQUEST_OPTION_PARSE_SUBITEMS,
&preparseCallbacks,
(__bridge void *)self, -1, NULL);
}
- (void)subTreeAdded:(input_item_node_t *)p_node
{
_subTree = p_node;
......
......@@ -23,6 +23,7 @@
#import <Foundation/Foundation.h>
#import <vlc_media_source.h>
#import <vlc_preparser.h>
@class VLCInputItem;
@class VLCInputNode;
......@@ -36,13 +37,13 @@ extern NSString *VLCMediaSourcePreparsingEnded;
@interface VLCMediaSource : NSObject
- (instancetype)initForLocalDevices:(libvlc_int_t *)p_libvlcInstance;
- (instancetype)initForLocalDevices:(vlc_preparser_t *)p_preparser;
- (instancetype)initWithMediaSource:(vlc_media_source_t *)p_mediaSource
andLibVLCInstance:(libvlc_int_t *)p_libvlcInstance
andPreparser:(vlc_preparser_t *)p_preparser
forCategory:(enum services_discovery_category_e)category;
- (instancetype)initMyFoldersMediaSourceWithLibVLCInstance:(libvlc_int_t *)p_libvlcInstance;
- (instancetype)initMyFoldersMediaSourceWithPreparser:(vlc_preparser_t *)p_preparser;
- (instancetype)initWithLocalFolderMrl:(NSString *)mrl
andLibVLCInstance:(libvlc_int_t *)p_libvlcInstance;
andPreparser:(vlc_preparser_t *)p_preparser;
- (void)preparseInputNodeWithinTree:(VLCInputNode *)inputNode;
- (void)clearChildNodesForNode:(input_item_node_t*)inputNode;
......
......@@ -29,7 +29,7 @@
@interface VLCMediaSource ()
{
BOOL _respondsToDiskChanges;
libvlc_int_t *_p_libvlcInstance;
vlc_preparser_t *_p_preparser;
vlc_media_source_t *_p_mediaSource;
vlc_media_tree_listener_id *_p_treeListenerID;
}
......@@ -102,12 +102,12 @@ static const char *const myFoldersDescription = "My Folders";
#pragma mark - VLCMediaSource methods
@implementation VLCMediaSource
- (instancetype)initForLocalDevices:(libvlc_int_t *)p_libvlcInstance
- (instancetype)initForLocalDevices:(vlc_preparser_t *)p_preparser
{
self = [super init];
if (self) {
_respondsToDiskChanges = NO;
_p_libvlcInstance = p_libvlcInstance;
_p_preparser = p_preparser;
_p_mediaSource = malloc(sizeof(vlc_media_source_t));
if (!_p_mediaSource) {
......@@ -129,13 +129,13 @@ static const char *const myFoldersDescription = "My Folders";
}
- (instancetype)initWithMediaSource:(vlc_media_source_t *)p_mediaSource
andLibVLCInstance:(libvlc_int_t *)p_libvlcInstance
andPreparser:(vlc_preparser_t *)p_preparser
forCategory:(enum services_discovery_category_e)category
{
self = [super init];
if (self && p_mediaSource != NULL) {
_respondsToDiskChanges = NO;
_p_libvlcInstance = p_libvlcInstance;
_p_preparser = p_preparser;
_p_mediaSource = p_mediaSource;
vlc_media_source_Hold(_p_mediaSource);
_p_treeListenerID = vlc_media_tree_AddListener(_p_mediaSource->tree,
......@@ -147,11 +147,11 @@ static const char *const myFoldersDescription = "My Folders";
return self;
}
- (instancetype)initMyFoldersMediaSourceWithLibVLCInstance:(libvlc_int_t *)p_libvlcInstance
- (instancetype)initMyFoldersMediaSourceWithPreparser:(vlc_preparser_t *)p_preparser
{
self = [super init];
if (self) {
_p_libvlcInstance = p_libvlcInstance;
_p_preparser = p_preparser;
_p_mediaSource = malloc(sizeof(vlc_media_source_t));
if (!_p_mediaSource) {
......@@ -216,11 +216,11 @@ static const char *const myFoldersDescription = "My Folders";
}
- (instancetype)initWithLocalFolderMrl:(NSString *)mrl
andLibVLCInstance:(libvlc_int_t *)p_libvlcInstance
andPreparser:(vlc_preparser_t *)p_preparser
{
self = [super init];
if (self) {
_p_libvlcInstance = p_libvlcInstance;
_p_preparser = p_preparser;
_p_mediaSource = malloc(sizeof(vlc_media_source_t));
if (!_p_mediaSource) {
......@@ -316,11 +316,7 @@ static const char *const myFoldersDescription = "My Folders";
return;
}
vlc_preparser_t *parser = libvlc_GetMainPreparser(_p_libvlcInstance);
if (unlikely(parser == NULL))
return;
vlc_media_tree_Preparse(_p_mediaSource->tree, parser,
vlc_media_tree_Preparse(_p_mediaSource->tree, _p_preparser,
inputNode.inputItem.vlcInputItem, NULL);
}
......
......@@ -580,9 +580,9 @@ referenceSizeForHeaderInSection:(NSInteger)section
- (void)presentLocalFolderMrl:(NSString *)mrl
{
libvlc_int_t * const p_libvlcInstance = vlc_object_instance(getIntf());
vlc_preparser_t *p_preparser = getNetworkPreparser();
VLCMediaSource * const mediaSource =
[[VLCMediaSource alloc] initWithLocalFolderMrl:mrl andLibVLCInstance:p_libvlcInstance];
[[VLCMediaSource alloc] initWithLocalFolderMrl:mrl andPreparser:p_preparser];
if (mediaSource == nil) {
NSLog(@"Could not create valid media source for mrl: %@", mrl);
return;
......
......@@ -29,7 +29,7 @@
#import <vlc_media_source.h>
static inline void getMediaSourcesForCategory(NSMutableArray <VLCMediaSource *> *const restrict __unsafe_unretained outputArray,
libvlc_int_t *const restrict p_libvlcInstance,
vlc_preparser_t * restrict p_preparser,
vlc_media_source_provider_t *const restrict p_sourceProvider,
enum services_discovery_category_e const category)
{
......@@ -45,7 +45,7 @@ static inline void getMediaSourcesForCategory(NSMutableArray <VLCMediaSource *>
continue;
}
VLCMediaSource *const mediaSource = [[VLCMediaSource alloc] initWithMediaSource:p_mediaSource andLibVLCInstance:p_libvlcInstance forCategory:category];
VLCMediaSource *const mediaSource = [[VLCMediaSource alloc] initWithMediaSource:p_mediaSource andPreparser:p_preparser forCategory:category];
[outputArray addObject:mediaSource];
}
......@@ -57,6 +57,7 @@ static inline void getMediaSourcesForCategory(NSMutableArray <VLCMediaSource *>
+ (NSArray <VLCMediaSource *> *)listOfMediaSourcesForCategory:(enum services_discovery_category_e)category
{
libvlc_int_t *p_libvlcInstance = vlc_object_instance(getIntf());
vlc_preparser_t *p_preparser = getNetworkPreparser();
vlc_media_source_provider_t *p_sourceProvider = vlc_media_source_provider_Get(p_libvlcInstance);
if (p_sourceProvider == NULL) {
......@@ -65,19 +66,20 @@ static inline void getMediaSourcesForCategory(NSMutableArray <VLCMediaSource *>
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:32]; // A sane default
getMediaSourcesForCategory(mutableArray, p_libvlcInstance, p_sourceProvider, category);
getMediaSourcesForCategory(mutableArray, p_preparser, p_sourceProvider, category);
return [mutableArray copy];
}
+ (NSArray<VLCMediaSource *> *)listOfLocalMediaSources
{
libvlc_int_t * const p_libvlcInstance = vlc_object_instance(getIntf());
libvlc_int_t *p_libvlcInstance = vlc_object_instance(getIntf());
vlc_preparser_t *p_preparser = getNetworkPreparser();
NSMutableArray<VLCMediaSource *> * const mutableArray = [[NSMutableArray alloc] initWithCapacity:32]; // A sane default
// "My Folders" and "My Machine" entries are a bit of a custom implementation so it gets treated differently
VLCMediaSource * const myFoldersMediaSource = [[VLCMediaSource alloc] initMyFoldersMediaSourceWithLibVLCInstance:p_libvlcInstance];
VLCMediaSource * const localDevicesMediaSource = [[VLCMediaSource alloc] initForLocalDevices:p_libvlcInstance];
VLCMediaSource * const myFoldersMediaSource = [[VLCMediaSource alloc] initMyFoldersMediaSourceWithPreparser:p_preparser];
VLCMediaSource * const localDevicesMediaSource = [[VLCMediaSource alloc] initForLocalDevices:p_preparser];
[mutableArray addObject:myFoldersMediaSource];
[mutableArray addObject:localDevicesMediaSource];
......@@ -85,9 +87,9 @@ static inline void getMediaSourcesForCategory(NSMutableArray <VLCMediaSource *>
if (p_sourceProvider != NULL) {
// Currently, SD_CAT_MYCOMPUTER and SD_CAT_DEVICES return empty list.
// They are left for future implementation.
getMediaSourcesForCategory(mutableArray, p_libvlcInstance, p_sourceProvider, SD_CAT_MYCOMPUTER);
getMediaSourcesForCategory(mutableArray, p_libvlcInstance, p_sourceProvider, SD_CAT_DEVICES);
getMediaSourcesForCategory(mutableArray, p_libvlcInstance, p_sourceProvider, SD_CAT_LAN);
getMediaSourcesForCategory(mutableArray, p_preparser, p_sourceProvider, SD_CAT_MYCOMPUTER);
getMediaSourcesForCategory(mutableArray, p_preparser, p_sourceProvider, SD_CAT_DEVICES);
getMediaSourcesForCategory(mutableArray, p_preparser, p_sourceProvider, SD_CAT_LAN);
}
return [mutableArray copy];
......
......@@ -36,7 +36,10 @@
* Local prototypes.
*****************************************************************************/
typedef struct vlc_preparser_t vlc_preparser_t;
intf_thread_t *getIntf(void);
vlc_preparser_t *getNetworkPreparser();
extern NSString *VLCConfigurationChangedNotification;
......
......@@ -42,6 +42,7 @@
#include <vlc_dialog.h>
#include <vlc_url.h>
#include <vlc_variables.h>
#include <vlc_preparser.h>
#import "extensions/NSString+Helpers.h"
......@@ -133,12 +134,18 @@ NSString *VLCConfigurationChangedNotification = @"VLCConfigurationChangedNotific
*****************************************************************************/
static intf_thread_t *p_interface_thread;
static vlc_preparser_t *p_network_preparser;
intf_thread_t *getIntf()
{
return p_interface_thread;
}
vlc_preparser_t *getNetworkPreparser()
{
return p_network_preparser;
}
int OpenIntf (vlc_object_t *p_this)
{
__block int retcode = VLC_SUCCESS;
......@@ -147,6 +154,14 @@ int OpenIntf (vlc_object_t *p_this)
@autoreleasepool {
intf_thread_t *p_intf = (intf_thread_t*) p_this;
p_interface_thread = p_intf;
p_network_preparser = vlc_preparser_New(p_this, 1, 0);
if (p_network_preparser == nil)
{
retcode = VLC_ENOMEM;
dispatch_semaphore_signal(sem);
return;
}
msg_Dbg(p_intf, "Starting macosx interface");
@try {
......@@ -160,6 +175,7 @@ int OpenIntf (vlc_object_t *p_this)
} @catch (NSException *exception) {
msg_Err(p_intf, "Loading the macosx interface failed. Do you have a valid window server?");
retcode = VLC_EGENERIC;
dispatch_semaphore_signal(sem);
return;
}
dispatch_semaphore_signal(sem);
......@@ -182,6 +198,9 @@ void CloseIntf (vlc_object_t *p_this)
[VLCMain killInstance];
}
p_interface_thread = nil;
vlc_preparser_Delete(p_network_preparser);
p_network_preparser = nil;
};
if (CFRunLoopGetCurrent() == CFRunLoopGetMain())
release_intf();
......
......@@ -135,10 +135,6 @@ actionCallback(encodedBy);
selector:@selector(mediaItemWasParsed:)
name:VLCInputItemParsingSucceeded
object:nil];
[notificationCenter addObserver:self
selector:@selector(mediaItemWasParsed:)
name:VLCInputItemPreparsingSucceeded
object:nil];
[self initStrings];
......@@ -462,7 +458,7 @@ _##field##TextField.delegate = self
{
NSParameterAssert(inputItem != nil);
if (!inputItem.preparsed) {
[inputItem preparseInputItem];
[inputItem parseInputItem];
}
#define FILL_FIELD_FROM_INPUTITEM(field) \
......
......@@ -72,7 +72,8 @@
N_("Open Folder") )
DialogsProvider::DialogsProvider( qt_intf_t *_p_intf )
: QObject( NULL ), p_intf( _p_intf )
: QObject( NULL ), p_intf( _p_intf ), m_parser( nullptr, &input_item_parser_id_Release )
{
b_isDying = false;
}
......@@ -364,38 +365,37 @@ void DialogsProvider::mediaInfoDialog( const MLItemId& itemId )
}
else
{
static const struct vlc_metadata_cbs cbs = {
static const input_item_parser_cbs_t cbs = {
// on_preparse_ended
[]( input_item_t * const item, enum input_item_preparse_status status, void * const userData ) {
[]( input_item_t * const item, int status, void * const userData ) {
const auto dp = static_cast<DialogsProvider *>( userData );
if ( status == ITEM_PREPARSE_TIMEOUT || status == ITEM_PREPARSE_FAILED )
if ( status != VLC_SUCCESS )
qWarning( "Could not preparse input item %p. Status %i", item, status );
const SharedInputItem sharedInputItem{ item };
QMetaObject::invokeMethod( dp, [dp, sharedInputItem]() {
dp->m_parser.reset();
dp->mediaInfoDialog( sharedInputItem );
}, Qt::QueuedConnection );
},
// on_art_fetch_ended
NULL,
// on_subtree_added
NULL,
// on_attachments_added
NULL
NULL,
};
vlc_preparser_t *parser = libvlc_GetMainPreparser( vlc_object_instance( p_intf ) );
if (unlikely(parser == NULL))
return;
const struct input_item_parser_cfg cfg = {
.cbs = &cbs,
.cbs_data = this,
.subitems = true,
.interact = false,
};
const int result = vlc_preparser_Push( parser, inputItem,
static_cast<input_item_meta_request_option_t>(META_REQUEST_OPTION_SCOPE_ANY | META_REQUEST_OPTION_SCOPE_FORCED | META_REQUEST_OPTION_PARSE_SUBITEMS),
&cbs, this, 0, NULL );
if( Q_UNLIKELY( result != VLC_SUCCESS ) )
msg_Warn( p_intf, "vlc_preparser_Push() failed for input item %p (%s, %s)",
inputItem, inputItem->psz_name, inputItem->psz_uri );
m_parser = vlc::wrap_cptr( input_item_Parse( VLC_OBJECT( p_intf ),
inputItem, &cfg ),
&input_item_parser_id_Release );
}
}
......
......@@ -156,7 +156,8 @@ private:
#ifdef UPDATE_CHECK
std::unique_ptr<UpdateDialog> m_updateDialog;
#endif
std::unique_ptr<input_item_parser_id_t,
decltype(&input_item_parser_id_Release)> m_parser;
QWidget* root;
bool b_isDying;
......
......@@ -222,7 +222,7 @@ MainCtx::MainCtx(qt_intf_t *_p_intf)
QMetaObject::invokeMethod(m_medialib, &MediaLib::reload, Qt::QueuedConnection);
}
m_preparser = libvlc_GetMainPreparser(libvlc);
m_network_preparser = vlc_preparser_New(VLC_OBJECT(libvlc), 1, 0);
#ifdef UPDATE_CHECK
/* Checking for VLC updates */
......@@ -298,6 +298,9 @@ MainCtx::~MainCtx()
if (m_medialib)
delete m_medialib;
if (m_network_preparser)
vlc_preparser_Delete(m_network_preparser);
p_intf->p_mi = NULL;
}
......
......@@ -167,7 +167,7 @@ public:
public:
/* Getters */
inline qt_intf_t* getIntf() const { return p_intf; }
inline vlc_preparser_t *getPreparser() const { return m_preparser; };
inline vlc_preparser_t *getNetworkPreparser() const { return m_network_preparser; };
bool smoothScroll() const { return m_smoothScroll; }
VLCSystray* getSysTray() { return m_systray.get(); }
......@@ -321,7 +321,7 @@ protected:
void initSystray();
qt_intf_t* p_intf = nullptr;
vlc_preparser_t *m_preparser = nullptr;
vlc_preparser_t *m_network_preparser = nullptr;
bool m_hasEmbededVideo = false;
VideoSurfaceProvider* m_videoSurfaceProvider = nullptr;
......
......@@ -355,7 +355,7 @@ public:
if (!q->m_ctx || !m_hasTree || m_qmlInitializing)
return false;
auto parser = q->m_ctx->getPreparser();
auto parser = q->m_ctx->getNetworkPreparser();
if (unlikely(parser == NULL))
return false;
......@@ -494,7 +494,7 @@ NetworkMediaModel::~NetworkMediaModel()
//this can only be acquired from UI thread
if (!d->m_preparseSem.tryAcquire())
{
auto parser = m_ctx->getPreparser();
auto parser = m_ctx->getNetworkPreparser();
if (likely(parser != NULL))
{
vlc_preparser_Cancel( parser, this );
......
......@@ -62,6 +62,8 @@ PlayerControllerPrivate::~PlayerControllerPrivate()
vlc_player_aout_RemoveListener( m_player, m_player_aout_listener );
vlc_player_RemoveListener( m_player, m_player_listener );
vlc_player_RemoveTimer( m_player, m_player_timer );
if (m_preparser != nullptr)
vlc_preparser_Delete(m_preparser);
}
bool PlayerControllerPrivate::isCurrentItemSynced()
......@@ -1953,35 +1955,25 @@ void PlayerController::snapshot()
/* Playlist Control functions */
void PlayerController::requestArtUpdate( input_item_t *p_item, bool b_forced )
void PlayerController::requestArtUpdate( input_item_t *p_item )
{
Q_D(PlayerController);
if ( !p_item )
if (d->m_preparser == nullptr)
{
/* default to current item */
vlc_player_locker lock{ d->m_player };
if ( vlc_player_IsStarted( d->m_player ) )
p_item = vlc_player_GetCurrentMedia( d->m_player );
}
if ( p_item )
{
/* check if it has already been enqueued */
if ( p_item->p_meta && !b_forced )
{
int status = vlc_meta_GetStatus( p_item->p_meta );
if ( status & ( ITEM_ART_NOTFOUND|ITEM_ART_FETCHED ) )
return;
}
vlc_preparser_t *parser = libvlc_GetMainPreparser( vlc_object_instance(d->p_intf) );
if (unlikely(parser == NULL))
vlc_tick_t default_timeout =
VLC_TICK_FROM_MS(var_InheritInteger(d->p_intf, "preparse-timeout"));
if (default_timeout < 0)
default_timeout = 0;
d->m_preparser = vlc_preparser_New(VLC_OBJECT(d->p_intf), 1,
default_timeout);
if (unlikely(d->m_preparser == nullptr))
return;
vlc_preparser_Push( parser, p_item,
(b_forced) ? META_REQUEST_OPTION_FETCH_ANY
: META_REQUEST_OPTION_FETCH_LOCAL,
&art_fetcher_cbs, d, 0, NULL );
}
vlc_preparser_Push( d->m_preparser, p_item, META_REQUEST_OPTION_FETCH_ANY,
&art_fetcher_cbs, d, -1, nullptr );
}
void PlayerControllerPrivate::onArtFetchEnded(input_item_t *p_item, bool)
......