Blame |
Last modification |
View Log
| RSS feed
/*
* Project: HARTIK (HA-rd R-eal TI-me K-ernel)
*
* Coordinators: Giorgio Buttazzo <giorgio@sssup.it>
* Gerardo Lamastra <gerardo@sssup.it>
*
* Authors : Luca Abeni <luca@hartik.sssup.it>
* Massimiliano Giorgi <massy@hartik.sssup.it>
* (see authors.txt for full list of hartik's authors)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://hartik.sssup.it
*/
/*
* Copyright (C) 1999 Luca Abeni and Massimiliano Giorgi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
/*
* CVS : $Id: mplay2.c,v 1.1.1.1 2004-05-24 18:03:39 giacomo Exp $
*
* File: $File$
* Revision: $Revision: 1.1.1.1 $
* Last update: $Date: 2004-05-24 18:03:39 $
*/
#include <ll/sys/types.h>
#include <kernel/func.h>
#include <kernel/const.h>
//#include <hartik.h>
#include <drivers/keyb.h>
#include <trace/trace.h>
#include <trace/queues.h>
#include <stdlib.h>
#include <stdio.h>
//#include <xdos.h>
#include <drivers/glib.h>
#include "mpeg/video.h"
/*#include "proto.h"*/
#include "mpeg/util.h"
#include "mpeg/dither.h"
#include "mpeg/mpeg.h"
//#define NOSHOW 1
#include <drivers/keyb.h>
int mustdied
=0;
void ctrlc_exit
(KEY_EVT
*k
)
{
extern void dump_sem_table
(void);
extern void dump_nop_table
(void);
mustdied
=1;
#ifndef NOSHOW
grx_close
();
#endif
cprintf
("CTRL-C pressed!\n");
#ifndef NOSHOW
grx_modeinfo
();
#endif
sys_end
();
}
#include <fs/bdevinit.h>
#include <fs/fsinit.h>
#include <fs/bdev.h>
#include <sys/types.h>
#include <sys/mount.h>
int __register_sub_init_prologue
(void)
{
int id
;
TRC_init_phase1
(NULL
);
trc_register_fixed_queue
();
id
=trc_create_queue
(TRC_FIXED_QUEUE
,NULL
);
trc_trace_class
(TRC_CLASS_USER
);
trc_assign_class_to_queue
(TRC_CLASS_USER
,id
);
return 0;
}
int __register_sub_init
(void)
{
return 0;
}
dev_t root_device
;
dev_t temp_device
;
int choose_root_callback
(dev_t dev
,u_int8_t fs
)
{
if (fs
==FS_MSDOS
) return dev
;
return -1;
}
int choose_temp_callback
(__dev_t dev
,__uint8_t fs
)
{
static int flag
=0;
if (fs
==FS_MSDOS
) {
if (flag
) return dev
;
flag
=1;
}
return -1;
}
int __bdev_sub_init
(void)
{
BDEV_PARMS bdev
=BASE_BDEV
;
bdev_def_showinfo
(bdev
,FALSE
);
bdev_init
(&bdev
);
root_device
=bdev_scan_devices
(choose_root_callback
);
if (root_device
<0) {
cprintf
("can't find root device to mount on /!!!\n");
sys_end
();
return -1;
}
temp_device
=bdev_scan_devices
(choose_temp_callback
);
if (temp_device
<0) {
cprintf
("can't find a filesystem to mount on /TEMP!!!\n");
}
return 0;
}
extern int libc_initialize
(void);
int __fs_sub_init
(void)
{
FILESYSTEM_PARMS fs
=BASE_FILESYSTEM
;
struct mount_opts opts
;
int res
;
filesystem_def_rootdevice
(fs
,root_device
);
filesystem_def_fs
(fs
,FS_MSDOS
);
filesystem_def_showinfo
(fs
,FALSE
);
filesystem_init
(&fs
);
if (temp_device
>=0) {
memset(&opts
,0,sizeof(struct mount_opts
));
opts.
flags=MOUNT_FLAG_RW
;
res
=mount
(temp_device
,FS_MSDOS
,"/TEMP",&opts
);
if (res
!=0) {
cprintf
("can't mount XXX on /TEMP (errno: %i)\n",errno
);
} else
cprintf
("mounted /TEMP rw\n");
}
libc_initialize
();
TRC_init_phase2
();
return 0;
}
int x_fseek
(FILE
*file
, long where
, int from
)
{
return fseek(file
,where
,from
);
}
size_t x_fread
(void *buffer
, size_t size
, size_t n
, FILE
*file
)
{
return fread(buffer
,size
,n
,file
);
}
TIME ttt
;
DWORD n
[10];
///* #define GPHBDIM 4097152 */
//#define GPHBDIM 1000000
//BYTE gphb[GPHBDIM]; /* Std Dim: 2M */
//BYTE *nextphbyte = gphb;
struct streamdescr
{
FILE
*f
;
ImageDesc
*i
;
int x1
, y1
;
} sd
[10];
#define SCREENX 800
#define SCREENY 600
void txtreset
(void *dummy
)
{
#ifndef NOSHOW
grx_close
();
grx_modeinfo
();
/* cprintf("Total frames: %ld\n", i);
cprintf("Total time: %lu\n", t);*/
//cprintf("Frame rate: %lu\n", (n * 1000) / ttt);
/* cprintf("Max frame time: %lu\n", mft);*/
/*
sys_status(READY_RT_STATUS | READY_NRT_STATUS | BLOCKED_STATUS |
IDLE_STATUS | SLEEP_STATUS | EXEC_STATUS);
*/
#endif
}
#define MAINSLEEP 20000
void drawload
(TIME l
)
{
#define LLPWINSIZE 20
int actl
;
// struct load l;
#define LOADX 500
#define LOADY 300
#define LOADYDIM 50
#define LOADXDIM 100
static int th
= 0;
static int x
= 0;
static int hy
[LLPWINSIZE
];
static int somma
= 0;
int i
;
/* for (i = 0; i < LLPWINSIZE; i++) hy[i] = 0; */
// load_actual(&l);
// actl = (LOADYDIM * l.actual) / l.rif + 1;
// {
// char str[80];
// sprintf(str,"%d",actl);
// /*grx_text("Ciao", 200, 200, color16(31, 63, 31), 0);*/
// grx_text(" ", 100, 400, 100, 0);
// grx_text(str, 100, 400, 100,0);
// }
/* LowPass Filter */
actl
=((long)l
*LOADYDIM
)/MAINSLEEP
+1;
somma
+= actl
- hy
[th
];
hy
[th
] = actl
;
th
= (th
+ 1) % LLPWINSIZE
;
actl
= somma
/ LLPWINSIZE
;
#ifndef NOSHOW
grx_line
(LOADX
+x
,LOADY
,LOADX
+x
,(LOADY
+LOADYDIM
),0);
if (actl
> LOADYDIM
) actl
= LOADYDIM
;
grx_line
(LOADX
+x
,(LOADY
+ actl
),LOADX
+x
,(LOADY
+LOADYDIM
),255);
#endif
x
= (x
+ 1) % LOADXDIM
;
}
TASK play
(void *arg
)
{
int i
=(int)arg
;
int loop
= TRUE
;
BYTE
*pixels
;
int moreframes
= TRUE
;
FILE
*mpeg
= sd
[i
].
f;
ImageDesc
*img
= sd
[i
].
i;
int x1
, y1
, x2
, y2
;
/*printf ("Task %d: Movie is %d x %d pixels\n", i, img->Width, img->Height);
printf ("Required picture rate = %d, required bit rate = %d\n",
img->PictureRate, img->BitRate);*/
pixels
= (BYTE
*) malloc(img
->Size
* sizeof(BYTE
));
x1
= sd
[i
].
x1;
y1
= sd
[i
].
y1;
x2
= x1
+ img
->Width
-1;
y2
= y1
+ img
->Height
-1;
while (loop
) { /* play the whole movie forever */
loop
= 0;
n
[i
] = 0;
ttt
= sys_gettime
(NULL
);
while (moreframes
&& n
[i
]<250) {
if (mustdied
) break;
#ifdef NOSHOW
cprintf
("%c",'°'+i
);
#endif
moreframes
= GetMPEGFrame
(img
, pixels
);
#ifndef NOSHOW
grx_putimage
(x1
, y1
, x2
, y2
, pixels
);
#endif
n
[i
]++;
task_endcycle
();
}
ttt
= sys_gettime
(NULL
) - ttt
;
if (!loop
) break;
RewindMPEG
(mpeg
, img
);
SetMPEGOption
(img
, MPEG_DITHER
, GRAY_DITHER
);
moreframes
= TRUE
;
}
return 0;
}
int main
(int argc
, char *argv
[])
{
// SYS_PARMS sp = BASE_SYS;
KEY_EVT k
;
// MODEL m = BASE_MODEL;
PID pid
;
// DOS_FILE *Infile;
// BYTE *mpegbuff[10], *p;
// WORD res;
// DWORD cnt[10];
TIME sum
;
SOFT_TASK_MODEL model
;
FILE
*mpeg
;
ImageDesc img
[10];
int full_color
= FALSE
;
int mode
;
int esc
;
int i
;
int actx
= 10, acty
= 10;
ColormapEntry
*cp
;
//cprintf("file '%s'\n",argv[1]);
if (argc
< 2) {
fprintf (stderr
, "Usage: %s mpegfile\n", argv
[0]);
sys_abort
(301);
}
/*
for (i = 0; i < argc - 1; i++) {
Infile = DOS_fopen(argv[i + 1], "r");
if (!Infile) {
cprintf("%s not found!!!\n", argv[i + 1]);
sys_abort(300);
}
cprintf("\n %s Opened!!!\n\n", argv[i + 1]);
mpegbuff[i] = nextphbyte;
p = mpegbuff[i]; cnt[i] = 0;
res = 0x1000;
while (res > 0) {
res = DOS_fread(p, 0x1000, 1, Infile);
cnt[i] += res;
p += res;
}
p += res;
nextphbyte = p;
}
*/
/* OK, Now we can start the system!!! */
//sys_init(&sp);
//keyb_init(SOFT, 100);
// keyb_init(NULL);
// k.flag = CNTR_BIT;
// k.scan = KEY_C;
// k.ascii = 'c';
//keyb_excset(k,endfun);
//vfs_init();
/*
for (i = 0; i < argc - 1; i++) {
vfs_assign(argv[i + 1], mpegbuff[i], cnt[i]);
}
*/
/* Init the graph... */
#ifndef NOSHOW
if (grx_init
() == -1) {
cprintf
("No init!!!\n");
sys_abort
(255);
}
mode
= grx_getmode
(SCREENX
, SCREENY
, 8);
cprintf
("Mode num: %x\n", mode
);
grx_cardinfo
();
#endif
cprintf
("[hit enter to continue]\n");
esc
= FALSE
;
while (!esc
) {
keyb_getcode
(&k
,BLOCK
);
if (k.
ascii == 13) esc
= TRUE
;
}
if (mode
== -1) {
cprintf
("Mode not present!!!\n");
sys_abort
(255);
}
#ifndef NOSHOW
if (grx_setmode
(mode
) == -1) {
cprintf
("No SetMode!!!\n");
sys_abort
(255);
}
#endif
//sys_atexit(txtreset,NULL,AFTER_EXIT);
//cprintf("Û0Û");
for (i
= 0; i
< argc
- 1; i
++) {
mpeg
= fopen(argv
[i
+ 1], "r");
if (!mpeg
) {
perror (argv
[1]);
sys_abort
(301);
}
//cprintf("Û0.5Û");
/* !!! */
img
[i
].
vid_stream=NULL
;
img
[i
].
Colormap=NULL
;
if (!OpenMPEG
(mpeg
, &(img
[i
]))) {
fprintf (stderr
, "OpenMPEG on %s failed\n", argv
[i
+ 1]);
sys_abort
(301);
}
//cprintf("Û1Û");
SetMPEGOption
(&(img
[i
]), MPEG_DITHER
, GRAY_DITHER
);
//SetMPEGOption (&(img[i]), MPEG_DITHER, FS4_DITHER);
/* SetMPEGOption(MPEG_DITHER, GRAY_DITHER); */
/* printf ("Movie is %d x %d pixels\n", img[i].Width, img[i].Height);
printf ("Required picture rate = %d, required bit rate = %d\n",
img[i].PictureRate, img[i].BitRate); */
//cprintf("Û2Û");
if (i
== 0) {
cp
= img
[i
].
Colormap;
if (!full_color
) {
int ii
;
for (ii
= 0; ii
< img
[i
].
ColormapSize; ii
++) {
#ifndef NOSHOW
grx_setcolor
(ii
, img
[i
].
Colormap[ii
].
red / 4,
img
[i
].
Colormap[ii
].
green / 4,
img
[i
].
Colormap[ii
].
blue / 4);
#endif
}
/*NO!!! Colormap is an array of short, setpalette wants an array of BYTE!!!*/
/* grx_setpalette(0, 255, img.Colormap);*/
}
}
if (actx
+ img
[i
].
Width > SCREENX
) {
actx
= 10;
acty
+= 200;
}
sd
[i
].
x1 = actx
;
sd
[i
].
y1 = acty
;
sd
[i
].
f = mpeg
;
sd
[i
].
i = &(img
[i
]);
//cprintf("Û3Û");
soft_task_default_model
(model
);
////soft_task_def_system(model);
//soft_task_def_met(model,9000);
//soft_task_def_wcet(model,9000);
//soft_task_def_period(model,50000);
soft_task_def_met
(model
,5000);
soft_task_def_wcet
(model
,5000);
soft_task_def_period
(model
,40000);
soft_task_def_periodic
(model
);
soft_task_def_arg
(model
,(void*)i
);
soft_task_def_ctrl_jet
(model
);
//task_def_arg(m, i);
//task_def_wcet(m, 9000);
pid
= task_create
("Shower", play
, &model
, NULL
);
if (pid
== -1) {
cprintf
(" task --> Not Guaranteed!!!\n");
sys_abort
(20000);
}
task_activate
(pid
);
//cprintf("Û4Û");
actx
+= img
[i
].
Width + 10;
}
/* play(0);*/
esc
= FALSE
;
//jet_delstat(pid);
while (!esc
) {
if (keyb_getcode
(&k
,NON_BLOCK
) && (k.
ascii == 13)) esc
= TRUE
;
task_delay
(MAINSLEEP
);
//jet_getstat(pid,&sum,NULL,NULL,NULL);
//jet_delstat(pid);
//drawload(sum);
}
sys_abort
(59000);
return 0;
}