⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 media.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * 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 + -