[PATCH 3/5] winegstreamer: Implement WMA decoder ProcessInput.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Tue Feb 22 20:09:06 CST 2022
Much of this patch doesn't make sense without 4/5. Could the two patches
be squashed together?
On 2/22/22 16:48, Rémi Bernon wrote:
> + if (FAILED(hr = IMFSample_GetBufferCount(sample, &count)) || count != 1)
> + {
> + FIXME("Only samples with 1 buffer are supported!\n");
> + return hr ? hr : E_FAIL;
> + }
This made me do a double take. Since these conditions don't really share
their bodies, perhaps they should be separated?
> +void mf_destroy_wg_sample(struct wg_sample *sample)
> +{
> + IMFMediaBuffer *media_buffer;
> + HRESULT hr;
> +
> + if (FAILED(hr = IMFSample_GetBufferByIndex(sample->private, 0, &media_buffer)))
> + WARN("Failed to get first buffer, sample %p\n", sample->private);
> + else
> + {
> + /* release lock and ref taken in mf_create_wg_sample */
> + IMFMediaBuffer_Unlock(media_buffer);
> + IMFMediaBuffer_SetCurrentLength(media_buffer, sample->size);
> + IMFMediaBuffer_Release(media_buffer);
Why are we holding a reference to the media buffer? (And if we need to,
should we be storing that instead of the IMFSample?)
> +
> + IMFMediaBuffer_Release(media_buffer);
> + }
> +
> + IMFSample_Release(sample->private);
> + free(sample);
> +}
> diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h
> index 4adbb694766..59b15df7d08 100644
> --- a/dlls/winegstreamer/unixlib.h
> +++ b/dlls/winegstreamer/unixlib.h
> @@ -103,6 +103,14 @@ struct wg_format
> } u;
> };
>
> +struct wg_sample
> +{
> + UINT32 max_size;
> + UINT32 size;
> + BYTE *data;
> + void *private;
> +};
"max_size" isn't relevant until patch 5/5.
"private" also doesn't particularly seem like it belongs here. In
particular, if you're going to wrap the wg_sample in another structure
in patch 5/5, I'd rather see the same approach taken for
frontend-specific data.
> + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer)))
> + return hr;
> + IMFMediaBuffer_Release(media_buffer);
This seems pointless (and hence, at least, doesn't belong in this
patch). Or does ConvertToContiguousBuffer() also modify the original sample?
> + if (!(wg_sample->size = (wg_sample->size / info.cbSize) * info.cbSize))
> + {
> + mf_destroy_wg_sample(wg_sample);
> + return S_OK;
> + }
I can't tell if this is trying to align to info.cbSize or (as the
documentation specifies) treat it as a minimum, but either way I think
it's broken.
> +
> + decoder->input_sample = wg_sample;
Do we have to store this for API compatibility? If so it would seem
helpful to specify that in a comment. It looks wrong as-is, since we
don't need the data after we copy it.
(And depending on how hard we need to preserve API compatibility in this
area, I'm concerned that patch 5/5 may be making assumptions about how
GStreamer uses buffers that aren't actually guaranteed.)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20220222/d046b679/attachment.sig>
More information about the wine-devel
mailing list