mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
216fe28466
--HG-- rename : content/media/nsAudioAvailableEventManager.cpp => content/media/AudioAvailableEventManager.cpp rename : content/media/nsAudioAvailableEventManager.h => content/media/AudioAvailableEventManager.h rename : content/media/nsAudioStream.cpp => content/media/AudioStream.cpp rename : content/media/nsAudioStream.h => content/media/AudioStream.h rename : content/media/nsMediaCache.cpp => content/media/MediaCache.cpp rename : content/media/nsMediaCache.h => content/media/MediaCache.h rename : content/media/nsBuiltinDecoder.cpp => content/media/MediaDecoder.cpp rename : content/media/nsBuiltinDecoder.h => content/media/MediaDecoder.h rename : content/media/nsBuiltinDecoderReader.cpp => content/media/MediaDecoderReader.cpp rename : content/media/nsBuiltinDecoderReader.h => content/media/MediaDecoderReader.h rename : content/media/nsBuiltinDecoderStateMachine.cpp => content/media/MediaDecoderStateMachine.cpp rename : content/media/nsBuiltinDecoderStateMachine.h => content/media/MediaDecoderStateMachine.h rename : content/media/dash/nsDASHDecoder.cpp => content/media/dash/DASHDecoder.cpp rename : content/media/dash/nsDASHDecoder.h => content/media/dash/DASHDecoder.h rename : content/media/dash/nsDASHReader.cpp => content/media/dash/DASHReader.cpp rename : content/media/dash/nsDASHReader.h => content/media/dash/DASHReader.h rename : content/media/dash/nsDASHRepDecoder.cpp => content/media/dash/DASHRepDecoder.cpp rename : content/media/dash/nsDASHRepDecoder.h => content/media/dash/DASHRepDecoder.h rename : content/media/gstreamer/nsGStreamerDecoder.cpp => content/media/gstreamer/GStreamerDecoder.cpp rename : content/media/gstreamer/nsGStreamerDecoder.h => content/media/gstreamer/GStreamerDecoder.h rename : content/media/gstreamer/nsGStreamerReader.cpp => content/media/gstreamer/GStreamerReader.cpp rename : content/media/gstreamer/nsGStreamerReader.h => content/media/gstreamer/GStreamerReader.h rename : content/media/ogg/nsOggCodecState.cpp => content/media/ogg/OggCodecState.cpp rename : content/media/ogg/nsOggCodecState.h => content/media/ogg/OggCodecState.h rename : content/media/ogg/nsOggDecoder.cpp => content/media/ogg/OggDecoder.cpp rename : content/media/ogg/nsOggDecoder.h => content/media/ogg/OggDecoder.h rename : content/media/ogg/nsOggReader.cpp => content/media/ogg/OggReader.cpp rename : content/media/ogg/nsOggReader.h => content/media/ogg/OggReader.h rename : content/media/omx/nsMediaOmxDecoder.cpp => content/media/omx/MediaOmxDecoder.cpp rename : content/media/omx/nsMediaOmxDecoder.h => content/media/omx/MediaOmxDecoder.h rename : content/media/omx/nsMediaOmxReader.cpp => content/media/omx/MediaOmxReader.cpp rename : content/media/omx/nsMediaOmxReader.h => content/media/omx/MediaOmxReader.h rename : content/media/plugins/nsMediaPluginDecoder.cpp => content/media/plugins/MediaPluginDecoder.cpp rename : content/media/plugins/nsMediaPluginDecoder.h => content/media/plugins/MediaPluginDecoder.h rename : content/media/plugins/nsMediaPluginHost.cpp => content/media/plugins/MediaPluginHost.cpp rename : content/media/plugins/nsMediaPluginHost.h => content/media/plugins/MediaPluginHost.h rename : content/media/plugins/nsMediaPluginReader.cpp => content/media/plugins/MediaPluginReader.cpp rename : content/media/plugins/nsMediaPluginReader.h => content/media/plugins/MediaPluginReader.h rename : content/media/raw/nsRawDecoder.cpp => content/media/raw/RawDecoder.cpp rename : content/media/raw/nsRawDecoder.h => content/media/raw/RawDecoder.h rename : content/media/raw/nsRawReader.cpp => content/media/raw/RawReader.cpp rename : content/media/raw/nsRawReader.h => content/media/raw/RawReader.h rename : content/media/raw/nsRawStructs.h => content/media/raw/RawStructs.h rename : content/media/wave/nsWaveDecoder.cpp => content/media/wave/WaveDecoder.cpp rename : content/media/wave/nsWaveDecoder.h => content/media/wave/WaveDecoder.h rename : content/media/wave/nsWaveReader.cpp => content/media/wave/WaveReader.cpp rename : content/media/wave/nsWaveReader.h => content/media/wave/WaveReader.h rename : content/media/webm/nsWebMBufferedParser.cpp => content/media/webm/WebMBufferedParser.cpp rename : content/media/webm/nsWebMBufferedParser.h => content/media/webm/WebMBufferedParser.h rename : content/media/webm/nsWebMDecoder.cpp => content/media/webm/WebMDecoder.cpp rename : content/media/webm/nsWebMDecoder.h => content/media/webm/WebMDecoder.h rename : content/media/webm/nsWebMReader.cpp => content/media/webm/WebMReader.cpp rename : content/media/webm/nsWebMReader.h => content/media/webm/WebMReader.h
206 lines
5.1 KiB
C++
206 lines
5.1 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
#include "mozilla/Preferences.h"
|
|
#include "mozilla/TimeStamp.h"
|
|
#include "nsTimeRanges.h"
|
|
#include "MediaResource.h"
|
|
#include "nsHTMLMediaElement.h"
|
|
#include "MediaPluginHost.h"
|
|
#include "nsXPCOMStrings.h"
|
|
#include "nsISeekableStream.h"
|
|
#include "pratom.h"
|
|
#include "MediaPluginReader.h"
|
|
#include "nsIGfxInfo.h"
|
|
|
|
#include "MPAPI.h"
|
|
|
|
using namespace MPAPI;
|
|
|
|
Decoder::Decoder() :
|
|
mResource(NULL), mPrivate(NULL)
|
|
{
|
|
}
|
|
|
|
namespace mozilla {
|
|
|
|
static MediaResource *GetResource(Decoder *aDecoder)
|
|
{
|
|
return reinterpret_cast<MediaResource *>(aDecoder->mResource);
|
|
}
|
|
|
|
static bool Read(Decoder *aDecoder, char *aBuffer, int64_t aOffset, uint32_t aCount, uint32_t* aBytes)
|
|
{
|
|
MediaResource *resource = GetResource(aDecoder);
|
|
if (aOffset != resource->Tell()) {
|
|
nsresult rv = resource->Seek(nsISeekableStream::NS_SEEK_SET, aOffset);
|
|
if (NS_FAILED(rv)) {
|
|
return false;
|
|
}
|
|
}
|
|
nsresult rv = resource->Read(aBuffer, aCount, aBytes);
|
|
if (NS_FAILED(rv)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static uint64_t GetLength(Decoder *aDecoder)
|
|
{
|
|
return GetResource(aDecoder)->GetLength();
|
|
}
|
|
|
|
static void SetMetaDataReadMode(Decoder *aDecoder)
|
|
{
|
|
GetResource(aDecoder)->SetReadMode(MediaCacheStream::MODE_METADATA);
|
|
}
|
|
|
|
static void SetPlaybackReadMode(Decoder *aDecoder)
|
|
{
|
|
GetResource(aDecoder)->SetReadMode(MediaCacheStream::MODE_PLAYBACK);
|
|
}
|
|
|
|
class GetIntPrefEvent : public nsRunnable {
|
|
public:
|
|
GetIntPrefEvent(const char* aPref, int32_t* aResult)
|
|
: mPref(aPref), mResult(aResult) {}
|
|
NS_IMETHOD Run() {
|
|
return Preferences::GetInt(mPref, mResult);
|
|
}
|
|
private:
|
|
const char* mPref;
|
|
int32_t* mResult;
|
|
};
|
|
|
|
static bool GetIntPref(const char* aPref, int32_t* aResult)
|
|
{
|
|
// GetIntPref() is called on the decoder thread, but the Preferences API
|
|
// can only be called on the main thread. Post a runnable and wait.
|
|
NS_ENSURE_TRUE(aPref, false);
|
|
NS_ENSURE_TRUE(aResult, false);
|
|
nsCOMPtr<GetIntPrefEvent> event = new GetIntPrefEvent(aPref, aResult);
|
|
return NS_SUCCEEDED(NS_DispatchToMainThread(event, NS_DISPATCH_SYNC));
|
|
}
|
|
|
|
static PluginHost sPluginHost = {
|
|
Read,
|
|
GetLength,
|
|
SetMetaDataReadMode,
|
|
SetPlaybackReadMode,
|
|
GetIntPref
|
|
};
|
|
|
|
void MediaPluginHost::TryLoad(const char *name)
|
|
{
|
|
bool forceEnabled =
|
|
Preferences::GetBool("stagefright.force-enabled", false);
|
|
bool disabled =
|
|
Preferences::GetBool("stagefright.disabled", false);
|
|
|
|
if (disabled) {
|
|
NS_WARNING("XXX stagefright disabled\n");
|
|
return;
|
|
}
|
|
|
|
if (!forceEnabled) {
|
|
nsCOMPtr<nsIGfxInfo> gfxInfo = do_GetService("@mozilla.org/gfx/info;1");
|
|
if (gfxInfo) {
|
|
int32_t status;
|
|
if (NS_SUCCEEDED(gfxInfo->GetFeatureStatus(nsIGfxInfo::FEATURE_STAGEFRIGHT, &status))) {
|
|
if (status != nsIGfxInfo::FEATURE_NO_INFO) {
|
|
NS_WARNING("XXX stagefright blacklisted\n");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
PRLibrary *lib = PR_LoadLibrary(name);
|
|
if (lib) {
|
|
Manifest *manifest = static_cast<Manifest *>(PR_FindSymbol(lib, "MPAPI_MANIFEST"));
|
|
if (manifest)
|
|
mPlugins.AppendElement(manifest);
|
|
}
|
|
}
|
|
|
|
MediaPluginHost::MediaPluginHost() {
|
|
MOZ_COUNT_CTOR(MediaPluginHost);
|
|
#if defined(ANDROID) && !defined(MOZ_WIDGET_GONK)
|
|
TryLoad("lib/libomxplugin.so");
|
|
#elif defined(ANDROID) && defined(MOZ_WIDGET_GONK)
|
|
TryLoad("libomxplugin.so");
|
|
#endif
|
|
}
|
|
|
|
MediaPluginHost::~MediaPluginHost() {
|
|
MOZ_COUNT_DTOR(MediaPluginHost);
|
|
}
|
|
|
|
bool MediaPluginHost::FindDecoder(const nsACString& aMimeType, const char* const** aCodecs)
|
|
{
|
|
const char *chars;
|
|
size_t len = NS_CStringGetData(aMimeType, &chars, nullptr);
|
|
for (size_t n = 0; n < mPlugins.Length(); ++n) {
|
|
Manifest *plugin = mPlugins[n];
|
|
const char* const *codecs;
|
|
if (plugin->CanDecode(chars, len, &codecs)) {
|
|
if (aCodecs)
|
|
*aCodecs = codecs;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
MPAPI::Decoder *MediaPluginHost::CreateDecoder(MediaResource *aResource, const nsACString& aMimeType)
|
|
{
|
|
const char *chars;
|
|
size_t len = NS_CStringGetData(aMimeType, &chars, nullptr);
|
|
|
|
Decoder *decoder = new Decoder();
|
|
if (!decoder) {
|
|
return nullptr;
|
|
}
|
|
decoder->mResource = aResource;
|
|
|
|
for (size_t n = 0; n < mPlugins.Length(); ++n) {
|
|
Manifest *plugin = mPlugins[n];
|
|
const char* const *codecs;
|
|
if (!plugin->CanDecode(chars, len, &codecs)) {
|
|
continue;
|
|
}
|
|
if (plugin->CreateDecoder(&sPluginHost, decoder, chars, len)) {
|
|
return decoder;
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
void MediaPluginHost::DestroyDecoder(Decoder *aDecoder)
|
|
{
|
|
aDecoder->DestroyDecoder(aDecoder);
|
|
delete aDecoder;
|
|
}
|
|
|
|
MediaPluginHost *sMediaPluginHost = nullptr;
|
|
MediaPluginHost *GetMediaPluginHost()
|
|
{
|
|
if (!sMediaPluginHost) {
|
|
sMediaPluginHost = new MediaPluginHost();
|
|
}
|
|
return sMediaPluginHost;
|
|
}
|
|
|
|
void MediaPluginHost::Shutdown()
|
|
{
|
|
if (sMediaPluginHost) {
|
|
delete sMediaPluginHost;
|
|
sMediaPluginHost = nullptr;
|
|
}
|
|
}
|
|
|
|
} // namespace mozilla
|