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

C++ Discussion :

[VLC] sortie frame buffer


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut [VLC] sortie frame buffer


    J'ai vu que VLC proposait plusieurs sorties pour la lecture d'un fichier. L'une d'entre elle m'int�resse assez, c'est la sortie frame buffer.
    Je suis sous Linux, dans les options le frame buffer est /dev/fb0.

    Je me pose la question de savoir s'il est possible de r�cup�rer cette frame depuis un programme �crit en C++ pour pouvoir la manipuler ? Si oui, quelles fonctions sont n�cessaires ?

    Merci bien

  2. #2
    screetch
    Invit�(e)
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    int f = open("/dev/fb0");
    read(f, data, size);


    man framebuffer donne kekchose ?

    voila un tuto rapidos

    http://209.85.135.104/search?q=cache...ient=firefox-a

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    Excellent merci !

    Je n'avais pas trouv� de tuto jusqu'� pr�sent pour pouvoir r�cup�rer les frames dans ce buffer.

    Tu as r�pondu efficacement et tr�s rapidement � ma question, merci beaucoup !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    Re salut,

    Bon je viens de m'attaquer au probl�me, et malheureusement le cache pour le lien sur le tuto de VLC est mort.

    J'ai essay� avec tes m�thodes simples en faisant un open sur le frame buffer /dev/fb0.
    Mon soucis c'est que je ne sais absolument pas dans quel format sont les frames dans ce buffer.

    Voici le code que j'ai utilis� :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
     // recuperation de la frame (frameBuffer = fileDescriptor de "/dev/fb0")
     nbBytesReaden = read ( frameBuffer, tempBuffer, TAILLEFRAMEVIDEOYUV ) ;
     // placement de l'offset en début pour lire la nouvelle frame
     lseek( frameBuffer, 0, SEEK_SET ) ;
    Ici TAILLEFRAMEVIDEOYUV est le format d'une frame au format YUY2 soit YCbCr 4:2:2 ( 576 * 720 * 2 octets ). Je peux changer ce format, mais je ne sais absolument pas la taille d'une frame �crite dans le frame buffer par vlc. Et, encore moins pour le son !

    J'ai jou� sur une sortie SDI les frames lues (r�cup�r�es donc dans "tempBuffer") � l'aide d'un autre programme sur un moniteur, et l'�cran reste fig� avec des couleurs fluos ! Autant dire que je ne lis pas grand chose ...

    En entr�e je lis un fichier .ts (transport stream), avec VLC (sortie en mode "GNU/Linux console framebuffer video output" ). Lorsque je lis la vid�o, je parviens � la visualiser avec le lecteur (sur mon �cran pc, de mani�re classique).
    Sans doute que VLC �crit sur la sortie standard en plus du frameBuffer.

    Quelqu'un a-t-il une id�e ?
    Merci d'avance !

    Raph

  5. #5
    screetch
    Invit�(e)
    Par d�faut
    salut,

    voila une copie du tuto qui marchait bien :

    http://qt.developpez.com/doc/3.3/emb-framebuffer-howto/

    tu verras comment recuperer des infos sur l'ecran et mapper l'image en memoire. Ensuite il "suffit" de lire cette memoire!
    Derni�re modification par Deepin ; 01/09/2011 � 09h27.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    merci screetch,

    Je vais tester �a aujourd'hui et je te tiendrais au courant. En tout cas, ce tuto a l'air de r�pondre exactement � mes attentes !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    Bon,

    je n'ai toujours pas le r�sultat attendu. Mon �cran reste toujours fluo ...
    Mon noyau supporte correctement le frame buffer, J'ai ouvert le buffer /dev/fb0 et mapper en m�moire son contenu partiel. Ensuite j'ai r�cup�r� la frame � partir de cette m�moire pour l'envoyer dans un autre buffer (pour �tre trait� par un autre thread).

    Voici le code du thread charg� de r�cup�r� la frame envoy�e par VLC.

    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
     
     
    void* threadReaderFrameBuffer ( void* arg ) {
     
     
    	printf ( "[threadReaderFrameBuffer] se lance \n" ) ; 
    	threadReaderFrameBufferIsWorking = true ;
     
    	// ouverture du frame buffer
    	int frameBuffer = open ( "/dev/fb0", O_RDONLY ) ;
    	if ( frameBuffer == -1 ) {
    		perror ( "Erreur a l'ouverture du frameBuffer de VLC \n" ) ;
    		exit ( 1 ) ;
    	}
    	printf ( "Ouverture du frameBuffer de VLC avec succes \n" ) ;
     
    	// frame courante
    	unsigned char* currentFrame = NULL ;	
     
    	while ( ( currentFrame = ( unsigned char* ) mmap ( 0, TAILLEFRAMEVIDEOYUV, PROT_READ, MAP_SHARED, frameBuffer, 0) ) != ( void* ) -1 ) {
     
    		// on replace l'offset sur le debut du buffer
    		lseek( frameBuffer, 0, SEEK_SET ) ;
     
    		// si le buffer YUV est plein, on bloque le thread
    		if ( bufferYUV.size() == NBFRAMEBUFFERYUV ) {
    			threadReaderFrameBufferIsWorking = false ;
    			printf ( "[threadReaderFrameBuffer] se bloque \n" ) ; fflush ( stdout ) ;
    			pthread_cond_wait( &conditionYUV_cond, &conditionYUV_mutex ) ;
    		}
     
    		// on envoit la frame lue dans le buffer YUV
    		pthread_mutex_lock ( &conditionYUV_mutex ) ;
    		bufferYUV.push ( currentFrame ) ;
    		pthread_mutex_unlock ( &conditionYUV_mutex ) ;
     
    		// si le  buffer YUV etait vide, on reveille le thread AJA
    		if ( bufferYUV.size () == 1 ) {
    			AJAThreadIsWorking = true ;
    			printf ( "[AJA] se reveille \n" ) ; fflush ( stdout ) ;
    			pthread_cond_broadcast( &conditionYUV_cond ) ;
    		}
    	} // fin boucle de lecture
     
    	// on a fini de lire toutes les donnees depuis le buffer
    	threadReaderFrameBufferIsWorking = false ;
    	threadReaderFrameBufferEnd = true ;
    	printf ( "[threadReaderFrameBuffer] a termine \n" ) ;
     
    }
    Voil�, vos avis sont les bienvenus.
    Je ne sais pas si on doit mapper en m�moire le frame buffer pour chaque frame, ( je d�couvre pour la premi�re fois cette fonction mmap ).
    Je ne sais pas non plus le format des frames �crites dans /dev/fb0 par VLC, si quelqu'un le connait ce pourrait �tre un d�tail int�ressant.

    Merci d'avance,
    Raph.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    petite pr�cision,

    lorsque je joue sur la sortie frame buffer de VLC, le lecteur semble fig�. Cette fois ci il ne sort pas sur la sortie standard la vid�o que je lis.
    Pour le quitter je suis oblig� de le "forcer � quitter" (ou en le killant).

  9. #9
    screetch
    Invit�(e)
    Par d�faut
    En fait mmap est une fonction magique qui va "mapper" (d'ou le nom) le framebuffer dans ta memoire.

    Une fois que tu as mapp� le fichier en m�moire,

    void* frame = mmap(framebuffer, SIZEOFFRAMEUFFER, 0); ... je sais plus trp la syntaxe

    dans frame tu auras toujours la frame. Le fichier est maintenant "en memoire", si tu ecris dedans ca ecrira dans l'ecran et si tu lis ca lis l'ecran. Donc tu n'as plus besoin de reouvrir le fichier (mais ne le ferme pas par contre ! ) ni de remapper le fichier ni de rembobiner le fichier.

    Ce que je te conseille :
    - ouvre le fichier
    - mappe le en memoire
    - le mapping devient exactement l'ecran, quand quelque chose sera ecrit dedans cela sera reflete en memoire, et si tu ecris quelque chose dedans cela va l'afficher a l'ecran



    ensuite ne remappe plus le fichier, jamais! il va te suffir de lire la memoire pour obtenir la reame et d'ecrire en memoire pour afficher.

    Je ne sais pas si je suis tres clair ^^

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    merci screetch,

    je m'�tais rendu compte de ces points derni�rement en faisant des tests.
    Par contre, comme tu le dis le frame buffer /dev/fb0 contient ce qui a � l'�cran ... je pensais que lorsqu'on sp�cifiait � VLC cette sortie il �crivait dedans, et donc que le contenu de ce buffer serait la vid�o lue (y compris avec le son).

    Enfin, je vais faire une lecture plein �cran et lire � partir de cette m�moire mapp�e et je vais voir ce que �a donne.

    merci bien !

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    Bon,

    j'ai fait plusieurs fonctions pour r�cup�rer l'image qui se trouve dans le buffer /dev/fb0 en supposant qu'il s'agisse de l'image de l'�cran.

    Je ne connais absolument aucunes informations sur la taille et le format de ces images, Cependant en faisant un cp /dev/fb0 (capture d'ecran � partir du buffer), j'ai r�cup�r� un fichier de taille 1,5 mo. Ce qui correspondrait pour moi � du 1024 * 768 au format YUY2, pour la capture d'�cran.
    Par contre, �a m'�tonne beaucoup car ma r�solution de l'�cran est 1280 * 1024 et que je pensais que le format des images affich�es sur un �cran LCD �tait du RGB...

    A partir de ce point, j'ai mapp� le buffer /dev/fb0 pour r�cup�rer l'image de l'�cran. J'ai ensuite fait quelques fonctions pour convertir cette image 1204 * 768 en 720 * 576 pour les envoyer a une carte d'acquisition vid�o et les jouer sur un moniteur.

    Mon soucis c'est que j'ai toujours un truc tr�s moche � l'�cran. Je m'attendais � voir mon �cran d'ordinateur sur le moniteur ...

    Voici le code du thread qui r�cup�re les images depuis le buffer et qui les traite

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    void* threadReaderFrameBuffer ( void* arg ) {
     
    	printf ( "[threadReaderFrameBuffer] se lance \n" ) ; 
    	threadReaderFrameBufferIsWorking = true ;
     
    	// ouverture du frame buffer
    	int frameBuffer = open ( "/dev/fb0", O_RDONLY ) ;
    	if ( frameBuffer == -1 ) {
    		perror ( "Erreur a l'ouverture du frameBuffer de VLC \n" ) ;
    		exit ( 1 ) ;
    	}
    	printf ( "Ouverture du frameBuffer de VLC avec succes \n" ) ;
     
    	// frame recuperee sur le frame buffer
    	unsigned char* frameVLC = ( unsigned char* ) mmap ( 0, 1024 * 768 * 2, PROT_READ, MAP_SHARED, frameBuffer, 0) ;
     
    	while ( frameVLC != ( void* ) -1 ) {
     
    		// allocation d'une frame video qu'on envoit dans le buffer YUV
    		unsigned char* currentFrame = ( unsigned char* ) malloc ( 1024 * 768 * 2 ) ;
    		// posix_memalign ( ( void** ) &currentFrame, 4096, 1024 * 768 * 2 ) ;
     
    		// recopie du contenu du frameBuffer VLC dans cette frame
    		memcpy ( ( void* ) currentFrame, ( void* ) frameVLC, 1024 * 768 * 2 ) ;
     
    		// currentFrame pointe sur l'image de la capture d'ecran en 1024 * 768 YUY2
     
    		// on l'a convertit en 1024 * 768 RGB 
    		currentFrame = YUY2toRGB ( 1024, 768, currentFrame ) ;
     
    		// on la filtre pour obtenir une image 720 * 576 RGB 
    		currentFrame = gaussianFilter ( currentFrame ) ;
     
    		// on convertit cette image filtree au format YUY2
    		// currentFrame = RGBtoYUY2 ( 720, 576, currentFrame ) ;
     
    		// currentFrame pointe sur une image allouee par posix_memalign en 720 * 576 YUY2 lisible par la carte AJA
     
    		// si le buffer YUV est plein, on bloque le thread
    		if ( bufferYUV.size() == NBFRAMEBUFFERYUV ) {
    			threadReaderFrameBufferIsWorking = false ;
    			printf ( "[threadReaderFrameBuffer] se bloque \n" ) ; fflush ( stdout ) ;
    			pthread_cond_wait( &conditionYUV_cond, &conditionYUV_mutex ) ;
    		}
     
    		// on envoit la frame lue dans le buffer YUV
    		pthread_mutex_lock ( &conditionYUV_mutex ) ;
    		printf ( "[threadReaderFrameBuffer] envoi d'une frame dans le buffer YUV ... " ) ; fflush ( stdout ) ;
    		bufferYUV.push ( currentFrame ) ;
    		printf ( "ok \n" ) ; fflush ( stdout ) ;
    		pthread_mutex_unlock ( &conditionYUV_mutex ) ;
     
    		// si le  buffer YUV etait vide, on reveille le thread AJA
    		if ( bufferYUV.size () == 1 ) {
    			AJAThreadIsWorking = true ;
    			printf ( "[AJA] se reveille \n" ) ; fflush ( stdout ) ;
    			pthread_cond_broadcast( &conditionYUV_cond ) ;
    		}
    	} // fin boucle de lecture
     
    	// on a fini de lire toutes les donnees depuis le buffer	
    	threadReaderFrameBufferIsWorking = false ;
    	threadReaderFrameBufferEnd = true ;
    	free ( frameVLC ) ;	
    	printf ( "[threadReaderFrameBuffer] a termine \n" ) ;
    	exit ( 1 ) ;
     
    }
    j'ai des fonctions qui permettent de changer d'espace colorim�trique entre RGB et YUY2. Sinon, gaussianFilter est une petite fonction permettant de passer d'une image RGB 1024 * 768 � la r�solution 720 * 576 en applicant un filtrage sur la majorit� des pixels.

    Quelqu'un a-t-il une aid� de ce qui pourrait clocher ?

    Merci d'avance !
    Raph.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    49
    D�tails du profil
    Informations personnelles :
    �ge : 39
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 49
    Par d�faut
    petit up, personne n'a une id�e ?

Discussions similaires

  1. Utilisation du frame buffer avec Nvidia
    Par HNT dans le forum Applications et environnements graphiques
    R�ponses: 2
    Dernier message: 05/07/2006, 12h47
  2. format frame buffer
    Par jeremieLuminy dans le forum OpenGL
    R�ponses: 9
    Dernier message: 22/04/2006, 09h50
  3. Frame Buffer
    Par nicolaskarp dans le forum Linux
    R�ponses: 3
    Dernier message: 20/03/2006, 04h11
  4. Frame buffer object
    Par Pen� dans le forum OpenGL
    R�ponses: 6
    Dernier message: 14/11/2005, 10h17
  5. Linear Frame Buffer
    Par Neo82 dans le forum Assembleur
    R�ponses: 10
    Dernier message: 01/03/2003, 21h11

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