encoder/ogg: use class OggStreamState
This commit is contained in:
src/encoder/plugins
@ -22,7 +22,8 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "../EncoderAPI.hxx"
|
#include "../EncoderAPI.hxx"
|
||||||
#include "lib/xiph/OggStream.hxx"
|
#include "lib/xiph/OggStreamState.hxx"
|
||||||
|
#include "lib/xiph/OggPage.hxx"
|
||||||
#include "lib/xiph/OggSerial.hxx"
|
#include "lib/xiph/OggSerial.hxx"
|
||||||
|
|
||||||
#include <ogg/ogg.h>
|
#include <ogg/ogg.h>
|
||||||
@ -32,27 +33,44 @@
|
|||||||
* with Ogg container output.
|
* with Ogg container output.
|
||||||
*/
|
*/
|
||||||
class OggEncoder : public Encoder {
|
class OggEncoder : public Encoder {
|
||||||
|
/* initialize "flush" to true, so the caller gets the full
|
||||||
|
headers on the first read */
|
||||||
|
bool flush = true;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
OggStream stream;
|
OggStreamState stream;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OggEncoder(bool _implements_tag)
|
OggEncoder(bool _implements_tag)
|
||||||
:Encoder(_implements_tag) {
|
:Encoder(_implements_tag),
|
||||||
stream.Initialize(GenerateOggSerial());
|
stream(GenerateOggSerial()) {
|
||||||
}
|
|
||||||
|
|
||||||
~OggEncoder() override {
|
|
||||||
stream.Deinitialize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* virtual methods from class Encoder */
|
/* virtual methods from class Encoder */
|
||||||
bool Flush(Error &) override {
|
bool Flush(Error &) override {
|
||||||
stream.Flush();
|
Flush();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Read(void *dest, size_t length) override {
|
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
|
bool
|
||||||
OpusEncoder::End(Error &error)
|
OpusEncoder::End(Error &error)
|
||||||
{
|
{
|
||||||
stream.Flush();
|
Flush();
|
||||||
|
|
||||||
memset(buffer + buffer_position, 0,
|
memset(buffer + buffer_position, 0,
|
||||||
buffer_size - buffer_position);
|
buffer_size - buffer_position);
|
||||||
@ -331,7 +331,7 @@ OpusEncoder::GenerateHead()
|
|||||||
packet.granulepos = 0;
|
packet.granulepos = 0;
|
||||||
packet.packetno = packetno++;
|
packet.packetno = packetno++;
|
||||||
stream.PacketIn(packet);
|
stream.PacketIn(packet);
|
||||||
stream.Flush();
|
Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -355,7 +355,7 @@ OpusEncoder::GenerateTags()
|
|||||||
packet.granulepos = 0;
|
packet.granulepos = 0;
|
||||||
packet.packetno = packetno++;
|
packet.packetno = packetno++;
|
||||||
stream.PacketIn(packet);
|
stream.PacketIn(packet);
|
||||||
stream.Flush();
|
Flush();
|
||||||
|
|
||||||
free(comments);
|
free(comments);
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,7 @@ VorbisEncoder::PreTag(gcc_unused Error &error)
|
|||||||
vorbis_analysis_init(&vd, &vi);
|
vorbis_analysis_init(&vd, &vi);
|
||||||
vorbis_block_init(&vd, &vb);
|
vorbis_block_init(&vd, &vb);
|
||||||
|
|
||||||
stream.Flush();
|
Flush();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user