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