Update the fate test as needed.

Signed-off-by: Vittorio Giovara <vittorio.giov...@gmail.com>
---
Validate bounding rectangle in spec v2.
Use James' suggestion about UINT32_MAX.
Vittorio

 libavformat/mov.c            | 53 +++++++++++++++++++++++++++++++++++++++++++-
 tests/fate/mov.mak           |  2 +-
 tests/ref/fate/mov-spherical |  6 ++++-
 3 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 6d1b2b2..d727612 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3231,6 +3231,8 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
     MOVStreamContext *sc;
     int size;
     int32_t yaw, pitch, roll;
+    size_t l, t, r, b;
+    size_t padding = 0;
     uint32_t tag;
     enum AVSphericalProjection projection;
 
@@ -3292,9 +3294,25 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
     switch (tag) {
     case MKTAG('c','b','m','p'):
         projection = AV_SPHERICAL_CUBEMAP;
+        padding = avio_rb32(pb);
         break;
     case MKTAG('e','q','u','i'):
-        projection = AV_SPHERICAL_EQUIRECTANGULAR;
+        t = avio_rb32(pb);
+        b = avio_rb32(pb);
+        l = avio_rb32(pb);
+        r = avio_rb32(pb);
+
+        if (b >= UINT_MAX - t || r >= UINT_MAX - l) {
+            av_log(c->fc, AV_LOG_ERROR,
+                   "Invalid bounding rectangle coordinates "
+                   "%zu,%zu,%zu,%zu\n", l, t, r, b);
+            return AVERROR_INVALIDDATA;
+        }
+
+        if (l || t || r || b)
+            projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
+        else
+            projection = AV_SPHERICAL_EQUIRECTANGULAR;
         break;
     default:
         av_log(c->fc, AV_LOG_ERROR, "Unknown projection type\n");
@@ -3311,6 +3329,19 @@ static int mov_read_sv3d(MOVContext *c, AVIOContext *pb, 
MOVAtom atom)
     sc->spherical->pitch = pitch;
     sc->spherical->roll  = roll;
 
+    sc->spherical->padding = padding;
+
+    if (projection == AV_SPHERICAL_EQUIRECTANGULAR_TILE) {
+        /* conversion from 0.32 coordinates to pixels */
+        size_t orig_width  = (size_t) sc->width  * UINT32_MAX / (UINT32_MAX - 
r - l);
+        size_t orig_height = (size_t) sc->height * UINT32_MAX / (UINT32_MAX - 
b - t);
+
+        /* add a (UINT32_MAX - 1) to round up integer division */
+        sc->spherical->bound_left   = (orig_width  * l + UINT32_MAX - 1) / 
UINT32_MAX;
+        sc->spherical->bound_top    = (orig_height * t + UINT32_MAX - 1) / 
UINT32_MAX;
+        sc->spherical->bound_right  = orig_width  - sc->width  - 
sc->spherical->bound_left;
+        sc->spherical->bound_bottom = orig_height - sc->height - 
sc->spherical->bound_top;
+    }
     return 0;
 }
 
@@ -3369,6 +3400,26 @@ static int mov_parse_uuid_spherical(MOVStreamContext 
*sc, AVIOContext *pb, size_
         val = av_stristr(buffer, "<GSpherical:InitialViewRollDegrees>");
         if (val)
             sc->spherical->roll = strtol(val, NULL, 10) * (1 << 16);
+
+        /* tiling */
+        val = av_stristr(buffer, "<GSpherical:CroppedAreaLeftPixels>");
+        if (val)
+            sc->spherical->bound_left = strtol(val, NULL, 10);
+        val = av_stristr(buffer, "<GSpherical:CroppedAreaTopPixels>");
+        if (val)
+            sc->spherical->bound_top = strtol(val, NULL, 10);
+        val = av_stristr(buffer, "<GSpherical:CroppedAreaImageWidthPixels>");
+        if (val)
+            sc->spherical->bound_right =
+                sc->width - sc->spherical->bound_left - strtol(val, NULL, 10);
+        val = av_stristr(buffer, "<GSpherical:CroppedAreaImageHeightPixels>");
+        if (val)
+            sc->spherical->bound_bottom =
+                sc->height - sc->spherical->bound_top - strtol(val, NULL, 10);
+
+        if (sc->spherical->bound_left || sc->spherical->bound_top ||
+            sc->spherical->bound_right || sc->spherical->bound_bottom)
+            sc->spherical->projection = AV_SPHERICAL_EQUIRECTANGULAR_TILE;
     }
 
 out:
diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak
index 57cbb1c..9d64fd3 100644
--- a/tests/fate/mov.mak
+++ b/tests/fate/mov.mak
@@ -11,7 +11,7 @@ FATE_MOV += fate-mov-sar
 fate-mov-sar: CMD = probestream sample_aspect_ratio 
$(TARGET_SAMPLES)/mov/displaymatrix.mov
 
 FATE_MOV += fate-mov-spherical
-fate-mov-spherical: CMD = probestream projection,yaw,pitch,roll 
$(TARGET_SAMPLES)/mov/spherical.mov
+fate-mov-spherical: CMD = probestream 
projection,yaw,pitch,roll,left,top,right,bottom 
$(TARGET_SAMPLES)/mov/spherical.mov
 
 FATE_MOV += fate-mov-stereo3d
 fate-mov-stereo3d: CMD = probestream type $(TARGET_SAMPLES)/mov/spherical.mov
diff --git a/tests/ref/fate/mov-spherical b/tests/ref/fate/mov-spherical
index 760ae88..a3f8cdf 100644
--- a/tests/ref/fate/mov-spherical
+++ b/tests/ref/fate/mov-spherical
@@ -1,4 +1,8 @@
-equirectangular
+tiled equirectangular
+148
+73
+147
+72
 45
 30
 15
-- 
2.10.0

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to