Commit 7dd8bf53 authored by wm4's avatar wm4 Committed by Michael Niedermayer

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: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent afc7748d
...@@ -1082,6 +1082,15 @@ typedef struct AVStream { ...@@ -1082,6 +1082,15 @@ typedef struct AVStream {
*/ */
int skip_samples; 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. * 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 * This is broken by design (needs global sample count), but can't be
......
...@@ -1416,6 +1416,8 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt) ...@@ -1416,6 +1416,8 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt)
sample < st->last_discard_sample) sample < st->last_discard_sample)
discard_padding = FFMIN(end_sample - st->first_discard_sample, duration); 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) { if (st->skip_samples || discard_padding) {
uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10); uint8_t *p = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
if (p) { if (p) {
...@@ -1645,6 +1647,8 @@ void ff_read_frame_flush(AVFormatContext *s) ...@@ -1645,6 +1647,8 @@ void ff_read_frame_flush(AVFormatContext *s)
if (s->internal->inject_global_side_data) if (s->internal->inject_global_side_data)
st->inject_global_side_data = 1; st->inject_global_side_data = 1;
st->skip_samples = 0;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment