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 :

prob de durée de vie de IDvdGraphBuilder


Sujet :

DirectX

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut prob de durée de vie de IDvdGraphBuilder
    Bonjour a tous !!!

    Avant tout Merci d'avance a tout ceux qui contribuent a ce site...

    je code en VC++ non managé et je fais une app qui lit DVD et fichiers audio video et jai commencer par instancier mes objets et interfaces et donc a recree mon graph de filtre a chaque debut de lecture dun media..
    mais mon IDvdGraphBuilder me leve une exception externe lorsque je veux le release alors que tout les autres passent nikel

    et donc si je ne le release pas a la seconde tentative de lecture DVD il me leve une autre exception externe au moment du RenderDvdVideoVolume

    donc en attandant jai fait en sorte de nutiliser qune seul instance de ma Class DVD et d'utiliser le meme graph mais ca ma pas lair propre...

    Donc si qqn a une idee du pq jen serai bien ravi...
    voici ma partie ou jrelease mes com :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    if (pDVDWin)
    {
    	pDVDWin->put_MessageDrain((OAHWND)NULL);	
    	pDVDWin->put_Owner(NULL);
    }
     
    if (pEvent)
    {
    	pDVDEvent->SetNotifyWindow((OAHWND)NULL, 0, 0); 
    }
    if (pLine21Dec)
    	{
    		pLine21Dec->Release();
    		pLine21Dec = NULL;
    	}
    	if (pDVDWin)
    	{
    		pDVDWin->Release();
    		pDVDWin = NULL;
    	}
    	if (pDVD)
    	{
    	                pDVD->Release(); // ici 
    		pDVD = NULL;
    	}
     
    	if (pDVDControl2)
    	{
    		pDVDControl2->Release();
    		pDVDControl2 = NULL;
    	}
     
    	if (pDVDInfo)
    	...
    	if (pDVDEvent)
    	...
    	if (pDVDControl)
    	...
    	if (pDVDWin)
    	{
    		pDVDWin->Release();
    		pDVDWin = NULL;
    	}
    	if (pDVDGraph)
    	{
    		pDVDGraph->Release(); 
    		pDVDGraph = NULL;
    	}
    - si qqn a des infos sur lutilisation des COM Directshow par un wrapper managé ca srait cool...


    Chaks

    Bien amicalement...

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Effectivement tu as l'air de tout Release et dans le bon ordre. Mais je crois que le problème viens d'ailleurs dans ton code et il faudrait nous le montrer.

    J'ai actuellement un souci qui correspond peut-être à ton problème et qui est spécifique des objets COM. En effet lorsque j'instancie une interface COM, celle-ci hérite d'une autre interface que je n'ai pas besoin de gérer. Mais mon programme me lève une exception à la libération de cette interface. Bref bienvenue dans le monde des objets COM. (Il s'agit de l'interface IDirect3DVertexBuffer9 qui hérite de l'interface IDirect3DResource9).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    voila le reste de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
    void DSFilterGraphManager::InitCom()
    {
    	pGraph  = NULL;
    	pControl= NULL;
    	pEvent	= NULL;
    	pSeek	= NULL;
     
    	CoInitializeEx	(NULL, COINIT_APARTMENTTHREADED	);
     
    	CoCreateInstance(CLSID_FilterGraph, NULL, 
    						CLSCTX_INPROC_SERVER,
    						IID_IGraphBuilder, 
    						(void **)&pGraph	);
     
    	CoCreateInstance(	CLSID_DvdGraphBuilder, 
    						NULL, 
    						CLSCTX_INPROC_SERVER,
    						IID_IDvdGraphBuilder, 
    						(void **)&pDVD	);
     
    	AM_DVD_RENDERSTATUS buildStatus;
    	pDVD->RenderDvdVideoVolume(L"",AM_DVD_HWDEC_PREFER,&buildStatus);
    	pDVD->GetFiltergraph(&pGraph);
     
    	pGraph->QueryInterface(IID_IMediaControl,(void **)&pControl);
    	pGraph->QueryInterface(IID_IMediaEventEx,(void **)&pEvent	);	
    	pGraph->QueryInterface(IID_IMediaSeeking,(void **)&pSeek);	
    	pGraph->QueryInterface(IID_IBasicAudio,  (void **)&pAudio);
    	pGraph->QueryInterface(IID_IVideoWindow, (void **)&pWin);
     
    	pDVD->GetDvdInterface(IID_IDvdInfo2,     (void **)&pDVDInfo);
    	pDVD->GetDvdInterface(IID_IDvdControl2,  (void **)&pDVDControl2);
    	pDVD->GetDvdInterface(IID_IVideoWindow,  (void **)&pDVDWin);
    	pDVD->GetDvdInterface(IID_IAMLine21Decoder,(void **)&pLine21Dec);
     
    }
     
    //------------------------------------------------------------------------------------------

    Voila voila..

    je met les liens que jai deja trouvé sur le sujet :


    http://darkpillow.free.fr/perso/DShow%20Cours.doc

    http://odelmotte.developpez.com/tuto...ayback/csharp/

    http://www.kohsuke.org/dotnet/directshowTypelib/

    http://perso.wanadoo.fr/letchideslandes/

    http://www.flipcode.com/articles/art...ctshow03.shtml

    http://www.microsoft.com/france/msdn...1_vmr-d3d.html


    jvé tenter de deconnecter le filtre source et le remove avant de le release...

    encor merci..

    Chaks
    =====

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    ben voila en fait il fallais bien trouver , déconnecter et remover tout les filtre du graph pour pouvoir releaser l'IDvdGraphBuilder

    voici donc comment jai proceder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    void DSFilterGraphManager::DestrucGraph()
    {
    	IEnumFilters *pEnum = NULL;
        IBaseFilter *pFilter;
    	ULONG cFetched;
     
    	pGraph->EnumFilters(&pEnum);
    	while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
        {   
            RemoveFilter(pFilter);   
        }
        pEnum->Release();
     
    }
     
    HRESULT DSFilterGraphManager::RemoveFilter(IBaseFilter* pInputFileFilter)
    {
    	IPin * pFileOut = GetPin(pInputFileFilter, PINDIR_OUTPUT);
     
    	HRESULT hr = pGraph->Disconnect(pFileOut);
    	if(FAILED(hr))
    		return hr;
     
    	hr = pGraph->RemoveFilter(pInputFileFilter);
    	if(FAILED(hr))
    		return hr;
     
    	return hr;
    }
     
    IPin *DSFilterGraphManager::GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir)
    {
    	BOOL       bFound = FALSE;
    	IEnumPins  *pEnum;
    	IPin       *pPin;
     
    	// Begin by enumerating all the pins on a filter
    	HRESULT hr = pFilter->EnumPins(&pEnum);
    	if (FAILED(hr))
    	{
    		return NULL;
    	}
     
    	// Now look for a pin that matches the direction characteristic.
    	// When we've found it, we'll return with it.
    	while(pEnum->Next(1, &pPin, 0) == S_OK)
    	{
    		PIN_DIRECTION PinDirThis;
     
    		pPin->QueryDirection(&PinDirThis);
    		if (bFound = (PinDir == PinDirThis))
    			break;
    		pPin->Release();
    	}
    	pEnum->Release();
    	return (bFound ? pPin : NULL);  
    }
    Message aux admin : pas moyen de créer un post fix sur DirectShow ?

    sinon encor merci..

    Chaks
    ====

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Message aux admin : pas moyen de créer un post fix sur DirectShow ?
    Si tu nous le remplis, y a aucun problème 8).
    De toute façon les messages de ce forum ne bougent pas, tu devrais toujours pouvoir t'en tirer avec la recherche avancée.

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    J'ai pas bien compris. Est-ce que c'est toi qui avais fait la connection des pins ou bien non. Car à ce moment là ça veut dire qui si tu connectes des pins entre eux tu dois te charger de les déconnecter. Ca m'intéresse car je vais devoir effectuer une connection manuelle de filtres (voir message mpeg2 et D3D9).

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    pour l instant jutilise RenderFile de IGraphBuilder et RenderDVDVolume de IDvdGraphBuilder pour creer le graph de filtre aproprié et donc maintenant je deconnect et remove tjrs tout mes filtres..

    je navais jamais eu ce probleme avec IGraphBuilder que je ne deconnectais pas et removais pas mais qui releasais bien par contre..

    Chaks
    ====

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Si j'ai bien compris tu voulais utiliser une seul instance de ton graphebuilder. En effet lorsque tu lis un deuxième DVD les filtres de ton graphe sont toujours présents et donc lorsque tu instancies une deuxième lecture de DVD tu ajoutes les mêmes filtres qui se retrouvent en double d'ou surement l'exception lors de la destruction du graphe.

    La méthode propre je pense est que si tes DVD utilisent tous le même chaînage de filtres, tu n'est pas obliger de tout détruire et de tout reconstruire. Tu peux utiliser alors les filtres déjà présents. La seule chose qui change c'est le filtre source (le fichier média). Tu déconnectes le premier fichier source et ensuite tu connectes le nouveau fichier source à la chaîne de filtres, à condition bien sûr que les deux fichiers sources utilisent le même graphe de filtre.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    jy avais penser et c est alors que jai chercher quelle etais le filtre source du renderDvdVolum et c est "DVD Navigator" mais je nais pas trouver comment utiliser juste ce filtre

    mais de toute facon jai bien limpression que le graph depend qd meme du dvd a jouer...
    et sans compter du coté de la lecture audio video entre les differents formats...

    ou alors tout fair a la main jy pense aussi...

    question optimisation ca vaut le coup?

    Chaks
    ====

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Disons que si tu enchaines des DVD qui durent 2 heures chacun, je pense que ce n'est pas le peine de s'embêter... La personne atendra bien quelques secondes que le graphe se reconstruise.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    en fait mon probleme residait dans le fait qu apres apres avoir construit mon graph de filtre dvd avec dvdrendervolume de iDvdGraphBuilder il le passais a IGraphBuilder par reference.. et donc pouvais pas utiliser des filtres deja existant qui me serviront aussi a mon graph dvd (ex filtre de rendu audio et video entre une lecture dun divx et ensuite d un dvd..)

    De la jai commencer a bosser sur la construction de filtre avec juste des render pour ne devoir donc changer que de filtre source et de transformation...
    tout marche bien il passe dlun a lautre sans probleme mais me fais une erreur apres la fermeture de mon programme : Unhandled exception....invalid HANDLE was specified.

    et ce nest que lorsque jai fait un render qua la fin jai cette erreur...

    si qqn a une idee sur le sujet... merci

    Chaks
    =====

  12. #12
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Je te conseille d'utiliser les smarts pointers:

    CComPtr<IBaseFilter> pFilter;

    Leur utilisation est un peu particulière mais ceci te permettra de déceler pas mal d'erreur sur des pointeurs non nuls par exemple.

    Il faut <atlbase.h> et peut-être d'autres headers. Les exemples du SDK de directshow regorgent d'utilisation de ces pointeurs. Un débogage pas à pas sur la destruction de tous tes objets devrait te permettre de trouver à quel moment ça plante et donc quel pointeur est incriminé.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/04/2006, 11h37
  2. Durée de vie d'une session
    Par dbass dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2006, 19h38
  3. [Cookies] durée de vie de l'objet
    Par ozzmax dans le forum Langage
    Réponses: 13
    Dernier message: 13/01/2006, 21h38
  4. [savoir] durée de vie d'un PC?
    Par afrikha dans le forum Composants
    Réponses: 20
    Dernier message: 24/10/2005, 13h28
  5. [AS2] durée de vie d'une classe (extends movieclip)
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 23/07/2005, 13h33

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