Mercurial > mplayer.hg
comparison mplayer.c @ 889:1b905517c684
AVI -bps desync problem solved
author | arpi_esp |
---|---|
date | Sun, 27 May 2001 00:02:12 +0000 |
parents | 258884190f83 |
children | bad858a47870 |
comparison
equal
deleted
inserted
replaced
888:c7561094bc2c | 889:1b905517c684 |
---|---|
1969 if(pts_from_bps){ | 1969 if(pts_from_bps){ |
1970 // PTS = (audio position)/(bytes per sec) | 1970 // PTS = (audio position)/(bytes per sec) |
1971 // a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; | 1971 // a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; |
1972 a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->wf->nAvgBytesPerSec; | 1972 a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->wf->nAvgBytesPerSec; |
1973 delay_corrected=1; // hack | 1973 delay_corrected=1; // hack |
1974 v_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | |
1975 if(verbose)printf("%5.3f|",v_pts-d_video->pts); | |
1974 } else { | 1976 } else { |
1975 if(!delay_corrected && d_audio->pts){ | 1977 if(!delay_corrected && d_audio->pts){ |
1976 float x=d_audio->pts-d_video->pts-(delay+audio_delay); | 1978 float x=d_audio->pts-d_video->pts-(delay+audio_delay); |
1977 float y=-(delay+audio_delay); | 1979 float y=-(delay+audio_delay); |
1978 printf("Initial PTS delay: %5.3f sec (calculated: %5.3f)\n",x,y); | 1980 printf("Initial PTS delay: %5.3f sec (calculated: %5.3f)\n",x,y); |
1983 audio_delay,delay,d_audio->pts,d_video->pts); | 1985 audio_delay,delay,d_audio->pts,d_video->pts); |
1984 } | 1986 } |
1985 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec) | 1987 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec) |
1986 a_pts=d_audio->pts; | 1988 a_pts=d_audio->pts; |
1987 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; | 1989 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; |
1988 } | 1990 v_pts=d_video->pts-frame_time; |
1989 | 1991 } |
1990 v_pts=d_video->pts-frame_time; | |
1991 | 1992 |
1992 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); | 1993 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); |
1993 | 1994 |
1994 if(frame_corr_num==1){ | 1995 if(frame_corr_num==1){ |
1995 float x=frame_correction; | 1996 float x=frame_correction; |
2179 skip_video_frames=0; | 2180 skip_video_frames=0; |
2180 | 2181 |
2181 // SEEK streams | 2182 // SEEK streams |
2182 // if(d_video->pts) avi_video_pts=d_video->pts; | 2183 // if(d_video->pts) avi_video_pts=d_video->pts; |
2183 avi_audio_pts=0; | 2184 avi_audio_pts=0; |
2184 d_video->pts=0; | 2185 |
2185 d_audio->pts=0; | 2186 // Done by ds_free_packs(): |
2187 //d_video->pts=0; | |
2188 //d_audio->pts=0; | |
2186 | 2189 |
2187 // find video chunk pos: | 2190 // find video chunk pos: |
2188 if(rel_seek_frames>0){ | 2191 if(rel_seek_frames>0){ |
2189 // seek forward | 2192 // seek forward |
2190 while(video_chunk_pos<demuxer->idx_size){ | 2193 while(video_chunk_pos<demuxer->idx_size){ |
2208 --skip_audio_bytes; | 2211 --skip_audio_bytes; |
2209 } | 2212 } |
2210 --video_chunk_pos; | 2213 --video_chunk_pos; |
2211 } | 2214 } |
2212 } | 2215 } |
2213 demuxer->idx_pos_a=demuxer->idx_pos_v= | 2216 demuxer->idx_pos_a=demuxer->idx_pos_v=demuxer->idx_pos=video_chunk_pos; |
2214 demuxer->idx_pos=video_chunk_pos; | |
2215 // printf("%d frames skipped\n",skip_audio_bytes); | 2217 // printf("%d frames skipped\n",skip_audio_bytes); |
2216 | 2218 |
2217 #if 1 | 2219 #if 1 |
2218 // re-calc video pts: | 2220 // re-calc video pts: |
2219 avi_video_pts=0; | 2221 d_video->pack_no=0; |
2220 for(i=0;i<video_chunk_pos;i++){ | 2222 for(i=0;i<video_chunk_pos;i++){ |
2221 int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid; | 2223 int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid; |
2222 // if(LOWORD(id)==aviTWOCC('0','0')){ // video frame | 2224 if(avi_stream_id(id)==d_video->id) ++d_video->pack_no; |
2223 if(avi_stream_id(id)==d_video->id){ // video frame | |
2224 avi_video_pts+=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | |
2225 } | |
2226 } | 2225 } |
2226 avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | |
2227 | |
2227 //printf("v-pts recalc! %5.3f -> %5.3f \n",v_pts,avi_video_pts); | 2228 //printf("v-pts recalc! %5.3f -> %5.3f \n",v_pts,avi_video_pts); |
2228 //v_pts=avi_video_pts; | 2229 //v_pts=avi_video_pts; |
2229 //#else | 2230 //#else |
2230 //avi_video_pts=v_pts; | 2231 //avi_video_pts=v_pts; |
2231 #endif | 2232 #endif |
2250 #endif | 2251 #endif |
2251 | 2252 |
2252 // find audio chunk pos: | 2253 // find audio chunk pos: |
2253 for(i=0;i<video_chunk_pos;i++){ | 2254 for(i=0;i<video_chunk_pos;i++){ |
2254 int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid; | 2255 int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid; |
2255 //if(TWOCCFromFOURCC(id)==cktypeWAVEbytes){ | |
2256 if(avi_stream_id(id)==d_audio->id){ | 2256 if(avi_stream_id(id)==d_audio->id){ |
2257 int aid=StreamFromFOURCC(id); | |
2258 if(d_audio->id==aid || d_audio->id==-1){ | |
2259 len=((AVIINDEXENTRY *)demuxer->idx)[i].dwChunkLength; | 2257 len=((AVIINDEXENTRY *)demuxer->idx)[i].dwChunkLength; |
2260 last=i; | 2258 last=i; |
2261 if(apos<=curr_audio_pos && curr_audio_pos<(apos+len)){ | 2259 if(apos<=curr_audio_pos && curr_audio_pos<(apos+len)){ |
2262 if(verbose)printf("break;\n"); | 2260 if(verbose)printf("break;\n"); |
2263 break; | 2261 break; |
2264 } | 2262 } |
2265 apos+=len; | 2263 apos+=len; |
2266 } | |
2267 } | 2264 } |
2268 } | 2265 } |
2269 if(verbose)printf("XXX i=%d last=%d apos=%d curr_audio_pos=%d \n", | 2266 if(verbose)printf("XXX i=%d last=%d apos=%d curr_audio_pos=%d \n", |
2270 i,last,apos,curr_audio_pos); | 2267 i,last,apos,curr_audio_pos); |
2271 // audio_chunk_pos=last; // maybe wrong (if not break; ) | 2268 // audio_chunk_pos=last; // maybe wrong (if not break; ) |
2273 skip_audio_bytes=curr_audio_pos-apos; | 2270 skip_audio_bytes=curr_audio_pos-apos; |
2274 | 2271 |
2275 // update stream position: | 2272 // update stream position: |
2276 d_audio->pos=audio_chunk_pos; | 2273 d_audio->pos=audio_chunk_pos; |
2277 d_audio->dpos=apos; | 2274 d_audio->dpos=apos; |
2278 demuxer->idx_pos_a=demuxer->idx_pos_v= | 2275 demuxer->idx_pos_a=demuxer->idx_pos_v=demuxer->idx_pos=audio_chunk_pos; |
2279 demuxer->idx_pos=audio_chunk_pos; | |
2280 | 2276 |
2281 if(!(sh_audio->codec->flags&CODECS_FLAG_SEEKABLE)){ | 2277 if(!(sh_audio->codec->flags&CODECS_FLAG_SEEKABLE)){ |
2282 #if 0 | 2278 #if 0 |
2283 // curr_audio_pos=apos; // selected audio codec can't seek in chunk | 2279 // curr_audio_pos=apos; // selected audio codec can't seek in chunk |
2284 skip_audio_secs=(float)skip_audio_bytes/(float)sh_audio->wf->nAvgBytesPerSec; | 2280 skip_audio_secs=(float)skip_audio_bytes/(float)sh_audio->wf->nAvgBytesPerSec; |
2296 // skip_audio_bytes=bytes to skip from that chunk | 2292 // skip_audio_bytes=bytes to skip from that chunk |
2297 // skip_audio_secs=time to play audio before video (if can't skip) | 2293 // skip_audio_secs=time to play audio before video (if can't skip) |
2298 | 2294 |
2299 // calc skip_video_frames & adjust video pts counter: | 2295 // calc skip_video_frames & adjust video pts counter: |
2300 // i=last; | 2296 // i=last; |
2301 i=demuxer->idx_pos; | 2297 for(i=demuxer->idx_pos;i<video_chunk_pos;i++){ |
2302 while(i<video_chunk_pos){ | |
2303 int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid; | 2298 int id=((AVIINDEXENTRY *)demuxer->idx)[i].ckid; |
2304 // if(LOWORD(id)==aviTWOCC('0','0')){ // video frame | 2299 if(avi_stream_id(id)==d_video->id) ++skip_video_frames; |
2305 if(avi_stream_id(id)==d_video->id){ // video frame | |
2306 ++skip_video_frames; | |
2307 // requires for correct audio pts calculation (demuxer): | |
2308 avi_video_pts-=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | |
2309 } | |
2310 ++i; | |
2311 } | 2300 } |
2301 // requires for correct audio pts calculation (demuxer): | |
2302 avi_video_pts-=skip_video_frames*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | |
2312 | 2303 |
2313 } | 2304 } |
2314 | 2305 |
2315 if(verbose) printf("SEEK: idx=%d (a:%d v:%d) v.skip=%d a.skip=%d/%4.3f \n", | 2306 if(verbose) printf("SEEK: idx=%d (a:%d v:%d) v.skip=%d a.skip=%d/%4.3f \n", |
2316 demuxer->idx_pos,audio_chunk_pos,video_chunk_pos, | 2307 demuxer->idx_pos,audio_chunk_pos,video_chunk_pos, |
2373 //====================== re-sync audio: ===================== | 2364 //====================== re-sync audio: ===================== |
2374 if(has_audio){ | 2365 if(has_audio){ |
2375 | 2366 |
2376 if(skip_audio_bytes){ | 2367 if(skip_audio_bytes){ |
2377 demux_read_data(d_audio,NULL,skip_audio_bytes); | 2368 demux_read_data(d_audio,NULL,skip_audio_bytes); |
2378 d_audio->pts=0; // PTS is outdated because of the raw data skipping | 2369 //d_audio->pts=0; // PTS is outdated because of the raw data skipping |
2379 } | 2370 } |
2380 | 2371 |
2381 current_module="resync_audio"; | 2372 current_module="resync_audio"; |
2382 | 2373 |
2383 switch(sh_audio->codec->driver){ | 2374 switch(sh_audio->codec->driver){ |
2412 } | 2403 } |
2413 } | 2404 } |
2414 } | 2405 } |
2415 } | 2406 } |
2416 | 2407 |
2408 current_module=NULL; | |
2409 | |
2417 RESET_AUDIO(audio_fd); | 2410 RESET_AUDIO(audio_fd); |
2418 | |
2419 current_module=NULL; | |
2420 | 2411 |
2421 c_total=0; // kell ez? | 2412 c_total=0; // kell ez? |
2422 printf("A:%6.1f V:%6.1f A-V:%7.3f",d_audio->pts,d_video->pts,0.0f); | 2413 printf("A:%6.1f V:%6.1f A-V:%7.3f",d_audio->pts,d_video->pts,0.0f); |
2423 printf(" ct:%7.3f \r",c_total);fflush(stdout); | 2414 printf(" ct:%7.3f \r",c_total);fflush(stdout); |
2424 } else { | 2415 } else { |
2425 printf("A: --- V:%6.1f \r",d_video->pts);fflush(stdout); | 2416 printf("A: --- V:%6.1f \r",d_video->pts);fflush(stdout); |
2426 } | 2417 } |
2427 | 2418 |
2428 max_pts_correction=0.1; | 2419 max_pts_correction=0.1; |
2429 frame_corr_num=-5; frame_correction=0; | 2420 frame_corr_num=0; // -5 |
2421 frame_correction=0; | |
2430 force_redraw=5; | 2422 force_redraw=5; |
2431 a_frame=-skip_audio_secs; | 2423 a_frame=-skip_audio_secs; |
2432 // a_frame=-audio_delay-buffer_delay-skip_audio_secs; | 2424 // a_frame=-audio_delay-buffer_delay-skip_audio_secs; |
2433 v_frame=0; // !!!!!! | 2425 v_frame=0; // !!!!!! |
2434 audio_time_usage=0; video_time_usage=0; vout_time_usage=0; | 2426 audio_time_usage=0; video_time_usage=0; vout_time_usage=0; |