Commit d713b346 authored by Damien Fouilleul's avatar Damien Fouilleul

- activex: support for taking a snapshot into a Picture object

parent de774340
......@@ -24,7 +24,7 @@
//comments terminated by [t] are by tonsofpcs, regarding the string review. April 02, 2006. [t]
//Possibly change all instances of "the current playlist" to "the playlist" and "current playlist" to "the playlist" [t]
import "oaidl.idl";
import "ocidl.idl";
[
uuid(DF2BBE39-40A8-433b-A279-073F48DA94B6),
......@@ -435,8 +435,8 @@ library AXVLC
[helpstring("toggle fullscreen/windowed state.")]
HRESULT toggleFullscreen();
[helpstring("take video snapshot and save into into filePath.")]
HRESULT takeSnapshot(BSTR filePath);
[helpstring("take video snapshot and save it into picture object.")]
HRESULT takeSnapshot([out, retval] IPictureDisp** picture);
};
[
......
No preview for this file type
/*** Autogenerated by WIDL 0.9.30 from axvlc.idl - Do not edit ***/
/*** Autogenerated by WIDL 0.9.27 from axvlc.idl - Do not edit ***/
#include <rpc.h>
#include <rpcndr.h>
......
/*** Autogenerated by WIDL 0.9.30 from axvlc.idl - Do not edit ***/
/*** Autogenerated by WIDL 0.9.27 from axvlc.idl - Do not edit ***/
#include <rpc.h>
#include <rpcndr.h>
......@@ -7,7 +7,7 @@
#ifdef __cplusplus
extern "C" {
#endif
#include <oaidl.h>
#include <ocidl.h>
DEFINE_GUID(LIBID_AXVLC, 0xdf2bbe39, 0x40a8, 0x433b, 0xa2,0x79, 0x07,0x3f,0x48,0xda,0x94,0xb6);
......@@ -2269,7 +2269,7 @@ interface IVLCVideo : public IDispatch
) = 0;
virtual HRESULT STDMETHODCALLTYPE takeSnapshot(
BSTR filePath) = 0;
IPictureDisp** picture) = 0;
};
#else
......@@ -2364,7 +2364,7 @@ typedef struct IVLCVideoVtbl {
HRESULT (STDMETHODCALLTYPE *takeSnapshot)(
IVLCVideo* This,
BSTR filePath);
IPictureDisp** picture);
END_INTERFACE
} IVLCVideoVtbl;
......@@ -2488,7 +2488,7 @@ void __RPC_STUB IVLCVideo_toggleFullscreen_Stub(
DWORD* pdwStubPhase);
HRESULT CALLBACK IVLCVideo_takeSnapshot_Proxy(
IVLCVideo* This,
BSTR filePath);
IPictureDisp** picture);
void __RPC_STUB IVLCVideo_takeSnapshot_Stub(
IRpcStubBuffer* This,
IRpcChannelBuffer* pRpcChannelBuffer,
......
......@@ -497,8 +497,6 @@ HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc)
ppsz_argv[ppsz_argc++] = "--win9x-cv-method=1";
}
DebugBreak();
_p_libvlc = libvlc_new(ppsz_argc, ppsz_argv, NULL);
if( NULL == _p_libvlc )
{
......
......@@ -29,6 +29,7 @@
#include <shlwapi.h>
#include <wininet.h>
#include <tchar.h>
using namespace std;
......@@ -2353,14 +2354,11 @@ STDMETHODIMP VLCVideo::put_crop(BSTR geometry)
return hr;
};
STDMETHODIMP VLCVideo::takeSnapshot(BSTR filePath)
STDMETHODIMP VLCVideo::takeSnapshot(LPPICTUREDISP* picture)
{
if( NULL == filePath )
if( NULL == picture )
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) )
......@@ -2371,18 +2369,89 @@ STDMETHODIMP VLCVideo::takeSnapshot(BSTR filePath)
libvlc_input_t *p_input = libvlc_playlist_get_input(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 */
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_input, psz_filepath, &ex);
libvlc_input_free(p_input);
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));
......
......@@ -526,7 +526,7 @@ public:
STDMETHODIMP put_subtitle(long);
STDMETHODIMP get_crop(BSTR*);
STDMETHODIMP put_crop(BSTR);
STDMETHODIMP takeSnapshot(BSTR);
STDMETHODIMP takeSnapshot(LPPICTUREDISP*);
STDMETHODIMP toggleFullscreen();
protected:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment