Add Media Foundation encoder - #681

Closed
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation
Closed

Add Media Foundation encoder#681
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation

Conversation

@cgutman

@cgutmancgutman commented Jan 3, 2023

Copy link
Copy Markdown
Collaborator

Description

This PR introduces support for Media Foundation encoders (h264_mf and hevc_mf). This enables partial hardware acceleration on Windows systems where NVENC, QSV, and AMD AMF are unsupported, like ARM platforms. I also implemented support for GPU accelerated color conversion when encoding from CPU memory and enabled that feature for Media Foundation.

Screenshot

image

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

Branch Updates

LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.

  • I want maintainers to keep my branch updated

@cgutman
cgutman marked this pull request as draft January 3, 2023 01:11
Comment threaddocs/source/about/advanced_usage.rst Outdated
@psyke83

psyke83 commented Jan 3, 2023

Copy link
Copy Markdown
Contributor

I tested this on my RX 6600. While I understand that MF is inferior to AMF, I noticed an issue with delayed frames that can't be resolved with the existing ffmpeg encoder parameters.

I've opened a PR that should help: LizardByte/build-deps#72

This will require you to add the low_latency param to this PR for changes to take effect.

@brad-richardson

Copy link
Copy Markdown
Contributor

I'm getting a segfault on line 1030 of video.cpp with an Intel dGPU

Here's some of my log: https://gist.github.com/brad-richardson/4ad89fbd492ad211463f367c462a7875

Any ideas for configs to try or that I'm missing?

@cgutman

cgutman commented Jan 4, 2023

Copy link
Copy Markdown
CollaboratorAuthor

@brad-richardson Yeah, I saw the same issue on my ARM machine. There is a bug on FFmpeg where it double-releases an internal Media Foundation pointer if initialization fails to set an output format. For my ARM system, it didn't like the rate control mode I had set and setting it to cbr fixed the crash.

FFmpeg's MF support seems pretty poor. It doesn't have a lot of the config parameters plumbed, crashes when init fails, doesn't support GPU surfaces, etc. I think I'm going to put this on hold and work on QSV instead.

Comment threadsrc_assets/common/assets/web/config.html
@cgutman
cgutman marked this pull request as ready for review January 19, 2023 02:55
@Isalight

Copy link
Copy Markdown

On AMD Vega 6 don't work H264 (black screen when streaming). H265 works fine.

[2023:01:20:02:38:16]: Info: Compiling shaders...
[2023:01:20:02:38:16]: Info: Compiled shaders
[2023:01:20:02:38:16]: Info: Trying encoder [mf]
[2023:01:20:02:38:16]: Info: Set GPU preference: 1
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [h264_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [hevc_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:18]: Warning: mf: h264 missing sps->vui parameters
[2023:01:20:02:38:18]: Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: // Ignore any errors mentioned above, they are not relevant. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: Found encoder mf: [h264_mf, hevc_mf]
[2023:01:20:02:38:18]: Info: Configuration UI available at [https://localhost:50990]
[2023:01:20:02:38:18]: Info: Registered Sunshine mDNS service
[2023:01:20:02:38:26]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:27]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:34]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: Executing [Desktop]
[2023:01:20:02:38:36]: Info: CLIENT CONNECTED
[2023:01:20:02:38:37]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:37]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:37]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Capture format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:37]: Info: Color range: [MPEG]
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: CLIENT DISCONNECTED

Comment threadsrc/platform/common.h Outdated
*/
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, int target_format) {
BOOST_LOG(error) << "Illegal call to hwdevice_t::set_frame(). Did you forget to override it?";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is triggered when encoder = software is set (and causes the software encoders to become unavailable).

Comment threadsrc/video.cpp Outdated
}

int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, AVPixelFormat target_format) {

@psyke83psyke83Jan 21, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changing AVPixelFormat here to int (or perhaps updating in all other cases to AVPixelFormat) should fix the issue with software rendering.

@psyke83

Copy link
Copy Markdown
Contributor

Apart from the software rendering regression that needs fixing, this looks good to me... with the caveat that my AMD card seems to violate the target bitrate by at least 3x. I'm not really sure why this happens, and manually testing other encoder parameters doesn't help.

Of course, don't take my observation re: bitrate as a reason to block merging, as MediaFoundation is never going to be preferred over AMF for AMD cards.

@ReenigneArcher

Copy link
Copy Markdown
Member

I think I'm going to put this on hold and work on QSV instead.

@cgutman Any thoughts on resuming work on this one (if anything else is needed before merging)?

@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I'm concerned that GPUs might hit this fallback due to race conditions during driver installation or monitor hotplugging. I want to do some work first to minimize the chance of that happening (and fix the bug in software encoding).

@cgutman
cgutman marked this pull request as draft March 10, 2023 03:44
@ReenigneArcher

Copy link
Copy Markdown
Member

Updating w/ rebase to make this easier to fix conflicts after adjusting clang-format rules

@cgutman
cgutman marked this pull request as ready for review April 12, 2023 03:14
@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I think there may be a leak in the Media Foundation encoder in FFmpeg or maybe something in the Intel driver that I'm testing with, but memory usage increases each time the encoder loads and seems to never drop back to normal. That will probably need to be investigated before this is merged.

@cgutman
cgutman marked this pull request as draft April 12, 2023 03:28
@LizardByte-bot

Copy link
Copy Markdown
Member

This PR is stale because it has been open for 90 days with no activity. Comment or remove the stale label, otherwise this will be closed in 10 days.

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cgutman@psyke83@brad-richardson@Isalight@ReenigneArcher@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add Media Foundation encoder - #681

Closed
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation
Closed

Add Media Foundation encoder#681
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation

Conversation

@cgutman

@cgutmancgutman commented Jan 3, 2023

Copy link
Copy Markdown
Collaborator

Description

This PR introduces support for Media Foundation encoders (h264_mf and hevc_mf). This enables partial hardware acceleration on Windows systems where NVENC, QSV, and AMD AMF are unsupported, like ARM platforms. I also implemented support for GPU accelerated color conversion when encoding from CPU memory and enabled that feature for Media Foundation.

Screenshot

image

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

Branch Updates

LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.

  • I want maintainers to keep my branch updated

@cgutman
cgutman marked this pull request as draft January 3, 2023 01:11
Comment threaddocs/source/about/advanced_usage.rst Outdated
@psyke83

psyke83 commented Jan 3, 2023

Copy link
Copy Markdown
Contributor

I tested this on my RX 6600. While I understand that MF is inferior to AMF, I noticed an issue with delayed frames that can't be resolved with the existing ffmpeg encoder parameters.

I've opened a PR that should help: LizardByte/build-deps#72

This will require you to add the low_latency param to this PR for changes to take effect.

@brad-richardson

Copy link
Copy Markdown
Contributor

I'm getting a segfault on line 1030 of video.cpp with an Intel dGPU

Here's some of my log: https://gist.github.com/brad-richardson/4ad89fbd492ad211463f367c462a7875

Any ideas for configs to try or that I'm missing?

@cgutman

cgutman commented Jan 4, 2023

Copy link
Copy Markdown
CollaboratorAuthor

@brad-richardson Yeah, I saw the same issue on my ARM machine. There is a bug on FFmpeg where it double-releases an internal Media Foundation pointer if initialization fails to set an output format. For my ARM system, it didn't like the rate control mode I had set and setting it to cbr fixed the crash.

FFmpeg's MF support seems pretty poor. It doesn't have a lot of the config parameters plumbed, crashes when init fails, doesn't support GPU surfaces, etc. I think I'm going to put this on hold and work on QSV instead.

Comment threadsrc_assets/common/assets/web/config.html
@cgutman
cgutman marked this pull request as ready for review January 19, 2023 02:55
@Isalight

Copy link
Copy Markdown

On AMD Vega 6 don't work H264 (black screen when streaming). H265 works fine.

[2023:01:20:02:38:16]: Info: Compiling shaders...
[2023:01:20:02:38:16]: Info: Compiled shaders
[2023:01:20:02:38:16]: Info: Trying encoder [mf]
[2023:01:20:02:38:16]: Info: Set GPU preference: 1
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [h264_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [hevc_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:18]: Warning: mf: h264 missing sps->vui parameters
[2023:01:20:02:38:18]: Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: // Ignore any errors mentioned above, they are not relevant. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: Found encoder mf: [h264_mf, hevc_mf]
[2023:01:20:02:38:18]: Info: Configuration UI available at [https://localhost:50990]
[2023:01:20:02:38:18]: Info: Registered Sunshine mDNS service
[2023:01:20:02:38:26]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:27]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:34]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: Executing [Desktop]
[2023:01:20:02:38:36]: Info: CLIENT CONNECTED
[2023:01:20:02:38:37]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:37]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:37]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Capture format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:37]: Info: Color range: [MPEG]
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: CLIENT DISCONNECTED

Comment threadsrc/platform/common.h Outdated
*/
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, int target_format) {
BOOST_LOG(error) << "Illegal call to hwdevice_t::set_frame(). Did you forget to override it?";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is triggered when encoder = software is set (and causes the software encoders to become unavailable).

Comment threadsrc/video.cpp Outdated
}

int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, AVPixelFormat target_format) {

@psyke83psyke83Jan 21, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changing AVPixelFormat here to int (or perhaps updating in all other cases to AVPixelFormat) should fix the issue with software rendering.

@psyke83

Copy link
Copy Markdown
Contributor

Apart from the software rendering regression that needs fixing, this looks good to me... with the caveat that my AMD card seems to violate the target bitrate by at least 3x. I'm not really sure why this happens, and manually testing other encoder parameters doesn't help.

Of course, don't take my observation re: bitrate as a reason to block merging, as MediaFoundation is never going to be preferred over AMF for AMD cards.

@ReenigneArcher

Copy link
Copy Markdown
Member

I think I'm going to put this on hold and work on QSV instead.

@cgutman Any thoughts on resuming work on this one (if anything else is needed before merging)?

@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I'm concerned that GPUs might hit this fallback due to race conditions during driver installation or monitor hotplugging. I want to do some work first to minimize the chance of that happening (and fix the bug in software encoding).

@cgutman
cgutman marked this pull request as draft March 10, 2023 03:44
@ReenigneArcher

Copy link
Copy Markdown
Member

Updating w/ rebase to make this easier to fix conflicts after adjusting clang-format rules

@cgutman
cgutman marked this pull request as ready for review April 12, 2023 03:14
@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I think there may be a leak in the Media Foundation encoder in FFmpeg or maybe something in the Intel driver that I'm testing with, but memory usage increases each time the encoder loads and seems to never drop back to normal. That will probably need to be investigated before this is merged.

@cgutman
cgutman marked this pull request as draft April 12, 2023 03:28
@LizardByte-bot

Copy link
Copy Markdown
Member

This PR is stale because it has been open for 90 days with no activity. Comment or remove the stale label, otherwise this will be closed in 10 days.

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cgutman@psyke83@brad-richardson@Isalight@ReenigneArcher@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Media Foundation encoder - #681

Closed
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation
Closed

Add Media Foundation encoder#681
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation

Conversation

@cgutman

@cgutmancgutman commented Jan 3, 2023

Copy link
Copy Markdown
Collaborator

Description

This PR introduces support for Media Foundation encoders (h264_mf and hevc_mf). This enables partial hardware acceleration on Windows systems where NVENC, QSV, and AMD AMF are unsupported, like ARM platforms. I also implemented support for GPU accelerated color conversion when encoding from CPU memory and enabled that feature for Media Foundation.

Screenshot

image

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

Branch Updates

LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.

  • I want maintainers to keep my branch updated

@cgutman
cgutman marked this pull request as draft January 3, 2023 01:11
Comment threaddocs/source/about/advanced_usage.rst Outdated
@psyke83

psyke83 commented Jan 3, 2023

Copy link
Copy Markdown
Contributor

I tested this on my RX 6600. While I understand that MF is inferior to AMF, I noticed an issue with delayed frames that can't be resolved with the existing ffmpeg encoder parameters.

I've opened a PR that should help: LizardByte/build-deps#72

This will require you to add the low_latency param to this PR for changes to take effect.

@brad-richardson

Copy link
Copy Markdown
Contributor

I'm getting a segfault on line 1030 of video.cpp with an Intel dGPU

Here's some of my log: https://gist.github.com/brad-richardson/4ad89fbd492ad211463f367c462a7875

Any ideas for configs to try or that I'm missing?

@cgutman

cgutman commented Jan 4, 2023

Copy link
Copy Markdown
CollaboratorAuthor

@brad-richardson Yeah, I saw the same issue on my ARM machine. There is a bug on FFmpeg where it double-releases an internal Media Foundation pointer if initialization fails to set an output format. For my ARM system, it didn't like the rate control mode I had set and setting it to cbr fixed the crash.

FFmpeg's MF support seems pretty poor. It doesn't have a lot of the config parameters plumbed, crashes when init fails, doesn't support GPU surfaces, etc. I think I'm going to put this on hold and work on QSV instead.

Comment threadsrc_assets/common/assets/web/config.html
@cgutman
cgutman marked this pull request as ready for review January 19, 2023 02:55
@Isalight

Copy link
Copy Markdown

On AMD Vega 6 don't work H264 (black screen when streaming). H265 works fine.

[2023:01:20:02:38:16]: Info: Compiling shaders...
[2023:01:20:02:38:16]: Info: Compiled shaders
[2023:01:20:02:38:16]: Info: Trying encoder [mf]
[2023:01:20:02:38:16]: Info: Set GPU preference: 1
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [h264_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [hevc_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:18]: Warning: mf: h264 missing sps->vui parameters
[2023:01:20:02:38:18]: Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: // Ignore any errors mentioned above, they are not relevant. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: Found encoder mf: [h264_mf, hevc_mf]
[2023:01:20:02:38:18]: Info: Configuration UI available at [https://localhost:50990]
[2023:01:20:02:38:18]: Info: Registered Sunshine mDNS service
[2023:01:20:02:38:26]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:27]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:34]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: Executing [Desktop]
[2023:01:20:02:38:36]: Info: CLIENT CONNECTED
[2023:01:20:02:38:37]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:37]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:37]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Capture format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:37]: Info: Color range: [MPEG]
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: CLIENT DISCONNECTED

Comment threadsrc/platform/common.h Outdated
*/
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, int target_format) {
BOOST_LOG(error) << "Illegal call to hwdevice_t::set_frame(). Did you forget to override it?";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is triggered when encoder = software is set (and causes the software encoders to become unavailable).

Comment threadsrc/video.cpp Outdated
}

int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, AVPixelFormat target_format) {

@psyke83psyke83Jan 21, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changing AVPixelFormat here to int (or perhaps updating in all other cases to AVPixelFormat) should fix the issue with software rendering.

@psyke83

Copy link
Copy Markdown
Contributor

Apart from the software rendering regression that needs fixing, this looks good to me... with the caveat that my AMD card seems to violate the target bitrate by at least 3x. I'm not really sure why this happens, and manually testing other encoder parameters doesn't help.

Of course, don't take my observation re: bitrate as a reason to block merging, as MediaFoundation is never going to be preferred over AMF for AMD cards.

@ReenigneArcher

Copy link
Copy Markdown
Member

I think I'm going to put this on hold and work on QSV instead.

@cgutman Any thoughts on resuming work on this one (if anything else is needed before merging)?

@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I'm concerned that GPUs might hit this fallback due to race conditions during driver installation or monitor hotplugging. I want to do some work first to minimize the chance of that happening (and fix the bug in software encoding).

@cgutman
cgutman marked this pull request as draft March 10, 2023 03:44
@ReenigneArcher

Copy link
Copy Markdown
Member

Updating w/ rebase to make this easier to fix conflicts after adjusting clang-format rules

@cgutman
cgutman marked this pull request as ready for review April 12, 2023 03:14
@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I think there may be a leak in the Media Foundation encoder in FFmpeg or maybe something in the Intel driver that I'm testing with, but memory usage increases each time the encoder loads and seems to never drop back to normal. That will probably need to be investigated before this is merged.

@cgutman
cgutman marked this pull request as draft April 12, 2023 03:28
@LizardByte-bot

Copy link
Copy Markdown
Member

This PR is stale because it has been open for 90 days with no activity. Comment or remove the stale label, otherwise this will be closed in 10 days.

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cgutman@psyke83@brad-richardson@Isalight@ReenigneArcher@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Media Foundation encoder - #681

Closed
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation
Closed

Add Media Foundation encoder#681
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation

Conversation

@cgutman

@cgutmancgutman commented Jan 3, 2023

Copy link
Copy Markdown
Collaborator

Description

This PR introduces support for Media Foundation encoders (h264_mf and hevc_mf). This enables partial hardware acceleration on Windows systems where NVENC, QSV, and AMD AMF are unsupported, like ARM platforms. I also implemented support for GPU accelerated color conversion when encoding from CPU memory and enabled that feature for Media Foundation.

Screenshot

image

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

Branch Updates

LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.

  • I want maintainers to keep my branch updated

@cgutman
cgutman marked this pull request as draft January 3, 2023 01:11
Comment threaddocs/source/about/advanced_usage.rst Outdated
@psyke83

psyke83 commented Jan 3, 2023

Copy link
Copy Markdown
Contributor

I tested this on my RX 6600. While I understand that MF is inferior to AMF, I noticed an issue with delayed frames that can't be resolved with the existing ffmpeg encoder parameters.

I've opened a PR that should help: LizardByte/build-deps#72

This will require you to add the low_latency param to this PR for changes to take effect.

@brad-richardson

Copy link
Copy Markdown
Contributor

I'm getting a segfault on line 1030 of video.cpp with an Intel dGPU

Here's some of my log: https://gist.github.com/brad-richardson/4ad89fbd492ad211463f367c462a7875

Any ideas for configs to try or that I'm missing?

@cgutman

cgutman commented Jan 4, 2023

Copy link
Copy Markdown
CollaboratorAuthor

@brad-richardson Yeah, I saw the same issue on my ARM machine. There is a bug on FFmpeg where it double-releases an internal Media Foundation pointer if initialization fails to set an output format. For my ARM system, it didn't like the rate control mode I had set and setting it to cbr fixed the crash.

FFmpeg's MF support seems pretty poor. It doesn't have a lot of the config parameters plumbed, crashes when init fails, doesn't support GPU surfaces, etc. I think I'm going to put this on hold and work on QSV instead.

Comment threadsrc_assets/common/assets/web/config.html
@cgutman
cgutman marked this pull request as ready for review January 19, 2023 02:55
@Isalight

Copy link
Copy Markdown

On AMD Vega 6 don't work H264 (black screen when streaming). H265 works fine.

[2023:01:20:02:38:16]: Info: Compiling shaders...
[2023:01:20:02:38:16]: Info: Compiled shaders
[2023:01:20:02:38:16]: Info: Trying encoder [mf]
[2023:01:20:02:38:16]: Info: Set GPU preference: 1
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [h264_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [hevc_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:18]: Warning: mf: h264 missing sps->vui parameters
[2023:01:20:02:38:18]: Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: // Ignore any errors mentioned above, they are not relevant. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: Found encoder mf: [h264_mf, hevc_mf]
[2023:01:20:02:38:18]: Info: Configuration UI available at [https://localhost:50990]
[2023:01:20:02:38:18]: Info: Registered Sunshine mDNS service
[2023:01:20:02:38:26]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:27]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:34]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: Executing [Desktop]
[2023:01:20:02:38:36]: Info: CLIENT CONNECTED
[2023:01:20:02:38:37]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:37]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:37]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Capture format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:37]: Info: Color range: [MPEG]
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: CLIENT DISCONNECTED

Comment threadsrc/platform/common.h Outdated
*/
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, int target_format) {
BOOST_LOG(error) << "Illegal call to hwdevice_t::set_frame(). Did you forget to override it?";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is triggered when encoder = software is set (and causes the software encoders to become unavailable).

Comment threadsrc/video.cpp Outdated
}

int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, AVPixelFormat target_format) {

@psyke83psyke83Jan 21, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changing AVPixelFormat here to int (or perhaps updating in all other cases to AVPixelFormat) should fix the issue with software rendering.

@psyke83

Copy link
Copy Markdown
Contributor

Apart from the software rendering regression that needs fixing, this looks good to me... with the caveat that my AMD card seems to violate the target bitrate by at least 3x. I'm not really sure why this happens, and manually testing other encoder parameters doesn't help.

Of course, don't take my observation re: bitrate as a reason to block merging, as MediaFoundation is never going to be preferred over AMF for AMD cards.

@ReenigneArcher

Copy link
Copy Markdown
Member

I think I'm going to put this on hold and work on QSV instead.

@cgutman Any thoughts on resuming work on this one (if anything else is needed before merging)?

@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I'm concerned that GPUs might hit this fallback due to race conditions during driver installation or monitor hotplugging. I want to do some work first to minimize the chance of that happening (and fix the bug in software encoding).

@cgutman
cgutman marked this pull request as draft March 10, 2023 03:44
@ReenigneArcher

Copy link
Copy Markdown
Member

Updating w/ rebase to make this easier to fix conflicts after adjusting clang-format rules

@cgutman
cgutman marked this pull request as ready for review April 12, 2023 03:14
@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I think there may be a leak in the Media Foundation encoder in FFmpeg or maybe something in the Intel driver that I'm testing with, but memory usage increases each time the encoder loads and seems to never drop back to normal. That will probably need to be investigated before this is merged.

@cgutman
cgutman marked this pull request as draft April 12, 2023 03:28
@LizardByte-bot

Copy link
Copy Markdown
Member

This PR is stale because it has been open for 90 days with no activity. Comment or remove the stale label, otherwise this will be closed in 10 days.

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cgutman@psyke83@brad-richardson@Isalight@ReenigneArcher@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add Media Foundation encoder - #681

Closed
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation
Closed

Add Media Foundation encoder#681
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation

Conversation

@cgutman

@cgutmancgutman commented Jan 3, 2023

Copy link
Copy Markdown
Collaborator

Description

This PR introduces support for Media Foundation encoders (h264_mf and hevc_mf). This enables partial hardware acceleration on Windows systems where NVENC, QSV, and AMD AMF are unsupported, like ARM platforms. I also implemented support for GPU accelerated color conversion when encoding from CPU memory and enabled that feature for Media Foundation.

Screenshot

image

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

Branch Updates

LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.

  • I want maintainers to keep my branch updated

@cgutman
cgutman marked this pull request as draft January 3, 2023 01:11
Comment threaddocs/source/about/advanced_usage.rst Outdated
@psyke83

psyke83 commented Jan 3, 2023

Copy link
Copy Markdown
Contributor

I tested this on my RX 6600. While I understand that MF is inferior to AMF, I noticed an issue with delayed frames that can't be resolved with the existing ffmpeg encoder parameters.

I've opened a PR that should help: LizardByte/build-deps#72

This will require you to add the low_latency param to this PR for changes to take effect.

@brad-richardson

Copy link
Copy Markdown
Contributor

I'm getting a segfault on line 1030 of video.cpp with an Intel dGPU

Here's some of my log: https://gist.github.com/brad-richardson/4ad89fbd492ad211463f367c462a7875

Any ideas for configs to try or that I'm missing?

@cgutman

cgutman commented Jan 4, 2023

Copy link
Copy Markdown
CollaboratorAuthor

@brad-richardson Yeah, I saw the same issue on my ARM machine. There is a bug on FFmpeg where it double-releases an internal Media Foundation pointer if initialization fails to set an output format. For my ARM system, it didn't like the rate control mode I had set and setting it to cbr fixed the crash.

FFmpeg's MF support seems pretty poor. It doesn't have a lot of the config parameters plumbed, crashes when init fails, doesn't support GPU surfaces, etc. I think I'm going to put this on hold and work on QSV instead.

Comment threadsrc_assets/common/assets/web/config.html
@cgutman
cgutman marked this pull request as ready for review January 19, 2023 02:55
@Isalight

Copy link
Copy Markdown

On AMD Vega 6 don't work H264 (black screen when streaming). H265 works fine.

[2023:01:20:02:38:16]: Info: Compiling shaders...
[2023:01:20:02:38:16]: Info: Compiled shaders
[2023:01:20:02:38:16]: Info: Trying encoder [mf]
[2023:01:20:02:38:16]: Info: Set GPU preference: 1
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [h264_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [hevc_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:18]: Warning: mf: h264 missing sps->vui parameters
[2023:01:20:02:38:18]: Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: // Ignore any errors mentioned above, they are not relevant. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: Found encoder mf: [h264_mf, hevc_mf]
[2023:01:20:02:38:18]: Info: Configuration UI available at [https://localhost:50990]
[2023:01:20:02:38:18]: Info: Registered Sunshine mDNS service
[2023:01:20:02:38:26]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:27]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:34]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: Executing [Desktop]
[2023:01:20:02:38:36]: Info: CLIENT CONNECTED
[2023:01:20:02:38:37]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:37]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:37]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Capture format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:37]: Info: Color range: [MPEG]
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: CLIENT DISCONNECTED

Comment threadsrc/platform/common.h Outdated
*/
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, int target_format) {
BOOST_LOG(error) << "Illegal call to hwdevice_t::set_frame(). Did you forget to override it?";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is triggered when encoder = software is set (and causes the software encoders to become unavailable).

Comment threadsrc/video.cpp Outdated
}

int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, AVPixelFormat target_format) {

@psyke83psyke83Jan 21, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changing AVPixelFormat here to int (or perhaps updating in all other cases to AVPixelFormat) should fix the issue with software rendering.

@psyke83

Copy link
Copy Markdown
Contributor

Apart from the software rendering regression that needs fixing, this looks good to me... with the caveat that my AMD card seems to violate the target bitrate by at least 3x. I'm not really sure why this happens, and manually testing other encoder parameters doesn't help.

Of course, don't take my observation re: bitrate as a reason to block merging, as MediaFoundation is never going to be preferred over AMF for AMD cards.

@ReenigneArcher

Copy link
Copy Markdown
Member

I think I'm going to put this on hold and work on QSV instead.

@cgutman Any thoughts on resuming work on this one (if anything else is needed before merging)?

@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I'm concerned that GPUs might hit this fallback due to race conditions during driver installation or monitor hotplugging. I want to do some work first to minimize the chance of that happening (and fix the bug in software encoding).

@cgutman
cgutman marked this pull request as draft March 10, 2023 03:44
@ReenigneArcher

Copy link
Copy Markdown
Member

Updating w/ rebase to make this easier to fix conflicts after adjusting clang-format rules

@cgutman
cgutman marked this pull request as ready for review April 12, 2023 03:14
@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I think there may be a leak in the Media Foundation encoder in FFmpeg or maybe something in the Intel driver that I'm testing with, but memory usage increases each time the encoder loads and seems to never drop back to normal. That will probably need to be investigated before this is merged.

@cgutman
cgutman marked this pull request as draft April 12, 2023 03:28
@LizardByte-bot

Copy link
Copy Markdown
Member

This PR is stale because it has been open for 90 days with no activity. Comment or remove the stale label, otherwise this will be closed in 10 days.

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cgutman@psyke83@brad-richardson@Isalight@ReenigneArcher@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Media Foundation encoder - #681

Closed
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation
Closed

Add Media Foundation encoder#681
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation

Conversation

@cgutman

@cgutmancgutman commented Jan 3, 2023

Copy link
Copy Markdown
Collaborator

Description

This PR introduces support for Media Foundation encoders (h264_mf and hevc_mf). This enables partial hardware acceleration on Windows systems where NVENC, QSV, and AMD AMF are unsupported, like ARM platforms. I also implemented support for GPU accelerated color conversion when encoding from CPU memory and enabled that feature for Media Foundation.

Screenshot

image

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

Branch Updates

LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.

  • I want maintainers to keep my branch updated

@cgutman
cgutman marked this pull request as draft January 3, 2023 01:11
Comment threaddocs/source/about/advanced_usage.rst Outdated
@psyke83

psyke83 commented Jan 3, 2023

Copy link
Copy Markdown
Contributor

I tested this on my RX 6600. While I understand that MF is inferior to AMF, I noticed an issue with delayed frames that can't be resolved with the existing ffmpeg encoder parameters.

I've opened a PR that should help: LizardByte/build-deps#72

This will require you to add the low_latency param to this PR for changes to take effect.

@brad-richardson

Copy link
Copy Markdown
Contributor

I'm getting a segfault on line 1030 of video.cpp with an Intel dGPU

Here's some of my log: https://gist.github.com/brad-richardson/4ad89fbd492ad211463f367c462a7875

Any ideas for configs to try or that I'm missing?

@cgutman

cgutman commented Jan 4, 2023

Copy link
Copy Markdown
CollaboratorAuthor

@brad-richardson Yeah, I saw the same issue on my ARM machine. There is a bug on FFmpeg where it double-releases an internal Media Foundation pointer if initialization fails to set an output format. For my ARM system, it didn't like the rate control mode I had set and setting it to cbr fixed the crash.

FFmpeg's MF support seems pretty poor. It doesn't have a lot of the config parameters plumbed, crashes when init fails, doesn't support GPU surfaces, etc. I think I'm going to put this on hold and work on QSV instead.

Comment threadsrc_assets/common/assets/web/config.html
@cgutman
cgutman marked this pull request as ready for review January 19, 2023 02:55
@Isalight

Copy link
Copy Markdown

On AMD Vega 6 don't work H264 (black screen when streaming). H265 works fine.

[2023:01:20:02:38:16]: Info: Compiling shaders...
[2023:01:20:02:38:16]: Info: Compiled shaders
[2023:01:20:02:38:16]: Info: Trying encoder [mf]
[2023:01:20:02:38:16]: Info: Set GPU preference: 1
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [h264_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [hevc_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:18]: Warning: mf: h264 missing sps->vui parameters
[2023:01:20:02:38:18]: Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: // Ignore any errors mentioned above, they are not relevant. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: Found encoder mf: [h264_mf, hevc_mf]
[2023:01:20:02:38:18]: Info: Configuration UI available at [https://localhost:50990]
[2023:01:20:02:38:18]: Info: Registered Sunshine mDNS service
[2023:01:20:02:38:26]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:27]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:34]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: Executing [Desktop]
[2023:01:20:02:38:36]: Info: CLIENT CONNECTED
[2023:01:20:02:38:37]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:37]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:37]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Capture format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:37]: Info: Color range: [MPEG]
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: CLIENT DISCONNECTED

Comment threadsrc/platform/common.h Outdated
*/
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, int target_format) {
BOOST_LOG(error) << "Illegal call to hwdevice_t::set_frame(). Did you forget to override it?";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is triggered when encoder = software is set (and causes the software encoders to become unavailable).

Comment threadsrc/video.cpp Outdated
}

int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, AVPixelFormat target_format) {

@psyke83psyke83Jan 21, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changing AVPixelFormat here to int (or perhaps updating in all other cases to AVPixelFormat) should fix the issue with software rendering.

@psyke83

Copy link
Copy Markdown
Contributor

Apart from the software rendering regression that needs fixing, this looks good to me... with the caveat that my AMD card seems to violate the target bitrate by at least 3x. I'm not really sure why this happens, and manually testing other encoder parameters doesn't help.

Of course, don't take my observation re: bitrate as a reason to block merging, as MediaFoundation is never going to be preferred over AMF for AMD cards.

@ReenigneArcher

Copy link
Copy Markdown
Member

I think I'm going to put this on hold and work on QSV instead.

@cgutman Any thoughts on resuming work on this one (if anything else is needed before merging)?

@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I'm concerned that GPUs might hit this fallback due to race conditions during driver installation or monitor hotplugging. I want to do some work first to minimize the chance of that happening (and fix the bug in software encoding).

@cgutman
cgutman marked this pull request as draft March 10, 2023 03:44
@ReenigneArcher

Copy link
Copy Markdown
Member

Updating w/ rebase to make this easier to fix conflicts after adjusting clang-format rules

@cgutman
cgutman marked this pull request as ready for review April 12, 2023 03:14
@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I think there may be a leak in the Media Foundation encoder in FFmpeg or maybe something in the Intel driver that I'm testing with, but memory usage increases each time the encoder loads and seems to never drop back to normal. That will probably need to be investigated before this is merged.

@cgutman
cgutman marked this pull request as draft April 12, 2023 03:28
@LizardByte-bot

Copy link
Copy Markdown
Member

This PR is stale because it has been open for 90 days with no activity. Comment or remove the stale label, otherwise this will be closed in 10 days.

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cgutman@psyke83@brad-richardson@Isalight@ReenigneArcher@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add Media Foundation encoder - #681

Closed
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation
Closed

Add Media Foundation encoder#681
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation

Conversation

@cgutman

@cgutmancgutman commented Jan 3, 2023

Copy link
Copy Markdown
Collaborator

Description

This PR introduces support for Media Foundation encoders (h264_mf and hevc_mf). This enables partial hardware acceleration on Windows systems where NVENC, QSV, and AMD AMF are unsupported, like ARM platforms. I also implemented support for GPU accelerated color conversion when encoding from CPU memory and enabled that feature for Media Foundation.

Screenshot

image

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

Branch Updates

LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.

  • I want maintainers to keep my branch updated

@cgutman
cgutman marked this pull request as draft January 3, 2023 01:11
Comment threaddocs/source/about/advanced_usage.rst Outdated
@psyke83

psyke83 commented Jan 3, 2023

Copy link
Copy Markdown
Contributor

I tested this on my RX 6600. While I understand that MF is inferior to AMF, I noticed an issue with delayed frames that can't be resolved with the existing ffmpeg encoder parameters.

I've opened a PR that should help: LizardByte/build-deps#72

This will require you to add the low_latency param to this PR for changes to take effect.

@brad-richardson

Copy link
Copy Markdown
Contributor

I'm getting a segfault on line 1030 of video.cpp with an Intel dGPU

Here's some of my log: https://gist.github.com/brad-richardson/4ad89fbd492ad211463f367c462a7875

Any ideas for configs to try or that I'm missing?

@cgutman

cgutman commented Jan 4, 2023

Copy link
Copy Markdown
CollaboratorAuthor

@brad-richardson Yeah, I saw the same issue on my ARM machine. There is a bug on FFmpeg where it double-releases an internal Media Foundation pointer if initialization fails to set an output format. For my ARM system, it didn't like the rate control mode I had set and setting it to cbr fixed the crash.

FFmpeg's MF support seems pretty poor. It doesn't have a lot of the config parameters plumbed, crashes when init fails, doesn't support GPU surfaces, etc. I think I'm going to put this on hold and work on QSV instead.

Comment threadsrc_assets/common/assets/web/config.html
@cgutman
cgutman marked this pull request as ready for review January 19, 2023 02:55
@Isalight

Copy link
Copy Markdown

On AMD Vega 6 don't work H264 (black screen when streaming). H265 works fine.

[2023:01:20:02:38:16]: Info: Compiling shaders...
[2023:01:20:02:38:16]: Info: Compiled shaders
[2023:01:20:02:38:16]: Info: Trying encoder [mf]
[2023:01:20:02:38:16]: Info: Set GPU preference: 1
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [h264_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [hevc_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:18]: Warning: mf: h264 missing sps->vui parameters
[2023:01:20:02:38:18]: Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: // Ignore any errors mentioned above, they are not relevant. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: Found encoder mf: [h264_mf, hevc_mf]
[2023:01:20:02:38:18]: Info: Configuration UI available at [https://localhost:50990]
[2023:01:20:02:38:18]: Info: Registered Sunshine mDNS service
[2023:01:20:02:38:26]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:27]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:34]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: Executing [Desktop]
[2023:01:20:02:38:36]: Info: CLIENT CONNECTED
[2023:01:20:02:38:37]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:37]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:37]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Capture format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:37]: Info: Color range: [MPEG]
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: CLIENT DISCONNECTED

Comment threadsrc/platform/common.h Outdated
*/
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, int target_format) {
BOOST_LOG(error) << "Illegal call to hwdevice_t::set_frame(). Did you forget to override it?";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is triggered when encoder = software is set (and causes the software encoders to become unavailable).

Comment threadsrc/video.cpp Outdated
}

int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, AVPixelFormat target_format) {

@psyke83psyke83Jan 21, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changing AVPixelFormat here to int (or perhaps updating in all other cases to AVPixelFormat) should fix the issue with software rendering.

@psyke83

Copy link
Copy Markdown
Contributor

Apart from the software rendering regression that needs fixing, this looks good to me... with the caveat that my AMD card seems to violate the target bitrate by at least 3x. I'm not really sure why this happens, and manually testing other encoder parameters doesn't help.

Of course, don't take my observation re: bitrate as a reason to block merging, as MediaFoundation is never going to be preferred over AMF for AMD cards.

@ReenigneArcher

Copy link
Copy Markdown
Member

I think I'm going to put this on hold and work on QSV instead.

@cgutman Any thoughts on resuming work on this one (if anything else is needed before merging)?

@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I'm concerned that GPUs might hit this fallback due to race conditions during driver installation or monitor hotplugging. I want to do some work first to minimize the chance of that happening (and fix the bug in software encoding).

@cgutman
cgutman marked this pull request as draft March 10, 2023 03:44
@ReenigneArcher

Copy link
Copy Markdown
Member

Updating w/ rebase to make this easier to fix conflicts after adjusting clang-format rules

@cgutman
cgutman marked this pull request as ready for review April 12, 2023 03:14
@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I think there may be a leak in the Media Foundation encoder in FFmpeg or maybe something in the Intel driver that I'm testing with, but memory usage increases each time the encoder loads and seems to never drop back to normal. That will probably need to be investigated before this is merged.

@cgutman
cgutman marked this pull request as draft April 12, 2023 03:28
@LizardByte-bot

Copy link
Copy Markdown
Member

This PR is stale because it has been open for 90 days with no activity. Comment or remove the stale label, otherwise this will be closed in 10 days.

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cgutman@psyke83@brad-richardson@Isalight@ReenigneArcher@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add Media Foundation encoder - #681

Closed
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation
Closed

Add Media Foundation encoder#681
cgutman wants to merge 2 commits into
LizardByte:nightlyfrom
cgutman:mediafoundation

Conversation

@cgutman

@cgutmancgutman commented Jan 3, 2023

Copy link
Copy Markdown
Collaborator

Description

This PR introduces support for Media Foundation encoders (h264_mf and hevc_mf). This enables partial hardware acceleration on Windows systems where NVENC, QSV, and AMD AMF are unsupported, like ARM platforms. I also implemented support for GPU accelerated color conversion when encoding from CPU memory and enabled that feature for Media Foundation.

Screenshot

image

Issues Fixed or Closed

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Dependency update (updates to dependencies)
  • Documentation update (changes to documentation)
  • Repository update (changes to repository files, e.g. .github/...)

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated the in code docstring/documentation-blocks for new or existing methods/components

Branch Updates

LizardByte requires that branches be up-to-date before merging. This means that after any PR is merged, this branch
must be updated before it can be merged. You must also
Allow edits from maintainers.

  • I want maintainers to keep my branch updated

@cgutman
cgutman marked this pull request as draft January 3, 2023 01:11
Comment threaddocs/source/about/advanced_usage.rst Outdated
@psyke83

psyke83 commented Jan 3, 2023

Copy link
Copy Markdown
Contributor

I tested this on my RX 6600. While I understand that MF is inferior to AMF, I noticed an issue with delayed frames that can't be resolved with the existing ffmpeg encoder parameters.

I've opened a PR that should help: LizardByte/build-deps#72

This will require you to add the low_latency param to this PR for changes to take effect.

@brad-richardson

Copy link
Copy Markdown
Contributor

I'm getting a segfault on line 1030 of video.cpp with an Intel dGPU

Here's some of my log: https://gist.github.com/brad-richardson/4ad89fbd492ad211463f367c462a7875

Any ideas for configs to try or that I'm missing?

@cgutman

cgutman commented Jan 4, 2023

Copy link
Copy Markdown
CollaboratorAuthor

@brad-richardson Yeah, I saw the same issue on my ARM machine. There is a bug on FFmpeg where it double-releases an internal Media Foundation pointer if initialization fails to set an output format. For my ARM system, it didn't like the rate control mode I had set and setting it to cbr fixed the crash.

FFmpeg's MF support seems pretty poor. It doesn't have a lot of the config parameters plumbed, crashes when init fails, doesn't support GPU surfaces, etc. I think I'm going to put this on hold and work on QSV instead.

Comment threadsrc_assets/common/assets/web/config.html
@cgutman
cgutman marked this pull request as ready for review January 19, 2023 02:55
@Isalight

Copy link
Copy Markdown

On AMD Vega 6 don't work H264 (black screen when streaming). H265 works fine.

[2023:01:20:02:38:16]: Info: Compiling shaders...
[2023:01:20:02:38:16]: Info: Compiled shaders
[2023:01:20:02:38:16]: Info: Trying encoder [mf]
[2023:01:20:02:38:16]: Info: Set GPU preference: 1
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:16]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:16]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:16]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:16]: Info: Color range: [JPEG]
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:16]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [h264_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Could not open codec [hevc_mf]: Invalid argument
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Error: Couldn't read packet: Invalid data found when processing input
[2023:01:20:02:38:17]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:17]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:17]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:17]: Info: Color coding [Rec. 601]
[2023:01:20:02:38:17]: Info: Color range: [JPEG]
[2023:01:20:02:38:18]: Warning: mf: h264 missing sps->vui parameters
[2023:01:20:02:38:18]: Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: // Ignore any errors mentioned above, they are not relevant. //
[2023:01:20:02:38:18]: Info: [2023:01:20:02:38:18]: Info: Found encoder mf: [h264_mf, hevc_mf]
[2023:01:20:02:38:18]: Info: Configuration UI available at [https://localhost:50990]
[2023:01:20:02:38:18]: Info: Registered Sunshine mDNS service
[2023:01:20:02:38:26]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:27]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:34]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:35]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:36]: Info: Executing [Desktop]
[2023:01:20:02:38:36]: Info: CLIENT CONNECTED
[2023:01:20:02:38:37]: Info: Device Description : AMD Radeon(TM) Graphics
Device Vendor ID : 0x00001002
Device Device ID : 0x00001636
Device Video Mem : 495 MiB
Device Sys Mem : 0 MiB
Share Sys Mem : 7867 MiB
Feature Level : 0x0000B100
Capture size : 1920x1080
Offset : 0x0
Virtual Desktop : 1920x1080
[2023:01:20:02:38:37]: Info: Desktop resolution [1920x1080]
[2023:01:20:02:38:37]: Info: Desktop format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Capture format [DXGI_FORMAT_B8G8R8A8_UNORM]
[2023:01:20:02:38:37]: Info: Color coding [Rec. 709]
[2023:01:20:02:38:37]: Info: Color range: [MPEG]
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: /CN=NVIDIA GameStream Client -- verified
[2023:01:20:02:38:52]: Info: CLIENT DISCONNECTED

Comment threadsrc/platform/common.h Outdated
*/
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
virtual int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, int target_format) {
BOOST_LOG(error) << "Illegal call to hwdevice_t::set_frame(). Did you forget to override it?";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is triggered when encoder = software is set (and causes the software encoders to become unavailable).

Comment threadsrc/video.cpp Outdated
}

int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx) {
int set_frame(AVFrame *frame, AVBufferRef *hw_frames_ctx, AVPixelFormat target_format) {

@psyke83psyke83Jan 21, 2023

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changing AVPixelFormat here to int (or perhaps updating in all other cases to AVPixelFormat) should fix the issue with software rendering.

@psyke83

Copy link
Copy Markdown
Contributor

Apart from the software rendering regression that needs fixing, this looks good to me... with the caveat that my AMD card seems to violate the target bitrate by at least 3x. I'm not really sure why this happens, and manually testing other encoder parameters doesn't help.

Of course, don't take my observation re: bitrate as a reason to block merging, as MediaFoundation is never going to be preferred over AMF for AMD cards.

@ReenigneArcher

Copy link
Copy Markdown
Member

I think I'm going to put this on hold and work on QSV instead.

@cgutman Any thoughts on resuming work on this one (if anything else is needed before merging)?

@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I'm concerned that GPUs might hit this fallback due to race conditions during driver installation or monitor hotplugging. I want to do some work first to minimize the chance of that happening (and fix the bug in software encoding).

@cgutman
cgutman marked this pull request as draft March 10, 2023 03:44
@ReenigneArcher

Copy link
Copy Markdown
Member

Updating w/ rebase to make this easier to fix conflicts after adjusting clang-format rules

@cgutman
cgutman marked this pull request as ready for review April 12, 2023 03:14
@cgutman

Copy link
Copy Markdown
CollaboratorAuthor

I think there may be a leak in the Media Foundation encoder in FFmpeg or maybe something in the Intel driver that I'm testing with, but memory usage increases each time the encoder loads and seems to never drop back to normal. That will probably need to be investigated before this is merged.

@cgutman
cgutman marked this pull request as draft April 12, 2023 03:28
@LizardByte-bot

Copy link
Copy Markdown
Member

This PR is stale because it has been open for 90 days with no activity. Comment or remove the stale label, otherwise this will be closed in 10 days.

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@cgutman@psyke83@brad-richardson@Isalight@ReenigneArcher@LizardByte-bot