DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (6863f516ba38)

VCS Links

Line Code
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
/* -*- 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 CAPTURETASK_H
#define CAPTURETASK_H

#include "MediaStreamGraph.h"
#include "MediaStreamListener.h"
#include "PrincipalChangeObserver.h"

namespace mozilla {

namespace dom {
class Blob;
class ImageCapture;
class MediaStreamTrack;
}  // namespace dom

/**
 * CaptureTask retrieves image from MediaStream and encodes the image to jpeg in
 * ImageEncoder. The whole procedures start at AttachTrack(), it will add this
 * class into MediaStream and retrieves an image in MediaStreamGraph thread.
 * Once the image is retrieved, it will be sent to ImageEncoder and the encoded
 * blob will be sent out via encoder callback in main thread.
 *
 * CaptureTask holds a reference of ImageCapture to ensure ImageCapture won't be
 * released during the period of the capturing process described above.
 */
class CaptureTask : public DirectMediaStreamTrackListener,
                    public dom::PrincipalChangeObserver<dom::MediaStreamTrack> {
 public:
  class MediaStreamEventListener;

  // DirectMediaStreamTrackListener methods
  void NotifyRealtimeTrackData(MediaStreamGraph* aGraph,
                               StreamTime aTrackOffset,
                               const MediaSegment& aMedia) override;

  // PrincipalChangeObserver<MediaStreamTrack> methods
  void PrincipalChanged(dom::MediaStreamTrack* aMediaStreamTrack) override;

  // CaptureTask methods.

  // It is called when aBlob is ready to post back to script in company with
  // aRv == NS_OK. If aRv is not NS_OK, it will post an error event to script.
  //
  // Note:
  //   this function should be called on main thread.
  nsresult TaskComplete(already_AddRefed<dom::Blob> aBlob, nsresult aRv);

  // Add listeners into MediaStreamTrack and PrincipalChangeObserver.
  // It should be on main thread only.
  void AttachTrack();

  // Remove listeners from MediaStreamTrack and PrincipalChangeObserver.
  // It should be on main thread only.
  void DetachTrack();

  // CaptureTask should be created on main thread.
  explicit CaptureTask(dom::ImageCapture* aImageCapture);

 protected:
  virtual ~CaptureTask() {}

  // Post a runnable on main thread to end this task and call TaskComplete to
  // post error event to script. It is called off-main-thread.
  void PostTrackEndEvent();

  // The ImageCapture associates with this task. This reference count should not
  // change in this class unless it clears this reference after a blob or error
  // event to script.
  RefPtr<dom::ImageCapture> mImageCapture;

  RefPtr<MediaStreamEventListener> mEventListener;

  // True when an image is retrieved from the video track, or MediaStreamGraph
  // sends a track finish, end, or removed event. Any thread.
  Atomic<bool> mImageGrabbedOrTrackEnd;

  // True after MediaStreamTrack principal changes while waiting for a photo
  // to finish and we should raise a security error.
  bool mPrincipalChanged;
};

}  // namespace mozilla

#endif  // CAPTURETASK_H