OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/proxy/media_stream_video_track_resource.h" | 5 #include "ppapi/proxy/media_stream_audio_track_resource.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "ppapi/proxy/audio_frame_resource.h" |
8 #include "ppapi/proxy/video_frame_resource.h" | |
9 #include "ppapi/shared_impl/media_stream_frame.h" | 8 #include "ppapi/shared_impl/media_stream_frame.h" |
10 #include "ppapi/shared_impl/var.h" | 9 #include "ppapi/shared_impl/var.h" |
11 | 10 |
12 namespace ppapi { | 11 namespace ppapi { |
13 namespace proxy { | 12 namespace proxy { |
14 | 13 |
15 MediaStreamVideoTrackResource::MediaStreamVideoTrackResource( | 14 MediaStreamAudioTrackResource::MediaStreamAudioTrackResource( |
16 Connection connection, | 15 Connection connection, |
17 PP_Instance instance, | 16 PP_Instance instance, |
18 int pending_renderer_id, | 17 int pending_renderer_id, |
19 const std::string& id) | 18 const std::string& id) |
20 : MediaStreamTrackResourceBase( | 19 : MediaStreamTrackResourceBase( |
21 connection, instance, pending_renderer_id, id), | 20 connection, instance, pending_renderer_id, id), |
22 get_frame_output_(NULL) { | 21 get_frame_output_(NULL) { |
23 } | 22 } |
24 | 23 |
25 MediaStreamVideoTrackResource::~MediaStreamVideoTrackResource() { | 24 MediaStreamAudioTrackResource::~MediaStreamAudioTrackResource() { |
26 Close(); | 25 Close(); |
27 } | 26 } |
28 | 27 |
29 thunk::PPB_MediaStreamVideoTrack_API* | 28 thunk::PPB_MediaStreamAudioTrack_API* |
30 MediaStreamVideoTrackResource::AsPPB_MediaStreamVideoTrack_API() { | 29 MediaStreamAudioTrackResource::AsPPB_MediaStreamAudioTrack_API() { |
31 return this; | 30 return this; |
32 } | 31 } |
33 | 32 |
34 PP_Var MediaStreamVideoTrackResource::GetId() { | 33 PP_Var MediaStreamAudioTrackResource::GetId() { |
35 return StringVar::StringToPPVar(id()); | 34 return StringVar::StringToPPVar(id()); |
36 } | 35 } |
37 | 36 |
38 PP_Bool MediaStreamVideoTrackResource::HasEnded() { | 37 PP_Bool MediaStreamAudioTrackResource::HasEnded() { |
39 return PP_FromBool(has_ended()); | 38 return PP_FromBool(has_ended()); |
40 } | 39 } |
41 | 40 |
42 int32_t MediaStreamVideoTrackResource::Configure(uint32_t max_buffered_frames) { | 41 int32_t MediaStreamAudioTrackResource::Configure(uint32_t samples_per_frame, |
43 // TODO(penghuang): redesign and implement Configure() to support format, | 42 uint32_t max_buffered_frames) { |
44 // size, etc. | 43 // TODO(penghuang): Implement Configure(). |
45 return PP_ERROR_NOTSUPPORTED; | 44 return PP_ERROR_NOTSUPPORTED; |
46 } | 45 } |
47 | 46 |
48 int32_t MediaStreamVideoTrackResource::GetFrame( | 47 int32_t MediaStreamAudioTrackResource::GetFrame( |
49 PP_Resource* frame, | 48 PP_Resource* frame, |
50 scoped_refptr<TrackedCallback> callback) { | 49 scoped_refptr<TrackedCallback> callback) { |
51 if (has_ended()) | 50 if (has_ended()) |
52 return PP_ERROR_FAILED; | 51 return PP_ERROR_FAILED; |
53 | 52 |
54 if (TrackedCallback::IsPending(get_frame_callback_)) | 53 if (TrackedCallback::IsPending(get_frame_callback_)) |
55 return PP_ERROR_INPROGRESS; | 54 return PP_ERROR_INPROGRESS; |
56 | 55 |
57 *frame = GetVideoFrame(); | 56 *frame = GetAudioFrame(); |
58 if (*frame) | 57 if (*frame) |
59 return PP_OK; | 58 return PP_OK; |
60 | 59 |
61 get_frame_output_ = frame; | 60 get_frame_output_ = frame; |
62 get_frame_callback_ = callback; | 61 get_frame_callback_ = callback; |
63 return PP_OK_COMPLETIONPENDING; | 62 return PP_OK_COMPLETIONPENDING; |
64 } | 63 } |
65 | 64 |
66 int32_t MediaStreamVideoTrackResource::RecycleFrame(PP_Resource frame) { | 65 int32_t MediaStreamAudioTrackResource::RecycleFrame(PP_Resource frame) { |
67 FrameMap::iterator it = frames_.find(frame); | 66 FrameMap::iterator it = frames_.find(frame); |
68 if (it == frames_.end()) | 67 if (it == frames_.end()) |
69 return PP_ERROR_BADRESOURCE; | 68 return PP_ERROR_BADRESOURCE; |
70 | 69 |
71 scoped_refptr<VideoFrameResource> frame_resource = it->second; | 70 scoped_refptr<AudioFrameResource> frame_resource = it->second; |
72 frames_.erase(it); | 71 frames_.erase(it); |
73 | 72 |
74 if (has_ended()) | 73 if (has_ended()) |
75 return PP_OK; | 74 return PP_OK; |
76 | 75 |
77 DCHECK_GE(frame_resource->GetFrameBufferIndex(), 0); | 76 DCHECK(frame_resource->GetFrameBufferIndex() >= 0); |
78 | 77 |
79 SendEnqueueFrameMessageToHost(frame_resource->GetFrameBufferIndex()); | 78 SendEnqueueFrameMessageToHost(frame_resource->GetFrameBufferIndex()); |
80 frame_resource->Invalidate(); | 79 frame_resource->Invalidate(); |
81 return PP_OK; | 80 return PP_OK; |
82 } | 81 } |
83 | 82 |
84 void MediaStreamVideoTrackResource::Close() { | 83 void MediaStreamAudioTrackResource::Close() { |
85 if (has_ended()) | 84 if (has_ended()) |
86 return; | 85 return; |
87 | 86 |
88 if (TrackedCallback::IsPending(get_frame_callback_)) { | 87 if (TrackedCallback::IsPending(get_frame_callback_)) { |
89 *get_frame_output_ = 0; | 88 *get_frame_output_ = 0; |
90 get_frame_callback_->PostAbort(); | 89 get_frame_callback_->PostAbort(); |
91 get_frame_callback_ = NULL; | 90 get_frame_callback_ = NULL; |
92 get_frame_output_ = 0; | 91 get_frame_output_ = 0; |
93 } | 92 } |
94 | 93 |
95 ReleaseFrames(); | 94 ReleaseFrames(); |
96 MediaStreamTrackResourceBase::CloseInternal(); | 95 MediaStreamTrackResourceBase::CloseInternal(); |
97 } | 96 } |
98 | 97 |
99 void MediaStreamVideoTrackResource::OnNewFrameEnqueued() { | 98 void MediaStreamAudioTrackResource::OnNewFrameEnqueued() { |
100 if (TrackedCallback::IsPending(get_frame_callback_)) { | 99 if (TrackedCallback::IsPending(get_frame_callback_)) { |
101 *get_frame_output_ = GetVideoFrame(); | 100 *get_frame_output_ = GetAudioFrame(); |
102 get_frame_output_ = NULL; | 101 get_frame_output_ = NULL; |
103 scoped_refptr<TrackedCallback> callback; | 102 scoped_refptr<TrackedCallback> callback; |
104 callback.swap(get_frame_callback_); | 103 callback.swap(get_frame_callback_); |
105 callback->Run(PP_OK); | 104 callback->Run(PP_OK); |
106 } | 105 } |
107 } | 106 } |
108 | 107 |
109 PP_Resource MediaStreamVideoTrackResource::GetVideoFrame() { | 108 PP_Resource MediaStreamAudioTrackResource::GetAudioFrame() { |
110 int32_t index = frame_buffer()->DequeueFrame(); | 109 int32_t index = frame_buffer()->DequeueFrame(); |
111 if (index < 0) | 110 if (index < 0) |
112 return 0; | 111 return 0; |
113 MediaStreamFrame* frame = frame_buffer()->GetFramePointer(index); | 112 MediaStreamFrame* frame = frame_buffer()->GetFramePointer(index); |
114 scoped_refptr<VideoFrameResource> resource = | 113 scoped_refptr<AudioFrameResource> resource = |
115 new VideoFrameResource(pp_instance(), index, frame); | 114 new AudioFrameResource(pp_instance(), index, frame); |
116 // Add |pp_resource()| and |resource| into |frames_|. | 115 // Add |pp_resource()| and |resource| into |frames_|. |
117 // |frames_| uses scoped_ptr<> to hold a ref of |resource|. It keeps the | 116 // |frames_| uses scoped_ptr<> to hold a ref of |resource|. It keeps the |
118 // resource alive. | 117 // resource alive. |
119 frames_.insert(FrameMap::value_type(resource->pp_resource(), resource)); | 118 frames_.insert(FrameMap::value_type(resource->pp_resource(), resource)); |
120 return resource->GetReference(); | 119 return resource->GetReference(); |
121 } | 120 } |
122 | 121 |
123 void MediaStreamVideoTrackResource::ReleaseFrames() { | 122 void MediaStreamAudioTrackResource::ReleaseFrames() { |
124 FrameMap::iterator it = frames_.begin(); | 123 FrameMap::iterator it = frames_.begin(); |
125 while (it != frames_.end()) { | 124 while (it != frames_.end()) { |
126 // Just invalidate and release VideoFrameResorce, but keep PP_Resource. | 125 // Just invalidate and release VideoFrameResorce, but keep PP_Resource. |
127 // So plugin can still use |RecycleFrame()|. | 126 // So plugin can still use |RecycleFrame()|. |
128 it->second->Invalidate(); | 127 it->second->Invalidate(); |
129 it->second = NULL; | 128 it->second = NULL; |
130 } | 129 } |
131 } | 130 } |
132 | 131 |
133 } // namespace proxy | 132 } // namespace proxy |
134 } // namespace ppapi | 133 } // namespace ppapi |
OLD | NEW |