aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-12-19 10:12:01 +0100
committerMax Kellermann <max@duempel.org>2014-12-19 10:23:05 +0100
commit2e22ff2e3692291df2a62363dd8f488b65164e70 (patch)
treeeb4a127761edfdc9cca67dd535c6c9c01d037335 /src/lib
parent8c3be4a5f036420ef2c7f1f53e573547df3b6c9b (diff)
downloadmpd-2e22ff2e3692291df2a62363dd8f488b65164e70.tar.gz
mpd-2e22ff2e3692291df2a62363dd8f488b65164e70.tar.xz
mpd-2e22ff2e3692291df2a62363dd8f488b65164e70.zip
decoder/ffmpeg: use AVStream::duration
Use the duration of the stream we're actually decoding - not the "global" attribute AVFormatContext::duration which may differ.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ffmpeg/Time.hxx25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/lib/ffmpeg/Time.hxx b/src/lib/ffmpeg/Time.hxx
index 0e6ba2e84..7f2146016 100644
--- a/src/lib/ffmpeg/Time.hxx
+++ b/src/lib/ffmpeg/Time.hxx
@@ -60,6 +60,31 @@ RatioToAVRational()
}
/**
+ * Convert a FFmpeg time stamp to a #SongTime.
+ */
+gcc_const
+static inline SongTime
+FromFfmpegTime(int64_t t, const AVRational time_base)
+{
+ assert(t != (int64_t)AV_NOPTS_VALUE);
+
+ return SongTime::FromMS(av_rescale_q(t, time_base,
+ (AVRational){1, 1000}));
+}
+
+/**
+ * Convert a FFmpeg time stamp to a #SignedSongTime.
+ */
+gcc_const
+static inline SignedSongTime
+FromFfmpegTimeChecked(int64_t t, const AVRational time_base)
+{
+ return t != (int64_t)AV_NOPTS_VALUE
+ ? SignedSongTime(FromFfmpegTime(t, time_base))
+ : SignedSongTime::Negative();
+}
+
+/**
* Convert a #SongTime to a FFmpeg time stamp with the given base.
*/
gcc_const