void video_manager::save_snapshot(screen_device *screen, emu_file &file) { // validate assert(!m_snap_native || screen != nullptr); // create the bitmap to pass in create_snapshot_bitmap(screen); // add two text entries describing the image std::string text1 = std::string(emulator_info::get_appname()).append(" ").append(build_version); std::string text2 = std::string(machine().system().manufacturer).append(" ").append(machine().system().description); png_info pnginfo = { nullptr }; png_add_text(&pnginfo, "Software", text1.c_str()); png_add_text(&pnginfo, "System", text2.c_str()); // now do the actual work const rgb_t *palette = (screen != nullptr && screen->has_palette()) ? screen->palette().palette()->entry_list_adjusted() : nullptr; int entries = (screen != nullptr && screen->has_palette()) ? screen->palette().entries() : 0; png_error error = png_write_bitmap(file, &pnginfo, m_snap_bitmap, entries, palette); if (error != PNGERR_NONE) osd_printf_error("Error generating PNG for snapshot: png_error = %d\n", error); // free any data allocated png_free(&pnginfo); }
void video_manager::record_frame() { // ignore if nothing to do if (m_mngfile == NULL && m_avifile == NULL) return; // start the profiler and get the current time g_profiler.start(PROFILER_MOVIE_REC); attotime curtime = machine().time(); // create the bitmap create_snapshot_bitmap(NULL); // loop until we hit the right time while (m_movie_next_frame_time <= curtime) { // handle an AVI recording if (m_avifile != NULL) { // write the next frame avi_error avierr = avi_append_video_frame(m_avifile, m_snap_bitmap); if (avierr != AVIERR_NONE) { g_profiler.stop(); return end_recording(); } } // handle a MNG recording if (m_mngfile != NULL) { // set up the text fields in the movie info png_info pnginfo = { 0 }; if (m_movie_frame == 0) { astring text1(emulator_info::get_appname(), " ", build_version); astring text2(machine().system().manufacturer, " ", machine().system().description); png_add_text(&pnginfo, "Software", text1); png_add_text(&pnginfo, "System", text2); } // write the next frame const rgb_t *palette = (machine().palette != NULL) ? palette_entry_list_adjusted(machine().palette) : NULL; png_error error = mng_capture_frame(*m_mngfile, &pnginfo, m_snap_bitmap, machine().total_colors(), palette); png_free(&pnginfo); if (error != PNGERR_NONE) { g_profiler.stop(); return end_recording(); } } // advance time m_movie_next_frame_time += m_movie_frame_period; m_movie_frame++; } g_profiler.stop(); }
void video_manager::save_snapshot(screen_device *screen, emu_file &file) { // validate assert(!m_snap_native || screen != NULL); // create the bitmap to pass in create_snapshot_bitmap(screen); // add two text entries describing the image astring text1(emulator_info::get_appname(), " ", build_version); astring text2(machine().system().manufacturer, " ", machine().system().description); png_info pnginfo = { 0 }; png_add_text(&pnginfo, "Software", text1); png_add_text(&pnginfo, "System", text2); // now do the actual work const rgb_t *palette = (machine().palette != NULL) ? palette_entry_list_adjusted(machine().palette) : NULL; png_error error = png_write_bitmap(file, &pnginfo, m_snap_bitmap, machine().total_colors(), palette); if (error != PNGERR_NONE) mame_printf_error("Error generating PNG for snapshot: png_error = %d\n", error); // free any data allocated png_free(&pnginfo); }
void video_manager::record_frame() { // ignore if nothing to do if (m_mng_file == nullptr && m_avi_file == nullptr && !m_dummy_recording) return; // start the profiler and get the current time g_profiler.start(PROFILER_MOVIE_REC); attotime curtime = machine().time(); // create the bitmap create_snapshot_bitmap(nullptr); // handle an AVI recording if (m_avi_file != nullptr) { // loop until we hit the right time while (m_avi_next_frame_time <= curtime) { // write the next frame avi_file::error avierr = m_avi_file->append_video_frame(m_snap_bitmap); if (avierr != avi_file::error::NONE) { g_profiler.stop(); end_recording(MF_AVI); break; } // advance time m_avi_next_frame_time += m_avi_frame_period; m_avi_frame++; } } // handle a MNG recording if (m_mng_file != nullptr) { // loop until we hit the right time while (m_mng_next_frame_time <= curtime) { // set up the text fields in the movie info png_info pnginfo = { nullptr }; if (m_mng_frame == 0) { std::string text1 = std::string(emulator_info::get_appname()).append(" ").append(build_version); std::string text2 = std::string(machine().system().manufacturer).append(" ").append(machine().system().description); png_add_text(&pnginfo, "Software", text1.c_str()); png_add_text(&pnginfo, "System", text2.c_str()); } // write the next frame screen_device *screen = machine().first_screen(); const rgb_t *palette = (screen != nullptr && screen->has_palette()) ? screen->palette().palette()->entry_list_adjusted() : nullptr; int entries = (screen != nullptr && screen->has_palette()) ? screen->palette().entries() : 0; png_error error = mng_capture_frame(*m_mng_file, &pnginfo, m_snap_bitmap, entries, palette); png_free(&pnginfo); if (error != PNGERR_NONE) { g_profiler.stop(); end_recording(MF_MNG); break; } // advance time m_mng_next_frame_time += m_mng_frame_period; m_mng_frame++; } } g_profiler.stop(); }