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.

Windgate

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
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

de poca madre, voy a probar
Monstruos Diabólicos

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

DCelso

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

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

splinter_work

#18
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.

DCelso

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

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

splinter_work

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...

DCelso

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           

Monstruos Diabólicos

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

Drumpi

Finalmente ¿qué formatos admitiría la libreria? formatos y versiones.
Se está rifando una ristra de karmas ;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

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

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

Drumpi

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
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

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

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

Drumpi

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 ¿?
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)

splinter_work

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?

DCelso

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

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

DCelso

En consolas necesitareis compilar smpeg, para facilitar el trabajo, os adjunto el código fuente de lo necesario y como compilarlo.
Monstruos Diabólicos

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