Commit: 8621f480bf7619f4b6c7b451e0400e84d5360dd0
Author: Bastien Montagne
Date:   Sun Oct 4 16:42:19 2015 +0200
Branches: blender-v2.76-release
https://developer.blender.org/rB8621f480bf7619f4b6c7b451e0400e84d5360dd0

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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to