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. 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 18template <> const char* interface_name<PPB_MediaStreamVideoTrack_1_0>() { 19 return PPB_MEDIASTREAMVIDEOTRACK_INTERFACE_1_0; 20} 21 22template <> 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 40MediaStreamVideoTrack::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 50MediaStreamVideoTrack::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) { 60 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>()) { 64 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) { 72 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>()) { 76 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 { 83 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>()) { 89 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 { 98 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>()) { 102 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) { 110 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>()) { 114 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) { 121 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>()) { 125 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() { 132 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>()) 135 get_interface<PPB_MediaStreamVideoTrack_0_1>()->Close(pp_resource()); 136 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; 154} 155 156bool MediaStreamVideoTrack::IsMediaStreamVideoTrack(const Resource& resource) { 157 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>()) { 161 return PP_ToBool(get_interface<PPB_MediaStreamVideoTrack_0_1>()-> 162 IsMediaStreamVideoTrack(resource.pp_resource())); 163 } 164 return false; 165} 166 167} // namespace pp 168