1 // Copyright 2014 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.
5 #include "ppapi/proxy/media_stream_video_track_resource.h"
7 #include "base/logging.h"
8 #include "ppapi/proxy/video_frame_resource.h"
9 #include "ppapi/shared_impl/media_stream_frame.h"
10 #include "ppapi/shared_impl/var.h"
15 MediaStreamVideoTrackResource::MediaStreamVideoTrackResource(
16 Connection connection
,
18 int pending_renderer_id
,
19 const std::string
& id
)
20 : MediaStreamTrackResourceBase(
21 connection
, instance
, pending_renderer_id
, id
),
22 get_frame_output_(NULL
) {
25 MediaStreamVideoTrackResource::~MediaStreamVideoTrackResource() {
29 thunk::PPB_MediaStreamVideoTrack_API
*
30 MediaStreamVideoTrackResource::AsPPB_MediaStreamVideoTrack_API() {
34 PP_Var
MediaStreamVideoTrackResource::GetId() {
35 return StringVar::StringToPPVar(id());
38 PP_Bool
MediaStreamVideoTrackResource::HasEnded() {
39 return PP_FromBool(has_ended());
43 int32_t MediaStreamVideoTrackResource::Configure(
44 const int32_t attrib_list
[],
45 scoped_refptr
<TrackedCallback
> callback
) {
46 // TODO(penghuang): redesign and implement Configure() to support format,
48 return PP_ERROR_NOTSUPPORTED
;
51 int32_t MediaStreamVideoTrackResource::GetAttrib(
52 PP_MediaStreamVideoTrack_Attrib attrib
,
54 // TODO(penghuang): implement this function.
55 return PP_ERROR_NOTSUPPORTED
;
58 int32_t MediaStreamVideoTrackResource::GetFrame(
60 scoped_refptr
<TrackedCallback
> callback
) {
62 return PP_ERROR_FAILED
;
64 if (TrackedCallback::IsPending(get_frame_callback_
))
65 return PP_ERROR_INPROGRESS
;
67 *frame
= GetVideoFrame();
71 get_frame_output_
= frame
;
72 get_frame_callback_
= callback
;
73 return PP_OK_COMPLETIONPENDING
;
76 int32_t MediaStreamVideoTrackResource::RecycleFrame(PP_Resource frame
) {
77 FrameMap::iterator it
= frames_
.find(frame
);
78 if (it
== frames_
.end())
79 return PP_ERROR_BADRESOURCE
;
81 scoped_refptr
<VideoFrameResource
> frame_resource
= it
->second
;
87 DCHECK_GE(frame_resource
->GetFrameBufferIndex(), 0);
89 SendEnqueueFrameMessageToHost(frame_resource
->GetFrameBufferIndex());
90 frame_resource
->Invalidate();
94 void MediaStreamVideoTrackResource::Close() {
98 if (TrackedCallback::IsPending(get_frame_callback_
)) {
99 *get_frame_output_
= 0;
100 get_frame_callback_
->PostAbort();
101 get_frame_callback_
= NULL
;
102 get_frame_output_
= 0;
106 MediaStreamTrackResourceBase::CloseInternal();
109 void MediaStreamVideoTrackResource::OnNewFrameEnqueued() {
110 if (TrackedCallback::IsPending(get_frame_callback_
)) {
111 *get_frame_output_
= GetVideoFrame();
112 get_frame_output_
= NULL
;
113 scoped_refptr
<TrackedCallback
> callback
;
114 callback
.swap(get_frame_callback_
);
115 callback
->Run(PP_OK
);
119 PP_Resource
MediaStreamVideoTrackResource::GetVideoFrame() {
120 int32_t index
= frame_buffer()->DequeueFrame();
123 MediaStreamFrame
* frame
= frame_buffer()->GetFramePointer(index
);
124 scoped_refptr
<VideoFrameResource
> resource
=
125 new VideoFrameResource(pp_instance(), index
, frame
);
126 // Add |pp_resource()| and |resource| into |frames_|.
127 // |frames_| uses scoped_ptr<> to hold a ref of |resource|. It keeps the
129 frames_
.insert(FrameMap::value_type(resource
->pp_resource(), resource
));
130 return resource
->GetReference();
133 void MediaStreamVideoTrackResource::ReleaseFrames() {
134 FrameMap::iterator it
= frames_
.begin();
135 while (it
!= frames_
.end()) {
136 // Just invalidate and release VideoFrameResorce, but keep PP_Resource.
137 // So plugin can still use |RecycleFrame()|.
138 it
->second
->Invalidate();