Erreur impossible à résoudre...

Signaler
Messages postés
24
Date d'inscription
samedi 13 octobre 2007
Statut
Membre
Dernière intervention
25 novembre 2008
-
Messages postés
212
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
23 juin 2011
-
Bonjour à tous,


je travaille sur un projet d'acquisition vidéo depuis une camera IP emettant un flux vidéo MJPEG. J'arrive à acquérir ma vidéo mais maintenant je souhaiterais faire un traitement vidéo (détection de contours).


J'ai fais un bout de programme, il se compile correctement sous visual studio pro 2005, j'arrive à le débugger... Je génère une fenêtre windows dans laquelle je peux normalement visualiser la vidéo mais quand je clique sur "play", ça plante et me met une erreur.


 


Voici mon bout de programme:




void



CMJPEGunicastDlg::OnPlayLive()
{
VARIANT Tampon;
VARIANT vDataType;
VARIANT vType;
SAFEARRAYBOUND bounds;
long LongueurTampon = 0;
unsignedchar TabPix[640*3][480];
int x, y;
this->UpdateData();
// Set the media URL and the media type
m_AMC.SetMediaURL("http://" + m_ipText + "/axis-cgi/mjpg/video.cgi");
m_AMC.SetMediaType("mjpeg-unicast");
try
{
// Starts the download of the mjpeg stream from the Axis camera/video server
m_AMC.GetCurrentImage(0, &Tampon, &LongueurTampon);
bounds.cElements = LongueurTampon;
bounds.lLbound = 0;
vDataType.vt = VT_ARRAY |VT_UI1;
vDataType.parray = SafeArrayCreate(VT_UI1, 1, &bounds);
vType.vt = VT_ARRAY|VT_I4;
vType.intVal = 1;
void *pDest;
SafeArrayAccessData(Tampon.parray, &pDest);
BYTE *buffer = new BYTE[LongueurTampon];
memcpy(buffer,(BYTE*) pDest, LongueurTampon);
constint bpp = 3;
int offset = 0;
for (x=0; x<48; x++)
{
for (y=0; x<(64); x++)
{
//offset = ((y*640) +x)*bpp;
TabPix[x][y] = buffer[((y*64) +x)*bpp];
//R = buffer[offset + 0];
//G = buffer[offset + 1];
//B = buffer[offset + 2];
}
}
SafeArrayUnaccessData(Tampon.parray);
delete [] buffer;
m_AMC.Play();
}
catch (COleDispatchException *e)
{
if (e->m_scError == E_INVALIDARG)
{
MessageBox("Invalid parameters.");
}
elseif (e->m_scError == E_ACCESSDENIED)
{
MessageBox("Access denied.");
}
else
{
MessageBox("Failure.");
}
}
}

Le programme plante à la ligne:
SafeArrayAccessData(Tampon.parray, &pDest);
Je ne suis pas sûr mais il semblerait que l'on arrive pas à lire les élements de Tampon.parray.

Est-ce que quelqu'un saurait m'expliquer ce qui se passe?

Cordialement,

Crepuscule3

4 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Il faut utiliser le membre :

vDataType.pparray

qui correspond à :
SAFEARRAY  FAR* FAR* pparray;

et non à :
SAFEARRAY FAR* parray;
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Non pardon, je confond avec :

SAFEARRAY* psa;
BSTR HUGEP *pbstr;
SafeArrayAccessData(psa, (void HUGEP**)&pbstr);
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,


Des variables non utilisées tu ne déclarera pas.


A quoi sert ton vDataType ?

A quoi sert ton vType ?

Vu que bounds ne te sert que pour vDataType, tu peux le virer aussi.


Tu récupère un pointeur sur ton "tableau" avec SafeArrayAccessData.

Puis tu le recopies dans buffer.

Puis tu le recopies dans TabPix.


Tu à l'air de penser que tu manipule un tableau de 640 * 480 * 3 octets = 921600 octets.

Recopier 921600 octets, ça prend du temps non négligeable, même sur un pentium cinquante douze.

Autant memcopy est vaguement optimisé (Va certaiment copier le tableau
32 bits par 32 bits), autant ta deuxième recopie doit prendre au bas
mot 4 ou cinqs front d'horloges processeurs par octets (Copie RAM ->
registre, registre -> RAM, calculs des offsets, saut de boucle...)
Tout ça juste pour du vent.

T'embête pas à faire des copies !


Dans ton MP, tu me dis "Lorsque j'ai mis l'argument à 0 elle m'a fait
un jpeg et lorsque j'ai mis à 1, c'était un bitmap". Là tu as mis 0.


Une Bitmap, c'est pas un bête tableau de pixels. Si tu ouvre une bitmap
avec le bloc note, tu vas contater que les deux premiers caractères
sont BM. Ces deux caractère font partie de l'entête du fichier bitmap.
Les fichiers bitmaps ont une succession d'entêtes avant les pixels (Qui
précisent la taille de la bitmap, sont type de compression, son nombre
de bytes par pixels...), et ont parfois aussi une pallette.


Je suis pas devin et je sais pas si GetCurrentImage renvoie une bitmap
ou un tableau de pixel... Je te mets simplement en garde que tu devrais
t'assurer  de ce qu'elle te renvoies (D'où l'utilité du source de
mon MP).


Concernant ton erreur, tu devrais vérifier que GetCurrentImage te renvoie bien un tableau, et pas un VARIANT ne contenant rien.


m_AMC.GetCurrentImage(0 ou 1, &Tampon, &LongueurTampon);

if ((Tampon.vt &  VT_ARRAY) != VT_ARRAY)

  MessageBox("Echec de la  récupération de l'image");

<hr size="2" width="100%" />3ème année en ecole d'ingé d'info cherche stage de 4 mois à partir du 01/04/08
Messages postés
212
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
23 juin 2011

tout simplement:
psa = V_ARRAY(bufferGetImage);
BYTE* buffer2 = (BYTE *)psa->pvData;

/* Traitement */

SafeArrayDestroy(psa);    // ne pas oublier sinon gare au leak !

Cordialement,
Sébastien.