Make parameters configureable
Make the framerate, file extension and gstreamer pipeline used by the screencast recorder configureable using gconf. This patch does not change the defaults, it justs provides a way for the user to override them. https://bugzilla.gnome.org/show_bug.cgi?id=608995
This commit is contained in:
parent
8e759d7f32
commit
3e1b1d5789
@ -117,6 +117,53 @@
|
|||||||
</locale>
|
</locale>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
<schema>
|
||||||
|
<key>/schemas/desktop/gnome/shell/recorder/framerate</key>
|
||||||
|
<applyto>/desktop/gnome/shell/recorder/framerate</applyto>
|
||||||
|
<owner>gnome-shell</owner>
|
||||||
|
<type>int</type>
|
||||||
|
<default>15</default>
|
||||||
|
<locale name="C">
|
||||||
|
<short>Framerate used for recording screencasts.</short>
|
||||||
|
<long>
|
||||||
|
The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second.
|
||||||
|
</long>
|
||||||
|
</locale>
|
||||||
|
</schema>
|
||||||
|
|
||||||
|
<schema>
|
||||||
|
<key>/schemas/desktop/gnome/shell/recorder/pipeline</key>
|
||||||
|
<applyto>/desktop/gnome/shell/recorder/pipeline</applyto>
|
||||||
|
<owner>gnome-shell</owner>
|
||||||
|
<type>string</type>
|
||||||
|
<default></default>
|
||||||
|
<locale name="C">
|
||||||
|
<short>The gstreamer pipeline used to encode the screencast</short>
|
||||||
|
<long>
|
||||||
|
Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch.
|
||||||
|
The pipeline should have an unconnected sink pad where the recorded video is recorded. It will
|
||||||
|
normally have a unconnected source pad; output from that pad will be written into the output file.
|
||||||
|
However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar.
|
||||||
|
When unset or set to an empty value, the default pipeline will be used. This is currently 'videorate ! theoraenc ! oggmux' and records to Ogg Theora.
|
||||||
|
</long>
|
||||||
|
</locale>
|
||||||
|
</schema>
|
||||||
|
|
||||||
|
<schema>
|
||||||
|
<key>/schemas/desktop/gnome/shell/recorder/file_extension</key>
|
||||||
|
<applyto>/desktop/gnome/shell/recorder/file_extension</applyto>
|
||||||
|
<owner>gnome-shell</owner>
|
||||||
|
<type>string</type>
|
||||||
|
<default>ogg</default>
|
||||||
|
<locale name="C">
|
||||||
|
<short>File extension used for storing the screencast</short>
|
||||||
|
<long>
|
||||||
|
The filename for recorded screencasts will be a unique filename based on the current date, and use this extension.
|
||||||
|
It should be changed when recording to a different container format.
|
||||||
|
</long>
|
||||||
|
</locale>
|
||||||
|
</schema>
|
||||||
|
|
||||||
</schemalist>
|
</schemalist>
|
||||||
|
|
||||||
</gconfschemafile>
|
</gconfschemafile>
|
||||||
|
@ -134,6 +134,16 @@ function start() {
|
|||||||
if (recorder.is_recording()) {
|
if (recorder.is_recording()) {
|
||||||
recorder.pause();
|
recorder.pause();
|
||||||
} else {
|
} else {
|
||||||
|
//read the parameters from GConf always in case they have changed
|
||||||
|
let gconf = Shell.GConf.get_default();
|
||||||
|
recorder.set_framerate(gconf.get_int("recorder/framerate"));
|
||||||
|
recorder.set_filename("shell-%d%u-%c." + gconf.get_string("recorder/file_extension"));
|
||||||
|
let pipeline = gconf.get_string("recorder/pipeline");
|
||||||
|
if (!pipeline.match(/^\s*$/))
|
||||||
|
recorder.set_pipeline(pipeline);
|
||||||
|
else
|
||||||
|
recorder.set_pipeline(null);
|
||||||
|
|
||||||
recorder.record();
|
recorder.record();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -63,6 +63,7 @@ struct _ShellRecorder {
|
|||||||
|
|
||||||
gboolean have_pack_invert; /* True when GL_MESA_pack_invert is available */
|
gboolean have_pack_invert; /* True when GL_MESA_pack_invert is available */
|
||||||
|
|
||||||
|
int framerate;
|
||||||
char *pipeline_description;
|
char *pipeline_description;
|
||||||
char *filename;
|
char *filename;
|
||||||
gboolean filename_has_count; /* %c used: handle pausing differently */
|
gboolean filename_has_count; /* %c used: handle pausing differently */
|
||||||
@ -93,6 +94,8 @@ struct _RecorderPipeline
|
|||||||
|
|
||||||
static void recorder_set_stage (ShellRecorder *recorder,
|
static void recorder_set_stage (ShellRecorder *recorder,
|
||||||
ClutterStage *stage);
|
ClutterStage *stage);
|
||||||
|
static void recorder_set_framerate (ShellRecorder *recorder,
|
||||||
|
int framerate);
|
||||||
static void recorder_set_pipeline (ShellRecorder *recorder,
|
static void recorder_set_pipeline (ShellRecorder *recorder,
|
||||||
const char *pipeline);
|
const char *pipeline);
|
||||||
static void recorder_set_filename (ShellRecorder *recorder,
|
static void recorder_set_filename (ShellRecorder *recorder,
|
||||||
@ -104,6 +107,7 @@ static void recorder_pipeline_closed (RecorderPipeline *pipeline);
|
|||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_STAGE,
|
PROP_STAGE,
|
||||||
|
PROP_FRAMERATE,
|
||||||
PROP_PIPELINE,
|
PROP_PIPELINE,
|
||||||
PROP_FILENAME
|
PROP_FILENAME
|
||||||
};
|
};
|
||||||
@ -117,7 +121,7 @@ G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
|
|||||||
* as theora for a minimal size increase. This may be an artifact of the
|
* as theora for a minimal size increase. This may be an artifact of the
|
||||||
* encoding process.
|
* encoding process.
|
||||||
*/
|
*/
|
||||||
#define FRAMES_PER_SECOND 15
|
#define DEFAULT_FRAMES_PER_SECOND 15
|
||||||
|
|
||||||
/* The time (in milliseconds) between querying the server for the cursor
|
/* The time (in milliseconds) between querying the server for the cursor
|
||||||
* position.
|
* position.
|
||||||
@ -246,6 +250,7 @@ shell_recorder_init (ShellRecorder *recorder)
|
|||||||
recorder->memory_target = get_memory_target();
|
recorder->memory_target = get_memory_target();
|
||||||
|
|
||||||
recorder->state = RECORDER_STATE_CLOSED;
|
recorder->state = RECORDER_STATE_CLOSED;
|
||||||
|
recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -873,6 +878,21 @@ recorder_set_stage (ShellRecorder *recorder,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
recorder_set_framerate (ShellRecorder *recorder,
|
||||||
|
int framerate)
|
||||||
|
{
|
||||||
|
if (framerate == recorder->framerate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (recorder->current_pipeline)
|
||||||
|
shell_recorder_close (recorder);
|
||||||
|
|
||||||
|
recorder->framerate = framerate;
|
||||||
|
|
||||||
|
g_object_notify (G_OBJECT (recorder), "framerate");
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
recorder_set_pipeline (ShellRecorder *recorder,
|
recorder_set_pipeline (ShellRecorder *recorder,
|
||||||
const char *pipeline)
|
const char *pipeline)
|
||||||
@ -924,6 +944,9 @@ shell_recorder_set_property (GObject *object,
|
|||||||
case PROP_STAGE:
|
case PROP_STAGE:
|
||||||
recorder_set_stage (recorder, g_value_get_object (value));
|
recorder_set_stage (recorder, g_value_get_object (value));
|
||||||
break;
|
break;
|
||||||
|
case PROP_FRAMERATE:
|
||||||
|
recorder_set_framerate (recorder, g_value_get_int (value));
|
||||||
|
break;
|
||||||
case PROP_PIPELINE:
|
case PROP_PIPELINE:
|
||||||
recorder_set_pipeline (recorder, g_value_get_string (value));
|
recorder_set_pipeline (recorder, g_value_get_string (value));
|
||||||
break;
|
break;
|
||||||
@ -949,6 +972,9 @@ shell_recorder_get_property (GObject *object,
|
|||||||
case PROP_STAGE:
|
case PROP_STAGE:
|
||||||
g_value_set_object (value, G_OBJECT (recorder->stage));
|
g_value_set_object (value, G_OBJECT (recorder->stage));
|
||||||
break;
|
break;
|
||||||
|
case PROP_FRAMERATE:
|
||||||
|
g_value_set_int (value, recorder->framerate);
|
||||||
|
break;
|
||||||
case PROP_PIPELINE:
|
case PROP_PIPELINE:
|
||||||
g_value_set_string (value, recorder->pipeline_description);
|
g_value_set_string (value, recorder->pipeline_description);
|
||||||
break;
|
break;
|
||||||
@ -977,6 +1003,17 @@ shell_recorder_class_init (ShellRecorderClass *klass)
|
|||||||
"Stage to record",
|
"Stage to record",
|
||||||
CLUTTER_TYPE_STAGE,
|
CLUTTER_TYPE_STAGE,
|
||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_FRAMERATE,
|
||||||
|
g_param_spec_int ("framerate",
|
||||||
|
"Framerate",
|
||||||
|
"Framerate used for resulting video in frames-per-second",
|
||||||
|
0,
|
||||||
|
G_MAXINT,
|
||||||
|
DEFAULT_FRAMES_PER_SECOND,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class,
|
g_object_class_install_property (gobject_class,
|
||||||
PROP_PIPELINE,
|
PROP_PIPELINE,
|
||||||
g_param_spec_string ("pipeline",
|
g_param_spec_string ("pipeline",
|
||||||
@ -1018,7 +1055,7 @@ recorder_pipeline_set_caps (RecorderPipeline *pipeline)
|
|||||||
"blue_mask", G_TYPE_INT, 0x0000ff,
|
"blue_mask", G_TYPE_INT, 0x0000ff,
|
||||||
#endif
|
#endif
|
||||||
"endianness", G_TYPE_INT, G_BIG_ENDIAN,
|
"endianness", G_TYPE_INT, G_BIG_ENDIAN,
|
||||||
"framerate", GST_TYPE_FRACTION, FRAMES_PER_SECOND, 1,
|
"framerate", GST_TYPE_FRACTION, pipeline->recorder->framerate, 1,
|
||||||
"width", G_TYPE_INT, pipeline->recorder->stage_width,
|
"width", G_TYPE_INT, pipeline->recorder->stage_width,
|
||||||
"height", G_TYPE_INT, pipeline->recorder->stage_height,
|
"height", G_TYPE_INT, pipeline->recorder->stage_height,
|
||||||
NULL);
|
NULL);
|
||||||
@ -1523,6 +1560,24 @@ shell_recorder_new (ClutterStage *stage)
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shell_recorder_set_framerate:
|
||||||
|
* @recorder: the #ShellRecorder
|
||||||
|
* @framerate: Framerate used for resulting video in frames-per-second.
|
||||||
|
*
|
||||||
|
* Sets the number of frames per second we configure for the GStreamer pipeline.
|
||||||
|
*
|
||||||
|
* The default value is 15.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
shell_recorder_set_framerate (ShellRecorder *recorder,
|
||||||
|
int framerate)
|
||||||
|
{
|
||||||
|
g_return_if_fail (SHELL_IS_RECORDER (recorder));
|
||||||
|
|
||||||
|
recorder_set_framerate (recorder, framerate);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_recorder_set_filename:
|
* shell_recorder_set_filename:
|
||||||
* @recorder: the #ShellRecorder
|
* @recorder: the #ShellRecorder
|
||||||
|
@ -30,6 +30,8 @@ GType shell_recorder_get_type (void) G_GNUC_CONST;
|
|||||||
|
|
||||||
ShellRecorder *shell_recorder_new (ClutterStage *stage);
|
ShellRecorder *shell_recorder_new (ClutterStage *stage);
|
||||||
|
|
||||||
|
void shell_recorder_set_framerate (ShellRecorder *recorder,
|
||||||
|
int framerate);
|
||||||
void shell_recorder_set_filename (ShellRecorder *recorder,
|
void shell_recorder_set_filename (ShellRecorder *recorder,
|
||||||
const char *filename);
|
const char *filename);
|
||||||
void shell_recorder_set_pipeline (ShellRecorder *recorder,
|
void shell_recorder_set_pipeline (ShellRecorder *recorder,
|
||||||
|
Loading…
Reference in New Issue
Block a user