mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-27 22:42:38 +01:00
Work on teletext
This commit is contained in:
parent
94c6143c07
commit
cc8c0025af
@ -13,7 +13,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
public const int DefaultScreenWidth = 720;
|
||||
public const int DefaultScreenHeight = 576;
|
||||
|
||||
public readonly UInt32 StartCode;
|
||||
public readonly uint StartCode;
|
||||
public readonly int StreamId;
|
||||
public readonly int Length;
|
||||
public readonly int ScramblingControl;
|
||||
@ -30,13 +30,15 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
public readonly int ExtensionFlag;
|
||||
public readonly int HeaderDataLength;
|
||||
|
||||
public readonly UInt64? PresentationTimestamp;
|
||||
public readonly UInt64? DecodeTimestamp;
|
||||
public readonly ulong? PresentationTimestamp;
|
||||
public readonly ulong? DecodeTimestamp;
|
||||
|
||||
public readonly int? SubPictureStreamId;
|
||||
|
||||
private readonly byte[] _dataBuffer;
|
||||
|
||||
private static long Delta = long.MaxValue; //TODO: remove
|
||||
|
||||
public DvbSubPes(byte[] buffer, int index)
|
||||
{
|
||||
if (buffer.Length < index + 9)
|
||||
@ -110,16 +112,25 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
|
||||
_dataBuffer = new byte[dataSize + 1];
|
||||
Buffer.BlockCopy(buffer, dataIndex - 1, _dataBuffer, 0, _dataBuffer.Length); // why subtract one from dataIndex???
|
||||
|
||||
}
|
||||
|
||||
public string GetTeletext(int packetId)
|
||||
public Dictionary<int, string> GetTeletext(int packetId)
|
||||
{
|
||||
if (!IsTeletext)
|
||||
{
|
||||
return string.Empty;
|
||||
return new Dictionary<int, string>();
|
||||
}
|
||||
|
||||
var pts = PresentationTimestamp.HasValue ? (long)PresentationTimestamp.Value / 90 : 0;
|
||||
if (Delta == long.MaxValue)
|
||||
{
|
||||
Delta = -pts;
|
||||
}
|
||||
ulong lastTimestamp = (ulong)(pts + Delta);
|
||||
|
||||
|
||||
// find all pages
|
||||
var pages = new List<int>();
|
||||
Teletext.Fout.Clear();
|
||||
Teletext.config.Page = 2184;
|
||||
Teletext.config.Tid = packetId;
|
||||
@ -139,13 +150,64 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
_dataBuffer[i + j] = TeletextHamming.Reverse8[_dataBuffer[i + j]];
|
||||
}
|
||||
|
||||
// FIXME: This explicit type conversion could be a problem some day -- do not need to be platform independant
|
||||
Teletext.ProcessTelxPacket((Teletext.DataUnitT)dataUnitId, new Teletext.TeletextPacketPayload(_dataBuffer, i), 0);
|
||||
var p = Teletext.GetPageNumber(new Teletext.TeletextPacketPayload(_dataBuffer, i)); //TODO: optimize use databuffer
|
||||
if (!pages.Contains(p))
|
||||
{
|
||||
pages.Add(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
i += dataUnitLen;
|
||||
}
|
||||
return Teletext.Fout.ToString().Trim();
|
||||
|
||||
|
||||
var teletextPages = new Dictionary<int, string>();
|
||||
Teletext.Fout.Clear();
|
||||
Teletext._lastTimestamp = 0;
|
||||
Teletext._globalTimestamp = 0;
|
||||
Teletext.states = new Teletext.States();
|
||||
foreach (var page in pages)
|
||||
{
|
||||
Teletext.Fout.Clear();
|
||||
Teletext.config.Page = page;
|
||||
Teletext.config.Tid = packetId;
|
||||
i = 1;
|
||||
while (i <= _dataBuffer.Length - 6)
|
||||
{
|
||||
var dataUnitId = _dataBuffer[i++];
|
||||
var dataUnitLen = _dataBuffer[i++];
|
||||
if (dataUnitId == (int)Teletext.DataUnitT.DataUnitEbuTeletextNonSubtitle || dataUnitId == (int)Teletext.DataUnitT.DataUnitEbuTeletextSubtitle)
|
||||
{
|
||||
// teletext payload has always size 44 bytes
|
||||
if (dataUnitLen == 44)
|
||||
{
|
||||
// reverse endianess (via lookup table), ETS 300 706, chapter 7.1
|
||||
//for (var j = 0; j < dataUnitLen; j++)
|
||||
//{
|
||||
// _dataBuffer[i + j] = TeletextHamming.Reverse8[_dataBuffer[i + j]];
|
||||
//}
|
||||
|
||||
Teletext.ProcessTelxPacket((Teletext.DataUnitT)dataUnitId, new Teletext.TeletextPacketPayload(_dataBuffer, i), lastTimestamp); //TODO: optimize use databuffer
|
||||
}
|
||||
}
|
||||
i += dataUnitLen;
|
||||
}
|
||||
var text = Teletext.Fout.ToString().Trim();
|
||||
if (!string.IsNullOrEmpty(text))
|
||||
{
|
||||
var p = 888;
|
||||
if (teletextPages.ContainsKey(p))
|
||||
{
|
||||
teletextPages[p] += Environment.NewLine + Environment.NewLine + text;
|
||||
}
|
||||
else
|
||||
{
|
||||
teletextPages.Add(p, text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return teletextPages;
|
||||
}
|
||||
|
||||
public DvbSubPes(int index, byte[] buffer)
|
||||
@ -230,19 +292,9 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsDvbSubpicture => SubPictureStreamId.HasValue && SubPictureStreamId.Value == 32;
|
||||
public bool IsDvbSubPicture => SubPictureStreamId.HasValue && SubPictureStreamId.Value == 32;
|
||||
|
||||
public bool IsTeletext
|
||||
{
|
||||
get
|
||||
{
|
||||
if (DataIdentifier == 16)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public bool IsTeletext => DataIdentifier == 16;
|
||||
|
||||
public int DataIdentifier
|
||||
{
|
||||
@ -325,13 +377,13 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
|
||||
private ClutDefinitionSegment GetClutDefinitionSegment(ObjectDataSegment ods)
|
||||
{
|
||||
foreach (RegionCompositionSegment rcs in RegionCompositions)
|
||||
foreach (var rcs in RegionCompositions)
|
||||
{
|
||||
foreach (RegionCompositionSegmentObject o in rcs.Objects)
|
||||
foreach (var o in rcs.Objects)
|
||||
{
|
||||
if (o.ObjectId == ods.ObjectId)
|
||||
{
|
||||
foreach (ClutDefinitionSegment cds in ClutDefinitions)
|
||||
foreach (var cds in ClutDefinitions)
|
||||
{
|
||||
if (cds.ClutId == rcs.RegionClutId)
|
||||
{
|
||||
@ -359,13 +411,13 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
|
||||
var p = new Point(0, 0);
|
||||
|
||||
foreach (RegionCompositionSegment rcs in RegionCompositions)
|
||||
foreach (var rcs in RegionCompositions)
|
||||
{
|
||||
foreach (RegionCompositionSegmentObject o in rcs.Objects)
|
||||
foreach (var o in rcs.Objects)
|
||||
{
|
||||
if (o.ObjectId == ods.ObjectId)
|
||||
{
|
||||
foreach (PageCompositionSegment cds in PageCompositions)
|
||||
foreach (var cds in PageCompositions)
|
||||
{
|
||||
foreach (var r in cds.Regions)
|
||||
{
|
||||
@ -398,7 +450,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
return ods.Image;
|
||||
}
|
||||
|
||||
ClutDefinitionSegment cds = GetClutDefinitionSegment(ods);
|
||||
var cds = GetClutDefinitionSegment(ods);
|
||||
ods.DecodeImage(_dataBuffer, ods.BufferIndex, cds);
|
||||
return ods.Image;
|
||||
}
|
||||
@ -414,7 +466,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
int height = DefaultScreenHeight;
|
||||
|
||||
var segments = SubtitleSegments;
|
||||
foreach (SubtitleSegment ss in segments)
|
||||
foreach (var ss in segments)
|
||||
{
|
||||
if (ss.DisplayDefinition != null)
|
||||
{
|
||||
|
@ -100,7 +100,8 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
break;
|
||||
}
|
||||
}
|
||||
return sb.ToString().TrimEnd(' ', '$');
|
||||
var l = sb.ToString().TrimEnd(' ', '$', '(', ')');
|
||||
return l.Length > 3 ? l.Substring(0, 3) : l;
|
||||
}
|
||||
}
|
||||
return string.Empty;
|
||||
|
@ -42,21 +42,11 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
public ulong UtcRefValue { get; set; } // UTC referential value
|
||||
public bool SeMode { get; set; } // FIXME: move SE_MODE to output module
|
||||
public bool M2Ts { get; set; } // consider input stream is af s M2TS, instead of TS
|
||||
public int Count { get; set; } // consider input stream is af s M2TS, instead of TS
|
||||
|
||||
public Config()
|
||||
{
|
||||
InputName = null;
|
||||
OutputName = null;
|
||||
Verbose = false;
|
||||
Page = 0;
|
||||
Tid = 0;
|
||||
Offset = 0;
|
||||
Colours = false;
|
||||
Bom = true;
|
||||
NonEmpty = false;
|
||||
UtcRefValue = 0;
|
||||
SeMode = false;
|
||||
M2Ts = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,17 +115,17 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
|
||||
public static readonly StringBuilder Fout = new StringBuilder();
|
||||
|
||||
private static readonly States states = new States();
|
||||
public static States states = new States();
|
||||
|
||||
public static readonly Config config = new Config();
|
||||
|
||||
private static readonly PrimaryCharset primaryCharset = new PrimaryCharset();
|
||||
|
||||
// global TS PCR value
|
||||
private static ulong _globalTimestamp;
|
||||
public static ulong _globalTimestamp;
|
||||
|
||||
// last timestamp computed
|
||||
private static ulong _lastTimestamp;
|
||||
public static ulong _lastTimestamp;
|
||||
|
||||
private static long _delta;
|
||||
private static long _t0;
|
||||
@ -411,7 +401,10 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
page_is_empty:
|
||||
if (pageIsEmpty) return;
|
||||
|
||||
if (page.ShowTimestamp > page.HideTimestamp) page.HideTimestamp = page.ShowTimestamp;
|
||||
if (page.ShowTimestamp > page.HideTimestamp)
|
||||
{
|
||||
page.HideTimestamp = page.ShowTimestamp;
|
||||
}
|
||||
|
||||
if (config.SeMode)
|
||||
{
|
||||
@ -541,6 +534,17 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
Fout.AppendLine();
|
||||
}
|
||||
|
||||
public static int GetPageNumber(TeletextPacketPayload packet)
|
||||
{
|
||||
var address = (Unham84(packet.Address[1]) << 4) | Unham84(packet.Address[0]);
|
||||
var m = address & 0x7;
|
||||
if (m == 0)
|
||||
{
|
||||
m = 8;
|
||||
}
|
||||
return (m << 8) | (Unham84(packet.Data[1]) << 4) | Unham84(packet.Data[0]);
|
||||
}
|
||||
|
||||
public static void ProcessTelxPacket(DataUnitT dataUnitId, TeletextPacketPayload packet, ulong timestamp)
|
||||
{
|
||||
// variable names conform to ETS 300 706, chapter 7.1.2
|
||||
|
@ -23,7 +23,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
public List<Packet> SubtitlePackets { get; private set; }
|
||||
private Dictionary<int, List<DvbSubPes>> SubtitlesLookup { get; set; }
|
||||
private Dictionary<int, List<TransportStreamSubtitle>> DvbSubtitlesLookup { get; set; }
|
||||
public Dictionary<int, StringBuilder> TeletextSubtitlesLookup { get; set; }
|
||||
public Dictionary<int, Dictionary<int, StringBuilder>> TeletextSubtitlesLookup { get; set; }
|
||||
public bool IsM2TransportStream { get; private set; }
|
||||
public ulong FirstVideoPts { get; private set; }
|
||||
|
||||
@ -57,7 +57,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
var m2TsTimeCodeBuffer = new byte[4];
|
||||
long position = 0;
|
||||
SubtitlesLookup = new Dictionary<int, List<DvbSubPes>>();
|
||||
TeletextSubtitlesLookup = new Dictionary<int, StringBuilder>();
|
||||
TeletextSubtitlesLookup = new Dictionary<int, Dictionary<int, StringBuilder>>();
|
||||
|
||||
// check for Topfield .rec file
|
||||
ms.Seek(position, SeekOrigin.Begin);
|
||||
@ -120,7 +120,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
if (!IsM2TransportStream && packet.PayloadUnitStartIndicator)
|
||||
{
|
||||
var list = MakeSubtitlePesPackets(packet.PacketId, SubtitlePackets);
|
||||
if (list.Any(p => p.IsDvbSubpicture))
|
||||
if (list.Any(p => p.IsDvbSubPicture))
|
||||
{
|
||||
if (SubtitlesLookup.ContainsKey(packet.PacketId))
|
||||
{
|
||||
@ -135,16 +135,28 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
{
|
||||
foreach (var item in list.Where(p => p.IsTeletext))
|
||||
{
|
||||
var text = item.GetTeletext(packet.PacketId);
|
||||
if (text.Length > 0)
|
||||
var textDictionary = item.GetTeletext(packet.PacketId);
|
||||
foreach (var dic in textDictionary)
|
||||
{
|
||||
if (TeletextSubtitlesLookup.ContainsKey(packet.PacketId))
|
||||
if (dic.Value.Length > 0)
|
||||
{
|
||||
TeletextSubtitlesLookup[packet.PacketId].AppendLine(text + Environment.NewLine + Environment.NewLine);
|
||||
}
|
||||
else
|
||||
{
|
||||
TeletextSubtitlesLookup.Add(packet.PacketId, new StringBuilder(text + Environment.NewLine + Environment.NewLine));
|
||||
var text = dic.Value + Environment.NewLine + Environment.NewLine;
|
||||
if (TeletextSubtitlesLookup.ContainsKey(packet.PacketId))
|
||||
{
|
||||
var innerDic = TeletextSubtitlesLookup[packet.PacketId];
|
||||
if (innerDic.ContainsKey(dic.Key))
|
||||
{
|
||||
innerDic[dic.Key].Append(text);
|
||||
}
|
||||
else
|
||||
{
|
||||
innerDic.Add(dic.Key, new StringBuilder(text));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TeletextSubtitlesLookup.Add(packet.PacketId, new Dictionary<int, StringBuilder> { { dic.Key, new StringBuilder(text) } });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -189,6 +201,8 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
}
|
||||
}
|
||||
|
||||
var i333 = Teletext.config.Count;
|
||||
|
||||
if (IsM2TransportStream)
|
||||
{
|
||||
DvbSubtitlesLookup = new Dictionary<int, List<TransportStreamSubtitle>>();
|
||||
@ -239,7 +253,7 @@ namespace Nikse.SubtitleEdit.Core.TransportStream
|
||||
bool hasImageSubtitles = false;
|
||||
foreach (var item in list)
|
||||
{
|
||||
if (item.IsDvbSubpicture)
|
||||
if (item.IsDvbSubPicture)
|
||||
{
|
||||
hasImageSubtitles = true;
|
||||
break;
|
||||
|
@ -12177,15 +12177,16 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
return false;
|
||||
}
|
||||
|
||||
if (tsParser.TeletextSubtitlesLookup.Count > 0)
|
||||
if (tsParser.SubtitlePacketIds.Count == 0 & tsParser.TeletextSubtitlesLookup.Count == 1 && tsParser.TeletextSubtitlesLookup.First().Value.Count() == 1)
|
||||
{
|
||||
new SubRip().LoadSubtitle(_subtitle, tsParser.TeletextSubtitlesLookup.First().ToString().SplitToLines(), null);
|
||||
var srt = tsParser.TeletextSubtitlesLookup.First().Value.First().Value.ToString();
|
||||
new SubRip().LoadSubtitle(_subtitle, srt.SplitToLines(), null);
|
||||
SubtitleListview1.Fill(_subtitle);
|
||||
return true;
|
||||
}
|
||||
|
||||
int packedId;
|
||||
if (tsParser.SubtitlePacketIds.Count + tsParser.TeletextSubtitlesLookup.Count > 1)
|
||||
int packetId;
|
||||
if (tsParser.SubtitlePacketIds.Count + tsParser.TeletextSubtitlesLookup.Sum(p=>p.Value.Count()) > 1)
|
||||
{
|
||||
using (var subChooser = new TransportStreamSubtitleChooser())
|
||||
{
|
||||
@ -12195,18 +12196,22 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
return false;
|
||||
}
|
||||
|
||||
packedId = tsParser.SubtitlePacketIds[subChooser.SelectedIndex];
|
||||
//if (tsParser.TeletextSubtitlesLookup.Count > 0)
|
||||
//{
|
||||
// new SubRip().LoadSubtitle(_subtitle, tsParser.TeletextSubtitlesLookup.First().ToString().SplitToLines(), null);
|
||||
// SubtitleListview1.Fill(_subtitle);
|
||||
// return true;
|
||||
//}
|
||||
if (subChooser.IsTeletext)
|
||||
{
|
||||
new SubRip().LoadSubtitle(_subtitle, subChooser.Srt.SplitToLines(), null);
|
||||
SubtitleListview1.Fill(_subtitle);
|
||||
return true;
|
||||
}
|
||||
packetId = tsParser.SubtitlePacketIds[subChooser.SelectedIndex];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
packetId = tsParser.SubtitlePacketIds[0];
|
||||
}
|
||||
|
||||
packedId = tsParser.SubtitlePacketIds[0];
|
||||
var subtitles = tsParser.GetDvbSubtitles(packedId);
|
||||
|
||||
var subtitles = tsParser.GetDvbSubtitles(packetId);
|
||||
using (var formSubOcr = new VobSubOcr())
|
||||
{
|
||||
string language = null;
|
||||
@ -12214,7 +12219,7 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
programMapTableParser.Parse(fileName); // get languages
|
||||
if (programMapTableParser.GetSubtitlePacketIds().Count > 0)
|
||||
{
|
||||
language = programMapTableParser.GetSubtitleLanguage(packedId);
|
||||
language = programMapTableParser.GetSubtitleLanguage(packetId);
|
||||
}
|
||||
|
||||
formSubOcr.Initialize(subtitles, Configuration.Settings.VobSubOcr, fileName, language);
|
||||
@ -12255,150 +12260,6 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
|
||||
}
|
||||
|
||||
#region Teletext
|
||||
|
||||
/*
|
||||
private readonly static String[] colors = {
|
||||
"{\\c&HC0C0C0&}", // black /gray
|
||||
"{\\c&H4040FF&}", // red
|
||||
"{\\c&H00FF00&}", // green
|
||||
"{\\c&H00FFFF&}", // yellow
|
||||
"{\\c&HFF409B&}", // blue //DM15032004 081.6 int18 changed
|
||||
"{\\c&HFF00FF&}", // magenta
|
||||
"{\\c&HFFFF00&}", // cyan
|
||||
"{\\c&HFFFFFF&}", // white
|
||||
};
|
||||
|
||||
public static byte ByteReverse(byte n)
|
||||
{
|
||||
n = (byte)(((n >> 1) & 0x55) | ((n << 1) & 0xaa));
|
||||
n = (byte)(((n >> 2) & 0x33) | ((n << 2) & 0xcc));
|
||||
n = (byte)(((n >> 4) & 0x0f) | ((n << 4) & 0xf0));
|
||||
return n;
|
||||
}
|
||||
|
||||
private static string GetTeletext(byte[] _buffer, int offset)
|
||||
{
|
||||
string text = string.Empty;
|
||||
bool ascii = false;
|
||||
const int color = 0;
|
||||
bool toggle = false;
|
||||
for (int c = offset, i = 0; c < _buffer.Length; c++, i++)
|
||||
{
|
||||
//var char_value = _buffer[c];
|
||||
|
||||
var char_value = 0x7F & ByteReverse(_buffer[c]);
|
||||
|
||||
if (char_value >> 3 == 0) //0x0..7
|
||||
{
|
||||
ascii = true;
|
||||
text += ((color == 1) ? colors[char_value] : string.Empty); // + (char)active_set[32];
|
||||
}
|
||||
else if (char_value >> 4 == 0) //0x8..F
|
||||
{
|
||||
text += " "; //(char)active_set[32];
|
||||
}
|
||||
else if (char_value >> 7 == 1) //0x80..FF
|
||||
{
|
||||
text += " "; //(char)active_set[32];
|
||||
}
|
||||
else if (char_value < 27) //0x10..1A
|
||||
{
|
||||
ascii = false;
|
||||
text += " "; //(char)active_set[32];
|
||||
}
|
||||
else if (char_value < 32) //0x1B..1F
|
||||
{
|
||||
if (char_value == 0x1B) //ESC
|
||||
{
|
||||
if (toggle)
|
||||
{
|
||||
// active_set = CharSet.getActive_G0_Set(primary_set_mapping, primary_national_set_mapping, row);
|
||||
// active_national_set = CharSet.getActiveNationalSubset(primary_set_mapping, primary_national_set_mapping, row);
|
||||
}
|
||||
else
|
||||
{
|
||||
//active_set = CharSet.getActive_G0_Set(secondary_set_mapping, secondary_national_set_mapping, row);
|
||||
//active_national_set = CharSet.getActiveNationalSubset(secondary_set_mapping, secondary_national_set_mapping, row);
|
||||
}
|
||||
toggle = !toggle;
|
||||
}
|
||||
|
||||
text += " "; //(char)active_set[32];
|
||||
continue;
|
||||
}
|
||||
else if (char_value == 0x7F) //0x7F
|
||||
{
|
||||
text += " "; // (char)active_set[32];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!ascii)
|
||||
{
|
||||
text += " "; // (char)active_set[32];
|
||||
continue;
|
||||
}
|
||||
|
||||
//if (active_national_set != null)
|
||||
//{
|
||||
// // all chars 0x20..7F
|
||||
// switch (char_value) // special national characters
|
||||
// {
|
||||
// case 0x23:
|
||||
// text += (char)active_national_set[0];
|
||||
// continue loopi;
|
||||
// case 0x24:
|
||||
// text += (char)active_national_set[1];
|
||||
// continue loopi;
|
||||
// case 0x40:
|
||||
// text += (char)active_national_set[2];
|
||||
// continue loopi;
|
||||
// case 0x5b:
|
||||
// text += (char)active_national_set[3];
|
||||
// continue loopi;
|
||||
// case 0x5c:
|
||||
// text += (char)active_national_set[4];
|
||||
// continue loopi;
|
||||
// case 0x5d:
|
||||
// text += (char)active_national_set[5];
|
||||
// continue loopi;
|
||||
// case 0x5e:
|
||||
// text += (char)active_national_set[6];
|
||||
// continue loopi;
|
||||
// case 0x5f:
|
||||
// text += (char)active_national_set[7];
|
||||
// continue loopi;
|
||||
// case 0x60:
|
||||
// text += (char)active_national_set[8];
|
||||
// continue loopi;
|
||||
// case 0x7b:
|
||||
// text += (char)active_national_set[9];
|
||||
// continue loopi;
|
||||
// case 0x7c:
|
||||
// text += (char)active_national_set[10];
|
||||
// continue loopi;
|
||||
// case 0x7d:
|
||||
// text += (char)active_national_set[11];
|
||||
// continue loopi;
|
||||
// case 0x7e:
|
||||
// text += (char)active_national_set[12];
|
||||
// continue loopi;
|
||||
// }
|
||||
//}
|
||||
|
||||
text += Encoding.Default.GetString(new byte[] { (byte)char_value }); //(char)active_set[char_value];
|
||||
//continue loopi;
|
||||
}
|
||||
|
||||
if (color == 1)
|
||||
return colors[7] + text.Trim();
|
||||
else
|
||||
return text;
|
||||
}
|
||||
*/
|
||||
|
||||
#endregion Teletext
|
||||
|
||||
private bool ImportSubtitleFromMp4(string fileName)
|
||||
{
|
||||
var mp4Parser = new MP4Parser(fileName);
|
||||
|
21
src/Forms/TransportStreamSubtitleChooser.Designer.cs
generated
21
src/Forms/TransportStreamSubtitleChooser.Designer.cs
generated
@ -42,6 +42,7 @@
|
||||
this.buttonOK = new System.Windows.Forms.Button();
|
||||
this.listBoxSubtitles = new System.Windows.Forms.ListBox();
|
||||
this.pictureBox1 = new System.Windows.Forms.PictureBox();
|
||||
this.textBoxTeletext = new System.Windows.Forms.TextBox();
|
||||
this.contextMenuStripListview.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
@ -63,7 +64,7 @@
|
||||
this.listBoxTracks.FormattingEnabled = true;
|
||||
this.listBoxTracks.Location = new System.Drawing.Point(13, 31);
|
||||
this.listBoxTracks.Name = "listBoxTracks";
|
||||
this.listBoxTracks.Size = new System.Drawing.Size(589, 82);
|
||||
this.listBoxTracks.Size = new System.Drawing.Size(589, 134);
|
||||
this.listBoxTracks.TabIndex = 51;
|
||||
this.listBoxTracks.SelectedIndexChanged += new System.EventHandler(this.listBoxTracks_SelectedIndexChanged);
|
||||
//
|
||||
@ -150,9 +151,9 @@
|
||||
this.listBoxSubtitles.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.listBoxSubtitles.FormattingEnabled = true;
|
||||
this.listBoxSubtitles.Location = new System.Drawing.Point(12, 119);
|
||||
this.listBoxSubtitles.Location = new System.Drawing.Point(12, 171);
|
||||
this.listBoxSubtitles.Name = "listBoxSubtitles";
|
||||
this.listBoxSubtitles.Size = new System.Drawing.Size(589, 199);
|
||||
this.listBoxSubtitles.Size = new System.Drawing.Size(589, 147);
|
||||
this.listBoxSubtitles.TabIndex = 53;
|
||||
this.listBoxSubtitles.SelectedIndexChanged += new System.EventHandler(this.listBoxSubtitles_SelectedIndexChanged);
|
||||
//
|
||||
@ -167,11 +168,24 @@
|
||||
this.pictureBox1.TabIndex = 54;
|
||||
this.pictureBox1.TabStop = false;
|
||||
//
|
||||
// textBoxTeletext
|
||||
//
|
||||
this.textBoxTeletext.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.textBoxTeletext.Location = new System.Drawing.Point(12, 167);
|
||||
this.textBoxTeletext.Multiline = true;
|
||||
this.textBoxTeletext.Name = "textBoxTeletext";
|
||||
this.textBoxTeletext.ReadOnly = true;
|
||||
this.textBoxTeletext.Size = new System.Drawing.Size(589, 273);
|
||||
this.textBoxTeletext.TabIndex = 61;
|
||||
//
|
||||
// TransportStreamSubtitleChooser
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(613, 483);
|
||||
this.Controls.Add(this.textBoxTeletext);
|
||||
this.Controls.Add(this.pictureBox1);
|
||||
this.Controls.Add(this.listBoxSubtitles);
|
||||
this.Controls.Add(this.labelChoose);
|
||||
@ -210,5 +224,6 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem vobSubToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem dOSTToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem saveAllImagesWithHtmlIndexViewToolStripMenuItem;
|
||||
private System.Windows.Forms.TextBox textBoxTeletext;
|
||||
}
|
||||
}
|
@ -12,6 +12,23 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
{
|
||||
public partial class TransportStreamSubtitleChooser : PositionAndSizeForm
|
||||
{
|
||||
public int SelectedIndex => listBoxTracks.SelectedIndex;
|
||||
public bool IsTeletext { get; private set; }
|
||||
public string Srt { get; private set; }
|
||||
|
||||
public class StreamTrackItem
|
||||
{
|
||||
public string Text { get; set; }
|
||||
public bool IsTeletext { get; set; }
|
||||
public string Srt { get; set; }
|
||||
public int Pid { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Text;
|
||||
}
|
||||
}
|
||||
|
||||
private TransportStreamParser _tsParser;
|
||||
private string _fileName;
|
||||
private ProgramMapTableParser _programMapTableParser;
|
||||
@ -63,18 +80,55 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
var language = _programMapTableParser.GetSubtitleLanguage(id);
|
||||
if (!string.IsNullOrEmpty(language))
|
||||
{
|
||||
listBoxTracks.Items.Add(string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.PidLine, id + ", " + language, tsParser.GetDvbSubtitles(id).Count));
|
||||
listBoxTracks.Items.Add(new StreamTrackItem
|
||||
{
|
||||
Text = string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.PidLine, id + ", " + language, tsParser.GetDvbSubtitles(id).Count),
|
||||
IsTeletext = false,
|
||||
Pid = id
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
listBoxTracks.Items.Add(string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.PidLine, id, tsParser.GetDvbSubtitles(id).Count));
|
||||
listBoxTracks.Items.Add(new StreamTrackItem
|
||||
{
|
||||
Text = string.Format(Configuration.Settings.Language.TransportStreamSubtitleChooser.PidLine, id, tsParser.GetDvbSubtitles(id).Count),
|
||||
IsTeletext = false,
|
||||
Pid = id
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var program in tsParser.TeletextSubtitlesLookup)
|
||||
{
|
||||
var language = _programMapTableParser.GetSubtitleLanguage(program.Key);
|
||||
foreach (var kvp in program.Value)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(language))
|
||||
{
|
||||
listBoxTracks.Items.Add(new StreamTrackItem
|
||||
{
|
||||
Text = "Teletext program " + program.Key + " page " + kvp.Key + " in " + language,
|
||||
IsTeletext = true,
|
||||
Pid = program.Key,
|
||||
Srt = kvp.Value.ToString()
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
listBoxTracks.Items.Add(new StreamTrackItem
|
||||
{
|
||||
Text = "Teletext program " + program.Key + " page " + kvp.Key,
|
||||
IsTeletext = true,
|
||||
Pid = program.Key,
|
||||
Srt = kvp.Value.ToString()
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
listBoxTracks.SelectedIndex = 0;
|
||||
}
|
||||
|
||||
public int SelectedIndex => listBoxTracks.SelectedIndex;
|
||||
|
||||
private void listBoxTracks_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
int idx = listBoxTracks.SelectedIndex;
|
||||
@ -83,6 +137,20 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
return;
|
||||
}
|
||||
|
||||
var item = (StreamTrackItem)listBoxTracks.SelectedItem;
|
||||
if (item.IsTeletext)
|
||||
{
|
||||
|
||||
textBoxTeletext.Visible = true;
|
||||
textBoxTeletext.Text = item.Srt;
|
||||
IsTeletext = true;
|
||||
Srt = item.Srt;
|
||||
return;
|
||||
}
|
||||
|
||||
IsTeletext = false;
|
||||
Srt = string.Empty;
|
||||
textBoxTeletext.Visible = false;
|
||||
listBoxSubtitles.Items.Clear();
|
||||
int pid = _tsParser.SubtitlePacketIds[idx];
|
||||
var list = _tsParser.GetDvbSubtitles(pid);
|
||||
@ -203,7 +271,6 @@ namespace Nikse.SubtitleEdit.Forms
|
||||
exportBdnXmlPng.ShowDialog(this);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SaveAllImagesWithHtmlIndexViewToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
|
Loading…
Reference in New Issue
Block a user