Working on new format

This commit is contained in:
niksedk 2015-07-28 14:49:32 +02:00
parent f93f403759
commit 59092722cc

View File

@ -1,4 +1,8 @@
using Nikse.SubtitleEdit.Core; // WORK IN PROGRESS - DO NOT REFACTOR //
// WORK IN PROGRESS - DO NOT REFACTOR //
// WORK IN PROGRESS - DO NOT REFACTOR //
using Nikse.SubtitleEdit.Core;
using Nikse.SubtitleEdit.Logic.TransportStream; using Nikse.SubtitleEdit.Logic.TransportStream;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -84,7 +88,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
RegionStyles = new List<RegionStyle>(NumberOfRegionStyles); RegionStyles = new List<RegionStyle>(NumberOfRegionStyles);
for (int i = 0; i < NumberOfRegionStyles; i++) for (int i = 0; i < NumberOfRegionStyles; i++)
{ {
var rs = new RegionStyle() var rs = new RegionStyle
{ {
RegionStyleId = buffer[idx], RegionStyleId = buffer[idx],
RegionHorizontalPosition = (buffer[idx + 1] << 8) + buffer[idx + 2], RegionHorizontalPosition = (buffer[idx + 1] << 8) + buffer[idx + 2],
@ -113,7 +117,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
UserStyles = new List<UserStyle>(NumberOfUserStyles); UserStyles = new List<UserStyle>(NumberOfUserStyles);
for (int j= 0; j < NumberOfUserStyles; j++) for (int j= 0; j < NumberOfUserStyles; j++)
{ {
var us = new UserStyle() var us = new UserStyle
{ {
UserStyleId = buffer[idx], UserStyleId = buffer[idx],
RegionHorizontalPositionDirection = buffer[idx + 1] >> 7, RegionHorizontalPositionDirection = buffer[idx + 1] >> 7,
@ -143,7 +147,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
idx += 2; idx += 2;
for (int i = 0; i < numberOfPalettees; i++) for (int i = 0; i < numberOfPalettees; i++)
{ {
var palette = new Palette() var palette = new Palette
{ {
PaletteEntryId = buffer[idx], PaletteEntryId = buffer[idx],
Y = buffer[idx + 1], Y = buffer[idx + 1],
@ -170,13 +174,13 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
{ {
public DialogPresentationSegment(byte[] buffer) public DialogPresentationSegment(byte[] buffer)
{ {
StartPts = (ulong)buffer[13]; StartPts = buffer[13];
StartPts += (ulong)buffer[12] << 8; StartPts += (ulong)buffer[12] << 8;
StartPts += (ulong)buffer[11] << 16; StartPts += (ulong)buffer[11] << 16;
StartPts += (ulong)buffer[10] << 24; StartPts += (ulong)buffer[10] << 24;
StartPts += (ulong)(buffer[9] & Helper.B00000001) << 32; StartPts += (ulong)(buffer[9] & Helper.B00000001) << 32;
EndPts = (ulong)buffer[18]; EndPts = buffer[18];
EndPts += (ulong)buffer[17] << 8; EndPts += (ulong)buffer[17] << 8;
EndPts += (ulong)buffer[16] << 16; EndPts += (ulong)buffer[16] << 16;
EndPts += (ulong)buffer[15] << 24; EndPts += (ulong)buffer[15] << 24;
@ -195,9 +199,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
Regions = new List<SubtitleRegion>(numberOfRegions); Regions = new List<SubtitleRegion>(numberOfRegions);
for (int i = 0; i < numberOfRegions; i++) for (int i = 0; i < numberOfRegions; i++)
{ {
var region = new SubtitleRegion(); var region = new SubtitleRegion { ContinuousPresentation = (buffer[idx] & Helper.B10000000) > 0, Forced = (buffer[idx] & Helper.B01000000) > 0 };
region.ContinuousPresentation = (buffer[idx] & Helper.B10000000) > 0;
region.Forced = (buffer[idx] & Helper.B01000000) > 0;
idx++; idx++;
region.RegionStyleId = buffer[idx]; region.RegionStyleId = buffer[idx];
idx++; idx++;
@ -217,7 +219,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
processedLength += 3; processedLength += 3;
if (dataType == 0x01) // Text if (dataType == 0x01) // Text
{ {
string text = System.Text.Encoding.UTF8.GetString(buffer, idx, dataLength); string text = Encoding.UTF8.GetString(buffer, idx, dataLength);
region.Texts.Add(text); region.Texts.Add(text);
} }
else if (dataType == 0x02) // Change a font set else if (dataType == 0x02) // Change a font set
@ -315,10 +317,9 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
} }
private const int TextSubtitleStreamPID = 0x1800; private const int TextSubtitleStreamPid = 0x1800;
private const byte SegmentTypeDialogStyle = 0x81; private const byte SegmentTypeDialogStyle = 0x81;
private const byte SegmentTypeDialogPresentation = 0x82; private const byte SegmentTypeDialogPresentation = 0x82;
List<Packet> SubtitlePackets;
public override string Extension public override string Extension
{ {
@ -364,9 +365,9 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
public void LoadSubtitle(Subtitle subtitle, Stream ms) public void LoadSubtitle(Subtitle subtitle, Stream ms)
{ {
var SubtitlePackets = new List<Packet>(); var subtitlePackets = new List<Packet>();
const int packetLength = 188; const int packetLength = 188;
bool IsM2TransportStream = DetectFormat(ms); bool isM2TransportStream = DetectFormat(ms);
var packetBuffer = new byte[packetLength]; var packetBuffer = new byte[packetLength];
var m2TsTimeCodeBuffer = new byte[4]; var m2TsTimeCodeBuffer = new byte[4];
long position = 0; long position = 0;
@ -382,7 +383,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
while (position < transportStreamLength) while (position < transportStreamLength)
{ {
ms.Seek(position, SeekOrigin.Begin); ms.Seek(position, SeekOrigin.Begin);
if (IsM2TransportStream) if (isM2TransportStream)
{ {
ms.Read(m2TsTimeCodeBuffer, 0, m2TsTimeCodeBuffer.Length); ms.Read(m2TsTimeCodeBuffer, 0, m2TsTimeCodeBuffer.Length);
var tc = (m2TsTimeCodeBuffer[0] << 24) + (m2TsTimeCodeBuffer[1] << 16) + (m2TsTimeCodeBuffer[2] << 8) + (m2TsTimeCodeBuffer[3] & Helper.B00111111); var tc = (m2TsTimeCodeBuffer[0] << 24) + (m2TsTimeCodeBuffer[1] << 16) + (m2TsTimeCodeBuffer[2] << 8) + (m2TsTimeCodeBuffer[3] & Helper.B00111111);
@ -398,9 +399,9 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
if (syncByte == Packet.SynchronizationByte) if (syncByte == Packet.SynchronizationByte)
{ {
var packet = new Packet(packetBuffer); var packet = new Packet(packetBuffer);
if (packet.PacketId == TextSubtitleStreamPID) if (packet.PacketId == TextSubtitleStreamPid)
{ {
SubtitlePackets.Add(packet); subtitlePackets.Add(packet);
} }
position += packetLength; position += packetLength;
} }
@ -413,7 +414,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
//TODO: merge ts packets //TODO: merge ts packets
DialogStyleSegment dss; DialogStyleSegment dss;
foreach (var item in SubtitlePackets) foreach (var item in subtitlePackets)
{ {
if (item.Payload != null && item.Payload.Length > 10 && VobSub.VobSubParser.IsPrivateStream2(item.Payload, 0)) if (item.Payload != null && item.Payload.Length > 10 && VobSub.VobSubParser.IsPrivateStream2(item.Payload, 0))
{ {