Bennu Game Development

Foros en Español => Extensiones => Topic started by: josebita on February 03, 2010, 07:40:39 PM

Title: Módulo de vídeo basado en VLC
Post by: josebita on February 03, 2010, 07:40:39 PM
¿Hay alguna forma de convertir esto (http://wiki.videolan.org/LibVLC_SampleCode_SDL) en una librería de vídeo para Bennu?
He intentado cambiar el código (de forma muy cerda y rápida, sólo estaba mirando si funcionaba o no) con el siguiente código:[code language="c"]/* libSDL and libVLC sample code
* Copyright © 2008 Sam Hocevar <sam@zoy.org>
* license: [http://en.wikipedia.org/wiki/WTFPL WTFPL] */

#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <stdlib.h>

#include <SDL.h>
#include <SDL_mutex.h>
#include <vlc/vlc.h>

/* BennuGD stuff */
#include <bgddl.h>
#include <xstrings.h>
#include <libgrbase.h>
#include <g_video.h>

#define WIDTH 640
#define HEIGHT 480

#define VIDEOWIDTH 320
#define VIDEOHEIGHT 240

struct ctx
{
    SDL_Surface *surf;
    SDL_mutex *mutex;
};

static char clock[64], cunlock[64], cdata[64];
static char width[32], height[32], pitch[32];
static int w=0,h=0;
static libvlc_exception_t ex;
static libvlc_instance_t *libvlc;
static libvlc_media_t *m;
static libvlc_media_player_t *mp;
static struct ctx video;
static char const *vlc_argv[] =
{
    "-q",
//    "-vvvvv",
    "--ignore-config", /* Don't use VLC's config files */
    "--vout", "vmem",
    "--vmem-width", width,
    "--vmem-height", height,
    "--vmem-pitch", pitch,
    "--vmem-chroma", "RV16",
    "--vmem-lock", clock,
    "--vmem-unlock", cunlock,
    "--vmem-data", cdata,
};
static int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);

static void catch (libvlc_exception_t *ex)
{
    if(libvlc_exception_raised(ex))
    {
        fprintf(stderr, "Exception: %s\n", libvlc_exception_get_message(ex));
        exit(1);
    }

    libvlc_exception_clear(ex);
}

#ifdef VLC09X
static void * lock(struct ctx *ctx)
{
    SDL_LockMutex(ctx->mutex);
    SDL_LockSurface(ctx->surf);
    return ctx->surf->pixels;
}
#else
static void lock(struct ctx *ctx, void **pp_ret)
{
    printf("Called lock\n");
   
    SDL_LockMutex(ctx->mutex);
    SDL_LockSurface(ctx->surf);
    *pp_ret = ctx->surf->pixels;
    printf("Done lock\n");
}
#endif

static void unlock(struct ctx *ctx)
{
    printf ("Called unlock\n");
    /* VLC just rendered the video, but we can also render stuff */
    SDL_UnlockSurface(ctx->surf);
    SDL_UnlockMutex(ctx->mutex);
}

/* Init VLC stuff */
static void vlc_init()
{
    printf("Initializing\n");
    fflush(stdout);

   if(! scr_initialized) gr_init(320, 240);

    /* Create the 16bpp surface that will hold the video */
    video.surf = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 16,
            (((Uint32)0xff) >> 3) << 11, (((Uint32)0xff) >> 2) << 5 ,
            ((Uint32)0xff) >> 3, 0);

    sprintf(clock, "%lld", (long long int)(intptr_t)lock);
    sprintf(cunlock, "%lld", (long long int)(intptr_t)unlock);
    sprintf(cdata, "%lld", (long long int)(intptr_t)&video);
    sprintf(width, "%i", VIDEOWIDTH);
    sprintf(height, "%i", VIDEOHEIGHT);
    sprintf(pitch, "%i", VIDEOWIDTH * 2);
   
    printf("Done initializing\n");
    fflush(stdout);
}

/* Stop the VLC lib */
static void vlc_finalize()
{
    /*
     * Stop stream and clean up libVLC
     */
    libvlc_media_player_stop(mp, &ex);
    catch(&ex);

    libvlc_media_player_release(mp);
    libvlc_release(libvlc);

    /*
     * Close window and clean up libSDL
     */
    SDL_DestroyMutex(video.mutex);
    SDL_FreeSurface(video.surf);
}

static int play_video(INSTANCE *my, int * params)
{
    /* The name of the file to play */
    GRAPH *gr = NULL;

    libvlc_exception_init(&ex);
    libvlc = libvlc_new(vlc_argc, vlc_argv, &ex);
    catch(&ex);
    m = libvlc_media_new(libvlc, string_get(params[0]), &ex);
    catch(&ex);
    mp = libvlc_media_player_new_from_media(m, &ex);
    catch(&ex);
    libvlc_media_release(m);
    libvlc_media_player_play(mp, &ex);
    catch(&ex);
    fflush(stdout);
   
    string_discard(params[0]);

    // Create the graphic that will hold the video surface data
    gr = bitmap_new_ex(0, video.surf->w, video.surf->h,
        video.surf->format->BitsPerPixel, video.surf->pixels,
        video.surf->pitch);
    gr->code = bitmap_next_code();
    grlib_add_map(0, gr);
    return gr->code;
}

DLSYSFUNCS __bgdexport( mod_vlc, functions_exports )[] =
{
   {"PLAY_VIDEO", "S"  , TYPE_DWORD , play_video      },
   { NULL        , NULL , 0         , NULL            }
};

char * __bgdexport( mod_vlc, modules_dependency )[] =
{
   "libgrbase",
   "libvideo",
   NULL
};

void __bgdexport( mod_vlc, module_initialize )()
{
    vlc_init();
}

void __bgdexport( mod_vlc, module_finalize )()
{
    vlc_finalize();
}[/code]

Pero me salta siempre con un segfault. ¿Alguna idea de por qué puede ser?. ¿Alguien con más pericia que yo puede echarlo a andar?.

He conseguido que reproduzca el sonido si pongo los punteros a las funciones clock y cunlock como NULL, pero eso no tiene gracia, claro, porque no hay video.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on February 03, 2010, 07:58:59 PM
pone "fflush(stdout);" tras cada printf
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 03, 2010, 08:44:18 PM
En realidad el segmentation fault lo da antes de llamar por primera vez a unlock, el código de inicialización parece funcionar bien.
El código de ejemplo es el siguiente:[code language="bennu"]import "mod_key"
import "mod_vlc"
import "mod_video"
import "mod_mouse"
import "mod_say"

Process main()
Begin
    set_mode(640, 480, 16);
    mouse.graph = play_video("big_buck_bunny_480p_stereo.ogg");
    while(! key(_esc))
        say("Looping!");
        FRAME;
    end;
End;[/code]Y por la consola sale:Initializing
Done initializing
Looping!
[...]
Looping!
TagLib: Vorbis::File::read() - Could not find the Vorbis comment header.
Looping!
[...]
Looping!
Called lock
Done lock
Fallo de segmentación

Se me ocurre que puede ser un problema de bloqueos (VLC es multihilo) o que símplemente estoy haciendo una chapuza con algo que no entiendo del todo.

PD: He actualizado el código del principio para cambiar los printfs de sitio a donde da error.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 03, 2010, 08:46:12 PM
Por cierto, la versión de la función de lock que se usa es la segunda. Vamos, que VLC09X NO está definida.

Es más curiosidad que otra cosa, en realidad no estoy pensando usarla -de momento- para nada en particular. Me he cruzado con la página y he pensado si sería capaz de echarlo a andar en Bennu fácilmente... Parece que no :(
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on February 03, 2010, 09:37:20 PM
no, no se cae en el lock... da "Done lock" o sea, que salio de la funcion...

creo que el bug lo debes tener en las direcciones de memoria que le pasas...

probaste lanzar uno sin todo eso de la memoria?
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on February 03, 2010, 09:38:26 PM
por otro lado


libvlc_instance_t* libvlc_new     (     int      ,
      const char *const *     ,
      libvlc_exception_t *        
   )          

Create and initialize a libvlc instance.

Parameters:
      argc    the number of arguments
      argv    command-line-type arguments. argv[0] must be the path of the calling program.
      p_e    an initialized exception pointer

Returns:
   the libvlc instance

Todo:
   Look for interface settings. If we don't have any, add -I dummy

References i, libvlc_instance_t::instance_lock, libvlc_deinit_threads(), libvlc_init_threads(), libvlc_InternalCreate(), libvlc_InternalDestroy(), libvlc_InternalInit(), libvlc_instance_t::libvlc_vlm, libvlc_instance_t::p_callback_list, libvlc_vlm_t::p_event_manager, libvlc_instance_t::p_libvlc_int, libvlc_vlm_t::p_vlm, libvlc_vlm_t::pf_release, RAISENULL, libvlc_instance_t::ref_count, libvlc_instance_t::verbosity, VLC_EEXITSUCCESS, and vlc_mutex_init().

Referenced by mediacontrol_new().
Title: Re: Módulo de vídeo basado en VLC
Post by: Windgate on February 03, 2010, 10:40:59 PM
Quotepone "fflush(stdout);" tras cada printf

Anda que no sufrí yo con unas prácticas de C hasta que descubrí eso, porque el profesor no dijo nada :S

Era printf sobre fichero, pero vamos... Recuerdo noches sin dormir para presentar la cosa funcionando y a tiempo.

Perdón por el offtopic, habéis escrito muchísimo, lo miraré con más tiempo.
Title: Re: Módulo de vídeo basado en VLC
Post by: osk on February 03, 2010, 11:05:46 PM
Ostras, qué bueno sería poderlo hacer funcionar!!
Por fin una librería de video completa para Bennu!!
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 03, 2010, 11:20:58 PM
Puede que la dirección que le paso esté mal, es lo que me estaba temiendo (¿o quizás la dirección cambia cada vez que se llama a alguna función de la lib y por eso falla?. ¿Podría ser que -si ese es el problema- eso se arreglara con alguna opción de compilación?.).

Además libvlc usa esa función para obtener el puntero a los píxeles donde escribe, así que tengo que poder acceder a esos datos de alguna forma.

A ver si mañana busco un poco más y encuentro la forma de hacerlo más simple que como lo hago ahora, gracias por la ayuda.
Title: Re: Módulo de vídeo basado en VLC
Post by: DCelso on February 04, 2010, 12:37:57 AM
puedes usar mod_smpeg como base, no creo que haya mucha dificultad en adaptarlo
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 04, 2010, 01:26:53 AM
Soy un yonki. No me he podido aguantar hasta mañana. ¡Pero ya funciona!.
El problema era que estaba poniendo la altura y anchura de la SDL_Surface a 0 y se quejaba.
[code language="c"]/* libSDL and libVLC sample code
* Copyright © 2008 Sam Hocevar <sam@zoy.org>
* license: [http://en.wikipedia.org/wiki/WTFPL WTFPL] */

#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <stdlib.h>

#include <SDL.h>
#include <SDL_mutex.h>
#include <vlc/vlc.h>

/* BennuGD stuff */
#include <bgddl.h>
#include <xstrings.h>
#include <libgrbase.h>
#include <g_video.h>

#define WIDTH 640
#define HEIGHT 480

#define VIDEOWIDTH 320
#define VIDEOHEIGHT 240

struct ctx
{
   SDL_Surface *surf;
   SDL_mutex *mutex;
};

static char clock[64], cunlock[64], cdata[64];
static char width[32], height[32], pitch[32];
static libvlc_exception_t ex;
static libvlc_instance_t *libvlc;
static libvlc_media_t *m;
static libvlc_media_player_t *mp;
static struct ctx video;
static char const *vlc_argv[] =
{
   "-q",
//    "-vvvvv",
   "--ignore-config", /* Don't use VLC's config files */
   "--vout", "vmem",
   "--vmem-width", width,
   "--vmem-height", height,
   "--vmem-pitch", pitch,
   "--vmem-chroma", "RV16",
   "--vmem-lock", clock,
   "--vmem-unlock", cunlock,
   "--vmem-data", cdata,
};
static int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);

static void catch (libvlc_exception_t *ex)
{
   if(libvlc_exception_raised(ex))
   {
       fprintf(stderr, "Exception: %s\n", libvlc_exception_get_message(ex));
       exit(1);
   }

   libvlc_exception_clear(ex);
}

#ifdef VLC09X
static void * lock(struct ctx *ctx)
{
   SDL_LockMutex(ctx->mutex);
   SDL_LockSurface(ctx->surf);
   return ctx->surf->pixels;
}
#else
static void lock(struct ctx *ctx, void **pp_ret)
{
   SDL_LockMutex(ctx->mutex);
   SDL_LockSurface(ctx->surf);
   *pp_ret = ctx->surf->pixels;
}
#endif

static void unlock(struct ctx *ctx)
{
   /* VLC just rendered the video, but we can also render stuff */
   SDL_UnlockSurface(ctx->surf);
   SDL_UnlockMutex(ctx->mutex);
}

/* Init VLC stuff */
static void vlc_init()
{
   printf("Initializing\n");
   fflush(stdout);

   if(! scr_initialized) gr_init(320, 240);

   /* Create the 16bpp surface that will hold the video */
   video.surf = SDL_CreateRGBSurface(SDL_SWSURFACE, VIDEOWIDTH, VIDEOHEIGHT, 16,
           (((Uint32)0xff) >> 3) << 11, (((Uint32)0xff) >> 2) << 5 ,
           ((Uint32)0xff) >> 3, 0);
   video.mutex = SDL_CreateMutex();

   sprintf(clock, "%lld", (long long int)(intptr_t)lock);
   sprintf(cunlock, "%lld", (long long int)(intptr_t)unlock);
   sprintf(cdata, "%lld", (long long int)(intptr_t)&video);
   sprintf(width, "%i", VIDEOWIDTH);
   sprintf(height, "%i", VIDEOHEIGHT);
   sprintf(pitch, "%i", VIDEOWIDTH * 2);
   
   printf("Done initializing\n");
   fflush(stdout);
}

/* Stop the VLC lib */
static void vlc_finalize()
{
   /*
    * Stop stream and clean up libVLC
    */
   libvlc_media_player_stop(mp, &ex);
   catch(&ex);

   libvlc_media_player_release(mp);
   libvlc_release(libvlc);

   /*
    * Close window and clean up libSDL
    */
   SDL_DestroyMutex(video.mutex);
   SDL_FreeSurface(video.surf);
}

static int play_video(INSTANCE *my, int * params)
{
   /* The name of the file to play */
   GRAPH *gr = NULL;

   libvlc_exception_init(&ex);
   libvlc = libvlc_new(vlc_argc, vlc_argv, &ex);
   catch(&ex);
   m = libvlc_media_new(libvlc, string_get(params[0]), &ex);
   catch(&ex);
   mp = libvlc_media_player_new_from_media(m, &ex);
   catch(&ex);
   libvlc_media_release(m);
   libvlc_media_player_play(mp, &ex);
   catch(&ex);
   
   string_discard(params[0]);

   // Create the graphic that will hold the video surface data
   gr = bitmap_new_ex(0, video.surf->w, video.surf->h,
       video.surf->format->BitsPerPixel, video.surf->pixels,
       video.surf->pitch);
   gr->code = bitmap_next_code();
   grlib_add_map(0, gr);
   return gr->code;
}

DLSYSFUNCS __bgdexport( mod_vlc, functions_exports )[] =
{
   {"PLAY_VIDEO", "S"  , TYPE_DWORD , play_video      },
   { NULL        , NULL , 0         , NULL            }
};

char * __bgdexport( mod_vlc, modules_dependency )[] =
{
   "libgrbase",
   "libvideo",
   NULL
};

void __bgdexport( mod_vlc, module_initialize )()
{
   vlc_init();
}

void __bgdexport( mod_vlc, module_finalize )()
{
   vlc_finalize();
}[/code]El código de ejemplo que he usado es:[code language="bennu"]import "mod_key"
import "mod_vlc"
import "mod_video"
import "mod_mouse"
import "mod_say"
import "mod_map"

Process main()
Begin
   dump_type=complete_dump; restore_type=complete_restore;
   set_mode(640, 480, 16);
   mouse.graph = play_video("big_buck_bunny_480p_stereo.ogg");
   graph = mouse.graph;
   flags = B_HMIRROR;
   x = 320;
   y = 240;
   while(! key(_esc))
   // Uncomment to take screenshots
       //save_png(0, mouse.graph, "shot.png");
       angle += 50;
       FRAME;
   end;
End;[/code]Lo que más mola es que además de para vídeos vale para webcams, DVDs y en general cualquier cosa que VLC pueda reproducir...

Splinter, si te mola esto y quisieras convertirlo en un módulo oficial, yo más contento que unas pascuas. Si no, con tiempo lo intentaré limpiar y mejorar (pero seguro que tú eres capaz de hacerlo mucho mejor y dejarlo muy limpito).

¡Ah! ¡y el rendimiento parece bastante bueno!.

[Edito] He cambiado el código de ejemplo por uno un poquito más complejo que muestra que realmente funciona.
¡Screenshot!.
(http://forum.bennugd.org/index.php?action=dlattach;topic=1156.0;attach=844)
Title: Re: Módulo de vídeo basado en VLC
Post by: Prg on February 04, 2010, 01:43:26 AM
se ve increible, y mejor que funciona también en linux :)
funcionará en windows vd?
wow, como leí en otro post: atáquenlo con karmas  :D
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 04, 2010, 01:45:12 AM
Debe funcionar en todos los sitios en que funcione VLC, así que sí, funcionará en Windows.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on February 04, 2010, 01:56:09 AM
jo, jo... lo incluire... muchas gracias... voy a investigar que plataformas estan incluidas...

mañana le echo un ojo... gracias...


ahi fue un karma, obvio.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on February 04, 2010, 01:58:33 AM
tambien estaba el de dcelso si mal no recuerdo... voy a pegar revision y ver que necesitan modificar cada 1, y luego veo si incluyo a los 2...

gracias.
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on February 04, 2010, 02:47:33 AM
WOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOW
WOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOW

Video, video, video... ¡ya podemos hacer Final Fantasys profesionales! ;D
O como hace tiempo se me ocurrió, un "Megarace" (si lo buscais, reconoceréis en seguida al presentador calvorota, con que tengais unos pocos añitos :D).
Esto se presenta como una avalancha de karmas.

Emmmm, esto, una cosa ¿habría algún problema con licencias? mp3, wma, wmv...
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on February 04, 2010, 02:48:05 AM
PD: ¿Funcionaría en WIZ/GP2X? ansiaaaaa.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 04, 2010, 02:58:29 AM
El problema con mp3/h264/wmv... subsiste porque no es un problema técnico sino de dinero.
Aún así, el propio VLC permite codificar cualquier vídeo en casi cualquier formato al codec OGG Theora, que es libre. Es muy sencillo, aunque tarda un ratillo.

Supongo que la recomendación oficial seguirá siendo usar formatos libres (vorbis+theora). Yo al menos así os lo recomiendo; seguro que entonces no habrá problemas con nadie.
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on February 04, 2010, 03:21:40 AM
No, pero me refiero a que ¿no habría que quitarlo del código? no es sólo por los problemas legales que tengamos los usuarios finales, sino por los que genera que dicho código tenga soporte para ello sin haber pagado las debidas licencias ¿o eso ya va incluido en la licencia de distribución del código del VLC?

Obviamente nosotros seguiremos usando formatos libres.

Lo que no se yo es cómo se convierten videos/músicas con VLC. Siempre he usado el Super(c), que es un interfaz gráfico para usar MEncoder y ffmpeg.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 04, 2010, 03:29:42 AM
Para convertir y en VLC 1.x debes ir a Medio->Convertir/Salvar. Vale para audio y para video.

No tengo claro que haya que eliminarlo del código. En cualquier caso, deshabilitarlo es tan sencillo como establecer las opciones adecuadas al hacer el configure de ffmpeg (porque aunque sea VLC, allá por el fondo está ffmpeg haciendo la decodificación).
Si el sistema es quien te da la libvlc (caso de muchos linux) podemos depender de ella y que sea otro el que se preocupe.
Pero ya digo que aunque haya soporte en la librería, con no reproducir formatos propietarios creo que el problema desaparece.

Por ser formatos libres, a la hora de hacer juegos siempre podremos asumir que podemos reproducir theora+vorbis y por ello digo que es recomendable su uso.
Title: Re: Módulo de vídeo basado en VLC
Post by: osk on February 04, 2010, 11:53:20 AM
YEAAAAAHHH!!!!!!
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 04, 2010, 03:38:28 PM
Quote from: SplinterGU on February 04, 2010, 01:58:33 AM
tambien estaba el de dcelso si mal no recuerdo... voy a pegar revision y ver que necesitan modificar cada 1, y luego veo si incluyo a los 2...

gracias.
Muchas gracias a tí por hacerte cargo, entonces :)
Entre otras cosas, yo diría que es más que probable que no haya que meter a SDL por ningún lado (con pasar como puntero a los píxeles el sitio correcto dentro del GRAPH es suficiente). Y bueno, el código hay que limpiarlo mucho e implementar muchas cosas aún.
En resumen: que mi código está bastante sucio, así que si te puedo echar una mano en algo, avisa.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 04, 2010, 05:28:54 PM
Sólo por curiosidad he hecho unas pruebas de rendimiento tonto y va más o menos igual de bien que totem (el reproductor por defecto de gnome). Vamos, que pueden con las mismas pelis y se atascan con las mismas pelis HD.

La verdad es que mola :)
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on February 05, 2010, 02:23:21 AM
Quote from: josebita on February 04, 2010, 03:29:42 AM
Para convertir y en VLC 1.x debes ir a Medio->Convertir/Salvar. Vale para audio y para video.

Pero ya digo que aunque haya soporte en la librería, con no reproducir formatos propietarios creo que el problema desaparece.

Muchas gracias por la info.
Pero perdona que insista, porque creo que no me explico: la GP2X reproduce formatos libres, y no por ello han tenido que dejar de pagar el uso de MP3 ya que lo incluye. No se, dudo muchísimo que hayan problemas legales, tal y como pasó con Fenix (que mucho ruido y al final nada) pero no estaría de más informarse :P

Aun así, muchísimas gracias por esta librería, es una de las más esperadas. Cuando haga Venturer 2.0 seguro que la incluyo: poner un video de fondo en las aventuras tiene que ser genial (ya imagino un mapa tileado y por detrás un video de agua que se ve en las zonas que no hay suelo, y tenemos un genial mapa-puente sobre el agua).
Sólo faltaría probarla en las consolas portátiles, o si funciona en un PC a 500MHz, no debería haber problemas en WIZ.
Title: Re: Módulo de vídeo basado en VLC
Post by: kim-elet-o on February 05, 2010, 09:22:32 AM
Josebita eres el P**o amo, ahora gracias a ti tenemos la potencia de reproducir video, musica, stream, ect, equiparablemente al vlc (por algo es la libreria del vlc, no?  :D :D :D), no te mereces un Karma, te mereces uuufff no se 10..., bueno jejejeje te dare uno y mañana otro...., asi hasta el infinito y mas alla.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 05, 2010, 10:01:58 AM
Bueno, en realidad he escrito como diez líneas de código, el resto son del ejemplo, pero bueno XD
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on February 05, 2010, 03:04:54 PM
esta es la lista de libs dinamicas que tengo en mi entorno de desarrollo wiz...

libcharset.so
libexpat.so
libfaad.so
libFLAC.so
libFLAC++.so
libfreetype.so
libgif.so
libhistory.so
libiconv.so
libid3tag.so
libImlib2.so
libjpeg.so
libmad.so
libmikmod.so
libmpcdec.so
libmpeg2convert.so
libmpeg2.so
libogg.so
libpng12.so
libpng.so
libreadline.so
libSDL_gfx.so
libSDL_image.so
libSDL_inifile.so
libSDL_mixer.so
libSDL.so
libSDL_svg.so
libSDL_ttf.so
libtiff.so
libtiffxx.so
libungif.so
libunicodefont.so
libvorbisenc.so
libvorbisfile.so
libvorbisidec.so
libvorbis.so
libxml2.so
libz.so
preloadable_libiconv.so

de video veo libmpeg2, que tanto costaria armar un modulo con eso? deberiamos revisar el api...
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 05, 2010, 03:27:51 PM
La lista de prerrequistos para compilar VLC (junto con instrucciones, aunque aparecen como incompletas) para ARM están aquí:
http://www.videolan.org/developers/vlc.html
Title: Re: Módulo de vídeo basado en VLC
Post by: DCelso on February 05, 2010, 04:03:14 PM
mod_smpeg usa esa, si no recuerdo mal.
Para mí sería la solución para wiz, la lástima es que solo van los videos con el codec mpeg 1.
Lo suyo, suyo sería usar libtheora para crear un modulo mod_theora similar a mod_smpeg , (tal y como me comentó osk en el post de smpeg), yo lo intenté sin éxito una vez quizás podrías intentarlo tu SPLINTER.

http://svn.xiph.org/trunk/theora/examples/player_example.c

Las dependencias de theora son mínimas
# libogg-1.1.4
# libvorbis-1.2.3
# libSDL 1.2
todas soportadas por wiz, como vemos, solo se necesitaría compilar libtheora para wiz y adaptar el ejemplo anteriormente puesto a un módulo y ya tendríamos un magnífico coder de vídeo para wiz, pc y para cualquier plataforma que se nos ponga por delante :d.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on February 05, 2010, 04:21:04 PM
no se como se llevara con la sdl_mixer, ya que abre el audio directamente...
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on February 05, 2010, 04:24:09 PM
Esa es otra, claro...
En principio si la Wiz usa ALSA o algo así no debería haber problema, ¿no?.

Por cierto que la lista de dependencias (para VLC) se reduciría si sólo quisieramos integrar soporte para Theora+Vorbis, claro.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 16, 2010, 03:02:50 PM
He estado trabajando un poquito en esto. He limpiado un poco el código y le he dicho a la libVLC que use los subtítulos para los vídeos, si los encuentra. De momento sólo puede reproducir un vídeo cada vez.
No debería romperse en caso de que se le pida reproducir más (antes sí se rompía) pero se negará a reproducir.

House!
(http://forum.bennugd.org/index.php?action=dlattach;topic=1156.0;attach=994)

PD: Si saco un rato, la intentaré compilar para Windows.
Title: Re: Módulo de vídeo basado en VLC
Post by: FreeYourMind on March 16, 2010, 03:12:19 PM
Heeheh, parece que mis opiniones dan resultado, sólo hay que inventarme que voy hacer algo al respecto y os pongo automaticamente a trabajar como locos para sacarlo antes :)

El truquillo parece que ha vuelto a funcionar, con este ya van dos (DCElso ha picado antes  ;)).

Que malo soy con mis técnicas de poneros a currar para Bennu  ;D
Venga, karma up, sólo por hacer que vuelvas a tocarlo (y si dices que no ha sido por eso, me pongo a jugar al euromillones que seguro que me sale).
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 16, 2010, 03:16:58 PM
El código, por si alguien lo qiuere:
[code language="c"]/* libVLC module for BennuGD
* Heavily based on the libVLC+libSDL example by Sam Hocevar <sam@zoy.org>
* Copyright © 2010 Joseba García Etxebarria <joseba.gar@gmail.com>
*
*  This program is free software: you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation, either version 3 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/


#include <stdio.h>
#include <stdint.h>
#include <math.h>
#include <stdlib.h>

#include <SDL.h>
#include <SDL_mutex.h>
#include <vlc/vlc.h>

/* BennuGD stuff */
#include <bgddl.h>
#include <xstrings.h>
#include <libgrbase.h>
#include <g_video.h>

struct ctx
{
   SDL_Surface *surf;
   SDL_mutex *mutex;
};

static char clock[64], cunlock[64], cdata[64];
static char width[32], height[32], pitch[32];
static libvlc_exception_t ex;
static libvlc_instance_t *libvlc;
static libvlc_media_t *m;
static libvlc_media_player_t *mp=NULL;
static struct ctx video;
static int playing_video=0;
static char const *vlc_argv[] =
{
   "-q",
//    "-vvvvv",
   "--ignore-config", /* Don't use VLC's config files */
   "--no-video-title-show",
   "--sub-autodetect-file",
   "--vout", "vmem",
   "--plugin-path", "vlc" /* For win32 */
   "--vmem-width", width,
   "--vmem-height", height,
   "--vmem-pitch", pitch,
   "--vmem-chroma", "RV16",
   "--vmem-lock", clock,
   "--vmem-unlock", cunlock,
   "--vmem-data", cdata,
};
static int vlc_argc = sizeof(vlc_argv) / sizeof(*vlc_argv);

static void catch (libvlc_exception_t *ex)
{
   if(libvlc_exception_raised(ex))
   {
       fprintf(stderr, "Exception: %s\n", libvlc_exception_get_message(ex));
       exit(1);
   }

   libvlc_exception_clear(ex);
}

#ifdef VLC09X
static void * lock(struct ctx *ctx)
{
   SDL_LockMutex(ctx->mutex);
   SDL_LockSurface(ctx->surf);
   return ctx->surf->pixels;
}
#else
static void lock(struct ctx *ctx, void **pp_ret)
{
   SDL_LockMutex(ctx->mutex);
   SDL_LockSurface(ctx->surf);
   *pp_ret = ctx->surf->pixels;
}
#endif

static void unlock(struct ctx *ctx)
{
   /* VLC just rendered the video, but we can also render stuff */
   SDL_UnlockSurface(ctx->surf);
   SDL_UnlockMutex(ctx->mutex);
}

/*********************************************/
/* Plays the given video with libVLC         */
/* Must be given:                            */
/*    filename to be played                  */
/*    width  of the video to render          */
/*    height of the video to render          */
/*********************************************/
static int play_video(INSTANCE *my, int * params)
{
   /* Ensure we're not playing a video already */
   if(playing_video == 1)
       return -1;

   /* Start the graphics mode, if not initialized yet */
   if(! scr_initialized) gr_init(320, 240);

   /* Create the 16bpp surface that will hold the video          */
   /* We don't yet support 32bpp surfaces, but this'll work fine */
   /* in bennugd's 32bpp video mode.                             */
   video.surf = SDL_CreateRGBSurface(SDL_SWSURFACE, params[1],
           params[2], 16, (((Uint32)0xff) >> 3) << 11,
           (((Uint32)0xff) >> 2) << 5, ((Uint32)0xff) >> 3, 0);
   video.mutex = SDL_CreateMutex();

   sprintf(clock, "%lld", (long long int)(intptr_t)lock);
   sprintf(cunlock, "%lld", (long long int)(intptr_t)unlock);
   sprintf(cdata, "%lld", (long long int)(intptr_t)&video);
   sprintf(width, "%i", params[1]);
   sprintf(height, "%i", params[2]);
   sprintf(pitch, "%i", params[1] * 2);

   /* This could really be done earlier, but we need to know the      */
   /* video width/height before doing it and we'd have to use default */
   /* values for them.                                                */
   libvlc_exception_init(&ex);
   libvlc = libvlc_new(vlc_argc, vlc_argv, &ex);
   catch(&ex);

   /* The name of the file to play */
   GRAPH *gr = NULL;

   m = libvlc_media_new(libvlc, string_get(params[0]), &ex);
   catch(&ex);
   mp = libvlc_media_player_new_from_media(m, &ex);
   catch(&ex);
   libvlc_media_release(m);
   libvlc_media_player_play(mp, &ex);
   catch(&ex);

   /* Discard the file path, as we don't need it */
   string_discard(params[0]);

   // Create the graphic that will hold the video surface data
   gr = bitmap_new_ex(0, video.surf->w, video.surf->h,
       video.surf->format->BitsPerPixel, video.surf->pixels,
       video.surf->pitch);
   gr->code = bitmap_next_code();
   grlib_add_map(0, gr);

   /* Lock the video playback */
   playing_video = 1;
   
   return gr->code;
}

static int stop_video(INSTANCE *my, int * params)
{
   if(! playing_video)
       return 0;

   /* Stop the playback and release the media */
   if(mp) {
       libvlc_media_player_stop(mp, &ex);
       catch(&ex);
   
       libvlc_media_player_release(mp);
   }
   
   /* Clean up SDL */
   if(video.mutex) SDL_DestroyMutex(video.mutex);

   if(video.surf)  SDL_FreeSurface(video.surf);

   if(libvlc)      libvlc_release(libvlc);

   /* Release the video playback lock */
   playing_video = 0;        

   return 0;
}

DLSYSFUNCS __bgdexport( mod_vlc, functions_exports )[] =
{
   {"PLAY_VIDEO", "SII"  , TYPE_DWORD , play_video      },
   {"STOP_VIDEO", ""     , TYPE_DWORD , stop_video      },
   { NULL        , NULL , 0         , NULL              }
};

char * __bgdexport( mod_vlc, modules_dependency )[] =
{
   "libgrbase",
   "libvideo",
   NULL
};

void __bgdexport( mod_vlc, module_finalize )()
{
   stop_video(NULL, NULL);
}[/code]
[code language="bennu"]import "mod_key"
import "mod_vlc"
import "mod_video"
import "mod_mouse"
import "mod_say"
import "mod_map"
import "mod_file"
import "mod_proc"

#define SCR_WIDTH  640
#define SCR_HEIGHT 480

/* Player main window */
Process main()
Private
    string fname="";
Begin
    // Handle the command line
    if(argc != 2)
        say("Must be given file to play, quitting.");
        exit();
    end;

    // Try to find the file that the user wants us to play, or die
    fname = argv[1];
    if(! fexists(fname))
        say("Couldn't find "+fname+" to be played, quitting.");
        exit();
    end

    /* This is required to ensure Bennu redraws every frame */
    dump_type=complete_dump;
    restore_type=complete_restore;

    /* Start the graphics subsystem */
    set_mode(SCR_WIDTH, SCR_HEIGHT, 16);

    /* Finally play the video and place it in the middle of the screen */
    graph = play_video(fname, SCR_WIDTH, SCR_HEIGHT);
    x = SCR_WIDTH/2;
    y = SCR_HEIGHT/2;
    while(! key(_esc))
       // Uncomment to dump frames
        //save_png(0, graph, "shot.png");
        FRAME;
    end;

    stop_video();
End;[/code]


@FreeYourMind: Fue en parte por tus comentarios, sí. Pero tenía ganas de tocarlo de todas formas. Qudan muchas cosas por hacer (seeking, por ejemplo) pero lo básico está ahí.
Ahora, cuando me ponga otra vez con la fmodex, no te apunets el tanto :P
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 16, 2010, 03:20:59 PM
Parece ser que hoy no sé escribir. Me niego a arreglar todas las letras que he puesto en sitios que no son...
Title: Re: Módulo de vídeo basado en VLC
Post by: FreeYourMind on March 16, 2010, 03:34:33 PM
Heeheheh, lo sabia! Lo sabia!  ;D
Suerte con ello, yo ya estoy sobrao de proyectos, pero si necesitas que pruebe algo en Windows se puede echar una mano.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 16, 2010, 07:50:50 PM
Venga, he añadido un montón de funciones y he renombrado unas pocas. Perdón por ponerlo en inglés, pero así se queda ya de documentación del módulo.
[code language="bennu"]
/* Plays a video file with the given width/height
* Will play the video with subtitles, if found */
int video_play(string filename, int width, int height);

/* Stop a currently playing video.*/
int video_stop();

/* Pause/unpause the currently playing video*/
int video_pause();

/* Check if the video is currently playing */
int video_is_playing();

/* Get total length of the currentyl playing video, in centisecs */
int video_get_length();

/* Get current seeking position in the video, in centiseconds */
int video_get_time();

/* Seek through the video, must be given a time
* in centiseconds (what the bennu timer's use) */
int video_set_time(int time);

/* Get the width of the currently playing video */
int video_get_width();

/* Get the height of the currently playing video */
int video_get_height();

/* Get the muted/unmuted status */
int video_get_mute();

/* Mute/unmute the currently being played video */
int video_mute();

/* Get the volume of the currently playing video
* Will be 0<=volume<=200 */
int video_get_volume();

/* Set the volume of the currently playing video
* Must be 0<=volume<=200 */
int video_set_volume(int volume);

/* Get the number of available tracks in the video
* The first track (track number 0) is used for disabling audio */
int video_get_tracks();

/* Get the number of the currently being played track */
int video_get_track();

/* Set the audio track for a currently being played video */
int video_set_track(int track);

/* Get the description for an audio track.
* Not sure if it works correctly, must test it. */
string video_get_track_description();
[/code]

Os adjunto el código fuente con un programa de ejemplo (para Linux) que se llama desde la consola como;
bgdi main.dcb fichero_a_reproducir
Las teclas del programa son:

PD: Renombrad el adjunto a .tar.bz2, cosas del foro y los adjuntos.
Title: Re: Módulo de vídeo basado en VLC
Post by: l1nk3rn3l on March 16, 2010, 09:15:23 PM
PODRIAS pasarme la version con la que compilas y la direccion de
los binarios .. para compilar en win32..

es que la compilo en windows y me vota un error en la consola ..

me dice que los parametros :


   "--vout", "vmem",
   "--vmem-width", width,
   "--vmem-height", height,
   "--vmem-pitch", pitch,
   "--vmem-chroma", "RV16",
   "--vmem-lock", clock,
   "--vmem-unlock", cunlock,
   "--vmem-data", cdata,

no son soportados por esta version de VLC..

lo raro es que lo compilo con la version 1.0 como dice la nota

NOTE: this requires the "vmem" video output which was checked in on March 21st, 2008. Update Nov 28th, 2008 to work with vlc-1.0.0(git).

podrias pasarme las dlls y include de win32 de donde lo bajaste ..
no me funciona
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 16, 2010, 10:00:27 PM
Pues la verdad es que no lo he compilado en Windows.
En linux estoy usando la versión 1.0.5 de VLC que viene con Ubuntu y las cabeceras son tb. las que vienen con él (paquete vlc, libvlc-dev, libvlccore-dev y sus dependencias, que son unas cuantas).

Mañana por la mañana saco un rato y la compilo para Windows, ¿ok?.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 16, 2010, 10:09:48 PM
Se me ocurre una cosa: hay un parámetro de la lista llamado "--plugin-path" que tiene -en mi código- el valor "vlc".
Se trata de la ruta donde deben estar los plugins de vlc. Prueba a copiar todo el contenido del directorio del VLC (aunque no hagan falta todos lo ficheros, eso lo miramos luego) al directorio donde estés ejecutando el ejemplo. Renombra el directorio de plugins a "vlc" y mira a ver si entonces funciona.

Otra forma de intentarlo: Entiendo por lo que dices que has sido capaz de compilarlo para windows, ¿no?.
Si quieres, deja el fichero del módulo compilado para windows en el foro y te intento mirar hoy a ver si puedo con un ordenador muy viejo que tengo con windows.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 17, 2010, 10:55:17 AM
Quote from: josebita on March 16, 2010, 10:09:48 PM
Se me ocurre una cosa: hay un parámetro de la lista llamado "--plugin-path" que tiene -en mi código- el valor "vlc".
Se trata de la ruta donde deben estar los plugins de vlc. Prueba a copiar todo el contenido del directorio del VLC (aunque no hagan falta todos lo ficheros, eso lo miramos luego) al directorio donde estés ejecutando el ejemplo. Renombra el directorio de plugins a "vlc" y mira a ver si entonces funciona.

[...]

Efectivamente era eso.
Os pongo la librería compilada para Windows contra el Bennu RC11 con el código del reproductor de ejemplo. Las librerías del VLC que incluyen son las del VLC 1.0.5. Además, incluye el script de compilación modificado para compilar en mingw32 y el código fuente.
Un par de cosas importantes:
* No renombrar el directorio "vlc" porque si no, no podrá encontrar los módulos y no se reproducirán los vídeos. Habría que recompilar el módulo.

* Casi seguro que sobran módulos de la carpeta "vlc" podeis quitar los que no os hagan falta. He metido todos por si a alguien le hace falta soporte para ver su webcam o cosas así.
Si quitais módulos inútiles, se os queda en un tamaño decente.

* El tamaño a que se quiere renderizar el vídeo no es automático. Se fija cuando se le da a play_video. Una vez que el vídeo está en reproducción, ya se puede averiguar cuál es el tamaño real. Si quereis poner un vídeo con el aspect-ratio correcto, debeis reproducirlo (si quereis ponerle el mute, seguro que no hace daño), averiguar sus dimensiones con video_get_width y video_get_height y pararlo. Depués volver a echarlo a andar con el aspecto correcto.

Espero que os sea útil. No está acabada pero ya es más que funcional.
http://www.mediafire.com/?yijlmwyzcly
Title: Re: Módulo de vídeo basado en VLC
Post by: l1nk3rn3l on March 17, 2010, 10:40:23 PM
gracias  ;D
Title: Re: Módulo de vídeo basado en VLC
Post by: Prg on March 17, 2010, 11:24:37 PM
la he probado en windows con un flv y esta genial me encanta que tenga controles, pausa y todas las opciones que le has puesto :) gracias y karma++
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 17, 2010, 11:52:10 PM
Lo único que creo que me falta respecto de las capacidades que da la libvlc (y que son directamente aplicables a un módulo Bennu de esta clase) es poder controlar los subtítulos.
Ahora mismo los subtítulos se activan si hay un fichero .srt con el mismo nombre que el .avi y en la misma carpeta, pero estaría bien que se pudiera elegir desde el propio Bennu.

Espero que os sea útil. Si alguien se encuentra con un error que dice algo como "Exception: video playback not started" que lo avise y le digo como arreglarlo :)
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on March 18, 2010, 12:46:51 AM
esto es genial...
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 18, 2010, 12:53:13 AM
Gracias :)

Me gustaría hacer que si se le da un tamaño de 0x0 se cargara el vídeo con su tamaño real pero no puedo averiguar el tamaño hasta que se ha iniciado y para eso necesito haber especificado un tamaño... Si alguien quiere echarle un ojo y averigua cómo solucionarlo, se lo agradecería.
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on March 18, 2010, 01:13:38 AM
Bueno, quizás se pueda crear una función en C que lea dicha info directamente del video en función de su tipo, esta info va siempre en la cabecera... pero claro, habría que hacer una lista de los formatos soportados por VLC, buscar las especificaciones de la cabecera y leer la info necesaria, pero claro, es un trabajo de chinos.

Si alguien me regala tres horas, lo hago yo :(
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 18, 2010, 01:25:24 AM
Hombre, la idea es no tener que lidiar con los formatos de vídeo. Siempre podría hacer yo eso que he dicho antes en el código C (reproducir+leer variables+volver a reproducir con el tamaño apropiado), quizás lo haga así.
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on March 18, 2010, 01:36:07 AM
Pues pregúntale a Super(c) cómo lo hace, porque te da una completísima información de todos los formatos que soporta, y, hasta donde se, es un programa que hace llamadas a los 4 codecs de linea de comandos que usa: ffmpeg, MEncoder, Theora y ¿mov2mpeg? Si VSE usa alguna de estas librerías, por fuerza debe venir la llamada a alguna función que de esta información, están muy extendidas, creo que deben ser GNU...
Title: Re: Módulo de vídeo basado en VLC
Post by: FreeYourMind on March 24, 2010, 05:30:24 PM
Quote from: josebita on March 16, 2010, 03:16:58 PM
Ahora, cuando me ponga otra vez con la fmodex, no te apunets el tanto :P

Vas a continuar la fmodex ? La vas a compilar para Windows ?
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on March 24, 2010, 05:50:22 PM
Sí, la voy a continuar y ampliar mucho, añadiendo soporte de reconocimiento de tonos por el micrófono y quizás alguna cosilla más.
Pero no está parada, y ahora ya debería estar en algún sitio para windows.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on April 06, 2010, 09:40:29 AM
Versión 1.1 para win32 (http://www.mediafire.com/file/izmmumyjdd5/bennugd-module-vlc_1.1_win32.zip). La única mejora es que ahora ya no hace falta usar el complete_restore para poder ver los vídeos.
Title: Re: Módulo de vídeo basado en VLC
Post by: FreeYourMind on April 06, 2010, 10:32:01 AM
Te voy a dar un Karma, porque creo que nunca te he dado uno  ;D
Title: Re: Módulo de vídeo basado en VLC
Post by: panreyes on May 01, 2010, 05:43:44 PM
Yo te doy otro, porque este módulo me viene de perlas para un proyectillo :)
------
Uuuhh... Aunque el zip que me bajé de mediafire me da error de CRC xD
------
Ughh... xD ¿Y el modulito ocupa 25 megas? xD
Parece mi antigua distro de Linux para ejecutar Bennu en la Wii xD
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on May 01, 2010, 06:04:27 PM
Ocupa 25MB porque he metido todos los plugins que vienen con VLC.
Del directorio de los plugins, borra todo lo que no te interese. Veraś como baja un montón de tamaño. Yo supongo que si unicamente dejas los plugins estrictamente necesarios debería ocupar como mucho 5MB.

PD: El error de CRC me lo da a mí tb. Borra todos los ficheros que van en el directorio de plugins y copia los que te interesen del último VLC. El único fichero interesante del zip es el mod_vlc.dll
Title: Re: Módulo de vídeo basado en VLC
Post by: panreyes on May 02, 2010, 03:02:47 PM
Pfff... A investigar toca xD Nada, sólo tiene... 230 plugins! xD

Necesito VLC con lo mínimo para reproducir DivX...

--------
Nada, sea como sea se me hace muy grande :S
Para otros proyectos seguro que viene mucho mejor, pero yo por ahora tiraré de mod_smpeg :)
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on May 02, 2010, 04:41:59 PM
Pixel, para saber qué módulos necesitas:
Abre en el VLC de verdad el vídeo que quieras reproducir.
Vete a "Herramientas->Mensajes" (Ctrl+M)
Vete a "Árbol de Módulos"
Allí te pone todos los módulos que está usando. Hay un par de cosas que cambian porque para la salida de vídeo estoy usando libvmem_plugin.dll en lugar de libvout_directx_plugin.dll, que es la que casi seguro te pondrá que estás usando.
En pruebas con Wine, para reproducir el último capítulo de House que me he bajado, he comprobado que necesitas:

libaccess_file_plugin.dll
libaout_directx_plugin.dll
libavcodec_plugin.dll
libavformat_plugin.dll
libavi_plugin.dll
libbandlimited_resampler_plugin.dll
libconverter_float_plugin.dll
libmpeg_audio_plugin.dll
libmpgatofixed32_plugin.dll
libmux_avi_plugin.dll
libscale_plugin.dll
libscaletempo_plugin.dll
libstream_filter_record_plugin.dll
libswscale_plugin.dll
libvmem_plugin.dll

Son unos 12 MB sobre todo porque libavcodec.dll y libavformat.dll ocupan un huevo.
Si recodificas el vídeo a OGG Theora (con un bat como el que puse para la Wii) necesitas:
libaccess_file_plugin.dll
libaout_directx_plugin.dll
libogg_plugin.dll
libswscale_plugin.dll
libtheora_plugin.dll
libvmem_plugin.dll
libvorbis_plugin.dll

Que son 1.9MB. Si quieres, puedo modificarte el bat para convertir vídeo a Theora.

(En los dos casos, puede que necesites algún plugin más para el audio, ahora mismo no me está funcionando bien en Wine, pero creo que es todo).
Title: Re: Módulo de vídeo basado en VLC
Post by: Windgate on May 10, 2010, 07:45:19 PM
Arg, me separé de este hilo, disculpadme pero he estado ocupado, una sóla duda:

¿Ya se puede reproducir video de Youtube a partir de la URL?, ¿Alguien lo ha intentado?
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on May 24, 2010, 11:27:58 PM
Perdona, wind, por haber olvidado este tema durante tanto tiempo sin contestarte. Pues la verdad es que no he probado si funciona o no, pero en principio debería funcionar, con los plugins adecuados.

Otra cosa:
He creado esta página (http://code.google.com/p/bennugd-vlc/) en Google code donde iré dejando el código y sobre todo, packs con las librerías mínimas necesarias para reproducir los formatos de vídeo más comunes -WebM, Theora, H264, xvid, flv...- en windows.
De momento he subido el pack (http://code.google.com/p/bennugd-vlc/downloads/list) con soporte para webm (http://es.wikipedia.org/wiki/WebM) basado en la VLC 1.1. No sé si funciona el audio porque wine me está fastidiando; mañana lo probaré en un windows de verdad y lo arreglaré, si hace falta.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on May 31, 2010, 04:23:17 PM
He arreglado el pack para WebM (el audio no sonaba) y he añadido dos packs más:
- Theora+Vorbis (1.4MB comprimido).
- Dirac (1.4MB comprimido).

En próximos días subiré packs para formatos que no son libres pero son más comunes (flv, xvid...).
Como podeis ver son tan pequeñitos que deberían caber en un diskette, así que ahora no hace falta meter todas las librerías del VLC en vuestro programa.
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on May 31, 2010, 07:37:48 PM
¿XVID no es libre? pensaba que era un estandar libre como alternativa a DIVX ;D
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on May 31, 2010, 10:07:28 PM
He metido todo en el mismo saco :)
Title: Re: Módulo de vídeo basado en VLC
Post by: osk on May 31, 2010, 10:53:59 PM
Según tengo entendido, XviD es un decoder libre (¿o era encoder?), de H.264, ojo.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on June 01, 2010, 12:23:51 AM
xvid es casi lo mismo que divx. O por lo menos lo era. La gente que hacía divx lo venía desarrollando de forma libre y luego pensaron que podrían sacar pasta de aquel invento.
Así pues, cerraron el código y tiraron para delante.

No tiene mucho que ver con H264. Ambos están basados en MPEG-4, pero dudo mucho que un codec reproduzca el otro formato.
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on June 01, 2010, 12:50:04 AM
A mi me consta que todo aparato que reproduce DIVX hace lo propio con XVID. Creo que son compatibles (no sé cómo) o el mismo con algoritmos de codificación/decodificación distintos.
Title: Re: Módulo de vídeo basado en VLC
Post by: FreeYourMind on June 01, 2010, 05:27:08 AM
Eso no es verdad, no son compatibles, hay mucho aparato que reproduce divx y no xvid, aunque los ultimos modelos cada vez soportan más codecs y variantes. Las pelis de internet casi todas vienen en xvid, es el codec más usado.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on June 01, 2010, 06:12:09 AM
iba a pasar de esto, pero debo comentar algunas cosas que les pueden interesar.

no se a nivel codecs que diferecias hay entre divx y xvid, creo que son compatibles.
muchos reproductores mpeg4 (los de marca principalmente) no soportan divx por temas de licencia, sin embargo, si a los divx le cambias la firma que dice DIVX por XVID y otra que dice divx por xvid, o sea, cambiando 8 bytes del archivo los reproductores que no soportan divx leen perfectamente la pelicula.

entonces, tan diferentes/incompatibles no deben ser los codecs.

EDIT: Es al reves, no todos soportan divx, xvid lo soportan todos.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on June 01, 2010, 12:49:36 PM
Perdón,creo que no me expresé bien. En el primer párrafo decía que xvid y divx son casi lo mismo.

Me refería a que un reproductor de xvid/divx (pongamos que son parecidos) no va a reproducir h264, porque me pareció que Drumpi decía que quizáss sí.
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on June 01, 2010, 01:09:27 PM
Ah, no sé, me pierdo un poco con los formatos nuevos, pero yo no he tenido problemas con DIVX/XVID en los aparatos que he probado (GP2X, MPlayer de WIZ, WMP10...).
Y más ahora que separan los contenedores de los codecs (avi con divx y sonido AAC o MP3, h264 y h268, ...).
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on June 01, 2010, 02:47:49 PM
Quote from: josebita on June 01, 2010, 12:49:36 PM
Perdón,creo que no me expresé bien. En el primer párrafo decía que xvid y divx son casi lo mismo.

Me refería a que un reproductor de xvid/divx (pongamos que son parecidos) no va a reproducir h264, porque me pareció que Drumpi decía que quizáss sí.

yo le respondia a free...

drumpi, yo me refiero a los reproductores de sobremesa... los reproductores de un linux/windows mayormente reproducen todo, no tienen problemas con licencia (o no les importa)... lo mismo que los reproductores de sobremesa genericos o los que si pagan licencia divx...

mi reproductor hd multimedia, si bien es generico, reproduce h264, tambien reproduce xvid, realmedia, quicktime, matroska, y no se que mas, creo que no reproduce divx.
Title: Re: Módulo de vídeo basado en VLC
Post by: FreeYourMind on June 01, 2010, 04:19:39 PM
Sigo manteniendo lo que he dicho por si alguna de vuestra respuesta no es compatible.

Llevo muchos años coleccionando peliculas en todos los formatos posibles, y aunque ultimamente ya me descargue todo, hace años hacia yo mismo las conversiones y me apuntaba tambien el codec usado (en mis pelis más antiguas lo tengo apuntado en las listas, estas ultimas ya ni te ponen esa info de forma tan detallada).
Con lo cual tengo bastante experiencia en usar distintos formatos de compresión, y si os digo que XVID y DIVX son formatos distintos (codecs distintos), como no son el mismo formato, logicamente no so iguales.

Cuando se habla de compatibilidad, se habla que un lector sea compatible con los 2 formatos o algunas variantes/versiones de los mismos (se han creado millones de variantes/versiones a lo largo de la evolución de los 2 codecs por si no lo sabeis).
O sea no se habla de que sean formatos compatibles pero si de lectores compatibles (no confundais las cosas please).

XVID partio de una version DIVX robada y se fué diferenciando a partir de esta siguiendo una linea distinta.

He probado muchos lectores, y os puedo asegurar que raros son los que soporten xvid si no lo indican en la caja, por lo menos los antiguos, estos nuevos como ya soportan tantos codecs, esto ya ni lo ponen y seguramente ya son compatibles con todos los formatos conocidos.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on June 01, 2010, 04:47:51 PM
yo tengo varios reproductores de divx, 3 (marcas diferentes, tengo mas de eso en cantidad) con bandeja de dvd y 1 usb... tambien mis familiares tienen y amigos y ex-compañeros de trabajo que tambien de diferentes marcas, todos soportan xvid, pero no todos divx, por otro lado, yo estuve muy metido en el tema, puesto que modifique firmwares de dichos dvds, y no hablo de cambiarlos los subs o los colores, sino de meterme a modificar el codigo de maquina y corregir errores en los mismos, tambien tenia un site muy conocido de peliculas, ripeo, etc.
como sea, lo que yo dije esta relacionado con los reproductores y con los formatos, es cierto que si la pelicula es divx3 no sirve el truco de cambiar la firma por xvid, pero en codecs mas arriba si sirve, por ende, el codec debe seguir las mismas normas/protocolos.
tambien es posible que los players tengan los codecs de divx pero esten deshabilitados por el chequeo de la firma, como sea, si instalas en la pc el codec de xvid tambien puedes reproducir divx sin problemas.
te suguiero que pruebes lo que te digo, e intentes reproducir un divx cambiandole la firma como si fuera un xvid, vas a ver que te lo reconocen como xvid, y funcionan perfectamente.

edit: yo tengo reproductores de los antiguos, mas de 5 años y de los nuevos tambien tengo.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on June 02, 2010, 01:52:56 PM
Bueno, volviendo un poco al tema, he subido un pack para reproducir MPEG4 encapsulado en AVI, con soporte audio MPEG y AC3 (surround).
Title: Re: Módulo de vídeo basado en VLC
Post by: Windgate on June 13, 2010, 02:20:21 PM
Estoy apañando un módulo "oficial" para ser la intro de Bennu para todos los juegos. Parto de lo colgado en Google Code, si hay algo nuevo avisa para no cagarla Joseb :P

PD: ¿Conviene que use esta dll o hay otra más "oficial"? :(
Title: Re: Módulo de vídeo basado en VLC
Post by: Prg on August 09, 2010, 05:10:08 AM
hola,
he descubierto que un video no se termina de reproducir, le falta como un segundo, quizá menos.
y en el caso del formato webm, al hacer video_stop(); sale

Quote
m_el[mi_level] == NULL
arrrrrrrrrrrrrg Up cannot escape itself

dejo link al video con las librerías
http://www.mediafire.com/?bj3eb4394wtmw2n

pd: lo he probado en varios formatos (mp4, ogv, webm)
pd2:karma++ por las librerías
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on August 09, 2010, 02:41:06 PM
¿El error ese te lo da mi librería?. Flipo :)
Prueba a reemplazar las librerías con las del último VLC, por si acaso.
Mi conexión anda un poco cascada ultimamente, pero en cuanto mejore le echo un ojo.
Title: Re: Módulo de vídeo basado en VLC
Post by: Prg on August 09, 2010, 08:11:17 PM
son las últimas versiones. el error del mensaje sucede sólo con el formato webm.

el error de que el video no termina de reproducirse me lo da en todos los formatos. como te digo, le falta muy poco para terminar de reproducirlo, algunos segundos (quizá un segundo)
Title: Re: Módulo de vídeo basado en VLC
Post by: Windgate on August 09, 2010, 08:50:03 PM
Supongo Prg que andas con eso de la intro oficila de Bennu... Le pedí en su día ayuda a Josebita, pero tampoco quise darle demasiado la chapa, si sale algún avance funcional no dudes en subir el link, sea lo que sea, en mi caso no conseguí que se reprodujese un mp4 :(

Hace falta un buen programa test funcional "para tontos", como los test de Bennu 3D que anda que no valen xD
Title: Re: Módulo de vídeo basado en VLC
Post by: Prg on August 10, 2010, 02:26:59 AM
yo logré que se reprodujeran los formatos, el problema es que no se reproduce todo el video, le falta un poquito
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on August 10, 2010, 04:09:43 AM
debe ser problema del video o de la libvlc, por que no probas con el reproductor vlc?
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on August 10, 2010, 02:23:35 PM
Sí, probad eso. Si no, se me ocurren un par de cosas que podría intentar.

PD: estais con el último pack de la web del proyecto, no?
Title: Re: Módulo de vídeo basado en VLC
Post by: Prg on August 10, 2010, 06:36:13 PM
el media player classic si me lo reproduce todo. y el reproductor de windows media también (probé el .ogv y el .mp4)
el reproductor vlc no lo reproduce todo.

uso la versión de descarga de esta pagina
http://code.google.com/p/bennugd-vlc/

descargué el ogv y el webm, para el mp4, usé una versíon que contiene muchísimas librerías en la carpeta vlc, no se cuál es, pero la descargué de mediafire, creo que es este link
http://www.mediafire.com/?izmmumyjdd5

de cualquier forma, en todos el video queda inconcluso.


Entonces la solución será agregar más imágenes (un segundo más) al final del video,

gracias
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on August 10, 2010, 07:23:36 PM
¡No es culpa mía!. ¡Yuju!. :P

PD: En serio, imagino que las próximas versiones de VLC usarán para WebM el soporte nativo que viene con ffmpeg, que dicen que es mucho mejor que el que liberó Google, así que quizás mejore el asunto.
Title: Re: Módulo de vídeo basado en VLC
Post by: Drumpi on August 11, 2010, 12:24:58 AM
De momento, ffmpeg es el decodificador que más me ha convencido, sobre todo en la última versión que tengo para Linux.
Aunque lo suyo sería buscar directamente los codecs existentes y crear un programa "server" que los use, creo que ya incluyen su propia aceleración HW... aunque va a ser casi imposible encontrar los fuentes de codecs propietarios (salvo las versines "hacks", aka mad y ugly segun repositorios de ubuntu).
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on August 11, 2010, 12:28:24 AM
No sé si me he explicado: VLC ya usa ffmpeg para _algunos_ codecs. Si te fijas en los packs, el que reproduce MPEG4 usa ffmpeg para reproducir los vídeos. Cuando salga la próxima versión de VLC, quizás lo use para reproducir los WebM y el soporte mejore.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on August 11, 2010, 04:38:23 AM
cambia de formato de video, no le des mas vueltas al asunto.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on August 29, 2010, 10:40:27 AM
He actualizado la librería para que utilice el nuevo API de VLC > 1.1.1 y tenga soporte nativo para 32bpp.
Cambios:

* Cambiado el API para soportar VLC 1.1.1 y superiores.
* Ahora el gráfico que devuelve video_play() es de la profundidad que se esté usando en el momento: 16 ó 32. Los 8bpp siguen sin estar soportados.
* Si a alguien le pasaba que al salir del intérprete Bennu se colgaba, parece que ya no ocurre.

La nueva versión compilada de las librerías la teneis en:
Win32 (http://bennugd-vlc.googlecode.com/svn/trunk/mod_vlc.dll)
Linux (http://bennugd-vlc.googlecode.com/svn/trunk/mod_vlc.so)

Pero ojo que sólo funciona con VLC >= 1.1.1, no con la versión que viene en los packs, que los reharé cuando tenga un rato.

PD: Wind, dime otra vez cuál es el problema que tienes con esta librería, que le intento echar un ojo.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on August 29, 2010, 12:40:25 PM
Los packs para windows ya están actualizados en la web del proyecto y la nueva librería está disponible en mi PPA para los que useis Ubuntu Maverick.

Los nuevos packs los he probado con wine, así que si hay algún fallo, os agradecería que me lo hicierais saber.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on August 29, 2010, 12:50:41 PM
gracias
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on August 29, 2010, 01:10:18 PM
De nada. Siento meter tantos mensajes seguidos pero, por si a alguien le vienen bien, he subido algunos vídeos a la sección de descargas del proyecto.
Algunos son más grandes y otros más chicos: es lo que he encontrado por ahí.
Title: Re: Módulo de vídeo basado en VLC
Post by: SplinterGU on August 29, 2010, 03:14:38 PM
no te preocupes por los mensajes seguidos, a mi me alegra que por lo menos alguien escriba en el foro.
Title: Re: Módulo de vídeo basado en VLC
Post by: josebita on September 11, 2010, 06:57:00 PM
Acabo de subir el primer pack (MPEG4) para MacOS X. Es bastante más grande que los de windows porque las librerías de VLC vienen con soporte para más arquitecturas de las que uso, pero viene a ser lo mismo.

A ver si saco un rato y escribo una página en el Wiki explicando cómo empaquetar juegos para MacOS X.