mod_smpeg

Started by DCelso, October 26, 2009, 05:48:11 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

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
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

Macho, estas coleccionado karmas o que :) Karma Up ++

blostec

Genial, ahora lo bajo y lo pruebo. Muchas gracias DCelso, otro karma para ti.

Windgate

#3
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".
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

: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.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

eso no me gusta nada... mis karmas no aumentan... :(
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

y no te gustaria dibujarlo sobre un mapa?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

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
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

¿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.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

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...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

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++ :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

DCelso

#11
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
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

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.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

Dejo dll y test por si alguien quiere probar las nuevas funcionalidades.
http://www.mediafire.com/?jy2vmywz31m
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

#14
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
...
}

Download Lastest BennuGD Release: http://www.bennugd.org/node/2