Skip to content

Commit d1fe646

Browse files
committed
[module-ffmpeg] Fixes, improvements and cleanup.
- Removed all unused code. - Used new SQ functions to improve perfomance. - Fixed AICA driver. - Removed few useless codecs. - Reduced module size.
1 parent 8e6c10b commit d1fe646

9 files changed

Lines changed: 120 additions & 832 deletions

File tree

exports_gcc.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ __eqdf2
3535
__ashldi3
3636
__unordsf2
3737
__lshrdi3
38+
__ashrdi3
3839
_Unwind_Resume
3940
_Unwind_DeleteException
4041
_Unwind_GetRegionStart

include/exports_fix.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ extern uint32 __eqdf2;
7474
extern uint32 __ashldi3;
7575
extern uint32 __unordsf2;
7676
extern uint32 __lshrdi3;
77+
extern uint32 __ashrdi3;
7778
extern uint32 _Unwind_Resume;
7879
extern uint32 _Unwind_DeleteException;
7980
extern uint32 _Unwind_GetRegionStart;

modules/ffmpeg/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ OBJS = module.o player.o aica.o mpg123.o oggvorbis.o #xvid.o
99
DBG_LIBS = -lds -lbzip2 -loggvorbis -lmpg123 #-lxvidcore
1010
LIBS = -lavcodec -lavformat -lavutil #-lswscale
1111
EXPORTS_FILE = exports.txt
12+
GCC_LIB =
1213

1314
VER_MAJOR = 0
1415
VER_MINOR = 6

modules/ffmpeg/aica.c

Lines changed: 18 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* (c)2000 Dan Potter
55
* modify BERO
66
* modified by Lawrence Sebald <bluecrab2887@netscape.net>
7+
* modified by SWAT 2024
78
*/
89
#include "aica.h"
910
#include <kos.h>
@@ -22,30 +23,14 @@
2223
#define CHNREG32(ch, x) (*(volatile unsigned long *)CHNREGADDR(ch,x))
2324
#define CHNREG8(ch, x) (*(volatile unsigned long *)CHNREGADDR(ch,x))
2425

25-
#define G2_LOCK(OLD) \
26-
do { \
27-
if (!irq_inside_int()) \
28-
OLD = irq_disable(); \
29-
irq_enable(); \
30-
/* suspend any G2 DMA here... */ \
31-
while((*(volatile unsigned int *)0xa05f688c) & 0x20) \
32-
; \
33-
} while(0)
34-
35-
#define G2_UNLOCK(OLD) \
36-
do { \
37-
/* resume any G2 DMA here... */ \
38-
if (!irq_inside_int()) \
39-
irq_restore(OLD); \
40-
} while(0)
41-
42-
4326
void aica_init() {
44-
int i, j, old = 0;
27+
int i, j;
28+
g2_ctx_t ctx;
4529

4630
/* Initialize AICA channels */
4731
g2_fifo_wait();
48-
G2_LOCK(old);
32+
33+
ctx = g2_lock();
4934
SNDREG32(0x2800) = 0x0000;
5035

5136
for (i=0; i<64; i++) {
@@ -59,33 +44,9 @@ void aica_init() {
5944
}
6045

6146
SNDREG32(0x2800) = 0x000f;
62-
G2_UNLOCK(old);
47+
g2_unlock(ctx);
6348
}
6449

65-
/* Translates a volume from linear form to logarithmic form (required by
66-
the AICA chip */
67-
/* int logs[] = {
68-
69-
0, 40, 50, 58, 63, 68, 73, 77, 80, 83, 86, 89, 92, 94, 97, 99, 101, 103,
70-
105, 107, 109, 111, 112, 114, 116, 117, 119, 120, 122, 123, 125, 126, 127,
71-
129, 130, 131, 133, 134, 135, 136, 137, 139, 140, 141, 142, 143, 144, 145,
72-
146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 156, 157, 158, 159,
73-
160, 161, 162, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 170, 171,
74-
172, 172, 173, 174, 175, 175, 176, 177, 177, 178, 179, 180, 180, 181, 182,
75-
182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 188, 189, 190, 190, 191,
76-
191, 192, 193, 193, 194, 194, 195, 196, 196, 197, 197, 198, 198, 199, 199,
77-
200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207,
78-
208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215,
79-
215, 216, 216, 217, 217, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222,
80-
222, 222, 223, 223, 224, 224, 225, 225, 225, 226, 226, 227, 227, 228, 228,
81-
228, 229, 229, 230, 230, 230, 231, 231, 232, 232, 232, 233, 233, 234, 234,
82-
234, 235, 235, 236, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
83-
240, 241, 241, 241, 242, 242, 243, 243, 243, 244, 244, 244, 245, 245, 245,
84-
246, 246, 247, 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, 250, 251,
85-
251, 251, 252, 252, 252, 253, 253, 253, 254, 254, 254, 255
86-
87-
}; */
88-
8950
const static unsigned char logs[] = {
9051
0, 15, 22, 27, 31, 35, 39, 42, 45, 47, 50, 52, 55, 57, 59, 61,
9152
63, 65, 67, 69, 71, 73, 74, 76, 78, 79, 81, 82, 84, 85, 87, 88,
@@ -112,7 +73,6 @@ const static unsigned char logs[] = {
11273
figure out what these mean. */
11374
#define AICA_PAN(x) ((x)==0x80?(0):((x)<0x80?(0x1f):(0x0f)))
11475
#define AICA_VOL(x) (0xff - logs[128 + (((x) & 0xff) / 2)])
115-
//#define AICA_VOL(x) (0xff - logs[x&255])
11676

11777
static inline unsigned AICA_FREQ(unsigned freq) {
11878
unsigned long freq_lo, freq_base = 5644800;
@@ -150,23 +110,17 @@ static inline unsigned AICA_FREQ(unsigned freq) {
150110
This routine (and the similar ones) owe a lot to Marcus' sound example --
151111
I hadn't gotten quite this far into dissecting the individual regs yet. */
152112
void aica_play(int ch,int mode,unsigned long smpptr,int loopst,int loopend,int freq,int vol,int pan,int loopflag) {
153-
// int i;
113+
154114
int val;
155-
int old = 0;
115+
g2_ctx_t ctx;
156116

157117
/* Stop the channel (if it's already playing) */
158118
aica_stop(ch);
159-
/* doesn't seem to be needed, but it's here just in case */
160-
/*
161-
for (i=0; i<256; i++) {
162-
asm("nop");
163-
asm("nop");
164-
asm("nop");
165-
asm("nop");
166-
}
167-
*/
168-
g2_fifo_wait();
169-
G2_LOCK(old);
119+
120+
/* AICA channels stops with delay */
121+
timer_spin_sleep(1);
122+
123+
ctx = g2_lock();
170124
/* Envelope setup. The first of these is the loop point,
171125
e.g., where the sample starts over when it loops. The second
172126
is the loop end. This is the full length of the sample when
@@ -198,36 +152,29 @@ void aica_play(int ch,int mode,unsigned long smpptr,int loopst,int loopend,int f
198152
*/
199153
CHNREG32(ch, 16) = 0x1f; /* No volume envelope */
200154

201-
202155
/* Set sample format, buffer address, and looping control. If
203156
0x0200 mask is set on reg 0, the sample loops infinitely. If
204157
it's not set, the sample plays once and terminates. We'll
205158
also set the bits to start playback here. */
206159
CHNREG32(ch, 4) = smpptr & 0xffff;
207160
val = 0xc000 | 0x0000 | (mode<<7) | (smpptr >> 16);
208161
if (loopflag) val|=0x200;
209-
162+
210163
CHNREG32(ch, 0) = val;
211-
212-
G2_UNLOCK(old);
164+
165+
g2_unlock(ctx);
213166

214167
/* Enable playback */
215168
/* CHNREG32(ch, 0) |= 0xc000; */
216169

217-
#if 0
218-
for (i=0xff; i>=vol; i--) {
219-
if ((i&7)==0) g2_fifo_wait();
220-
CHNREG32(ch, 40) = 0x24 | (i<<8);;
221-
}
222-
223-
g2_fifo_wait();
224-
#endif
225170
}
226171

227172
/* Stop the sound on a given channel */
228173
void aica_stop(int ch) {
229174
g2_fifo_wait();
230175
g2_write_32(CHNREGADDR(ch, 0),(g2_read_32(CHNREGADDR(ch, 0)) & ~0x4000) | 0x8000);
176+
/* AICA channels stops with delay */
177+
timer_spin_sleep(1);
231178
}
232179

233180

@@ -256,17 +203,10 @@ void aica_freq(int ch,int freq) {
256203

257204
/* Get channel position */
258205
int aica_get_pos(int ch) {
259-
#if 1
260206
/* Observe channel ch */
261207
g2_fifo_wait();
262208
g2_write_32(SNDREGADDR(0x280c),(g2_read_32(SNDREGADDR(0x280c))&0xffff00ff) | (ch<<8));
263209
g2_fifo_wait();
264210
/* Update position counters */
265211
return g2_read_32(SNDREGADDR(0x2814)) & 0xffff;
266-
#else
267-
/* Observe channel ch */
268-
g2_write_8(SNDREGADDR(0x280d),ch);
269-
/* Update position counters */
270-
return g2_read_32(SNDREGADDR(0x2814)) & 0xffff;
271-
#endif
272212
}

modules/ffmpeg/aica.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
#ifndef _AICA_H_
22
#define _AICA_H_
33

4-
#define AICA_MEM 0xa0800000
4+
#define AICA_MEM 0xa0800000
5+
#define AICA_MEM_SIZE 0x00200000
56

6-
#define SM_8BIT 1
77
#define SM_16BIT 0
8+
#define SM_8BIT 1
89
#define SM_ADPCM 2
10+
#define SM_ADPCM_LS 3
911

1012
void aica_play(int ch,int mode,unsigned long smpptr,int looptst,int loopend,int freq,int vol,int pan,int loopflag);
1113
void aica_stop(int ch);

modules/ffmpeg/config.sh

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
#
22
# ffmpeg library config for DreamShell
3-
# Copyright (C)2011-2020 SWAT
3+
# Copyright (C)2011-2020, 2024 SWAT
44
# http://www.dc-swat.ru
55
#
66
cd ./ffmpeg-0.6.3
77
./configure \
8-
--disable-debug --disable-network --disable-swscale \
8+
--disable-debug --disable-network --disable-swscale --enable-small \
99
--disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-encoders --disable-avdevice \
1010
--disable-protocols --disable-devices --disable-filters --disable-muxers --disable-bsfs --disable-hwaccels \
1111
--disable-amd3dnow --disable-amd3dnowext --disable-mmx --disable-mmx2 --disable-sse --disable-ssse3 \
@@ -20,24 +20,16 @@ cd ./ffmpeg-0.6.3
2020
--enable-decoder=h264 --enable-decoder=mpeg2video --enable-decoder=mpeg4 --enable-decoder=msmpeg4v1 --enable-decoder=ape \
2121
--enable-decoder=mpeg1video --enable-decoder=ac3 --enable-decoder=eac3 --enable-decoder=vp6 --enable-decoder=vp5 --enable-decoder=vp3 \
2222
--enable-decoder=aac --enable-decoder=eac3 --enable-decoder=flac --enable-decoder=flic --enable-decoder=mjpeg --enable-decoder=mjpegb \
23-
--enable-decoder=adpcm_4xm --enable-decoder=adpcm_adx --enable-decoder=mpegvideo --enable-decoder=theora --enable-decoder=dca \
24-
--enable-decoder=flac --enable-decoder=h261 --enable-decoder=flv --enable-decoder=cinepak --enable-decoder=bink --enable-decoder=truehd \
23+
--enable-decoder=mpegvideo --enable-decoder=theora --enable-decoder=dca --enable-decoder=h261 --enable-decoder=flv \
2524
--enable-decoder=msmpeg4v2 --enable-decoder=msmpeg4v3 --enable-decoder=h263 --enable-decoder=wmv1 --enable-decoder=wmv2 --enable-decoder=wmv3 \
2625
--enable-decoder=pcm_s16be --enable-decoder=pcm_s16le --enable-decoder=pcm_u16be --enable-decoder=pcm_u16le \
26+
--enable-decoder=adpcm_yamaha --enable-decoder=adpcm_ms \
2727
\
2828
--enable-demuxer=avi --enable-demuxer=ac3 --enable-demuxer=mp3 --enable-demuxer=mpegts --enable-demuxer=mpegvideo --enable-demuxer=matroska \
29-
--enable-demuxer=h264 --enable-demuxer=asf --enable-demuxer=m4v --enable-demuxer=aac --enable-demuxer=mjpeg \
29+
--enable-demuxer=h264 --enable-demuxer=m4v --enable-demuxer=aac --enable-demuxer=mjpeg \
3030
--enable-demuxer=h261 --enable-demuxer=pcm_u16le --enable-demuxer=pcm_s16be --enable-demuxer=pcm_s16le --enable-demuxer=pcm_u16be \
31-
--enable-demuxer=eac3 --enable-demuxer=ape --enable-demuxer=aiff --enable-demuxer=asf --enable-demuxer=ogg \
32-
--enable-demuxer=voc --enable-demuxer=eac3 --enable-demuxer=rm --enable-demuxer=avisynth \
31+
--enable-demuxer=ape --enable-demuxer=aiff --enable-demuxer=ogg \
32+
--enable-demuxer=eac3 --enable-demuxer=rm --enable-demuxer=avisynth \
3333
--enable-demuxer=flac --enable-demuxer=flic --enable-decoder=dts --enable-demuxer=h263 --enable-demuxer=flv \
34-
--enable-demuxer=dv --enable-demuxer=truehd --enable-demuxer=vc1 --enable-demuxer=bink --enable-demuxer=nc
35-
36-
# --enable-small --ar=kos-ar --as=kos-as --cc=kos-cc --ld=kos-ld \
37-
# --enable-decoder=adpcm_ms --enable-demuxer=pcm_u32le --enable-demuxer=pcm_f32le --enable-demuxer=pcm_s24be --enable-demuxer=pcm_s24le
38-
# --enable-decoder=pcm_f32be --enable-decoder=pcm_f32le --enable-decoder=pcm_s24le --enable-decoder=pcm_s32be --enable-decoder=pcm_s32le
39-
# --enable-decoder=pcm_s24be --enable-decoder=pcm_u24be --enable-decoder=pcm_u24le --enable-decoder=pcm_u32be --enable-decoder=pcm_u32le
40-
# --enable-demuxer=pcm_u24be --enable-demuxer=pcm_u24le --enable-demuxer=pcm_u32be --enable-demuxer=pcm_s32be --enable-demuxer=pcm_s32le
41-
# --enable-demuxer=pcm_f32be
42-
# --disable-mdct --disable-rdft --disable-fft --enable-decoder=mp3 --enable-decoder=mp2 --enable-decoder=mp1 --enable-decoder=vorbis
43-
#
34+
--enable-demuxer=dv --enable-demuxer=vc1
35+

modules/ffmpeg/ffmpeg-0.6.3/version.sh

100644100755
File mode changed.

modules/ffmpeg/module.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,14 @@ static URLProtocol fs_protocol = {
9090
file_get_file_handle
9191
};
9292

93-
9493
int ffplay(const char *filename, const char *force_format);
95-
//int sdl_ffplay(const char *filename);
9694

9795
int builtin_ffplay_cmd(int argc, char *argv[]) {
9896

9997
if(argc == 1) {
10098
ds_printf("Usage: %s option args...\n\n"
10199
"Options: \n"
102100
" -v, --version -Show ffmpeg version\n"
103-
//" -s, --sdl -Use SDL_ffmpeg (slow)\n"
104101
" -p, --play -Start playing\n\n"
105102
"Arguments: \n"
106103
" -i --format -Force format detection\n"
@@ -109,12 +106,11 @@ int builtin_ffplay_cmd(int argc, char *argv[]) {
109106
return CMD_NO_ARG;
110107
}
111108

112-
int play = 0, /*use_sdl = 0, */ver = 0;
109+
int play = 0, ver = 0;
113110
char *file = NULL, *format = NULL;
114111

115112
struct cfg_option options[] = {
116113
{"play", 'p', NULL, CFG_BOOL, (void *) &play, 0},
117-
//{"sdl", 's', NULL, CFG_BOOL, (void *) &use_sdl, 0},
118114
{"version", 'v', NULL, CFG_BOOL, (void *) &ver, 0},
119115
{"file", 'f', NULL, CFG_STR, (void *) &file, 0},
120116
{"format", 'i', NULL, CFG_STR, (void *) &format, 0},
@@ -128,11 +124,7 @@ int builtin_ffplay_cmd(int argc, char *argv[]) {
128124
}
129125

130126
if(play) {
131-
//if(use_sdl) {
132-
// sdl_ffplay(file);
133-
//} else {
134-
ffplay(file, format);
135-
//}
127+
ffplay(file, format);
136128
}
137129

138130
return CMD_OK;

0 commit comments

Comments
 (0)