[vlc-devel] [PATCH 04/14] Added secondary subtitle configuration
Roland Bewick
roland.bewick at gmail.com
Sat May 11 08:32:08 CEST 2019
- Alignment (default unset)
- Margin (Positive value to avoid overlap with primary subs)
---
modules/gui/qt/components/simple_preferences.cpp | 3 +
modules/gui/qt/ui/sprefs_subtitles.ui | 91 ++++++++++++++++++++++++
src/video_output/vout_subpictures.c | 41 ++++++++---
3 files changed, 127 insertions(+), 8 deletions(-)
diff --git a/modules/gui/qt/components/simple_preferences.cpp b/modules/gui/qt/components/simple_preferences.cpp
index 914b92f07d..7d41ae3f1c 100644
--- a/modules/gui/qt/components/simple_preferences.cpp
+++ b/modules/gui/qt/components/simple_preferences.cpp
@@ -870,6 +870,9 @@ SPrefsPanel::SPrefsPanel( intf_thread_t *_p_intf, QWidget *_parent,
optionWidgets["shadowCB"] = ui.shadowCheck;
optionWidgets["backgroundCB"] = ui.backgroundCheck;
+ CONFIG_GENERIC( "secondary-spu-alignment", IntegerList,
+ ui.secondarySubsAlignmentLabel, secondarySubsAlignment );
+ CONFIG_GENERIC_NO_BOOL( "secondary-sub-margin", Integer, ui.secondarySubsPosLabel, secondarySubsPosition );
END_SPREFS_CAT;
case SPrefsHotkeys:
diff --git a/modules/gui/qt/ui/sprefs_subtitles.ui b/modules/gui/qt/ui/sprefs_subtitles.ui
index b9e851dc9d..d630a60660 100644
--- a/modules/gui/qt/ui/sprefs_subtitles.ui
+++ b/modules/gui/qt/ui/sprefs_subtitles.ui
@@ -313,6 +313,97 @@
</layout>
</widget>
</item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Dual Subtitles</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QWidget" name="secondarySpuZone" native="true">
+ <layout class="QGridLayout">
+ <item row="0" column="1">
+ <widget class="QComboBox" name="secondarySubsAlignment"/>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="secondarySubsAlignmentLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Align</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy">
+ <cstring>secondarySubsAlignment</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>50</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="secondarySubsPosLabel">
+ <property name="text">
+ <string>Offset</string>
+ </property>
+ <property name="buddy">
+ <cstring>secondarySubsPosition</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <widget class="QSpinBox" name="secondarySubsPosition">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="suffix">
+ <string> px</string>
+ </property>
+ <property name="minimum">
+ <number>-1024</number>
+ </property>
+ <property name="maximum">
+ <number>1024</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
</layout>
</widget>
</item>
diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c
index 6b106534d3..9fdbf0dc94 100644
--- a/src/video_output/vout_subpictures.c
+++ b/src/video_output/vout_subpictures.c
@@ -52,6 +52,9 @@
/* Number of simultaneous subpictures */
#define VOUT_MAX_SUBPICTURES (__MAX(VOUT_MAX_PICTURES, SPU_MAX_PREPARE_TIME/5000))
+/* ID of the primary SPU. Secondary SPU IDs will be higher. */
+#define SPU_ID_PRIMARY 1
+
/* Hold of subpicture with converted ts */
typedef struct {
subpicture_t *subpicture;
@@ -91,6 +94,9 @@ struct spu_private_t {
atomic_int margin; /**< force position of a subpicture */
video_palette_t palette; /**< force palette of subpicture */
+ int secondary_sub_alignment; /**< force alignment for secondary subs */
+ int secondary_sub_margin; /**< move the secondary sub vertically */
+
/* Subpiture filters */
char *source_chain_current;
char *source_chain_update;
@@ -468,23 +474,28 @@ static void SpuAreaFitInside(spu_area_t *area, const spu_area_t *boundary)
*/
static void SpuRegionPlace(int *x, int *y,
const subpicture_t *subpic,
- const subpicture_region_t *region)
+ const subpicture_region_t *region,
+ int i_secondary_spu_align_override)
{
+ int i_align = region->i_align;
+ if (subpic->i_spu_id > SPU_ID_PRIMARY && i_secondary_spu_align_override >= 0)
+ i_align = i_secondary_spu_align_override;
+
assert(region->i_x != INT_MAX && region->i_y != INT_MAX);
if (subpic->b_absolute) {
*x = region->i_x;
*y = region->i_y;
} else {
- if (region->i_align & SUBPICTURE_ALIGN_TOP)
- *y = region->i_y;
- else if (region->i_align & SUBPICTURE_ALIGN_BOTTOM)
+ if (i_align & SUBPICTURE_ALIGN_TOP)
+ *y = region->i_y + ( subpic->b_subtitle ? region->fmt.i_visible_height : 0 );
+ else if (i_align & SUBPICTURE_ALIGN_BOTTOM)
*y = subpic->i_original_picture_height - region->fmt.i_visible_height - region->i_y;
else
*y = subpic->i_original_picture_height / 2 - region->fmt.i_visible_height / 2;
- if (region->i_align & SUBPICTURE_ALIGN_LEFT)
+ if (i_align & SUBPICTURE_ALIGN_LEFT)
*x = region->i_x;
- else if (region->i_align & SUBPICTURE_ALIGN_RIGHT)
+ else if (i_align & SUBPICTURE_ALIGN_RIGHT)
*x = subpic->i_original_picture_width - region->fmt.i_visible_width - region->i_x;
else
*x = subpic->i_original_picture_width / 2 - region->fmt.i_visible_width / 2;
@@ -777,7 +788,9 @@ static void SpuRenderRegion(spu_t *spu,
/* Compute the margin which is expressed in destination pixel unit
* The margin is applied only to subtitle and when no forced crop is
- * requested (dvd menu) */
+ * requested (dvd menu).
+ * Note: Margin will also be applied to secondary subtitles if they exist
+ * to ensure that overlap does not occur. */
int y_margin = 0;
if (!crop_requested && subpic->b_subtitle)
y_margin = spu_invscale_h(atomic_load(&sys->margin), scale_size);
@@ -785,7 +798,14 @@ static void SpuRenderRegion(spu_t *spu,
/* Place the picture
* We compute the position in the rendered size */
SpuRegionPlace(&x_offset, &y_offset,
- subpic, region);
+ subpic, region, sys->secondary_sub_alignment);
+
+ if (subpic->i_spu_id > SPU_ID_PRIMARY && !subpic->b_absolute)
+ {
+ /* Move the secondary subtitles by the secondary margin before overlap detection.
+ This way, overlaps will be resolved if they still exist. */
+ y_offset -= spu_invscale_h(atomic_load(&sys->secondary_sub_margin), scale_size);
+ }
/* Save this position for subtitle overlap support
* it is really important that there are given without scale_size applied */
@@ -1386,6 +1406,11 @@ spu_t *spu_Create(vlc_object_t *object, vout_thread_t *vout)
sys->scale_yuvp = NULL;
atomic_init(&sys->margin, var_InheritInteger(spu, "sub-margin"));
+ atomic_init(&sys->secondary_sub_margin,
+ var_InheritInteger(spu, "secondary-sub-margin"));
+
+ sys->secondary_sub_alignment = var_InheritInteger(spu,
+ "secondary-spu-alignment");
/* Register the default subpicture channel */
sys->channel = VOUT_SPU_CHANNEL_AVAIL_FIRST;
--
2.11.0
More information about the vlc-devel
mailing list