[soc]: r4556 - in concat/libavformat: m3u.c playlist.c playlist.h
Author: gkovacs Date: Wed Jul 1 03:45:05 2009 New Revision: 4556 Log: seperate audio and video stream switching times Modified: concat/libavformat/m3u.c concat/libavformat/playlist.c concat/libavformat/playlist.h Modified: concat/libavformat/m3u.c ============================================================================== --- concat/libavformat/m3u.c Wed Jul 1 03:25:57 2009 (r4555) +++ concat/libavformat/m3u.c Wed Jul 1 03:45:05 2009 (r4556) @@ -86,7 +86,7 @@ static int m3u_list_files(ByteIOContext static int m3u_read_header(AVFormatContext *s, AVFormatParameters *ap) { - printf("m3u read header called\n"); + int i; PlaylistD *playld = ff_make_playlistd(s->filename); m3u_list_files(s->pb, &(playld->flist), @@ -95,7 +95,9 @@ static int m3u_read_header(AVFormatConte playld->pelist = av_malloc(playld->pelist_size * sizeof(PlayElem*)); memset(playld->pelist, 0, playld->pelist_size * sizeof(PlayElem*)); s->priv_data = playld; - ff_playlist_populate_context(playld, s); + for (i = 0; i < playld->pe_curidxs_size; ++i) { + ff_playlist_populate_context(playld, s, i); + } return 0; } @@ -104,12 +106,18 @@ static int m3u_read_packet(AVFormatConte { int i; int ret; + int stream_index; PlaylistD *playld; AVFormatContext *ic; playld = s->priv_data; + stream_index = 0; retr: - ic = playld->pelist[playld->pe_curidx]->ic; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; ret = ic->iformat->read_packet(ic, pkt); + if (pkt) { + stream_index = pkt->stream_index; + ic = playld->pelist[playld->pe_curidxs[stream_index]]->ic; + } if (ret >= 0) { if (pkt) { pkt->dts += ff_conv_stream_time(ic, pkt->stream_index, playld->time_offsets[pkt->stream_index]); @@ -117,7 +125,7 @@ static int m3u_read_packet(AVFormatConte } // TODO switch from AVERROR_EOF to AVERROR_EOS // -32 AVERROR_EOF for avi, -51 for ogg - else if (ret < 0 && playld->pe_curidx < playld->pelist_size - 1) { + else if (ret < 0 && playld->pe_curidxs[stream_index] < 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; @@ -128,10 +136,12 @@ static int m3u_read_packet(AVFormatConte for (i = 0; i < ic->nb_streams && i < playld->time_offsets_size; ++i) { playld->time_offsets[i] += ff_get_duration(ic, i); } - ++playld->pe_curidx; + ++playld->pe_curidxs[stream_index]; // pkt->destruct(pkt); pkt = av_malloc(sizeof(AVPacket)); - ff_playlist_populate_context(playld, s); +// for (i = 0; i < playld->pe_curidxs_size; ++i) { + ff_playlist_populate_context(playld, s, stream_index); +// } goto retr; } else { @@ -148,7 +158,7 @@ static int m3u_read_seek(AVFormatContext PlaylistD *playld; AVFormatContext *ic; playld = s->priv_data; - ic = playld->pelist[playld->pe_curidx]->ic; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; ic->iformat->read_seek(ic, stream_index, pts, flags); } @@ -158,7 +168,7 @@ static int m3u_read_play(AVFormatContext PlaylistD *playld; AVFormatContext *ic; playld = s->priv_data; - ic = playld->pelist[playld->pe_curidx]->ic; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; return av_read_play(ic); } @@ -168,7 +178,7 @@ static int m3u_read_pause(AVFormatContex PlaylistD *playld; AVFormatContext *ic; playld = s->priv_data; - ic = playld->pelist[playld->pe_curidx]->ic; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; return av_read_pause(ic); } @@ -178,7 +188,7 @@ static int m3u_read_close(AVFormatContex PlaylistD *playld; AVFormatContext *ic; playld = s->priv_data; - ic = playld->pelist[playld->pe_curidx]->ic; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; if (ic->iformat->read_close) return ic->iformat->read_close(ic); return 0; @@ -193,7 +203,7 @@ static int m3u_read_timestamp(AVFormatCo PlaylistD *playld; AVFormatContext *ic; playld = s->priv_data; - ic = playld->pelist[playld->pe_curidx]->ic; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; if (ic->iformat->read_timestamp) return ic->iformat->read_timestamp(ic, stream_index, pos, pos_limit); return 0; Modified: concat/libavformat/playlist.c ============================================================================== --- concat/libavformat/playlist.c Wed Jul 1 03:25:57 2009 (r4555) +++ concat/libavformat/playlist.c Wed Jul 1 03:45:05 2009 (r4556) @@ -85,7 +85,10 @@ PlaylistD* ff_make_playlistd(char *filen playld->time_offsets = av_malloc(sizeof(playld->time_offsets) * playld->time_offsets_size); for (i = 0; i < playld->time_offsets_size; ++i) playld->time_offsets[i] = 0; - playld->pe_curidx = 0; + playld->pe_curidxs_size = 2; // TODO don't assume we have just 2 streams + playld->pe_curidxs = av_malloc(sizeof(playld->pe_curidxs) * playld->pe_curidxs_size); + for (i = 0; i < playld->pe_curidxs_size; ++i) + playld->pe_curidxs[i] = 0; ff_split_wd_fn(filename, &playld->workingdir, &playld->filename); @@ -170,15 +173,16 @@ void ff_split_wd_fn(char *filepath, } int ff_playlist_populate_context(PlaylistD *playld, - AVFormatContext *s) + AVFormatContext *s, + int stream_index) { int i; AVFormatContext *ic; AVFormatParameters *nap; printf("playlist_populate_context called\n"); - playld->pelist[playld->pe_curidx] = ff_make_playelem(playld->flist[playld->pe_curidx]); - ic = playld->pelist[playld->pe_curidx]->ic; - nap = playld->pelist[playld->pe_curidx]->ap; + playld->pelist[playld->pe_curidxs[stream_index]] = ff_make_playelem(playld->flist[playld->pe_curidxs[stream_index]]); + ic = playld->pelist[playld->pe_curidxs[stream_index]]->ic; + nap = playld->pelist[playld->pe_curidxs[stream_index]]->ap; ic->iformat->read_header(ic, 0); s->nb_streams = ic->nb_streams; for (i = 0; i < ic->nb_streams; ++i) { @@ -231,16 +235,18 @@ int ff_playlist_populate_context(Playlis return 0; } +/* unsigned int ff_get_stream_offset(AVFormatContext *s) { PlaylistD *playld; int i; unsigned int snum = 0; playld = s->priv_data; - for (i = 0; i < playld->pe_curidx; ++i) + for (i = 0; i < playld->pe_curidxs[0]; ++i) snum += playld->pelist[i]->ic->nb_streams; return snum; } +*/ // converts duration to stream base int64_t ff_conv_stream_time(AVFormatContext *ic, int stream_index, int64_t avt_duration) Modified: concat/libavformat/playlist.h ============================================================================== --- concat/libavformat/playlist.h Wed Jul 1 03:25:57 2009 (r4555) +++ concat/libavformat/playlist.h Wed Jul 1 03:45:05 2009 (r4556) @@ -35,7 +35,9 @@ typedef struct PlaylistD { // int flist_len; PlayElem **pelist; int pelist_size; - int pe_curidx; + int *pe_curidxs; + int pe_curidxs_size; +// int pe_curidx; AVChapter **chlist; int chlist_size; int ch_curidx; @@ -43,17 +45,13 @@ typedef struct PlaylistD { char *filename; int64_t *time_offsets; int time_offsets_size; -// int64_t pts_offset; -// int64_t dts_offset; -// int64_t pts_prevpacket; -// int64_t dts_prevpacket; } PlaylistD; PlayElem* ff_make_playelem(char *filename); PlaylistD* ff_make_playlistd(char *filename); -int ff_playlist_populate_context(PlaylistD *playld, AVFormatContext *s); +int ff_playlist_populate_context(PlaylistD *playld, AVFormatContext *s, int stream_index); char* ff_conc_strings(char *string1, char *string2); @@ -61,7 +59,7 @@ char* ff_buf_getline(ByteIOContext *s); void ff_split_wd_fn(char *filepath, char **workingdir, char **filename); -unsigned int ff_get_stream_offset(AVFormatContext *s); +//unsigned int ff_get_stream_offset(AVFormatContext *s); int64_t ff_conv_stream_time(AVFormatContext *ic, int stream_index, int64_t avt_duration);
Hi, gkovacs wrote:
Author: gkovacs Date: Wed Jul 1 03:45:05 2009 New Revision: 4556
[...]
PlaylistD *playld = ff_make_playlistd(s->filename);
For what does the D stand ? It doesn't seem obvious to me. [...] -- Baptiste COUDURIER GnuPG Key Id: 0x5C1ABAAA Key fingerprint 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA FFmpeg maintainer http://www.ffmpeg.org
On Sat, Jul 4, 2009 at 1:12 PM, Baptiste Coudurier<baptiste.coudurier@gmail.com> wrote:
Hi,
gkovacs wrote:
Author: gkovacs Date: Wed Jul 1 03:45:05 2009 New Revision: 4556
[...]
PlaylistD *playld = ff_make_playlistd(s->filename);
For what does the D stand ? It doesn't seem obvious to me.
Playlist Data, I added the "D" since plain "Playlist" is often used in other libraries as well and don't want to inconvenience libavformat users with naming conflicts since C doesn't support namespaces.
[...]
-- Baptiste COUDURIER GnuPG Key Id: 0x5C1ABAAA Key fingerprint 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA FFmpeg maintainer http://www.ffmpeg.org _______________________________________________ FFmpeg-soc mailing list FFmpeg-soc@mplayerhq.hu https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc
Geza Kovacs wrote:
On Sat, Jul 4, 2009 at 1:12 PM, Baptiste Coudurier<baptiste.coudurier@gmail.com> wrote:
Hi,
gkovacs wrote:
Author: gkovacs Date: Wed Jul 1 03:45:05 2009 New Revision: 4556
[...]
PlaylistD *playld = ff_make_playlistd(s->filename); For what does the D stand ? It doesn't seem obvious to me.
Playlist Data, I added the "D" since plain "Playlist" is often used in other libraries as well and don't want to inconvenience libavformat users with naming conflicts since C doesn't support namespaces.
Maybe _C_ontext would be better in this case, what do you think ? -- Baptiste COUDURIER GnuPG Key Id: 0x5C1ABAAA Key fingerprint 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA FFmpeg maintainer http://www.ffmpeg.org
participants (3)
-
Baptiste Coudurier -
Geza Kovacs -
gkovacs