HbbTvBrowserPlugin U ne utilisation avancée de NPAPI Stanislas Selle 8 Novembre 2011.

Slides:



Advertisements
Présentations similaires
Formation universitaire à .NET: Introduction à C#
Advertisements

Implémentation de l'interface IChannel Récupération de paramètres
C++ 6ème cours Patrick Reuter maître de conférences
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Appels de fonctions natives sous C#
Copyright France Télécom, tous droits réservés Paris Web Ateliers Les bibliothèques JS jQuery Orange Labs Julien Wajsberg, Recherche & Développement.
Approfondissement du langage
(Classes prédéfinies – API Java)
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Les technologies XML Cours 3 : Les APIS XML Janvier Version 1.0 -
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
JAV - TD 6 Structures de données JAVA
TP 3-4 BD21.
بسم الله الرحمن الرحيم. Institut Supérieure des Etudes Technologiques de Kébili.
Introduction aux Web Services Partie 1. Technologies HTML-XML
Javascript les spécificités du langage - Partie 6 -
Structures de données et algorithmes – TP2
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Langage Oriente Objet Cours 4.
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
TRAITEMENT DE STRUCTURES
Principes de programmation (suite)
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Factory Design Patterns Factory Method
FICHIERS : Définition : Algorithme général:
Structures de données IFT-2000
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
IFT 6800 Atelier en Technologies d’information
COURS DE PROGRAMMATION ORIENTEE OBJET :
COURS DE PROGRAMMATION ORIENTEE OBJET :
1. 2 Toolkits Il existe 4 principales boites à outils (toolkits) graphiques : –Xt / Motif –Gtk –Windows –Qt Seul certaines fonctionnent sur toutes les.
CSI1502 Principes fondamentaux en conception des logiciels
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Animateur : Med HAIJOUBI
Le langage C Structures de données
2.1 - Historique Chapitre 2 : Introduction au langage C++
Programmation Système et Réseau (sous Linux)
JavaScript Nécessaire Web.
4 Introduction des objets. Les chaînes et tableaux
La notion de type revisitée en POO
JavaScript.
Argc et argv Utilisation des paramètres de la ligne de commande.
Créer des packages.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Tutorat en bio-informatique
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Schéma de conception Factory Method Exemple Sylvain Giroux.
Cours du 5 novembre.
 Formulaires HTML : traiter les entrées utilisateur
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
Initiation au JavaScript
Pthread Ordonnancement. #define _MULTI_THREADED #include #ifndef _CHECK_H #define _CHECK_H /* headers used by a majority of the example program */ #include.
PaCO++ André Ribes Réunion Hydrogrid Rennes 15/09/03.
Modules créés au moyen d’objets C. Petitpierre. Objets construits sans constructeurs ( en Java on a introduit la réflexion pour cela ) var obj1 = { }
Les Java Server Pages Dans ce chapitre, nous allons :
PRO-1027 Programmation Scientifique en C
22 Concepts de base du langage Java. 2-2 Objectifs A la fin de ce cours, vous serez capables de : Identifier les éléments essentiels de Java Identifier.
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
Java Remote Method Invocation
Flash MX – Séance 2 Interactions & ActionScript David Rapin Si28 P06.
APP-TSWD Apprentissage Par Problèmes Techniques des Sites Web Dynamiques Licence Professionnelle FNEPI Valérie Bellynck, Benjamin Brichet-Billet, Mazen.
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Informatique 2A Langage C 2 è séance. Objectifs de la séance 2 Début de la modularité avec les fonctions Création d’une première bibliothèque.
Développement d’applications Web
Transcription de la présentation:

HbbTvBrowserPlugin U ne utilisation avancée de NPAPI Stanislas Selle 8 Novembre 2011

Sommaire Contexte OpenHbb : le hbbtvplayer Rappel des principes de NPAPI NPObject, NPClass Architecture de HbbTVBrowserPlugin NPVariant Events et callbacks Conclusions 2HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Contexte OpenHbb : le hbbtvplayer Objectif : créer un terminal Hbbtv sur PC Emuler une télévision recevant un signal Hbbtv Avec interaction par une télécommande virtuelle Interprétation du Mpeg-TS Affichage du flux Vidéo Affichage et interaction des applications hbbtv HbbtvTerminal et HbbtvBrowserPlugin 3HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Rappel des principes de NPAPI Un plugin est un élément logiciel venant ajouter des capacités au navigateur. Sous forme de librairie dynamique NPAPI = Netscape Plugin Application Programming Interface npfunctions.h, npapi.h, … fournit avec XulRunner 4HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Rappel des principes de NPAPI Détection par le navigateur répertoire spécifique, fichier de configuration ou en ligne de commande Api pour accés aux données spécifiques du plugin et du MIMEtype pris en charge. Lorsque le navigateur rencontre un objet de type inconnu, il parcourt ses plugins pour trouver celui qui pourrait supporter cet objet. 5HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Rappel des principes de NPAPI Les fonctions d’initialisation : NPError NP_Initialize(NPNetscapeFuncs*, NPPluginFuncs*) -Pour le chargement du plugin dans le browser. NPError NP_Shutdown() -Lors de la désactivation du plugin. NPError NP_GetValue(void *instance, NPPVariable var, void* value) -Récupération de variable prédefinies et du contexte. char* NP_GetPluginVersion() -Récupération du numéro de version. char* NP_GetMIMEDescription() -Chaîne de description MIMEtype supporté par le plugin (simple ou multiple) 6HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Rappel des principes de NPAPI Les fonctions de plugins: NPPluginFuncs Struct regroupant une liste de pointeur sur fonction a initialisé par le plugin. Si le pointeur est valide, ces fonctions seront appelé par le navigateur : -NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char *argn[], char *argv[], NPSavedData *saved); -NPP_Destroy(NPP instance, NPSavedData **save); -NPP_SetWindow(NPP instance, NPWindow *window); -NPP_HandleEvent(NPP instance, void* Event); -NPP_GetValue(NPP instance, NPPVariable variable, void *value); -NPP_SetValue(NPP instance, NPNVariable variable, void *value); 7HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Rappel des principes de NPAPI Les fonctions de browser: NPNetscapeFuncs Struct regroupant une liste de pointeur sur fonction a initialisé par le browser. Si le pointeur est valide, ces fonctions peuvent être appelé par le plugin : -NPN_GetValue -NPN_SetValue -NPN_MemAlloc -NPN_MemFree -Fonctions de NPObject -Fonctions de Identifier -Fonctions de NPVariant 8HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

NPObject et NPClass NPObject : Struct NPObject { NPClass *_class; uint32_t referenceCount; /* * Additional space may be allocated here by types of NPObjects */ } NPClass : struct NPClass { uint32_t structVersion; NPAllocateFunctionPtr allocate; NPDeallocateFunctionPtr deallocate; NPInvalidateFunctionPtr invalidate; NPHasMethodFunctionPtr hasMethod; NPInvokeFunctionPtr invoke; NPInvokeDefaultFunctionPtrinvokeDefault; NPHasPropertyFunctionPtrhasProperty; NPGetPropertyFunctionPtrgetProperty; NPSetPropertyFunctionPtr setProperty; NPRemovePropertyFunctionPtr removeProperty; NPEnumerationFunctionPtr enumerate; NPConstructFunctionPtr construct; }; 9HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Architecture de HbbTVBrowserPlugin L’entrée : Hbbtvbrowserplugin.c (.h) –Les mime type, les fonctions d’initialisation Les extensions à chaque objet : oipfapplicationmanager.c, oipfconfiguration.c, videobroadcast.c … Les extensions de classes et d’objet : application.c, keyset.c, … L’api pour callback depuis le terminal :hbbtvbrowserpluginapi.c 10HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Architecture de HbbTVBrowserPlugin 11HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech Les requêtes sur le plugin ont lieu : Lors du chargement Lors d’un appel sur une propriété videoelt.fullScreen Lors d’un appel d’une méthode videoelt.setFullScreen(false); Lors de la fin de session.

Architecture de HbbTVBrowserPlugin 12HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech Chargement d’une page avec des objets hbbtv Le navigateur recherche le plugin avec mimetype associé Appel de NPP_New (pluginType, npp, mode, argc, agrn, argv, saved) -Création de NPObject (createobject), et association des fonctions jointes –Appel Allocate avec un NpClass défini if (strcmp(argv[i], "application/oipfApplicationManager") == 0) { obj = sBrowserFuncs->createobject(instance, fillOAMpclass()); } -Sauvegarde dans le pdata de l’instance d’un objet HbbTVPluginData NPObject* obj; char* type; NPWindow* window; NPP npp;

Architecture de HbbTVBrowserPlugin 13HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech NPClass stOAMclass; NPClass* pOAMclass = NULL; NPClass* fillOAMpclass(void) { TRACEINFO; if (pOAMclass == NULL) { stOAMclass.allocate = OAM_Allocate; stOAMclass.deallocate = OAM_Deallocate; stOAMclass.invalidate = OAM_Invalidate; stOAMclass.hasMethod = OAM_HasMethod; stOAMclass.invoke = OAM_Invoke; stOAMclass.invokeDefault = OAM_InvokeDefault; stOAMclass.hasProperty = OAM_HasProperty; stOAMclass.getProperty = OAM_GetProperty; stOAMclass.setProperty = OAM_SetProperty; stOAMclass.removeProperty = OAM_RemoveProperty; stOAMclass.enumerate = OAM_Enumerate; pOAMclass = &stOAMclass; } return pOAMclass; }

Architecture de HbbTVBrowserPlugin 14HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech typedef struct { NPObject header; NPP npp; NPObject* ownerApplication; } NPObj_OAM; NPObject * OAM_Allocate(NPP npp, NPClass *theClass) { if (!v_bOAMIdentifiersInitialized) { v_bOAMIdentifiersInitialized = true; OAMinitializeIdentifiers(); } NPObj_OAM* newapplicationmanager = MEMALLOC(sizeof(NPObj_OAM)); newapplicationmanager->npp = npp; newapplicationmanager->ownerApplication = sBrowserFuncs->createobject(npp, fillAPPLICATIONpclass()); return (NPObject *)newapplicationmanager; }

Architecture de HbbTVBrowserPlugin 15HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech #define kAPPLICATION_ID_PROPERTY_VISIBLE 0 #define kAPPLICATION_ID_PROPERTY_PRIVATEDATA 1 #define kAPPLICATION_NUM_PROPERTY_IDENTIFIERS 2 #define kAPPLICATION_ID_METHOD_CREATEAPPLICATION 0 #define kAPPLICATION_ID_METHOD_DESTROYAPPLICATION 1 #define kAPPLICATION_ID_METHOD_SHOW 2 #define kAPPLICATION_ID_METHOD_HIDE 3 #define kAPPLICATION_NUM_METHOD_IDENTIFIERS 4 static bool v_bAPPLICATIONIdentifiersInitialized = false; static NPIdentifier v_APPLICATIONPropertyIdentifiers[kAPPLICATION_NUM_PROPERTY_IDENTIFIERS]; static const NPUTF8 * v_APPLICATIONPropertyNames[kAPPLICATION_NUM_PROPERTY_IDENTIFIERS] = { "visible", "privateData" }; static NPIdentifier v_APPLICATIONMethodIdentifiers[kAPPLICATION_NUM_METHOD_IDENTIFIERS]; static const NPUTF8 * v_APPLICATIONMethodNames[kAPPLICATION_NUM_METHOD_IDENTIFIERS] = { "createApplication", "destroyApplication", "show", "hide" }; static void APPLICATIONinitializeIdentifiers(void) { sBrowserFuncs->getstringidentifiers( v_APPLICATIONPropertyNames, kAPPLICATION_NUM_PROPERTY_IDENTIFIERS, v_APPLICATIONPropertyIdentifiers ); sBrowserFuncs->getstringidentifiers( v_APPLICATIONMethodNames, kAPPLICATION_NUM_METHOD_IDENTIFIERS, v_APPLICATIONMethodIdentifiers ); }

Architecture de HbbTVBrowserPlugin 16HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech Lors d’un appel d’une propriété : Hasproperty GetProperty / SetProperty typedef struct { NPObject header; NPP npp; double* value; double* maximumValue; } NPObj_KeySet; if (name == v_KEYSETPropertyIdentifiers[kKEYSET_ID_PROPERTY_VALUE]) { double* value = keysetobj->value; DOUBLE_TO_NPVARIANT(*value, *result); fctresult = true; }

Architecture de HbbTVBrowserPlugin 17HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech Lors d’un appel d’une méthode : Hasmethod Invoke /** implementation **/ void OAM_ObjectMain_Invoke_GetOwnerApplication(NPObj_OAM* obj,const NPVariant* args, uint32_t argCount, NPVariant* result) { TRACEINFO; sBrowserFuncs->retainobject(obj->ownerApplication); OBJECT_TO_NPVARIANT((NPObject*)(obj->ownerApplication), *result); }

Architecture de HbbTVBrowserPlugin 18HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech Exemple : … window.onload = function() { DebugConsole.init(); menuinit(); var appman = document.getElementById("oipfAppMan"); var app = appman.getOwnerApplication(document); app.show(); var mask = app.privateData.keyset.RED + app.privateData.keyset.GREEN + app.privateData.keyset.YELLOW + app.privateData.keyset.BLUE + app.privateData.keyset.NAVIGATION; app.privateData.keyset.setValue(mask); DebugConsole.log("app.privateData.keyset.value : " + app.privateData.keyset.value ); }

Architecture de HbbTVBrowserPlugin 19HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech Fin de session : -Destroy plugin -Deallocate de chaque objet. void OAM_Deallocate(NPObject* obj) { TRACEINFO; NPObj_OAM* oamobj = (NPObj_OAM*)obj; sBrowserFuncs->releaseobject(oamobj->ownerApplication); MEMFREE(oamobj); return; }

Architecture de HbbTVBrowserPlugin 20HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech Autres functions utiles : NPP_HandleEvent NPP_SetWindow Variable utiles coté plugin : (NP_GetValue) NPPVpluginNameString NPPVpluginDescriptionString NPPVpluginWindowBool NPPVpluginTransparentBool Variable utiles coté browser : (NPN_GetValue) NPNVjavascriptEnabledBool NPNVSupportsWindowless

NPVariant typedef struct _NPVariant { NPVariantType type; union { bool boolValue; int32_t intValue; double_t doubleValue; NPString stringValue; NPObject *objectValue; } value; } NPVariant; NPVARIANT_TO_BOOLEAN()NPVARIANT_TO_BOOLEAN()Extracts the boolean value from v. NPVARIANT_TO_INT32()NPVARIANT_TO_INT32()Extracts a signed 32-bit integer value from v. NPVARIANT_TO_DOUBLE()NPVARIANT_TO_DOUBLE()Extracts a double precision floating point value from v. NPVARIANT_TO_STRING()NPVARIANT_TO_STRING()Extracts the NPString value from v. NPVARIANT_TO_OBJECT()NPVARIANT_TO_OBJECT()Extracts the NPObject value from v. VOID_TO_NPVARIANT()VOID_TO_NPVARIANT()Initialize v to a variant of type NPVariantType_Void. NULL_TO_NPVARIANT()NULL_TO_NPVARIANT()Initialize v to a variant of type NPVariantType_Null. BOOLEAN_TO_NPVARIANT()BOOLEAN_TO_NPVARIANT()Initialize v to a variant of type NPVariantType_Bool with the value val. INT32_TO_NPVARIANT()INT32_TO_NPVARIANT() Initialize v to a variant of type NPVariantType_Int32 with the value val. 21HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Events et callbacks -void OnAPPLICATION_Show(); -void OnAPPLICATION_Hide(); -void OnVIDBRC_SetFullScreen(int fullscreenparam); -void OnKEYSET_SetValue(double param); -void OnKEYSET_Allocate(); Déclarer dans hbbtvbrowserplugin.c, ces fonctions sont implémenté dans le terminal. Ex : lorsqu’il y a un appel à la methodz setFullScreen de l’objet videobroadcast, la méthode OnVIDBRC_SetFullScreen() est appelée, c’est au terminal de la résoudre (car c’est le terminal qui a la main sur le flux vidéo, l’interface graphique, etc. ). 22HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech

Le code de SmarDTV TPT HbbtvbrowserPlugin -Un seul plugin, multiple MIMEType -Interaction via callback avec le terminal (gpac + gtk) -Implémentation incomplète mais fidèle à la norme 23HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech SmarDTV WebOnTV - Plusieurs Plugins avec chacun un MIMEtype - Interaction avec Comedia - Implementation de presque tout les objets - pas 100% fidéle a la norme

Conclusions Les documents importants pour comprendre Dans le projet : -Tableau d’ état d’avancement des implémentations (xls) -Cette présentation et la première présentation NPAPI -Documentation dans le wiki Externe -Documents de la norme HBBTV, OIPF-DAE et CEA2014 -NPAPI Suite et avenir sur OpenHBB 24HbbTVBrowser plugin et NPAPI Stanislas Selle - TSI - Telecom Paristech