[Red5devs] [red5 commit] r3065 - in java/server/branches/paulg_mp4/src/org/red5: io/mp4/impl server/net/rtmp/codec server/...
codesite-noreply at google.com
codesite-noreply at google.com
Thu Sep 18 10:08:31 PDT 2008
Author: mondain
Date: Thu Sep 18 10:07:56 2008
New Revision: 3065
Modified:
java/server/branches/paulg_mp4/src/org/red5/io/mp4/impl/MP4Reader.java
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/event/Ping.java
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Constants.java
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Header.java
java/server/branches/paulg_mp4/src/org/red5/server/stream/FileStreamSource.java
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlayEngine.java
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlaylistSubscriberStream.java
java/server/branches/paulg_mp4/src/org/red5/server/stream/StreamTracker.java
java/server/branches/paulg_mp4/src/org/red5/server/stream/consumer/ConnectionConsumer.java
java/server/branches/paulg_mp4/src/org/red5/server/stream/provider/FileProvider.java
Log:
Added more debug logging and two new RTMP headers that may be needed for
h.264 content
Modified:
java/server/branches/paulg_mp4/src/org/red5/io/mp4/impl/MP4Reader.java
==============================================================================
--- java/server/branches/paulg_mp4/src/org/red5/io/mp4/impl/MP4Reader.java
(original)
+++ java/server/branches/paulg_mp4/src/org/red5/io/mp4/impl/MP4Reader.java
Thu Sep 18 10:07:56 2008
@@ -857,12 +857,17 @@
(byte) 0xce, (byte) 0x3c, (byte) 0x80});
//fake avcc
- //(byte) 0x01, (byte) 0x4D, (byte) 0x40, (byte) 0x1F, (byte) 0xFF,
(byte) 0xE1, (byte) 0x00,
- //(byte) 0x14, (byte) 0x27, (byte) 0x4D, (byte) 0x40, (byte) 0x1F,
(byte) 0xA9, (byte) 0x18,
- //(byte) 0x0A, (byte) 0x00, (byte) 0x8B, (byte) 0x60, (byte) 0x0D,
(byte) 0x41, (byte) 0x80,
- //(byte) 0x41, (byte) 0x8C, (byte) 0x2B, (byte) 0x5E, (byte) 0xF7,
(byte) 0xC0, (byte) 0x40,
- //(byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0xCE,
(byte) 0x09, (byte) 0xC8
-
+ /*
+ byte[] fakeAvcc = new byte[]{
+ (byte) 0x01, (byte) 0x4D, (byte) 0x40, (byte) 0x1F, (byte) 0xFF,
(byte) 0xE1, (byte) 0x00,
+ (byte) 0x14, (byte) 0x27, (byte) 0x4D, (byte) 0x40, (byte) 0x1F,
(byte) 0xA9, (byte) 0x18,
+ (byte) 0x0A, (byte) 0x00, (byte) 0x8B, (byte) 0x60, (byte) 0x0D,
(byte) 0x41, (byte) 0x80,
+ (byte) 0x41, (byte) 0x8C, (byte) 0x2B, (byte) 0x5E, (byte) 0xF7,
(byte) 0xC0, (byte) 0x40,
+ (byte) 0x01, (byte) 0x00, (byte) 0x04, (byte) 0x28, (byte) 0xCE,
(byte) 0x09, (byte) 0xC8
+ };
+ log.debug("Fake: {}", new String(fakeAvcc));
+ */
+
body.flip();
tag.setBody(body);
@@ -1069,7 +1074,7 @@
Collections.sort(frames);
log.debug("Frames count (expect 16042 for backcountry): {}",
frames.size());
- log.debug("Frames: {}", frames);
+ //log.debug("Frames: {}", frames);
keyframeMeta = new KeyFrameMeta();
keyframeMeta.duration = duration;
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolDecoder.java
Thu Sep 18 10:07:56 2008
@@ -910,11 +910,13 @@
/** {@inheritDoc} */
public AudioData decodeAudioData(ByteBuffer in) {
+ log.debug("decodeAudioData");
return new AudioData(in.asReadOnlyBuffer());
}
/** {@inheritDoc} */
public VideoData decodeVideoData(ByteBuffer in) {
+ log.debug("decodeVideoData");
return new VideoData(in.asReadOnlyBuffer());
}
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/codec/RTMPProtocolEncoder.java
Thu Sep 18 10:07:56 2008
@@ -256,7 +256,18 @@
RTMPUtils.writeMediumInt(buf, header.getTimer());
break;
case HEADER_CONTINUE:
+ break;
+ case HEADER_H264_INIT:
+ RTMPUtils.writeMediumInt(buf, header.getTimer());
+ RTMPUtils.writeMediumInt(buf, header.getSize());
+ buf.put(header.getDataType());
+ RTMPUtils.writeReverseInt(buf, header.getStreamId());
break;
+ case HEADER_H264_DATA:
+ RTMPUtils.writeMediumInt(buf, header.getTimer());
+ RTMPUtils.writeMediumInt(buf, header.getSize());
+ buf.put(header.getDataType());
+ break;
default:
}
}
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/event/Ping.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/event/Ping.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/event/Ping.java
Thu Sep 18 10:07:56 2008
@@ -108,6 +108,14 @@
this.value3 = value3;
this.value4 = value4;
}
+
+ public Ping(Ping in) {
+ super(Type.SYSTEM);
+ this.value1 = in.getValue1();
+ this.value2 = in.getValue2();
+ this.value3 = in.getValue3();
+ this.value4 = in.getValue4();
+ }
/** {@inheritDoc} */
@Override
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Constants.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Constants.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Constants.java
Thu Sep 18 10:07:56 2008
@@ -126,6 +126,18 @@
public static final byte HEADER_CONTINUE = 0x03;
/**
+ * New H264 header marker. This will be sent for the "first"
+ * sets of data, the audio / video "extra" data and the first
+ * samples.
+ */
+ public static final byte HEADER_H264_INIT = 0x05;
+
+ /**
+ * There's more audio / video
+ */
+ public static final byte HEADER_H264_DATA = 0x45;
+
+ /**
* Size of initial handshake between client and server
*/
public static final int HANDSHAKE_SIZE = 1536;
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Header.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Header.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/net/rtmp/message/Header.java
Thu Sep 18 10:07:56 2008
@@ -178,7 +178,7 @@
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("ChannelId: ").append(channelId).append(", ");
- sb.append("Timer: ").append(timer).append(" (" +
(timerRelative ? "relative" : "absolute") + ')').append(", ");
+ sb.append("Timer: ").append(timer).append("
(").append(timerRelative ? "relative" : "absolute").append("), ");
sb.append("Size: ").append(size).append(", ");
sb.append("DataType: ").append(dataType).append(", ");
sb.append("StreamId: ").append(streamId);
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/stream/FileStreamSource.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/stream/FileStreamSource.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/stream/FileStreamSource.java
Thu Sep 18 10:07:56 2008
@@ -70,7 +70,7 @@
* @return RTMP event
*/
public IRTMPEvent dequeue() {
-
+ log.debug("dequeue");
if (!reader.hasMoreTags()) {
return null;
}
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlayEngine.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlayEngine.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlayEngine.java
Thu Sep 18 10:07:56 2008
@@ -692,17 +692,15 @@
// check client buffer length when we've already sent some messages
if (lastMessage != null) {
// Duration the stream is playing
+ log.debug("okayToSendMessage: now {} playback start {}", now,
playbackStart);
final long delta = now - playbackStart;
// Buffer size as requested by the client
final long buffer = playlistSubscriberStream.getClientBufferDuration();
// Expected amount of data present in client buffer
final long buffered = lastMessage.getTimestamp() - delta;
- log
- .debug(
- "okayToSendMessage: timestamp {} delta {} buffered {} buffer {}",
- new Object[] { lastMessage.getTimestamp(), delta,
- buffered, buffer });
+ log.debug("okayToSendMessage: timestamp {} delta {} buffered {} buffer
{}",
+ new Object[] { lastMessage.getTimestamp(), delta, buffered, buffer });
if (buffer > 0 && buffered > buffer) {
// Client is likely to have enough data in the buffer
return false;
@@ -1010,7 +1008,7 @@
* Send playlist switch status notification
*/
private void sendSwitchStatus() {
- // TODO: find correct duration to sent
+ // TODO: find correct duration to send
int duration = 1;
sendOnPlayStatus(StatusCodes.NS_PLAY_SWITCH, duration, bytesSent);
}
@@ -1253,6 +1251,7 @@
.getAttribute(IBroadcastScope.STREAM_ATTRIBUTE);
if (stream != null && stream.getCodecInfo() != null) {
videoCodec = stream.getCodecInfo().getVideoCodec();
+ log.debug("Video codec: {}", videoCodec);
}
}
@@ -1280,7 +1279,7 @@
}
//Long[] writeDelta = getWriteDelta();
- if (pendingVideos > 1 /*|| writeDelta[0] > writeDelta[1]*/) {
+ if (pendingVideos > 1) {
// We drop because the client has insufficient bandwidth.
long now = System.currentTimeMillis();
if (bufferCheckInterval > 0
@@ -1369,24 +1368,6 @@
return playlistSubscriberStream.getConnection().getPendingMessages();
}
- /**
- * Get informations about bytes send and number of bytes the client
reports
- * to have received.
- *
- * @return Written bytes and number of bytes the client received
- */
-// private Long[] getWriteDelta() {
-// OOBControlMessage pendingRequest = new OOBControlMessage();
-// pendingRequest.setTarget("ConnectionConsumer");
-// pendingRequest.setServiceName("writeDelta");
-// msgOut.sendOOBControlMessage(this, pendingRequest);
-// if (pendingRequest.getResult() != null) {
-// return (Long[]) pendingRequest.getResult();
-// } else {
-// return new Long[] { Long.valueOf(0), Long.valueOf(0) };
-// }
-// }
-
public boolean isPullMode() {
return pullMode;
}
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlaylistSubscriberStream.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlaylistSubscriberStream.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/stream/PlaylistSubscriberStream.java
Thu Sep 18 10:07:56 2008
@@ -199,16 +199,15 @@
IConsumerService consumerService = (IConsumerService)
ctx.getBean(IConsumerService.KEY);
IProviderService providerService = (IProviderService)
ctx.getBean(IProviderService.BEAN_NAME);
- engine = new PlayEngine.Builder(this, schedulingService,
consumerService, providerService).build();
+ //engine = new PlayEngine.Builder(this, schedulingService,
consumerService, providerService).build();
+ createEngine(schedulingService, consumerService, providerService);
} else {
log.info("Scope was null on start");
}
}
- // Create bw control service from Spring bean factory
- // and register myself
- // XXX Bandwidth control service should not be bound to
- // a specific scope because it's designed to control
- // the bandwidth system-wide.
+ // Create bw control service from Spring bean factory and register myself
+ // XXX Bandwidth control service should not be bound to a specific scope
+ // because it's designed to control the bandwidth system-wide.
if (bwController == null) {
bwController = (IBWControlService)
getScope().getContext().getBean(IBWControlService.KEY);
}
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/stream/StreamTracker.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/stream/StreamTracker.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/stream/StreamTracker.java
Thu Sep 18 10:07:56 2008
@@ -53,7 +53,7 @@
/**
* RTMP event handler
* @param event RTMP event
- * @return Timeframe since last notification (or auido or
video packet sending)
+ * @return Timeframe since last notification (or audio or
video packet sending)
*/
public int add(IRTMPEvent event) {
relative = true;
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/stream/consumer/ConnectionConsumer.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/stream/consumer/ConnectionConsumer.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/stream/consumer/ConnectionConsumer.java
Thu Sep 18 10:07:56 2008
@@ -105,6 +105,7 @@
/** {@inheritDoc} */
public void pushMessage(IPipe pipe, IMessage message) {
+ log.debug("pushMessage");
if (message instanceof ResetMessage) {
streamTracker.reset();
} else if (message instanceof StatusMessage) {
@@ -153,9 +154,7 @@
audio.write(audioData);
break;
case Constants.TYPE_PING:
- Ping ping = new Ping(((Ping) msg).getValue1(), ((Ping) msg)
- .getValue2(), ((Ping) msg).getValue3(),
- ((Ping) msg).getValue4());
+ Ping ping = new Ping(((Ping) msg));
header.setTimerRelative(false);
header.setTimer(0);
ping.setHeader(header);
Modified:
java/server/branches/paulg_mp4/src/org/red5/server/stream/provider/FileProvider.java
==============================================================================
---
java/server/branches/paulg_mp4/src/org/red5/server/stream/provider/FileProvider.java
(original)
+++
java/server/branches/paulg_mp4/src/org/red5/server/stream/provider/FileProvider.java
Thu Sep 18 10:07:56 2008
@@ -117,6 +117,7 @@
/** {@inheritDoc} */
public synchronized IMessage pullMessage(IPipe pipe) throws
IOException {
+ log.debug("pullMessage");
if (this.pipe != pipe) {
return null;
}
More information about the Red5devs
mailing list