encoder/ogg: use class OggStreamState
This commit is contained in:
parent
d04eb87c4f
commit
068de7cf40
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue