From 4d82f24e5b6adc6bed57b156747757f375dc82cd Mon Sep 17 00:00:00 2001 From: henry Date: Sun, 21 Mar 2004 21:32:54 +0000 Subject: [PATCH] explicit option for AVI PRP header git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12052 b3059339-0415-0410-9bf9-f77b7e298cf2 --- DOCS/man/en/mplayer.1 | 24 +++++++++++++++++ cfg-mencoder.h | 5 ++++ libmpdemux/muxer_avi.c | 61 +++++++++++++++++++++++------------------- 3 files changed, 62 insertions(+), 28 deletions(-) diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1 index f545086dc5..f84a1282ee 100644 --- a/DOCS/man/en/mplayer.1 +++ b/DOCS/man/en/mplayer.1 @@ -3774,6 +3774,30 @@ will have the output file contain 'div3' as video fourcc. .PD 1 . .TP +.B \-aviaspect +Encode an additional AVI header with aspect ratio. This is a different +method than the "aspect=..." option of libavcodec or xvid, and is +prioritized over it during playback, because this header is processed +first. + +This option is included for completeness. Some players can understand +it, while they do not understand the aspect headers produced by the +codec. If you wish to target such a player, use this +option. Generally, encoding AVIs with square pixels is still the best +choice, so aspect headers should be avoided. Use this option only if +you know what you are doing. Avoid using it together with +the aspect option of the codec, as it could bring unpredictable +results. + +.I EXAMPLE: +.PD 0 +.RSs +.IPs "\-aviaspect 16:9" +will add a header specifying 16:9 aspect ratio. +.RE +.PD 1 +. +.TP .B \-info (AVI only) Specify the info header of the resulting AVI file. .br diff --git a/cfg-mencoder.h b/cfg-mencoder.h index ebc58435a1..8071db5e72 100644 --- a/cfg-mencoder.h +++ b/cfg-mencoder.h @@ -58,6 +58,8 @@ extern m_option_t vfwopts_conf[]; extern m_option_t xvidencopts_conf[]; #endif +extern float avi_prp_aspect; + extern m_option_t nuvopts_conf[]; m_option_t ovc_conf[]={ @@ -192,6 +194,9 @@ m_option_t mencoder_opts[]={ // override FOURCC in output file {"ffourcc", &force_fourcc, CONF_TYPE_STRING, 0, 4, 4, NULL}, + // avi muxer - include prp header with aspect ratio + {"aviaspect", &avi_prp_aspect, CONF_TYPE_FLOAT, CONF_RANGE, 0.2, 3.0, NULL}, + {"pass", "The -pass option is obsolete. Use -lavcopts vpass=n or -divx4opts pass=n!\nRTFM!\n", CONF_TYPE_PRINT, CONF_NOCFG, 0, 0, NULL}, {"passlogfile", &passtmpfile, CONF_TYPE_STRING, 0, 0, 0, NULL}, diff --git a/libmpdemux/muxer_avi.c b/libmpdemux/muxer_avi.c index 4ddcf26773..f51d35b01f 100644 --- a/libmpdemux/muxer_avi.c +++ b/libmpdemux/muxer_avi.c @@ -34,6 +34,8 @@ extern char *info_comment; #define ODML_NOTKEYFRAME 0x80000000U #define MOVIALIGN 0x00001000 +float avi_prp_aspect = -1.0; + struct avi_odmlidx_entry { uint64_t ofs; uint32_t len; @@ -223,12 +225,8 @@ static void write_avi_list(FILE *f,unsigned int id,int len){ #define WFSIZE(wf) (sizeof(WAVEFORMATEX)+(wf)->cbSize) -static unsigned int avi_aspect(sh_video_t *sh_video) +static unsigned int avi_aspect(float aspect) { - float aspect = sh_video->aspect; - if (aspect <= 0.0) { - aspect = (float)sh_video->disp_w/(float)sh_video->disp_h; - } if (aspect >= 3.99/3.0 && aspect <= 4.01/3.0) return MAKE_AVI_ASPECT(4,3); if (aspect >= 15.99/9.0 && @@ -247,6 +245,7 @@ static void avifile_write_header(muxer_t *muxer){ muxer_info_t info[16]; FILE *f = muxer->file; VideoPropHeader vprp; + off_t pos; int isodml = muxer->file_end > ODML_CHUNKLEN ? 1 : 0; @@ -314,7 +313,9 @@ static void avifile_write_header(muxer_t *muxer){ switch(muxer->streams[i]->type){ case MUXER_TYPE_VIDEO: hdrsize+=muxer->streams[i]->bih->biSize+8; // strf - hdrsize+=8+4*(9+8*1); // vprp + if (avi_prp_aspect > 0) { + hdrsize+=8+4*(9+8*1); // vprp + } break; case MUXER_TYPE_AUDIO: hdrsize+=WFSIZE(muxer->streams[i]->wf)+8; // strf @@ -347,20 +348,22 @@ static void avifile_write_header(muxer_t *muxer){ s->h.fccHandler = s->bih->biCompression; s->h.rcFrame.right = s->bih->biWidth; s->h.rcFrame.bottom = s->bih->biHeight; - // fill out vprp info - memset(&vprp, 0, sizeof(vprp)); - vprp.dwVerticalRefreshRate = (s->h.dwRate+s->h.dwScale-1)/s->h.dwScale; - vprp.dwHTotalInT = muxer->avih.dwWidth; - vprp.dwVTotalInLines = muxer->avih.dwHeight; - vprp.dwFrameAspectRatio = avi_aspect(s->source); - vprp.dwFrameWidthInPixels = muxer->avih.dwWidth; - vprp.dwFrameHeightInLines = muxer->avih.dwHeight; - vprp.nbFieldPerFrame = 1; - vprp.FieldInfo[0].CompressedBMHeight = muxer->avih.dwHeight; - vprp.FieldInfo[0].CompressedBMWidth = muxer->avih.dwWidth; - vprp.FieldInfo[0].ValidBMHeight = muxer->avih.dwHeight; - vprp.FieldInfo[0].ValidBMWidth = muxer->avih.dwWidth; - hdrsize+=8+4*(9+8*1); // vprp + if (avi_prp_aspect > 0) { + // fill out vprp info + memset(&vprp, 0, sizeof(vprp)); + vprp.dwVerticalRefreshRate = (s->h.dwRate+s->h.dwScale-1)/s->h.dwScale; + vprp.dwHTotalInT = muxer->avih.dwWidth; + vprp.dwVTotalInLines = muxer->avih.dwHeight; + vprp.dwFrameAspectRatio = avi_aspect(avi_prp_aspect); + vprp.dwFrameWidthInPixels = muxer->avih.dwWidth; + vprp.dwFrameHeightInLines = muxer->avih.dwHeight; + vprp.nbFieldPerFrame = 1; + vprp.FieldInfo[0].CompressedBMHeight = muxer->avih.dwHeight; + vprp.FieldInfo[0].CompressedBMWidth = muxer->avih.dwWidth; + vprp.FieldInfo[0].ValidBMHeight = muxer->avih.dwHeight; + vprp.FieldInfo[0].ValidBMWidth = muxer->avih.dwWidth; + hdrsize+=8+4*(9+8*1); // vprp + } break; case MUXER_TYPE_AUDIO: hdrsize+=WFSIZE(s->wf)+8; // strf @@ -379,14 +382,16 @@ static void avifile_write_header(muxer_t *muxer){ int biSize=s->bih->biSize; le2me_BITMAPINFOHEADER(s->bih); write_avi_chunk(f,ckidSTREAMFORMAT,biSize,s->bih); /* BITMAPINFOHEADER */ - le2me_BITMAPINFOHEADER(s->bih); - le2me_VideoPropHeader(&vprp); - le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[0]); - le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[1]); - write_avi_chunk(f,mmioFOURCC('v','p','r','p'), - sizeof(VideoPropHeader) - - sizeof(VIDEO_FIELD_DESC)*(2-vprp.nbFieldPerFrame), - &vprp); /* Video Properties Header */ + if (avi_prp_aspect > 0) { + le2me_BITMAPINFOHEADER(s->bih); + le2me_VideoPropHeader(&vprp); + le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[0]); + le2me_VIDEO_FIELD_DESC(&vprp.FieldInfo[1]); + write_avi_chunk(f,mmioFOURCC('v','p','r','p'), + sizeof(VideoPropHeader) - + sizeof(VIDEO_FIELD_DESC)*(2-vprp.nbFieldPerFrame), + &vprp); /* Video Properties Header */ + } } break; case MUXER_TYPE_AUDIO: