From 24ac76118ff00ec1c69ee20827040b65b7795ee8 Mon Sep 17 00:00:00 2001 From: Sami32 Date: Sat, 16 Sep 2017 14:45:50 +0200 Subject: [PATCH 1/6] Fix RLE and update the subtitles types Better description proposal. Feel free to adapt or complement. http://www.perlfu.co.uk/projects/asa/ass-specs.doc https://en.wikipedia.org/wiki/MPEG-4_Part_17 ("TTXT" for "3GPP Timed Text") .pgs https://trac.ffmpeg.org/ticket/3819 --- src/main/java/net/pms/dlna/DLNAMediaInfo.java | 10 +++ src/main/java/net/pms/dlna/DLNAResource.java | 10 +-- .../java/net/pms/dlna/LibMediaInfoParser.java | 39 +++++++---- .../java/net/pms/formats/v2/SubtitleType.java | 34 ++++++---- .../net/pms/dlna/DLNAMediaSubtitleTest.java | 5 ++ .../net/pms/formats/v2/SubtitleTypeTest.java | 66 ++++++++++++++----- 6 files changed, 116 insertions(+), 48 deletions(-) diff --git a/src/main/java/net/pms/dlna/DLNAMediaInfo.java b/src/main/java/net/pms/dlna/DLNAMediaInfo.java index aa6ac21472e..8fad0a03a59 100644 --- a/src/main/java/net/pms/dlna/DLNAMediaInfo.java +++ b/src/main/java/net/pms/dlna/DLNAMediaInfo.java @@ -1360,6 +1360,16 @@ public void parseFFmpegInfo(List lines, String input) { lang.setType(SubtitleType.TX3G); } else if (line.contains("webvtt")) { lang.setType(SubtitleType.WEBVTT); + } else if (line.contains("dvb_subtitle")) { + lang.setType(SubtitleType.DVBSUB); + } else if (line.contains("hdmv_pgs_subtitle")) { + lang.setType(SubtitleType.PGS); + } else if (line.contains("eia_608")) { + lang.setType(SubtitleType.EIA608); + } else if (line.contains("eia_708")) { + lang.setType(SubtitleType.EIA708); + } else if (line.contains("dvb_teletext")) { + lang.setType(SubtitleType.TELETEXT); } else { lang.setType(SubtitleType.UNKNOWN); } diff --git a/src/main/java/net/pms/dlna/DLNAResource.java b/src/main/java/net/pms/dlna/DLNAResource.java index f2d03cb1dbb..1334551c362 100644 --- a/src/main/java/net/pms/dlna/DLNAResource.java +++ b/src/main/java/net/pms/dlna/DLNAResource.java @@ -1659,8 +1659,9 @@ private String getDisplayName(RendererConfiguration mediaRenderer, boolean withS String audioTrackTitle = ""; if ( - getMediaAudio().getAudioTrackTitleFromMetadata() != null && - !"".equals(getMediaAudio().getAudioTrackTitleFromMetadata()) && + StringUtils.isNotBlank(getMediaAudio().getAudioTrackTitleFromMetadata()) && + getFormat() != null && + !getFormat().isVideo() && mediaRenderer != null && mediaRenderer.isShowAudioMetadata() ) { @@ -1677,11 +1678,6 @@ private String getDisplayName(RendererConfiguration mediaRenderer, boolean withS !configurationSpecificToRenderer.hideSubsInfo() ) { subtitleFormat = media_subtitle.getType().getDescription(); - if ("(Advanced) SubStation Alpha".equals(subtitleFormat)) { - subtitleFormat = "SSA"; - } else if ("Blu-ray subtitles".equals(subtitleFormat)) { - subtitleFormat = "PGS"; - } subtitleLanguage = "/" + media_subtitle.getLangFullName(); if ("/Undetermined".equals(subtitleLanguage)) { diff --git a/src/main/java/net/pms/dlna/LibMediaInfoParser.java b/src/main/java/net/pms/dlna/LibMediaInfoParser.java index aa15ee7c174..efd4e7439e4 100644 --- a/src/main/java/net/pms/dlna/LibMediaInfoParser.java +++ b/src/main/java/net/pms/dlna/LibMediaInfoParser.java @@ -78,6 +78,7 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, StreamType audio = StreamType.Audio; StreamType image = StreamType.Image; StreamType text = StreamType.Text; + StreamType other = StreamType.Other; DLNAMediaAudio currentAudioTrack = new DLNAMediaAudio(); DLNAMediaSubtitle currentSubTrack; media.setSize(file.length()); @@ -200,7 +201,7 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, if (isNotBlank(value) && value.startsWith("Windows Media Audio 10")) { currentAudioTrack.setCodecA(FormatConfiguration.WMA10); } - currentAudioTrack.setLang(getLang(MI.Get(audio, i, "Language/String"))); + currentAudioTrack.setLang(getLang(MI.Get(audio, i, "Language"))); currentAudioTrack.setAudioTrackTitleFromMetadata((MI.Get(audio, i, "Title")).trim()); currentAudioTrack.getAudioProperties().setNumberOfChannels(MI.Get(audio, i, "Channel(s)")); currentAudioTrack.setSampleFrequency(getSampleFrequency(MI.Get(audio, i, "SamplingRate"))); @@ -298,20 +299,34 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, if (subTracks > 0) { for (int i = 0; i < subTracks; i++) { currentSubTrack = new DLNAMediaSubtitle(); - currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(MI.Get(text, i, "Format"))); - currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(MI.Get(text, i, "CodecID"))); - currentSubTrack.setLang(getLang(MI.Get(text, i, "Language/String"))); + if (isNotBlank(MI.Get(text, i, "CodecID"))) { + currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(MI.Get(text, i, "CodecID"))); + } else { + currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(MI.Get(text, i, "Format"))); + } + currentSubTrack.setLang(getLang(MI.Get(text, i, "Language"))); currentSubTrack.setSubtitlesTrackTitleFromMetadata((MI.Get(text, i, "Title")).trim()); // Special check for OGM: MediaInfo reports specific Audio/Subs IDs (0xn) while mencoder does not - value = MI.Get(text, i, "ID/String"); - if (!value.isEmpty()) { - if (value.contains("(0x") && !FormatConfiguration.OGG.equals(media.getContainer())) { + value = MI.Get(text, i, "ID"); + if (isNotBlank(value)) { + if (value.contains("-") && !(value.contains("-CC") || value.contains("-T") || value.contains("-XDS")) { currentSubTrack.setId(getSpecificID(value)); } else { currentSubTrack.setId(media.getSubtitleTracksList().size()); } } + addSub(currentSubTrack, media); + } + } + // Teletext + int teletextTracks = MI.Count_Get(other); + if (teletextTracks > 0) { + for (int i = 0; i < teletextTracks; i++) { + currentSubTrack = new DLNAMediaSubtitle(); + if (isNotBlank(MI.Get(other, i, "Format"))) { + currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(MI.Get(other, i, "Format"))); + } addSub(currentSubTrack, media); } } @@ -803,11 +818,11 @@ public static int getBitrate(String value) { public static int getSpecificID(String value) { // If ID is given as 'streamID-substreamID' use the second (which is hopefully unique). - // For example in vob audio ID can be '189 (0xBD)-32 (0x80)' and text ID '189 (0xBD)-128 (0x20)' - int end = value.lastIndexOf("(0x"); - if (end > -1) { - int start = value.lastIndexOf('-') + 1; - value = value.substring(start > end ? 0 : start, end); + // For example in VOB files, audio ID can be '189-128' and text ID '189-32' + if (value.contains("-")) { + value = value.substring(value.lastIndexOf('-') + 1).trim(); + } else { + value = value.trim(); } value = value.trim(); diff --git a/src/main/java/net/pms/formats/v2/SubtitleType.java b/src/main/java/net/pms/formats/v2/SubtitleType.java index ab641cf14b6..208cb1ec78f 100644 --- a/src/main/java/net/pms/formats/v2/SubtitleType.java +++ b/src/main/java/net/pms/formats/v2/SubtitleType.java @@ -33,20 +33,26 @@ public enum SubtitleType { // http://mediainfo.svn.sourceforge.net/viewvc/mediainfo/MediaInfoLib/trunk/Source/Resource/Text/DataBase/ // SubtitleType(int index, String description, List fileExtensions, List libMediaInfoCodecs, int category) - UNKNOWN (0, "Generic", list(), list(), type.UNDEF), - SUBRIP (1, "SubRip", list("srt"), list("S_TEXT/UTF8", "S_UTF8", "Subrip"), type.TEXT), - TEXT (2, "Text file", list("txt"), list(), type.TEXT), - MICRODVD (3, "MicroDVD", list("sub"), list(), type.TEXT), - SAMI (4, "SAMI", list("smi"), list(), type.TEXT), - ASS (5, "(Advanced) SubStation Alpha", list("ass", "ssa"), list("S_TEXT/SSA", "S_TEXT/ASS", "S_SSA", "S_ASS", "SSA", "ASS"), type.TEXT), - VOBSUB (6, "VobSub", list("idx"), list("S_VOBSUB", "subp", "mp4s", "E0", "RLE"), type.PICTURE), // TODO: "RLE" may also apply to other formats - UNSUPPORTED (7, "Unsupported", list(), list(), type.UNDEF), - USF (8, "Universal Subtitle Format", list(), list("S_TEXT/USF", "S_USF"), type.TEXT), - BMP (9, "BMP", list(), list("S_IMAGE/BMP"), type.PICTURE), - DIVX (10, "DIVX subtitles", list(), list("DXSB"), type.PICTURE), - TX3G (11, "Timed text (TX3G)", list(), list("tx3g"), type.TEXT), - PGS (12, "Blu-ray subtitles", list(), list("S_HDMV/PGS", "PGS", "144"), type.PICTURE), - WEBVTT (13, "WebVTT", list("vtt"), list("WebVTT"), type.TEXT); + UNKNOWN (0, "Unknown", list(), list("Unknown"), type.UNDEF), + SUBRIP (1, "SubRip", list("srt"), list("S_TEXT/UTF8", "S_UTF8", "UTF-8", "Subrip"), type.TEXT), + TEXT (2, "Text", list("txt"), list(), type.TEXT), + MICRODVD (3, "MicroDVD", list("sub"), list(), type.TEXT), + SAMI (4, "SAMI", list("smi"), list(), type.TEXT), + ASS (5, "ASS/SSA", list("ass", "ssa"), list("S_TEXT/SSA", "S_TEXT/ASS", "S_SSA", "S_ASS", "SSA", "ASS"), type.TEXT), + VOBSUB (6, "VobSub", list("idx"), list("S_VOBSUB", "subp", "mp4s", "E0", "RLE"), type.PICTURE), // TODO: "RLE" may also apply to other formats + UNSUPPORTED (7, "Unsupported", list(), list(), type.UNDEF), + USF (8, "USF", list(), list("S_TEXT/USF", "S_USF", "USF"), type.TEXT), + BMP (9, "Bitmap", list(), list("S_IMAGE/BMP"), type.PICTURE), + DIVX (10, "XSUB", list(), list("DXSB"), type.PICTURE), + TX3G (11, "TX3G", list(), list("Timed Text", "tx3g"), type.TEXT), + PGS (12, "PGS", list("pgs", "sup"), list("S_HDMV/PGS", "PGS", "144"), type.PICTURE), + WEBVTT (13, "WebVTT", list("vtt"), list("WebVTT", "S_TEXT/WEBVTT"), type.TEXT), + TEXTST (14, "HDMV Text", list(), list("S_HDMV/TEXTST"), type.TEXT), + DVBSUB (15, "DVB Subtitle", list(), list("S_DVBSUB", "DVB Subtitle", "6"), type.PICTURE), + EIA608 (16, "EIA-608", list(), list("EIA-608", "c608"), type.TEXT), + EIA708 (17, "EIA-708", list(), list("EIA-708", "c708"), type.TEXT), + KATE (18, "Kate", list(), list("Kate"), type.TEXT), + TELETEXT (19, "Teletext", list(), list("Teletext"), type.TEXT); public enum type {TEXT, PICTURE, UNDEF} private final int index; diff --git a/src/test/java/net/pms/dlna/DLNAMediaSubtitleTest.java b/src/test/java/net/pms/dlna/DLNAMediaSubtitleTest.java index 37154ee1946..a55f3aa9ebf 100644 --- a/src/test/java/net/pms/dlna/DLNAMediaSubtitleTest.java +++ b/src/test/java/net/pms/dlna/DLNAMediaSubtitleTest.java @@ -208,6 +208,11 @@ public void testSetExternalFile_bitmapSubs() throws Exception { sub4.setType(PGS); sub4.setExternalFile(file_cp1251, null); assertThat(sub4.getSubCharacterSet()).isNull(); + + DLNAMediaSubtitle sub5 = new DLNAMediaSubtitle(); + sub5.setType(DVBSUB); + sub5.setExternalFile(file_cp1251, null); + assertThat(sub5.getSubCharacterSet()).isNull(); } @Test diff --git a/src/test/java/net/pms/formats/v2/SubtitleTypeTest.java b/src/test/java/net/pms/formats/v2/SubtitleTypeTest.java index 1f54014ae9e..71393e7e7b2 100644 --- a/src/test/java/net/pms/formats/v2/SubtitleTypeTest.java +++ b/src/test/java/net/pms/formats/v2/SubtitleTypeTest.java @@ -36,15 +36,16 @@ public void testValueOfFileExtension_matchingExtensions() throws Exception { assertThat(valueOfFileExtension("ass")).isEqualTo(ASS); assertThat(valueOfFileExtension("idx")).isEqualTo(VOBSUB); assertThat(valueOfFileExtension("vtt")).isEqualTo(WEBVTT); + assertThat(valueOfFileExtension("sup")).isEqualTo(PGS); + assertThat(valueOfFileExtension("pgs")).isEqualTo(PGS); } @Test public void testValueOfLibMediaInfoCodec_matchingCodecs() throws Exception { - assertThat(valueOfLibMediaInfoCodec("s_utf8")).isEqualTo(SUBRIP); + assertThat(valueOfLibMediaInfoCodec("S_UTF8")).isEqualTo(SUBRIP); assertThat(valueOfLibMediaInfoCodec("S_TEXT/UTF8")).isEqualTo(SUBRIP); + assertThat(valueOfLibMediaInfoCodec("UTF-8")).isEqualTo(SUBRIP); assertThat(valueOfLibMediaInfoCodec("Subrip")).isEqualTo(SUBRIP); - assertThat(valueOfLibMediaInfoCodec("s_ssa")).isEqualTo(ASS); - assertThat(valueOfLibMediaInfoCodec("s_ass")).isEqualTo(ASS); assertThat(valueOfLibMediaInfoCodec("S_TEXT/SSA")).isEqualTo(ASS); assertThat(valueOfLibMediaInfoCodec("S_TEXT/ASS")).isEqualTo(ASS); assertThat(valueOfLibMediaInfoCodec("SSA")).isEqualTo(ASS); @@ -53,32 +54,54 @@ public void testValueOfLibMediaInfoCodec_matchingCodecs() throws Exception { assertThat(valueOfLibMediaInfoCodec("S_VOBSUB")).isEqualTo(VOBSUB); assertThat(valueOfLibMediaInfoCodec("mp4s")).isEqualTo(VOBSUB); assertThat(valueOfLibMediaInfoCodec("E0")).isEqualTo(VOBSUB); - assertThat(valueOfLibMediaInfoCodec("s_usf")).isEqualTo(USF); + assertThat(valueOfLibMediaInfoCodec("RLE")).isEqualTo(VOBSUB); + assertThat(valueOfLibMediaInfoCodec("USF")).isEqualTo(USF); + assertThat(valueOfLibMediaInfoCodec("S_USF")).isEqualTo(USF); assertThat(valueOfLibMediaInfoCodec("S_TEXT/USF")).isEqualTo(USF); assertThat(valueOfLibMediaInfoCodec("S_IMAGE/BMP")).isEqualTo(BMP); assertThat(valueOfLibMediaInfoCodec("DXSB")).isEqualTo(DIVX); assertThat(valueOfLibMediaInfoCodec("tx3g")).isEqualTo(TX3G); - assertThat(valueOfLibMediaInfoCodec("pgs")).isEqualTo(PGS); + assertThat(valueOfLibMediaInfoCodec("Timed Text")).isEqualTo(TX3G); + assertThat(valueOfLibMediaInfoCodec("PGS")).isEqualTo(PGS); assertThat(valueOfLibMediaInfoCodec("S_HDMV/PGS")).isEqualTo(PGS); assertThat(valueOfLibMediaInfoCodec("144")).isEqualTo(PGS); assertThat(valueOfLibMediaInfoCodec("WebVTT")).isEqualTo(WEBVTT); + assertThat(valueOfLibMediaInfoCodec("S_TEXT/WEBVTT")).isEqualTo(WEBVTT); + assertThat(valueOfLibMediaInfoCodec("S_HDMV/TEXTST")).isEqualTo(TEXTST); + assertThat(valueOfLibMediaInfoCodec("S_DVBSUB")).isEqualTo(DVBSUB); + assertThat(valueOfLibMediaInfoCodec("DVB Subtitle")).isEqualTo(DVBSUB); + assertThat(valueOfLibMediaInfoCodec("6")).isEqualTo(DVBSUB); + assertThat(valueOfLibMediaInfoCodec("EIA-608")).isEqualTo(EIA608); + assertThat(valueOfLibMediaInfoCodec("c608")).isEqualTo(EIA608); + assertThat(valueOfLibMediaInfoCodec("EIA-708")).isEqualTo(EIA708); + assertThat(valueOfLibMediaInfoCodec("c708")).isEqualTo(EIA708); + assertThat(valueOfLibMediaInfoCodec("Kate")).isEqualTo(KATE); + assertThat(valueOfLibMediaInfoCodec("Teletext")).isEqualTo(TELETEXT); + assertThat(valueOfLibMediaInfoCodec("Teletext Subtitle")).isEqualTo(TELETEXT); } @Test public void testGetDescription() throws Exception { - assertThat(UNKNOWN.getDescription()).isEqualTo("Generic"); + assertThat(UNKNOWN.getDescription()).isEqualTo("Unknown"); assertThat(UNSUPPORTED.getDescription()).isEqualTo("Unsupported"); assertThat(SUBRIP.getDescription()).isEqualTo("SubRip"); - assertThat(TEXT.getDescription()).isEqualTo("Text file"); + assertThat(TEXT.getDescription()).isEqualTo("Text"); assertThat(MICRODVD.getDescription()).isEqualTo("MicroDVD"); assertThat(SAMI.getDescription()).isEqualTo("SAMI"); - assertThat(ASS.getDescription()).isEqualTo("(Advanced) SubStation Alpha"); + assertThat(ASS.getDescription()).isEqualTo("ASS/SSA"); assertThat(VOBSUB.getDescription()).isEqualTo("VobSub"); - assertThat(USF.getDescription()).isEqualTo("Universal Subtitle Format"); - assertThat(BMP.getDescription()).isEqualTo("BMP"); - assertThat(DIVX.getDescription()).isEqualTo("DIVX subtitles"); - assertThat(TX3G.getDescription()).isEqualTo("Timed text (TX3G)"); - assertThat(PGS.getDescription()).isEqualTo("Blu-ray subtitles"); + assertThat(USF.getDescription()).isEqualTo("USF"); + assertThat(BMP.getDescription()).isEqualTo("Bitmap"); + assertThat(DIVX.getDescription()).isEqualTo("XSUB"); + assertThat(TX3G.getDescription()).isEqualTo("TX3G"); + assertThat(PGS.getDescription()).isEqualTo("PGS"); + assertThat(WEBVTT.getDescription()).isEqualTo("WebVTT"); + assertThat(TEXTST.getDescription()).isEqualTo("HDMV Text"); + assertThat(DVBSUB.getDescription()).isEqualTo("DVB Subtitle"); + assertThat(EIA608.getDescription()).isEqualTo("EIA-608"); + assertThat(EIA708.getDescription()).isEqualTo("EIA-708"); + assertThat(KATE.getDescription()).isEqualTo("Kate"); + assertThat(TELETEXT.getDescription()).isEqualTo("Teletext"); } @Test @@ -92,6 +115,7 @@ public void testGetExtension() throws Exception { assertThat(VOBSUB.getExtension()).isEqualTo("idx"); assertThat(UNSUPPORTED.getExtension()).isEqualTo(""); assertThat(WEBVTT.getExtension()).isEqualTo("vtt"); + assertThat(PGS.getExtension()).isEqualTo("sup"); } @Test @@ -143,7 +167,7 @@ public void testValueOfLibMediaInfoCodec_SubstringShouldNotMatch() throws Except @Test public void getSupportedFileExtensions() { - Set expectedExtensionsSet = new HashSet<>(Arrays.asList("srt", "txt", "sub", "smi", "ssa", "ass", "idx", "vtt")); + Set expectedExtensionsSet = new HashSet<>(Arrays.asList("srt", "txt", "sub", "smi", "ssa", "ass", "idx", "vtt", "sup", "pgs")); assertThat(SubtitleType.getSupportedFileExtensions()).isEqualTo(expectedExtensionsSet); } @@ -163,6 +187,12 @@ public void testGetStableIndex() { assertThat(TX3G.getStableIndex()).isEqualTo(11); assertThat(PGS.getStableIndex()).isEqualTo(12); assertThat(WEBVTT.getStableIndex()).isEqualTo(13); + assertThat(TEXTST.getStableIndex()).isEqualTo(14); + assertThat(DVBSUB.getStableIndex()).isEqualTo(15); + assertThat(EIA608.getStableIndex()).isEqualTo(16); + assertThat(EIA708.getStableIndex()).isEqualTo(17); + assertThat(KATE.getStableIndex()).isEqualTo(18); + assertThat(TELETEXT.getStableIndex()).isEqualTo(19); } @Test @@ -190,6 +220,12 @@ public void testValueOfStableIndex() { assertThat(valueOfStableIndex(11)).isEqualTo(TX3G); assertThat(valueOfStableIndex(12)).isEqualTo(PGS); assertThat(valueOfStableIndex(13)).isEqualTo(WEBVTT); + assertThat(valueOfStableIndex(14)).isEqualTo(TEXTST); + assertThat(valueOfStableIndex(15)).isEqualTo(DVBSUB); + assertThat(valueOfStableIndex(16)).isEqualTo(EIA608); + assertThat(valueOfStableIndex(17)).isEqualTo(EIA708); + assertThat(valueOfStableIndex(18)).isEqualTo(KATE); + assertThat(valueOfStableIndex(19)).isEqualTo(TELETEXT); } @Test @@ -197,4 +233,4 @@ public void testValueOfStableIndex_unknownIndex() { assertThat(valueOfStableIndex(-1)).isEqualTo(UNKNOWN); assertThat(valueOfStableIndex(456)).isEqualTo(UNKNOWN); } -} \ No newline at end of file +} From 3e1822d8534042aed44290286a15dcfb0dc27d1a Mon Sep 17 00:00:00 2001 From: Samuel Date: Fri, 22 Sep 2017 17:02:56 +0200 Subject: [PATCH 2/6] Fix the stream ID parsing (see EIA caption issue) https://en.wikipedia.org/wiki/EIA-608 --- .../java/net/pms/dlna/LibMediaInfoParser.java | 42 ++++++++++--------- .../net/pms/dlna/LibMediaInfoParserTest.java | 5 +-- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/pms/dlna/LibMediaInfoParser.java b/src/main/java/net/pms/dlna/LibMediaInfoParser.java index efd4e7439e4..67923e094e8 100644 --- a/src/main/java/net/pms/dlna/LibMediaInfoParser.java +++ b/src/main/java/net/pms/dlna/LibMediaInfoParser.java @@ -91,7 +91,7 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, media.setBitrate(getBitrate(MI.Get(general, 0, "OverallBitRate"))); media.setStereoscopy(MI.Get(general, 0, "StereoscopicLayout")); value = MI.Get(general, 0, "Cover_Data"); - if (!value.isEmpty()) { + if (isNotBlank(value)) { try { media.setThumb(DLNAThumbnail.toThumbnail( new Base64().decode(value.getBytes(StandardCharsets.US_ASCII)), @@ -152,17 +152,17 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, media.setReferenceFrameCount(getReferenceFrameCount(MI.Get(video, i, "Format_Settings_RefFrames/String"))); media.setVideoTrackTitleFromMetadata(MI.Get(video, i, "Title")); value = MI.Get(video, i, "Format_Settings_QPel"); - if (!value.isEmpty()) { + if (isNotBlank(value)) { media.putExtra(FormatConfiguration.MI_QPEL, value); } value = MI.Get(video, i, "Format_Settings_GMC"); - if (!value.isEmpty()) { + if (isNotBlank(value)) { media.putExtra(FormatConfiguration.MI_GMC, value); } value = MI.Get(video, i, "Format_Settings_GOP"); - if (!value.isEmpty()) { + if (isNotBlank(value)) { media.putExtra(FormatConfiguration.MI_GOP, value); } @@ -172,7 +172,7 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, } value = MI.Get(video, i, "BitDepth"); - if (!value.isEmpty()) { + if (isNotBlank(value)) { try { media.setVideoBitDepth(Integer.parseInt(value)); } catch (NumberFormatException nfe) { @@ -182,7 +182,7 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, } value = MI.Get(video, i, "Format_Profile"); - if (!value.isEmpty() && media.getCodecV() != null && media.getCodecV().equals(FormatConfiguration.H264)) { + if (isNotBlank(value) && media.getCodecV() != null && media.getCodecV().equals(FormatConfiguration.H264)) { media.setAvcLevel(getAvcLevel(value)); } } @@ -232,9 +232,9 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, } // Special check for OGM: MediaInfo reports specific Audio/Subs IDs (0xn) while mencoder does not - value = MI.Get(audio, i, "ID/String"); - if (!value.isEmpty()) { - if (value.contains("(0x") && !FormatConfiguration.OGG.equals(media.getContainer())) { + value = MI.Get(audio, i, "ID"); + if (isNotBlank(value)) { + if (!FormatConfiguration.OGG.equals(media.getContainer())) { currentAudioTrack.setId(getSpecificID(value)); } else { currentAudioTrack.setId(media.getAudioTracksList().size()); @@ -242,7 +242,7 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, } value = MI.Get(general, i, "Track/Position"); - if (!value.isEmpty()) { + if (isNotBlank(value)) { try { currentAudioTrack.setTrack(Integer.parseInt(value)); } catch (NumberFormatException nfe) { @@ -251,7 +251,7 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, } value = MI.Get(audio, i, "BitDepth"); - if (!value.isEmpty()) { + if (isNotBlank(value)) { try { currentAudioTrack.setBitsperSample(Integer.parseInt(value)); } catch (NumberFormatException nfe) { @@ -308,12 +308,10 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, currentSubTrack.setSubtitlesTrackTitleFromMetadata((MI.Get(text, i, "Title")).trim()); // Special check for OGM: MediaInfo reports specific Audio/Subs IDs (0xn) while mencoder does not value = MI.Get(text, i, "ID"); - if (isNotBlank(value)) { - if (value.contains("-") && !(value.contains("-CC") || value.contains("-T") || value.contains("-XDS")) { - currentSubTrack.setId(getSpecificID(value)); - } else { - currentSubTrack.setId(media.getSubtitleTracksList().size()); - } + if (isNotBlank(value) && value.contains("-") && !(value.contains("-CC") || value.contains("-T") || value.contains("-XDS"))) { + currentSubTrack.setId(getSpecificID(value)); + } else { + currentSubTrack.setId(media.getSubtitleTracksList().size()); } addSub(currentSubTrack, media); } @@ -825,9 +823,13 @@ public static int getSpecificID(String value) { value = value.trim(); } - value = value.trim(); - int id = Integer.parseInt(value); - return id; + try { + return Integer.parseInt(value); + } catch (NumberFormatException e) { + LOGGER.debug("Could not parse the stream ID \"{}\": {}", value, e.getMessage()); + LOGGER.trace("", e); + return 0; + } } public static String getSampleFrequency(String value) { diff --git a/src/test/java/net/pms/dlna/LibMediaInfoParserTest.java b/src/test/java/net/pms/dlna/LibMediaInfoParserTest.java index 35f38593228..ab5af5b35ae 100644 --- a/src/test/java/net/pms/dlna/LibMediaInfoParserTest.java +++ b/src/test/java/net/pms/dlna/LibMediaInfoParserTest.java @@ -73,9 +73,8 @@ public void testGetBitrateInvalidInput() throws Exception { @Test public void testGetSpecificID() throws Exception { assertThat(LibMediaInfoParser.getSpecificID("256")).isEqualTo(256); - assertThat(LibMediaInfoParser.getSpecificID("189 (0xBD)-32 (0x80)")).isEqualTo(32); - assertThat(LibMediaInfoParser.getSpecificID("189 (0xBD)")).isEqualTo(189); - assertThat(LibMediaInfoParser.getSpecificID("189 (0xBD)-")).isEqualTo(189); + assertThat(LibMediaInfoParser.getSpecificID("189-32")).isEqualTo(32); + assertThat(LibMediaInfoParser.getSpecificID("49-3")).isEqualTo(3); } @Test From 07ff1b52846fed184b887df16028fb98646198d3 Mon Sep 17 00:00:00 2001 From: Samuel Date: Fri, 22 Sep 2017 21:46:11 +0200 Subject: [PATCH 3/6] Implementation of EIA-608 captions in FFmpeg engine --- .../renderers/DefaultRenderer.conf | 5 ++- .../renderers/VLC-for-desktop.conf | 2 +- .../java/net/pms/encoders/FFMpegVideo.java | 35 +++++++++++++++++-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main/external-resources/renderers/DefaultRenderer.conf b/src/main/external-resources/renderers/DefaultRenderer.conf index ae88d5b7db8..641a5cb620b 100644 --- a/src/main/external-resources/renderers/DefaultRenderer.conf +++ b/src/main/external-resources/renderers/DefaultRenderer.conf @@ -690,10 +690,11 @@ CharMap = # ------------------------------------ # ASS .ass or .ssa # MICRODVD .sub +# PGS .sup or .pgs # SAMI .smi # SUBRIP .srt # TEXT .txt -# WEBVTT .wtt +# WEBVTT .vtt # # Example: SupportedExternalSubtitlesFormats = SUBRIP,ASS,MICRODVD # Default: "" @@ -716,7 +717,9 @@ VideoFormatsSupportingStreamedExternalSubtitles = # ------------------------------------ # ASS .ass/.ssa # BMP +# EIA608 # DIVX (XSUB) +# DVBSUB # MICRODVD .sub # PGS .sup # SAMI .smi diff --git a/src/main/external-resources/renderers/VLC-for-desktop.conf b/src/main/external-resources/renderers/VLC-for-desktop.conf index 7f7466d9370..7a83b346399 100644 --- a/src/main/external-resources/renderers/VLC-for-desktop.conf +++ b/src/main/external-resources/renderers/VLC-for-desktop.conf @@ -42,4 +42,4 @@ Supported = f:dts m:audio/vnd.dts Supported = f:flac m:audio/flac Supported = f:oga m:audio/ogg -SupportedInternalSubtitlesFormats = ASS,SUBRIP +SupportedInternalSubtitlesFormats = ASS,DVBSUB,EIA608,EIA708,KATE,PGS,SUBRIP,TX3G,USF,VOBSUB diff --git a/src/main/java/net/pms/encoders/FFMpegVideo.java b/src/main/java/net/pms/encoders/FFMpegVideo.java index cc0fee9616c..80956fa35d0 100644 --- a/src/main/java/net/pms/encoders/FFMpegVideo.java +++ b/src/main/java/net/pms/encoders/FFMpegVideo.java @@ -177,11 +177,18 @@ public List getVideoFilterOptions(DLNAResource dlna, DLNAMediaInfo media override = or.addSubtitles(); } - if (!isDisableSubtitles(params) && override) { + if (!isDisableSubtitles(params) && override && params.sid != null) { boolean isSubsManualTiming = true; DLNAMediaSubtitle convertedSubs = dlna.getMediaSubtitle(); StringBuilder subsFilter = new StringBuilder(); - if (params.sid != null && params.sid.getType().isText()) { + if ( + params.sid.getType().isText() && + !( + params.sid.getType() == SubtitleType.EIA608 || + params.sid.getType() == SubtitleType.EIA708 || // https://trac.ffmpeg.org/ticket/1778 + params.sid.getType() == SubtitleType.TELETEXT // Need a FFmpeg build with LIBZVBI and special command line to decode them, see https://ffmpeg.zeranoe.com/forum/viewtopic.php?t=1390 + ) + ) { boolean isSubsASS = params.sid.getType() == SubtitleType.ASS; String originalSubsFilename = null; if (is3D) { @@ -383,6 +390,17 @@ public synchronized List getVideoTranscodeOptions(DLNAResource dlna, DLN } else { transcodeOptions.add("libx265"); } + if ( + configuration.isDisableSubtitles() && + params.sid != null && + ( + params.sid.getType() == SubtitleType.EIA608 || + params.sid.getType() == SubtitleType.EIA708 + ) + ) { + transcodeOptions.add("-a53cc"); + transcodeOptions.add("0"); + } transcodeOptions.add("-tune"); transcodeOptions.add("zerolatency"); } @@ -399,6 +417,19 @@ public synchronized List getVideoTranscodeOptions(DLNAResource dlna, DLN } else if (!dtsRemux) { transcodeOptions.add("-c:v"); transcodeOptions.add("mpeg2video"); + } else if ((renderer.isTranscodeToMPEG2() || dtsRemux) && configuration.isDisableSubtitles()) { + if ( + params.sid != null && + params.sid.isEmbedded() && + ( + params.sid.getType() == SubtitleType.EIA608 || + params.sid.getType() == SubtitleType.EIA708 // not yet supported by FFmpeg, should be in 2018 + ) + ) { + // Must be ATSC compatible format. Set by default on recent FFmpeg versions except for NVENC + transcodeOptions.add("-a53cc"); + transcodeOptions.add("0"); + } } if (!customFFmpegOptions.contains("-f")) { From 03b79632be5b2d6fdab12ea07d93dbb30f3b98ca Mon Sep 17 00:00:00 2001 From: Samuel Date: Sat, 23 Sep 2017 15:29:15 +0200 Subject: [PATCH 4/6] Teletext --- .../renderers/VLC-for-desktop.conf | 2 +- .../java/net/pms/dlna/LibMediaInfoParser.java | 34 ++++++++++++------- src/main/java/net/pms/dlna/MediaInfo.java | 3 +- .../java/net/pms/formats/v2/SubtitleType.java | 2 +- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/main/external-resources/renderers/VLC-for-desktop.conf b/src/main/external-resources/renderers/VLC-for-desktop.conf index 7a83b346399..5432cd32068 100644 --- a/src/main/external-resources/renderers/VLC-for-desktop.conf +++ b/src/main/external-resources/renderers/VLC-for-desktop.conf @@ -42,4 +42,4 @@ Supported = f:dts m:audio/vnd.dts Supported = f:flac m:audio/flac Supported = f:oga m:audio/ogg -SupportedInternalSubtitlesFormats = ASS,DVBSUB,EIA608,EIA708,KATE,PGS,SUBRIP,TX3G,USF,VOBSUB +SupportedInternalSubtitlesFormats = ASS,DVBSUB,EIA608,EIA708,KATE,PGS,SUBRIP,TELETEXT,TX3G,USF,VOBSUB diff --git a/src/main/java/net/pms/dlna/LibMediaInfoParser.java b/src/main/java/net/pms/dlna/LibMediaInfoParser.java index 67923e094e8..fa639c28fad 100644 --- a/src/main/java/net/pms/dlna/LibMediaInfoParser.java +++ b/src/main/java/net/pms/dlna/LibMediaInfoParser.java @@ -115,7 +115,7 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, } value = MI.Get(general, 0, "Title"); - if (!value.isEmpty()) { + if (isNotBlank(value)) { media.setFileTitleFromMetadata(value); } @@ -299,8 +299,9 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, if (subTracks > 0) { for (int i = 0; i < subTracks; i++) { currentSubTrack = new DLNAMediaSubtitle(); - if (isNotBlank(MI.Get(text, i, "CodecID"))) { - currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(MI.Get(text, i, "CodecID"))); + value = MI.Get(text, i, "CodecID"); + if (isNotBlank(value)) { + currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(value)); } else { currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(MI.Get(text, i, "Format"))); } @@ -315,17 +316,24 @@ public synchronized static void parse(DLNAMediaInfo media, InputFile inputFile, } addSub(currentSubTrack, media); } - } - - // Teletext - int teletextTracks = MI.Count_Get(other); - if (teletextTracks > 0) { - for (int i = 0; i < teletextTracks; i++) { - currentSubTrack = new DLNAMediaSubtitle(); - if (isNotBlank(MI.Get(other, i, "Format"))) { - currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(MI.Get(other, i, "Format"))); + } else { // Check for teletext + subTracks = MI.Count_Get(other); + if (subTracks > 0) { + for (int i = 0; i < subTracks; i++) { + currentSubTrack = new DLNAMediaSubtitle(); + value = MI.Get(other, i, "Format"); + if (value.startsWith("Teletext")) { + currentSubTrack.setType(SubtitleType.valueOfLibMediaInfoCodec(value)); + currentSubTrack.setLang(getLang(MI.Get(other, i, "Language"))); + value = MI.Get(other, i, "ID"); + if (isNotBlank(value) && value.contains("-")) { + currentSubTrack.setId(getSpecificID(value)); + } else { + currentSubTrack.setId(media.getSubtitleTracksList().size()); + } + addSub(currentSubTrack, media); + } } - addSub(currentSubTrack, media); } } diff --git a/src/main/java/net/pms/dlna/MediaInfo.java b/src/main/java/net/pms/dlna/MediaInfo.java index 9618a7d0dab..a4b79700fa8 100644 --- a/src/main/java/net/pms/dlna/MediaInfo.java +++ b/src/main/java/net/pms/dlna/MediaInfo.java @@ -122,7 +122,8 @@ public enum StreamKind { Text, Chapters, Image, - Menu; + Menu, + Other; } public enum StreamType { diff --git a/src/main/java/net/pms/formats/v2/SubtitleType.java b/src/main/java/net/pms/formats/v2/SubtitleType.java index 208cb1ec78f..06c08d89564 100644 --- a/src/main/java/net/pms/formats/v2/SubtitleType.java +++ b/src/main/java/net/pms/formats/v2/SubtitleType.java @@ -52,7 +52,7 @@ public enum SubtitleType { EIA608 (16, "EIA-608", list(), list("EIA-608", "c608"), type.TEXT), EIA708 (17, "EIA-708", list(), list("EIA-708", "c708"), type.TEXT), KATE (18, "Kate", list(), list("Kate"), type.TEXT), - TELETEXT (19, "Teletext", list(), list("Teletext"), type.TEXT); + TELETEXT (19, "Teletext", list(), list("Teletext", "Teletext Subtitle"), type.TEXT); public enum type {TEXT, PICTURE, UNDEF} private final int index; From 65fffbdafc4ae5c57fe2086fb740b38758232a62 Mon Sep 17 00:00:00 2001 From: Nadahar Date: Sun, 24 Sep 2017 18:04:23 +0200 Subject: [PATCH 5/6] Fixed MediaInfo enums: - StreamType - InfoType Created MediaInfo enums: - InfoOptionsType - FileOptionsType # Conflicts: # src/main/java/net/pms/dlna/MediaInfo.java --- .../external-resources/renderers/Kodi.conf | 4 +- .../java/net/pms/dlna/DLNAMediaSubtitle.java | 2 +- src/main/java/net/pms/dlna/MediaInfo.java | 248 +++++++++++------- 3 files changed, 156 insertions(+), 98 deletions(-) diff --git a/src/main/external-resources/renderers/Kodi.conf b/src/main/external-resources/renderers/Kodi.conf index ad1d8d3297c..232301258a2 100644 --- a/src/main/external-resources/renderers/Kodi.conf +++ b/src/main/external-resources/renderers/Kodi.conf @@ -69,5 +69,5 @@ Supported = f:wavpack m:audio/x-wavpack Supported = f:wma m:audio/x-ms-wma # Supported subtitles formats: -SupportedExternalSubtitlesFormats = ASS,MICRODVD,PGS,SAMI,SUBRIP,TEXT,UFS,VOBSUB,WEBVTT -SupportedInternalSubtitlesFormats = ASS,MICRODVD,PGS,SAMI,SUBRIP,TEXT,UFS,VOBSUB,WEBVTT +SupportedExternalSubtitlesFormats = ASS,MICRODVD,PGS,SAMI,SUBRIP,TEXT,VOBSUB,WEBVTT +SupportedInternalSubtitlesFormats = ASS,DVBSUB,EIA608,EIA708,MICRODVD,PGS,SAMI,SUBRIP,TEXT,TX3G,USF,VOBSUB diff --git a/src/main/java/net/pms/dlna/DLNAMediaSubtitle.java b/src/main/java/net/pms/dlna/DLNAMediaSubtitle.java index 6d3706a2cf2..aacd4f78bc7 100644 --- a/src/main/java/net/pms/dlna/DLNAMediaSubtitle.java +++ b/src/main/java/net/pms/dlna/DLNAMediaSubtitle.java @@ -76,7 +76,7 @@ public String toString() { result.append("id: "); result.append(getId()); result.append(", type: "); - result.append(type); + result.append(getType()); if (isNotBlank(subtitlesTrackTitleFromMetadata)) { result.append(", subtitles track title from metadata: "); diff --git a/src/main/java/net/pms/dlna/MediaInfo.java b/src/main/java/net/pms/dlna/MediaInfo.java index a4b79700fa8..f3c57debf81 100644 --- a/src/main/java/net/pms/dlna/MediaInfo.java +++ b/src/main/java/net/pms/dlna/MediaInfo.java @@ -82,7 +82,6 @@ public String getFunctionName(NativeLibrary lib, Method method) { } }); - @SuppressWarnings("cast") MediaInfoDLL_Internal INSTANCE = (MediaInfoDLL_Internal) Native.loadLibrary( libraryName, @@ -112,105 +111,164 @@ public String getFunctionName(NativeLibrary lib, Method method) { // Options WString Option(Pointer Handle, WString option, WString value); } + private Pointer Handle; - @Deprecated - public enum StreamKind { - General, - Video, - Audio, - Text, - Chapters, - Image, - Menu, - Other; + /** + * An enum representing the C++ enum {@code stream_t} defined in + * {@code MediaInfoDLL.h}, "Kinds of Stream". + * + * @author Nadahar + */ + public enum StreamType { + + /** StreamKind = General */ + General(0), + + /** StreamKind = Video */ + Video(1), + + /** StreamKind = Audio */ + Audio(2), + + /** StreamKind = Text */ + Text(3), + + /** StreamKind = Other */ + Other(4), + + /** StreamKind = Image */ + Image(5), + + /** StreamKind = Menu */ + Menu(6); + + private final int value; + + private StreamType(int value) { + this.value = value; + } + + public int getValue() { + return value; + } } - public enum StreamType { - General, - Video, - Audio, - Text, - Chapters, - Image, - Menu, - Other; + /** + * An enum representing the C++ enum {@code info_t} defined in + * {@code MediaInfoDLL.h}, "Kind of information". + * + * @author Nadahar + */ + public enum InfoType { + + /** InfoKind = Unique name of parameter */ + Name(0), + + /** InfoKind = Value of parameter */ + Text(1), + + /** InfoKind = Unique name of measure unit of parameter */ + Measure(2), + + /** InfoKind = See {@link InfoOptionsType} */ + Options(3), + + /** InfoKind = Translated name of parameter */ + Name_Text(4), + + /** InfoKind = Translated name of measure unit */ + Measure_Text(5), + + /** InfoKind = More information about the parameter */ + Info(6), + + /** InfoKind = Information : how data is found */ + HowTo(7); + + private final int value; + + private InfoType(int value) { + this.value = value; + } + + public int getValue() { + return value; + } } - // Enums - @Deprecated - public enum InfoKind { - /** - * Unique name of parameter. - */ - Name, - /** - * Value of parameter. - */ - Text, - /** - * Unique name of measure unit of parameter. - */ - Measure, - Options, - /** - * Translated name of parameter. - */ - Name_Text, - /** - * Translated name of measure unit. - */ - Measure_Text, - /** - * More information about the parameter. - */ - Info, + /** + * An enum representing the C++ enum {@code infooptions_t} defined in + * {@code MediaInfoDLL.h}, "Option if InfoKind = Info_Options". + *

+ * Get(...)[infooptions_t] return a string like "YNYN...". Use this + * {@code enum} to know at what correspond the {@code Y} (Yes) or {@code N} + * (No). + *

+ * If {@code Get(...)[0]==Y, then : } + * + * @author Nadahar + */ + public enum InfoOptionsType { + + /** Show this parameter in {@link MediaInfo#Inform()} */ + ShowInInform(0), + + /** Reserved for future use */ + Reserved(1), + /** - * How this parameter is supported, could be N (No), B (Beta), R (Read only), W - * (Read/Write). + * Internal use only (info : Must be showed in + * {@code Info_Capacities()}) */ - HowTo, + ShowInSupported(2), + /** - * Domain of this piece of information. + * Value return by a standard {@link MediaInfo#get}() can be : {@code T} + * (Text), {@code I} (Integer, warning up to 64 bits), {@code F} + * (Float), {@code D} (Date), {@code B} (Binary datas coded Base64) + * (Numbers are in Base 10) */ - Domain; + TypeOfValue(3); + + private final int value; + + private InfoOptionsType(int value) { + this.value = value; + } + + public int getValue() { + return value; + } } - public enum InfoType { - /** - * Unique name of parameter. - */ - Name, - /** - * Value of parameter. - */ - Text, - /** - * Unique name of measure unit of parameter. - */ - Measure, - Options, - /** - * Translated name of parameter. - */ - Name_Text, - /** - * Translated name of measure unit. - */ - Measure_Text, - /** - * More information about the parameter. - */ - Info, - /** - * How this parameter is supported, could be N (No), B (Beta), R (Read only), W - * (Read/Write). - */ - HowTo, - /** - * Domain of this piece of information. - */ - Domain; + + /** + * An enum representing the C++ enum {@code fileoptions_t} defined in + * {@code MediaInfoDLL.h}, "File opening options". + * + * @author Nadahar + */ + public enum FileOptionsType { + + /** No options */ + Nothing(0x00), + + /** Do not browse folders recursively */ + NoRecursive(0x01), + + /** Close all files before open */ + CloseAll(0x02); + + private final int value; + + private FileOptionsType(int value) { + this.value = value; + } + + public int getValue() { + return value; + } } // Constructor/Destructor @@ -330,11 +388,11 @@ public String Get(StreamType streamType, int streamNumber, String parameter, Inf public String Get(StreamType streamType, int streamNumber, String parameter, InfoType infoType, InfoType searchType) { return MediaInfoDLL_Internal.INSTANCE.Get( Handle, - streamType.ordinal(), + streamType.getValue(), streamNumber, new WString(parameter), - infoType.ordinal(), - searchType.ordinal()).toString(); + infoType.getValue(), + searchType.getValue()).toString(); } /** @@ -364,10 +422,10 @@ public String get(StreamType streamType, int streamNumber, int parameterIndex) { public String Get(StreamType streamType, int streamNumber, int parameterIndex, InfoType infoType) { return MediaInfoDLL_Internal.INSTANCE.GetI( Handle, - streamType.ordinal(), + streamType.getValue(), streamNumber, parameterIndex, - infoType.ordinal()).toString(); + infoType.getValue()).toString(); } /** @@ -378,7 +436,7 @@ public String Get(StreamType streamType, int streamNumber, int parameterIndex, I * @return number of Streams of the given Stream kind */ public int Count_Get(StreamType streamType) { - return MediaInfoDLL_Internal.INSTANCE.Count_Get(Handle, streamType.ordinal(), -1); + return MediaInfoDLL_Internal.INSTANCE.Count_Get(Handle, streamType.getValue(), -1); } /** @@ -390,7 +448,7 @@ public int Count_Get(StreamType streamType) { * @return number of Streams of the given Stream kind */ public int Count_Get(StreamType streamType, int streamNumber) { - return MediaInfoDLL_Internal.INSTANCE.Count_Get(Handle, streamType.ordinal(), streamNumber); + return MediaInfoDLL_Internal.INSTANCE.Count_Get(Handle, streamType.getValue(), streamNumber); } // Options From 7018290830c31fc89e8fea8a7d8b0b4209e7d387 Mon Sep 17 00:00:00 2001 From: Samuel Date: Sat, 9 Jun 2018 16:40:59 +0000 Subject: [PATCH 6/6] TTML --- src/main/java/net/pms/dlna/DLNAMediaInfo.java | 2 + .../java/net/pms/formats/v2/SubtitleType.java | 41 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/pms/dlna/DLNAMediaInfo.java b/src/main/java/net/pms/dlna/DLNAMediaInfo.java index 8fad0a03a59..43e6f85942f 100644 --- a/src/main/java/net/pms/dlna/DLNAMediaInfo.java +++ b/src/main/java/net/pms/dlna/DLNAMediaInfo.java @@ -1358,6 +1358,8 @@ public void parseFFmpegInfo(List lines, String input) { lang.setType(SubtitleType.DIVX); } else if (line.contains("mov_text")) { lang.setType(SubtitleType.TX3G); + } else if (line.contains("ttml")) { + lang.setType(SubtitleType.TTML); } else if (line.contains("webvtt")) { lang.setType(SubtitleType.WEBVTT); } else if (line.contains("dvb_subtitle")) { diff --git a/src/main/java/net/pms/formats/v2/SubtitleType.java b/src/main/java/net/pms/formats/v2/SubtitleType.java index 06c08d89564..42185829711 100644 --- a/src/main/java/net/pms/formats/v2/SubtitleType.java +++ b/src/main/java/net/pms/formats/v2/SubtitleType.java @@ -33,26 +33,27 @@ public enum SubtitleType { // http://mediainfo.svn.sourceforge.net/viewvc/mediainfo/MediaInfoLib/trunk/Source/Resource/Text/DataBase/ // SubtitleType(int index, String description, List fileExtensions, List libMediaInfoCodecs, int category) - UNKNOWN (0, "Unknown", list(), list("Unknown"), type.UNDEF), - SUBRIP (1, "SubRip", list("srt"), list("S_TEXT/UTF8", "S_UTF8", "UTF-8", "Subrip"), type.TEXT), - TEXT (2, "Text", list("txt"), list(), type.TEXT), - MICRODVD (3, "MicroDVD", list("sub"), list(), type.TEXT), - SAMI (4, "SAMI", list("smi"), list(), type.TEXT), - ASS (5, "ASS/SSA", list("ass", "ssa"), list("S_TEXT/SSA", "S_TEXT/ASS", "S_SSA", "S_ASS", "SSA", "ASS"), type.TEXT), - VOBSUB (6, "VobSub", list("idx"), list("S_VOBSUB", "subp", "mp4s", "E0", "RLE"), type.PICTURE), // TODO: "RLE" may also apply to other formats - UNSUPPORTED (7, "Unsupported", list(), list(), type.UNDEF), - USF (8, "USF", list(), list("S_TEXT/USF", "S_USF", "USF"), type.TEXT), - BMP (9, "Bitmap", list(), list("S_IMAGE/BMP"), type.PICTURE), - DIVX (10, "XSUB", list(), list("DXSB"), type.PICTURE), - TX3G (11, "TX3G", list(), list("Timed Text", "tx3g"), type.TEXT), - PGS (12, "PGS", list("pgs", "sup"), list("S_HDMV/PGS", "PGS", "144"), type.PICTURE), - WEBVTT (13, "WebVTT", list("vtt"), list("WebVTT", "S_TEXT/WEBVTT"), type.TEXT), - TEXTST (14, "HDMV Text", list(), list("S_HDMV/TEXTST"), type.TEXT), - DVBSUB (15, "DVB Subtitle", list(), list("S_DVBSUB", "DVB Subtitle", "6"), type.PICTURE), - EIA608 (16, "EIA-608", list(), list("EIA-608", "c608"), type.TEXT), - EIA708 (17, "EIA-708", list(), list("EIA-708", "c708"), type.TEXT), - KATE (18, "Kate", list(), list("Kate"), type.TEXT), - TELETEXT (19, "Teletext", list(), list("Teletext", "Teletext Subtitle"), type.TEXT); + UNKNOWN (0, "Unknown", list(), list("Unknown"), type.UNDEF), + SUBRIP (1, "SubRip", list("srt"), list("S_TEXT/UTF8", "S_UTF8", "UTF-8", "Subrip"), type.TEXT), + TEXT (2, "Text", list("txt"), list(), type.TEXT), + MICRODVD (3, "MicroDVD", list("sub"), list(), type.TEXT), + SAMI (4, "SAMI", list("smi"), list(), type.TEXT), + ASS (5, "ASS/SSA", list("ass", "ssa"), list("S_TEXT/SSA", "S_TEXT/ASS", "S_SSA", "S_ASS", "SSA", "ASS"), type.TEXT), + VOBSUB (6, "VobSub", list("idx"), list("S_VOBSUB", "subp", "mp4s", "E0", "RLE"), type.PICTURE), // TODO: "RLE" may also apply to other formats + UNSUPPORTED (7, "Unsupported", list(), list(), type.UNDEF), + USF (8, "USF", list(), list("S_TEXT/USF", "S_USF", "USF"), type.TEXT), + BMP (9, "Bitmap", list(), list("S_IMAGE/BMP"), type.PICTURE), + DIVX (10, "XSUB", list(), list("DXSB"), type.PICTURE), + TX3G (11, "TX3G", list(), list("Timed Text", "tx3g"), type.TEXT), + PGS (12, "PGS", list("pgs", "sup"), list("S_HDMV/PGS", "PGS", "144"), type.PICTURE), + WEBVTT (13, "WebVTT", list("vtt"), list("WebVTT", "S_TEXT/WEBVTT"), type.TEXT), + TEXTST (14, "HDMV Text", list(), list("S_HDMV/TEXTST"), type.TEXT), + DVBSUB (15, "DVB Subtitle", list(), list("S_DVBSUB", "DVB Subtitle", "6"), type.PICTURE), + EIA608 (16, "EIA-608", list(), list("EIA-608", "c608"), type.TEXT), + EIA708 (17, "EIA-708", list(), list("EIA-708", "c708"), type.TEXT), + KATE (18, "Kate", list(), list("Kate"), type.TEXT), + TELETEXT (19, "Teletext", list(), list("Teletext", "Teletext Subtitle"), type.TEXT), + TTML (20, "TTML", list("dfxp", "ttml"), list("dfxp", "TTML"), type.TEXT); public enum type {TEXT, PICTURE, UNDEF} private final int index;