Revision: 39105
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39105
Author:   nexyon
Date:     2011-08-06 17:57:20 +0000 (Sat, 06 Aug 2011)
Log Message:
-----------
3D Audio GSoC:
Mixdown functionality.

* Mixdown possible via libsndfile and ffmpeg!
* Fixed some ffmpeg deprecation warnings
* Mixdown UI only shows working Container, Codec and Format combinations!
* Minor bugs and warnings fixed

Modified Paths:
--------------
    branches/soc-2011-pepper/intern/audaspace/CMakeLists.txt
    branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
    branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_ConverterFunctions.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_IReader.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_NULLDevice.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_NULLDevice.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_Space.h
    branches/soc-2011-pepper/release/scripts/startup/bl_ui/properties_scene.py
    branches/soc-2011-pepper/source/blender/editors/sound/CMakeLists.txt
    branches/soc-2011-pepper/source/blender/editors/sound/sound_ops.c

Added Paths:
-----------
    branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp
    branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_FileWriter.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_FileWriter.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_IWriter.h
    branches/soc-2011-pepper/intern/audaspace/sndfile/AUD_SndFileWriter.cpp
    branches/soc-2011-pepper/intern/audaspace/sndfile/AUD_SndFileWriter.h

Modified: branches/soc-2011-pepper/intern/audaspace/CMakeLists.txt
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/CMakeLists.txt    2011-08-06 
16:00:00 UTC (rev 39104)
+++ branches/soc-2011-pepper/intern/audaspace/CMakeLists.txt    2011-08-06 
17:57:20 UTC (rev 39105)
@@ -88,12 +88,15 @@
        intern/AUD_ConverterReader.h
        intern/AUD_FileFactory.cpp
        intern/AUD_FileFactory.h
+       intern/AUD_FileWriter.cpp
+       intern/AUD_FileWriter.h
        intern/AUD_I3DDevice.h
        intern/AUD_I3DHandle.h
        intern/AUD_IDevice.h
        intern/AUD_IFactory.h
        intern/AUD_IHandle.h
        intern/AUD_IReader.h
+       intern/AUD_IWriter.h
        intern/AUD_JOSResampleFactory.cpp
        intern/AUD_JOSResampleFactory.h
        intern/AUD_JOSResampleReader.cpp
@@ -184,9 +187,11 @@
        list(APPEND SRC
                ffmpeg/AUD_FFMPEGFactory.cpp
                ffmpeg/AUD_FFMPEGReader.cpp
+               ffmpeg/AUD_FFMPEGWriter.cpp
 
                ffmpeg/AUD_FFMPEGFactory.h
                ffmpeg/AUD_FFMPEGReader.h
+               ffmpeg/AUD_FFMPEGWriter.h
        )
 endif()
 
@@ -246,9 +251,11 @@
        list(APPEND SRC
                sndfile/AUD_SndFileFactory.cpp
                sndfile/AUD_SndFileReader.cpp
+               sndfile/AUD_SndFileWriter.cpp
 
                sndfile/AUD_SndFileFactory.h
                sndfile/AUD_SndFileReader.h
+               sndfile/AUD_SndFileWriter.h
        )
 endif()
 

Modified: branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp       
2011-08-06 16:00:00 UTC (rev 39104)
+++ branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp       
2011-08-06 17:57:20 UTC (rev 39105)
@@ -176,11 +176,11 @@
 
 AUD_FFMPEGReader::AUD_FFMPEGReader(std::string filename) :
        m_pkgbuf(AVCODEC_MAX_AUDIO_FRAME_SIZE<<1),
-       m_byteiocontext(NULL),
+       m_aviocontext(NULL),
        m_membuf(NULL)
 {
        // open file
-       if(av_open_input_file(&m_formatCtx, filename.c_str(), NULL, 0, NULL)!=0)
+       if(avformat_open_input(&m_formatCtx, filename.c_str(), NULL, NULL)!=0)
                AUD_THROW(AUD_ERROR_FILE, fileopen_error);
 
        try
@@ -204,25 +204,20 @@
 {
        m_membuf = reinterpret_cast<data_t*>(av_malloc(FF_MIN_BUFFER_SIZE + 
FF_INPUT_BUFFER_PADDING_SIZE));
 
-       m_byteiocontext = av_alloc_put_byte(m_membuf, FF_MIN_BUFFER_SIZE, 0, 
this,
-                                                                               
read_packet, NULL, seek_packet);
+       m_aviocontext = avio_alloc_context(m_membuf, FF_MIN_BUFFER_SIZE, 0, 
this,
+                                                                          
read_packet, NULL, seek_packet);
 
-       if(!m_byteiocontext)
+       if(!m_aviocontext)
        {
-               av_free(m_byteiocontext);
+               av_free(m_aviocontext);
                AUD_THROW(AUD_ERROR_FILE, fileopen_error);
        }
 
-       AVProbeData probe_data;
-       probe_data.filename = "";
-       probe_data.buf = reinterpret_cast<data_t*>(buffer.get()->getBuffer());
-       probe_data.buf_size = buffer.get()->getSize();
-       AVInputFormat* fmt = av_probe_input_format(&probe_data, 1);
-
-       // open stream
-       if(av_open_input_stream(&m_formatCtx, m_byteiocontext, "", fmt, 
NULL)!=0)
+       m_formatCtx = avformat_alloc_context();
+       m_formatCtx->pb = m_aviocontext;
+       if(avformat_open_input(&m_formatCtx, "", NULL, NULL)!=0)
        {
-               av_free(m_byteiocontext);
+               av_free(m_aviocontext);
                AUD_THROW(AUD_ERROR_FILE, streamopen_error);
        }
 
@@ -233,7 +228,7 @@
        catch(AUD_Exception&)
        {
                av_close_input_stream(m_formatCtx);
-               av_free(m_byteiocontext);
+               av_free(m_aviocontext);
                throw;
        }
 }
@@ -242,10 +237,10 @@
 {
        avcodec_close(m_codecCtx);
 
-       if(m_byteiocontext)
+       if(m_aviocontext)
        {
                av_close_input_stream(m_formatCtx);
-               av_free(m_byteiocontext);
+               av_free(m_aviocontext);
        }
        else
                av_close_input_file(m_formatCtx);

Modified: branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h 
2011-08-06 16:00:00 UTC (rev 39104)
+++ branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGReader.h 
2011-08-06 17:57:20 UTC (rev 39105)
@@ -86,9 +86,9 @@
        AVCodecContext* m_codecCtx;
 
        /**
-        * The ByteIOContext to read the data from.
+        * The AVIOContext to read the data from.
         */
-       ByteIOContext* m_byteiocontext;
+       AVIOContext* m_aviocontext;
 
        /**
         * The stream ID in the file.

Added: branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp       
                        (rev 0)
+++ branches/soc-2011-pepper/intern/audaspace/ffmpeg/AUD_FFMPEGWriter.cpp       
2011-08-06 17:57:20 UTC (rev 39105)
@@ -0,0 +1,303 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * Copyright 2009-2011 Jörg Hermann Müller
+ *
+ * This file is part of AudaSpace.
+ *
+ * Audaspace is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * AudaSpace is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Audaspace; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file audaspace/ffmpeg/AUD_FFMPEGWriter.cpp
+ *  \ingroup audffmpeg
+ */
+
+
+// needed for INT64_C
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+
+#include "AUD_FFMPEGWriter.h"
+
+extern "C" {
+#include <libavcodec/avcodec.h>
+#include <libavformat/avformat.h>
+#include <libavformat/avio.h>
+}
+
+static const char* context_error = "AUD_FFMPEGWriter: Couldn't allocate 
context.";
+static const char* codec_error = "AUD_FFMPEGWriter: Invalid codec or codec not 
found.";
+static const char* stream_error = "AUD_FFMPEGWriter: Couldn't allocate 
stream.";
+static const char* format_error = "AUD_FFMPEGWriter: Unsupported sample 
format.";
+static const char* file_error = "AUD_FFMPEGWriter: File couldn't be written.";
+static const char* write_error = "AUD_FFMPEGWriter: Error writing packet.";
+
+AUD_FFMPEGWriter::AUD_FFMPEGWriter(std::string filename, AUD_DeviceSpecs 
specs, AUD_Container format, AUD_Codec codec, unsigned int bitrate) :
+       m_position(0),
+       m_specs(specs),
+       m_input_samples(0)
+{
+       static const char* formats[] = { NULL, "ac3", "flac", "matroska", 
"mp2", "mp3", "ogg", "wav" };
+
+       if(avformat_alloc_output_context2(&m_formatCtx, NULL, formats[format], 
filename.c_str()))
+               AUD_THROW(AUD_ERROR_FFMPEG, context_error);
+
+       m_outputFmt = m_formatCtx->oformat;
+
+       switch(codec)
+       {
+       case AUD_CODEC_AAC:
+               m_outputFmt->audio_codec = CODEC_ID_AAC;
+               break;
+       case AUD_CODEC_AC3:
+               m_outputFmt->audio_codec = CODEC_ID_AC3;
+               break;
+       case AUD_CODEC_FLAC:
+               m_outputFmt->audio_codec = CODEC_ID_FLAC;
+               break;
+       case AUD_CODEC_MP2:
+               m_outputFmt->audio_codec = CODEC_ID_MP2;
+               break;
+       case AUD_CODEC_MP3:
+               m_outputFmt->audio_codec = CODEC_ID_MP3;
+               break;
+       case AUD_CODEC_PCM:
+               switch(specs.format)
+               {
+               case AUD_FORMAT_U8:
+                       m_outputFmt->audio_codec = CODEC_ID_PCM_U8;
+                       break;
+               case AUD_FORMAT_S16:
+                       m_outputFmt->audio_codec = CODEC_ID_PCM_S16LE;
+                       break;
+               case AUD_FORMAT_S24:
+                       m_outputFmt->audio_codec = CODEC_ID_PCM_S24LE;
+                       break;
+               case AUD_FORMAT_S32:
+                       m_outputFmt->audio_codec = CODEC_ID_PCM_S32LE;
+                       break;
+               case AUD_FORMAT_FLOAT32:
+                       m_outputFmt->audio_codec = CODEC_ID_PCM_F32LE;
+                       break;
+               case AUD_FORMAT_FLOAT64:
+                       m_outputFmt->audio_codec = CODEC_ID_PCM_F64LE;
+                       break;
+               default:
+                       m_outputFmt->audio_codec = CODEC_ID_NONE;
+                       break;
+               }
+               break;
+       case AUD_CODEC_VORBIS:
+               m_outputFmt->audio_codec = CODEC_ID_VORBIS;
+               break;
+       default:
+               m_outputFmt->audio_codec = CODEC_ID_NONE;
+               break;
+       }
+
+       try
+       {
+               if(m_outputFmt->audio_codec == CODEC_ID_NONE)
+                       AUD_THROW(AUD_ERROR_SPECS, codec_error);
+
+               m_stream = av_new_stream(m_formatCtx, 0);
+               if(!m_stream)
+                       AUD_THROW(AUD_ERROR_FFMPEG, stream_error);
+
+               m_codecCtx = m_stream->codec;
+               m_codecCtx->codec_id = m_outputFmt->audio_codec;
+               m_codecCtx->codec_type = AVMEDIA_TYPE_AUDIO;
+               m_codecCtx->bit_rate = bitrate;
+               m_codecCtx->sample_rate = int(m_specs.rate);
+               m_codecCtx->channels = m_specs.channels;
+               m_codecCtx->time_base = (AVRational){1, 
m_codecCtx->sample_rate};
+
+               switch(m_specs.format)
+               {
+               case AUD_FORMAT_U8:
+                       m_convert = AUD_convert_float_u8;
+                       m_codecCtx->sample_fmt = SAMPLE_FMT_U8;
+                       break;
+               case AUD_FORMAT_S16:
+                       m_convert = AUD_convert_float_s16;
+                       m_codecCtx->sample_fmt = SAMPLE_FMT_S16;
+                       break;
+               case AUD_FORMAT_S32:
+                       m_convert = AUD_convert_float_s32;
+                       m_codecCtx->sample_fmt = SAMPLE_FMT_S32;
+                       break;
+               case AUD_FORMAT_FLOAT32:
+                       m_convert = AUD_convert_copy<float>;
+                       m_codecCtx->sample_fmt = SAMPLE_FMT_FLT;
+                       break;
+               case AUD_FORMAT_FLOAT64:
+                       m_convert = AUD_convert_float_double;
+                       m_codecCtx->sample_fmt = SAMPLE_FMT_DBL;
+                       break;
+               default:
+                       AUD_THROW(AUD_ERROR_FFMPEG, format_error);
+               }
+
+               try
+               {
+                       if(m_formatCtx->oformat->flags & AVFMT_GLOBALHEADER)
+                               m_codecCtx->flags |= CODEC_FLAG_GLOBAL_HEADER;
+
+                       AVCodec* codec = 
avcodec_find_encoder(m_codecCtx->codec_id);
+                       if(!codec)
+                               AUD_THROW(AUD_ERROR_FFMPEG, codec_error);
+
+                       if(avcodec_open(m_codecCtx, codec))
+                               AUD_THROW(AUD_ERROR_FFMPEG, codec_error);
+
+                       m_output_buffer.resize(FF_MIN_BUFFER_SIZE);
+                       int samplesize = AUD_MAX(AUD_SAMPLE_SIZE(m_specs), 
AUD_DEVICE_SAMPLE_SIZE(m_specs));
+
+                       if(m_codecCtx->frame_size <= 1)
+                               m_input_size = 0;
+                       else
+                       {
+                               m_input_buffer.resize(m_codecCtx->frame_size * 
samplesize);
+                               m_input_size = m_codecCtx->frame_size;
+                       }
+
+                       try
+                       {
+                               if(avio_open(&m_formatCtx->pb, 
filename.c_str(), AVIO_WRONLY))
+                                       AUD_THROW(AUD_ERROR_FILE, file_error);
+
+                               avformat_write_header(m_formatCtx, NULL);
+                       }
+                       catch(AUD_Exception&)
+                       {
+                               avcodec_close(m_codecCtx);
+                               av_freep(&m_formatCtx->streams[0]->codec);
+                               throw;
+                       }
+               }
+               catch(AUD_Exception&)
+               {
+                       av_freep(&m_formatCtx->streams[0]);
+                       throw;
+               }
+       }
+       catch(AUD_Exception&)
+       {
+               av_free(m_formatCtx);
+               throw;
+       }
+}
+
+AUD_FFMPEGWriter::~AUD_FFMPEGWriter()
+{
+       // writte missing data
+       if(m_input_samples)
+       {
+               sample_t* buf = m_input_buffer.getBuffer();
+               memset(buf + m_specs.channels * m_input_samples, 0,

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to