decoder/opus: move SeekFindEOS() to OggFind.cxx

This commit is contained in:
Max Kellermann 2013-10-24 20:33:12 +02:00
parent f629eb8cb2
commit 92c85bd20d
3 changed files with 31 additions and 19 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -291,24 +291,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);