2016-04-19 10:36:19 +03:00
|
|
|
/* -*- 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/. */
|
|
|
|
|
|
|
|
#ifndef DecoderDoctorDiagnostics_h_
|
|
|
|
#define DecoderDoctorDiagnostics_h_
|
|
|
|
|
2017-02-21 06:07:23 +03:00
|
|
|
#include "MediaResult.h"
|
2016-04-22 06:42:11 +03:00
|
|
|
#include "nsString.h"
|
|
|
|
|
2016-04-19 10:36:19 +03:00
|
|
|
class nsIDocument;
|
|
|
|
|
|
|
|
namespace mozilla {
|
|
|
|
|
2016-09-19 05:50:01 +03:00
|
|
|
struct DecoderDoctorEvent {
|
|
|
|
enum Domain {
|
2016-09-19 05:41:36 +03:00
|
|
|
eAudioSinkStartup,
|
2016-09-19 05:50:01 +03:00
|
|
|
} mDomain;
|
|
|
|
nsresult mResult;
|
|
|
|
};
|
|
|
|
|
2016-04-19 10:36:19 +03:00
|
|
|
// DecoderDoctorDiagnostics class, used to gather data from PDMs/DecoderTraits,
|
|
|
|
// and then notify the user about issues preventing (or worsening) playback.
|
|
|
|
//
|
|
|
|
// The expected usage is:
|
|
|
|
// 1. Instantiate a DecoderDoctorDiagnostics in a function (close to the point
|
|
|
|
// where a webpage is trying to know whether some MIME types can be played,
|
|
|
|
// or trying to play a media file).
|
|
|
|
// 2. Pass a pointer to the DecoderDoctorDiagnostics structure to one of the
|
|
|
|
// CanPlayStatus/IsTypeSupported/(others?). During that call, some PDMs may
|
|
|
|
// add relevant diagnostic information.
|
|
|
|
// 3. Analyze the collected diagnostics, and optionally dispatch an event to the
|
|
|
|
// UX, to notify the user about potential playback issues and how to resolve
|
|
|
|
// them.
|
|
|
|
//
|
|
|
|
// This class' methods must be called from the main thread.
|
|
|
|
|
|
|
|
class DecoderDoctorDiagnostics
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// Store the diagnostic information collected so far on a document for a
|
|
|
|
// given format. All diagnostics for a document will be analyzed together
|
|
|
|
// within a short timeframe.
|
|
|
|
// Should only be called once.
|
2016-04-22 06:42:11 +03:00
|
|
|
void StoreFormatDiagnostics(nsIDocument* aDocument,
|
|
|
|
const nsAString& aFormat,
|
|
|
|
bool aCanPlay,
|
|
|
|
const char* aCallSite);
|
|
|
|
|
2016-04-22 06:42:11 +03:00
|
|
|
void StoreMediaKeySystemAccess(nsIDocument* aDocument,
|
|
|
|
const nsAString& aKeySystem,
|
|
|
|
bool aIsSupported,
|
|
|
|
const char* aCallSite);
|
|
|
|
|
2016-09-19 05:50:01 +03:00
|
|
|
void StoreEvent(nsIDocument* aDocument,
|
|
|
|
const DecoderDoctorEvent& aEvent,
|
|
|
|
const char* aCallSite);
|
|
|
|
|
2017-02-21 06:07:23 +03:00
|
|
|
void StoreDecodeError(nsIDocument* aDocument,
|
|
|
|
const MediaResult& aError,
|
|
|
|
const nsString& aMediaSrc,
|
|
|
|
const char* aCallSite);
|
|
|
|
|
|
|
|
void StoreDecodeWarning(nsIDocument* aDocument,
|
|
|
|
const MediaResult& aWarning,
|
|
|
|
const nsString& aMediaSrc,
|
|
|
|
const char* aCallSite);
|
|
|
|
|
|
|
|
enum DiagnosticsType
|
|
|
|
{
|
2016-04-22 06:42:11 +03:00
|
|
|
eUnsaved,
|
|
|
|
eFormatSupportCheck,
|
2016-09-19 05:50:01 +03:00
|
|
|
eMediaKeySystemAccessRequest,
|
2017-02-21 06:07:23 +03:00
|
|
|
eEvent,
|
|
|
|
eDecodeError,
|
|
|
|
eDecodeWarning
|
2016-04-22 06:42:11 +03:00
|
|
|
};
|
|
|
|
DiagnosticsType Type() const { return mDiagnosticsType; }
|
|
|
|
|
|
|
|
// Description string, for logging purposes; only call on stored diags.
|
2016-04-22 06:42:11 +03:00
|
|
|
nsCString GetDescription() const;
|
2016-04-19 10:36:19 +03:00
|
|
|
|
|
|
|
// Methods to record diagnostic information:
|
|
|
|
|
2016-04-22 06:42:11 +03:00
|
|
|
const nsAString& Format() const { return mFormat; }
|
2016-04-19 10:36:19 +03:00
|
|
|
bool CanPlay() const { return mCanPlay; }
|
|
|
|
|
2016-04-22 06:42:11 +03:00
|
|
|
void SetWMFFailedToLoad() { mWMFFailedToLoad = true; }
|
|
|
|
bool DidWMFFailToLoad() const { return mWMFFailedToLoad; }
|
|
|
|
|
2016-04-19 10:36:20 +03:00
|
|
|
void SetFFmpegFailedToLoad() { mFFmpegFailedToLoad = true; }
|
|
|
|
bool DidFFmpegFailToLoad() const { return mFFmpegFailedToLoad; }
|
|
|
|
|
2016-04-22 06:42:11 +03:00
|
|
|
void SetGMPPDMFailedToStartup() { mGMPPDMFailedToStartup = true; }
|
|
|
|
bool DidGMPPDMFailToStartup() const { return mGMPPDMFailedToStartup; }
|
2016-08-19 13:14:28 +03:00
|
|
|
|
2016-09-27 12:37:13 +03:00
|
|
|
void SetVideoNotSupported() { mVideoNotSupported = true; }
|
|
|
|
void SetAudioNotSupported() { mAudioNotSupported = true; }
|
2016-08-19 13:14:28 +03:00
|
|
|
|
2016-04-22 06:42:11 +03:00
|
|
|
void SetGMP(const nsACString& aGMP) { mGMP = aGMP; }
|
|
|
|
const nsACString& GMP() const { return mGMP; }
|
|
|
|
|
2016-04-22 06:42:11 +03:00
|
|
|
const nsAString& KeySystem() const { return mKeySystem; }
|
|
|
|
bool IsKeySystemSupported() const { return mIsKeySystemSupported; }
|
|
|
|
enum KeySystemIssue {
|
|
|
|
eUnset,
|
|
|
|
eWidevineWithNoWMF
|
|
|
|
};
|
|
|
|
void SetKeySystemIssue(KeySystemIssue aKeySystemIssue)
|
|
|
|
{
|
|
|
|
mKeySystemIssue = aKeySystemIssue;
|
|
|
|
}
|
|
|
|
KeySystemIssue GetKeySystemIssue() const
|
|
|
|
{
|
|
|
|
return mKeySystemIssue;
|
|
|
|
}
|
|
|
|
|
2016-09-19 05:50:01 +03:00
|
|
|
DecoderDoctorEvent event() const
|
|
|
|
{
|
|
|
|
return mEvent;
|
|
|
|
}
|
|
|
|
|
2017-02-21 06:07:23 +03:00
|
|
|
const MediaResult& DecodeIssue() const { return mDecodeIssue; }
|
|
|
|
const nsString& DecodeIssueMediaSrc() const
|
|
|
|
{
|
|
|
|
return mDecodeIssueMediaSrc;
|
|
|
|
}
|
|
|
|
|
2016-04-19 10:36:19 +03:00
|
|
|
private:
|
2016-04-22 06:42:11 +03:00
|
|
|
// Currently-known type of diagnostics. Set from one of the 'Store...' methods.
|
|
|
|
// This helps ensure diagnostics are only stored once,
|
|
|
|
// and makes it easy to know what information they contain.
|
|
|
|
DiagnosticsType mDiagnosticsType = eUnsaved;
|
|
|
|
|
2016-04-22 06:42:11 +03:00
|
|
|
nsString mFormat;
|
|
|
|
// True if there is at least one decoder that can play that format.
|
2016-04-19 10:36:19 +03:00
|
|
|
bool mCanPlay = false;
|
2016-04-19 10:36:20 +03:00
|
|
|
|
2016-04-22 06:42:11 +03:00
|
|
|
bool mWMFFailedToLoad = false;
|
2016-04-19 10:36:20 +03:00
|
|
|
bool mFFmpegFailedToLoad = false;
|
2016-04-22 06:42:11 +03:00
|
|
|
bool mGMPPDMFailedToStartup = false;
|
2016-08-19 13:14:28 +03:00
|
|
|
bool mVideoNotSupported = false;
|
|
|
|
bool mAudioNotSupported = false;
|
2016-04-22 06:42:11 +03:00
|
|
|
nsCString mGMP;
|
2016-04-22 06:42:11 +03:00
|
|
|
|
|
|
|
nsString mKeySystem;
|
|
|
|
bool mIsKeySystemSupported = false;
|
|
|
|
KeySystemIssue mKeySystemIssue = eUnset;
|
2016-09-19 05:50:01 +03:00
|
|
|
|
|
|
|
DecoderDoctorEvent mEvent;
|
2017-02-21 06:07:23 +03:00
|
|
|
|
|
|
|
MediaResult mDecodeIssue = NS_OK;
|
|
|
|
nsString mDecodeIssueMediaSrc;
|
2016-04-19 10:36:19 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace mozilla
|
|
|
|
|
|
|
|
#endif
|