Beispiel #1
0
            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);
                }
            }
Beispiel #2
0
 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();
     }
 }
Beispiel #3
0
            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);
                }
            }