Mercurial > mplayer.hg
annotate libmpdemux/muxer_avi.c @ 11278:ff78d7ceecaa
Dead links updated or removed, Joe Barr section rewritten taking into
account his latest article.
author | diego |
---|---|
date | Sun, 26 Oct 2003 23:08:16 +0000 |
parents | 12fc55eb3373 |
children | e00d3351b912 |
rev | line source |
---|---|
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
1 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
2 #include <stdio.h> |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
3 #include <stdlib.h> |
2529 | 4 #include <string.h> |
8585 | 5 #include <inttypes.h> |
8591 | 6 #include <unistd.h> |
2529 | 7 |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2529
diff
changeset
|
8 #include "config.h" |
7149 | 9 #include "../version.h" |
2555
66837325b929
config.h cleanup, few things added to steram/demuxer headers
arpi
parents:
2529
diff
changeset
|
10 |
2529 | 11 //#include "stream.h" |
12 //#include "demuxer.h" | |
13 //#include "stheader.h" | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
14 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
15 #include "wine/mmreg.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
16 #include "wine/avifmt.h" |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
17 #include "wine/vfw.h" |
6918 | 18 #include "bswap.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
1
diff
changeset
|
19 |
8585 | 20 #include "muxer.h" |
6918 | 21 #include "aviheader.h" |
1 | 22 |
7145
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
23 extern char *info_name; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
24 extern char *info_artist; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
25 extern char *info_genre; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
26 extern char *info_subject; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
27 extern char *info_copyright; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
28 extern char *info_sourceform; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
29 extern char *info_comment; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
30 |
8585 | 31 static muxer_stream_t* avifile_new_stream(muxer_t *muxer,int type){ |
32 muxer_stream_t* s; | |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
33 if (!muxer) return NULL; |
8585 | 34 if(muxer->avih.dwStreams>=MUXER_MAX_STREAMS){ |
35 printf("Too many streams! increase MUXER_MAX_STREAMS !\n"); | |
2529 | 36 return NULL; |
37 } | |
8585 | 38 s=malloc(sizeof(muxer_stream_t)); |
39 memset(s,0,sizeof(muxer_stream_t)); | |
2529 | 40 if(!s) return NULL; // no mem!? |
41 muxer->streams[muxer->avih.dwStreams]=s; | |
42 s->type=type; | |
43 s->id=muxer->avih.dwStreams; | |
44 s->timer=0.0; | |
2652 | 45 s->size=0; |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
46 s->muxer=muxer; |
2529 | 47 switch(type){ |
8585 | 48 case MUXER_TYPE_VIDEO: |
2529 | 49 s->ckid=mmioFOURCC(('0'+s->id/10),('0'+(s->id%10)),'d','c'); |
50 s->h.fccType=streamtypeVIDEO; | |
51 if(!muxer->def_v) muxer->def_v=s; | |
52 break; | |
8585 | 53 case MUXER_TYPE_AUDIO: |
2529 | 54 s->ckid=mmioFOURCC(('0'+s->id/10),('0'+(s->id%10)),'w','b'); |
55 s->h.fccType=streamtypeAUDIO; | |
56 break; | |
57 default: | |
58 printf("WarninG! unknown stream type: %d\n",type); | |
59 return NULL; | |
60 } | |
61 muxer->avih.dwStreams++; | |
62 return s; | |
63 } | |
1 | 64 |
2529 | 65 static void write_avi_chunk(FILE *f,unsigned int id,int len,void* data){ |
6918 | 66 int le_len = le2me_32(len); |
67 int le_id = le2me_32(id); | |
68 fwrite(&le_id,4,1,f); | |
69 fwrite(&le_len,4,1,f); | |
70 | |
1 | 71 if(len>0){ |
72 if(data){ | |
73 // DATA | |
74 fwrite(data,len,1,f); | |
75 if(len&1){ // padding | |
76 unsigned char zerobyte=0; | |
77 fwrite(&zerobyte,1,1,f); | |
78 } | |
79 } else { | |
80 // JUNK | |
81 char *avi_junk_data="[= MPlayer junk data! =]"; | |
82 if(len&1) ++len; // padding | |
83 while(len>0){ | |
84 int l=strlen(avi_junk_data); | |
85 if(l>len) l=len; | |
86 fwrite(avi_junk_data,l,1,f); | |
87 len-=l; | |
88 } | |
89 } | |
90 } | |
2529 | 91 } |
92 | |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
93 static void avifile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags){ |
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
94 muxer_t *muxer=s->muxer; |
2529 | 95 |
96 // add to the index: | |
97 if(muxer->idx_pos>=muxer->idx_size){ | |
98 muxer->idx_size+=256; // 4kB | |
99 muxer->idx=realloc(muxer->idx,16*muxer->idx_size); | |
100 } | |
101 muxer->idx[muxer->idx_pos].ckid=s->ckid; | |
102 muxer->idx[muxer->idx_pos].dwFlags=flags; // keyframe? | |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
103 muxer->idx[muxer->idx_pos].dwChunkOffset=ftell(muxer->file)-(muxer->movi_start-4); |
2529 | 104 muxer->idx[muxer->idx_pos].dwChunkLength=len; |
105 ++muxer->idx_pos; | |
106 | |
107 // write out the chunk: | |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
108 write_avi_chunk(muxer->file,s->ckid,len,s->buffer); /* unsigned char */ |
6918 | 109 |
2529 | 110 // alter counters: |
111 if(s->h.dwSampleSize){ | |
112 // CBR | |
113 s->h.dwLength+=len/s->h.dwSampleSize; | |
114 if(len%s->h.dwSampleSize) printf("Warning! len isn't divisable by samplesize!\n"); | |
115 } else { | |
116 // VBR | |
117 s->h.dwLength++; | |
118 } | |
119 s->timer=(double)s->h.dwLength*s->h.dwScale/s->h.dwRate; | |
2652 | 120 s->size+=len; |
8585 | 121 if((unsigned int)len>s->h.dwSuggestedBufferSize) s->h.dwSuggestedBufferSize=len; |
1 | 122 |
123 } | |
124 | |
2529 | 125 static void write_avi_list(FILE *f,unsigned int id,int len){ |
1 | 126 unsigned int list_id=FOURCC_LIST; |
6918 | 127 int le_len; |
128 int le_id; | |
1 | 129 len+=4; // list fix |
6918 | 130 list_id = le2me_32(list_id); |
131 le_len = le2me_32(len); | |
132 le_id = le2me_32(id); | |
1 | 133 fwrite(&list_id,4,1,f); |
6918 | 134 fwrite(&le_len,4,1,f); |
135 fwrite(&le_id,4,1,f); | |
1 | 136 } |
137 | |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2555
diff
changeset
|
138 // muxer->streams[i]->wf->cbSize |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2555
diff
changeset
|
139 #define WFSIZE(wf) (sizeof(WAVEFORMATEX)+(((wf)->cbSize)?((wf)->cbSize-2):0)) |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2555
diff
changeset
|
140 |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
141 static void avifile_write_header(muxer_t *muxer){ |
8585 | 142 uint32_t riff[3]; |
143 unsigned int i; | |
2529 | 144 unsigned int hdrsize; |
8585 | 145 muxer_info_t info[16]; |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
146 FILE *f=muxer->file; |
7145
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
147 |
1 | 148 // RIFF header: |
149 riff[0]=mmioFOURCC('R','I','F','F'); | |
7144
4f912998013e
fixed RIFF chunk size - patch by "Andriy N. Gritsenko" <andrej@lucky.net>
arpi
parents:
6918
diff
changeset
|
150 riff[1]=muxer->file_end-2*sizeof(unsigned int); // filesize |
1 | 151 riff[2]=formtypeAVI; // 'AVI ' |
6918 | 152 riff[0]=le2me_32(riff[0]); |
153 riff[1]=le2me_32(riff[1]); | |
154 riff[2]=le2me_32(riff[2]); | |
1 | 155 fwrite(&riff,12,1,f); |
2529 | 156 // update AVI header: |
157 if(muxer->def_v){ | |
158 muxer->avih.dwMicroSecPerFrame=1000000.0*muxer->def_v->h.dwScale/muxer->def_v->h.dwRate; | |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2555
diff
changeset
|
159 // muxer->avih.dwMaxBytesPerSec=1000000; // dummy!!!!! FIXME |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2555
diff
changeset
|
160 // muxer->avih.dwPaddingGranularity=2; // ??? |
2529 | 161 muxer->avih.dwFlags|=AVIF_ISINTERLEAVED|AVIF_TRUSTCKTYPE; |
162 muxer->avih.dwTotalFrames=muxer->def_v->h.dwLength; | |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2555
diff
changeset
|
163 // muxer->avih.dwSuggestedBufferSize=muxer->def_v->h.dwSuggestedBufferSize; |
2529 | 164 muxer->avih.dwWidth=muxer->def_v->bih->biWidth; |
165 muxer->avih.dwHeight=muxer->def_v->bih->biHeight; | |
166 } | |
167 | |
1 | 168 // AVI header: |
2529 | 169 hdrsize=sizeof(muxer->avih)+8; |
170 // calc total header size: | |
171 for(i=0;i<muxer->avih.dwStreams;i++){ | |
172 hdrsize+=12; // LIST | |
173 hdrsize+=sizeof(muxer->streams[i]->h)+8; // strh | |
174 switch(muxer->streams[i]->type){ | |
8585 | 175 case MUXER_TYPE_VIDEO: |
2529 | 176 hdrsize+=muxer->streams[i]->bih->biSize+8; // strf |
177 break; | |
8585 | 178 case MUXER_TYPE_AUDIO: |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2555
diff
changeset
|
179 hdrsize+=WFSIZE(muxer->streams[i]->wf)+8; // strf |
2529 | 180 break; |
181 } | |
182 } | |
183 write_avi_list(f,listtypeAVIHEADER,hdrsize); | |
6918 | 184 |
185 le2me_MainAVIHeader(&muxer->avih); | |
186 write_avi_chunk(f,ckidAVIMAINHDR,sizeof(muxer->avih),&muxer->avih); /* MainAVIHeader */ | |
187 le2me_MainAVIHeader(&muxer->avih); | |
2529 | 188 |
189 // stream headers: | |
190 for(i=0;i<muxer->avih.dwStreams;i++){ | |
191 hdrsize=sizeof(muxer->streams[i]->h)+8; // strh | |
192 switch(muxer->streams[i]->type){ | |
8585 | 193 case MUXER_TYPE_VIDEO: |
2529 | 194 hdrsize+=muxer->streams[i]->bih->biSize+8; // strf |
195 break; | |
8585 | 196 case MUXER_TYPE_AUDIO: |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2555
diff
changeset
|
197 hdrsize+=WFSIZE(muxer->streams[i]->wf)+8; // strf |
2529 | 198 break; |
199 } | |
200 write_avi_list(f,listtypeSTREAMHEADER,hdrsize); | |
6918 | 201 le2me_AVIStreamHeader(&muxer->streams[i]->h); |
202 write_avi_chunk(f,ckidSTREAMHEADER,sizeof(muxer->streams[i]->h),&muxer->streams[i]->h); /* AVISTreamHeader */ // strh | |
203 le2me_AVIStreamHeader(&muxer->streams[i]->h); | |
204 | |
2529 | 205 switch(muxer->streams[i]->type){ |
8585 | 206 case MUXER_TYPE_VIDEO: |
6918 | 207 { |
208 int biSize=muxer->streams[i]->bih->biSize; | |
209 le2me_BITMAPINFOHEADER(muxer->streams[i]->bih); | |
210 write_avi_chunk(f,ckidSTREAMFORMAT,biSize,muxer->streams[i]->bih); /* BITMAPINFOHEADER */ | |
211 le2me_BITMAPINFOHEADER(muxer->streams[i]->bih); | |
212 } | |
2529 | 213 break; |
8585 | 214 case MUXER_TYPE_AUDIO: |
6918 | 215 { |
216 int wfsize = WFSIZE(muxer->streams[i]->wf); | |
217 le2me_WAVEFORMATEX(muxer->streams[i]->wf); | |
218 write_avi_chunk(f,ckidSTREAMFORMAT,wfsize,muxer->streams[i]->wf); /* WAVEFORMATEX */ | |
219 le2me_WAVEFORMATEX(muxer->streams[i]->wf); | |
220 } | |
2529 | 221 break; |
222 } | |
223 } | |
224 | |
7145
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
225 // ============= INFO =============== |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
226 // always include software info |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
227 info[0].id=mmioFOURCC('I','S','F','T'); // Software: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
228 info[0].text="MEncoder " VERSION; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
229 // include any optional strings |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
230 i=1; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
231 if(info_name!=NULL){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
232 info[i].id=mmioFOURCC('I','N','A','M'); // Name: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
233 info[i++].text=info_name; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
234 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
235 if(info_artist!=NULL){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
236 info[i].id=mmioFOURCC('I','A','R','T'); // Artist: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
237 info[i++].text=info_artist; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
238 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
239 if(info_genre!=NULL){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
240 info[i].id=mmioFOURCC('I','G','N','R'); // Genre: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
241 info[i++].text=info_genre; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
242 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
243 if(info_subject!=NULL){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
244 info[i].id=mmioFOURCC('I','S','B','J'); // Subject: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
245 info[i++].text=info_subject; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
246 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
247 if(info_copyright!=NULL){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
248 info[i].id=mmioFOURCC('I','C','O','P'); // Copyright: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
249 info[i++].text=info_copyright; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
250 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
251 if(info_sourceform!=NULL){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
252 info[i].id=mmioFOURCC('I','S','R','F'); // Source Form: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
253 info[i++].text=info_sourceform; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
254 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
255 if(info_comment!=NULL){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
256 info[i].id=mmioFOURCC('I','C','M','T'); // Comment: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
257 info[i++].text=info_comment; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
258 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
259 info[i].id=0; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
260 |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
261 hdrsize=0; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
262 // calc info size: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
263 for(i=0;info[i].id!=0;i++) if(info[i].text){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
264 size_t sz=strlen(info[i].text)+1; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
265 hdrsize+=sz+8+sz%2; |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
266 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
267 // write infos: |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
268 if (hdrsize!=0){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
269 write_avi_list(f,mmioFOURCC('I','N','F','O'),hdrsize); |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
270 for(i=0;info[i].id!=0;i++) if(info[i].text){ |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
271 write_avi_chunk(f,info[i].id,strlen(info[i].text)+1,info[i].text); |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
272 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
273 } |
3854945aefbb
new mencoder option -info, to store copyright, title, encoder version etc in AVI
arpi
parents:
7144
diff
changeset
|
274 |
2529 | 275 // JUNK: |
6918 | 276 write_avi_chunk(f,ckidAVIPADDING,2048-(ftell(f)&2047)-8,NULL); /* junk */ |
1 | 277 // 'movi' header: |
2529 | 278 write_avi_list(f,listtypeAVIMOVIE,muxer->movi_end-ftell(f)-12); |
279 muxer->movi_start=ftell(f); | |
1 | 280 } |
281 | |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
282 static void avifile_write_index(muxer_t *muxer){ |
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
283 muxer->movi_end=ftell(muxer->file); |
2529 | 284 if(muxer->idx && muxer->idx_pos>0){ |
6918 | 285 int i; |
2529 | 286 // fixup index entries: |
287 // for(i=0;i<muxer->idx_pos;i++) muxer->idx[i].dwChunkOffset-=muxer->movi_start-4; | |
288 // write index chunk: | |
6918 | 289 for (i=0; i<muxer->idx_pos; i++) le2me_AVIINDEXENTRY((&muxer->idx[i])); |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
290 write_avi_chunk(muxer->file,ckidAVINEWINDEX,16*muxer->idx_pos,muxer->idx); /* AVIINDEXENTRY */ |
6918 | 291 for (i=0; i<muxer->idx_pos; i++) le2me_AVIINDEXENTRY((&muxer->idx[i])); |
2529 | 292 muxer->avih.dwFlags|=AVIF_HASINDEX; |
293 } | |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8591
diff
changeset
|
294 muxer->file_end=ftell(muxer->file); |
1 | 295 } |
296 | |
8585 | 297 void muxer_init_muxer_avi(muxer_t *muxer){ |
298 muxer->cont_new_stream = &avifile_new_stream; | |
299 muxer->cont_write_chunk = &avifile_write_chunk; | |
300 muxer->cont_write_header = &avifile_write_header; | |
301 muxer->cont_write_index = &avifile_write_index; | |
302 } |