Media Foundation NVIDIA H.264 Encoder

Ilya Aleshkov ilya.aleshkov at gmail.com
Fri Nov 6 18:37:17 UTC 2020


Hi,
I'd like to use up to 8 mfh264enc elements at the same time.
I feed them manually (appsrc) from Basler cameras.
Everything works great with Intel UHD Graphics 620 (on my Surface Pro 6).
It's really great to have device-agnostic, hardware-accelerated media
processing on Windows. Thanks to Media Foundation Transform API and
GStreamer 1.18.x
But I've faced a real problem with my Nvidia graphics card (GTX 1050 Ti):
The first 2-3 times after reboot everything works without any issues.
After that I get errors like this:

0:00:02.775064000  9884 000001E4C5194380 WARN             mftransform
gstmftransform.cpp:967:gst_mf_transform_set_output_type: MediaFoundation
call failed: 0xc00d6d76, The input type is not supported for D3D device.
0:00:03.361119000  9884 000001E4C5194380 ERROR             mfvideoenc
gstmfvideoenc.cpp:194:gst_mf_video_enc_set_format:<mfh264enc0> Couldn't set
output type
0:00:04.631488000  9884 000001E4C5194380 WARN            videoencoder
gstvideoencoder.c:755:gst_video_encoder_setcaps:<mfh264enc0> rejected caps
video/x-raw, format=(string)NV12, width=(int)1200, height=(int)1000,
framerate=(fraction)80/1, multiview-mode=(string)mono,
pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
0:00:05.328089000  9884 000001E4C5194380 WARN             mftransform
gstmftransform.cpp:967:gst_mf_transform_set_output_type: MediaFoundation
call failed: 0xc00d6d76, The input type is not supported for D3D device.
0:00:05.342697000  9884 000001E4C5194380 ERROR             mfvideoenc
gstmfvideoenc.cpp:194:gst_mf_video_enc_set_format:<mfh264enc0> Couldn't set
output type
0:00:05.352995000  9884 000001E4C5194380 WARN            videoencoder
gstvideoencoder.c:755:gst_video_encoder_setcaps:<mfh264enc0> rejected caps
video/x-raw, format=(string)NV12, width=(int)1200, height=(int)1000,
framerate=(fraction)80/1, multiview-mode=(string)mono,
pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
0:00:05.372768000  9884 000001E4C5194380 WARN                GST_PADS
gstpad.c:4303:gst_pad_peer_query:<capsfilter0:src> could not send sticky
events
0:00:05.413309000  9884 000001E4C5194380 WARN             mftransform
gstmftransform.cpp:967:gst_mf_transform_set_output_type: MediaFoundation
call failed: 0xc00d6d76, The input type is not supported for D3D device.
0:00:05.657361000  9884 000001E4C5194380 ERROR             mfvideoenc
gstmfvideoenc.cpp:194:gst_mf_video_enc_set_format:<mfh264enc0> Couldn't set
output type
0:00:05.768150000  9884 000001E4C5194380 WARN            videoencoder
gstvideoencoder.c:755:gst_video_encoder_setcaps:<mfh264enc0> rejected caps
video/x-raw, format=(string)NV12, width=(int)1200, height=(int)1000,
framerate=(fraction)80/1, multiview-mode=(string)mono,
pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
0:00:06.439141000  9884 000001E4C5194380 WARN             mftransform
gstmftransform.cpp:967:gst_mf_transform_set_output_type: MediaFoundation
call failed: 0xc00d6d76, The input type is not supported for D3D device.
0:00:06.535926000  9884 000001E4C5194380 ERROR             mfvideoenc
gstmfvideoenc.cpp:194:gst_mf_video_enc_set_format:<mfh264enc0> Couldn't set
output type
0:00:06.773513000  9884 000001E4C5194380 WARN            videoencoder
gstvideoencoder.c:755:gst_video_encoder_setcaps:<mfh264enc0> rejected caps
video/x-raw, format=(string)NV12, width=(int)1200, height=(int)1000,
framerate=(fraction)80/1, multiview-mode=(string)mono,
pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive
0:00:07.577236000  9884 000001E4C5194380 WARN                 basesrc
gstbasesrc.c:3127:gst_base_src_loop:<videotestsrc0> error: Internal data
stream error.
0:00:07.620275000  9884 000001E4C5194380 WARN                 basesrc
gstbasesrc.c:3127:gst_base_src_loop:<videotestsrc0> error: streaming
stopped, reason not-negotiated (-4)
ERROR: from element /GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0:
Internal data stream error.
Additional debug info:
../libs/gst/base/gstbasesrc.c(3127): gst_base_src_loop ():
/GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0:
streaming stopped, reason not-negotiated (-4)
ERROR: pipeline doesn't want to preroll.
Setting pipeline to NULL ...

As a result, I get 1-3 empty files (of 8) every run.
The easiest way to reproduce this issue it to launch this cmd file:

start videotestsrc_mfh264enc.bat testsrc_1.mkv
start videotestsrc_mfh264enc.bat testsrc_2.mkv
start videotestsrc_mfh264enc.bat testsrc_3.mkv
start videotestsrc_mfh264enc.bat testsrc_4.mkv
start videotestsrc_mfh264enc.bat testsrc_5.mkv
start videotestsrc_mfh264enc.bat testsrc_6.mkv
start videotestsrc_mfh264enc.bat testsrc_7.mkv
start videotestsrc_mfh264enc.bat testsrc_8.mkv

As you can see it uses another cmd file as a subroutine
(videotestsrc_mfh264enc.bat):

gst-launch-1.0 -e videotestsrc num-buffers=800 pattern=ball !
video/x-raw,format=NV12,width=1200,height=1000,framerate=80/1 ! mfh264enc !
h264parse ! matroskamux ! filesink location=%~n1.mkv

I've tested it with mfh265enc as well - the same issue.
What do you think about it?
Now I'm going to dive into MFTs API and  GstMFTransform sources.

Thanks,
Ilya
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20201106/d6cca904/attachment-0001.htm>


More information about the gstreamer-devel mailing list