mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-20 23:37:33 +09:00
Fix DirectShow compile errors
This commit is contained in:
parent
6fd97529b5
commit
47600fab86
7 changed files with 14 additions and 58 deletions
|
|
@ -70,8 +70,7 @@ AudioSinkInputPin::CheckMediaType(const MediaType* aMediaType)
|
|||
|
||||
GUID majorType = *aMediaType->Type();
|
||||
if (majorType == MEDIATYPE_Video &&
|
||||
(*aMediaType->Subtype() == MEDIASUBTYPE_YUY2 ||
|
||||
*aMediaType->Subtype() == MEDIASUBTYPE_I420) &&
|
||||
*aMediaType->Subtype() == MEDIASUBTYPE_YUY2 &&
|
||||
*aMediaType->FormatType() == FORMAT_VideoInfo) {
|
||||
if (aMediaType->cbFormat >= sizeof(VIDEOINFOHEADER)) {
|
||||
memcpy(&mVideoInfo, aMediaType->pbFormat, sizeof(VIDEOINFOHEADER));
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@ static LazyLogModule gDirectShowLog("DirectShowDecoder");
|
|||
|
||||
DirectShowReader::DirectShowReader(AbstractMediaDecoder* aDecoder)
|
||||
: MediaDecoderReader(aDecoder),
|
||||
mMP3FrameParser(aDecoder->GetResource()->GetLength()),
|
||||
#ifdef DIRECTSHOW_REGISTER_GRAPH
|
||||
mRotRegister(0),
|
||||
#endif
|
||||
|
|
@ -53,34 +52,6 @@ DirectShowReader::~DirectShowReader()
|
|||
#endif
|
||||
}
|
||||
|
||||
// Try to parse the MP3 stream to make sure this is indeed an MP3, get the
|
||||
// estimated duration of the stream, and find the offset of the actual MP3
|
||||
// frames in the stream, as DirectShow doesn't like large ID3 sections.
|
||||
static nsresult
|
||||
ParseMP3Headers(MP3FrameParser *aParser, MediaResource *aResource)
|
||||
{
|
||||
const uint32_t MAX_READ_SIZE = 4096;
|
||||
|
||||
uint64_t offset = 0;
|
||||
while (aParser->NeedsData() && !aParser->ParsedHeaders()) {
|
||||
uint32_t bytesRead;
|
||||
char buffer[MAX_READ_SIZE];
|
||||
nsresult rv = aResource->ReadAt(offset, buffer,
|
||||
MAX_READ_SIZE, &bytesRead);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
if (!bytesRead) {
|
||||
// End of stream.
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
aParser->Parse(reinterpret_cast<uint8_t*>(buffer), bytesRead, offset);
|
||||
offset += bytesRead;
|
||||
}
|
||||
|
||||
return aParser->IsMP3() ? NS_OK : NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsresult
|
||||
DirectShowReader::ReadMetadata(MediaInfo* aInfo,
|
||||
MetadataTags** aTags)
|
||||
|
|
@ -114,9 +85,6 @@ DirectShowReader::ReadMetadata(MediaInfo* aInfo,
|
|||
return ReadH264Metadata(aInfo, aTags);
|
||||
}
|
||||
|
||||
rv = ParseMP3Headers(&mMP3FrameParser, mDecoder->GetResource());
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// Build the graph. Create the filters we need, and connect them. We
|
||||
// build the entire graph ourselves to prevent other decoders installed
|
||||
// on the system being created and used.
|
||||
|
|
@ -125,7 +93,7 @@ DirectShowReader::ReadMetadata(MediaInfo* aInfo,
|
|||
mSourceFilter = new SourceFilter(MEDIATYPE_Stream, MEDIASUBTYPE_MPEG1Audio);
|
||||
NS_ENSURE_TRUE(mSourceFilter, NS_ERROR_FAILURE);
|
||||
|
||||
rv = mSourceFilter->Init(mDecoder->GetResource(), mMP3FrameParser.GetMP3Offset());
|
||||
rv = mSourceFilter->Init(mDecoder->GetResource(), 0);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
hr = mGraph->AddFilter(mSourceFilter, L"MozillaDirectShowSource");
|
||||
|
|
@ -189,16 +157,11 @@ DirectShowReader::ReadMetadata(MediaInfo* aInfo,
|
|||
hr = mMediaSeeking->GetCapabilities(&seekCaps);
|
||||
mInfo.mMediaSeekable = SUCCEEDED(hr) && (AM_SEEKING_CanSeekAbsolute & seekCaps);
|
||||
|
||||
int64_t duration = mMP3FrameParser.GetDuration();
|
||||
if (SUCCEEDED(hr)) {
|
||||
mInfo.mMetadataDuration.emplace(TimeUnit::FromMicroseconds(duration));
|
||||
}
|
||||
|
||||
LOG("Successfully initialized DirectShow MP3 decoder.");
|
||||
LOG("Channels=%u Hz=%u duration=%lld bytesPerSample=%d",
|
||||
mInfo.mAudio.mChannels,
|
||||
mInfo.mAudio.mRate,
|
||||
RefTimeToUsecs(duration),
|
||||
0LL,
|
||||
mBytesPerSample);
|
||||
|
||||
*aInfo = mInfo;
|
||||
|
|
@ -378,10 +341,9 @@ DirectShowReader::DecodeVideoFrame(bool &aKeyframeSkip,
|
|||
nsTArray<uint8_t> y;
|
||||
nsTArray<uint8_t> u;
|
||||
nsTArray<uint8_t> v;
|
||||
NS_ENSURE_TRUE(y.SetLength(width * height) &&
|
||||
u.SetLength((width / 2) * (height / 2)) &&
|
||||
v.SetLength((width / 2) * (height / 2)),
|
||||
Finish(E_OUTOFMEMORY));
|
||||
y.SetLength(width * height);
|
||||
u.SetLength((width / 2) * (height / 2));
|
||||
v.SetLength((width / 2) * (height / 2));
|
||||
for (int32_t row = 0; row < height; ++row) {
|
||||
const uint8_t* src = data + row * stride;
|
||||
for (int32_t x = 0; x < width; x += 2) {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@
|
|||
#include "MediaDecoderReader.h"
|
||||
#include "MediaResource.h"
|
||||
#include "mozilla/RefPtr.h"
|
||||
#include "MP3FrameParser.h"
|
||||
|
||||
// Add the graph to the Running Object Table so that we can connect
|
||||
// to this graph with GraphEdit/GraphStudio. Note: you must
|
||||
|
|
@ -85,11 +84,6 @@ private:
|
|||
RefPtr<AudioSinkFilter> mAudioSinkFilter;
|
||||
bool mIsH264;
|
||||
|
||||
// Some MP3s are variable bitrate, so DirectShow's duration estimation
|
||||
// can make its duration estimation based on the wrong bitrate. So we parse
|
||||
// the MP3 frames to get a more accuate estimate of the duration.
|
||||
MP3FrameParser mMP3FrameParser;
|
||||
|
||||
#ifdef DIRECTSHOW_REGISTER_GRAPH
|
||||
// Used to add/remove the filter graph to the Running Object Table. You can
|
||||
// connect GraphEdit/GraphStudio to the graph to observe and/or debug its
|
||||
|
|
|
|||
|
|
@ -309,8 +309,7 @@ CanDecodeH264UsingDirectShow()
|
|||
RefPtr<ICreateDevEnum> devEnum;
|
||||
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr,
|
||||
CLSCTX_INPROC_SERVER,
|
||||
IID_ICreateDevEnum,
|
||||
reinterpret_cast<void**>(getter_AddRefs(devEnum)));
|
||||
IID_ICreateDevEnum, getter_AddRefs(devEnum));
|
||||
if (FAILED(hr)) {
|
||||
return false;
|
||||
}
|
||||
|
|
@ -326,9 +325,9 @@ CanDecodeH264UsingDirectShow()
|
|||
ULONG fetched = 0;
|
||||
while (filters->Next(1, getter_AddRefs(moniker), &fetched) == S_OK) {
|
||||
RefPtr<IPropertyBag> bag;
|
||||
if (SUCCEEDED(moniker->BindToStorage(nullptr, nullptr,
|
||||
if (SUCCEEDED(moniker->BindToStorage(nullptr, nullptr,
|
||||
IID_IPropertyBag,
|
||||
reinterpret_cast<void**>(getter_AddRefs(bag))))) {
|
||||
getter_AddRefs(bag)))) {
|
||||
VARIANT value;
|
||||
VariantInit(&value);
|
||||
if (SUCCEEDED(bag->Read(L"FriendlyName", &value, nullptr)) &&
|
||||
|
|
@ -354,7 +353,7 @@ AddH264DecoderFilter(IGraphBuilder* aGraph, IBaseFilter** aOutFilter)
|
|||
RefPtr<ICreateDevEnum> devEnum;
|
||||
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, nullptr,
|
||||
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
|
||||
reinterpret_cast<void**>(getter_AddRefs(devEnum)));
|
||||
getter_AddRefs(devEnum));
|
||||
NS_ENSURE_TRUE(SUCCEEDED(hr), hr);
|
||||
RefPtr<IEnumMoniker> filters;
|
||||
hr = devEnum->CreateClassEnumerator(CLSID_LegacyAmFilterCategory,
|
||||
|
|
@ -368,7 +367,7 @@ AddH264DecoderFilter(IGraphBuilder* aGraph, IBaseFilter** aOutFilter)
|
|||
VariantInit(&value);
|
||||
bool h264 = false;
|
||||
if (SUCCEEDED(moniker->BindToStorage(nullptr, nullptr, IID_IPropertyBag,
|
||||
reinterpret_cast<void**>(getter_AddRefs(bag)))) &&
|
||||
getter_AddRefs(bag))) &&
|
||||
SUCCEEDED(bag->Read(L"FriendlyName", &value, nullptr)) &&
|
||||
value.vt == VT_BSTR && value.bstrVal) {
|
||||
h264 = wcsstr(value.bstrVal, L"H264") ||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
#include "MediaResource.h"
|
||||
#include "mozilla/RefPtr.h"
|
||||
#include "DirectShowUtils.h"
|
||||
#include "MP3FrameParser.h"
|
||||
#include "mozilla/Logging.h"
|
||||
#include <algorithm>
|
||||
|
||||
|
|
|
|||
|
|
@ -37,5 +37,6 @@ if not CONFIG['MOZ_WEBRTC']:
|
|||
|
||||
FINAL_LIBRARY = 'xul'
|
||||
LOCAL_INCLUDES += [
|
||||
'/dom/media',
|
||||
'/media/webrtc/trunk/webrtc/modules/video_capture/windows',
|
||||
]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue