12
13
14
15
16
17
18
19
20
21template <
typename RGB_T =
RGB565>
31 bool begin(
const ISurface<RGB_T>& surface, uint16_t fps = 30,
32 uint32_t frameCount = 0) {
35 width_ =
static_cast<uint32_t>(surface.width());
36 height_ =
static_cast<uint32_t>(surface.height());
42 fps_ = fps == 0 ? 1 : fps;
66 bool add(
const ISurface<RGB_T>& surface) {
99 return ((width * 2U) + 3U) & ~0x3U;
104 return dataSize + (dataSize & 0x1U);
121 const uint32_t avihSize = 56;
122 const uint32_t strhSize = 56;
123 const uint32_t strfSize = 52;
124 const uint32_t avihChunkSize = 8 + avihSize;
125 const uint32_t strhChunkSize = 8 + strhSize;
126 const uint32_t strfChunkSize = 8 + strfSize;
127 const uint32_t strlListSize = 4 + strhChunkSize + strfChunkSize;
128 const uint32_t strlChunkSize = 8 + strlListSize;
129 const uint32_t hdrlListSize = 4 + avihChunkSize + strlChunkSize;
130 const uint32_t hdrlChunkSize = 8 + hdrlListSize;
133 const uint32_t moviListSize =
136 const uint32_t moviChunkSize = 8 + moviListSize;
137 const uint32_t idx1Size =
140 const uint32_t riffSize =
142 ? 4 + hdrlChunkSize + moviChunkSize
143 : 4 + hdrlChunkSize + moviChunkSize + idx1ChunkSize;
144 const uint32_t microsecondsPerFrame = 1000000UL /
fps_;
146 const uint32_t suggestedBufferSize =
frameSize_;
221 const uint32_t width =
static_cast<uint32_t>(surface.width());
222 const uint32_t height =
static_cast<uint32_t>(surface.height());
224 const uint8_t padByte = 0;
226 for (uint32_t row = 0; row < height; ++row) {
227 const uint32_t sourceY = height - 1U - row;
228 for (uint32_t x = 0; x < width; ++x) {
229 writeU16(surface.getPixel(x, sourceY).getValue()
);
231 for (uint32_t padding = width * 2U; padding < rowStride; ++padding) {
232 writeBytes(&padByte, 1);
245 uint32_t moviOffset = 4;
257 writeBytes(
reinterpret_cast<
const uint8_t*>(value), 4);
261 void writeU8(uint8_t value) { out_.write(value); }
265 const uint8_t bytes[2] = {
static_cast<uint8_t>(value & 0xFFU),
266 static_cast<uint8_t>((value >> 8) & 0xFFU)};
267 writeBytes(bytes,
sizeof(bytes));
272 const uint8_t bytes[4] = {
static_cast<uint8_t>(value & 0xFFU),
273 static_cast<uint8_t>((value >> 8) & 0xFFU),
274 static_cast<uint8_t>((value >> 16) & 0xFFU),
275 static_cast<uint8_t>((value >> 24) & 0xFFU)};
276 writeBytes(bytes,
sizeof(bytes));
281 out_.write(data, length);
Writes a simple AVI movie containing RGB565 frames.
Definition: AVIWriter.h:22
uint32_t width_
Definition: AVIWriter.h:88
void writeIndex()
Writes the idx1 frame index when a frame count was provided.
Definition: AVIWriter.h:238
uint32_t frameSize_
Definition: AVIWriter.h:92
static uint32_t paddedChunkSize(uint32_t dataSize)
Returns the data size rounded up to an even AVI chunk length.
Definition: AVIWriter.h:103
uint32_t rowStride_
Definition: AVIWriter.h:91
uint16_t fps_
Definition: AVIWriter.h:90
void writeHeader()
Writes the RIFF, AVI, stream, and movi headers.
Definition: AVIWriter.h:120
void writeU8(uint8_t value)
Writes a single byte to the output stream.
Definition: AVIWriter.h:261
bool begin(const ISurface< RGB_T > &surface, uint16_t fps=30, uint32_t frameCount=0)
Definition: AVIWriter.h:31
uint32_t height_
Definition: AVIWriter.h:89
void writeU32(uint32_t value)
Writes a 32-bit little-endian value to the output stream.
Definition: AVIWriter.h:271
void writeU16(uint16_t value)
Writes a 16-bit little-endian value to the output stream.
Definition: AVIWriter.h:264
void writeFrame(const ISurface< RGB_T > &surface)
Writes one surface as a bottom-up padded RGB565 AVI frame.
Definition: AVIWriter.h:220
void resetState()
Resets the writer state after finishing or aborting a stream.
Definition: AVIWriter.h:108
static uint32_t frameRowStride(uint32_t width)
Returns the padded byte stride of one RGB565 frame row.
Definition: AVIWriter.h:98
uint32_t expectedFrameCount_
Definition: AVIWriter.h:93
bool isOpen_
Definition: AVIWriter.h:95
void writeBytes(const uint8_t *data, size_t length)
Writes a raw byte sequence to the output stream.
Definition: AVIWriter.h:280
bool add(const ISurface< RGB_T > &surface)
Appends one RGB565 frame to the AVI stream.
Definition: AVIWriter.h:66
uint32_t frameCount_
Definition: AVIWriter.h:94
void end()
Finalizes the AVI stream and writes the optional frame index.
Definition: AVIWriter.h:54
void writeFourCC(const char *value)
Writes a four-character AVI chunk identifier.
Definition: AVIWriter.h:256
AVIWriter(Print &out)
Creates an AVI writer that streams data to the provided Print output.
Definition: AVIWriter.h:25
~AVIWriter()
Finalizes the AVI stream if it is still open.
Definition: AVIWriter.h:27
Print & out_
Definition: AVIWriter.h:87
RGB color stored in 16-bit RGB565 format.
Definition: RGB565.h:13
Definition: AVIWriter.h:9