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;