⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sinks.c

📁 GStreamer是一个开源的多媒体框架库。利用它
💻 C
📖 第 1 页 / 共 2 页
字号:
  srcpad = gst_element_get_pad (src, "src");  sinkpad = gst_element_get_pad (sink, "sink");  gst_pad_link (srcpad, sinkpad);  gst_object_unref (srcpad);  gst_object_unref (sinkpad);  bus = gst_element_get_bus (pipeline);  ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);  fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,      "no no_preroll state return");  pop_state_change_message (bus, sink, GST_STATE_NULL, GST_STATE_READY,      GST_STATE_VOID_PENDING);  pop_state_change_message (bus, src, GST_STATE_NULL, GST_STATE_READY,      GST_STATE_VOID_PENDING);  pop_state_change_message (bus, pipeline, GST_STATE_NULL, GST_STATE_READY,      GST_STATE_PAUSED);  /* this order only holds true for live sources because they do not push     buffers in PAUSED */  pop_state_change_message (bus, src, GST_STATE_READY, GST_STATE_PAUSED,      GST_STATE_VOID_PENDING);  pop_state_change_message (bus, pipeline, GST_STATE_READY, GST_STATE_PAUSED,      GST_STATE_VOID_PENDING);  ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);  fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,      "no no_preroll state return the second time");  ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not paused");  fail_unless (current == GST_STATE_PAUSED, "not paused");  fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");  /* don't block here */  ret = gst_element_get_state (sink, &current, &pending, 0);  fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not async");  fail_unless (current == GST_STATE_READY, "not ready");  fail_unless (pending == GST_STATE_PAUSED, "not paused");  ret =      gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not paused");  fail_unless (current == GST_STATE_PAUSED, "not paused");  fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");  ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);  fail_unless (ret == GST_STATE_CHANGE_ASYNC, "not async");  ret =      gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");  fail_unless (current == GST_STATE_PLAYING, "not playing");  fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");  /* now we have four messages on the bus: src from paused to playing, sink from     ready to paused and paused to playing, and pipeline from paused to playing.     the pipeline message should be last, and the sink messages should go in     order, but the src message can be interleaved with the sink one. */  {    GstMessage *m;    GstState old, new, pending;    gint n_src = 1, n_sink = 2;    while (n_src + n_sink > 0) {      m = gst_bus_poll (bus, GST_MESSAGE_STATE_CHANGED, GST_SECOND);      fail_unless (m != NULL, "expected state change message");      gst_message_parse_state_changed (m, &old, &new, &pending);      if (GST_MESSAGE_SRC (m) == (GstObject *) src) {        fail_unless (n_src == 1, "already got one message from the src");        n_src--;        fail_unless (old == GST_STATE_PAUSED, "unexpected old");        fail_unless (new == GST_STATE_PLAYING, "unexpected new (got %d)", new);        fail_unless (pending == GST_STATE_VOID_PENDING, "unexpected pending");      } else if (GST_MESSAGE_SRC (m) == (GstObject *) sink) {        if (n_sink == 2) {          fail_unless (old == GST_STATE_READY, "unexpected old");          fail_unless (new == GST_STATE_PAUSED, "unexpected new");          fail_unless (pending == GST_STATE_VOID_PENDING, "unexpected pending");        } else if (n_sink == 1) {          fail_unless (old == GST_STATE_PAUSED, "unexpected old");          fail_unless (new == GST_STATE_PLAYING, "unexpected new");          fail_unless (pending == GST_STATE_VOID_PENDING, "unexpected pending");        } else {          g_assert_not_reached ();        }        n_sink--;      } else {        g_critical            ("Unexpected state change message src %s (%d src %d sink pending)",            GST_OBJECT_NAME (GST_MESSAGE_SRC (m)), n_src, n_sink);      }      gst_message_unref (m);    }  }  pop_state_change_message (bus, pipeline, GST_STATE_PAUSED, GST_STATE_PLAYING,      GST_STATE_VOID_PENDING);  gst_object_unref (bus);  gst_element_set_state (pipeline, GST_STATE_NULL);  gst_object_unref (pipeline);}GST_END_TEST;/* The sink should go ASYNC to PLAYING. The source should go * to PLAYING with SUCCESS. The pipeline returns ASYNC. */GST_START_TEST (test_livesrc2_sink){  GstElement *sink, *src, *pipeline;  GstStateChangeReturn ret;  GstState current, pending;  GstPad *srcpad, *sinkpad;  pipeline = gst_pipeline_new ("pipeline");  src = gst_element_factory_make ("fakesrc", "src");  g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);  sink = gst_element_factory_make ("fakesink", "sink");  gst_bin_add (GST_BIN (pipeline), src);  gst_bin_add (GST_BIN (pipeline), sink);  srcpad = gst_element_get_pad (src, "src");  sinkpad = gst_element_get_pad (sink, "sink");  gst_pad_link (srcpad, sinkpad);  gst_object_unref (srcpad);  gst_object_unref (sinkpad);  ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);  fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async state return");  ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");  fail_unless (current == GST_STATE_PLAYING, "not playing");  fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");  ret =      gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");  fail_unless (current == GST_STATE_PLAYING, "not playing");  fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");  /* and back down */  ret = gst_element_set_state (pipeline, GST_STATE_PAUSED);  fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL,      "no no_preroll state return");  ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_NO_PREROLL, "not no_preroll");  fail_unless (current == GST_STATE_PAUSED, "not paused");  fail_unless (pending == GST_STATE_VOID_PENDING, "not paused");  /* sink state is not known.. it might be prerolled or not */  /* and to READY */  ret = gst_element_set_state (pipeline, GST_STATE_READY);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");  ret = gst_element_get_state (src, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not success");  fail_unless (current == GST_STATE_READY, "not ready");  fail_unless (pending == GST_STATE_VOID_PENDING, "not ready");  ret = gst_element_get_state (sink, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not success");  fail_unless (current == GST_STATE_READY, "not ready");  fail_unless (pending == GST_STATE_VOID_PENDING, "not ready");  /* And destroy. Must be NULL */  ret = gst_element_set_state (pipeline, GST_STATE_NULL);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");  gst_object_unref (pipeline);}GST_END_TEST;GST_START_TEST (test_livesrc3_sink){  GstElement *sink, *src, *pipeline;  GstStateChangeReturn ret;  GstState current, pending;  GstPad *srcpad, *sinkpad;  pipeline = gst_pipeline_new ("pipeline");  src = gst_element_factory_make ("fakesrc", "src");  g_object_set (G_OBJECT (src), "is-live", TRUE, NULL);  sink = gst_element_factory_make ("fakesink", "sink");  gst_bin_add (GST_BIN (pipeline), src);  gst_bin_add (GST_BIN (pipeline), sink);  srcpad = gst_element_get_pad (src, "src");  sinkpad = gst_element_get_pad (sink, "sink");  gst_pad_link (srcpad, sinkpad);  gst_object_unref (srcpad);  gst_object_unref (sinkpad);  ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);  fail_unless (ret == GST_STATE_CHANGE_ASYNC, "no async state return");  ret =      gst_element_get_state (pipeline, &current, &pending, GST_CLOCK_TIME_NONE);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "not playing");  fail_unless (current == GST_STATE_PLAYING, "not playing");  fail_unless (pending == GST_STATE_VOID_PENDING, "not playing");  /* and back down */  ret = gst_element_set_state (pipeline, GST_STATE_NULL);  fail_unless (ret == GST_STATE_CHANGE_SUCCESS, "no success state return");  gst_object_unref (pipeline);}GST_END_TEST;/* test: try changing state of sinks */Suite *gst_sinks_suite (void){  Suite *s = suite_create ("Sinks");  TCase *tc_chain = tcase_create ("general");  suite_add_tcase (s, tc_chain);  tcase_add_test (tc_chain, test_sink);  tcase_add_test (tc_chain, test_sink_completion);  tcase_add_test (tc_chain, test_src_sink);  tcase_add_test (tc_chain, test_livesrc_remove);  tcase_add_test (tc_chain, test_livesrc_sink);  tcase_add_test (tc_chain, test_livesrc2_sink);  tcase_add_test (tc_chain, test_livesrc3_sink);  return s;}GST_CHECK_MAIN (gst_sinks);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -