mfvideoenc: Fix broken encoding when resolution is not an even number

Width and height values of 4:2:0 subsampled YUV format should be even number,
and if it's not the case, there should be padding which is not a contiguous memory layout.
Do copy input frames to MediaFoundation's memory in that case for now.

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1165
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2661>
This commit is contained in:
Seungha Yang 2022-06-26 06:39:54 +09:00
parent 4902076968
commit 236378c9d5
2 changed files with 14 additions and 2 deletions

View file

@ -316,6 +316,14 @@ gst_mf_video_encoder_init_mft (GstMFVideoEncoder * self)
}
#endif
/* TODO: We support I420/NV12/P010 only for now.
* Consider other subsampling once we add it */
if ((info->width % 2) != 0 || (info->height % 2) != 0) {
self->need_align = TRUE;
} else {
self->need_align = FALSE;
}
hr = MFCreateMediaType (&out_type);
if (!gst_mf_result (hr))
return FALSE;
@ -944,7 +952,7 @@ gst_mf_video_encoder_create_input_sample (GstMFVideoEncoder * self,
gint i, j;
GstVideoFrame *vframe = nullptr;
BYTE *data = nullptr;
gboolean need_copy;
gboolean need_copy = self->need_align;
vframe = g_new0 (GstVideoFrame, 1);
@ -959,7 +967,9 @@ gst_mf_video_encoder_create_input_sample (GstMFVideoEncoder * self,
goto error;
/* Check if we can forward this memory to Media Foundation without copy */
if (!need_copy)
need_copy = gst_mf_video_encoder_frame_needs_copy (vframe);
if (need_copy) {
GST_TRACE_OBJECT (self, "Copy input buffer into Media Foundation memory");
hr = MFCreateMemoryBuffer (GST_VIDEO_INFO_SIZE (info), &media_buffer);

View file

@ -107,6 +107,8 @@ struct _GstMFVideoEncoder
* when B-frame is enabled. */
LONGLONG mf_pts_offset;
gboolean need_align;
#if GST_MF_HAVE_D3D11
/* For D3D11 interop. */
GstD3D11Device *other_d3d11_device;