aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/decoder/OggFind.cxx19
-rw-r--r--src/decoder/OggFind.hxx11
-rw-r--r--src/decoder/OpusDecoderPlugin.cxx20
3 files changed, 31 insertions, 19 deletions
diff --git a/src/decoder/OggFind.cxx b/src/decoder/OggFind.cxx
index 9df4c6455..297d925e7 100644
--- a/src/decoder/OggFind.cxx
+++ b/src/decoder/OggFind.cxx
@@ -20,6 +20,8 @@
#include "config.h"
#include "OggFind.hxx"
#include "OggSyncState.hxx"
+#include "InputStream.hxx"
+#include "util/Error.hxx"
bool
OggFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet)
@@ -35,3 +37,20 @@ OggFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet)
return true;
}
}
+
+bool
+OggSeekFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet,
+ InputStream &is)
+{
+ if (is.size > 0 && is.size - is.offset < 65536)
+ return OggFindEOS(oy, os, packet);
+
+ if (!is.CheapSeeking())
+ return false;
+
+ oy.Reset();
+
+ return is.LockSeek(-65536, SEEK_END, IgnoreError()) &&
+ oy.ExpectPageSeekIn(os) &&
+ OggFindEOS(oy, os, packet);
+}
diff --git a/src/decoder/OggFind.hxx b/src/decoder/OggFind.hxx
index 7d18d2067..703510fb5 100644
--- a/src/decoder/OggFind.hxx
+++ b/src/decoder/OggFind.hxx
@@ -24,6 +24,7 @@
#include <ogg/ogg.h>
+struct InputStream;
class OggSyncState;
/**
@@ -35,4 +36,14 @@ class OggSyncState;
bool
OggFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet);
+/**
+ * Try to find the end-of-stream (EOS) packet. Seek to the end of the
+ * file if necessary.
+ *
+ * @return true if the EOS packet was found
+ */
+bool
+OggSeekFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet,
+ InputStream &is);
+
#endif
diff --git a/src/decoder/OpusDecoderPlugin.cxx b/src/decoder/OpusDecoderPlugin.cxx
index 10a3d0b83..c90e31232 100644
--- a/src/decoder/OpusDecoderPlugin.cxx
+++ b/src/decoder/OpusDecoderPlugin.cxx
@@ -292,24 +292,6 @@ mpd_opus_stream_decode(Decoder &decoder,
}
static bool
-SeekFindEOS(OggSyncState &oy, ogg_stream_state &os, ogg_packet &packet,
- InputStream &is)
-{
- if (is.size > 0 && is.size - is.offset < 65536)
- return OggFindEOS(oy, os, packet);
-
- if (!is.CheapSeeking())
- return false;
-
- oy.Reset();
-
- Error error;
- return is.LockSeek(-65536, SEEK_END, error) &&
- oy.ExpectPageSeekIn(os) &&
- OggFindEOS(oy, os, packet);
-}
-
-static bool
mpd_opus_scan_stream(InputStream &is,
const struct tag_handler *handler, void *handler_ctx)
{
@@ -367,7 +349,7 @@ mpd_opus_scan_stream(InputStream &is,
}
}
- if (packet.e_o_s || SeekFindEOS(oy, os, packet, is))
+ if (packet.e_o_s || OggSeekFindEOS(oy, os, packet, is))
tag_handler_invoke_duration(handler, handler_ctx,
packet.granulepos / opus_sample_rate);