ufo-filter-3d-edf-writer.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include <gmodule.h>
  2. #include <ufo/ufo-filter.h>
  3. #include <ufo/ufo-buffer.h>
  4. #include <ufo/ufo-resource-manager.h>
  5. #include "ufo-filter-3d-edf-writer.h"
  6. #include <stdio.h>
  7. /**
  8. * SECTION:ufo-filter-3d-edf-writer
  9. * @Short_description: Stores 3d buffer as an EDF file
  10. * @Title: 3d-edf-writer
  11. *
  12. * The writer node writes each incoming buffer as an EDF file to disk.
  13. * Each file is prefixed with #UfoFilter3DEdfWriter:prefix and written into
  14. * #UfoFilter3DEdfWriter:path.
  15. */
  16. struct _UfoFilter3DEdfWriterPrivate {
  17. gchar *path;
  18. gchar *prefix;
  19. };
  20. GType ufo_filter_3d_edf_writer_get_type(void) G_GNUC_CONST;
  21. /* Inherit from UFO_TYPE_FILTER */
  22. G_DEFINE_TYPE(UfoFilter3DEdfWriter, ufo_filter_3d_edf_writer, UFO_TYPE_FILTER);
  23. #define UFO_FILTER_3D_EDF_WRITER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UFO_TYPE_FILTER_3D_EDF_WRITER, UfoFilter3DEdfWriterPrivate))
  24. enum {
  25. PROP_0,
  26. PROP_PATH,
  27. PROP_PREFIX,
  28. N_PROPERTIES
  29. };
  30. static GParamSpec * edfwriter3d_properties[N_PROPERTIES] = { NULL, };
  31. static gboolean filter_3d_edf_write_header(FILE * file,
  32. const guint32 xs,
  33. const guint32 ys,
  34. const guint32 zs )
  35. {
  36. /*
  37. {
  38. ByteOrder = LowByteFirst;
  39. DataType = FloatValue;
  40. Dim_1 = 1024;
  41. Dim_2 = 1024;
  42. Dim_3 = 256;
  43. Size = 268435456;
  44. */
  45. const guint32 headsz = 512;
  46. gchar * header = g_strnfill (headsz, ' ');
  47. sprintf(header, "{\nByteOrder = LowByteFirst;\nDataType = FloatValue;\nDim_1 = %i;\nDim_2 = %i;\nDim_3 = %i;\nSize = %li;\n",
  48. xs, ys, zs, xs*ys*zs*sizeof(float));
  49. header[510] = '}';
  50. header[511] = '\x0A';
  51. fwrite(header, sizeof(char), headsz, file);
  52. return TRUE;
  53. }
  54. static gboolean filter_3d_edf_write_body(FILE * file,
  55. float * data,
  56. const guint32 sz)
  57. {
  58. fwrite(data, sizeof(float), sz, file);
  59. return TRUE;
  60. }
  61. static void ufo_filter_3d_edf_writer_process(UfoFilter *self)
  62. {
  63. g_return_if_fail(UFO_IS_FILTER(self));
  64. UfoFilter3DEdfWriterPrivate *priv = UFO_FILTER_3D_EDF_WRITER_GET_PRIVATE(self);
  65. UfoChannel *input_channel = ufo_filter_get_input_channel(self);
  66. UfoBuffer *input = ufo_channel_get_input_buffer(input_channel);
  67. cl_command_queue command_queue = (cl_command_queue) ufo_filter_get_command_queue(self);
  68. g_message("ufo_filter_3d_edf_writer_process");
  69. guint num_dims = 0;
  70. guint *dim_size = NULL;
  71. guint counter = 0;
  72. GString *filename = g_string_new("");
  73. while (input != NULL)
  74. {
  75. ufo_buffer_get_dimensions(input, &num_dims, &dim_size);
  76. g_assert(num_dims == 3);
  77. const guint xs = dim_size[0];
  78. const guint ys = dim_size[1];
  79. const guint zs = dim_size[2];
  80. float *data = ufo_buffer_get_host_array(input, command_queue);
  81. g_string_printf(filename, "%s/%s%05i.edf", priv->path, priv->prefix, counter++);
  82. //if (!filter_write_tiff(data, filename->str, width, height))
  83. // g_message("something went wrong")
  84. // write EDF header
  85. // write raw data
  86. // temporal saving unless 3d writer is not ready
  87. FILE * idfile = fopen(filename->str,"wb");
  88. if(!filter_3d_edf_write_header(idfile, xs, ys, zs))
  89. g_message("cannot write edf header");
  90. if(!filter_3d_edf_write_body(idfile, data, xs*ys*zs))
  91. g_message("cannot write data");
  92. fclose(idfile);
  93. ufo_channel_finalize_input_buffer(input_channel, input);
  94. input = ufo_channel_get_input_buffer(input_channel);
  95. }
  96. g_string_free(filename, TRUE);
  97. g_free(dim_size);
  98. }
  99. static void ufo_filter_3d_edf_writer_set_property(GObject *object,
  100. guint property_id,
  101. const GValue *value,
  102. GParamSpec *pspec)
  103. {
  104. UfoFilter3DEdfWriter *filter = UFO_FILTER_3D_EDF_WRITER(object);
  105. switch (property_id)
  106. {
  107. case PROP_PATH:
  108. g_free(filter->priv->path);
  109. filter->priv->path = g_strdup(g_value_get_string(value));
  110. break;
  111. case PROP_PREFIX:
  112. g_free(filter->priv->prefix);
  113. filter->priv->prefix = g_strdup(g_value_get_string(value));
  114. break;
  115. default:
  116. G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
  117. break;
  118. }
  119. }
  120. static void ufo_filter_3d_edf_writer_get_property(GObject *object,
  121. guint property_id,
  122. GValue *value,
  123. GParamSpec *pspec)
  124. {
  125. UfoFilter3DEdfWriter *filter = UFO_FILTER_3D_EDF_WRITER(object);
  126. switch (property_id)
  127. {
  128. case PROP_PATH:
  129. g_value_set_string(value, filter->priv->path);
  130. break;
  131. case PROP_PREFIX:
  132. g_value_set_string(value, filter->priv->prefix);
  133. break;
  134. default:
  135. G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
  136. break;
  137. }
  138. }
  139. static void ufo_filter_3d_edf_writer_class_init(UfoFilter3DEdfWriterClass *klass)
  140. {
  141. UfoFilterClass *filter_class = UFO_FILTER_CLASS(klass);
  142. GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
  143. gobject_class->set_property = ufo_filter_3d_edf_writer_set_property;
  144. gobject_class->get_property = ufo_filter_3d_edf_writer_get_property;
  145. filter_class->process = ufo_filter_3d_edf_writer_process;
  146. edfwriter3d_properties[PROP_PREFIX] =
  147. g_param_spec_string("prefix",
  148. "Filename prefix",
  149. "Prefix of output filename.",
  150. "",
  151. G_PARAM_READWRITE);
  152. edfwriter3d_properties[PROP_PATH] =
  153. g_param_spec_string("path",
  154. "File path",
  155. "Path where to store files.",
  156. ".",
  157. G_PARAM_READWRITE);
  158. g_object_class_install_property(gobject_class, PROP_PATH, edfwriter3d_properties[PROP_PATH]);
  159. g_object_class_install_property(gobject_class, PROP_PREFIX, edfwriter3d_properties[PROP_PREFIX]);
  160. g_type_class_add_private(gobject_class, sizeof(UfoFilter3DEdfWriterPrivate));
  161. }
  162. static void ufo_filter_3d_edf_writer_init(UfoFilter3DEdfWriter *self)
  163. {
  164. self->priv = UFO_FILTER_3D_EDF_WRITER_GET_PRIVATE(self);
  165. self->priv->path = g_strdup(".");
  166. self->priv->prefix = NULL;
  167. ufo_filter_register_input(UFO_FILTER(self), "volume", 3);
  168. }
  169. G_MODULE_EXPORT UfoFilter *ufo_filter_plugin_new(void)
  170. {
  171. return g_object_new(UFO_TYPE_FILTER_3D_EDF_WRITER, NULL);
  172. }