Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Müller <nexyon@gmail.com>2021-08-30 23:36:02 +0300
committerJörg Müller <nexyon@gmail.com>2021-09-18 22:45:33 +0300
commitbdbc7e12a02e15ad7265dfc1ac21fb6d0016308f (patch)
treee9b967deb25f77eef348786f5cd22524eef0ec20 /source/blender/sequencer/intern/strip_add.c
parent970c928f27106b26ec7cf6afa2316c60384ab4f1 (diff)
Audaspace: added audio file streams functionality.
On the blender side this commit fixes importing video files with audio and video streams that do not share the same start time and duration. Differential Revision: https://developer.blender.org/D12353
Diffstat (limited to 'source/blender/sequencer/intern/strip_add.c')
-rw-r--r--source/blender/sequencer/intern/strip_add.c74
1 files changed, 36 insertions, 38 deletions
diff --git a/source/blender/sequencer/intern/strip_add.c b/source/blender/sequencer/intern/strip_add.c
index 9081c655d2f..3cf7a4ebf4d 100644
--- a/source/blender/sequencer/intern/strip_add.c
+++ b/source/blender/sequencer/intern/strip_add.c
@@ -403,26 +403,8 @@ Sequence *SEQ_add_sound_strip(Main *bmain,
return NULL;
}
- /* If this sound it part of a video, then the sound might start after the video.
- * In this case we need to then offset the start frame of the audio so it syncs up
- * properly with the video.
- */
- int start_frame_offset = info.start_offset * FPS;
- double start_frame_offset_remainer = (info.start_offset * FPS - start_frame_offset) / FPS;
-
- if (start_frame_offset_remainer > FLT_EPSILON) {
- /* We can't represent a fraction of a frame, so skip the first frame fraction of sound so we
- * start on a "whole" frame.
- */
- start_frame_offset++;
- }
-
- sound->offset_time += start_frame_offset_remainer;
-
- Sequence *seq = SEQ_sequence_alloc(seqbase,
- load_data->start_frame + start_frame_offset,
- load_data->channel,
- SEQ_TYPE_SOUND_RAM);
+ Sequence *seq = SEQ_sequence_alloc(
+ seqbase, load_data->start_frame, load_data->channel, SEQ_TYPE_SOUND_RAM);
seq->sound = sound;
seq->scene_sound = NULL;
@@ -508,7 +490,7 @@ Sequence *SEQ_add_movie_strip(Main *bmain,
Scene *scene,
ListBase *seqbase,
SeqLoadData *load_data,
- double *r_video_start_offset)
+ double *r_start_offset)
{
char path[sizeof(load_data->path)];
BLI_strncpy(path, load_data->path, sizeof(path));
@@ -554,8 +536,40 @@ Sequence *SEQ_add_movie_strip(Main *bmain,
return NULL;
}
+ int video_frame_offset = 0;
+ float video_fps = 0.0f;
+
+ if (anim_arr[0] != NULL) {
+ short fps_denom;
+ float fps_num;
+
+ IMB_anim_get_fps(anim_arr[0], &fps_denom, &fps_num, true);
+
+ video_fps = fps_denom / fps_num;
+
+ /* Adjust scene's frame rate settings to match. */
+ if (load_data->flags & SEQ_LOAD_MOVIE_SYNC_FPS) {
+ scene->r.frs_sec = fps_denom;
+ scene->r.frs_sec_base = fps_num;
+ }
+
+ double video_start_offset = IMD_anim_get_offset(anim_arr[0]);
+ int minimum_frame_offset;
+
+ if (*r_start_offset >= 0) {
+ minimum_frame_offset = MIN2(video_start_offset, *r_start_offset) * FPS;
+ }
+ else {
+ minimum_frame_offset = video_start_offset * FPS;
+ }
+
+ video_frame_offset = video_start_offset * FPS - minimum_frame_offset;
+
+ *r_start_offset = video_start_offset;
+ }
+
Sequence *seq = SEQ_sequence_alloc(
- seqbase, load_data->start_frame, load_data->channel, SEQ_TYPE_MOVIE);
+ seqbase, load_data->start_frame + video_frame_offset, load_data->channel, SEQ_TYPE_MOVIE);
/* Multiview settings. */
if (load_data->use_multiview) {
@@ -579,27 +593,11 @@ Sequence *SEQ_add_movie_strip(Main *bmain,
seq->blend_mode = SEQ_TYPE_CROSS; /* so alpha adjustment fade to the strip below */
- float video_fps = 0.0f;
-
if (anim_arr[0] != NULL) {
seq->len = IMB_anim_get_duration(anim_arr[0], IMB_TC_RECORD_RUN);
- *r_video_start_offset = IMD_anim_get_offset(anim_arr[0]);
IMB_anim_load_metadata(anim_arr[0]);
- short fps_denom;
- float fps_num;
-
- IMB_anim_get_fps(anim_arr[0], &fps_denom, &fps_num, true);
-
- video_fps = fps_denom / fps_num;
-
- /* Adjust scene's frame rate settings to match. */
- if (load_data->flags & SEQ_LOAD_MOVIE_SYNC_FPS) {
- scene->r.frs_sec = fps_denom;
- scene->r.frs_sec_base = fps_num;
- }
-
/* Set initial scale based on load_data->fit_method. */
orig_width = IMB_anim_get_image_width(anim_arr[0]);
orig_height = IMB_anim_get_image_height(anim_arr[0]);