Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * This file is part of FFmpeg. | ||
3 | * | ||
4 | * FFmpeg is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU Lesser General Public | ||
6 | * License as published by the Free Software Foundation; either | ||
7 | * version 2.1 of the License, or (at your option) any later version. | ||
8 | * | ||
9 | * FFmpeg is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | * Lesser General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU Lesser General Public | ||
15 | * License along with FFmpeg; if not, write to the Free Software | ||
16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
17 | */ | ||
18 | |||
19 | /** | ||
20 | * @file | ||
21 | * @ingroup lavu_video_3d_reference_displays_info | ||
22 | * Spherical video | ||
23 | */ | ||
24 | |||
25 | #ifndef AVUTIL_TDRDI_H | ||
26 | #define AVUTIL_TDRDI_H | ||
27 | |||
28 | #include <stddef.h> | ||
29 | #include <stdint.h> | ||
30 | |||
31 | #include "libavutil/avassert.h" | ||
32 | |||
33 | /** | ||
34 | * @defgroup lavu_video_3d_reference_displays_info 3D Reference Displays Information | ||
35 | * @ingroup lavu_video | ||
36 | * | ||
37 | * The 3D Reference Displays Information describes information about the reference display | ||
38 | * width(s) and reference viewing distance(s) as well as information about the corresponding | ||
39 | * reference stereo pair(s). | ||
40 | * @{ | ||
41 | */ | ||
42 | |||
43 | #define AV_TDRDI_MAX_NUM_REF_DISPLAY 32 | ||
44 | |||
45 | /** | ||
46 | * This structure describes information about the reference display width(s) and reference | ||
47 | * viewing distance(s) as well as information about the corresponding reference stereo pair(s). | ||
48 | * See section G.14.3.2.3 of ITU-T H.265 for more information. | ||
49 | * | ||
50 | * @note The struct must be allocated with av_tdrdi_alloc() and | ||
51 | * its size is not a part of the public ABI. | ||
52 | */ | ||
53 | typedef struct AV3DReferenceDisplaysInfo { | ||
54 | /** | ||
55 | * The exponent of the maximum allowable truncation error for | ||
56 | * {exponent,mantissa}_ref_display_width as given by 2<sup>(-prec_ref_display_width)</sup>. | ||
57 | */ | ||
58 | uint8_t prec_ref_display_width; | ||
59 | |||
60 | /** | ||
61 | * A flag to indicate the presence of reference viewing distance. | ||
62 | * If false, the values of prec_ref_viewing_dist, exponent_ref_viewing_distance, | ||
63 | * and mantissa_ref_viewing_distance are undefined. | ||
64 | */ | ||
65 | uint8_t ref_viewing_distance_flag; | ||
66 | |||
67 | /** | ||
68 | * The exponent of the maximum allowable truncation error for | ||
69 | * {exponent,mantissa}_ref_viewing_distance as given by 2<sup>^(-prec_ref_viewing_dist)</sup>. | ||
70 | * The value of prec_ref_viewing_dist shall be in the range of 0 to 31, inclusive. | ||
71 | */ | ||
72 | uint8_t prec_ref_viewing_dist; | ||
73 | |||
74 | /** | ||
75 | * The number of reference displays that are signalled in this struct. | ||
76 | * Allowed range is 1 to 32, inclusive. | ||
77 | */ | ||
78 | uint8_t num_ref_displays; | ||
79 | |||
80 | /** | ||
81 | * Offset in bytes from the beginning of this structure at which the array | ||
82 | * of reference displays starts. | ||
83 | */ | ||
84 | size_t entries_offset; | ||
85 | |||
86 | /** | ||
87 | * Size of each entry in bytes. May not match sizeof(AV3DReferenceDisplay). | ||
88 | */ | ||
89 | size_t entry_size; | ||
90 | } AV3DReferenceDisplaysInfo; | ||
91 | |||
92 | /** | ||
93 | * Data structure for single deference display information. | ||
94 | * It is allocated as a part of AV3DReferenceDisplaysInfo and should be retrieved with | ||
95 | * av_tdrdi_get_display(). | ||
96 | * | ||
97 | * sizeof(AV3DReferenceDisplay) is not a part of the ABI and new fields may be | ||
98 | * added to it. | ||
99 | */ | ||
100 | typedef struct AV3DReferenceDisplay { | ||
101 | /** | ||
102 | * The ViewId of the left view of a stereo pair corresponding to the n-th reference display. | ||
103 | */ | ||
104 | uint16_t left_view_id; | ||
105 | |||
106 | /** | ||
107 | * The ViewId of the left view of a stereo pair corresponding to the n-th reference display. | ||
108 | */ | ||
109 | uint16_t right_view_id; | ||
110 | |||
111 | /** | ||
112 | * The exponent part of the reference display width of the n-th reference display. | ||
113 | */ | ||
114 | uint8_t exponent_ref_display_width; | ||
115 | |||
116 | /** | ||
117 | * The mantissa part of the reference display width of the n-th reference display. | ||
118 | */ | ||
119 | uint8_t mantissa_ref_display_width; | ||
120 | |||
121 | /** | ||
122 | * Tthe exponent part of the reference viewing distance of the n-th reference display. | ||
123 | */ | ||
124 | uint8_t exponent_ref_viewing_distance; | ||
125 | |||
126 | /** | ||
127 | * The mantissa part of the reference viewing distance of the n-th reference display. | ||
128 | */ | ||
129 | uint8_t mantissa_ref_viewing_distance; | ||
130 | |||
131 | /** | ||
132 | * An array of flags to indicates that the information about additional horizontal shift of | ||
133 | * the left and right views for the n-th reference display is present. | ||
134 | */ | ||
135 | uint8_t additional_shift_present_flag; | ||
136 | |||
137 | /** | ||
138 | * The recommended additional horizontal shift for a stereo pair corresponding to the n-th | ||
139 | * reference baseline and the n-th reference display. | ||
140 | */ | ||
141 | int16_t num_sample_shift; | ||
142 | } AV3DReferenceDisplay; | ||
143 | |||
144 | static av_always_inline AV3DReferenceDisplay* | ||
145 | 4 | av_tdrdi_get_display(AV3DReferenceDisplaysInfo *tdrdi, unsigned int idx) | |
146 | { | ||
147 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | av_assert0(idx < tdrdi->num_ref_displays); |
148 | 8 | return (AV3DReferenceDisplay *)((uint8_t *)tdrdi + tdrdi->entries_offset + | |
149 | 4 | idx * tdrdi->entry_size); | |
150 | } | ||
151 | |||
152 | /** | ||
153 | * Allocate a AV3DReferenceDisplaysInfo structure and initialize its fields to default | ||
154 | * values. | ||
155 | * | ||
156 | * @return the newly allocated struct or NULL on failure | ||
157 | */ | ||
158 | AV3DReferenceDisplaysInfo *av_tdrdi_alloc(unsigned int nb_displays, size_t *size); | ||
159 | |||
160 | /** | ||
161 | * @} | ||
162 | */ | ||
163 | |||
164 | #endif /* AVUTIL_TDRDI_H */ | ||
165 |