GST_LOG_OBJECT (tiger, "Got kate buffer, caps %" GST_PTR_FORMAT,
GST_BUFFER_CAPS (buf));
+ /* Now that we have the lock, check if we're flushing */
+ if (tiger->decoder.kate_flushing) {
+ GST_DEBUG_OBJECT (tiger, "Flushing, disregarding buffer");
+ goto done;
+ }
+
/* Unfortunately, it can happen that the start of the stream is not sent,
for instance if there's a stream selector upstream, which is switched
from another Kate stream. If this happens, then we can fallback on the
}
}
+done:
GST_KATE_TIGER_MUTEX_UNLOCK (tiger);
gst_object_unref (tiger);
GstFlowReturn rflow = GST_FLOW_OK;
unsigned char *ptr;
int ret;
+ kate_float t;
GST_KATE_TIGER_MUTEX_LOCK (tiger);
g_cond_broadcast (tiger->cond);
}
- /* draw on it */
+ /* Update first with a dummy buffer pointer we cannot write to. If there is nothing
+ to draw, we will not have to make it writeable */
+ ptr = GST_BUFFER_DATA (buf);
+ ret =
+ tiger_renderer_set_buffer (tiger->tr, ptr, tiger->video_width,
+ tiger->video_height, tiger->video_width * 4, tiger->swap_rgb);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (tiger,
+ "Tiger renderer failed to set buffer to video frame: %d", ret);
+ goto pass;
+ }
+
+ /* update the renderer at the time of the video frame */
+ t = gst_kate_tiger_get_time (tiger);
+ GST_LOG_OBJECT (tiger, "Video segment calc: last stop %ld, time %.3f",
+ (long) tiger->video_segment.last_stop, t);
+ ret = tiger_renderer_update (tiger->tr, t, 1);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (tiger, "Tiger renderer failed to update: %d", ret);
+ goto pass;
+ }
+
+ /* if there nothing to draw, we can just push the video buffer as is */
+ if (ret > 0)
+ goto pass;
+
+ /* there is something to draw, so first make the buffer writable */
buf = gst_buffer_make_writable (buf);
if (G_UNLIKELY (!buf)) {
GST_WARNING_OBJECT (tiger, "Failed to make video buffer writable");
- } else {
- ptr = GST_BUFFER_DATA (buf);
- if (!ptr) {
- GST_WARNING_OBJECT (tiger,
- "Failed to get a pointer to video buffer data");
- } else {
- ret =
- tiger_renderer_set_buffer (tiger->tr, ptr, tiger->video_width,
- tiger->video_height, tiger->video_width * 4, tiger->swap_rgb);
- if (G_UNLIKELY (ret < 0)) {
- GST_WARNING_OBJECT (tiger,
- "Tiger renderer failed to set buffer to video frame: %d", ret);
- } else {
- kate_float t = gst_kate_tiger_get_time (tiger);
- GST_LOG_OBJECT (tiger, "Video segment calc: last stop %ld, time %.3f",
- (long) tiger->video_segment.last_stop, t);
+ goto pass;
+ }
- ret = tiger_renderer_update (tiger->tr, t, 1);
- if (G_UNLIKELY (ret < 0)) {
- GST_WARNING_OBJECT (tiger, "Tiger renderer failed to update: %d",
- ret);
- } else {
- ret = tiger_renderer_render (tiger->tr);
- if (G_UNLIKELY (ret < 0)) {
- GST_WARNING_OBJECT (tiger,
- "Tiger renderer failed to render to video frame: %d", ret);
- } else {
- GST_LOG_OBJECT (tiger,
- "Tiger renderer rendered on video frame at %f", t);
- }
- }
- }
- }
+ /* and setup that buffer before rendering */
+ ptr = GST_BUFFER_DATA (buf);
+ ret =
+ tiger_renderer_set_buffer (tiger->tr, ptr, tiger->video_width,
+ tiger->video_height, tiger->video_width * 4, tiger->swap_rgb);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (tiger,
+ "Tiger renderer failed to set buffer to video frame: %d", ret);
+ goto pass;
+ }
+ ret = tiger_renderer_render (tiger->tr);
+ if (G_UNLIKELY (ret < 0)) {
+ GST_WARNING_OBJECT (tiger,
+ "Tiger renderer failed to render to video frame: %d", ret);
+ } else {
+ GST_LOG_OBJECT (tiger, "Tiger renderer rendered on video frame at %f", t);
}
+pass:
GST_KATE_TIGER_MUTEX_UNLOCK (tiger);
rflow = gst_pad_push (tiger->srcpad, buf);
gst_camera_bin_start_capture (GstCameraBin2 * camerabin)
{
const GstTagList *taglist;
-
+ gint capture_index = camerabin->capture_index;
+ gchar *location = NULL;
GST_DEBUG_OBJECT (camerabin, "Received start-capture");
/* check that we have a valid location */
GST_CAMERA_BIN2_PROCESSING_INC (camerabin);
+ if (camerabin->location)
+ location = g_strdup_printf (camerabin->location, capture_index);
+
if (camerabin->mode == MODE_VIDEO) {
if (camerabin->audio_src) {
GstClock *clock = gst_pipeline_get_clock (GST_PIPELINE_CAST (camerabin));
}
}
} else {
- gchar *location = NULL;
-
/* store the next capture buffer filename */
- if (camerabin->location)
- location =
- g_strdup_printf (camerabin->location, camerabin->capture_index++);
camerabin->image_location_list =
- g_slist_append (camerabin->image_location_list, location);
+ g_slist_append (camerabin->image_location_list, g_strdup (location));
}
+ /* store the next preview filename */
+ camerabin->preview_location_list =
+ g_slist_append (camerabin->preview_location_list, location);
+
g_signal_emit_by_name (camerabin->src, "start-capture", NULL);
if (camerabin->mode == MODE_VIDEO && camerabin->audio_src)
gst_element_set_state (camerabin->audio_src, GST_STATE_PLAYING);
gst_event_new_tag (gst_tag_list_copy (taglist)));
gst_object_unref (active_pad);
}
-
}
static void
if (camerabin->mode == MODE_VIDEO && camerabin->audio_src) {
camerabin->audio_drop_eos = FALSE;
gst_element_send_event (camerabin->audio_src, gst_event_new_eos ());
-
- /* FIXME We need to set audiosrc to null to make it resync the ringbuffer
- * while bug https://bugzilla.gnome.org/show_bug.cgi?id=648359 isn't
- * fixed.
- *
- * Also, we set to NULL here to stop capturing audio through to the next
- * video mode start capture. */
- gst_element_set_state (camerabin->audio_src, GST_STATE_NULL);
}
}
gst_element_set_state (camera->videosink, GST_STATE_NULL);
gst_element_set_state (camera->video_encodebin, GST_STATE_NULL);
gst_element_set_state (camera->videobin_capsfilter, GST_STATE_NULL);
- location = g_strdup_printf (camera->location, camera->capture_index++);
+ location = g_strdup_printf (camera->location, camera->capture_index);
GST_DEBUG_OBJECT (camera, "Switching videobin location to %s", location);
g_object_set (camera->videosink, "location", location, NULL);
g_free (location);
gst_element_set_state (camera->videobin_capsfilter, GST_STATE_PLAYING);
}
+ camera->capture_index++;
+ } else {
+ if (camera->mode == MODE_VIDEO && camera->audio_src) {
+ /* FIXME We need to set audiosrc to null to make it resync the ringbuffer
+ * while bug https://bugzilla.gnome.org/show_bug.cgi?id=648359 isn't
+ * fixed.
+ *
+ * Also, we set to NULL here to stop capturing audio through to the next
+ * video mode start capture and to clear EOS. */
+ gst_element_set_state (camera->audio_src, GST_STATE_NULL);
+ }
}
}
static void
gst_camera_bin_handle_message (GstBin * bin, GstMessage * message)
{
+ GstCameraBin2 *camerabin = GST_CAMERA_BIN2_CAST (bin);
+
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_ELEMENT:{
const GstStructure *structure = gst_message_get_structure (message);
gst_image_capture_bin_post_image_done (GST_CAMERA_BIN2_CAST (bin),
filename);
}
+ } else if (gst_structure_has_name (structure, "preview-image")) {
+ GValue *value;
+ gchar *location;
+
+ location = camerabin->preview_location_list->data;
+ camerabin->preview_location_list =
+ g_slist_delete_link (camerabin->preview_location_list,
+ camerabin->preview_location_list);
+ GST_DEBUG_OBJECT (camerabin, "Adding preview location to preview "
+ "message '%s'", location);
+
+ value = g_new0 (GValue, 1);
+ g_value_init (value, G_TYPE_STRING);
+ g_value_take_string (value, location);
+ gst_structure_take_value ((GstStructure *) structure, "location",
+ value);
}
}
break;
g_slist_free (camera->image_location_list);
camera->image_location_list = NULL;
+ g_slist_foreach (camera->preview_location_list, (GFunc) g_free, NULL);
+ g_slist_free (camera->preview_location_list);
+ camera->preview_location_list = NULL;
+
/* explicitly set to READY as they might be outside of the bin */
gst_element_set_state (camera->audio_volume, GST_STATE_READY);
gst_element_set_state (camera->audio_capsfilter, GST_STATE_READY);
static GMainLoop *main_loop;
static gint capture_count = 0;
guint32 test_id = 0;
+static gchar *image_filename;
+static gchar *video_filename;
static GstBuffer *preview_buffer;
+static gchar *preview_filename;
static GstCaps *preview_caps;
static GstTagList *tags_found;
/* helper function for filenames */
-static const gchar *
+static gchar *
make_test_file_name (const gchar * base_name, gint num)
{
- static gchar file_name[1000];
-
/* num == -1 means to keep the %d in the resulting string to be used on
* multifilesink like location */
if (num == -1) {
- g_snprintf (file_name, 999, "%s" G_DIR_SEPARATOR_S
+ return g_strdup_printf ("%s" G_DIR_SEPARATOR_S
"gstcamerabin2test_%s_%u_%%03d.cap", g_get_tmp_dir (), base_name,
test_id);
} else {
- g_snprintf (file_name, 999, "%s" G_DIR_SEPARATOR_S
+ return g_strdup_printf ("%s" G_DIR_SEPARATOR_S
"gstcamerabin2test_%s_%u_%03d.cap", g_get_tmp_dir (), base_name,
test_id, num);
}
+}
+
+static const gchar *
+make_const_file_name (const gchar * filename, gint num)
+{
+ static gchar file_name[1000];
+
+ /* num == -1 means to keep the %d in the resulting string to be used on
+ * multifilesink like location */
+ g_snprintf (file_name, 999, filename, num);
- GST_INFO ("capturing to: %s", file_name);
return file_name;
}
if (preview_buffer)
gst_buffer_unref (preview_buffer);
preview_buffer = gst_buffer_ref (buf);
+ g_free (preview_filename);
+ preview_filename = g_strdup (gst_structure_get_string (st, "location"));
}
break;
}
}
static void
-check_preview_image (GstElement * camera)
+check_preview_image (GstElement * camera, const gchar * filename, gint index)
{
+ gchar *prev_filename = NULL;
+
if (!preview_buffer && camera) {
GstMessage *msg = wait_for_element_message (camera,
GST_BASE_CAMERA_SRC_PREVIEW_MESSAGE_NAME, GST_CLOCK_TIME_NONE);
gst_message_unref (msg);
}
fail_unless (preview_buffer != NULL);
+ if (filename) {
+ if (index >= 0) {
+ prev_filename = g_strdup_printf (filename, index);
+ } else {
+ prev_filename = g_strdup (filename);
+ }
+ fail_unless (preview_filename != NULL);
+ fail_unless (strcmp (preview_filename, prev_filename) == 0);
+ }
if (preview_caps) {
fail_unless (GST_BUFFER_CAPS (preview_buffer) != NULL);
fail_unless (gst_caps_can_intersect (GST_BUFFER_CAPS (preview_buffer),
preview_caps));
}
+ g_free (prev_filename);
}
static void
{
GstBus *bus;
GMainLoop *loop = g_main_loop_new (NULL, FALSE);
- const gchar *filepath = make_test_file_name (filename, num);
+ const gchar *filepath = make_const_file_name (filename, num);
gchar *pipeline_str = g_strdup_printf ("filesrc location=%s ! "
"jpegparse ! fakesink", filepath);
GstElement *pipeline;
tags_found = NULL;
capture_count = 0;
+ image_filename = make_test_file_name (IMAGE_FILENAME, -1);
+ video_filename = make_test_file_name (VIDEO_FILENAME, -1);
GST_INFO ("init finished");
}
gst_buffer_unref (preview_buffer);
preview_buffer = NULL;
+ g_free (preview_filename);
+ preview_filename = NULL;
+
if (tags_found)
gst_tag_list_free (tags_found);
tags_found = NULL;
+ g_free (video_filename);
+ g_free (image_filename);
+ video_filename = NULL;
+ image_filename = NULL;
+
GST_INFO ("done");
}
GstElement *playbin = gst_element_factory_make ("playbin2", NULL);
GstElement *fakevideo = gst_element_factory_make ("fakesink", NULL);
GstElement *fakeaudio = gst_element_factory_make ("fakesink", NULL);
- gchar *uri = g_strconcat ("file://", make_test_file_name (filename, num),
+ gchar *uri = g_strconcat ("file://", make_const_file_name (filename, num),
NULL);
GST_DEBUG ("checking uri: %s", uri);
if (preview_buffer)
gst_buffer_unref (preview_buffer);
preview_buffer = gst_buffer_ref (buf);
+ g_free (preview_filename);
+ preview_filename =
+ g_strdup (gst_structure_get_string (st, "location"));
}
if (gst_structure_has_name (st, name))
return;
/* set still image mode */
- g_object_set (camera, "mode", 1,
- "location", make_test_file_name (IMAGE_FILENAME, -1), NULL);
+ g_object_set (camera, "mode", 1, "location", image_filename, NULL);
if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) ==
GST_STATE_CHANGE_FAILURE) {
gst_message_unref (msg);
/* check that we got a preview image */
- check_preview_image (camera);
+ check_preview_image (camera, image_filename, 0);
g_object_get (camera, "idle", &idle, NULL);
fail_unless (idle);
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
- check_file_validity (IMAGE_FILENAME, 0, NULL, 0, 0, NO_AUDIO);
+ check_file_validity (image_filename, 0, NULL, 0, 0, NO_AUDIO);
}
GST_END_TEST;
return;
/* set still image mode */
- g_object_set (camera, "mode", 1,
- "location", make_test_file_name (IMAGE_FILENAME, -1), NULL);
+ g_object_set (camera, "mode", 1, "location", image_filename, NULL);
if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) ==
GST_STATE_CHANGE_FAILURE) {
fail_unless (msg != NULL);
gst_message_unref (msg);
- check_preview_image (camera);
+ check_preview_image (camera, image_filename, i);
}
g_object_get (camera, "idle", &idle, NULL);
fail_unless (idle);
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
for (i = 0; i < 3; i++) {
- check_file_validity (IMAGE_FILENAME, i, NULL, widths[i], heights[i],
+ check_file_validity (image_filename, i, NULL, widths[i], heights[i],
NO_AUDIO);
}
}
return;
/* Set video recording mode */
- g_object_set (camera, "mode", 2,
- "location", make_test_file_name (VIDEO_FILENAME, -1), NULL);
+ g_object_set (camera, "mode", 2, "location", video_filename, NULL);
if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) ==
GST_STATE_CHANGE_FAILURE) {
g_signal_emit_by_name (camera, "stop-capture", NULL);
- check_preview_image (camera);
+ check_preview_image (camera, video_filename, 0);
msg = wait_for_element_message (camera, "video-done", GST_CLOCK_TIME_NONE);
fail_unless (msg != NULL);
fail_unless (idle);
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
- check_file_validity (VIDEO_FILENAME, 0, NULL, 0, 0, WITH_AUDIO);
+ check_file_validity (video_filename, 0, NULL, 0, 0, WITH_AUDIO);
}
GST_END_TEST;
return;
/* Set video recording mode */
- g_object_set (camera, "mode", 2, NULL);
+ g_object_set (camera, "mode", 2, "location", video_filename, NULL);
if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) ==
GST_STATE_CHANGE_FAILURE) {
widths[i], "height", G_TYPE_INT, heights[i], "framerate",
GST_TYPE_FRACTION, fr[i], 1, NULL);
- g_object_set (camera, "video-capture-caps", caps,
- "location", make_test_file_name (VIDEO_FILENAME, i), NULL);
+ g_object_set (camera, "video-capture-caps", caps, NULL);
gst_caps_unref (caps);
fail_unless (msg != NULL);
gst_message_unref (msg);
- check_preview_image (camera);
+ check_preview_image (camera, video_filename, i);
g_object_get (camera, "idle", &idle, NULL);
fail_unless (idle);
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
for (i = 0; i < 3; i++) {
- check_file_validity (VIDEO_FILENAME, i, NULL, widths[i], heights[i],
+ check_file_validity (video_filename, i, NULL, widths[i], heights[i],
WITH_AUDIO);
}
}
GST_INFO ("starting capture");
for (i = 0; i < 2; i++) {
GstMessage *msg;
+ const gchar *img_filename;
+ const gchar *vid_filename;
+
g_object_get (camera, "idle", &idle, NULL);
fail_unless (idle);
/* take a picture */
+ img_filename = make_const_file_name (image_filename, i);
g_object_set (camera, "mode", 1, NULL);
- g_object_set (camera, "location", make_test_file_name (IMAGE_FILENAME, i),
- NULL);
+ g_object_set (camera, "location", img_filename, NULL);
g_signal_emit_by_name (camera, "start-capture", NULL);
msg = wait_for_element_message (camera, "image-done", GST_CLOCK_TIME_NONE);
fail_unless (msg != NULL);
gst_message_unref (msg);
- check_preview_image (camera);
+ check_preview_image (camera, img_filename, i);
/* now go to video */
+ vid_filename = make_const_file_name (video_filename, i);
g_object_set (camera, "mode", 2, NULL);
- g_object_set (camera, "location", make_test_file_name (VIDEO_FILENAME, i),
- NULL);
+ g_object_set (camera, "location", vid_filename, NULL);
+
g_signal_emit_by_name (camera, "start-capture", NULL);
g_timeout_add_seconds (VIDEO_DURATION, (GSourceFunc) g_main_loop_quit,
main_loop);
fail_unless (msg != NULL);
gst_message_unref (msg);
- check_preview_image (camera);
+ check_preview_image (camera, vid_filename, i);
/* wait for capture to finish */
g_usleep (G_USEC_PER_SEC);
/* validate all the files */
for (i = 0; i < 2; i++) {
- check_file_validity (IMAGE_FILENAME, i, NULL, 0, 0, NO_AUDIO);
- check_file_validity (VIDEO_FILENAME, i, NULL, 0, 0, WITH_AUDIO);
+ check_file_validity (image_filename, i, NULL, 0, 0, NO_AUDIO);
+ check_file_validity (video_filename, i, NULL, 0, 0, WITH_AUDIO);
}
}
return;
/* set still image mode */
- g_object_set (camera, "mode", 1,
- "location", make_test_file_name (IMAGE_FILENAME, -1), NULL);
+ g_object_set (camera, "mode", 1, "location", image_filename, NULL);
if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) ==
GST_STATE_CHANGE_FAILURE) {
fail_unless (msg != NULL);
gst_message_unref (msg);
- check_preview_image (camera);
+ check_preview_image (camera, image_filename, i);
if (preview_buffer)
gst_buffer_unref (preview_buffer);
GST_TAG_GEO_LOCATION_ELEVATION, 0.0, NULL);
/* set still image mode */
- g_object_set (camera, "mode", 1,
- "location", make_test_file_name (IMAGE_FILENAME, -1), NULL);
+ g_object_set (camera, "mode", 1, "location", image_filename, NULL);
if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) ==
GST_STATE_CHANGE_FAILURE) {
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
for (i = 0; i < 3; i++) {
- check_file_validity (IMAGE_FILENAME, i, taglists[i], 0, 0, NO_AUDIO);
+ check_file_validity (image_filename, i, taglists[i], 0, 0, NO_AUDIO);
gst_tag_list_free (taglists[i]);
}
}
taglists[2] = gst_tag_list_new_full (GST_TAG_COMMENT, "test3", NULL);
/* set video mode */
- g_object_set (camera, "mode", 2,
- "location", make_test_file_name (VIDEO_FILENAME, -1), NULL);
+ g_object_set (camera, "mode", 2, "location", video_filename, NULL);
/* set a profile that has xmp support for more tags being saved */
{
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
for (i = 0; i < 3; i++) {
- check_file_validity (VIDEO_FILENAME, i, taglists[i], 0, 0, NO_AUDIO);
+ check_file_validity (video_filename, i, taglists[i], 0, 0, NO_AUDIO);
gst_tag_list_free (taglists[i]);
}
}
return;
/* Set video recording mode */
- g_object_set (camera, "mode", 2,
- "location", make_test_file_name (VIDEO_FILENAME, -1), NULL);
+ g_object_set (camera, "mode", 2, "location", video_filename, NULL);
if (gst_element_set_state (GST_ELEMENT (camera), GST_STATE_PLAYING) ==
GST_STATE_CHANGE_FAILURE) {
fail_unless (msg != NULL);
gst_message_unref (msg);
- check_preview_image (camera);
+ check_preview_image (camera, video_filename, 0);
g_object_get (camera, "idle", &idle, NULL);
fail_unless (idle);
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
- check_file_validity (VIDEO_FILENAME, 0, NULL, 0, 0, WITH_AUDIO);
+ check_file_validity (video_filename, 0, NULL, 0, 0, WITH_AUDIO);
}
GST_END_TEST;
/* set still image mode and filters */
g_object_set (camera, "mode", 1,
- "location", make_test_file_name (IMAGE_FILENAME, -1),
+ "location", image_filename,
"viewfinder-filter", vf_filter, "image-filter", image_filter,
"preview-filter", preview_filter, NULL);
g_main_loop_run (main_loop);
/* check that we got a preview image */
- check_preview_image (camera);
+ check_preview_image (camera, image_filename, 0);
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
- check_file_validity (IMAGE_FILENAME, 0, NULL, 0, 0, NO_AUDIO);
+ check_file_validity (image_filename, 0, NULL, 0, 0, NO_AUDIO);
fail_unless (vf_probe_counter > 0);
fail_unless (image_probe_counter == 1);
/* set still image mode and filters */
g_object_set (camera, "mode", 2,
- "location", make_test_file_name (VIDEO_FILENAME, -1),
+ "location", video_filename,
"viewfinder-filter", vf_filter, "video-filter", video_filter,
"preview-filter", preview_filter, "audio-filter", audio_filter, NULL);
g_signal_emit_by_name (camera, "stop-capture", NULL);
/* check that we got a preview image */
- check_preview_image (camera);
+ check_preview_image (camera, video_filename, 0);
gst_element_set_state (GST_ELEMENT (camera), GST_STATE_NULL);
- check_file_validity (VIDEO_FILENAME, 0, NULL, 0, 0, WITH_AUDIO);
+ check_file_validity (video_filename, 0, NULL, 0, 0, WITH_AUDIO);
fail_unless (vf_probe_counter > 0);
fail_unless (video_probe_counter > 0);
g_object_get (camera, "camera-source", &src, NULL);
for (i = 0; i < LOCATION_SWITCHING_FILENAMES_COUNT; i++) {
- filenames[i] =
- g_strdup (make_test_file_name ("image-switching-filename-test", i));
+ filenames[i] = make_test_file_name ("image-switching-filename-test", i);
}
filenames[LOCATION_SWITCHING_FILENAMES_COUNT] = NULL;