[Bf-blender-cvs] [37e3d7a66ac] temp-VSE-fixes: Fix audaspace not reading ffmpeg files with start offset correctly

Sebastian Parborg noreply at git.blender.org
Thu Aug 5 12:50:21 CEST 2021


Commit: 37e3d7a66acc8f7140b3126e039aee6c5d0c4063
Author: Sebastian Parborg
Date:   Tue Jul 6 19:48:06 2021 +0200
Branches: temp-VSE-fixes
https://developer.blender.org/rB37e3d7a66acc8f7140b3126e039aee6c5d0c4063

Fix audaspace not reading ffmpeg files with start offset correctly

===================================================================

M	extern/audaspace/bindings/C/AUD_Special.cpp
M	extern/audaspace/bindings/C/AUD_Types.h
M	extern/audaspace/include/IReader.h
M	extern/audaspace/include/fx/EffectReader.h
M	extern/audaspace/include/fx/ModulatorReader.h
M	extern/audaspace/include/fx/MutableReader.h
M	extern/audaspace/include/fx/VolumeReader.h
M	extern/audaspace/include/generator/SawtoothReader.h
M	extern/audaspace/include/generator/SilenceReader.h
M	extern/audaspace/include/generator/SineReader.h
M	extern/audaspace/include/generator/SquareReader.h
M	extern/audaspace/include/generator/TriangleReader.h
M	extern/audaspace/include/sequence/DoubleReader.h
M	extern/audaspace/include/sequence/SequenceReader.h
M	extern/audaspace/include/sequence/SuperposeReader.h
M	extern/audaspace/include/util/BufferReader.h
M	extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp
M	extern/audaspace/plugins/ffmpeg/FFMPEGReader.h
M	extern/audaspace/plugins/libsndfile/SndFileReader.cpp
M	extern/audaspace/plugins/libsndfile/SndFileReader.h
M	extern/audaspace/src/fx/EffectReader.cpp
M	extern/audaspace/src/fx/ModulatorReader.cpp
M	extern/audaspace/src/fx/MutableReader.cpp
M	extern/audaspace/src/fx/VolumeReader.cpp
M	extern/audaspace/src/generator/SawtoothReader.cpp
M	extern/audaspace/src/generator/SilenceReader.cpp
M	extern/audaspace/src/generator/SineReader.cpp
M	extern/audaspace/src/generator/SquareReader.cpp
M	extern/audaspace/src/generator/TriangleReader.cpp
M	extern/audaspace/src/sequence/DoubleReader.cpp
M	extern/audaspace/src/sequence/SequenceReader.cpp
M	extern/audaspace/src/sequence/SuperposeReader.cpp
M	extern/audaspace/src/util/BufferReader.cpp
M	source/blender/blenkernel/BKE_sound.h
M	source/blender/blenkernel/intern/sound.c
M	source/blender/editors/space_sequencer/sequencer_add.c
M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/imbuf/IMB_imbuf.h
M	source/blender/imbuf/intern/IMB_anim.h
M	source/blender/imbuf/intern/anim_movie.c
M	source/blender/makesdna/DNA_sound_types.h
M	source/blender/makesrna/intern/rna_sequencer_api.c
M	source/blender/sequencer/SEQ_add.h
M	source/blender/sequencer/intern/sound.c
M	source/blender/sequencer/intern/strip_add.c
M	source/blender/sequencer/intern/strip_time.c

===================================================================

diff --git a/extern/audaspace/bindings/C/AUD_Special.cpp b/extern/audaspace/bindings/C/AUD_Special.cpp
index f2398bf0efb..5cc33525d1d 100644
--- a/extern/audaspace/bindings/C/AUD_Special.cpp
+++ b/extern/audaspace/bindings/C/AUD_Special.cpp
@@ -86,6 +86,7 @@ AUD_API AUD_SoundInfo AUD_getInfo(AUD_Sound* sound)
 	info.specs.channels = AUD_CHANNELS_INVALID;
 	info.specs.rate = AUD_RATE_INVALID;
 	info.length = 0.0f;
+	info.start_offset = 0.0f;
 
 	try
 	{
@@ -95,6 +96,7 @@ AUD_API AUD_SoundInfo AUD_getInfo(AUD_Sound* sound)
 		{
 			info.specs = convSpecToC(reader->getSpecs());
 			info.length = reader->getLength() / (float) info.specs.rate;
+			info.start_offset = reader->getStartOffset();
 		}
 	}
 	catch(Exception&)
diff --git a/extern/audaspace/bindings/C/AUD_Types.h b/extern/audaspace/bindings/C/AUD_Types.h
index 75e4ffae18c..c6a96d30d3f 100644
--- a/extern/audaspace/bindings/C/AUD_Types.h
+++ b/extern/audaspace/bindings/C/AUD_Types.h
@@ -176,4 +176,5 @@ typedef struct
 {
 	AUD_Specs specs;
 	float length;
+	double start_offset;
 } AUD_SoundInfo;
diff --git a/extern/audaspace/include/IReader.h b/extern/audaspace/include/IReader.h
index c29900ca579..7de9a5c6d81 100644
--- a/extern/audaspace/include/IReader.h
+++ b/extern/audaspace/include/IReader.h
@@ -70,6 +70,12 @@ public:
 	 */
 	virtual int getPosition() const=0;
 
+	/**
+	 * Returns the start offset the sound should have to line up with related sources.
+	 * \return The required start offset in seconds.
+	 */
+	virtual double getStartOffset() const=0;
+
 	/**
 	 * Returns the specification of the reader.
 	 * \return The Specs structure.
diff --git a/extern/audaspace/include/fx/EffectReader.h b/extern/audaspace/include/fx/EffectReader.h
index 85eff6a8ab9..f21001c1f86 100644
--- a/extern/audaspace/include/fx/EffectReader.h
+++ b/extern/audaspace/include/fx/EffectReader.h
@@ -61,6 +61,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/fx/ModulatorReader.h b/extern/audaspace/include/fx/ModulatorReader.h
index 40cc84332a9..82c51421d52 100644
--- a/extern/audaspace/include/fx/ModulatorReader.h
+++ b/extern/audaspace/include/fx/ModulatorReader.h
@@ -72,6 +72,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/fx/MutableReader.h b/extern/audaspace/include/fx/MutableReader.h
index 217dd2aa5d4..b4d2db326af 100644
--- a/extern/audaspace/include/fx/MutableReader.h
+++ b/extern/audaspace/include/fx/MutableReader.h
@@ -64,6 +64,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/fx/VolumeReader.h b/extern/audaspace/include/fx/VolumeReader.h
index 13b6845e931..95e214c4a78 100644
--- a/extern/audaspace/include/fx/VolumeReader.h
+++ b/extern/audaspace/include/fx/VolumeReader.h
@@ -63,8 +63,9 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
 
-AUD_NAMESPACE_END
\ No newline at end of file
+AUD_NAMESPACE_END
diff --git a/extern/audaspace/include/generator/SawtoothReader.h b/extern/audaspace/include/generator/SawtoothReader.h
index b4045eb8820..0dac86b27b1 100644
--- a/extern/audaspace/include/generator/SawtoothReader.h
+++ b/extern/audaspace/include/generator/SawtoothReader.h
@@ -79,6 +79,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int & length, bool &eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/generator/SilenceReader.h b/extern/audaspace/include/generator/SilenceReader.h
index c32db4b3e89..f861efb6772 100644
--- a/extern/audaspace/include/generator/SilenceReader.h
+++ b/extern/audaspace/include/generator/SilenceReader.h
@@ -58,6 +58,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/generator/SineReader.h b/extern/audaspace/include/generator/SineReader.h
index 49cd571bc65..d1dc51c33ee 100644
--- a/extern/audaspace/include/generator/SineReader.h
+++ b/extern/audaspace/include/generator/SineReader.h
@@ -70,6 +70,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/generator/SquareReader.h b/extern/audaspace/include/generator/SquareReader.h
index 53fc574c767..fdbb6800123 100644
--- a/extern/audaspace/include/generator/SquareReader.h
+++ b/extern/audaspace/include/generator/SquareReader.h
@@ -79,6 +79,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int & length, bool &eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/generator/TriangleReader.h b/extern/audaspace/include/generator/TriangleReader.h
index 15079404b75..3c0cca64d9f 100644
--- a/extern/audaspace/include/generator/TriangleReader.h
+++ b/extern/audaspace/include/generator/TriangleReader.h
@@ -79,6 +79,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int & length, bool &eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/sequence/DoubleReader.h b/extern/audaspace/include/sequence/DoubleReader.h
index 012dcc8e832..04c7ccecaea 100644
--- a/extern/audaspace/include/sequence/DoubleReader.h
+++ b/extern/audaspace/include/sequence/DoubleReader.h
@@ -70,6 +70,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/sequence/SequenceReader.h b/extern/audaspace/include/sequence/SequenceReader.h
index 196d969e102..a13b70abb9f 100644
--- a/extern/audaspace/include/sequence/SequenceReader.h
+++ b/extern/audaspace/include/sequence/SequenceReader.h
@@ -87,6 +87,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/sequence/SuperposeReader.h b/extern/audaspace/include/sequence/SuperposeReader.h
index 8bd38ade4c3..0a29da330d7 100644
--- a/extern/audaspace/include/sequence/SuperposeReader.h
+++ b/extern/audaspace/include/sequence/SuperposeReader.h
@@ -72,6 +72,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/include/util/BufferReader.h b/extern/audaspace/include/util/BufferReader.h
index b98313726bc..c38852dc6de 100644
--- a/extern/audaspace/include/util/BufferReader.h
+++ b/extern/audaspace/include/util/BufferReader.h
@@ -69,6 +69,7 @@ public:
 	virtual void seek(int position);
 	virtual int getLength() const;
 	virtual int getPosition() const;
+	virtual double getStartOffset() const;
 	virtual Specs getSpecs() const;
 	virtual void read(int& length, bool& eos, sample_t* buffer);
 };
diff --git a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp
index b46f65eddbf..c1ab396253e 100644
--- a/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp
+++ b/extern/audaspace/plugins/ffmpeg/FFMPEGReader.cpp
@@ -68,7 +68,7 @@ int FFMPEGReader::decode(AVPacket& packet, Buffer& buffer)
 					for(int i = 0; i < m_frame->nb_samples; i++)
 					{
 						std::memcpy(((data_t*)buffer.getBuffer()) + buf_pos + ((m_codecCtx->channels * i) + channel) * single_size,
-							   m_frame->data[channel] + i * single_size, single_size);
+								 m_frame->data[channel] + i * single_size, single_size);
 					}
 				}
 			}
@@ -109,7 +109,7 @@ int FFMPEGReader::decode(AVPacket& packet, Buffer& buffer)
 				for(int i = 0; i < m_frame->nb_samples; i++)
 				{
 					std::memcpy(((data_t*)buffer.getBuffer()) + buf_pos + ((m_codecCtx->channels * i) + channel) * single_size,
-						   m_frame->data[channel] + i * single_size, single_size);
+							 m_frame->data[channel] + i * single_size, single_size);
 				}
 			}
 		}
@@ -126,7 +126,10 @@ int FFMPEGReader::decode(AVPacket& packet, Buffer& buffer)
 void FFMPEGReader::init()
 {
 	m_position = 0;
+	m_start_offset = 0.0f;
 	m_pkgbuf_left = 0;
+	m_st_time = 0;
+	m_duration = 0;
 
 	if(avformat_find_stream_info(m_formatCtx, nullptr) < 0)
 		AUD_THROW(FileException, "File couldn't be read, ffmpeg couldn't find the stream info.");
@@ -134,15 +137,36 @@ void FFMPEGReader::init()
 	// find audio stream and codec
 	m_stream = -1;
 
+	double dur_sec = 0;
+
 	for(unsigned int i = 0; i < m_formatCtx->nb_streams; i++)
 	{
 #ifdef FFMPEG_OLD_CODE
-		if((m_formatCtx->streams[i]->codec

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list