mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-29 17:06:43 +00:00
Use the packet pts to calculate the decoder sample offset
This commit is contained in:
parent
0edc87825d
commit
e9d833be03
2 changed files with 16 additions and 13 deletions
|
@ -60,7 +60,11 @@ bool FFmpeg_Decoder::getNextPacket()
|
||||||
{
|
{
|
||||||
/* Check if the packet belongs to this stream */
|
/* Check if the packet belongs to this stream */
|
||||||
if(stream_idx == mPacket.stream_index)
|
if(stream_idx == mPacket.stream_index)
|
||||||
|
{
|
||||||
|
if((uint64_t)mPacket.pts != AV_NOPTS_VALUE)
|
||||||
|
mNextPts = av_q2d((*mStream)->time_base)*mPacket.pts;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Free the packet and look for another */
|
/* Free the packet and look for another */
|
||||||
av_free_packet(&mPacket);
|
av_free_packet(&mPacket);
|
||||||
|
@ -94,6 +98,7 @@ bool FFmpeg_Decoder::getAVAudioData()
|
||||||
av_shrink_packet(&mPacket, remaining);
|
av_shrink_packet(&mPacket, remaining);
|
||||||
}
|
}
|
||||||
} while(got_frame == 0 || mFrame->nb_samples == 0);
|
} while(got_frame == 0 || mFrame->nb_samples == 0);
|
||||||
|
mNextPts += (double)mFrame->nb_samples / (double)(*mStream)->codec->sample_rate;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -162,8 +167,6 @@ void FFmpeg_Decoder::open(const std::string &fname)
|
||||||
if(!mStream)
|
if(!mStream)
|
||||||
fail("No audio streams in "+fname);
|
fail("No audio streams in "+fname);
|
||||||
|
|
||||||
memset(&mPacket, 0, sizeof(mPacket));
|
|
||||||
|
|
||||||
AVCodec *codec = avcodec_find_decoder((*mStream)->codec->codec_id);
|
AVCodec *codec = avcodec_find_decoder((*mStream)->codec->codec_id);
|
||||||
if(!codec)
|
if(!codec)
|
||||||
{
|
{
|
||||||
|
@ -259,11 +262,7 @@ size_t FFmpeg_Decoder::read(char *buffer, size_t bytes)
|
||||||
{
|
{
|
||||||
if(!mStream)
|
if(!mStream)
|
||||||
fail("No audio stream");
|
fail("No audio stream");
|
||||||
|
return readAVAudioData(buffer, bytes);
|
||||||
size_t got = readAVAudioData(buffer, bytes);
|
|
||||||
mSamplesRead += got / (*mStream)->codec->channels /
|
|
||||||
av_get_bytes_per_sample((*mStream)->codec->sample_fmt);
|
|
||||||
return got;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FFmpeg_Decoder::readAll(std::vector<char> &output)
|
void FFmpeg_Decoder::readAll(std::vector<char> &output)
|
||||||
|
@ -277,20 +276,24 @@ void FFmpeg_Decoder::readAll(std::vector<char> &output)
|
||||||
av_get_bytes_per_sample((*mStream)->codec->sample_fmt);
|
av_get_bytes_per_sample((*mStream)->codec->sample_fmt);
|
||||||
const char *inbuf = reinterpret_cast<char*>(mFrame->data[0]);
|
const char *inbuf = reinterpret_cast<char*>(mFrame->data[0]);
|
||||||
output.insert(output.end(), inbuf, inbuf+got);
|
output.insert(output.end(), inbuf, inbuf+got);
|
||||||
mSamplesRead += mFrame->nb_samples;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FFmpeg_Decoder::rewind()
|
void FFmpeg_Decoder::rewind()
|
||||||
{
|
{
|
||||||
av_seek_frame(mFormatCtx, -1, 0, 0);
|
int stream_idx = mStream - mFormatCtx->streams;
|
||||||
|
if(av_seek_frame(mFormatCtx, stream_idx, 0, 0) < 0)
|
||||||
|
fail("Failed to seek in audio stream");
|
||||||
av_free_packet(&mPacket);
|
av_free_packet(&mPacket);
|
||||||
mSamplesRead = 0;
|
mFrameSize = mFramePos = 0;
|
||||||
|
mNextPts = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t FFmpeg_Decoder::getSampleOffset()
|
size_t FFmpeg_Decoder::getSampleOffset()
|
||||||
{
|
{
|
||||||
return mSamplesRead;
|
int delay = (mFrameSize-mFramePos) / (*mStream)->codec->channels /
|
||||||
|
av_get_bytes_per_sample((*mStream)->codec->sample_fmt);
|
||||||
|
return (int)(mNextPts*(*mStream)->codec->sample_rate) - delay;
|
||||||
}
|
}
|
||||||
|
|
||||||
FFmpeg_Decoder::FFmpeg_Decoder()
|
FFmpeg_Decoder::FFmpeg_Decoder()
|
||||||
|
@ -299,7 +302,7 @@ FFmpeg_Decoder::FFmpeg_Decoder()
|
||||||
, mFrame(NULL)
|
, mFrame(NULL)
|
||||||
, mFrameSize(0)
|
, mFrameSize(0)
|
||||||
, mFramePos(0)
|
, mFramePos(0)
|
||||||
, mSamplesRead(0)
|
, mNextPts(0.0)
|
||||||
{
|
{
|
||||||
memset(&mPacket, 0, sizeof(mPacket));
|
memset(&mPacket, 0, sizeof(mPacket));
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace MWSound
|
||||||
int mFrameSize;
|
int mFrameSize;
|
||||||
int mFramePos;
|
int mFramePos;
|
||||||
|
|
||||||
size_t mSamplesRead;
|
double mNextPts;
|
||||||
|
|
||||||
bool getNextPacket();
|
bool getNextPacket();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue