blob: 47ff1406f75b8f95deb5383e29ccffc39d8a735c [file] [log] [blame]
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +00001// 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.
4
5#include "ppapi/cpp/media_stream_video_track.h"
6
7#include "ppapi/c/pp_errors.h"
8#include "ppapi/c/ppb_media_stream_video_track.h"
9#include "ppapi/cpp/completion_callback.h"
10#include "ppapi/cpp/module_impl.h"
11#include "ppapi/cpp/var.h"
12#include "ppapi/cpp/video_frame.h"
13
14namespace pp {
15
16namespace {
17
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +010018template <> const char* interface_name<PPB_MediaStreamVideoTrack_1_0>() {
19 return PPB_MEDIASTREAMVIDEOTRACK_INTERFACE_1_0;
20}
21
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000022template <> const char* interface_name<PPB_MediaStreamVideoTrack_0_1>() {
23 return PPB_MEDIASTREAMVIDEOTRACK_INTERFACE_0_1;
24}
25
26} // namespace
27
28MediaStreamVideoTrack::MediaStreamVideoTrack() {
29}
30
31MediaStreamVideoTrack::MediaStreamVideoTrack(
32 const MediaStreamVideoTrack& other) : Resource(other) {
33}
34
35MediaStreamVideoTrack::MediaStreamVideoTrack(const Resource& resource)
36 : Resource(resource) {
37 PP_DCHECK(IsMediaStreamVideoTrack(resource));
38}
39
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +010040MediaStreamVideoTrack::MediaStreamVideoTrack(const InstanceHandle& instance) {
41 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
42 PassRefFromConstructor(
43 get_interface<PPB_MediaStreamVideoTrack_1_0>()->Create(
44 instance.pp_instance()));
45 return;
46 }
47 PP_DCHECK(false);
48}
49
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000050MediaStreamVideoTrack::MediaStreamVideoTrack(PassRef, PP_Resource resource)
51 : Resource(PASS_REF, resource) {
52}
53
54MediaStreamVideoTrack::~MediaStreamVideoTrack() {
55}
56
57int32_t MediaStreamVideoTrack::Configure(
58 const int32_t attributes[],
59 const CompletionCallback& callback) {
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +010060 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
61 return get_interface<PPB_MediaStreamVideoTrack_1_0>()->Configure(
62 pp_resource(), attributes, callback.pp_completion_callback());
63 } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000064 return get_interface<PPB_MediaStreamVideoTrack_0_1>()->Configure(
65 pp_resource(), attributes, callback.pp_completion_callback());
66 }
67 return callback.MayForce(PP_ERROR_NOINTERFACE);
68}
69
70int32_t MediaStreamVideoTrack::GetAttrib(PP_MediaStreamVideoTrack_Attrib attrib,
71 int32_t* value) {
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +010072 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
73 return get_interface<PPB_MediaStreamVideoTrack_1_0>()->GetAttrib(
74 pp_resource(), attrib, value);
75 } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000076 return get_interface<PPB_MediaStreamVideoTrack_0_1>()->GetAttrib(
77 pp_resource(), attrib, value);
78 }
79 return PP_ERROR_NOINTERFACE;
80}
81
82std::string MediaStreamVideoTrack::GetId() const {
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +010083 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
84 pp::Var id(PASS_REF, get_interface<PPB_MediaStreamVideoTrack_1_0>()->GetId(
85 pp_resource()));
86 if (id.is_string())
87 return id.AsString();
88 } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000089 pp::Var id(PASS_REF, get_interface<PPB_MediaStreamVideoTrack_0_1>()->GetId(
90 pp_resource()));
91 if (id.is_string())
92 return id.AsString();
93 }
94 return std::string();
95}
96
97bool MediaStreamVideoTrack::HasEnded() const {
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +010098 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
99 return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_1_0>()->HasEnded(
100 pp_resource()));
101 } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000102 return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_0_1>()->HasEnded(
103 pp_resource()));
104 }
105 return true;
106}
107
108int32_t MediaStreamVideoTrack::GetFrame(
109 const CompletionCallbackWithOutput<VideoFrame>& callback) {
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +0100110 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
111 return get_interface<PPB_MediaStreamVideoTrack_1_0>()->GetFrame(
112 pp_resource(), callback.output(), callback.pp_completion_callback());
113 } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000114 return get_interface<PPB_MediaStreamVideoTrack_0_1>()->GetFrame(
115 pp_resource(), callback.output(), callback.pp_completion_callback());
116 }
117 return callback.MayForce(PP_ERROR_NOINTERFACE);
118}
119
120int32_t MediaStreamVideoTrack::RecycleFrame(const VideoFrame& frame) {
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +0100121 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
122 return get_interface<PPB_MediaStreamVideoTrack_1_0>()->RecycleFrame(
123 pp_resource(), frame.pp_resource());
124 } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000125 return get_interface<PPB_MediaStreamVideoTrack_0_1>()->RecycleFrame(
126 pp_resource(), frame.pp_resource());
127 }
128 return PP_ERROR_NOINTERFACE;
129}
130
131void MediaStreamVideoTrack::Close() {
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +0100132 if (has_interface<PPB_MediaStreamVideoTrack_1_0>())
133 get_interface<PPB_MediaStreamVideoTrack_1_0>()->Close(pp_resource());
134 else if (has_interface<PPB_MediaStreamVideoTrack_0_1>())
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000135 get_interface<PPB_MediaStreamVideoTrack_0_1>()->Close(pp_resource());
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +0100136
137}
138
139int32_t MediaStreamVideoTrack::GetEmptyFrame(
140 const CompletionCallbackWithOutput<VideoFrame>& callback) {
141 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
142 return get_interface<PPB_MediaStreamVideoTrack_1_0>()->GetEmptyFrame(
143 pp_resource(), callback.output(), callback.pp_completion_callback());
144 }
145 return callback.MayForce(PP_ERROR_NOINTERFACE);
146}
147
148int32_t MediaStreamVideoTrack::PutFrame(const VideoFrame& frame) {
149 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
150 return get_interface<PPB_MediaStreamVideoTrack_1_0>()->PutFrame(
151 pp_resource(), frame.pp_resource());
152 }
153 return PP_ERROR_NOINTERFACE;
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000154}
155
156bool MediaStreamVideoTrack::IsMediaStreamVideoTrack(const Resource& resource) {
Torne (Richard Coles)010d83a2014-05-14 12:12:37 +0100157 if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
158 return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_1_0>()->
159 IsMediaStreamVideoTrack(resource.pp_resource()));
160 } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000161 return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_0_1>()->
162 IsMediaStreamVideoTrack(resource.pp_resource()));
163 }
164 return false;
165}
166
167} // namespace pp