diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-22 11:47:26 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-07-22 11:47:26 +0000 |
| commit | 37fd73456298ddc324eade8e61774e1c7fc70650 (patch) | |
| tree | 737936c07dd6eb7ff91be8513fdf511622b0899d /src/plugins/Input | |
| parent | 532cbe25d856bae94fc60bab7de50421c1ab3f55 (diff) | |
| download | qmmp-37fd73456298ddc324eade8e61774e1c7fc70650.tar.gz qmmp-37fd73456298ddc324eade8e61774e1c7fc70650.tar.bz2 qmmp-37fd73456298ddc324eade8e61774e1c7fc70650.zip | |
new ffmpeg support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1063 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input')
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp | 42 | ||||
| -rw-r--r-- | src/plugins/Input/ffmpeg/decoder_ffmpeg.h | 2 |
2 files changed, 27 insertions, 17 deletions
diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp index 45626a883..25321e920 100644 --- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp +++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.cpp @@ -37,13 +37,14 @@ DecoderFFmpeg::DecoderFFmpeg(QObject *parent, DecoderFactory *d, Output *o, cons m_totalTime = 0; ic = 0; m_path = path; - m_size = 0; + m_temp_pkt.size = 0; } DecoderFFmpeg::~DecoderFFmpeg() { m_bitrate = 0; + m_temp_pkt.size = 0; if (ic) av_close_input_file(ic); if(m_pkt.data) @@ -54,7 +55,7 @@ bool DecoderFFmpeg::initialize() { m_bitrate = 0; m_skip = FALSE; - m_totalTime = 0.0; + m_totalTime = 0; avcodec_init(); avcodec_register_all(); @@ -114,18 +115,18 @@ qint64 DecoderFFmpeg::readAudio(char *audio, qint64 maxSize) { if (m_skip) { - if(!m_size) + if(!m_temp_pkt.size) fillBuffer(); - if(!m_size) + if(!m_temp_pkt.size) return 0; - while(m_size > 0) + while(m_temp_pkt.size > 0) ffmpeg_decode(audio, maxSize); m_skip = FALSE; } - if(!m_size) + if(!m_temp_pkt.size) fillBuffer(); - if(!m_size) + if(!m_temp_pkt.size) return 0; return ffmpeg_decode(audio, maxSize); } @@ -135,14 +136,18 @@ qint64 DecoderFFmpeg::ffmpeg_decode(char *audio, qint64 maxSize) int out_size = maxSize; if((m_pkt.stream_index == wma_idx)) { - int l = avcodec_decode_audio2(c, (int16_t *)(audio), &out_size, m_inbuf_ptr, m_size); +#if (LIBAVCODEC_VERSION_INT >= ((52<<16)+(23<<8)+0)) + int l = avcodec_decode_audio3(c, (int16_t *)(audio), &out_size, &m_temp_pkt); +#else + int l = avcodec_decode_audio2(c, (int16_t *)(audio), &out_size, m_temp_pkt.data, m_temp_pkt.size); +#endif + m_bitrate = c->bit_rate/1024; if(l < 0) return 0; - m_inbuf_ptr += l; - m_size -= l; - + m_temp_pkt.data += l; + m_temp_pkt.size -= l; } - if (!m_size && m_pkt.data) + if (!m_temp_pkt.size && m_pkt.data) av_free_packet(&m_pkt); return out_size; @@ -151,7 +156,7 @@ qint64 DecoderFFmpeg::ffmpeg_decode(char *audio, qint64 maxSize) void DecoderFFmpeg::seekAudio(qint64 pos) { int64_t timestamp = int64_t(pos)*AV_TIME_BASE/1000; - if (ic->start_time != AV_NOPTS_VALUE) + if (ic->start_time != (qint64)AV_NOPTS_VALUE) timestamp += ic->start_time; av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD); avcodec_flush_buffers(c); @@ -162,9 +167,14 @@ void DecoderFFmpeg::fillBuffer() { if (av_read_frame(ic, &m_pkt) < 0) { - m_size = 0; + m_temp_pkt.size = 0; m_inbuf_ptr = 0; } - m_size = m_pkt.size; - m_inbuf_ptr = m_pkt.data; + 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); + } } diff --git a/src/plugins/Input/ffmpeg/decoder_ffmpeg.h b/src/plugins/Input/ffmpeg/decoder_ffmpeg.h index 1380e7cf2..db10a21b6 100644 --- a/src/plugins/Input/ffmpeg/decoder_ffmpeg.h +++ b/src/plugins/Input/ffmpeg/decoder_ffmpeg.h @@ -69,8 +69,8 @@ private: qint64 m_totalTime; AVPacket m_pkt; + AVPacket m_temp_pkt; uint8_t *m_inbuf_ptr; - int m_size; }; |
