Skip to content

Commit

Permalink
Get a NetConnection.Connect.Success!!!
Browse files Browse the repository at this point in the history
  • Loading branch information
shogo4405 committed Nov 27, 2016
1 parent ffd5821 commit 75b30a5
Show file tree
Hide file tree
Showing 17 changed files with 529 additions and 61 deletions.
14 changes: 7 additions & 7 deletions app/app.iml
Original file line number Diff line number Diff line change
Expand Up @@ -61,20 +61,20 @@
<sourceFolder url="file:https://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file:https://$MODULE_DIR$/src/main/jni" isTestSource="false" />
<sourceFolder url="file:https://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/test/jni" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
<sourceFolder url="file:https://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<excludeFolder url="file:https://$MODULE_DIR$/build/intermediates/assets" />
<excludeFolder url="file:https://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file:https://$MODULE_DIR$/build/intermediates/bundles" />
Expand Down
30 changes: 18 additions & 12 deletions app/src/main/java/com/haishinkit/amf/AMF0Deserializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import android.util.Log;

import com.haishinkit.as3.ASUndefined;
import com.haishinkit.as3.XMLDocument;
import com.haishinkit.as3.ASXMLDocument;
import com.haishinkit.as3.ASArray;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -44,12 +44,12 @@ public Object getObject() {
case 0x07: // reference
throw new UnsupportedOperationException();
case 0x08: // ecmaarray
throw new UnsupportedOperationException();
buffer.position(buffer.position() - 1);
return getList();
case 0x09: // objectend
throw new UnsupportedOperationException();
case 0x0a: // strictarray
buffer.position(buffer.position() - 1);
return getList();
throw new UnsupportedOperationException();
case 0x0b: // date
buffer.position(buffer.position() - 1);
return getDate();
Expand Down Expand Up @@ -127,15 +127,21 @@ public List<Object> getList() {
if (marker == AMF0Marker.NULL.valueOf()) {
return null;
}
if (marker != AMF0Marker.STRICTARRAY.valueOf()) {
if (marker != AMF0Marker.ECMAARRAY.valueOf()) {
throw new IllegalFormatFlagsException(new Byte(marker).toString());
}
int count = buffer.getInt();
List<Object> list = new ArrayList<Object>(count);
for (int i = 0; i < count; ++i) {
list.add(getObject());
ASArray array = new ASArray(count);
while (true) {
String key = getString(true);
System.out.println(key);
if (key.equals("")) {
buffer.get();
break;
}
array.put(key, getObject());
}
return list;
return array;
}

public Date getDate() {
Expand All @@ -150,12 +156,12 @@ public Date getDate() {
return date;
}

public XMLDocument getXMLDocument() {
public ASXMLDocument getXMLDocument() {
byte marker = buffer.get();
if (marker != AMF0Marker.XMLDOCUMENT.valueOf()) {
throw new IllegalFormatFlagsException(new Byte(marker).toString());
}
return new XMLDocument(getString(false));
return new ASXMLDocument(getString(false));
}

private String getString(final boolean asShort) {
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/haishinkit/amf/AMF0Serializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public AMF0Serializer putList(final List<Object> value) {
buffer.put(AMF0Marker.NULL.valueOf());
return this;
}
buffer.put(AMF0Marker.STRICTARRAY.valueOf());
buffer.put(AMF0Marker.ECMAARRAY.valueOf());
if (value.isEmpty()) {
buffer.put(new byte[]{0x00, 0x00, 0x00, 0x00});
return this;
Expand Down
21 changes: 21 additions & 0 deletions app/src/main/java/com/haishinkit/as3/ASArray.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.haishinkit.as3;

import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

public final class ASArray extends ArrayList<Object> {
private Map<String, Object> properties = new HashMap<String, Object>();

public ASArray(int capacity) {
super(capacity);
}

public void put(String k, Object v) {
properties.put(k, v);
}

public String toString() {
return "{" + super.toString() + "," + properties.toString() + "}";
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.haishinkit.as3;

public final class XMLDocument {
public final class ASXMLDocument {
private final String document;

public XMLDocument(final String document) {
public ASXMLDocument(final String document) {
this.document = document;
}

Expand Down
5 changes: 5 additions & 0 deletions app/src/main/java/com/haishinkit/lang/IRawValue.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.haishinkit.lang;

public interface IRawValue<T> {
public T rawValue();
}
75 changes: 73 additions & 2 deletions app/src/main/java/com/haishinkit/rtmp/RTMPChunk.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,20 @@ public enum RTMPChunk {
public static final short VIDEO = 0x05;
public static final int DEFAULT_SIZE = 128;

public static RTMPChunk rawValue(byte value) {
switch (value) {
case 0:
return RTMPChunk.ZERO;
case 1:
return RTMPChunk.ONE;
case 2:
return RTMPChunk.TWO;
case 3:
return RTMPChunk.THREE;
}
return null;
}

private final byte value;

RTMPChunk(final byte value) {
Expand Down Expand Up @@ -51,14 +65,14 @@ public List<ByteBuffer> encode(RTMPSocket socket, RTMPMessage message) {
switch (this) {
case ZERO:
buffer.put(new byte[]{(byte)(length >> 16), (byte)(length >> 8), (byte) length});
buffer.put(message.getType().valueOf());
buffer.put(message.getType().rawValue());
int streamID = message.getStreamID();
// message streamID is a litleEndian
buffer.put(new byte[]{(byte) streamID, (byte)(streamID >> 8), (byte)(streamID >> 16), (byte)(streamID >> 24)});
break;
case ONE:
buffer.put(new byte[]{(byte)(length >> 16), (byte)(length >> 8), (byte)length});
buffer.put(message.getType().valueOf());
buffer.put(message.getType().rawValue());
break;
default:
break;
Expand Down Expand Up @@ -89,6 +103,40 @@ public List<ByteBuffer> encode(RTMPSocket socket, RTMPMessage message) {
return list;
}

public RTMPMessage decode(RTMPSocket socket, ByteBuffer buffer) {
if (socket == null || buffer == null) {
throw new IllegalArgumentException();
}

int timestamp = 0;
int length = 0;
byte type = 0;
int streamID = 0;

switch (this) {
case ZERO:
timestamp = getInt(buffer);
length = getInt(buffer);
type = buffer.get();
streamID = buffer.getInt();
break;
case ONE:
timestamp = getInt(buffer);
length = getInt(buffer);
type = buffer.get();
break;
default:
break;
}

return RTMPMessage
.create(type)
.setStreamID(streamID)
.setTimestamp(timestamp)
.setLength(length)
.decode(socket, buffer);
}

public int length(short streamID) {
int basic = 3;
if (streamID <= 63) {
Expand Down Expand Up @@ -119,4 +167,27 @@ public byte[] header(short streamID) {
}
return new byte[]{(byte) (value << 6 | 0b00111111), (byte) ((streamID - 64) >> 8), (byte) (streamID - 64)};
}

public int getInt(final ByteBuffer buffer) {
byte[] bytes = new byte[3];
buffer.get(bytes);
return (int) bytes[0] << 16 | (int) bytes[1] << 8 | (int) bytes[2];
}

public short getStreamID(final ByteBuffer buffer) {
byte first = buffer.get();
byte[] bytes = null;
switch (first & 0b00111111) {
case 0:
bytes = new byte[2];
buffer.get(bytes);
return (short)(bytes[1] + 64);
case 1:
bytes = new byte[3];
buffer.get(bytes);
return (short) ((short)(bytes[1]) << 8 | (short) (bytes[2]) | (short) 64);
default:
return (short) (first & 0b00111111);
}
}
}
37 changes: 29 additions & 8 deletions app/src/main/java/com/haishinkit/rtmp/RTMPConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import com.haishinkit.rtmp.message.RTMPCommandMessage;
import com.haishinkit.rtmp.message.RTMPMessage;
import com.haishinkit.util.ByteBufferUtils;
import com.haishinkit.util.Log;

public class RTMPConnection {
Expand Down Expand Up @@ -88,10 +89,15 @@ short valueOf() {
private int transactionID = 0;
private Object[] arguments = null;
private RTMPSocket socket = new RTMPSocket(this);
private Map<Short, ByteBuffer> messages = new HashMap<Short, ByteBuffer>();

public RTMPConnection() {
}

public RTMPSocket getSocket() {
return socket;
}

public URI getUri() {
return uri;
}
Expand All @@ -104,24 +110,27 @@ public String getSwfUrl() {
return swfUrl;
}

public void setSwfUrl(String swfUrl) {
public RTMPConnection setSwfUrl(String swfUrl) {
this.swfUrl = swfUrl;
return this;
}

public String getPageUrl() {
return pageUrl;
}

public void setPageUrl(String pageUrl) {
public RTMPConnection setPageUrl(String pageUrl) {
this.pageUrl = pageUrl;
return this;
}

public String getFlashVer() {
return this.flashVer;
}

public void setFlashVer(String flashVer) {
public RTMPConnection setFlashVer(String flashVer) {
this.flashVer = flashVer;
return this;
}

public void connect(final String command, Object... arguments) {
Expand All @@ -141,24 +150,36 @@ public void close() {
socket.close();
}

void listen(ByteBuffer buffer) {

void listen(final ByteBuffer buffer) {
if (!buffer.hasRemaining()) {
return;
}
byte first = buffer.get();
RTMPChunk chunk = RTMPChunk.rawValue((byte) (first >> 6));
buffer.position(buffer.position() - 1);
short streamID = chunk.getStreamID(buffer);
if (messages.containsKey(streamID)) {

} else {
chunk.decode(socket, buffer).execute(this);
listen(buffer);
}
}

RTMPMessage createConnectionMessage() {
String[] paths = uri.getPath().split("/", 0);
RTMPCommandMessage message = new RTMPCommandMessage(RTMPObjectEncoding.AMF0);
Map<String, Object> commandObject = new HashMap<String, Object>();
commandObject.put("app", paths[1]);
commandObject.put("flashVer", flashVer);
commandObject.put("swfUrl", swfUrl);
commandObject.put("flashVer", getFlashVer());
commandObject.put("swfUrl", getSwfUrl());
commandObject.put("tcUrl", uri.toString());
commandObject.put("fpad", false);
commandObject.put("capabilities", RTMPConnection.DEFAULT_CAPABILITIES);
commandObject.put("audioCodecs", SupportSound.AAC.valueOf());
commandObject.put("videoCodecs", SupportVideo.H264.valueOf());
commandObject.put("videoFunction", VideoFunction.CLIENT_SEEK.valueOf());
commandObject.put("pageUrl", pageUrl);
commandObject.put("pageUrl", getPageUrl());
commandObject.put("objectEncoding", objectEncoding.valueOf());
message.setChunkStreamID(RTMPChunk.COMMAND);
message.setStreamID(0);
Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/com/haishinkit/rtmp/RTMPSocket.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ enum ReadyState {
}

private int chunkSizeC = RTMPChunk.DEFAULT_SIZE;
private int bandwidth = 0;
private boolean connected = false;
private RTMPHandshake handshake = new RTMPHandshake();
private ReadyState readyState = ReadyState.Uninitialized;
Expand All @@ -31,6 +32,15 @@ public boolean isConnected() {
return connected;
}

public int getBandWidth() {
return bandwidth;
}

public RTMPSocket setBandwidth(final int bandwidth) {
this.bandwidth = bandwidth;
return this;
}

public int getChunkSizeC() {
return chunkSizeC;
}
Expand Down Expand Up @@ -67,6 +77,7 @@ protected void listen(ByteBuffer buffer) {
readyState = ReadyState.AckSent;
if (buffer.limit() - buffer.position() == RTMPHandshake.SIGNAL_SIZE) {
listen(buffer.slice());
buffer.position(3073);
}
break;
case AckSent:
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/haishinkit/rtmp/RTMPStream.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.haishinkit.rtmp;

public class RTMPStream {
}
Loading

0 comments on commit 75b30a5

Please sign in to comment.