Bennu Game Development

Foros en Español => Extensiones => Topic started by: DCelso on October 26, 2009, 05:48:11 PM

Title: mod_smpeg
Post by: DCelso on October 26, 2009, 05:48:11 PM
Hola a todos,
He portado a bennuGD la librería smpeg para reprodución de videos.
El enlace con los binarios y el test de prueba es el siguiente:
http://www.mediafire.com/?xjghnyzngzi
Adjunto el código fuente.

NOTA: he probado varios archivos mpg de la intro que hizo prg y no son compatibles con smpeg.
El código fuente debería de ser facilmente compilable en linux (por si alguien quiere portarlo), solo se necesitaría el .so de smpeg y el .so de bgdrtm.

Enlace a último binario:
http://www.mediafire.com/?jljtmjyz5jm
Title: Re: mod_smpeg
Post by: FreeYourMind on October 26, 2009, 07:14:16 PM
Macho, estas coleccionado karmas o que :) Karma Up ++
Title: Re: mod_smpeg
Post by: blostec on October 26, 2009, 09:30:10 PM
Genial, ahora lo bajo y lo pruebo. Muchas gracias DCelso, otro karma para ti.
Title: Re: mod_smpeg
Post by: Windgate on October 26, 2009, 10:08:07 PM
Yo también te doy otro karma DCelso, por tu capacidad para no dormir y estar todo el día haciendo cosas con Bennu, impresionante.

Bajando y viendo.

EDIT: Maldita sea, otra vez el error ese de string allocated, es que tengo una versión vieja de las DLL para poder programar con el maldito Bennu 3D, a ver si l1nk3rn3l lo recompila pronto, ando restaurando versiones de las DLL del orden de 3 veces al día... Estaré al corriente de estos hilos "relacionados con la intro de Bennu".
Title: Re: mod_smpeg
Post by: DCelso on October 27, 2009, 12:11:55 AM
:D, gracias a todos, estoy ahí a la carrera, a ver si supero a Splinter en karmas :D.
Por cierto SplinterGu, ya se que no tienes mucho tiempo y tal pero me encataría que le echaras un vistazo rápido al código fuente de esta lib por si hace uso correcto de SDL, ya que actualmente la librería tiene una limitación no impuesta que es que no puedes poner nada más en pantalla aparte del video porque este lo machaca. Es decir, pones un texto con write, pones una imagen y pones un video y solo se ve el video lo demás lo borra, y me da la sensación que es por como uso el SDL que me estoy saltando algo que debería hacer bennu en vez de yo.
Title: Re: mod_smpeg
Post by: SplinterGU on October 27, 2009, 01:23:42 AM
eso no me gusta nada... mis karmas no aumentan... :(
Title: Re: mod_smpeg
Post by: SplinterGU on October 27, 2009, 01:28:36 AM
y no te gustaria dibujarlo sobre un mapa?
Title: Re: mod_smpeg
Post by: Drumpi on October 27, 2009, 01:30:51 AM
Yo me uno al aumento de karmas: la actividad genera eso, aunque luego no se terminen ;D

Splinter ¿no tuvimos que añadir algo sobre smpeg en el make de los módulos de Bennu cuando hicimos el port de GP2X?
Y me parece que tendrás que programar un jueguecito para que te suban karmas :D :D :D
Venga, te doy uno, no por pena, sino por la última versión de Bennu (que no te di en su día) que encima venía sin instalador ¡como a mi me gusta! :D :D :D
Title: Re: mod_smpeg
Post by: DCelso on October 27, 2009, 01:49:34 AM
¿En un mapa?. Estaría genial si supieraaa  :'(, pero entonces habría que hacerle también algún control para poder llevar también varios videos a la vez y aprovechar más aún esa ventaja , actualmente solo tiene control para un video a la vez.
Title: Re: mod_smpeg
Post by: SplinterGU on October 27, 2009, 02:01:24 AM
drumpi: no, porque dicho modulo no existe, no es oficial de bennu...



static int f_loadmap(INSTANCE * my, int * params)
{
int result = -1;
const char *filename = string_get(params[0]);
    int w, h, bpp ;
    PIXEL_FORMAT * pf;
    GRAPH * map = NULL ;
   
    /* Calculate the row size (dword-aligned) */

    w = params[1];
    h = params[2];
    bpp = params[3];

    pf = bitmap_create_format( bpp );

    screen = SDL_CreateRGBSurface( 0,
                                   width,
                                   height,
                                   bpp,
                                   pf->Rmask,
                                   pf->Gmask,
                                   pf->Bmask,
                                   pf->Amask
                                 );

mov1 = new SDL_Movie;
mov1->Load( filename, screen);

string_discard(params[0]);
free( pf );

/* result = string_new(mov1->GetError()); */ <<--- agregar chequeo por error y en caso de error retornar -1

    map = bitmap_new_ex( 0, screen->w, screen->h, screen->format->BitsPerPixel, screen->pixels, screen->pitch );
    if ( !map ) return -1;
    map->code = bitmap_next_code();
    grlib_add_map( 0, map );
    return map->code ;
}


aca te paso el codigo para la funcion que carga en un mapa, esta funcion crea un map y lo retorna...

tenes que agregar validacion por errores... y probarla... ni siquiera la compile...

deberias agregar una funcion para borrar el mapa creado... que ademas de eliminar el handle del video hagas un


    grlib_unload_map( 0, mapcode ) ;


y


    if ( screen ) SDL_FreeSurface( screen ) ;


para actualizar el mapa


static int f_displaymap(INSTANCE * my, int * params) {
GRAPH *map = bitmap_get(0,params[0]);
if (!map) return string_new("error"); <<---corregir
if (mov1 ==NULL)
return string_new(MPEG_NOT_LOADED);
mov1->Display();
        map->modified = 2;
return string_new(mov1->GetError());
}


bueno, los esqueletos son estos, adaptalos un poquito y deberian funcionar, disculpa que no pueda dedicarle mas tiempo...

dcelso, si, faltaria hacer un control mejor para poder usar varios videos a la vez... bueno, ahi tenes algo para entretenerte...
Title: Re: mod_smpeg
Post by: Prg on October 27, 2009, 03:54:43 AM
Quotehe probado varios archivos mpg de la intro que hizo prg y no son compatibles con smpeg.
ahmm!!  :P
qué carácterísticas debe tener el mpg para que lo tome la librería?

me uno, karma++ :)
Title: Re: mod_smpeg
Post by: DCelso on October 27, 2009, 08:38:24 AM
http://en.wikipedia.org/wiki/SMPEG. Supongo que cualquier mpeg1  funcionará bien. Aunque ahí pone mpeg1 mejor que mpeg2 ¿?
Splinter, gracias, voy a ver si sepo usarlo  :o
Title: Re: mod_smpeg
Post by: DCelso on October 27, 2009, 11:38:58 AM
Ya he unido todo.
Por cierto, SplinterGU, he tenido que modificar algunas cabeceras de BennuGD para que compilen bien con C++, resulta que me daban un montón de "undefined references" aún enlazando con las libs donde estaban las funciones que decía que no tenían referencia, y de casualidad he descubierto que hay que poner extern "C" en las funciones para que las pille C++.
Así que estos son los cambios que hay que introducir para que funcione la compilación de mod_smpeg

g_bitmap.h
#ifdef __cplusplus
#define C_SYMBOL "C"
#else
#define C_SYMBOL ""
#endif

extern C_SYMBOL GRAPH * bitmap_new( int code, int w, int h, int depth );
extern C_SYMBOL GRAPH * bitmap_new_ex( int code, int w, int h, int depth, void * data, int pitch );
extern C_SYMBOL GRAPH * bitmap_clone( GRAPH * t );
extern C_SYMBOL GRAPH * bitmap_new_syslib( int w, int h, int depth );
extern C_SYMBOL void bitmap_destroy( GRAPH * map );
extern C_SYMBOL void bitmap_destroy_fake( GRAPH * map );
extern C_SYMBOL void bitmap_add_cpoint( GRAPH *map, int x, int y );
extern C_SYMBOL void bitmap_set_cpoint( GRAPH * map, uint32_t point, int x, int y );
extern C_SYMBOL void bitmap_analize( GRAPH * bitmap );

extern C_SYMBOL PIXEL_FORMAT * bitmap_create_format( int bpp );

extern C_SYMBOL int bitmap_next_code();

g_grlib.h
#ifdef __cplusplus
#define C_SYMBOL "C"
#else
#define C_SYMBOL ""
#endif

extern C_SYMBOL GRAPH * bitmap_get( int libid, int mapcode ) ;
extern C_SYMBOL GRLIB * grlib_get( int libid ) ;
extern C_SYMBOL void grlib_init() ;
extern C_SYMBOL int grlib_new() ;
extern C_SYMBOL void grlib_destroy( int libid ) ;
extern C_SYMBOL int grlib_add_map( int libid, GRAPH * map ) ;
extern C_SYMBOL int grlib_unload_map( int libid, int mapcode ) ;




#ifdef __cplusplus
#define C_SYMBOL "C"
#else
#define C_SYMBOL ""
#endif

extern C_SYMBOL void _string_ptoa( char *t, void * p );
extern C_SYMBOL void _string_ntoa( char *p, unsigned long n );
extern C_SYMBOL void _string_utoa( char *p, unsigned long n );

extern C_SYMBOL void         string_init() ;
extern C_SYMBOL const char * string_get( int code ) ;
extern C_SYMBOL void         string_dump( void ( *wlog )( const char *fmt, ... ) );
extern C_SYMBOL void         string_load( void *, int, int, int, int ) ;
extern C_SYMBOL int          string_new( const char * ptr ) ;
extern C_SYMBOL int          string_newa( const char * ptr, unsigned count ) ;
extern C_SYMBOL void         string_use( int code ) ;
extern C_SYMBOL void         string_discard( int code ) ;
extern C_SYMBOL int          string_add( int code1, int code2 ) ;
extern C_SYMBOL int          string_compile( const char ** source ) ;
extern C_SYMBOL int          string_itoa( int n ) ;
extern C_SYMBOL int          string_uitoa( unsigned int n ) ;
extern C_SYMBOL int          string_ftoa( float n ) ;
extern C_SYMBOL int          string_ptoa( void * n ) ;
extern C_SYMBOL int          string_comp( int code1, int code2 ) ;
extern C_SYMBOL int          string_casecmp( int code1, int code2 ) ;
extern C_SYMBOL int          string_char( int n, int nchar ) ;
extern C_SYMBOL int          string_substr( int code, int first, int len ) ;
extern C_SYMBOL int          string_find( int code1, int code2, int first ) ;
extern C_SYMBOL int          string_ucase( int code1 ) ;
extern C_SYMBOL int          string_lcase( int code1 ) ;
extern C_SYMBOL int          string_strip( int code ) ;
extern C_SYMBOL int          string_pad( int code, int length, int align ) ;
extern C_SYMBOL int          string_format( double number, int dec, char point, char thousands ) ;
extern C_SYMBOL int          string_concat( int code1, char * str2 ) ;

Sería muy pelotudo si pudieras introducirlo en bennu para posteriores versiones, ya que si no a cada versión nueva de benno que hagas me tocaría ir indagando dónde poner el extern "C" y con esto es automático para que funcione en C a secas y en CPP.

Por otro lado, necesito un poquitín de más de tu ayuda con la mod_smpeg.
Resulta que ya tengo todo programado, tanto cargar en un map como cargar varios mpegs a la vez.
Ahora el problema lo tengo con load_in_screen. Quiero hacer que se carge en la pantalla directamente (como lo hace por ejemplo put_screen) y así poder tener el video de fondo y tal,ya lo tengo programado pero resulta que no se me dibuja en pantalla.
Creo que es porque no se recuperar el SDL_surface del map 0,0. Te pongo el código fuente en concreto

static int f_load_in_screen(INSTANCE * my, int * params)
{
const char *filename = string_get(params[0]);
    int w, h, bpp ;
    PIXEL_FORMAT * pf;
    GRAPH * map = NULL ;
    int index;
    SDL_Surface * screen;

    index = get_next_index();
    if (index <0) return -1;

map = bitmap_get(0,0);

    /* Calculate the row size (dword-aligned) */

    w = map->width;
    h = map->height;
    bpp = map->format->depth;

    pf = bitmap_create_format( bpp );

    screen = SDL_CreateRGBSurface( 0,
                                   w,
                                   h,
                                   bpp,
                                   pf->Rmask,
                                   pf->Gmask,
                                   pf->Bmask,
                                   pf->Amask
                                 );

    v_movie[index] = new SDL_Movie;
    v_movie[index]->Load( filename, screen);

string_discard(params[0]);
free( pf );
    v_movie[index]->map_code = map->code;
    return index;
}

Adjunto codigo fuente completo, última dll compilada y test.prg de pruebas.
Title: Re: mod_smpeg
Post by: DCelso on October 27, 2009, 11:41:37 AM
Dejo dll y test por si alguien quiere probar las nuevas funcionalidades.
http://www.mediafire.com/?jy2vmywz31m
Title: Re: mod_smpeg
Post by: SplinterGU on October 27, 2009, 12:17:29 PM
el que yo te di, era para dibujar en un mapa... no en la pantalla...

el getvideosurface (creo que era) es el correcto para dibujar en pantalla... no createsurface...

con respecto al extern... solo tenes que poner


extern "C" {
#include < headers bennu > <<---------- poner los includes correctos
...
}

Title: Re: mod_smpeg
Post by: Windgate on October 27, 2009, 01:06:06 PM
Me abruma ver como habláis de crear DLLs para Bennu como quien habla de los ingredientes que le pondrá a su asado... No me entero de mucho...

qué carácterísticas debe tener el mpg para que lo tome la librería?

Por ahora no puedo hacer pruebas, pero dado que mod_smpeg me huele a futura librería "oficial" de Bennu, si alguien encuentra un programa libre y un formato óptimo para convertir el vídeo a mpeg y que todo funcione que lo añada en el hilo de herramientas oficiales (O aquí mismo) :P
Title: Re: mod_smpeg
Post by: DCelso on October 27, 2009, 01:28:38 PM
de poca madre, voy a probar
Title: Re: mod_smpeg
Post by: DCelso on October 27, 2009, 02:05:08 PM
Splinter, no doy con la tecla, estoy cerquita ya pero voy a necesitar otro empujón.
Creo el load directamente de la pantalla:

static int f_load_in_screen(INSTANCE * my, int * params)
{
const char *filename = string_get(params[0]);
    int index;

    index = get_next_index();
    if (index <0) return -1;


    v_movie[index] = new SDL_Movie;
    v_movie[index]->Load( filename, SDL_GetVideoSurface());

string_discard(params[0]);
    v_movie[index]->map_code = background->code;
    return index;
}

Como me quedé el code del background hago el display map como si fuerse cualquier otro pam

static int f_displaymap(INSTANCE * my, int * params) {
int index = params[0];
if (v_movie[index] ==NULL)
return string_new(MPEG_NOT_LOADED);

GRAPH *map = bitmap_get(0,v_movie[index]->map_code);
if (!map) return string_new(MPEG_NOT_LOADED_IN_MAP);
v_movie[index]->Display();
map->modified = 2;
return string_new(v_movie[index]->GetError());
}

Compruebo al liberar que no sea la pantalla para no cargarme el sistema

static int f_unloadmap(INSTANCE * my, int * params) {
int index = params[0];
if (v_movie[index] ==NULL)
return string_new(MPEG_NOT_LOADED);
if (v_movie[index]->map_code!=background->code)
grlib_unload_map( 0, v_movie[index]->map_code ) ;
delete v_movie[index];
v_movie[index] = NULL;
return string_new(MPEG_OK);
}

En el prg tengo esto para probarlo

import "mod_key"
import "mod_video"
import "mod_smpeg" 
Global
    id_video;
begin     
    set_mode (800,600,32);                     
    id_video =  load_video_in_screen("video3.mpg");
    play_video(id_video);
    while (getstatus_video(id_video)==SMPEG_PLAYING AND !key(_esc) )                     
        display_video(id_video);
        frame;       
    end;
    unload_video(id_video);   
end

Dentro de lo que conozco esto debería de funcionar pero no muestra el video
Title: Re: mod_smpeg
Post by: splinter_work on October 27, 2009, 05:46:32 PM
disculpa pero debo decir que no has entendido la idea de dibujar en un mapa... quizas yo tenga parte de la culpa por no haberlo explicado.

la idea de dibujar en un mapa es que tu puedas usar ese mapa para asignarlo a un proceso, entonces, ponerlo donde quieras, aplicarle size, angle, flags, etc...

has cambiado el codigo que yo pase, desde pasarlo a un container donde tambien tenes los datos del video y devolves esto, sin posibilidad de obtener el id del grafico desde el codigo para poder asignarlo a un proceso... hasta cambiar los SDL_RGBSurfaceCreate (o algo asi) + bitmap_new_ex por SDL_VideoSurface + no se que cuanto...

eso no va a funcionar de ninguna manera... y no era la idea del codigo que te pase...

entiendo que puede ser un poco complejo el asunto, y se que tambien es mas facil hacerlo yo que explicarlo, pero lamentablemente ahora mismo no tengo tiempo para ninguna de las 2 cosas... pero en principio te diria que arranques de nuevo a partir del codigo que te pase inicialmente... y que solo le des soporte a dibujar sobre mapas, y elimines todo lo otro que hace uso directo al video...

por favor, te pido disculpas... cuando tenga un poco mas de tiempo, podre darte una mano...

-----

quizas con el codigo original que te mande yo (es sumamente necesario que uses las funciones SDL, la palette_format y la bitmap*ex que te mande yo) y que devuelvas el container pero agregues una funcion para obtener el mapa asignado...

la idea seria que tengas las siguientes funciones:

video_load
video_get_map
video_unload/video_destroy

mas todas aquellas de control del video:

play
pause
stop
rewind
forward
...
etc

si no obtenes el mapa no vas a poder asignarlo a un proceso y por ende no vas a poder mostrarlo nunca en pantalla...

la funcion display podes hacerla, pero yo te sugiero un callback del estilo que se usa en el modulo de timers para actualizar los timers.

espero con esto haber podido ayudar un poco. disculpa no poder ayudarte mas.
Title: Re: mod_smpeg
Post by: DCelso on October 27, 2009, 07:25:24 PM
Sipo, eso ya está implementado, te entendí todo perfectamente eres muy bueno resolviendo dudas. Si te bajas el último ejemplo que hice verás todas las funciones que propones en dos videos ejecutándose a la vez controlados por dos "process" diferentes en los que "displayo" el video en su variable graph
El video_load (yo le puse load_video) ya está implementado, te devuelve un identificador de video al que le puedes pedir luego el graph o darle a play , etc. El modulo soporta 1000 videos a la vez, más me pareció demasiado.

El que no me he explicado bien soy yo.
Esto es para finalizar el múdulo y darle una nueva funcionalidad algo como un "put_screen" pero poniendo un video.
La idea de esta nueva funcionalidad es poner el video directamente en el fondo y así poder tener un mpeg de fondo en vez de una imagen estática, pudiendo poner procesos con graphs por encima de este y cosas parecidas.

La historia es que yo he intentado ponerlo directamente en el map asignado para background y así despreocuparte un poco de la tarea de asignarlo a un graph de un proceso.
Seria algo parecido a como funcionaba la primera versión que hize pero haciéndolo mas legalmente usando la API de bennu en vez de directamente usar SDL para hacer el sdl_fillrect y sdl_flip.

Si me pudieras decir cómo refrescar en pantalla el graph de background (file = 0, graph = -1) ya podría resolverlo porque ahora al tocarlo le pongo modified = 2 (al igual que hago con el resto) y no se refresca.
Title: Re: mod_smpeg
Post by: splinter_work on October 27, 2009, 07:51:11 PM
ah, bien... me alegro entonces... es que no vi el ejemplo aun... que susto... :D

bien... con respecto a lo otro, lo que pasa es que el video esta asociado a SDL_VideoSurface (o como sea) y el background es otra cosa... no es tan facil hacerlo, ya que vos necesitas una surface creada por SDL, una cosa es crear la surface con sdl y usar ese area de memoria para un mapa en bennu (cosa que se puede) y otra es usar un area de memoria de un mapa bennu y asignarla a un surface SDL... no seria recomendable hacer esto, ya que no sabemos que cosas internamente hace SDL con sus areas de memoria... pero como ser, podrias asignar screen->pixel = map->data, funcionara pero puede ser muy inestable, ya que bennu manipula internamente este mapa y puede desalocar esa memoria... muy complicado...

yo diria que quites esta parte...
Title: Re: mod_smpeg
Post by: DCelso on October 28, 2009, 12:11:15 AM
Tienes mucha razón, no me gusta nada esa opción.
Bueno pues entonces cerraré el tema, se puede coseguir el efecto que busco con un video_load y haciendo constantemente put_screen en el bucle :D. Pero era por abstraerlo :(.


import "mod_key"
import "mod_video"
import "mod_smpeg" 
import "mod_map" 
import "mod_screen"
import "mod_rand"
import "mod_time"
Global
    id_video;
begin     
  rand_seed(time());
  set_mode (800,600,32);                     
  video3();
  mosca();   
  while (!key(_esc) )                     
     frame;       
  end;                                         
end

process video3()
Private
    id_video3;
begin
    id_video3 =  load_video("video3.mpg",640,480,32);
    play_video(id_video3);
    while (getstatus_video(id_video3)==SMPEG_PLAYING AND !key(_esc) )                     
        display_video(id_video3);
        put_screen(0,get_video_map(id_video3));
        frame;       
    end;
    unload_video(id_video3);                                         
end

process mosca()
begin
    x=200;
    y=200;
    graph = new_map(20,20,32);
    map_clear(0,graph,RGB(0,0,150));                                         
    while(!key(_esc))
        y+=rand(-10,10);
        x+=rand(-10,10);
        if (key(_up)) y--;end
        if (key(_down)) y++;end
        if (key(_left)) x--;end
        if (key(_right)) x++;end
        Frame(400);
    end
    unload_map(0,graph);
end           

Title: Re: mod_smpeg
Post by: Drumpi on October 28, 2009, 01:59:22 AM
Finalmente ¿qué formatos admitiría la libreria? formatos y versiones.
Se está rifando una ristra de karmas ;D
Title: Re: mod_smpeg
Post by: DCelso on October 28, 2009, 08:50:05 AM
Es una pena pero solo mpeg1, porque según ponen en la wikipedia el tio solo ha dado soporte a este por ser el único no envuelto en patentes en estados unidos.
http://en.wikipedia.org/wiki/SMPEG.
A su favor he de decir que es mega rápido, lo probé en widows 98 en un 666 y va muy bien, ya no puedo probarlo en inferiores porque no dispongo de ninguno, lo suyo sería probarlo en wiz o gp2x a ver que tal tira en una consola.
Title: Re: mod_smpeg
Post by: Drumpi on October 28, 2009, 01:53:06 PM
Give me some time and i will try ;D
Pues eso, yo tengo la GP2X con Bennu, así que con los fuentes puedo tratar de compilarla y ver qué tal va a 200MHz
¿Lo haces con autotools (configure and make) o usas algún ide? lo digo porque uso cygwin con make, no se si sabré invocar al gcc ^^U
Title: Re: mod_smpeg
Post by: DCelso on October 28, 2009, 02:25:30 PM
cygwin?, pero será para windows entonces. con este no se pueden hacer ejecutables de gp2x, quizas querias decir open2x o devkitgp2x.
De todas formas el mod_smpeg depende de la librería dinámica smpeg así que también necesitarias compilar esta para gp2x.
En cuanto a autotools, no, yo uso eclipse cdt, que  actualmente tiene un sistema integrado de generación de binarios sin usar makefiles.
A ver que puedo hacer para generar los makefiles.
Title: Re: mod_smpeg
Post by: Drumpi on October 28, 2009, 02:35:52 PM
Exacto, el open2x, que usa cygwin para compilar.
Tengo el devkit oficial con dev-c++ pero no se si servirá para mi port, ya que por alguna razón es incompatible con los firms oficiales (por aquello de usar librerías mas nuevas).
Es raro, porque recuerdo haber visto que con dev-c++, al compilar te genera un makefile ¿?
Title: Re: mod_smpeg
Post by: splinter_work on October 28, 2009, 02:46:24 PM
Quote from: DCelso on October 28, 2009, 08:50:05 AM
Es una pena pero solo mpeg1, porque según ponen en la wikipedia el tio solo ha dado soporte a este por ser el único no envuelto en patentes en estados unidos.
http://en.wikipedia.org/wiki/SMPEG.
A su favor he de decir que es mega rápido, lo probé en widows 98 en un 666 y va muy bien, ya no puedo probarlo en inferiores porque no dispongo de ninguno, lo suyo sería probarlo en wiz o gp2x a ver que tal tira en una consola.

"diablos"! un 666? que negocios estas haciendo con el oscuro?
Title: Re: mod_smpeg
Post by: DCelso on October 29, 2009, 10:32:08 AM
Versión definitiva de mod_smpeg, con ejemplos de uso y dll de libsmpeg

http://www.mediafire.com/?jljtmjyz5jm

Dejo información de como compilarlo, depende de BennuGD y de libsmpeg
Title: Re: mod_smpeg
Post by: DCelso on October 29, 2009, 10:38:27 AM
En consolas necesitareis compilar smpeg, para facilitar el trabajo, os adjunto el código fuente de lo necesario y como compilarlo.
Title: Re: mod_smpeg
Post by: Windgate on October 29, 2009, 11:01:34 AM
Descargado, ahora voy a hacer mi primer videojuego 100% basado en videos de petardas.com y webs relacionadas :-*
Title: Re: mod_smpeg
Post by: osk on October 29, 2009, 11:53:40 AM
Quote from: DCelso on October 28, 2009, 08:50:05 AM
Es una pena pero solo mpeg1, porque según ponen en la wikipedia el tio solo ha dado soporte a este por ser el único no envuelto en patentes en estados unidos.
http://en.wikipedia.org/wiki/SMPEG.
A su favor he de decir que es mega rápido, lo probé en widows 98 en un 666 y va muy bien, ya no puedo probarlo en inferiores porque no dispongo de ninguno, lo suyo sería probarlo en wiz o gp2x a ver que tal tira en una consola.

Hola. ¿Sería factible utilizar la librería Theora como base para un (otro) módulo de vídeo en Bennu? Así no habría estos problemas...
Title: Re: mod_smpeg
Post by: DCelso on October 29, 2009, 03:00:25 PM
A ver, poder se podrá, yo he usado smpeg porque usa SDL y facilita la integración con BENNU y la portación a otros sitemas.
Title: Re: mod_smpeg
Post by: DCelso on October 29, 2009, 03:03:10 PM
Si me consiges un ejemplo de uso en c/c++, podría intentarlo.
Title: Re: mod_smpeg
Post by: osk on October 29, 2009, 03:59:21 PM
Bueno...de aquí te puedes bajar la librería junto con programas de test: http://www.theora.org/downloads/
Y la documentación de la API está aquí: http://www.theora.org/doc/libtheora-1.1/
Title: Re: mod_smpeg
Post by: SplinterGU on October 30, 2009, 12:09:45 AM
si, theodora es multiplataforma, funciona en wiz... seria grandioso...
Title: Re: mod_smpeg
Post by: DCelso on October 30, 2009, 01:50:18 AM
Pues es facil, hay un ejemplo de un visor que usa SDL, así que debería ser coser y cantar usando este como base :D.
Pero ¿como se hace un video theora?
Title: Re: mod_smpeg
Post by: Drumpi on October 30, 2009, 12:51:40 PM
Yo uso Super para todo lo que sea conversión de archivos de video:
http://www.erightsoft.com/SUPER.html
Usa los conversores ffmpeg, MEncoder, ffmpeg2theora y producer y admite casi todos los formatos conocidos.
El theora parece que es el que genera ogg y ogm (que es un xvid con audio en ogg), pero sigue sin admitir los divx y xvid... Pero estoy hablando de lo que dice el Super.
De todas formas, cualquier formato de video bienvenido será ¿Os imaginais eso en Venturer? (babea).
Title: Re: mod_smpeg
Post by: josebita on November 17, 2009, 06:10:47 PM
DCelso, acabo de compilar la lib para Linux y funciona estupendamente, muchas gracias.

La única pega que le encuentro es que en el ejemplo de uso, utilizas la función load_video_in_screen(), pero no parece estar definida en la librería...

Por lo demás, todo genial. Felicidades. Voy a empaquetarla para mi PPA y a actualizar mi viejo binding de SMPEG para que se actualice a tu librería.

PD: Adjunto librería para linux y script de compilación actualizado para poder usarlo con la instalación de Bennu que dejan mis paquetes. Para abrirlo, renombrad el archivo .zip a .tar.gz, porque el foro no deja subir archivos .gz.

PD2: ¿Has avanzado algo con theora?
Title: Re: mod_smpeg
Post by: josebita on November 17, 2009, 07:48:34 PM
Otra cosita:
Se me ocurre que, dado que Bennu permite que los módulos definan rutinas que se ejecuten cada frame, sería posible hacer que no hiciera falta llamar a display_video(video_id) cada vez que se hace FRAME.

Para hacerlo, se utilizaría algo como lo que hace la libsdlhandler:

[code language="c"]/* ----------------------------------------------------------------- */

/* Bigest priority first execute
   Lowest priority last execute */

HOOK __bgdexport( libsdlhandler, handler_hooks )[] =
{
    { 5000, dump_new_events                   },
    {    0, NULL                              }
} ;[/code]
Title: Re: mod_smpeg
Post by: SplinterGU on November 17, 2009, 11:24:17 PM
Quote from: josebita on November 17, 2009, 07:48:34 PM
Otra cosita:
Se me ocurre que, dado que Bennu permite que los módulos definan rutinas que se ejecuten cada frame, sería posible hacer que no hiciera falta llamar a display_video(video_id) cada vez que se hace FRAME.

Para hacerlo, se utilizaría algo como lo que hace la libsdlhandler:

[code language="c"]/* ----------------------------------------------------------------- */

/* Bigest priority first execute
   Lowest priority last execute */

HOOK __bgdexport( libsdlhandler, handler_hooks )[] =
{
    { 5000, dump_new_events                   },
    {    0, NULL                              }
} ;[/code]

es la idea, si mal no recuerdo, lo sugeri.
Title: Re: mod_smpeg
Post by: josebita on November 17, 2009, 11:37:47 PM
En su momento seguí el tema por encima. Puede que lo intente yo, si DCelso no se anima.
Title: Re: mod_smpeg
Post by: SplinterGU on November 17, 2009, 11:48:16 PM
igual estoy pensando en hacer algo oficial al respecto... no se si aprovechando lo mismo o no...
Title: Re: mod_smpeg
Post by: josebita on November 18, 2009, 12:25:55 AM
Ah, bueno, entonces no me meto :)
Realmente hace falta un mejor soporte de vídeo en BennuGD, así que ánimo.

PD: Estoy escribiendo desde un OSX un tanto informal que me he agenciado, a ver si soy capaz de echar a andar Bennu...
Title: Re: mod_smpeg
Post by: Drumpi on November 18, 2009, 01:13:29 AM
¿La librería echa mano de algun HW específico o de alguna librería del sistema o es totalmente independiente? (supongo que se me ven las intenciones desde lejos).
Title: Re: mod_smpeg
Post by: josebita on November 18, 2009, 01:19:12 AM
hace decoding por software y está basada en SDL, así que debería funcionar en cualquier lado.
Title: Re: mod_smpeg
Post by: DCelso on December 25, 2009, 06:52:26 AM
Pues si que se me pasó este hilo si.
No he hecho nada sobre theora me puse a indagar y no es tan facil, el sistema es parecido pero no es del todo igual y la API es un poco dificil de entender incluso viendo el ejemplo así que este tema lo tengo congelado por ahora no se si lo recuperaré.
En cuanto a lo de ponerlo que se ejecute en cada frame podría ser una buena idea pero yo lo hice así para ofrecer la mayor versatilidad, por ejemplo imaginate en sistemas muy pequeños el poder hacer un display en ver de en cada frame en cada x frames. ahorras procesado.
Y otra cosa es que habría que hacer un número indefinido de displays, date cuenta que sería uno por cada video cargado en la pantalla, lo vi demasiado complejo en principio y también lo aparté. :)

En cuanto portarla a linux o a cualquier otro sistema supuse que no sería nada compliado no uso nada que no sea SDL :D. Te costó mucho ? :D.
lo de load_video_in_screen si no recuerdo mal es un proceso bennu que se encarga de hacer un put_screen del frame actual del video para ver un ejemplo de como poner videos de fondo, :D es un tanto en cuanto cachondo, imagínate una película de fondo con un pong en  primer plano :D

De todas formas, creo que hay una pequeñita pérdida de memoria en la librería, no controlo mucho SDL pero me da que hago un create surface, lo uso constantemente y luego nunca lo libero asi que si alguien quiere usarla como base que tenga cuidado y examine a fondo la liberación de recursos :D.
Title: Re: mod_smpeg
Post by: josebita on December 25, 2009, 04:27:42 PM
Debió ser fácil, porque lleva ya un mes y pico en el PPA y no tengo recuerdo de que me diera mucha guerra... Escribir los scripts de compilación con los parámetros correctos y fuera. :)
Title: Re: mod_smpeg
Post by: panreyes on May 01, 2010, 06:02:47 PM
Lo siento por reupar el post, pero, creo que esto no funciona con la versión actual de Bennu, ¿puede ser?
Title: Re: mod_smpeg
Post by: josebita on May 02, 2010, 03:32:38 PM
El paquete de mi PPA sí que funciona, lo acabo de comprobar...
Title: Re: mod_smpeg
Post by: panreyes on May 03, 2010, 12:06:37 AM
Bueno... pero ya sabes que yo no sé ni compilar en C... xD
Title: Re: mod_smpeg
Post by: DCelso on May 03, 2010, 06:18:18 AM
Pixel, puede que no te vaya porque el codec que usa es muy limitado y solo pilla unos pocos formatos de mpeg, Primero prueba con el video ejemplo adjunto y luego, si va, prueba a recodificar tu video.Mira lo que pone en la wiki acerca de SMPEG
http://en.wikipedia.org/wiki/SMPEG

El último binario que puse está aqui, por si tienes otro diferente
http://www.mediafire.com/?jljtmjyz5jm
Title: Re: mod_smpeg
Post by: panreyes on May 03, 2010, 07:45:32 AM
El caso es que me falla con el video3.mpg que viene con el ejemplo xD

Y si, ese es el que he estado probando todo el tiempo.
Title: Re: mod_smpeg
Post by: panreyes on May 03, 2010, 09:39:16 PM
No sé si ayuda, pero, hice unos says:
say(play_video(id_video));
say(display_video(id_video));

Y devuelven todo el rato por consola esto:
Audio device is already opened
Title: Re: mod_smpeg
Post by: FreeYourMind on May 03, 2010, 10:03:00 PM
Has reiniciado el ordenador durante las pruebas ? Yo me iria al explorador de processos para aniquilarlo o reiniciaba la maquina y volvia a probar...
Title: Re: mod_smpeg
Post by: panreyes on May 03, 2010, 10:14:21 PM
Dudo que sea eso :|
Daría mucho miedo...

Ahora que pienso, ¿no estará relacionado con que no funcione con Windows 7? xD
Title: Re: mod_smpeg
Post by: DCelso on May 03, 2010, 10:17:59 PM
pues no se, a lo mejor, pero mira a ver si es que no tienes libsmpeg.dll y mod_smpeg.dll juntas en la misma carpeta.
libsmpeg.dll es la librería smpeg compilada
mod_smpeg.dll es un wrapper o "bean" que encapsula a libsmpeg ofreciendo a bennugd la api disponible, así que necesitas los dos.
libsmeg.dll está en el directroio "dlls" y mod_smpeg.dll está en el directorio "Release"
Title: Re: mod_smpeg
Post by: panreyes on May 03, 2010, 11:13:56 PM
Bien juntas están, junto al resto de dlls del Bennu actual.
¿Seguro que no habrá que recompilar contra el Bennu nuevo? xD

-------------

Y puedo confirmar que no se trata del Windows 7. En XP también me ocurre.
Title: Re: mod_smpeg
Post by: DCelso on May 03, 2010, 11:35:51 PM
Por poder ser, puede.
Ahora soy linuxero, tengo debian sqeezy, así que no te puedo decir cúando podría intentar compilarlas para windows.
Title: Re: mod_smpeg
Post by: SplinterGU on March 18, 2011, 06:14:28 PM
DCelso, si te parece bien voy a ver si puedo reutilizar tu codigo para implementar una lib oficial de video pero escrita en C, no en C++.

EDIT: Ahora que reeleo los mensaje, parece que no soporta muchos formatos esta lib, alguna info al respecto? alguna otra lib portable mas recomendable?
Title: Re: mod_smpeg
Post by: josebita on March 18, 2011, 06:21:24 PM
Yo diría que lo ideal sería tener una librería basada en ffmpeg. Reproduce casi todo y es muy portable (mucho más que la libvlc).
Title: Re: mod_smpeg
Post by: SplinterGU on March 18, 2011, 06:37:02 PM
entonces usaremos esa... gracias...

vos no habias hecho una para ffmpeg?
Title: Re: mod_smpeg
Post by: josebita on March 18, 2011, 07:20:50 PM
Yo la hice con libvlc, que está montada sobre ffmpeg y otras, pero añade un montón de cosas y el API no es compatible.
Si la consigues montar sobre ffmpeg directamente será mucho más fácil de portar incluso a sistemas "raros" como la Wii.
Title: Re: mod_smpeg
Post by: SplinterGU on March 18, 2011, 07:27:17 PM
bien, investigare como es el API y demas, y marchare sobre eso.
Title: Re: mod_smpeg
Post by: osk on March 18, 2011, 07:45:49 PM
GENIAL!!
Title: Re: mod_smpeg
Post by: DCelso on March 19, 2011, 07:21:54 AM
ya te digo, creo sospechar que no te servirá para nada este código :D.
Title: Re: mod_smpeg
Post by: SplinterGU on March 19, 2011, 03:08:22 PM
si uso ffmpeg, seguro que no me servida.
Title: Re: mod_smpeg
Post by: Windgate on March 29, 2011, 03:26:30 AM
Si sale adelante la nueva librería dejad bien a mano un test funcional, con la última recuerdo que sufrí bastante y no pude hacerla funcionar cuando se actualizaron las .dll de Bennu... Se me ocurre que molaría indicar hasta qué release es compatible o algo así.
Title: Re: mod_smpeg
Post by: josebita on April 04, 2011, 02:55:21 AM
Splinter, no sé qué tal llevas esto, pero por si acaso te dejo este enlace con un tutorial de integración ffmpeg+SDL:
http://dranger.com/ffmpeg/tutorial01.html
Title: Re: mod_smpeg
Post by: SplinterGU on April 04, 2011, 02:19:39 PM
aparcado...

complicaciones de trabajo, estudios medicos y demas, me dejo un poco apartado de todo lo que es desarrollo no laboral.
Title: Re: mod_smpeg
Post by: FreeYourMind on April 04, 2011, 02:38:19 PM
Esta enganchado a la serie peruana del Calibula.  ;D
Title: Re: mod_smpeg
Post by: SplinterGU on April 04, 2011, 03:34:18 PM
calibula? que significa esa palabra?
Title: Re: mod_smpeg
Post by: FreeYourMind on April 04, 2011, 03:51:50 PM
Caligula, perdón xDDD

http://www.youtube.com/watch?v=ZMxTgRHlrK8