Mercurial > mplayer.hg
comparison libmpdemux/muxer_avi.c @ 12051:78884d076dd4
explicit option for AVI PRP header
author | henry |
---|---|
date | Sun, 21 Mar 2004 21:32:54 +0000 |
parents | d2d18129f8e1 |
children | cdf62dc6d6a0 |
comparison
equal
deleted
inserted
replaced
12050:96336c83b249 | 12051:78884d076dd4 |
---|---|
31 | 31 |
32 /* #define ODML_CHUNKLEN 0x02000000 */ /* for testing purposes */ | 32 /* #define ODML_CHUNKLEN 0x02000000 */ /* for testing purposes */ |
33 #define ODML_CHUNKLEN 0x40000000 | 33 #define ODML_CHUNKLEN 0x40000000 |
34 #define ODML_NOTKEYFRAME 0x80000000U | 34 #define ODML_NOTKEYFRAME 0x80000000U |
35 #define MOVIALIGN 0x00001000 | 35 #define MOVIALIGN 0x00001000 |
36 | |
37 float avi_prp_aspect = -1.0; | |
36 | 38 |
37 struct avi_odmlidx_entry { | 39 struct avi_odmlidx_entry { |
38 uint64_t ofs; | 40 uint64_t ofs; |
39 uint32_t len; | 41 uint32_t len; |
40 uint32_t flags; | 42 uint32_t flags; |
221 fwrite(&le_id,4,1,f); | 223 fwrite(&le_id,4,1,f); |
222 } | 224 } |
223 | 225 |
224 #define WFSIZE(wf) (sizeof(WAVEFORMATEX)+(wf)->cbSize) | 226 #define WFSIZE(wf) (sizeof(WAVEFORMATEX)+(wf)->cbSize) |
225 | 227 |
226 static unsigned int avi_aspect(sh_video_t *sh_video) | 228 static unsigned int avi_aspect(float aspect) |
227 { | 229 { |
228 float aspect = sh_video->aspect; | |
229 if (aspect <= 0.0) { | |
230 aspect = (float)sh_video->disp_w/(float)sh_video->disp_h; | |
231 } | |
232 if (aspect >= 3.99/3.0 && | 230 if (aspect >= 3.99/3.0 && |
233 aspect <= 4.01/3.0) return MAKE_AVI_ASPECT(4,3); | 231 aspect <= 4.01/3.0) return MAKE_AVI_ASPECT(4,3); |
234 if (aspect >= 15.99/9.0 && | 232 if (aspect >= 15.99/9.0 && |
235 aspect <= 16.01/9.0) return MAKE_AVI_ASPECT(16,9); | 233 aspect <= 16.01/9.0) return MAKE_AVI_ASPECT(16,9); |
236 if (aspect >= 0.99 && | 234 if (aspect >= 0.99 && |
245 unsigned int i; | 243 unsigned int i; |
246 unsigned int hdrsize; | 244 unsigned int hdrsize; |
247 muxer_info_t info[16]; | 245 muxer_info_t info[16]; |
248 FILE *f = muxer->file; | 246 FILE *f = muxer->file; |
249 VideoPropHeader vprp; | 247 VideoPropHeader vprp; |
248 | |
250 off_t pos; | 249 off_t pos; |
251 int isodml = muxer->file_end > ODML_CHUNKLEN ? 1 : 0; | 250 int isodml = muxer->file_end > ODML_CHUNKLEN ? 1 : 0; |
252 | 251 |
253 if (isodml) { | 252 if (isodml) { |
254 for (pos = 0; pos < muxer->file_end; pos += ODML_CHUNKLEN) { | 253 for (pos = 0; pos < muxer->file_end; pos += ODML_CHUNKLEN) { |
312 hdrsize+=12; // LIST | 311 hdrsize+=12; // LIST |
313 hdrsize+=sizeof(muxer->streams[i]->h)+8; // strh | 312 hdrsize+=sizeof(muxer->streams[i]->h)+8; // strh |
314 switch(muxer->streams[i]->type){ | 313 switch(muxer->streams[i]->type){ |
315 case MUXER_TYPE_VIDEO: | 314 case MUXER_TYPE_VIDEO: |
316 hdrsize+=muxer->streams[i]->bih->biSize+8; // strf | 315 hdrsize+=muxer->streams[i]->bih->biSize+8; // strf |
317 hdrsize+=8+4*(9+8*1); // vprp | 316 if (avi_prp_aspect > 0) { |
317 hdrsize+=8+4*(9+8*1); // vprp | |
318 } | |
318 break; | 319 break; |
319 case MUXER_TYPE_AUDIO: | 320 case MUXER_TYPE_AUDIO: |
320 hdrsize+=WFSIZE(muxer->streams[i]->wf)+8; // strf | 321 hdrsize+=WFSIZE(muxer->streams[i]->wf)+8; // strf |
321 break; | 322 break; |
322 } | 323 } |
345 case MUXER_TYPE_VIDEO: | 346 case MUXER_TYPE_VIDEO: |
346 hdrsize+=s->bih->biSize+8; // strf | 347 hdrsize+=s->bih->biSize+8; // strf |
347 s->h.fccHandler = s->bih->biCompression; | 348 s->h.fccHandler = s->bih->biCompression; |
348 s->h.rcFrame.right = s->bih->biWidth; | 349 s->h.rcFrame.right = s->bih->biWidth; |
349 s->h.rcFrame.bottom = s->bih->biHeight; | 350 s->h.rcFrame.bottom = s->bih->biHeight; |
350 // fill out vprp info | 351 if (avi_prp_aspect > 0) { |
351 memset(&vprp, 0, sizeof(vprp)); | 352 // fill out vprp info |
352 vprp.dwVerticalRefreshRate = (s->h.dwRate+s->h.dwScale-1)/s->h.dwScale; | 353 memset(&vprp, 0, sizeof(vprp)); |
353 vprp.dwHTotalInT = muxer->avih.dwWidth; | 354 vprp.dwVerticalRefreshRate = (s->h.dwRate+s->h.dwScale-1)/s->h.dwScale; |
354 vprp.dwVTotalInLines = muxer->avih.dwHeight; | 355 vprp.dwHTotalInT = muxer->avih.dwWidth; |
355 vprp.dwFrameAspectRatio = avi_aspect(s->source); | 356 vprp.dwVTotalInLines = muxer->avih.dwHeight; |
356 vprp.dwFrameWidthInPixels = muxer->avih.dwWidth; | 357 vprp.dwFrameAspectRatio = avi_aspect(avi_prp_aspect); |
357 vprp.dwFrameHeightInLines = muxer->avih.dwHeight; | 358 vprp.dwFrameWidthInPixels = muxer->avih.dwWidth; |
358 vprp.nbFieldPerFrame = 1; | 359 vprp.dwFrameHeightInLines = muxer->avih.dwHeight; |
359 vprp.FieldInfo[0].CompressedBMHeight = muxer->avih.dwHeight; | 360 vprp.nbFieldPerFrame = 1; |
360 vprp.FieldInfo[0].CompressedBMWidth = muxer->avih.dwWidth; | 361 vprp.FieldInfo[0].CompressedBMHeight = muxer->avih.dwHeight; |
361 vprp.FieldInfo[0].ValidBMHeight = muxer->avih.dwHeight; | 362 vprp.FieldInfo[0].CompressedBMWidth = muxer->avih.dwWidth; |
362 vprp.FieldInfo[0].ValidBMWidth = muxer->avih.dwWidth; | 363 vprp.FieldInfo[0].ValidBMHeight = muxer->avih.dwHeight; |
363 hdrsize+=8+4*(9+8*1); // vprp | 364 vprp.FieldInfo[0].ValidBMWidth = muxer->avih.dwWidth; |
365 hdrsize+=8+4*(9+8*1); // vprp | |
366 } | |
364 break; | 367 break; |
365 case MUXER_TYPE_AUDIO: | 368 case MUXER_TYPE_AUDIO: |
366 hdrsize+=WFSIZE(s->wf)+8; // strf | 369 hdrsize+=WFSIZE(s->wf)+8; // strf |
367 s->h.fccHandler = s->wf->wFormatTag; | 370 s->h.fccHandler = s->wf->wFormatTag; |
368 break; | 371 break; |
377 case MUXER_TYPE_VIDEO: | 380 case MUXER_TYPE_VIDEO: |
378 { | 381 { |
379 int biSize=s->bih->biSize; | 382 int biSize=s->bih->biSize; |
380 le2me_BITMAPINFOHEADER(s->bih); | 383 le2me_BITMAPINFOHEADER(s->bih); |
381 write_avi_chunk(f,ckidSTREAMFORMAT,biSize,s->bih); /* BITMAPINFOHEADER */ | 384 write_avi_chunk(f,ckidSTREAMFORMAT,biSize,s->bih); /* BITMAPINFOHEADER */ |
382 le2me_BITMAPINFOHEADER(s->bih); | 385 if (avi_prp_aspect > 0) { |
383 le2me_VideoPropHeader(&vprp); | 386 le2me_BITMAPINFOHEADER(s->bih); |
384 le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[0]); | 387 le2me_VideoPropHeader(&vprp); |
385 le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[1]); | 388 le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[0]); |
386 write_avi_chunk(f,mmioFOURCC('v','p','r','p'), | 389 le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[1]); |
387 sizeof(VideoPropHeader) - | 390 write_avi_chunk(f,mmioFOURCC('v','p','r','p'), |
388 sizeof(VIDEO_FIELD_DESC)*(2-vprp.nbFieldPerFrame), | 391 sizeof(VideoPropHeader) - |
389 &vprp); /* Video Properties Header */ | 392 sizeof(VIDEO_FIELD_DESC)*(2-vprp.nbFieldPerFrame), |
393 &vprp); /* Video Properties Header */ | |
394 } | |
390 } | 395 } |
391 break; | 396 break; |
392 case MUXER_TYPE_AUDIO: | 397 case MUXER_TYPE_AUDIO: |
393 { | 398 { |
394 int wfsize = WFSIZE(s->wf); | 399 int wfsize = WFSIZE(s->wf); |