aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Barbato <lu_zero@gentoo.org>2013-09-15 16:52:33 +0200
committerLuca Barbato <lu_zero@gentoo.org>2013-09-16 19:36:37 +0200
commitffb7669e47343ac0caa866361965fdb2bf6ed825 (patch)
tree384bd3b2b7c4e031f398d457ca34fb71f1b19ebf
parent97d35fa89f73468d64f663bfc0686aa6cddd8b6a (diff)
downloadffmpeg-ffb7669e47343ac0caa866361965fdb2bf6ed825.tar.gz
rtmp: Support play method in listen mode
-rw-r--r--libavformat/rtmpproto.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index 771d31f67a..381332f515 100644
--- a/libavformat/rtmpproto.c
+++ b/libavformat/rtmpproto.c
@@ -63,6 +63,7 @@ typedef enum {
STATE_SEEKING, ///< client has started the seek operation. Back on STATE_PLAYING when the time comes
STATE_PUBLISHING, ///< client has started sending multimedia data to server (for output)
STATE_RECEIVING, ///< received a publish command (for input)
+ STATE_SENDING, ///< received a play command (for output)
STATE_STOPPED, ///< the broadcast has been stopped
} ClientState;
@@ -1901,6 +1902,13 @@ static int send_invoke_response(URLContext *s, RTMPPacket *pkt)
// Send onStatus(NetStream.Publish.Start)
return write_status(s, pkt, "NetStream.Publish.Start",
filename);
+ } else if (!strcmp(command, "play")) {
+ ret = write_begin(s);
+ if (ret < 0)
+ return ret;
+ rt->state = STATE_SENDING;
+ return write_status(s, pkt, "NetStream.Play.Start",
+ filename);
} else {
if ((ret = ff_rtmp_packet_create(&spkt, RTMP_SYSTEM_CHANNEL,
RTMP_PT_INVOKE, 0,
@@ -2047,6 +2055,7 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt)
} else if (ff_amf_match_string(pkt->data, pkt->size, "releaseStream") ||
ff_amf_match_string(pkt->data, pkt->size, "FCPublish") ||
ff_amf_match_string(pkt->data, pkt->size, "publish") ||
+ ff_amf_match_string(pkt->data, pkt->size, "play") ||
ff_amf_match_string(pkt->data, pkt->size, "_checkbw") ||
ff_amf_match_string(pkt->data, pkt->size, "createStream")) {
if ((ret = send_invoke_response(s, pkt)) < 0)
@@ -2235,6 +2244,7 @@ static int get_packet(URLContext *s, int for_header)
}
if (for_header && (rt->state == STATE_PLAYING ||
rt->state == STATE_PUBLISHING ||
+ rt->state == STATE_SENDING ||
rt->state == STATE_RECEIVING)) {
ff_rtmp_packet_destroy(&rpkt);
return 0;
@@ -2520,7 +2530,6 @@ reconnect:
} else {
if (read_connect(s, s->priv_data) < 0)
goto fail;
- rt->is_input = 1;
}
do {