[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22897] trunk/blender/source/blender/src/ hddaudio.c: == Sequencer ==
Peter Schlaile
peter at schlaile.de
Sun Aug 30 21:38:22 CEST 2009
Revision: 22897
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22897
Author: schlaile
Date: 2009-08-30 21:38:22 +0200 (Sun, 30 Aug 2009)
Log Message:
-----------
== Sequencer ==
Fixed hddaudio for sample formats other than 16 bit (8 bit e.g.)
Modified Paths:
--------------
trunk/blender/source/blender/src/hddaudio.c
Modified: trunk/blender/source/blender/src/hddaudio.c
===================================================================
--- trunk/blender/source/blender/src/hddaudio.c 2009-08-30 19:26:18 UTC (rev 22896)
+++ trunk/blender/source/blender/src/hddaudio.c 2009-08-30 19:38:22 UTC (rev 22897)
@@ -68,14 +68,15 @@
int frame_alloc_duration;
int decode_pos;
int frame_size;
- short * decode_cache;
- short * decode_cache_zero;
+ unsigned char * decode_cache;
+ unsigned char * decode_cache_zero;
short * resample_cache;
int decode_cache_size;
int target_channels;
int target_rate;
int resample_samples_written;
int resample_samples_in;
+ int decode_sample_format_size;
ReSampleContext *resampler;
#else
@@ -178,9 +179,13 @@
(long long) rval->sample_rate * rval->channels
* rval->frame_alloc_duration / AV_TIME_BASE
* 2;
+ rval->decode_sample_format_size
+ = av_get_bits_per_sample_format(rval->pCodecCtx->sample_fmt)
+ / 8;
- rval->decode_cache = (short*) MEM_mallocN(
- rval->decode_cache_size * sizeof(short)
+ rval->decode_cache = (unsigned char*) MEM_mallocN(
+ rval->decode_cache_size
+ * rval->decode_sample_format_size
+ AVCODEC_MAX_AUDIO_FRAME_SIZE,
"hdaudio decode cache");
rval->decode_cache_zero = rval->decode_cache;
@@ -191,6 +196,7 @@
rval->resample_cache = 0;
rval->resample_samples_written = 0;
rval->resample_samples_in = 0;
+
return rval;
#else
return 0;
@@ -260,7 +266,8 @@
= audio_resample(
hdaudio->resampler,
hdaudio->resample_cache + reuse_tgt,
- hdaudio->decode_cache_zero + reuse_src,
+ hdaudio->decode_cache_zero
+ + reuse_src * hdaudio->decode_sample_format_size,
next_samples_in)
+ reuse_tgt / target_channels;
@@ -285,7 +292,7 @@
hdaudio->resampler = av_audio_resample_init(
target_channels, hdaudio->channels,
target_rate, hdaudio->sample_rate,
- SAMPLE_FMT_S16, SAMPLE_FMT_S16,
+ SAMPLE_FMT_S16, hdaudio->pCodecCtx->sample_fmt,
16, 10, 0, 0.8);
hdaudio->target_rate = target_rate;
hdaudio->target_channels = target_channels;
@@ -327,7 +334,8 @@
* hdaudio->frame_duration / AV_TIME_BASE;
rate_conversion =
(target_rate != hdaudio->sample_rate)
- || (target_channels != hdaudio->channels);
+ || (target_channels != hdaudio->channels)
+ || (hdaudio->pCodecCtx->sample_fmt != SAMPLE_FMT_S16);
sample_ofs = target_channels * (sample_position % frame_size);
frame_position = sample_position / frame_size;
@@ -346,15 +354,20 @@
hdaudio->frame_position = frame_position;
memmove(hdaudio->decode_cache,
- hdaudio->decode_cache + bl_size,
- (decode_pos - bl_size) * sizeof(short));
+ hdaudio->decode_cache + bl_size
+ * hdaudio->decode_sample_format_size,
+ (decode_pos - bl_size)
+ * hdaudio->decode_sample_format_size);
decode_pos -= bl_size;
if (decode_pos < hdaudio->decode_cache_size) {
- memset(hdaudio->decode_cache + decode_pos, 0,
+ memset(hdaudio->decode_cache
+ + decode_pos
+ * hdaudio->decode_sample_format_size,
+ 0,
(hdaudio->decode_cache_size - decode_pos)
- * sizeof(short));
+ * hdaudio->decode_sample_format_size);
while(av_read_frame(
hdaudio->pFormatCtx, &packet) >= 0) {
@@ -377,7 +390,8 @@
len = avcodec_decode_audio2(
hdaudio->pCodecCtx,
hdaudio->decode_cache
- + decode_pos,
+ + decode_pos
+ * hdaudio->decode_sample_format_size,
&data_size,
audio_pkt_data,
audio_pkt_size);
@@ -393,16 +407,17 @@
continue;
}
- decode_pos += data_size / sizeof(short);
+ decode_pos += data_size
+ / hdaudio->decode_sample_format_size;
if (decode_pos + data_size
- / sizeof(short)
+ / hdaudio->decode_sample_format_size
> hdaudio->decode_cache_size) {
break;
}
}
av_free_packet(&packet);
- if (decode_pos + data_size / sizeof(short)
+ if (decode_pos + data_size / hdaudio->decode_sample_format_size
> hdaudio->decode_cache_size) {
break;
}
@@ -455,7 +470,8 @@
avcodec_flush_buffers(hdaudio->pCodecCtx);
memset(hdaudio->decode_cache, 0,
- hdaudio->decode_cache_size * sizeof(short));
+ hdaudio->decode_cache_size
+ * hdaudio->decode_sample_format_size);
hdaudio->decode_cache_zero = hdaudio->decode_cache;
@@ -512,7 +528,9 @@
}
hdaudio->decode_cache_zero
- = hdaudio->decode_cache + diff;
+ = hdaudio->decode_cache
+ + diff
+ * hdaudio->decode_sample_format_size;
decode_cache_zero_init = 1;
}
@@ -521,7 +539,8 @@
len = avcodec_decode_audio2(
hdaudio->pCodecCtx,
hdaudio->decode_cache
- + decode_pos,
+ + decode_pos
+ * hdaudio->decode_sample_format_size,
&data_size,
audio_pkt_data,
audio_pkt_size);
@@ -537,9 +556,10 @@
continue;
}
- decode_pos += data_size / sizeof(short);
+ decode_pos += data_size
+ / hdaudio->decode_sample_format_size;
if (decode_pos + data_size
- / sizeof(short)
+ / hdaudio->decode_sample_format_size
> hdaudio->decode_cache_size) {
break;
}
@@ -547,7 +567,8 @@
av_free_packet(&packet);
- if (decode_pos + data_size / sizeof(short)
+ if (decode_pos + data_size
+ / hdaudio->decode_sample_format_size
> hdaudio->decode_cache_size) {
break;
}
@@ -561,7 +582,8 @@
memcpy(target_buffer, (rate_conversion
? hdaudio->resample_cache
- : hdaudio->decode_cache_zero) + sample_ofs,
+ : (short*)
+ hdaudio->decode_cache_zero) + sample_ofs,
nb_samples * target_channels * sizeof(short));
}
More information about the Bf-blender-cvs
mailing list