1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles, Vas Crabb 3 /*************************************************************************** 4 5 aviio.h 6 7 AVI movie format parsing helpers. 8 9 ***************************************************************************/ 10 11 #ifndef MAME_LIB_UTIL_AVIIO_H 12 #define MAME_LIB_UTIL_AVIIO_H 13 14 #include "osdcore.h" 15 #include "bitmap.h" 16 17 #include <cstdint> 18 #include <memory> 19 #include <string> 20 21 22 /*************************************************************************** 23 MACROS 24 ***************************************************************************/ 25 26 #define AVI_FOURCC(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24)) 27 28 #define FORMAT_UYVY AVI_FOURCC('U','Y','V','Y') 29 #define FORMAT_VYUY AVI_FOURCC('V','Y','U','Y') 30 #define FORMAT_YUY2 AVI_FOURCC('Y','U','Y','2') 31 #define FORMAT_HFYU AVI_FOURCC('H','F','Y','U') 32 #define FORMAT_I420 AVI_FOURCC('I','4','2','0') 33 #define FORMAT_DIB AVI_FOURCC('D','I','B',' ') 34 #define FORMAT_RGB AVI_FOURCC('R','G','B',' ') 35 #define FORMAT_RAW AVI_FOURCC('R','A','W',' ') 36 #define FORMAT_UNCOMPRESSED 0x00000000 37 38 39 class avi_file 40 { 41 public: 42 43 /*********************************************************************** 44 CONSTANTS 45 ***********************************************************************/ 46 47 enum class error 48 { 49 NONE = 0, 50 END, 51 INVALID_DATA, 52 NO_MEMORY, 53 READ_ERROR, 54 WRITE_ERROR, 55 STACK_TOO_DEEP, 56 UNSUPPORTED_FEATURE, 57 CANT_OPEN_FILE, 58 INCOMPATIBLE_AUDIO_STREAMS, 59 INVALID_SAMPLERATE, 60 INVALID_STREAM, 61 INVALID_FRAME, 62 INVALID_BITMAP, 63 UNSUPPORTED_VIDEO_FORMAT, 64 UNSUPPORTED_AUDIO_FORMAT, 65 EXCEEDED_SOUND_BUFFER 66 }; 67 68 enum class datatype 69 { 70 VIDEO, 71 AUDIO_CHAN0, 72 AUDIO_CHAN1, 73 AUDIO_CHAN2, 74 AUDIO_CHAN3, 75 AUDIO_CHAN4, 76 AUDIO_CHAN5, 77 AUDIO_CHAN6, 78 AUDIO_CHAN7 79 }; 80 81 82 /*********************************************************************** 83 TYPE DEFINITIONS 84 ***********************************************************************/ 85 86 struct movie_info 87 { 88 std::uint32_t video_format; // format of video data 89 std::uint32_t video_timescale; // timescale for video data 90 std::uint32_t video_sampletime; // duration of a single video sample (frame) 91 std::uint32_t video_numsamples; // total number of video samples 92 std::uint32_t video_width; // width of the video 93 std::uint32_t video_height; // height of the video 94 std::uint32_t video_depth; // depth of the video 95 96 std::uint32_t audio_format; // format of audio data 97 std::uint32_t audio_timescale; // timescale for audio data 98 std::uint32_t audio_sampletime; // duration of a single audio sample 99 std::uint32_t audio_numsamples; // total number of audio samples 100 std::uint32_t audio_channels; // number of audio channels 101 std::uint32_t audio_samplebits; // number of bits per channel 102 std::uint32_t audio_samplerate; // sample rate of audio 103 }; 104 105 typedef std::unique_ptr<avi_file> ptr; 106 107 108 /*********************************************************************** 109 PROTOTYPES 110 ***********************************************************************/ 111 112 static error open(std::string const &filename, ptr &file); 113 static error create(std::string const &filename, movie_info const &info, ptr &file); 114 virtual ~avi_file(); 115 116 virtual void printf_chunks() = 0; 117 static const char *error_string(error err); 118 119 virtual movie_info const &get_movie_info() const = 0; 120 virtual std::uint32_t first_sample_in_frame(std::uint32_t framenum) const = 0; 121 122 virtual error read_uncompressed_video_frame(std::uint32_t framenum, bitmap_argb32 &bitmap) = 0; 123 virtual error read_video_frame(std::uint32_t framenum, bitmap_yuy16 &bitmap) = 0; 124 virtual error read_sound_samples(int channel, std::uint32_t firstsample, std::uint32_t numsamples, std::int16_t *output) = 0; 125 126 virtual error append_video_frame(bitmap_yuy16 &bitmap) = 0; 127 virtual error append_video_frame(bitmap_rgb32 &bitmap) = 0; 128 virtual error append_sound_samples(int channel, std::int16_t const *samples, std::uint32_t numsamples, std::uint32_t sampleskip) = 0; 129 130 protected: 131 avi_file(); 132 }; 133 134 #endif // MAME_LIB_UTIL_AVIIO_H 135