mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 06:58:56 +00:00
validate: Don't override the target state of the scenario when receiving BUFFERING=100%
If the scenario handles the states and wants to stay in PAUSED, it's not a good idea to change the state to PLAYING when receiving BUFFERING=100%. This caused a race condition in varios seeking tests, most often in the dash scrub seeking test.
This commit is contained in:
parent
09c5283692
commit
403b236426
3 changed files with 49 additions and 4 deletions
|
@ -582,6 +582,7 @@ _pause_action_restore_playing (GstValidateScenario * scenario)
|
||||||
GST_STATE_CHANGE_FAILURE) {
|
GST_STATE_CHANGE_FAILURE) {
|
||||||
GST_VALIDATE_REPORT (scenario, STATE_CHANGE_FAILURE,
|
GST_VALIDATE_REPORT (scenario, STATE_CHANGE_FAILURE,
|
||||||
"Failed to set state to playing");
|
"Failed to set state to playing");
|
||||||
|
scenario->priv->target_state = GST_STATE_PLAYING;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -3202,6 +3203,20 @@ gst_validate_scenario_get_actions (GstValidateScenario * scenario)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_validate_scenario_get_target_state:
|
||||||
|
* @scenario: The scenario to retrieve the current target state for
|
||||||
|
*
|
||||||
|
* Get current target state from @scenario.
|
||||||
|
*
|
||||||
|
* Returns: Current target state.
|
||||||
|
*/
|
||||||
|
GstState
|
||||||
|
gst_validate_scenario_get_target_state (GstValidateScenario * scenario)
|
||||||
|
{
|
||||||
|
return scenario->priv->target_state;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
init_scenarios (void)
|
init_scenarios (void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -308,6 +308,9 @@ GstValidateExecuteActionReturn
|
||||||
gst_validate_execute_action (GstValidateActionType * action_type,
|
gst_validate_execute_action (GstValidateActionType * action_type,
|
||||||
GstValidateAction * action);
|
GstValidateAction * action);
|
||||||
|
|
||||||
|
GstState
|
||||||
|
gst_validate_scenario_get_target_state (GstValidateScenario *scenario);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_VALIDATE_SCENARIOS__ */
|
#endif /* __GST_VALIDATE_SCENARIOS__ */
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <gst/validate/gst-validate-scenario.h>
|
#include <gst/validate/gst-validate-scenario.h>
|
||||||
#include <gst/validate/gst-validate-utils.h>
|
#include <gst/validate/gst-validate-utils.h>
|
||||||
#include <gst/validate/media-descriptor-parser.h>
|
#include <gst/validate/media-descriptor-parser.h>
|
||||||
|
#include <gst/validate/gst-validate-bin-monitor.h>
|
||||||
|
|
||||||
#ifdef G_OS_UNIX
|
#ifdef G_OS_UNIX
|
||||||
#include <glib-unix.h>
|
#include <glib-unix.h>
|
||||||
|
@ -65,10 +66,18 @@ intr_handler (gpointer user_data)
|
||||||
}
|
}
|
||||||
#endif /* G_OS_UNIX */
|
#endif /* G_OS_UNIX */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GMainLoop *mainloop;
|
||||||
|
GstValidateMonitor *monitor;
|
||||||
|
} BusCallbackData;
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
bus_callback (GstBus * bus, GstMessage * message, gpointer data)
|
bus_callback (GstBus * bus, GstMessage * message, gpointer data)
|
||||||
{
|
{
|
||||||
GMainLoop *loop = data;
|
BusCallbackData *bus_callback_data = data;
|
||||||
|
GMainLoop *loop = bus_callback_data->mainloop;
|
||||||
|
GstValidateMonitor *monitor = bus_callback_data->monitor;
|
||||||
|
|
||||||
switch (GST_MESSAGE_TYPE (message)) {
|
switch (GST_MESSAGE_TYPE (message)) {
|
||||||
case GST_MESSAGE_ERROR:
|
case GST_MESSAGE_ERROR:
|
||||||
|
@ -135,6 +144,15 @@ bus_callback (GstBus * bus, GstMessage * message, gpointer data)
|
||||||
case GST_MESSAGE_BUFFERING:{
|
case GST_MESSAGE_BUFFERING:{
|
||||||
gint percent;
|
gint percent;
|
||||||
GstBufferingMode mode;
|
GstBufferingMode mode;
|
||||||
|
GstState target_state = GST_STATE_PLAYING;
|
||||||
|
gboolean monitor_handles_state;
|
||||||
|
|
||||||
|
g_object_get (monitor, "handles-states", &monitor_handles_state, NULL);
|
||||||
|
if (monitor_handles_state && GST_IS_VALIDATE_BIN_MONITOR (monitor)) {
|
||||||
|
target_state =
|
||||||
|
gst_validate_scenario_get_target_state (GST_VALIDATE_BIN_MONITOR
|
||||||
|
(monitor)->scenario);
|
||||||
|
}
|
||||||
|
|
||||||
if (!buffering) {
|
if (!buffering) {
|
||||||
g_print ("\n");
|
g_print ("\n");
|
||||||
|
@ -154,8 +172,13 @@ bus_callback (GstBus * bus, GstMessage * message, gpointer data)
|
||||||
/* a 100% message means buffering is done */
|
/* a 100% message means buffering is done */
|
||||||
if (buffering) {
|
if (buffering) {
|
||||||
buffering = FALSE;
|
buffering = FALSE;
|
||||||
g_print ("Done buffering, setting pipeline to PLAYING\n");
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
if (target_state == GST_STATE_PLAYING) {
|
||||||
|
g_print ("Done buffering, setting pipeline to PLAYING\n");
|
||||||
|
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||||
|
} else {
|
||||||
|
g_print ("Done buffering, staying in PAUSED\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* buffering... */
|
/* buffering... */
|
||||||
|
@ -411,6 +434,7 @@ main (int argc, gchar ** argv)
|
||||||
inspect_action_type = FALSE;
|
inspect_action_type = FALSE;
|
||||||
GstStateChangeReturn sret;
|
GstStateChangeReturn sret;
|
||||||
gchar *output_file = NULL;
|
gchar *output_file = NULL;
|
||||||
|
BusCallbackData bus_callback_data = { 0, };
|
||||||
|
|
||||||
#ifdef G_OS_UNIX
|
#ifdef G_OS_UNIX
|
||||||
guint signal_watch_id;
|
guint signal_watch_id;
|
||||||
|
@ -575,7 +599,10 @@ main (int argc, gchar ** argv)
|
||||||
mainloop = g_main_loop_new (NULL, FALSE);
|
mainloop = g_main_loop_new (NULL, FALSE);
|
||||||
bus = gst_element_get_bus (pipeline);
|
bus = gst_element_get_bus (pipeline);
|
||||||
gst_bus_add_signal_watch (bus);
|
gst_bus_add_signal_watch (bus);
|
||||||
g_signal_connect (bus, "message", (GCallback) bus_callback, mainloop);
|
bus_callback_data.mainloop = mainloop;
|
||||||
|
bus_callback_data.monitor = monitor;
|
||||||
|
g_signal_connect (bus, "message", (GCallback) bus_callback,
|
||||||
|
&bus_callback_data);
|
||||||
|
|
||||||
g_print ("Starting pipeline\n");
|
g_print ("Starting pipeline\n");
|
||||||
g_object_get (monitor, "handles-states", &monitor_handles_state, NULL);
|
g_object_get (monitor, "handles-states", &monitor_handles_state, NULL);
|
||||||
|
|
Loading…
Reference in a new issue