[Direct Draw] Kan Direct Draw werken in een Ansi C omgeving?

Pagina: 1
Acties:

  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
Ik werk momenteel aan een programma om live video mee te grabben, en ik wil hiervoor Direct Draw gebruiken. Het programma is geheel in Ansi C geschreven en alle windows en componenten zijn dus zelf aangemaakt. Alleen zijn dit geen normale windows, maar Dialogs. Kan direct Draw hier iets mee en zo ja, hoe dan? Ik krijg DD in zijn geheel niet geinitialiseerd... :?

Als blikken konden doden, waarom doen ze er dan erwten in?


Verwijderd

Wat voor foutmelding krijg je dan? stukje voorbeeld source?

Verwijderd

Jahoor, dat kan best.
Ik zou ff Googlen, dat geeft je probably meer info..

  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
Dat is het net, ik krijg geen foutmelding. Ik krijg of gewoon niks te zien, of het programma geeft twee acces violations...
Ik snap er echt helemaal niks meer van!
Maar een dialog gebruiken voor Direct Draw zou geen probleem mogen zijn?

Als blikken konden doden, waarom doen ze er dan erwten in?


Verwijderd

*kuch* stukje code? *kuch*

  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
Dit is dus hoe ik DD initialiseer, maar mijn lpddsback blijft ongevuld, en opeens ook mijn lpddsprimary...

private BOOL direct_draw_init_surfaces(void)
{
DDSCAPS ddscaps ;
LPDIRECTDRAW pDD ; // DD1 interface, used to get DD4 interface

HRESULT hRet ;
DDPIXELFORMAT ddpf =

// The pixel format that we want the surface to be in
{
sizeof(DDPIXELFORMAT),
DDPF_YUV,
0, 8
};


/*
* Create the main DirectDraw object.
* This function takes care of initializing COM and Constructing
* the DirectDraw object.
*/

hRet = DirectDrawCreate( NULL, &pDD, NULL ) ;
if( hRet != DD_OK )
{
return(FALSE) ;
}

// Fetch DirectDraw4 interface
hRet = pDD->lpVtbl->QueryInterface(pDD, &IID_IDirectDraw, (LPVOID *)&lpDD);
if (FAILED(hRet))
{
return (FALSE);
}

hRet = lpDD->lpVtbl->SetCooperativeLevel( lpDD , main , DDSCL_NORMAL ) ;
if( hRet != DD_OK )
{
lpDD->lpVtbl->Release ;
return(FALSE) ;
}


// Create the primary surface with 1 back buffer
ZeroMemory(&ddsd, sizeof(ddsd)) ;
ddsd.dwSize = sizeof(ddsd) ;
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT ;
ddsd.dwHeight = 578 ;
ddsd.dwWidth = 768 ;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE| DDSCAPS_FLIP|DDSCAPS_COMPLEX ;

ddsd.dwBackBufferCount = 1 ;
ddsd.ddpfPixelFormat = ddpf ; // Use 8 bit YUV pixel format

hRet = lpDD->lpVtbl->CreateSurface (lpDD, &ddsd, &lpDDSPrimary, NULL) ;

if (hRet != DD_OK)
{
return(FALSE) ;
}


ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
hRet = lpDDSPrimary->lpVtbl->GetAttachedSurface(lpDDSPrimary, &ddscaps, &lpDDSBack);
if(hRet!= DD_OK)
{
return (FALSE);
}


return(TRUE) ;

}

Als blikken konden doden, waarom doen ze er dan erwten in?


Verwijderd

Maar je hRets zijn wel ok? of jumped ie er al eerder uit?

  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
Hij jumped eruit bij de createsurface....

En voor de rest klopt alles... Ik heb alles gecheckt...

Als blikken konden doden, waarom doen ze er dan erwten in?


Verwijderd

En met welke error code pringt ie uit die CreateSurface dan?

  • Willem
  • Registratie: Februari 2001
  • Laatst online: 22:35
Dat is dus meer richting /14

move vanuit W&G :)

Motor (of auto) onderhoud bijhouden


  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
idee, hij geeft of geen code, of mijn debugger kan hem niet vinden...
Maar ik zal nog een paar pogingen doen...

Als blikken konden doden, waarom doen ze er dan erwten in?


Verwijderd

Hij knalt *IN* CreateSurface ? of CreateSurface geeft iets anders dan DD_OK terug?

  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
CreateSurface geeft aan dat de mode Exclusive moet zijn... Maar dat is net het probleem. Ik wil dit surface gebruiken voor het displayen van live video, maar het mag niet fullscreen exclusive zijn... Want dan werken mijn buttons niet meer...
En ik heb een van de voorbeelden bij de DirectX 6.1 SDK gecomppileerd en die werkt wel ---> Stretch.cpp
Kan het eraan liggen dat ik C gebruik en niet C++?

Als blikken konden doden, waarom doen ze er dan erwten in?


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Garoth schreef op 11 december 2002 @ 16:29:
CreateSurface geeft aan dat de mode Exclusive moet zijn... Maar dat is net het probleem. Ik wil dit surface gebruiken voor het displayen van live video, maar het mag niet fullscreen exclusive zijn... Want dan werken mijn buttons niet meer...
Ik dacht dat je in windowed mode geen primary surface mag maken met DDSCAPS_FLIP en backbuffers.
Kan het eraan liggen dat ik C gebruik en niet C++?
Nee. Ik zou je zelfs dit stukje in assembler kunnen laten zien dat ik een keer heb gemaakt... Taal maakt in principe niets uit.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:39

.oisyn

Moderator Devschuur®

Demotivational Speaker

Garoth schreef op 04 december 2002 @ 13:46:
Dit is dus hoe ik DD initialiseer, maar mijn lpddsback blijft ongevuld, en opeens ook mijn lpddsprimary...

C:
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
private BOOL direct_draw_init_surfaces(void)
 {
    DDSCAPS                    ddscaps          ;
    LPDIRECTDRAW            pDD             ;            // DD1 interface, used to get DD4 interface

    HRESULT                     hRet            ;
        DDPIXELFORMAT               ddpf =

    // The pixel format that we want the surface to be in
                                {
                                    sizeof(DDPIXELFORMAT),
                                    DDPF_YUV,
                                    0, 8
                                };

        
        /*
         * Create the main DirectDraw object.
         * This function takes care of initializing COM and Constructing
         * the DirectDraw object.
         */

        hRet = DirectDrawCreate( NULL, &pDD, NULL )     ;
        if( hRet != DD_OK )
        {
            return(FALSE)                   ;
        }
        
         // Fetch DirectDraw4 interface
    hRet = pDD->lpVtbl->QueryInterface(pDD, &IID_IDirectDraw, (LPVOID *)&lpDD);
    if (FAILED(hRet))
    {
        return (FALSE);
    }
              
        hRet = lpDD->lpVtbl->SetCooperativeLevel( lpDD , main , DDSCL_NORMAL  )     ;
        if( hRet != DD_OK )
        {
            lpDD->lpVtbl->Release               ;
                return(FALSE)                   ;
        }



    // Create the primary surface with 1 back buffer
        ZeroMemory(&ddsd, sizeof(ddsd))             ;
        ddsd.dwSize = sizeof(ddsd)              ;
        ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT             ;
        ddsd.dwHeight = 578                 ;
    ddsd.dwWidth = 768                  ;
        ddsd.ddsCaps.dwCaps =   DDSCAPS_PRIMARYSURFACE| DDSCAPS_FLIP|DDSCAPS_COMPLEX        ;
        
        ddsd.dwBackBufferCount = 1              ;               
        ddsd.ddpfPixelFormat = ddpf             ;  // Use 8 bit YUV pixel format
                
        hRet = lpDD->lpVtbl->CreateSurface (lpDD, &ddsd, &lpDDSPrimary, NULL)           ; 
  
        if (hRet != DD_OK)
    {
        return(FALSE)                   ; 
    }


    ddscaps.dwCaps = DDSCAPS_BACKBUFFER; 
    hRet = lpDDSPrimary->lpVtbl->GetAttachedSurface(lpDDSPrimary, &ddscaps, &lpDDSBack); 
    if(hRet!= DD_OK) 
    { 
        return (FALSE); 
    } 
    
                
    return(TRUE)                        ;
    
 }


even tussen codetags, dat leest wat makkelijker ;)

wat betekent die bovenste private trouwens?
en verder ben je de haakjes vergeten achter Release bij het volgende stukje code:
C:
1
2
3
4
5
        if( hRet != DD_OK )
        {
            lpDD->lpVtbl->Release               ;
                return(FALSE)                   ;
        }


verder zou ik niet weten waarom het niet zou werken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
Thanx guys!
Goed, dan moet ik helaas iets nieuws gaan verzinnen als backbuffering niet werkt in windowed mode... Maar ja, dat moet dan maar... :O

En .Oisin, die bovenste private is gewoon om ervoor te zorgen dat die functie private is. Da's een of andere regel hier in het bedrijf... Ik zou het zelf ook anders doen, maar ja... :X
En als ik haakjes achter Release zet geeft mijn debugger de error : "Function does not match prototype" . Raar maar waar... Yay Metrowerks... |:(

Als blikken konden doden, waarom doen ze er dan erwten in?


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Garoth schreef op 12 December 2002 @ 09:02:
Goed, dan moet ik helaas iets nieuws gaan verzinnen als backbuffering niet werkt in windowed mode... Maar ja, dat moet dan maar... :O
In MSDN staan voorbeelden hoe dat moet. Gewoon een andere surface met DDSCAPS_OFFSCREENPLAIN maken, en dan met IDirectDrawSurface::Blt die op de primary surface blitten op de goede plaats.

Ook moet je een clipper maken en die aan je window en primary surface kopppelen.

  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
Eerst nog een vraagje: Mijn framegrabber kaart grabt frames in 8 bit YUV formaat. Ik probeer om mijn Pixelformat ook op 8-bit YUV te zetten, maar dit lukt niet. Weet iemand toevallig de code om deze pixelformat te vullen? Ik snap namelijk de structuur van Pixelformat niet :? met al die DUMMYUNIONNAMEN(n)...

Als blikken konden doden, waarom doen ze er dan erwten in?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:39

.oisyn

Moderator Devschuur®

Demotivational Speaker

Garoth schreef op 12 December 2002 @ 09:02:
En .Oisin, die bovenste private is gewoon om ervoor te zorgen dat die functie private is. Da's een of andere regel hier in het bedrijf... Ik zou het zelf ook anders doen, maar ja... :X


ja, en nu doet ie helemaal niets :P
Wat daar staat is in principe hetzelfde als:
C:
1
2
3
4
int a;
/* ... */

a;  /* <-- deze statement */


Het is een valide statement, maar er gebeurt gewoon niets. Wat je eigenlijk doet is het adres van de Release functie opvragen, maar daar doe je dan vervolgens niet mee. Als je er haakjes achter zet evalueert ie dat als een function call.
Dat ie met () erachter niet klopt is natuurlijk nogal duh, aangezien je altijd de this pointer mee moet geven als eerste parameter

Dit zal daarom beter werken:
C:
1
lpDD->lpVtbl->Release (lpDD);

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
dank je wel oisyn!
Maar wat ik ook probeer, ik krijg die pixelformat niet aan het werken.... :(

Het kan zijn dat ik heel dom ben of zo, maar ik maak de dwSize gewoon sizeof(DDPIXELFORMAT), de dwFlags maak ik DDPF_FOURCC, en de deFourCC maak ik YUV8. En nu krijg ik de melding : Error : undefined identifier 'YUV8'
grab_sequence.c line 310 YUV8

[ Voor 65% gewijzigd door Garoth op 16-12-2002 09:30 ]

Als blikken konden doden, waarom doen ze er dan erwten in?


  • Garoth
  • Registratie: November 2002
  • Laatst online: 04-10-2024
En het volgende werkt ook niet:


C:
1
2
3
4
5
ZeroMemory(&ddpf, sizeof(ddpf));
    ddpf.dwSize       = sizeof(DDPIXELFORMAT);
    ddpf.dwFlags      = DDPF_YUV;
//  ddpf.dwFourCC     = mmioFOURCC('Y','U','V','8');
    ddpf.dwYUVBitCount= 8;

[ Voor 12% gewijzigd door Garoth op 16-12-2002 10:06 ]

Als blikken konden doden, waarom doen ze er dan erwten in?

Pagina: 1