Commit af751b59 authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

winegstreamer: Split the wm_reader_get_stream_sample helper.

parent 2d442738
......@@ -1596,6 +1596,58 @@ static HRESULT wm_stream_allocate_sample(struct wm_stream *stream, DWORD size, I
return S_OK;
}
static HRESULT wm_reader_read_stream_sample(struct wm_reader *reader, struct wm_stream *stream,
struct wg_parser_buffer *buffer, INSSBuffer **sample, QWORD *pts, QWORD *duration, DWORD *flags)
{
DWORD size, capacity;
HRESULT hr;
BYTE *data;
TRACE("Got buffer for '%s' stream %p.\n", get_major_type_string(stream->format.major_type), stream);
if (FAILED(hr = wm_stream_allocate_sample(stream, buffer->size, sample)))
{
ERR("Failed to allocate sample of %u bytes, hr %#lx.\n", buffer->size, hr);
wg_parser_stream_release_buffer(stream->wg_stream);
return hr;
}
if (FAILED(hr = INSSBuffer_GetBufferAndLength(*sample, &data, &size)))
ERR("Failed to get data pointer, hr %#lx.\n", hr);
if (FAILED(hr = INSSBuffer_GetMaxLength(*sample, &capacity)))
ERR("Failed to get capacity, hr %#lx.\n", hr);
if (buffer->size > capacity)
ERR("Returned capacity %lu is less than requested capacity %u.\n", capacity, buffer->size);
if (!wg_parser_stream_copy_buffer(stream->wg_stream, data, 0, buffer->size))
{
/* The GStreamer pin has been flushed. */
INSSBuffer_Release(*sample);
*sample = NULL;
return S_FALSE;
}
if (FAILED(hr = INSSBuffer_SetLength(*sample, buffer->size)))
ERR("Failed to set size %u, hr %#lx.\n", buffer->size, hr);
wg_parser_stream_release_buffer(stream->wg_stream);
if (!buffer->has_pts)
FIXME("Missing PTS.\n");
if (!buffer->has_duration)
FIXME("Missing duration.\n");
*pts = buffer->pts;
*duration = buffer->duration;
*flags = 0;
if (buffer->discontinuity)
*flags |= WM_SF_DISCONTINUITY;
if (!buffer->delta)
*flags |= WM_SF_CLEANPOINT;
return S_OK;
}
/* Find the earliest buffer by PTS.
*
* Native seems to behave similarly to this with the async reader, although our
......@@ -1642,15 +1694,11 @@ static WORD get_earliest_buffer(struct wm_reader *reader, struct wg_parser_buffe
static HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number,
INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number)
{
struct wg_parser_stream *wg_stream;
struct wg_parser_buffer wg_buffer;
struct wm_stream *stream;
DWORD size, capacity;
INSSBuffer *sample;
HRESULT hr = S_OK;
BYTE *data;
for (;;)
do
{
if (!stream_number)
{
......@@ -1661,7 +1709,6 @@ static HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream
}
stream = wm_reader_get_stream_by_stream_number(reader, stream_number);
wg_stream = stream->wg_stream;
}
else
{
......@@ -1670,7 +1717,6 @@ static HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream
WARN("Invalid stream number %u; returning E_INVALIDARG.\n", stream_number);
return E_INVALIDARG;
}
wg_stream = stream->wg_stream;
if (stream->selection == WMT_OFF)
{
......@@ -1681,7 +1727,7 @@ static HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream
if (stream->eos)
return NS_E_NO_MORE_SAMPLES;
if (!wg_parser_stream_get_buffer(wg_stream, &wg_buffer))
if (!wg_parser_stream_get_buffer(stream->wg_stream, &wg_buffer))
{
stream->eos = true;
TRACE("End of stream.\n");
......@@ -1689,51 +1735,11 @@ static HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream
}
}
TRACE("Got buffer for '%s' stream %p.\n", get_major_type_string(stream->format.major_type), stream);
if (FAILED(hr = wm_stream_allocate_sample(stream, wg_buffer.size, &sample)))
{
ERR("Failed to allocate sample of %u bytes, hr %#lx.\n", wg_buffer.size, hr);
wg_parser_stream_release_buffer(wg_stream);
return hr;
}
if (FAILED(hr = INSSBuffer_GetBufferAndLength(sample, &data, &size)))
ERR("Failed to get data pointer, hr %#lx.\n", hr);
if (FAILED(hr = INSSBuffer_GetMaxLength(sample, &capacity)))
ERR("Failed to get capacity, hr %#lx.\n", hr);
if (wg_buffer.size > capacity)
ERR("Returned capacity %lu is less than requested capacity %u.\n", capacity, wg_buffer.size);
if (!wg_parser_stream_copy_buffer(wg_stream, data, 0, wg_buffer.size))
{
/* The GStreamer pin has been flushed. */
INSSBuffer_Release(sample);
continue;
}
if (FAILED(hr = INSSBuffer_SetLength(sample, wg_buffer.size)))
ERR("Failed to set size %u, hr %#lx.\n", wg_buffer.size, hr);
wg_parser_stream_release_buffer(wg_stream);
if (!wg_buffer.has_pts)
FIXME("Missing PTS.\n");
if (!wg_buffer.has_duration)
FIXME("Missing duration.\n");
if (SUCCEEDED(hr = wm_reader_read_stream_sample(reader, stream, &wg_buffer, ret_sample, pts, duration, flags)))
*ret_stream_number = stream_number;
} while (hr == S_FALSE);
*pts = wg_buffer.pts;
*duration = wg_buffer.duration;
*flags = 0;
if (wg_buffer.discontinuity)
*flags |= WM_SF_DISCONTINUITY;
if (!wg_buffer.delta)
*flags |= WM_SF_CLEANPOINT;
*ret_sample = sample;
*ret_stream_number = stream_number;
return S_OK;
}
return hr;
}
static struct wm_reader *impl_from_IUnknown(IUnknown *iface)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment