commit 29d353949582dda8742ea48f0137898bf5e846ca
parent 690667d26164261df846b84bb2f9ec0be40074be
Author: Chun-Min Chang <chun.m.chang@gmail.com>
Date: Sat, 25 Oct 2025 01:01:05 +0000
Bug 1995664 - Differetiate yielded output types in WMF encoder r=media-playback-reviewers,azebrowski
This patch distinguishes yielded output into two types: header and data.
Without this change, the preceding patch would not behave as intended: since the
encoder promise could be resolved upon receiving a new output header instead of
actual output data, resulting in no encoded data being produced for downstream
consumers.
By explicitly separating header and data outputs, the encoder now correctly
resolves encode promise only when output data is available, if the pref added
previously is enabled.
Differential Revision: https://phabricator.services.mozilla.com/D269529
Diffstat:
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/dom/media/platforms/wmf/MFTEncoder.cpp b/dom/media/platforms/wmf/MFTEncoder.cpp
@@ -1282,7 +1282,14 @@ void MFTEncoder::EventHandler(MediaEventType aEventType, HRESULT aStatus) {
}
}
break;
- case ProcessedResult::OutputYielded:
+ case ProcessedResult::OutputHeaderYielded:
+ if (mState == State::Encoding) {
+ if (!waitForOutput) {
+ MaybeResolveOrRejectEncodePromise();
+ }
+ }
+ break;
+ case ProcessedResult::OutputDataYielded:
if (mState == State::Encoding) {
MaybeResolveOrRejectEncodePromise();
}
@@ -1486,7 +1493,7 @@ Result<MFTEncoder::ProcessedResult, HRESULT> MFTEncoder::ProcessOutput() {
if (result.IsHeader()) {
mOutputHeader = result.TakeHeader();
MFT_ENC_LOGD("Got new MPEG header, size: %zu", mOutputHeader.Length());
- return ProcessedResult::OutputYielded;
+ return ProcessedResult::OutputHeaderYielded;
}
MOZ_ASSERT(result.IsSample());
@@ -1494,7 +1501,7 @@ Result<MFTEncoder::ProcessedResult, HRESULT> MFTEncoder::ProcessOutput() {
if (!mOutputHeader.IsEmpty()) {
mOutputs.LastElement().mHeader = std::move(mOutputHeader);
}
- return ProcessedResult::OutputYielded;
+ return ProcessedResult::OutputDataYielded;
}
Result<MFTEncoder::ProcessedResult, HRESULT>
@@ -1550,6 +1557,7 @@ Result<MFTEncoder::OutputResult, HRESULT> MFTEncoder::GetOutputOrNewHeader() {
}
// TODO: We should query for updated stream identifiers here. For now,
// handle this as an error.
+ MFT_ENC_LOGE("Stream identifiers changed");
return Err(hr);
}
diff --git a/dom/media/platforms/wmf/MFTEncoder.h b/dom/media/platforms/wmf/MFTEncoder.h
@@ -116,7 +116,7 @@ class MFTEncoder final {
MOZ_DEFINE_ENUM_CLASS_WITH_TOSTRING_AT_CLASS_SCOPE(
ProcessedResult, (AllAvailableInputsProcessed, InputProcessed,
- OutputYielded, DrainComplete));
+ OutputHeaderYielded, OutputDataYielded, DrainComplete));
using ProcessedResults = EnumSet<ProcessedResult>;
Result<ProcessedResults, HRESULT> ProcessPendingEvents();
Result<MediaEventType, HRESULT> GetPendingEvent();