diff options
author | wm4 <nfxjfg@googlemail.com> | 2015-04-22 12:24:36 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-04-22 14:05:46 +0200 |
commit | 7dd8bf53bdb5669a7c65822417fe29036435b40f (patch) | |
tree | f8a077180fcad39c49dc349147fc038b8a3f63f8 | |
parent | afc7748d1f6abc4b3b1cc957b0fa6941837db3d0 (diff) | |
download | ffmpeg-7dd8bf53bdb5669a7c65822417fe29036435b40f.tar.gz |
avformat: add common mechanism for skipping samples at the start of file
This makes using the generic indexing code with mp3 easier at a later
point.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/avformat.h | 9 | ||||
-rw-r--r-- | libavformat/utils.c | 4 |
2 files changed, 13 insertions, 0 deletions
diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 514e64626d..c2f798d649 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1083,6 +1083,15 @@ typedef struct AVStream { int skip_samples; /** + * If not 0, the number of samples that should be skipped from the start of + * the stream (the samples are removed from packets with pts==0, which also + * assumes negative timestamps do not happen). + * Intended for use with formats such as mp3 with ad-hoc gapless audio + * support. + */ + int64_t start_skip_samples; + + /** * If not 0, the first audio sample that should be discarded from the stream. * This is broken by design (needs global sample count), but can't be * avoided for broken by design formats such as mp3 with ad-hoc gapless diff --git a/libavformat/utils.c b/libavformat/utils.c index 950b3c67e4..2f6122d7d6 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1416,6 +1416,8 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt) sample < st->last_discard_sample) discard_padding = FFMIN(end_sample - st->first_discard_sample, duration); } + if (st->start_skip_samples && (pkt->pts == 0 || pkt->pts == RELATIVE_TS_BASE)) + st->skip_samples = st->start_skip_samples; if (st->skip_samples || discard_padding) { uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10); if (p) { @@ -1645,6 +1647,8 @@ void ff_read_frame_flush(AVFormatContext *s) if (s->internal->inject_global_side_data) st->inject_global_side_data = 1; + + st->skip_samples = 0; } } |