mkvtoolnix/aviclasses/common_gdivfw.h
2003-10-26 09:26:09 +00:00

385 lines
12 KiB
C

// Some common tools
// Copyright (C) 2003 Julien 'Cyrius' Coloos
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
// or visit http://www.gnu.org/licenses/gpl.html
#ifndef __TOOLS_COMMON_GDIVFW_H__
#define __TOOLS_COMMON_GDIVFW_H__
#include "os.h"
#include <ctype.h>
#if defined(SYS_WINDOWS)
#include <windef.h>
#include <winerror.h>
#endif
#include "ac_common.h"
#include "common_endian.h"
//////////////////////////////////////////////////////////////////////
// Some data 'copied' from gdi.h, vfw.h and winerror.h (Microsoft files)
/*
* Video header (BITMAPINFOHEADER)
*/
typedef struct tagw32BITMAPINFOHEADER {
uint32_le biSize;
sint32_le biWidth;
sint32_le biHeight;
uint16_le biPlanes;
uint16_le biBitCount;
uint32_le biCompression;
uint32_le biSizeImage;
sint32_le biXPelsPerMeter;
sint32_le biYPelsPerMeter;
uint32_le biClrUsed;
uint32_le biClrImportant;
} w32BITMAPINFOHEADER;
/*
* AVI headers
*/
typedef struct tagw32RECT {
sint32_le left;
sint32_le top;
sint32_le right;
sint32_le bottom;
} w32RECT;
typedef struct _w32AVISTREAMINFOW {
uint32_le fccType;
uint32_le fccHandler;
uint32_le dwFlags; /* Contains AVITF_* flags */
uint32_le dwCaps;
uint16_le wPriority;
uint16_le wLanguage;
uint32_le dwScale;
uint32_le dwRate; /* dwRate / dwScale == samples/second */
uint32_le dwStart;
uint32_le dwLength; /* In units above... */
uint32_le dwInitialFrames;
uint32_le dwSuggestedBufferSize;
uint32_le dwQuality;
uint32_le dwSampleSize;
w32RECT rcFrame;
uint32_le dwEditCount;
uint32_le dwFormatChangeCount;
char szName[64];
} w32AVISTREAMINFOW;
typedef struct _w32AVISTREAMINFOA {
uint32_le fccType;
uint32_le fccHandler;
uint32_le dwFlags; /* Contains AVITF_* flags */
uint32_le dwCaps;
uint16_le wPriority;
uint16_le wLanguage;
uint32_le dwScale;
uint32_le dwRate; /* dwRate / dwScale == samples/second */
uint32_le dwStart;
uint32_le dwLength; /* In units above... */
uint32_le dwInitialFrames;
uint32_le dwSuggestedBufferSize;
uint32_le dwQuality;
uint32_le dwSampleSize;
w32RECT rcFrame;
uint32_le dwEditCount;
uint32_le dwFormatChangeCount;
char szName[64];
} w32AVISTREAMINFOA;
#ifdef UNICODE
#define w32AVISTREAMINFO w32AVISTREAMINFOW
#else
#define w32AVISTREAMINFO w32AVISTREAMINFOA
#endif
typedef struct {
uint32_le ckid;
uint32_le dwFlags;
uint32_le dwChunkOffset; // Position of chunk
uint32_le dwChunkLength; // Length of chunk
} w32AVIINDEXENTRY;
/* Flags for AVI file index */
//#define AVIIF_LIST 0x00000001L
//#define AVIIF_TWOCC 0x00000002L
#define AVIIF_KEYFRAME 0x00000010L
typedef struct {
uint32_le dwMicroSecPerFrame; // frame display rate (or 0L)
uint32_le dwMaxBytesPerSec; // max. transfer rate
uint32_le dwPaddingGranularity; // pad to multiples of this
// size; normally 2K.
uint32_le dwFlags; // the ever-present flags
uint32_le dwTotalFrames; // # frames in file
uint32_le dwInitialFrames;
uint32_le dwStreams;
uint32_le dwSuggestedBufferSize;
uint32_le dwWidth;
uint32_le dwHeight;
uint32_le dwReserved[4];
} w32MainAVIHeader;
#define AVISTREAMREAD_CONVENIENT (-1L)
/*
* Error codes
*/
#ifndef ICERR_OK
#define ICERR_OK 0L
#define ICERR_UNSUPPORTED -1L
#define ICERR_BADFORMAT -2L
#define ICERR_MEMORY -3L
#define ICERR_INTERNAL -4L
#define ICERR_BADFLAGS -5L
#define ICERR_BADPARAM -6L
#define ICERR_BADSIZE -7L
#define ICERR_BADHANDLE -8L
#define ICERR_CANTUPDATE -9L
#define ICERR_ABORT -10L
#define ICERR_ERROR -100L
#define ICERR_BADBITDEPTH -200L
#define ICERR_BADIMAGESIZE -201L
#define ICERR_CUSTOM -400L // errors less than ICERR_CUSTOM...
#endif
#if !defined(SYS_WINDOWS)
#ifndef MMNOMMIO
#define MMIOERR_BASE 256
#define MMIOERR_FILENOTFOUND (MMIOERR_BASE + 1) /* file not found */
#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE + 2) /* out of memory */
#define MMIOERR_CANNOTOPEN (MMIOERR_BASE + 3) /* cannot open */
#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE + 4) /* cannot close */
#define MMIOERR_CANNOTREAD (MMIOERR_BASE + 5) /* cannot read */
#define MMIOERR_CANNOTWRITE (MMIOERR_BASE + 6) /* cannot write */
#define MMIOERR_CANNOTSEEK (MMIOERR_BASE + 7) /* cannot seek */
#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE + 8) /* cannot expand file */
#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE + 9) /* chunk not found */
#define MMIOERR_UNBUFFERED (MMIOERR_BASE + 10) /* */
#define MMIOERR_PATHNOTFOUND (MMIOERR_BASE + 11) /* path incorrect */
#define MMIOERR_ACCESSDENIED (MMIOERR_BASE + 12) /* file was protected */
#define MMIOERR_SHARINGVIOLATION (MMIOERR_BASE + 13) /* file in use */
#define MMIOERR_NETWORKERROR (MMIOERR_BASE + 14) /* network not responding */
#define MMIOERR_TOOMANYOPENFILES (MMIOERR_BASE + 15) /* no more file handles */
#define MMIOERR_INVALIDFILE (MMIOERR_BASE + 16) /* default error file error */
#endif
#endif
/*
* long values
*/
// Values are 32 bit values layed out as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +---+-+-+-----------------------+-------------------------------+
// |Sev|C|R| Facility | Code |
// +---+-+-+-----------------------+-------------------------------+
//
// Sev - is the severity code
// 00 - Success
// 01 - Informational
// 10 - Warning
// 11 - Error
//
// C - is the Customer code flag
//
// R - is a reserved bit
//
// Facility - is the facility code
//
// Code - is the facility's status code
//
//
// Define the facility codes
//
#define FACILITY_ITF 4
// longs are 32 bit values layed out as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +-+-+-+-+-+---------------------+-------------------------------+
// |S|R|C|N|r| Facility | Code |
// +-+-+-+-+-+---------------------+-------------------------------+
//
// S - Severity - indicates success/fail
// 0 - Success
// 1 - Fail (COERROR)
//
// R - reserved portion of the facility code, corresponds to NT's
// second severity bit.
//
// C - reserved portion of the facility code, corresponds to NT's
// C field.
//
// N - reserved portion of the facility code. Used to indicate a
// mapped NT status value.
//
// r - reserved portion of the facility code. Reserved for internal
// use. Used to indicate long values that are not status
// values, but are instead message ids for display strings.
//
// Facility - is the facility code
//
// Code - is the facility's status code
//
// Severity values
//
//#define SEVERITY_SUCCESS 0
#define SEVERITY_ERROR 1
//
// Success codes
//
#if !defined(S_OK)
#define S_OK ((long)0x00000000L)
#define S_FALSE ((long)0x00000001L)
#endif
#undef MAKE_SCODE
#define MAKE_SCODE(sev,fac,code) \
((sint32) ((uint32(sev)<<31) | (uint32(fac)<<16) | (uint32(code))) )
#ifndef AVIERR_OK
#define AVIERR_OK 0L
#define MAKE_AVIERR(error) MAKE_SCODE(SEVERITY_ERROR, FACILITY_ITF, 0x4000 + error)
#define AVIERR_UNSUPPORTED MAKE_AVIERR(101)
#define AVIERR_BADFORMAT MAKE_AVIERR(102)
#define AVIERR_MEMORY MAKE_AVIERR(103)
#define AVIERR_INTERNAL MAKE_AVIERR(104)
#define AVIERR_BADFLAGS MAKE_AVIERR(105)
#define AVIERR_BADPARAM MAKE_AVIERR(106)
#define AVIERR_BADSIZE MAKE_AVIERR(107)
#define AVIERR_BADHANDLE MAKE_AVIERR(108)
#define AVIERR_FILEREAD MAKE_AVIERR(109)
#define AVIERR_FILEWRITE MAKE_AVIERR(110)
#define AVIERR_FILEOPEN MAKE_AVIERR(111)
#define AVIERR_COMPRESSOR MAKE_AVIERR(112)
#define AVIERR_NOCOMPRESSOR MAKE_AVIERR(113)
#define AVIERR_READONLY MAKE_AVIERR(114)
#define AVIERR_NODATA MAKE_AVIERR(115)
#define AVIERR_BUFFERTOOSMALL MAKE_AVIERR(116)
#define AVIERR_CANTCOMPRESS MAKE_AVIERR(117)
#define AVIERR_USERABORT MAKE_AVIERR(198)
#define AVIERR_ERROR MAKE_AVIERR(199)
#endif
/*
* FourCC codes
*/
#ifdef mmioFOURCC
# undef mmioFOURCC
#endif
#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
( (uint32)uint8(ch0) | ( (uint32)uint8(ch1) << 8 ) | \
( (uint32)uint8(ch2) << 16 ) | ( (uint32)uint8(ch3) << 24 ) )
/* Should work for little and big endian architectures
* (you must define your FourCC as uint32_le) :
* mmioFOURCC(a,b,c,d) will give dcba as value
* On little endian architectures, this would be stored as abcd in memory
* Affecting the value to an uint32_le will keep this memory ordering
* On big endian architectures, this would be stored as dcba in memory
* Affecting the value to an uint32_le will swap the byte ordering to abcd in memory
*/
#define bitmapFOURCC mmioFOURCC
inline bool isValidFOURCC(uint32 fcc) {
return isprint(uint8(fcc>>24))
&& isprint(uint8(fcc>>16))
&& isprint(uint8(fcc>> 8))
&& isprint(uint8(fcc ));
}
/* form types, list types, and chunk types */
#define formtypeAVI mmioFOURCC('A', 'V', 'I', ' ')
#define formtypeAVIEXTENDED mmioFOURCC('A', 'V', 'I', 'X')
#define listtypeAVIHEADER mmioFOURCC('h', 'd', 'r', 'l')
#define ckidAVIMAINHDR mmioFOURCC('a', 'v', 'i', 'h')
#define listtypeSTREAMHEADER mmioFOURCC('s', 't', 'r', 'l')
#define ckidSTREAMHEADER mmioFOURCC('s', 't', 'r', 'h')
#define ckidSTREAMFORMAT mmioFOURCC('s', 't', 'r', 'f')
#define ckidSTREAMHANDLERDATA mmioFOURCC('s', 't', 'r', 'd')
#define ckidSTREAMNAME mmioFOURCC('s', 't', 'r', 'n')
#define listtypeAVIMOVIE mmioFOURCC('m', 'o', 'v', 'i')
#define listtypeAVIRECORD mmioFOURCC('r', 'e', 'c', ' ')
#define ckidAVINEWINDEX mmioFOURCC('i', 'd', 'x', '1')
#define ckidOPENDMLINDEX mmioFOURCC('i', 'n', 'd', 'x')
/*
** Stream types for the <fccType> field of the stream header.
*/
#define streamtypeVIDEO mmioFOURCC('v', 'i', 'd', 's')
#define streamtypeAUDIO mmioFOURCC('a', 'u', 'd', 's')
#define streamtypeMIDI mmioFOURCC('m', 'i', 'd', 's')
#define streamtypeTEXT mmioFOURCC('t', 'x', 't', 's')
/* Interleaved video/audio stream, used by DV1 format */
#define streamtypeINTERLEAVED mmioFOURCC('i', 'v', 'a', 's')
/* Basic chunk types */
/*#define cktypeDIBbits aviTWOCC('d', 'b')
#define cktypeDIBcompressed aviTWOCC('d', 'c')
#define cktypePALchange aviTWOCC('p', 'c')
#define cktypeWAVEbytes aviTWOCC('w', 'b')*/
/* Chunk id to use for extra chunks for padding. */
#define ckidAVIPADDING mmioFOURCC('J', 'U', 'N', 'K')
/* standard four character codes */
#define FOURCC_RIFF mmioFOURCC('R', 'I', 'F', 'F')
#define FOURCC_LIST mmioFOURCC('L', 'I', 'S', 'T')
#ifdef LOWORD
# undef LOWORD
# undef HIWORD
# undef LOBYTE
# undef HIBYTE
#endif
#define LOWORD(l) ((uint16)(uint32(l) & 0xFFFF))
#define HIWORD(l) ((uint16)(uint32(l) >> 16))
#define LOBYTE(w) ((uint8)(uint32(w) & 0xFF))
#define HIBYTE(w) ((uint8)(uint32(w) >> 8))
/* Macro to get stream number out of a FOURCC ckid */
#ifdef FromHex
# undef FromHex
# undef StreamFromFOURCC
#endif
#define FromHex(n) (((n) >= 'A') ? ((n) + 10 - 'A') : ((n) - '0'))
#define StreamFromFOURCC(fcc) ((uint16) ((FromHex(LOBYTE(LOWORD(fcc))) << 4) + \
(FromHex(HIBYTE(LOWORD(fcc))))))
#endif // __TOOLS_COMMON_GDIVFW_H__