зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1123269: Better fix for bug 1121876 r=cpearce
This commit is contained in:
Родитель
f6a2bc0fd6
Коммит
f5127dcbe3
|
@ -48,9 +48,9 @@ MFTDecoder::Create(const GUID& aMFTClsID)
|
|||
|
||||
HRESULT
|
||||
MFTDecoder::SetMediaTypes(IMFMediaType* aInputType,
|
||||
const GUID& aOutputSubType)
|
||||
IMFMediaType* aOutputType)
|
||||
{
|
||||
mOutputSubtype = aOutputSubType;
|
||||
mOutputType = aOutputType;
|
||||
|
||||
// Set the input type to the one the caller gave us...
|
||||
HRESULT hr = mDecoder->SetInputType(0, aInputType, 0);
|
||||
|
@ -96,21 +96,14 @@ MFTDecoder::SetDecoderOutputType()
|
|||
RefPtr<IMFMediaType> outputType;
|
||||
UINT32 typeIndex = 0;
|
||||
while (SUCCEEDED(mDecoder->GetOutputAvailableType(0, typeIndex++, byRef(outputType)))) {
|
||||
GUID subtype;
|
||||
hr = outputType->GetGUID(MF_MT_SUBTYPE, &subtype);
|
||||
if (FAILED(hr)) {
|
||||
continue;
|
||||
}
|
||||
if (subtype == mOutputSubtype) {
|
||||
if (subtype == MFAudioFormat_PCM) {
|
||||
// Set output to PCM 16 bits, we can ignore errors.
|
||||
outputType->SetUINT32(MF_MT_SAMPLE_SIZE, 2);
|
||||
outputType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
|
||||
}
|
||||
BOOL resultMatch;
|
||||
hr = mOutputType->Compare(outputType, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &resultMatch);
|
||||
if (SUCCEEDED(hr) && resultMatch == TRUE) {
|
||||
hr = mDecoder->SetOutputType(0, outputType, 0);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
||||
return S_OK;
|
||||
}
|
||||
outputType = nullptr;
|
||||
}
|
||||
return E_FAIL;
|
||||
}
|
||||
|
|
|
@ -33,11 +33,11 @@ public:
|
|||
//
|
||||
// Params:
|
||||
// - aInputType needs at least major and minor types set.
|
||||
// - aOutputSubType is the minor type of the same major type e.g.
|
||||
// MFVideoFormat_H264. This is used to select the output type out
|
||||
// - aOutputType needs at least major and minor types set.
|
||||
// This is used to select the matching output type out
|
||||
// of all the available output types of the MFT.
|
||||
HRESULT SetMediaTypes(IMFMediaType* aInputType,
|
||||
const GUID& aOutputSubType);
|
||||
IMFMediaType* aOutputType);
|
||||
|
||||
// Returns the MFT's IMFAttributes object.
|
||||
TemporaryRef<IMFAttributes> GetAttributes();
|
||||
|
@ -92,7 +92,7 @@ private:
|
|||
|
||||
RefPtr<IMFTransform> mDecoder;
|
||||
|
||||
GUID mOutputSubtype;
|
||||
RefPtr<IMFMediaType> mOutputType;
|
||||
|
||||
// True if the IMFTransform allocates the samples that it returns.
|
||||
bool mMFTProvidesOutputSamples;
|
||||
|
|
|
@ -128,34 +128,47 @@ WMFAudioMFTManager::Init()
|
|||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
// Setup input/output media types
|
||||
RefPtr<IMFMediaType> type;
|
||||
RefPtr<IMFMediaType> inputType;
|
||||
|
||||
hr = wmf::MFCreateMediaType(byRef(type));
|
||||
hr = wmf::MFCreateMediaType(byRef(inputType));
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
|
||||
hr = inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = type->SetGUID(MF_MT_SUBTYPE, GetMediaSubtypeGUID());
|
||||
hr = inputType->SetGUID(MF_MT_SUBTYPE, GetMediaSubtypeGUID());
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = type->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, mAudioRate);
|
||||
hr = inputType->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, mAudioRate);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = type->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, mAudioChannels);
|
||||
hr = inputType->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, mAudioChannels);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
if (mStreamType == AAC) {
|
||||
hr = type->SetUINT32(MF_MT_AAC_PAYLOAD_TYPE, 0x0); // Raw AAC packet
|
||||
hr = inputType->SetUINT32(MF_MT_AAC_PAYLOAD_TYPE, 0x0); // Raw AAC packet
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = type->SetBlob(MF_MT_USER_DATA,
|
||||
mUserData.Elements(),
|
||||
mUserData.Length());
|
||||
hr = inputType->SetBlob(MF_MT_USER_DATA,
|
||||
mUserData.Elements(),
|
||||
mUserData.Length());
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
}
|
||||
|
||||
hr = decoder->SetMediaTypes(type, MFAudioFormat_PCM);
|
||||
RefPtr<IMFMediaType> outputType;
|
||||
hr = wmf::MFCreateMediaType(byRef(outputType));
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = outputType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = outputType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = decoder->SetMediaTypes(inputType, outputType);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
mDecoder = decoder;
|
||||
|
|
|
@ -188,21 +188,31 @@ WMFVideoMFTManager::Init()
|
|||
}
|
||||
|
||||
// Setup the input/output media types.
|
||||
RefPtr<IMFMediaType> type;
|
||||
hr = wmf::MFCreateMediaType(byRef(type));
|
||||
RefPtr<IMFMediaType> inputType;
|
||||
hr = wmf::MFCreateMediaType(byRef(inputType));
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = type->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
|
||||
hr = inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = type->SetGUID(MF_MT_SUBTYPE, GetMediaSubtypeGUID());
|
||||
hr = inputType->SetGUID(MF_MT_SUBTYPE, GetMediaSubtypeGUID());
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = type->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_MixedInterlaceOrProgressive);
|
||||
hr = inputType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_MixedInterlaceOrProgressive);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
GUID outputType = mUseHwAccel ? MFVideoFormat_NV12 : MFVideoFormat_YV12;
|
||||
hr = decoder->SetMediaTypes(type, outputType);
|
||||
RefPtr<IMFMediaType> outputType;
|
||||
hr = wmf::MFCreateMediaType(byRef(outputType));
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
GUID outputSubType = mUseHwAccel ? MFVideoFormat_NV12 : MFVideoFormat_YV12;
|
||||
hr = outputType->SetGUID(MF_MT_SUBTYPE, outputSubType);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
hr = decoder->SetMediaTypes(inputType, outputType);
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
|
||||
|
||||
mDecoder = decoder;
|
||||
|
|
Загрузка…
Ссылка в новой задаче