Ejemplo n.º 1
0
        public void CheckTimeCodes()
        {
            var subtitle = new Subtitle();

            subtitle.Paragraphs.Add(new Paragraph("Line1", 1000, 5000));
            subtitle.Paragraphs.Add(new Paragraph("Line2", 6000, 8000));
            subtitle.Paragraphs.Add(new Paragraph("Line2", 8000, 12000));

            string text = @"Scenarist_SCC V1.0

00:00:00:00	94ae 94ae 9420 9420 9476 9476 2080 4ce9 6ee5 3180 

00:00:00:12	942c 942c 

00:00:01:00	942f 942f 

00:00:01:04	94ae 94ae 9420 9420 9476 9476 2080 4ce9 6ee5 3280 

00:00:02:00	942c 942c 

00:00:03:00	942f 942f 

00:00:03:04	94ae 94ae 9420 9420 9476 9476 2080 4ce9 6ee5 b380 

00:00:04:00	942c 942c 

00:00:05:00	942f 942f 

00:00:06:00	942c 942c "    ;

            var expected = new Subtitle();

            expected.Paragraphs.Add(new Paragraph("Line1",
                                                  TimeCode.ParseHHMMSSFFToMilliseconds("00:00:01:00"), TimeCode.ParseHHMMSSFFToMilliseconds("00:00:02:00")));
            expected.Paragraphs.Add(new Paragraph("Line2",
                                                  TimeCode.ParseHHMMSSFFToMilliseconds("00:00:03:00"), TimeCode.ParseHHMMSSFFToMilliseconds("00:00:04:00")));
            expected.Paragraphs.Add(new Paragraph("Line3",
                                                  TimeCode.ParseHHMMSSFFToMilliseconds("00:00:05:00"), TimeCode.ParseHHMMSSFFToMilliseconds("00:00:06:00")));

            var actual = new Subtitle();

            List <string> lines = new List <string>();

            foreach (string line in text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
            {
                lines.Add(line);
            }

            var target = new ScenaristClosedCaptions();

            target.LoadSubtitle(actual, lines, null);

            Assert.AreEqual(expected.Paragraphs.Count, actual.Paragraphs.Count);
            for (int i = 0; i < expected.Paragraphs.Count; i++)
            {
                var expectedP = expected.Paragraphs[i];
                var actualP   = actual.Paragraphs[i];
                Assert.AreEqual(expectedP.Text, actualP.Text, "text index: " + i);
                Assert.AreEqual(expectedP.StartTime.TotalMilliseconds, actualP.StartTime.TotalMilliseconds, 1, "start index: " + i);
                Assert.AreEqual(expectedP.EndTime.TotalMilliseconds, actualP.EndTime.TotalMilliseconds, 1, "end index: " + i);
            }
        }
Ejemplo n.º 2
0
        public void CheckTimeCodes()
        {
            var target   = new ScenaristClosedCaptions();
            var subtitle = new Subtitle();

            subtitle.Paragraphs.Add(new Paragraph("Line1", 1000, 5000));
            subtitle.Paragraphs.Add(new Paragraph("Line2", 6000, 8000));
            subtitle.Paragraphs.Add(new Paragraph("Line2", 8000, 12000));

            const string text = @"Scenarist_SCC V1.0

01:00:00:24 9420 94f8 5bc1 4c45 5254 20d3 4fd5 cec4 49ce c75d 9420 942c 942f 9420 94f2 4f43 544f cec1 d554 d320 544f 20d9 4fd5 5220 d354 c154 494f ced3 a180

01:00:02:22 9420 942c 942f

01:00:04:25 9420 94f4 c2c1 52ce c143 4c45 d3a1

01:00:05:10 942c

01:00:06:14 9420 942c 942f

01:00:07:06 9420 9476 cb57 c1da 4949 a180

01:00:08:24 9420 942c 942f 9420 9476 d045 d34f a180

01:00:10:03 9420 942c 942f

01:00:11:29 942c

01:00:37:12 9420 9470 4558 d04c 4f52 45a1

01:00:39:00 9420 942c 942f 9420 9476 5245 d343 d545 a180

01:00:40:00 9420 942c 942f 9420 947a d052 4f54 4543 54a1

01:00:41:00 9420 942c 942f

01:00:41:10 9420 9154 4f43 544f cec1 d554 d3a1

01:00:42:28 9420 942c 942f

01:00:44:26 942c

01:00:47:03 9420 9152 a254 c845 204f 4354 4fce c1d5 54d3 20c1 cec4 91f2 54c8 4520 c749 c1ce 5420 cb45 4cd0 2046 4f52 45d3 54ae a280

01:00:49:00 9420 942c 942f

01:00:52:04 942c";

            var sub2 = new Subtitle();

            var lines = new List <string>();

            foreach (string line in text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
            {
                lines.Add(line);
            }

            target.LoadSubtitle(sub2, lines, null);

            var copy = new Subtitle(sub2);

            for (int i = 0; i < copy.Paragraphs.Count; i++)
            {
                sub2.Paragraphs[i].StartTime.TotalMilliseconds += 1000;
                sub2.Paragraphs[i].EndTime.TotalMilliseconds   += 1000;
            }
            for (int i = 0; i < copy.Paragraphs.Count; i++)
            {
                Assert.IsTrue(Math.Abs(copy.Paragraphs[i].StartTime.TotalMilliseconds + 1000 - sub2.Paragraphs[i].StartTime.TotalMilliseconds) < 0.001);
                Assert.IsTrue(Math.Abs(copy.Paragraphs[i].EndTime.TotalMilliseconds + 1000 - sub2.Paragraphs[i].EndTime.TotalMilliseconds) < 0.001);
            }
        }
Ejemplo n.º 3
0
        private void ReadText(FileStream fs, ulong offset, string handlerType)
        {
            fs.Seek((long)offset, SeekOrigin.Begin);
            var data = new byte[4];

            fs.Read(data, 0, 2);
            uint textSize = (uint)GetWord(data, 0);

            if (handlerType == "subp") // VobSub created with Mp4Box
            {
                if (textSize > 100)
                {
                    fs.Seek((long)offset, SeekOrigin.Begin);
                    data = new byte[textSize + 2];
                    fs.Read(data, 0, data.Length);
                    SubPictures.Add(new SubPicture(data)); // TODO: Where is palette?
                }
            }
            else
            {
                if (textSize == 0)
                {
                    fs.Read(data, 2, 2);
                    textSize = GetUInt(data, 0); // don't get it exactly - seems like mp4box sometimes uses 2 bytes length field (first text record only)... handbrake uses 4 bytes
                }
                if (textSize > 0 && textSize < 500)
                {
                    data = new byte[textSize];
                    fs.Read(data, 0, data.Length);
                    string text = GetString(data, 0, (int)textSize).TrimEnd();

                    if (_mdia.IsClosedCaption)
                    {
                        var sb = new StringBuilder();
                        for (int j = 8; j < data.Length - 3; j++)
                        {
                            string h = data[j].ToString("X2").ToLower();
                            if (h.Length < 2)
                            {
                                h = "0" + h;
                            }
                            sb.Append(h);
                            if (j % 2 == 1)
                            {
                                sb.Append(' ');
                            }
                        }
                        string hex        = sb.ToString();
                        int    errorCount = 0;
                        text = ScenaristClosedCaptions.GetSccText(hex, ref errorCount);
                        if (text.StartsWith('n') && text.Length > 1)
                        {
                            text = "<i>" + text.Substring(1) + "</i>";
                        }
                        if (text.StartsWith("-n", StringComparison.Ordinal))
                        {
                            text = text.Remove(0, 2);
                        }
                        if (text.StartsWith("-N"))
                        {
                            text = text.Remove(0, 2);
                        }
                        if (text.StartsWith('-') && !text.Contains(Environment.NewLine + "-"))
                        {
                            text = text.Remove(0, 1);
                        }
                    }
                    Texts.Add(text.Replace(Environment.NewLine, "\n").Replace("\n", Environment.NewLine));
                }
                else
                {
                    Texts.Add(string.Empty);
                }
            }
        }