summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--asfheader.c64
-rw-r--r--aviheader.c72
-rw-r--r--aviprint.c33
-rw-r--r--aviwrite.c11
-rw-r--r--dec_audio.c43
-rw-r--r--demux_asf.c55
-rw-r--r--demux_avi.c80
-rw-r--r--demux_mpg.c28
-rw-r--r--demuxer.c114
-rw-r--r--dll_init.c26
-rw-r--r--mplayer.c210
-rw-r--r--stheader.h5
-rw-r--r--vcd_read.h15
14 files changed, 420 insertions, 340 deletions
diff --git a/Makefile b/Makefile
index d895462d18..922787d625 100644
--- a/Makefile
+++ b/Makefile
@@ -20,8 +20,8 @@ PRG_CFG = codec-cfg
prefix = /usr/local
BINDIR = ${prefix}/bin
# BINDIR = /usr/local/bin
-SRCS = stream.c codec-cfg.c subreader.c linux/getch2.c linux/timer-lx.c linux/shmem.c xa/xa_gsm.c lirc_mp.c cfgparser.c mixer.c dvdauth.c spudec.c
-OBJS = stream.o codec-cfg.o subreader.o linux/getch2.o linux/timer-lx.o linux/shmem.o xa/xa_gsm.o lirc_mp.o cfgparser.o mixer.o dvdauth.o spudec.o
+SRCS = find_sub.c aviprint.c dll_init.c dec_audio.c aviwrite.c aviheader.c asfheader.c demux_avi.c demux_asf.c demux_mpg.c demuxer.c stream.c codec-cfg.c subreader.c linux/getch2.c linux/timer-lx.c linux/shmem.c xa/xa_gsm.c lirc_mp.c cfgparser.c mixer.c dvdauth.c spudec.c
+OBJS = find_sub.o aviprint.o dll_init.o dec_audio.o aviwrite.o aviheader.o asfheader.o demux_avi.o demux_asf.o demux_mpg.o demuxer.o stream.o codec-cfg.o subreader.o linux/getch2.o linux/timer-lx.o linux/shmem.o xa/xa_gsm.o lirc_mp.o cfgparser.o mixer.o dvdauth.o spudec.o
CFLAGS = $(OPTFLAGS) $(CSS_INC) -Iloader -Ilibvo # -Wall
A_LIBS = -Lmp3lib -lMP3 -Llibac3 -lac3
VO_LIBS = -Llibvo -lvo $(X_LIBS)
diff --git a/asfheader.c b/asfheader.c
index 6f2d3bb708..55faa1404d 100644
--- a/asfheader.c
+++ b/asfheader.c
@@ -1,5 +1,21 @@
// .asf fileformat docs from http://divx.euro.ru
+
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int verbose; // defined in mplayer.c
+
+#include "stream.h"
+#include "demuxer.h"
+
+#include "wine/mmreg.h"
+#include "wine/avifmt.h"
+#include "wine/vfw.h"
+
+#include "codec-cfg.h"
+#include "stheader.h"
+
typedef struct __attribute__((packed)) {
unsigned char guid[16];
unsigned long long size;
@@ -38,38 +54,21 @@ typedef struct __attribute__((packed)) {
} ASF_stream_header_t;
-ASF_header_t asfh;
-ASF_obj_header_t objh;
-ASF_file_header_t fileh;
-ASF_stream_header_t streamh;
+static ASF_header_t asfh;
+static ASF_obj_header_t objh;
+static ASF_file_header_t fileh;
+static ASF_stream_header_t streamh;
+
unsigned char* asf_packet=NULL;
-//int asf_video_id=-1;
int asf_scrambling_h=1;
int asf_scrambling_w=1;
int asf_scrambling_b=1;
+int asf_packetsize=0;
+
+//int i;
-int i;
-
-void asf_descrambling(unsigned char *src,int len){
- unsigned char *dst=malloc(len);
- unsigned char *s2=src;
- int i=0,x,y;
- while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){
-// printf("descrambling! (w=%d b=%d)\n",w,asf_scrambling_b);
- //i+=asf_scrambling_h*asf_scrambling_w;
- for(x=0;x<asf_scrambling_w;x++)
- for(y=0;y<asf_scrambling_h;y++){
- memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b);
- i+=asf_scrambling_b;
- }
- s2+=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b;
- }
- //if(i<len) memcpy(dst+i,src+i,len-i);
- memcpy(src,dst,i);
- free(dst);
-}
-char* asf_chunk_type(unsigned char* guid){
+static char* asf_chunk_type(unsigned char* guid){
switch(*((unsigned int*)guid)){
case 0xF8699E40: return "guid_audio_stream";
case 0xBC19EFC0: return "guid_video_stream";
@@ -85,7 +84,7 @@ char* asf_chunk_type(unsigned char* guid){
return NULL;
}
-int asf_check_header(){
+int asf_check_header(demuxer_t *demuxer){
unsigned char asfhdrguid[16]={0x30,0x26,0xB2,0x75,0x8E,0x66,0xCF,0x11,0xA6,0xD9,0x00,0xAA,0x00,0x62,0xCE,0x6C};
stream_read(demuxer->stream,(char*) &asfh,sizeof(asfh)); // header obj
// for(i=0;i<16;i++) printf(" %02X",temp[i]);printf("\n");
@@ -101,7 +100,7 @@ int asf_check_header(){
return 1;
}
-int read_asf_header(){
+int read_asf_header(demuxer_t *demuxer){
unsigned char buffer[512];
#if 1
@@ -166,12 +165,13 @@ if(verbose){
case 0x8CABDCA1: // guid_file_header
stream_read(demuxer->stream,(char*) &fileh,sizeof(fileh));
if(verbose) printf("ASF: packets: %d flags: %d pack_size: %d frame_size: %d\n",(int)fileh.packets,(int)fileh.flags,(int)fileh.packetsize,(int)fileh.frame_size);
- asf_packet=malloc(fileh.packetsize); // !!!
+ asf_packetsize=fileh.packetsize;
+ asf_packet=malloc(asf_packetsize); // !!!
break;
case 0x75b22636: // guid_data_chunk
- avi_header.movi_start=stream_tell(demuxer->stream)+26;
- avi_header.movi_end=endpos;
- if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",avi_header.movi_start,avi_header.movi_end);
+ demuxer->movi_start=stream_tell(demuxer->stream)+26;
+ demuxer->movi_end=endpos;
+ if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",demuxer->movi_start,demuxer->movi_end);
break;
// case 0x33000890: return "guid_index_chunk";
diff --git a/aviheader.c b/aviheader.c
index bb171c1587..1538314222 100644
--- a/aviheader.c
+++ b/aviheader.c
@@ -1,7 +1,25 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int verbose; // defined in mplayer.c
+
+#include "stream.h"
+#include "demuxer.h"
+
+#include "wine/mmreg.h"
+#include "wine/avifmt.h"
+#include "wine/vfw.h"
+
+#include "codec-cfg.h"
+#include "stheader.h"
+
#define MIN(a,b) (((a)<(b))?(a):(b))
-void read_avi_header(int index_mode){
+static MainAVIHeader avih;
+
+void read_avi_header(demuxer_t *demuxer,int index_mode){
sh_audio_t *sh_audio=NULL;
sh_video_t *sh_video=NULL;
int stream_id=-1;
@@ -9,7 +27,7 @@ int idxfix_videostream=0;
int idxfix_divx=0;
//---- AVI header:
-avi_header.idx_size=0;
+demuxer->idx_size=0;
while(1){
int id=stream_read_dword_le(demuxer->stream);
int chunksize,size2;
@@ -23,9 +41,9 @@ while(1){
if(verbose>=2) printf("LIST %.4s len=%d\n",&id,len);
if(id==listtypeAVIMOVIE){
// found MOVI header
- avi_header.movi_start=stream_tell(demuxer->stream);
- avi_header.movi_end=avi_header.movi_start+len;
- if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",avi_header.movi_start,avi_header.movi_end);
+ demuxer->movi_start=stream_tell(demuxer->stream);
+ demuxer->movi_end=demuxer->movi_start+len;
+ if(verbose>=1) printf("Found movie at 0x%X - 0x%X\n",demuxer->movi_start,demuxer->movi_end);
len=(len+1)&(~1);
stream_skip(demuxer->stream,len);
}
@@ -36,9 +54,9 @@ while(1){
chunksize=(size2+1)&(~1);
switch(id){
case ckidAVIMAINHDR: // read 'avih'
- stream_read(demuxer->stream,(char*) &avi_header.avih,MIN(size2,sizeof(avi_header.avih)));
- chunksize-=MIN(size2,sizeof(avi_header.avih));
- if(verbose) print_avih(&avi_header.avih);
+ stream_read(demuxer->stream,(char*) &avih,MIN(size2,sizeof(avih)));
+ chunksize-=MIN(size2,sizeof(avih));
+ if(verbose) print_avih(&avih);
break;
case ckidSTREAMHEADER: { // read 'strh'
AVIStreamHeader h;
@@ -79,6 +97,8 @@ while(1){
case mmioFOURCC('d', 'i', 'v', '6'):
case mmioFOURCC('M', 'P', '4', '3'):
case mmioFOURCC('m', 'p', '4', '3'):
+ case mmioFOURCC('M', 'P', '4', '2'):
+ case mmioFOURCC('m', 'p', '4', '2'):
case mmioFOURCC('A', 'P', '4', '1'):
idxfix_divx=1; // we can fix keyframes only for divx coded files!
}
@@ -95,13 +115,13 @@ while(1){
break;
}
case ckidAVINEWINDEX: if(index_mode){
- avi_header.idx_size=size2>>4;
+ demuxer->idx_size=size2>>4;
if(verbose>=1) printf("Reading INDEX block, %d chunks for %d frames\n",
- avi_header.idx_size,avi_header.avih.dwTotalFrames);
- avi_header.idx=malloc(avi_header.idx_size<<4);
- stream_read(demuxer->stream,(char*)avi_header.idx,avi_header.idx_size<<4);
- chunksize-=avi_header.idx_size<<4;
- if(verbose>=2) print_index();
+ demuxer->idx_size,avih.dwTotalFrames);
+ demuxer->idx=malloc(demuxer->idx_size<<4);
+ stream_read(demuxer->stream,(char*)demuxer->idx,demuxer->idx_size<<4);
+ chunksize-=demuxer->idx_size<<4;
+ if(verbose>=2) print_index(demuxer->idx,demuxer->idx_size);
break;
}
}
@@ -110,20 +130,20 @@ while(1){
}
-if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){
+if(index_mode>=2 || (demuxer->idx_size==0 && index_mode==1)){
// build index for file:
stream_reset(demuxer->stream);
- stream_seek(demuxer->stream,avi_header.movi_start);
+ stream_seek(demuxer->stream,demuxer->movi_start);
- avi_header.idx_pos=0;
- avi_header.idx=NULL;
+ demuxer->idx_pos=0;
+ demuxer->idx=NULL;
while(1){
int id,len,skip;
AVIINDEXENTRY* idx;
unsigned char c;
demuxer->filepos=stream_tell(demuxer->stream);
- if(demuxer->filepos>=avi_header.movi_end) break;
+ if(demuxer->filepos>=demuxer->movi_end) break;
id=stream_read_dword_le(demuxer->stream);
len=stream_read_dword_le(demuxer->stream);
if(id==mmioFOURCC('L','I','S','T')){
@@ -131,12 +151,12 @@ if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){
continue;
}
if(stream_eof(demuxer->stream)) break;
- if(avi_header.idx_pos<=avi_header.idx_size){
- avi_header.idx_size+=32;
- avi_header.idx=realloc(avi_header.idx,avi_header.idx_size*sizeof(AVIINDEXENTRY));
- if(!avi_header.idx){avi_header.idx_pos=0; break;} // error!
+ if(demuxer->idx_pos<=demuxer->idx_size){
+ demuxer->idx_size+=32;
+ demuxer->idx=realloc(demuxer->idx,demuxer->idx_size*sizeof(AVIINDEXENTRY));
+ if(!demuxer->idx){demuxer->idx_pos=0; break;} // error!
}
- idx=&avi_header.idx[avi_header.idx_pos++];
+ idx=&((AVIINDEXENTRY *)demuxer->idx)[demuxer->idx_pos++];
idx->ckid=id;
idx->dwFlags=AVIIF_KEYFRAME; // FIXME
idx->dwChunkOffset=demuxer->filepos;
@@ -163,8 +183,8 @@ if(index_mode>=2 || (avi_header.idx_size==0 && index_mode==1)){
skip=(len+1)&(~1); // total bytes in this chunk
stream_seek(demuxer->stream,8+demuxer->filepos+skip);
}
- avi_header.idx_size=avi_header.idx_pos;
- printf("AVI: Generated index table for %d chunks!\n",avi_header.idx_size);
+ demuxer->idx_size=demuxer->idx_pos;
+ printf("AVI: Generated index table for %d chunks!\n",demuxer->idx_size);
}
}
diff --git a/aviprint.c b/aviprint.c
index 6b5fab107d..21e2d81366 100644
--- a/aviprint.c
+++ b/aviprint.c
@@ -1,3 +1,20 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+
+//extern int verbose; // defined in mplayer.c
+
+#include "stream.h"
+#include "demuxer.h"
+
+#include "wine/mmreg.h"
+#include "wine/avifmt.h"
+#include "wine/vfw.h"
+
+//#include "codec-cfg.h"
+//#include "stheader.h"
+
+
void print_avih(MainAVIHeader *h){
printf("======= AVI Header =======\n");
printf("us/frame: %d (fps=%5.3f)\n",h->dwMicroSecPerFrame,1000000.0f/(float)h->dwMicroSecPerFrame);
@@ -56,15 +73,15 @@ void print_video_header(BITMAPINFOHEADER *h){
}
-void print_index(){
+void print_index(AVIINDEXENTRY *idx,int idx_size){
int i;
- for(i=0;i<avi_header.idx_size;i++){
- printf("%5d: %.4s %4X %08X (%08X) %d\n",i,
- &avi_header.idx[i].ckid,
- avi_header.idx[i].dwFlags,
- avi_header.idx[i].dwChunkOffset,
- avi_header.idx[i].dwChunkOffset+avi_header.movi_start,
- avi_header.idx[i].dwChunkLength
+ for(i=0;i<idx_size;i++){
+ printf("%5d: %.4s %4X %08X %d\n",i,
+ &idx[i].ckid,
+ idx[i].dwFlags,
+ idx[i].dwChunkOffset,
+// idx[i].dwChunkOffset+demuxer->movi_start,
+ idx[i].dwChunkLength
);
}
}
diff --git a/aviwrite.c b/aviwrite.c
index 6826bcce0a..beb431af8b 100644
--- a/aviwrite.c
+++ b/aviwrite.c
@@ -1,4 +1,15 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "wine/mmreg.h"
+#include "wine/avifmt.h"
+#include "wine/vfw.h"
+
+extern char* encode_name;
+extern char* encode_index_name;
+
void write_avi_chunk(FILE *f,unsigned int id,int len,void* data){
fwrite(&id,4,1,f);
diff --git a/dec_audio.c b/dec_audio.c
index 6c5391fbc6..6aaf27ebd8 100644
--- a/dec_audio.c
+++ b/dec_audio.c
@@ -1,4 +1,40 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "config.h"
+
+extern int verbose; // defined in mplayer.c
+
+#include "stream.h"
+#include "demuxer.h"
+
+#include "wine/mmreg.h"
+#include "wine/avifmt.h"
+#include "wine/vfw.h"
+
+#include "codec-cfg.h"
+#include "stheader.h"
+
+#include "mp3lib/mp3.h"
+#include "libac3/ac3.h"
+
+#include "alaw.c"
+#include "xa/xa_gsm.h"
+
+static sh_audio_t* ac3_audio_sh=NULL;
+
+// AC3 decoder buffer callback:
+static void ac3_fill_buffer(uint8_t **start,uint8_t **end){
+ int len=ds_get_packet(ac3_audio_sh->ds,start);
+ //printf("<ac3:%d>\n",len);
+ if(len<0)
+ *start = *end = NULL;
+ else
+ *end = *start + len;
+}
+
+
int init_audio(sh_audio_t *sh_audio){
int driver=sh_audio->codec->driver;
@@ -79,6 +115,7 @@ case 8: {
}
case 3: {
// Dolby AC3 audio:
+ ac3_audio_sh=sh_audio; // save sh_audio for the callback:
ac3_config.fill_buffer_callback = ac3_fill_buffer;
ac3_config.num_output_ch = 2;
ac3_config.flags = 0;
@@ -91,7 +128,7 @@ case 3: {
ac3_init();
sh_audio->ac3_frame = ac3_decode_frame();
if(sh_audio->ac3_frame){
- sh_audio->samplerate=sh_audio->ac3_frame->sampling_rate;
+ sh_audio->samplerate=((ac3_frame_t*)sh_audio->ac3_frame)->sampling_rate;
sh_audio->channels=2;
} else {
driver=0; // bad frame -> disable audio
@@ -179,7 +216,7 @@ int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int maxlen){
{ unsigned char buf[65]; // 65 bytes / frame
len=0;
while(len<OUTBURST){
- if(demux_read_data(d_audio,buf,65)!=65) break; // EOF
+ if(demux_read_data(sh_audio->ds,buf,65)!=65) break; // EOF
XA_MSGSM_Decoder(buf,(unsigned short *) buf); // decodes 65 byte -> 320 short
// XA_GSM_Decoder(buf,(unsigned short *) &sh_audio->a_buffer[sh_audio->a_buffer_len]); // decodes 33 byte -> 160 short
len+=2*320;
@@ -192,7 +229,7 @@ int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int maxlen){
//printf("{2:%d}",avi_header.idx_pos);fflush(stdout);
if(sh_audio->ac3_frame){
len = 256 * 6 *sh_audio->channels*sh_audio->samplesize;
- memcpy(buf,sh_audio->ac3_frame->audio_data,len);
+ memcpy(buf,((ac3_frame_t*)sh_audio->ac3_frame)->audio_data,len);
sh_audio->ac3_frame=NULL;
}
//printf("{3:%d}",avi_header.idx_pos);fflush(stdout);
diff --git a/demux_asf.c b/demux_asf.c
index 9d9fed7c8c..6a72053bb3 100644
--- a/demux_asf.c
+++ b/demux_asf.c
@@ -1,5 +1,21 @@
// ASF file parser for DEMUXER v0.3 by A'rpi/ESP-team
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int verbose; // defined in mplayer.c
+
+#include "stream.h"
+#include "demuxer.h"
+
+// defined at asfheader.c:
+extern unsigned char* asf_packet;
+extern int asf_scrambling_h;
+extern int asf_scrambling_w;
+extern int asf_scrambling_b;
+extern int asf_packetsize;
+
+
// based on asf file-format doc by Eugene [http://divx.euro.ru]
//static float avi_pts_frametime=1.0f/25.0f;
@@ -15,6 +31,25 @@ typedef struct __attribute__((packed)) {
unsigned char flag;
} ASF_segmhdr_t;
+static void asf_descrambling(unsigned char *src,int len){
+ unsigned char *dst=malloc(len);
+ unsigned char *s2=src;
+ int i=0,x,y;
+ while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){
+// printf("descrambling! (w=%d b=%d)\n",w,asf_scrambling_b);
+ //i+=asf_scrambling_h*asf_scrambling_w;
+ for(x=0;x<asf_scrambling_w;x++)
+ for(y=0;y<asf_scrambling_h;y++){
+ memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b);
+ i+=asf_scrambling_b;
+ }
+ s2+=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b;
+ }
+ //if(i<len) memcpy(dst+i,src+i,len-i);
+ memcpy(src,dst,i);
+ free(dst);
+}
+
static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,int id,int seq,unsigned long time,unsigned short dur,int offs){
demux_stream_t *ds=NULL;
@@ -22,18 +57,18 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
if(verbose>=4) printf("demux_asf.read_packet: id=%d seq=%d len=%d\n",id,seq,len);
if(demux->video->id==-1)
- if(avi_header.v_streams[id])
+ if(demux->v_streams[id])
demux->video->id=id;
if(demux->audio->id==-1)
- if(avi_header.a_streams[id])
+ if(demux->a_streams[id])
demux->audio->id=id;
if(id==demux->audio->id){
// audio
ds=demux->audio;
if(!ds->sh){
- ds->sh=avi_header.a_streams[id];
+ ds->sh=demux->a_streams[id];
if(verbose) printf("Auto-selected ASF audio ID = %d\n",ds->id);
}
} else
@@ -41,7 +76,7 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
// video
ds=demux->video;
if(!ds->sh){
- ds->sh=avi_header.v_streams[id];
+ ds->sh=demux->v_streams[id];
if(verbose) printf("Auto-selected ASF video ID = %d\n",ds->id);
}
}
@@ -97,19 +132,19 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
int demux_asf_fill_buffer(demuxer_t *demux){
demux->filepos=stream_tell(demux->stream);
- if(demux->filepos>=demux->endpos){
+ if(demux->filepos>=demux->movi_end){
demux->stream->eof=1;
return 0;
}
- stream_read(demux->stream,asf_packet,(int)fileh.packetsize);
+ stream_read(demux->stream,asf_packet,asf_packetsize);
if(demux->stream->eof) return 0; // EOF
if(asf_packet[0]==0x82){
unsigned char flags=asf_packet[3];
unsigned char segtype=asf_packet[4];
unsigned char* p=&asf_packet[5];
- unsigned char* p_end=p+(int)fileh.packetsize;
+ unsigned char* p_end=p+asf_packetsize;
unsigned long time;
unsigned short duration;
int segs=1;
@@ -131,11 +166,11 @@ int demux_asf_fill_buffer(demuxer_t *demux){
// Explicit (absoulte) packet size
plen=p[0]|(p[1]<<8); p+=2;
if(verbose>1)printf("Explicit packet size specified: %d \n",plen);
- if(plen>fileh.packetsize) printf("Warning! plen>packetsize! (%d>%d) \n",plen,(int)fileh.packetsize);
+ if(plen>asf_packetsize) printf("Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize);
if(flags&(8|16)){
padding=p[0];p++;
if(flags&16){ padding|=p[0]<<8; p++;}
- if(verbose)printf("Warning! explicit=%d padding=%d \n",plen,fileh.packetsize-padding);
+ if(verbose)printf("Warning! explicit=%d padding=%d \n",plen,asf_packetsize-padding);
}
} else {
// Padding (relative) size
@@ -145,7 +180,7 @@ int demux_asf_fill_buffer(demuxer_t *demux){
if(flags&16){
padding=p[0]|(p[1]<<8);p+=2;
}
- plen=fileh.packetsize-padding;
+ plen=asf_packetsize-padding;
}
time=*((unsigned long*)p);p+=4;
diff --git a/demux_avi.c b/demux_avi.c
index 3a1b564f4c..8db141bc52 100644
--- a/demux_avi.c
+++ b/demux_avi.c
@@ -1,44 +1,51 @@
// AVI file parser for DEMUXER v2.6 by A'rpi/ESP-team
-//static float avi_pts_frametime=1.0f/25.0f;
-static float avi_audio_pts=0;
-static float avi_video_pts=0;
+#include <stdio.h>
+#include <stdlib.h>
-static int skip_video_frames=0;
+extern int verbose; // defined in mplayer.c
-static inline int avi_stream_id(unsigned int id){
- unsigned char *p=(unsigned char *)&id;
- unsigned char a,b;
- a=p[0]-'0'; b=p[1]-'0';
- if(a>9 || b>9) return 100; // invalid ID
- return a*10+b;
-}
+#include "stream.h"
+#include "demuxer.h"
+
+#include "wine/mmreg.h"
+#include "wine/avifmt.h"
+#include "wine/vfw.h"
+
+#include "codec-cfg.h"
+#include "stheader.h"
+
+//static float avi_pts_frametime=1.0f/25.0f;
+float avi_audio_pts=0;
+float avi_video_pts=0;
+//float avi_video_ftime=0.04;
+int skip_video_frames=0;
// Select ds from ID
-static inline demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
+demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
int stream_id=avi_stream_id(id);
// printf("demux_avi_select_stream(%d) {a:%d/v:%d}\n",stream_id,
// demux->audio->id,demux->video->id);
if(demux->video->id==-1)
- if(avi_header.v_streams[stream_id])
+ if(demux->v_streams[stream_id])
demux->video->id=stream_id;
if(demux->audio->id==-1)
- if(avi_header.a_streams[stream_id])
+ if(demux->a_streams[stream_id])
demux->audio->id=stream_id;
if(stream_id==demux->audio->id){
if(!demux->audio->sh){
- demux->audio->sh=avi_header.a_streams[stream_id];
+ demux->audio->sh=demux->a_streams[stream_id];
if(verbose) printf("Auto-selected AVI audio ID = %d\n",demux->audio->id);
}
return demux->audio;
}
if(stream_id==demux->video->id){
if(!demux->video->sh){
- demux->video->sh=avi_header.v_streams[stream_id];
+ demux->video->sh=demux->v_streams[stream_id];
if(verbose) printf("Auto-selected AVI video ID = %d\n",demux->video->id);
}
return demux->video;
@@ -74,7 +81,9 @@ static int demux_avi_read_packet(demuxer_t *demux,unsigned int id,unsigned int l
//avi_video_pts+=avi_pts_frametime;
//avi_video_pts+=(float)avi_header.video.dwScale/(float)avi_header.video.dwRate;
//avi_video_pts+=((sh_video_t*)ds->sh)->frametime;
+// FIXME!!!
avi_video_pts+=(float)((sh_video_t*)(demux->video->sh))->video.dwScale/(float)((sh_video_t*)(demux->video->sh))->video.dwRate;
+// avi_video_pts+=avi_video_ftime;
avi_audio_pts=avi_video_pts;
}
@@ -108,19 +117,19 @@ int ret=0;
do{
AVIINDEXENTRY *idx=NULL;
demux->filepos=stream_tell(demux->stream);
- if(demux->filepos>=demux->endpos){
+ if(demux->filepos>=demux->movi_end){
demux->stream->eof=1;
return 0;
}
if(stream_eof(demux->stream)) return 0;
- if(avi_header.idx_size>0 && avi_header.idx_pos<avi_header.idx_size){
+ if(demux->idx_size>0 && demux->idx_pos<demux->idx_size){
unsigned int pos;
- //if(avi_header.idx_pos<0) printf("Fatal! idx_pos=%d\n",avi_header.idx_pos);
+ //if(demux->idx_pos<0) printf("Fatal! idx_pos=%d\n",demux->idx_pos);
- idx=&avi_header.idx[avi_header.idx_pos++];
+ idx=&((AVIINDEXENTRY *)demux->idx)[demux->idx_pos++];
- //printf("[%d]",avi_header.idx_pos);fflush(stdout);
+ //printf("[%d]",demux->idx_pos);fflush(stdout);
//stream_seek(demux->stream,idx.dwChunkOffset);
//printf("IDX pos=%X idx.pos=%X idx.size=%X idx.flags=%X\n",demux->filepos,
@@ -134,8 +143,8 @@ do{
continue; // skip this chunk
}
- pos=idx->dwChunkOffset+avi_header.idx_offset;
- if(pos<avi_header.movi_start || pos>=avi_header.movi_end){
+ pos=idx->dwChunkOffset+demux->idx_offset;
+ if(pos<demux->movi_start || pos>=demux->movi_end){
printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos);
continue;
}
@@ -165,7 +174,7 @@ do{
continue;
}
}
- ret=demux_avi_read_packet(demux,id,len,avi_header.idx_pos-1);
+ ret=demux_avi_read_packet(demux,id,len,demux->idx_pos-1);
if(!ret && skip_video_frames<=0)
if(--max_packs==0){
demux->stream->eof=1;
@@ -191,13 +200,14 @@ do{
int idx_pos=0;
demux->filepos=stream_tell(demux->stream);
- if(ds==demux->video) idx_pos=avi_header.idx_pos_a++; else
- if(ds==demux->audio) idx_pos=avi_header.idx_pos_v++; else
- idx_pos=avi_header.idx_pos++;
+ if(ds==demux->video) idx_pos=demux->idx_pos_a++; else
+ if(ds==demux->audio) idx_pos=demux->idx_pos_v++; else
+ idx_pos=demux->idx_pos++;
- if(avi_header.idx_size>0 && idx_pos<avi_header.idx_size){
+ if(demux->idx_size>0 && idx_pos<demux->idx_size){
unsigned int pos;
- idx=&avi_header.idx[idx_pos];
+ idx=&((AVIINDEXENTRY *)demux->idx)[idx_pos];
+// idx=&demux->idx[idx_pos];
if(idx->dwFlags&AVIIF_LIST){
// LIST
@@ -208,8 +218,8 @@ do{
continue; // skip this chunk
}
- pos=idx->dwChunkOffset+avi_header.idx_offset;
- if(pos<avi_header.movi_start || pos>=avi_header.movi_end){
+ pos=idx->dwChunkOffset+demux->idx_offset;
+ if(pos<demux->movi_start || pos>=demux->movi_end){
printf("ChunkOffset out of range! current=0x%X idx=0x%X \n",demux->filepos,pos);
continue;
}
@@ -257,8 +267,8 @@ unsigned int len;
int ret=0;
int *fpos=NULL;
- if(ds==demux->video) fpos=&avi_header.idx_pos_a; else
- if(ds==demux->audio) fpos=&avi_header.idx_pos_v; else
+ if(ds==demux->video) fpos=&demux->idx_pos_a; else
+ if(ds==demux->audio) fpos=&demux->idx_pos_v; else
return 0;
stream_seek(demux->stream,fpos[0]);
@@ -266,7 +276,7 @@ int *fpos=NULL;
do{
demux->filepos=stream_tell(demux->stream);
- if(demux->filepos>=demux->endpos){
+ if(demux->filepos>=demux->movi_end){
demux->stream->eof=1;
return 0;
}
@@ -281,7 +291,7 @@ do{
if(ds==demux_avi_select_stream(demux,id)){
// read it!
- ret=demux_avi_read_packet(demux,id,len,avi_header.idx_pos-1);
+ ret=demux_avi_read_packet(demux,id,len,demux->idx_pos-1);
} else {
// skip it!
int skip=(len+1)&(~1); // total bytes in this chunk
diff --git a/demux_mpg.c b/demux_mpg.c
index 1592c03270..1cc11a93c0 100644
--- a/demux_mpg.c
+++ b/demux_mpg.c
@@ -1,5 +1,13 @@
// MPG/VOB file parser for DEMUXER v2.5 by A'rpi/ESP-team
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int verbose; // defined in mplayer.c
+
+#include "stream.h"
+#include "demuxer.h"
+
//#define MAX_PS_PACKETSIZE 2048
#define MAX_PS_PACKETSIZE (224*1024)
@@ -128,9 +136,9 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
// subtitle:
aid&=0x1F;
- if(!avi_header.s_streams[aid]){
+ if(!demux->s_streams[aid]){
printf("==> Found subtitle: %d\n",aid);
- avi_header.s_streams[aid]=1;
+ demux->s_streams[aid]=1;
// new_sh_audio(aid);
}
@@ -144,13 +152,13 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
// aid=128+(aid&0x7F);
// aid=0x80..0xBF
- if(!avi_header.a_streams[aid]) new_sh_audio(aid);
+ if(!demux->a_streams[aid]) new_sh_audio(aid);
if(demux->audio->id==-1) demux->audio->id=aid;
if(demux->audio->id==aid){
// int type;
ds=demux->audio;
- if(!ds->sh) ds->sh=avi_header.a_streams[aid];
+ if(!ds->sh) ds->sh=demux->a_streams[aid];
// READ Packet: Skip additional audio header data:
c=stream_read_char(demux->stream);//type=c;
c=stream_read_char(demux->stream);//type|=c<<8;
@@ -197,22 +205,22 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
if(id>=0x1C0 && id<=0x1DF){
// mpeg audio
int aid=id-0x1C0;
- if(!avi_header.a_streams[aid]) new_sh_audio(aid);
+ if(!demux->a_streams[aid]) new_sh_audio(aid);
if(demux->audio->id==-1) demux->audio->id=aid;
if(demux->audio->id==aid){
ds=demux->audio;
- if(!ds->sh) ds->sh=avi_header.a_streams[aid];
+ if(!ds->sh) ds->sh=demux->a_streams[aid];
if(ds->type==-1) ds->type=1;
}
} else
if(id>=0x1E0 && id<=0x1EF){
// mpeg video
int aid=id-0x1E0;
- if(!avi_header.v_streams[aid]) new_sh_video(aid);
+ if(!demux->v_streams[aid]) new_sh_video(aid);
if(demux->video->id==-1) demux->video->id=aid;
if(demux->video->id==aid){
ds=demux->video;
- if(!ds->sh) ds->sh=avi_header.v_streams[aid];
+ if(!ds->sh) ds->sh=demux->v_streams[aid];
}
}
@@ -234,8 +242,8 @@ static int demux_mpg_read_packet(demuxer_t *demux,int id){
return 0;
}
-static int num_elementary_packets100=0;
-static int num_elementary_packets101=0;
+int num_elementary_packets100=0;
+int num_elementary_packets101=0;
int demux_mpg_es_fill_buffer(demuxer_t *demux){
//if(demux->type==DEMUXER_TYPE_MPEG_ES)
diff --git a/demuxer.c b/demuxer.c
index 54180c01e6..c52c22c8d3 100644
--- a/demuxer.c
+++ b/demuxer.c
@@ -1,53 +1,12 @@
//=================== DEMUXER v2.5 =========================
-#define MAX_PACKS 2048
-#define MAX_PACK_BYTES 0x400000
+#include <stdio.h>
+#include <stdlib.h>
-typedef struct demux_packet_st {
- int len;
- float pts;
- int pos; // pozicio indexben (AVI) ill. fileban (MPG)
- unsigned char* buffer;
- struct demux_packet_st* next;
-} demux_packet_t;
+extern int verbose; // defined in mplayer.c
-inline demux_packet_t* new_demux_packet(int len){
- demux_packet_t* dp=malloc(sizeof(demux_packet_t));
- dp->len=len;
- dp->buffer=malloc(len);
- dp->next=NULL;
- dp->pts=0;
- dp->pos=0;
- return dp;
-}
-
-inline void free_demux_packet(demux_packet_t* dp){
- free(dp->buffer);
- free(dp);
-}
-
-typedef struct {
- int buffer_pos; // current buffer position
- int buffer_size; // current buffer size
- unsigned char* buffer; // current buffer
- float pts; // current buffer's pts
- int eof; // end of demuxed stream? (true if all buffer empty)
- int pos; // position in the input stream (file)
- int dpos; // position in the demuxed stream
-//---------------
- int packs; // number of packets in buffer
- int bytes; // total bytes of packets in buffer
- demux_packet_t *first; // read to current buffer from here
- demux_packet_t *last; // append new packets from input stream to here
- int id; // stream ID (for multiple audio/video streams)
- int type; // stream type (currently used only for audio)
- struct demuxer_st *demuxer; // parent demuxer structure (stream handler)
-// ---- asf -----
- demux_packet_t *asf_packet; // read asf fragments here
- int asf_seq;
-// ---- stream header ----
- void* sh;
-} demux_stream_t;
+#include "stream.h"
+#include "demuxer.h"
demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){
demux_stream_t* ds=malloc(sizeof(demux_stream_t));
@@ -72,33 +31,9 @@ demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){
return ds;
}
-#define DEMUXER_TYPE_UNKNOWN 0
-#define DEMUXER_TYPE_MPEG_ES 1
-#define DEMUXER_TYPE_MPEG_PS 2
-#define DEMUXER_TYPE_AVI 3
-#define DEMUXER_TYPE_AVI_NI 4
-#define DEMUXER_TYPE_AVI_NINI 5
-#define DEMUXER_TYPE_ASF 6
-
-#define DEMUXER_TIME_NONE 0
-#define DEMUXER_TIME_PTS 1
-#define DEMUXER_TIME_FILE 2
-#define DEMUXER_TIME_BPS 3
-
-typedef struct demuxer_st {
- stream_t *stream;
- int synced; // stream synced (used by mpeg)
- int filepos; // input stream current pos.
- int endpos; // input stream end pos. (return EOF fi filepos>endpos)
- int type; // mpeg system stream, mpeg elementary s., avi raw, avi indexed
-// int time_src;// time source (pts/file/bps)
- demux_stream_t *audio;
- demux_stream_t *video;
- demux_stream_t *sub;
-} demuxer_t;
-
demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id){
demuxer_t *d=malloc(sizeof(demuxer_t));
+ memset(d,0,sizeof(demuxer_t));
d->stream=stream;
d->synced=0;
d->filepos=0;
@@ -109,7 +44,7 @@ demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id){
return d;
}