summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmpdemux/demux_avi.c8
-rw-r--r--libmpdemux/demuxer.c3
-rw-r--r--libmpdemux/demuxer.h3
-rw-r--r--mencoder.c4
-rw-r--r--mplayer.c2
5 files changed, 16 insertions, 4 deletions
diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c
index cc6acd5b4c..1796f5b493 100644
--- a/libmpdemux/demux_avi.c
+++ b/libmpdemux/demux_avi.c
@@ -33,6 +33,8 @@ demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
if(!demux->audio->sh){
demux->audio->sh=demux->a_streams[stream_id];
mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected AVI audio ID = %d\n",demux->audio->id);
+ demux->audio->block_size=((sh_audio_t*)(demux->audio->sh))->wf->nBlockAlign;
+ //printf("&&&&& setting blocksize to %d &&&&&\n",demux->audio->block_size);
}
return demux->audio;
}
@@ -602,6 +604,7 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){
// ------------ STEP 2: seek audio, find the right chunk & pos ------------
d_audio->pack_no=0;
+ d_audio->block_no=0;
d_audio->dpos=0;
if(sh_audio){
@@ -636,6 +639,7 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){
if(avi_stream_id(id)==d_audio->id){
len=((AVIINDEXENTRY *)priv->idx)[i].dwChunkLength;
++d_audio->pack_no;
+ d_audio->block_no+=(len+d_audio->block_size-1)/d_audio->block_size;
if(d_audio->dpos<=curr_audio_pos && curr_audio_pos<(d_audio->dpos+len)){
break;
}
@@ -662,10 +666,12 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){
skip_audio_bytes+=len;
} else {
++d_audio->pack_no;
+ d_audio->block_no+=(len+d_audio->block_size-1)/d_audio->block_size;
d_audio->dpos+=len;
audio_chunk_pos=i;
}
- --chunks;
+// --chunks;
+ chunks-=(len+d_audio->block_size-1)/d_audio->block_size;
}
}
//if(audio_chunk_pos>chunk_max) audio_chunk_pos=chunk_max;
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 22af609995..1ad4090f4b 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -35,6 +35,7 @@ demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){
ds->pos=0;
ds->dpos=0;
ds->pack_no=0;
+ ds->block_no=0;
//---------------
ds->packs=0;
ds->bytes=0;
@@ -46,6 +47,7 @@ demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){
ds->asf_packet=NULL;
//----------------
ds->ss_mul=ds->ss_div=1;
+ ds->block_size=1;
//----------------
ds->sh=NULL;
return ds;
@@ -320,6 +322,7 @@ int ds_fill_buffer(demux_stream_t *ds){
ds->pos=p->pos;
ds->dpos+=p->len; // !!!
++ds->pack_no;
+ ds->block_no+=(p->len+ds->block_size-1)/ds->block_size;
if(p->pts){
ds->pts=p->pts;
ds->pts_bytes=0;
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index c831b19d97..b3790e6515 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -67,6 +67,7 @@ typedef struct {
off_t pos; // position in the input stream (file)
off_t dpos; // position in the demuxed stream
int pack_no; // serial number of packet
+ int block_no; // number of <=block_size length blocks (for VBR mp3)
int flags; // flags of current packet (keyframe etc)
//---------------
int packs; // number of packets in buffer
@@ -81,6 +82,8 @@ typedef struct {
int asf_seq;
// ---- mov -----
unsigned int ss_mul,ss_div;
+// ---- avi -----
+ unsigned int block_size;
// ---- stream header ----
void* sh;
} demux_stream_t;
diff --git a/mencoder.c b/mencoder.c
index e5fc363dad..fb0f29e5f4 100644
--- a/mencoder.c
+++ b/mencoder.c
@@ -1071,7 +1071,7 @@ if(sh_audio && !demuxer2){
if(pts_from_bps){
unsigned int samples=(sh_audio->audio.dwSampleSize)?
((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) :
- (d_audio->pack_no); // <- used for VBR audio
+ (d_audio->block_no); // <- used for VBR audio
// printf("samples=%d \n",samples);
a_pts=samples*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate;
delay_corrected=1;
@@ -1119,7 +1119,7 @@ if(sh_audio && !demuxer2){
float len=(demuxer->movi_end-demuxer->movi_start);
float p=len>1000 ? (float)(demuxer->filepos-demuxer->movi_start) / len : 0;
if(!len && sh_audio && sh_audio->audio.dwLength>100){
- p=(sh_audio->audio.dwSampleSize? ds_tell(sh_audio->ds)/sh_audio->audio.dwSampleSize : sh_audio->ds->pack_no)
+ p=(sh_audio->audio.dwSampleSize? ds_tell(sh_audio->ds)/sh_audio->audio.dwSampleSize : sh_audio->ds->block_no)
/ (float)(sh_audio->audio.dwLength);
}
#if 0
diff --git a/mplayer.c b/mplayer.c
index c535f7733e..5af0ff33ad 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -1769,7 +1769,7 @@ if(time_frame>0.001 && !(vo_flags&256)){
// PTS = sample_no / samplerate
unsigned int samples=(sh_audio->audio.dwSampleSize)?
((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) :
- (d_audio->pack_no); // <- used for VBR audio
+ (d_audio->block_no); // <- used for VBR audio
samples+=sh_audio->audio.dwStart; // offset
a_pts=samples*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate;
delay_corrected=1;