[Bf-blender-cvs] [2cbe60b] master: New "use placeholders" feature of the sequencer did not detect correct filenames.

Antony Riakiotakis noreply at git.blender.org
Thu Jun 4 20:41:35 CEST 2015


Commit: 2cbe60b47672acd67b6ec2c15f13f196247ecfe3
Author: Antony Riakiotakis
Date:   Thu Jun 4 20:40:11 2015 +0200
Branches: master
https://developer.blender.org/rB2cbe60b47672acd67b6ec2c15f13f196247ecfe3

New "use placeholders" feature of the sequencer did not detect correct
filenames.

Added BLI_path utility functions to decompose a path name and
extract the frame number. It should be useful in autocollapse
feature as well

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

M	source/blender/blenlib/BLI_path_util.h
M	source/blender/blenlib/intern/path_util.c
M	source/blender/editors/space_sequencer/sequencer_add.c
M	source/blender/editors/space_sequencer/sequencer_edit.c
M	source/blender/editors/space_sequencer/sequencer_intern.h

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

diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h
index 30b57c5..c9a54c3 100644
--- a/source/blender/blenlib/BLI_path_util.h
+++ b/source/blender/blenlib/BLI_path_util.h
@@ -132,6 +132,8 @@ bool BLI_parent_dir(char *path) ATTR_NONNULL();
 bool BLI_path_abs(char *path, const char *basepath)  ATTR_NONNULL();
 bool BLI_path_frame(char *path, int frame, int digits) ATTR_NONNULL();
 bool BLI_path_frame_range(char *path, int sta, int end, int digits) ATTR_NONNULL();
+bool BLI_path_frame_get(char *path, int *r_frame, int *numdigits) ATTR_NONNULL();
+void BLI_path_frame_strip(char *path, bool setsharp, char *ext) ATTR_NONNULL();
 bool BLI_path_frame_check_chars(const char *path) ATTR_NONNULL();
 bool BLI_path_cwd(char *path) ATTR_NONNULL();
 void BLI_path_rel(char *file, const char *relfile) ATTR_NONNULL();
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 9cf360a..d3352e2 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -859,6 +859,111 @@ bool BLI_path_frame_range(char *path, int sta, int end, int digits)
 }
 
 /**
+ * Get the frame from a filename formatted by blender's frame scheme
+ */
+bool BLI_path_frame_get(char *path, int *r_frame, int *r_numdigits)
+{
+	if (path && *path) {
+		char *file = (char *)BLI_last_slash(path);
+		char *c;
+		int len, numdigits;
+
+		numdigits = *r_numdigits = 0;
+
+		if (file == NULL)
+			file = path;
+
+		/* first get the extension part */
+		len = strlen(file);
+
+		c = file + len;
+
+		/* isolate extension */
+		while (--c != file) {
+			if (*c == '.') {
+				c--;
+				break;
+			}
+		}
+
+		/* find start of number */
+		while (c != (file - 1) && isdigit(*c)) {
+			c--;
+			numdigits++;
+		}
+
+		if (numdigits) {
+			char prevchar;
+
+			c++;
+			prevchar = c[numdigits];
+			c[numdigits] = 0;
+
+			/* was the number really an extension? */
+			*r_frame = atoi(c);
+			c[numdigits] = prevchar;
+
+			*r_numdigits = numdigits;
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
+void BLI_path_frame_strip(char *path, bool setsharp, char *ext)
+{
+	if (path && *path) {
+		char *file = (char *)BLI_last_slash(path);
+		char *c, *suffix;
+		int len;
+		int numdigits = 0;
+
+		if (file == NULL)
+			file = path;
+
+		/* first get the extension part */
+		len = strlen(file);
+
+		c = file + len;
+
+		/* isolate extension */
+		while (--c != file) {
+			if (*c == '.') {
+				c--;
+				break;
+			}
+		}
+
+		suffix = c + 1;
+
+		/* find start of number */
+		while (c != (file - 1) && isdigit(*c)) {
+			c--;
+			numdigits++;
+		}
+
+		c++;
+
+		if(numdigits) {
+			/* replace the number with the suffix and terminate the string */
+			while (numdigits--) {
+				if (ext) *ext++ = *suffix;
+
+				if (setsharp) *c++ = '#';
+				else *c++ = *suffix;
+
+				suffix++;
+			}
+			*c = 0;
+			if (ext) *ext = 0;
+		}
+	}
+}
+
+
+/**
  * Check if we have '#' chars, usable for #BLI_path_frame, #BLI_path_frame_range
  */
 bool BLI_path_frame_check_chars(const char *path)
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index c89df75..86d1fe7 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -752,33 +752,20 @@ void SEQUENCER_OT_sound_strip_add(struct wmOperatorType *ot)
 	RNA_def_boolean(ot->srna, "cache", false, "Cache", "Cache the sound in memory");
 }
 
-int sequencer_image_seq_get_minmax_frame(wmOperator *op, int sfra, int *r_minframe)
+int sequencer_image_seq_get_minmax_frame(wmOperator *op, int sfra, int *r_minframe, int *r_numdigits)
 {
 	int minframe = INT32_MAX, maxframe = INT32_MIN;
+	int numdigits = 0;
 
 	RNA_BEGIN (op->ptr, itemptr, "files")
 	{
-		char *filename = NULL, *filename_stripped;
+		char *filename;
 		int frame;
 		/* just get the first filename */
 		filename = RNA_string_get_alloc(&itemptr, "name", NULL, 0);
 
 		if (filename) {
-			bool is_numeric;
-
-			filename_stripped = filename;
-
-			/* strip numeric extensions */
-			while (*filename_stripped && isdigit(*filename_stripped)) {
-				filename_stripped++;
-			}
-
-			is_numeric = (filename_stripped != filename && *filename_stripped == '.');
-
-			if (is_numeric) {
-				/* was the number really an extension? */
-				*filename_stripped = 0;
-				frame = atoi(filename);
+			if (BLI_path_frame_get(filename, &frame, &numdigits)) {
 				minframe = min_ii(minframe, frame);
 				maxframe = max_ii(maxframe, frame);
 			}
@@ -794,14 +781,15 @@ int sequencer_image_seq_get_minmax_frame(wmOperator *op, int sfra, int *r_minfra
 	}
 
 	*r_minframe = minframe;
+	*r_numdigits = numdigits;
 
 	return maxframe - minframe + 1;
 }
 
-void sequencer_image_seq_reserve_frames(wmOperator *op, StripElem *se, int len, int minframe)
+void sequencer_image_seq_reserve_frames(wmOperator *op, StripElem *se, int len, int minframe, int numdigits)
 {
 	int i;
-	char *filename = NULL, *filename_stripped;
+	char *filename = NULL;
 	RNA_BEGIN (op->ptr, itemptr, "files")
 	{
 		/* just get the first filename */
@@ -810,26 +798,16 @@ void sequencer_image_seq_reserve_frames(wmOperator *op, StripElem *se, int len,
 	}
 	RNA_END;
 
-	filename_stripped = filename;
-
-	if (filename_stripped) {
-		int numlen = 0;
-
-		/* strip numeric extensions */
-		while (*filename_stripped && isdigit(*filename_stripped)) {
-			filename_stripped++;
-			numlen++;
-		}
-
-		/* was the number really an extension? */
-		if (*filename_stripped == '.')
-			filename_stripped++;
-		else {
-			filename_stripped = filename;
-		}
+	if (filename) {
+		char ext[PATH_MAX];
+		char filename_stripped[PATH_MAX];
+		/* strip the frame from filename and substitute with # */
+		BLI_path_frame_strip(filename, true, ext);
 
 		for (i = 0; i < len; i++, se++) {
-			BLI_snprintf(se->name, sizeof(se->name), "%0*d.%s", numlen, minframe + i, filename_stripped);
+			BLI_strncpy(filename_stripped, filename, sizeof(filename_stripped));
+			BLI_path_frame(filename_stripped, minframe + i, numdigits);
+			BLI_snprintf(se->name, sizeof(se->name), "%s%s", filename_stripped, ext);
 		}
 
 		MEM_freeN(filename);
@@ -840,7 +818,7 @@ void sequencer_image_seq_reserve_frames(wmOperator *op, StripElem *se, int len,
 /* add image operator */
 static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
 {
-	int minframe;
+	int minframe, numdigits;
 	/* cant use the generic function for this */
 	Scene *scene = CTX_data_scene(C); /* only for sound */
 	Editing *ed = BKE_sequencer_editing_get(scene, true);
@@ -855,7 +833,7 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
 
 	/* images are unique in how they handle this - 1 per strip elem */
 	if (use_placeholders) {
-		seq_load.len = sequencer_image_seq_get_minmax_frame(op, seq_load.start_frame, &minframe);
+		seq_load.len = sequencer_image_seq_get_minmax_frame(op, seq_load.start_frame, &minframe, &numdigits);
 	}
 	else {
 		seq_load.len = RNA_property_collection_length(op->ptr, RNA_struct_find_property(op->ptr, "files"));
@@ -873,7 +851,7 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
 	se = strip->stripdata;
 
 	if (use_placeholders) {
-		sequencer_image_seq_reserve_frames(op, se, seq_load.len, minframe);
+		sequencer_image_seq_reserve_frames(op, se, seq_load.len, minframe, numdigits);
 	}
 	else {
 		RNA_BEGIN (op->ptr, itemptr, "files")
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 39023f5..8d5f1ea 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -3695,7 +3695,7 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op)
 	Sequence *seq = BKE_sequencer_active_get(scene);
 	const bool is_relative_path = RNA_boolean_get(op->ptr, "relative_path");
 	const bool use_placeholders = RNA_boolean_get(op->ptr, "use_placeholders");
-	int minframe;
+	int minframe, numdigits;
 
 	if (seq->type == SEQ_TYPE_IMAGE) {
 		char directory[FILE_MAX];
@@ -3704,7 +3704,7 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op)
 
 		/* need to find min/max frame for placeholders */
 		if (use_placeholders) {
-			len = sequencer_image_seq_get_minmax_frame(op, seq->sfra, &minframe);
+			len = sequencer_image_seq_get_minmax_frame(op, seq->sfra, &minframe, &numdigits);
 		}
 		else {
 			len = RNA_property_collection_length(op->ptr, RNA_struct_find_property(op->ptr, "files"));
@@ -3727,7 +3727,7 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op)
 		seq->strip->stripdata = se = MEM_callocN(len * sizeof(StripElem), "stripelem");
 
 		if (use_placeholders) {
-			sequencer_image_seq_reserve_frames(op, se, len, minframe);
+			sequencer_image_seq_reserve_frames(op, se, len, minframe, numdigits);
 		}
 		else {
 			RNA_BEGIN (op->ptr, itemptr, "files")
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index 0158a2d..0c6475c 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -205,8 +205,8 @@ void SEQUENCER_OT_sample(struct wmOperatorType *ot);
 void sequencer_preview_add_sound(const struct bContext *C, struct Sequence *seq);
 
 /* sequencer_add */
-int sequencer_image_seq_get_minmax_frame(struct wmOperator *op, int sfra, int *r_minframe);
-void sequencer_image_seq_reserve_frames(struct wmOperator *op, struct StripElem *se, int len, int minframe);
+int sequencer_image_seq_get_minmax_frame(struct wmOperator *op, int sfra, int *r_minframe, int *r_numdigits);
+void sequencer_image_seq_reserve_frames(struct wmOperator *op, struct StripElem *se, int len, int minframe, int numdigits);
 
 #endif /* __SEQUENCER_INTERN_H__ */




More information about the Bf-blender-cvs mailing list