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 (11)
Showing with 312 additions and 34 deletions
......@@ -444,6 +444,23 @@ typedef struct input_item_parser_cbs_t
* @param userdata user data set by input_item_Parse()
*/
void (*on_subtree_added)(input_item_t *item, input_item_node_t *subtree, void *userdata);
/**
* Event received when new attachments are added
*
* @note This callback is optional. It can be called several times for one
* parse request. The array contains only new elements after a second call.
*
* @param item the parsed item
* @param array valid array containing new elements, should only be used
* within the callback. One and all elements can be held and stored on a
* new variable or new array.
* @param count number of elements in the array
* @param userdata user data set by input_item_Parse()
*/
void (*on_attachments_added)(input_item_t *item,
input_attachment_t *const *array,
size_t count, void *userdata);
} input_item_parser_cbs_t;
/**
......@@ -513,6 +530,9 @@ struct vlc_metadata_cbs {
void (*on_preparse_ended)(input_item_t *, enum input_item_preparse_status status, void *userdata);
void (*on_art_fetch_ended)(input_item_t *, bool fetched, void *userdata);
void (*on_subtree_added)(input_item_t *, input_item_node_t *subtree, void *userdata);
void (*on_attachments_added)(input_item_t *item,
input_attachment_t *const *array,
size_t count, void *userdata);
};
VLC_API int libvlc_MetadataRequest( libvlc_int_t *, input_item_t *,
......
......@@ -3186,6 +3186,24 @@ struct vlc_player_cbs
void (*on_media_subitems_changed)(vlc_player_t *player,
input_item_t *media, input_item_node_t *new_subitems, void *data);
/**
* Called when new attachments are added to the media
*
* @note It can be called several times for one parse request. The array
* contains only new elements after a second call.
*
* @param player locked player instance
* @param media current media
* @param array valid array containing new elements, should only be used
* within the callback. One and all elements can be held and stored on a
* new variable or new array.
* @param count number of elements in the array
* @param data opaque pointer set by vlc_player_AddListener()
*/
void (*on_media_attachments_added)(vlc_player_t *player,
input_item_t *media, input_attachment_t *const *array, size_t count,
void *data);
/**
* Called when a vout is started or stopped
*
......
......@@ -310,15 +310,16 @@ static void input_item_duration_changed( const vlc_event_t *p_event,
libvlc_event_send( &p_md->event_manager, &event );
}
static void input_item_attachments_found( const vlc_event_t *p_event,
void * user_data )
static void input_item_attachments_added( input_item_t *item,
input_attachment_t *const *array,
size_t count, void *user_data )
{
VLC_UNUSED(item);
libvlc_media_t * p_md = user_data;
libvlc_event_t event;
libvlc_picture_list_t* list = libvlc_picture_list_from_attachments(
p_event->u.input_item_attachments_found.attachments,
p_event->u.input_item_attachments_found.count );
libvlc_picture_list_t* list =
libvlc_picture_list_from_attachments(array, count);
if( !list )
return;
if( !libvlc_picture_list_count(list) )
......@@ -409,10 +410,6 @@ static void install_input_item_observer( libvlc_media_t *p_md )
vlc_InputItemDurationChanged,
input_item_duration_changed,
p_md );
vlc_event_attach( &p_md->p_input_item->event_manager,
vlc_InputItemAttachmentsFound,
input_item_attachments_found,
p_md );
}
/**
......@@ -429,10 +426,6 @@ static void uninstall_input_item_observer( libvlc_media_t *p_md )
vlc_InputItemDurationChanged,
input_item_duration_changed,
p_md );
vlc_event_detach( &p_md->p_input_item->event_manager,
vlc_InputItemAttachmentsFound,
input_item_attachments_found,
p_md );
}
/**
......@@ -826,6 +819,7 @@ libvlc_media_get_filestat( libvlc_media_t *p_md, unsigned type, uint64_t *out )
static const struct vlc_metadata_cbs preparser_callbacks = {
.on_preparse_ended = input_item_preparse_ended,
.on_subtree_added = input_item_subtree_added,
.on_attachments_added = input_item_attachments_added,
};
int libvlc_media_parse_request(libvlc_instance_t *inst, libvlc_media_t *media,
......
......@@ -208,7 +208,7 @@ libvlc_time_t libvlc_picture_get_time( const libvlc_picture_t* pic )
return pic->time;
}
libvlc_picture_list_t* libvlc_picture_list_from_attachments( input_attachment_t** attachments,
libvlc_picture_list_t* libvlc_picture_list_from_attachments( input_attachment_t* const* attachments,
size_t nb_attachments )
{
size_t size = 0;
......
......@@ -44,7 +44,7 @@ libvlc_picture_t* libvlc_picture_new( vlc_object_t* p_obj, picture_t* p_pic,
unsigned int i_width, unsigned int i_height,
bool b_crop );
libvlc_picture_list_t* libvlc_picture_list_from_attachments( input_attachment_t** attachments,
libvlc_picture_list_t* libvlc_picture_list_from_attachments( input_attachment_t* const* attachments,
size_t nb_attachments );
#endif /* PICTURE_INTERNAL_H */
......@@ -223,6 +223,7 @@ var_Read_float(const char *psz)
X(chapter_count, ssize_t, add_integer, Ssize, 0) \
X(null_names, bool, add_bool, Bool, false) \
X(program_count, ssize_t, add_integer, Ssize, 0) \
X(attachment_count, ssize_t, add_integer, Ssize, 0) \
X(can_seek, bool, add_bool, Bool, true) \
X(can_pause, bool, add_bool, Bool, true) \
X(can_control_pace, bool, add_bool, Bool, true) \
......@@ -310,6 +311,8 @@ struct demux_sys
struct mock_video_options video;
struct mock_audio_options audio;
struct mock_sub_options sub;
char *art_url;
};
#undef X
......@@ -359,6 +362,100 @@ CreateTitle(demux_t *demux, size_t idx)
return t;
}
static input_attachment_t *
CreateAttachment(demux_t *demux, const char *prefix_name, size_t index)
{
input_attachment_t *attach = NULL;
picture_t *pic = NULL;
block_t *block = NULL;
char *name;
int ret = asprintf(&name, "%s %zu", prefix_name, index);
if (ret < 0)
return NULL;
pic = picture_New(VLC_CODEC_RGB24, 100, 100, 1, 1);
if (pic == NULL)
goto end;
memset(pic->p[0].p_pixels, 0x80, pic->p[0].i_lines * pic->p[0].i_pitch);
ret = picture_Export(VLC_OBJECT(demux), &block, NULL, pic, VLC_CODEC_BMP,
0, 0, false);
if (ret != VLC_SUCCESS)
goto end;
attach = vlc_input_attachment_New(name, "image/bmp", "Mock Attach Desc",
block->p_buffer, block->i_buffer);
end:
if (block != NULL)
block_Release(block);
if (pic != NULL)
picture_Release(pic);
free(name);
return attach;
}
static int
GetAttachments(demux_t *demux, input_attachment_t ***attach_array_p,
int *attach_count_p)
{
struct demux_sys *sys = demux->p_sys;
assert(sys->attachment_count > 0);
size_t attachment_count = sys->attachment_count;
input_attachment_t **attach_array =
vlc_alloc(sys->attachment_count, sizeof(*attach_array));
if (attach_array == NULL)
return VLC_ENOMEM;
for (size_t i = 0; i < attachment_count; i++)
{
attach_array[i] = CreateAttachment(demux, "Mock Attach", i);
if (attach_array[i] == NULL)
{
if (i == 0)
{
free(attach_array);
return VLC_ENOMEM;
}
*attach_array_p = attach_array;
*attach_count_p = i;
return VLC_SUCCESS;
}
if (sys->art_url == NULL
&& asprintf(&sys->art_url, "attachment://%s",
attach_array[i]->psz_name) == -1)
sys->art_url = NULL;
}
*attach_array_p = attach_array;
*attach_count_p = sys->attachment_count;
return VLC_SUCCESS;
}
static vlc_meta_t *
CreateMeta(demux_t *demux)
{
struct demux_sys *sys = demux->p_sys;
vlc_meta_t *meta = vlc_meta_New();
if (meta == NULL)
return NULL;
vlc_meta_SetArtist(meta, "VideoLAN");
vlc_meta_SetGenre(meta, "Best Media Player");
if (sys->art_url != NULL)
vlc_meta_SetArtURL(meta, sys->art_url);
return meta;
}
static int
Control(demux_t *demux, int query, va_list args)
{
......@@ -379,7 +476,15 @@ Control(demux_t *demux, int query, va_list args)
*va_arg(args, vlc_tick_t *) = sys->pts_delay;
return VLC_SUCCESS;
case DEMUX_GET_META:
return VLC_EGENERIC;
{
vlc_meta_t *meta_out = va_arg(args, vlc_meta_t *);
vlc_meta_t *meta = CreateMeta(demux);
if (meta == NULL)
return VLC_ENOMEM;
vlc_meta_Merge(meta_out, meta);
vlc_meta_Delete(meta);
return VLC_SUCCESS;
}
case DEMUX_GET_SIGNAL:
return VLC_EGENERIC;
case DEMUX_SET_PAUSE_STATE:
......@@ -492,7 +597,14 @@ Control(demux_t *demux, int query, va_list args)
case DEMUX_HAS_UNSUPPORTED_META:
return VLC_EGENERIC;
case DEMUX_GET_ATTACHMENTS:
return VLC_EGENERIC;
{
input_attachment_t ***attach_array_p = va_arg(args, input_attachment_t***);
int *attach_count_p = va_arg(args, int *);
if (sys->attachment_count <= 0)
return VLC_EGENERIC;
return GetAttachments(demux, attach_array_p, attach_count_p);
}
case DEMUX_CAN_RECORD:
*va_arg(args, bool *) = sys->can_record;
return VLC_SUCCESS;
......@@ -1313,6 +1425,8 @@ Close(vlc_object_t *obj)
DeleteTrack(demux, track);
}
vlc_vector_clear(&sys->tracks);
free(sys->art_url);
}
static int
......@@ -1337,6 +1451,7 @@ Open(vlc_object_t *obj)
OPTIONS_AUDIO(READ_SUBOPTION)
OPTIONS_VIDEO(READ_SUBOPTION)
OPTIONS_SUB(READ_SUBOPTION)
sys->art_url = NULL;
if (sys->node_count > 0)
{
......
......@@ -403,7 +403,9 @@ void DialogsProvider::mediaInfoDialog( const MLItemId& itemId )
}, Qt::QueuedConnection );
},
// on_subtree_added
NULL
NULL,
// on_attachments_added
NULL,
};
input_item_parser_id_t * const parser = input_item_Parse( inputItem, VLC_OBJECT( p_intf ), &cbs, this );
......
......@@ -1024,6 +1024,7 @@ static const struct vlc_player_cbs player_cbs = {
on_player_media_meta_changed,
on_player_media_epg_changed,
on_player_subitems_changed,
nullptr, // on_media_attachments_added: not used
on_player_vout_changed,
on_player_corks_changed,
on_player_playback_restore_queried,
......
......@@ -187,12 +187,14 @@ void MetadataExtractor::onParserSubtreeAdded( input_item_t *,
ctx->mde->addSubtree( *ctx, subtree );
}
void MetadataExtractor::onAttachmentFound( const vlc_event_t* p_event, void* data )
void MetadataExtractor::onAttachmentsAdded( input_item_t *,
input_attachment_t *const *array,
size_t count, void *data )
{
auto ctx = static_cast<ParseContext*>( data );
for ( auto i = 0u; i < p_event->u.input_item_attachments_found.count; ++i )
for ( auto i = 0u; i < count; ++i )
{
auto a = p_event->u.input_item_attachments_found.attachments[i];
auto a = array[i];
auto fcc = image_Mime2Fourcc( a->psz_mime );
if ( fcc != VLC_CODEC_PNG && fcc != VLC_CODEC_JPEG )
continue;
......@@ -222,13 +224,10 @@ medialibrary::parser::Status MetadataExtractor::run( medialibrary::parser::IItem
if ( ctx.inputItem == nullptr )
return medialibrary::parser::Status::Fatal;
if ( vlc_event_attach( &ctx.inputItem->event_manager, vlc_InputItemAttachmentsFound,
&MetadataExtractor::onAttachmentFound, &ctx ) != VLC_SUCCESS )
return medialibrary::parser::Status::Fatal;
const input_item_parser_cbs_t cbs = {
&MetadataExtractor::onParserEnded,
&MetadataExtractor::onParserSubtreeAdded,
&MetadataExtractor::onAttachmentsAdded,
};
m_currentCtx = &ctx;
ctx.inputItem->i_preparse_depth = 1;
......@@ -239,8 +238,6 @@ medialibrary::parser::Status MetadataExtractor::run( medialibrary::parser::IItem
};
if ( ctx.inputParser == nullptr )
{
vlc_event_detach( &ctx.inputItem->event_manager, vlc_InputItemAttachmentsFound,
&MetadataExtractor::onAttachmentFound, &ctx );
m_currentCtx = nullptr;
return medialibrary::parser::Status::Fatal;
}
......@@ -260,8 +257,6 @@ medialibrary::parser::Status MetadataExtractor::run( medialibrary::parser::IItem
}
m_currentCtx = nullptr;
}
vlc_event_detach( &ctx.inputItem->event_manager, vlc_InputItemAttachmentsFound,
&MetadataExtractor::onAttachmentFound, &ctx );
if ( !ctx.success || ctx.inputParser == nullptr )
return medialibrary::parser::Status::Fatal;
......
......@@ -167,6 +167,7 @@ static bool request_metadata_sync( libvlc_int_t *libvlc, input_item_t *media,
static const input_item_parser_cbs_t cbs = {
onParserEnded,
onParserSubtreeAdded,
nullptr,
};
auto inputParser = vlc::wrap_cptr( input_item_Parse( media, VLC_OBJECT( libvlc ), &cbs, &req ),
......
......@@ -106,7 +106,9 @@ private:
static void onParserEnded( input_item_t *, int status, void *user_data );
static void onParserSubtreeAdded( input_item_t *, input_item_node_t *subtree,
void *user_data );
static void onAttachmentFound( const vlc_event_t* p_event, void* data );
static void onAttachmentsAdded( input_item_t *,
input_attachment_t *const *array,
size_t count, void *data );
private:
vlc::threads::condition_variable m_cond;
......
......@@ -3116,6 +3116,12 @@ static void AppendAttachment( input_thread_t *p_input, int i_new,
.type = vlc_InputItemAttachmentsFound,
.u.input_item_attachments_found.attachments = pp_new,
.u.input_item_attachments_found.count = i_new } );
input_SendEvent(p_input, &(struct vlc_input_event) {
.type = INPUT_EVENT_ATTACHMENTS,
.attachments = { .array = pp_new, .count = i_new },
});
free( pp_new );
return;
}
......
......@@ -142,6 +142,9 @@ typedef enum input_event_type_e
/* Thumbnail generation */
INPUT_EVENT_THUMBNAIL_READY,
/* Attachments */
INPUT_EVENT_ATTACHMENTS,
} input_event_type_e;
#define VLC_INPUT_CAPABILITIES_SEEKABLE (1<<0)
......@@ -256,6 +259,12 @@ struct vlc_input_event_vout
vlc_es_id_t *id;
};
struct vlc_input_event_attachments
{
input_attachment_t *const* array;
size_t count;
};
struct vlc_input_event
{
input_event_type_e type;
......@@ -299,6 +308,8 @@ struct vlc_input_event
float subs_fps;
/* INPUT_EVENT_THUMBNAIL_READY */
picture_t *thumbnail;
/* INPUT_EVENT_ATTACHMENTS */
struct vlc_input_event_attachments attachments;
};
};
......
......@@ -1414,6 +1414,13 @@ input_item_parser_InputEvent(input_thread_t *input,
parser->cbs->on_subtree_added(input_GetItem(input),
event->subitems, parser->userdata);
break;
case INPUT_EVENT_ATTACHMENTS:
if (parser->cbs->on_attachments_added != NULL)
parser->cbs->on_attachments_added(input_GetItem(input),
event->attachments.array,
event->attachments.count,
parser->userdata);
break;
default:
break;
}
......
......@@ -888,6 +888,12 @@ input_thread_Events(input_thread_t *input_thread,
vlc_player_SendEvent(player, on_teletext_transparency_changed,
input->teletext_transparent);
break;
case INPUT_EVENT_ATTACHMENTS:
vlc_player_SendEvent(player, on_media_attachments_added,
input_GetItem(input->thread),
event->attachments.array,
event->attachments.count);
break;
default:
break;
}
......
......@@ -171,6 +171,27 @@ OnParserSubtreeAdded(input_item_t *item, input_item_node_t *subtree,
task->cbs->on_subtree_added(task->item, subtree, task->userdata);
}
static void
OnParserAttachmentsAdded(input_item_t *item,
input_attachment_t *const *array,
size_t count, void *task_)
{
VLC_UNUSED(item);
struct task *task = task_;
if (task->cbs && task->cbs->on_attachments_added)
task->cbs->on_attachments_added(task->item, array, count, task->userdata);
}
static void
SetItemPreparsed(struct task *task)
{
int status = atomic_load_explicit(&task->preparse_status,
memory_order_relaxed);
if (status == ITEM_PREPARSE_DONE)
input_item_SetPreparsed(task->item);
}
static void
OnArtFetchEnded(input_item_t *item, bool fetched, void *userdata)
{
......@@ -180,7 +201,7 @@ OnArtFetchEnded(input_item_t *item, bool fetched, void *userdata)
struct task *task = userdata;
if (!atomic_load(&task->interrupted))
input_item_SetPreparsed(task->item);
SetItemPreparsed(task);
NotifyPreparseEnded(task, fetched);
TaskDelete(task);
......@@ -196,6 +217,7 @@ Parse(struct task *task, vlc_tick_t deadline)
static const input_item_parser_cbs_t cbs = {
.on_ended = OnParserEnded,
.on_subtree_added = OnParserSubtreeAdded,
.on_attachments_added = OnParserAttachmentsAdded,
};
vlc_object_t *obj = task->preparser->owner;
......@@ -268,7 +290,7 @@ RunnableRun(void *userdata)
return; /* Remove the task and notify from the fetcher callback */
if (!atomic_load(&task->interrupted))
input_item_SetPreparsed(task->item);
SetItemPreparsed(task);
end:
NotifyPreparseEnded(task, false);
......
......@@ -118,6 +118,12 @@ struct report_media_subitems
input_item_t **items;
};
struct report_media_attachments
{
input_attachment_t **array;
size_t count;
};
#define REPORT_LIST \
X(input_item_t *, on_current_media_changed) \
X(enum vlc_player_state, on_state_changed) \
......@@ -146,6 +152,7 @@ struct report_media_subitems
X(input_item_t *, on_media_meta_changed) \
X(input_item_t *, on_media_epg_changed) \
X(struct report_media_subitems, on_media_subitems_changed) \
X(struct report_media_attachments, on_media_attachments_added) \
struct report_timer
{
......@@ -204,6 +211,7 @@ struct media_params
size_t title_count;
size_t chapter_count;
size_t attachment_count;
bool can_seek;
bool can_pause;
......@@ -227,6 +235,7 @@ struct media_params
.video_frame_rate_base = 1, \
.title_count = 0, \
.chapter_count = 0, \
.attachment_count = 0, \
.can_seek = true, \
.can_pause = true, \
.error = false, \
......@@ -583,6 +592,25 @@ player_on_media_subitems_changed(vlc_player_t *player, input_item_t *media,
VEC_PUSH(on_media_subitems_changed, report);
}
static void
player_on_media_attachments_added(vlc_player_t *player,
input_item_t *media,
input_attachment_t *const *array, size_t count,
void *data)
{
(void) media;
struct ctx *ctx = get_ctx(player, data);
struct report_media_attachments report = {
.array = vlc_alloc(count, sizeof(input_attachment_t *)),
.count = count,
};
assert(report.array);
for (size_t i = 0; i < count; ++i)
report.array[i] = vlc_input_attachment_Hold(array[i]);
VEC_PUSH(on_media_attachments_added, report);
}
#define VEC_LAST(vec) (vec)->data[(vec)->size - 1]
#define assert_position(ctx, report) do { \
assert(fabs((report)->pos - (report)->time / (float) ctx->params.length) < 0.001); \
......@@ -713,6 +741,16 @@ ctx_reset(struct ctx *ctx)
free(report.items);
}
}
{
struct report_media_attachments report;
FOREACH_VEC(report, on_media_attachments_added)
{
for (size_t i = 0; i < report.count; ++i)
vlc_input_attachment_Release(report.array[i]);
free(report.array);
}
}
#undef CLEAN_MEDIA_VEC
#undef FOREACH_VEC
......@@ -755,7 +793,7 @@ create_mock_media(const char *name, const struct media_params *params)
"video_frame_rate=%u;video_frame_rate_base=%u;"
"title_count=%zu;chapter_count=%zu;"
"can_seek=%d;can_pause=%d;error=%d;null_names=%d;"
"config=%s",
"config=%s;attachment_count=%zu",
params->track_count[VIDEO_ES], params->track_count[AUDIO_ES],
params->track_count[SPU_ES], params->program_count,
params->video_packetized, params->audio_packetized,
......@@ -763,7 +801,7 @@ create_mock_media(const char *name, const struct media_params *params)
params->video_frame_rate, params->video_frame_rate_base,
params->title_count, params->chapter_count,
params->can_seek, params->can_pause, params->error, params->null_names,
params->config ? params->config : "");
params->config ? params->config : "", params->attachment_count);
assert(ret != -1);
input_item_t *item = input_item_New(url, name);
assert(item);
......@@ -2843,6 +2881,45 @@ test_teletext(struct ctx *ctx)
#endif
}
static void
test_attachments(struct ctx *ctx)
{
test_log("attachments\n");
vlc_player_t *player = ctx->player;
struct media_params params = DEFAULT_MEDIA_PARAMS(VLC_TICK_FROM_SEC(1));
params.attachment_count = 99;
player_set_next_mock_media(ctx, "media1", &params);
player_start(ctx);
vec_on_media_attachments_added *vec = &ctx->report.on_media_attachments_added;
while (vec->size == 0)
vlc_player_CondWait(player, &ctx->wait);
input_attachment_t **array = vec->data[0].array;
size_t count = vec->data[0].count;
assert(count == params.attachment_count);
for (size_t i = 0; i < count; ++i)
{
input_attachment_t *attach = array[i];
assert(strcmp(attach->psz_mime, "image/bmp") == 0);
assert(strcmp(attach->psz_description, "Mock Attach Desc") == 0);
char *name;
int ret = asprintf(&name, "Mock Attach %zu", i);
assert(ret > 0);
assert(strcmp(attach->psz_name, name) == 0);
free(name);
}
test_end(ctx);
}
static void
test_audio_loudness_meter_cb(vlc_tick_t date, double momentary_loudness,
void *data)
......@@ -2994,6 +3071,7 @@ main(void)
test_programs(&ctx);
test_timers(&ctx);
test_teletext(&ctx);
test_attachments(&ctx);
test_delete_while_playback(VLC_OBJECT(ctx.vlc->p_libvlc_int), true);
test_delete_while_playback(VLC_OBJECT(ctx.vlc->p_libvlc_int), false);
......