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
Macho, estas coleccionado karmas o que :) Karma Up ++
Genial, ahora lo bajo y lo pruebo. Muchas gracias DCelso, otro karma para ti.
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".
: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.
eso no me gusta nada... mis karmas no aumentan... :(
y no te gustaria dibujarlo sobre un mapa?
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
¿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.
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...
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++ :)
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
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.
Dejo dll y test por si alguien quiere probar las nuevas funcionalidades.
http://www.mediafire.com/?jy2vmywz31m
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
...
}
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
de poca madre, voy a probar
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
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.
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.
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...
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
Finalmente ¿qué formatos admitiría la libreria? formatos y versiones.
Se está rifando una ristra de karmas ;D
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.
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
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.
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 ¿?
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?
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
En consolas necesitareis compilar smpeg, para facilitar el trabajo, os adjunto el código fuente de lo necesario y como compilarlo.
Descargado, ahora voy a hacer mi primer videojuego 100% basado en videos de petardas.com y webs relacionadas :-*
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...
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.
Si me consiges un ejemplo de uso en c/c++, podría intentarlo.
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/
si, theodora es multiplataforma, funciona en wiz... seria grandioso...
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?
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).
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?
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]
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.
En su momento seguí el tema por encima. Puede que lo intente yo, si DCelso no se anima.
igual estoy pensando en hacer algo oficial al respecto... no se si aprovechando lo mismo o no...
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...
¿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).
hace decoding por software y está basada en SDL, así que debería funcionar en cualquier lado.
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.
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. :)
Lo siento por reupar el post, pero, creo que esto no funciona con la versión actual de Bennu, ¿puede ser?
El paquete de mi PPA sí que funciona, lo acabo de comprobar...
Bueno... pero ya sabes que yo no sé ni compilar en C... xD
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
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.
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
Has reiniciado el ordenador durante las pruebas ? Yo me iria al explorador de processos para aniquilarlo o reiniciaba la maquina y volvia a probar...
Dudo que sea eso :|
Daría mucho miedo...
Ahora que pienso, ¿no estará relacionado con que no funcione con Windows 7? xD
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"
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.
Por poder ser, puede.
Ahora soy linuxero, tengo debian sqeezy, así que no te puedo decir cúando podría intentar compilarlas para windows.
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?
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).
entonces usaremos esa... gracias...
vos no habias hecho una para ffmpeg?
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.
bien, investigare como es el API y demas, y marchare sobre eso.
GENIAL!!
ya te digo, creo sospechar que no te servirá para nada este código :D.
si uso ffmpeg, seguro que no me servida.
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í.
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
aparcado...
complicaciones de trabajo, estudios medicos y demas, me dejo un poco apartado de todo lo que es desarrollo no laboral.
Esta enganchado a la serie peruana del Calibula. ;D
calibula? que significa esa palabra?
Caligula, perdón xDDD
http://www.youtube.com/watch?v=ZMxTgRHlrK8