分享
 
 
 

John McGowan's AVI Overview: Programming and Other Technical Topics

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

John McGowan's AVI Overview: Programming and Other Technical Topics

Windows Multimedia System

In Win16 and Win32, Microsoft created a partially unified system

for handling multimedia. This system consists of the high level

Media Control Interface or MCI Application Programming Interface (API)

and associated MCI drivers. Playback of AVI files can be controlled

through the high level MCI API and the MCIAVI.DRV MCI driver.

The Windows Multimedia System also provides a number of low level

API's such as the WAVE API for waveform audio and associated

device drivers such as the WAVE device drivers for sound cards.

Under Windows NT 4.0, the MCI and low level API's are stored in

the file WINMM.DLL

The API's are:

MCI (high level API - useful for AVI playback)

joy (joystick devices)

midi (MIDI devices)

mixer (MIXER devices)

wave (waveform audio input and output devices)

mmio (low level functions to parse RIFF files)

time (timers etc.)

aux (auxiliary sound device)

When a program loads the MCIAVI driver, the Multimedia

System has the intelligence to locate and invoke the

appropriate MCI driver (MCIAVI.DRV in 16-bit

Windows or MCIAVI32.DLL in 32 bit windows) and pass the MCI

commands such as MCI_PLAY to the MCI driver.

The MCIAVI driver then calls Video for Windows to decompress

the video, GDI (or another graphics API) to display the

decoded frames, and WAVE to output the decoded audio samples.

A dump of the functions exported by winmm.dll under NT 4.0

generated with the Microsoft DUMPBIN.EXE utility follows:

Microsoft (R) COFF Binary File Dumper Version 5.00.7022

Copyright (C) Microsoft Corp 1992-1997. All rights reserved.

Dump of file winmm.dll

File Type: DLL

Section contains the following Exports for WINMM.dll

0 characteristics

31EC70B4 time date stamp Tue Jul 16 21:48:52 1996

0.00 version

2 ordinal base

197 number of functions

197 number of names

ordinal hint name

3 0 CloseDriver (000026CE)

4 1 DefDriverProc (00005AF4)

5 2 DriverCallback (0000254E)

6 3 DrvGetModuleHandle (00001D37)

7 4 GetDriverModuleHandle (00001D37)

8 5 MigrateAllDrivers (00013E79)

9 6 MigrateMidiUser (00013E60)

10 7 MigrateSoundEvents (00011A3C)

11 8 NotifyCallbackData (0000B2C2)

12 9 OpenDriver (00002036)

13 A PlaySound (00008ACB)

2 B PlaySoundA (00008ACB)

14 C PlaySoundW (00009AE1)

15 D SendDriverMessage (00001000)

16 E WOW32DriverCallback (0000C448)

17 F WOW32ResolveMultiMediaHandle (0000CC3C)

18 10 WOWAppExit (00009D3F)

19 11 aux32Message (0000C507)

20 12 auxGetDevCapsA (0000A3FD)

21 13 auxGetDevCapsW (00008C77)

22 14 auxGetNumDevs (00006AE4)

23 15 auxGetVolume (0000A4A1)

24 16 auxOutMessage (00008BFF)

25 17 auxSetVolume (0000A4C9)

26 18 joy32Message (0000C768)

27 19 joyConfigChanged (0000AE40)

28 1A joyGetDevCapsA (0000A99A)

29 1B joyGetDevCapsW (0000AB40)

30 1C joyGetNumDevs (0000AB96)

31 1D joyGetPos (0000ABAA)

32 1E joyGetPosEx (0000ABFD)

33 1F joyGetThreshold (0000AC5C)

34 20 joyReleaseCapture (0000ACA8)

35 21 joySetCapture (0000ACFC)

36 22 joySetThreshold (0000AE06)

37 23 mci32Message (00007566)

38 24 mciDriverNotify (00007006)

39 25 mciDriverYield (00008727)

40 26 mciExecute (0000D92C)

41 27 mciFreeCommandResource (000035CE)

42 28 mciGetCreatorTask (0000DCD5)

43 29 mciGetDeviceIDA (0000DCA3)

44 2A mciGetDeviceIDFromElementIDA (0000DBC6)

45 2B mciGetDeviceIDFromElementIDW (0000DBF5)

46 2C mciGetDeviceIDW (00005372)

47 2D mciGetDriverData (0000158B)

48 2E mciGetErrorStringA (0000DA46)

49 2F mciGetErrorStringW (0000352F)

50 30 mciGetYieldProc (0000E1F3)

51 31 mciLoadCommandResource (00002A75)

52 32 mciSendCommandA (000015D4)

53 33 mciSendCommandW (000014A1)

54 34 mciSendStringA (00004927)

55 35 mciSendStringW (00004A24)

56 36 mciSetDriverData (000058BD)

57 37 mciSetYieldProc (000034C9)

58 38 mid32Message (0000BDFD)

59 39 midiConnect (0001019E)

60 3A midiDisconnect (0001018C)

61 3B midiInAddBuffer (0001004A)

62 3C midiInClose (0000FF42)

63 3D midiInGetDevCapsA (0000FCCC)

64 3E midiInGetDevCapsW (0000FC71)

65 3F midiInGetErrorTextA (0000FDEB)

66 40 midiInGetErrorTextW (0000FDB2)

SetInfo (0000EBF4)

140 8A mmioStringToFOURCCA (0000ED9A)

(00008BC5)

Under Windows 3.x and Windows 95, the DLL MMSYSTEM.DLL (short for

MultiMedia System) contains the multimedia API's.

Return to Top

Video for Windows

Video for Windows is an entire system for handling video

in Microsoft Windows. It was part of MS Windows 3.1 The

original Video for Windows is a collection of 16 bit

windows utilities, dynamic link libraries, and other

components.

The AVI file and file format is a central part of Video

for Windows.

Microsoft Visual C++ 5.0 has a Video for Windows

include file Vfw.h which contains the various API's that

make up Video for Windows:

* COMPMAN - Installable Compression Manager.

* DRAWDIB - Routines for drawing to the display.

* VIDEO - Video Capture Driver Interface

*

* AVIFMT - AVI File Format structure definitions.

* MMREG - FOURCC and other things

*

* AVIFile - Interface for reading AVI Files and AVI Streams

* MCIWND - MCI/AVI window class

* AVICAP - AVI Capture Window class

*

* MSACM - Audio compression manager.

Microsoft released a Video for Windows 1.0 for

Windows 3.1 in November 1992, followed by Video for Windows 1.1. There

have been several versions of Video for Windows 1.1

identified by a trailing alphabetical character such as

1.1e The last and most recent version of Video for

Windows 1.1 for Windows 3.x is Video for Windows 1.1e

This is available by ftp from Microsoft.

Microsoft has provided a 32-bit version of Video for Windows

for Windows 95, while threatening to replace Video for Windows with

ActiveMovie. This version has 32 bit versions of the Video

for Windows codecs such as Cinepak. Other DLL's in the

Video for Windows 95 are also 32-bit How much of the Video for

Windows in Windows 95 is 32 bit code is not clear; many of the

codecs are clearly 32 bit codecs. Nor is it clear how much has been

changed or modified besides the convesion to 32-bit code.

Windows NT 3.5, 3.51 and Windows NT 4.0 include a Video for Windows for

NT. Presumably this is strictly 32-bit. It is not clear how

much code is shared between the NT Video for Windows and the

Windows 95 Video for Windows. Note that hardware device

drivers are different between Windows 95 and NT 3.5/3.51/4.0.

ActiveMovie 1.0 and DirectShow (formerly ActiveMovie 2.0) are

32-bit successors to Video for Windows for both Windows 95

and Windows NT. These support AVI files. ActiveMovie started

out life under the code name Quartz; early Beta releases of

ActiveMovie were known as Quartz.

ActiveMovie 1.0 is bundled with Windows 95b (OEM Service Release 2.x)

and Internet Explorer 3.x/4.x for Windows 95. It can also be downloaded

and installed in Windows 95 separately. Note that ActiveMovie 1.0

does NOT completely replace Video for Windows. For example, ActiveMovie

1.0 does not provide a video capture mechanism. Video capture still

uses Video for Windows capture drivers.

ActiveMovie 1.0 is a 32 bit software component that can run in NT's

user mode. It runs under Windows NT 4.0 as well as Windows 95.

DirectShow (ActiveMovie 2.0) will supposedly add a number of new

features including video capture support, kernel mode streaming, and

miscellaneous other features.

VIDEO FOR WINDOWS under WINDOWS NT 4.0

Under NT 4.0, Video for Windows is implemented as a collection of

32-bit DLL's in the Microsoft 32-bit Common Object File Format or COFF

format. These are usually located in the \WINNT\SYSTEM32 directory

where Windows NT stores most of the system DLL's, drivers, and so

forth.

MSVFW32.DLL ( Microsoft Video for Windows DLL - NT 4.0 )

AVIFIL32.DLL ( AVIFILE API for Reading and Writing AVI Files and Streams )

AVICAP32.DLL ( AVI Capture Window Class )

MCIAVI32.DLL ( Video for Windows MCI Driver )

MSACM32.DRV ( Microsoft Audio Compression Manager )

MSACM32.DLL ( more Microsoft Audio Compression Manager )

MSRLE32.DLL ( Microsoft RLE Video Codec )

IR32_32.DLL ( Intel Indeo 3.2 Video Codec )

MSVIDC32.DLL ( Microsoft Video 1 Codec )

ICCVID.DLL ( Cinepak for Windows 32 - Radius )

What is in MSVFW32.DLL?

MSVFW32.DLL includes the DRAWDIB, Installable Compression

Manager or ICM, and MCI Windows components of Video for

Windows. Other components are stored in other DLL's.

This is a dump of the functions exported by MSVFW32.DLL

Version 4.00

Microsoft (R) COFF Binary File Dumper Version 5.00.7022

Copyright (C) Microsoft Corp 1992-1997. All rights reserved.

Dump of file msvfw32.dll

File Type: DLL

Section contains the following Exports for MSVFW32.dll

0 characteristics

31EC70E9 time date stamp Tue Jul 16 21:49:45 1996

0.00 version

2 ordinal base

47 number of functions

47 number of names

ordinal hint name

3 0 DrawDibBegin (00001E14)

4 1 DrawDibChangePalette (00008C30)

5 2 DrawDibClose (0000888A)

6 3 DrawDibDraw (000010A6)

7 4 DrawDibEnd (00008BEC)

8 5 DrawDibGetBuffer (00008EFC)

9 6 DrawDibGetPalette (00002F97)

10 7 DrawDibOpen (00003E0A)

11 8 DrawDibProfileDisplay (00003EBA)

12 9 DrawDibRealize (00001D49)

13 A DrawDibSetPalette (00001C0D)

14 B DrawDibStart (00002EEB)

15 C DrawDibStop (00002F42)

16 D DrawDibTime (00008C2B)

17 E GetOpenFileNamePreview (0000C7DC)

18 F GetOpenFileNamePreviewA (0000C7DC)

19 10 GetOpenFileNamePreviewW (0000C6A5)

20 11 GetSaveFileNamePreviewA (0000C7EC)

21 12 GetSaveFileNamePreviewW (0000C7CC)

22 13 ICClose (000035E0)

23 14 ICCompress (00004CE5)

24 15 ICCompressorChoose (00005F61)

25 16 ICCompressorFree (00005615)

26 17 ICDecompress (00004D4B)

27 18 ICDraw (0000106A)

28 19 ICDrawBegin (00001B95)

29 1A ICGetDisplayFormat (00004D8E)

30 1B ICGetInfo (00004C60)

31 1C ICImageCompress (00005A96)

32 1D ICImageDecompress (00005D2A)

33 1E ICInfo (00002FEB)

34 1F ICInstall (00004574)

35 20 ICLocate (0000372E)

36 21 ICMThunk32 (0000841C)

37 22 ICOpen (0000337C)

38 23 ICOpenFunction (00003B53)

39 24 ICRemove (0000488B)

40 25 ICSendMessage (00001000)

41 26 ICSeqCompressFrame (000059A7)

42 27 ICSeqCompressFrameEnd (00005907)

43 28 ICSeqCompressFrameStart (000056E4)

44 29 MCIWndCreate (0000C988)

45 2A MCIWndCreateA (0000C988)

46 2B MCIWndCreateW (0000C8CC)

47 2C MCIWndRegisterClass (0000C83F)

48 2D StretchDIB (00009D13)

2 2E VideoForWindowsVersion (000041D1)

Summary

8000 .data

3000 .rdata

2000 .reloc

3000 .rsrc

11000 .text

VIDEO FOR WINDOWS FOR WINDOWS 95

Microsoft distributed a new Video for Windows for Windows 95

while emphasizing Quartz/ActiveMovie/DirectShow in its

marketing.

Video for Windows 95 Files

MSRLE32.DLL (32-bit Microsoft RLE Video Codec)

IR32_32.DLL (32-bit Indeo 3.2 Video Codec)

ICCVID.DLL (32-bit Radius Cinepak Video Codec)

MSVIDC32.DLL (32-bit Microsoft Video 1 Video Codec )

MSVIDEO.DLL (16-bit Video for Windows DLL)

MCIAVI.DRV (16-bit AVI Video MCI Driver)

AVIFILE.DLL (16-bit AVIFILE)

AVICAP.DLL (16-bit AVICAP)

AVICAP32.DLL (32-bit AVICAP)

MSVFW32.DLL (32-bit Video for Windows DLL - with VfW API)

AVIFIL32.DLL (32-bit AVIFILE)

SUMMARY

Video for Windows 1.0 (Windows 3.x)

Video for Windows 1.1 (a-e) (Windows 3.x)

Video for Windows (Windows 95 - has 32-bit codecs and other 32-bit DLL's)

Video for Windows (Windows NT 3.5, 3.51, and 4.0)

Quartz (Betas of ActiveMovie) (Windows 95)

ActiveMovie 1.0 (Windows 95 and NT 4.0)

ActiveMovie 2.0 (DirectShow) (probably Windows 97/98/Memphis and NT 5.0)

Return to Top

WAVE

The Microsoft Windows audio (sound) input/output system, commonly

referred to as Wave or WAVE, predates Video for Windows, which is

wrapped around WAVE in various ways. The audio tracks in AVI files

are simply waveform audio (or WAV) data used by the wave system.

Video for Windows parses the AVI files, extracts the WAV data, and

pipes the WAV data to the WAVE system. Video for Windows handles the

video track if present.

Traditionally, audio input and output devices such as Sound Blaster

Cards have a WAVE audio input/output driver to play WAV (waveform

audio) files.

The simplest waveform audio files consists of a header followed by

Pulse Coded Modulation (PCM) sound data, usually uncompressed 8 or 16

bit sound samples. WAVE also provides a mechanism for audio codecs.

See elsewhere in the AVI Overview for further information on audio

codecs and audio compression.

WAVE is present in Windows 3.1 and Windows 95. A different WAVE

system is present in Windows NT 3.5, 3.51, and 4.0 At least the

hardware device drivers for sound cards must be different in NT.

ActiveMovie appears to be replacing WAVE.

Return to Top

What is the AVI File Format?

AVI Files are a special case of RIFF files. RIFF is

the Resource Interchange File Format. This is a general

purpose format for exchanging multimedia data types

that was defined by Microsoft and IBM during their

long forgotten alliance.

Kevin McKinnon writes:

In fact, RIFF is a clone of the IFF format invented by Electronic Arts in

1984. They invented the format for Deluxe Paint on the Amiga, and IFF

quickly became the standard for interchange on that platform,

maintained eventually by Commodore right up 'til it's demise. EA also

ported Deluxe Paint to the PC platform and brought IFF with it.

IFF even used the 4-character headers (FourCC), though at the time it was

simply called a LONGWORD that some clever people decided to pair into

four charcter because they looked good in #define's. ;)

RIFF is so close to IFF that the good IFF parser routines will (mostly)

correctly parse RIFF files.

----End of Kevin----

Further information on the IFF format is available at:

http://www.ipahome.com/gff/textonly/summary/iff.htm

RIFF Files

RIFF files are built from

(1) RIFF Form Header

'RIFF' (4 byte file size) 'xxxx' (data)

where 'xxxx' identifies the specialization (or form)

of RIFF. 'AVI ' for AVI files.

where the data is the rest of the file. The

data is comprised of chunks and lists. Chunks

and lists are defined immediately below.

(2) A Chunk

(4 byte identifier) (4 byte chunk size) (data)

The 4 byte identifier is a human readable sequence

of four characters such as 'JUNK' or 'idx1'

(3) A List

'LIST' (4 byte list size) (4 byte list identifier) (data)

where the 4 byte identifier is a human readable

sequence of four characters such as 'rec ' or

'movi'

where the data is comprised of LISTS or CHUNKS.

AVI File Format

AVI is a specialization or "form" of RIFF, described below:

'RIFF' (4 byte file length) 'AVI ' // file header (a RIFF form)

'LIST' (4 byte list length) 'hdrl' // list of headers for AVI file

The 'hdrl' list contains:

'avih' (4 byte chunk size) (data) // the AVI header (a chunk)

'strl' lists of stream headers for each stream (audio, video, etc.) in

the AVI file. An AVI file can contain zero or one video stream and

zero, one, or many audio streams. For an AVI file with one video and

one audio stream:

'LIST' (4 byte list length) 'strl' // video stream list (a list)

The video 'strl' list contains:

'strh' (4 byte chunk size) (data) // video stream header (a chunk)

'strf' (4 byte chunk size) (data) // video stream format (a chunk)

'LIST' (4 byte list length) 'strl' // audio stream list (a list)

The audio 'strl' list contains:

'strh' (4 byte chunk size) (data) // audio stream header (a chunk)

'strf' (4 byte chunk size) (data) // audio stream format (a chunk)

'JUNK' (4 byte chunk size) (data - usually all zeros) // an OPTIONAL junk chunk to align on 2K byte boundary

'LIST' (4 byte list length) 'movi' // list of movie data (a list)

The 'movi' list contains the actual audio and video data.

This 'movi' list contains one or more ...

'LIST' (4 byte list length) 'rec ' // list of movie records (a list)

'##wb' (4 byte chunk size) (data) // sound data (a chunk)

'##dc' (4 byte chunk size) (data) // video data (a chunk)

'##db' (4 byte chunk size) (data) // video data (a chunk)

A 'rec ' list (a record) contains the audio and video data for a single frame.

'##wb' (4 byte chunk size) (data) // sound data (a chunk)

'##dc' (4 byte chunk size) (data) // video data (a chunk)

'##db' (4 byte chunk size) (data) // video data (a chunk)

The 'rec ' list may not be used for AVI files with only audio or only

video data. I have seen video only uncompressed AVI files that did

not use the 'rec ' list, only '00db' chunks. The 'rec ' list is used

for AVI files with interleaved audio and video streams. The 'rec '

list may be used for AVI file with only video.

## in '##dc' refers to the stream number. For example, video data chunks

belonging to stream 0 would use the identifier '00dc'. A chunk of

video data contains a single video frame.

Alexander Grigoriev writes ...

John,

##dc chunk was intended to keep compressed data, whereas ##db chunk

nad(sic) to be used for uncompressed DIBs (device independent bitmap),

but actually they both can contain compressed data. For example,

Microsoft VidCap (more precisely, video capture window class) writes

MJPEG compressed data in ##db chunks, whereas Adobe Premiere writes

frames compressed with the same MJPEG codec as ##dc chunks.

----End of Alexander

The ##wb chunks contain the audio data.

The audio and video chunks in an AVI file do not contain

time stamps or frame counts. The data is ordered in time sequentially as

it appears in the AVI file. A player application should display the

video frames at the frame rate indicated in the headers. The

application should play the audio at the audio sample rate indicated

in the headers. Usually, the streams are all assumed to start at

time zero since there are no explicit time stamps in the AVI file.

The lack of time stamps is a weakness of the original AVI file

format. The OpenDML AVI Extensions add new chunks with time

stamps. Microsoft's ASF (Advanced or Active Streaming Format), which

Microsoft claims will replace AVI, has time stamp "objects".

In principle, a video chunk contains a single frame of video. By

design, the video chunk should be interleaved with an audio chunk

containing the audio associated with that video frame. The data

consists of pairs of video and audio chunks. These pairs may be

encapsulated in a 'REC ' list. Not all AVI files obey this simple

scheme. There are even AVI files with all the video followed by all

of the audio; this is not the way an AVI file should be made.

The 'movi' list may be followed by:

'idx1' (4 byte chunk size) (index data) // an optional index into movie (a chunk)

The optional index contains a table of memory offsets to each

chunk within the 'movi' list. The 'idx1' index supports rapid

seeking to frames within the video file.

The 'avih' (AVI Header) chunk contains the following information:

Total Frames (for example, 1500 frames in an AVI)

Streams (for example, 2 for audio and video together)

InitialFrames

MaxBytes

BufferSize

Microseconds Per Frame

Frames Per Second (for example, 15 fps)

Size (for example 320x240 pixels)

Flags

The 'strh' (Stream Header) chunk contains the following information:

Stream Type (for example, 'vids' for video 'auds' for audio)

Stream Handler (for example, 'cvid' for Cinepak)

Samples Per Second (for example 15 frames per second for video)

Priority

InitialFrames

Start

Length (for example, 1500 frames for video)

Length (sec) (for example 100 seconds for video)

Flags

BufferSize

Quality

SampleSize

For video, the 'strf' (Stream Format) chunk contains the following

information:

Size (for example 320x240 pixels)

Bit Depth (for example 24 bit color)

Colors Used (for example 236 for palettized color)

Compression (for example 'cvid' for Cinepak)

For audio, the 'strf' (Stream Format) chunk contains the following

information:

wFormatTag (for example, WAVE_FORMAT_PCM)

Number of Channels (for example 2 for stereo sound)

Samples Per Second (for example 11025)

Average Bytes Per Second (for example 11025 for 8 bit sound)

nBlockAlign

Bits Per Sample (for example 8 or 16 bits)

Each 'rec ' list contains the sound data and video data for a single

frame in the sound data chunk and the video data chunk.

Other chunks are allowed within the AVI file. For example, I have

seen info lists such as

'LIST' (4 byte list size) 'INFO' (chunks with information on video)

These chunks that are not part of the AVI standard are simply

ignored by the AVI parser. AVI can be and has been extended by adding

lists and chunks not in the standard. The 'INFO' list is a registered

global form type (across all RIFF files) to store information that

helps identify the contents of a chunk.

The sound data is typically 8 or 16 bit PCM, stereo or mono,

sampled at 11, 22, or 44.1 KHz. Traditionally, the sound has

typically been uncompressed Windows PCM. With the advent of

the WorldWide Web and the severe bandwidth limitations of the

Internet, there has been increasing use of audio codecs. The

wFormatTag field in the audio 'strf' (Stream Format) chunk

identifies the audio format and codec.

OpenDML AVI File Format Extensions

The Open Digital Media (OpenDML) Consortium has defined an OpenDML

AVI File Format Extensions which extend AVI to support a variety of

features required for professional video production. These include

support for fields (not just frames), file sizes larger than 1 GB,

timecodes, and many other features. Microsoft has reportedly

incorporated OpenDML AVI support in DirectShow 5.1 (ActiveMovie 5.1).

It is also used by various professional video applications for the PC,

in particular Matrox's DigiSuite software.

The Open Digital Media Consortium AVI File Format Extensions

add new lists and chunks to the AVI file which contain extra

data such as timecodes not incorporated in the original AVI

standard.

OpenDML appears to have been spearheaded by Matrox to improve AVI

for professional video authoring and editing. Matrox makes a variety

of PC video products such as DigiSuite for professional and broadcast

video authoring and editing. The OpenDML AVI File Format Extensions

are primarily for the Motion JPEG AVI files used for professional

video authoring and editing. The OpenDML effort seems to have been

pushed to one side with the advent of ActiveMovie, NetShow, Advanced

(formerly Active) Streaming Format (ASF) Files, and other Microsoft

initiatives.

On Oct. 2, 1997, the OpenDML AVI File Format Extensions Version 1.02

specification document (dated February 28, 1996) was available at

the Matrox Electronic Systems, Ltd. Web site at:

http://www.matrox.com/videoweb/odmlff2.htm

The specification is in Adobe Portable Document Format (PDF). Since

Matrox seems to rearrange their site from time to time and one can't

always find the specification, I've included a link to a copy of the PDF

version of the specification on my Web site.

PDF OpenDML AVI File Format Extensions Specification Document

Get Adobe Acrobat Reader (PDF Viewer)

Where to get the exact AVI specification?

Microsoft Visual C++ 5.0 has a Video for Windows include

file Vfw.h which gives the exact AVI data structures such as

the various headers used in AVI files. The file also has

comments explaining the structure of the AVI file.

Video for Windows refers to the AVI Format by the mnemonic

AVIFMT. At one time, the format information was apparently

stored in an AVIFMT.H header file. The format

information now appears consolidated in Vfw.h

In addition to the Video for Windows header files, Chapter Four of the

Video for Windows Programmer's Guide, "AVI Files", gives a detailed

specification of the AVI file format.

Return to Top

AVI and Windows Bitmaps (DDB, DIB, ...)

Microsoft Windows represents bitmapped images internally and in files

as Device Dependent Bitmaps (DDB), Device Independent Bitmaps (DIB), and

DIB Sections. Uncompressed 'DIB ' AVI files represent video frames as

DIB's. Various multimedia API's that work with AVI use Windows

bitmapped images.

Prior to Windows 3.0, Windows relied on Device Dependent Bitmaps for

bitmapped images. A DDB is stored in a format understood by the

device driver for a particular video card. As the name suggests, DDB's

are not generally portable.

The structure of a DDB is:

typedef struct tagBITMAP { // bm

LONG bmType; /* always zero */

LONG bmWidth; /* width in pixels */

LONG bmHeight; /* height in pixels */

LONG bmWidthBytes; /* bytes per line of data */

WORD bmPlanes; /* number of color planes */

WORD bmBitsPixel; /* bits per pixel */

LPVOID bmBits; /* pointer to the bitmap pixel data */

} BITMAP;

Usually the pixel data immediately follows the BITMAP header.

(BITMAP header)(Pixel Data)

The HBITMAP handles used by GDI are handles to Device Dependent Bitmaps.

The GDI function BitBlt and StretchBlt are actually using Device

Dependent Bitmaps.

With Windows 3.0, Microsoft introduced the Device Independent Bitmap or

DIB, the reigning workhorse of bitmapped images under Windows. The DIB

provided a device independent way to represent bitmapped images, both

monochrome and color.

Windows retains DDB's despite the introduction of the DIB. For

example, to use a DIB, you might call:

hBitmap = CreateDIBitmap(...)

CreateDIBitmap creats a DDB from a DIB, returning the GDI HBITMAP

handle of the DDB for further GDI calls. At a low level, Windows

and GDI are still using DDB's.

The DIB files have a standard header that identifies the format, size,

color palette (if applicable) of the bitmapped image. The header

is a BITMAPINFO structure.

typedef struct tagBITMAPINFO {

BITMAPINFOHEADER bmiHeader;

RGBQUAD bmiColors[1];

} BITMAPINFO;

The BITMAPINFOHEADER is a structure of the form:

typedef struct tagBITMAPINFOHEADER{ // bmih

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount

DWORD biCompression; /* a DIB can be compressed using run length encoding */

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;

bmiColors[1] is the first entry in an optional color palette or color

table of RGBQUAD data structures. True color (24 bit RGB) images

do not need a color table. 4 and 8 bit color images use a color table.

typedef struct tagRGBQUAD { // rgbq

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved; /* always zero */

} RGBQUAD;

A DIB consists of

(BITMAPINFOHEADER)(optional color table of RGBQUAD's)(data for the

bitmapped image)

A Windows .BMP file is a DIB stored in a disk file. .BMP files prepend

a BITMAPFILEHEADER to the DIB data structure.

typedef struct tagBITMAPFILEHEADER { // bmfh

WORD bfType; /* always 'BM' */

DWORD bfSize; /* size of bitmap file in bytes */

WORD bfReserved1; /* always 0 */

WORD bfReserved2; /* always 0 */

DWORD bfOffBits; /* offset to data for bitmap */

} BITMAPFILEHEADER;

Structure of Data in a .BMP File

(BITMAPFILEHEADER)(BITMAPINFOHEADER)(RGBQUAD color table)(Pixel Data)

The Win32 API documentation from Microsoft provides extensive

information on the data structures in a DIB.

In Windows 95 and Windows NT, Microsoft added the DIBSection to

provide a more efficient way to use DIB's in programs. The DIBSection

was originally introduced in Windows NT to reduce the number of

memory copies during blitting (display) of a DIB.

Return to Top

ActiveMovie

Active Movie is a new multimedia architecture for Windows 95 and

Windows NT (4.0 and after). ActiveMovie includes support for

playing AVI, QuickTime (.MOV), and MPEG files. ActiveMovie is

apparently intended to supersede Video for Windows.

ActiveMovie 1.0 ships with the OEM Service Release 2 (OSR2) of Windows 95.

It did not ship with prior releases of Windows 95 but was available

separately through the ActiveMovie SDK.

ActiveMovie 1.0 is also bundled with Microsoft's Internet Explorer for

Windows 95 and NT 4.0 Internet Explorer can be downloaded from the

Microsoft Web site at:

http://www.microsoft.com/ie/

Active Movie 1.0 can be downloaded by itself from the Microsoft Internet

Explorer site. (6/6/97)

ActiveMovie 1.0 appears to be a 32 bit software component that runs

under both Windows 95 and Windows NT 4.0 user mode.

ActiveMovie provides at least three different programming

interfaces:

- The ActiveMovie ActiveX Control

- ActiveMovie Component Object Model (COM) interfaces

- The OM-1 MPEG MCI (Media Control Interface) command set

Amongst other things, the ActiveMovie ActiveX Control can be embedded

in HTML Web pages and programmed via VBScript or JavaScript. It can also

be programmed using Visual C++ or Visual Basic as part of applications.

The ActiveMovie COM interaces can be accessed through Visual C++ or

Visual Basic.

ActiveMovie supports a subset of the Media Control Interface (MCI)

commands familiar to Video for Windows programmers. These commands can

be accessed through the mciSendCommand(...) and mciSendString(...)

functions in C/C++.

ActiveMovie 1.0 does NOT provide video capture. Windows 95 with

ActiveMovie 1.0 continues to use the Video for Windows video capture system

and drivers.

ActiveMovie 2.0 (renamed DirectShow in 1997) will provide a new,

alternative mechanism for video capture. According to information

distributed by Microsoft at the WDM Device Driver Conference in April,

1997, ActiveMovie 2.0 will use the WDM Stream Class under Memphis

(formerly Windows 97) and Windows NT 5.0 to implement video capture.

This is subject to possible change since neither Memphis nor NT 5.0

has been released (7/27/97).

Extensive information on ActiveX and ActiveMovie is available at the

Microsoft Web site.

ActiveMovie 1.0 SDK Documentation at (6/28/97):

http://www.microsoft.com/devonly/tech/amov1doc/

Return to Top

GUID's and AVI

GUID stands for Global Unique IDentifier.

In Microsoft's Component Object Model (COM) morass, an object oriented

programming model that incorporates MFC (Microsoft Foundation

Classes), OLE (Object Linking Embedding), ActiveX, ActiveMovie and

everything else Microsoft is hawking lately, a GUID is a 16 byte or

128 bit number used to uniquely identify objects, data formats,

everything.

Within ActiveMovie, there are GUID's for video formats, corresponding

to the FOURCC's or Four Character Codes used in Video for Windows.

These are specified in the file uuids.h in the Active Movie Software

Developer Kit (SDK). ActiveMovie needs to pass around GUID's that

correspond to the FOURCC for the video in an AVI file.

With proper programming, this should be hidden from end users but

ActiveMovie programmers need to know about GUID's.

Return to Top

What are the GUIDs for the Video for Windows Codecs?

Video for Windows codecs are identified by a thirty-two bit Four

Character Code (FOURCC). A Four Character Code is a thirty-two bit

value formed from the ASCII codes for four characters. Typically, the

four characters are a memnonic for the item identified. For example,

the popular Cinepak video codec is 'CVID'.

Microsoft has introduced 128-bit (16 byte) Globally Unique

Identifiers (GUIDs) for identifying everything in the

Microsoft Universe. Microsoft has established a mapping

procedure from the human readable Four Character Codes to

GUIDs for video codecs. Replace the "x"'s in the GUID

below with the 32-bit value built from the Four Character

Code. The Four Character Code is in 7-bit ASCII.

xxxxxxxx-0000-0010-8000-00AA00389B71

For example, the GUID for Radius Cinepak is:

44495643-0000-0010-8000-00AA00389B71

44 is the hexadecimal (base 16) ASCII code for 'D'

49 is the hexadecimal (base 16) ASCII code for 'I'

56 is the hexadecimal (base 16) ASCII code for 'V'

43 is the hexadecimal (base 16) ASCII code for 'C'

Note that the order of the characters is reversed from

naive expectation.

Return to Top

DirectShow

DirectShow is Microsoft's new name for ActiveMovie 2.0 Microsoft

has shifted to marketing ActiveMovie as an integral part of

DirectX.

Apparently DirectShow (ActiveMovie 2.0) will be released to the general

public as part of Direct X 5.0.

Return to Top

DirectDraw

DirectDraw, one of the components of DirectX, is a new Applications

Programming Interface (API) that is part of Windows 95 and Windows NT

4.0. DirectDraw allows programs to directly access video memory and

other hardware features in video display cards. Direct Draw also

defines new device drivers for graphic/video display adapters to

supersede the GDI display drivers. DirectDraw needs the new

device drivers.

DirectDraw consists of a new API and new hardware drivers known as

the Direct Draw Hardware Abstraction Layer (HAL).

In the Windows 3.1 Graphic Device Interface (GDI), an application

program never writes directly to the memory in a display card. It

writes to a buffer in main memory within Windows. GDI invokes a GDI

video device driver and copies the image from main memory to the video

memory of the video card. This multiple copying of the image

inevitably slows down the display.

The DirectDraw API provides a mechanism allowing appliation programs

to write directly into the video card's memory. It also provides a

mechanism to access various special features in video cards such as

color space conversion, hardware scaling, z-buffering, alpha blending,

and so forth.

Video card manufacturers must provide a DirectDraw driver for DirectDraw

to work with their card.

Microsoft's ActiveMovie uses DirectDraw to achieve faster playback of

AVI, QuickTime, and MPEG files.

There is extensive information on the DirectDraw and DirectX API's at the

Microsoft Web site.

The DirectX 3 SDK can be downloaded from the Microsoft Developer

Online Web site (6/28/97):

http://www.microsoft.com/msdn/

Select Microsoft SDKs from the Technical Information section, or point

your browser at:

http://www.microsoft.com/msdn/sdk/

Versions of DirectX

- DirectX 1

- DirectX 2

- DirectX 3

- DirectX 3A (latest as of 2/18/97)

- DirectX 5.0 (in development?)

- DirectX 6.0 (mentioned occasionally by Microsoft)

Return to Top

What is a driver?

Most often, driver refers to a software component that handles

control and communication with hardware in a computer. Most

but not all hardware device drivers run in a privileged mode

such as the Ring Zero mode of the Intel 80x86 processors.

Microsoft Windows uses the term driver to refer to several different

software components.

- Hardware Device Drivers

- Windows 3.x or 95 Virtual Device Drivers (VxD's)

- not all VxD's access hardware

- Microsoft Windows Installable Drivers

such as

- Media Control Interface or MCI Drivers

- Video for Windows Codecs (Compressor/Decompressors)

- Audio Codecs (Compressor/Decompressors)

Hardware Device Drivers include MS-DOS device drivers, DOS Terminate

and Stay Resident Programs that access hardware, Windows 3.x and 95

VxD's (Virtual Device Drivers) that access hardware, Windows DLL's

that access hardware but do not run in Ring Zero, Windows NT

kernel-mode device drivers, and the new Win32 Driver Model (WDM) drivers

for Memphis/Windows 98 and NT 5.0

Microsoft Windows Installable Drivers are Ring Three (Windows 95) or

user-mode (Windows NT) Dynamic Link Libraries (DLL's) with a single

entry point DriverProc(). MCI drivers, Video for Windows Codecs,

Microsoft Audio Compression Manager Codecs, and a variety of other

software components are Installable Drivers. Some installable

drivers are hardware drivers.

Return to Top

GDI Device Drivers

In Windows 3.1, and to a lesser extent Windows 95, the Graphic Device

Interface or GDI is the system that handles graphic display, including

putting bitmaps on the display monitor. Amongst other things, GDI

defines a set of GDI functions that application programs call such as

BitBlt(...) to display graphics on the screen. GDI also controls

printers and other graphic output devices.

Windows NT also provides a GDI system, but the underlying hardware

device drivers are different. Windows 3.1 GDI drivers won't work

under NT. Application programs written using the GDI API will usually

work under NT.

GDI is device independent. To achieve this, GDI uses GDI device

drivers loaded dynamically as needed.

The most commonly used GDI device driver is the DISPLAY device (for

display monitors). In Windows 3.1, this is specified by lines such

as:

display.drv=SUPERVGA.DRV

in the SYSTEM.INI file. SUPERVGA.DRV is a generic super vga graphic

display adapter driver shipped with Windows 3.1 SUPERVGA.DRV is a GDI

Device Driver

The printer driver is another common GDI device driver.

In Windows 3.1 or Windows 95 without DirectDraw, GDI handles display

of video frames on the display monitor.

GDI defines a set of standard functions exported by GDI Device

Drivers. A GDI Device Driver can also report that it does not support

a particular function.

Standard Functions for GDI Device Driver

Entry Name Description

01 BitBlt Transfer bits from src (source) to dest (destination) rect (rectangle)

02 ColorInfo Converts between logical and physical colors.

.

.

.

30 BitmapBits Sets, retrieves, copies bitmap data.

Video card manufacturers write and provide GDI Device Drivers for video cards.

When Video for Windows plays an AVI file, Video for Windows usually

uses the Media Control Interface (MCI) driver for AVI files

(MCIAVI.DRV). The MCI driver will call GDI to display each decoded

frame of video and WAVE to output the decoded audio to the sound card.

In Windows 95 or NT 4.0, ActiveMovie 1.0 has "renderers" which can

invoke GDI or DirectDraw depending on the situation to display the

decoded video frames. There are also audio renderers to output the

decoded audio from an AVI, QuickTime, or MPEG file.

Return to Top

Direct Draw Hardware Abstraction Layer

DirectDraw is a replacement for GDI for Windows 95 and

Windows NT 4.0. See elsewhere in this overview for sections on

GDI and DirectDraw.

The Direct Draw Hardware Abstraction Layer (HAL) defines

Direct Draw device drivers for graphics/video display

adapters. Graphics and video card manufacturers

provide DirectDraw device drivers. For Direct Draw

to work it must have these device drivers.

DirectDraw also defines a DirectDraw Applications Programming

Interface (API), a standard set of function calls invoked by

applications. The DirectDraw API in turn calls the Direct

Draw HAL to access the graphics/video display adapter.

ActiveMovie can invoke DirectDraw for video output under

Windows 95 and Windows NT 4.0.

Return to Top

Virtual Device Drivers

In Windows 3.x and Windows 95, Virtual Device Drivers or VXD's are

usually the hardware device drivers. They run in a privileged mode of

the Intel 80x86 processor known as Ring Zero. Video display adapters

and video capture cards usually have an associated VXD written by the

card or chip manufacturer.

Note that some Windows device drivers are implemented as Dynamic Link

Libraries (DLL's) that do not run in the privileged, Ring Zero, mode

of the 80x86 processor or as MS-DOS programs that access hardware.

These device drivers are not VXD's. There are some things that only

VXD's can do. Most PC hardware, especially with high bandwidth

requirements, use VXD's.

Device drivers for video display adapters are rarely a single VXD.

Often the Device Driver Interface (DDI) is implemented as a Dynamic

Link Library which does not run at Ring Zero. Only parts of the

device driver that need to run at Ring Zero are in the VXD.

A full video display device driver is often built of several

files, frequently including one or more VXDs.

VXD's are usually found in the \WINDOWS\SYSTEM directory.

VXD's will not work for hardware under Windows NT 3.51 or NT 4.0

Windows NT has its own Windows NT Driver Model for device drivers.

In "Memphis", formerly Windows 97, and NT 5.0, Microsoft is attempting

to provide a common driver model known as WDM or Win32 Driver Model so

that the same drivers can be used in both Memphis and NT.

Return to Top

Windows NT Driver Model

Windows NT (3.51, 4.0) has its own system of hardware device

drivers. While NT can often run Windows 3.x and Windows 95

applications, NT cannot use Windows 3.x or Windows 95

device drivers (the Virtual Device Drivers or VxD's).

For most people working with AVI, or video in general, the main

point to remember is that different drivers are needed for

NT than Windows 95 (or Windows 3.x). Most hardware manufacturers

provide both Windows 3.x, 95, and NT drivers.

TOOLS

Programmers will need the Windows NT DDK (Device Driver Kit)

to develop Windows NT drivers. This is available in a

subscription to Microsoft Developer Network (Professional).

http://www.microsoft.com/msdn/

Return to Top

Win32 Driver Model (WDM)

The Win32 Driver Model (WDM) is a new device driver system for

Memphis (formerly Windows 97) and Windows NT 5.0 The notion is that

the same device drivers will work under both Memphis and NT 5.0

WDM is largely the Windows NT Driver Model used in NT 3.51 and 4.0

It is still under development. Video display card and video capture

card companies will presumably be providing WDM drivers for

Memphis and NT 5.0 in the future.

Memphis is supposed to be backward compatible so that

Windows 95 Device Drivers will still work under Memphis.

Similarly, NT 4.0 Device Drivers will still work under

NT 5.0 A WDM Device Driver will work under both Memphis and

NT 5.0.

Return to Top

MMX

MMX or Multimedia Extensions to the Pentium instruction set are

57 new instructions that accelerate some graphics, imaging, and

multimedia operations. Multimedia often involves small data types

such as 8 bit or 16 bit pixels that can be processed in parallel.

For example, in principle, a 32 bit instruction could operate of

four 8 bit pixels in parallel.

A simple example would be adding four 8 bit pixels in parallel.

The MMX instructions add clipping for underflow and overflow

situations.

255 0 0 255 Normal addition of four 8 bit pixels backed in 32 bits

+ 0 0 0 255

-------------

255 0 1 0

255 0 0 255 MMX style clipping of overflow

+ 0 0 0 255

--------------

255 0 0 255

Intel developed the MMX instructions and added them to recent

versions of the Pentium chip known as the P55C or Pentium with MMX.

The MMX instructions were also added to the Pentium Pro. The Pentium

Pro with MMX was code named Klamath, but called the Pentium II when

actually shipped in 1997.

MMX can accelerate various graphics and multimedia operations. It can

accelerate video codecs. In particular, the block Discrete Cosine

Transform used in JPEG, Motion JPEG, H.261, H.263, H.263+, MPEG-4,

MPEG-1, and MPEG-2 can be accelerated using MMX instructions.

Initially compilers have not supported generation of MMX instructions, so

critical portions of the multimedia algorithms must be hand-coded in

Pentium assembler using the MMX instructions.

An MMX version of a codec may be able to encode and decode an AVI

file (for example) faster on a PC with MMX.

DOCUMENTATION ON MMX

Further information on MMX is available at the Intel Web site for

developers:

http://developer.intel.com/sites/developer

Click on the Literature Center link, then select "Pentium Processor

with MMX" from the pull down list of products.

This information is dated August 1, 1997. The Intel Web site changes

from time to time.

In addition to various on-line documentation at the Web site, Intel

has some manuals on MMX:

Intel Architecture MMX Technology Developers Manual (Order No. 243013)

Intel Architecture MMX Technology Programmer's Reference Manual

(Order No. 243007)

TOOLS FOR WORKING WITH MMX

Intel provides an MMX Technology Macro Package for use with

the Microsoft Macro Assembler (MASM). This can be downloaded from:

http://developer.intel.com/design/perftool/mmx1mac/

Intel markets an Intel C/C++ compiler plug-in for Microsoft

Visual C/C++ 4.x/5.0. This plug-in includes "special

compiler intrinsics" to support MMX. These allow a programmer

to use the call syntax of C functions instead of manually

coding in assembly language.

Example of an "intrinsic"

__m64 _m_pmaddwd(__m64 m1, __m64 m2)

http://developer.intel.com/design/perftool/icl24/

The Intel C/C++ compiler plug-in is available on the VTune

CD-ROM. VTune is discussed below.

Intel markets a product called the VTune (TM) Performance Analyzer for

profiling programs on the Intel architecture at the machine

instruction level. VTune includes support for the MMX instructions

and has been used to profile and optimize MMX code. The VTune CD-ROM

includes a number of other Intel freebies and products such as the

Intel C/C++ compiler plug-in that may be useful developing MMX

software.

http://developer.intel.com/design/perftool/vtune/

Return to Top

ActiveX

NOTE: ActiveX is NOT ActiveMovie. There is an ActiveMovie ActiveX

control, but ActiveX is far more than this.

ActiveX is a stripped down version of OLE (Object Linking and

Embedding) targetted for the World Wide Web. An ActiveX component or

control is a software component written in Visual Basic, Visual C++, or

Java that conforms to the ActiveX API. This API is a variant of

OLE, designed to create small objects that can be dowloaded over the

Internet.

An ActiveX object or control may reside on a Web page to be downloaded

and run when Microsoft's Internet Explorer views the page. An ActiveX

control can be the ActiveMovie ActiveX control which plays AVI and other

video formats supported by ActiveMovie. An ActiveX control can be an

entertaining animation, a game like tic tac toe, anything. In this

sense, ActiveX objects are similar to Java applets.

Unlike Java applets, once an ActiveX control has been downloaded once

it remains on the downloading machine and can be used again without

being dowloaded again.

Also unlike Java, ActiveX controls are tied to a particular

architecture, Windows 95 or Windows NT. It is not clear how much

support Microsoft will give for ActiveX on non-Windows platforms.

Java applets are compiled to a Java bytecode that will run on any

platform with a Java virtual machine implemented. Java applets will

run on Windows 3.1, Windows 95, Windows NT, PowerMacintosh, Linux,

Sun, and various other Unix platforms.

There is extensive information on ActiveX at the Microsoft Web site.

The ActiveX SDKs can be downloaded from the Microsoft Developer Online

Web Site (6/28/97):

http://www.microsoft.com/msdn/

Select Microsoft SDKs from the Technical Information section or point your

browser at:

http://www.microsoft.com/msdn/sdk/

Netscape Fans:

ScriptActive is a Netscape Plug-In that adds support for ActiveX to

Netscape.

ScriptActive Web Site

Return to Top

Playing an AVI File within a Windows Application

Programmers can play an AVI File within a Windows application by

several means. The simplest traditional way is to use the

Media Control Interface (MCI). Video for Windows includes an

MCI driver mciavi.drv for AVI files.

Within the Windows API, programmers can use two C language API

functions, mciSendString(...) and mciSendCommand(...), to communicate with

the MCI driver. mciSendString(...) sends MCI command strings such as

"play from 0 to 100" to the MCI driver. mciSendCommand(...) sends MCI

command messages, a straight C type interface, to the MCI driver.

The syntax for mciSendString is:

MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString,

UINT cchReturn, HANDLE hwndCallback);

The pointer lpszCommand points to the MCI command string such as

"play from 0 to 100". Consult the Microsoft SDK documentation for

more details.

The syntax for mciSendCommand is:

MCIERROR mciSendCommand(MCIDEVICEID IDDevice, UINT uMsg,

DWORD fdwCommand, DWORD dwParam);

where uMsg is an MCI command message such as MCI_PLAY defined in an

include file. Consult the Microsoft SDK documentation for more

details on MCI command messages.

mciSendString(...) and mciSendCommand(...) are essentially equivalent.

The MCI driver should convert the MCI command string to an MCI command

message internally. The MCI command strings provide a more English like

interface to MCI.

For C++ programmers, Microsoft provides a window class MCIWnd to wrap

the MCI operations. Quoting the Microsoft SDK documentation:

Microsoft sayeth....

MCIWnd is a window class for controlling multimedia devices. A library

of functions, messages, and macros associated with MCIWnd provides a

simple method to add multimedia playback or recording capabilities to

your applications.

Using a single function, your application can create a control that

plays devices such as video, CD audio, waveform audio, MIDI (Musical

Instrument Digital Interface), or any device that uses the Media

Control Interface (MCI). Automating playback is also quick and

easy. Using a function and two macros, an application can create an

MCIWnd window with the appropriate media device, play the device, and

close both the device and the window when the content has finished

playing.

... end Microsoft sayeth.

Consult the Microsoft documentation for more details on MCIWnd.

ActiveMovie appears intended to supersede MCI. ActiveMovie includes

a restricted subset of MCI for (partial) backward compatibility.

However, Microsoft appears to want developers to switch over to

new API's such as ActiveX and ActiveMovie, built on top of Microsoft's

Component Object Model (COM) object oriented framework.

Return to Top

Reading and Writing an AVI file within a Windows Application

The Microsoft Windows Win32 SDK (Windows NT and Windows 95) includes a

set of functions and macros known as AVIFile for reading, writing, and

manipulating RIFF files including AVI files within a Windows program.

These functions are contained within a Dynamic Link Library

avifile.dll.

The AVIFile functions include:

AVIFileInit(...)

AVIFileOpen(...)

AVIFileReadData(...)

AVIFileWriteData(...)

AVIFileExit(...)

and many many others. Consult Microsoft documentation for details.

Return to Top

Where to get C Source Code for AVI Player Including Many Codecs

Marc Podlipec's Xanim is a free AVI Player for X Windows and Unix.

Most of Xanim is available in source code format. The Xanim home

page is:

http://xanim.va.pubnix.com/

Unfortunately, Xanim's Cinepak and Indeo support is only available in

object module (binary format).

Return to Top

Where to get Detailed Information on Graphics File Formats

Programmers often need to know the details of the many

graphics file formats, both still image and moving.

There are a number of Web sites, books, and other resources

that provide detailed information on the many still image and

video/animation graphics file formats.

Wotsit's File Format Collection

http://wotsit.simsware.com/

and

http://www.ipahome.com/gff/textonly/summary/

Return to Top

Where to get Detailed Information on Audio File Formats

On the Internet, Guido Van Rossum distributes an Audio Formats FAQ (in

two parts) to the alt.binaries.sounds.misc,

alt.binaries.sounds.d, and comp.dsp USENET newsgroups.

On the Web:

http://www.cs.ruu.nl/wais/html/na-dir/audio-fmts/.html

Return to Top

Where to get C Source Code for a JPEG Encoder or Decoder?

Maybe you want to write your own Motion JPEG codec for AVI. It

happens.

The Independent JPEG Group, also known as IJG, distributes the source

code for a JPEG encoder and decoder. The IJG code is incorporated in

many JPEG viewers, is optimized, is free. This is available by

anonymous ftp from the UUNET FTP archive.

ftp://ftp.uu.net/graphics/jpeg/

Return to Top

Where to get C Source Code for an H.263 Video Encoder or Decoder?

Telenor Research distributed a free H.263 video encoder and decoder.

The code is not optimized. Note that H.263 is subject to a variety

of patents and Telenor includes a disclaimer with the code. Telenor

appears to have ceased distributing the code, although it is still

undoubtedly available somewhere on the Web.

http://www.fou.telenor.no/brukere/DVC/h263_software/

For a time, the Signal Processing and Multimedia Group at the

University of British Columbia distributed a free H.263+ video encoder

and decoder. They also appear to have ceased distribution. Their

code appears to be available for a licensing fee.

http://spmg.ece.ubc.ca

See also, their article (available in Adobe PDF format at their web site):

"H.263+: Video Coding at Low Bit Rates", Guy Cote, Berna Erol,

Michael Gallant, and Faouzi Kossentini, IEEE Transactions on

Circuits and Systems for Video Technology, Vol. 8, No. 7, November

1998, p. 849-866

Return to Top

Where to get C Source Code for an MPEG Video Encoder or Decoder?

The MPEG Software Simulation Group or MSSG distributes the C source code

for MPEG-1 and MPEG-2 video encoders and decoders. This code is not

optimized. Go to the MPEG site below and look for MSSG.

http://www.mpeg.org/

Return to Top

Where to get C/C++ Source Code for Wavelet Image Compression?

Geoff Davis distributes a C/C++ source code for wavelet still image

compression of grayscale images, the Wavelet Image Construction Kit.

This code is made available for research purposes.

http://www.cs.dartmouth.edu/~gdavis/

Also see the SPIHT demonstration programs,

http://ipl.rpi.edu/SPIHT/

Return to Top

Where to get an Explanation of Color, Color Spaces, Gamma, and All That

Charles Poynton maintains an FAQ on Color and an FAQ on Gamma. This is

posted in USENET newsgroups regularly and is available on the Web.

http://www.inforamp.net/~poynton/notes/colour_and_gamma/ColorFAQ.html

Return to Top

Setup Information or INF Files

When a video codec or hardware device driver is installed under

Windows 3.x, Windows 95, or Windows NT, Windows uses a special

file known as a Setup Information file. This is also known as

a Device Information file in the case of device drivers. These

files have the extension .INF and are also known as INF files.

When a user installs a codec or device driver through the Control

Panel, the user points the Windows system to a directory containing

an INF file and the various files, such as VxD's or DLLs, to be

installed.

A Setup Information, Device Information, or INF file contains

directives that tell Windows how to install the new software or

hardware. These include changes to the Windows Registry, names and

locations of files to install, and other things.

If you are providing a hardware or software product, you may need to

create an INF file to install your product, driver, etc.

End users are often unaware of the INF file. Indeed, its purpose is to

hide the complexity of installing hardware or software. But it is

good to be aware that these files exist and Windows needs them to

properly install many drivers, codecs, and so forth.

Where AVI is concerned, there are frequently INF files for video

codecs, video display adapters, and video capture cards.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有