Author: gkovacs Date: Tue Jun 30 21:28:59 2009 New Revision: 4553 Log: fixed timestamps on outputted files, ffmpeg with same-format inputs should now be working
Modified: concat/libavformat/m3u.c concat/libavformat/playlist.c concat/libavformat/playlist.h Modified: concat/libavformat/m3u.c ============================================================================== --- concat/libavformat/m3u.c Tue Jun 30 19:43:58 2009 (r4552) +++ concat/libavformat/m3u.c Tue Jun 30 21:28:59 2009 (r4553) @@ -87,18 +87,13 @@ static int m3u_read_header(AVFormatConte AVFormatParameters *ap) { printf("m3u read header called\n"); - PlaylistD *playld = av_malloc(sizeof(PlaylistD)); - ff_split_wd_fn(s->filename, - &playld->workingdir, - &playld->filename); + PlaylistD *playld = ff_make_playlistd(s->filename); m3u_list_files(s->pb, &(playld->flist), &(playld->pelist_size), playld->workingdir); -// playld = av_make_playlistd(flist, flist_len); playld->pelist = av_malloc(playld->pelist_size * sizeof(PlayElem*)); memset(playld->pelist, 0, playld->pelist_size * sizeof(PlayElem*)); - playld->pe_curidx = 0; s->priv_data = playld; ff_playlist_populate_context(playld, s); return 0; @@ -107,20 +102,36 @@ static int m3u_read_header(AVFormatConte static int m3u_read_packet(AVFormatContext *s, AVPacket *pkt) { - int i; int ret; - int time_offset = 0; PlaylistD *playld; AVFormatContext *ic; playld = s->priv_data; retr: ic = playld->pelist[playld->pe_curidx]->ic; ret = ic->iformat->read_packet(ic, pkt); -// if (pkt) { -// pkt->stream_index += get_stream_offset(s); -// } - if (ret < 0 && playld->pe_curidx < playld->pelist_size - 1) - { + if (ret >= 0) { + // TODO storing previous packet pts/dts is ugly hack + // ic->stream[]->cur_dts correct + // ic->strea[]->duration correct + // pkt->pts incorrect (huge negative) + // pkt->dts correct, depended on by ffmpeg (need to change) + // ic->stream[]->pts incorrect (0) + // ic->start_time always 0 + // changing ic->start_time has no effect + // ic->duration correct, divide by AV_TIME_BASE to get seconds + if (pkt) { + playld->dts_prevpacket = pkt->dts; + pkt->dts += playld->dts_offset; + } + } + // TODO switch from AVERROR_EOF to AVERROR_EOS + else if (ret == AVERROR_EOF && playld->pe_curidx < playld->pelist_size - 1) { + // TODO account for out-of-sync audio/video by using per-stream offsets + // using streams[]->duration slightly overestimates offset +// playld->dts_offset += ic->streams[0]->duration; + // using streams[]->cur_dts slightly overestimates offset +// playld->dts_offset += ic->streams[0]->cur_dts; + playld->dts_offset += playld->dts_prevpacket; ++playld->pe_curidx; // pkt->destruct(pkt); pkt = av_malloc(sizeof(AVPacket)); Modified: concat/libavformat/playlist.c ============================================================================== --- concat/libavformat/playlist.c Tue Jun 30 19:43:58 2009 (r4552) +++ concat/libavformat/playlist.c Tue Jun 30 21:28:59 2009 (r4553) @@ -45,7 +45,7 @@ int ff_alloc_playelem(unsigned char *fil return 0; } -PlayElem* ff_make_playelem(unsigned char *filename) +PlayElem* ff_make_playelem(char *filename) { int err; PlayElem *pe = av_malloc(sizeof(PlayElem)); @@ -77,15 +77,17 @@ PlayElem* ff_make_playelem(unsigned char return pe; } -PlaylistD* ff_make_playlistd(unsigned char **flist, - int flist_len) +PlaylistD* ff_make_playlistd(char *filename) { - int i; PlaylistD *playld = av_malloc(sizeof(PlaylistD)); +// playld->pts_offset = 0; + playld->dts_offset = 0; +// playld->pts_prevpacket = 0; + playld->dts_prevpacket = 0; playld->pe_curidx = 0; - playld->pelist_size = flist_len; - playld->pelist = av_malloc(playld->pelist_size * sizeof(PlayElem*)); - memset(playld->pelist, 0, playld->pelist_size * sizeof(PlayElem*)); + ff_split_wd_fn(filename, + &playld->workingdir, + &playld->filename); return playld; } @@ -170,7 +172,6 @@ int ff_playlist_populate_context(Playlis AVFormatContext *s) { int i; -// unsigned int stream_offset; AVFormatContext *ic; AVFormatParameters *nap; printf("playlist_populate_context called\n"); @@ -178,12 +179,9 @@ int ff_playlist_populate_context(Playlis ic = playld->pelist[playld->pe_curidx]->ic; nap = playld->pelist[playld->pe_curidx]->ap; ic->iformat->read_header(ic, 0); -// stream_offset = get_stream_offset(s); s->nb_streams = ic->nb_streams; -// s->nb_streams = ic->nb_streams + stream_offset; for (i = 0; i < ic->nb_streams; ++i) { s->streams[i] = ic->streams[i]; -// s->streams[i+stream_offset] = ic->streams[i]; } // TODO remove this ugly hack s->av_class = ic->av_class; Modified: concat/libavformat/playlist.h ============================================================================== --- concat/libavformat/playlist.h Tue Jun 30 19:43:58 2009 (r4552) +++ concat/libavformat/playlist.h Tue Jun 30 21:28:59 2009 (r4553) @@ -41,11 +41,15 @@ typedef struct PlaylistD { int ch_curidx; char *workingdir; char *filename; +// int64_t pts_offset; + int64_t dts_offset; +// int64_t pts_prevpacket; + int64_t dts_prevpacket; } PlaylistD; -PlayElem* ff_make_playelem(unsigned char *filename); +PlayElem* ff_make_playelem(char *filename); -PlaylistD* ff_make_playlistd(unsigned char **flist, int flist_len); +PlaylistD* ff_make_playlistd(char *filename); int ff_playlist_populate_context(PlaylistD *playld, AVFormatContext *s); _______________________________________________ FFmpeg-soc mailing list FFmpeg-soc@mplayerhq.hu https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc