217 lines
6.0 KiB
C++
217 lines
6.0 KiB
C++
/*
|
|
* Copyright (c) 2008-2011, Michael Kohn
|
|
* Copyright (c) 2013, Robin Hahling
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright notice, this
|
|
* list of conditions and the following disclaimer.
|
|
*
|
|
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* * Neither the name of the author nor the names of its contributors may be
|
|
* used to endorse or promote products derived from this software without
|
|
* specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef H_GWAVI
|
|
#define H_GWAVI
|
|
|
|
#include <stdint.h> /* for size_t */
|
|
#include <stddef.h> /* for size_t */
|
|
|
|
#pragma pack( push, 4 )
|
|
|
|
/* structures */
|
|
struct gwavi_header_t
|
|
{
|
|
uint32_t time_delay; /* dwMicroSecPerFrame */
|
|
uint32_t data_rate; /* dwMaxBytesPerSec */
|
|
uint32_t reserved;
|
|
uint32_t flags; /* dwFlags */
|
|
uint32_t number_of_frames; /* dwTotalFrames */
|
|
uint32_t initial_frames; /* dwInitialFrames */
|
|
uint32_t data_streams; /* dwStreams */
|
|
uint32_t buffer_size; /* dwSuggestedBufferSize */
|
|
uint32_t width; /* dwWidth */
|
|
uint32_t height; /* dwHeight */
|
|
uint32_t time_scale;
|
|
uint32_t playback_data_rate;
|
|
uint32_t starting_time;
|
|
uint32_t data_length;
|
|
};
|
|
|
|
|
|
struct gwavi_AVIStreamHeader
|
|
{
|
|
char fccType[4];
|
|
char fccHandler[4];
|
|
uint32_t dwFlags;
|
|
uint16_t wPriority;
|
|
uint16_t wLanguage;
|
|
uint32_t dwInitialFrames;
|
|
uint32_t dwScale;
|
|
uint32_t dwRate;
|
|
uint32_t dwStart;
|
|
uint32_t dwLength;
|
|
uint32_t dwSuggestedBufferSize;
|
|
uint32_t dwQuality;
|
|
uint32_t dwSampleSize;
|
|
|
|
struct
|
|
{
|
|
int16_t left;
|
|
int16_t top;
|
|
int16_t right;
|
|
int16_t bottom;
|
|
} rcFrame;
|
|
};
|
|
|
|
struct gwavi_stream_header_t
|
|
{
|
|
char data_type[5]; /* fccType */
|
|
char codec[5]; /* fccHandler */
|
|
unsigned int flags; /* dwFlags */
|
|
unsigned int priority;
|
|
unsigned int initial_frames;/* dwInitialFrames */
|
|
unsigned int time_scale; /* dwScale */
|
|
unsigned int data_rate; /* dwRate */
|
|
unsigned int start_time; /* dwStart */
|
|
unsigned int data_length; /* dwLength */
|
|
unsigned int buffer_size; /* dwSuggestedBufferSize */
|
|
unsigned int video_quality; /* dwQuality */
|
|
/**
|
|
* Value between 0-10000. If set to -1, drivers use default quality
|
|
* value.
|
|
*/
|
|
int audio_quality;
|
|
unsigned int sample_size; /* dwSampleSize */
|
|
};
|
|
|
|
struct gwavi_stream_format_v_t
|
|
{
|
|
unsigned int header_size;
|
|
unsigned int width;
|
|
unsigned int height;
|
|
unsigned short int num_planes;
|
|
unsigned short int bits_per_pixel;
|
|
unsigned int compression_type;
|
|
unsigned int image_size;
|
|
unsigned int x_pels_per_meter;
|
|
unsigned int y_pels_per_meter;
|
|
unsigned int colors_used;
|
|
unsigned int colors_important;
|
|
unsigned int *palette;
|
|
unsigned int palette_count;
|
|
};
|
|
|
|
struct gwavi_stream_format_a_t
|
|
{
|
|
unsigned short format_type;
|
|
unsigned int channels;
|
|
unsigned int sample_rate;
|
|
unsigned int bytes_per_second;
|
|
unsigned int block_align;
|
|
unsigned int bits_per_sample;
|
|
unsigned short size;
|
|
};
|
|
|
|
struct gwavi_audio_t
|
|
{
|
|
unsigned int channels;
|
|
unsigned int bits;
|
|
unsigned int samples_per_second;
|
|
};
|
|
|
|
#pragma pack( pop )
|
|
|
|
class gwavi_t
|
|
{
|
|
public:
|
|
gwavi_t(void);
|
|
~gwavi_t(void);
|
|
|
|
int open(const char *filename, unsigned int width,
|
|
unsigned int height, const char *fourcc, double fps,
|
|
struct gwavi_audio_t *audio);
|
|
|
|
int close(void);
|
|
|
|
int add_frame( unsigned char *buffer, size_t len);
|
|
|
|
int add_audio( unsigned char *buffer, size_t len);
|
|
|
|
int set_codec(const char *fourcc);
|
|
|
|
int set_size( unsigned int width, unsigned int height);
|
|
|
|
int set_framerate(double fps);
|
|
|
|
int openIn(const char *filename);
|
|
|
|
int printHeaders(void);
|
|
|
|
private:
|
|
FILE *in;
|
|
FILE *out;
|
|
struct gwavi_header_t avi_header;
|
|
struct gwavi_stream_header_t stream_header_v;
|
|
struct gwavi_stream_format_v_t stream_format_v;
|
|
struct gwavi_stream_header_t stream_header_a;
|
|
struct gwavi_stream_format_a_t stream_format_a;
|
|
long marker;
|
|
int offsets_ptr;
|
|
int offsets_len;
|
|
long offsets_start;
|
|
unsigned int *offsets;
|
|
int offset_count;
|
|
int bits_per_pixel;
|
|
char fourcc[8];
|
|
|
|
// helper functions
|
|
int write_avi_header(FILE *out, struct gwavi_header_t *avi_header);
|
|
int write_stream_header(FILE *out,
|
|
struct gwavi_stream_header_t *stream_header);
|
|
int write_stream_format_v(FILE *out,
|
|
struct gwavi_stream_format_v_t *stream_format_v);
|
|
int write_stream_format_a(FILE *out,
|
|
struct gwavi_stream_format_a_t *stream_format_a);
|
|
int write_avi_header_chunk(void);
|
|
int write_index(FILE *out, int count, unsigned int *offsets);
|
|
int check_fourcc(const char *fourcc);
|
|
int write_int(FILE *out, unsigned int n);
|
|
int write_short(FILE *out, unsigned int n);
|
|
int write_chars(FILE *out, const char *s);
|
|
int write_chars_bin(FILE *out, const char *s, int count);
|
|
|
|
int read_int(FILE *out, int &n);
|
|
int read_uint(FILE *out, unsigned int &n);
|
|
int read_short(FILE *in, int16_t &n);
|
|
int read_short(FILE *out, int &n);
|
|
int read_ushort(FILE *in, uint16_t &n);
|
|
int read_chars_bin(FILE *in, char *s, int count);
|
|
int readList(int lvl);
|
|
int readChunk(const char *id, int lvl);
|
|
int readAviHeader(void);
|
|
int readStreamHeader(void);
|
|
};
|
|
|
|
#endif /* ndef H_GWAVI */
|
|
|