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