Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 17 Sep 2013 11:03:44 +0000 (13:03 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 17 Sep 2013 11:03:50 +0000 (13:03 +0200)
* qatar/master:
  rtmp: rename main_channel_id to stream_id.

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/rtmpproto.c

diff --combined libavformat/rtmpproto.c
@@@ -2,20 -2,20 +2,20 @@@
   * RTMP network protocol
   * Copyright (c) 2009 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -48,7 -48,7 +48,7 @@@
  #include <zlib.h>
  #endif
  
 -#define APP_MAX_LENGTH 128
 +#define APP_MAX_LENGTH 1024
  #define PLAYPATH_MAX_LENGTH 256
  #define TCURL_MAX_LENGTH 512
  #define FLASHVER_MAX_LENGTH 64
@@@ -85,7 -85,7 +85,7 @@@ typedef struct RTMPContext 
      char          *app;                       ///< name of application
      char          *conn;                      ///< append arbitrary AMF data to the Connect message
      ClientState   state;                      ///< current state
-     int           main_channel_id;            ///< an additional channel ID which is used for some invocations
+     int           stream_id;                  ///< ID assigned by the server for the stream
      uint8_t*      flv_data;                   ///< buffer with data for demuxer
      int           flv_size;                   ///< current buffer size
      int           flv_off;                    ///< number of bytes read from current buffer
@@@ -266,6 -266,9 +266,6 @@@ static int rtmp_write_amf_data(URLConte
          *value = '\0';
          value++;
  
 -        if (!field || !value)
 -            goto fail;
 -
          ff_amf_write_field_name(p, field);
      } else {
          goto fail;
@@@ -312,7 -315,7 +312,7 @@@ static int gen_connect(URLContext *s, R
      int ret;
  
      if ((ret = ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE,
 -                                     0, 4096)) < 0)
 +                                     0, 4096 + APP_MAX_LENGTH)) < 0)
          return ret;
  
      p = pkt.data;
@@@ -652,7 -655,7 +652,7 @@@ static int gen_delete_stream(URLContex
      ff_amf_write_string(&p, "deleteStream");
      ff_amf_write_number(&p, ++rt->nb_invokes);
      ff_amf_write_null(&p);
-     ff_amf_write_number(&p, rt->main_channel_id);
+     ff_amf_write_number(&p, rt->stream_id);
  
      return rtmp_send_packet(rt, &pkt, 0);
  }
@@@ -672,7 -675,7 +672,7 @@@ static int gen_buffer_time(URLContext *
  
      p = pkt.data;
      bytestream_put_be16(&p, 3);
-     bytestream_put_be32(&p, rt->main_channel_id);
+     bytestream_put_be32(&p, rt->stream_id);
      bytestream_put_be32(&p, rt->client_buffer_time);
  
      return rtmp_send_packet(rt, &pkt, 0);
@@@ -694,7 -697,7 +694,7 @@@ static int gen_play(URLContext *s, RTMP
                                       0, 29 + strlen(rt->playpath))) < 0)
          return ret;
  
-     pkt.extra = rt->main_channel_id;
+     pkt.extra = rt->stream_id;
  
      p = pkt.data;
      ff_amf_write_string(&p, "play");
@@@ -718,7 -721,7 +718,7 @@@ static int gen_seek(URLContext *s, RTMP
      if ((ret = ff_rtmp_packet_create(&pkt, 3, RTMP_PT_INVOKE, 0, 26)) < 0)
          return ret;
  
-     pkt.extra = rt->main_channel_id;
+     pkt.extra = rt->stream_id;
  
      p = pkt.data;
      ff_amf_write_string(&p, "seek");
@@@ -744,7 -747,7 +744,7 @@@ static int gen_publish(URLContext *s, R
                                       0, 30 + strlen(rt->playpath))) < 0)
          return ret;
  
-     pkt.extra = rt->main_channel_id;
+     pkt.extra = rt->stream_id;
  
      p = pkt.data;
      ff_amf_write_string(&p, "publish");
@@@ -1165,7 -1168,7 +1165,7 @@@ static int rtmp_handshake(URLContext *s
      for (i = 9; i <= RTMP_HANDSHAKE_PACKET_SIZE; i++)
          tosend[i] = av_lfg_get(&rnd) >> 24;
  
 -    if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +    if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
          /* When the client wants to use RTMPE, we have to change the command
           * byte to 0x06 which means to use encrypted data and we have to set
           * the flash version to at least 9.0.115.0. */
          if (ret < 0)
              return ret;
  
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Compute the shared secret key sent by the server and initialize
               * the RC4 encryption. */
              if ((ret = ff_rtmpe_compute_secret_key(rt->stream, serverdata + 1,
          if (ret < 0)
              return ret;
  
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Encrypt the signature to be send to the server. */
              ff_rtmpe_encrypt_sig(rt->stream, tosend +
                                   RTMP_HANDSHAKE_PACKET_SIZE - 32, digest,
                                 RTMP_HANDSHAKE_PACKET_SIZE)) < 0)
              return ret;
  
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Set RC4 keys for encryption and update the keystreams. */
              if ((ret = ff_rtmpe_update_keystream(rt->stream)) < 0)
                  return ret;
          }
      } else {
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Compute the shared secret key sent by the server and initialize
               * the RC4 encryption. */
              if ((ret = ff_rtmpe_compute_secret_key(rt->stream, serverdata + 1,
                                 RTMP_HANDSHAKE_PACKET_SIZE)) < 0)
              return ret;
  
 -        if (rt->encrypted && CONFIG_FFRTMPCRYPT_PROTOCOL) {
 +        if (CONFIG_FFRTMPCRYPT_PROTOCOL && rt->encrypted) {
              /* Set RC4 keys for encryption and update the keystreams. */
              if ((ret = ff_rtmpe_update_keystream(rt->stream)) < 0)
                  return ret;
@@@ -1977,7 -1980,7 +1977,7 @@@ static int handle_invoke_result(URLCont
          if (pkt->data[10] || pkt->data[19] != 5 || pkt->data[20]) {
              av_log(s, AV_LOG_WARNING, "Unexpected reply on connect()\n");
          } else {
-             rt->main_channel_id = av_int2double(AV_RB64(pkt->data + 21));
+             rt->stream_id = av_int2double(AV_RB64(pkt->data + 21));
          }
  
          if (!rt->is_input) {
@@@ -2205,7 -2208,7 +2205,7 @@@ static int get_packet(URLContext *s, in
              }
          }
          rt->bytes_read += ret;
 -        if (rt->bytes_read > rt->last_bytes_read + rt->client_report_size) {
 +        if (rt->bytes_read - rt->last_bytes_read > rt->client_report_size) {
              av_log(s, AV_LOG_DEBUG, "Sending bytes read report\n");
              if ((ret = gen_bytes_read(s, rt, rpkt.timestamp + 1)) < 0)
                  return ret;
@@@ -2450,20 -2453,16 +2450,20 @@@ reconnect
              fname = strchr(p + 1, '/');
              if (!fname || (c && c < fname)) {
                  fname = p + 1;
 -                av_strlcpy(rt->app, path + 1, p - path);
 +                av_strlcpy(rt->app, path + 1, FFMIN(p - path, APP_MAX_LENGTH));
              } else {
                  fname++;
 -                av_strlcpy(rt->app, path + 1, fname - path - 1);
 +                av_strlcpy(rt->app, path + 1, FFMIN(fname - path - 1, APP_MAX_LENGTH));
              }
          }
      }
  
      if (old_app) {
          // The name of application has been defined by the user, override it.
 +        if (strlen(old_app) >= APP_MAX_LENGTH) {
 +            ret = AVERROR(EINVAL);
 +            goto fail;
 +        }
          av_free(rt->app);
          rt->app = old_app;
      }
@@@ -2668,7 -2667,7 +2668,7 @@@ static int rtmp_write(URLContext *s, co
                                               pkttype, ts, pktsize)) < 0)
                  return ret;
  
-             rt->out_pkt.extra = rt->main_channel_id;
+             rt->out_pkt.extra = rt->stream_id;
              rt->flv_data = rt->out_pkt.data;
  
              if (pkttype == RTMP_PT_NOTIFY)