Update the fate test as needed.
---
libavformat/mov.c | 46 +++++++++++++++++++++++++++++++++++++++++++-
tests/fate/mov.mak | 2 +-
tests/ref/fate/mov-spherical | 6 +++++-
3 files changed, 51 insertions(+), 3 deletions(-)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 4a6f9c0..bc35677 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,17 @@ 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 (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 +3321,20 @@ 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 */
+ uint32_t max_coord = (uint32_t) -1;
+ size_t orig_width = (size_t) sc->width * max_coord / (max_coord - r
- l);
+ size_t orig_height = (size_t) sc->height * max_coord / (max_coord - b
- t);
+
+ /* add a (max_coord - 1) to round up integer division */
+ sc->spherical->left_bound = (orig_width * l + max_coord - 1) /
max_coord;
+ sc->spherical->top_bound = (orig_height * t + max_coord - 1) /
max_coord;
+ sc->spherical->right_bound = orig_width - sc->width -
sc->spherical->left_bound;
+ sc->spherical->bottom_bound = orig_height - sc->height -
sc->spherical->top_bound;
+ }
return 0;
}
@@ -3369,6 +3393,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->left_bound = strtol(val, NULL, 10);
+ val = av_stristr(buffer, "<GSpherical:CroppedAreaTopPixels>");
+ if (val)
+ sc->spherical->top_bound = strtol(val, NULL, 10);
+ val = av_stristr(buffer, "<GSpherical:CroppedAreaImageWidthPixels>");
+ if (val)
+ sc->spherical->right_bound =
+ sc->width - sc->spherical->left_bound - strtol(val, NULL, 10);
+ val = av_stristr(buffer, "<GSpherical:CroppedAreaImageHeightPixels>");
+ if (val)
+ sc->spherical->bottom_bound =
+ sc->height - sc->spherical->top_bound - strtol(val, NULL, 10);
+
+ if (sc->spherical->left_bound || sc->spherical->top_bound ||
+ sc->spherical->right_bound || sc->spherical->bottom_bound)
+ 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
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel