summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-04-15 14:33:49 +0000
committerarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-04-15 14:33:49 +0000
commit415c45924b85bd3e733dbb87393bd1a425eadd4a (patch)
tree0dc6b4d31ea8d0b7fcff807d56292815c15dfbc2
parent89e6a6f68e023823017b424df936d7086faa96d6 (diff)
downloadmpv-415c45924b85bd3e733dbb87393bd1a425eadd4a.tar.bz2
mpv-415c45924b85bd3e733dbb87393bd1a425eadd4a.tar.xz
sh_audio->wf and sh_video->bih changed to dynamic (thanx to Jens Hoffmann)
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@433 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--asfheader.c12
-rw-r--r--aviheader.c18
-rw-r--r--dec_audio.c18
-rw-r--r--dll_init.c26
-rw-r--r--mplayer.c55
-rw-r--r--stheader.h6
6 files changed, 71 insertions, 64 deletions
diff --git a/asfheader.c b/asfheader.c
index e1c4ef1e83..6f2d3bb708 100644
--- a/asfheader.c
+++ b/asfheader.c
@@ -129,8 +129,9 @@ if(verbose){
switch(*((unsigned int*)&streamh.type)){
case 0xF8699E40: { // guid_audio_stream
sh_audio_t* sh_audio=new_sh_audio(streamh.stream_no & 0x7F);
- memcpy(&sh_audio->wf,buffer,streamh.type_size<64?streamh.type_size:64);
- if(verbose>=1) print_wave_header((WAVEFORMATEX*)buffer);
+ sh_audio->wf=calloc((streamh.type_size<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):streamh.type_size,1);
+ memcpy(sh_audio->wf,buffer,streamh.type_size);
+ if(verbose>=1) print_wave_header(sh_audio->wf);
if((*((unsigned int*)&streamh.concealment))==0xbfc3cd50){
stream_read(demuxer->stream,(char*) buffer,streamh.stream_size);
asf_scrambling_h=buffer[0];
@@ -146,10 +147,13 @@ if(verbose){
}
case 0xBC19EFC0: { // guid_video_stream
sh_video_t* sh_video=new_sh_video(streamh.stream_no & 0x7F);
- memcpy(&sh_video->bih,&buffer[4+4+1+2],sizeof(BITMAPINFOHEADER));
+ int len=streamh.type_size-(4+4+1+2);
+// sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize);
+ sh_video->bih=calloc((len<sizeof(BITMAPINFOHEADER))?sizeof(BITMAPINFOHEADER):len,1);
+ memcpy(sh_video->bih,&buffer[4+4+1+2],len);
//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;
- if(verbose>=1) print_video_header((BITMAPINFOHEADER*)&buffer[4+4+1+2]);
+ if(verbose>=1) print_video_header(sh_video->bih);
//asf_video_id=streamh.stream_no & 0x7F;
//if(demuxer->video->id==-1) demuxer->video->id=streamh.stream_no & 0x7F;
break;
diff --git a/aviheader.c b/aviheader.c
index f3c1f69776..9154c2f31c 100644
--- a/aviheader.c
+++ b/aviheader.c
@@ -56,18 +56,20 @@ while(1){
break; }
case ckidSTREAMFORMAT: { // read 'strf'
if(last_fccType==streamtypeVIDEO){
- stream_read(demuxer->stream,(char*) &sh_video->bih,MIN(size2,sizeof(sh_video->bih)));
- chunksize-=MIN(size2,sizeof(sh_video->bih));
- 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;
+ sh_video->bih=malloc(chunksize); memset(sh_video->bih,0,chunksize);
+ if(verbose>=2) printf("found 'bih', %d bytes of %d\n",chunksize,sizeof(BITMAPINFOHEADER));
+ stream_read(demuxer->stream,(char*) sh_video->bih,chunksize);
+ chunksize=0;
+// 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;
// if(demuxer->video->id==-1) demuxer->video->id=stream_id;
} else
if(last_fccType==streamtypeAUDIO){
- int z=(chunksize<64)?chunksize:64;
+ sh_audio->wf=malloc(chunksize); memset(sh_audio->wf,0,chunksize);
if(verbose>=2) printf("found 'wf', %d bytes of %d\n",chunksize,sizeof(WAVEFORMATEX));
- stream_read(demuxer->stream,(char*) &sh_audio->wf,z);
- chunksize-=z;
- if(verbose>=1) print_wave_header(&sh_audio->wf);
+ stream_read(demuxer->stream,(char*) sh_audio->wf,chunksize);
+ chunksize=0;
+ if(verbose>=1) print_wave_header(sh_audio->wf);
// if(demuxer->audio->id==-1) demuxer->audio->id=stream_id;
}
break;
diff --git a/dec_audio.c b/dec_audio.c
index 5b78d61040..6c5391fbc6 100644
--- a/dec_audio.c
+++ b/dec_audio.c
@@ -31,13 +31,13 @@ if(driver==7){
// Win32 DShow audio codec:
// printf("DShow_audio: channs=%d rate=%d\n",sh_audio->channels,sh_audio->samplerate);
- if(DS_AudioDecoder_Open(sh_audio->codec->dll,&sh_audio->codec->guid,&sh_audio->wf)){
+ if(DS_AudioDecoder_Open(sh_audio->codec->dll,&sh_audio->codec->guid,sh_audio->wf)){
printf("ERROR: Could not load/initialize Win32/DirctShow AUDIO codec: %s\n",sh_audio->codec->dll);
driver=0;
} else {
- sh_audio->channels=sh_audio->wf.nChannels;
- sh_audio->samplerate=sh_audio->wf.nSamplesPerSec;
- sh_audio->audio_in_minsize=2*sh_audio->wf.nBlockAlign;
+ sh_audio->channels=sh_audio->wf->nChannels;
+ sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
+ sh_audio->audio_in_minsize=2*sh_audio->wf->nBlockAlign;
if(sh_audio->audio_in_minsize<8192) sh_audio->audio_in_minsize=8192;
sh_audio->a_in_buffer_size=sh_audio->audio_in_minsize;
sh_audio->a_in_buffer=malloc(sh_audio->a_in_buffer_size);
@@ -64,7 +64,7 @@ case 4: {
}
case 2: {
// AVI PCM Audio:
- WAVEFORMATEX *h=&sh_audio->wf;
+ WAVEFORMATEX *h=sh_audio->wf;
sh_audio->channels=h->nChannels;
sh_audio->samplerate=h->nSamplesPerSec;
sh_audio->samplesize=(h->wBitsPerSample+7)/8;
@@ -101,15 +101,15 @@ case 3: {
case 5: {
// aLaw audio codec:
Gen_aLaw_2_Signed(); // init table
- sh_audio->channels=sh_audio->wf.nChannels;
- sh_audio->samplerate=sh_audio->wf.nSamplesPerSec;
+ sh_audio->channels=sh_audio->wf->nChannels;
+ sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
break;
}
case 6: {
// MS-GSM audio codec:
GSM_Init();
- sh_audio->channels=sh_audio->wf.nChannels;
- sh_audio->samplerate=sh_audio->wf.nSamplesPerSec;
+ sh_audio->channels=sh_audio->wf->nChannels;
+ sh_audio->samplerate=sh_audio->wf->nSamplesPerSec;
break;
}
case 1: {
diff --git a/dll_init.c b/dll_init.c
index 286a7f239b..2b4aeef371 100644
--- a/dll_init.c
+++ b/dll_init.c
@@ -3,7 +3,7 @@
int init_acm_audio_codec(sh_audio_t *sh_audio){
HRESULT ret;
- WAVEFORMATEX *in_fmt=&sh_audio->wf;
+ WAVEFORMATEX *in_fmt=sh_audio->wf;
unsigned long srcsize=0;
if(verbose) printf("======= Win32 (ACM) AUDIO Codec init =======\n");
@@ -110,7 +110,7 @@ int init_video_codec(){
sh_video->o_bih.biSize = sizeof(BITMAPINFOHEADER);
win32_codec_name = sh_video->codec->dll;
- sh_video->hic = ICOpen( 0x63646976, sh_video->bih.biCompression, ICMODE_FASTDECOMPRESS);
+ sh_video->hic = ICOpen( 0x63646976, sh_video->bih->biCompression, ICMODE_FASTDECOMPRESS);
// sh_video->hic = ICOpen( 0x63646976, sh_video->bih.biCompression, ICMODE_DECOMPRESS);
if(!sh_video->hic){
printf("ICOpen failed! unknown codec / wrong parameters?\n");
@@ -119,7 +119,7 @@ int init_video_codec(){
// sh_video->bih.biBitCount=32;
- ret = ICDecompressGetFormat(sh_video->hic, &sh_video->bih, &sh_video->o_bih);
+ ret = ICDecompressGetFormat(sh_video->hic, sh_video->bih, &sh_video->o_bih);
if(ret){
printf("ICDecompressGetFormat failed: Error %d\n", ret);
return 0;
@@ -185,7 +185,7 @@ int init_video_codec(){
sh_video->o_bih.biSizeImage = sh_video->o_bih.biWidth * sh_video->o_bih.biHeight * (sh_video->o_bih.biBitCount/8);
if(!(sh_video->codec->outflags[sh_video->outfmtidx]&CODECS_FLAG_FLIP)) {
- sh_video->o_bih.biHeight=-sh_video->bih.biHeight; // flip image!
+ sh_video->o_bih.biHeight=-sh_video->bih->biHeight; // flip image!
}
// this looks suspicious :-)
@@ -196,13 +196,13 @@ int init_video_codec(){
if(verbose) {
printf("Starting decompression, format:\n");
- printf(" biSize %d\n", sh_video->bih.biSize);
- printf(" biWidth %d\n", sh_video->bih.biWidth);
- printf(" biHeight %d\n", sh_video->bih.biHeight);
- printf(" biPlanes %d\n", sh_video->bih.biPlanes);
- printf(" biBitCount %d\n", sh_video->bih.biBitCount);
- printf(" biCompression 0x%x ('%.4s')\n", sh_video->bih.biCompression, &sh_video->bih.biCompression);
- printf(" biSizeImage %d\n", sh_video->bih.biSizeImage);
+ printf(" biSize %d\n", sh_video->bih->biSize);
+ printf(" biWidth %d\n", sh_video->bih->biWidth);
+ printf(" biHeight %d\n", sh_video->bih->biHeight);
+ printf(" biPlanes %d\n", sh_video->bih->biPlanes);
+ printf(" biBitCount %d\n", sh_video->bih->biBitCount);
+ printf(" biCompression 0x%x ('%.4s')\n", sh_video->bih->biCompression, &sh_video->bih->biCompression);
+ printf(" biSizeImage %d\n", sh_video->bih->biSizeImage);
printf("Dest fmt:\n");
printf(" biSize %d\n", sh_video->o_bih.biSize);
printf(" biWidth %d\n", sh_video->o_bih.biWidth);
@@ -213,7 +213,7 @@ int init_video_codec(){
printf(" biSizeImage %d\n", sh_video->o_bih.biSizeImage);
}
- ret = ICDecompressQuery(sh_video->hic, &sh_video->bih, &sh_video->o_bih);
+ ret = ICDecompressQuery(sh_video->hic, sh_video->bih, &sh_video->o_bih);
if(ret){
printf("ICDecompressQuery failed: Error %d\n", ret);
return 0;
@@ -221,7 +221,7 @@ int init_video_codec(){
if(verbose) printf("ICDecompressQuery OK\n");
- ret = ICDecompressBegin(sh_video->hic, &sh_video->bih, &sh_video->o_bih);
+ ret = ICDecompressBegin(sh_video->hic, sh_video->bih, &sh_video->o_bih);
if(ret){
printf("ICDecompressBegin failed: Error %d\n", ret);
return 0;
diff --git a/mplayer.c b/mplayer.c
index a7effc636e..af7931cddc 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -697,7 +697,7 @@ switch(file_format){
sh_audio=NULL;
} else {
sh_audio=d_audio->sh;sh_audio->ds=d_audio;
- sh_audio->format=sh_audio->wf.wFormatTag;
+ sh_audio->format=sh_audio->wf->wFormatTag;
}
}
// calc. FPS:
@@ -709,10 +709,10 @@ switch(file_format){
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;
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->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 );
@@ -738,15 +738,15 @@ switch(file_format){
sh_audio=NULL;
} else {
sh_audio=d_audio->sh;sh_audio->ds=d_audio;
- sh_audio->format=sh_audio->wf.wFormatTag;
+ sh_audio->format=sh_audio->wf->wFormatTag;
}
}
sh_video->fps=1000.0f; sh_video->frametime=0.001f; // 1ms
printf("VIDEO: [%.4s] %dx%d %dbpp\n",
- &sh_video->bih.biCompression,
- sh_video->bih.biWidth,
- sh_video->bih.biHeight,
- sh_video->bih.biBitCount);
+ &sh_video->bih->biCompression,
+ sh_video->bih->biWidth,
+ sh_video->bih->biHeight,
+ sh_video->bih->biBitCount);
break;
}
case DEMUXER_TYPE_MPEG_ES: {
@@ -778,9 +778,9 @@ switch(file_format){
case DEMUXER_TYPE_AVI:
case DEMUXER_TYPE_ASF: {
// display info:
- sh_video->format=sh_video->bih.biCompression;
- sh_video->disp_w=sh_video->bih.biWidth;
- sh_video->disp_h=abs(sh_video->bih.biHeight);
+ sh_video->format=sh_video->bih->biCompression;
+ sh_video->disp_w=sh_video->bih->biWidth;
+ sh_video->disp_h=abs(sh_video->bih->biHeight);
break;
}
case DEMUXER_TYPE_MPEG_ES:
@@ -868,7 +868,7 @@ if(has_audio){
//================== Init VIDEO (codec & libvo) ==========================
// Go through the codec.conf and find the best codec...
-sh_video->codec=find_codec(sh_video->format,(unsigned int*) &sh_video->bih.biCompression,NULL,0);
+sh_video->codec=find_codec(sh_video->format,(unsigned int*) &sh_video->bih->biCompression,NULL,0);
if(!sh_video->codec){
printf("Can't find codec for video format 0x%X !\n",sh_video->format);
exit(1);
@@ -899,7 +899,7 @@ switch(sh_video->codec->driver){
exit(1);
#else
sh_video->our_out_buffer=NULL;
- if(DS_VideoDecoder_Open(sh_video->codec->dll,&sh_video->codec->guid, &sh_video->bih, 0, &sh_video->our_out_buffer)){
+ if(DS_VideoDecoder_Open(sh_video->codec->dll,&sh_video->codec->guid, sh_video->bih, 0, &sh_video->our_out_buffer)){
printf("ERROR: Couldn't open required DirectShow codec: %s\n",sh_video->codec->dll);
printf("Maybe you forget to upgrade your win32 codecs?? It's time to download the new\n");
printf("package from: ftp://thot.banki.hu/esp-team/linux/MPlayer/w32codec.zip !\n");
@@ -926,8 +926,8 @@ switch(sh_video->codec->driver){
if(verbose) printf("OpenDivX video codec\n");
{ DEC_PARAM dec_param;
DEC_SET dec_set;
- dec_param.x_dim = sh_video->bih.biWidth;
- dec_param.y_dim = sh_video->bih.biHeight;
+ dec_param.x_dim = sh_video->bih->biWidth;
+ dec_param.y_dim = sh_video->bih->biHeight;
dec_param.color_depth = 32;
decore(0x123, DEC_OPT_INIT, &dec_param, NULL);
dec_set.postproc_level = divx_quality;
@@ -1349,13 +1349,14 @@ switch(sh_video->codec->driver){
if(in_size<0){ eof=1;break;}
if(in_size>max_framesize) max_framesize=in_size;
- sh_video->bih.biSizeImage = in_size;
+ if(in_size){
+ sh_video->bih->biSizeImage = in_size;
// ret = ICDecompress(avi_header.hic, ICDECOMPRESS_NOTKEYFRAME|(ICDECOMPRESS_HURRYUP|ICDECOMPRESS_PREROL),
ret = ICDecompress(sh_video->hic, ICDECOMPRESS_NOTKEYFRAME,
- &sh_video->bih, start,
+ sh_video->bih, start,
&sh_video->o_bih, sh_video->our_out_buffer);
if(ret){ printf("Error decompressing frame, err=%d\n",ret);break; }
-
+ }
t2=GetTimer();t=t2-t;video_time_usage+=t*0.000001f;
video_out->draw_frame((uint8_t **)&sh_video->our_out_buffer);
t2=GetTimer()-t2;vout_time_usage+=t2*0.000001f;
@@ -1448,7 +1449,7 @@ switch(sh_video->codec->driver){
if(has_audio){
if(pts_from_bps && (file_format==DEMUXER_TYPE_AVI)){
// a_pts=(float)ds_tell(d_audio)/sh_audio->wf.nAvgBytesPerSec-(buffer_delay+audio_delay);
- a_pts=(float)ds_tell(d_audio)/sh_audio->wf.nAvgBytesPerSec-(buffer_delay);
+ a_pts=(float)ds_tell(d_audio)/sh_audio->wf->nAvgBytesPerSec-(buffer_delay);
delay_corrected=1; // hack
} else
if(d_audio->pts){
@@ -1663,13 +1664,13 @@ switch(file_format){
int len=0;
// calc new audio position in audio stream: (using avg.bps value)
- curr_audio_pos=(avi_video_pts) * sh_audio->wf.nAvgBytesPerSec;
+ curr_audio_pos=(avi_video_pts) * sh_audio->wf->nAvgBytesPerSec;
if(curr_audio_pos<0)curr_audio_pos=0;
#if 1
curr_audio_pos&=~15; // requires for PCM formats!!!
#else
- curr_audio_pos/=sh_audio->wf.nBlockAlign;
- curr_audio_pos*=sh_audio->wf.nBlockAlign;
+ curr_audio_pos/=sh_audio->wf->nBlockAlign;
+ curr_audio_pos*=sh_audio->wf->nBlockAlign;
avi_header.audio_seekable=1;
#endif
@@ -1705,14 +1706,14 @@ switch(file_format){
if(!(sh_audio->codec->flags&CODECS_FLAG_SEEKABLE)){
#if 0
// curr_audio_pos=apos; // selected audio codec can't seek in chunk
- skip_audio_secs=(float)skip_audio_bytes/(float)sh_audio->wf.nAvgBytesPerSec;
+ skip_audio_secs=(float)skip_audio_bytes/(float)sh_audio->wf->nAvgBytesPerSec;
//printf("Seek_AUDIO: %d bytes --> %5.3f secs\n",skip_audio_bytes,skip_audio_secs);
skip_audio_bytes=0;
#else
- int d=skip_audio_bytes % sh_audio->wf.nBlockAlign;
+ int d=skip_audio_bytes % sh_audio->wf->nBlockAlign;
skip_audio_bytes-=d;
// curr_audio_pos-=d;
- skip_audio_secs=(float)d/(float)sh_audio->wf.nAvgBytesPerSec;
+ skip_audio_secs=(float)d/(float)sh_audio->wf->nAvgBytesPerSec;
//printf("Seek_AUDIO: %d bytes --> %5.3f secs\n",d,skip_audio_secs);
#endif
}
diff --git a/stheader.h b/stheader.h
index 68b059953b..942638fa2e 100644
--- a/stheader.h
+++ b/stheader.h
@@ -26,8 +26,8 @@ typedef struct {
int a_buffer_size;
// win32 codec stuff:
AVIStreamHeader audio;
- WAVEFORMATEX wf;
- char wf_ext[64]; // in format
+ WAVEFORMATEX *wf;
+// char wf_ext[64]; // in format
WAVEFORMATEX o_wf; // out format
HACMSTREAM srcstream; // handle
int audio_in_minsize;
@@ -52,7 +52,7 @@ typedef struct {
char *our_out_buffer;
// win32 codec stuff:
AVIStreamHeader video;
- BITMAPINFOHEADER bih; // in format
+ BITMAPINFOHEADER *bih; // in format
BITMAPINFOHEADER o_bih; // out format
HIC hic; // handle
} sh_video_t;