public DialogPresentationSegment(byte[] buffer) { StartPts = buffer[13]; StartPts += (ulong)buffer[12] << 8; StartPts += (ulong)buffer[11] << 16; StartPts += (ulong)buffer[10] << 24; StartPts += (ulong)(buffer[9] & Helper.B00000001) << 32; EndPts = buffer[18]; EndPts += (ulong)buffer[17] << 8; EndPts += (ulong)buffer[16] << 16; EndPts += (ulong)buffer[15] << 24; EndPts += (ulong)(buffer[14] & Helper.B00000001) << 32; PaletteUpdate = (buffer[19] & Helper.B10000000) > 0; int idx = 20; PaletteUpdates = new List<Palette>(); if (PaletteUpdate) { int numberOfPaletteEntries = buffer[21] + (buffer[20] << 8); for (int i = 0; i < numberOfPaletteEntries; i++) { PaletteUpdates.Add(new Palette { PaletteEntryId = buffer[idx++], Y = buffer[idx++], Cr = buffer[idx++], Cb = buffer[idx++], T = buffer[idx++] }); } } int numberOfRegions = buffer[idx++]; Regions = new List<SubtitleRegion>(numberOfRegions); for (int i = 0; i < numberOfRegions; i++) { var region = new SubtitleRegion { ContinuousPresentation = (buffer[idx] & Helper.B10000000) > 0, Forced = (buffer[idx] & Helper.B01000000) > 0 }; idx++; region.RegionStyleId = buffer[idx++]; int regionSubtitleLength = buffer[idx + 1] + (buffer[idx] << 8); idx += 2; int processedLength = 0; region.Texts = new List<string>(); region.Content = new List<SubtitleRegionContent>(); string endStyle = string.Empty; while (processedLength < regionSubtitleLength) { byte escapeCode = buffer[idx++]; byte dataType = buffer[idx++]; byte dataLength = buffer[idx++]; processedLength += 3; if (dataType == 0x01) // Text { string text = Encoding.UTF8.GetString(buffer, idx, dataLength); region.Texts.Add(text); region.Content.Add(new SubtitleRegionContentText { EscapeCode = escapeCode, DataType = dataType, DataLength = dataLength, Text = text }); } else if (dataType == 0x02) // Change a font set { region.Content.Add(new SubtitleRegionContentChangeFontSet { EscapeCode = escapeCode, DataType = dataType, DataLength = dataLength, FontId = buffer[idx] }); } else if (dataType == 0x03) // Change a font style { var fontStyle = buffer[idx]; var fontOutlinePaletteId = buffer[idx + 1]; var fontOutlineThickness = buffer[idx + 2]; switch (fontStyle) { case 1: region.Texts.Add("<b>"); endStyle = "</b>"; break; case 2: region.Texts.Add("<i>"); endStyle = "</i>"; break; case 3: region.Texts.Add("<b><i>"); endStyle = "</i></b>"; break; case 5: region.Texts.Add("<b>"); endStyle = "</b>"; break; case 6: region.Texts.Add("<i>"); endStyle = "</i>"; break; case 7: region.Texts.Add("<b><i>"); endStyle = "</i></b>"; break; } region.Content.Add(new SubtitleRegionContentChangeFontStyle { EscapeCode = escapeCode, DataType = dataType, DataLength = dataLength, FontStyle = fontStyle, FontOutlinePaletteId = fontOutlinePaletteId, FontOutlineThickness = fontOutlineThickness }); } else if (dataType == 0x04) // Change a font size { region.Content.Add(new SubtitleRegionContentChangeFontSize { EscapeCode = escapeCode, DataType = dataType, DataLength = dataLength, FontSize = buffer[idx] }); } else if (dataType == 0x05) // Change a font color { region.Content.Add(new SubtitleRegionContentChangeFontColor { EscapeCode = escapeCode, DataType = dataType, DataLength = dataLength, FontPaletteId = buffer[idx] }); } else if (dataType == 0x0A) // Line break { region.Texts.Add(Environment.NewLine); region.Content.Add(new SubtitleRegionContentLineBreak { EscapeCode = escapeCode, DataType = dataType, DataLength = dataLength, }); } else if (dataType == 0x0B) // End of inline style { if (!string.IsNullOrEmpty(endStyle)) { region.Texts.Add(endStyle); endStyle = string.Empty; } region.Content.Add(new SubtitleRegionContentEndOfInlineStyle { EscapeCode = escapeCode, DataType = dataType, DataLength = dataLength, }); } processedLength += dataLength; idx += dataLength; } if (!string.IsNullOrEmpty(endStyle)) { region.Texts.Add(endStyle); } Regions.Add(region); } }
private static byte[] MakeSubtitleRegionContent(SubtitleRegion subtitleRegion) { using (var ms = new MemoryStream()) { foreach (var content in subtitleRegion.Content) { ms.WriteByte((byte)content.EscapeCode); // escape code (0x1b / 27) ms.WriteByte((byte)content.DataType); ms.WriteByte((byte)content.DataLength); content.WriteExtraToStream(ms); } return ms.ToArray(); } }
public DialogPresentationSegment(byte[] buffer) { StartPts = buffer[13]; StartPts += (ulong)buffer[12] << 8; StartPts += (ulong)buffer[11] << 16; StartPts += (ulong)buffer[10] << 24; StartPts += (ulong)(buffer[9] & Helper.B00000001) << 32; EndPts = buffer[18]; EndPts += (ulong)buffer[17] << 8; EndPts += (ulong)buffer[16] << 16; EndPts += (ulong)buffer[15] << 24; EndPts += (ulong)(buffer[14] & Helper.B00000001) << 32; PaletteUpdate = (buffer[19] & Helper.B10000000) > 0; int idx = 20; if (PaletteUpdate) { NumberOfPaletteEntries = buffer[21] + (buffer[20] << 8); idx += NumberOfPaletteEntries * 5; } int numberOfRegions = buffer[idx++]; Regions = new List<SubtitleRegion>(numberOfRegions); for (int i = 0; i < numberOfRegions; i++) { var region = new SubtitleRegion { ContinuousPresentation = (buffer[idx] & Helper.B10000000) > 0, Forced = (buffer[idx] & Helper.B01000000) > 0 }; idx++; region.RegionStyleId = buffer[idx++]; int regionSubtitleLength = buffer[idx + 1] + (buffer[idx] << 8); idx += 2; int processedLength = 0; region.Texts = new List<string>(); string endStyle = string.Empty; while (processedLength < regionSubtitleLength) { byte escapeCode = buffer[idx++]; byte dataType = buffer[idx++]; byte dataLength = buffer[idx++]; processedLength += 3; if (dataType == 0x01) // Text { string text = Encoding.UTF8.GetString(buffer, idx, dataLength); region.Texts.Add(text); } else if (dataType == 0x02) // Change a font set { System.Diagnostics.Debug.WriteLine("font set"); } else if (dataType == 0x03) // Change a font style { System.Diagnostics.Debug.WriteLine("font style"); var fontStyle = buffer[idx]; switch (fontStyle) { case 1: region.Texts.Add("<b>"); endStyle = "</b>"; break; case 2: region.Texts.Add("<i>"); endStyle = "</i>"; break; case 3: region.Texts.Add("<b><i>"); endStyle = "</i></b>"; break; case 5: region.Texts.Add("<b>"); endStyle = "</b>"; break; case 6: region.Texts.Add("<i>"); endStyle = "</i>"; break; case 7: region.Texts.Add("<b><i>"); endStyle = "</i></b>"; break; } } else if (dataType == 0x04) // Change a font size { System.Diagnostics.Debug.WriteLine("font size"); } else if (dataType == 0x05) // Change a font color { System.Diagnostics.Debug.WriteLine("font color"); } else if (dataType == 0x0A) // Line break { region.Texts.Add(Environment.NewLine); } else if (dataType == 0x0B) // End of inline style { System.Diagnostics.Debug.WriteLine("End inline style"); if (!string.IsNullOrEmpty(endStyle)) { region.Texts.Add(endStyle); endStyle = string.Empty; } } processedLength += dataLength; idx += dataLength; } if (!string.IsNullOrEmpty(endStyle)) { region.Texts.Add(endStyle); } Regions.Add(region); } }