diff options
author | Martin Storsjö <martin@martin.st> | 2009-12-11 11:37:21 +0000 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2009-12-11 11:37:21 +0000 |
commit | 72b870b95b18865ea0851b0233f96a6a2159b8cf (patch) | |
tree | bccf813c37e5e9a83728cbb5fba574d0473a9f88 /libavformat/rtmpproto.c | |
parent | ab176fdffb7c696beea17b046804b3e5eb0d8351 (diff) | |
download | ffmpeg-72b870b95b18865ea0851b0233f96a6a2159b8cf.tar.gz |
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.c | 10 |
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; |