Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**********************************************************
  2.  * Copyright 2007-2014 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.