1/* 2 * Copyright (c) 2013 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#ifndef AVUTIL_STEREO3D_H 22#define AVUTIL_STEREO3D_H 23 24#include <stdint.h> 25 26#include "frame.h" 27 28/** 29 * List of possible 3D Types 30 */ 31enum AVStereo3DType { 32 /** 33 * Video is not stereoscopic (and metadata has to be there). 34 */ 35 AV_STEREO3D_2D, 36 37 /** 38 * Views are next to each other. 39 * 40 * LLLLRRRR 41 * LLLLRRRR 42 * LLLLRRRR 43 * ... 44 */ 45 AV_STEREO3D_SIDEBYSIDE, 46 47 /** 48 * Views are on top of each other. 49 * 50 * LLLLLLLL 51 * LLLLLLLL 52 * RRRRRRRR 53 * RRRRRRRR 54 */ 55 AV_STEREO3D_TOPBOTTOM, 56 57 /** 58 * Views are alternated temporally. 59 * 60 * frame0 frame1 frame2 ... 61 * LLLLLLLL RRRRRRRR LLLLLLLL 62 * LLLLLLLL RRRRRRRR LLLLLLLL 63 * LLLLLLLL RRRRRRRR LLLLLLLL 64 * ... ... ... 65 */ 66 AV_STEREO3D_FRAMESEQUENCE, 67 68 /** 69 * Views are packed in a checkerboard-like structure per pixel. 70 * 71 * LRLRLRLR 72 * RLRLRLRL 73 * LRLRLRLR 74 * ... 75 */ 76 AV_STEREO3D_CHECKERBOARD, 77 78 /** 79 * Views are next to each other, but when upscaling 80 * apply a checkerboard pattern. 81 * 82 * LLLLRRRR L L L L R R R R 83 * LLLLRRRR => L L L L R R R R 84 * LLLLRRRR L L L L R R R R 85 * LLLLRRRR L L L L R R R R 86 */ 87 AV_STEREO3D_SIDEBYSIDE_QUINCUNX, 88 89 /** 90 * Views are packed per line, as if interlaced. 91 * 92 * LLLLLLLL 93 * RRRRRRRR 94 * LLLLLLLL 95 * ... 96 */ 97 AV_STEREO3D_LINES, 98 99 /** 100 * Views are packed per column. 101 * 102 * LRLRLRLR 103 * LRLRLRLR 104 * LRLRLRLR 105 * ... 106 */ 107 AV_STEREO3D_COLUMNS, 108}; 109 110 111/** 112 * Inverted views, Right/Bottom represents the left view. 113 */ 114#define AV_STEREO3D_FLAG_INVERT (1 << 0) 115 116/** 117 * Stereo 3D type: this structure describes how two videos are packed 118 * within a single video surface, with additional information as needed. 119 * 120 * @note The struct must be allocated with av_stereo3d_alloc() and 121 * its size is not a part of the public ABI. 122 */ 123typedef struct AVStereo3D { 124 /** 125 * How views are packed within the video. 126 */ 127 enum AVStereo3DType type; 128 129 /** 130 * Additional information about the frame packing. 131 */ 132 int flags; 133} AVStereo3D; 134 135/** 136 * Allocate an AVStereo3D structure and set its fields to default values. 137 * The resulting struct can be freed using av_freep(). 138 * 139 * @return An AVStereo3D filled with default values or NULL on failure. 140 */ 141AVStereo3D *av_stereo3d_alloc(void); 142 143/** 144 * Allocate a complete AVFrameSideData and add it to the frame. 145 * 146 * @param frame The frame which side data is added to. 147 * 148 * @return The AVStereo3D structure to be filled by caller. 149 */ 150AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); 151 152#endif /* AVUTIL_STEREO3D_H */ 153