15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/media_stream_video_track.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_media_stream_video_track.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/module_impl.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/var.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/cpp/video_frame.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace pp {
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template <> const char* interface_name<PPB_MediaStreamVideoTrack_1_0>() {
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return PPB_MEDIASTREAMVIDEOTRACK_INTERFACE_1_0;
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <> const char* interface_name<PPB_MediaStreamVideoTrack_0_1>() {
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return PPB_MEDIASTREAMVIDEOTRACK_INTERFACE_0_1;
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MediaStreamVideoTrack::MediaStreamVideoTrack() {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MediaStreamVideoTrack::MediaStreamVideoTrack(
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const MediaStreamVideoTrack& other) : Resource(other) {
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MediaStreamVideoTrack::MediaStreamVideoTrack(const Resource& resource)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : Resource(resource) {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PP_DCHECK(IsMediaStreamVideoTrack(resource));
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)MediaStreamVideoTrack::MediaStreamVideoTrack(const InstanceHandle& instance) {
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    PassRefFromConstructor(
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        get_interface<PPB_MediaStreamVideoTrack_1_0>()->Create(
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            instance.pp_instance()));
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PP_DCHECK(false);
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MediaStreamVideoTrack::MediaStreamVideoTrack(PassRef, PP_Resource resource)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : Resource(PASS_REF, resource) {
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)MediaStreamVideoTrack::~MediaStreamVideoTrack() {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t MediaStreamVideoTrack::Configure(
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const int32_t attributes[],
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const CompletionCallback& callback) {
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_1_0>()->Configure(
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        pp_resource(), attributes, callback.pp_completion_callback());
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_0_1>()->Configure(
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pp_resource(), attributes, callback.pp_completion_callback());
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return callback.MayForce(PP_ERROR_NOINTERFACE);
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t MediaStreamVideoTrack::GetAttrib(PP_MediaStreamVideoTrack_Attrib attrib,
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         int32_t* value) {
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_1_0>()->GetAttrib(
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        pp_resource(), attrib, value);
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_0_1>()->GetAttrib(
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pp_resource(), attrib, value);
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return PP_ERROR_NOINTERFACE;
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string MediaStreamVideoTrack::GetId() const {
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    pp::Var id(PASS_REF, get_interface<PPB_MediaStreamVideoTrack_1_0>()->GetId(
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        pp_resource()));
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (id.is_string())
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return id.AsString();
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    pp::Var id(PASS_REF, get_interface<PPB_MediaStreamVideoTrack_0_1>()->GetId(
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pp_resource()));
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (id.is_string())
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return id.AsString();
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return std::string();
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MediaStreamVideoTrack::HasEnded() const {
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_1_0>()->HasEnded(
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        pp_resource()));
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_0_1>()->HasEnded(
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pp_resource()));
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t MediaStreamVideoTrack::GetFrame(
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const CompletionCallbackWithOutput<VideoFrame>& callback) {
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_1_0>()->GetFrame(
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        pp_resource(), callback.output(), callback.pp_completion_callback());
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_0_1>()->GetFrame(
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pp_resource(), callback.output(), callback.pp_completion_callback());
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return callback.MayForce(PP_ERROR_NOINTERFACE);
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t MediaStreamVideoTrack::RecycleFrame(const VideoFrame& frame) {
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_1_0>()->RecycleFrame(
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        pp_resource(), frame.pp_resource());
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_0_1>()->RecycleFrame(
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pp_resource(), frame.pp_resource());
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return PP_ERROR_NOINTERFACE;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MediaStreamVideoTrack::Close() {
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>())
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    get_interface<PPB_MediaStreamVideoTrack_1_0>()->Close(pp_resource());
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  else if (has_interface<PPB_MediaStreamVideoTrack_0_1>())
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    get_interface<PPB_MediaStreamVideoTrack_0_1>()->Close(pp_resource());
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int32_t MediaStreamVideoTrack::GetEmptyFrame(
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const CompletionCallbackWithOutput<VideoFrame>& callback) {
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_1_0>()->GetEmptyFrame(
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        pp_resource(), callback.output(), callback.pp_completion_callback());
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return callback.MayForce(PP_ERROR_NOINTERFACE);
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int32_t MediaStreamVideoTrack::PutFrame(const VideoFrame& frame) {
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return get_interface<PPB_MediaStreamVideoTrack_1_0>()->PutFrame(
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        pp_resource(), frame.pp_resource());
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return PP_ERROR_NOINTERFACE;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool MediaStreamVideoTrack::IsMediaStreamVideoTrack(const Resource& resource) {
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (has_interface<PPB_MediaStreamVideoTrack_1_0>()) {
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_1_0>()->
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        IsMediaStreamVideoTrack(resource.pp_resource()));
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else if (has_interface<PPB_MediaStreamVideoTrack_0_1>()) {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_0_1>()->
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        IsMediaStreamVideoTrack(resource.pp_resource()));
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace pp
168