[soc]: r4595 - in concat/libavformat: concat.c concatgen.c concatgen.h m3u.c playlist.h
Author: gkovacs Date: Sat Jul 4 20:59:56 2009 New Revision: 4595 Log: moved format-independent demuxer portions from m3u demuxer into concatgen for future reuse in pls, asx, and xpsf demuxers Added: concat/libavformat/concat.c concat/libavformat/concatgen.c concat/libavformat/concatgen.h Modified: concat/libavformat/m3u.c concat/libavformat/playlist.h Added: concat/libavformat/concat.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ concat/libavformat/concat.c Sat Jul 4 20:59:56 2009 (r4595) @@ -0,0 +1,64 @@ +/* + * Standard playlist/concatenation demuxer + * Copyright (c) 2009 Geza Kovacs + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "concatgen.h" + +/* The ffmpeg codecs we support, and the IDs they have in the file */ +static const AVCodecTag codec_concat_tags[] = { + { 0, 0 }, +}; + +static int concat_probe(AVProbeData *p) +{ + // concat demuxer should only be manually constructed in ffmpeg + return 0; +} + +static int concat_read_header(AVFormatContext *s, + AVFormatParameters *ap) +{ + // PlaylistD should be constructed externally + return 0; +} + + +#if CONFIG_CONCAT_DEMUXER +AVInputFormat concat_demuxer = { + "concat", + NULL_IF_CONFIG_SMALL("CONCAT format"), + 0, + concat_probe, + concat_read_header, + concatgen_read_packet, + concatgen_read_close, + concatgen_read_seek, + concatgen_read_timestamp, + NULL, //flags + NULL, //extensions + NULL, //value + concatgen_read_play, + concatgen_read_pause, + (const AVCodecTag* const []){codec_concat_tags, 0}, + NULL, //m3u_read_seek2 + NULL, //metadata_conv + NULL, //next +}; +#endif Added: concat/libavformat/concatgen.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ concat/libavformat/concatgen.c Sat Jul 4 20:59:56 2009 (r4595) @@ -0,0 +1,132 @@ +/* + * Generic functions used by playlist/concatenation demuxers + * Copyright (c) 2009 Geza Kovacs + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "concatgen.h" + +int concatgen_read_packet(AVFormatContext *s, + AVPacket *pkt) +{ + int i; + int ret; + int stream_index; + PlaylistD *playld; + AVFormatContext *ic; + playld = s->priv_data; + stream_index = 0; + retr: + 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) { + int64_t time_offset = ff_conv_stream_time(ic, pkt->stream_index, playld->time_offsets[pkt->stream_index]); + pkt->dts += time_offset; + pkt->pts = pkt->dts + 1; + } + } + // TODO switch from AVERROR_EOF to AVERROR_EOS + // -32 AVERROR_EOF for avi, -51 for ogg + 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; + // using streams[]->cur_dts slightly overestimates offset +// playld->dts_offset += ic->streams[0]->cur_dts; +// playld->dts_offset += playld->dts_prevpacket; + printf("switching streams\n"); + for (i = 0; i < ic->nb_streams && i < playld->time_offsets_size; ++i) { + playld->time_offsets[i] += ff_get_duration(ic, i); + } + ++playld->pe_curidxs[stream_index]; +// pkt->destruct(pkt); + pkt = av_malloc(sizeof(AVPacket)); +// for (i = 0; i < playld->pe_curidxs_size; ++i) { + ff_playlist_populate_context(playld, s, stream_index); +// } + goto retr; + } + else { + printf("avpacket ret is %d\n", ret); + } + return ret; +} + +int concatgen_read_seek(AVFormatContext *s, + int stream_index, + int64_t pts, + int flags) +{ + PlaylistD *playld; + AVFormatContext *ic; + playld = s->priv_data; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; + ic->iformat->read_seek(ic, stream_index, pts, flags); +} + +int concatgen_read_timestamp(AVFormatContext *s, + int stream_index, + int64_t *pos, + int64_t pos_limit) +{ + printf("m3u_read_timestamp called\n"); + PlaylistD *playld; + AVFormatContext *ic; + playld = s->priv_data; + 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; +} + +int concatgen_read_close(AVFormatContext *s) +{ + printf("m3u_read_close called\n"); + PlaylistD *playld; + AVFormatContext *ic; + playld = s->priv_data; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; + if (ic->iformat->read_close) + return ic->iformat->read_close(ic); + return 0; +} + +int concatgen_read_play(AVFormatContext *s) +{ + printf("m3u_read_play called\n"); + PlaylistD *playld; + AVFormatContext *ic; + playld = s->priv_data; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; + return av_read_play(ic); +} + +int concatgen_read_pause(AVFormatContext *s) +{ + printf("m3u_read_pause called\n"); + PlaylistD *playld; + AVFormatContext *ic; + playld = s->priv_data; + ic = playld->pelist[playld->pe_curidxs[0]]->ic; + return av_read_pause(ic); +} Added: concat/libavformat/concatgen.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ concat/libavformat/concatgen.h Sat Jul 4 20:59:56 2009 (r4595) @@ -0,0 +1,40 @@ +/* + * Generic functions used by playlist/concatenation demuxers + * Copyright (c) 2009 Geza Kovacs + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _CONCATGEN_H +#define _CONCATGEN_H + +#include "playlist.h" + +int concatgen_read_packet(AVFormatContext *s, AVPacket *pkt); + +int concatgen_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags); + +int concatgen_read_timestamp(AVFormatContext *s, int stream_index, int64_t *pos, int64_t pos_limit); + +int concatgen_read_close(AVFormatContext *s); + +int concatgen_read_play(AVFormatContext *s); + +int concatgen_read_pause(AVFormatContext *s); + +#endif /* _CONCATGEN_H */ + Modified: concat/libavformat/m3u.c ============================================================================== --- concat/libavformat/m3u.c Sat Jul 4 17:04:59 2009 (r4594) +++ concat/libavformat/m3u.c Sat Jul 4 20:59:56 2009 (r4595) @@ -19,12 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "avformat.h" -#include "riff.h" -#include "playlist.h" - -/* if we don't know the size in advance */ -#define M3U_UNKNOWN_SIZE ((uint32_t)(~0)) +#include "concatgen.h" /* The ffmpeg codecs we support, and the IDs they have in the file */ static const AVCodecTag codec_m3u_tags[] = { @@ -101,132 +96,22 @@ static int m3u_read_header(AVFormatConte return 0; } -static int m3u_read_packet(AVFormatContext *s, - AVPacket *pkt) -{ - int i; - int ret; - int stream_index; - PlaylistD *playld; - AVFormatContext *ic; - playld = s->priv_data; - stream_index = 0; - retr: - 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) { - int64_t time_offset = ff_conv_stream_time(ic, pkt->stream_index, playld->time_offsets[pkt->stream_index]); - pkt->dts += time_offset; - pkt->pts = pkt->dts + 1; - } - } - // TODO switch from AVERROR_EOF to AVERROR_EOS - // -32 AVERROR_EOF for avi, -51 for ogg - 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; - // using streams[]->cur_dts slightly overestimates offset -// playld->dts_offset += ic->streams[0]->cur_dts; -// playld->dts_offset += playld->dts_prevpacket; - printf("switching streams\n"); - for (i = 0; i < ic->nb_streams && i < playld->time_offsets_size; ++i) { - playld->time_offsets[i] += ff_get_duration(ic, i); - } - ++playld->pe_curidxs[stream_index]; -// pkt->destruct(pkt); - pkt = av_malloc(sizeof(AVPacket)); -// for (i = 0; i < playld->pe_curidxs_size; ++i) { - ff_playlist_populate_context(playld, s, stream_index); -// } - goto retr; - } - else { - printf("avpacket ret is %d\n", ret); - } - return ret; -} - -static int m3u_read_seek(AVFormatContext *s, - int stream_index, - int64_t pts, - int flags) -{ - PlaylistD *playld; - AVFormatContext *ic; - playld = s->priv_data; - ic = playld->pelist[playld->pe_curidxs[0]]->ic; - ic->iformat->read_seek(ic, stream_index, pts, flags); -} - -static int m3u_read_play(AVFormatContext *s) -{ - printf("m3u_read_play called\n"); - PlaylistD *playld; - AVFormatContext *ic; - playld = s->priv_data; - ic = playld->pelist[playld->pe_curidxs[0]]->ic; - return av_read_play(ic); -} - -static int m3u_read_pause(AVFormatContext *s) -{ - printf("m3u_read_pause called\n"); - PlaylistD *playld; - AVFormatContext *ic; - playld = s->priv_data; - ic = playld->pelist[playld->pe_curidxs[0]]->ic; - return av_read_pause(ic); -} - -static int m3u_read_close(AVFormatContext *s) -{ - printf("m3u_read_close called\n"); - PlaylistD *playld; - AVFormatContext *ic; - playld = s->priv_data; - ic = playld->pelist[playld->pe_curidxs[0]]->ic; - if (ic->iformat->read_close) - return ic->iformat->read_close(ic); - return 0; -} - -static int m3u_read_timestamp(AVFormatContext *s, - int stream_index, - int64_t *pos, - int64_t pos_limit) -{ - printf("m3u_read_timestamp called\n"); - PlaylistD *playld; - AVFormatContext *ic; - playld = s->priv_data; - 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; -} - -#if CONFIG_M3U_DEMUXER +#if CONFIG_CONCAT_DEMUXER AVInputFormat m3u_demuxer = { "m3u", NULL_IF_CONFIG_SMALL("M3U format"), 0, m3u_probe, m3u_read_header, - m3u_read_packet, - m3u_read_close, //m3u_read_close - m3u_read_seek, - m3u_read_timestamp, //m3u_read_timestamp + concatgen_read_packet, + concatgen_read_close, + concatgen_read_seek, + concatgen_read_timestamp, NULL, //flags NULL, //extensions NULL, //value - m3u_read_play, - m3u_read_pause, + concatgen_read_play, + concatgen_read_pause, (const AVCodecTag* const []){codec_m3u_tags, 0}, NULL, //m3u_read_seek2 NULL, //metadata_conv Modified: concat/libavformat/playlist.h ============================================================================== --- concat/libavformat/playlist.h Sat Jul 4 17:04:59 2009 (r4594) +++ concat/libavformat/playlist.h Sat Jul 4 20:59:56 2009 (r4595) @@ -19,6 +19,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifndef _PLAYLIST_H +#define _PLAYLIST_H + +#include "avformat.h" +#include "riff.h" typedef struct PlayElem { AVFormatContext *ic; @@ -64,3 +69,5 @@ int64_t ff_conv_stream_time(AVFormatCont int64_t ff_conv_base_time(AVFormatContext *ic, int stream_index, int64_t stream_duration); int64_t ff_get_duration(AVFormatContext *ic, int stream_index); + +#endif /* _PLAYLIST_H */
On Sat, Jul 04, 2009 at 08:59:56PM +0200, gkovacs wrote:
Log: moved format-independent demuxer portions from m3u demuxer into concatgen for future reuse in pls, asx, and xpsf demuxers
Please write commit messages in an editor, not with 'svn ci -m' and break overly long lines.
Added: concat/libavformat/concat.c concat/libavformat/concatgen.c concat/libavformat/concatgen.h
You should have used 'svn copy' instead of 'svn add'. You were copying code around and now the history is lost.
--- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ concat/libavformat/concatgen.c Sat Jul 4 20:59:56 2009 (r4595) @@ -0,0 +1,132 @@ + +int concatgen_read_packet(AVFormatContext *s, + AVPacket *pkt)
Indentation is off.
+int concatgen_read_seek(AVFormatContext *s, + int stream_index, + int64_t pts, + int flags)
ditto
--- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ concat/libavformat/concatgen.h Sat Jul 4 20:59:56 2009 (r4595) @@ -0,0 +1,40 @@ + +#ifndef _CONCATGEN_H +#define _CONCATGEN_H
This is an illegal identifier, it starts with an underscore and a capital letter. Such identifiers are reserved for the system, you should not use them. Furthermore, this is not a standard multiple inclusion guard as we use them. It should have an AVFORMAT_ prefix.
+int concatgen_read_packet(AVFormatContext *s, AVPacket *pkt); + +int concatgen_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flags); + +int concatgen_read_timestamp(AVFormatContext *s, int stream_index, int64_t *pos, int64_t pos_limit); + +int concatgen_read_close(AVFormatContext *s); + +int concatgen_read_play(AVFormatContext *s); + +int concatgen_read_pause(AVFormatContext *s);
I think all these functions need ff_ prefixes.
--- concat/libavformat/m3u.c Sat Jul 4 17:04:59 2009 (r4594) +++ concat/libavformat/m3u.c Sat Jul 4 20:59:56 2009 (r4595) @@ -101,132 +96,22 @@ static int m3u_read_header(AVFormatConte --- concat/libavformat/playlist.h Sat Jul 4 17:04:59 2009 (r4594) +++ concat/libavformat/playlist.h Sat Jul 4 20:59:56 2009 (r4595) @@ -19,6 +19,11 @@
+#ifndef _PLAYLIST_H +#define _PLAYLIST_H
see above Diego
participants (2)
-
Diego Biurrun -
gkovacs