2#include <vorbis/vorbisfile.h>
25 int written = fwrite(page->header, 1, page->header_len, fp);
26 written += fwrite(page->body, 1, page->body_len, fp);
33 Encoder(outfile, qualitylevel, metadata)
35 vorbis_comment_init(&
m_vc);
37 vorbis_info_init(&
m_vi);
39 ogg_packet_clear(&
m_op);
42 if (qualitylevel == 0)
44 if (qualitylevel == 1)
47 int ret = vorbis_encode_setup_vbr(&
m_vi, 2, 44100, quality);
50 LOG(VB_GENERAL, LOG_ERR, QString(
"Error initializing VORBIS encoder."
51 " Got return code: %1").arg(ret));
52 vorbis_info_clear(&
m_vi);
56 vorbis_encode_ctl(&
m_vi, OV_ECTL_RATEMANAGE_SET,
nullptr);
57 vorbis_encode_setup_init(&
m_vi);
63 ogg_packet header_main;
64 ogg_packet header_comments;
65 ogg_packet header_codebooks;
67 vorbis_analysis_headerout(&
m_vd, &
m_vc, &header_main, &header_comments,
70 ogg_stream_packetin(&
m_os, &header_main);
71 ogg_stream_packetin(&
m_os, &header_comments);
72 ogg_stream_packetin(&
m_os, &header_codebooks);
75 while ((result = ogg_stream_flush(&
m_os, &
m_og)))
77 if (!result || !
m_out)
80 if (ret2 !=
m_og.header_len +
m_og.body_len)
82 LOG(VB_GENERAL, LOG_ERR,
83 "Failed to write header to output stream.");
91 ogg_stream_clear(&
m_os);
92 vorbis_block_clear(&
m_vb);
93 vorbis_dsp_clear(&
m_vd);
94 vorbis_comment_clear(&
m_vc);
95 vorbis_info_clear(&
m_vi);
104 long realsamples = 0;
105 auto *chars = (
signed char *)
bytes;
107 realsamples = length / 4;
112 float** buffer = vorbis_analysis_buffer(&
m_vd, realsamples);
114 for (
long i = 0; i < realsamples; i++)
116 buffer[0][i] = ((chars[(i * 4) + 1] << 8) |
117 (chars[i * 4] & 0xff)) / 32768.0F;
118 buffer[1][i] = ((chars[(i * 4) + 3] << 8) |
119 (chars[(i * 4) + 2] & 0xff)) / 32768.0F;
122 vorbis_analysis_wrote(&
m_vd, realsamples);
124 while (vorbis_analysis_blockout(&
m_vd, &
m_vb) == 1)
126 vorbis_analysis(&
m_vb,
nullptr);
127 vorbis_bitrate_addblock(&
m_vb);
129 while (vorbis_bitrate_flushpacket(&
m_vd, &
m_op))
137 int result = ogg_stream_pageout(&
m_os, &
m_og);
142 if (ret !=
m_og.header_len +
m_og.body_len)
144 LOG(VB_GENERAL, LOG_ERR,
145 QString(
"Failed to write ogg data. Aborting."));
150 if (ogg_page_eos(&
m_og))
MusicMetadata * m_metadata
int addSamples(int16_t *bytes, unsigned int len) override
VorbisEncoder(const QString &outfile, int qualitylevel, MusicMetadata *metadata)
~VorbisEncoder() override
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Convenience inline random number generator functions.
uint32_t MythRandom()
generate 32 random bits
static int write_page(ogg_page *page, FILE *fp)