diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-10-04 17:42:19 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-10-04 17:43:24 +0300 |
commit | f2499b601514755819c2db4876b8ec677b45285e (patch) | |
tree | 102c0616e53445cd4b6777f42b286ea7cc5ce2ee /source/blender | |
parent | c919ce3aa9684b88849d5628e629c3a1ac87e40b (diff) |
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...
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_sequencer.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/sequencer.c | 9 | ||||
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_edit.c | 42 |
3 files changed, 40 insertions, 13 deletions
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index f73548373ef..360243d7b2a 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 f0e59eda321..4847306f6be 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 88a2f386b9b..fb52da31d20 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; |