mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-25 08:38:39 +02:00
OD FFmpeg: do not attempt to correct stream lag unless a seek was demanded by user
This commit is contained in:
parent
2aedaaa68d
commit
1fb7a1dcee
@ -199,7 +199,6 @@ mNumStreams(numStreams),
|
|||||||
mScs(scs),
|
mScs(scs),
|
||||||
mFormatContext(formatContext),
|
mFormatContext(formatContext),
|
||||||
mNumSamplesInCache(0),
|
mNumSamplesInCache(0),
|
||||||
mCurrentPos(0),
|
|
||||||
mCurrentLen(0),
|
mCurrentLen(0),
|
||||||
mSeekingAllowedStatus(ODFFMPEG_SEEKING_TEST_UNKNOWN),
|
mSeekingAllowedStatus(ODFFMPEG_SEEKING_TEST_UNKNOWN),
|
||||||
mStreamIndex(streamIndex)
|
mStreamIndex(streamIndex)
|
||||||
@ -218,6 +217,13 @@ mStreamIndex(streamIndex)
|
|||||||
mChannels[s][c] = channels[s][c];
|
mChannels[s][c] = channels[s][c];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// get the current stream start time.
|
||||||
|
int64_t stream_delay = 0;
|
||||||
|
if (mScs[streamIndex]->m_stream->start_time != int64_t(AV_NOPTS_VALUE) &&
|
||||||
|
mScs[streamIndex]->m_stream->start_time > 0) {
|
||||||
|
stream_delay = mScs[streamIndex]->m_stream->start_time;
|
||||||
|
}
|
||||||
|
mCurrentPos = double(stream_delay) / AV_TIME_BASE;
|
||||||
|
|
||||||
//TODO: add a ref counter to scs? This will be necessary if we want to allow copy and paste of not-yet decoded
|
//TODO: add a ref counter to scs? This will be necessary if we want to allow copy and paste of not-yet decoded
|
||||||
//ODDecodeBlockFiles that point to FFmpeg files.
|
//ODDecodeBlockFiles that point to FFmpeg files.
|
||||||
@ -281,7 +287,7 @@ int ODFFmpegDecoder::Decode(samplePtr & data, sampleFormat & format, sampleCount
|
|||||||
FillDataFromCache(bufStart, format, start,len,channel);
|
FillDataFromCache(bufStart, format, start,len,channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool seeking = false;
|
||||||
//look at the decoding timestamp and see if the next sample that will be decoded is not the next sample we need.
|
//look at the decoding timestamp and see if the next sample that will be decoded is not the next sample we need.
|
||||||
if(len && (mCurrentPos > start + len || mCurrentPos + kDecodeSampleAllowance < start ) && SeekingAllowed()) {
|
if(len && (mCurrentPos > start + len || mCurrentPos + kDecodeSampleAllowance < start ) && SeekingAllowed()) {
|
||||||
sc = mScs[mStreamIndex];
|
sc = mScs[mStreamIndex];
|
||||||
@ -310,6 +316,8 @@ int ODFFmpegDecoder::Decode(samplePtr & data, sampleFormat & format, sampleCount
|
|||||||
sampleCount actualDecodeStart = 0.5 + st->codec->sample_rate * st->cur_dts * ((double)st->time_base.num/st->time_base.den); //this is mostly safe because den is usually 1 or low number but check for high values.
|
sampleCount actualDecodeStart = 0.5 + st->codec->sample_rate * st->cur_dts * ((double)st->time_base.num/st->time_base.den); //this is mostly safe because den is usually 1 or low number but check for high values.
|
||||||
|
|
||||||
mCurrentPos = actualDecodeStart;
|
mCurrentPos = actualDecodeStart;
|
||||||
|
seeking = true;
|
||||||
|
|
||||||
//if the seek was past our desired position, rewind a bit.
|
//if the seek was past our desired position, rewind a bit.
|
||||||
//printf("seek ok to %llu samps, float: %f\n",actualDecodeStart,actualDecodeStartDouble);
|
//printf("seek ok to %llu samps, float: %f\n",actualDecodeStart,actualDecodeStartDouble);
|
||||||
} else
|
} else
|
||||||
@ -333,13 +341,23 @@ int ODFFmpegDecoder::Decode(samplePtr & data, sampleFormat & format, sampleCount
|
|||||||
{
|
{
|
||||||
nChannels = sc->m_stream->codec->channels < sc->m_initialchannels ? sc->m_stream->codec->channels : sc->m_initialchannels;
|
nChannels = sc->m_stream->codec->channels < sc->m_initialchannels ? sc->m_stream->codec->channels : sc->m_initialchannels;
|
||||||
//find out the dts we've seekd to. can't use the stream->cur_dts because it is faulty. also note that until we do the first seek, pkt.dts can be false and will change for the same samples after the initial seek.
|
//find out the dts we've seekd to. can't use the stream->cur_dts because it is faulty. also note that until we do the first seek, pkt.dts can be false and will change for the same samples after the initial seek.
|
||||||
sampleCount actualDecodeStart = 0.52 + sc->m_stream->codec->sample_rate * sc->m_pkt.dts * ((double)sc->m_stream->time_base.num/sc->m_stream->time_base.den); //this is mostly safe because den is usually 1 or low number but check for high values.
|
sampleCount actualDecodeStart = mCurrentPos;
|
||||||
|
|
||||||
//hack to get rounding to work to neareset frame size since dts isn't exact
|
// we need adjacent samples, so don't use dts most of the time which will leave gaps between frames
|
||||||
if (sc->m_stream->codec->frame_size) {
|
// for some formats
|
||||||
actualDecodeStart = ((actualDecodeStart + sc->m_stream->codec->frame_size/2) / sc->m_stream->codec->frame_size) * sc->m_stream->codec->frame_size;
|
// The only other case for inserting silence is for initial offset and ImportFFmpeg.cpp does this for us
|
||||||
|
if (seeking) {
|
||||||
|
actualDecodeStart = 0.52 + (sc->m_stream->codec->sample_rate * sc->m_pkt.dts
|
||||||
|
* ((double)sc->m_stream->time_base.num / sc->m_stream->time_base.den));
|
||||||
|
//this is mostly safe because den is usually 1 or low number but check for high values.
|
||||||
|
|
||||||
|
//hack to get rounding to work to neareset frame size since dts isn't exact
|
||||||
|
if (sc->m_stream->codec->frame_size) {
|
||||||
|
actualDecodeStart = ((actualDecodeStart + sc->m_stream->codec->frame_size/2) / sc->m_stream->codec->frame_size) * sc->m_stream->codec->frame_size;
|
||||||
|
}
|
||||||
|
// reset for the next one
|
||||||
|
seeking = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(actualDecodeStart != mCurrentPos)
|
if(actualDecodeStart != mCurrentPos)
|
||||||
printf("ts not matching - now:%llu , last:%llu, lastlen:%llu, start %llu, len %llu\n",actualDecodeStart, mCurrentPos, mCurrentLen, start, len);
|
printf("ts not matching - now:%llu , last:%llu, lastlen:%llu, start %llu, len %llu\n",actualDecodeStart, mCurrentPos, mCurrentLen, start, len);
|
||||||
//if we've skipped over some samples, fill the gap with silence. This could happen often in the beginning of the file.
|
//if we've skipped over some samples, fill the gap with silence. This could happen often in the beginning of the file.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user