mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 06:46:38 +00:00
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:
parent
4902076968
commit
236378c9d5
2 changed files with 14 additions and 2 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue