diff --git a/demuxer.c b/demuxer.c index 52393c2705..3aba153875 100644 --- a/demuxer.c +++ b/demuxer.c @@ -17,6 +17,7 @@ demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){ ds->eof=0; ds->pos=0; ds->dpos=0; + ds->pack_no=0; //--------------- ds->packs=0; ds->bytes=0; @@ -121,6 +122,7 @@ int ds_fill_buffer(demux_stream_t *ds){ ds->buffer_size=p->len; ds->pos=p->pos; ds->dpos+=p->len; // !!! + ++ds->pack_no; if(p->pts){ ds->pts=p->pts; ds->pts_bytes=0; diff --git a/demuxer.h b/demuxer.h index f6e621d39f..575bffc384 100644 --- a/demuxer.h +++ b/demuxer.h @@ -33,6 +33,7 @@ typedef struct { 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 pack_no; // serial number of packet //--------------- int packs; // number of packets in buffer int bytes; // total bytes of packets in buffer diff --git a/mplayer.c b/mplayer.c index 6304088e1f..c7fec2e565 100644 --- a/mplayer.c +++ b/mplayer.c @@ -1971,6 +1971,8 @@ switch(sh_video->codec->driver){ // a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->wf->nAvgBytesPerSec; delay_corrected=1; // hack + 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); } else { if(!delay_corrected && d_audio->pts){ float x=d_audio->pts-d_video->pts-(delay+audio_delay); @@ -1985,10 +1987,9 @@ switch(sh_video->codec->driver){ // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec) a_pts=d_audio->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-frame_time; - if(verbose)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(frame_corr_num==1){ @@ -2181,8 +2182,10 @@ switch(file_format){ // SEEK streams // if(d_video->pts) avi_video_pts=d_video->pts; avi_audio_pts=0; - d_video->pts=0; - d_audio->pts=0; + + // Done by ds_free_packs(): + //d_video->pts=0; + //d_audio->pts=0; // find video chunk pos: if(rel_seek_frames>0){ @@ -2210,20 +2213,18 @@ switch(file_format){ --video_chunk_pos; } } - demuxer->idx_pos_a=demuxer->idx_pos_v= - demuxer->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; + d_video->pack_no=0; for(i=0;iidx)[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; - } + if(avi_stream_id(id)==d_video->id) ++d_video->pack_no; } + avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; + //printf("v-pts recalc! %5.3f -> %5.3f \n",v_pts,avi_video_pts); //v_pts=avi_video_pts; //#else @@ -2252,10 +2253,7 @@ switch(file_format){ // find audio chunk pos: for(i=0;iidx)[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=((AVIINDEXENTRY *)demuxer->idx)[i].dwChunkLength; last=i; if(apos<=curr_audio_pos && curr_audio_pos<(apos+len)){ @@ -2263,7 +2261,6 @@ switch(file_format){ break; } apos+=len; - } } } if(verbose)printf("XXX i=%d last=%d apos=%d curr_audio_pos=%d \n", @@ -2275,8 +2272,7 @@ switch(file_format){ // update stream position: d_audio->pos=audio_chunk_pos; d_audio->dpos=apos; - demuxer->idx_pos_a=demuxer->idx_pos_v= - demuxer->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 @@ -2298,17 +2294,12 @@ switch(file_format){ // calc skip_video_frames & adjust video pts counter: // i=last; - i=demuxer->idx_pos; - while(iidx_pos;iidx)[i].ckid; -// if(LOWORD(id)==aviTWOCC('0','0')){ // video frame - if(avi_stream_id(id)==d_video->id){ // video frame - ++skip_video_frames; - // requires for correct audio pts calculation (demuxer): - avi_video_pts-=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; - } - ++i; + if(avi_stream_id(id)==d_video->id) ++skip_video_frames; } + // requires for correct audio pts calculation (demuxer): + avi_video_pts-=skip_video_frames*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; } @@ -2375,7 +2366,7 @@ switch(file_format){ if(skip_audio_bytes){ demux_read_data(d_audio,NULL,skip_audio_bytes); - d_audio->pts=0; // PTS is outdated because of the raw data skipping + //d_audio->pts=0; // PTS is outdated because of the raw data skipping } current_module="resync_audio"; @@ -2414,10 +2405,10 @@ switch(file_format){ } } - RESET_AUDIO(audio_fd); - current_module=NULL; + RESET_AUDIO(audio_fd); + c_total=0; // kell ez? printf("A:%6.1f V:%6.1f A-V:%7.3f",d_audio->pts,d_video->pts,0.0f); printf(" ct:%7.3f \r",c_total);fflush(stdout); @@ -2426,7 +2417,8 @@ switch(file_format){ } max_pts_correction=0.1; - frame_corr_num=-5; frame_correction=0; + frame_corr_num=0; // -5 + frame_correction=0; force_redraw=5; a_frame=-skip_audio_secs; // a_frame=-audio_delay-buffer_delay-skip_audio_secs;