/usr/include/thunderbird-11.0.1/nsHTMLMediaElement.h is in thunderbird-dev 11.0.1+build1-0ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 | /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla code.
*
* The Initial Developer of the Original Code is the Mozilla Corporation.
* Portions created by the Initial Developer are Copyright (C) 2007
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Chris Double <chris.double@double.co.nz>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#if !defined(nsHTMLMediaElement_h__)
#define nsHTMLMediaElement_h__
#include "nsIDOMHTMLMediaElement.h"
#include "nsGenericHTMLElement.h"
#include "nsMediaDecoder.h"
#include "nsIChannel.h"
#include "nsIHttpChannel.h"
#include "nsThreadUtils.h"
#include "nsIDOMRange.h"
#include "nsCycleCollectionParticipant.h"
#include "nsILoadGroup.h"
#include "nsIObserver.h"
#include "ImageLayers.h"
#include "nsAudioStream.h"
// Define to output information on decoding and painting framerate
/* #define DEBUG_FRAME_RATE 1 */
typedef PRUint16 nsMediaNetworkState;
typedef PRUint16 nsMediaReadyState;
class nsHTMLMediaElement : public nsGenericHTMLElement,
public nsIObserver
{
typedef mozilla::layers::ImageContainer ImageContainer;
public:
typedef mozilla::TimeStamp TimeStamp;
typedef mozilla::TimeDuration TimeDuration;
enum CanPlayStatus {
CANPLAY_NO,
CANPLAY_MAYBE,
CANPLAY_YES
};
nsHTMLMediaElement(already_AddRefed<nsINodeInfo> aNodeInfo);
virtual ~nsHTMLMediaElement();
/**
* This is used when the browser is constructing a video element to play
* a channel that we've already started loading. The src attribute and
* <source> children are ignored.
* @param aChannel the channel to use
* @param aListener returns a stream listener that should receive
* notifications for the stream
*/
nsresult LoadWithChannel(nsIChannel *aChannel, nsIStreamListener **aListener);
// nsIDOMHTMLMediaElement
NS_DECL_NSIDOMHTMLMEDIAELEMENT
NS_DECL_NSIOBSERVER
// nsISupports
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsHTMLMediaElement,
nsGenericHTMLElement)
virtual bool ParseAttribute(PRInt32 aNamespaceID,
nsIAtom* aAttribute,
const nsAString& aValue,
nsAttrValue& aResult);
// SetAttr override. C++ is stupid, so have to override both
// overloaded methods.
nsresult SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
const nsAString& aValue, bool aNotify)
{
return SetAttr(aNameSpaceID, aName, nsnull, aValue, aNotify);
}
virtual nsresult SetAttr(PRInt32 aNameSpaceID, nsIAtom* aName,
nsIAtom* aPrefix, const nsAString& aValue,
bool aNotify);
virtual nsresult UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aAttr,
bool aNotify);
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent,
bool aCompileEventHandlers);
virtual void UnbindFromTree(bool aDeep = true,
bool aNullParent = true);
virtual void DoneCreatingElement();
/**
* Call this to reevaluate whether we should start/stop due to our owner
* document being active or inactive.
*/
void NotifyOwnerDocumentActivityChanged();
// Called by the video decoder object, on the main thread,
// when it has read the metadata containing video dimensions,
// etc.
void MetadataLoaded(PRUint32 aChannels, PRUint32 aRate);
// Called by the video decoder object, on the main thread,
// when it has read the first frame of the video
// aResourceFullyLoaded should be true if the resource has been
// fully loaded and the caller will call ResourceLoaded next.
void FirstFrameLoaded(bool aResourceFullyLoaded);
// Called by the video decoder object, on the main thread,
// when the resource has completed downloading.
void ResourceLoaded();
// Called by the video decoder object, on the main thread,
// when the resource has a network error during loading.
void NetworkError();
// Called by the video decoder object, on the main thread, when the
// resource has a decode error during metadata loading or decoding.
void DecodeError();
// Called by the video decoder object, on the main thread, when the
// resource load has been cancelled.
void LoadAborted();
// Called by the video decoder object, on the main thread,
// when the video playback has ended.
void PlaybackEnded();
// Called by the video decoder object, on the main thread,
// when the resource has started seeking.
void SeekStarted();
// Called by the video decoder object, on the main thread,
// when the resource has completed seeking.
void SeekCompleted();
// Called by the media stream, on the main thread, when the download
// has been suspended by the cache or because the element itself
// asked the decoder to suspend the download.
void DownloadSuspended();
// Called by the media stream, on the main thread, when the download
// has been resumed by the cache or because the element itself
// asked the decoder to resumed the download.
void DownloadResumed();
// Called by the media decoder to indicate that the download has stalled
// (no data has arrived for a while).
void DownloadStalled();
// Called when a "MozAudioAvailable" event listener is added. The media
// element will then notify its decoder that it needs to make a copy of
// the audio data sent to hardware and dispatch it in "mozaudioavailable"
// events. This allows us to not perform the copy and thus reduce overhead
// in the common case where we don't have a "MozAudioAvailable" listener.
void NotifyAudioAvailableListener();
// Called by the media decoder and the video frame to get the
// ImageContainer containing the video data.
ImageContainer* GetImageContainer();
// Called by the video frame to get the print surface, if this is
// a static document and we're not actually playing video
gfxASurface* GetPrintSurface() { return mPrintSurface; }
// Dispatch events
using nsGenericHTMLElement::DispatchEvent;
nsresult DispatchEvent(const nsAString& aName);
nsresult DispatchAsyncEvent(const nsAString& aName);
nsresult DispatchAudioAvailableEvent(float* aFrameBuffer,
PRUint32 aFrameBufferLength,
float aTime);
// Dispatch events that were raised while in the bfcache
nsresult DispatchPendingMediaEvents();
// Called by the decoder when some data has been downloaded or
// buffering/seeking has ended. aNextFrameAvailable is true when
// the data for the next frame is available. This method will
// decide whether to set the ready state to HAVE_CURRENT_DATA,
// HAVE_FUTURE_DATA or HAVE_ENOUGH_DATA.
enum NextFrameStatus {
// The next frame of audio/video is available
NEXT_FRAME_AVAILABLE,
// The next frame of audio/video is unavailable because the decoder
// is paused while it buffers up data
NEXT_FRAME_UNAVAILABLE_BUFFERING,
// The next frame of audio/video is unavailable for some other reasons
NEXT_FRAME_UNAVAILABLE
};
void UpdateReadyStateForData(NextFrameStatus aNextFrame);
// Use this method to change the mReadyState member, so required
// events can be fired.
void ChangeReadyState(nsMediaReadyState aState);
// Return true if we can activate autoplay assuming enough data has arrived.
bool CanActivateAutoplay();
// Notify that enough data has arrived to start autoplaying.
// If the element is 'autoplay' and is ready to play back (not paused,
// autoplay pref enabled, etc), it should start playing back.
void NotifyAutoplayDataReady();
// Gets the pref media.enforce_same_site_origin, which determines
// if we should check Access Controls, or allow cross domain loads.
bool ShouldCheckAllowOrigin();
// Is the media element potentially playing as defined by the HTML 5 specification.
// http://www.whatwg.org/specs/web-apps/current-work/#potentially-playing
bool IsPotentiallyPlaying() const;
// Has playback ended as defined by the HTML 5 specification.
// http://www.whatwg.org/specs/web-apps/current-work/#ended
bool IsPlaybackEnded() const;
// principal of the currently playing stream
already_AddRefed<nsIPrincipal> GetCurrentPrincipal();
// Update the visual size of the media. Called from the decoder on the
// main thread when/if the size changes.
void UpdateMediaSize(nsIntSize size);
// Returns the CanPlayStatus indicating if we can handle this
// MIME type. The MIME type should not include the codecs parameter.
// If it returns anything other than CANPLAY_NO then it also
// returns a null-terminated list of supported codecs
// in *aSupportedCodecs. This list should not be freed, it is static data.
static CanPlayStatus CanHandleMediaType(const char* aMIMEType,
char const *const ** aSupportedCodecs);
// Returns the CanPlayStatus indicating if we can handle the
// full MIME type including the optional codecs parameter.
static CanPlayStatus GetCanPlay(const nsAString& aType);
// Returns true if we should handle this MIME type when it appears
// as an <object> or as a toplevel page. If, in practice, our support
// for the type is more limited than appears in the wild, we should return
// false here even if CanHandleMediaType would return true.
static bool ShouldHandleMediaType(const char* aMIMEType);
#ifdef MOZ_OGG
static bool IsOggEnabled();
static bool IsOggType(const nsACString& aType);
static const char gOggTypes[3][16];
static char const *const gOggCodecs[3];
#endif
#ifdef MOZ_WAVE
static bool IsWaveEnabled();
static bool IsWaveType(const nsACString& aType);
static const char gWaveTypes[4][16];
static char const *const gWaveCodecs[2];
#endif
#ifdef MOZ_WEBM
static bool IsWebMEnabled();
static bool IsWebMType(const nsACString& aType);
static const char gWebMTypes[2][17];
static char const *const gWebMCodecs[4];
#endif
/**
* Called when a child source element is added to this media element. This
* may queue a task to run the select resource algorithm if appropriate.
*/
void NotifyAddedSource();
/**
* Called when there's been an error fetching the resource. This decides
* whether it's appropriate to fire an error event.
*/
void NotifyLoadError();
/**
* Called when data has been written to the underlying audio stream.
*/
void NotifyAudioAvailable(float* aFrameBuffer, PRUint32 aFrameBufferLength,
float aTime);
virtual bool IsNodeOfType(PRUint32 aFlags) const;
/**
* Returns the current load ID. Asynchronous events store the ID that was
* current when they were enqueued, and if it has changed when they come to
* fire, they consider themselves cancelled, and don't fire.
*/
PRUint32 GetCurrentLoadID() { return mCurrentLoadID; }
/**
* Returns the load group for this media element's owner document.
* XXX XBL2 issue.
*/
already_AddRefed<nsILoadGroup> GetDocumentLoadGroup();
/**
* Returns true if the media has played or completed a seek.
* Used by video frame to determine whether to paint the poster.
*/
bool GetPlayedOrSeeked() const { return mHasPlayedOrSeeked; }
nsresult CopyInnerTo(nsGenericElement* aDest) const;
/**
* Sets the Accept header on the HTTP channel to the required
* video or audio MIME types.
*/
virtual nsresult SetAcceptHeader(nsIHttpChannel* aChannel) = 0;
/**
* Sets the required request headers on the HTTP channel for
* video or audio requests.
*/
void SetRequestHeaders(nsIHttpChannel* aChannel);
/**
* Fires a timeupdate event. If aPeriodic is true, the event will only
* be fired if we've not fired a timeupdate event (for any reason) in the
* last 250ms, as required by the spec when the current time is periodically
* increasing during playback.
*/
void FireTimeUpdate(bool aPeriodic);
protected:
class MediaLoadListener;
/**
* Changes mHasPlayedOrSeeked to aValue. If mHasPlayedOrSeeked changes
* we'll force a reflow so that the video frame gets reflowed to reflect
* the poster hiding or showing immediately.
*/
void SetPlayedOrSeeked(bool aValue);
/**
* Create a decoder for the given aMIMEType. Returns null if we
* were unable to create the decoder.
*/
already_AddRefed<nsMediaDecoder> CreateDecoder(const nsACString& aMIMEType);
/**
* Initialize a decoder as a clone of an existing decoder in another
* element.
* mLoadingSrc must already be set.
*/
nsresult InitializeDecoderAsClone(nsMediaDecoder* aOriginal);
/**
* Initialize a decoder to load the given channel. The decoder's stream
* listener is returned via aListener.
* mLoadingSrc must already be set.
*/
nsresult InitializeDecoderForChannel(nsIChannel *aChannel,
nsIStreamListener **aListener);
/**
* Finish setting up the decoder after Load() has been called on it.
* Called by InitializeDecoderForChannel/InitializeDecoderAsClone.
*/
nsresult FinishDecoderSetup(nsMediaDecoder* aDecoder);
/**
* Call this after setting up mLoadingSrc and mDecoder.
*/
void AddMediaElementToURITable();
/**
* Call this before clearing mLoadingSrc.
*/
void RemoveMediaElementFromURITable();
/**
* Call this to find a media element with the same NodePrincipal and mLoadingSrc
* set to aURI, and with a decoder on which Load() has been called.
*/
nsHTMLMediaElement* LookupMediaElementURITable(nsIURI* aURI);
/**
* Execute the initial steps of the load algorithm that ensure existing
* loads are aborted, the element is emptied, and a new load ID is
* created.
*/
void AbortExistingLoads();
/**
* Create a URI for the given aURISpec string.
*/
nsresult NewURIFromString(const nsAutoString& aURISpec, nsIURI** aURI);
/**
* Called when all potential resources are exhausted. Changes network
* state to NETWORK_NO_SOURCE, and sends error event with code
* MEDIA_ERR_SRC_NOT_SUPPORTED.
*/
void NoSupportedMediaSourceError();
/**
* Attempts to load resources from the <source> children. This is a
* substep of the resource selection algorithm. Do not call this directly,
* call QueueLoadFromSourceTask() instead.
*/
void LoadFromSourceChildren();
/**
* Asynchronously awaits a stable state, and then causes
* LoadFromSourceChildren() to be called on the main threads' event loop.
*/
void QueueLoadFromSourceTask();
/**
* Runs the media resource selection algorithm.
*/
void SelectResource();
/**
* Asynchronously awaits a stable state, and then causes SelectResource()
* to be run on the main thread's event loop.
*/
void QueueSelectResourceTask();
/**
* The resource-fetch algorithm step of the load algorithm.
*/
nsresult LoadResource();
/**
* Selects the next <source> child from which to load a resource. Called
* during the resource selection algorithm. Stores the return value in
* mSourceLoadCandidate before returning.
*/
nsIContent* GetNextSource();
/**
* Changes mDelayingLoadEvent, and will call BlockOnLoad()/UnblockOnLoad()
* on the owning document, so it can delay the load event firing.
*/
void ChangeDelayLoadStatus(bool aDelay);
/**
* If we suspended downloading after the first frame, unsuspend now.
*/
void StopSuspendingAfterFirstFrame();
/**
* Called when our channel is redirected to another channel.
* Updates our mChannel reference to aNewChannel.
*/
nsresult OnChannelRedirect(nsIChannel *aChannel,
nsIChannel *aNewChannel,
PRUint32 aFlags);
/**
* Call this to reevaluate whether we should be holding a self-reference.
*/
void AddRemoveSelfReference();
/**
* Called asynchronously to release a self-reference to this element.
*/
void DoRemoveSelfReference();
/**
* Possible values of the 'preload' attribute.
*/
enum PreloadAttrValue {
PRELOAD_ATTR_EMPTY, // set to ""
PRELOAD_ATTR_NONE, // set to "none"
PRELOAD_ATTR_METADATA, // set to "metadata"
PRELOAD_ATTR_AUTO // set to "auto"
};
/**
* The preloading action to perform. These dictate how we react to the
* preload attribute. See mPreloadAction.
*/
enum PreloadAction {
PRELOAD_UNDEFINED = 0, // not determined - used only for initialization
PRELOAD_NONE = 1, // do not preload
PRELOAD_METADATA = 2, // preload only the metadata (and first frame)
PRELOAD_ENOUGH = 3 // preload enough data to allow uninterrupted
// playback
};
/**
* Suspends the load of mLoadingSrc, so that it can be resumed later
* by ResumeLoad(). This is called when we have a media with a 'preload'
* attribute value of 'none', during the resource selection algorithm.
*/
void SuspendLoad();
/**
* Resumes a previously suspended load (suspended by SuspendLoad(uri)).
* Will continue running the resource selection algorithm.
* Sets mPreloadAction to aAction.
*/
void ResumeLoad(PreloadAction aAction);
/**
* Handle a change to the preload attribute. Should be called whenever the
* value (or presence) of the preload attribute changes. The change in
* attribute value may cause a change in the mPreloadAction of this
* element. If there is a change then this method will initiate any
* behaviour that is necessary to implement the action.
*/
void UpdatePreloadAction();
/**
* Dispatches an error event to a child source element.
*/
void DispatchAsyncSourceError(nsIContent* aSourceElement);
/**
* Resets the media element for an error condition as per aErrorCode.
* aErrorCode must be one of nsIDOMHTMLMediaError codes.
*/
void Error(PRUint16 aErrorCode);
/**
* Returns the URL spec of the currentSrc.
**/
void GetCurrentSpec(nsCString& aString);
/**
* Process any media fragment entries in the URI
*/
void ProcessMediaFragmentURI();
// The current decoder. Load() has been called on this decoder.
nsRefPtr<nsMediaDecoder> mDecoder;
// A reference to the ImageContainer which contains the current frame
// of video to display.
nsRefPtr<ImageContainer> mImageContainer;
// Holds a reference to the first channel we open to the media resource.
// Once the decoder is created, control over the channel passes to the
// decoder, and we null out this reference. We must store this in case
// we need to cancel the channel before control of it passes to the decoder.
nsCOMPtr<nsIChannel> mChannel;
// Error attribute
nsCOMPtr<nsIDOMMediaError> mError;
// The current media load ID. This is incremented every time we start a
// new load. Async events note the ID when they're first sent, and only fire
// if the ID is unchanged when they come to fire.
PRUint32 mCurrentLoadID;
// Points to the child source elements, used to iterate through the children
// when selecting a resource to load.
nsCOMPtr<nsIDOMRange> mSourcePointer;
// Points to the document whose load we're blocking. This is the document
// we're bound to when loading starts.
nsCOMPtr<nsIDocument> mLoadBlockedDoc;
// Contains names of events that have been raised while in the bfcache.
// These events get re-dispatched when the bfcache is exited.
nsTArray<nsString> mPendingEvents;
// Media loading flags. See:
// http://www.whatwg.org/specs/web-apps/current-work/#video)
nsMediaNetworkState mNetworkState;
nsMediaReadyState mReadyState;
enum LoadAlgorithmState {
// No load algorithm instance is waiting for a source to be added to the
// media in order to continue loading.
NOT_WAITING,
// We've run the load algorithm, and we tried all source children of the
// media element, and failed to load any successfully. We're waiting for
// another source element to be added to the media element, and will try
// to load any such element when its added.
WAITING_FOR_SOURCE
};
// Denotes the waiting state of a load algorithm instance. When the load
// algorithm is waiting for a source element child to be added, this is set
// to WAITING_FOR_SOURCE, otherwise it's NOT_WAITING.
LoadAlgorithmState mLoadWaitStatus;
// Current audio volume
double mVolume;
// Current number of audio channels.
PRUint32 mChannels;
// Current audio sample rate.
PRUint32 mRate;
// URI of the resource we're attempting to load. This stores the value we
// return in the currentSrc attribute. Use GetCurrentSrc() to access the
// currentSrc attribute.
// This is always the original URL we're trying to load --- before
// redirects etc.
nsCOMPtr<nsIURI> mLoadingSrc;
// Stores the current preload action for this element. Initially set to
// PRELOAD_UNDEFINED, its value is changed by calling
// UpdatePreloadAction().
PreloadAction mPreloadAction;
// Size of the media. Updated by the decoder on the main thread if
// it changes. Defaults to a width and height of -1 inot set.
nsIntSize mMediaSize;
// Time that the last timeupdate event was fired. Read/Write from the
// main thread only.
TimeStamp mTimeUpdateTime;
// Media 'currentTime' value when the last timeupdate event occurred.
// Read/Write from the main thread only.
double mLastCurrentTime;
// Logical start time of the media resource in seconds as obtained
// from any media fragments. A negative value indicates that no
// fragment time has been set. Read/Write from the main thread only.
double mFragmentStart;
// Logical end time of the media resource in seconds as obtained
// from any media fragments. A negative value indicates that no
// fragment time has been set. Read/Write from the main thread only.
double mFragmentEnd;
nsRefPtr<gfxASurface> mPrintSurface;
// Reference to the source element last returned by GetNextSource().
// This is the child source element which we're trying to load from.
nsCOMPtr<nsIContent> mSourceLoadCandidate;
// An audio stream for writing audio directly from JS.
nsRefPtr<nsAudioStream> mAudioStream;
// True if MozAudioAvailable events can be safely dispatched, based on
// a media and element same-origin check.
bool mAllowAudioData;
// If true then we have begun downloading the media content.
// Set to false when completed, or not yet started.
bool mBegun;
// True when the decoder has loaded enough data to display the
// first frame of the content.
bool mLoadedFirstFrame;
// Indicates whether current playback is a result of user action
// (ie. calling of the Play method), or automatic playback due to
// the 'autoplay' attribute being set. A true value indicates the
// latter case.
// The 'autoplay' HTML attribute indicates that the video should
// start playing when loaded. The 'autoplay' attribute of the object
// is a mirror of the HTML attribute. These are different from this
// 'mAutoplaying' flag, which indicates whether the current playback
// is a result of the autoplay attribute.
bool mAutoplaying;
// Indicates whether |autoplay| will actually autoplay based on the pref
// media.autoplay.enabled
bool mAutoplayEnabled;
// Playback of the video is paused either due to calling the
// 'Pause' method, or playback not yet having started.
bool mPaused;
// True if the sound is muted
bool mMuted;
// If TRUE then the media element was actively playing before the currently
// in progress seeking. If FALSE then the media element is either not seeking
// or was not actively playing before the current seek. Used to decide whether
// to raise the 'waiting' event as per 4.7.1.8 in HTML 5 specification.
bool mPlayingBeforeSeek;
// True iff this element is paused because the document is inactive
bool mPausedForInactiveDocument;
// True if we've reported a "waiting" event since the last
// readyState change to HAVE_CURRENT_DATA.
bool mWaitingFired;
// True if we're running the "load()" method.
bool mIsRunningLoadMethod;
// True if we're loading the resource from the child source elements.
bool mIsLoadingFromSourceChildren;
// True if we're delaying the "load" event. They are delayed until either
// an error occurs, or the first frame is loaded.
bool mDelayingLoadEvent;
// True when we've got a task queued to call SelectResource(),
// or while we're running SelectResource().
bool mIsRunningSelectResource;
// True if we suspended the decoder because we were paused,
// preloading metadata is enabled, autoplay was not enabled, and we loaded
// the first frame.
bool mSuspendedAfterFirstFrame;
// True if we are allowed to suspend the decoder because we were paused,
// preloading metdata was enabled, autoplay was not enabled, and we loaded
// the first frame.
bool mAllowSuspendAfterFirstFrame;
// True if we've played or completed a seek. We use this to determine
// when the poster frame should be shown.
bool mHasPlayedOrSeeked;
// True if we've added a reference to ourselves to keep the element
// alive while no-one is referencing it but the element may still fire
// events of its own accord.
bool mHasSelfReference;
// True if we've received a notification that the engine is shutting
// down.
bool mShuttingDown;
// True if we've suspended a load in the resource selection algorithm
// due to loading a preload:none media. When true, the resource we'll
// load when the user initiates either playback or an explicit load is
// stored in mPreloadURI.
bool mLoadIsSuspended;
// True if a same-origin check has been done for the media element and resource.
bool mMediaSecurityVerified;
};
#endif
|