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)) {


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to