summaryrefslogtreecommitdiffstats
path: root/pica-client/callwindow.h
blob: fbdcf60090bc38ad669a89833033e9684a5ee9bc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

/*
	(c) Copyright  2012 - 2018 Anton Sviridenko
	https://picapica.im

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, version 3.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef CALLWINDOW_H
#define CALLWINDOW_H

#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QTimer>
#include <QImage>
#ifdef HAVE_VAAPI
#include "vaapi.h"
#endif

class CallWindow : public QWidget
{
	Q_OBJECT
public:
	explicit CallWindow(QByteArray peer_id, bool incoming);
signals:
	void start_call_pressed();
	void accept_call_pressed();
	void hang_call_pressed();
	void callwindow_closed(CallWindow *sender_window);
#ifdef HAVE_VAAPI
	// Drawing frames straight out of GPU memory did not work on this system.
	// The call controller answers by having them decoded into system memory
	// instead, which the label below can show.
	void video_rendering_failed();
#endif
private:
	QByteArray m_peer_id;
	bool is_incoming;
	QPushButton *pbAccept;
	QPushButton *pbCall;
	QPushButton *pbHang;
	QLabel *lbTimer;
	// How the call's media is being carried, and under which ciphersuite.
	// Hidden until that is known.
	QLabel *lbTransport;
	// Displays the remote side's video. Stays hidden until the first frame
	// arrives, so an audio-only call keeps the compact window it had before.
	QLabel *lbVideo;
#ifdef HAVE_VAAPI
	// Used instead of lbVideo when frames arrive still living in GPU memory;
	// only one of the two is ever visible. Which of the two renderers this is
	// depends on the session - see VaapiRenderWidget::create().
	VaapiRenderWidget *videoGpu;
#endif
	QTimer *callTimer;
	int callElapsedSeconds;

	void closeEvent(QCloseEvent *e);

public slots:
	void call_started();
	void call_ended();
	// direct_udp tells whether the media is being carried over a direct
	// mediac2c connection or over the c2c connection the call was set up on.
	void setMediaTransport(bool direct_udp, QString ciphersuitename);
	void showRemoteFrame(QImage frame);
#ifdef HAVE_VAAPI
	void showRemoteHwFrame(AVFramePtr frame);
#endif
private slots:
	void call();
	void accept();
	void hang();
	void update_call_timer();
#ifdef HAVE_VAAPI
	void gpu_rendering_failed(QString message);
#endif
};

#endif