blob: 24ba76b038da5e259c00c9cda8e239ccab72326c [file] [log] [blame]
atraczyk14ba30c2016-09-22 18:31:59 -04001/**************************************************************************
2* Copyright (C) 2016 by Savoir-faire Linux *
3* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com> *
4* Author: Traczyk Andreas <andreas.traczyk@savoirfairelinux.com> *
5* *
6* This program is free software; you can redistribute it and/or modify *
7* it under the terms of the GNU General Public License as published by *
8* the Free Software Foundation; either version 3 of the License, or *
9* (at your option) any later version. *
10* *
11* This program is distributed in the hope that it will be useful, *
12* but WITHOUT ANY WARRANTY; without even the implied warranty of *
13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14* GNU General Public License for more details. *
15* *
16* You should have received a copy of the GNU General Public License *
17* along with this program. If not, see <http://www.gnu.org/licenses/>. *
18**************************************************************************/
19
20#pragma once
21
22#include "videomanager_interface.h"
23
24namespace RingClientUWP
25{
26
27delegate void WriteVideoFrame(String^, uint8_t*, int, int);
28delegate void ClearRenderTarget();
29
30namespace Video
31{
32
33class VideoRenderer
34{
35public:
36 std::string id;
37 std::mutex video_mutex;
38 DRing::SinkTarget target;
39 DRing::SinkTarget::FrameBufferPtr daemonFramePtr_;
40 int width;
41 int height;
42
43 void bindSinkFunctions();
44
45 DRing::SinkTarget::FrameBufferPtr requestFrameBuffer(std::size_t bytes);
46 void onNewFrame(DRing::SinkTarget::FrameBufferPtr buf);
47
48};
49
50ref class VideoRendererWrapper sealed
51{
52internal:
53 VideoRendererWrapper() {
54 renderer = std::make_shared<VideoRenderer>();
55 isRendering = false;
56 };
57
58 std::mutex render_mutex;
59 std::condition_variable frame_cv;
60
61 std::shared_ptr<VideoRenderer> renderer;
62 bool isRendering;
63};
64
65public ref class VideoRendererManager sealed
66{
67internal:
68 void startedDecoding(String^ id, int width, int height);
69 void registerSinkTarget(String^ sinkID, const DRing::SinkTarget& target);
70
71 /* events */
72 event WriteVideoFrame^ writeVideoFrame;
73 event ClearRenderTarget^ clearRenderTarget;
74
75 VideoRendererWrapper^ renderer(String^ id);
76 Map<String^,VideoRendererWrapper^>^ renderers;
77
78public:
79 VideoRendererManager();
80
81 void raiseWriteVideoFrame(String^ id);
82 void raiseClearRenderTarget();
83
84 void removeRenderer(String^ id);
85
86private:
87
88};
89
90} /* namespace Video */
91} /* namespace RingClientUWP */