On Wed, Feb 15, 2017 at 2:46 AM, Anton Khirnov <an...@khirnov.net> wrote: > 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?
yolo? Spec v1 has no limits, while v2 has checks on the bottom and right bounds only, like projection_bounds_bottom must be less than 0xFFFFFFFF - projection_bounds_top Given that they are expressed in size_t and that users can use it only for additions I'm unsure how to properly validate these fields. -- Vittorio _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel