PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/gst-rs2src/gstnumbersrc.c

https://github.com/kzfm1024/misc
C | 472 lines | 284 code | 99 blank | 89 comment | 4 complexity | 646b772cd9f30113f683a46395822b94 MD5 | raw file
  1. /* GStreamer
  2. * Copyright (C) 2017 FIXME <fixme@example.com>
  3. *
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Library General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2 of the License, or (at your option) any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Library General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Library General Public
  15. * License along with this library; if not, write to the
  16. * Free Software Foundation, Inc., 51 Franklin Street, Suite 500,
  17. * Boston, MA 02110-1335, USA.
  18. */
  19. /**
  20. * SECTION:element-gstnumbersrc
  21. *
  22. * The numbersrc element does FIXME stuff.
  23. *
  24. * <refsect2>
  25. * <title>Example launch line</title>
  26. * |[
  27. * gst-launch-1.0 -v fakesrc ! numbersrc ! FIXME ! fakesink
  28. * ]|
  29. * FIXME Describe what the pipeline does.
  30. * </refsect2>
  31. */
  32. #ifdef HAVE_CONFIG_H
  33. #include "config.h"
  34. #endif
  35. #include <gst/gst.h>
  36. #include <gst/base/gstbasesrc.h>
  37. #include "gstnumbersrc.h"
  38. #include <string.h>
  39. GST_DEBUG_CATEGORY_STATIC (gst_numbersrc_debug_category);
  40. #define GST_CAT_DEFAULT gst_numbersrc_debug_category
  41. /* prototypes */
  42. static void gst_numbersrc_set_property (GObject * object,
  43. guint property_id, const GValue * value, GParamSpec * pspec);
  44. static void gst_numbersrc_get_property (GObject * object,
  45. guint property_id, GValue * value, GParamSpec * pspec);
  46. static void gst_numbersrc_dispose (GObject * object);
  47. static void gst_numbersrc_finalize (GObject * object);
  48. static GstCaps *gst_numbersrc_get_caps (GstBaseSrc * src, GstCaps * filter);
  49. static gboolean gst_numbersrc_negotiate (GstBaseSrc * src);
  50. static GstCaps *gst_numbersrc_fixate (GstBaseSrc * src, GstCaps * caps);
  51. static gboolean gst_numbersrc_set_caps (GstBaseSrc * src, GstCaps * caps);
  52. static gboolean gst_numbersrc_decide_allocation (GstBaseSrc * src,
  53. GstQuery * query);
  54. static gboolean gst_numbersrc_start (GstBaseSrc * src);
  55. static gboolean gst_numbersrc_stop (GstBaseSrc * src);
  56. static void gst_numbersrc_get_times (GstBaseSrc * src, GstBuffer * buffer,
  57. GstClockTime * start, GstClockTime * end);
  58. static gboolean gst_numbersrc_get_size (GstBaseSrc * src, guint64 * size);
  59. static gboolean gst_numbersrc_is_seekable (GstBaseSrc * src);
  60. static gboolean gst_numbersrc_prepare_seek_segment (GstBaseSrc * src,
  61. GstEvent * seek, GstSegment * segment);
  62. static gboolean gst_numbersrc_do_seek (GstBaseSrc * src, GstSegment * segment);
  63. static gboolean gst_numbersrc_unlock (GstBaseSrc * src);
  64. static gboolean gst_numbersrc_unlock_stop (GstBaseSrc * src);
  65. static gboolean gst_numbersrc_query (GstBaseSrc * src, GstQuery * query);
  66. static gboolean gst_numbersrc_event (GstBaseSrc * src, GstEvent * event);
  67. static GstFlowReturn gst_numbersrc_create (GstBaseSrc * src, guint64 offset,
  68. guint size, GstBuffer ** buf);
  69. static GstFlowReturn gst_numbersrc_alloc (GstBaseSrc * src, guint64 offset,
  70. guint size, GstBuffer ** buf);
  71. static GstFlowReturn gst_numbersrc_fill (GstBaseSrc * src, guint64 offset,
  72. guint size, GstBuffer * buf);
  73. enum
  74. {
  75. PROP_0
  76. };
  77. /* pad templates */
  78. static GstStaticPadTemplate gst_numbersrc_src_template =
  79. GST_STATIC_PAD_TEMPLATE ("src",
  80. GST_PAD_SRC,
  81. GST_PAD_ALWAYS,
  82. GST_STATIC_CAPS ("application/unknown")
  83. );
  84. /* class initialization */
  85. G_DEFINE_TYPE_WITH_CODE (GstNumbersrc, gst_numbersrc, GST_TYPE_BASE_SRC,
  86. GST_DEBUG_CATEGORY_INIT (gst_numbersrc_debug_category, "numbersrc", 0,
  87. "debug category for numbersrc element"));
  88. static void
  89. gst_numbersrc_class_init (GstNumbersrcClass * klass)
  90. {
  91. GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
  92. GstBaseSrcClass *base_src_class = GST_BASE_SRC_CLASS (klass);
  93. /* Setting up pads and setting metadata should be moved to
  94. base_class_init if you intend to subclass this class. */
  95. gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
  96. &gst_numbersrc_src_template);
  97. gst_element_class_set_static_metadata (GST_ELEMENT_CLASS (klass),
  98. "FIXME Long name", "Generic", "FIXME Description",
  99. "FIXME <fixme@example.com>");
  100. gobject_class->set_property = gst_numbersrc_set_property;
  101. gobject_class->get_property = gst_numbersrc_get_property;
  102. gobject_class->dispose = gst_numbersrc_dispose;
  103. gobject_class->finalize = gst_numbersrc_finalize;
  104. /*
  105. base_src_class->get_caps = GST_DEBUG_FUNCPTR (gst_numbersrc_get_caps);
  106. base_src_class->negotiate = GST_DEBUG_FUNCPTR (gst_numbersrc_negotiate);
  107. base_src_class->fixate = GST_DEBUG_FUNCPTR (gst_numbersrc_fixate);
  108. base_src_class->set_caps = GST_DEBUG_FUNCPTR (gst_numbersrc_set_caps);
  109. base_src_class->decide_allocation =
  110. GST_DEBUG_FUNCPTR (gst_numbersrc_decide_allocation);
  111. base_src_class->start = GST_DEBUG_FUNCPTR (gst_numbersrc_start);
  112. base_src_class->stop = GST_DEBUG_FUNCPTR (gst_numbersrc_stop);
  113. base_src_class->get_times = GST_DEBUG_FUNCPTR (gst_numbersrc_get_times);
  114. base_src_class->get_size = GST_DEBUG_FUNCPTR (gst_numbersrc_get_size);
  115. base_src_class->is_seekable = GST_DEBUG_FUNCPTR (gst_numbersrc_is_seekable);
  116. base_src_class->prepare_seek_segment =
  117. GST_DEBUG_FUNCPTR (gst_numbersrc_prepare_seek_segment);
  118. base_src_class->do_seek = GST_DEBUG_FUNCPTR (gst_numbersrc_do_seek);
  119. base_src_class->unlock = GST_DEBUG_FUNCPTR (gst_numbersrc_unlock);
  120. base_src_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_numbersrc_unlock_stop);
  121. base_src_class->query = GST_DEBUG_FUNCPTR (gst_numbersrc_query);
  122. base_src_class->event = GST_DEBUG_FUNCPTR (gst_numbersrc_event);
  123. base_src_class->create = GST_DEBUG_FUNCPTR (gst_numbersrc_create);
  124. base_src_class->alloc = GST_DEBUG_FUNCPTR (gst_numbersrc_alloc);
  125. */
  126. base_src_class->fill = GST_DEBUG_FUNCPTR (gst_numbersrc_fill);
  127. }
  128. static void
  129. gst_numbersrc_init (GstNumbersrc * numbersrc)
  130. {
  131. }
  132. void
  133. gst_numbersrc_set_property (GObject * object, guint property_id,
  134. const GValue * value, GParamSpec * pspec)
  135. {
  136. GstNumbersrc *numbersrc = GST_NUMBERSRC (object);
  137. GST_DEBUG_OBJECT (numbersrc, "set_property");
  138. switch (property_id) {
  139. default:
  140. G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  141. break;
  142. }
  143. }
  144. void
  145. gst_numbersrc_get_property (GObject * object, guint property_id,
  146. GValue * value, GParamSpec * pspec)
  147. {
  148. GstNumbersrc *numbersrc = GST_NUMBERSRC (object);
  149. GST_DEBUG_OBJECT (numbersrc, "get_property");
  150. switch (property_id) {
  151. default:
  152. G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
  153. break;
  154. }
  155. }
  156. void
  157. gst_numbersrc_dispose (GObject * object)
  158. {
  159. GstNumbersrc *numbersrc = GST_NUMBERSRC (object);
  160. GST_DEBUG_OBJECT (numbersrc, "dispose");
  161. /* clean up as possible. may be called multiple times */
  162. G_OBJECT_CLASS (gst_numbersrc_parent_class)->dispose (object);
  163. }
  164. void
  165. gst_numbersrc_finalize (GObject * object)
  166. {
  167. GstNumbersrc *numbersrc = GST_NUMBERSRC (object);
  168. GST_DEBUG_OBJECT (numbersrc, "finalize");
  169. /* clean up object here */
  170. G_OBJECT_CLASS (gst_numbersrc_parent_class)->finalize (object);
  171. }
  172. /* get caps from subclass */
  173. static GstCaps *
  174. gst_numbersrc_get_caps (GstBaseSrc * src, GstCaps * filter)
  175. {
  176. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  177. GST_DEBUG_OBJECT (numbersrc, "get_caps");
  178. return NULL;
  179. }
  180. /* decide on caps */
  181. static gboolean
  182. gst_numbersrc_negotiate (GstBaseSrc * src)
  183. {
  184. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  185. GST_DEBUG_OBJECT (numbersrc, "negotiate");
  186. return TRUE;
  187. }
  188. /* called if, in negotiation, caps need fixating */
  189. static GstCaps *
  190. gst_numbersrc_fixate (GstBaseSrc * src, GstCaps * caps)
  191. {
  192. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  193. GST_DEBUG_OBJECT (numbersrc, "fixate");
  194. return NULL;
  195. }
  196. /* notify the subclass of new caps */
  197. static gboolean
  198. gst_numbersrc_set_caps (GstBaseSrc * src, GstCaps * caps)
  199. {
  200. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  201. GST_DEBUG_OBJECT (numbersrc, "set_caps");
  202. return TRUE;
  203. }
  204. /* setup allocation query */
  205. static gboolean
  206. gst_numbersrc_decide_allocation (GstBaseSrc * src, GstQuery * query)
  207. {
  208. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  209. GST_DEBUG_OBJECT (numbersrc, "decide_allocation");
  210. return TRUE;
  211. }
  212. /* start and stop processing, ideal for opening/closing the resource */
  213. static gboolean
  214. gst_numbersrc_start (GstBaseSrc * src)
  215. {
  216. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  217. GST_DEBUG_OBJECT (numbersrc, "start");
  218. return TRUE;
  219. }
  220. static gboolean
  221. gst_numbersrc_stop (GstBaseSrc * src)
  222. {
  223. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  224. GST_DEBUG_OBJECT (numbersrc, "stop");
  225. return TRUE;
  226. }
  227. /* given a buffer, return start and stop time when it should be pushed
  228. * out. The base class will sync on the clock using these times. */
  229. static void
  230. gst_numbersrc_get_times (GstBaseSrc * src, GstBuffer * buffer,
  231. GstClockTime * start, GstClockTime * end)
  232. {
  233. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  234. GST_DEBUG_OBJECT (numbersrc, "get_times");
  235. }
  236. /* get the total size of the resource in bytes */
  237. static gboolean
  238. gst_numbersrc_get_size (GstBaseSrc * src, guint64 * size)
  239. {
  240. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  241. GST_DEBUG_OBJECT (numbersrc, "get_size");
  242. return TRUE;
  243. }
  244. /* check if the resource is seekable */
  245. static gboolean
  246. gst_numbersrc_is_seekable (GstBaseSrc * src)
  247. {
  248. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  249. GST_DEBUG_OBJECT (numbersrc, "is_seekable");
  250. return TRUE;
  251. }
  252. /* Prepare the segment on which to perform do_seek(), converting to the
  253. * current basesrc format. */
  254. static gboolean
  255. gst_numbersrc_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek,
  256. GstSegment * segment)
  257. {
  258. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  259. GST_DEBUG_OBJECT (numbersrc, "prepare_seek_segment");
  260. return TRUE;
  261. }
  262. /* notify subclasses of a seek */
  263. static gboolean
  264. gst_numbersrc_do_seek (GstBaseSrc * src, GstSegment * segment)
  265. {
  266. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  267. GST_DEBUG_OBJECT (numbersrc, "do_seek");
  268. return TRUE;
  269. }
  270. /* unlock any pending access to the resource. subclasses should unlock
  271. * any function ASAP. */
  272. static gboolean
  273. gst_numbersrc_unlock (GstBaseSrc * src)
  274. {
  275. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  276. GST_DEBUG_OBJECT (numbersrc, "unlock");
  277. return TRUE;
  278. }
  279. /* Clear any pending unlock request, as we succeeded in unlocking */
  280. static gboolean
  281. gst_numbersrc_unlock_stop (GstBaseSrc * src)
  282. {
  283. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  284. GST_DEBUG_OBJECT (numbersrc, "unlock_stop");
  285. return TRUE;
  286. }
  287. /* notify subclasses of a query */
  288. static gboolean
  289. gst_numbersrc_query (GstBaseSrc * src, GstQuery * query)
  290. {
  291. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  292. GST_DEBUG_OBJECT (numbersrc, "query");
  293. return TRUE;
  294. }
  295. /* notify subclasses of an event */
  296. static gboolean
  297. gst_numbersrc_event (GstBaseSrc * src, GstEvent * event)
  298. {
  299. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  300. GST_DEBUG_OBJECT (numbersrc, "event");
  301. return TRUE;
  302. }
  303. /* ask the subclass to create a buffer with offset and size, the default
  304. * implementation will call alloc and fill. */
  305. static GstFlowReturn
  306. gst_numbersrc_create (GstBaseSrc * src, guint64 offset, guint size,
  307. GstBuffer ** buf)
  308. {
  309. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  310. GST_DEBUG_OBJECT (numbersrc, "create");
  311. return GST_FLOW_OK;
  312. }
  313. /* ask the subclass to allocate an output buffer. The default implementation
  314. * will use the negotiated allocator. */
  315. static GstFlowReturn
  316. gst_numbersrc_alloc (GstBaseSrc * src, guint64 offset, guint size,
  317. GstBuffer ** buf)
  318. {
  319. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  320. GST_DEBUG_OBJECT (numbersrc, "alloc");
  321. return GST_FLOW_OK;
  322. }
  323. /* ask the subclass to fill the buffer with data from offset and size */
  324. static GstFlowReturn
  325. gst_numbersrc_fill (GstBaseSrc * src, guint64 offset, guint size,
  326. GstBuffer * buf)
  327. {
  328. static guint32 i = 0;
  329. GstNumbersrc *numbersrc = GST_NUMBERSRC (src);
  330. GstMapInfo info;
  331. GST_DEBUG_OBJECT (numbersrc, "fill");
  332. if (size < sizeof(i)) {
  333. GST_ERROR_OBJECT(numbersrc, "gst_numbersrc_fill: size too short");
  334. return GST_FLOW_ERROR;
  335. }
  336. if (!gst_buffer_map (buf, &info, GST_MAP_WRITE))
  337. return GST_FLOW_ERROR;
  338. guint8 *data = info.data;
  339. memcpy(data, &i, sizeof(i));
  340. i++;
  341. gst_buffer_unmap (buf, &info);
  342. gst_buffer_resize(buf, 0, sizeof(i));
  343. return GST_FLOW_OK;
  344. }
  345. static gboolean
  346. plugin_init (GstPlugin * plugin)
  347. {
  348. /* FIXME Remember to set the rank if it's an element that is meant
  349. to be autoplugged by decodebin. */
  350. return gst_element_register (plugin, "numbersrc", GST_RANK_NONE,
  351. GST_TYPE_NUMBERSRC);
  352. }
  353. /* FIXME: these are normally defined by the GStreamer build system.
  354. If you are creating an element to be included in gst-plugins-*,
  355. remove these, as they're always defined. Otherwise, edit as
  356. appropriate for your external plugin package. */
  357. #ifndef VERSION
  358. #define VERSION "0.0.FIXME"
  359. #endif
  360. #ifndef PACKAGE
  361. #define PACKAGE "FIXME_package"
  362. #endif
  363. #ifndef PACKAGE_NAME
  364. #define PACKAGE_NAME "FIXME_package_name"
  365. #endif
  366. #ifndef GST_PACKAGE_ORIGIN
  367. #define GST_PACKAGE_ORIGIN "http://FIXME.org/"
  368. #endif
  369. GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
  370. GST_VERSION_MINOR,
  371. numbersrc,
  372. "FIXME plugin description",
  373. plugin_init, VERSION, "LGPL", PACKAGE_NAME, GST_PACKAGE_ORIGIN)