| @@ -0,0 +1,164 @@ |
| | 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 | av_tdrdi_get_display(AV3DReferenceDisplaysInfo *tdrdi, unsigned int idx) |
| | 146 | { |
| | 147 | av_assert0(idx < tdrdi->num_ref_displays); |
| | 148 | return (AV3DReferenceDisplay *)((uint8_t *)tdrdi + tdrdi->entries_offset + |
| | 149 | 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 */ |