Oppure

Loading
13/10/15 18:32
cosimo patrucci
Salve a tutti. Sto lavorando con la libreria di vlc per la riproduzione di video (ad es. mov) in un contesto opengl.
Sono riuscito a riprodurre il video in opengl, ma non riesco a ricavare informazioni, quali larghezza/altezza, usando le funzioni della libreria di vlc.
In particolare ho usato funzioni quali:
libvlc_video_get_size,
libvlc_video_get_width,
libvlc_video_get_height
ma senza risultati coerenti.
Vi posto un esempio (C++) che usa libvlc_video_get_width e libvlc_video_get_height:

#include <stdio.h>
#include <stdint.h>
#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <assert.h>
#include "vlc/vlc.h"

#ifdef linux
    #include <pthread.h>
    #define MUTEX pthread_mutex_t
#elif _WIN32
    #include <windows.h>
    #include <process.h>
    #define MUTEX HANDLE
#endif

#define WIDTH 640
#define HEIGHT 480

#define W 320
#define H 240 

int done=1;
GLuint _img=0;
libvlc_instance_t *libvlc;
libvlc_media_t *m;
libvlc_media_player_t *mp;

int MUTEX_INIT(MUTEX *mutex)
{
    #ifdef linux
        return pthread_mutex_init (mutex, NULL);;
    #elif _WIN32
        *mutex = CreateMutex(0, FALSE, 0);;
        return (*mutex==0);
    #endif
    return -1;
}

int MUTEX_LOCK(MUTEX *mutex)
{
	//if(mutex!=0)
	//{
    #ifdef linux
        return pthread_mutex_lock( mutex );
    #elif _WIN32
		if(WaitForSingleObject(*mutex,INFINITE)==WAIT_FAILED){return 1;}else{return 0;}
		//if(WaitForMultipleObjects(1,mutex,0,INFINITE)==WAIT_FAILED){return 1;}else{return 0;}
    #endif
	//}
    return -1;
}

int MUTEX_UNLOCK(MUTEX *mutex)
{
	//if(mutex!=0)
	//{
    #ifdef linux
        return pthread_mutex_unlock( mutex );
    #elif _WIN32
        return (ReleaseMutex(*mutex)==0);
    #endif
	//}
    return -1;
}

struct ctx
{
    char *pixeldata;
    MUTEX mutex;
}ctx;

void reshape(int w, int h)
{
    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(40,(GLfloat)w/(GLfloat)h,1,2000);
    glMatrixMode(GL_MODELVIEW);
}

static void *lock(void *data, void **p_pixels)
{
    struct ctx *ctx = (struct ctx*)data;
    //MUTEX_LOCK(&ctx->mutex);
    *p_pixels = ctx->pixeldata;
    return NULL;
}

static void unlock(void *data, void *id, void *const *p_pixels)
{
    struct ctx *ctx = (struct ctx*)data;
    unsigned int *pixels = (unsigned int*)*p_pixels;
    //MUTEX_UNLOCK(&ctx->mutex);
    assert(id == NULL);
}

static void display(void *data, void *id)
{ 
    struct ctx *ctx = (struct ctx*)data;
    assert(id == NULL);
    std::cout<<libvlc_video_get_width(mp)<<" "<<libvlc_video_get_height(mp)<<"\n";
} 

void draw(void)
{
	glClearColor(.5f,.5f,.5f,1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity(); 
	gluLookAt(0,-50,0, 0,0,0, 0,0,1);
	glPushMatrix();
	glRotatef((GLfloat)30,0,0,1);
	glColor3f(1,1,1);
	glBindTexture(GL_TEXTURE_2D,_img);glEnable(GL_TEXTURE_2D);
	//MUTEX_LOCK(&ctx.mutex);
	glBindTexture(GL_TEXTURE_2D,_img);gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,160,120,GL_BGR_EXT,GL_UNSIGNED_BYTE,ctx.pixeldata);
	//MUTEX_UNLOCK(&ctx.mutex);
	glBegin(GL_QUADS);
	glTexCoord2i(0,1);glVertex3f(-10,0,-10);glTexCoord2i(1,1);glVertex3i(10,0,-10);glTexCoord2i(1,0);glVertex3i(10,0,10);glTexCoord2i(0,0);glVertex3f(-10,0,10);
	glEnd();
	glPopMatrix();
	glutSwapBuffers();glutPostRedisplay();
}

void key(unsigned char key, int x, int y)
{
	switch(key)
	{
		case 'q':
			done=0;
			libvlc_media_player_stop(mp);
			libvlc_media_player_release(mp);
			libvlc_release(libvlc);
		break;
		default:
		break;
	}
}

int main(int argc, char *argv[]) 
{
    char *filename="prova.mov";
    char const *vlc_argv[] = {};
    int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(100,100);
    glutCreateWindow("ch");
    glutDisplayFunc(draw);
    glutReshapeFunc(reshape);
    glutKeyboardFunc(key);
    _img++;glGenTextures(1,&_img);
    MUTEX_INIT(&ctx.mutex);
    ctx.pixeldata=(char*)malloc(sizeof(char)*(160*120*3));
    libvlc = libvlc_new(vlc_argc,vlc_argv);
    if(NULL == libvlc) {printf("LibVLC initialization failure.\n");return EXIT_FAILURE;}
    m = libvlc_media_new_path(libvlc,filename);
    mp = libvlc_media_player_new_from_media(m);
    libvlc_media_release(m);
    libvlc_video_set_callbacks(mp, lock, unlock, display, &ctx.pixeldata);
    libvlc_video_set_format(mp, "RV24", 160, 120, 160*3);
    libvlc_media_player_play(mp);
    glutMainLoop(); 
    return 0;
}


bisogna linkare le seguenti librerie:
glut, GLU, GL, vlc

Grazie in anticipo.
aaa