| 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 | * The 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 |