HRESULT WMFReader::ConfigureVideoDecoder() { NS_ASSERTION(mSourceReader, "Must have a SourceReader before configuring decoders!"); // Determine if we have video. if (!mSourceReader || !SourceReaderHasStream(mSourceReader, MF_SOURCE_READER_FIRST_VIDEO_STREAM)) { // No stream, no error. return S_OK; } if (!mDecoder->GetImageContainer()) { // We can't display the video, so don't bother to decode; disable the stream. return mSourceReader->SetStreamSelection(MF_SOURCE_READER_FIRST_VIDEO_STREAM, FALSE); } static const GUID MP4VideoTypes[] = { MFVideoFormat_H264 }; HRESULT hr = ConfigureSourceReaderStream(mSourceReader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, mUseHwAccel ? MFVideoFormat_NV12 : MFVideoFormat_YV12, MP4VideoTypes, ArrayLength(MP4VideoTypes)); if (FAILED(hr)) { DECODER_LOG("Failed to configured video output"); return hr; } RefPtr<IMFMediaType> mediaType; hr = mSourceReader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, byRef(mediaType)); if (FAILED(hr)) { NS_WARNING("Failed to get configured video media type"); return hr; } if (FAILED(ConfigureVideoFrameGeometry(mediaType))) { NS_WARNING("Failed configured video frame dimensions"); return hr; } DECODER_LOG("Successfully configured video stream"); mHasVideo = true; return S_OK; }
HRESULT WMFReader::ConfigureAudioDecoder() { NS_ASSERTION(mSourceReader, "Must have a SourceReader before configuring decoders!"); if (!mSourceReader || !SourceReaderHasStream(mSourceReader, MF_SOURCE_READER_FIRST_AUDIO_STREAM)) { // No stream, no error. return S_OK; } const GUID* codecs; uint32_t numCodecs = 0; GetSupportedAudioCodecs(&codecs, &numCodecs); HRESULT hr = ConfigureSourceReaderStream(mSourceReader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, MFAudioFormat_Float, codecs, numCodecs); if (FAILED(hr)) { NS_WARNING("Failed to configure WMF Audio decoder for PCM output"); return hr; } RefPtr<IMFMediaType> mediaType; hr = mSourceReader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_AUDIO_STREAM, byRef(mediaType)); if (FAILED(hr)) { NS_WARNING("Failed to get configured audio media type"); return hr; } mAudioRate = MFGetAttributeUINT32(mediaType, MF_MT_AUDIO_SAMPLES_PER_SECOND, 0); mAudioChannels = MFGetAttributeUINT32(mediaType, MF_MT_AUDIO_NUM_CHANNELS, 0); mAudioBytesPerSample = MFGetAttributeUINT32(mediaType, MF_MT_AUDIO_BITS_PER_SAMPLE, 16) / 8; mInfo.mAudio.mChannels = mAudioChannels; mInfo.mAudio.mRate = mAudioRate; mHasAudio = true; DECODER_LOG("Successfully configured audio stream. rate=%u channels=%u bitsPerSample=%u", mAudioRate, mAudioChannels, mAudioBytesPerSample); return S_OK; }
HRESULT WMFReader::ConfigureVideoDecoder() { NS_ASSERTION(mSourceReader, "Must have a SourceReader before configuring decoders!"); // Determine if we have video. if (!mSourceReader || !SourceReaderHasStream(mSourceReader, MF_SOURCE_READER_FIRST_VIDEO_STREAM)) { // No stream, no error. return S_OK; } static const GUID MP4VideoTypes[] = { MFVideoFormat_H264 }; HRESULT hr = ConfigureSourceReaderStream(mSourceReader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, mUseHwAccel ? MFVideoFormat_NV12 : MFVideoFormat_YV12, MP4VideoTypes, NS_ARRAY_LENGTH(MP4VideoTypes)); if (FAILED(hr)) { LOG("Failed to configured video output"); return hr; } RefPtr<IMFMediaType> mediaType; hr = mSourceReader->GetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, byRef(mediaType)); if (FAILED(hr)) { NS_WARNING("Failed to get configured video media type"); return hr; } if (FAILED(ConfigureVideoFrameGeometry(mediaType))) { NS_WARNING("Failed configured video frame dimensions"); return hr; } LOG("Successfully configured video stream"); mHasVideo = mInfo.mVideo.mHasVideo = true; return S_OK; }