Skip to content

Commit ad27490

Browse files
Merge pull request #707 from TakayukiHoshi1984/feature_libmedia_video_decoder
Feature libmedia video decoder
2 parents a5da3c6 + 7c936d1 commit ad27490

27 files changed

Lines changed: 945 additions & 246 deletions

File tree

dConnectSDK/dConnectLibStreaming/libmedia/src/main/java/org/deviceconnect/android/libmedia/streaming/rtp/RtpDepacketize.java

Lines changed: 105 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,9 @@ protected int getSsrc(byte[] data) {
205205
* @param data 通知するデータ
206206
* @param pts タイムスタンプ
207207
*/
208-
protected void postData(byte[] data, long pts) {
208+
protected void postData(byte[] data, int length, long pts) {
209209
if (mCallback != null) {
210-
mCallback.onData(data, pts * 1000 / mClock);
210+
mCallback.onData(data, length, pts * 1000 / mClock);
211211
}
212212
}
213213

@@ -221,6 +221,108 @@ public interface Callback {
221221
* @param data データ
222222
* @param pts タイムスタンプ
223223
*/
224-
void onData(byte[] data, long pts);
224+
void onData(byte[] data, int length, long pts);
225+
}
226+
227+
/**
228+
* 受信した RTP パケットを格納するバッファ.
229+
*/
230+
protected static class Buffer {
231+
/**
232+
* データを格納するバッファ.
233+
*/
234+
private byte[] mData;
235+
236+
/**
237+
* バッファサイズ.
238+
*/
239+
private int mPosition;
240+
241+
/**
242+
* バッファをデフォルトサイズで初期化します.
243+
*/
244+
public Buffer() {
245+
this(4096);
246+
}
247+
248+
/**
249+
* 指定されたサイズでバッファを初期化します.
250+
* @param size バッファサイズ
251+
*/
252+
public Buffer(int size) {
253+
mData = new byte[size];
254+
}
255+
256+
/**
257+
* バッファのバイト配列を取得します.
258+
*
259+
* @return バッファのデータ
260+
*/
261+
public byte[] getData() {
262+
return mData;
263+
}
264+
265+
/**
266+
* 格納されたデータサイズを取得します.
267+
*
268+
* @return 格納されたデータサイズ
269+
*/
270+
public int getLength() {
271+
return mPosition;
272+
}
273+
274+
/**
275+
* リセットします.
276+
*/
277+
public void reset() {
278+
mPosition = 0;
279+
}
280+
281+
/**
282+
* バッファにデータを書き込みます.
283+
*
284+
* @param data データ
285+
*/
286+
public void write(int data) {
287+
if (mData.length < mPosition + 1) {
288+
extendData(mPosition + 32);
289+
}
290+
mData[mPosition] = (byte) (data & 0xFF);
291+
mPosition++;
292+
}
293+
294+
/**
295+
* バッファにデータを書き込みます.
296+
* @param data 書き込むデータ
297+
*/
298+
public void write(byte[] data) {
299+
write(data, 0, data.length);
300+
}
301+
302+
/**
303+
* バッファにデータを書き込みます.
304+
*
305+
* @param data 書き込むデータ
306+
* @param offset 書き込むデータのオフセット
307+
* @param length 書き込むデータサイズ
308+
*/
309+
public void write(byte[] data, int offset, int length) {
310+
if (mData.length < mPosition + length) {
311+
extendData(mPosition + length);
312+
}
313+
System.arraycopy(data, offset, mData, mPosition, length);
314+
mPosition += length;
315+
}
316+
317+
/**
318+
* バッファサイズを拡張します.
319+
*
320+
* @param size 拡張後のサイズ
321+
*/
322+
private void extendData(int size) {
323+
byte[] data = new byte[size];
324+
System.arraycopy(mData, 0, data, 0, mPosition);
325+
mData = data;
326+
}
225327
}
226328
}

dConnectSDK/dConnectLibStreaming/libmedia/src/main/java/org/deviceconnect/android/libmedia/streaming/rtp/RtpPacket.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public class RtpPacket {
99
/**
1010
* Maximum Transmission Unit(MTU).
1111
*/
12-
public static final int MTU = 1300;
12+
public static final int MTU = 1500;
1313

1414
/**
1515
* RTP データを格納するバッファ.

dConnectSDK/dConnectLibStreaming/libmedia/src/main/java/org/deviceconnect/android/libmedia/streaming/rtp/RtpReceiver.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ public class RtpReceiver {
66
/**
77
* RTP を受信するためのポート番号.
88
*/
9-
private int mRtpPort;
9+
private final int mRtpPort;
1010

1111
/**
1212
* RTCP を受信するためのポート番号.
1313
*/
14-
private int mRtcpPort;
14+
private final int mRtcpPort;
1515

1616
/**
1717
* RTP 受信用のスレッド.
@@ -127,6 +127,48 @@ public int getRtcpPort() {
127127
return mRtcpPort;
128128
}
129129

130+
/**
131+
* 受信したデータサイズを取得します.
132+
*
133+
* @return 受信したデータサイズ
134+
*/
135+
public long getReceivedSize() {
136+
long size = 0;
137+
if (mReceiverThread != null) {
138+
size += mReceiverThread.getReceiveSize();
139+
}
140+
if (mRtcpReceiverThread != null) {
141+
size += mRtcpReceiverThread.getReceiveSize();
142+
}
143+
return size;
144+
}
145+
146+
/**
147+
* 受信したデータサイズをリセットします.
148+
*/
149+
public void reset() {
150+
if (mReceiverThread != null) {
151+
mReceiverThread.resetReceiveSize();
152+
}
153+
if (mRtcpReceiverThread != null) {
154+
mRtcpReceiverThread.resetReceiveSize();
155+
}
156+
}
157+
158+
/**
159+
* 受信したデータの BPS を取得します.
160+
*/
161+
public long getBPS() {
162+
long bps = 0;
163+
if (mReceiverThread != null) {
164+
bps += mReceiverThread.getBPS();
165+
}
166+
if (mRtcpReceiverThread != null) {
167+
bps += mRtcpReceiverThread.getBPS();
168+
}
169+
return bps;
170+
}
171+
130172
/**
131173
* エラーを通知します.
132174
*

dConnectSDK/dConnectLibStreaming/libmedia/src/main/java/org/deviceconnect/android/libmedia/streaming/rtp/depacket/AACLATMDepacketize.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class AACLATMDepacketize extends RtpDepacketize {
1313
/**
1414
* データを格納するバッファ.
1515
*/
16-
private final ByteArrayOutputStream mOutputStream = new ByteArrayOutputStream();
16+
private final Buffer mOutputStream = new Buffer();
1717

1818
/**
1919
* RTP ヘッダーのシーケンス番号の同期フラグ.
@@ -59,7 +59,7 @@ public synchronized void write(byte[] data, int payloadStart, int dataLength) {
5959

6060
if (isNextPacket(data)) {
6161
if (mSync) {
62-
postData(mOutputStream.toByteArray(), getTimestamp(data));
62+
postData(mOutputStream.getData(), mOutputStream.getLength(), getTimestamp(data));
6363
}
6464
mOutputStream.reset();
6565
mSync = true;

dConnectSDK/dConnectLibStreaming/libmedia/src/main/java/org/deviceconnect/android/libmedia/streaming/rtp/depacket/H264Depacketize.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package org.deviceconnect.android.libmedia.streaming.rtp.depacket;
22

3-
import java.io.ByteArrayOutputStream;
4-
53
import org.deviceconnect.android.libmedia.streaming.rtp.RtpDepacketize;
64

75
public class H264Depacketize extends RtpDepacketize {
86
/**
97
* データを格納するバッファ.
108
*/
11-
private final ByteArrayOutputStream mOutputStream = new ByteArrayOutputStream();
9+
private final Buffer mOutputStream = new Buffer();
1210

1311
/**
1412
* RTP ヘッダーのシーケンス番号の同期フラグ.
@@ -70,7 +68,7 @@ private void decodeSingleNalu(byte[] data, int payloadStart, int dataLength) {
7068
mOutputStream.write(0x00);
7169
mOutputStream.write(0x01);
7270
mOutputStream.write(data, payloadStart, dataLength - payloadStart);
73-
postData(mOutputStream.toByteArray(), getTimestamp(data));
71+
postData(mOutputStream.getData(), mOutputStream.getLength(), getTimestamp(data));
7472
}
7573

7674
/**
@@ -102,7 +100,7 @@ private void decodeSTAP(byte[] data, int payloadStart, int dataLength, boolean i
102100
mOutputStream.write(0x01);
103101
mOutputStream.write(data, payloadStart, naluSize);
104102

105-
postData(mOutputStream.toByteArray(), getTimestamp(data));
103+
postData(mOutputStream.getData(), mOutputStream.getLength(), getTimestamp(data));
106104

107105
payloadStart += naluSize;
108106
}
@@ -144,7 +142,7 @@ private void decodeMTAP(byte[] data, int payloadStart, int dataLength, boolean i
144142
mOutputStream.write(0x01);
145143
mOutputStream.write(data, payloadStart, naluSize);
146144

147-
postData(mOutputStream.toByteArray(), ts + getTimestamp(data));
145+
postData(mOutputStream.getData(), mOutputStream.getLength(), ts + getTimestamp(data));
148146

149147
payloadStart += naluSize;
150148
}
@@ -179,7 +177,7 @@ private void decodeFu(byte[] data, int payloadStart, int dataLength, boolean isF
179177
mOutputStream.write(data, fuHeaderSize, dataLength - fuHeaderSize);
180178

181179
if (endBit && mSync) {
182-
postData(mOutputStream.toByteArray(), getTimestamp(data));
180+
postData(mOutputStream.getData(), mOutputStream.getLength(), getTimestamp(data));
183181
}
184182
}
185183
}

dConnectSDK/dConnectLibStreaming/libmedia/src/main/java/org/deviceconnect/android/libmedia/streaming/rtp/depacket/H265Depacketize.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public class H265Depacketize extends RtpDepacketize {
88
/**
99
* データを格納するバッファ.
1010
*/
11-
private final ByteArrayOutputStream mOutputStream = new ByteArrayOutputStream();
11+
private final Buffer mOutputStream = new Buffer();
1212

1313
/**
1414
* RTP ヘッダーのシーケンス番号の同期フラグ.
@@ -71,7 +71,7 @@ private void decodeSingleNalu(byte[] data, int payloadStart, int dataLength) {
7171
mOutputStream.write(0x00);
7272
mOutputStream.write(0x01);
7373
mOutputStream.write(data, payloadStart, dataLength - payloadStart);
74-
postData(mOutputStream.toByteArray(), getTimestamp(data));
74+
postData(mOutputStream.getData(), mOutputStream.getLength(), getTimestamp(data));
7575
}
7676

7777
private void decodeFragmentationUnits(byte[] data, int payloadStart, int dataLength) {
@@ -98,7 +98,7 @@ private void decodeFragmentationUnits(byte[] data, int payloadStart, int dataLen
9898
mOutputStream.write(data, fuHeaderSize, dataLength - fuHeaderSize);
9999

100100
if (endBit && mSync) {
101-
postData(mOutputStream.toByteArray(), getTimestamp(data));
101+
postData(mOutputStream.getData(), mOutputStream.getLength(), getTimestamp(data));
102102
}
103103
}
104104
}

dConnectSDK/dConnectLibStreaming/libmedia/src/main/java/org/deviceconnect/android/libmedia/streaming/rtp/depacket/OpusDepacketize.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public class OpusDepacketize extends RtpDepacketize {
88
/**
99
* データを格納するバッファ.
1010
*/
11-
private final ByteArrayOutputStream mOutputStream = new ByteArrayOutputStream();
11+
private final Buffer mOutputStream = new Buffer();
1212

1313
/**
1414
* RTP ヘッダーのシーケンス番号の同期フラグ.
@@ -32,7 +32,7 @@ public void write(byte[] data, int payloadStart, int dataLength) {
3232

3333
// if (isNextPacket(data)) {
3434
if (mSync) {
35-
postData(mOutputStream.toByteArray(), getTimestamp(data));
35+
postData(mOutputStream.getData(), mOutputStream.getLength(), getTimestamp(data));
3636
}
3737
mOutputStream.reset();
3838
mSync = true;

0 commit comments

Comments
 (0)