begin process at 2010 03 20 18:01:50
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Multimédia

 > 

Erreur impossible à résoudre...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Erreur impossible à résoudre...

mardi 4 décembre 2007 à 19:16:04 | Erreur impossible à résoudre...

Crepuscule3

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
mardi 4 décembre 2007 à 22:39:18 | Re : Erreur impossible à résoudre...

yann_lo_san


Il faut utiliser le membre :

vDataType.pparray

qui correspond à :
SAFEARRAY  FAR* FAR* pparray;

et non à :
SAFEARRAY FAR* parray;
mardi 4 décembre 2007 à 22:46:37 | Re : Erreur impossible à résoudre...

yann_lo_san

Non pardon, je confond avec :

SAFEARRAY* psa;
BSTR HUGEP *pbstr;
SafeArrayAccessData(psa, (void HUGEP**)&pbstr);

jeudi 6 décembre 2007 à 11:47:53 | Re : Erreur impossible à résoudre...

rt15

Membre Club Administrateur CodeS-SourceS
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");








3ème année en ecole d'ingé d'info cherche stage de 4 mois à partir du 01/04/08
mercredi 6 août 2008 à 11:35:16 | Re : Erreur impossible à résoudre...

SebLinck

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

/* Traitement */

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

Cordialement,
Sébastien.


Cette discussion est classée dans : buffer, vidéo, tampon, vt, longueurtampon


Répondre à ce message

Sujets en rapport avec ce message

récupérer une image depuis un buffer... [ par Crepuscule3 ] Bonjour à tous,   je suis sur un projet de traitement vidéo. J'utilise une camera IP capturant un flux MJPEG en résolution 640x480. A partir du progra Commande >>> Buffer [ par Stormy ] Salut à tous,Je cherche une solution afin de charger dans un Tampon une suite de commande ASM ou l'ensemble d'un code appartenant à une fonction C (co regler la taille d'une chaine de caractere en fontion d'une int [ par shadow1779 ] Bonjour, je cherche a faire un ptit systeme pour mettre un gros fichiers en partie, pour cela j'utilise une chaine de caractere qui me sert de tampon aide please [ par qsdfgh ] bojour; je voudrais fire un prog qui: -lit un mot de passe dans un fichier -lit une entrée utilisateur -compare l'entree avec le passe du ficheir voi probleme dans l'ouverture de fichier et mise en tampon [ par shadow1779 ] Bonsoir, je commence a maitriser l'API Windows et je me suis mis dans l'idée de me faire un petit bloc notes avec plusieurs petites fonctions mais je buffer [ par tricots ] bonjour,comment lire le contenu d'un buffer et le stocke dans un fichier ou dans un tableau?merci  tricots Jeu vidéo besoin d'aide! [ par ATAKAN ] Bonjour tout le monde! Y aurait-il quelqu'un de très fort ou de très gentil (les deux c'est possible!) qui pourrait m'expliquer comment en language [API]envoyer l'heure dans ma fenetre [ par shadow1779 ] Bonjour, on m'a donné la fonction afin d'avoir l'heure systeme, je la met dans un tampon et j'aimerai pouvoir l'afficher dans la fenetre du bloc note [API] [ par shadow1779 ] j'ai un petit probleme sur la fonction pour imprimer du texte, celui ci est bien imprimé mais le dernier caractere ne l'est pas et si il y a la touche utilisation du buffer [ par tricots ] Bonjour,je voudrais savoir comment fait on pour ecrire des donnees dans un buffer?Les donnees sont stokees dans un tableau et elles doivent etre lu pa


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales