94c1e23
From 09c6b1c1f17ad20c87a3bee7c4665bb6ef34a211 Mon Sep 17 00:00:00 2001
94c1e23
From: Hans de Goede <hdegoede@redhat.com>
94c1e23
Date: Wed, 22 Aug 2012 10:32:08 +0200
94c1e23
Subject: [PATCH 2/4] Setup vp8enc in a way suitable for realtime encoding
94c1e23
94c1e23
Note that upstream has nacked this patch wanting to fix it instead by
94c1e23
using a realtime vp8enc preset, and teaching vp8enc to automatically pick
94c1e23
a number of threads when threads == 0, see:
94c1e23
https://bugzilla.gnome.org/show_bug.cgi?id=678447
94c1e23
94c1e23
Although that would indeed be better, unfortunately code for neither exists
94c1e23
atm, so for now we carry this patch in Fedora, since it makes the difference
94c1e23
between making recordings in cheese working or not working.
94c1e23
94c1e23
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
94c1e23
---
94c1e23
 libcheese/cheese-camera.c | 26 +++++++++++++++++++++-----
94c1e23
 1 file changed, 21 insertions(+), 5 deletions(-)
94c1e23
94c1e23
diff --git a/libcheese/cheese-camera.c b/libcheese/cheese-camera.c
94c1e23
index af073f3..d41a669 100644
94c1e23
--- a/libcheese/cheese-camera.c
94c1e23
+++ b/libcheese/cheese-camera.c
7296858
@@ -32,6 +32,7 @@
7296858
 #include <clutter-gst/clutter-gst.h>
7296858
 #include <gst/gst.h>
7296858
 #include <X11/Xlib.h>
7296858
+#include <unistd.h>
7296858
 
7296858
 #include "cheese-camera.h"
7296858
 #include "cheese-camera-device.h"
94c1e23
@@ -444,6 +445,7 @@ cheese_camera_set_video_recording (CheeseCamera *camera, GError **error)
7296858
   CheeseCameraPrivate *priv = camera->priv;
7296858
   GstElement          *video_enc;
7296858
   GstElement          *mux;
7296858
+  int                 n_threads;
7296858
 
7296858
   g_return_if_fail (error == NULL || *error == NULL);
7296858
 
94c1e23
@@ -453,11 +455,18 @@ cheese_camera_set_video_recording (CheeseCamera *camera, GError **error)
7296858
     return;
7296858
   }
7296858
   g_object_set (priv->camerabin, "video-encoder", video_enc, NULL);
94c1e23
-  /* Use a preset, or set some reasonable defaults. */
94c1e23
-  if (!gst_preset_load_preset (GST_PRESET (video_enc), "Profile Realtime"))
94c1e23
-  {
94c1e23
-    g_object_set (G_OBJECT (video_enc), "max-latency", 1, "speed", 2, NULL);
94c1e23
-  }
7296858
+
7296858
+  /* Since we do realtime encoding setup the encoder for speed without
7296858
+     sacrificing too much quality */
94c1e23
+  g_object_set (G_OBJECT (video_enc), "max-latency", 1, NULL);
7296858
+  g_object_set (G_OBJECT (video_enc), "speed", 6, NULL);
7296858
+#ifdef _SC_NPROCESSORS_ONLN
7296858
+  n_threads = sysconf (_SC_NPROCESSORS_ONLN); /* includes hyper-threading */
7296858
+  n_threads = MIN (n_threads, 64);
7296858
+#else
7296858
+  n_threads = 3;
7296858
+#endif
7296858
+  g_object_set (G_OBJECT (video_enc), "threads", n_threads, NULL);
7296858
 
7296858
   if ((mux = gst_element_factory_make ("webmmux", "webmmux")) == NULL)
7296858
   {
94c1e23
@@ -692,6 +701,7 @@ cheese_camera_play (CheeseCamera *camera)
7296858
 {
7296858
   CheeseCameraPrivate *priv;
7296858
   CheeseCameraDevice *device;
7296858
+  GObject *video_enc;
7296858
   GstCaps *caps;
7296858
 
7296858
   g_return_if_fail (CHEESE_IS_CAMERA (camera));
94c1e23
@@ -714,6 +724,12 @@ cheese_camera_play (CheeseCamera *camera)
7296858
     g_signal_emit_by_name (priv->camerabin, "set-video-resolution-fps",
7296858
                            priv->current_format->width,
7296858
                            priv->current_format->height, 0, 1, 0);
7296858
+    if (priv->current_format->width >= 1280 &&
7296858
+        priv->current_format->height >= 720)
7296858
+    {
7296858
+      g_object_get (priv->camerabin, "video-encoder", &video_enc, NULL);
7296858
+      g_object_set (video_enc, "token-parts", 2, NULL);
7296858
+    }
7296858
   }
7296858
   gst_caps_unref (caps);
7296858
 
94c1e23
-- 
94c1e23
1.7.11.4
94c1e23