Mercurial > mplayer.hg
changeset 9555:5270885f3502
Hopefully fixed all RV30/RV40 A-V sync issues
based on patch by Balatoni Denes <pnis@coder.hu>
author | arpi |
---|---|
date | Sun, 09 Mar 2003 19:01:20 +0000 |
parents | 12eae4cb4e56 |
children | 42376fcd704b |
files | libmpdemux/demux_real.c |
diffstat | 1 files changed, 24 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpdemux/demux_real.c Sun Mar 09 18:15:16 2003 +0000 +++ b/libmpdemux/demux_real.c Sun Mar 09 19:01:20 2003 +0000 @@ -60,6 +60,7 @@ int current_vpacket; // timestamp correction: + int kf_base;// timestamp of the prev. video keyframe int kf_pts; // timestamp of next video keyframe int a_pts; // previous audio timestamp float v_pts; // previous video timestamp @@ -321,7 +322,9 @@ uint32_t buffer= (s[0]<<24) + (s[1]<<16) + (s[2]<<8) + s[3]; int kf=timestamp; int pict_type; - + int orig_kf; + +#if 1 if(format==mmioFOURCC('R','V','3','0') || format==mmioFOURCC('R','V','4','0')){ if(format==mmioFOURCC('R','V','3','0')){ SKIP_BITS(3); @@ -330,24 +333,36 @@ }else{ SKIP_BITS(1); pict_type= SHOW_BITS(2); - SKIP_BITS(2 + 7 + 1); + SKIP_BITS(2 + 7 + 3); } - kf= 2*SHOW_BITS(12); - if(verbose>1) printf("\nTS: %08X (%04X) %d %02X %02X %02X %02X\n",timestamp,kf,pict_type,s[0],s[1],s[2],s[3]); - kf|=timestamp&(~0x1fff); // combine with packet timestamp - if(kf<timestamp-4096) kf+=8192; else // workaround wrap-around problems - if(kf>timestamp+4096) kf-=8192; + orig_kf= + kf= SHOW_BITS(13); // kf= 2*SHOW_BITS(12); +// if(pict_type==0) + if(pict_type<=1){ + // I frame, sync timestamps: + priv->kf_base=timestamp-kf; + if(verbose>1) printf("\nTS: base=%08X\n",priv->kf_base); + kf=timestamp; + } else { + // P/B frame, merge timestamps: + int tmp=timestamp-priv->kf_base; + kf|=tmp&(~0x1fff); // combine with packet timestamp + if(kf<tmp-4096) kf+=8192; else // workaround wrap-around problems + if(kf>tmp+4096) kf-=8192; + kf+=priv->kf_base; + } if(pict_type != 3){ // P || I frame -> swap timestamps int tmp=kf; kf=priv->kf_pts; priv->kf_pts=tmp; // if(kf<=tmp) kf=0; } + if(verbose>1) printf("\nTS: %08X -> %08X (%04X) %d %02X %02X %02X %02X %5d\n",timestamp,kf,orig_kf,pict_type,s[0],s[1],s[2],s[3],kf-(int)(1000.0*priv->v_pts)); } +#endif v_pts=kf*0.001f; - if(v_pts<priv->v_pts || !kf) v_pts=priv->v_pts+frametime; +// if(v_pts<priv->v_pts || !kf) v_pts=priv->v_pts+frametime; priv->v_pts=v_pts; -// printf("\n#T# %5d/%5d (%5.3f) %5.3f \n",kf,timestamp,frametime,v_pts); return v_pts; }