• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /* //////////////////////////////////////////////////////////////// */
19 /*  File    : avi_write.h                                           */
20 /* ---------------------------------------------------------------- */
21 /*  Create AVI file from a YUV or RGB output of MPEG4 decoder.      */
22 /* //////////////////////////////////////////////////////////////// */
23 
24 #ifndef AVI_WRITE_H_INCLUDED
25 #define AVI_WRITE_H_INCLUDED
26 
27 #include "oscl_string.h"
28 #include "oscl_file_io.h"
29 
30 #ifndef mmioFOURCC
31 #define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
32     ( (int)(unsigned char)(ch0) | ( (int)(unsigned char)(ch1) << 8 ) | \
33     ( (int)(unsigned char)(ch2) << 16 ) | ( (int)(unsigned char)(ch3) << 24 ) )
34 #endif
35 
36 #ifndef max
37 #define max(a,b)            (((a) > (b)) ? (a) : (b))
38 #endif
39 
40 #ifndef min
41 #define min(a,b)            (((a) < (b)) ? (a) : (b))
42 #endif
43 
44 #ifndef BI_RGB
45 #define BI_RGB        0L
46 #endif
47 
48 #define streamtypeVIDEO     mmioFOURCC('v', 'i', 'd', 's')
49 #define formtypeAVI         mmioFOURCC('A', 'V', 'I', ' ')
50 #define FOURCC_LIST         mmioFOURCC('L', 'I', 'S', 'T')
51 #define FOURCC_RIFF         mmioFOURCC('R', 'I', 'F', 'F')
52 #define FOURCC_WAVE         mmioFOURCC('W', 'A', 'V', 'E')
53 #define FOURCC_fmt          mmioFOURCC('f', 'm', 't', ' ')
54 #define FOURCC_data         mmioFOURCC('d', 'a', 't', 'a')
55 #define listtypeAVIHEADER       mmioFOURCC('h', 'd', 'r', 'l')
56 #define listtypeSTREAMHEADER    mmioFOURCC('s', 't', 'r', 'l')
57 #define ckidSTREAMHEADER        mmioFOURCC('s', 't', 'r', 'h')
58 #define ckidSTREAMFORMAT        mmioFOURCC('s', 't', 'r', 'f')
59 #define ckidAVIMAINHDR          mmioFOURCC('a', 'v', 'i', 'h')
60 #define ckidAVIPADDING      mmioFOURCC('J', 'U', 'N', 'K')
61 #define listtypeAVIMOVIE    mmioFOURCC('m', 'o', 'v', 'i')
62 #define videoChunkID        mmioFOURCC('0', '0', 'd', 'b')
63 #define ckidAVINEWINDEX     mmioFOURCC('i', 'd', 'x', '1')
64 
65 #define AVIF_HASINDEX_FILE_OUT      0x00000010  // Index at end of file?
66 #define AVIF_TRUSTCKTYPE_FILE_OUT   0x00000800  // Use CKType to find key frames?
67 
68 
69 #define DEFAULT_COUNT 20000 /* default number of frames */
70 
71 typedef struct
72 {
73     int16   left;
74     int16   top;
75     int16   right;
76     int16   bottom;
77 } rect;
78 
79 
80 typedef struct
81 {
82     uint32  dwMicroSecPerFrame; // frame display rate (or 0L)
83     uint32  dwMaxBytesPerSec;   // max. transfer rate
84     uint32  dwPaddingGranularity;   // pad to multiples of this
85     // size; normally 2K.
86     uint32  dwFlags;        // the ever-present flags
87     uint32  dwTotalFrames;      // # frames in file
88     uint32  dwInitialFrames;
89     uint32  dwStreams;
90     uint32  dwSuggestedBufferSize;
91 
92     uint32  dwWidth;
93     uint32  dwHeight;
94 
95     uint32  dwScale;
96     uint32  dwRate;
97     uint32  dwStart;
98     uint32  dwLength;
99 } AVIMainHeader;
100 
101 /*
102  * Stream header
103  */
104 
105 //#define AVISF_DISABLED            0x00000001
106 //#define AVISF_VIDEO_PALCHANGES        0x00010000
107 
108 typedef struct
109 {
110     uint32  fccType;
111     uint32  fccHandler;
112     uint32  dwFlags;    /* Contains AVISF_* flags */
113     uint16  wPriority;  /* dwPriority - splited for audio */
114     uint16  wLanguage;
115     uint32  dwInitialFrames;
116     uint32  dwScale;
117     uint32  dwRate;     /* dwRate / dwScale == samples/second */
118     uint32  dwStart;
119     uint32  dwLength;   /* In units above... */
120     uint32  dwSuggestedBufferSize;
121     int32   dwQuality;
122     uint32  dwSampleSize;
123     rect    rcFrame;
124 } AVIStreamHeader;
125 
126 typedef struct
127 {
128     uint32  chunkID;
129     uint32  flags;
130     uint32  offset;
131     uint32  length;
132 } AVIIndex;
133 
134 typedef struct
135 {
136     uint32  length;
137     uint8   indexBuffer[20000 * 16 + 2];
138 } IndexBuffer;
139 
140 
141 typedef struct
142 {
143     uint32      biSize;
144     int32       biWidth;
145     int32       biHeight;
146     uint16       biPlanes;
147     uint16       biBitCount;
148     uint32      biCompression;
149     uint32      biSizeImage;
150     int32       biXPelsPerMeter;
151     int32       biYPelsPerMeter;
152     uint32      biClrUsed;
153     uint32      biClrImportant;
154 } BitMapInfoHeader;
155 
156 void InitializeAVI(OSCL_TCHAR *filename, int width, int height, int cc);
157 
158 void WriteSampleAVI(unsigned char *src, long timestamp);
159 
160 void CleanUpAVI(long lasttime);
161 
162 #endif
163