Programmation Multimédia Cours de programmation DirectShow



Documents pareils
PRECAUTIONS DESCRIPTION DU PRODUIT

Récupérer au format AVI un extrait d'un DVD à l'aide du logiciel FlaskMpeg

PX8048 Convertisseur audio/vidéo VHS vers USB

Outils informatiques de manipulation de la vidéo et du son : une introduction

Enregistrer 27. ENREGISTREMENT ouvre une boîte de dialogue similaire à celle qui est décrite ici. «Enregistrement» sous l'écran vidéo

Formations au tournage et au montage vidéo. Monter un film avec. Imovie 11

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

3D Lab. NANO TRANSPORT & NANO PLAYER. Lecteurs réseaux AUDIOPHILE - PROFESSIONNEL. PCM & DSD natif. UPnP DNLA - Bit Perfect media device

Comment enregistrer simplement toute musique restituée par votre PC

Manuel d'installation de DVD MAKER USB2.0

Export vers le format WAV dans ArtemiS SUITE

Signage Manager Express Manuel utilisateur du logiciel

Description générale de l'interface

Guide de l'utilisateur de l'utilitaire d'installation de caméra Avigilon

Note technique. Formats de compression vidéo utilisés par CamTrace V11 avantages et inconvénients.

Guide d installation logicielle

Prise en main. Prise en main - 0

Maintenir un service de traitement de son ou d image d ordinateur

LECTEUR DE COMPACT DISC CDJ-400

Ladibug TM 2.0 Logiciel de présentation visuel d'image Manuel de l utilisateur - Français

Dans la série Les tutoriels libres présentés par le site FRAMASOFT. <Handbrake> <Utilisation d'handbrake pour les débutants> Par <OLIVIER LECLERCQ>

EXPERT FINAL CUT STUDIO

Montage non-linéaire. Techniques et méthodes

Connecter un PC sur une TV.

Interface PC Vivago Ultra. Pro. Guide d'utilisation

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

VRM Monitor. Aide en ligne

Français Table des Matières

DAC. avec interface USB audio et préampli stéréo Casque CONVERTISSEUR DIGITAL VERS ANALOGIQUE. Guide d utilisation V1.1 Jan 2011

Visio Kit. Mode d'emploi

Table des matières. Ce manuel a été traduit par Cantalien, membre du forum VirtualDJ.

GUIDE D INSTALLATION DU LOGICIEL ET RACCORDEMENT USB/i.LINK

Glossaire technique Veditec

Lutter contre les virus et les attaques... 15

LOGICIEL DE SURVEILLANCE NUUO NOTICE

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

1 Gestionnaire de Données WORD A4 F - USB / / 6020 Alco-Connect

CommandCenter Génération 4

STATISTICA Version 12 : Instructions d'installation

Windows Internet Name Service (WINS)

Mentions légales (non traduites) Introduction Légendes Schémas de raccordement Configuration de la S16...

MEMENTO D'UTILISATION Du T.N.I. SmartBoard (Version )

QU EST-CE QUE LA VISIOCONFERENCE?

Manuel de l utilisateur

Traitement numérique de l'image. Raphaël Isdant

Un ordinateur, c est quoi?

Guide de l'utilisateur

Bien travailler sur plusieurs écrans

(1) XDCAM Browser

Chapitre 1 L interface de Windows 7 9

Procédure d Installation et de mise à jour du client CAN-8 32 bits

Installation et prise en main

PCTV Systems TVCenter

L EXPORTATION d un PROJET.MVP

MANUEL DE WEBCAM STATION EVOLUTION

La DATV par PC (vue par F6DZP)

Découvrez Windows NetMeeting

BIRT (Business Intelligence and Reporting Tools)

3615 SELFIE. HOW-TO / GUIDE D'UTILISATION

En DV (PAL ou NTSC), la largeur est toujours de 720 pixels, c'est la proportion du pixel qui change la proportion de l'image.

as Architecture des Systèmes d Information

Présentation du tableau blanc interactif Interwrite

VoD ( Video on Demand ) avec VLC

PHPWEBSITE -Tutoriel image

Outils permettant la diffusion de l information. Un point sur le droit numérique

MagicSoft Playout. Permet de mixer des playlists de contenu SD, HDV et Full HD. Prise en charge des formats AVI, MXF, MP4, MOV, MPEG2 et H264.

Capture Pro Software. Démarrage. A-61640_fr

Installer des périphériques

MANUEL TBI - STARBOARD

Pro Monitoring System 1.0. Manuel d'utilisation

Manuel. Nero MediaHome. Nero AG

Manuel de Nero MediaHome

Boîtier TV F200 Retransmetteur de chaînes à distance

Utiliser une WebCam. Micro-ordinateurs, informations, idées, trucs et astuces

Manual de l utilisateur

TV LED mode hôtel 40HC460 serie 4

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Comment Utiliser les Versions, les Modification, les Comparaisons, Dans les Documents

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Aide à la clé pédagogique «Former à la première intervention et à l évacuation»» 2 e édition

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

NOTICE DE EOBD-Facile Pour Android

Windows 8 Installation et configuration

Comparatif entre Matrox RT.X2 et Adobe Premiere Pro CS3 (logiciel seul)

Réalisation d un diaporama en haute définition avec. Adobe Premiere Elements 3.0 ou Adobe Premiere Pro 2.0. Encodage pour Internet

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License,

TV / DVD à écran rabattable pour cuisine VSKTV102 Mk II

Manuel de l utilisateur. Soft-phone - Client VoIP 3CX Version 6.0

SOMMAIRE. 3 Matériel et configuration requis. 4 Installation initiale du matériel EZCast Pro. 7 Fonctionnalités de l'application

CRÉER UN DVD VIDEO avec DVD FLICK (avec ou sans menu)

Cours 14 Les fichiers

CARPE. Documentation Informatique S E T R A. Version Août CARPE (Documentation Informatique) 1

Mise à jour, sauvegarde et restauration de logiciels

DIGIGRAM interfaces audio INTERFACES PCMCIA. VXpocket V2. VXpocket 440 INTERFACES USB UAX220 V2. UAX220-Mic 346 DIGIGRAM

SnapMusic Studio 715 Guide d Installation

Bien commencer avec un LaunchPad MSP430G et un Breadboard

404 CAMCORDER FONCTIONS CAMÉSCOPE ET APPAREIL PHOTO

Transcription:

Programmation Multimédia Cours de programmation DirectShow Pascal Mignot / Pascal Gardeur Partie 2: 1. Typologie et principes généraux sur les filtres 2. Installation de nouveaux filtres 3. Compression 4. Filtres de sortie 5. Périphériques matériels et interactions avec DirectShow 6. Enumération des filtres disponibles sur un système 7. Gestion des périphériques d'acquisition 8. Contrôle du rendu 9. Debug de DirectShow Annexes A : Montage Vidéo B : Contrôle d'un caméscope numérique C : Contrôle d'une carte Tuner TV D : Contrôle d'un DVD Reproduction et diffusion interdites. Page 1/71

Typologie et principes généraux sur les filtres Nous présentons dans cette section une partie des filtres DirectShow les plus directement utilisables. L'installation de codecs et de filtres particuliers (cf le SDK) permet d'accroître le nombre de filtres disponibles. 1) Filtres génériques a) filtres sources File Source (Async) (CLSID_AsyncReader) Lecture de fichier asynchrone (bref classique) File Source (URL) (CLSID_URLReader) Lecture d'un flux depuis une URL. b) filtres passants Smart Tee (CLSID_SmartTee) Duplication de l'entrée (une entrée, 2 sorties : capture et preview) Infinite Pin Tee (CLSID_InfTee) Duplication multiple de l'entrée (une entrée, n sorties) Sample Grabber (CLSID_SampleGrabber) Capture des échantillons (passant) c) filtres de rendu File Writer (CLSID_FileWriter) Si le flux n'a pas été converti dans un format reconnaissable, il ne pourra pas être relu (pour l'audio, utiliser wavdest; pour la vidéo, utiliser l'avi Muxer). Null Renderer (CLSID_NullRenderer) Equivalent de /dev/null dans un graphe. 2) Filtres de gestion audio a) Parser/decoder Page 2/71

WAVE Parser (CLSID_WAVEParser) ACM Wrapper (CLSID_ACMWrapper) Le type de ce filtre est instancié à sa création (quel codec, codage/décodage) Wave Dest (cf le SDK) Permet de transformer un flux PCM/audio en flux.wav b) Filtres transformants DMO Wrapper (CLSID_DMOWrapperFilter) Permet d'utiliser des Direct Media Objects dans un graphe Remarques: les effets DirectSound (en rendu ou en capture) sont utilisables avec DirectShow sous forme de DMO. lors de l'installation de certains produits (par exemple Sound Forge), les filtres audio de l'application sont disponibles sous forme de filtre DirectShow. c) Filtres de rendu Default Audio Renderer (WaveOut) (CLSID_AudioRender) DirectSound Renderer (CLSID_DSoundRender) d) Manipulation de flux au format Midi MIDI Parser (cf doc) Midi Renderer (CLSID_AVIMIDIRender) e) Filtre de capture Audio Capture (analogique micro/cd/midi) CLSID_AudioInputMixerProperties f) Utilisations classiques Lecture d'un fichier audio au format WAV File Source Wave Parser Audio Renderer Lecture d'un fichier audio au format mp3 File Source MPeG1 Splitter ACM Wrapper Wave Parser Audio Renderer Remarque: l'acm Wrapper filter s'instancie comme un décodeur mp3. Rappel: mp3 = MPeG1 audio layer 3 Lecture d'un fichier audio au format midi File Source Midi Parser Midi Renderer Capture audio Page 3/71

Conversion d'un fichier wav en fichier mp3 File Source Wave Parser ACM Wrapper Wave Dest File Writer Remarque: l'acm Wrapper filter s'instancie comme un encodeur mp3. 3) Filtres de gestion vidéo a) Gestions internes Video Renderer (Video Mixing Renderer 7) Video Mixing Renderer 9 Color Space Converter Change le format de couleur (entre RGB8, RGB555, RGB565, RGB24, RGB32) b) Format AVI Lecture: Avi Splitter (CLSID_AviSplitter) AVI Decompressor (CLSID_AVIDec) Instance d'un décodeur VCM Ecriture: AVI Compressor Instance d'un encodeur VCM AVI Mux (CLSID_AviDest) Utilisations classiques: Lecture d'un fichier AVI (audio au format PCM) Page 4/71

Changement du format d'un fichier AVI (l'audio restant au format PCM) c) Format MPeG1 (svcd et super VideoCD) MPEG-1 Stream Splitter Sépare l'audio et la vidéo d'un flux mpeg1 MPEG-1 Video Decoder MPEG-1 Audio Decoder Remarque: le muxer et les encoder MPeG1 ne font par partie de DirectShow (installer les codecs adéquats dans ce but). Utilisation classique: File Source MPeG1 Stream Splitter video audio MPeG1 Video Decoder MPeG1 Audio Decoder d) Format MPeG2 et DVD MPEG-2 Demultiplexer (CLSID_MPEG2Demultiplexer) Séparation d'un flux mpeg2 MPEG-2 Sections and Tables (CLSID_Mpeg2Data) Données mpeg2 (caractéristique des services, droit d'abonnements, ) MPEG-2 Splitter (CLSID_MMSPLITTER) DVD Navigator Remarque: le muxer et les encoder MPeG2 ne font par partie de DirectShow (installer les codecs adéquats dans ce but). Page 5/71

Utilisation classique: Voir en annexe pour plus de précision. e) Format ASF WM ASF Writer (CLSID_WMAsfWriter) Ecriture dans un fichier au format ASF WM ASF Reader (CLSID_WMAsfReader) Lecture dans un fichier au format ASF Utilisation classique: f) Incrustation / Télétext / Sous-titres Page 6/71

Overlay Mixer (CLSID_OverlayMixer) Overlay Mixer 2 (CLSID_OverlayMixer2) World Standard Teletext Decoder (CLSID_WSTDecoder) Synchronized Accessible Media Interchange (CC) Parser Line 21 Decoder (DVD video/cc decoder) 4) Capture vidéo a) Capture vidéo (caméra & webcam) WDM Video Capture (CLSID_VideoInputDeviceCategory) VFW Capture Filter (CLSID_VfwCapture) Remarque: les périphériques de capture vidéo expose généralement une borne de Capture et une borne de Preview. La borne de Preview peut dégrader ses performances de façon à conserver la qualité de la borne de Capture. Dans le cas où la borne de Preview n'est pas disponible, on utilise le filtre suivant. Ce filtre peut être utilisé dans n'importe quel autre cadre similaire. Smart Tee filter (CLSID_SmartTee) Duplique l'entrée vidéo (une entree, deux sorties: capture + renderer) b) Capture vidéo analogique Deux filtres permettent de récupérer les données en provenance d'un tuner TV: Page 7/71

TV Audio (CLSID_TVAudioFilter) audio analogique TV Tuner (CLSID_TVTunerFilter) vidéo analogique WDM Analog Video Crossbar (TV tuner) (CLSID_CrossbarFilterPropertyPage) A noter que des connections internes doivent être faites de façon à relier les entrées vidéo et audio disponibles vers la sortie vidéo et audio du Crossbar. Voir en annexe pour plus de précision. c) Caméscope numérique Les caméscopes numériques stockent les informations sous forme de flux (dvsd) qui inclus l'audio et la vidéo sous forme interlacée. Le passage sous forme interlacée (muxer/splitter) se fait avec les deux filtres suivants: DV Splitter (CLSID_DVSplitter) DV Muxer (CLSID_DVMux) AVI type I et II: Type II : fichier avi classique. Type I : fichier DV. Type I AVI splitter DV splitter video audio AVI Mux Type II Type II AVI splitter video audio DV Muxer AVI Mux Type I Page 8/71

Accès aux périphériques: Instance d'un filtre WDM Video Capture de catégorie "CLSID_VideoInputDeviceCategory" ou "AM_KSCATEGORY_RENDER". Filtres de codage/décodage DV DV Video Encoder (CLSID_DVVideoEnc) DV Video Decoder (CLSID_DVVideoCodec) Utilisations classiques: DV out (lecture d'une cassette numérique) DV in (enregistrement sur une cassette numérique) Voir en annexe pour plus de précision. d) Broadcast Driver Architecture (BDA) Page 9/71

4. Propriétés Les propriétés d'une grande partie des périphériques peuvent afficher une boite de dialogue permettant de configurer le filtre. La fonction suivante permet d'afficher l'interface de configuration du filtre (certaines n'ont de sens qu'en mode debug). HRESULT ShowPropertyDialog(IBaseFilter *Filter, HWND hwnd) { ISpecifyPropertyPages *Prop; HRESULT h = Filter->QueryInterface(IID_ISpecifyPropertyPages, (void **)&Prop); if FAILED(h) return h; FILTER_INFO FilterInfo; h = Filter->QueryFilterInfo(&FilterInfo); IUnknown *FilterUnk = NULL; Filter->QueryInterface(IID_IUnknown, (void **)&FilterUnk); // Show the page. CAUUID caguid; Prop->GetPages(&caGUID); SAFE_RELEASE(Prop); OleCreatePropertyFrame( hwnd, // Parent window 0, 0, // Reserved FilterInfo.achName, // Caption for the dialog box 1, // Number of objects (just the filter) &FilterUnk, // Array of object pointers. caguid.celems, // Number of property pages caguid.pelems, // Array of property page CLSIDs 0, // Locale identifier 0, NULL // Reserved ); Page 10/71

} // Clean up. SAFE_RELEASE(FilterUnk); SAFE_RELEASE(FilterInfo.pGraph); CoTaskMemFree(caGUID.pElems); return S_OK; Voir la documentation pour l'explication des fonctions/méthodes ci-dessous. Exemple: résultat de l'appel de la fonction précédente sur un filter ACM Wrapper de type compression mp3 permet de choisir interactivement les taux de compression utilisés. Page 11/71

Installation de nouveaux filtres Pour de nombreuses applications, il devient nécessaire de développer de nouveaux filtres et/ou d'utiliser des filtres qui ne sont pas installés par défaut sur le système. 1. Installation d'un filtre à partir de son code source Exemple: le filtre wavdest contenu dans le SDK dans le répertoire: SDK\Samples\C++\DirectShow\Filters\WavDest\ Cette procédure peut être appliquée pour tout filtre similaire (soit du SDK, soit écrit par l'utilisateur). Ce filtre permet d'écrire un fichier au format wav (non compressé). Installation de ce filtre comme un codec: 1. compiler le filtre (en version release) 2. copier wavdest.ax dans \windows\system32. 3. enregistrer le filtre comme un composant windows avec: regserv32.exe wavdest.ax (à effectuer depuis \windows\system32) Installation du filtre pour l'utiliser dans un programme DirectShow: 1. compiler le filtre (en version release) 2. copier wavdest.lib dans SDKDX9\Lib. 3. créer un fichier wavdest.h contenant la définition du CLSID du filtre (voir au début du fichier wavdest.cpp); autrement dit contenant: #include <initguid.h> #define INITGUID DEFINE_GUID( CLSID_WavDest, 0x3c78b8e2, 0x6c4d, 0x11d1, 0xad, 0xe2, 0x0, 0x0, 0xf8, 0x75, 0x4b, 0x99 ); 4. copier ce fichier wavdest.h dans SDKDX9\include. Utilisation de ce filtre dans un programme DirectShow: 1. ajouter: #include <wavdest.h> 2. ajouter: #pragma comment(lib,"wavdest.lib") 3. créer le filtre avec comme interface IID_BaseFilter et comme classe CLSID_WavDest. Page 12/71

2. Installation d'un filtre à partir d'une source externe Exemple: le filtre de compression mp3 de Elecard basé sur Lame. http://www.elecard.com/ftp/pub/directshow/lame_dshow.zip Cette procédure peut être appliquée pour tout filtre.ax. Installation de ce filtre comme un codec: 1. copier wavdest.ax dans \windows\system32. 2. enregistrer le filtre comme un composant windows avec: regserv32.exe wavdest.ax (à effectuer depuis \windows\system32) Utilisation de ce filtre dans un code DirectShow: 1. Récupérer le GUID associé à ce filtre dans GraphEdit Par défaut, les filtres insérés de cette façon se trouvent dans les DirectShow filters: On trouve deux GUIDs associés à ce filtre (bas de la fenêtre): 083863F1-70DE-11D0-BD40-00A0C911CE86 : qui correspond à la CLSID d'un filtre DirectShow (CLSID_LegacyAmFilterCategory) Page 13/71

B8D27088-DF5F-4B7C-98DC-0E91A1696286 : qui correspond à la CLSID de ce filtre. 2. Dans le code C++, il faut définir le GUID de la façon suivante: #include <initguid.h> #define INITGUID DEFINE_GUID(CLSID_CompMP3, 0xb8d27088, 0xdf5f, 0x4b7c, 0x98, 0xdc, 0x0e, 0x91, 0xa1, 0x69, 0x62, 0x86 ); Remarque: le nom CLSID_CompMP3 est au choix de l'utilisateur. 4. créer le filtre avec comme interface IID_BaseFilter et comme classe CLSID_CompMP3. 3. Filtres disponibles Il est également possible de rechercher un filtre particulier sur le système par énumération, et l'utiliser sans connaître au préalable son GUID. Il sera ainsi possible: de récupérer les codecs (filtre de codage/décodage audio/vidéo) installés sur le système. Exemple: mp3, divx, de récupérer les filtres d'entrée associés aux périphériques (PnP ou non). Pour les périphériques PnP, les filtres deviennent disponibles dès que le périphérique est connecté. de récupérer les filtres de sortie (renderer) pour le rendu sur des périphériques particuliers. Page 14/71

Compression 1. Codecs codec = COmpressor-DECompressor (audio ou vidéo) Sous DirectShow, les codecs sont implémentés de différentes façons: sous forme d'acm ou de VCM utilisable avec les filtres "AVI Decompressor" & "AVI Compressor". ACM = Audio Compression Manager (gestion des codecs audio) VCM = Video Compression Manager (gestion des codesc vidéo) Cette façon d'implémenter les codes est considérée comme obsolète. sous forme de filtre DirectShow directement. La majorité des codecs sont actuellement implémentés sous cette forme, car ils sont le plus simplement et directement utilisable dans DirectShow. On peut récupérer la liste de ces codes avec le Device Enumerator (ICreateDevEnum). Installation sous forme de.ax. sous forme de DirectX Media Object (DMO) Façon recommandé d'implémenter les Codecs car ils peuvent être utilisé dans à la fois dans DirectShow (filtre "DMO Wrapper") et dans les autres applications. Installation sous forme de.dll. 2. Parenthèse sur la compression vidéo Les compresseurs vidéo utilisent souvent trois types de frames différentes: o Intraframe : une image décrite entièrement par elle-même. Son taux de compression (rapport de taille entre l'image naturelle et l'image traitée) est relativement faible. Egalement connue sous le nom de keyframe (frame de référence) o Predicted frame : une image décrite en utilisant les différences entre cette image et l'image suivante. Le taux de compression est plus élevé que celui des Intraframes. o Bidirectionnal frame: une image décrite en utilisant à la fois les différences entre l'image précédente et l'image suivante. Le taux de compression est supérieur à l'image prédite. Page 15/71

Dans un flux MPEG, le débit exprime le nombre de bit utilisé pendant une seconde par le décodeur. On exprime la portée de la compression par le débit. Plus le débit est élevé, plus la qualité de la séquence obtenue est bonne. Le corolaire est que la taille fichier obtenue est de plus en plus importante. Si le débit est constant dans le temps, on parlera alors de codage CBR (Constant Bit Rate), sinon on parlera de VBR (Variable Bit Rate). Dans ce dernier cas, le débit varie en fonction de la complexité des informations à traiter. 3. Configuration de la compression a. Interface IAMVfwCompressDialogs Les filtres de type VCM (CLSID_VideoCompressorCategory) peuvent exposer l'interface IAMVfwCompressDialogs. Attention, si le retour de QueryInterface n'est pas S_OK, l'interface n'est pas disponible. Deux fenêtres peuvent être définie: Config, About. Une fois l'interface obtenue, on appelle la méthode ShowDialog pour afficher la fenêtre souhaitée: IAMVfwCompressDialogs::ShowDialog Syntaxe: HRESULT ShowDialog(int idialog, HWND hwnd); Paramètres idialog : [in] VfwCompressDialog_Config pour configurer, VfwCompressDialog_About pour le "à propos". hwnd : [in] Handle de la fenêtre propriétaire. Retour: S_OK Remarque: Tant que la boite de dialogue est affichée, vous ne pouvez pas traiter les données (pause ou run). Les membres VfwCompressDialog_QueryConfig et VfwCompressDialog_QueryAbout précise si les boites de dialogues sont disponible ou non pour ce filtre. Il est possible de configurer plus précisément le filtre sous réserve de connaître la structure de données qu'il utilise avec les méthodes SetState/GetState. Page 16/71

b. Interface IAMVideoCompression Les filtres suivants exposent l'interface IAMVideoCompression: o DV Video Encoder (CLSID_DVVideoEnc) sur le filtre o MJPEG Compressor (CLSID_MJPGEnc) sur la borne de sortie. o WDM Video Capture (CLSID_VideoInputDeviceCategory) sur le filtre. o AVI Compressor (CLSID_VideoCompressorCategory) sur la borne de sortie (et IAMVfwCompressDialogs sur le filtre lui-même). o VFW Capture (CLSID_VideoInputDeviceCategory) sur la borne de sortie. o DMO Wrapper (CLSID_DMOWrapperFilter) sur la borne de sortie. Cette interface permet de configurer de manière assez générale un filtre vidéo en fixant: o le taux de keyframe: put/get_keyframerate n = une frame de référence est utilisée toutes les n frames. o le taux de frame prédite par keyframe : put/get_pframesperkeyframe p = nombre de frame prédite sur les n (compression MPEG) o la qualité de la compression : put/get_quality. o la largeur de la fenêtre : put/get_windowsize, (en nombre de frames) sur lequel le taux est calculé. La méthode GetInfo permet de connaître les paramètres supportés. Les méthodes OverrideKeyFrame/OverrideFrameSize permettent de modifier pour certaines frames le comportement moyen. Aucune boite de dialogue graphique n'est exposée par cette interface. Page 17/71

1. Filtres de rendu vidéo Video Renderer a. Filtres de base Filtres de sortie Filtre par défaut de rendu vidéo: ce filtre est supporté par toutes les plateformes. Classe: CLSID_VideoRenderer Video Mixing Renderer 7 (VMR7) Sous XP seulement: utilise DirectDraw7. Classe: CLSID_VideoMixingRenderer ou CLSID_VideoRendererDefault A préférer pour les applications n'effectuant que du rendu vidéo. Video Mixing Renderer 9 (VMR9) Sur toute plateforme supportant DirectX9. Classe: CLSID_VideoMixingRenderer9 A préférer pour les applications mélangeant vidéo et 3D. Overlay Mixer Ancien rendu avec sous-titre (overlay = écriture directe dans la mémoire vidéo). Remarque: le rendu des sous-titres peut être effectué avec d'autres filtres. Classe: CLSID_OverlayMixer Ces filtres de rendu vidéo peuvent opérer dans deux modes différents: mode fenêtré (windowed) : le renderer crée sa propre fenêtre. Cette fenêtre peut être attachée à l'application. mode non-fenêtré (windowless) : supporté par VMR7 et VMR9. L'affichage doit être géré par l'application. b. Contrôles de base Les interfaces suivantes sont disponibles sur les renderers ci-dessus: Interface IBasicVideo: propriété générale de la vidéo récupère la taille de la source vidéo (VideoHeight/VideoWidth/VideoSize), les statistiques du rendu (AvgTimePerFrame/BitErrorRate/BitRate) capture d'écran de l'image courante. fixe/récupère les rectangles source et destination du flux. Page 18/71

Interface IBasicVideo2: IBasicVideo + récupère l'aspect ratio. Interface IVideoWindow: gestion des propriétés de la fenêtre: focus, état (maximisation, minimisation, iconifié, ), position et taille. mode fenêtré/plein écran récupération du handle associé à la fenêtre (pour l'intégrer dans une application). c. Gestion du rendu et multistream Les interfaces suivantes sont pour le VMR (des interfaces similaires existent aussi en général pour le VMR9). IVMRFilterConfig: configure comment est effectué le rendu: o nombres de stream à mixer à l'entrée du renderer. o mode de rendu (windowed/windowless/renderless) o le compositeur (mixer personnalisable) IVMRDeinterlaceControl: fixe la méthode de dé-entrelacement (par stream). IVMRMixerControl: contrôle de la façon dont sont mixés l'ensemble des streams: o pour chaque stream, la portion de fenêtre occupée, sa profondeur (calques), l'ajustement de l'intensité et des couleurs (VMR9 seulement + driver). o en fixant la couleur de fond. IVMRMonitorConfig : choix du moniteur utilisé pour le rendu. d. Exemple: duplication d'une vidéo dans un fenêtre Page 19/71

CoInitialize (NULL); IGraphBuilder *pgraph; CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **) &pgraph); // Ajout des filtres dans le graphe IBaseFilter *FileFilter, *RenderFilter, *TeeFilter; pgraph->addsourcefilter(fname, fname, &FileFilter); CoCreateInstance (CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **) &RenderFilter); pgraph->addfilter(renderfilter,l"videorender"); // Configuration du nombre de stream du video render // (A faire avant toute connexion) IVMRFilterConfig9 *FilterConfig; RenderFilter->QueryInterface(IID_IVMRFilterConfig9, (void**)&filterconfig); FilterConfig->SetNumberOfStreams(2); // Récupération de bornes a connecter et déconnection IPin *Pout,*Pin,*Ptee; Pout = GetPin(FileFilter,PINDIR_OUTPUT); Pin = GetPin(RenderFilter,PINDIR_INPUT); pgraph->connect(pout,pin); Pin->ConnectedTo(&Pout); pgraph->disconnect(pin); pgraph->disconnect(pout); // Insertion d'un TEE CoCreateInstance (CLSID_SmartTee, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **) &TeeFilter); pgraph->addfilter(teefilter,l"tee"); // Connexion a l'entrée du tee Ptee = GetPin(TeeFilter,PINDIR_INPUT); pgraph->connect(pout,ptee); SAFE_RELEASE(Ptee); // Connexion en sortie du tee Ptee = GetPin(TeeFilter,PINDIR_OUTPUT); pgraph->connect(ptee,pin); SAFE_RELEASE(Ptee); // Deuxième connexion en sortie du tee SAFE_RELEASE(Pin); Pin = GetIthPin(RenderFilter,PINDIR_INPUT,2); Ptee = GetIthPin(TeeFilter,PINDIR_OUTPUT,2); pgraph->connect(ptee,pin); SAFE_RELEASE(Ptee); SAFE_RELEASE(Pin); SAFE_RELEASE(Pout); // Récupération du contrôleur de mixage IVMRMixerControl9 *Mixer = NULL; IBasicVideo *Base = NULL; IVideoWindow *Window = NULL; RenderFilter->QueryInterface(IID_IVMRMixerControl9,(void**)&Mixer); RenderFilter->QueryInterface(IID_IBasicVideo,(void**)&Base); RenderFilter->QueryInterface(IID_IVideoWindow,(void**)&Window); Page 20/71

long W,H; Base->GetVideoSize(&W,&H); Window->put_Width(2*W); VMR9NormalizedRect R0 = { 0.f, 0.f, 0.5f, 1.f}, R1 = {0.5f, 0.f, 1.f, 1.f}; Mixer->SetOutputRect(0,&R0); Mixer->SetOutputRect(1,&R1); // Ajouter ici les commandes de contrôles du graphe Voir aussi les exemples blender du SDK en VMR et en VMR9. d. VMR9 et 3D L'intérêt de VMR9 est qu'il permet de faire des liens direct avec DX9, et en particulier le 3D. Inclure d3d9.h et vmr9.h de directx 9. 2. Filtres de rendu audio a. Filtres de base Audio Renderer (WaveOut) : CLSID_AudioRender Rendu du son en utilisant WaveOut (pas de mixage) DirectSound Renderer Filter (Défaut) : CLSID_DSoundRender Rendu du son avec DirectSound Midi Renderer : CLSID_AVIMIDIRender Pour le rendu de fichier au format midi (doit être précédé du Midi Parser). b. Contrôles de base Interface IBasicAudio : fixe ou récupère la balance et le volume (interface triviale). Interface IAMAudioRendererStats : lecture des statistiques de l'audio-renderer. Voir la documentation pour les autres interfaces permettant de contrôler le rendu audio. c. Contrôles DirectSound Interface IAMDirectSound : fixe le focus. Interface IDirectSound3DBuffer : cf le cours Direct Sound 3D. Interface IDirectSound3dListener: cf le cours Direct Sound 3D. Page 21/71

3. Rendu dans un fichier a. Filtres de base File Writer : CLSID_FileWriter Ce filtre doit être précédé d'un filtre qui transforme le flux audio/vidéo en flux de données. Ceci est effectué par: Audio : wavdest (Samples\C++\DirectShow\Filters\WavDest) Vidéo : Avi Mux (classe CLSID_AviDest) ASF Writer : CLSID_WMAsfWriter. Le Windows Media SDK doit être installé. b. Contrôles de base sur le FileWriter Interface IFileSinkFilter : Permet de préciser le nom du fichier en sortie. Création s il n existe pas, écrasement s il existe. c. Exemple d'écriture dans un fichier L'exemple suivant prend un fichier avi (compressé ou non) et réécrit le même en supprimant la bande son. Principe: 1. connecter un filtre de lecture à un AviMux. 2. connecter l'avimux au FileWriter. On ne peut pas connecter directement le filtre de lecture au FileWriter car ce dernier n accepte pas n'importe quel type de flux de données. L'AviMux prend en entrée un flux avi (vidéo+audio) et renvoie en sortie le fichier correspondant sous forme d'un flux de données. WCHAR *fname = L"a.avi"; CoInitialize (NULL); IGraphBuilder *pgraph; CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **) &pgraph); // Ajout des filtres dans le graphe IBaseFilter *FileRead = NULL, *AviMux = NULL, *FileWriter = NULL; pgraph->addsourcefilter(fname, fname, &FileRead); CoCreateInstance(CLSID_AviDest, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **) &AviMux); pgraph->addfilter(avimux,l"avimux"); Page 22/71

CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **) &FileWriter); pgraph->addfilter(filewriter,l"filewriter"); IFileSinkFilter *FileSink; FileWriter->QueryInterface(IID_IFileSinkFilter, (void**)&filesink); FileSink->SetFileName(L"hummer.avi",NULL); // Récupération des bornes a connecter IPin *Pout,*Pin; Pout = GetPin(FileRead,PINDIR_OUTPUT); Pin = GetPin(AviMux,PINDIR_INPUT); pgraph->connect(pout,pin); SAFE_RELEASE(Pin); SAFE_RELEASE(Pout); // Deuxième connexion en sortie du tee Pout = GetPin(AviMux,PINDIR_OUTPUT); Pin = GetPin(FileWriter,PINDIR_INPUT); pgraph->connect(pout,pin); SAFE_RELEASE(Pin); SAFE_RELEASE(Pout); // Ajouter ici le contrôle du graphe 4. Rendu Null Les flux à l'entrée de ce filtre sont perdus. A utiliser lorsque l'on ne souhaite pas effectuer de rendu, mais qu'un filtre utilisé dans le graphe a besoin de voir sa borne de sortie connecté pour fonctionner correctement. Prendre comme habitude de terminer les graphes par un filtre de rendu. Ce filtre n'expose aucune interface spécifique pour le configurer. Classe: CLSID_NullRenderer Page 23/71

Périphériques matériels et interactions avec DirectShow Sous DirectShow, on accède aux différents périphériques matériels grâce à des filtres. Nous donnons ici une idée de la façon dont DirectShow interagit avec les différents matériels audio et vidéo en expliquant les différentes associations entre les périphériques et les filtres qui leurs sont associés. 1. Le matériel de capture et de mixage audio (les cartes son) Les cartes son possèdent généralement un ensemble de connecteurs pour connecter des enceintes, des microphones, etc Ces cartes ont la possibilité matérielle de pouvoir contrôler, sur chacun de ces ports, différentes caractéristiques, telles que le volume, la balance ou encore le niveau des basses. Sous DirectShow, les entrées de la carte son et les éléments permettant d effectuer ces modifications dessus, sont encapsulés dans le filtre de Capture Audio. Toute carte son peut être reconnue et «récupérée» par l énumérateur de périphériques systèmes. 2. Les périphériques VfW (Video for Windows) Le filtre VFW Capture supporte les anciennes cartes de capture vidéo dites Video for Windows. Lorsqu une telle carte est présente (et bien sûr, reconnue par le système d exploitation), elle peut, tout comme les périphériques de capture audio, être ajoutés au graphe de filtres par l intermédiaire de l énumérateur de périphériques systèmes. 3. Les périphériques WDM Streaming Les plus récents décodeurs et cartes de capture sont conformes à la spécification du Windows Driver Model. De tels dispositifs possèdent plus de fonctionnalités que les périphériques VfW. Les cartes d acquisition vidéo WDM peuvent être dotées de nouvelles possibilités de réglages comme le fait de pouvoir énumérer les différents formats de capture, de sélectionner une entrée à utiliser, d obtenir le contrôle sur des paramètres vidéo (tels que la luminosité ou le contraste). Afin de pouvoir intégrer ce types de matériel, DirectShow fournit un filtre nommé KsProxy (surnommé le filtre «couteau suisse» du fait qu il réalise plusieurs choses différentes). KsProxy n apparaît pas dans un graphe sous ce nom mais prend toujours le nom du périphérique tel qu il est définit dans la base de registres. Même si seule une carte est installée sur le système, il se peut que celle-ci contienne «plusieurs périphériques» (associés à plusieurs fonctionnalités différentes de ce périphérique). Dans Page 24/71

ce cas, chaque périphérique sera représenté par un filtre différent (ces filtres seront tous des instances différentes de KsProxy). Une application utilise l énumérateur de périphériques systèmes pour trouver les monikers sur les périphériques WDM. KsProxy est instancié lors de l appel à BindToObject sur le moniker. Comme KsProxy peut représenter tous types de périphériques WDM, il doit interroger le pilote afin de déterminer quel «ensemble de propriétés» est supporté. Un «ensemble de propriétés» étant une liste de structures de données utilisées par les pilotes WDM et par quelques filtres en mode utilisateur tels que certains décodeurs logiciels MPEG-2. KsProxy se configure automatiquement pour exposer les interfaces correspondantes aux «ensembles de propriétés». KsProxy traduit les appels aux méthodes COM en «ensemble de propriétés» et les envois au pilote. Les fabricants de tels matériels peuvent étendre KsProxy en fournissant des plug-ins (objets COM), lesquels étant des interfaces adaptées aux fonctionnalités spécifiques du périphérique. Tous ces détails son cachés à l application qui contrôle KsProxy de la même façon que tout autre filtre DirectShow. 4. Kernel Streaming Les périphériques WDM supportent le «kernel streaming». Dans ce mode, les données sont entièrement «canalisées» en mode noyau sans avoir à basculer en mode utilisateur (rappel: basculer d un mode à l autre coûte cher au niveau de la gestion des ressources). Le kernel streaming permet d obtenir un meilleur débit sans utiliser trop de ressource processeur. Les filtres basés sur WDM peuvent utiliser cela pour transporter des données multimédia directement d un périphérique matériel à un autre (éventuellement sur des périphériques différents), sans avoir à copier les données en mémoire principale du système. Du point de vue de l application, tout se passe comme si les données passent d un filtre à un autre en mode utilisateur. En réalité, lorsque le graphe et les traitements le permettent, les données sont canalisées de filtre à filtre (i.e. périphérique à périphérique) en mode noyau et ceci jusqu à la carte graphique. Dans certains cas, comme la capture dans un fichier, le passage des données en mode utilisateur est nécessaire en certains points, mais les basculements générés ne sont pas forcément synonymes de recopie complète des données dans la mémoire système. Page 25/71

Enumération des filtres disponibles sur un système La recherche des filtres disponibles sur le système s effectue avec les étapes suivantes: 1. Accès à l interface ICreateDevEnum d énumération. 2. Création d un énumérateur de classe (IEnumMoniker) en spécifiant la catégorie d objet à énumérer. 3. Pour chaque objet énuméré dans la classe (IMoniker), récupération de l ensemble des propriétés de l objet (IPropertyBag) à partir d une version inactive de l objet. 4. Pour l objet recherché, instanciation de l objet (version active). Moniker : objet COM qui fait référence à une instance spécifique d un autre objet par son nom. Un moniker va permettre de localiser, activer et obtenir l accès à un objet identifié sans connaître les informations spécifiques relatifs à celui-ci. Property Bag: ensemble des propriétés d un objet. On accède aux propriétés par leurs noms (WCHAR). Les propriétés toujours présentes pour les devices sont: FriendlyName Description DevicePath : son nom : sa description (camcorder) : son «chemin» système (unique même pour plusieurs devices de même type branché). 1. Enumérateur de classe Choix du type d énumération et récupération de l interface d énumération des Monikers. Type : ICreateDevEnum CLSID = SystemDeviceEnum, IID = ICreateDevEnum : Page 26/71