summaryrefslogtreecommitdiff
path: root/src/lib/subtitle_content.h
blob: 0adb12c0d3c6c1321f230f768fbec56943a292ce (plain)
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
    Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>

    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; either version 2 of the License, or
    (at your option) any later version.

    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, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#ifndef DCPOMATIC_SUBTITLE_CONTENT_H
#define DCPOMATIC_SUBTITLE_CONTENT_H

#include "content_part.h"
#include <libcxml/cxml.h>
#include <dcp/types.h>
#include <boost/signals2.hpp>

class Font;

class SubtitleContentProperty
{
public:
	static int const SUBTITLE_X_OFFSET;
	static int const SUBTITLE_Y_OFFSET;
	static int const SUBTITLE_X_SCALE;
	static int const SUBTITLE_Y_SCALE;
	static int const USE_SUBTITLES;
	static int const BURN_SUBTITLES;
	static int const SUBTITLE_LANGUAGE;
	static int const FONTS;
	static int const SUBTITLE_VIDEO_FRAME_RATE;
	static int const SUBTITLE_COLOUR;
	static int const SUBTITLE_OUTLINE;
	static int const SUBTITLE_OUTLINE_COLOUR;
};

class SubtitleContent : public ContentPart
{
public:
	SubtitleContent (Content* parent, boost::shared_ptr<const Film>);
	SubtitleContent (Content* parent, boost::shared_ptr<const Film>, cxml::ConstNodePtr, int version);
	SubtitleContent (Content* parent, boost::shared_ptr<const Film>, std::vector<boost::shared_ptr<Content> >);

	void as_xml (xmlpp::Node *) const;
	std::string identifier () const;

	bool has_image_subtitles () const {
		/* XXX */
		return true;
	}

	void add_font (boost::shared_ptr<Font> font);

	void set_use_subtitles (bool);
	void set_burn_subtitles (bool);
	void set_subtitle_x_offset (double);
	void set_subtitle_y_offset (double);
	void set_subtitle_x_scale (double);
	void set_subtitle_y_scale (double);
	void set_subtitle_language (std::string language);

	bool use_subtitles () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _use_subtitles;
	}

	bool burn_subtitles () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _burn_subtitles;
	}

	double subtitle_x_offset () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _subtitle_x_offset;
	}

	double subtitle_y_offset () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _subtitle_y_offset;
	}

	double subtitle_x_scale () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _subtitle_x_scale;
	}

	double subtitle_y_scale () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _subtitle_y_scale;
	}

	std::list<boost::shared_ptr<Font> > fonts () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _fonts;
	}

	std::string subtitle_language () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _subtitle_language;
	}

	void set_colour (dcp::Colour);

	dcp::Colour colour () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _colour;
	}

	void set_outline (bool);

	bool outline () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _outline;
	}

	void set_outline_colour (dcp::Colour);

	dcp::Colour outline_colour () const {
		boost::mutex::scoped_lock lm (_mutex);
		return _outline_colour;
	}

	double subtitle_video_frame_rate () const;
	void set_subtitle_video_frame_rate (double r);

protected:
	/** subtitle language (e.g. "German") or empty if it is not known */
	std::string _subtitle_language;

private:
	friend struct ffmpeg_pts_offset_test;
	void font_changed ();
	void connect_to_fonts ();

	bool _use_subtitles;
	bool _burn_subtitles;
	/** x offset for placing subtitles, as a proportion of the container width;
	 * +ve is further right, -ve is further left.
	 */
	double _subtitle_x_offset;
	/** y offset for placing subtitles, as a proportion of the container height;
	 *  +ve is further down the frame, -ve is further up.
	 */
	double _subtitle_y_offset;
	/** x scale factor to apply to subtitles */
	double _subtitle_x_scale;
	/** y scale factor to apply to subtitles */
	double _subtitle_y_scale;
	std::list<boost::shared_ptr<Font> > _fonts;
	dcp::Colour _colour;
	bool _outline;
	dcp::Colour _outline_colour;
	std::list<boost::signals2::connection> _font_connections;
	/** Video frame rate that this content has been prepared for, if known */
	boost::optional<double> _frame_rate;
};

#endif