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

Sebastian Parborg noreply at git.blender.org
Fri Aug 13 16:49:27 CEST 2021


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

VSE: Fix audaspace not reading ffmpeg files with start offset correctly

The duration and start time for audio strips were not correctly read in
audaspace.

Some video files have a "lead in" section of audio that plays before the
video starts playing back. Before this patch, we would play this lead in
audio at the same time as the video started and thus the audio would not
be in sync anymore.

Now the lead in audio is cut off and the duration should be correctly
calculated with this in mind.

If the audio starts after the video, the audio strip is shifted to
account for this, but it will also lead to cut off audio which might not
be wanted. However we don't have a simple way to solve this at this
point.

Differential Revision: http://developer.blender.org/D11917

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

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 ac876a01eb3..97e5f5540de 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..afdc7fcfcc6 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,41 @@ 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