Commit 0631d45a authored by JP Dinger's avatar JP Dinger Committed by Rémi Denis-Courmont

Update mozilla plugin and test page for new logo interface.

parent 9c921a1a
......@@ -2,9 +2,10 @@
* npolibvlc.cpp: official Javascript APIs
*****************************************************************************
* Copyright (C) 2002-2009 the VideoLAN team
* Copyright (C) 2010 M2X BV
*
* Authors: Damien Fouilleul <Damien.Fouilleul@laposte.net>
* JP Dinger <jpd@m2x.nl>
* JP Dinger <jpd@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
......@@ -16,9 +17,9 @@
* 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.
* 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 "config.h"
......@@ -1266,7 +1267,8 @@ const NPUTF8 * const LibvlcVideoNPObject::propertyNames[] =
"subtitle",
"crop",
"teletext",
"marquee"
"marquee",
"logo"
};
enum LibvlcVideoNPObjectPropertyIds
......@@ -1278,7 +1280,8 @@ enum LibvlcVideoNPObjectPropertyIds
ID_video_subtitle,
ID_video_crop,
ID_video_teletext,
ID_video_marquee
ID_video_marquee,
ID_video_logo
};
COUNTNAMES(LibvlcVideoNPObject,propertyCount,propertyNames);
......@@ -1358,6 +1361,12 @@ LibvlcVideoNPObject::getProperty(int index, NPVariant &result)
OBJECT_TO_NPVARIANT(NPN_RetainObject(marqueeObj), result);
return INVOKERESULT_NO_ERROR;
}
case ID_video_logo:
{
InstantObj<LibvlcLogoNPObject>( logoObj );
OBJECT_TO_NPVARIANT(NPN_RetainObject(logoObj), result);
return INVOKERESULT_NO_ERROR;
}
}
}
return INVOKERESULT_GENERIC_ERROR;
......@@ -1810,3 +1819,219 @@ LibvlcMarqueeNPObject::invoke(int index, const NPVariant *args,
}
return INVOKERESULT_GENERIC_ERROR;
}
const NPUTF8 * const LibvlcLogoNPObject::propertyNames[] = {
"delay",
"repeat",
"opacity",
"position",
"x",
"y",
};
enum LibvlcLogoNPObjectPropertyIds {
ID_logo_delay,
ID_logo_repeat,
ID_logo_opacity,
ID_logo_position,
ID_logo_x,
ID_logo_y,
};
COUNTNAMES(LibvlcLogoNPObject,propertyCount,propertyNames);
static const unsigned char logo_idx[] = {
libvlc_logo_delay,
libvlc_logo_repeat,
libvlc_logo_opacity,
0,
libvlc_logo_x,
libvlc_logo_y,
};
struct posidx_s { const char *n; size_t i; };
static const posidx_s posidx[] = {
{ "center", 0 },
{ "left", 1 },
{ "right", 2 },
{ "top", 4 },
{ "bottom", 8 },
{ "top-left", 5 },
{ "top-right", 6 },
{ "bottom-left", 9 },
{ "bottom-right", 10 },
};
enum { num_posidx = sizeof(posidx)/sizeof(*posidx) };
static inline const char *logo_numtopos( size_t i )
{
for( const posidx_s *h=posidx; h<posidx+num_posidx; ++h )
if( h->i == i )
return h->n;
return "undefined";
}
static inline bool logo_postonum( const char *n, size_t &i )
{
for( const posidx_s *h=posidx; h<posidx+num_posidx; ++h )
if( !strcasecmp( n, h->n ) )
{ i=h->i; return true; }
return false;
}
RuntimeNPObject::InvokeResult
LibvlcLogoNPObject::getProperty(int index, NPVariant &result)
{
if( !isPluginRunning() )
return INVOKERESULT_GENERIC_ERROR;
VlcPlugin* p_plugin = getPrivate<VlcPlugin>();
libvlc_exception_t ex;
libvlc_exception_init(&ex);
libvlc_media_player_t *p_md = p_plugin->getMD(&ex);
RETURN_ON_EXCEPTION(this,ex);
switch( index )
{
case ID_logo_delay:
case ID_logo_repeat:
case ID_logo_opacity:
case ID_logo_x:
case ID_logo_y:
INT32_TO_NPVARIANT(
libvlc_video_get_logo_int(p_md, logo_idx[index], &ex), result);
RETURN_ON_EXCEPTION(this,ex);
break;
case ID_logo_position:
STRINGZ_TO_NPVARIANT( logo_numtopos(
libvlc_video_get_logo_int(p_md, libvlc_logo_position, &ex) ),
result );
RETURN_ON_EXCEPTION(this,ex);
break;
default:
return INVOKERESULT_GENERIC_ERROR;
}
return INVOKERESULT_NO_ERROR;
}
RuntimeNPObject::InvokeResult
LibvlcLogoNPObject::setProperty(int index, const NPVariant &value)
{
size_t i;
if( !isPluginRunning() )
return INVOKERESULT_GENERIC_ERROR;
VlcPlugin* p_plugin = getPrivate<VlcPlugin>();
libvlc_exception_t ex;
libvlc_exception_init(&ex);
libvlc_media_player_t *p_md = p_plugin->getMD(&ex);
RETURN_ON_EXCEPTION(this,ex);
switch( index )
{
case ID_logo_delay:
case ID_logo_repeat:
case ID_logo_opacity:
case ID_logo_x:
case ID_logo_y:
if( !NPVARIANT_IS_INT32(value) )
return INVOKERESULT_INVALID_VALUE;
libvlc_video_set_logo_int(p_md, logo_idx[index],
NPVARIANT_TO_INT32( value ), &ex);
RETURN_ON_EXCEPTION(this,ex);
break;
case ID_logo_position:
if( !NPVARIANT_IS_STRING(value) ||
!logo_postonum( NPVARIANT_TO_STRING(value).utf8characters, i ) )
return INVOKERESULT_INVALID_VALUE;
libvlc_video_set_logo_int(p_md, libvlc_logo_position, i, &ex);
RETURN_ON_EXCEPTION(this,ex);
break;
default:
return INVOKERESULT_GENERIC_ERROR;
}
return INVOKERESULT_NO_ERROR;
}
const NPUTF8 * const LibvlcLogoNPObject::methodNames[] = {
"enable",
"disable",
"file",
};
enum LibvlcLogoNPObjectMethodIds {
ID_logo_enable,
ID_logo_disable,
ID_logo_file,
};
COUNTNAMES(LibvlcLogoNPObject,methodCount,methodNames);
RuntimeNPObject::InvokeResult
LibvlcLogoNPObject::invoke(int index, const NPVariant *args,
uint32_t argCount, NPVariant &result)
{
char *buf, *h;
size_t i, len;
if( !isPluginRunning() )
return INVOKERESULT_GENERIC_ERROR;
libvlc_exception_t ex;
libvlc_exception_init(&ex);
libvlc_media_player_t *p_md = getPrivate<VlcPlugin>()->getMD(&ex);
RETURN_ON_EXCEPTION(this,ex);
switch( index )
{
case ID_logo_enable:
case ID_logo_disable:
if( argCount != 0 )
return INVOKERESULT_GENERIC_ERROR;
libvlc_video_set_logo_int(p_md, libvlc_logo_enable,
index != ID_logo_disable, &ex);
RETURN_ON_EXCEPTION(this,ex);
VOID_TO_NPVARIANT(result);
break;
case ID_logo_file:
if( argCount == 0 )
return INVOKERESULT_GENERIC_ERROR;
for( len=0,i=0;i<argCount;++i )
{
if( !NPVARIANT_IS_STRING(args[i]) )
return INVOKERESULT_INVALID_VALUE;
len+=NPVARIANT_TO_STRING(args[i]).utf8length+1;
}
buf = (char *)malloc( len+1 );
if( !buf )
return INVOKERESULT_OUT_OF_MEMORY;
for( h=buf,i=0;i<argCount;++i )
{
if(i) *h++=';';
len=NPVARIANT_TO_STRING(args[i]).utf8length;
memcpy(h,NPVARIANT_TO_STRING(args[i]).utf8characters,len);
h+=len;
}
*h='\0';
libvlc_video_set_logo_string(p_md, libvlc_logo_file, buf, &ex);
free( buf );
RETURN_ON_EXCEPTION(this,ex);
VOID_TO_NPVARIANT(result);
break;
}
return INVOKERESULT_NO_ERROR;
}
......@@ -180,8 +180,8 @@ protected:
LibvlcVideoNPObject(NPP instance, const NPClass *aClass) :
RuntimeNPObject(instance, aClass),
marqueeObj(NULL) {};
virtual ~LibvlcVideoNPObject() {};
marqueeObj(NULL), logoObj(NULL) { }
virtual ~LibvlcVideoNPObject() { }
static const int propertyCount;
static const NPUTF8 * const propertyNames[];
......@@ -196,6 +196,7 @@ protected:
private:
NPObject *marqueeObj;
NPObject *logoObj;
};
class LibvlcMarqueeNPObject: public RuntimeNPObject
......@@ -218,3 +219,24 @@ protected:
InvokeResult invoke(int index, const NPVariant *args, uint32_t argCount, NPVariant &result);
};
class LibvlcLogoNPObject: public RuntimeNPObject
{
protected:
friend class RuntimeNPClass<LibvlcLogoNPObject>;
LibvlcLogoNPObject(NPP instance, const NPClass *aClass) :
RuntimeNPObject(instance, aClass) { }
virtual ~LibvlcLogoNPObject() { }
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);
};
......@@ -235,14 +235,12 @@ Insert Slider widget
<INPUT size=4 value="" id="logoIntValue">
<SELECT readonly onClick="doLogoOption(this.value,document.getElementById('logoIntValue').value);">
<OPTION value=1>File</OPTION>
<OPTION value=2>Transparency</OPTION>
<OPTION value=3>Position</OPTION>
<OPTION value=2>Position</OPTION>
<OPTION value=3>Opacity</OPTION>
<OPTION value=4>Repeat</OPTION>
<OPTION value=5>Delay</OPTION>
<OPTION value=6>X</OPTION>
<OPTION value=7>Y</OPTION>
<OPTION value=8>Width</OPTION>
<OPTION value=9>Height</OPTION>
</SELECT>
</TD>
</TR>
......@@ -786,27 +784,23 @@ function doMarqueeOption(option, value)
function doLogoOption(option, value)
{
var vlc = getVLC("vlc");
val = parseInt(value);
if( vlc )
{
if (option == 1)
vlc.video.logo.file(val);
vlc.video.logo.file(value);
if (option == 2)
vlc.video.logo.transparency(val);
vlc.video.logo.position = value;
val = parseInt(value);
if (option == 3)
vlc.video.logo.position(val);
vlc.video.logo.opacity = val;
if (option == 4)
vlc.video.logo.repeat(val);
vlc.video.logo.repeat = val;
if (option == 5)
vlc.video.logo.delay(val);
vlc.video.logo.delay = val;
if (option == 6)
vlc.video.logo.x(val);
vlc.video.logo.x = val;
if (option == 7)
vlc.video.logo.y(val);
if (option == 8)
vlc.video.logo.width(val);
if (option == 9)
vlc.video.logo.height(val);
vlc.video.logo.y = val;
}
}
......
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