Skip to content

GitLab

  • Menu
Projects Groups Snippets
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • gst-plugins-bad gst-plugins-bad
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 985
    • Issues 985
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 132
    • Merge requests 132
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • GStreamer
  • gst-plugins-badgst-plugins-bad
  • Issues
  • #303

Closed
Open
Created Sep 25, 2015 by Bugzilla Migration User@bugzilla-migration

decklinkvideosrc: video fails to restart in ntsp-p mode

Submitted by Jeff

Link to original bug (#755642)

Description

Created attachment 312162
log output from application

The pipeline fails to start when the decklinkvideosrc mode is set to ntsp-p. Code to reproduce

#include <gst/gst.h>
#include <glib.h>

static gboolean
bus_call (GstBus *bus,
GstMessage *msg,
gpointer data)
{
GMainLoop *loop = (GMainLoop *) data;

switch (GST_MESSAGE_TYPE (msg)) {

case GST_MESSAGE_EOS:  
  g_print ("End of stream\n");  
  g_main_loop_quit (loop);  
  break;  

case GST_MESSAGE_ERROR: {  
  gchar  *debug;  
  GError *error;  

  gst_message_parse_error (msg, &error, &debug);  
  g_free (debug);  

  g_printerr ("Error: %s\n", error->message);  
  g_error_free (error);  

  g_main_loop_quit (loop);  
  break;  
}  
default:  
  break;  

}

return TRUE;
}

void printStateChange(GstStateChangeReturn value) {
switch(value) {
case GST_STATE_CHANGE_FAILURE:
g_print("GST_STATE_CHANGE_FAILURE\n");
break;
case GST_STATE_CHANGE_SUCCESS:
g_print("GST_STATE_CHANGE_SUCCESS\n");
break;
case GST_STATE_CHANGE_ASYNC:
g_print("GST_STATE_CHANGE_ASYNC\n");
break;
case GST_STATE_CHANGE_NO_PREROLL:
g_print("GST_STATE_CHANGE_NO_PREROLL\n");
break;
default:
g_print("Unknown state\n");
break;

  return;  

}
}

GstStateChangeReturn handleAsync(GstElement *element) {
GstState *currentState = NULL, *pendingState = NULL;
GstClockTime timeout = GST_CLOCK_TIME_NONE;
GstStateChangeReturn result;

g_print("handeling state\n");
result = gst_element_get_state(element, currentState, pendingState, timeout);
printStateChange(result);

return result;
}

int
main (int argc,
char *argv[])
{
GMainLoop *loop;

GstElement *pipeline, *source, *conv, *sink;
GstBus *bus;
guint bus_watch_id;

GstStateChangeReturn result;

gst_init (&argc, &argv);

loop = g_main_loop_new (NULL, FALSE);

pipeline = gst_pipeline_new ("test");
source = gst_element_factory_make ("decklinkvideosrc", "source");
conv = gst_element_factory_make ("autovideoconvert", "converter");
sink = gst_element_factory_make ("xvimagesink", "sink");

if (!pipeline || !source || !conv || !sink) {
g_printerr ("One element could not be created. Exiting.\n");
return -1;
}

// gst_util_set_object_arg (G_OBJECT(source), "mode", "auto");
gst_util_set_object_arg (G_OBJECT(source), "mode", "ntsc-p");
gst_util_set_object_arg (G_OBJECT(source), "connection", "hdmi");

bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
gst_object_unref (bus);

gst_bin_add_many (GST_BIN (pipeline), source, conv, sink, NULL);
gst_element_link_many (source, conv, sink, NULL);

int delay = 2;
g_print ("setting state: GST_STATE_PLAYING\n");
result = gst_element_set_state (pipeline, GST_STATE_PLAYING);
printStateChange(result);
if(result == GST_STATE_CHANGE_ASYNC) {
if(handleAsync(pipeline) == GST_STATE_CHANGE_FAILURE){
return 0;
}
}

g_print ("Returned, stopping playback\n");
result = gst_element_set_state (pipeline, GST_STATE_NULL);
printStateChange(result);
if(result == GST_STATE_CHANGE_ASYNC) {
if(handleAsync(pipeline) == GST_STATE_CHANGE_FAILURE){
return 0;
}
}

g_print ("Deleting pipeline\n");
gst_object_unref (GST_OBJECT (pipeline));
g_source_remove (bus_watch_id);
g_main_loop_unref (loop);

return 0;
}

Attachment 312162, "log output from application":
test.out

Version: 1.5.91

Assignee
Assign to
Time tracking