summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorJerome Martinez <jerome@mediaarea.net>2023-01-14 13:32:36 +0100
committerMarton Balint <cus@passwd.hu>2023-03-26 22:04:44 +0200
commit174ca11d915c5258115b208285a232de94d6e14a (patch)
treea151d9a747768520457d40c691508f50e6698eae /libavformat
parentcd954aa3c6e522053d6983a8bda8019e0feee826 (diff)
downloadffmpeg-174ca11d915c5258115b208285a232de94d6e14a.tar.gz
avformat/mxfenc: fix stored/sampled/displayed width/height
According to MXF specs the Stored Rectangle corresponds to the data which is passed to the compressor and received from the decompressor, so they should contain the width / height extended to the macroblock boundary. In practice however width and height values rounded to the upper 16 multiples are only seen when muxing MPEG formats. Therefore this patch changes stored width and height values to unrounded for all non-MPEG formats, even macroblock based ones. For DNXHD the specs (ST 2019-4) explicitly indicates to use 1080 for 1088p. For ProRes the specs (RDD 44) only refer to to ST 377-1 without precision but no known commercial implementations are using rounded values. DV is not using 16x16 macroblocks, so 16 rounding makes no sense. The patch also fixes Sampled Width / Display Width to use unrounded values. Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/mxfenc.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index c79d0dc4be..9eba208ffb 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -1149,8 +1149,9 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
{
MXFStreamContext *sc = st->priv_data;
AVIOContext *pb = s->pb;
- int stored_width = 0;
- int stored_height = (st->codecpar->height+15)/16*16;
+ int stored_width = st->codecpar->width;
+ int stored_height = st->codecpar->height;
+ int display_width;
int display_height;
int f1, f2;
const MXFCodecUL *color_primaries_ul;
@@ -1169,12 +1170,24 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
else if (st->codecpar->height == 720)
stored_width = 1280;
}
- if (!stored_width)
- stored_width = (st->codecpar->width+15)/16*16;
+ display_width = stored_width;
+ switch (st->codecpar->codec_id) {
+ case AV_CODEC_ID_MPEG2VIDEO:
+ case AV_CODEC_ID_H264:
+ //Based on 16x16 macroblocks
+ stored_width = (stored_width+15)/16*16;
+ stored_height = (stored_height+15)/16*16;
+ break;
+ default:
+ break;
+ }
+
+ //Stored width
mxf_write_local_tag(s, 4, 0x3203);
avio_wb32(pb, stored_width);
+ //Stored height
mxf_write_local_tag(s, 4, 0x3202);
avio_wb32(pb, stored_height>>sc->interlaced);
@@ -1194,7 +1207,7 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
//Sampled width
mxf_write_local_tag(s, 4, 0x3205);
- avio_wb32(pb, stored_width);
+ avio_wb32(pb, display_width);
//Samples height
mxf_write_local_tag(s, 4, 0x3204);
@@ -1208,8 +1221,9 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
mxf_write_local_tag(s, 4, 0x3207);
avio_wb32(pb, 0);
+ //Display width
mxf_write_local_tag(s, 4, 0x3209);
- avio_wb32(pb, stored_width);
+ avio_wb32(pb, display_width);
if (st->codecpar->height == 608) // PAL + VBI
display_height = 576;
@@ -1218,6 +1232,7 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID
else
display_height = st->codecpar->height;
+ //Display height
mxf_write_local_tag(s, 4, 0x3208);
avio_wb32(pb, display_height>>sc->interlaced);