📄 media.c
字号:
/***************************************************************************** * media.c: Libvlc API media descripor management ***************************************************************************** * Copyright (C) 2007 the VideoLAN team * $Id$ * * Authors: Pierre d'Herbemont <pdherbemont@videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#include "libvlc_internal.h"#include "libvlc.h"#include <vlc/libvlc.h>#include <vlc_input.h>#include <vlc_meta.h>/* For the preparser */#include <vlc_playlist.h>static const vlc_meta_type_t libvlc_to_vlc_meta[] ={ [libvlc_meta_Title] = vlc_meta_Title, [libvlc_meta_Artist] = vlc_meta_Artist, [libvlc_meta_Genre] = vlc_meta_Genre, [libvlc_meta_Copyright] = vlc_meta_Copyright, [libvlc_meta_Album] = vlc_meta_Album, [libvlc_meta_TrackNumber] = vlc_meta_TrackNumber, [libvlc_meta_Description] = vlc_meta_Description, [libvlc_meta_Rating] = vlc_meta_Rating, [libvlc_meta_Date] = vlc_meta_Date, [libvlc_meta_Setting] = vlc_meta_Setting, [libvlc_meta_URL] = vlc_meta_URL, [libvlc_meta_Language] = vlc_meta_Language, [libvlc_meta_NowPlaying] = vlc_meta_NowPlaying, [libvlc_meta_Publisher] = vlc_meta_Publisher, [libvlc_meta_EncodedBy] = vlc_meta_EncodedBy, [libvlc_meta_ArtworkURL] = vlc_meta_ArtworkURL, [libvlc_meta_TrackID] = vlc_meta_TrackID};static const libvlc_meta_t vlc_to_libvlc_meta[] ={ [vlc_meta_Title] = libvlc_meta_Title, [vlc_meta_Artist] = libvlc_meta_Artist, [vlc_meta_Genre] = libvlc_meta_Genre, [vlc_meta_Copyright] = libvlc_meta_Copyright, [vlc_meta_Album] = libvlc_meta_Album, [vlc_meta_TrackNumber] = libvlc_meta_TrackNumber, [vlc_meta_Description] = libvlc_meta_Description, [vlc_meta_Rating] = libvlc_meta_Rating, [vlc_meta_Date] = libvlc_meta_Date, [vlc_meta_Setting] = libvlc_meta_Setting, [vlc_meta_URL] = libvlc_meta_URL, [vlc_meta_Language] = libvlc_meta_Language, [vlc_meta_NowPlaying] = libvlc_meta_NowPlaying, [vlc_meta_Publisher] = libvlc_meta_Publisher, [vlc_meta_EncodedBy] = libvlc_meta_EncodedBy, [vlc_meta_ArtworkURL] = libvlc_meta_ArtworkURL, [vlc_meta_TrackID] = libvlc_meta_TrackID};/************************************************************************** * input_item_subitem_added (Private) (vlc event Callback) **************************************************************************/static void input_item_subitem_added( const vlc_event_t *p_event, void * user_data ){ libvlc_media_t * p_md = user_data; libvlc_media_t * p_md_child; libvlc_event_t event; p_md_child = libvlc_media_new_from_input_item( p_md->p_libvlc_instance, p_event->u.input_item_subitem_added.p_new_child, NULL ); /* Add this to our media list */ if( !p_md->p_subitems ) { p_md->p_subitems = libvlc_media_list_new( p_md->p_libvlc_instance, NULL ); libvlc_media_list_set_media( p_md->p_subitems, p_md, NULL ); } if( p_md->p_subitems ) { libvlc_media_list_add_media( p_md->p_subitems, p_md_child, NULL ); } /* Construct the event */ event.type = libvlc_MediaSubItemAdded; event.u.media_subitem_added.new_child = p_md_child; /* Send the event */ libvlc_event_send( p_md->p_event_manager, &event ); libvlc_media_release( p_md_child );}/************************************************************************** * input_item_meta_changed (Private) (vlc event Callback) **************************************************************************/static void input_item_meta_changed( const vlc_event_t *p_event, void * user_data ){ libvlc_media_t * p_md = user_data; libvlc_event_t event; /* Construct the event */ event.type = libvlc_MediaMetaChanged; event.u.media_meta_changed.meta_type = vlc_to_libvlc_meta[p_event->u.input_item_meta_changed.meta_type]; /* Send the event */ libvlc_event_send( p_md->p_event_manager, &event );}/************************************************************************** * input_item_duration_changed (Private) (vlc event Callback) **************************************************************************/static void input_item_duration_changed( const vlc_event_t *p_event, void * user_data ){ libvlc_media_t * p_md = user_data; libvlc_event_t event; /* Construct the event */ event.type = libvlc_MediaDurationChanged; event.u.media_duration_changed.new_duration = p_event->u.input_item_duration_changed.new_duration; /* Send the event */ libvlc_event_send( p_md->p_event_manager, &event );}/************************************************************************** * input_item_preparsed_changed (Private) (vlc event Callback) **************************************************************************/static void input_item_preparsed_changed( const vlc_event_t *p_event, void * user_data ){ libvlc_media_t * p_md = user_data; libvlc_event_t event; /* Construct the event */ event.type = libvlc_MediaPreparsedChanged; event.u.media_preparsed_changed.new_status = p_event->u.input_item_preparsed_changed.new_status; /* Send the event */ libvlc_event_send( p_md->p_event_manager, &event );}/************************************************************************** * Install event handler (Private) **************************************************************************/static void install_input_item_observer( libvlc_media_t *p_md ){ vlc_event_attach( &p_md->p_input_item->event_manager, vlc_InputItemSubItemAdded, input_item_subitem_added, p_md ); vlc_event_attach( &p_md->p_input_item->event_manager, vlc_InputItemMetaChanged, input_item_meta_changed, p_md ); vlc_event_attach( &p_md->p_input_item->event_manager, vlc_InputItemDurationChanged, input_item_duration_changed, p_md ); vlc_event_attach( &p_md->p_input_item->event_manager, vlc_InputItemPreparsedChanged, input_item_preparsed_changed, p_md );}/************************************************************************** * Uninstall event handler (Private) **************************************************************************/static void uninstall_input_item_observer( libvlc_media_t *p_md ){ vlc_event_detach( &p_md->p_input_item->event_manager, vlc_InputItemSubItemAdded, input_item_subitem_added, p_md ); vlc_event_detach( &p_md->p_input_item->event_manager, vlc_InputItemMetaChanged, input_item_meta_changed, p_md ); vlc_event_detach( &p_md->p_input_item->event_manager, vlc_InputItemDurationChanged, input_item_duration_changed, p_md ); vlc_event_detach( &p_md->p_input_item->event_manager, vlc_InputItemPreparsedChanged, input_item_preparsed_changed, p_md );}/************************************************************************** * Preparse if not already done (Private) **************************************************************************/static void preparse_if_needed( libvlc_media_t *p_md ){ /* XXX: need some locking here */ if (!p_md->b_preparsed) { playlist_PreparseEnqueue( libvlc_priv (p_md->p_libvlc_instance->p_libvlc_int)->p_playlist, p_md->p_input_item ); p_md->b_preparsed = true; }}/************************************************************************** * Create a new media descriptor object from an input_item * (libvlc internal) * That's the generic constructor **************************************************************************/libvlc_media_t * libvlc_media_new_from_input_item( libvlc_instance_t *p_instance, input_item_t *p_input_item, libvlc_exception_t *p_e ){ libvlc_media_t * p_md; if (!p_input_item) { libvlc_exception_raise( p_e, "No input item given" ); return NULL; } p_md = malloc( sizeof(libvlc_media_t) ); if( !p_md ) { libvlc_exception_raise( p_e, "Not enough memory" ); return NULL; } p_md->p_libvlc_instance = p_instance; p_md->p_input_item = p_input_item; p_md->b_preparsed = false; p_md->i_refcount = 1; p_md->p_user_data = NULL; p_md->state = libvlc_NothingSpecial; /* A media descriptor can be a playlist. When you open a playlist * It can give a bunch of item to read. */ p_md->p_subitems = NULL; p_md->p_event_manager = libvlc_event_manager_new( p_md, p_instance, p_e ); libvlc_event_manager_register_event_type( p_md->p_event_manager, libvlc_MediaMetaChanged, p_e ); libvlc_event_manager_register_event_type( p_md->p_event_manager, libvlc_MediaSubItemAdded, p_e ); libvlc_event_manager_register_event_type( p_md->p_event_manager, libvlc_MediaFreed, p_e ); libvlc_event_manager_register_event_type( p_md->p_event_manager, libvlc_MediaDurationChanged, p_e ); libvlc_event_manager_register_event_type( p_md->p_event_manager, libvlc_MediaStateChanged, p_e ); vlc_gc_incref( p_md->p_input_item ); install_input_item_observer( p_md ); return p_md;}/************************************************************************** * Create a new media descriptor object **************************************************************************/libvlc_media_t * libvlc_media_new( libvlc_instance_t *p_instance, const char * psz_mrl, libvlc_exception_t *p_e ){ input_item_t * p_input_item; libvlc_media_t * p_md; p_input_item = input_item_New( p_instance->p_libvlc_int, psz_mrl, NULL ); if (!p_input_item) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -