summaryrefslogtreecommitdiff
path: root/sys/mediafoundation/gstmfsourcereader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sys/mediafoundation/gstmfsourcereader.cpp')
-rw-r--r--sys/mediafoundation/gstmfsourcereader.cpp84
1 files changed, 71 insertions, 13 deletions
diff --git a/sys/mediafoundation/gstmfsourcereader.cpp b/sys/mediafoundation/gstmfsourcereader.cpp
index ff0ee9850..f9dba1b7b 100644
--- a/sys/mediafoundation/gstmfsourcereader.cpp
+++ b/sys/mediafoundation/gstmfsourcereader.cpp
@@ -78,6 +78,8 @@ static gboolean gst_mf_source_reader_stop (GstMFSourceObject * object);
static gboolean gst_mf_source_reader_close (GstMFSourceObject * object);
static GstFlowReturn gst_mf_source_reader_fill (GstMFSourceObject * object,
GstBuffer * buffer);
+static GstFlowReturn gst_mf_source_reader_create (GstMFSourceObject * object,
+ GstBuffer ** buffer);
static gboolean gst_mf_source_reader_unlock (GstMFSourceObject * object);
static gboolean gst_mf_source_reader_unlock_stop (GstMFSourceObject * object);
static GstCaps * gst_mf_source_reader_get_caps (GstMFSourceObject * object);
@@ -101,6 +103,7 @@ gst_mf_source_reader_class_init (GstMFSourceReaderClass * klass)
source_class->stop = GST_DEBUG_FUNCPTR (gst_mf_source_reader_stop);
source_class->close = GST_DEBUG_FUNCPTR (gst_mf_source_reader_close);
source_class->fill = GST_DEBUG_FUNCPTR (gst_mf_source_reader_fill);
+ source_class->create = GST_DEBUG_FUNCPTR (gst_mf_source_reader_create);
source_class->unlock = GST_DEBUG_FUNCPTR (gst_mf_source_reader_unlock);
source_class->unlock_stop =
GST_DEBUG_FUNCPTR (gst_mf_source_reader_unlock_stop);
@@ -291,10 +294,12 @@ gst_mf_source_reader_start (GstMFSourceObject * object)
type = self->cur_type;
- hr = type->media_type->SetUINT32 (MF_MT_DEFAULT_STRIDE,
- GST_VIDEO_INFO_PLANE_STRIDE (&self->info, 0));
- if (!gst_mf_result (hr))
- return FALSE;
+ if (GST_VIDEO_INFO_FORMAT (&self->info) != GST_VIDEO_FORMAT_ENCODED) {
+ hr = type->media_type->SetUINT32 (MF_MT_DEFAULT_STRIDE,
+ GST_VIDEO_INFO_PLANE_STRIDE (&self->info, 0));
+ if (!gst_mf_result (hr))
+ return FALSE;
+ }
hr = self->reader->SetStreamSelection (type->stream_index, TRUE);
if (!gst_mf_result (hr))
@@ -360,15 +365,10 @@ gst_mf_source_reader_read_sample (GstMFSourceReader * self)
}
static GstFlowReturn
-gst_mf_source_reader_fill (GstMFSourceObject * object, GstBuffer * buffer)
+gst_mf_source_reader_get_media_buffer (GstMFSourceReader * self,
+ IMFMediaBuffer ** media_buffer)
{
- GstMFSourceReader *self = GST_MF_SOURCE_READER (object);
GstFlowReturn ret = GST_FLOW_OK;
- HRESULT hr;
- GstVideoFrame frame;
- BYTE *data;
- gint i, j;
- ComPtr<IMFMediaBuffer> media_buffer;
while (g_queue_is_empty (self->queue)) {
ret = gst_mf_source_reader_read_sample (self);
@@ -383,7 +383,25 @@ gst_mf_source_reader_fill (GstMFSourceObject * object, GstBuffer * buffer)
g_mutex_unlock (&self->lock);
}
- media_buffer.Attach ((IMFMediaBuffer *) g_queue_pop_head (self->queue));
+ *media_buffer = (IMFMediaBuffer *) g_queue_pop_head (self->queue);
+
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_mf_source_reader_fill (GstMFSourceObject * object, GstBuffer * buffer)
+{
+ GstMFSourceReader *self = GST_MF_SOURCE_READER (object);
+ GstFlowReturn ret = GST_FLOW_OK;
+ ComPtr<IMFMediaBuffer> media_buffer;
+ GstVideoFrame frame;
+ BYTE *data;
+ gint i, j;
+ HRESULT hr;
+
+ ret = gst_mf_source_reader_get_media_buffer (self, &media_buffer);
+ if (ret != GST_FLOW_OK)
+ return ret;
hr = media_buffer->Lock (&data, NULL, NULL);
if (!gst_mf_result (hr)) {
@@ -420,7 +438,47 @@ gst_mf_source_reader_fill (GstMFSourceObject * object, GstBuffer * buffer)
gst_video_frame_unmap (&frame);
media_buffer->Unlock ();
- return ret;
+ return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_mf_source_reader_create (GstMFSourceObject * object, GstBuffer ** buffer)
+{
+ GstMFSourceReader *self = GST_MF_SOURCE_READER (object);
+ GstFlowReturn ret = GST_FLOW_OK;
+ ComPtr<IMFMediaBuffer> media_buffer;
+ HRESULT hr;
+ BYTE *data;
+ DWORD len = 0;
+ GstBuffer *buf;
+ GstMapInfo info;
+
+ ret = gst_mf_source_reader_get_media_buffer (self, &media_buffer);
+ if (ret != GST_FLOW_OK)
+ return ret;
+
+ hr = media_buffer->Lock (&data, NULL, &len);
+ if (!gst_mf_result (hr) || len == 0) {
+ GST_ERROR_OBJECT (self, "Failed to lock media buffer");
+ return GST_FLOW_ERROR;
+ }
+
+ buf = gst_buffer_new_and_alloc (len);
+ if (!buf) {
+ GST_ERROR_OBJECT (self, "Cannot allocate buffer");
+ media_buffer->Unlock ();
+ return GST_FLOW_ERROR;
+ }
+
+ gst_buffer_map (buf, &info, GST_MAP_WRITE);
+ memcpy (info.data, data, len);
+ gst_buffer_unmap (buf, &info);
+
+ media_buffer->Unlock ();
+
+ *buffer = buf;
+
+ return GST_FLOW_OK;
}
static gboolean