Merge commit '4f6cd883f06f7893a2b60a41e7a4f8ae633dac2f'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 1 Mar 2015 00:31:45 +0000 (01:31 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 1 Mar 2015 00:31:49 +0000 (01:31 +0100)
* commit '4f6cd883f06f7893a2b60a41e7a4f8ae633dac2f':
  rtpenc: Don't set max_frames_per_packet based on the packet frame size or frame rate

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/rtpenc.c
libavformat/rtpenc_aac.c
libavformat/rtpenc_amr.c
libavformat/rtpenc_xiph.c

diff --combined libavformat/rtpenc.c
@@@ -2,20 -2,20 +2,20 @@@
   * RTP output format
   * Copyright (c) 2002 Fabrice Bellard
   *
 - * 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
   */
  
@@@ -98,7 -98,7 +98,7 @@@ static int rtp_write_header(AVFormatCon
      }
      st = s1->streams[0];
      if (!is_supported(st->codec->codec_id)) {
 -        av_log(s1, AV_LOG_ERROR, "Unsupported codec %x\n", st->codec->codec_id);
 +        av_log(s1, AV_LOG_ERROR, "Unsupported codec %s\n", avcodec_get_name(st->codec->codec_id));
  
          return -1;
      }
          s->ssrc = av_get_random_seed();
      s->first_packet = 1;
      s->first_rtcp_ntp_time = ff_ntp_time();
 -    if (s1->start_time_realtime)
 +    if (s1->start_time_realtime != 0  &&  s1->start_time_realtime != AV_NOPTS_VALUE)
          /* Round the NTP time to whole milliseconds. */
          s->first_rtcp_ntp_time = (s1->start_time_realtime / 1000) * 1000 +
                                   NTP_OFFSET_US;
      // Pick a random sequence start number, but in the lower end of the
      // available range, so that any wraparound doesn't happen immediately.
      // (Immediate wraparound would be an issue for SRTP.)
 -    if (s->seq < 0)
 -        s->seq = av_get_random_seed() & 0x0fff;
 -    else
 +    if (s->seq < 0) {
 +        if (s1->flags & AVFMT_FLAG_BITEXACT) {
 +            s->seq = 0;
 +        } else
 +            s->seq = av_get_random_seed() & 0x0fff;
 +    } else
          s->seq &= 0xffff; // Use the given parameter, wrapped to the right interval
  
      if (s1->packet_size) {
      }
      s->max_payload_size = s1->packet_size - 12;
  
-     s->max_frames_per_packet = 0;
-     if (s1->max_delay > 0) {
-         if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
-             int frame_size = av_get_audio_frame_duration(st->codec, 0);
-             if (!frame_size)
-                 frame_size = st->codec->frame_size;
-             if (frame_size == 0) {
-                 av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n");
-             } else {
-                 s->max_frames_per_packet =
-                         av_rescale_q_rnd(s1->max_delay,
-                                          AV_TIME_BASE_Q,
-                                          (AVRational){ frame_size, st->codec->sample_rate },
-                                          AV_ROUND_DOWN);
-             }
-         }
-         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
-             /* FIXME: We should round down here... */
-             if (st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0) {
-                 s->max_frames_per_packet = av_rescale_q(s1->max_delay,
-                                                         (AVRational){1, 1000000},
-                                                         av_inv_q(st->avg_frame_rate));
-             } else
-                 s->max_frames_per_packet = 1;
-         }
-     }
      if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
          avpriv_set_pts_info(st, 32, 1, st->codec->sample_rate);
      } else {
          break;
      case AV_CODEC_ID_VORBIS:
      case AV_CODEC_ID_THEORA:
-         if (!s->max_frames_per_packet)
-             s->max_frames_per_packet = 15;
-         s->max_frames_per_packet = av_clip(s->max_frames_per_packet, 1, 15);
+         s->max_frames_per_packet = 15;
          break;
      case AV_CODEC_ID_ADPCM_G722:
          /* Due to a historical error, the clock rate for G722 in RTP is
              av_log(s1, AV_LOG_ERROR, "Incorrect iLBC block size specified\n");
              goto fail;
          }
-         if (!s->max_frames_per_packet)
-             s->max_frames_per_packet = 1;
-         s->max_frames_per_packet = FFMIN(s->max_frames_per_packet,
-                                          s->max_payload_size / st->codec->block_align);
+         s->max_frames_per_packet = s->max_payload_size / st->codec->block_align;
          break;
      case AV_CODEC_ID_AMR_NB:
      case AV_CODEC_ID_AMR_WB:
-         if (!s->max_frames_per_packet)
-             s->max_frames_per_packet = 12;
+         s->max_frames_per_packet = 50;
          if (st->codec->codec_id == AV_CODEC_ID_AMR_NB)
              n = 31;
          else
          }
          break;
      case AV_CODEC_ID_AAC:
-         if (!s->max_frames_per_packet)
-             s->max_frames_per_packet = 5;
+         s->max_frames_per_packet = 50;
          break;
      default:
          break;
@@@ -496,18 -459,23 +462,23 @@@ static int rtp_send_ilbc(AVFormatContex
      int frames = size / frame_size;
  
      while (frames > 0) {
-         int n = FFMIN(s->max_frames_per_packet - s->num_frames, frames);
+         if (s->num_frames > 0 &&
+             av_compare_ts(s->cur_timestamp - s->timestamp, st->time_base,
+                           s1->max_delay, AV_TIME_BASE_Q) >= 0) {
+             ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 1);
+             s->num_frames = 0;
+         }
  
          if (!s->num_frames) {
              s->buf_ptr = s->buf;
              s->timestamp = s->cur_timestamp;
          }
-         memcpy(s->buf_ptr, buf, n * frame_size);
-         frames           -= n;
-         s->num_frames    += n;
-         s->buf_ptr       += n * frame_size;
-         buf              += n * frame_size;
-         s->cur_timestamp += n * frame_duration;
+         memcpy(s->buf_ptr, buf, frame_size);
+         frames--;
+         s->num_frames++;
+         s->buf_ptr       += frame_size;
+         buf              += frame_size;
+         s->cur_timestamp += frame_duration;
  
          if (s->num_frames == s->max_frames_per_packet) {
              ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 1);
@@@ -590,10 -558,6 +561,10 @@@ static int rtp_write_packet(AVFormatCon
              const uint8_t *mb_info =
                  av_packet_get_side_data(pkt, AV_PKT_DATA_H263_MB_INFO,
                                          &mb_info_size);
 +            if (!mb_info) {
 +                av_log(s1, AV_LOG_ERROR, "failed to allocate side data\n");
 +                return AVERROR(ENOMEM);
 +            }
              ff_rtp_send_h263_rfc2190(s1, pkt->data, size, mb_info, mb_info_size);
              break;
          }
diff --combined libavformat/rtpenc_aac.c
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * copyright (c) 2007 Luca Abeni
   *
 - * 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
   */
  
@@@ -27,6 -27,7 +27,7 @@@
  void ff_rtp_send_aac(AVFormatContext *s1, const uint8_t *buff, int size)
  {
      RTPMuxContext *s = s1->priv_data;
+     AVStream *st = s1->streams[0];
      const int max_au_headers_size = 2 + 2 * s->max_frames_per_packet;
      int len, max_packet_size = s->max_payload_size - max_au_headers_size;
      uint8_t *p;
@@@ -41,7 -42,9 +42,9 @@@
      len = (s->buf_ptr - s->buf);
      if (s->num_frames &&
          (s->num_frames == s->max_frames_per_packet ||
-          (len + size) > s->max_payload_size)) {
+          (len + size) > s->max_payload_size ||
+          av_compare_ts(s->cur_timestamp - s->timestamp, st->time_base,
+                        s1->max_delay, AV_TIME_BASE_Q) >= 0)) {
          int au_size = s->num_frames * 2;
  
          p = s->buf + max_au_headers_size - au_size - 2;
diff --combined libavformat/rtpenc_amr.c
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2007 Luca Abeni
   * Copyright (c) 2009 Martin Storsjo
   *
 - * 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
   */
  
@@@ -30,6 -30,7 +30,7 @@@
  void ff_rtp_send_amr(AVFormatContext *s1, const uint8_t *buff, int size)
  {
      RTPMuxContext *s          = s1->priv_data;
+     AVStream *st              = s1->streams[0];
      int max_header_toc_size   = 1 + s->max_frames_per_packet;
      uint8_t *p;
      int len;
@@@ -38,7 -39,9 +39,9 @@@
      len = s->buf_ptr - s->buf;
      if (s->num_frames &&
          (s->num_frames == s->max_frames_per_packet ||
-          len + size - 1 > s->max_payload_size)) {
+          len + size - 1 > s->max_payload_size ||
+          av_compare_ts(s->cur_timestamp - s->timestamp, st->time_base,
+                        s1->max_delay, AV_TIME_BASE_Q) >= 0)) {
          int header_size = s->num_frames + 1;
          p = s->buf + max_header_toc_size - header_size;
          if (p != s->buf)
@@@ -2,24 -2,23 +2,24 @@@
   * RTP packetization for Xiph audio and video
   * Copyright (c) 2010 Josh Allmann
   *
 - * 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
   */
  
 +#include "libavutil/avassert.h"
  #include "libavutil/intreadwrite.h"
  
  #include "avformat.h"
@@@ -33,6 -32,7 +33,7 @@@
  void ff_rtp_send_xiph(AVFormatContext *s1, const uint8_t *buff, int size)
  {
      RTPMuxContext *s = s1->priv_data;
+     AVStream *st = s1->streams[0];
      int max_pkt_size, xdt, frag;
      uint8_t *q;
  
          uint8_t *ptr     = s->buf_ptr + 2 + size; // what we're going to write
          int remaining    = end_ptr - ptr;
  
 -        assert(s->num_frames <= s->max_frames_per_packet);
 +        av_assert1(s->num_frames <= s->max_frames_per_packet);
          if (s->num_frames > 0 &&
              (remaining < 0 ||
-              s->num_frames == s->max_frames_per_packet)) {
-             // send previous packets now; no room for new data
+              s->num_frames == s->max_frames_per_packet ||
+              av_compare_ts(s->cur_timestamp - s->timestamp, st->time_base,
+                            s1->max_delay, AV_TIME_BASE_Q) >= 0)) {
+             // send previous packets now; no room for new data, or too much delay
              ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
              s->num_frames = 0;
          }