summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/en/mplayer.124
-rw-r--r--cfg-mencoder.h5
-rw-r--r--libmpdemux/muxer_avi.c61
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 <w:h>
+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 <option1:option2:...> (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: