changeset 5430:bbfed6be7f29 libavformat

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`)
author kostya
date Fri, 11 Dec 2009 11:37:21 +0000
parents 2abcf559f2c2
children b0eb87793222
files rtmpproto.c
diffstat 1 files changed, 10 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/rtmpproto.c	Thu Dec 10 23:06:23 2009 +0000
+++ b/rtmpproto.c	Fri Dec 11 11:37:21 2009 +0000
@@ -53,6 +53,7 @@
     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 @@
             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 @@
     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 @@
             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;