[Bf-blender-cvs] [f2499b6] master: Fix T46368: Subtitle Export: Subtitles are not sorted by time.

Bastien Montagne noreply at git.blender.org
Sun Oct 4 16:43:50 CEST 2015


Commit: f2499b601514755819c2db4876b8ec677b45285e
Author: Bastien Montagne
Date:   Sun Oct 4 16:42:19 2015 +0200
Branches: master
https://developer.blender.org/rBf2499b601514755819c2db4876b8ec677b45285e

Fix T46368: Subtitle Export: Subtitles are not sorted by time.

We need a temp list of Text effect strips here, to be able to sort it as we want...

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

M	source/blender/blenkernel/BKE_sequencer.h
M	source/blender/blenkernel/intern/sequencer.c
M	source/blender/editors/space_sequencer/sequencer_edit.c

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

diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index f735483..360243d 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -108,6 +108,8 @@ void BKE_sequencer_new_render_data(
         int rectx, int recty, int preview_render_size,
         SeqRenderData *r_context);
 
+int BKE_sequencer_cmp_time_startdisp(const void *a, const void *b);
+
 /* Wipe effect */
 enum {
 	DO_SINGLE_WIPE,
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index f0e59ed..4847306 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -1013,6 +1013,15 @@ void BKE_sequencer_sort(Scene *scene)
 	*(ed->seqbasep) = seqbase;
 }
 
+/** Comparision function suitable to be used with BLI_listbase_sort()... */
+int BKE_sequencer_cmp_time_startdisp(const void *a, const void *b)
+{
+	Sequence *seq_a = a;
+	Sequence *seq_b = b;
+
+	return (seq_a->startdisp > seq_b->startdisp);
+}
+
 static int clear_scene_in_allseqs_cb(Sequence *seq, void *arg_pt)
 {
 	if (seq->scene == (Scene *)arg_pt)
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 88a2f38..fb52da3 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -3859,7 +3859,9 @@ static int sequencer_export_subtitles_exec(bContext *C, wmOperator *op)
 {
 	Scene *scene = CTX_data_scene(C);
 	Sequence *seq = BKE_sequencer_active_get(scene);
+	Sequence *seq_next;
 	Editing *ed = BKE_sequencer_editing_get(scene, false);
+	ListBase text_seq = {0};
 	int iter = 0;
 	FILE *file;
 	char filepath[FILE_MAX];
@@ -3885,26 +3887,40 @@ static int sequencer_export_subtitles_exec(bContext *C, wmOperator *op)
 		return OPERATOR_CANCELLED;
 	}
 
-	/* time to open and write! */
-	file = BLI_fopen(filepath, "w");
-
 	SEQ_BEGIN(ed, seq)
 	{
 		if (seq->type == SEQ_TYPE_TEXT) {
-			TextVars *data = seq->effectdata;
-			char timecode_str_start[32];
-			char timecode_str_end[32];
-
-			BLI_timecode_string_from_time(timecode_str_start, sizeof(timecode_str_start),
-			                              -2, FRA2TIME(seq->startdisp), FPS, USER_TIMECODE_SUBRIP);
-			BLI_timecode_string_from_time(timecode_str_end, sizeof(timecode_str_end),
-			                              -2, FRA2TIME(seq->enddisp), FPS, USER_TIMECODE_SUBRIP);
-
-			fprintf(file, "%d\n%s --> %s\n%s\n\n", iter++, timecode_str_start, timecode_str_end, data->text);
+			BLI_addtail(&text_seq, MEM_dupallocN(seq));
 		}
 	}
 	SEQ_END
 
+	if (BLI_listbase_is_empty(&text_seq)) {
+		BKE_report(op->reports, RPT_ERROR, "No subtitles (text strips) to export");
+		return OPERATOR_CANCELLED;
+	}
+
+	BLI_listbase_sort(&text_seq, BKE_sequencer_cmp_time_startdisp);
+
+	/* time to open and write! */
+	file = BLI_fopen(filepath, "w");
+
+	for (seq = text_seq.first; seq; seq = seq_next) {
+		TextVars *data = seq->effectdata;
+		char timecode_str_start[32];
+		char timecode_str_end[32];
+
+		BLI_timecode_string_from_time(timecode_str_start, sizeof(timecode_str_start),
+									  -2, FRA2TIME(seq->startdisp), FPS, USER_TIMECODE_SUBRIP);
+		BLI_timecode_string_from_time(timecode_str_end, sizeof(timecode_str_end),
+									  -2, FRA2TIME(seq->enddisp), FPS, USER_TIMECODE_SUBRIP);
+
+		fprintf(file, "%d\n%s --> %s\n%s\n\n", iter++, timecode_str_start, timecode_str_end, data->text);
+
+		seq_next = seq->next;
+		MEM_freeN(seq);
+	}
+
 	fclose(file);
 
 	return OPERATOR_FINISHED;




More information about the Bf-blender-cvs mailing list