23 #include <vorbis/codec.h> 29 #include <KLocalizedString> 42 #define DEFAULT_BITRATE 128000 50 :m_source(source), m_stream_start_pos(0), m_samples_written(0),
51 m_oy(oy), m_os(os), m_og(og), m_op(op)
60 int count = vorbis_comment_query_count(&
m_vc, const_cast<char *>(tag));
61 if (count < 1)
return;
63 for (
int i = 0; i < count; ++i) {
64 char *text = vorbis_comment_query(&
m_vc, const_cast<char *>(tag), i);
65 if (i) value +=
_(
"; ");
66 value += QString::fromUtf8(text);
69 info.
set(property, value);
82 vorbis_info_init(&
m_vi);
83 vorbis_comment_init(&
m_vc);
85 if (vorbis_synthesis_headerin(&
m_vi, &
m_vc, &
m_op) < 0) {
88 "This Ogg bitstream does not contain any Vorbis audio data."));
101 unsigned int counter = 0;
102 while (counter < 2) {
104 int result = ogg_sync_pageout(&
m_oy, &
m_og);
105 if (result == 0)
break;
113 while (counter < 2) {
114 result = ogg_stream_packetout(&
m_os, &
m_op);
115 if (result == 0)
break;
121 "Corrupt secondary header. Exiting."));
131 char *buffer = ogg_sync_buffer(&
m_oy, 4096);
132 qint64 bytes =
m_source->read(buffer, 4096);
133 if (!bytes && counter < 2) {
135 "End of file before finding all Vorbis headers."));
138 ogg_sync_wrote(&
m_oy, static_cast<long int>(bytes));
143 vorbis_synthesis_init(&
m_vd, &
m_vi);
155 if ((
m_vi.bitrate_nominal > 0) &&
156 (
m_vi.bitrate_nominal < std::numeric_limits<int>::max()))
159 if ((
m_vi.bitrate_lower > 0) &&
160 (
m_vi.bitrate_lower < std::numeric_limits<int>::max()))
163 if ((
m_vi.bitrate_upper > 0) &&
164 (
m_vi.bitrate_upper < std::numeric_limits<int>::max()))
170 char **ptr =
m_vc.user_comments;
172 if (s.length() && !s.contains(QLatin1Char(
'='))) {
174 qDebug(
"Bitstream is %d channel, %ldHz",
m_vi.channels,
m_vi.rate);
175 qDebug(
"Encoded by: %s\n\n",
m_vc.vendor);
182 QString str_date = QVariant(info.
get(
185 date = QDate::fromString(str_date, Qt::ISODate);
186 if (!date.isValid()) {
187 int year = str_date.toInt();
188 date.setDate(year, 1, 1);
215 if ( (
m_vi.bitrate_nominal > 0)) br =
m_vi.bitrate_nominal;
216 if ((br < 0) && (
m_vi.bitrate_upper > 0)) br =
m_vi.bitrate_upper;
217 if ((br < 0) && (
m_vi.bitrate_lower > 0)) br =
m_vi.bitrate_lower;
218 qint64 file_size =
m_source->size();
219 qreal rate =
m_vi.rate;
220 qreal seconds = (br > 0) ? (file_size / (br / 8)) :
224 qDebug(
" estimated length: %llu samples", samples);
237 const unsigned int tracks = dest.
tracks();
241 for (
unsigned int track = 0; track < tracks; track++) {
242 float *mono = pcm[track];
244 unsigned int ofs = 0;
249 double noise = (drand48() - double(0.5)) /
double(
SAMPLE_MAX);
250 double d =
static_cast<double>(*(mono++));
260 *(dest[track]) << buffer;
274 if (vorbis_synthesis(&
m_vb, &
m_op) == 0)
275 vorbis_synthesis_blockin(&
m_vd, &
m_vb);
281 while ((samples = vorbis_synthesis_pcmout(&
m_vd, &pcm)) > 0)
287 vorbis_synthesis_read(&
m_vd, bout);
300 vorbis_block_clear(&
m_vb);
301 vorbis_dsp_clear(&
m_vd);
302 vorbis_comment_clear(&
m_vc);
303 vorbis_info_clear(&
m_vi);
312 qWarning(
"file contains neither nominal bitrate (ABR mode) " 313 "nor quality (VBR mode)");
319 const qint64 stream_end_pos =
m_source->pos();
320 const qint64 stream_read = stream_end_pos -
322 double bits =
static_cast<double>(stream_read) * 8.0;
324 static_cast<double>(info.
rate());
329 qDebug(
"-> using guessed bitrate %d bits/sec", bitrate);
332 qDebug(
"-> using default %d kBits/sec", bitrate);
bool contains(const FileProperty property) const
virtual unsigned int tracks() const Q_DECL_OVERRIDE
virtual int decode(Kwave::MultiWriter &dst) Q_DECL_OVERRIDE
QVariant get(FileProperty key) const
VorbisDecoder(QIODevice *source, ogg_sync_state &oy, ogg_stream_state &os, ogg_page &og, ogg_packet &op)
virtual void close(Kwave::FileInfo &info) Q_DECL_OVERRIDE
void set(FileProperty key, const QVariant &value)
virtual sample_index_t last() const
void setRate(double rate)
static int error(QWidget *widget, QString message, QString caption=QString())
void parseTag(Kwave::FileInfo &info, const char *tag, Kwave::FileProperty property)
void setTracks(unsigned int tracks)
virtual int nearest(int rate) const
static sample_t double2sample(const double f)
qint64 m_stream_start_pos
sample_index_t m_samples_written
virtual void reset() Q_DECL_OVERRIDE
virtual int open(QWidget *widget, Kwave::FileInfo &info) Q_DECL_OVERRIDE
static const StandardBitrates & instance()
static int decodeFrame(float **pcm, unsigned int size, Kwave::MultiWriter &dest)