|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #include <string.h> |
|
8 #include "GStreamerReader.h" |
|
9 #include "GStreamerMozVideoBuffer.h" |
|
10 #include "ImageContainer.h" |
|
11 |
|
12 namespace mozilla { |
|
13 |
|
14 static GstMozVideoBuffer *gst_moz_video_buffer_copy(GstMozVideoBuffer* self); |
|
15 static void gst_moz_video_buffer_finalize(GstMozVideoBuffer* self); |
|
16 |
|
17 // working around GTK+ bug https://bugzilla.gnome.org/show_bug.cgi?id=723899 |
|
18 #pragma GCC diagnostic push |
|
19 #pragma GCC diagnostic ignored "-Wunused-function" |
|
20 G_DEFINE_TYPE(GstMozVideoBuffer, gst_moz_video_buffer, GST_TYPE_BUFFER); |
|
21 #pragma GCC diagnostic pop |
|
22 |
|
23 static void |
|
24 gst_moz_video_buffer_class_init(GstMozVideoBufferClass* klass) |
|
25 { |
|
26 g_return_if_fail(GST_IS_MOZ_VIDEO_BUFFER_CLASS(klass)); |
|
27 |
|
28 GstMiniObjectClass *mo_class = GST_MINI_OBJECT_CLASS(klass); |
|
29 |
|
30 mo_class->copy =(GstMiniObjectCopyFunction)gst_moz_video_buffer_copy; |
|
31 mo_class->finalize =(GstMiniObjectFinalizeFunction)gst_moz_video_buffer_finalize; |
|
32 } |
|
33 |
|
34 static void |
|
35 gst_moz_video_buffer_init(GstMozVideoBuffer* self) |
|
36 { |
|
37 g_return_if_fail(GST_IS_MOZ_VIDEO_BUFFER(self)); |
|
38 } |
|
39 |
|
40 static void |
|
41 gst_moz_video_buffer_finalize(GstMozVideoBuffer* self) |
|
42 { |
|
43 g_return_if_fail(GST_IS_MOZ_VIDEO_BUFFER(self)); |
|
44 |
|
45 if(self->data) |
|
46 g_boxed_free(GST_TYPE_MOZ_VIDEO_BUFFER_DATA, self->data); |
|
47 |
|
48 GST_MINI_OBJECT_CLASS(gst_moz_video_buffer_parent_class)->finalize(GST_MINI_OBJECT(self)); |
|
49 } |
|
50 |
|
51 static GstMozVideoBuffer* |
|
52 gst_moz_video_buffer_copy(GstMozVideoBuffer* self) |
|
53 { |
|
54 GstMozVideoBuffer* copy; |
|
55 |
|
56 g_return_val_if_fail(GST_IS_MOZ_VIDEO_BUFFER(self), nullptr); |
|
57 |
|
58 copy = gst_moz_video_buffer_new(); |
|
59 |
|
60 /* we simply copy everything from our parent */ |
|
61 GST_BUFFER_DATA(GST_BUFFER_CAST(copy)) = |
|
62 (guint8*)g_memdup(GST_BUFFER_DATA(GST_BUFFER_CAST(self)), GST_BUFFER_SIZE(GST_BUFFER_CAST(self))); |
|
63 |
|
64 /* make sure it gets freed(even if the parent is subclassed, we return a |
|
65 normal buffer) */ |
|
66 GST_BUFFER_MALLOCDATA(GST_BUFFER_CAST(copy)) = GST_BUFFER_DATA(GST_BUFFER_CAST(copy)); |
|
67 GST_BUFFER_SIZE(GST_BUFFER_CAST(copy)) = GST_BUFFER_SIZE(GST_BUFFER_CAST(self)); |
|
68 |
|
69 /* copy metadata */ |
|
70 gst_buffer_copy_metadata(GST_BUFFER_CAST(copy), |
|
71 GST_BUFFER_CAST(self), |
|
72 (GstBufferCopyFlags)GST_BUFFER_COPY_ALL); |
|
73 /* copy videobuffer */ |
|
74 if(self->data) |
|
75 copy->data = (GstMozVideoBufferData*)g_boxed_copy(GST_TYPE_MOZ_VIDEO_BUFFER_DATA, self->data); |
|
76 |
|
77 return copy; |
|
78 } |
|
79 |
|
80 GstMozVideoBuffer* |
|
81 gst_moz_video_buffer_new(void) |
|
82 { |
|
83 GstMozVideoBuffer *self; |
|
84 |
|
85 self =(GstMozVideoBuffer*)gst_mini_object_new(GST_TYPE_MOZ_VIDEO_BUFFER); |
|
86 self->data = nullptr; |
|
87 |
|
88 return self; |
|
89 } |
|
90 |
|
91 void |
|
92 gst_moz_video_buffer_set_data(GstMozVideoBuffer* self, GstMozVideoBufferData* data) |
|
93 { |
|
94 g_return_if_fail(GST_IS_MOZ_VIDEO_BUFFER(self)); |
|
95 |
|
96 self->data = data; |
|
97 } |
|
98 |
|
99 GstMozVideoBufferData* |
|
100 gst_moz_video_buffer_get_data(const GstMozVideoBuffer* self) |
|
101 { |
|
102 g_return_val_if_fail(GST_IS_MOZ_VIDEO_BUFFER(self), nullptr); |
|
103 |
|
104 return self->data; |
|
105 } |
|
106 |
|
107 GType |
|
108 gst_moz_video_buffer_data_get_type(void) |
|
109 { |
|
110 static volatile gsize g_define_type_id__volatile = 0; |
|
111 |
|
112 if(g_once_init_enter(&g_define_type_id__volatile)) { |
|
113 GType g_define_type_id = |
|
114 g_boxed_type_register_static(g_intern_static_string("GstMozVideoBufferData"), |
|
115 (GBoxedCopyFunc)GstMozVideoBufferData::Copy, |
|
116 (GBoxedFreeFunc)GstMozVideoBufferData::Free); |
|
117 g_once_init_leave(&g_define_type_id__volatile, g_define_type_id); |
|
118 } |
|
119 |
|
120 return g_define_type_id__volatile; |
|
121 } |
|
122 |
|
123 } |