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

Reply via email to