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);