Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4972 → Rev 4973

/programs/develop/libraries/menuetlibc/programs/plaympg/Makefile
0,0 → 1,5
OUTFILE = plaympg
OBJS = main.o
LIBS = -lmpeg
 
include $(MENUETDEV)/makefiles/Makefile_for_program
/programs/develop/libraries/menuetlibc/programs/plaympg/main.c
0,0 → 1,139
#include<stdio.h>
#include<stdlib.h>
#include<menuet/os.h>
#include<mpeg.h>
 
ImageDesc I;
FILE * fmpeg=NULL;
 
char * vblit_buffer=NULL;
char * bitmap_buffer=NULL;
int line_width;
 
int blit_x_offs=0;
int blit_y_offs=0;
 
int win_size_x=0;
int win_size_y=0;
 
unsigned long inter_frame_delay;
 
char player_window_title[256];
char loaded_file_name[256];
 
enum {
st_STOP=0,st_PLAYING=1,st_PAUSE=2,st_NOMOVIE=3
} play_state=st_NOMOVIE;
 
#define __convert_line(from,to) \
{ \
int d0,d1,d2; \
__asm__ __volatile__( \
"1:\n\t" \
"lodsw\n\t" \
"stosw\n\t" \
"lodsw\n\t" \
"stosb\n\t" \
"loop 1b" \
:"=&c"(d0),"=&S"(d1),"=&D"(d2) \
:"0"(line_width),"1"(from),"2"(to)); \
}
 
void convert_output_image(void)
{
char * src=bitmap_buffer;
char * dst=vblit_buffer;
int i;
for(i=0;i<I.Height;i++)
{
__convert_line(src,dst);
src+=line_width;
dst+=line_width;
}
}
 
int reload_mpg(const char * fname)
{
if(fmpeg) fclose(fmpeg);
fmpeg=fopen(fname,"rb");
if(!fmpeg) return -1;
SetMPEGOption(MPEG_DITHER,FULL_COLOR_DITHER);
OpenMPEG(fmpeg,&I);
line_width=I.Width;
vblit_buffer=(char *)realloc(vblit_buffer,I.Width*I.Height*3);
bitmap_buffer=(char *)realloc(bitmap_buffer,I.Width*I.Height*4);
return 0;
}
 
void close_mpg(void)
{
if(fmpeg) fclose(fmpeg);
if(vblit_buffer) free(vblit_buffer);
if(bitmap_buffer) free(bitmap_buffer);
vblit_buffer=NULL;
bitmap_buffer=NULL;
fmpeg=NULL;
}
 
void rewind_mpg(void)
{
RewindMPEG(fmpeg,&I);
}
 
int play_mpg_frame(void)
{
if(!GetMPEGFrame(bitmap_buffer)) return -1;
convert_output_image();
__menuet__putimage(blit_x_offs,blit_y_offs,I.Width,I.Height,vblit_buffer);
return 0;
}
 
void set_player_wnd_title(char * fname)
{
int i;
if(!fname || play_state==st_NOMOVIE)
fname="No movie loaded";
i=sprintf(player_window_title,"Menuet MPEG player - %s",fname);
__menuet__write_text(4,4,0xffffff,player_window_title,i);
}
 
static char * player_buttons1[]={" || "," > "," ## "," /\\ "," \\/ "};
static char * player_buttons2[]={"pause","play ","stop ","eject","load "};
 
#define BUTT_SIZE_X (5*8)
#define BUTT_SIZE_Y (2*12)
 
void paint_player_buttons(void)
{
int xpos,ypos,i;
xpos=5;
ypos=20;
for(i=0;i<5;i++)
{
__menuet__make_button(xpos,ypos,BUTT_SIZE_X,BUTT_SIZE_Y,i+2,0x40000000);
}
}
 
void paint_player_window(void)
{
__menuet__window_redraw(1);
if(play_state==st_NOMOVIE)
{
win_size_x=40*8;
win_size_y=200;
} else {
win_size_x=max(40*8,I.Width+20);
win_size_y=max(200,I.Height+50);
}
__menuet__define_window(100,100,win_size_x,win_size_y,0x03000080,
0x800000FF,0x000080);
set_player_wnd_title(loaded_file_name);
if(play_state!=st_NOMOVIE)
{
blit_x_offs=10;
blit_y_offs=40;
__menuet__putimage(blit_x_offs,blit_y_offs,I.Width,I.Height,vblit_buffer);
}
paint_player_buttons();
__menuet__window_redraw(2);
}