[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