You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.7KB

  1. /*
  2. * Copyright (c) 2016 Vittorio Giovara <vittorio.giovara@gmail.com>
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include "avstring.h"
  21. #include "mem.h"
  22. #include "spherical.h"
  23. AVSphericalMapping *av_spherical_alloc(size_t *size)
  24. {
  25. AVSphericalMapping *spherical = av_mallocz(sizeof(AVSphericalMapping));
  26. if (!spherical)
  27. return NULL;
  28. if (size)
  29. *size = sizeof(*spherical);
  30. return spherical;
  31. }
  32. void av_spherical_tile_bounds(const AVSphericalMapping *map,
  33. size_t width, size_t height,
  34. size_t *left, size_t *top,
  35. size_t *right, size_t *bottom)
  36. {
  37. /* conversion from 0.32 coordinates to pixels */
  38. uint64_t orig_width = (uint64_t) width * UINT32_MAX /
  39. (UINT32_MAX - map->bound_right - map->bound_left);
  40. uint64_t orig_height = (uint64_t) height * UINT32_MAX /
  41. (UINT32_MAX - map->bound_bottom - map->bound_top);
  42. /* add a (UINT32_MAX - 1) to round up integer division */
  43. *left = (orig_width * map->bound_left + UINT32_MAX - 1) / UINT32_MAX;
  44. *top = (orig_height * map->bound_top + UINT32_MAX - 1) / UINT32_MAX;
  45. *right = orig_width - width - *left;
  46. *bottom = orig_height - height - *top;
  47. }
  48. static const char *const spherical_projection_names[] = {
  49. [AV_SPHERICAL_EQUIRECTANGULAR] = "equirectangular",
  50. [AV_SPHERICAL_CUBEMAP] = "cubemap",
  51. [AV_SPHERICAL_EQUIRECTANGULAR_TILE] = "tiled equirectangular",
  52. };
  53. const char *av_spherical_projection_name(enum AVSphericalProjection projection)
  54. {
  55. if ((unsigned)projection >= FF_ARRAY_ELEMS(spherical_projection_names))
  56. return "unknown";
  57. return spherical_projection_names[projection];
  58. }
  59. int av_spherical_from_name(const char *name)
  60. {
  61. int i;
  62. for (i = 0; i < FF_ARRAY_ELEMS(spherical_projection_names); i++) {
  63. if (av_strstart(name, spherical_projection_names[i], NULL))
  64. return i;
  65. }
  66. return -1;
  67. }