1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/renderer/media/media_stream_source_observer.h"
6
7#include "base/logging.h"
8#include "content/renderer/media/media_stream_source_extra_data.h"
9
10namespace content {
11
12MediaStreamSourceObserver::MediaStreamSourceObserver(
13    webrtc::MediaSourceInterface* webrtc_source,
14    MediaStreamSourceExtraData* extra_data)
15     : state_(webrtc_source->state()),
16       webrtc_source_(webrtc_source),
17       extra_data_(extra_data) {
18  webrtc_source_->RegisterObserver(this);
19}
20
21MediaStreamSourceObserver::~MediaStreamSourceObserver() {
22  DCHECK(CalledOnValidThread());
23  if (webrtc_source_.get())
24    webrtc_source_->UnregisterObserver(this);
25}
26
27void MediaStreamSourceObserver::OnChanged() {
28  DCHECK(CalledOnValidThread());
29  // There should be no more notification after kEnded.
30  DCHECK(webrtc_source_.get() != NULL);
31
32  webrtc::MediaSourceInterface::SourceState state = webrtc_source_->state();
33  if (state == state_)
34    return;
35  state_ = state;
36  WebKit::WebMediaStreamSource webkit_source(extra_data_->webkit_source());
37
38  switch (state) {
39    case webrtc::MediaSourceInterface::kInitializing:
40      // Ignore the kInitializing state since there is no match in
41      // WebMediaStreamSource::ReadyState.
42      break;
43    case webrtc::MediaSourceInterface::kLive:
44      webkit_source.setReadyState(
45          WebKit::WebMediaStreamSource::ReadyStateLive);
46      break;
47    case webrtc::MediaSourceInterface::kMuted:
48      webkit_source.setReadyState(
49          WebKit::WebMediaStreamSource::ReadyStateMuted);
50      break;
51    case webrtc::MediaSourceInterface::kEnded:
52      webkit_source.setReadyState(
53          WebKit::WebMediaStreamSource::ReadyStateEnded);
54      webrtc_source_->UnregisterObserver(this);
55      webrtc_source_ = NULL;
56      break;
57    default:
58      NOTREACHED();
59      break;
60  }
61}
62
63}  // namespace content
64