mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2026-08-07 21:03:10 +00:00
streaming: Add h264 support to the GStreamer video encoder
Signed-off-by: Francois Gouget <fgouget@codeweavers.com>
This commit is contained in:
parent
49036e6aae
commit
a21ec4e251
@ -79,6 +79,7 @@ if test "x$enable_gstreamer" != "xno"; then
|
||||
SPICE_CHECK_GSTREAMER_ELEMENTS($GST_INSPECT_1_0, [gst-plugins-base 1.0], [appsrc videoconvert appsink])
|
||||
SPICE_CHECK_GSTREAMER_ELEMENTS($GST_INSPECT_1_0, [gstreamer-libav 1.0], [avenc_mjpeg])
|
||||
SPICE_CHECK_GSTREAMER_ELEMENTS($GST_INSPECT_1_0, [gst-plugins-good 1.0], [vp8enc])
|
||||
SPICE_CHECK_GSTREAMER_ELEMENTS($GST_INSPECT_1_0, [gst-plugins-ugly 1.0], [x264enc])
|
||||
],
|
||||
[if test "x$enable_gstreamer" = "xyes"; then
|
||||
AC_MSG_ERROR([GStreamer 1.0 support requested but not found. You may set GSTREAMER_1_0_CFLAGS and GSTREAMER_1_0_LIBS to avoid the need to call pkg-config.])
|
||||
|
||||
@ -308,6 +308,15 @@ static gboolean create_pipeline(SpiceGstEncoder *encoder)
|
||||
gstenc = g_strdup_printf("vp8enc end-usage=cbr min-quantizer=10 error-resilient=default lag-in-frames=0 deadline=1 cpu-used=4");
|
||||
break;
|
||||
}
|
||||
case SPICE_VIDEO_CODEC_TYPE_H264:
|
||||
/* - Set tune and sliced-threads to ensure a zero-frame latency
|
||||
* - qp-min ensures the bitrate does not get needlessly high.
|
||||
* - Set speed-preset to get realtime speed.
|
||||
* - Set intra-refresh to get more uniform compressed frame sizes,
|
||||
* thus helping with streaming.
|
||||
*/
|
||||
gstenc = g_strdup("x264enc byte-stream=true aud=true qp-min=15 tune=4 sliced-threads=true speed-preset=ultrafast intra-refresh=true");
|
||||
break;
|
||||
default:
|
||||
/* gstreamer_encoder_new() should have rejected this codec type */
|
||||
spice_warning("unsupported codec type %d", encoder->base.codec_type);
|
||||
@ -378,6 +387,11 @@ static void set_gstenc_bitrate(SpiceGstEncoder *encoder)
|
||||
"target-bitrate", (gint)encoder->bit_rate,
|
||||
NULL);
|
||||
break;
|
||||
case SPICE_VIDEO_CODEC_TYPE_H264:
|
||||
g_object_set(G_OBJECT(encoder->gstenc),
|
||||
"bitrate", encoder->bit_rate / 1024,
|
||||
NULL);
|
||||
break;
|
||||
default:
|
||||
/* gstreamer_encoder_new() should have rejected this codec type */
|
||||
spice_warning("unsupported codec type %d", encoder->base.codec_type);
|
||||
@ -838,7 +852,8 @@ VideoEncoder *gstreamer_encoder_new(SpiceVideoCodecType codec_type,
|
||||
bitmap_unref_t bitmap_unref)
|
||||
{
|
||||
spice_return_val_if_fail(codec_type == SPICE_VIDEO_CODEC_TYPE_MJPEG ||
|
||||
codec_type == SPICE_VIDEO_CODEC_TYPE_VP8, NULL);
|
||||
codec_type == SPICE_VIDEO_CODEC_TYPE_VP8 ||
|
||||
codec_type == SPICE_VIDEO_CODEC_TYPE_H264, NULL);
|
||||
|
||||
GError *err = NULL;
|
||||
if (!gst_init_check(NULL, NULL, &err)) {
|
||||
|
||||
@ -3492,7 +3492,7 @@ err:
|
||||
}
|
||||
|
||||
static const char default_renderer[] = "sw";
|
||||
static const char default_video_codecs[] = "spice:mjpeg;gstreamer:mjpeg;gstreamer:vp8";
|
||||
static const char default_video_codecs[] = "spice:mjpeg;gstreamer:mjpeg;gstreamer:h264;gstreamer:vp8";
|
||||
|
||||
/* new interface */
|
||||
SPICE_GNUC_VISIBLE SpiceServer *spice_server_new(void)
|
||||
@ -3580,12 +3580,14 @@ static new_video_encoder_t video_encoder_procs[] = {
|
||||
static const EnumNames video_codec_names[] = {
|
||||
{SPICE_VIDEO_CODEC_TYPE_MJPEG, "mjpeg"},
|
||||
{SPICE_VIDEO_CODEC_TYPE_VP8, "vp8"},
|
||||
{SPICE_VIDEO_CODEC_TYPE_H264, "h264"},
|
||||
{0, NULL},
|
||||
};
|
||||
|
||||
static int video_codec_caps[] = {
|
||||
SPICE_DISPLAY_CAP_CODEC_MJPEG,
|
||||
SPICE_DISPLAY_CAP_CODEC_VP8,
|
||||
SPICE_DISPLAY_CAP_CODEC_H264,
|
||||
};
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user