IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

DirectShow et Bitmap


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut DirectShow et Bitmap
    Bonjour,

    j'ai un buffer de bitmap en entrées (en 24 bits) que je gère comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BITMAPINFOHEADER *pHdr = (BITMAPINFOHEADER*)(&BMPInfo);
    	pHdr->biSize = sizeof(BITMAPINFOHEADER);
    	pHdr->biBitCount = 24;
    	pHdr->biWidth = widthSource;
    	pHdr->biHeight = heightSource;
    	pHdr->biPlanes = 1;
    	pHdr->biSizeImage= 0;
    	pHdr->biCompression = BI_RGB;
     
    ::StretchDIBits(pDC->GetSafeHdc(),
    //		0,0,widthSource,heightSource,
    		rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),
    		0,0,widthSource,heightSource,
    		pBuffer,&BMPInfo,0,SRCCOPY);

    J'aimerai gérer l'affichage avec Directshow, que j'associerai au contexte de ma fenêtre. Comme ça seul le buffer d'entrée influera sur l'affichage ce qui devrait faciliter le développement à venir de fonctions supplémentaires grâce aux filtres DS.
    Seulement voilà, je n'arrive pas à démarrer sur la prise en main de DirectShow et je ne trouve pas d'exemples qui m'éclaircissent vraiment.

    Est-ce que vous pourriez me mettre sur la voie sur le fonctionnement ?
    Comment lier un rendu DirectShow à un contexte ?
    Peut-il permettre d'afficher directement un buffer de bitmap ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Salut pour afficher un HDC dans des interfaces de rendu DirectShow je pense que le plus simple c'est de passer par une DirectDrawSurface.
    une DirectDrawSurface fournit la méthode GetDC similaire à celle de la win32/GDI

  3. #3
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    Le plus simple est de maquetter avec graphedit.
    Par contre, le fait que tu utilises la GDI (qui dans ses principes s'apparente plus à DirectX qu'à DirectShow) ne semble pas indiquer une démarche COM de type DirectShow, avec cadencement par un renderer etc.

    Quelle utilisation penses-tu faire de DS (qui est plutôt prévue pour la gesion de flux, vidéo, audio, MIDI, automation...).
    Tu désires faire des filtres de traitements ?
    DS est, finalement, très lourd et pas très sérieux au niveau de la garantie de traitement de tes frames (s'il est à la bourre il ne traite pas il saute pour maintenir la synchro...).
    Es-tu sûr de la démarche et de la cohésion avec ton cahier des charges ?

    J'aimerai gérer l'affichage avec Directshow, que j'associerai au contexte de ma fenêtre
    Le mode fenêtré n'est pas très compliqué mais il va te falloir renoncer aux notions de DC et HDC...

    Sans vouloir faire de peine à qui que ce soit, utiliser directDraw est devenu un interdit .

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    En fait je crée une appli MDI qui aura pour but d'afficher différents flux provenant de caméras. A priori le nombre de fenêtres n'est pas limité et j'ai peur qu'avec la GDI qui, à ma connaissance, n'utilise pas l'accélération matérielle l'application ne suive pas la charge.
    De plus, selon les flux, dans le futur il y aura surement des demandes de traitements spécifiques.

    C'est pourquoi j'avais pensé à DirectShow.

    Mais je ne trouve pas vraiment de support bien expliqués sur le web pour me lancer dans DS, et d'après ce que j'ai pu comprendre la seule fonction de "lecture" de DS passe par RenderFile ce qui m'obligerai à passer par un enregistrement de mon flux sur le disque avant de l'afficher.

  5. #5
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    En fait je crée une appli MDI qui aura pour but d'afficher différents flux provenant de caméras. A priori le nombre de fenêtres n'est pas limité et j'ai peur qu'avec la GDI qui, à ma connaissance, n'utilise pas l'accélération matérielle l'application ne suive pas la charge.
    De plus, selon les flux, dans le futur il y aura surement des demandes de traitements spécifiques.
    La GDI utilise l'accélération matérielle dans le sens où elle n'est pas une émulation mais de simples commandes au GPU.
    Si par accélération matérielle tu fais allusion à DXVA (DirectX Vidéo Accélération) car tu comptes utiliser des flux en provenance de tes caméras qui seront compressés à un format supporté (DVI H264 etc.)...
    le plus "simple" est d'implémenter DXVA (ce qui en vidéo surveillance, par exemple, te permettrait d'assurer l'avenir sereinement).

    Pour les traitements, je te renvoie aux exemples d'ATI qui utilisent largement le matériel, à moins que tu ne désires implémenter des filtres d'intempérie ou de comportements (là, nous ne serions plus dans le traitement graphique mais dans l'analyse et DirectShow deviendrait un handicap notoire...).

    Mais je ne trouve pas vraiment de support bien expliqués sur le web pour me lancer dans DS, et d'après ce que j'ai pu comprendre la seule fonction de "lecture" de DS passe par RenderFile ce qui m'obligerai à passer par un enregistrement de mon flux sur le disque avant de l'afficher.
    Le RenderFile est un filtre comme un autre et un fichier peut tout à fait être déjà en RAM (un simple buffer donc).

    Pour tes caméras, le plus simple et le plus efficace, est de faire de l'acquisition asynchrone (je ne sais ni à combien de FPS tu travailles ni si tu dois n'enregistrer les flux que dans certains cas) qui te permet de charger en buffer tes données quand elles sont disponibles (OnSingleEvent par caméra), ensuite ton renderer ira chercher les données dont il à besoin.
    Là encore, DirectX sera beaucoup plus efficace que DirectShow pour une gestion multi-flux (au début c'est cool, à partir de 16 flux mpg 352*240 25 FPS) tu commences à monter en charge 25% CPU ensuite DS s'écroule petit à petit en t'interdisant tout traitement temps-réel.

    Avec DXVA tu peux faire tourner 8 vidéos HD 1980*1080p 25FPS H264 sur la même carte graphique (une 4870 par exemple) et 0% CPU... pas de commentaires...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Merci Rémi pour ces infos.

    D'après ce que tu me dis Je vais voir du côté de DXVA

  7. #7
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Salut,


    Citation Envoyé par Rémi Coquet Voir le message
    Sans vouloir faire de peine à qui que ce soit, utiliser directDraw est devenu un interdit .
    Oui mais on n'a pas trop le choix...
    j'ai un exemple de code ou avec une DDSurface on peut faire du rendu d'interfaces DirectShow.
    Et puis DirectShow est abandonné par Microsoft.
    Même avec D3d9 il ya des DirectDrawSurface.


    Citation Envoyé par gorhh Voir le message
    Seulement voilà, je n'arrive pas à démarrer sur la prise en main de DirectShow et je ne trouve pas d'exemples qui m'éclaircissent vraiment.
    As-tu regardé dans les vieux SDK de Direct X ( vu que DirectShow est abandonné ) ?
    Il y a un exemple pas trop compliqué de lecteur de médias, PlayWnd je crois.
    Il te montre comment utiliser les interfaces DShow.

    La GDI utilise l'accélération matérielle dans le sens où elle n'est pas une émulation mais de simples commandes au GPU.
    Peut-être sous Vista et encore...je n'en suis pas certain parce que c'est pour des raisons de rétro-compatibilités.
    Je doute fortement là-dessus.
    Je crois que le GDI utilise un système de verrouillage win16

  8. #8
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    - DirectShow n'est en aucun cas abandonné par Microsoft, même si les rôles sont bien différenciés aujourd'hui, pas plus que la topologie, ou les accès blitter low-level.
    Ce ne sont pas des suppositions mais des confirmations de faits établis et maintenus, sous XP/Vista/Seven.
    DirectX 10 avance toujours plus dans la direction du support matériel (le contraire serait absurde) DXVA1 devient DXVA2, Direct2D permet une gestion plus efficace et plus directe des fameuses surfaces que tu sembles apprécier... etc.

    Je ne sais pas quelle version de D3D9 tu utilises pour manipuler des DirectDraw surfaces (un seul exemple de COM suffirait à me convaincre) !?

    - Pas de rétro compatibilités ou je ne sais quel délire: Le matériel est toujours utilisé (et forcément de plus en plus) par toutes les Api (que ce soit les ports, les GPU, GPGPU, CPU, DSP, DMA etc.)

    - Oublies Win16, je ne sais pas d'où tu tires cette aberration (cela en est une pour le coup). Le matériel possède des bus 32 64 128 256 bits ou sérielles hautes vitesses. L'OS ne fait que toujours y coller de plus en plus efficacement.
    Tous les changements apportés par Microsoft ont pour but de virtualiser les drivers etc. pour un mode User plus sécurisé (et plus lent) ainsi qu'intégrer au noyau des mécanismes low-level prioritaires (audio/vidéo/temps réel-critique).

    DirectDraw, c'est vraiment si tu veux te faire du mal, ou penser que la R&D c'est comme le C: Tu le fais une fois et après tu recompiles...

  9. #9
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Citation Envoyé par Rémi Coquet Voir le message
    Je ne sais pas quelle version de D3D9 tu utilises pour manipuler des DirectDraw surfaces (un seul exemple de COM suffirait à me convaincre) !?
    Salut Rémi,

    c'est le SDK de Juin 2007 peut-être que les versions ultérieures ne comportent plus cela

    IDirect3DSurface9
    Applications use the methods of the IDirect3DSurface9 interface to query and prepare surfaces.

    IDirect3DSurface9 Members
    Method Description
    IDirect3DSurface9::GetContainer Provides access to the parent cube texture or texture (mipmap) object, if this surface is a child level of a cube texture or a mipmap. This method can also provide access to the parent swap chain if the surface is a back-buffer child.
    IDirect3DSurface9::GetDC Retrieves a device context.
    IDirect3DSurface9::GetDesc Pointer to a D3DSURFACE_DESC structure, describing the surface.
    IDirect3DSurface9::LockRect Pointer to a D3DLOCKED_RECT structure that describes the locked region.
    IDirect3DSurface9::ReleaseDC Release a device context handle.
    IDirect3DSurface9::UnlockRect Unlocks a rectangle on a surface.

    Remarks
    This interface, like all COM interfaces, inherits from the IUnknown interface.

    The LPDIRECT3DSURFACE9 and PDIRECT3DSURFACE9 types are defined as pointers to the IDirect3DSurface9 interface.

    typedef struct IDirect3DSurface9 *LPDIRECT3DSURFACE9, *PDIRECT3DSURFACE9;

    See Also
    D3D Interfaces

    Requirements
    Header: Declared in D3D9.h.

    Library: Use D3d9.lib.
    Ce n'est pas tout à fait une DirectDrawSurface bon allez je me suis mal exprimé.
    Mais on peut obtenir un DC sur une IDirect3DSurface9

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2002, 18h26
  2. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40
  3. Pb Lecture de bitmap monochrome
    Par Loïc38 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/07/2002, 18h24
  4. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo