/*************************************************************************************************************************************/ /* */ /* T E S T D E L A S O R T I E V I D E O S U R L A C A R T E " G A L I L E O " */ /* D E 'SYSTEME_SGIND?GA_IRIX' ( V E R S I O N 5.3 ) : */ /* */ /* */ /* Author of '$xtc/SGI_G.530.71$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */ /* */ /*************************************************************************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <gl/gl.h> #include <gl/addrs.h> #include <gl/cg2vme.h> #include <gl/get.h> #include <gl/image.h> #include <svideo.h> #include <vl/vl.h> #include <vl/dev_ev1.h> #define DIMX \ SV_PAL_XMAX #define DIMY \ SV_PAL_YMAX #define X0 \ 0 #define Y0 \ 0 #define XM \ (dimX - 1) #define YM \ (dimY - 1) #define ROUGE \ 3 #define VERTE \ 2 #define BLEUE \ 1 #define gIMAGE(x,y,n) \ (*(((pointeur_sur_l_image) + (4*(((y)*dimX) + (x))+n)))) \ /* Acces a un point de l'image. */ #define TABULATION \ " " #define parametre_1(noeud,parametre,valeur,type,Ntype,message) \ { \ int codeR; \ parametres.parametre = valeur; \ fprintf(stderr,"Controle %s : Parametre=%-20s Valeur vlSetControl=%d\n",message,Ntype,valeur); \ if ((codeR = vlSetControl(serveur_video,chemin,noeud,type,¶metres)) == 0) \ { \ } \ else \ { \ vlPerror(" vERREUR "); \ if (vlGetControl(serveur_video,chemin,noeud,type,¶metres) == 0) \ { \ fprintf(stderr,"%ssERREUR : Valeur vlGetControl=%d\n" \ ,TABULATION \ ,parametres.parametre \ ); \ } \ else \ { \ vlPerror(" gERREUR "); \ } \ } \ } \ /* Envoi d'un controle a un parametre. */ #define parametre_2(noeud,parametre1,parametre11,valeur1,parametre12,valeur2,type,Ntype,message) \ { \ int codeR; \ parametres.parametre1.parametre11 = valeur1; \ parametres.parametre1.parametre12 = valeur2; \ fprintf(stderr,"Controle %s : Parametre=%-20s Valeur vlSetControl={%d,%d}\n",message,Ntype,valeur1,valeur2); \ if ((codeR = vlSetControl(serveur_video,chemin,noeud,type,¶metres)) == 0) \ { \ } \ else \ { \ vlPerror(" vERREUR "); \ if (vlGetControl(serveur_video,chemin,noeud,type,¶metres) == 0) \ { \ fprintf(stderr,"%ssERREUR : Valeur vlGetControl={%d,%d}\n" \ ,TABULATION \ ,parametres.parametre1.parametre11 \ ,parametres.parametre1.parametre12 \ ); \ } \ else \ { \ vlPerror(" gERREUR "); \ } \ } \ } \ /* Envoi d'un controle a deux parametres. */ main() { VLServer serveur_video; int numero_de_device=-1; char *nom_de_device; VLDevList liste_des_devices; VLNode Nemetteur,Nrecepteur,Ndevice; int nombre_de_chemins=1; VLPath chemin; VLControlValue parametres; VLControlList *controles; int taille_de_l_image; int nombre_d_images=1; VLBuffer image; char *pointeur_sur_l_image; VLInfoPtr informations=0; int nombre_de_descripteurs=1; VLTransferDescriptor descripteur; int dimX=DIMX,dimY=DIMY; int X,Y; loop: /* Ah, l'horrible chose... */ serveur_video = vlOpenVideo(""); if (serveur_video != NULL) { vlRestoreSystemDefaults(serveur_video); if (vlGetDeviceList(serveur_video,&liste_des_devices) >= 0) { if ((numero_de_device < (int)liste_des_devices.numDevices) && (numero_de_device >= -1)) { Nemetteur = vlGetNode(serveur_video,VL_SRC,VL_MEM,VL_ANY); Nrecepteur = vlGetNode(serveur_video,VL_DRN,VL_VIDEO,VL_ANY); Ndevice = vlGetNode(serveur_video,VL_DEVICE,0,0); if (numero_de_device == -1) { if ((chemin = vlCreatePath(serveur_video ,VL_ANY ,Nemetteur ,Nrecepteur ) ) < 0) { fprintf(stderr,"\n le chemin emetteur-->recepteur n'a pu etre etabli (1)...\n"); } else { } } else { if ((chemin = vlCreatePath(serveur_video ,numero_de_device ,Nemetteur ,Nrecepteur ) ) < 0) { fprintf(stderr,"\n le chemin emetteur-->recepteur n'a pu etre etabli (2)...\n"); } else { } } vlAddNode(serveur_video,chemin,Nemetteur); vlAddNode(serveur_video,chemin,Nrecepteur); vlAddNode(serveur_video,chemin,Ndevice); numero_de_device = vlGetDevice(serveur_video,chemin); nom_de_device = liste_des_devices.devices[numero_de_device].name; if (vlSetupPaths(serveur_video ,(VLPathList)&chemin,nombre_de_chemins ,VL_SHARE ,VL_READ_ONLY ) /* ATTENTION : 'VL_SHARE' pour pouvoir refaire un 'vlSetupPaths(...)' alors que 'VL_LOCK' */ /* provoquerait apres : */ /* */ /* VL connection to :0.0 broken (explicit kill or server shutdown). */ /* */ /* et 'VL_READ_ONLY' afin d'eviter : */ /* */ /* Bad access to the library */ /* */ /* lors du 'VL_SYNC' qui suit... */ /* */ >= 0 ) { vlSelectEvents(serveur_video,chemin,VLSyncLostMask|VLTransferFailedMask); /* Selection d'aucun evenement... */ parametre_1(Ndevice,intVal,VL_TIMING_625_SQ_PIX,VL_TIMING,"VL_TIMING",""); parametre_1(Ndevice,intVal,1,VL_SYNC_SOURCE,"VL_SYNC_SOURCE",""); parametre_1(Ndevice,intVal,VL_SYNC_GENLOCK,VL_SYNC,"VL_SYNC",""); } else { fprintf(stderr,"\n le chemin emetteur-->recepteur n'a pu etre etabli (3)...\n"); } if (vlSetupPaths(serveur_video ,(VLPathList)&chemin,nombre_de_chemins ,VL_LOCK ,VL_LOCK ) >= 0 ) { parametre_1(VL_ANY,intVal,VL_FORMAT_RGB,VL_FORMAT,"VL_FORMAT",""); /* Programmation du timing... */ parametre_1(Nrecepteur,boolVal,FALSE,VL_EV1_YG_SYNC,"VL_EV1_YG_SYNC",""); vlGetControl(serveur_video,chemin,Nrecepteur,VL_EV1_DELAY_SYNC,¶metres); parametre_2(Nrecepteur ,fractVal ,numerator,58 ,denominator,parametres.fractVal.denominator ,VL_EV1_DELAY_SYNC,"VL_EV1_DELAY_SYNC","" ); parametre_1(Nrecepteur,intVal,0,VL_EV1_BLANK_LINE,"VL_EV1_BLANK_LINE",""); vlGetControl(serveur_video,chemin,Nrecepteur,VL_EV1_V_OFFSET,¶metres); parametre_2(Nrecepteur ,fractVal ,numerator,0 ,denominator,parametres.fractVal.denominator ,VL_EV1_V_OFFSET,"VL_EV1_V_OFFSET","" ); vlGetControl(serveur_video,chemin,Nrecepteur,VL_EV1_H_OFFSET,¶metres); parametre_2(Nrecepteur ,fractVal ,numerator,772-42 ,denominator,parametres.fractVal.denominator ,VL_EV1_H_OFFSET,"VL_EV1_H_OFFSET","" ); vlGetControl(serveur_video,chemin,Nrecepteur,VL_EV1_H_PHASE,¶metres); parametre_2(Nrecepteur ,fractVal ,numerator,46 ,denominator,parametres.fractVal.denominator ,VL_EV1_H_PHASE,"VL_EV1_H_PHASE","" ); /* Programmation du timing... */ parametre_1(VL_ANY,intVal,VL_PACKING_RGB_8,VL_PACKING,"VL_PACKING",""); /* Mise en place du mode 'RVB' des points de l'image. */ /* */ /* ATTENTION : */ /* */ /* 1-'VL_PACKING_YVYU_422_8' marche, */ /* 2-'VL_PACKING_RGB_8' ne fonctionne pas (l'image n'apparait qu'apres */ /* le 'vlEndTransfer(...)'). */ /* */ /* La solution se situe au niveau du nombre de frames dans 'vlCreateBuffer(...)' ou le */ /* nombre de buffer demande a du etre multiplie par 2. Mais en fait, Ceci a ete corrige */ /* par 'Patch_SG0000294'... */ parametre_2(Nemetteur,xyVal,x,dimX,y,dimY,VL_SIZE,"VL_SIZE",""); /* Mise en place de la taille des images, */ vlGetControl(serveur_video,chemin,Nemetteur,VL_SIZE,¶metres); if ((parametres.xyVal.x != dimX) || (parametres.xyVal.y != dimY)) { fprintf(stderr,"\n la taille demandee (%d,%d) n'est pas supportee (1) --> (%d,%d)" ,dimX,dimY ,parametres.xyVal.x,parametres.xyVal.y ); vlDestroyPath(serveur_video,chemin); vlCloseVideo(serveur_video); goto loop; /* Ah, l'horrible chose... */ } else { } vlGetControl(serveur_video,chemin,Nrecepteur,VL_SIZE,¶metres); if ((parametres.xyVal.x != dimX) || (parametres.xyVal.y != dimY)) { fprintf(stderr,"\n la taille demandee (%d,%d) n'est pas supportee (2) --> (%d,%d)" ,dimX,dimY ,parametres.xyVal.x,parametres.xyVal.y ); vlDestroyPath(serveur_video,chemin); vlCloseVideo(serveur_video); goto loop; /* Ah, l'horrible chose... */ } else { } /* Et verification de compatibilite... */ taille_de_l_image = vlGetTransferSize(serveur_video,chemin); /* Transfert de la taille de l'image... */ image = vlCreateBuffer(serveur_video,chemin,Nemetteur,nombre_d_images+0); /* Creation des buffers necessaires... */ if (image != NULL) { vlRegisterBuffer(serveur_video,chemin,Nemetteur,image); do { informations = vlGetNextFree(serveur_video,image,taille_de_l_image); } while ((informations==0) || (vlBufferDone(image)<0)); /* ATTENTION, d'apres '/usr/people/4Dgifts/examples/dmedia/video/vl/simplem2v$c', il */ /* faudrait mettre : */ /* */ /* while ((!informations) && (!vlBufferDone(image))); */ /* */ /* mais, le 'man' dit autre chose... */ pointeur_sur_l_image = vlGetActiveRegion(serveur_video,image,informations); if (pointeur_sur_l_image != NULL) { for (Y=Y0 ; Y<=YM ; Y++) { for (X=X0 ; X<=XM ; X++) { gIMAGE(X,Y,ROUGE)=X; gIMAGE(X,Y,VERTE)=Y; gIMAGE(X,Y,BLEUE)=X+Y; } } vlPutValid(serveur_video,image); descripteur.mode = VL_TRANSFER_MODE_DISCRETE; descripteur.count = nombre_d_images; descripteur.delay = 0; descripteur.trigger = VLTriggerImmediate; if (vlBeginTransfer(serveur_video ,chemin ,nombre_de_descripteurs ,&descripteur ) != 0) { fprintf(stderr,"\n probleme de transfert...\n"); } else { } sleep(1); vlPutFree(serveur_video,image); vlEndTransfer(serveur_video,chemin); { int events,Kevents; sleep(1); events=vlPending(serveur_video); for (Kevents=1 ; Kevents<=events ; Kevents++) { VLEvent evenement; vlNextEvent(serveur_video,&evenement); printf("\n evenement=%d",evenement.reason); } } } else { fprintf(stderr,"\n impossible d'atteindre le buffer d'image...\n"); } vlDeregisterBuffer(serveur_video,chemin,Nemetteur,image); } else { fprintf(stderr,"\n les buffers necessaires n'ont pu etre alloues...\n"); } vlDestroyBuffer(serveur_video,image); vlDestroyPath(serveur_video,chemin); } else { fprintf(stderr,"\n le chemin emetteur-->recepteur n'a pu etre etabli (4)...\n"); } } else { fprintf(stderr,"\n le numero de device est incorrect...\n"); } } else { fprintf(stderr,"\n impossible d'obtenir la liste des devices...\n"); } vlCloseVideo(serveur_video); } else { fprintf(stderr,"\n impossible d'ouvrir la video...\n"); } }