[vlc-devel] [PATCH] NPAPI change: introduce MediaDescription object for exposing media meta information

Sergey Radionov rsatom at gmail.com
Fri Jan 13 13:17:51 CET 2012


2012/1/13 JM Lambert <jeanmichel.lambert7 at gmail.com>:
> ---
>  npapi/control/npolibvlc.cpp |  141 +++++++++++++++++++++++++++++++++++++++++++
>  npapi/control/npolibvlc.h   |   24 +++++++-
>  2 files changed, 164 insertions(+), 1 deletions(-)
>
> diff --git a/npapi/control/npolibvlc.cpp b/npapi/control/npolibvlc.cpp
> index a8a94f6..f279826 100644
> --- a/npapi/control/npolibvlc.cpp
> +++ b/npapi/control/npolibvlc.cpp
> @@ -88,6 +88,7 @@ LibvlcRootNPObject::~LibvlcRootNPObject()
>         if( playlistObj ) NPN_ReleaseObject(playlistObj);
>         if( subtitleObj ) NPN_ReleaseObject(subtitleObj);
>         if( videoObj    ) NPN_ReleaseObject(videoObj);
> +        if( mediaDescriptionObj ) NPN_ReleaseObject(mediaDescriptionObj);
>     }
>  }
>
> @@ -99,6 +100,7 @@ const NPUTF8 * const LibvlcRootNPObject::propertyNames[] =
>     "subtitle",
>     "video",
>     "VersionInfo",
> +    "MediaDescription"
>  };
>  COUNTNAMES(LibvlcRootNPObject,propertyCount,propertyNames);
>
> @@ -110,6 +112,7 @@ enum LibvlcRootNPObjectPropertyIds
>     ID_root_subtitle,
>     ID_root_video,
>     ID_root_VersionInfo,
> +    ID_root_MediaDescription,
>  };
>
>  RuntimeNPObject::InvokeResult
> @@ -142,6 +145,12 @@ LibvlcRootNPObject::getProperty(int index, NPVariant &result)
>                 return INVOKERESULT_NO_ERROR;
>             case ID_root_VersionInfo:
>                 return invokeResultString(libvlc_get_version(),result);
> +            case ID_root_MediaDescription:
> +            {
> +                InstantObj<LibvlcMediaDescriptionNPObject>( mediaDescriptionObj );
> +                OBJECT_TO_NPVARIANT(NPN_RetainObject(mediaDescriptionObj), result);
> +                return INVOKERESULT_NO_ERROR;
> +            }
>             default:
>                 ;
>         }
> @@ -616,6 +625,138 @@ LibvlcInputNPObject::invoke(int index, const NPVariant *args,
>  }
>
>  /*
> +** implementation of libvlc MediaDescription object
> +*/
> +
> +const NPUTF8 * const LibvlcMediaDescriptionNPObject::propertyNames[] =
> +{
> +    "title",
> +    "artist",
> +    "genre",
> +    "copyright",
> +    "album",
> +    "trackNumber",
> +    "description",
> +    "rating",
> +    "date",
> +    "setting",
> +    "URL",
> +    "language",
> +    "nowPlaying",
> +    "publisher",
> +    "encodedBy",
> +    "artworkURL",
> +    "trackID",
> +};
> +COUNTNAMES(LibvlcMediaDescriptionNPObject,propertyCount,propertyNames);
> +
> +enum LibvlcMediaDescriptionNPObjectPropertyIds
> +{
> +    ID_meta_title,
> +    ID_meta_artist,
> +    ID_meta_genre,
> +    ID_meta_copyright,
> +    ID_meta_album,
> +    ID_meta_trackNumber,
> +    ID_meta_description,
> +    ID_meta_rating,
> +    ID_meta_date,
> +    ID_meta_setting,
> +    ID_meta_URL,
> +    ID_meta_language,
> +    ID_meta_nowPlaying,
> +    ID_meta_publisher,
> +    ID_meta_EncodedBy,
> +    ID_meta_ArtworkURL,
> +    ID_meta_trackID,
> +};
> +RuntimeNPObject::InvokeResult
> +LibvlcMediaDescriptionNPObject::getProperty(int index, NPVariant &result)
> +{
> +    /* is plugin still running */
> +    if( isPluginRunning() )
> +    {
> +        VlcPlugin* p_plugin = getPrivate<VlcPlugin>();
> +        libvlc_media_player_t *p_md = p_plugin->getMD();
> +        if( !p_md )
> +            RETURN_ON_ERROR;
> +        libvlc_media_t * p_media = libvlc_media_player_get_media(p_md);
and again, what if( 0==p_media ) - true ?

> +        const char *info;
> +        switch( index )
> +        {
> +            case ID_meta_title:
> +            case ID_meta_artist:
> +            case ID_meta_genre:
> +            case ID_meta_copyright:
> +            case ID_meta_album:
> +            case ID_meta_trackNumber:
> +            case ID_meta_description:
> +            case ID_meta_rating:
> +            case ID_meta_date:
> +            case ID_meta_setting:
> +            case ID_meta_URL:
> +            case ID_meta_language:
> +            case ID_meta_nowPlaying:
> +            case ID_meta_publisher:
> +            case ID_meta_EncodedBy:
> +            case ID_meta_ArtworkURL:
> +            case ID_meta_trackID:
> +                info = libvlc_media_get_meta(p_media,(libvlc_meta_t) index);
> +                return invokeResultString(info, result);
> +            default:
> +            ;
> +        }
> +     }
> +     return INVOKERESULT_GENERIC_ERROR;
> +}
> +
> +RuntimeNPObject::InvokeResult
> +LibvlcMediaDescriptionNPObject::setProperty(int index, const NPVariant &value)
> +{
> +    /* is plugin still running */
> +    if( isPluginRunning() )
> +    {
> +        switch( index )
> +        {
> +            case ID_none:
> +                return INVOKERESULT_NO_SUCH_METHOD;
> +            default:
> +                ;
> +        }
> +    }
> +    return INVOKERESULT_GENERIC_ERROR;
> +}
> +
> +const NPUTF8 * const LibvlcMediaDescriptionNPObject::methodNames[] =
> +{
> +    "None"
> +};
> +COUNTNAMES(LibvlcMediaDescriptionNPObject,methodCount,methodNames);
> +
> +enum LibvlcMediaDescriptionNPObjectMethodIds
> +{
> +    ID_mediadescription_method_none,
> +};
> +RuntimeNPObject::InvokeResult
> +LibvlcMediaDescriptionNPObject::invoke(int index, const NPVariant *args,
> +                            uint32_t argCount, NPVariant &result)
> +{
> +    /* is plugin still running */
> +    if( isPluginRunning() )
> +    {
> +        switch( index )
> +        {
> +            case ID_mediadescription_method_none:
> +                return INVOKERESULT_NO_SUCH_METHOD;
> +            default:
> +                ;
> +        }
> +    }
> +    return INVOKERESULT_GENERIC_ERROR;
> +}
> +
> +
> +/*
>  ** implementation of libvlc playlist items object
>  */
>
> diff --git a/npapi/control/npolibvlc.h b/npapi/control/npolibvlc.h
> index c6d8694..d5a57b9 100644
> --- a/npapi/control/npolibvlc.h
> +++ b/npapi/control/npolibvlc.h
> @@ -38,7 +38,8 @@ protected:
>     inputObj(NULL),
>     playlistObj(NULL),
>     subtitleObj(NULL),
> -    videoObj(NULL) { }
> +    videoObj(NULL),
> +    mediaDescriptionObj(NULL) { }
>
>     virtual ~LibvlcRootNPObject();
>
> @@ -58,6 +59,7 @@ private:
>     NPObject *playlistObj;
>     NPObject *subtitleObj;
>     NPObject *videoObj;
> +    NPObject *mediaDescriptionObj;
>  };
>
>  class LibvlcAudioNPObject: public RuntimeNPObject
> @@ -103,6 +105,26 @@ protected:
>     InvokeResult invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result);
>  };
>
> +class LibvlcMediaDescriptionNPObject: public RuntimeNPObject
> +{
> +protected:
> +    friend class RuntimeNPClass<LibvlcMediaDescriptionNPObject>;
> +    LibvlcMediaDescriptionNPObject(NPP instance, const NPClass *aClass) :
> +        RuntimeNPObject(instance, aClass) {};
> +    virtual ~LibvlcMediaDescriptionNPObject() {};
> +
> +    static const int propertyCount;
> +    static const NPUTF8 * const propertyNames[];
> +
> +    InvokeResult getProperty(int index, NPVariant &result);
> +    InvokeResult setProperty(int index, const NPVariant &value);
> +
> +    static const int methodCount;
> +    static const NPUTF8 * const methodNames[];
> +
> +    InvokeResult invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result);
> +};
> +
>  class LibvlcPlaylistItemsNPObject: public RuntimeNPObject
>  {
>  protected:
> --
> 1.7.5.4
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel



More information about the vlc-devel mailing list