1 /********************************************************** 2 * Copyright 2007-2015 VMware, Inc. All rights reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person 5 * obtaining a copy of this software and associated documentation 6 * files (the "Software"), to deal in the Software without 7 * restriction, including without limitation the rights to use, copy, 8 * modify, merge, publish, distribute, sublicense, and/or sell copies 9 * of the Software, and to permit persons to whom the Software is 10 * furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be 13 * included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 * 24 **********************************************************/ 25 26 /* 27 * svga_overlay.h -- 28 * 29 * Definitions for video-overlay support. 30 */ 31 32 #ifndef _SVGA_OVERLAY_H_ 33 #define _SVGA_OVERLAY_H_ 34 35 #include "svga_reg.h" 36 37 /* 38 * Video formats we support 39 */ 40 41 #define VMWARE_FOURCC_YV12 0x32315659 /* 'Y' 'V' '1' '2' */ 42 #define VMWARE_FOURCC_YUY2 0x32595559 /* 'Y' 'U' 'Y' '2' */ 43 #define VMWARE_FOURCC_UYVY 0x59565955 /* 'U' 'Y' 'V' 'Y' */ 44 45 typedef enum { 46 SVGA_OVERLAY_FORMAT_INVALID = 0, 47 SVGA_OVERLAY_FORMAT_YV12 = VMWARE_FOURCC_YV12, 48 SVGA_OVERLAY_FORMAT_YUY2 = VMWARE_FOURCC_YUY2, 49 SVGA_OVERLAY_FORMAT_UYVY = VMWARE_FOURCC_UYVY, 50 } SVGAOverlayFormat; 51 52 #define SVGA_VIDEO_COLORKEY_MASK 0x00ffffff 53 54 #define SVGA_ESCAPE_VMWARE_VIDEO 0x00020000 55 56 #define SVGA_ESCAPE_VMWARE_VIDEO_SET_REGS 0x00020001 57 /* FIFO escape layout: 58 * Type, Stream Id, (Register Id, Value) pairs */ 59 60 #define SVGA_ESCAPE_VMWARE_VIDEO_FLUSH 0x00020002 61 /* FIFO escape layout: 62 * Type, Stream Id */ 63 64 typedef 65 struct SVGAEscapeVideoSetRegs { 66 struct { 67 uint32 cmdType; 68 uint32 streamId; 69 } header; 70 71 /* May include zero or more items. */ 72 struct { 73 uint32 registerId; 74 uint32 value; 75 } items[1]; 76 } SVGAEscapeVideoSetRegs; 77 78 typedef 79 struct SVGAEscapeVideoFlush { 80 uint32 cmdType; 81 uint32 streamId; 82 } SVGAEscapeVideoFlush; 83 84 85 /* 86 * Struct definitions for the video overlay commands built on 87 * SVGAFifoCmdEscape. 88 */ 89 typedef 90 struct { 91 uint32 command; 92 uint32 overlay; 93 } SVGAFifoEscapeCmdVideoBase; 94 95 typedef 96 struct { 97 SVGAFifoEscapeCmdVideoBase videoCmd; 98 } SVGAFifoEscapeCmdVideoFlush; 99 100 typedef 101 struct { 102 SVGAFifoEscapeCmdVideoBase videoCmd; 103 struct { 104 uint32 regId; 105 uint32 value; 106 } items[1]; 107 } SVGAFifoEscapeCmdVideoSetRegs; 108 109 typedef 110 struct { 111 SVGAFifoEscapeCmdVideoBase videoCmd; 112 struct { 113 uint32 regId; 114 uint32 value; 115 } items[SVGA_VIDEO_NUM_REGS]; 116 } SVGAFifoEscapeCmdVideoSetAllRegs; 117 118 119 /* 120 *---------------------------------------------------------------------- 121 * 122 * VMwareVideoGetAttributes -- 123 * 124 * Computes the size, pitches and offsets for YUV frames. 125 * 126 * Results: 127 * TRUE on success; otherwise FALSE on failure. 128 * 129 * Side effects: 130 * Pitches and offsets for the given YUV frame are put in 'pitches' 131 * and 'offsets' respectively. They are both optional though. 132 * 133 *---------------------------------------------------------------------- 134 */ 135 136 static inline bool 137 VMwareVideoGetAttributes(const SVGAOverlayFormat format, /* IN */ 138 uint32 *width, /* IN / OUT */ 139 uint32 *height, /* IN / OUT */ 140 uint32 *size, /* OUT */ 141 uint32 *pitches, /* OUT (optional) */ 142 uint32 *offsets) /* OUT (optional) */ 143 { 144 int tmp; 145 146 *width = (*width + 1) & ~1; 147 148 if (offsets) { 149 offsets[0] = 0; 150 } 151 152 switch (format) { 153 case VMWARE_FOURCC_YV12: 154 *height = (*height + 1) & ~1; 155 *size = (*width) * (*height); 156 157 if (pitches) { 158 pitches[0] = *width; 159 } 160 161 if (offsets) { 162 offsets[1] = *size; 163 } 164 165 tmp = *width >> 1; 166 167 if (pitches) { 168 pitches[1] = pitches[2] = tmp; 169 } 170 171 tmp *= (*height >> 1); 172 *size += tmp; 173 174 if (offsets) { 175 offsets[2] = *size; 176 } 177 178 *size += tmp; 179 break; 180 181 case VMWARE_FOURCC_YUY2: 182 case VMWARE_FOURCC_UYVY: 183 *size = *width * 2; 184 185 if (pitches) { 186 pitches[0] = *size; 187 } 188 189 *size *= *height; 190 break; 191 192 default: 193 return false; 194 } 195 196 return true; 197 } 198 199 #endif /* _SVGA_OVERLAY_H_ */ 200