diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-09-30 20:56:00 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-09-30 20:56:00 +0000 |
| commit | 7e1a4603fe224f70fe0708f8aa91abfa2253c18f (patch) | |
| tree | e5e2e7bcebda35995941d924b4d422e0536ee98a /src/plugins | |
| parent | 738476128af702a792e37e41e01acbb56ed55fff (diff) | |
| download | qmmp-7e1a4603fe224f70fe0708f8aa91abfa2253c18f.tar.gz qmmp-7e1a4603fe224f70fe0708f8aa91abfa2253c18f.tar.bz2 qmmp-7e1a4603fe224f70fe0708f8aa91abfa2253c18f.zip | |
fixed mp4 aac regression
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1276 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp | 74 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.h | 5 |
2 files changed, 53 insertions, 26 deletions
diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp index 0b63efe6f..2d7d2c62b 100644 --- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp +++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp @@ -39,6 +39,8 @@ DecoderFFmpeg::DecoderFFmpeg(const QString &path) m_path = path; m_temp_pkt.size = 0; m_pkt.size = 0; + m_output_buf = 0; + m_output_at = 0; } @@ -50,6 +52,8 @@ DecoderFFmpeg::~DecoderFFmpeg() av_close_input_file(ic); if(m_pkt.data) av_free_packet(&m_pkt); + if(m_output_buf) + delete [] m_output_buf; } bool DecoderFFmpeg::initialize() @@ -93,7 +97,7 @@ bool DecoderFFmpeg::initialize() return FALSE; m_totalTime = ic->duration * 1000 / AV_TIME_BASE; - + m_output_buf = new uint8_t[AVCODEC_MAX_AUDIO_FRAME_SIZE*sizeof(int16_t) + Qmmp::globalBufferSize()]; configure(c->sample_rate, c->channels, 16); m_bitrate = c->bit_rate; qDebug("DecoderFFmpeg: initialize succes"); @@ -116,25 +120,25 @@ qint64 DecoderFFmpeg::read(char *audio, qint64 maxSize) { if (m_skip) { - if(!m_temp_pkt.size) - fillBuffer(); - if(!m_temp_pkt.size) - return 0; - while(m_temp_pkt.size > 0) - ffmpeg_decode(audio, maxSize); + while(m_temp_pkt.size) + ffmpeg_decode(m_output_buf); + m_output_at = 0; m_skip = FALSE; } - - if(!m_temp_pkt.size) + if(!m_output_at) fillBuffer(); - if(!m_temp_pkt.size) + if(!m_output_at) return 0; - return ffmpeg_decode(audio, maxSize); + qint64 len = qMin(m_output_at, maxSize); + memcpy(audio, m_output_buf, len); + m_output_at -= len; + memmove(m_output_buf, m_output_buf + len, m_output_at); + return len; } -qint64 DecoderFFmpeg::ffmpeg_decode(char *audio, qint64 maxSize) +qint64 DecoderFFmpeg::ffmpeg_decode(uint8_t *audio) { - int out_size = maxSize; + int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof(int16_t); if((m_pkt.stream_index == wma_idx)) { #if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(23<<8)+0)) @@ -144,13 +148,15 @@ qint64 DecoderFFmpeg::ffmpeg_decode(char *audio, qint64 maxSize) #endif m_bitrate = c->bit_rate/1024; if(l < 0) - return 0; + return l; m_temp_pkt.data += l; m_temp_pkt.size -= l; } if (!m_temp_pkt.size && m_pkt.data) av_free_packet(&m_pkt); + if(!out_size) + out_size = 4; return out_size; } @@ -167,16 +173,36 @@ void DecoderFFmpeg::seek(qint64 pos) void DecoderFFmpeg::fillBuffer() { - if (av_read_frame(ic, &m_pkt) < 0) + while(!m_output_at) { - m_temp_pkt.size = 0; - m_inbuf_ptr = 0; - } - m_temp_pkt.size = m_pkt.size; - m_temp_pkt.data = m_pkt.data; - if(m_pkt.stream_index != wma_idx) - { - if(m_pkt.data) - av_free_packet(&m_pkt); + if(!m_temp_pkt.size) + { + if (av_read_frame(ic, &m_pkt) < 0) + { + m_temp_pkt.size = 0; + break; + } + m_temp_pkt.size = m_pkt.size; + m_temp_pkt.data = m_pkt.data; + if(m_pkt.stream_index != wma_idx) + { + if(m_pkt.data) + av_free_packet(&m_pkt); + m_temp_pkt.size = 0; + continue; + } + } + m_output_at = ffmpeg_decode(m_output_buf); + if(m_output_at < 0) + { + m_output_at = 0; + break; + } + else if(m_output_at == 0) + { + if(m_pkt.data) + av_free_packet(&m_pkt); + m_temp_pkt.size = 0; + } } } diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.h b/src/plugins/Input/ffmpeg/decoder_ffmpeg.h index 7c294837d..806496568 100644 --- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.h +++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.h @@ -58,7 +58,7 @@ public: private: //helper functions void fillBuffer(); - qint64 ffmpeg_decode(char *audio, qint64 maxSize); + qint64 ffmpeg_decode(uint8_t *audio); AVFormatContext *ic; AVCodecContext *c; @@ -70,7 +70,8 @@ private: AVPacket m_pkt; AVPacket m_temp_pkt; - uint8_t *m_inbuf_ptr; + uint8_t *m_output_buf; + qint64 m_output_at; }; |
