comparison mencoder.c @ 15994:13ae8ec083f6

-delay for MEncoder, step 3.
author ods15
date Sun, 17 Jul 2005 19:26:49 +0000
parents 4cc096594a6a
children c3755444496d
comparison
equal deleted inserted replaced
15993:4cc096594a6a 15994:13ae8ec083f6
237 unsigned char* start; 237 unsigned char* start;
238 int in_size; 238 int in_size;
239 float frame_time; 239 float frame_time;
240 int already_read; 240 int already_read;
241 } s_frame_data; 241 } s_frame_data;
242
243 /// Returns a_pts
244 static float calc_a_pts(demux_stream_t *d_audio);
242 245
243 #ifdef USE_EDL 246 #ifdef USE_EDL
244 #include "edl.h" 247 #include "edl.h"
245 static edl_record_ptr edl_records = NULL; ///< EDL entries memory area 248 static edl_record_ptr edl_records = NULL; ///< EDL entries memory area
246 static edl_record_ptr next_edl_record = NULL; ///< only for traversing edl_records 249 static edl_record_ptr next_edl_record = NULL; ///< only for traversing edl_records
1605 } 1608 }
1606 #endif 1609 #endif
1607 return timeleft; 1610 return timeleft;
1608 } 1611 }
1609 1612
1613 static float calc_a_pts(demux_stream_t *d_audio) {
1614 sh_audio_t * sh_audio = d_audio ? d_audio->sh : NULL;
1615 float a_pts = 0.;
1616 if (sh_audio)
1617 a_pts = d_audio->pts + (ds_tell_pts(d_audio) - sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
1618 return a_pts;
1619 }
1620
1610 #ifdef USE_EDL 1621 #ifdef USE_EDL
1611 static int edl_seek(edl_record_ptr next_edl_record, demuxer_t* demuxer, demux_stream_t *d_audio, muxer_stream_t* mux_a, s_frame_data * frame_data, int framecopy) { 1622 static int edl_seek(edl_record_ptr next_edl_record, demuxer_t* demuxer, demux_stream_t *d_audio, muxer_stream_t* mux_a, s_frame_data * frame_data, int framecopy) {
1612 sh_audio_t * sh_audio = d_audio->sh; 1623 sh_audio_t * sh_audio = d_audio->sh;
1613 sh_video_t * sh_video = demuxer->video ? demuxer->video->sh : NULL; 1624 sh_video_t * sh_video = demuxer->video ? demuxer->video->sh : NULL;
1614 vf_instance_t * vfilter = sh_video ? sh_video->vfilter : NULL; 1625 vf_instance_t * vfilter = sh_video ? sh_video->vfilter : NULL;
1642 frame_data->in_size = video_read_frame(sh_video, &frame_data->frame_time, &frame_data->start, force_fps); 1653 frame_data->in_size = video_read_frame(sh_video, &frame_data->frame_time, &frame_data->start, force_fps);
1643 if(frame_data->in_size<0) return 2; 1654 if(frame_data->in_size<0) return 2;
1644 sh_video->timer += frame_data->frame_time; 1655 sh_video->timer += frame_data->frame_time;
1645 1656
1646 if (sh_audio) { 1657 if (sh_audio) {
1647 a_pts = d_audio->pts + (ds_tell_pts(d_audio) - sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; 1658 a_pts = calc_a_pts(d_audio);
1648 while (sh_video->pts - frame_data->frame_time > a_pts) { 1659 while (sh_video->pts - frame_data->frame_time > a_pts) {
1649 int len; 1660 int len;
1650 if (samplesize) { 1661 if (samplesize) {
1651 len = avg * (sh_video->pts - frame_data->frame_time - a_pts); 1662 len = avg * (sh_video->pts - frame_data->frame_time - a_pts);
1652 len/= samplesize; if(len<1) len=1; 1663 len/= samplesize; if(len<1) len=1;
1655 } else { 1666 } else {
1656 unsigned char * crap; 1667 unsigned char * crap;
1657 len = ds_get_packet(sh_audio->ds, &crap); 1668 len = ds_get_packet(sh_audio->ds, &crap);
1658 } 1669 }
1659 if (len <= 0) break; // EOF of audio. 1670 if (len <= 0) break; // EOF of audio.
1660 a_pts = d_audio->pts + (ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; 1671 a_pts = calc_a_pts(d_audio);
1661 } 1672 }
1662 } 1673 }
1663 1674
1664 if (done) { 1675 if (done) {
1665 frame_data->already_read = 1; 1676 frame_data->already_read = 1;