[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20559] trunk/blender/source/blender/src: == Sequencer ==
Peter Schlaile
peter at schlaile.de
Mon Jun 1 18:35:05 CEST 2009
Revision: 20559
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20559
Author: schlaile
Date: 2009-06-01 18:35:05 +0200 (Mon, 01 Jun 2009)
Log Message:
-----------
== Sequencer ==
This fixes:
[#18507] Wrong audio mixdown
Also: you can change output sample rate while blender is running
and the audio device get's reopened automatically.
Subframe-precision seeking was also broken for some releases...
(shame on me)
Modified Paths:
--------------
trunk/blender/source/blender/src/hddaudio.c
trunk/blender/source/blender/src/seqaudio.c
Modified: trunk/blender/source/blender/src/hddaudio.c
===================================================================
--- trunk/blender/source/blender/src/hddaudio.c 2009-06-01 16:22:53 UTC (rev 20558)
+++ trunk/blender/source/blender/src/hddaudio.c 2009-06-01 16:35:05 UTC (rev 20559)
@@ -216,6 +216,97 @@
}
#ifdef WITH_FFMPEG
+
+#define RESAMPLE_FILL_RATIO (7.0/4.0)
+
+static void sound_hdaudio_run_resampler_seek(
+ struct hdaudio * hdaudio)
+{
+ int in_frame_size = (long long) hdaudio->sample_rate
+ * hdaudio->frame_duration / AV_TIME_BASE;
+
+ hdaudio->resample_samples_in = in_frame_size * RESAMPLE_FILL_RATIO;
+ hdaudio->resample_samples_written
+ = audio_resample(hdaudio->resampler,
+ hdaudio->resample_cache,
+ hdaudio->decode_cache_zero,
+ in_frame_size * RESAMPLE_FILL_RATIO);
+}
+
+static void sound_hdaudio_run_resampler_continue(
+ struct hdaudio * hdaudio)
+{
+ int target_rate = hdaudio->target_rate;
+ int target_channels = hdaudio->target_channels;
+
+ int frame_size = (long long) target_rate
+ * hdaudio->frame_duration / AV_TIME_BASE;
+ int in_frame_size = (long long) hdaudio->sample_rate
+ * hdaudio->frame_duration / AV_TIME_BASE;
+
+ int reuse_tgt = (hdaudio->resample_samples_written
+ - frame_size) * target_channels;
+ int reuse_src = (hdaudio->resample_samples_in
+ - in_frame_size) * hdaudio->channels;
+ int next_samples_in =
+ in_frame_size * RESAMPLE_FILL_RATIO
+ - reuse_src / hdaudio->channels;
+
+ memmove(hdaudio->resample_cache,
+ hdaudio->resample_cache + frame_size * target_channels,
+ reuse_tgt * sizeof(short));
+
+ hdaudio->resample_samples_written
+ = audio_resample(
+ hdaudio->resampler,
+ hdaudio->resample_cache + reuse_tgt,
+ hdaudio->decode_cache_zero + reuse_src,
+ next_samples_in)
+ + reuse_tgt / target_channels;
+
+ hdaudio->resample_samples_in = next_samples_in
+ + reuse_src / hdaudio->channels;
+}
+
+static void sound_hdaudio_init_resampler(
+ struct hdaudio * hdaudio,
+ int frame_position, int target_rate, int target_channels)
+{
+ int frame_size = (long long) target_rate
+ * hdaudio->frame_duration / AV_TIME_BASE;
+
+ if (hdaudio->resampler &&
+ (hdaudio->target_rate != target_rate
+ || hdaudio->target_channels != target_channels)) {
+ audio_resample_close(hdaudio->resampler);
+ hdaudio->resampler = 0;
+ }
+ if (!hdaudio->resampler) {
+ hdaudio->resampler = av_audio_resample_init(
+ target_channels, hdaudio->channels,
+ target_rate, hdaudio->sample_rate,
+ SAMPLE_FMT_S16, SAMPLE_FMT_S16,
+ 16, 10, 0, 0.8);
+ hdaudio->target_rate = target_rate;
+ hdaudio->target_channels = target_channels;
+ if (hdaudio->resample_cache) {
+ MEM_freeN(hdaudio->resample_cache);
+ }
+
+
+ hdaudio->resample_cache = (short*) MEM_mallocN(
+ (long long)
+ hdaudio->target_channels
+ * frame_size * 2
+ * sizeof(short),
+ "hdaudio resample cache");
+ if (frame_position == hdaudio->frame_position ||
+ frame_position == hdaudio->frame_position + 1) {
+ sound_hdaudio_run_resampler_seek(hdaudio);
+ }
+ }
+}
+
static void sound_hdaudio_extract_small_block(
struct hdaudio * hdaudio,
short * target_buffer,
@@ -240,40 +331,9 @@
if (hdaudio == 0) return;
if (rate_conversion) {
- if (hdaudio->resampler &&
- (hdaudio->target_rate != target_rate
- || hdaudio->target_channels != target_channels)) {
- audio_resample_close(hdaudio->resampler);
- hdaudio->resampler = 0;
- }
- if (!hdaudio->resampler) {
- hdaudio->resampler = audio_resample_init(
- target_channels, hdaudio->channels,
- target_rate, hdaudio->sample_rate);
- hdaudio->target_rate = target_rate;
- hdaudio->target_channels = target_channels;
- if (hdaudio->resample_cache) {
- MEM_freeN(hdaudio->resample_cache);
- }
-
-
- hdaudio->resample_cache = (short*) MEM_mallocN(
- (long long)
- hdaudio->target_channels
- * frame_size * 2
- * sizeof(short),
- "hdaudio resample cache");
- if (frame_position == hdaudio->frame_position) {
- hdaudio->resample_samples_in =
- in_frame_size * 7 / 4;
- hdaudio->resample_samples_written
- = audio_resample(
- hdaudio->resampler,
- hdaudio->resample_cache,
- hdaudio->decode_cache_zero,
- in_frame_size * 7 / 4);
- }
- }
+ sound_hdaudio_init_resampler(
+ hdaudio, frame_position,
+ target_rate, target_channels);
}
if (frame_position == hdaudio->frame_position + 1
@@ -347,36 +407,11 @@
}
}
+ hdaudio->decode_pos = decode_pos;
+
if (rate_conversion) {
- int written = hdaudio->resample_samples_written
- * target_channels;
- int ofs = target_channels * frame_size;
- int recycle = written - ofs;
- int next_in = in_frame_size
- + (3.0/4.0
- - (double) recycle / (double)
- (frame_size * target_channels)
- ) * in_frame_size;
-
- memmove(hdaudio->resample_cache,
- hdaudio->resample_cache + ofs,
- recycle * sizeof(short));
-
- hdaudio->resample_samples_written
- = audio_resample(
- hdaudio->resampler,
- hdaudio->resample_cache + recycle,
- hdaudio->decode_cache_zero
- + hdaudio->resample_samples_in
- * hdaudio->channels
- - bl_size,
- next_in)
- + recycle / target_channels;
-
- hdaudio->resample_samples_in = next_in;
+ sound_hdaudio_run_resampler_continue(hdaudio);
}
-
- hdaudio->decode_pos = decode_pos;
}
if (frame_position != hdaudio->frame_position) {
@@ -390,6 +425,7 @@
* hdaudio->frame_duration / AV_TIME_BASE;
long long seek_pos;
+ int decode_cache_zero_init = 0;
hdaudio->frame_position = frame_position;
@@ -435,8 +471,7 @@
audio_pkt_data = packet.data;
audio_pkt_size = packet.size;
- if (!hdaudio->decode_cache_zero
- && audio_pkt_size > 0) {
+ if (!decode_cache_zero_init && audio_pkt_size > 0) {
long long diff;
if (packet.pts == AV_NOPTS_VALUE) {
@@ -476,6 +511,7 @@
hdaudio->decode_cache_zero
= hdaudio->decode_cache + diff;
+ decode_cache_zero_init = 1;
}
while (audio_pkt_size > 0) {
@@ -514,22 +550,18 @@
break;
}
}
+ hdaudio->decode_pos = decode_pos;
+
if (rate_conversion) {
- hdaudio->resample_samples_written
- = audio_resample(hdaudio->resampler,
- hdaudio->resample_cache,
- hdaudio->decode_cache_zero,
- in_frame_size * 7 / 4);
- hdaudio->resample_samples_in =
- in_frame_size * 7 / 4;
+ sound_hdaudio_run_resampler_seek(hdaudio);
}
- hdaudio->decode_pos = decode_pos;
}
memcpy(target_buffer, (rate_conversion
? hdaudio->resample_cache
: hdaudio->decode_cache_zero) + sample_ofs,
nb_samples * target_channels * sizeof(short));
+
}
#endif
@@ -575,6 +607,9 @@
avcodec_close(hdaudio->pCodecCtx);
av_close_input_file(hdaudio->pFormatCtx);
MEM_freeN (hdaudio->decode_cache);
+ if (hdaudio->resampler) {
+ audio_resample_close(hdaudio->resampler);
+ }
if (hdaudio->resample_cache) {
MEM_freeN(hdaudio->resample_cache);
}
Modified: trunk/blender/source/blender/src/seqaudio.c
===================================================================
--- trunk/blender/source/blender/src/seqaudio.c 2009-06-01 16:22:53 UTC (rev 20558)
+++ trunk/blender/source/blender/src/seqaudio.c 2009-06-01 16:35:05 UTC (rev 20559)
@@ -564,7 +564,7 @@
obtained = (SDL_AudioSpec*)MEM_mallocN(sizeof(SDL_AudioSpec),
"SDL_AudioSpec");
-
+ audio_initialised = 0;
desired->callback=audio_fill;
if ( SDL_OpenAudio(desired, obtained) < 0 ) {
@@ -670,16 +670,18 @@
sound_init_audio();
}
- if (U.mixbufsize && !audio_initialised && !mixdown) {
+ if (U.mixbufsize &&
+ (!audio_initialised
+ || desired.freq != audio_scene->audio.mixrate
+ || desired.samples != U.mixbufsize)
+ && !mixdown) {
desired.freq=audio_scene->audio.mixrate;
desired.format=AUDIO_S16SYS;
desired.channels=2;
desired.samples=U.mixbufsize;
desired.userdata=0;
- if (audio_init(&desired)==0) {
- U.mixbufsize = 0; /* no audio */
- }
+ audio_init(&desired);
}
audio_startframe = startframe;
@@ -706,7 +708,7 @@
void audiostream_scrub(int frame)
{
- if (U.mixbufsize) audiostream_play(frame, 4096, 0);
+ audiostream_play(frame, 4096, 0);
}
void audiostream_stop(void)
@@ -721,7 +723,7 @@
{
int pos;
- if (U.mixbufsize && audio_scene) {
+ if (audio_initialised && audio_scene) {
pos = (int) (((double)(audio_pos-U.mixbufsize)
/ ( audio_scene->audio.mixrate*4 ))
* FPS );
More information about the Bf-blender-cvs
mailing list