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