Chatwalker
13th November 2002, 13:43
Hi @ all
I want decompress run-lenght-encodet Subpicturestreams to BMP.
I'am able to read each subtitle PES packet from the VOB into an array (Subtitle.Packet[]) and seperate
its controlsequences with the code below. Now i have all information about the subtitle including
the Offsets to both run-lenght-encodet pictures (interlaced) in the array.
Can anyone explain how to decompress the picture to BMP? I found only 1 document on the internet and with
this i was'nt able to do.
Regards
Chatwalker
DataSize = CDbl(Subtitle.Packet(2)) * 256 + Subtitle.Packet(3)
Pointer = DataSize 'first Control-Sequence
'control sequence
cseqNext = 0
cseqNextOld = 0
Do
cseqNextOld = cseqNext
cseqDate = CDbl(Subtitle.Packet(Pointer)) * 256 + Subtitle.Packet(Pointer + 1)
cseqNext = CDbl(Subtitle.Packet(Pointer + 2)) * 256 + Subtitle.Packet(Pointer + 3)
Pointer = Pointer + 4
Do
cseqCommand = Subtitle.Packet(Pointer)
Select Case cseqCommand
'forced Start (1Byte)
Case 0:
Pointer = Pointer + 1
StartTime = Frames2Time(((Int((Subtitle.PTS - VideoStreamDetails.PTS) / 90) + (cseqDate * 10)) * VideoStreamDetails.Framerate) / 1000, VideoStreamDetails.Framerate)
Forced = "Yes"
'non-forced Start (1Byte)
Case 1:
Pointer = Pointer + 1
StartTime = Frames2Time(((Int((Subtitle.PTS - VideoStreamDetails.PTS) / 90) + (cseqDate * 10)) * VideoStreamDetails.Framerate) / 1000, VideoStreamDetails.Framerate)
Forced = "No"
'Stop (1Byte)
Case 2:
Pointer = Pointer + 1
StopTime = Frames2Time(((Int((Subtitle.PTS - VideoStreamDetails.PTS) / 90) + (cseqDate * 10)) * VideoStreamDetails.Framerate) / 1000, VideoStreamDetails.Framerate)
'Color (1Byte + 2Bytes Arg)
Case 3:
Pointer = Pointer + 3
'Transparancy (1Byte + 2Bytes Arg)
Case 4:
Pointer = Pointer + 3
'SubSize (1Byte + 6Bytes Arg)
Case 5:
Left = CLng(Subtitle.Packet(Pointer + 1) * 16) + Int(Subtitle.Packet(Pointer + 2) / 16)
Right = CLng(Subtitle.Packet(Pointer + 2) Mod 16) * 256 + Subtitle.Packet(Pointer + 3)
Top = CLng(Subtitle.Packet(Pointer + 4) * 16) + Int(Subtitle.Packet(Pointer + 5) / 16)
Bottom = CLng(Subtitle.Packet(Pointer + 5) Mod 16) * 256 + Subtitle.Packet(Pointer + 6)
SubSizeX = LastColumn - FirstColumn + 1
SubSizeY = LastLine - FirstLine + 1
Pointer = Pointer + 7
'Offset (1Byte + 4Bytes Arg)
Case 6:
FirstOffset = CDbl(Subtitle.Packet(Pointer + 1)) * 256 + Subtitle.Packet(Pointer + 2)
SecondOffset = CDbl(Subtitle.Packet(Pointer + 3)) * 256 + Subtitle.Packet(Pointer + 4)
Pointer = Pointer + 5
'End (1Byte)
Case 255:
Pointer = Pointer + 1
'Unknown Command
Case Else:
Exit Sub
End Select
Loop While cseqCommand <> 255
Loop Until (cseqNext = cseqNextOld) Or (Pointer >= Subtitle.PacketLenght - 1)
I want decompress run-lenght-encodet Subpicturestreams to BMP.
I'am able to read each subtitle PES packet from the VOB into an array (Subtitle.Packet[]) and seperate
its controlsequences with the code below. Now i have all information about the subtitle including
the Offsets to both run-lenght-encodet pictures (interlaced) in the array.
Can anyone explain how to decompress the picture to BMP? I found only 1 document on the internet and with
this i was'nt able to do.
Regards
Chatwalker
DataSize = CDbl(Subtitle.Packet(2)) * 256 + Subtitle.Packet(3)
Pointer = DataSize 'first Control-Sequence
'control sequence
cseqNext = 0
cseqNextOld = 0
Do
cseqNextOld = cseqNext
cseqDate = CDbl(Subtitle.Packet(Pointer)) * 256 + Subtitle.Packet(Pointer + 1)
cseqNext = CDbl(Subtitle.Packet(Pointer + 2)) * 256 + Subtitle.Packet(Pointer + 3)
Pointer = Pointer + 4
Do
cseqCommand = Subtitle.Packet(Pointer)
Select Case cseqCommand
'forced Start (1Byte)
Case 0:
Pointer = Pointer + 1
StartTime = Frames2Time(((Int((Subtitle.PTS - VideoStreamDetails.PTS) / 90) + (cseqDate * 10)) * VideoStreamDetails.Framerate) / 1000, VideoStreamDetails.Framerate)
Forced = "Yes"
'non-forced Start (1Byte)
Case 1:
Pointer = Pointer + 1
StartTime = Frames2Time(((Int((Subtitle.PTS - VideoStreamDetails.PTS) / 90) + (cseqDate * 10)) * VideoStreamDetails.Framerate) / 1000, VideoStreamDetails.Framerate)
Forced = "No"
'Stop (1Byte)
Case 2:
Pointer = Pointer + 1
StopTime = Frames2Time(((Int((Subtitle.PTS - VideoStreamDetails.PTS) / 90) + (cseqDate * 10)) * VideoStreamDetails.Framerate) / 1000, VideoStreamDetails.Framerate)
'Color (1Byte + 2Bytes Arg)
Case 3:
Pointer = Pointer + 3
'Transparancy (1Byte + 2Bytes Arg)
Case 4:
Pointer = Pointer + 3
'SubSize (1Byte + 6Bytes Arg)
Case 5:
Left = CLng(Subtitle.Packet(Pointer + 1) * 16) + Int(Subtitle.Packet(Pointer + 2) / 16)
Right = CLng(Subtitle.Packet(Pointer + 2) Mod 16) * 256 + Subtitle.Packet(Pointer + 3)
Top = CLng(Subtitle.Packet(Pointer + 4) * 16) + Int(Subtitle.Packet(Pointer + 5) / 16)
Bottom = CLng(Subtitle.Packet(Pointer + 5) Mod 16) * 256 + Subtitle.Packet(Pointer + 6)
SubSizeX = LastColumn - FirstColumn + 1
SubSizeY = LastLine - FirstLine + 1
Pointer = Pointer + 7
'Offset (1Byte + 4Bytes Arg)
Case 6:
FirstOffset = CDbl(Subtitle.Packet(Pointer + 1)) * 256 + Subtitle.Packet(Pointer + 2)
SecondOffset = CDbl(Subtitle.Packet(Pointer + 3)) * 256 + Subtitle.Packet(Pointer + 4)
Pointer = Pointer + 5
'End (1Byte)
Case 255:
Pointer = Pointer + 1
'Unknown Command
Case Else:
Exit Sub
End Select
Loop While cseqCommand <> 255
Loop Until (cseqNext = cseqNextOld) Or (Pointer >= Subtitle.PacketLenght - 1)