From 2bbf9448f1059a284c8289b03cc49544b56bf96c Mon Sep 17 00:00:00 2001 From: Bence Varga Date: Wed, 30 Dec 2020 15:59:42 +0100 Subject: [PATCH 1/3] Reader test. --- .../czentral/incubator/streamm/HexDump.java | 5 +- .../org/czentral/minirtmp/AMFDecoder.java | 2 +- .../czentral/minirtmp/ApplicationContext.java | 2 +- .../czentral/minirtmp/HandshakeProcessor.java | 2 +- .../minirtmp/RTMPStreamProcessor.java | 17 ++-- .../org/czentral/minirtmp/RtmpPacket.java | 19 ++-- .../org/czentral/minirtmp/RtmpReader.java | 34 +++++-- .../minirtmp/RTMPStreamProcessorTest.java | 88 +++++++++++++++++++ 8 files changed, 143 insertions(+), 26 deletions(-) create mode 100644 src/test/java/org/czentral/minirtmp/RTMPStreamProcessorTest.java diff --git a/src/main/java/org/czentral/incubator/streamm/HexDump.java b/src/main/java/org/czentral/incubator/streamm/HexDump.java index 7351db3..99115b8 100644 --- a/src/main/java/org/czentral/incubator/streamm/HexDump.java +++ b/src/main/java/org/czentral/incubator/streamm/HexDump.java @@ -39,11 +39,14 @@ public static String prettyPrintHex(byte[] buffer, int startOffset, int maxLengt StringBuilder sb = new StringBuilder(4096); int offset = startOffset; while (offset < startOffset + maxLength) { + sb.append(String.format("%08X: ", offset)); int segmentLength = Math.min(LINE_LENGTH, startOffset + maxLength - offset); for (int i = 0; i < segmentLength; i++) { + if (i > 0) { + sb.append(i % 4 == 0 ? '-' : ' '); + } sb.append(digits[(buffer[offset + i] >> 4) & 0x0f]); sb.append(digits[(buffer[offset + i]) & 0x0f]); - sb.append(' '); //String digit = new String("0" + Integer.toHexString(buffer[offset + i] & 0xff)); //s += " " + digit.substring(digit.length() - 2); } diff --git a/src/main/java/org/czentral/minirtmp/AMFDecoder.java b/src/main/java/org/czentral/minirtmp/AMFDecoder.java index c377a49..b4c3aea 100644 --- a/src/main/java/org/czentral/minirtmp/AMFDecoder.java +++ b/src/main/java/org/czentral/minirtmp/AMFDecoder.java @@ -91,7 +91,7 @@ public Map readObject() { throw new RuntimeException(e); } offset += 2 + length; - //System.err.println("k: " + key + ", o: " + offset); + //System.err.println("k: " + key + ", o: " + messageOffset); if (length == 0) { if (buffer[offset] != 0x09) { throw new IllegalArgumentException("Object-end type ID (0x09) expected."); diff --git a/src/main/java/org/czentral/minirtmp/ApplicationContext.java b/src/main/java/org/czentral/minirtmp/ApplicationContext.java index 136d1b5..cbec7f6 100644 --- a/src/main/java/org/czentral/minirtmp/ApplicationContext.java +++ b/src/main/java/org/czentral/minirtmp/ApplicationContext.java @@ -131,7 +131,7 @@ public void processChunk(MessageInfo mi, ByteBuffer buffer) { } buffer.get(assemblyBuffer.array, mi.offset, buffer.remaining()); - //System.arraycopy(readBuffer, payloadOffset, assemblyBuffer.array, mi.offset, payloadLength); + //System.arraycopy(readBuffer, payloadOffset, assemblyBuffer.array, mi.messageOffset, payloadLength); boolean assembled = (mi.offset + payloadLength >= mi.length); if (assembled) { diff --git a/src/main/java/org/czentral/minirtmp/HandshakeProcessor.java b/src/main/java/org/czentral/minirtmp/HandshakeProcessor.java index ea24fd3..0ae35aa 100644 --- a/src/main/java/org/czentral/minirtmp/HandshakeProcessor.java +++ b/src/main/java/org/czentral/minirtmp/HandshakeProcessor.java @@ -54,7 +54,7 @@ public int process(byte[] buffer, int offset, int length) { return 0; } - //System.err.println(HexDump.prettyPrintHex(buffer, offset, length)); + //System.err.println(HexDump.prettyPrintHex(buffer, messageOffset, length)); if (stage == Stage.ClientBlock) { int processed = bytesNeeded; diff --git a/src/main/java/org/czentral/minirtmp/RTMPStreamProcessor.java b/src/main/java/org/czentral/minirtmp/RTMPStreamProcessor.java index b69bff4..6cca931 100644 --- a/src/main/java/org/czentral/minirtmp/RTMPStreamProcessor.java +++ b/src/main/java/org/czentral/minirtmp/RTMPStreamProcessor.java @@ -90,7 +90,7 @@ public int processPacket(byte[] buffer, int offset, int length) { int processed = 0; ByteBuffer bb = ByteBuffer.wrap(buffer, offset, length); - if (lastPacket == null || lastPacket.offset >= lastPacket.payloadLegth) { + if (lastPacket == null || lastPacket.chunkOffset >= reader.getChunkSize() || lastPacket.messageOffset >= lastPacket.messageSize) { try { Optional op = reader.read(bb); if (!op.isPresent()) { @@ -101,7 +101,8 @@ public int processPacket(byte[] buffer, int offset, int length) { //System.out.println(op.get()); } catch (RtmpException e) { e.printStackTrace(); - return 0; + throw new RuntimeException(e); + //return 0; } } //if (bb.remaining() < lastPacket.payloadLegth) { @@ -115,17 +116,19 @@ public int processPacket(byte[] buffer, int offset, int length) { // change chunk size command processed if (lastPacket.messageType == 0x01) { if (bb.remaining() < 4) { - return processed; + return 0; } - int proposedChunkSize = (bb.get() & 0xff) << 24 | (bb.get() & 0xff) << 16 - | (bb.get() & 0xff) << 8 | (bb.get() & 0xff); + ByteBuffer bbc = bb.duplicate(); + int proposedChunkSize = (bbc.get() & 0xff) << 24 | (bbc.get() & 0xff) << 16 + | (bbc.get() & 0xff) << 8 | (bbc.get() & 0xff); int newChunkSize = Math.min(proposedChunkSize, 0xFFFFFF); reader.setChunkSize(newChunkSize); } //chunkProcessor.processChunk(lastMessage, buffer, readOffset, payloadLength); //MessageInfo messageInfo = buildInfo(p); - int byteCount = Math.min((int)lastPacket.payloadLegth, bb.remaining()); + int chunkRemaining = (int)Math.min(lastPacket.messageSize-lastPacket.messageOffset, reader.getChunkSize() - lastPacket.chunkOffset); + int byteCount = Math.min(chunkRemaining, bb.remaining()); if (byteCount > 0) { chunkProcessor.processChunk(buildInfo(lastPacket), bb.array(), bb.position(), byteCount); @@ -144,7 +147,7 @@ public int processPacket(byte[] buffer, int offset, int length) { private MessageInfo buildInfo(RtmpPacket p) { MessageInfo mi = new MessageInfo(p.sid, p.messageType, (int)p.messageSize); - mi.offset = (int)p.offset; + mi.offset = (int)p.messageOffset; mi.length = (int)p.messageSize; mi.calculatedTimestamp = p.absoluteTimestamp; return mi; diff --git a/src/main/java/org/czentral/minirtmp/RtmpPacket.java b/src/main/java/org/czentral/minirtmp/RtmpPacket.java index fb146ea..72dbcce 100644 --- a/src/main/java/org/czentral/minirtmp/RtmpPacket.java +++ b/src/main/java/org/czentral/minirtmp/RtmpPacket.java @@ -31,8 +31,8 @@ public class RtmpPacket { long messageStreamId; long absoluteTimestamp; - long offset; - long payloadLegth; + long messageOffset; + long chunkOffset; long headerLength; protected RtmpPacket() { @@ -84,20 +84,20 @@ private RtmpPacket(RtmpPacket other) { this.messageType = other.messageType; this.messageStreamId = other.messageStreamId; this.absoluteTimestamp = other.absoluteTimestamp; - this.offset = other.offset; - this.payloadLegth = other.payloadLegth; + this.messageOffset = other.messageOffset; + this.chunkOffset = other.chunkOffset; this.headerLength = other.headerLength; } /** - * Accounts part of the packet being processed by creating a new packet with modified offset and payloadLength. + * Accounts part of the packet being processed by creating a new packet with modified messageOffset and payloadLength. * @param byteCount * @return */ public RtmpPacket transposed(int byteCount) { RtmpPacket result = new RtmpPacket(this); - result.offset += byteCount; - result.payloadLegth -= byteCount; + result.messageOffset += byteCount; + result.chunkOffset += byteCount; return result; } @@ -111,8 +111,9 @@ public String toString() { ", messageType=" + messageType + ", messageStreamId=" + messageStreamId + ", absoluteTimestamp=" + absoluteTimestamp + - ", offset=" + offset + - ", payloadLegth=" + payloadLegth + + ", messageOffset=" + messageOffset + + ", chunkOffset=" + chunkOffset + + ", headerLength=" + headerLength + '}'; } } diff --git a/src/main/java/org/czentral/minirtmp/RtmpReader.java b/src/main/java/org/czentral/minirtmp/RtmpReader.java index 3cafb11..4268d53 100644 --- a/src/main/java/org/czentral/minirtmp/RtmpReader.java +++ b/src/main/java/org/czentral/minirtmp/RtmpReader.java @@ -17,6 +17,8 @@ package org.czentral.minirtmp; +import org.czentral.incubator.streamm.HexDump; + import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; @@ -27,6 +29,10 @@ public class RtmpReader { private long chunkSize; + private byte[] lastBytes = new byte[16 * 1024]; + private ByteBuffer lastBuffer = ByteBuffer.wrap(lastBytes); + private RtmpPacket lastParsedPacket = null; + public RtmpReader(long chunkSize) { this.chunkSize = chunkSize; } @@ -42,7 +48,7 @@ public Optional read(ByteBuffer buffer) throws RtmpException { RtmpPacket lastPacket = lastPackets.getOrDefault(p.sid, null); boolean newMessage = lastPacket == null || - lastPacket.offset + lastPacket.payloadLegth == lastPacket.messageSize; + lastPacket.messageOffset == lastPacket.messageSize; if (lastPacket != null) { p.absoluteTimestamp = lastPacket.absoluteTimestamp; @@ -62,6 +68,15 @@ public Optional read(ByteBuffer buffer) throws RtmpException { } else { if (p.chunkType > 0) { + //System.err.println("Last good packet --------------------------"); + //System.err.println(lastParsedPacket); + //System.err.print(HexDump.prettyPrintHex(lastBytes, 0, lastBuffer.limit())); + byte[] b = new byte[1024]; + ByteBuffer temp = buffer.duplicate(); + temp.position(originalOffset); + int length = Math.min(b.length, temp.remaining()); + temp.get(b, 0, length); + System.err.print(HexDump.prettyPrintHex(b, 0, length)); throw new RtmpException(String.format("Missing previous chunk (chunkId: %d, type: %d)", p.sid, p.chunkType)); } } @@ -82,20 +97,27 @@ public Optional read(ByteBuffer buffer) throws RtmpException { } } - p.headerLength = buffer.position() - originalOffset; if (!newMessage) { - p.offset = lastPacket.offset + lastPacket.payloadLegth; - p.payloadLegth = Math.min(chunkSize, lastPacket.messageSize - p.offset); - } else { - p.payloadLegth = Math.min(chunkSize, p.messageSize); + p.messageOffset = lastPacket.messageOffset; } + p.headerLength = buffer.position() - originalOffset; lastPackets.put(p.sid, p); + ByteBuffer temp = buffer.duplicate(); + temp.position(originalOffset); + lastBuffer.limit(Math.min(temp.limit()-temp.position(), lastBytes.length)); + temp.get(lastBytes, 0, lastBuffer.limit()); + lastParsedPacket = p; + return Optional.of(p); } public void setChunkSize(long chunkSize) { this.chunkSize = chunkSize; } + + public long getChunkSize() { + return chunkSize; + } } diff --git a/src/test/java/org/czentral/minirtmp/RTMPStreamProcessorTest.java b/src/test/java/org/czentral/minirtmp/RTMPStreamProcessorTest.java new file mode 100644 index 0000000..3a637c6 --- /dev/null +++ b/src/test/java/org/czentral/minirtmp/RTMPStreamProcessorTest.java @@ -0,0 +1,88 @@ +/* + * Copyright 2020 Bence Varga + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS + * OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package org.czentral.minirtmp; + +import org.czentral.minihttp.ChunkedInputStream; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Files; + +import static org.junit.Assert.*; + +public class RTMPStreamProcessorTest { + + @Test + public void process() throws Exception { + ResourceLimit limit = new ResourceLimit(); + limit.assemblyBufferCount = 100; + limit.assemblyBufferSize = 200 * 1024; + limit.chunkStreamCount = 100; + + String pathname = "httpresp.pcap"; + byte[] buffer = loadFile(pathname); + //int start = 0xc938; + int start = 0xc5f; + //int end = 0xe938; + int end = 0x16c7 + 0x28; + + for (int i=0xc6b; i Date: Wed, 30 Dec 2020 23:13:43 +0100 Subject: [PATCH 2/3] Fixes and test file added. --- .idea/modules/stream-m_test.iml | 1 + .../minirtmp/RTMPStreamProcessor.java | 33 +++++------------- .../org/czentral/minirtmp/RtmpPacket.java | 27 -------------- .../org/czentral/minirtmp/RtmpReader.java | 30 +++------------- .../minirtmp/RTMPStreamProcessorTest.java | 14 +++----- src/test/resources/rtmp-in.pcap | Bin 0 -> 5871 bytes 6 files changed, 20 insertions(+), 85 deletions(-) create mode 100644 src/test/resources/rtmp-in.pcap diff --git a/.idea/modules/stream-m_test.iml b/.idea/modules/stream-m_test.iml index 006aaa8..baf7b78 100644 --- a/.idea/modules/stream-m_test.iml +++ b/.idea/modules/stream-m_test.iml @@ -5,6 +5,7 @@ + diff --git a/src/main/java/org/czentral/minirtmp/RTMPStreamProcessor.java b/src/main/java/org/czentral/minirtmp/RTMPStreamProcessor.java index 6cca931..72840b6 100644 --- a/src/main/java/org/czentral/minirtmp/RTMPStreamProcessor.java +++ b/src/main/java/org/czentral/minirtmp/RTMPStreamProcessor.java @@ -28,8 +28,6 @@ class RTMPStreamProcessor implements Processor { protected boolean finished = false; - protected Map lastMessages = new HashMap(); - private final int DEFAULT_CHUNK_SIZE = 128; protected ResourceLimit limit; @@ -39,6 +37,7 @@ class RTMPStreamProcessor implements Processor { protected RtmpReader reader = new RtmpReader(DEFAULT_CHUNK_SIZE); protected RtmpPacket lastPacket = null; + protected int chunkOffset = 0; public RTMPStreamProcessor(ResourceLimit limit, ChunkProcessor chunkProcessor) { this.limit = limit; @@ -90,29 +89,21 @@ public int processPacket(byte[] buffer, int offset, int length) { int processed = 0; ByteBuffer bb = ByteBuffer.wrap(buffer, offset, length); - if (lastPacket == null || lastPacket.chunkOffset >= reader.getChunkSize() || lastPacket.messageOffset >= lastPacket.messageSize) { + if (lastPacket == null || chunkOffset >= reader.getChunkSize() || lastPacket.messageOffset + chunkOffset >= lastPacket.messageSize) { try { Optional op = reader.read(bb); if (!op.isPresent()) { return 0; } lastPacket = op.get(); + chunkOffset = 0; processed += lastPacket.headerLength; - //System.out.println(op.get()); } catch (RtmpException e) { e.printStackTrace(); throw new RuntimeException(e); - //return 0; } } - //if (bb.remaining() < lastPacket.payloadLegth) { - // return 0; - //} - - //System.err.println("code: " + code + ", sid: " + sid + ", type: " + type + ", length: " + payloadLength); - //System.err.println(HexDump.prettyPrintHex(buffer, bufferOffset, sidLength + headLength + payloadLength)); - //System.err.println(HexDump.prettyPrintHex(buffer, bufferOffset, Math.min(16, sidLength + headLength + payloadLength))); - + // change chunk size command processed if (lastPacket.messageType == 0x01) { if (bb.remaining() < 4) { @@ -125,30 +116,24 @@ public int processPacket(byte[] buffer, int offset, int length) { reader.setChunkSize(newChunkSize); } - //chunkProcessor.processChunk(lastMessage, buffer, readOffset, payloadLength); - //MessageInfo messageInfo = buildInfo(p); - int chunkRemaining = (int)Math.min(lastPacket.messageSize-lastPacket.messageOffset, reader.getChunkSize() - lastPacket.chunkOffset); + int chunkRemaining = (int)Math.min(lastPacket.messageSize-(lastPacket.messageOffset+chunkOffset), reader.getChunkSize() - chunkOffset); int byteCount = Math.min(chunkRemaining, bb.remaining()); if (byteCount > 0) { - chunkProcessor.processChunk(buildInfo(lastPacket), bb.array(), bb.position(), byteCount); + chunkProcessor.processChunk(buildInfo(lastPacket, chunkOffset), bb.array(), bb.position(), byteCount); finished = !chunkProcessor.alive(); - lastPacket = lastPacket.transposed(byteCount); + chunkOffset += byteCount; processed += byteCount; } - //System.out.printf("len: %d, newLen: %d%n", sidLength + headLength + payloadLength, p.messageSize + p.headerLength); - //return sidLength + headLength + payloadLength; - //System.out.printf("len: %d, newLen: %d (%d + %d)%n", sidLength + headLength + payloadLength, p.headerLength + p.payloadLegth, p.headerLength, p.payloadLegth); return processed; } - private MessageInfo buildInfo(RtmpPacket p) { + private static MessageInfo buildInfo(RtmpPacket p, int chunkOffset) { MessageInfo mi = new MessageInfo(p.sid, p.messageType, (int)p.messageSize); - mi.offset = (int)p.messageOffset; - mi.length = (int)p.messageSize; + mi.offset = (int)p.messageOffset + chunkOffset; mi.calculatedTimestamp = p.absoluteTimestamp; return mi; } diff --git a/src/main/java/org/czentral/minirtmp/RtmpPacket.java b/src/main/java/org/czentral/minirtmp/RtmpPacket.java index 72dbcce..53c150e 100644 --- a/src/main/java/org/czentral/minirtmp/RtmpPacket.java +++ b/src/main/java/org/czentral/minirtmp/RtmpPacket.java @@ -32,7 +32,6 @@ public class RtmpPacket { long absoluteTimestamp; long messageOffset; - long chunkOffset; long headerLength; protected RtmpPacket() { @@ -76,31 +75,6 @@ public boolean hasExtendedTimestamp() { return packetTimestamp == 0xffffff; } - private RtmpPacket(RtmpPacket other) { - this.chunkType = other.chunkType; - this.sid = other.sid; - this.packetTimestamp = other.packetTimestamp; - this.messageSize = other.messageSize; - this.messageType = other.messageType; - this.messageStreamId = other.messageStreamId; - this.absoluteTimestamp = other.absoluteTimestamp; - this.messageOffset = other.messageOffset; - this.chunkOffset = other.chunkOffset; - this.headerLength = other.headerLength; - } - - /** - * Accounts part of the packet being processed by creating a new packet with modified messageOffset and payloadLength. - * @param byteCount - * @return - */ - public RtmpPacket transposed(int byteCount) { - RtmpPacket result = new RtmpPacket(this); - result.messageOffset += byteCount; - result.chunkOffset += byteCount; - return result; - } - @Override public String toString() { return "RtmpPacket{" + @@ -112,7 +86,6 @@ public String toString() { ", messageStreamId=" + messageStreamId + ", absoluteTimestamp=" + absoluteTimestamp + ", messageOffset=" + messageOffset + - ", chunkOffset=" + chunkOffset + ", headerLength=" + headerLength + '}'; } diff --git a/src/main/java/org/czentral/minirtmp/RtmpReader.java b/src/main/java/org/czentral/minirtmp/RtmpReader.java index 4268d53..c2db3ac 100644 --- a/src/main/java/org/czentral/minirtmp/RtmpReader.java +++ b/src/main/java/org/czentral/minirtmp/RtmpReader.java @@ -17,8 +17,6 @@ package org.czentral.minirtmp; -import org.czentral.incubator.streamm.HexDump; - import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; @@ -29,10 +27,6 @@ public class RtmpReader { private long chunkSize; - private byte[] lastBytes = new byte[16 * 1024]; - private ByteBuffer lastBuffer = ByteBuffer.wrap(lastBytes); - private RtmpPacket lastParsedPacket = null; - public RtmpReader(long chunkSize) { this.chunkSize = chunkSize; } @@ -48,7 +42,11 @@ public Optional read(ByteBuffer buffer) throws RtmpException { RtmpPacket lastPacket = lastPackets.getOrDefault(p.sid, null); boolean newMessage = lastPacket == null || - lastPacket.messageOffset == lastPacket.messageSize; + lastPacket.messageOffset + chunkSize >= lastPacket.messageSize; + + if (!newMessage) { + p.messageOffset = lastPacket.messageOffset + chunkSize; + } if (lastPacket != null) { p.absoluteTimestamp = lastPacket.absoluteTimestamp; @@ -68,15 +66,6 @@ public Optional read(ByteBuffer buffer) throws RtmpException { } else { if (p.chunkType > 0) { - //System.err.println("Last good packet --------------------------"); - //System.err.println(lastParsedPacket); - //System.err.print(HexDump.prettyPrintHex(lastBytes, 0, lastBuffer.limit())); - byte[] b = new byte[1024]; - ByteBuffer temp = buffer.duplicate(); - temp.position(originalOffset); - int length = Math.min(b.length, temp.remaining()); - temp.get(b, 0, length); - System.err.print(HexDump.prettyPrintHex(b, 0, length)); throw new RtmpException(String.format("Missing previous chunk (chunkId: %d, type: %d)", p.sid, p.chunkType)); } } @@ -97,19 +86,10 @@ public Optional read(ByteBuffer buffer) throws RtmpException { } } - if (!newMessage) { - p.messageOffset = lastPacket.messageOffset; - } p.headerLength = buffer.position() - originalOffset; lastPackets.put(p.sid, p); - ByteBuffer temp = buffer.duplicate(); - temp.position(originalOffset); - lastBuffer.limit(Math.min(temp.limit()-temp.position(), lastBytes.length)); - temp.get(lastBytes, 0, lastBuffer.limit()); - lastParsedPacket = p; - return Optional.of(p); } diff --git a/src/test/java/org/czentral/minirtmp/RTMPStreamProcessorTest.java b/src/test/java/org/czentral/minirtmp/RTMPStreamProcessorTest.java index 3a637c6..9203501 100644 --- a/src/test/java/org/czentral/minirtmp/RTMPStreamProcessorTest.java +++ b/src/test/java/org/czentral/minirtmp/RTMPStreamProcessorTest.java @@ -17,15 +17,11 @@ package org.czentral.minirtmp; -import org.czentral.minihttp.ChunkedInputStream; import org.junit.Test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.nio.file.Files; - -import static org.junit.Assert.*; public class RTMPStreamProcessorTest { @@ -36,14 +32,12 @@ public void process() throws Exception { limit.assemblyBufferSize = 200 * 1024; limit.chunkStreamCount = 100; - String pathname = "httpresp.pcap"; + String pathname = "rtmp-in.pcap"; byte[] buffer = loadFile(pathname); - //int start = 0xc938; int start = 0xc5f; - //int end = 0xe938; int end = 0x16c7 + 0x28; - for (int i=0xc6b; i}f`GGc$}!NfAO6x`?8aYtlu; z38^SWNiLx}38^C~6miJBd#K-g-p~8~2k+UR&#e9I?{izvcRg#(XLU7JTtop9z<)my zfEe;|^!q2G2y0eb`pKe1&*CU112_R{e<)i3fKcjyq^y{jms2?M`b%un zKW=yw2_`GjHV0f>?pDR!{cLp5y}+bNc>ZE;G=Z)DIPgdNj&~{SI5X9P=#=TS>$|)M z14c?qDo;Py#%AUAJWRb+_sD_%{?JBi(*<>AiKh+e!L>J47qycUo4Z9J2me(p6>>F(2Yu=cWDju&mZ7{3l;rZyqB`|xZTZ&b_ zR_WadqU(Y0w;B&0EJCY8t2dy82Obk_GQ+GpZA={YcZUh$+-F<9yI5*_v}Lrvs$7<+ z)kqmgiLs;)oejTtRlYiJx~I%+c3deT_jthy&2LQmRS&C;;|`nZI6eO_6p({FgT2337l^0kX~?~XUmpKNX|{@kb%J;Q9T=$Y2-*1jZ!1D|2ODXKVhU`Muk zlG2=t%VyMZVr^$NgAFFJf%BYT0>Pe#7Qee0_WS2q~Pz@bNt7q$(q<{-7B0)PS#g} z#m9+^ozyFMO7fstrsS4_&2sSPE;{>=$AaX1)=@QBZY~F&_3CvQa-zfSJ^M*f@k7Dq zU)HBMj{p7gvr}rn|7Z^{!$fviy8AsLV`SOGm|n*V={g!=c6k|U6Rk(96r-D;9N1aW z`1$#@X7r7WDa`v^t@%QD+1#!T#4`UgElt&50wx>$dGGZ%T-Cbwa$C-@r-$H;`>Rcd z>UtbPHAvOH;x+Bw&-@M_33b=l68IwH_NusZ=nw1IkAg0zmpkIi>OsaE&B9QD{Qkcq zeeY90$6JnywG>Uo-R-qE|2+S7_TV4O>npNnO7dzFWN$pBxM?1FGGJzRq5AyVsn>pT zoJzS00OFf_wR^Fimi3zI2*OBut==yUG;5%xPLxjYeZv7HN*QNryR1WMiHnESMB)i{S zS7G4nUOkh4%HXCaX4uD;p?)c%#8!^i@Lgb95w1`e5wbzTzbRn#DvZ#r_Eu2-n8jCZ zwZ{8T3{M^LRH~b+*m}<+AYc9rMyiML*rUxVMF&$Mk=UAVcw^rCCcLjwU*$#3Q7NOI zNMEtemD|&pzFQ9!KF}uZV|TApUaQjh?vM%de8`HXnMiM3soR)%hIU8P!{jKzvP{Xf zI-yQEq3u4BO=qGxBQ#Gi<;v^+7@DDtOT0|%#KQecrZ)&QQe9k2@40?%-i9J!=R#~+ zy!eNQ`O~jonkgMiXRCPxN~bob#J<{#88ZbH)(V4Kah*nYK;N4BM#Yolm9-sL^j>HU z>BfHYu&n(`TyCB@-hEEH11o1-S#{wuS@?Dq55GnoRXah{DQ)imn%FcN@esQ#rnaJp zYCktzdgj12Kg#V*vbX(S?bz%2_Ugm8fva8?Z7Yok8>=JKHEFw6FMMB*?XpU4?HrJ; zY^E4!c+J}X&itd9>JvD~?jIj4*4`X=D%?;`!0sFxU5>+hDd*-{0QT91D?(C3uH1Uz z>iOr{iUWcE#d3WP7jKILb9}e?ZRfLNn3=Z5dd2&mtM%6z{V_`L#wd+qxA&Q?N%-;L zOm`4oV_%(jzoqlJxfLIcIwbxy*PPpSZ-6^pdu(p%i1h2L4CR?(|CBG9iAM64lZI~k z{fe`-EB~|`O^T|Tv$<@kraBe5ISUJ4xAR+gi?&(bzYIkZm4;!jS zu-E4VB#PQLeW-R`p9CdJdzGV!(+UTq$yv##AKd;9AT z;otYa4E)Q$zYP4#!2d4>7B2w6X;o3xC_tLbX0c#0AJ{a$M1wdW4ske$f)hq!(0MdK zf*;9&QGhIq&EjzB;Se7NWT*^?NArcbC_s0syPK1#xd|53BeR(th)*Xm;0>S~6i&6Y zF)=qY!C@`*0ZBgDhs!_#I$S=JV`plLvqcnEHYSahwk9|;8#|n>xs~a!ga8_~I28%e zr3bmt2!)P|g1#yWz;Iy(4DnzuJ{N|V0AW!90Fo#`o=WHP_?vhznG5rm9M&QZ=&g<( zKMNtqELs2G#w!qGdBhi~?^kfepY}_B2CAa@{DT<6B8C4uIdXSn(8J-y3!Ipx@{$*Z zz=Qc)AU?E}3o%7>vRUph9}*#=@EAab62?W?W3!f$ibhERox-O91pZG*iU!m7(f9!2 zmklPIPJ!7JBnILN1BB?)v5Tf?swl}4hW+U*zi3NlQ(!Wk0uVHQ!WbxwLjOky*WF7B zg+-hPF*%H%frgV}7ghh%@aR!U+FvQ8czl=(v&F;!`9<&lB-8zwOd4j1Fr;lT|D!>W zhN3gz#b7@zkr!HOQ8q@42wX0b#VCNDZ~#!>hrF-!IXL`{ERZ-L8c@JQ+={(ofFy17 zQ-#se)md6bfiUdRG&8L1^d=~{t{tk zWdRz4WHuKDah5h9*UZ+&0yMX_w55_sh{DALF)(%aaB?=b03CcC5le(pMB&KhL^5D1 zA2h>a&5g~lI9mjy@%f^D7YGCOd*OQ;t&ra7h>&$@i;4xOyjbd5D{_3fyiEBAX^=gY$9wZWIiI0 zLz#FiG6jed#b&{HGn^3)2T~y(pUC0ur*lLWO94VTL^hR*^funu4CK?0{X^m5tw08w zy&s|>AH-i64&*WDWMnSC04&JjF6JQ9nMn5{A?Ylne;5#Agy19wvL7OeONR>bjhs_F zJ{O|1kPwI=7ZTYl_BjtBi$vr^B0W#1;LQ*jqCgx`6(k~w4)H`u=v?HCLlD8@4k95E zn*+0m``8>ry99C&*ZpuL5*u&%OCmDqEW9PiBg4oU8OFz3U`3PULLx%BFpq{fbIHX2 z6f4qm$#{sw1(_s-RZ&qSI%1EMXMqG234As~v^-#_s4_g(#0n8PqBM(dC<1R~ivY+@ z;@~YnItN)Xq&pA~Bs3I?G=peqfmi^LXoi#G0rqFvke%^`+*DGhP?J&E@mNv2<;1{` zDtwmd&56xgG|O|94S;!3^qqj(c<8IpN3CFWd~$bKq*uV~$C&34c#xSN&g8zM^)CgCgR(Pe7s(ne*7}A8-P>-H z=4WE3|9D3CYgu?}^q}#DPj}HO4Xp zs@Rn;F6*iqw!byOWoLM9d}y!P5$53`dn@eQ4(u!CoPv9;`T7d+TTmLuzZN$qODZl`&ZLjdeYunhI?1WzIySln>W4bk*Qrw$-5L)l&n8GDxwqZJ*W|e zJG}PW_|-^gFBC_goZQqoJn`rIH@oum6qoCsyJ{1nVDo84<5I?fFXCQ<4dlH1)!Re+ ztiQWXm0MbG-&vO*-PV6~GSHFWO7-2Aw*^{#R9e>}VSNi`@~*pH(-n9nQ|}z*ZD?p~ zh0}@^M%w8)3pQ@Qe+aj|+vMRj&wm=+h83<)I98(Ql~tn_5V&lOu6*Xaag7WmHwSaF zt61ncJ7OJGo-Ie4n#kJ`GW^%e39_~a+G&eI46|^R*{RlZNw#!2RY)z~jJ`j(LM!Ew zLSfds1Y<$e#&>F_n_pHdDgEx$@m{quWlNT?&BQFT!dwq6cClaHNlj(GuA{X1${EHQ z=YvtBrltAZ3c9YjBbm6+cz6A1;2&x!cFvW2beju4 zDckYG=w)U3RexOu{oc0a7VR?6DmIWjnecgl{Ked9iyiH0Zu&Cu)$i0V*apn-_M~JR z$`*O~v`@^g#e|oCmR+gY~fc<&SQ zGvNnjI$m{Ow7J`bVtN(MwD>3K49Y~`Ir*H$H9p_4L1z2d5C6&!6^9-%ixG_OUwROdAMA4ZQr8UUTTr6X!H{Ma=Y*%S-^Oc&QqP|kRh&Zo{zLHF>zT%h zh@`OIVC(QR|V8P z=pWk)ZOuJ~wd#N9-O8|Au3{H*oDkj_)Oqr{zK*@)YEM#DmOwjn$Y`CO$L>S4ch9R+ zhYFSjYwAmh@AY!u6B;FdZ_}E!jXMa?6IHl|{>XZ#IZo62e3m>*PENlw%$ zp|k6llAc0-4ptRqrXmTcL=~o-P(sgjL}^H{^N!u{FE+Xu=R=!}C(iI>|27sJzPn3* Y(D8%A0^#Cpd6XdLvsS{E^DmkI1=1JyD*ylh literal 0 HcmV?d00001 From 4334a672b938acd5f5dd75f18b76a557a519c98a Mon Sep 17 00:00:00 2001 From: Bence Varga Date: Wed, 30 Dec 2020 23:45:09 +0100 Subject: [PATCH 3/3] Bumped version. --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 21 ++------------------- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/build.gradle b/build.gradle index 3b43089..adcaf87 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ plugins { } group 'org.czentral' -version '1.0-SNAPSHOT' +version '1.0.1-SNAPSHOT' sourceCompatibility = 1.8 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a910f7d..890a5e7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,23 +1,6 @@ -# -# Copyright 2018 Bence Varga -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -# documentation files (the "Software"), to deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the -# Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -# OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -#Sun Nov 18 17:10:41 CET 2018 +#Wed Dec 30 23:37:28 CET 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-all.zip