diff options
| -rw-r--r-- | bin/tools/grab.c | 60 | 
1 files changed, 52 insertions, 8 deletions
| diff --git a/bin/tools/grab.c b/bin/tools/grab.c index 1115d26..f9958ae 100644 --- a/bin/tools/grab.c +++ b/bin/tools/grab.c @@ -46,6 +46,27 @@ get_bytes_per_pixel (guint bits_per_pixel)      return bits_per_pixel > 8 ? 2 : 1;  } +static guint +count_format_specifiers (const gchar *template) +{ +    GRegex *regex; +    GMatchInfo *info; +    gint count = 0; + +    regex = g_regex_new ("%[0-9]+[ui]", 0, 0, NULL); +    g_regex_match (regex, template, 0, &info); + +    while (g_match_info_matches (info)) { +        count++; +        g_match_info_next (info, NULL); +    } + +    g_match_info_free (info); +    g_regex_unref (regex); + +    return count > 0 ? (guint) count : 0; +} +  #ifdef HAVE_LIBTIFF  static void  write_tiff (UcaRingBuffer *buffer, @@ -60,6 +81,9 @@ write_tiff (UcaRingBuffer *buffer,      guint bits_per_sample;      gsize bytes_per_pixel; +    if (count_format_specifiers (opts->filename) > 0) +        g_warning ("Can only write multi-page TIFF, format specifier is ignored.\n"); +      tif = TIFFOpen (opts->filename, "w");      n_frames = uca_ring_buffer_get_num_blocks (buffer);      rows_per_strip = TIFFDefaultStripSize (tif, (guint32) - 1); @@ -100,23 +124,43 @@ write_raw (UcaRingBuffer *buffer,  {      guint n_frames;      gsize size; +    guint num_format_specifiers; +    gboolean multiple_files; +    FILE *fp;      size = uca_ring_buffer_get_block_size (buffer);      n_frames = uca_ring_buffer_get_num_blocks (buffer); +    num_format_specifiers = count_format_specifiers (opts->filename); + +    if (num_format_specifiers > 1) { +        g_printerr ("Can only use zero or one format specifiers. Aborting write.\n"); +        return; +    } + +    multiple_files = num_format_specifiers == 1; + +    if (!multiple_files) +        fp = fopen (opts->filename, "wb");      for (gint i = 0; i < n_frames; i++) { -        FILE *fp; -        gchar *filename;          gpointer data; -        filename = g_strdup_printf ("%s-%08i.raw", opts->filename, i); -        fp = fopen(filename, "wb"); -        data = uca_ring_buffer_get_read_pointer (buffer); +        if (multiple_files) { +            gchar *filename; +            filename = g_strdup_printf (opts->filename, i); +            fp = fopen (filename, "wb"); +            g_free (filename); +        } +        data = uca_ring_buffer_get_read_pointer (buffer);          fwrite (data, size, 1, fp); -        fclose (fp); -        g_free (filename); + +        if (multiple_files) +            fclose (fp);      } + +    if (!multiple_files) +        fclose (fp);  }  static GError * @@ -218,7 +262,7 @@ main (int argc, char *argv[])      static GOptionEntry entries[] = {          { "num-frames", 'n', 0, G_OPTION_ARG_INT, &opts.n_frames, "Number of frames to acquire", "N" }, -        { "output", 'o', 0, G_OPTION_ARG_STRING, &opts.filename, "Output file name", "FILE" }, +        { "output", 'o', 0, G_OPTION_ARG_STRING, &opts.filename, "Output file name template", "FILE" },  #ifdef HAVE_LIBTIFF          { "write-tiff", 't', 0, G_OPTION_ARG_NONE, &opts.write_tiff, "Write as TIFF", NULL },  #endif | 
