X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=activex%2Fvlccontrol2.cpp;h=cba86e86d41b8e119b9c26e166ec0eed90e21c23;hb=ab7704a5f1a886fd8d016218ba2e60d1a60851a6;hp=9cf4930ba84777b81a9fc8a4a5d63048bacd1b75;hpb=bca9301311c26520596abf7b7f2d085b0b87d814;p=vlc diff --git a/activex/vlccontrol2.cpp b/activex/vlccontrol2.cpp index 9cf4930ba8..cba86e86d4 100644 --- a/activex/vlccontrol2.cpp +++ b/activex/vlccontrol2.cpp @@ -29,6 +29,7 @@ #include #include +#include using namespace std; @@ -87,7 +88,7 @@ STDMETHODIMP VLCAudio::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo) return E_NOTIMPL; }; -STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCAudio::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -190,7 +191,8 @@ STDMETHODIMP VLCAudio::put_volume(long volume) libvlc_audio_set_volume(p_libvlc, volume, &ex); if( libvlc_exception_raised(&ex) ) { - _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } @@ -211,12 +213,13 @@ STDMETHODIMP VLCAudio::get_track(long* track) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); - *track = libvlc_audio_get_track(p_input, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + *track = libvlc_audio_get_track(p_md, &ex); + libvlc_media_instance_release(p_md); if( libvlc_exception_raised(&ex) ) { - _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } @@ -234,12 +237,13 @@ STDMETHODIMP VLCAudio::put_track(long track) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); - libvlc_audio_set_track(p_input, track, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + libvlc_audio_set_track(p_md, track, &ex); + libvlc_media_instance_release(p_md); if( libvlc_exception_raised(&ex) ) { - _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } @@ -307,7 +311,8 @@ STDMETHODIMP VLCAudio::toggleMute() libvlc_audio_toggle_mute(p_libvlc, &ex); if( libvlc_exception_raised(&ex) ) { - _p_instance->setErrorInfo(IID_IVLCAudio, libvlc_exception_get_message(&ex)); + _p_instance->setErrorInfo(IID_IVLCAudio, + libvlc_exception_get_message(&ex)); libvlc_exception_clear(&ex); return E_FAIL; } @@ -373,7 +378,7 @@ STDMETHODIMP VLCInput::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo) return E_NOTIMPL; }; -STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCInput::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -407,11 +412,11 @@ STDMETHODIMP VLCInput::get_length(double* length) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *length = (double)libvlc_input_get_length(p_input, &ex); - libvlc_input_free(p_input); + *length = (double)libvlc_media_instance_get_length(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -436,11 +441,11 @@ STDMETHODIMP VLCInput::get_position(double* position) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *position = libvlc_input_get_position(p_input, &ex); - libvlc_input_free(p_input); + *position = libvlc_media_instance_get_position(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -462,11 +467,11 @@ STDMETHODIMP VLCInput::put_position(double position) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_input_set_position(p_input, position, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_set_position(p_md, position, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -491,11 +496,11 @@ STDMETHODIMP VLCInput::get_time(double* time) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *time = (double)libvlc_input_get_time(p_input, &ex); - libvlc_input_free(p_input); + *time = (double)libvlc_media_instance_get_time(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -517,11 +522,11 @@ STDMETHODIMP VLCInput::put_time(double time) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_input_set_time(p_input, (vlc_int64_t)time, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_set_time(p_md, (vlc_int64_t)time, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -546,11 +551,11 @@ STDMETHODIMP VLCInput::get_state(long* state) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *state = libvlc_input_get_state(p_input, &ex); - libvlc_input_free(p_input); + *state = libvlc_media_instance_get_state(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -576,11 +581,11 @@ STDMETHODIMP VLCInput::get_rate(double* rate) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *rate = libvlc_input_get_rate(p_input, &ex); - libvlc_input_free(p_input); + *rate = libvlc_media_instance_get_rate(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -602,11 +607,11 @@ STDMETHODIMP VLCInput::put_rate(double rate) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_input_set_rate(p_input, rate, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_set_rate(p_md, rate, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -624,6 +629,7 @@ STDMETHODIMP VLCInput::get_fps(double* fps) if( NULL == fps ) return E_POINTER; + *fps = 0.0; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); if( SUCCEEDED(hr) ) @@ -631,11 +637,11 @@ STDMETHODIMP VLCInput::get_fps(double* fps) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *fps = libvlc_input_get_fps(p_input, &ex); - libvlc_input_free(p_input); + *fps = libvlc_media_instance_get_fps(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -660,11 +666,11 @@ STDMETHODIMP VLCInput::get_hasVout(VARIANT_BOOL* hasVout) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *hasVout = libvlc_input_has_vout(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE; - libvlc_input_free(p_input); + *hasVout = libvlc_media_instance_has_vout(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE; + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -738,7 +744,7 @@ STDMETHODIMP VLCLog::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo) return E_NOTIMPL; }; -STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCLog::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -991,7 +997,7 @@ STDMETHODIMP VLCMessages::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInf return E_NOTIMPL; }; -STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCMessages::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1157,7 +1163,7 @@ STDMETHODIMP VLCMessageIterator::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* return E_NOTIMPL; }; -STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCMessageIterator::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1288,7 +1294,7 @@ STDMETHODIMP VLCMessage::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo return E_NOTIMPL; }; -STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCMessage::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1448,7 +1454,7 @@ STDMETHODIMP VLCPlaylistItems::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* p return E_NOTIMPL; }; -STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCPlaylistItems::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -1597,7 +1603,7 @@ STDMETHODIMP VLCPlaylist::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInf return E_NOTIMPL; }; -STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCPlaylist::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -2003,7 +2009,7 @@ STDMETHODIMP VLCVideo::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInfo) return E_NOTIMPL; }; -STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCVideo::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -2037,11 +2043,11 @@ STDMETHODIMP VLCVideo::get_fullscreen(VARIANT_BOOL* fullscreen) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *fullscreen = libvlc_get_fullscreen(p_input, &ex) ? VARIANT_TRUE : VARIANT_FALSE; - libvlc_input_free(p_input); + *fullscreen = libvlc_get_fullscreen(p_md, &ex) ? VARIANT_TRUE : VARIANT_FALSE; + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2063,11 +2069,11 @@ STDMETHODIMP VLCVideo::put_fullscreen(VARIANT_BOOL fullscreen) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_set_fullscreen(p_input, VARIANT_FALSE != fullscreen, &ex); - libvlc_input_free(p_input); + libvlc_set_fullscreen(p_md, VARIANT_FALSE != fullscreen, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2092,11 +2098,11 @@ STDMETHODIMP VLCVideo::get_width(long* width) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *width = libvlc_video_get_width(p_input, &ex); - libvlc_input_free(p_input); + *width = libvlc_video_get_width(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2121,11 +2127,11 @@ STDMETHODIMP VLCVideo::get_height(long* height) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - *height = libvlc_video_get_height(p_input, &ex); - libvlc_input_free(p_input); + *height = libvlc_video_get_height(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2150,12 +2156,12 @@ STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - char *psz_aspect = libvlc_video_get_aspect_ratio(p_input, &ex); + char *psz_aspect = libvlc_video_get_aspect_ratio(p_md, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { if( NULL == psz_aspect ) @@ -2164,7 +2170,7 @@ STDMETHODIMP VLCVideo::get_aspectRatio(BSTR* aspect) *aspect = BSTRFromCStr(CP_UTF8, psz_aspect); free( psz_aspect ); psz_aspect = NULL; - return (NULL == aspect) ? E_OUTOFMEMORY : NOERROR; + return (NULL == *aspect) ? E_OUTOFMEMORY : NOERROR; } if( psz_aspect ) free( psz_aspect ); psz_aspect = NULL; @@ -2191,7 +2197,7 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { char *psz_aspect = CStrFromBSTR(CP_UTF8, aspect); @@ -2200,10 +2206,10 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect) return E_OUTOFMEMORY; } - libvlc_video_set_aspect_ratio(p_input, psz_aspect, &ex); + libvlc_video_set_aspect_ratio(p_md, psz_aspect, &ex); CoTaskMemFree(psz_aspect); - libvlc_input_free(p_input); + libvlc_media_instance_release(p_md); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCVideo, @@ -2217,6 +2223,58 @@ STDMETHODIMP VLCVideo::put_aspectRatio(BSTR aspect) return hr; }; +STDMETHODIMP VLCVideo::get_subtitle(long* spu) +{ + if( NULL == spu ) + return E_POINTER; + + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + if( ! libvlc_exception_raised(&ex) ) + { + *spu = libvlc_video_get_spu(p_md, &ex); + libvlc_media_instance_release(p_md); + if( ! libvlc_exception_raised(&ex) ) + { + return NOERROR; + } + } + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return hr; +}; + +STDMETHODIMP VLCVideo::put_subtitle(long spu) +{ + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + libvlc_video_set_spu(p_md, spu, &ex); + libvlc_media_instance_release(p_md); + if( libvlc_exception_raised(&ex) ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return NOERROR; + } + return hr; +}; + STDMETHODIMP VLCVideo::get_crop(BSTR* geometry) { if( NULL == geometry ) @@ -2229,12 +2287,12 @@ STDMETHODIMP VLCVideo::get_crop(BSTR* geometry) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - char *psz_geometry = libvlc_video_get_crop_geometry(p_input, &ex); + char *psz_geometry = libvlc_video_get_crop_geometry(p_md, &ex); - libvlc_input_free(p_input); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { if( NULL == psz_geometry ) @@ -2270,7 +2328,7 @@ STDMETHODIMP VLCVideo::put_crop(BSTR geometry) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { char *psz_geometry = CStrFromBSTR(CP_UTF8, geometry); @@ -2279,10 +2337,10 @@ STDMETHODIMP VLCVideo::put_crop(BSTR geometry) return E_OUTOFMEMORY; } - libvlc_video_set_crop_geometry(p_input, psz_geometry, &ex); + libvlc_video_set_crop_geometry(p_md, psz_geometry, &ex); CoTaskMemFree(psz_geometry); - libvlc_input_free(p_input); + libvlc_media_instance_release(p_md); if( libvlc_exception_raised(&ex) ) { _p_instance->setErrorInfo(IID_IVLCVideo, @@ -2296,13 +2354,62 @@ STDMETHODIMP VLCVideo::put_crop(BSTR geometry) return hr; }; -STDMETHODIMP VLCVideo::takeSnapshot(BSTR filePath) +STDMETHODIMP VLCVideo::get_teletext(long* page) { - if( NULL == filePath ) + if( NULL == page ) return E_POINTER; - if( 0 == SysStringLen(filePath) ) - return E_INVALIDARG; + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + if( ! libvlc_exception_raised(&ex) ) + { + *page = libvlc_video_get_teletext(p_md, &ex); + libvlc_media_instance_release(p_md); + if( ! libvlc_exception_raised(&ex) ) + { + return NOERROR; + } + } + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return hr; +}; + +STDMETHODIMP VLCVideo::put_teletext(long page) +{ + libvlc_instance_t* p_libvlc; + HRESULT hr = _p_instance->getVLC(&p_libvlc); + if( SUCCEEDED(hr) ) + { + libvlc_exception_t ex; + libvlc_exception_init(&ex); + + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); + libvlc_video_set_teletext(p_md, page, &ex); + libvlc_media_instance_release(p_md); + if( libvlc_exception_raised(&ex) ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); + libvlc_exception_clear(&ex); + return E_FAIL; + } + return NOERROR; + } + return hr; +}; + +STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture) +{ + if( NULL == picture ) + return E_POINTER; libvlc_instance_t* p_libvlc; HRESULT hr = _p_instance->getVLC(&p_libvlc); @@ -2311,21 +2418,92 @@ STDMETHODIMP VLCVideo::takeSnapshot(BSTR filePath) libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - char *psz_filepath = CStrFromBSTR(CP_UTF8, filePath); - if( NULL == psz_filepath ) + static int uniqueId = 0; + TCHAR path[MAX_PATH+1]; + + int pathlen = GetTempPath(MAX_PATH-24, path); + if( (0 == pathlen) || (pathlen > (MAX_PATH-24)) ) + return E_FAIL; + + /* check temp directory path by openning it */ { - return E_OUTOFMEMORY; + HANDLE dirHandle = CreateFile(path, + GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, NULL); + if( INVALID_HANDLE_VALUE == dirHandle ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, + "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars."); + return E_FAIL; + } + else + { + BY_HANDLE_FILE_INFORMATION bhfi; + BOOL res = GetFileInformationByHandle(dirHandle, &bhfi); + CloseHandle(dirHandle); + if( !res || !(bhfi.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) + { + _p_instance->setErrorInfo(IID_IVLCVideo, + "Invalid temporary directory for snapshot images, check values of TMP, TEMP envars."); + return E_FAIL; + } + } } - /* TODO: check file security */ - libvlc_video_take_snapshot(p_input, psz_filepath, &ex); - libvlc_input_free(p_input); + TCHAR filepath[MAX_PATH+1]; + + _stprintf(filepath, TEXT("%sAXVLC%lXS%lX.bmp"), + path, GetCurrentProcessId(), ++uniqueId); + +#ifdef _UNICODE + /* reuse path storage for UTF8 string */ + char *psz_filepath = (char *)path; + WCHAR* wpath = filepath; +#else + char *psz_filepath = path; + /* first convert to unicode using current code page */ + WCHAR wpath[MAX_PATH+1]; + if( 0 == MultiByteToWideChar(CP_ACP, 0, filepath, -1, wpath, sizeof(wpath)/sizeof(WCHAR)) ) + return E_FAIL; +#endif + /* convert to UTF8 */ + pathlen = WideCharToMultiByte(CP_UTF8, 0, wpath, -1, psz_filepath, sizeof(path), NULL, NULL); + // fail if path is 0 or too short (i.e pathlen is the same as storage size) + if( (0 == pathlen) || (sizeof(path) == pathlen) ) + return E_FAIL; + + /* take snapshot into file */ + libvlc_video_take_snapshot(p_md, psz_filepath, 0, 0, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { - return NOERROR; + hr = E_FAIL; + /* open snapshot file */ + HANDLE snapPic = LoadImage(NULL, filepath, IMAGE_BITMAP,0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); + if( snapPic ) + { + PICTDESC snapDesc; + + snapDesc.cbSizeofstruct = sizeof(PICTDESC); + snapDesc.picType = PICTYPE_BITMAP; + snapDesc.bmp.hbitmap = (HBITMAP)snapPic; + snapDesc.bmp.hpal = NULL; + + hr = OleCreatePictureIndirect(&snapDesc, IID_IPictureDisp, TRUE, (LPVOID*)picture); + if( FAILED(hr) ) + { + *picture = NULL; + DeleteObject(snapPic); + } + } + DeleteFile(filepath); + return hr; } } _p_instance->setErrorInfo(IID_IVLCVideo, libvlc_exception_get_message(&ex)); @@ -2344,11 +2522,11 @@ STDMETHODIMP VLCVideo::toggleFullscreen() libvlc_exception_t ex; libvlc_exception_init(&ex); - libvlc_input_t *p_input = libvlc_playlist_get_input(p_libvlc, &ex); + libvlc_media_instance_t *p_md = libvlc_playlist_get_media_instance(p_libvlc, &ex); if( ! libvlc_exception_raised(&ex) ) { - libvlc_toggle_fullscreen(p_input, &ex); - libvlc_input_free(p_input); + libvlc_toggle_fullscreen(p_md, &ex); + libvlc_media_instance_release(p_md); if( ! libvlc_exception_raised(&ex) ) { return NOERROR; @@ -2438,7 +2616,7 @@ STDMETHODIMP VLCControl2::GetTypeInfo(UINT iTInfo, LCID lcid, LPTYPEINFO* ppTInf return E_NOTIMPL; }; -STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, +STDMETHODIMP VLCControl2::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispID) { if( SUCCEEDED(loadTypeInfo()) ) @@ -2550,12 +2728,13 @@ STDMETHODIMP VLCControl2::get_VersionInfo(BSTR *version) if( NULL != versionStr ) { *version = BSTRFromCStr(CP_UTF8, versionStr); + return NULL == *version ? E_OUTOFMEMORY : NOERROR; } *version = NULL; return E_FAIL; }; - + STDMETHODIMP VLCControl2::get_Visible(VARIANT_BOOL *isVisible) { if( NULL == isVisible ) @@ -2588,6 +2767,21 @@ STDMETHODIMP VLCControl2::put_Volume(long volume) return NOERROR; }; +STDMETHODIMP VLCControl2::get_BackColor(OLE_COLOR *backcolor) +{ + if( NULL == backcolor ) + return E_POINTER; + + *backcolor = _p_instance->getBackColor(); + return NOERROR; +}; + +STDMETHODIMP VLCControl2::put_BackColor(OLE_COLOR backcolor) +{ + _p_instance->setBackColor(backcolor); + return NOERROR; +}; + STDMETHODIMP VLCControl2::get_audio(IVLCAudio** obj) { if( NULL == obj )