encoder/ogg: use class OggStreamState

This commit is contained in:
Max Kellermann 2016-05-09 14:13:45 +02:00
parent d04eb87c4f
commit 068de7cf40
3 changed files with 32 additions and 14 deletions

View File

@ -22,7 +22,8 @@
#include "config.h"
#include "../EncoderAPI.hxx"
#include "lib/xiph/OggStream.hxx"
#include "lib/xiph/OggStreamState.hxx"
#include "lib/xiph/OggPage.hxx"
#include "lib/xiph/OggSerial.hxx"
#include <ogg/ogg.h>
@ -32,27 +33,44 @@
* with Ogg container output.
*/
class OggEncoder : public Encoder {
/* initialize "flush" to true, so the caller gets the full
headers on the first read */
bool flush = true;
protected:
OggStream stream;
OggStreamState stream;
public:
OggEncoder(bool _implements_tag)
:Encoder(_implements_tag) {
stream.Initialize(GenerateOggSerial());
}
~OggEncoder() override {
stream.Deinitialize();
:Encoder(_implements_tag),
stream(GenerateOggSerial()) {
}
/* virtual methods from class Encoder */
bool Flush(Error &) override {
stream.Flush();
Flush();
return true;
}
size_t Read(void *dest, size_t length) override {
return stream.PageOut(dest, length);
ogg_page page;
bool success = stream.PageOut(page);
if (!success) {
if (flush) {
flush = false;
success = stream.Flush(page);
}
if (!success)
return 0;
}
return ReadPage(page, dest, length);
}
protected:
void Flush() {
flush = true;
}
};

View File

@ -244,7 +244,7 @@ OpusEncoder::DoEncode(bool eos, Error &error)
bool
OpusEncoder::End(Error &error)
{
stream.Flush();
Flush();
memset(buffer + buffer_position, 0,
buffer_size - buffer_position);
@ -331,7 +331,7 @@ OpusEncoder::GenerateHead()
packet.granulepos = 0;
packet.packetno = packetno++;
stream.PacketIn(packet);
stream.Flush();
Flush();
}
void
@ -355,7 +355,7 @@ OpusEncoder::GenerateTags()
packet.granulepos = 0;
packet.packetno = packetno++;
stream.PacketIn(packet);
stream.Flush();
Flush();
free(comments);
}

View File

@ -244,7 +244,7 @@ VorbisEncoder::PreTag(gcc_unused Error &error)
vorbis_analysis_init(&vd, &vi);
vorbis_block_init(&vd, &vb);
stream.Flush();
Flush();
return true;
}