Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/audaspace/ffmpeg')
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGFactory.cpp49
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGFactory.h9
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp9
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.h10
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.