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 21#include "avstring.h" 22#include "mem.h" 23#include "spherical.h" 24 25AVSphericalMapping *av_spherical_alloc(size_t *size) 26{ 27 AVSphericalMapping *spherical = av_mallocz(sizeof(AVSphericalMapping)); 28 if (!spherical) 29 return NULL; 30 31 if (size) 32 *size = sizeof(*spherical); 33 34 return spherical; 35} 36 37void av_spherical_tile_bounds(const AVSphericalMapping *map, 38 size_t width, size_t height, 39 size_t *left, size_t *top, 40 size_t *right, size_t *bottom) 41{ 42 /* conversion from 0.32 coordinates to pixels */ 43 uint64_t orig_width = (uint64_t) width * UINT32_MAX / 44 (UINT32_MAX - map->bound_right - map->bound_left); 45 uint64_t orig_height = (uint64_t) height * UINT32_MAX / 46 (UINT32_MAX - map->bound_bottom - map->bound_top); 47 48 /* add a (UINT32_MAX - 1) to round up integer division */ 49 *left = (orig_width * map->bound_left + UINT32_MAX - 1) / UINT32_MAX; 50 *top = (orig_height * map->bound_top + UINT32_MAX - 1) / UINT32_MAX; 51 *right = orig_width - width - *left; 52 *bottom = orig_height - height - *top; 53} 54 55static const char *const spherical_projection_names[] = { 56 [AV_SPHERICAL_EQUIRECTANGULAR] = "equirectangular", 57 [AV_SPHERICAL_CUBEMAP] = "cubemap", 58 [AV_SPHERICAL_EQUIRECTANGULAR_TILE] = "tiled equirectangular", 59}; 60 61const char *av_spherical_projection_name(enum AVSphericalProjection projection) 62{ 63 if ((unsigned)projection >= FF_ARRAY_ELEMS(spherical_projection_names)) 64 return "unknown"; 65 66 return spherical_projection_names[projection]; 67} 68 69int av_spherical_from_name(const char *name) 70{ 71 int i; 72 73 for (i = 0; i < FF_ARRAY_ELEMS(spherical_projection_names); i++) { 74 if (av_strstart(name, spherical_projection_names[i], NULL)) 75 return i; 76 } 77 78 return -1; 79} 80