summaryrefslogtreecommitdiff
path: root/libavformat/rtmpproto.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2009-12-11 11:37:21 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2009-12-11 11:37:21 +0000
commit72b870b95b18865ea0851b0233f96a6a2159b8cf (patch)
treebccf813c37e5e9a83728cbb5fba574d0473a9f88 /libavformat/rtmpproto.c
parentab176fdffb7c696beea17b046804b3e5eb0d8351 (diff)
Do not try to interact with RTMP server after "stop" command was received.
Patch by Martin Storsjö ($name at $name dot `Sao Tome and Principe domain`) Originally committed as revision 20797 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/rtmpproto.c')
-rw-r--r--libavformat/rtmpproto.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index 96367e5eb5..c9b177493d 100644
--- a/libavformat/rtmpproto.c
+++ b/libavformat/rtmpproto.c
@@ -53,6 +53,7 @@ typedef enum {
STATE_READY, ///< client has sent all needed commands and waits for server reply
STATE_PLAYING, ///< client has started receiving multimedia data from server
STATE_PUBLISHING, ///< client has started sending multimedia data to server (for output)
+ STATE_STOPPED, ///< the broadcast has been stopped
} ClientState;
/** protocol handler context */
@@ -619,6 +620,8 @@ static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt)
t = ff_amf_get_field_value(ptr, data_end,
"code", tmpstr, sizeof(tmpstr));
if (!t && !strcmp(tmpstr, "NetStream.Play.Start")) rt->state = STATE_PLAYING;
+ if (!t && !strcmp(tmpstr, "NetStream.Play.Stop")) rt->state = STATE_STOPPED;
+ if (!t && !strcmp(tmpstr, "NetStream.Play.UnpublishNotify")) rt->state = STATE_STOPPED;
if (!t && !strcmp(tmpstr, "NetStream.Publish.Start")) rt->state = STATE_PUBLISHING;
}
break;
@@ -642,6 +645,9 @@ static int get_packet(URLContext *s, int for_header)
RTMPContext *rt = s->priv_data;
int ret;
+ if (rt->state == STATE_STOPPED)
+ return AVERROR_EOF;
+
for (;;) {
RTMPPacket rpkt;
if ((ret = ff_rtmp_packet_read(rt->stream, &rpkt,
@@ -658,6 +664,10 @@ static int get_packet(URLContext *s, int for_header)
ff_rtmp_packet_destroy(&rpkt);
return -1;
}
+ if (rt->state == STATE_STOPPED) {
+ ff_rtmp_packet_destroy(&rpkt);
+ return AVERROR_EOF;
+ }
if (for_header && (rt->state == STATE_PLAYING || rt->state == STATE_PUBLISHING)) {
ff_rtmp_packet_destroy(&rpkt);
return 0;