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

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