gstdspbuffer.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * Copyright (C) 2011 Felipe Contreras
  3. *
  4. * Author: Felipe Contreras <felipe.contreras@gmail.com>
  5. *
  6. * This file may be used under the terms of the GNU Lesser General Public
  7. * License version 2.1, a copy of which is found in LICENSE included in the
  8. * packaging of this file.
  9. */
  10. #include "gstdspbuffer.h"
  11. #include "dmm_buffer.h"
  12. typedef struct _GstDspBuffer GstDspBuffer;
  13. typedef struct _GstDspBufferClass GstDspBufferClass;
  14. static GstMiniObjectClass *parent_class;
  15. struct _GstDspBuffer {
  16. GstBuffer parent;
  17. GstDspBase *base;
  18. struct td_buffer *tb;
  19. };
  20. struct _GstDspBufferClass {
  21. GstBufferClass parent_class;
  22. };
  23. static GType type;
  24. GstBuffer *gst_dsp_buffer_new(GstDspBase *base, struct td_buffer *tb)
  25. {
  26. GstBuffer *buf;
  27. GstDspBuffer *dsp_buf;
  28. dmm_buffer_t *b = tb->data;
  29. buf = (GstBuffer *) gst_mini_object_new(type);
  30. gst_buffer_set_caps(buf, GST_PAD_CAPS(base->srcpad));
  31. if (!tb->pinned)
  32. GST_BUFFER_MALLOCDATA(buf) = b->allocated_data;
  33. GST_BUFFER_DATA(buf) = b->data;
  34. GST_BUFFER_SIZE(buf) = b->len;
  35. dsp_buf = (GstDspBuffer *) buf;
  36. dsp_buf->tb = tb;
  37. dsp_buf->base = base;
  38. return buf;
  39. }
  40. static void finalize(GstMiniObject *obj)
  41. {
  42. GstDspBuffer *dsp_buf = (GstDspBuffer *) obj;
  43. GstDspBase *base = dsp_buf->base;
  44. if (dsp_buf->tb->pinned) {
  45. if (G_UNLIKELY(g_atomic_int_get(&base->eos)))
  46. dsp_buf->tb->clean = true;
  47. base->send_buffer(base, dsp_buf->tb);
  48. }
  49. parent_class->finalize(obj);
  50. }
  51. static void class_init(void *g_class, void *class_data)
  52. {
  53. GstMiniObjectClass *obj_class;
  54. obj_class = GST_MINI_OBJECT_CLASS(g_class);
  55. obj_class->finalize = finalize;
  56. parent_class = g_type_class_peek_parent(g_class);
  57. }
  58. GType
  59. gst_dsp_buffer_get_type(void)
  60. {
  61. if (G_UNLIKELY(type == 0)) {
  62. GTypeInfo type_info = {
  63. .class_size = sizeof(GstDspBufferClass),
  64. .class_init = class_init,
  65. .instance_size = sizeof(GstDspBuffer),
  66. };
  67. type = g_type_register_static(GST_TYPE_BUFFER, "GstDspBuffer", &type_info, 0);
  68. }
  69. return type;
  70. }