Work on teletext

This commit is contained in:
Nikolaj Olsson 2019-10-27 07:50:52 +01:00
parent 94c6143c07
commit cc8c0025af
7 changed files with 238 additions and 224 deletions

View File

@ -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)
{

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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);
@ -178,7 +246,7 @@ namespace Nikse.SubtitleEdit.Forms
if (list.Count > 0)
{
using (var bmp = list[0].GetBitmap())
{
{
return new Point(bmp.Width, bmp.Height);
}
}
@ -203,7 +271,6 @@ namespace Nikse.SubtitleEdit.Forms
exportBdnXmlPng.ShowDialog(this);
}
}
}
private void SaveAllImagesWithHtmlIndexViewToolStripMenuItem_Click(object sender, EventArgs e)