summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--demux_avi.c15
-rw-r--r--mplayer.c66
2 files changed, 42 insertions, 39 deletions
diff --git a/demux_avi.c b/demux_avi.c
index 8b7df0bb84..9ddee43ba3 100644
--- a/demux_avi.c
+++ b/demux_avi.c
@@ -54,7 +54,6 @@ demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){
return NULL;
}
-
static int demux_avi_read_packet(demuxer_t *demux,unsigned int id,unsigned int len,int idxpos,int flags){
avi_priv_t *priv=demux->priv;
int skip;
@@ -87,8 +86,8 @@ static int demux_avi_read_packet(demuxer_t *demux,unsigned int id,unsigned int l
// drop frame (seeking)
--priv->skip_video_frames;
ds=NULL;
- } else {
- pts=priv->avi_video_pts;
+// } else {
+// pts=priv->avi_video_pts;
}
// ezt a 2 sort lehet hogy fell kell majd cserelni:
//priv->avi_video_pts+=avi_pts_frametime;
@@ -110,6 +109,10 @@ static int demux_avi_read_packet(demuxer_t *demux,unsigned int id,unsigned int l
priv->avi_audio_pts=priv->avi_video_pts+priv->pts_correction;
priv->pts_has_video=1;
+ pts=priv->avi_video_pts;
+
+ //printf("read pack_no: %d pts %5.3f \n",demux->video->pack_no+demux->video->packs,pts);
+
}
// len=stream_read_dword_le(demux->stream);
@@ -500,7 +503,7 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){
}
} else {
// seek backward
- while(video_chunk_pos>=0){
+ while(video_chunk_pos>0){
int id=((AVIINDEXENTRY *)priv->idx)[video_chunk_pos].ckid;
if(avi_stream_id(id)==d_video->id){ // video frame
if((++rel_seek_frames)>0 && ((AVIINDEXENTRY *)priv->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break;
@@ -519,6 +522,8 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){
sh_video->num_frames=d_video->pack_no;
priv->avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
d_video->pos=video_chunk_pos;
+
+ printf("V_SEEK: pack=%d pts=%5.3f chunk=%d \n",d_video->pack_no,priv->avi_video_pts,video_chunk_pos);
// ------------ STEP 2: seek audio, find the right chunk & pos ------------
@@ -622,6 +627,8 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){
priv->idx_pos_v=video_chunk_pos;
priv->idx_pos=(audio_chunk_pos<video_chunk_pos)?audio_chunk_pos:video_chunk_pos;
}
+
+ d_video->pts=priv->avi_video_pts; // OSD
if(verbose) printf("SEEK: idx=%d (a:%d v:%d) v.skip=%d a.skip=%d/%4.3f \n",
priv->idx_pos,audio_chunk_pos,video_chunk_pos,
diff --git a/mplayer.c b/mplayer.c
index 9938fdb38e..44939562c1 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -227,13 +227,14 @@ static int audio_id=-1;
static int video_id=-1;
static int dvdsub_id=-1;
static int vcd_track=0;
-char *stream_dump_name=NULL;
-int stream_dump_type=0;
+static char *stream_dump_name=NULL;
+static int stream_dump_type=0;
+
int index_mode=-1; // -1=untouched 0=don't use index 1=use (geneate) index
int force_ni=0;
-float default_max_pts_correction=-1;//0.01f;
-float max_pts_correction=0;//default_max_pts_correction;
+static float default_max_pts_correction=-1;//0.01f;
+static float max_pts_correction=0;//default_max_pts_correction;
#ifdef AVI_SYNC_BPS
int pts_from_bps=1;
#else
@@ -1031,6 +1032,7 @@ if(!sh_audio){
//==================== START PLAYING =======================
if(file_format==DEMUXER_TYPE_AVI && sh_audio){
+#if 0
//a_pts=d_audio->pts;
if(verbose) printf("Initial frame delay A: %d V: %d\n",(int)sh_audio->audio.dwInitialFrames,(int)sh_video->video.dwInitialFrames);
if(!pts_from_bps){
@@ -1045,6 +1047,7 @@ if(file_format==DEMUXER_TYPE_AVI && sh_audio){
printf("START: a_pts=%5.3f v_pts=%5.3f \n",d_audio->pts,d_video->pts);
}
d_video->pts=0;d_audio->pts=0; // PTS is outdated now!
+#endif
} else {
pts_from_bps=0; // it must be 0 for mpeg/asf !
}
@@ -1330,45 +1333,37 @@ if(1)
float delay=(float)delay_bytes/(float)sh_audio->o_bps;
if(pts_from_bps){
- // PTS = (audio position)/(bytes per sec)
-// a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
+#if 1
+ 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
+ a_pts=samples*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate;
+#else
if(sh_audio->audio.dwSampleSize)
a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->wf->nAvgBytesPerSec;
else // VBR:
a_pts=d_audio->pack_no*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate;
- v_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
-// if(verbose)printf("%5.3f|",v_pts-d_video->pts);
+#endif
+// v_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
+// printf("V_PTS: PTS: %8.3f BPS: %8.3f \n",d_video->pts,v_pts);
+ delay_corrected=1;
} else {
- if(!delay_corrected && d_audio->pts){
-// float x=d_audio->pts-d_video->pts-(delay);
- float x=d_audio->pts-d_video->pts-(delay+audio_delay);
-// float y=-(delay+audio_delay);
- float bps_a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->wf->nAvgBytesPerSec;
- float bps_v_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
- printf("Initial PTS delay: %5.3f sec ->%5.3f (bps: %5.3f) audio_delay=%5.3f\n",x,2*sh_video->frametime,bps_a_pts-bps_v_pts-(delay+audio_delay),audio_delay);
- x=0; //2*sh_video->frametime;
-// initial_pts_delay+=x; audio_delay+=x;
- delay_corrected=1;
- if(verbose)
- printf("v: audio_delay=%5.3f buffer_delay=%5.3f a.pts=%5.3f v.pts=%5.3f\n",
- audio_delay,delay,d_audio->pts,d_video->pts);
- }
// PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec)
a_pts=d_audio->pts;
+ if(!delay_corrected) if(a_pts) delay_corrected=1;
//printf("*** %5.3f ***\n",a_pts);
a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
// v_pts=d_video->pts-frame_time;
- v_pts=d_video->pts;
+// v_pts=d_video->pts;
}
+ v_pts=d_video->pts;
- if(verbose>1)printf("### A:%8.3f (%8.3f) V:%8.3f A-V:%7.4f \n",a_pts,a_pts-audio_delay-delay,v_pts,(a_pts-delay-audio_delay)-v_pts);
+ if(verbose>1)
+ printf("### A:%8.3f (%8.3f) V:%8.3f A-V:%7.4f \n",a_pts,a_pts-audio_delay-delay,v_pts,(a_pts-delay-audio_delay)-v_pts);
if(delay_corrected){
float x;
AV_delay=(a_pts-delay-audio_delay)-v_pts;
-// printf("A:%6.1f V:%6.1f A-V:%7.3f",a_pts-audio_delay-delay,v_pts,x);
- if(!quiet)
- printf("A:%6.1f (%6.1f) V:%6.1f A-V:%7.3f",a_pts,a_pts-audio_delay-delay,v_pts,AV_delay);
x=AV_delay*0.1f;
if(x<-max_pts_correction) x=-max_pts_correction; else
if(x> max_pts_correction) x= max_pts_correction;
@@ -1377,13 +1372,14 @@ if(1)
else
max_pts_correction=sh_video->frametime*0.10; // +-10% of time
sh_audio->timer+=x; c_total+=x;
- if(!quiet) printf(" ct:%7.3f %3d %2d%% %2d%% %4.1f%% %d %d\r",c_total,
- (int)sh_video->num_frames,
- (sh_video->timer>0.5)?(int)(100.0*video_time_usage/(double)sh_video->timer):0,
- (sh_video->timer>0.5)?(int)(100.0*vout_time_usage/(double)sh_video->timer):0,
- (sh_video->timer>0.5)?(100.0*audio_time_usage/(double)sh_video->timer):0
- ,drop_frame_cnt
- ,output_quality
+ if(!quiet) printf("A:%6.1f V:%6.1f A-V:%7.3f ct:%7.3f %3d %2d%% %2d%% %4.1f%% %d %d\r",
+ a_pts-audio_delay-delay,v_pts,AV_delay,c_total,
+ (int)sh_video->num_frames,
+ (sh_video->timer>0.5)?(int)(100.0*video_time_usage/(double)sh_video->timer):0,
+ (sh_video->timer>0.5)?(int)(100.0*vout_time_usage/(double)sh_video->timer):0,
+ (sh_video->timer>0.5)?(100.0*audio_time_usage/(double)sh_video->timer):0
+ ,drop_frame_cnt
+ ,output_quality
);
fflush(stdout);
}
@@ -1695,7 +1691,7 @@ if(rel_seek_secs){
c_total=0;
max_pts_correction=0.1;
- force_redraw=5;
+// force_redraw=5;
audio_time_usage=0; video_time_usage=0; vout_time_usage=0;
drop_frame_cnt=0;