mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
spice: support streaming-video parameter
This adds a streaming-video=filter|all|off attribute. It is used to change the behavior of video stream detection in spice, the default is filter (the default for libvirt is not to specify it - the actual default is defined in libspice-server.so). Usage: <graphics type='spice' autoport='yes'> <streaming mode='off'/> </graphics> Tested with the above and with tests/qemuxml2argvtest. Signed-off-by: Alon Levy <alevy@redhat.com>
This commit is contained in:
parent
fcb0e8c227
commit
bb1c5423b9
@ -1798,6 +1798,7 @@ qemu-kvm -net nic,model=? /dev/null
|
|||||||
<channel name='main' mode='secure'/>
|
<channel name='main' mode='secure'/>
|
||||||
<channel name='record' mode='insecure'/>
|
<channel name='record' mode='insecure'/>
|
||||||
<image compression='auto_glz'/>
|
<image compression='auto_glz'/>
|
||||||
|
<streaming mode='filter'/>
|
||||||
</graphics></pre>
|
</graphics></pre>
|
||||||
<p>
|
<p>
|
||||||
Spice supports variable compression settings for audio,
|
Spice supports variable compression settings for audio,
|
||||||
@ -1816,6 +1817,12 @@ qemu-kvm -net nic,model=? /dev/null
|
|||||||
and <code>playback</code> for enabling audio stream
|
and <code>playback</code> for enabling audio stream
|
||||||
compression (accepts <code>on</code> or <code>off</code>).
|
compression (accepts <code>on</code> or <code>off</code>).
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
|
Streaming mode is set by the <code>streaming</code>
|
||||||
|
element, settings it's <code>mode</code> attribute to one
|
||||||
|
of <code>filter</code>, <code>all</code>
|
||||||
|
or <code>off</code>, <span class="since">since 0.9.2</span>.
|
||||||
|
</p>
|
||||||
</dd>
|
</dd>
|
||||||
<dt><code>"rdp"</code></dt>
|
<dt><code>"rdp"</code></dt>
|
||||||
<dd>
|
<dd>
|
||||||
|
@ -1334,6 +1334,18 @@
|
|||||||
<empty/>
|
<empty/>
|
||||||
</element>
|
</element>
|
||||||
</optional>
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<element name="streaming">
|
||||||
|
<attribute name="mode">
|
||||||
|
<choice>
|
||||||
|
<value>filter</value>
|
||||||
|
<value>all</value>
|
||||||
|
<value>off</value>
|
||||||
|
</choice>
|
||||||
|
</attribute>
|
||||||
|
<empty/>
|
||||||
|
</element>
|
||||||
|
</optional>
|
||||||
</interleave>
|
</interleave>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
|
@ -359,6 +359,13 @@ VIR_ENUM_IMPL(virDomainGraphicsSpicePlaybackCompression,
|
|||||||
"on",
|
"on",
|
||||||
"off");
|
"off");
|
||||||
|
|
||||||
|
VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode,
|
||||||
|
VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_LAST,
|
||||||
|
"default",
|
||||||
|
"filter",
|
||||||
|
"all",
|
||||||
|
"off");
|
||||||
|
|
||||||
VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST,
|
VIR_ENUM_IMPL(virDomainHostdevMode, VIR_DOMAIN_HOSTDEV_MODE_LAST,
|
||||||
"subsystem",
|
"subsystem",
|
||||||
"capabilities")
|
"capabilities")
|
||||||
@ -4168,6 +4175,26 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, int flags) {
|
|||||||
VIR_FREE(compression);
|
VIR_FREE(compression);
|
||||||
|
|
||||||
def->data.spice.playback = compressionVal;
|
def->data.spice.playback = compressionVal;
|
||||||
|
} else if (xmlStrEqual(cur->name, BAD_CAST "streaming")) {
|
||||||
|
const char *mode = virXMLPropString(cur, "mode");
|
||||||
|
int modeVal;
|
||||||
|
|
||||||
|
if (!mode) {
|
||||||
|
virDomainReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
|
_("spice streaming missing mode"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if ((modeVal =
|
||||||
|
virDomainGraphicsSpiceStreamingModeTypeFromString(mode)) <= 0) {
|
||||||
|
virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
|
_("unknown spice streaming mode"));
|
||||||
|
VIR_FREE(mode);
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
}
|
||||||
|
VIR_FREE(mode);
|
||||||
|
|
||||||
|
def->data.spice.streaming = modeVal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cur = cur->next;
|
cur = cur->next;
|
||||||
@ -8067,6 +8094,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
|
|||||||
if (def->data.spice.playback)
|
if (def->data.spice.playback)
|
||||||
virBufferAsprintf(buf, " <playback compression='%s'/>\n",
|
virBufferAsprintf(buf, " <playback compression='%s'/>\n",
|
||||||
virDomainGraphicsSpicePlaybackCompressionTypeToString(def->data.spice.playback));
|
virDomainGraphicsSpicePlaybackCompressionTypeToString(def->data.spice.playback));
|
||||||
|
if (def->data.spice.streaming)
|
||||||
|
virBufferAsprintf(buf, " <streaming mode='%s'/>\n",
|
||||||
|
virDomainGraphicsSpiceStreamingModeTypeToString(def->data.spice.streaming));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (children) {
|
if (children) {
|
||||||
|
@ -697,6 +697,15 @@ enum virDomainGraphicsSpicePlaybackCompression {
|
|||||||
VIR_DOMAIN_GRAPHICS_SPICE_PLAYBACK_COMPRESSION_LAST
|
VIR_DOMAIN_GRAPHICS_SPICE_PLAYBACK_COMPRESSION_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum virDomainGraphicsSpiceStreamingMode {
|
||||||
|
VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_DEFAULT = 0,
|
||||||
|
VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_FILTER,
|
||||||
|
VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_ALL,
|
||||||
|
VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_OFF,
|
||||||
|
|
||||||
|
VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_LAST
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct _virDomainGraphicsDef virDomainGraphicsDef;
|
typedef struct _virDomainGraphicsDef virDomainGraphicsDef;
|
||||||
typedef virDomainGraphicsDef *virDomainGraphicsDefPtr;
|
typedef virDomainGraphicsDef *virDomainGraphicsDefPtr;
|
||||||
struct _virDomainGraphicsDef {
|
struct _virDomainGraphicsDef {
|
||||||
@ -738,6 +747,7 @@ struct _virDomainGraphicsDef {
|
|||||||
int jpeg;
|
int jpeg;
|
||||||
int zlib;
|
int zlib;
|
||||||
int playback;
|
int playback;
|
||||||
|
int streaming;
|
||||||
} spice;
|
} spice;
|
||||||
} data;
|
} data;
|
||||||
};
|
};
|
||||||
@ -1506,6 +1516,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceImageCompression)
|
|||||||
VIR_ENUM_DECL(virDomainGraphicsSpiceJpegCompression)
|
VIR_ENUM_DECL(virDomainGraphicsSpiceJpegCompression)
|
||||||
VIR_ENUM_DECL(virDomainGraphicsSpiceZlibCompression)
|
VIR_ENUM_DECL(virDomainGraphicsSpiceZlibCompression)
|
||||||
VIR_ENUM_DECL(virDomainGraphicsSpicePlaybackCompression)
|
VIR_ENUM_DECL(virDomainGraphicsSpicePlaybackCompression)
|
||||||
|
VIR_ENUM_DECL(virDomainGraphicsSpiceStreamingMode)
|
||||||
/* from libvirt.h */
|
/* from libvirt.h */
|
||||||
VIR_ENUM_DECL(virDomainState)
|
VIR_ENUM_DECL(virDomainState)
|
||||||
VIR_ENUM_DECL(virDomainNostateReason)
|
VIR_ENUM_DECL(virDomainNostateReason)
|
||||||
|
@ -274,6 +274,8 @@ virDomainGraphicsSpiceJpegCompressionTypeFromString;
|
|||||||
virDomainGraphicsSpiceJpegCompressionTypeToString;
|
virDomainGraphicsSpiceJpegCompressionTypeToString;
|
||||||
virDomainGraphicsSpicePlaybackCompressionTypeFromString;
|
virDomainGraphicsSpicePlaybackCompressionTypeFromString;
|
||||||
virDomainGraphicsSpicePlaybackCompressionTypeToString;
|
virDomainGraphicsSpicePlaybackCompressionTypeToString;
|
||||||
|
virDomainGraphicsSpiceStreamingModeTypeFromString;
|
||||||
|
virDomainGraphicsSpiceStreamingModeTypeToString;
|
||||||
virDomainGraphicsSpiceZlibCompressionTypeFromString;
|
virDomainGraphicsSpiceZlibCompressionTypeFromString;
|
||||||
virDomainGraphicsSpiceZlibCompressionTypeToString;
|
virDomainGraphicsSpiceZlibCompressionTypeToString;
|
||||||
virDomainGraphicsTypeFromString;
|
virDomainGraphicsTypeFromString;
|
||||||
|
@ -4037,6 +4037,9 @@ qemuBuildCommandLine(virConnectPtr conn,
|
|||||||
if (def->graphics[0]->data.spice.playback)
|
if (def->graphics[0]->data.spice.playback)
|
||||||
virBufferAsprintf(&opt, ",playback-compression=%s",
|
virBufferAsprintf(&opt, ",playback-compression=%s",
|
||||||
virDomainGraphicsSpicePlaybackCompressionTypeToString(def->graphics[0]->data.spice.playback));
|
virDomainGraphicsSpicePlaybackCompressionTypeToString(def->graphics[0]->data.spice.playback));
|
||||||
|
if (def->graphics[0]->data.spice.streaming)
|
||||||
|
virBufferAsprintf(&opt, ",streaming-video=%s",
|
||||||
|
virDomainGraphicsSpiceStreamingModeTypeToString(def->graphics[0]->data.spice.streaming));
|
||||||
|
|
||||||
virCommandAddArg(cmd, "-spice");
|
virCommandAddArg(cmd, "-spice");
|
||||||
virCommandAddArgBuffer(cmd, &opt);
|
virCommandAddArgBuffer(cmd, &opt);
|
||||||
|
@ -4,6 +4,6 @@ unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda \
|
|||||||
/dev/HostVG/QEMUGuest1 -usb -spice port=5903,tls-port=5904,addr=127.0.0.1,\
|
/dev/HostVG/QEMUGuest1 -usb -spice port=5903,tls-port=5904,addr=127.0.0.1,\
|
||||||
x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs,\
|
x509-dir=/etc/pki/libvirt-spice,tls-channel=main,plaintext-channel=inputs,\
|
||||||
image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\
|
image-compression=auto_glz,jpeg-wan-compression=auto,zlib-glz-wan-compression=auto,\
|
||||||
playback-compression=on -vga \
|
playback-compression=on,streaming-video=filter -vga \
|
||||||
qxl -global qxl.vram_size=18874368 -device qxl,id=video1,vram_size=33554432,bus=pci.0,addr=0x4 \
|
qxl -global qxl.vram_size=18874368 -device qxl,id=video1,vram_size=33554432,bus=pci.0,addr=0x4 \
|
||||||
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
<jpeg compression='auto'/>
|
<jpeg compression='auto'/>
|
||||||
<zlib compression='auto'/>
|
<zlib compression='auto'/>
|
||||||
<playback compression='on'/>
|
<playback compression='on'/>
|
||||||
|
<streaming mode='filter'/>
|
||||||
</graphics>
|
</graphics>
|
||||||
<video>
|
<video>
|
||||||
<model type='qxl' vram='18432' heads='1'/>
|
<model type='qxl' vram='18432' heads='1'/>
|
||||||
|
Loading…
Reference in New Issue
Block a user