📄 fiascotopnm.c
字号:
filename = calloc (strlen (basename) + strlen (suffix) + 2 + 10 + (int) (log10 (frames) + 1), sizeof (char)); if (!filename) error ("Out of memory."); for (n = 0; n < frames; n++) { clock_t fps_timer; /* frames per second timer struct */ prg_timer (&fps_timer, START); if (image_name) /* just write frame to disk */ { if (frames == 1) /* just one image */ { if (streq (image_name, "-")) strcpy (filename, "-"); else sprintf (filename, "%s.%s", basename, suffix); } else { fprintf (stderr, "Decoding frame %d to file `%s.%0*d.%s\n", n, basename, (int) (log10 (frames - 1) + 1), n, suffix); sprintf (filename, "%s.%0*d.%s", basename, (int) (log10 (frames - 1) + 1), n, suffix); } if (!fiasco_decoder_write_frame (decoder_state, filename)) error (fiasco_get_error_message ()); }#ifndef X_DISPLAY_MISSING else { fiasco_image_t *frame; if (!(frame = fiasco_decoder_get_frame (decoder_state))) error (fiasco_get_error_message ()); if (frames == 1) panel = NO; if (xinfo == NULL) /* initialize X11 window */ { const char * const title = fiasco_decoder_get_title (decoder_state); char titlename [MAXSTRLEN]; sprintf (titlename, "dfiasco " VERSION ": %s", strlen (title) > 0 ? title : wfa_name); xinfo = open_window (titlename, "dfiasco", (width << (double_resolution ? 1 : 0)), (height << (double_resolution ? 1 : 0)) + (panel ? 30 : 0)); alloc_ximage (xinfo, width << (double_resolution ? 1 : 0), height << (double_resolution ? 1 : 0)); if (panel) /* initialize button panel */ binfo = init_buttons (xinfo, n, frames, 30, 10); renderer = fiasco_renderer_new (xinfo->ximage->red_mask, xinfo->ximage->green_mask, xinfo->ximage->blue_mask, xinfo->ximage->bits_per_pixel, double_resolution); if (!renderer) error (fiasco_get_error_message ()); } renderer->render (renderer, xinfo->pixels, frame); frame->delete (frame); if (frame_buffer != NULL) /* store next frame */ { size_t size = (width << (double_resolution ? 1 : 0)) * (height << (double_resolution ? 1 : 0)) * (xinfo->ximage->depth <= 8 ? sizeof (byte_t) : (xinfo->ximage->depth <= 16 ? sizeof (u_word_t) : sizeof (unsigned int))); frame_buffer [n] = malloc (size); if (!frame_buffer [n]) error ("Out of memory."); memcpy (frame_buffer [n], xinfo->pixels, size); if (n == frames - 1) { show_stored_frames (frame_buffer, frames - 1, xinfo, binfo, size, frame_time); break; } } display_image (0, 0, xinfo); if (frames == 1) wait_for_input (xinfo); else if (panel) { check_events (xinfo, binfo, n, frames); if (binfo->pressed [QUIT_BUTTON]) /* start from beginning */ break; if (binfo->pressed [STOP_BUTTON]) /* start from beginning */ n = frames; if (binfo->pressed [RECORD_BUTTON] && frame_buffer == NULL) { n = frames; frame_buffer = calloc (frames, sizeof (unsigned char *)); if (!frame_buffer) error ("Out of memory."); } } while (prg_timer (&fps_timer, STOP) < frame_time) /* wait */ ; }#endif /* not X_DISPLAY_MISSING */ } free (filename); fiasco_decoder_delete (decoder_state); } while (panel#ifndef X_DISPLAY_MISSING && !binfo->pressed [QUIT_BUTTON]#endif /* not X_DISPLAY_MISSING */ );#ifndef X_DISPLAY_MISSING if (renderer) renderer->delete (renderer); if (!image_name) { close_window (xinfo); free (xinfo); xinfo = NULL; if (binfo) free (binfo); }#endif /* not X_DISPLAY_MISSING */}static voidget_output_template (const char *image_name, const char *wfa_name, bool_t color, char **basename, char **suffix)/* * Generate image filename template for output of image sequences. * 'wfa_name' is the filename of the WFA stream. * Images are either saved with filename 'basename'.'suffix' (still images) * or 'basename'.%03d.'suffix' (videos). * * No return value. * * Side effects: * '*basename' and '*suffix' is set. */{ if (!wfa_name || streq (wfa_name, "-")) wfa_name = "stdin"; /* * Generate filename template */ if (!image_name || streq (image_name, "") || streq (image_name, "-")) { *basename = strdup (wfa_name); *suffix = NULL; } else { *basename = strdup (image_name); *suffix = strrchr (*basename, '.'); } if (*suffix) /* found name 'basename.suffix' */ { **suffix = 0; /* remove dot */ (*suffix)++; if (**suffix == 0) *suffix = strdup (color ? "ppm" : "pgm"); } else /* no suffix found, generate one */ *suffix = strdup (color ? "ppm" : "pgm");}#ifndef X_DISPLAY_MISSINGstatic voidshow_stored_frames (unsigned char * const *frame_buffer, int last_frame, x11_info_t *xinfo, binfo_t *binfo, size_t size, unsigned frame_time)/* * After a WFA video stream has been saved, all frames have been * decoded and stored in memory. These frames are then displayed * in an endless loop. * * This function never returns, the program is terminated if the * STOP button is pressed. */{ int n = last_frame; /* frame number */ while (1) { clock_t fps_timer; /* frames per second timer struct */ prg_timer (&fps_timer, START); display_image (0, 0, xinfo); check_events (xinfo, binfo, n, last_frame + 1); if (binfo->pressed [STOP_BUTTON]) n = 0; else if (binfo->pressed [QUIT_BUTTON]) break; else if (binfo->pressed [PLAY_BUTTON]) n++; else if (binfo->pressed [RECORD_BUTTON]) /* REWIND is mapped RECORD */ n--; if (n < 0) n = last_frame; if (n > last_frame) n = 0; memcpy (xinfo->pixels, frame_buffer [n], size); while (prg_timer (&fps_timer, STOP) < frame_time) /* wait */ ; };}#endif /* not X_DISPLAY_MISSING */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -