• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 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/android/renderer_demuxer_android.h"
6 
7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/message_loop/message_loop_proxy.h"
10 #include "content/child/thread_safe_sender.h"
11 #include "content/common/media/media_player_messages_android.h"
12 #include "content/renderer/media/android/media_source_delegate.h"
13 #include "content/renderer/media/android/renderer_media_player_manager.h"
14 #include "content/renderer/media/android/webmediaplayer_android.h"
15 #include "content/renderer/render_thread_impl.h"
16 
17 namespace content {
18 
RendererDemuxerAndroid()19 RendererDemuxerAndroid::RendererDemuxerAndroid()
20     : thread_safe_sender_(RenderThreadImpl::current()->thread_safe_sender()),
21       media_message_loop_(
22           RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy()) {}
23 
~RendererDemuxerAndroid()24 RendererDemuxerAndroid::~RendererDemuxerAndroid() {}
25 
GetNextDemuxerClientID()26 int RendererDemuxerAndroid::GetNextDemuxerClientID() {
27   // Don't use zero for IDs since it can be interpreted as having no ID.
28   return next_demuxer_client_id_.GetNext() + 1;
29 }
30 
AddDelegate(int demuxer_client_id,MediaSourceDelegate * delegate)31 void RendererDemuxerAndroid::AddDelegate(int demuxer_client_id,
32                                          MediaSourceDelegate* delegate) {
33   DCHECK(media_message_loop_->BelongsToCurrentThread());
34   delegates_.AddWithID(delegate, demuxer_client_id);
35 }
36 
RemoveDelegate(int demuxer_client_id)37 void RendererDemuxerAndroid::RemoveDelegate(int demuxer_client_id) {
38   DCHECK(media_message_loop_->BelongsToCurrentThread());
39   delegates_.Remove(demuxer_client_id);
40 }
41 
OnMessageReceived(const IPC::Message & message)42 bool RendererDemuxerAndroid::OnMessageReceived(const IPC::Message& message) {
43   switch (message.type()) {
44     case MediaPlayerMsg_DemuxerSeekRequest::ID:
45     case MediaPlayerMsg_ReadFromDemuxer::ID:
46       media_message_loop_->PostTask(FROM_HERE, base::Bind(
47           &RendererDemuxerAndroid::DispatchMessage, this, message));
48       return true;
49    }
50   return false;
51 }
52 
DemuxerReady(int demuxer_client_id,const media::DemuxerConfigs & configs)53 void RendererDemuxerAndroid::DemuxerReady(
54     int demuxer_client_id,
55     const media::DemuxerConfigs& configs) {
56   thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerReady(
57       demuxer_client_id, configs));
58 }
59 
ReadFromDemuxerAck(int demuxer_client_id,const media::DemuxerData & data)60 void RendererDemuxerAndroid::ReadFromDemuxerAck(
61     int demuxer_client_id,
62     const media::DemuxerData& data) {
63   thread_safe_sender_->Send(new MediaPlayerHostMsg_ReadFromDemuxerAck(
64       demuxer_client_id, data));
65 }
66 
DemuxerSeekDone(int demuxer_client_id,const base::TimeDelta & actual_browser_seek_time)67 void RendererDemuxerAndroid::DemuxerSeekDone(
68     int demuxer_client_id,
69     const base::TimeDelta& actual_browser_seek_time) {
70   thread_safe_sender_->Send(new MediaPlayerHostMsg_DemuxerSeekDone(
71       demuxer_client_id, actual_browser_seek_time));
72 }
73 
DurationChanged(int demuxer_client_id,const base::TimeDelta & duration)74 void RendererDemuxerAndroid::DurationChanged(int demuxer_client_id,
75                                              const base::TimeDelta& duration) {
76   thread_safe_sender_->Send(new MediaPlayerHostMsg_DurationChanged(
77       demuxer_client_id, duration));
78 }
79 
DispatchMessage(const IPC::Message & message)80 void RendererDemuxerAndroid::DispatchMessage(const IPC::Message& message) {
81   IPC_BEGIN_MESSAGE_MAP(RendererDemuxerAndroid, message)
82     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DemuxerSeekRequest, OnDemuxerSeekRequest)
83     IPC_MESSAGE_HANDLER(MediaPlayerMsg_ReadFromDemuxer, OnReadFromDemuxer)
84   IPC_END_MESSAGE_MAP()
85 }
86 
OnReadFromDemuxer(int demuxer_client_id,media::DemuxerStream::Type type)87 void RendererDemuxerAndroid::OnReadFromDemuxer(
88     int demuxer_client_id,
89     media::DemuxerStream::Type type) {
90   MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id);
91   if (delegate)
92     delegate->OnReadFromDemuxer(type);
93 }
94 
OnDemuxerSeekRequest(int demuxer_client_id,const base::TimeDelta & time_to_seek,bool is_browser_seek)95 void RendererDemuxerAndroid::OnDemuxerSeekRequest(
96     int demuxer_client_id,
97     const base::TimeDelta& time_to_seek,
98     bool is_browser_seek) {
99   MediaSourceDelegate* delegate = delegates_.Lookup(demuxer_client_id);
100   if (delegate)
101     delegate->Seek(time_to_seek, is_browser_seek);
102 }
103 
104 }  // namespace content
105