use static functions where possible for some local functions.
[blender.git] / source / blender / blenkernel / intern / writeffmpeg.c
index 5e3c8024524227e408e5cb1c2a381d510aa8bda9..9e86dcbe49118b2a4cc2d63fd720fbfe873fbd45 100644 (file)
 
 #include "DNA_scene_types.h"
 
+#include "AUD_C-API.h"
+#include "BKE_sound.h"
+#include "BKE_main.h"
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -96,6 +100,8 @@ static int audio_input_frame_size = 0;
 static uint8_t* audio_output_buffer = 0;
 static int audio_outbuf_size = 0;
 
+static AUD_Device* audio_mixdown_device = 0;
+
 #define FFMPEG_AUTOSPLIT_SIZE 2000000000
 
 /* Delete a picture buffer */
@@ -127,9 +133,8 @@ static int write_audio_frame(void)
 
        c = get_codec_from_stream(audio_stream);
 
-       //XXX audiostream_fill(audio_input_buffer, 
-       //               audio_input_frame_size 
-       //               * sizeof(short) * c->channels);
+       if(audio_mixdown_device)
+               AUD_readDevice(audio_mixdown_device, audio_input_buffer, audio_input_frame_size);
 
        av_init_packet(&pkt);
 
@@ -608,7 +613,7 @@ static AVStream* alloc_audio_stream(RenderData *rd, int codec_id, AVFormatContex
 }
 /* essential functions -- start, append, end */
 
-void start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty)
+static void start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty)
 {
        /* Handle to the output file */
        AVFormatContext* of;
@@ -827,11 +832,21 @@ static void makeffmpegstring(RenderData* rd, char* string) {
 }
 
 
-void start_ffmpeg(RenderData *rd, int rectx, int recty)
+void start_ffmpeg(struct Scene *scene, RenderData *rd, int rectx, int recty)
 {
        ffmpeg_autosplit_count = 0;
 
        start_ffmpeg_impl(rd, rectx, recty);
+
+       if(ffmpeg_multiplex_audio && audio_stream)
+       {
+               AVCodecContext* c = get_codec_from_stream(audio_stream);
+               AUD_Specs specs;
+               specs.channels = c->channels;
+               specs.format = AUD_FORMAT_S16;
+               specs.rate = rd->audio.mixrate;
+               audio_mixdown_device = sound_mixdown(scene, specs, rd->sfra, rd->efra);
+       }
 }
 
 void end_ffmpeg(void);
@@ -884,6 +899,12 @@ void end_ffmpeg(void)
        if (audio_stream && video_stream) {
                write_audio_frames();
        }
+
+       if(audio_mixdown_device)
+       {
+               AUD_closeReadDevice(audio_mixdown_device);
+               audio_mixdown_device = 0;
+       }
        
        if (outfile) {
                av_write_trailer(outfile);