FFmpeg  4.4
spherical.c
Go to the documentation of this file.
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 
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 
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 
55 static 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 
62 {
63  if ((unsigned)projection >= FF_ARRAY_ELEMS(spherical_projection_names))
64  return "unknown";
65 
66  return spherical_projection_names[projection];
67 }
68 
69 int av_spherical_from_name(const char *name)
70 {
71  int i;
72 
73  for (i = 0; i < FF_ARRAY_ELEMS(spherical_projection_names); i++) {
75  return i;
76  }
77 
78  return -1;
79 }
#define NULL
Definition: coverity.c:32
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
Definition: avstring.c:34
int av_spherical_from_name(const char *name)
Get the AVSphericalProjection form a human-readable name.
Definition: spherical.c:69
AVSphericalProjection
Projection of the video surface(s) on a sphere.
Definition: spherical.h:51
const char * av_spherical_projection_name(enum AVSphericalProjection projection)
Provide a human-readable name of a given AVSphericalProjection.
Definition: spherical.c:61
void av_spherical_tile_bounds(const AVSphericalMapping *map, size_t width, size_t height, size_t *left, size_t *top, size_t *right, size_t *bottom)
Convert the bounding fields from an AVSphericalVideo from 0.32 fixed point to pixels.
Definition: spherical.c:37
AVSphericalMapping * av_spherical_alloc(size_t *size)
Allocate a AVSphericalVideo structure and initialize its fields to default values.
Definition: spherical.c:25
@ AV_SPHERICAL_EQUIRECTANGULAR
Video represents a sphere mapped on a flat surface using equirectangular projection.
Definition: spherical.h:56
@ AV_SPHERICAL_EQUIRECTANGULAR_TILE
Video represents a portion of a sphere mapped on a flat surface using equirectangular projection.
Definition: spherical.h:72
@ AV_SPHERICAL_CUBEMAP
Video frame is split into 6 faces of a cube, and arranged on a 3x2 layout.
Definition: spherical.h:65
const VDPAUPixFmtMap * map
int i
Definition: input.c:407
Memory handling functions.
const char * name
Definition: qsvenc.c:46
#define FF_ARRAY_ELEMS(a)
static const char *const spherical_projection_names[]
Definition: spherical.c:55
Spherical video.
This structure describes how to handle spherical videos, outlining information about projection,...
Definition: spherical.h:82
#define height
#define width
int size