24 #include <QLatin1Char> 26 #include <KLocalizedString> 45 :
Kwave::
Decoder(), m_sub_decoder(Q_NULLPTR), m_source(Q_NULLPTR)
52 #ifdef HAVE_OGG_VORBIS 58 addMimeType(
"audio/ogg", i18n(
"Ogg audio"),
"*.oga");
59 addMimeType(
"application/ogg", i18n(
"Ogg audio"),
"*.ogx");
84 char *buffer = ogg_sync_buffer(&
m_oy, 4096);
86 if (!buffer)
return -1;
88 long int bytes =
static_cast<long int>(
m_source->read(buffer, 4096));
89 if ((bytes <= 0) && (!
m_source->pos())) {
91 "Ogg bitstream has zero-length."));
94 ogg_sync_wrote(&
m_oy, bytes);
97 if (ogg_sync_pageout(&
m_oy, &
m_og) != 1) {
99 if (bytes < 4096)
return 0;
103 "Input does not appear to be an Ogg bitstream."));
109 ogg_stream_init(&
m_os, ogg_page_serialno(&
m_og));
112 if (ogg_stream_pagein(&
m_os, &
m_og) < 0) {
115 "Error reading first page of the Ogg bitstream data."));
119 if ((ogg_stream_packetout(&
m_os, &
m_op) != 1) || (
m_op.bytes < 8)) {
122 "Error reading initial header packet."));
137 if (memcmp(
m_op.packet,
"OpusHead", 8) == 0) {
138 qDebug(
" OggDecoder: detected Opus codec");
144 #ifdef HAVE_OGG_VORBIS 145 if (memcmp(
m_op.packet + 1,
"vorbis", 6) == 0) {
146 qDebug(
" OggDecoder: detected Vorbis codec");
154 qDebug(
"--- dump of the first 8 bytes of the packet: ---");
155 for (
unsigned int i = 0; i < 8; i++)
156 qDebug(
"%2d: 0x%02X - '%c'", i,
m_op.packet[i],
m_op.packet[i]);
159 "Error: Codec not supported"));
177 if (
m_source) qWarning(
"OggDecoder::open(), already open !");
180 if (!src.open(QIODevice::ReadOnly)) {
181 qWarning(
"failed to open source !");
189 qDebug(
"--- OggDecoder::open() ---");
190 ogg_sync_init(&
m_oy);
213 int result = ogg_sync_pageout(&
m_oy, &
m_og);
214 if (result == 0)
break;
218 "Corrupt or missing data in bitstream. Continuing." 224 result = ogg_stream_packetout(&
m_os, &
m_op);
226 if (result == 0)
break;
244 char *buffer = ogg_sync_buffer(&
m_oy, 4096);
246 ogg_sync_wrote(&
m_oy, bytes);
253 ogg_stream_clear(&
m_os);
261 ogg_sync_clear(&
m_oy);
virtual bool decode(QWidget *widget, Kwave::MultiWriter &dst) Q_DECL_OVERRIDE
virtual bool open(QWidget *widget, QIODevice &source) Q_DECL_OVERRIDE
virtual ~OggDecoder() Q_DECL_OVERRIDE
virtual Kwave::Decoder * instance() Q_DECL_OVERRIDE
void sourceProcessed(quint64 pos)
void set(FileProperty key, const QVariant &value)
virtual void addMimeType(const char *name, const QString &description, const char *patterns)
#define REGISTER_OGG_VORBIS_MIME_TYPES
int parseHeader(QWidget *widget)
static int error(QWidget *widget, QString message, QString caption=QString())
#define REGISTER_COMPRESSION_TYPE_OGG_OPUS
virtual int decode(Kwave::MultiWriter &dst)=0
void setLength(sample_index_t length)
virtual void close(Kwave::FileInfo &info)=0
virtual Kwave::MetaDataList & metaData()
Kwave::OggSubDecoder * m_sub_decoder
void setBits(unsigned int bits)
#define REGISTER_OGG_OPUS_MIME_TYPES
virtual int open(QWidget *widget, Kwave::FileInfo &info)=0
#define REGISTER_COMPRESSION_TYPE_OGG_VORBIS
virtual void close() Q_DECL_OVERRIDE