From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/wm_reader.c | 110 +++++++++++++++++---------------- 1 file changed, 58 insertions(+), 52 deletions(-)
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 9d683d6dfc4..003ccd87d4e 100644 --- a/dlls/winegstreamer/wm_reader.c +++ b/dlls/winegstreamer/wm_reader.c @@ -1594,6 +1594,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 @@ -1640,15 +1692,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) { @@ -1659,7 +1707,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 { @@ -1668,7 +1715,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) { @@ -1679,7 +1725,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"); @@ -1687,51 +1733,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)