1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef PPAPI_CPP_PRIVATE_VIDEO_FRAME_PRIVATE_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define PPAPI_CPP_PRIVATE_VIDEO_FRAME_PRIVATE_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string.h> 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/pp_time.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/private/pp_video_frame_private.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/cpp/completion_callback.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/cpp/image_data.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/cpp/pass_ref.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// @file 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// This file defines the struct used to hold a video frame. 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace pp { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// The <code>PP_VideoFrame_Private</code> struct represents a video frame. 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// Video sources and destinations use frames to transfer video to and from 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/// the browser. 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class VideoFrame_Private { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// Default constructor for creating a <code>VideoFrame_Private</code> object. 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VideoFrame_Private(); 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// Constructor that takes an existing <code>PP_VideoFrame_Private</code> 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// structure. The 'image_data' PP_Resource field in the structure will be 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// managed by this instance. 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VideoFrame_Private(PassRef, const PP_VideoFrame_Private& pp_video_frame); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// Constructor that takes an existing <code>ImageData</code> instance and 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// a timestamp. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VideoFrame_Private(const ImageData& image_data, PP_TimeTicks timestamp); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// The copy constructor for <code>VideoFrame_Private</code>. 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @param[in] other A reference to a <code>VideoFrame_Private</code>. 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VideoFrame_Private(const VideoFrame_Private& other); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~VideoFrame_Private(); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// The assignment operator for <code>VideoFrame_Private</code>. 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /// @param[in] other A reference to a <code>VideoFrame_Private</code>. 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VideoFrame_Private& operator=(const VideoFrame_Private& other); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PP_VideoFrame_Private& pp_video_frame() const { 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return video_frame_; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageData image_data() const { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return image_data_; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_image_data(const ImageData& image_data) { 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_data_ = image_data; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The assignment above manages the underlying PP_Resources. Copy the new 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // one into our internal video frame struct. 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) video_frame_.image_data = image_data_.pp_resource(); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_TimeTicks timestamp() const { return video_frame_.timestamp; } 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_timestamp(PP_TimeTicks timestamp) { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) video_frame_.timestamp = timestamp; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ImageData image_data_; // This manages the PP_Resource in video_frame_. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_VideoFrame_Private video_frame_; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace internal { 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A specialization of CallbackOutputTraits to provide the callback system the 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// information on how to handle pp::VideoFrame_Private. This converts 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// PP_VideoFrame_Private to pp::VideoFrame_Private when passing to the plugin, 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// and specifically manages the PP_Resource embedded in the video_frame_ field. 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)template<> 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct CallbackOutputTraits<pp::VideoFrame_Private> { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef PP_VideoFrame_Private* APIArgType; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef PP_VideoFrame_Private StorageType; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static inline APIArgType StorageToAPIArg(StorageType& t) { 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return &t; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static inline pp::VideoFrame_Private StorageToPluginArg(StorageType& t) { 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return pp::VideoFrame_Private(PASS_REF, t); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static inline void Initialize(StorageType* t) { 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch VideoFrame_Private dummy; 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch *t = dummy.pp_video_frame(); 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace internal 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace pp 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // PPAPI_CPP_PRIVATE_VIDEO_FRAME_PRIVATE_H_ 104