Commit 61e7e531 authored by Max Kellermann's avatar Max Kellermann

decoder/Opus: move page reader into the decoder class

parent ceb65291
...@@ -84,7 +84,9 @@ public: ...@@ -84,7 +84,9 @@ public:
:decoder(_decoder), input_stream(_input_stream) {} :decoder(_decoder), input_stream(_input_stream) {}
~MPDOpusDecoder(); ~MPDOpusDecoder();
enum decoder_command HandlePage(ogg_page &page); bool ReadFirstPage(ogg_sync_state &oy);
bool ReadNextPage(ogg_sync_state &oy);
enum decoder_command HandlePackets(); enum decoder_command HandlePackets();
enum decoder_command HandlePacket(const ogg_packet &packet); enum decoder_command HandlePacket(const ogg_packet &packet);
enum decoder_command HandleBOS(const ogg_packet &packet); enum decoder_command HandleBOS(const ogg_packet &packet);
...@@ -103,19 +105,33 @@ MPDOpusDecoder::~MPDOpusDecoder() ...@@ -103,19 +105,33 @@ MPDOpusDecoder::~MPDOpusDecoder()
ogg_stream_clear(&os); ogg_stream_clear(&os);
} }
inline enum decoder_command inline bool
MPDOpusDecoder::HandlePage(ogg_page &page) MPDOpusDecoder::ReadFirstPage(ogg_sync_state &oy)
{ {
assert(!os_initialized);
if (!OggExpectFirstPage(oy, os, decoder, input_stream))
return false;
os_initialized = true;
return true;
}
inline bool
MPDOpusDecoder::ReadNextPage(ogg_sync_state &oy)
{
assert(os_initialized);
ogg_page page;
if (!OggExpectPage(oy, page, decoder, input_stream))
return false;
const auto page_serialno = ogg_page_serialno(&page); const auto page_serialno = ogg_page_serialno(&page);
if (!os_initialized) { if (page_serialno != os.serialno)
os_initialized = true;
ogg_stream_init(&os, page_serialno);
} else if (page_serialno != os.serialno)
ogg_stream_reset_serialno(&os, page_serialno); ogg_stream_reset_serialno(&os, page_serialno);
ogg_stream_pagein(&os, &page); ogg_stream_pagein(&os, &page);
return true;
return HandlePackets();
} }
inline enum decoder_command inline enum decoder_command
...@@ -256,14 +272,19 @@ mpd_opus_stream_decode(struct decoder *decoder, ...@@ -256,14 +272,19 @@ mpd_opus_stream_decode(struct decoder *decoder,
ogg_sync_state oy; ogg_sync_state oy;
ogg_sync_init(&oy); ogg_sync_init(&oy);
if (!d.ReadFirstPage(oy)) {
ogg_sync_clear(&oy);
return;
}
while (true) { while (true) {
ogg_page page; enum decoder_command cmd = d.HandlePackets();
if (!OggExpectPage(oy, page, decoder, input_stream)) if (cmd != DECODE_COMMAND_NONE)
break; break;
enum decoder_command cmd = d.HandlePage(page); if (!d.ReadNextPage(oy))
if (cmd != DECODE_COMMAND_NONE)
break; break;
} }
ogg_sync_clear(&oy); ogg_sync_clear(&oy);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment