Quoting Vittorio Giovara (2017-02-10 22:08:10)
> 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);
Shouldn't these check that the result is sane?
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel