vlc/vlc-2.2 | branch: master | Ludovic Fauvet <e...@videolan.org> | Wed Dec 17 18:27:42 2014 +0100| [6583dd3af930a1f6a5edaf6b4ac122ba6247c3a5] | committer: Ludovic Fauvet
Fix broken NowPlaying (close #9960, #11796, #12850) Prevent the es_out from overriding the NowPlaying state by splitting the meta into NowPlaying and ESNowPlaying. The internal function input_item_GetNowPlayingFb can be used to return the preferred meta value. Stripped-down version of d4ccd7a5b404f62435c60ecc65f772dab83f5937 available on master. Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> > http://git.videolan.org/gitweb.cgi/vlc/vlc-2.2.git/?a=commit;h=6583dd3af930a1f6a5edaf6b4ac122ba6247c3a5 --- include/vlc_input_item.h | 12 ++++++++++++ include/vlc_meta.h | 1 + lib/media.c | 23 +++++++++++++++++------ src/input/es_out.c | 9 +++++---- src/input/input.c | 1 + src/input/meta.c | 1 + src/input/resource.c | 2 +- src/text/strings.c | 36 +++++++++++++++++++++++++++--------- src/video_output/video_epg.c | 2 +- 9 files changed, 66 insertions(+), 21 deletions(-) diff --git a/include/vlc_input_item.h b/include/vlc_input_item.h index bc5b2e5..f4eb4bb 100644 --- a/include/vlc_input_item.h +++ b/include/vlc_input_item.h @@ -200,6 +200,17 @@ VLC_API void input_item_SetDuration( input_item_t * p_i, mtime_t i_duration ); VLC_API bool input_item_IsPreparsed( input_item_t *p_i ); VLC_API bool input_item_IsArtFetched( input_item_t *p_i ); +static inline char *input_item_GetNowPlayingFb( input_item_t *p_item ) +{ + char *psz_meta = input_item_GetMeta( p_item, vlc_meta_NowPlaying ); + if( !psz_meta || strlen( psz_meta ) == 0 ) + { + free( psz_meta ); + return input_item_GetMeta( p_item, vlc_meta_ESNowPlaying ); + } + return psz_meta; +} + #define INPUT_META( name ) \ static inline \ void input_item_Set ## name (input_item_t *p_input, const char *val) \ @@ -225,6 +236,7 @@ INPUT_META(Setting) INPUT_META(URL) INPUT_META(Language) INPUT_META(NowPlaying) +INPUT_META(ESNowPlaying) INPUT_META(Publisher) INPUT_META(EncodedBy) INPUT_META(ArtworkURL) diff --git a/include/vlc_meta.h b/include/vlc_meta.h index c3bf801..15ef2af 100644 --- a/include/vlc_meta.h +++ b/include/vlc_meta.h @@ -45,6 +45,7 @@ typedef enum vlc_meta_type_t vlc_meta_URL, vlc_meta_Language, vlc_meta_NowPlaying, + vlc_meta_ESNowPlaying, vlc_meta_Publisher, vlc_meta_EncodedBy, vlc_meta_ArtworkURL, diff --git a/lib/media.c b/lib/media.c index 1f6fb9e..c2a4ef5 100644 --- a/lib/media.c +++ b/lib/media.c @@ -86,6 +86,7 @@ static const libvlc_meta_t vlc_to_libvlc_meta[] = [vlc_meta_URL] = libvlc_meta_URL, [vlc_meta_Language] = libvlc_meta_Language, [vlc_meta_NowPlaying] = libvlc_meta_NowPlaying, + [vlc_meta_ESNowPlaying] = libvlc_meta_NowPlaying, [vlc_meta_Publisher] = libvlc_meta_Publisher, [vlc_meta_EncodedBy] = libvlc_meta_EncodedBy, [vlc_meta_ArtworkURL] = libvlc_meta_ArtworkURL, @@ -491,12 +492,22 @@ libvlc_media_get_mrl( libvlc_media_t * p_md ) char *libvlc_media_get_meta( libvlc_media_t *p_md, libvlc_meta_t e_meta ) { - char *psz_meta = input_item_GetMeta( p_md->p_input_item, - libvlc_to_vlc_meta[e_meta] ); - /* Should be integrated in core */ - if( psz_meta == NULL && e_meta == libvlc_meta_Title - && p_md->p_input_item->psz_name != NULL ) - psz_meta = strdup( p_md->p_input_item->psz_name ); + char *psz_meta = NULL; + + if( e_meta == libvlc_meta_NowPlaying ) + { + psz_meta = input_item_GetNowPlayingFb( p_md->p_input_item ); + } + else + { + psz_meta = input_item_GetMeta( p_md->p_input_item, + libvlc_to_vlc_meta[e_meta] ); + + /* Should be integrated in core */ + if( psz_meta == NULL && e_meta == libvlc_meta_Title + && p_md->p_input_item->psz_name != NULL ) + psz_meta = strdup( p_md->p_input_item->psz_name ); + } return psz_meta; } diff --git a/src/input/es_out.c b/src/input/es_out.c index ab09254..ddf01e1 100644 --- a/src/input/es_out.c +++ b/src/input/es_out.c @@ -1014,7 +1014,7 @@ static void EsOutProgramSelect( es_out_t *out, es_out_pgrm_t *p_pgrm ) } /* Update now playing */ - input_item_SetNowPlaying( p_input->p->p_item, p_pgrm->psz_now_playing ); + input_item_SetESNowPlaying( p_input->p->p_item, p_pgrm->psz_now_playing ); input_item_SetPublisher( p_input->p->p_item, p_pgrm->psz_publisher ); input_SendEventMeta( p_input ); @@ -1157,6 +1157,7 @@ static void EsOutProgramMeta( es_out_t *out, int i_group, const vlc_meta_t *p_me /* Check against empty meta data (empty for what we handle) */ if( !vlc_meta_Get( p_meta, vlc_meta_Title) && !vlc_meta_Get( p_meta, vlc_meta_NowPlaying) && + !vlc_meta_Get( p_meta, vlc_meta_ESNowPlaying) && !vlc_meta_Get( p_meta, vlc_meta_Publisher) && vlc_meta_GetExtraCount( p_meta ) <= 0 ) { @@ -1295,20 +1296,20 @@ static void EsOutProgramEpg( es_out_t *out, int i_group, const vlc_epg_t *p_epg if( p_pgrm == p_sys->p_pgrm ) { - input_item_SetNowPlaying( p_input->p->p_item, p_pgrm->psz_now_playing ); + input_item_SetESNowPlaying( p_input->p->p_item, p_pgrm->psz_now_playing ); input_SendEventMeta( p_input ); } if( p_pgrm->psz_now_playing ) { input_Control( p_input, INPUT_ADD_INFO, psz_cat, - vlc_meta_TypeToLocalizedString(vlc_meta_NowPlaying), "%s", + vlc_meta_TypeToLocalizedString(vlc_meta_ESNowPlaying), "%s", p_pgrm->psz_now_playing ); } else { input_Control( p_input, INPUT_DEL_INFO, psz_cat, - vlc_meta_TypeToLocalizedString(vlc_meta_NowPlaying) ); + vlc_meta_TypeToLocalizedString(vlc_meta_ESNowPlaying) ); } free( psz_cat ); diff --git a/src/input/input.c b/src/input/input.c index 41c1a99..05e4ff3 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -449,6 +449,7 @@ static input_thread_t *Create( vlc_object_t *p_parent, input_item_t *p_item, /* Remove 'Now playing' info as it is probably outdated */ input_item_SetNowPlaying( p_item, NULL ); + input_item_SetESNowPlaying( p_item, NULL ); input_SendEventMeta( p_input ); /* */ diff --git a/src/input/meta.c b/src/input/meta.c index 892b4af..2fb14d8 100644 --- a/src/input/meta.c +++ b/src/input/meta.c @@ -65,6 +65,7 @@ const char * vlc_meta_TypeToLocalizedString( vlc_meta_type_t meta_type ) [vlc_meta_URL] = N_("URL"), [vlc_meta_Language] = N_("Language"), [vlc_meta_NowPlaying] = N_("Now Playing"), + [vlc_meta_ESNowPlaying]= N_("Now Playing"), [vlc_meta_Publisher] = N_("Publisher"), [vlc_meta_EncodedBy] = N_("Encoded by"), [vlc_meta_ArtworkURL] = N_("Artwork URL"), diff --git a/src/input/resource.c b/src/input/resource.c index 779c921..3440288 100644 --- a/src/input/resource.c +++ b/src/input/resource.c @@ -158,7 +158,7 @@ static void DisplayVoutTitle( input_resource_t *p_resource, input_item_t *p_item = input_GetItem( p_resource->p_input ); - char *psz_nowplaying = input_item_GetNowPlaying( p_item ); + char *psz_nowplaying = input_item_GetNowPlayingFb( p_item ); if( psz_nowplaying && *psz_nowplaying ) { vout_DisplayTitle( p_vout, psz_nowplaying ); diff --git a/src/text/strings.c b/src/text/strings.c index a57014b..fefc984 100644 --- a/src/text/strings.c +++ b/src/text/strings.c @@ -603,7 +603,16 @@ char *str_format_meta(input_thread_t *input, const char *s) write_meta(stream, item, vlc_meta_TrackNumber); break; case 'p': - write_meta(stream, item, vlc_meta_NowPlaying); + if (item == NULL) + break; + { + char *value = input_item_GetNowPlayingFb(item); + if (value == NULL) + break; + + fputs(value, stream); + free(value); + } break; case 'r': write_meta(stream, item, vlc_meta_Rating); @@ -763,18 +772,27 @@ char *str_format_meta(input_thread_t *input, const char *s) case 'Z': if (item == NULL) break; - if (write_meta(stream, item, vlc_meta_NowPlaying) == EOF) { - char *title = input_item_GetTitleFbName(item); + char *value = input_item_GetNowPlayingFb(item); + if (value == NULL) + break; - if (write_meta(stream, item, vlc_meta_Artist) >= 0 - && title != NULL) - fputs(" - ", stream); + int ret = fputs(value, stream); + free(value); - if (title != NULL) + if (ret == EOF) { - fputs(title, stream); - free(title); + char *title = input_item_GetTitleFbName(item); + + if (write_meta(stream, item, vlc_meta_Artist) >= 0 + && title != NULL) + fputs(" - ", stream); + + if (title != NULL) + { + fputs(title, stream); + free(title); + } } } break; diff --git a/src/video_output/video_epg.c b/src/video_output/video_epg.c index 471d52c..a0b5c6f 100644 --- a/src/video_output/video_epg.c +++ b/src/video_output/video_epg.c @@ -263,7 +263,7 @@ static void OSDEpgDestroy(subpicture_t *subpic) */ int vout_OSDEpg(vout_thread_t *vout, input_item_t *input) { - char *now_playing = input_item_GetNowPlaying(input); + char *now_playing = input_item_GetNowPlayingFb(input); vlc_epg_t *epg = NULL; vlc_mutex_lock(&input->lock); _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits