[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