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

Reply via email to