fix FfmpegDecoderPlugin to use relative timestamps

This commit is contained in:
Steven O'Brien 2013-12-20 20:45:07 +00:00 committed by Max Kellermann
parent a191db84f2
commit 6b3b8c6f2e
2 changed files with 8 additions and 4 deletions

2
NEWS
View File

@ -3,6 +3,8 @@ ver 0.18.6 (not yet released)
- cdio_paranoia: support libcdio-paranoia 0.90 - cdio_paranoia: support libcdio-paranoia 0.90
* tags * tags
- riff: recognize upper-case "ID3" chunk name - riff: recognize upper-case "ID3" chunk name
* decoder
- ffmpeg: use relative timestamps
* output * output
- openal: fix build failure on Mac OS X - openal: fix build failure on Mac OS X
- osx: fix build failure - osx: fix build failure

View File

@ -251,13 +251,14 @@ static DecoderCommand
ffmpeg_send_packet(Decoder &decoder, InputStream &is, ffmpeg_send_packet(Decoder &decoder, InputStream &is,
const AVPacket *packet, const AVPacket *packet,
AVCodecContext *codec_context, AVCodecContext *codec_context,
const AVRational *time_base, const AVStream *stream,
AVFrame *frame, AVFrame *frame,
uint8_t **buffer, int *buffer_size) uint8_t **buffer, int *buffer_size)
{ {
if (packet->pts >= 0 && packet->pts != (int64_t)AV_NOPTS_VALUE) if (packet->pts >= 0 && packet->pts != (int64_t)AV_NOPTS_VALUE)
decoder_timestamp(decoder, decoder_timestamp(decoder,
time_from_ffmpeg(packet->pts, *time_base)); time_from_ffmpeg(packet->pts - stream->start_time,
stream->time_base));
AVPacket packet2 = *packet; AVPacket packet2 = *packet;
@ -470,7 +471,7 @@ ffmpeg_decode(Decoder &decoder, InputStream &input)
if (packet.stream_index == audio_stream) if (packet.stream_index == audio_stream)
cmd = ffmpeg_send_packet(decoder, input, cmd = ffmpeg_send_packet(decoder, input,
&packet, codec_context, &packet, codec_context,
&av_stream->time_base, av_stream,
frame, frame,
&interleaved_buffer, &interleaved_buffer_size); &interleaved_buffer, &interleaved_buffer_size);
else else
@ -481,7 +482,8 @@ ffmpeg_decode(Decoder &decoder, InputStream &input)
if (cmd == DecoderCommand::SEEK) { if (cmd == DecoderCommand::SEEK) {
int64_t where = int64_t where =
time_to_ffmpeg(decoder_seek_where(decoder), time_to_ffmpeg(decoder_seek_where(decoder),
av_stream->time_base); av_stream->time_base) +
av_stream->start_time;
if (av_seek_frame(format_context, audio_stream, where, if (av_seek_frame(format_context, audio_stream, where,
AV_TIME_BASE) < 0) AV_TIME_BASE) < 0)