[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11822] branches/soc-2007-hcube: Added vorbis reader.
Csaba Hruska
csaba.hruska at gmail.com
Sat Aug 25 13:15:58 CEST 2007
Revision: 11822
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11822
Author: hcube
Date: 2007-08-25 13:15:57 +0200 (Sat, 25 Aug 2007)
Log Message:
-----------
Added vorbis reader. Prevent automatic visual pcm data generation big sound samples.
Modified Paths:
--------------
branches/soc-2007-hcube/intern/tinySND/SConscript
branches/soc-2007-hcube/intern/tinySND/SND_Defines.h
branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp
branches/soc-2007-hcube/intern/tinySND/ffmpeg/ffmpegReader.cpp
branches/soc-2007-hcube/intern/tinySND/ffmpeg/ffmpegReader.h
branches/soc-2007-hcube/intern/tinySND/jack/jackDevice.cpp
branches/soc-2007-hcube/source/blender/src/drawseq.c
branches/soc-2007-hcube/source/blender/src/drawsound.c
branches/soc-2007-hcube/source/blender/src/seqaudio.c
Added Paths:
-----------
branches/soc-2007-hcube/intern/tinySND/vorbis/
branches/soc-2007-hcube/intern/tinySND/vorbis/vorbisReader.cpp
branches/soc-2007-hcube/intern/tinySND/vorbis/vorbisReader.h
Modified: branches/soc-2007-hcube/intern/tinySND/SConscript
===================================================================
--- branches/soc-2007-hcube/intern/tinySND/SConscript 2007-08-25 06:20:52 UTC (rev 11821)
+++ branches/soc-2007-hcube/intern/tinySND/SConscript 2007-08-25 11:15:57 UTC (rev 11822)
@@ -2,9 +2,9 @@
Import ('env')
-sources = env.Glob('jack/*.cpp') + env.Glob('portaudio/*.cpp') + env.Glob('sdl/*.cpp') + env.Glob('samplerate/*.cpp') + env.Glob('sndfile/*.cpp') + env.Glob('ffmpeg/*.cpp') + env.Glob('blender/*.cpp') + env.Glob('intern/*.cpp')
+sources = env.Glob('jack/*.cpp') + env.Glob('vorbis/*.cpp') + env.Glob('portaudio/*.cpp') + env.Glob('sdl/*.cpp') + env.Glob('samplerate/*.cpp') + env.Glob('sndfile/*.cpp') + env.Glob('ffmpeg/*.cpp') + env.Glob('blender/*.cpp') + env.Glob('intern/*.cpp')
-incs = '. samplerate blender sdl jack portaudio sndfile ffmpeg' + ' ' + env['BF_SDL_INC']
+incs = '. samplerate blender sdl jack vorbis portaudio sndfile ffmpeg' + ' ' + env['BF_SDL_INC']
defs = ''
#if env['WITH_BF_OPENAL']:
# sources += env.Glob('openal/*.cpp') + env.Glob('sdl/*.cpp')
Modified: branches/soc-2007-hcube/intern/tinySND/SND_Defines.h
===================================================================
--- branches/soc-2007-hcube/intern/tinySND/SND_Defines.h 2007-08-25 06:20:52 UTC (rev 11821)
+++ branches/soc-2007-hcube/intern/tinySND/SND_Defines.h 2007-08-25 11:15:57 UTC (rev 11822)
@@ -39,12 +39,12 @@
// these are frame counts
// the final values
-//#define SND_WAVE_BUFFER_FRAMES (256*1024)
-//#define SND_WAVE_BUFFER_STEP_FRAMES (192*1024)
+#define SND_WAVE_BUFFER_FRAMES (64*1024)
+#define SND_WAVE_BUFFER_STEP_FRAMES (8*1024)
// smaller values are good for testing
-#define SND_WAVE_BUFFER_FRAMES (12*1024)
-#define SND_WAVE_BUFFER_STEP_FRAMES (4*1024)
+//#define SND_WAVE_BUFFER_FRAMES (12*1024)
+//#define SND_WAVE_BUFFER_STEP_FRAMES (4*1024)
#define SND_MIX_BUFFER_FRAMES (16*1024)
Modified: branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp
===================================================================
--- branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp 2007-08-25 06:20:52 UTC (rev 11821)
+++ branches/soc-2007-hcube/intern/tinySND/blender/SND_C-api.cpp 2007-08-25 11:15:57 UTC (rev 11822)
@@ -17,6 +17,7 @@
#include "sndfileReader.h"
#include "sndfileWriter.h"
#include "ffmpegReader.h"
+#include "vorbisReader.h"
#ifdef WIN32
#pragma warning (disable:4786) // get rid of stupid stl-visual compiler debug warning
@@ -95,9 +96,9 @@
gCallbackUserData1 = 0;
gCallbackUserData2 = 0;
-// gDevice = new SDLDevice();
+ gDevice = new SDLDevice();
// gDevice = new portaudioDevice();
- gDevice = new jackDevice();
+// gDevice = new jackDevice();
gDevice->initialize();
@@ -343,9 +344,9 @@
// if load succed we attach the FXSample to a FXMixer and return with new FXSample handle
SND_DataProvider *dataReader;
- ///////////////////////////////////////////////////////////////////
- // data provider fallback: Wav -> Aiff -> ffmpeg -> sndfile
- ///////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////
+ // data provider fallback: Wav -> Aiff -> vorbis -> ffmpeg -> sndfile
+ //////////////////////////////////////////////////////////////////////
// try Wav
dataReader = new SND_WavReader( filename );
@@ -360,6 +361,13 @@
{
delete dataReader;
+ // try vorbis
+ dataReader = new vorbisReader( filename );
+ }
+ if( !dataReader->isFormatSupported() )
+ {
+ delete dataReader;
+
// try ffmpeg
dataReader = new ffmpegReader( filename );
}
Modified: branches/soc-2007-hcube/intern/tinySND/ffmpeg/ffmpegReader.cpp
===================================================================
--- branches/soc-2007-hcube/intern/tinySND/ffmpeg/ffmpegReader.cpp 2007-08-25 06:20:52 UTC (rev 11821)
+++ branches/soc-2007-hcube/intern/tinySND/ffmpeg/ffmpegReader.cpp 2007-08-25 11:15:57 UTC (rev 11822)
@@ -23,9 +23,9 @@
mFormatCtx = 0;
mIsFormatSupported = false;
return;
-/*
- //do_init_ffmpeg();
+ // ffmpeg have to be initialized before
+
if( av_open_input_file( &mFormatCtx, filename, NULL, 0, NULL ) != 0 )
{
mFormatCtx = 0;
@@ -81,7 +81,8 @@
// opened successfully
// setup SND_DataProvider attributes
-
+
+ mStreamIndex = audioStream;
mNumFrames = mCodecCtx->frame_number;
mSampleRate = mCodecCtx->sample_rate;
switch( mCodecCtx->sample_fmt )
@@ -107,19 +108,27 @@
mIsSeekable = true; // !!!! UNIMPLEMENTED YET !!!!
mDuration = ((float)mNumFrames)/((float)mSampleRate);
+ mBufferSize = 64*1024;
+ mBuffer = new short[ mBufferSize ];
+
+ // make buffer data invalid
+ mBufferPos = mNumFrames + 1;
+
mIsFormatSupported = true;
-*/
+
}
ffmpegReader::~ffmpegReader(void)
{
-/*
+
if( mFormatCtx != 0 )
{
avcodec_close( mCodecCtx );
av_close_input_file( mFormatCtx );
+
+ delete mBuffer;
}
-*/
+
}
bool ffmpegReader::isFormatSupported(void)
@@ -129,7 +138,7 @@
void ffmpegReader::seek( int frameNum )
{
- // !!!! NOT IMPLEMENTED YET !!!!
+ mFrameCounter = frameNum;
}
void ffmpegReader::fillBuffer( float *buffer, int framesNum )
@@ -137,6 +146,105 @@
AVPacket packet;
// !!!! NOT IMPLEMENTED YET !!!!
+ // brute force in first version
+
+ av_seek_frame( mFormatCtx, -1, mFrameCounter, AVSEEK_FLAG_ANY | AVSEEK_FLAG_BACKWARD );
+ avcodec_flush_buffers( mCodecCtx );
+/*
+ while( av_read_frame( mFormatCtx, &packet ) >= 0 )
+ {
+ int data_size;
+ int len;
+ uint8_t *audio_pkt_data;
+ int audio_pkt_size;
+
+ if( packet.stream_index != mStreamIndex )
+ {
+ av_free_packet(&packet);
+ continue;
+ }
+
+ audio_pkt_data = packet.data;
+ audio_pkt_size = packet.size;
+
+ if (!hdaudio->decode_cache_zero && audio_pkt_size > 0) {
+ long long diff;
+
+ if (packet.pts == AV_NOPTS_VALUE) {
+ fprintf(stderr,
+ "hdaudio: audio "
+ "pts=NULL audio "
+ "distortion!\n");
+ diff = 0;
+ } else {
+ long long pts = packet.pts;
+ long long spts = (long long) (
+ pos / time_base / AV_TIME_BASE
+ + 0.5);
+ diff = spts - pts;
+ if (diff < 0) {
+ fprintf(stderr,
+ "hdaudio: "
+ "negative seek: "
+ "%lld < %lld "
+ "(pos=%lld) "
+ "audio distortion!!\n",
+ spts, pts, pos);
+ diff = 0;
+ }
+ }
+
+
+ diff *= hdaudio->sample_rate * time_base;
+ diff *= hdaudio->channels;
+
+ if (diff > hdaudio->decode_cache_size / 2) {
+ fprintf(stderr,
+ "hdaudio: audio "
+ "diff too large!!\n");
+ diff = 0;
+ }
+
+ hdaudio->decode_cache_zero
+ = hdaudio->decode_cache + diff;
+ }
+
+ while (audio_pkt_size > 0) {
+ len = avcodec_decode_audio(
+ hdaudio->pCodecCtx,
+ hdaudio->decode_cache
+ + decode_pos,
+ &data_size,
+ audio_pkt_data,
+ audio_pkt_size);
+ if (len <= 0) {
+ audio_pkt_size = 0;
+ break;
+ }
+
+ audio_pkt_size -= len;
+ audio_pkt_data += len;
+
+ if (data_size <= 0) {
+ continue;
+ }
+
+ decode_pos += data_size / sizeof(short);
+ if (decode_pos + data_size
+ / sizeof(short)
+ > hdaudio->decode_cache_size) {
+ break;
+ }
+ }
+
+ av_free_packet(&packet);
+
+ if (decode_pos + data_size / sizeof(short)
+ > hdaudio->decode_cache_size) {
+ break;
+ }
+ }
+*/
}
/*
static void sound_hdaudio_extract_small_block(
@@ -162,43 +270,6 @@
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);
- }
- }
- }
-
if (frame_position == hdaudio->frame_position + 1
&& in_frame_size * hdaudio->channels <= hdaudio->decode_pos) {
int bl_size = in_frame_size * hdaudio->channels;
@@ -266,35 +337,6 @@
}
}
- 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;
- }
-
hdaudio->decode_pos = decode_pos;
}
@@ -432,15 +474,6 @@
break;
}
}
- 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;
- }
hdaudio->decode_pos = decode_pos;
}
Modified: branches/soc-2007-hcube/intern/tinySND/ffmpeg/ffmpegReader.h
===================================================================
--- branches/soc-2007-hcube/intern/tinySND/ffmpeg/ffmpegReader.h 2007-08-25 06:20:52 UTC (rev 11821)
+++ branches/soc-2007-hcube/intern/tinySND/ffmpeg/ffmpegReader.h 2007-08-25 11:15:57 UTC (rev 11822)
@@ -21,8 +21,14 @@
AVCodec *mCodec;
AVFormatContext *mFormatCtx;
AVCodecContext *mCodecCtx;
+ int mStreamIndex;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list