diff options
Diffstat (limited to 'intern/audaspace/ffmpeg')
-rw-r--r-- | intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp | 49 | ||||
-rw-r--r-- | intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h | 9 | ||||
-rw-r--r-- | intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp | 9 | ||||
-rw-r--r-- | intern/audaspace/ffmpeg/AUD_FFMPEGReader.h | 10 |
4 files changed, 29 insertions, 48 deletions
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp index 5f9006b0ec0..f67c819ff10 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp @@ -25,31 +25,24 @@ #include "AUD_FFMPEGFactory.h" #include "AUD_FFMPEGReader.h" -#include "AUD_Space.h" - -extern "C" { -#include <libavformat/avformat.h> -} +#include "AUD_Buffer.h" AUD_FFMPEGFactory::AUD_FFMPEGFactory(const char* filename) { - if(filename != 0) + if(filename != NULL) { m_filename = new char[strlen(filename)+1]; AUD_NEW("string") strcpy(m_filename, filename); } else - m_filename = 0; - m_buffer = 0; - m_size = 0; + m_filename = NULL; } AUD_FFMPEGFactory::AUD_FFMPEGFactory(unsigned char* buffer, int size) { - m_filename = 0; - m_buffer = (unsigned char*)av_malloc(size); AUD_NEW("buffer") - m_size = size; - memcpy(m_buffer, buffer, size); + m_filename = NULL; + m_buffer = AUD_Reference<AUD_Buffer>(new AUD_Buffer(size)); + memcpy(m_buffer.get()->getBuffer(), buffer, size); } AUD_FFMPEGFactory::~AUD_FFMPEGFactory() @@ -58,31 +51,15 @@ AUD_FFMPEGFactory::~AUD_FFMPEGFactory() { delete[] m_filename; AUD_DELETE("string") } - if(m_buffer) - { - av_free(m_buffer); AUD_DELETE("buffer") - } } AUD_IReader* AUD_FFMPEGFactory::createReader() { - try - { - AUD_IReader* reader; - if(m_filename) - reader = new AUD_FFMPEGReader(m_filename); - else - reader = new AUD_FFMPEGReader(m_buffer, m_size); - AUD_NEW("reader") - return reader; - } - catch(AUD_Exception e) - { - // return 0 if ffmpeg cannot read the file - if(e.error == AUD_ERROR_FFMPEG) - return 0; - // but throw an exception if the file doesn't exist - else - throw; - } + AUD_IReader* reader; + if(m_filename) + reader = new AUD_FFMPEGReader(m_filename); + else + reader = new AUD_FFMPEGReader(m_buffer); + AUD_NEW("reader") + return reader; } diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h index 0a9fcc22c8b..22560303a73 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h @@ -27,6 +27,8 @@ #define AUD_FFMPEGFACTORY #include "AUD_IFactory.h" +#include "AUD_Reference.h" +class AUD_Buffer; /** * This factory reads a sound file via ffmpeg. @@ -44,12 +46,7 @@ private: /** * The buffer to read from. */ - unsigned char* m_buffer; - - /** - * The size of the buffer. - */ - int m_size; + AUD_Reference<AUD_Buffer> m_buffer; public: /** diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp index b79375c2dc5..de0e47300f8 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp @@ -158,21 +158,22 @@ AUD_FFMPEGReader::AUD_FFMPEGReader(const char* filename) AUD_NEW("buffer") } -AUD_FFMPEGReader::AUD_FFMPEGReader(unsigned char* buffer, int size) +AUD_FFMPEGReader::AUD_FFMPEGReader(AUD_Reference<AUD_Buffer> buffer) { m_position = 0; m_pkgbuf_left = 0; m_byteiocontext = (ByteIOContext*)av_mallocz(sizeof(ByteIOContext)); AUD_NEW("byteiocontext") + m_membuffer = buffer; - if(init_put_byte(m_byteiocontext, buffer, size, 0, + if(init_put_byte(m_byteiocontext, buffer.get()->getBuffer(), buffer.get()->getSize(), 0, NULL, NULL, NULL, NULL) != 0) AUD_THROW(AUD_ERROR_FILE); AVProbeData probe_data; probe_data.filename = ""; - probe_data.buf = buffer; - probe_data.buf_size = size; + probe_data.buf = buffer.get()->getBuffer(); + probe_data.buf_size = buffer.get()->getSize(); AVInputFormat* fmt = av_probe_input_format(&probe_data, 1); // open stream diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h index 645f5f356f0..6e303934f36 100644 --- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h +++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h @@ -27,7 +27,9 @@ #define AUD_FFMPEGREADER #include "AUD_IReader.h" +#include "AUD_Reference.h" class AUD_Buffer; + struct AVCodecContext; extern "C" { #include <libavformat/avformat.h> @@ -90,6 +92,11 @@ private: int m_stream; /** + * The memory file to read from, only saved to keep the buffer alive. + */ + AUD_Reference<AUD_Buffer> m_membuffer; + + /** * Decodes a packet into the given buffer. * \param packet The AVPacket to decode. * \param buffer The target buffer. @@ -109,11 +116,10 @@ public: /** * Creates a new reader. * \param buffer The buffer to read from. - * \param size The size of the buffer. * \exception AUD_Exception Thrown if the buffer specified cannot be read * with ffmpeg. */ - AUD_FFMPEGReader(unsigned char* buffer, int size); + AUD_FFMPEGReader(AUD_Reference<AUD_Buffer> buffer); /** * Destroys the reader and closes the file. |