forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 2
/
CaptureTask.h
95 lines (75 loc) · 3.36 KB
/
CaptureTask.h
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
/* -*- 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 "DOMMediaStream.h"
#include "MediaStreamGraph.h"
namespace mozilla {
namespace dom {
class File;
class ImageCapture;
}
/**
* CaptureTask retrieves image from MediaStream and encodes the image to jpeg in
* ImageEncoder. The whole procedures start at AttachStream(), 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 MediaStreamListener,
public DOMMediaStream::PrincipalChangeObserver
{
public:
// MediaStreamListener methods.
virtual void NotifyQueuedTrackChanges(MediaStreamGraph* aGraph, TrackID aID,
StreamTime aTrackOffset,
uint32_t aTrackEvents,
const MediaSegment& aQueuedMedia) MOZ_OVERRIDE;
virtual void NotifyEvent(MediaStreamGraph* aGraph,
MediaStreamGraphEvent aEvent) MOZ_OVERRIDE;
// DOMMediaStream::PrincipalChangeObserver method.
virtual void PrincipalChanged(DOMMediaStream* aMediaStream) MOZ_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::File> aBlob, nsresult aRv);
// Add listeners into MediaStream and PrincipalChangeObserver. It should be on
// main thread only.
void AttachStream();
// Remove listeners from MediaStream and PrincipalChangeObserver. It should be
// on main thread only.
void DetachStream();
// CaptureTask should be created on main thread.
CaptureTask(dom::ImageCapture* aImageCapture, TrackID aTrackID)
: mImageCapture(aImageCapture)
, mTrackID(aTrackID)
, mImageGrabbedOrTrackEnd(false)
, mPrincipalChanged(false) {}
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.
nsRefPtr<dom::ImageCapture> mImageCapture;
TrackID mTrackID;
// True when an image is retrieved from MediaStreamGraph or MediaStreamGraph
// sends a track finish, end, or removed event.
bool mImageGrabbedOrTrackEnd;
// True when MediaStream principal is changed in the period of taking photo
// and it causes a NS_ERROR_DOM_SECURITY_ERR error to script.
bool mPrincipalChanged;
};
} // namespace mozilla
#endif // CAPTURETASK_H