[vlc-devel] [PATCH 4/4] Add support for multiple video tracks
Daniel Amm
da2424 at t-online.de
Tue Jun 6 17:30:59 CEST 2017
---
activex/axvlc.idl | 10 +++++++++
activex/vlccontrol2.cpp | 40 +++++++++++++++++++++++++++++++++
activex/vlccontrol2.h | 4 ++++
common/vlc_player.cpp | 7 ++++++
common/vlc_player.h | 1 +
npapi/npruntime/npolibvlc.cpp | 51 +++++++++++++++++++++++++++++++++++++++++--
6 files changed, 111 insertions(+), 2 deletions(-)
diff --git a/activex/axvlc.idl b/activex/axvlc.idl
index 12cf596..9202ab2 100644
--- a/activex/axvlc.idl
+++ b/activex/axvlc.idl
@@ -537,6 +537,16 @@ library AXVLC
[helpstring("toggle teletext transparent state.")]
HRESULT toggleTeletext();
+ [propget, helpstring("Returns/sets video track used/to use.")]
+ HRESULT track([out, retval] long* track);
+ [propput, helpstring("Returns/sets video track used/to use.")]
+ HRESULT track([in] long track);
+
+ [propget, helpstring("Returns the number of video tracks available.")]
+ HRESULT count([out, retval] long* trackNumber);
+ [helpstring("Returns video track name.")]
+ HRESULT description([in] long trackID, [out, retval] BSTR* name);
+
[propget, helpstring("Returns the marquee object.")]
HRESULT marquee([out, retval] IVLCMarquee** obj);
diff --git a/activex/vlccontrol2.cpp b/activex/vlccontrol2.cpp
index 2ec4f8c..b8c3bb3 100644
--- a/activex/vlccontrol2.cpp
+++ b/activex/vlccontrol2.cpp
@@ -1283,6 +1283,46 @@ STDMETHODIMP VLCVideo::toggleTeletext()
#endif
}
+STDMETHODIMP VLCVideo::get_track(long* track)
+{
+ if( NULL == track )
+ return E_POINTER;
+
+ *track = _plug->get_player().currentVideoTrack();
+ return S_OK;
+}
+
+STDMETHODIMP VLCVideo::put_track(long track)
+{
+ auto tracks = _plug->get_player().get_mp().videoTrackDescription();
+ if ( track >= tracks.size() )
+ return E_INVALIDARG;
+ _plug->get_player().get_mp().setVideoTrack( tracks[track].id() );
+ return S_OK;
+}
+
+STDMETHODIMP VLCVideo::get_count(long* trackNumber)
+{
+ if( NULL == trackNumber )
+ return E_POINTER;
+
+ *trackNumber = negativeToZero( _plug->get_player().get_mp().videoTrackCount() );
+
+ return S_OK;
+}
+
+STDMETHODIMP VLCVideo::description(long trackId, BSTR* name)
+{
+ if( NULL == name )
+ return E_POINTER;
+
+ auto tracks = _plug->get_player().get_mp().videoTrackDescription();
+ if ( trackId >= tracks.size() )
+ return E_INVALIDARG;
+ *name = BSTRFromCStr( CP_UTF8, tracks[trackId].name().c_str() );
+ return (NULL == *name) ? E_OUTOFMEMORY : S_OK;
+}
+
STDMETHODIMP VLCVideo::get_marquee(IVLCMarquee** obj)
{
return object_get(obj,_p_vlcmarquee);
diff --git a/activex/vlccontrol2.h b/activex/vlccontrol2.h
index c5bc1cb..2a9bfc5 100644
--- a/activex/vlccontrol2.h
+++ b/activex/vlccontrol2.h
@@ -357,6 +357,10 @@ public:
STDMETHODIMP takeSnapshot(LPPICTUREDISP*);
STDMETHODIMP toggleFullscreen();
STDMETHODIMP toggleTeletext();
+ STDMETHODIMP get_track(long*);
+ STDMETHODIMP put_track(long);
+ STDMETHODIMP get_count(long*);
+ STDMETHODIMP description(long, BSTR*);
private:
IVLCMarquee *_p_vlcmarquee;
diff --git a/common/vlc_player.cpp b/common/vlc_player.cpp
index 12f09ef..3b64f3f 100644
--- a/common/vlc_player.cpp
+++ b/common/vlc_player.cpp
@@ -120,6 +120,13 @@ int vlc_player::currentSubtitleTrack()
return getTrack( current, tracks );
}
+int vlc_player::currentVideoTrack()
+{
+ auto current = _mp.videoTrack();
+ auto tracks = _mp.videoTrackDescription();
+ return getTrack( current, tracks );
+}
+
int vlc_player::getTrack( int currentId, const std::vector<VLC::TrackDescription>& tracks )
{
if ( tracks.empty() )
diff --git a/common/vlc_player.h b/common/vlc_player.h
index 8a09945..9d48c62 100644
--- a/common/vlc_player.h
+++ b/common/vlc_player.h
@@ -60,6 +60,7 @@ public:
int currentAudioTrack();
int currentSubtitleTrack();
+ int currentVideoTrack();
private:
// Returns a 0-based track index, instead of the internal libvlc one
diff --git a/npapi/npruntime/npolibvlc.cpp b/npapi/npruntime/npolibvlc.cpp
index 81bab1d..f096b4c 100644
--- a/npapi/npruntime/npolibvlc.cpp
+++ b/npapi/npruntime/npolibvlc.cpp
@@ -1332,6 +1332,8 @@ const NPUTF8 * const LibvlcVideoNPObject::propertyNames[] =
"subtitle",
"crop",
"teletext",
+ "track",
+ "count",
"marquee",
"logo",
"deinterlace",
@@ -1346,6 +1348,8 @@ enum LibvlcVideoNPObjectPropertyIds
ID_video_subtitle,
ID_video_crop,
ID_video_teletext,
+ ID_video_track,
+ ID_video_count,
ID_video_marquee,
ID_video_logo,
ID_video_deinterlace,
@@ -1407,6 +1411,16 @@ LibvlcVideoNPObject::getProperty(int index, npapi::OutVariant& result)
result = i_page;
return INVOKERESULT_NO_ERROR;
}
+ case ID_video_track:
+ {
+ result = p_plugin->player().currentVideoTrack();
+ return INVOKERESULT_NO_ERROR;
+ }
+ case ID_video_count:
+ {
+ result = negativeToZero( mp.videoTrackCount() );
+ return INVOKERESULT_NO_ERROR;
+ }
case ID_video_marquee:
{
InstantObj<LibvlcMarqueeNPObject>( marqueeObj );
@@ -1503,6 +1517,18 @@ LibvlcVideoNPObject::setProperty(int index, const NPVariant &value)
}
return INVOKERESULT_INVALID_VALUE;
}
+ case ID_video_track:
+ {
+ if( v.is<int>() )
+ {
+ auto tracks = mp.videoTrackDescription();
+ if ( v >= tracks.size() )
+ return INVOKERESULT_INVALID_VALUE;
+ mp.setVideoTrack( tracks[v].id() );
+ return INVOKERESULT_NO_ERROR;
+ }
+ return INVOKERESULT_INVALID_VALUE;
+ }
}
}
return INVOKERESULT_GENERIC_ERROR;
@@ -1512,6 +1538,7 @@ const NPUTF8 * const LibvlcVideoNPObject::methodNames[] =
{
"toggleFullscreen",
"toggleTeletext",
+ "description",
};
COUNTNAMES(LibvlcVideoNPObject,methodCount,methodNames);
@@ -1519,16 +1546,20 @@ enum LibvlcVideoNPObjectMethodIds
{
ID_video_togglefullscreen,
ID_video_toggleteletext,
+ ID_video_description,
};
RuntimeNPObject::InvokeResult
-LibvlcVideoNPObject::invoke(int index, const NPVariant *,
- uint32_t argCount, npapi::OutVariant&)
+LibvlcVideoNPObject::invoke(int index, const NPVariant *args,
+ uint32_t argCount, npapi::OutVariant& result)
{
/* is plugin still running */
if( isPluginRunning() )
{
VlcPluginBase* p_plugin = getPrivate<VlcPluginBase>();
+ auto& mp = p_plugin->getMD();
+ if( !mp )
+ RETURN_ON_ERROR;
switch( index )
{
@@ -1557,6 +1588,22 @@ LibvlcVideoNPObject::invoke(int index, const NPVariant *,
}
return INVOKERESULT_NO_SUCH_METHOD;
}
+ case ID_video_description:
+ {
+ if ( argCount < 1 )
+ return INVOKERESULT_INVALID_ARGS;
+ const npapi::Variant v( args[0] );
+ if( v.is<int>() )
+ {
+ auto tracks = mp.videoTrackDescription();
+ if ( v >= tracks.size() )
+ return INVOKERESULT_INVALID_VALUE;
+ /* display the name of the track chosen */
+ result = tracks[v].name();
+ return INVOKERESULT_NO_ERROR;
+ }
+ return INVOKERESULT_NO_SUCH_METHOD;
+ }
default:
return INVOKERESULT_NO_SUCH_METHOD;
}
--
2.11.1.windows.1
More information about the vlc-devel
mailing list