Discussion:
[FFmpeg-devel] [PATCH] avformat/mxfenc: calculate and store DAR from user SAR
Paul B Mahol
2018-12-07 20:30:56 UTC
Permalink
Fixes #5155

Signed-off-by: Paul B Mahol <***@gmail.com>
---
libavformat/mxfenc.c | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index 3549b4137d..8f762c7eaf 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -2726,6 +2726,14 @@ static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
}
}

+ if (st->codecpar->sample_aspect_ratio.num && st->codecpar->sample_aspect_ratio.den) {
+ av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
+ st->codecpar->sample_aspect_ratio.num * st->codecpar->width,
+ st->codecpar->sample_aspect_ratio.den * st->codecpar->height, INT_MAX);
+ } else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
+ av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den, st->codecpar->width, st->codecpar->height, INT_MAX);
+ }
+
if (st->codecpar->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
if (!mxf_parse_mpeg2_frame(s, st, pkt, &ie)) {
av_log(s, AV_LOG_ERROR, "could not get mpeg2 profile and level\n");
--
2.17.1
Paul B Mahol
2018-12-10 09:17:29 UTC
Permalink
Signed-off-by: Paul B Mahol <***@gmail.com>
---
libavformat/mxfenc.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index 3549b4137d..006a9da1f8 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -2368,6 +2368,11 @@ static int mxf_write_header(AVFormatContext *s)
sc->v_chroma_sub_sample = 2;
sc->color_siting = 0xFF;

+ if (st->codecpar->sample_aspect_ratio.num && st->codecpar->sample_aspect_ratio.den) {
+ sc->aspect_ratio = av_mul_q(st->codecpar->sample_aspect_ratio,
+ av_make_q(st->codecpar->width, st->codecpar->height));
+ }
+
if (pix_desc) {
sc->component_depth = pix_desc->comp[0].depth;
sc->h_chroma_sub_sample = 1 << pix_desc->log2_chroma_w;
--
2.17.1
Tomas Härdin
2018-12-10 10:12:29 UTC
Permalink
---
 libavformat/mxfenc.c | 5 +++++
 1 file changed, 5 insertions(+)
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index 3549b4137d..006a9da1f8 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -2368,6 +2368,11 @@ static int mxf_write_header(AVFormatContext *s)
             sc->v_chroma_sub_sample = 2;
             sc->color_siting = 0xFF;
 
+            if (st->codecpar->sample_aspect_ratio.num && st->codecpar->sample_aspect_ratio.den) {
+                sc->aspect_ratio = av_mul_q(st->codecpar->sample_aspect_ratio,
+                                            av_make_q(st->codecpar->width, st->codecpar->height));
+            }
+
Nice, look OK of course

/Tomas

Tomas Härdin
2018-12-09 12:26:57 UTC
Permalink
Post by Paul B Mahol
Fixes #5155
---
 libavformat/mxfenc.c | 8 ++++++++
 1 file changed, 8 insertions(+)
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index 3549b4137d..8f762c7eaf 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -2726,6 +2726,14 @@ static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
         }
     }
 
+    if (st->codecpar->sample_aspect_ratio.num && st->codecpar->sample_aspect_ratio.den) {
+        av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
+                  st->codecpar->sample_aspect_ratio.num * st->codecpar->width,
+                  st->codecpar->sample_aspect_ratio.den * st->codecpar->height, INT_MAX);
Can these multiplications ever overflow? av_reduce_q might be a better
choice.

/Tomas
Paul B Mahol
2018-12-09 12:53:42 UTC
Permalink
Post by Tomas Härdin
Post by Paul B Mahol
Fixes #5155
---
libavformat/mxfenc.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index 3549b4137d..8f762c7eaf 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -2726,6 +2726,14 @@ static int mxf_write_packet(AVFormatContext *s, AVPacket *pkt)
}
}
+ if (st->codecpar->sample_aspect_ratio.num &&
st->codecpar->sample_aspect_ratio.den) {
+ av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
+ st->codecpar->sample_aspect_ratio.num *
st->codecpar->width,
+ st->codecpar->sample_aspect_ratio.den *
st->codecpar->height, INT_MAX);
Can these multiplications ever overflow? av_reduce_q might be a better
choice.
There is no av_reduce_q.
Nicolas George
2018-12-09 12:57:46 UTC
Permalink
Post by Paul B Mahol
Post by Paul B Mahol
+ if (st->codecpar->sample_aspect_ratio.num &&
st->codecpar->sample_aspect_ratio.den) {
+ av_reduce(&sc->aspect_ratio.num, &sc->aspect_ratio.den,
+ st->codecpar->sample_aspect_ratio.num *
st->codecpar->width,
+ st->codecpar->sample_aspect_ratio.den *
st->codecpar->height, INT_MAX);
There is no av_reduce_q.
But there are av_mul_q() and av_div_q(), that would make these
computations much more readable, and are protected from overflow.

Regards,
--
Nicolas George
Loading...