From 7ec5b791cbf171a60f75c731b7c035d536ecce95 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Wed, 22 Jul 2009 14:04:43 +0000 Subject: ported aac plugin git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1064 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Input/aac/decoder_aac.cpp | 201 ++++------------------------------ src/plugins/Input/aac/decoder_aac.h | 44 ++------ 2 files changed, 35 insertions(+), 210 deletions(-) (limited to 'src/plugins/Input/aac') diff --git a/src/plugins/Input/aac/decoder_aac.cpp b/src/plugins/Input/aac/decoder_aac.cpp index 43ba3964e..065ea6b43 100644 --- a/src/plugins/Input/aac/decoder_aac.cpp +++ b/src/plugins/Input/aac/decoder_aac.cpp @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -38,21 +37,8 @@ DecoderAAC::DecoderAAC(QObject *parent, DecoderFactory *d, QIODevice *i, Output *o) : Decoder(parent, d, i, o) { - m_inited = FALSE; - m_user_stop = FALSE; - m_output_buf = 0; - m_output_bytes = 0; - m_output_at = 0; - m_bks = 0; - m_done = FALSE; - m_finish = FALSE; - m_len = 0; - m_freq = 0; m_bitrate = 0; - m_seekTime = -1.0; - m_totalTime = 0.0; - m_chan = 0; - m_output_size = 0; + m_totalTime = 0; m_data = 0; m_input_buf = 0; m_input_at = 0; @@ -61,7 +47,6 @@ DecoderAAC::DecoderAAC(QObject *parent, DecoderFactory *d, QIODevice *i, Output DecoderAAC::~DecoderAAC() { - deinit(); if (data()) { if (data()->handle) @@ -69,71 +54,16 @@ DecoderAAC::~DecoderAAC() delete data(); m_data = 0; } - if (m_output_buf) - delete [] m_output_buf; if (m_input_buf) delete [] m_input_buf; - m_output_buf = 0; m_input_buf = 0; + m_bitrate = 0; } - -void DecoderAAC::stop() -{ - m_user_stop = TRUE; -} - - -void DecoderAAC::flush(bool final) -{ - ulong min = final ? 0 : m_bks; - - while ((! m_done && ! m_finish) && m_output_bytes > min) - { - output()->recycler()->mutex()->lock (); - - while ((! m_done && ! m_finish) && output()->recycler()->full()) - { - mutex()->unlock(); - - output()->recycler()->cond()->wait(output()->recycler()->mutex()); - - mutex()->lock (); - m_done = m_user_stop; - } - - if (m_user_stop || m_finish) - { - m_inited = FALSE; - m_done = TRUE; - } - else - { - m_output_bytes -= produceSound(m_output_buf, m_output_bytes, m_bitrate, m_chan); - m_output_size += m_bks; - m_output_at = m_output_bytes; - } - - if (output()->recycler()->full()) - { - output()->recycler()->cond()->wakeOne(); - } - - output()->recycler()->mutex()->unlock(); - } -} - - bool DecoderAAC::initialize() { - m_bks = Buffer::size(); - m_inited = m_user_stop = m_done = m_finish = FALSE; - m_len = m_freq = m_bitrate = 0; - //chan = 0; - m_output_size = 0; - m_seekTime = -1.0; - m_totalTime = 0.0; - + m_bitrate = 0; + m_totalTime = 0; if (!input()) { @@ -142,11 +72,6 @@ bool DecoderAAC::initialize() } if (!m_input_buf) m_input_buf = new char[AAC_BUFFER_SIZE]; - - if (!m_output_buf) - m_output_buf = new char[globalBufferSize]; - m_output_at = 0; - m_output_bytes = 0; m_input_at = 0; if (!input()->isOpen()) @@ -195,14 +120,21 @@ bool DecoderAAC::initialize() m_input_at -= tag_size; m_input_at += input()->read((char *)(m_input_buf + m_input_at), AAC_BUFFER_SIZE - m_input_at); } - int res = NeAACDecInit (data()->handle, (unsigned char*) m_input_buf, m_input_at, &m_freq, &m_chan); + #ifdef FAAD_MODIFIED + uint32_t freq = 0; + uint8_t m_chan = 0; + #else + unsigned long freq = 0; + unsigned char chan = 0; + #endif + int res = NeAACDecInit (data()->handle, (unsigned char*) m_input_buf, m_input_at, &freq, &chan); if (res < 0) { qWarning("DecoderAAC: NeAACDecInit() failed"); return FALSE; } - if (!m_freq || !m_chan) + if (!freq || !chan) { qWarning("DecoderAAC: invalid sound parameters"); return FALSE; @@ -210,17 +142,16 @@ bool DecoderAAC::initialize() memmove(m_input_buf, m_input_buf + res, m_input_at - res); m_input_at -= res; - configure(m_freq, m_chan, 16); - m_inited = TRUE; + configure(freq, chan, 16); qDebug("DecoderAAC: initialize succes"); return TRUE; } -qint64 DecoderAAC::aac_decode(void *out) +qint64 DecoderAAC::readAudio(char *audio, qint64 maxSize) { NeAACDecFrameInfo frame_info; qint64 size = 0, to_read, read; - out = 0; + void *out = 0; bool eof = FALSE; while (size <= 0 && !eof) @@ -237,8 +168,8 @@ qint64 DecoderAAC::aac_decode(void *out) memmove(m_input_buf, m_input_buf + frame_info.bytesconsumed, m_input_at - frame_info.bytesconsumed); m_input_at -= frame_info.bytesconsumed; - if ((size = frame_info.samples * 2) > 0) - memcpy((void *) (m_output_buf + m_output_at), out, size); + if ((size = frame_info.samples * 2) > 0 && size <= maxSize) + memcpy((void *) (audio), out, size); if (frame_info.error > 0) { m_input_at = 0; @@ -250,101 +181,17 @@ qint64 DecoderAAC::aac_decode(void *out) qint64 DecoderAAC::totalTime() { - if (!m_inited) - return 0; - return m_totalTime; } - -void DecoderAAC::seek(qint64 pos) -{ - m_seekTime = pos; -} - - -void DecoderAAC::deinit() +int DecoderAAC::bitrate() { - m_inited = m_user_stop = m_done = m_finish = FALSE; - m_len = m_freq = m_bitrate = 0; - m_chan = 0; - m_output_size = 0; + return m_bitrate; } -void DecoderAAC::run() +void DecoderAAC::seekAudio(qint64 pos) { - mutex()->lock (); - if (!m_inited) - { - mutex()->unlock(); - return; - } - mutex()->unlock(); - - while (!m_done && !m_finish) - { - mutex()->lock (); - // decode - - if (m_seekTime >= 0 && m_totalTime) - { - input()->seek(m_seekTime * input()->size() / m_totalTime); - NeAACDecPostSeekReset (data()->handle, 0); - m_input_at = 0; - m_seekTime = -1.0; - } - - m_len = aac_decode(m_prebuf2); - - if (m_len > 0) - { - //qDebug("flush"); - //bitrate = vbrUpd * data()->info.sample_freq / 1152; - m_output_at += m_len; - m_output_bytes += m_len; - - if (output()) - flush(); - - } - else if (m_len == 0) - { - flush(TRUE); - - if (output()) - { - output()->recycler()->mutex()->lock (); - // end of stream - while (!output()->recycler()->empty() && !m_user_stop) - { - output()->recycler()->cond()->wakeOne(); - mutex()->unlock(); - output()->recycler()->cond()->wait(output()->recycler()->mutex()); - mutex()->lock (); - } - output()->recycler()->mutex()->unlock(); - } - - m_done = TRUE; - if (!m_user_stop) - { - m_finish = TRUE; - } - } - else - { - // error in read - qWarning("DecoderAAC: Error while decoding stream, file appears to be corrupted"); - m_finish = TRUE; - } - - mutex()->unlock(); - } - mutex()->lock (); - - if (m_finish) - finish(); - - mutex()->unlock(); - deinit(); + input()->seek(pos * input()->size() / m_totalTime); + NeAACDecPostSeekReset (data()->handle, 0); + m_input_at = 0; } diff --git a/src/plugins/Input/aac/decoder_aac.h b/src/plugins/Input/aac/decoder_aac.h index 328cfc3c4..17e152efa 100644 --- a/src/plugins/Input/aac/decoder_aac.h +++ b/src/plugins/Input/aac/decoder_aac.h @@ -38,48 +38,26 @@ public: DecoderAAC(QObject *, DecoderFactory *, QIODevice *, Output *); virtual ~DecoderAAC(); - // Standard Decoder API - bool initialize(); - qint64 totalTime(); - void seek(qint64); - void stop(); struct aac_data *data() { return m_data; } - + // Standard Decoder API + bool initialize(); + qint64 totalTime(); + int bitrate(); private: - // thread run function - void run(); + qint64 readAudio(char *audio, qint64 maxSize); + void seekAudio(qint64 time); struct aac_data *m_data; - // helper functions - void flush(bool = FALSE); - void deinit(); - qint64 aac_decode(void *out); - - bool m_inited, m_user_stop; - - // output buffer - char *m_output_buf, *m_input_buf; - void *m_prebuf2; - unsigned long m_output_bytes; - -#ifdef FAAD_MODIFIED - uint32_t m_freq; - uint8_t m_chan; -#else - unsigned long m_freq; - unsigned char m_chan; -#endif - unsigned int m_bks; - bool m_done, m_finish; - unsigned long m_len, m_bitrate, m_input_at, m_output_at; - unsigned long m_output_size; - double m_frameSize; //frame size in bytes - qint64 m_totalTime, m_seekTime; + char *m_input_buf; + int m_bitrate; + ulong m_input_at, m_output_at; + double m_frameSize; + qint64 m_totalTime; }; -- cgit v1.2.3-13-gbd6f