summaryrefslogtreecommitdiffstats
path: root/mplayer.c
diff options
context:
space:
mode:
authorarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-04-23 03:42:17 +0000
committerarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-04-23 03:42:17 +0000
commitb1b6b1fafa2b0d7cb2b28fd8fe7d7b4dc525f46e (patch)
tree422801d19397532c59e0d36a5b024a9919931f9c /mplayer.c
parent4ebd355ec3e456c09329d1d28070dd0e8d9d65c7 (diff)
downloadmpv-b1b6b1fafa2b0d7cb2b28fd8fe7d7b4dc525f46e.tar.bz2
mpv-b1b6b1fafa2b0d7cb2b28fd8fe7d7b4dc525f46e.tar.xz
stage#1 completed: c files no more included from mplayer.c
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@588 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'mplayer.c')
-rw-r--r--mplayer.c210
1 files changed, 108 insertions, 102 deletions
diff --git a/mplayer.c b/mplayer.c
index d1bce11746..443026a72e 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -3,12 +3,6 @@
// Enable ALSA emulation (using 32kB audio buffer) - timer testing only
//#define SIMULATE_ALSA
-#ifdef USE_XMMP_AUDIO
-#define OUTBURST 4096
-#else
-//#define OUTBURST 1024
-#define OUTBURST 512
-#endif
#include <stdio.h>
#include <stdlib.h>
@@ -90,6 +84,11 @@ int verbose=0;
#define ABS(x) (((x)>=0)?(x):(-(x)))
+static subtitle* subtitles=NULL;
+void find_sub(subtitle* subtitles,int key);
+
+
+#if 0
//**************************************************************************//
// .SUB
//**************************************************************************//
@@ -185,6 +184,7 @@ void find_sub(int key){
vo_sub=NULL; // no sub here
}
+#endif
//**************************************************************************//
// Config file
@@ -234,15 +234,17 @@ static int max_framesize=0;
//**************************************************************************//
#include "stream.h"
-#include "demuxer.c"
+#include "demuxer.h"
#include "stheader.h"
+#if 0
+
typedef struct {
// file:
- MainAVIHeader avih;
- unsigned int movi_start;
- unsigned int movi_end;
+// MainAVIHeader avih;
+// unsigned int movi_start;
+// unsigned int movi_end;
// index:
AVIINDEXENTRY* idx;
int idx_size;
@@ -250,45 +252,46 @@ typedef struct {
int idx_pos_a;
int idx_pos_v;
int idx_offset; // ennyit kell hozzaadni az index offset ertekekhez
- // streams:
- sh_audio_t* a_streams[256];
- sh_video_t* v_streams[256];
- char s_streams[32]; // dvd subtitles
// video:
unsigned int bitrate;
} avi_header_t;
avi_header_t avi_header;
-#include "aviprint.c"
+#endif
+
+int avi_bitrate=0;
+
+demuxer_t *demuxer=NULL;
+
+//#include "aviprint.c"
sh_audio_t* new_sh_audio(int id){
- if(avi_header.a_streams[id]){
+ if(demuxer->a_streams[id]){
printf("Warning! Audio stream header %d redefined!\n",id);
} else {
printf("==> Found audio stream: %d\n",id);
- avi_header.a_streams[id]=malloc(sizeof(sh_audio_t));
- memset(avi_header.a_streams[id],0,sizeof(sh_audio_t));
+ demuxer->a_streams[id]=malloc(sizeof(sh_audio_t));
+ memset(demuxer->a_streams[id],0,sizeof(sh_audio_t));
}
- return avi_header.a_streams[id];
+ return demuxer->a_streams[id];
}
sh_video_t* new_sh_video(int id){
- if(avi_header.v_streams[id]){
+ if(demuxer->v_streams[id]){
printf("Warning! video stream header %d redefined!\n",id);
} else {
printf("==> Found video stream: %d\n",id);
- avi_header.v_streams[id]=malloc(sizeof(sh_video_t));
- memset(avi_header.v_streams[id],0,sizeof(sh_video_t));
+ demuxer->v_streams[id]=malloc(sizeof(sh_video_t));
+ memset(demuxer->v_streams[id],0,sizeof(sh_video_t));
}
- return avi_header.v_streams[id];
+ return demuxer->v_streams[id];
}
-#include "demux_avi.c"
-#include "demux_mpg.c"
+//#include "demux_avi.c"
+//#include "demux_mpg.c"
-demuxer_t *demuxer=NULL;
demux_stream_t *d_audio=NULL;
demux_stream_t *d_video=NULL;
demux_stream_t *d_dvdsub=NULL;
@@ -300,9 +303,25 @@ char* encode_name=NULL;
char* encode_index_name=NULL;
int encode_bitrate=0;
+extern int asf_packetsize;
+
+extern float avi_audio_pts;
+extern float avi_video_pts;
+extern float avi_video_ftime;
+extern int skip_video_frames;
+
+void read_avi_header(demuxer_t *demuxer,int index_mode);
+demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id);
+
+int asf_check_header(demuxer_t *demuxer);
+int read_asf_header(demuxer_t *demuxer);
+
// MPEG video stream parser:
#include "parse_es.c"
+extern int num_elementary_packets100;
+extern int num_elementary_packets101;
+
extern picture_t *picture;
static const int frameratecode2framerate[16] = {
@@ -321,20 +340,8 @@ int mplayer_audio_read(char *buf,int size){
return len;
}
-// AC3 decoder buffer callback:
-static void ac3_fill_buffer(uint8_t **start,uint8_t **end){
- int len=ds_get_packet(sh_audio->ds,(char**)start);
- //printf("<ac3:%d>\n",len);
- if(len<0)
- *start = *end = NULL;
- else
- *end = *start + len;
-}
-
-#include "alaw.c"
-#include "xa/xa_gsm.h"
-#include "dec_audio.c"
+//#include "dec_audio.c"
//**************************************************************************//
// The OpenDivX stuff:
@@ -386,15 +393,15 @@ while(len>0){
//**************************************************************************//
// AVI file header reader/parser/writer:
-#include "aviheader.c"
-#include "aviwrite.c"
+//#include "aviheader.c"
+//#include "aviwrite.c"
// ASF headers:
-#include "asfheader.c"
-#include "demux_asf.c"
+//#include "asfheader.c"
+//#include "demux_asf.c"
// DLL codecs init routines
-#include "dll_init.c"
+//#include "dll_init.c"
// Common FIFO functions, and keyboard/event FIFO code
#include "fifo.c"
@@ -443,7 +450,6 @@ void exit_sighandler(int x){
}
int divx_quality=0;
-extern int vo_dbpp;
int main(int argc,char* argv[], char *envp[]){
char* filename=NULL; //"MI2-Trailer.avi";
@@ -610,7 +616,7 @@ if(vcd_track){
if(f<0){ printf("CD-ROM Device '%s' not found!\n",filename);return 1; }
vcd_read_toc(f);
ret=vcd_seek_to_track(f,vcd_track);
- if(ret==-1){ printf("Error selecting VCD track!\n");return 1;}
+ if(ret<0){ printf("Error selecting VCD track!\n");return 1;}
seek_to_byte+=ret;
if(verbose) printf("VCD start byte position: 0x%X\n",seek_to_byte);
stream_type=STREAMTYPE_VCD;
@@ -638,7 +644,6 @@ if(vcd_track){
}
stream=new_stream(f,stream_type);
-
//============ Open & Sync stream and detect file format ===============
if(!has_audio) audio_id=-2; // do NOT read audio packets...
@@ -647,6 +652,7 @@ if(!has_audio) audio_id=-2; // do NOT read audio packets...
stream_reset(stream);
demuxer=new_demuxer(stream,DEMUXER_TYPE_AVI,audio_id,video_id,dvdsub_id);
stream_seek(demuxer->stream,seek_to_byte);
+//printf("stream3=0x%X vs. 0x%X\n",demuxer->stream,stream);
{ //---- RIFF header:
int id=stream_read_dword_le(demuxer->stream); // "RIFF"
if(id==mmioFOURCC('R','I','F','F')){
@@ -663,7 +669,7 @@ if(file_format==DEMUXER_TYPE_UNKNOWN){
stream_reset(stream);
demuxer=new_demuxer(stream,DEMUXER_TYPE_ASF,audio_id,video_id,dvdsub_id);
stream_seek(demuxer->stream,seek_to_byte);
- if(asf_check_header()){
+ if(asf_check_header(demuxer)){
printf("Detected ASF file format!\n");
file_format=DEMUXER_TYPE_ASF;
}
@@ -722,31 +728,31 @@ d_dvdsub=demuxer->sub;
switch(file_format){
case DEMUXER_TYPE_AVI: {
//---- AVI header:
- read_avi_header(index_mode);
+ read_avi_header(demuxer,index_mode);
stream_reset(demuxer->stream);
- stream_seek(demuxer->stream,avi_header.movi_start);
- avi_header.idx_pos=0;
- avi_header.idx_pos_a=0;
- avi_header.idx_pos_v=0;
- if(avi_header.idx_size>0){
+ stream_seek(demuxer->stream,demuxer->movi_start);
+ demuxer->idx_pos=0;
+ demuxer->idx_pos_a=0;
+ demuxer->idx_pos_v=0;
+ if(demuxer->idx_size>0){
// decide index format:
- if(avi_header.idx[0].dwChunkOffset<avi_header.movi_start)
- avi_header.idx_offset=avi_header.movi_start-4;
+ if(((AVIINDEXENTRY *)demuxer->idx)[0].dwChunkOffset<demuxer->movi_start)
+ demuxer->idx_offset=demuxer->movi_start-4;
else
- avi_header.idx_offset=0;
- if(verbose) printf("AVI index offset: %d\n",avi_header.idx_offset);
+ demuxer->idx_offset=0;
+ if(verbose) printf("AVI index offset: %d\n",demuxer->idx_offset);
}
- demuxer->endpos=avi_header.movi_end;
+// demuxer->endpos=avi_header.movi_end;
- if(avi_header.idx_size>0){
+ if(demuxer->idx_size>0){
// check that file is non-interleaved:
int i;
int a_pos=-1;
int v_pos=-1;
- for(i=0;i<avi_header.idx_size;i++){
- AVIINDEXENTRY* idx=&avi_header.idx[i];
+ for(i=0;i<demuxer->idx_size;i++){
+ AVIINDEXENTRY* idx=&((AVIINDEXENTRY *)demuxer->idx)[i];
demux_stream_t* ds=demux_avi_select_stream(demuxer,idx->ckid);
- int pos=idx->dwChunkOffset+avi_header.idx_offset;
+ int pos=idx->dwChunkOffset+demuxer->idx_offset;
if(a_pos==-1 && ds==demuxer->audio){
a_pos=pos;
if(v_pos!=-1) break;
@@ -775,8 +781,8 @@ switch(file_format){
if(force_ni){
printf("Using NON-INTERLEAVED Broken AVI file-format!\n");
demuxer->type=DEMUXER_TYPE_AVI_NINI; // HACK!!!!
- avi_header.idx_pos_a=
- avi_header.idx_pos_v=avi_header.movi_start;
+ demuxer->idx_pos_a=
+ demuxer->idx_pos_v=demuxer->movi_start;
pts_from_bps=1; // force BPS sync!
}
}
@@ -800,27 +806,27 @@ switch(file_format){
sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;
sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
// calculating video bitrate:
- avi_header.bitrate=avi_header.movi_end-avi_header.movi_start-avi_header.idx_size*8;
- if(sh_audio) avi_header.bitrate-=sh_audio->audio.dwLength;
- if(verbose) printf("AVI video length=%d\n",avi_header.bitrate);
- avi_header.bitrate=((float)avi_header.bitrate/(float)sh_video->video.dwLength)*sh_video->fps;
+ avi_bitrate=demuxer->movi_end-demuxer->movi_start-demuxer->idx_size*8;
+ if(sh_audio) avi_bitrate-=sh_audio->audio.dwLength;
+ if(verbose) printf("AVI video length=%d\n",avi_bitrate);
+ avi_bitrate=((float)avi_bitrate/(float)sh_video->video.dwLength)*sh_video->fps;
printf("VIDEO: [%.4s] %dx%d %dbpp %4.2f fps %5.1f kbps (%4.1f kbyte/s)\n",
&sh_video->bih->biCompression,
sh_video->bih->biWidth,
sh_video->bih->biHeight,
sh_video->bih->biBitCount,
sh_video->fps,
- avi_header.bitrate*0.008f,
- avi_header.bitrate/1024.0f );
+ avi_bitrate*0.008f,
+ avi_bitrate/1024.0f );
break;
}
case DEMUXER_TYPE_ASF: {
//---- ASF header:
- read_asf_header();
+ read_asf_header(demuxer);
stream_reset(demuxer->stream);
- stream_seek(demuxer->stream,avi_header.movi_start);
- avi_header.idx_pos=0;
- demuxer->endpos=avi_header.movi_end;
+ stream_seek(demuxer->stream,demuxer->movi_start);
+ demuxer->idx_pos=0;
+// demuxer->endpos=avi_header.movi_end;
if(!ds_fill_buffer(d_video)){
printf("ASF: missing video stream!? contact the author, it may be a bug :(\n");
exit(1);
@@ -948,7 +954,7 @@ if(stream_dump_type){
f=fopen(stream_dump_name?stream_dump_name:"stream.dump","wb");
if(!f){ printf("Can't open dump file!!!\n");exit(1); }
while(!ds->eof){
- char* start;
+ unsigned char* start;
int in_size=ds_get_packet(ds,&start);
if(in_size>0) fwrite(start,in_size,1,f);
}
@@ -1011,7 +1017,7 @@ if(verbose) printf("vo_debug1: out_fmt=0x%08X\n",out_fmt);
switch(sh_video->codec->driver){
case 2: {
- if(!init_video_codec(out_fmt)) exit(1);
+ if(!init_video_codec(sh_video)) exit(1);
if(verbose) printf("INFO: Win32 video codec init OK!\n");
break;
}
@@ -1439,7 +1445,7 @@ switch(sh_video->codec->driver){
unsigned int t=GetTimer();
unsigned int t2;
DEC_FRAME dec_frame;
- char* start=NULL;
+ unsigned char* start=NULL;
int in_size=ds_get_packet(d_video,&start);
if(in_size<0){ eof=1;break;}
if(in_size>max_framesize) max_framesize=in_size;
@@ -1461,7 +1467,7 @@ switch(sh_video->codec->driver){
}
#ifdef USE_DIRECTSHOW
case 4: { // W32/DirectShow
- char* start=NULL;
+ unsigned char* start=NULL;
unsigned int t=GetTimer();
unsigned int t2;
int in_size=ds_get_packet(d_video,&start);
@@ -1489,7 +1495,7 @@ switch(sh_video->codec->driver){
#endif
case 2: {
HRESULT ret;
- char* start=NULL;
+ unsigned char* start=NULL;
unsigned int t=GetTimer();
unsigned int t2;
int in_size=ds_get_packet(d_video,&start);
@@ -1762,8 +1768,8 @@ switch(sh_video->codec->driver){
break;
}
if(rel_seek_secs)
- if(file_format==DEMUXER_TYPE_AVI && avi_header.idx_size<=0){
- printf("Can't seek in raw .AVI streams! (index required) \n");
+ if(file_format==DEMUXER_TYPE_AVI && demuxer->idx_size<=0){
+ printf("Can't seek in raw .AVI streams! (index required, try with the -idx switch!) \n");
} else {
int skip_audio_bytes=0;
float skip_audio_secs=0;
@@ -1795,11 +1801,11 @@ switch(file_format){
// find video chunk pos:
if(rel_seek_frames>0){
// seek forward
- while(video_chunk_pos<avi_header.idx_size){
- int id=avi_header.idx[video_chunk_pos].ckid;
+ while(video_chunk_pos<demuxer->idx_size){
+ int id=((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].ckid;
// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame
if(avi_stream_id(id)==d_video->id){ // video frame
- if((--rel_seek_frames)<0 && avi_header.idx[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
+ if((--rel_seek_frames)<0 && ((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
v_pts+=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
++skip_audio_bytes;
}
@@ -1808,25 +1814,25 @@ switch(file_format){
} else {
// seek backward
while(video_chunk_pos>=0){
- int id=avi_header.idx[video_chunk_pos].ckid;
+ int id=((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].ckid;
// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame
if(avi_stream_id(id)==d_video->id){ // video frame
- if((++rel_seek_frames)>0 && avi_header.idx[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
+ if((++rel_seek_frames)>0 && ((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
v_pts-=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
--skip_audio_bytes;
}
--video_chunk_pos;
}
}
- avi_header.idx_pos_a=avi_header.idx_pos_v=
- avi_header.idx_pos=video_chunk_pos;
+ demuxer->idx_pos_a=demuxer->idx_pos_v=
+ demuxer->idx_pos=video_chunk_pos;
// printf("%d frames skipped\n",skip_audio_bytes);
#if 1
// re-calc video pts:
avi_video_pts=0;
for(i=0;i<video_chunk_pos;i++){
- int id=avi_header.idx[i].ckid;
+ int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid;
// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame
if(avi_stream_id(id)==d_video->id){ // video frame
avi_video_pts+=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
@@ -1854,17 +1860,17 @@ switch(file_format){
#else
curr_audio_pos/=sh_audio->wf->nBlockAlign;
curr_audio_pos*=sh_audio->wf->nBlockAlign;
- avi_header.audio_seekable=1;
+ demuxer->audio_seekable=1;
#endif
// find audio chunk pos:
for(i=0;i<video_chunk_pos;i++){
- int id=avi_header.idx[i].ckid;
+ int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid;
//if(TWOCCFromFOURCC(id)==cktypeWAVEbytes){
if(avi_stream_id(id)==d_audio->id){
int aid=StreamFromFOURCC(id);
if(d_audio->id==aid || d_audio->id==-1){
- len=avi_header.idx[i].dwChunkLength;
+ len=((AVIINDEXENTRY *)demuxer->idx)[i].dwChunkLength;
last=i;
if(apos<=curr_audio_pos && curr_audio_pos<(apos+len)){
if(verbose)printf("break;\n");
@@ -1883,8 +1889,8 @@ switch(file_format){
// update stream position:
d_audio->pos=audio_chunk_pos;
d_audio->dpos=apos;
- avi_header.idx_pos_a=avi_header.idx_pos_v=
- avi_header.idx_pos=audio_chunk_pos;
+ demuxer->idx_pos_a=demuxer->idx_pos_v=
+ demuxer->idx_pos=audio_chunk_pos;
if(!(sh_audio->codec->flags&CODECS_FLAG_SEEKABLE)){
#if 0
@@ -1906,9 +1912,9 @@ switch(file_format){
// calc skip_video_frames & adjust video pts counter:
// i=last;
- i=avi_header.idx_pos;
+ i=demuxer->idx_pos;
while(i<video_chunk_pos){
- int id=avi_header.idx[i].ckid;
+ int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid;
// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame
if(avi_stream_id(id)==d_video->id){ // video frame
++skip_video_frames;
@@ -1921,16 +1927,16 @@ switch(file_format){
}
if(verbose) printf("SEEK: idx=%d (a:%d v:%d) v.skip=%d a.skip=%d/%4.3f \n",
- avi_header.idx_pos,audio_chunk_pos,video_chunk_pos,
+ demuxer->idx_pos,audio_chunk_pos,video_chunk_pos,
skip_video_frames,skip_audio_bytes,skip_audio_secs);
// Set OSD:
if(osd_level){
osd_visible=sh_video->fps; // 1 sec
vo_osd_progbar_type=0;
- vo_osd_progbar_value=(demuxer->filepos)/((avi_header.movi_end-avi_header.movi_start)>>8);
+ vo_osd_progbar_value=(demuxer->filepos)/((demuxer->movi_end-demuxer->movi_start)>>8);
//printf("avi filepos = %d \n",vo_osd_progbar_value);
- // printf("avi filepos = %d (len=%d) \n",demuxer->filepos,(avi_header.movi_end-avi_header.movi_start));
+ // printf("avi filepos = %d (len=%d) \n",demuxer->filepos,(demuxer->movi_end-demuxer->movi_start));
}
}
@@ -1940,7 +1946,7 @@ switch(file_format){
//================= seek in ASF ==========================
float p_rate=10; // packets / sec
int rel_seek_packs=rel_seek_secs*p_rate;
- int rel_seek_bytes=rel_seek_packs*fileh.packetsize;
+ int rel_seek_bytes=rel_seek_packs*asf_packetsize;
int newpos;
//printf("ASF: packs: %d duration: %d \n",(int)fileh.packets,*((int*)&fileh.duration));
// printf("ASF_seek: %d secs -> %d packs -> %d bytes \n",
@@ -2057,7 +2063,7 @@ switch(file_format){
if(subtitles){
if(sub_fps==0) sub_fps=sh_video->fps;
current_module="find_sub";
- find_sub(sub_uses_time?(100*(v_pts+sub_delay)):((v_pts+sub_delay)*sub_fps)); // FIXME! frame counter...
+ find_sub(subtitles,sub_uses_time?(100*(v_pts+sub_delay)):((v_pts+sub_delay)*sub_fps)); // FIXME! frame counter...
current_module=NULL;
}