#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;
}