[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22047] branches/soundsystem/source/ blender: Added ffmpeg audio mixdown.

Jörg Müller nexyon at gmail.com
Thu Jul 30 12:33:42 CEST 2009


Revision: 22047
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22047
Author:   nexyon
Date:     2009-07-30 12:33:41 +0200 (Thu, 30 Jul 2009)

Log Message:
-----------
Added ffmpeg audio mixdown.

Modified Paths:
--------------
    branches/soundsystem/source/blender/blenkernel/BKE_sound.h
    branches/soundsystem/source/blender/blenkernel/BKE_writeavi.h
    branches/soundsystem/source/blender/blenkernel/BKE_writeffmpeg.h
    branches/soundsystem/source/blender/blenkernel/BKE_writeframeserver.h
    branches/soundsystem/source/blender/blenkernel/intern/sound.c
    branches/soundsystem/source/blender/blenkernel/intern/writeavi.c
    branches/soundsystem/source/blender/blenkernel/intern/writeffmpeg.c
    branches/soundsystem/source/blender/blenkernel/intern/writeframeserver.c
    branches/soundsystem/source/blender/editors/screen/screendump.c
    branches/soundsystem/source/blender/quicktime/apple/quicktime_export.c
    branches/soundsystem/source/blender/quicktime/quicktime_export.h
    branches/soundsystem/source/blender/render/intern/source/pipeline.c

Modified: branches/soundsystem/source/blender/blenkernel/BKE_sound.h
===================================================================
--- branches/soundsystem/source/blender/blenkernel/BKE_sound.h	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/blenkernel/BKE_sound.h	2009-07-30 10:33:41 UTC (rev 22047)
@@ -76,6 +76,10 @@
 
 void sound_scrub(struct bContext *C);
 
+#ifdef AUD_CAPI
+AUD_Device* sound_mixdown(struct Scene *scene, AUD_Specs specs, int start, int end);
+#endif
+
 void sound_stop_all(struct bContext *C);
 
 #endif

Modified: branches/soundsystem/source/blender/blenkernel/BKE_writeavi.h
===================================================================
--- branches/soundsystem/source/blender/blenkernel/BKE_writeavi.h	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/blenkernel/BKE_writeavi.h	2009-07-30 10:33:41 UTC (rev 22047)
@@ -37,13 +37,14 @@
 /* generic blender movie support, could move to own module */
 
 struct RenderData;	
-void start_avi(struct RenderData *rd, int rectx, int recty);
+struct Scene;
+void start_avi(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
 void end_avi(void);
 void append_avi(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
 void makeavistring (struct RenderData *rd, char *string);
 
 typedef struct bMovieHandle {
-	void (*start_movie)(struct RenderData *rd, int rectx, int recty);
+	void (*start_movie)(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
 	void (*append_movie)(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
 	void (*end_movie)(void);
 	int (*get_next_frame)(struct RenderData *rd); /* optional */

Modified: branches/soundsystem/source/blender/blenkernel/BKE_writeffmpeg.h
===================================================================
--- branches/soundsystem/source/blender/blenkernel/BKE_writeffmpeg.h	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/blenkernel/BKE_writeffmpeg.h	2009-07-30 10:33:41 UTC (rev 22047)
@@ -57,8 +57,9 @@
 
 struct IDProperty;
 struct RenderData;	
+struct Scene;
 
-extern void start_ffmpeg(struct RenderData *rd, int rectx, int recty);
+extern void start_ffmpeg(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
 extern void end_ffmpeg(void);
 extern void append_ffmpeg(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
 

Modified: branches/soundsystem/source/blender/blenkernel/BKE_writeframeserver.h
===================================================================
--- branches/soundsystem/source/blender/blenkernel/BKE_writeframeserver.h	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/blenkernel/BKE_writeframeserver.h	2009-07-30 10:33:41 UTC (rev 22047)
@@ -33,8 +33,9 @@
 #endif
 
 struct RenderData;	
+struct Scene;
 
-extern void start_frameserver(struct RenderData *rd, int rectx, int recty);
+extern void start_frameserver(struct Scene *scene, struct RenderData *rd, int rectx, int recty);
 extern void end_frameserver(void);
 extern void append_frameserver(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
 extern int frameserver_loop(struct RenderData *rd);

Modified: branches/soundsystem/source/blender/blenkernel/intern/sound.c
===================================================================
--- branches/soundsystem/source/blender/blenkernel/intern/sound.c	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/blenkernel/intern/sound.c	2009-07-30 10:33:41 UTC (rev 22047)
@@ -16,6 +16,9 @@
 #include "DNA_packedFile_types.h"
 #include "DNA_screen_types.h"
 
+// AUD_XXX
+#include "AUD_C-API.h"
+
 #include "BKE_utildefines.h"
 #include "BKE_global.h"
 #include "BKE_main.h"
@@ -151,8 +154,6 @@
 
 // AUD_XXX
 
-#include "AUD_C-API.h"
-
 void sound_init()
 {
 	AUD_Specs specs;
@@ -511,3 +512,40 @@
 		AUD_unlock();
 	}
 }
+
+AUD_Device* sound_mixdown(struct Scene *scene, AUD_Specs specs, int start, int end)
+{
+	AUD_Device* mixdown = AUD_openReadDevice(specs);
+	SoundHandle *handle;
+	float fps = FPS;
+	AUD_Sound *limiter, *delayer;
+	int frameskip, s, e;
+
+	end++;
+
+	for(handle = scene->sound_handles.first; handle; handle = handle->next)
+	{
+		if(start < handle->endframe && end > handle->startframe && !handle->mute && handle->source && handle->source->snd_sound)
+		{
+			frameskip = handle->frameskip;
+			s = handle->startframe - start;
+			e = handle->frameskip + AUD_MIN(handle->endframe, end) - handle->startframe;
+
+			if(s < 0)
+			{
+				frameskip -= s;
+				s = 0;
+			}
+
+			limiter = AUD_limitSound(handle->source->snd_sound, frameskip / fps, e / fps);
+			delayer = AUD_delaySound(limiter, s / fps);
+
+			AUD_playDevice(mixdown, delayer);
+
+			AUD_unload(delayer);
+			AUD_unload(limiter);
+		}
+	}
+
+	return mixdown;
+}

Modified: branches/soundsystem/source/blender/blenkernel/intern/writeavi.c
===================================================================
--- branches/soundsystem/source/blender/blenkernel/intern/writeavi.c	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/blenkernel/intern/writeavi.c	2009-07-30 10:33:41 UTC (rev 22047)
@@ -127,7 +127,7 @@
 	}
 }
 
-void start_avi(RenderData *rd, int rectx, int recty)
+void start_avi(struct Scene *scene, RenderData *rd, int rectx, int recty)
 {
 	int x, y;
 	char name[256];

Modified: branches/soundsystem/source/blender/blenkernel/intern/writeffmpeg.c
===================================================================
--- branches/soundsystem/source/blender/blenkernel/intern/writeffmpeg.c	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/blenkernel/intern/writeffmpeg.c	2009-07-30 10:33:41 UTC (rev 22047)
@@ -65,6 +65,11 @@
 
 #include "DNA_scene_types.h"
 
+// AUD_XXX
+#include "AUD_C-API.h"
+#include "BKE_sound.h"
+#include "BKE_main.h"
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -96,6 +101,9 @@
 static uint8_t* audio_output_buffer = 0;
 static int audio_outbuf_size = 0;
 
+// AUD_XXX
+static AUD_Device* audio_mixdown_device = 0;
+
 #define FFMPEG_AUTOSPLIT_SIZE 2000000000
 
 /* Delete a picture buffer */
@@ -131,6 +139,10 @@
 	//		 audio_input_frame_size 
 	//		 * sizeof(short) * c->channels);
 
+	// AUD_XXX
+	if(audio_mixdown_device)
+		AUD_readDevice(audio_mixdown_device, audio_input_buffer, audio_input_frame_size);
+
 	av_init_packet(&pkt);
 
 	pkt.size = avcodec_encode_audio(c, audio_output_buffer,
@@ -827,11 +839,22 @@
 }
 
 
-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);
+
+	// AUD_XXX
+	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 +907,13 @@
 	if (audio_stream && video_stream) {
 		write_audio_frames();
 	}
+
+	// AUD_XXX
+	if(audio_mixdown_device)
+	{
+		AUD_closeReadDevice(audio_mixdown_device);
+		audio_mixdown_device = 0;
+	}
 	
 	if (outfile) {
 		av_write_trailer(outfile);

Modified: branches/soundsystem/source/blender/blenkernel/intern/writeframeserver.c
===================================================================
--- branches/soundsystem/source/blender/blenkernel/intern/writeframeserver.c	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/blenkernel/intern/writeframeserver.c	2009-07-30 10:33:41 UTC (rev 22047)
@@ -101,7 +101,7 @@
 }
 #endif
 
-void start_frameserver(RenderData *rd, int rectx, int recty)
+void start_frameserver(struct Scene *scene, RenderData *rd, int rectx, int recty)
 {
         struct sockaddr_in      addr;
 	int arg = 1;

Modified: branches/soundsystem/source/blender/editors/screen/screendump.c
===================================================================
--- branches/soundsystem/source/blender/editors/screen/screendump.c	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/editors/screen/screendump.c	2009-07-30 10:33:41 UTC (rev 22047)
@@ -228,7 +228,7 @@
 	rd.frs_sec_base= 1.0f;
 	
 	if(BKE_imtype_is_movie(rd.imtype))
-		mh->start_movie(&rd, sj->dumpsx, sj->dumpsy);
+		mh->start_movie(sj->scene, &rd, sj->dumpsx, sj->dumpsy);
 	else
 		mh= NULL;
 	

Modified: branches/soundsystem/source/blender/quicktime/apple/quicktime_export.c
===================================================================
--- branches/soundsystem/source/blender/quicktime/apple/quicktime_export.c	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/quicktime/apple/quicktime_export.c	2009-07-30 10:33:41 UTC (rev 22047)
@@ -438,7 +438,7 @@
 }
 
 
-void start_qt(struct RenderData *rd, int rectx, int recty) {
+void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty) {
 	OSErr err = noErr;
 
 	char name[2048];

Modified: branches/soundsystem/source/blender/quicktime/quicktime_export.h
===================================================================
--- branches/soundsystem/source/blender/quicktime/quicktime_export.h	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/quicktime/quicktime_export.h	2009-07-30 10:33:41 UTC (rev 22047)
@@ -35,8 +35,9 @@
 
 // quicktime movie output functions
 struct RenderData;
+struct Scene;
 
-void start_qt(struct RenderData *rd, int rectx, int recty);	//for movie handle (BKE writeavi.c now)
+void start_qt(struct Scene *scene, struct RenderData *rd, int rectx, int recty);	//for movie handle (BKE writeavi.c now)
 void append_qt(struct RenderData *rd, int frame, int *pixels, int rectx, int recty);
 void end_qt(void);
 

Modified: branches/soundsystem/source/blender/render/intern/source/pipeline.c
===================================================================
--- branches/soundsystem/source/blender/render/intern/source/pipeline.c	2009-07-30 10:33:27 UTC (rev 22046)
+++ branches/soundsystem/source/blender/render/intern/source/pipeline.c	2009-07-30 10:33:41 UTC (rev 22047)
@@ -2633,7 +2633,7 @@
 	re->result_ok= 0;
 	
 	if(BKE_imtype_is_movie(scene->r.imtype))
-		mh->start_movie(&re->r, re->rectx, re->recty);
+		mh->start_movie(scene, &re->r, re->rectx, re->recty);
 	
 	if (mh->get_next_frame) {
 		while (!(G.afbreek == 1)) {





More information about the Bf-blender-cvs mailing list