зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1382099 - Remove MOZ_WIDGET_GONK from dom/media/. r=gerald.
As well as the obvious #ifdefs, this allows DOMHwMediaStream to be removed, and also the "phone-state-changed" observer. --HG-- extra : rebase_source : 373280183e228bd4b9bd9d866959409f2444c77e
This commit is contained in:
Родитель
70ba26c5f9
Коммит
90eaa02ea0
|
@ -1534,178 +1534,3 @@ DOMAudioNodeMediaStream::CreateTrackUnionStreamAsInput(nsPIDOMWindowInner* aWind
|
|||
return stream.forget();
|
||||
}
|
||||
|
||||
DOMHwMediaStream::DOMHwMediaStream(nsPIDOMWindowInner* aWindow)
|
||||
: DOMLocalMediaStream(aWindow, nullptr)
|
||||
{
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
if (!mWindow) {
|
||||
NS_ERROR("Expected window here.");
|
||||
mPrincipalHandle = PRINCIPAL_HANDLE_NONE;
|
||||
return;
|
||||
}
|
||||
nsIDocument* doc = mWindow->GetExtantDoc();
|
||||
if (!doc) {
|
||||
NS_ERROR("Expected document here.");
|
||||
mPrincipalHandle = PRINCIPAL_HANDLE_NONE;
|
||||
return;
|
||||
}
|
||||
mPrincipalHandle = MakePrincipalHandle(doc->NodePrincipal());
|
||||
#endif
|
||||
}
|
||||
|
||||
DOMHwMediaStream::~DOMHwMediaStream()
|
||||
{
|
||||
}
|
||||
|
||||
already_AddRefed<DOMHwMediaStream>
|
||||
DOMHwMediaStream::CreateHwStream(nsPIDOMWindowInner* aWindow,
|
||||
OverlayImage* aImage)
|
||||
{
|
||||
RefPtr<DOMHwMediaStream> stream = new DOMHwMediaStream(aWindow);
|
||||
|
||||
MediaStreamGraph* graph =
|
||||
MediaStreamGraph::GetInstance(MediaStreamGraph::SYSTEM_THREAD_DRIVER,
|
||||
AudioChannel::Normal, aWindow);
|
||||
stream->InitSourceStream(graph);
|
||||
stream->Init(stream->GetInputStream(), aImage);
|
||||
|
||||
return stream.forget();
|
||||
}
|
||||
|
||||
void
|
||||
DOMHwMediaStream::Init(MediaStream* stream, OverlayImage* aImage)
|
||||
{
|
||||
SourceMediaStream* srcStream = stream->AsSourceStream();
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
if (aImage) {
|
||||
mOverlayImage = aImage;
|
||||
} else {
|
||||
Data imageData;
|
||||
imageData.mOverlayId = DEFAULT_IMAGE_ID;
|
||||
imageData.mSize.width = DEFAULT_IMAGE_WIDTH;
|
||||
imageData.mSize.height = DEFAULT_IMAGE_HEIGHT;
|
||||
|
||||
mOverlayImage = new OverlayImage();
|
||||
mOverlayImage->SetData(imageData);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (srcStream) {
|
||||
VideoSegment segment;
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
const StreamTime delta = STREAM_TIME_MAX; // Because MediaStreamGraph will run out frames in non-autoplay mode,
|
||||
// we must give it bigger frame length to cover this situation.
|
||||
|
||||
RefPtr<Image> image = static_cast<Image*>(mOverlayImage.get());
|
||||
mozilla::gfx::IntSize size = image->GetSize();
|
||||
|
||||
segment.AppendFrame(image.forget(), delta, size, mPrincipalHandle);
|
||||
#endif
|
||||
srcStream->AddTrack(TRACK_VIDEO_PRIMARY, 0, new VideoSegment());
|
||||
srcStream->AppendToTrack(TRACK_VIDEO_PRIMARY, &segment);
|
||||
srcStream->AdvanceKnownTracksTime(STREAM_TIME_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
int32_t
|
||||
DOMHwMediaStream::RequestOverlayId()
|
||||
{
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
return mOverlayImage->GetOverlayId();
|
||||
#else
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
DOMHwMediaStream::SetImageSize(uint32_t width, uint32_t height)
|
||||
{
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
if (mOverlayImage->GetSidebandStream().IsValid()) {
|
||||
OverlayImage::SidebandStreamData imgData;
|
||||
imgData.mStream = mOverlayImage->GetSidebandStream();
|
||||
imgData.mSize = IntSize(width, height);
|
||||
mOverlayImage->SetData(imgData);
|
||||
} else {
|
||||
OverlayImage::Data imgData;
|
||||
imgData.mOverlayId = mOverlayImage->GetOverlayId();
|
||||
imgData.mSize = IntSize(width, height);
|
||||
mOverlayImage->SetData(imgData);
|
||||
}
|
||||
#endif
|
||||
|
||||
SourceMediaStream* srcStream = GetInputStream()->AsSourceStream();
|
||||
StreamTracks::Track* track = srcStream->FindTrack(TRACK_VIDEO_PRIMARY);
|
||||
|
||||
if (!track || !track->GetSegment()) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
// Clear the old segment.
|
||||
// Changing the existing content of segment is a Very BAD thing, and this way will
|
||||
// confuse consumers of MediaStreams.
|
||||
// It is only acceptable for DOMHwMediaStream
|
||||
// because DOMHwMediaStream doesn't have consumers of TV streams currently.
|
||||
track->GetSegment()->Clear();
|
||||
|
||||
// Change the image size.
|
||||
const StreamTime delta = STREAM_TIME_MAX;
|
||||
RefPtr<Image> image = static_cast<Image*>(mOverlayImage.get());
|
||||
mozilla::gfx::IntSize size = image->GetSize();
|
||||
VideoSegment segment;
|
||||
|
||||
segment.AppendFrame(image.forget(), delta, size, mPrincipalHandle);
|
||||
srcStream->AppendToTrack(TRACK_VIDEO_PRIMARY, &segment);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
DOMHwMediaStream::SetOverlayImage(OverlayImage* aImage)
|
||||
{
|
||||
if (!aImage) {
|
||||
return;
|
||||
}
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
mOverlayImage = aImage;
|
||||
#endif
|
||||
|
||||
SourceMediaStream* srcStream = GetInputStream()->AsSourceStream();
|
||||
StreamTracks::Track* track = srcStream->FindTrack(TRACK_VIDEO_PRIMARY);
|
||||
|
||||
if (!track || !track->GetSegment()) {
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
// Clear the old segment.
|
||||
// Changing the existing content of segment is a Very BAD thing, and this way will
|
||||
// confuse consumers of MediaStreams.
|
||||
// It is only acceptable for DOMHwMediaStream
|
||||
// because DOMHwMediaStream doesn't have consumers of TV streams currently.
|
||||
track->GetSegment()->Clear();
|
||||
|
||||
// Change the image size.
|
||||
const StreamTime delta = STREAM_TIME_MAX;
|
||||
RefPtr<Image> image = static_cast<Image*>(mOverlayImage.get());
|
||||
mozilla::gfx::IntSize size = image->GetSize();
|
||||
VideoSegment segment;
|
||||
|
||||
segment.AppendFrame(image.forget(), delta, size, mPrincipalHandle);
|
||||
srcStream->AppendToTrack(TRACK_VIDEO_PRIMARY, &segment);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
DOMHwMediaStream::SetOverlayId(int32_t aOverlayId)
|
||||
{
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
OverlayImage::Data imgData;
|
||||
|
||||
imgData.mOverlayId = aOverlayId;
|
||||
imgData.mSize = mOverlayImage->GetSize();
|
||||
|
||||
mOverlayImage->SetData(imgData);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
namespace mozilla {
|
||||
|
||||
class AbstractThread;
|
||||
class DOMHwMediaStream;
|
||||
class DOMLocalMediaStream;
|
||||
class DOMMediaStream;
|
||||
class MediaStream;
|
||||
|
@ -455,9 +454,6 @@ public:
|
|||
bool AddDirectListener(DirectMediaStreamListener *aListener);
|
||||
void RemoveDirectListener(DirectMediaStreamListener *aListener);
|
||||
|
||||
virtual DOMLocalMediaStream* AsDOMLocalMediaStream() { return nullptr; }
|
||||
virtual DOMHwMediaStream* AsDOMHwMediaStream() { return nullptr; }
|
||||
|
||||
/**
|
||||
* Legacy method that returns true when the playback stream has finished.
|
||||
*/
|
||||
|
@ -828,40 +824,6 @@ private:
|
|||
RefPtr<AudioNode> mStreamNode;
|
||||
};
|
||||
|
||||
class DOMHwMediaStream : public DOMLocalMediaStream
|
||||
{
|
||||
typedef mozilla::gfx::IntSize IntSize;
|
||||
typedef layers::OverlayImage OverlayImage;
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
typedef layers::OverlayImage::Data Data;
|
||||
#endif
|
||||
|
||||
public:
|
||||
explicit DOMHwMediaStream(nsPIDOMWindowInner* aWindow);
|
||||
|
||||
static already_AddRefed<DOMHwMediaStream> CreateHwStream(nsPIDOMWindowInner* aWindow,
|
||||
OverlayImage* aImage = nullptr);
|
||||
virtual DOMHwMediaStream* AsDOMHwMediaStream() override { return this; }
|
||||
int32_t RequestOverlayId();
|
||||
void SetOverlayId(int32_t aOverlayId);
|
||||
void SetImageSize(uint32_t width, uint32_t height);
|
||||
void SetOverlayImage(OverlayImage* aImage);
|
||||
|
||||
protected:
|
||||
~DOMHwMediaStream();
|
||||
|
||||
private:
|
||||
void Init(MediaStream* aStream, OverlayImage* aImage);
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
const int DEFAULT_IMAGE_ID = 0x01;
|
||||
const int DEFAULT_IMAGE_WIDTH = 400;
|
||||
const int DEFAULT_IMAGE_HEIGHT = 300;
|
||||
RefPtr<OverlayImage> mOverlayImage;
|
||||
PrincipalHandle mPrincipalHandle;
|
||||
#endif
|
||||
};
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
#endif /* NSDOMMEDIASTREAM_H_ */
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
#include "mozilla/layers/KnowsCompositor.h"
|
||||
#include "mozilla/layers/SharedRGBImage.h"
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
#include <cutils/properties.h>
|
||||
#endif
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef XP_WIN
|
||||
|
@ -144,31 +141,6 @@ static bool ValidateBufferAndPicture(const VideoData::YCbCrBuffer& aBuffer,
|
|||
return true;
|
||||
}
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
static bool
|
||||
IsYV12Format(const VideoData::YCbCrBuffer::Plane& aYPlane,
|
||||
const VideoData::YCbCrBuffer::Plane& aCbPlane,
|
||||
const VideoData::YCbCrBuffer::Plane& aCrPlane)
|
||||
{
|
||||
return
|
||||
aYPlane.mWidth % 2 == 0
|
||||
&& aYPlane.mHeight % 2 == 0
|
||||
&& aYPlane.mWidth / 2 == aCbPlane.mWidth
|
||||
&& aYPlane.mHeight / 2 == aCbPlane.mHeight
|
||||
&& aCbPlane.mWidth == aCrPlane.mWidth
|
||||
&& aCbPlane.mHeight == aCrPlane.mHeight;
|
||||
}
|
||||
|
||||
static bool
|
||||
IsInEmulator()
|
||||
{
|
||||
char propQemu[PROPERTY_VALUE_MAX];
|
||||
property_get("ro.kernel.qemu", propQemu, "");
|
||||
return !strncmp(propQemu, "1", 1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
VideoData::VideoData(int64_t aOffset,
|
||||
const TimeUnit& aTime,
|
||||
const TimeUnit& aDuration,
|
||||
|
@ -335,19 +307,10 @@ VideoData::CreateAndCopyData(const VideoInfo& aInfo,
|
|||
aTimecode,
|
||||
aInfo.mDisplay,
|
||||
0));
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
const YCbCrBuffer::Plane &Y = aBuffer.mPlanes[0];
|
||||
const YCbCrBuffer::Plane &Cb = aBuffer.mPlanes[1];
|
||||
const YCbCrBuffer::Plane &Cr = aBuffer.mPlanes[2];
|
||||
#endif
|
||||
|
||||
// Currently our decoder only knows how to output to ImageFormat::PLANAR_YCBCR
|
||||
// format.
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
if (IsYV12Format(Y, Cb, Cr) && !IsInEmulator()) {
|
||||
v->mImage = new layers::GrallocImage();
|
||||
}
|
||||
#elif XP_WIN
|
||||
#if XP_WIN
|
||||
if (aAllocator && aAllocator->GetCompositorBackendType()
|
||||
== layers::LayersBackend::LAYERS_D3D11) {
|
||||
RefPtr<layers::D3D11YCbCrImage> d3d11Image = new layers::D3D11YCbCrImage();
|
||||
|
@ -378,20 +341,6 @@ VideoData::CreateAndCopyData(const VideoInfo& aInfo,
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
if (!videoImage->IsValid() && IsYV12Format(Y, Cb, Cr)) {
|
||||
// Failed to allocate gralloc. Try fallback.
|
||||
v->mImage = aContainer->CreatePlanarYCbCrImage();
|
||||
if (!v->mImage) {
|
||||
return nullptr;
|
||||
}
|
||||
videoImage = v->mImage->AsPlanarYCbCrImage();
|
||||
if (!VideoData::SetVideoDataToImage(videoImage, aInfo, aBuffer, aPicture,
|
||||
true /* aCopyData */)) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return v.forget();
|
||||
}
|
||||
|
||||
|
|
|
@ -12,9 +12,6 @@
|
|||
#include "nsArray.h"
|
||||
#include "nsContentUtils.h"
|
||||
#include "nsHashPropertyBag.h"
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
#include "nsIAudioManager.h"
|
||||
#endif
|
||||
#include "nsIEventTarget.h"
|
||||
#include "nsIUUIDGenerator.h"
|
||||
#include "nsIScriptGlobalObject.h"
|
||||
|
@ -1662,7 +1659,7 @@ private:
|
|||
RefPtr<MediaManager> mManager; // get ref to this when creating the runnable
|
||||
};
|
||||
|
||||
#if defined(ANDROID) && !defined(MOZ_WIDGET_GONK)
|
||||
#if defined(ANDROID)
|
||||
class GetUserMediaRunnableWrapper : public Runnable
|
||||
{
|
||||
public:
|
||||
|
@ -1886,7 +1883,6 @@ MediaManager::Get() {
|
|||
obs->AddObserver(sSingleton, "getUserMedia:response:allow", false);
|
||||
obs->AddObserver(sSingleton, "getUserMedia:response:deny", false);
|
||||
obs->AddObserver(sSingleton, "getUserMedia:revoke", false);
|
||||
obs->AddObserver(sSingleton, "phone-state-changed", false);
|
||||
}
|
||||
// else MediaManager won't work properly and will leak (see bug 837874)
|
||||
nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID);
|
||||
|
@ -3209,18 +3205,6 @@ MediaManager::Observe(nsISupports* aSubject, const char* aTopic,
|
|||
}
|
||||
return NS_OK;
|
||||
}
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
else if (!strcmp(aTopic, "phone-state-changed")) {
|
||||
nsString state(aData);
|
||||
nsresult rv;
|
||||
uint32_t phoneState = state.ToInteger(&rv);
|
||||
|
||||
if (NS_SUCCEEDED(rv) && phoneState == nsIAudioManager::PHONE_STATE_IN_CALL) {
|
||||
StopMediaStreams();
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -10,12 +10,7 @@
|
|||
#include <opus/opus.h>
|
||||
|
||||
#undef LOG
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
#include <android/log.h>
|
||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "MediaEncoder", ## args);
|
||||
#else
|
||||
#define LOG(args, ...)
|
||||
#endif
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
|
|
|
@ -209,11 +209,7 @@ GeckoMediaPluginServiceParent::InitStorage()
|
|||
|
||||
// Directory service is main thread only, so cache the profile dir here
|
||||
// so that we can use it off main thread.
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
nsresult rv = NS_NewLocalFile(NS_LITERAL_STRING("/data/b2g/mozilla"), false, getter_AddRefs(mStorageBaseDir));
|
||||
#else
|
||||
nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, getter_AddRefs(mStorageBaseDir));
|
||||
#endif
|
||||
|
||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||
return rv;
|
||||
|
|
|
@ -19,18 +19,6 @@
|
|||
#include "nsDebug.h"
|
||||
#include "opus/opus_multistream.h"
|
||||
|
||||
// On Android JellyBean, the hardware.h header redefines version_major and
|
||||
// version_minor, which breaks our build. See:
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=912702#c6
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
#ifdef version_major
|
||||
#undef version_major
|
||||
#endif
|
||||
#ifdef version_minor
|
||||
#undef version_minor
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
extern LazyLogModule gMediaDecoderLog;
|
||||
|
|
|
@ -7,12 +7,7 @@
|
|||
#include "GeckoProfiler.h"
|
||||
|
||||
#undef LOG
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
#include <android/log.h>
|
||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "MediaEncoder", ## args);
|
||||
#else
|
||||
#define LOG(args, ...)
|
||||
#endif
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
|
|
|
@ -8,11 +8,6 @@
|
|||
|
||||
#include "OMX_VideoExt.h" // For VP8.
|
||||
|
||||
#if defined(MOZ_WIDGET_GONK) && (ANDROID_VERSION == 20 || ANDROID_VERSION == 19)
|
||||
#define OMX_PLATFORM_GONK
|
||||
#include "GonkOmxPlatformLayer.h"
|
||||
#endif
|
||||
|
||||
#include "VPXDecoder.h"
|
||||
|
||||
#ifdef LOG
|
||||
|
|
|
@ -47,23 +47,6 @@ MediaSystemResourceService::MediaSystemResourceService()
|
|||
: mDestroyed(false)
|
||||
{
|
||||
MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
|
||||
#ifdef MOZ_WIDGET_GONK
|
||||
// The maximum number of hardware resoureces available.
|
||||
// XXX need to hange to a dynamic way.
|
||||
enum
|
||||
{
|
||||
VIDEO_DECODER_COUNT = 1,
|
||||
VIDEO_ENCODER_COUNT = 1
|
||||
};
|
||||
|
||||
MediaSystemResource* resource;
|
||||
|
||||
resource = new MediaSystemResource(VIDEO_DECODER_COUNT);
|
||||
mResources.Put(static_cast<uint32_t>(MediaSystemResourceType::VIDEO_DECODER), resource);
|
||||
|
||||
resource = new MediaSystemResource(VIDEO_ENCODER_COUNT);
|
||||
mResources.Put(static_cast<uint32_t>(MediaSystemResourceType::VIDEO_ENCODER), resource);
|
||||
#endif
|
||||
}
|
||||
|
||||
MediaSystemResourceService::~MediaSystemResourceService()
|
||||
|
|
|
@ -337,7 +337,7 @@ MediaEngineCameraVideoSource::SetName(nsString aName)
|
|||
VideoFacingModeEnum facingMode = VideoFacingModeEnum::User;
|
||||
|
||||
// Set facing mode based on device name.
|
||||
#if defined(ANDROID) && !defined(MOZ_WIDGET_GONK)
|
||||
#if defined(ANDROID)
|
||||
// Names are generated. Example: "Camera 0, Facing back, Orientation 90"
|
||||
//
|
||||
// See media/webrtc/trunk/webrtc/modules/video_capture/android/java/src/org/
|
||||
|
|
|
@ -187,7 +187,7 @@ MediaEngineDefaultVideoSource::Start(SourceMediaStream* aStream, TrackID aID,
|
|||
mTrackID = aID;
|
||||
|
||||
// Start timer for subsequent frames
|
||||
#if (defined(MOZ_WIDGET_GONK) || defined(MOZ_WIDGET_ANDROID)) && defined(DEBUG)
|
||||
#if defined(MOZ_WIDGET_ANDROID) && defined(DEBUG)
|
||||
// emulator debug is very, very slow and has problems dealing with realtime audio inputs
|
||||
mTimer->InitWithCallback(this, (1000 / mOpts.mFPS)*10, nsITimer::TYPE_REPEATING_SLACK);
|
||||
#else
|
||||
|
|
|
@ -359,9 +359,6 @@ MediaEngineRemoteVideoSource::NotifyPull(MediaStreamGraph* aGraph,
|
|||
void
|
||||
MediaEngineRemoteVideoSource::FrameSizeChange(unsigned int w, unsigned int h)
|
||||
{
|
||||
#if defined(MOZ_WIDGET_GONK)
|
||||
mMonitor.AssertCurrentThreadOwns(); // mWidth and mHeight are protected...
|
||||
#endif
|
||||
if ((mWidth < 0) || (mHeight < 0) ||
|
||||
(w != (unsigned int) mWidth) || (h != (unsigned int) mHeight)) {
|
||||
LOG(("MediaEngineRemoteVideoSource Video FrameSizeChange: %ux%u was %ux%u", w, h, mWidth, mHeight));
|
||||
|
|
|
@ -325,7 +325,7 @@ MediaEngineWebRTC::EnumerateAudioDevices(dom::MediaSourceEnum aMediaSource,
|
|||
int nDevices = 0;
|
||||
mAudioInput->GetNumOfRecordingDevices(nDevices);
|
||||
int i;
|
||||
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
|
||||
#if defined(MOZ_WIDGET_ANDROID)
|
||||
i = 0; // Bug 1037025 - let the OS handle defaulting for now on android/b2g
|
||||
#else
|
||||
// -1 is "default communications device" depending on OS in webrtc.org code
|
||||
|
|
Загрузка…
Ссылка в новой задаче