You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.3KB

  1. /*
  2. * RTP packetization for AMR audio
  3. * Copyright (c) 2007 Luca Abeni
  4. * Copyright (c) 2009 Martin Storsjo
  5. *
  6. * This file is part of Libav.
  7. *
  8. * Libav is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * Libav is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with Libav; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. #include "avformat.h"
  23. #include "rtpenc.h"
  24. /**
  25. * Packetize AMR frames into RTP packets according to RFC 3267,
  26. * in octet-aligned mode.
  27. */
  28. void ff_rtp_send_amr(AVFormatContext *s1, const uint8_t *buff, int size)
  29. {
  30. RTPMuxContext *s = s1->priv_data;
  31. AVStream *st = s1->streams[0];
  32. int max_header_toc_size = 1 + s->max_frames_per_packet;
  33. uint8_t *p;
  34. int len;
  35. /* Test if the packet must be sent. */
  36. len = s->buf_ptr - s->buf;
  37. if (s->num_frames &&
  38. (s->num_frames == s->max_frames_per_packet ||
  39. len + size - 1 > s->max_payload_size ||
  40. av_compare_ts(s->cur_timestamp - s->timestamp, st->time_base,
  41. s1->max_delay, AV_TIME_BASE_Q) >= 0)) {
  42. int header_size = s->num_frames + 1;
  43. p = s->buf + max_header_toc_size - header_size;
  44. if (p != s->buf)
  45. memmove(p, s->buf, header_size);
  46. ff_rtp_send_data(s1, p, s->buf_ptr - p, 1);
  47. s->num_frames = 0;
  48. }
  49. if (!s->num_frames) {
  50. s->buf[0] = 0xf0;
  51. s->buf_ptr = s->buf + max_header_toc_size;
  52. s->timestamp = s->cur_timestamp;
  53. } else {
  54. /* Mark the previous TOC entry as having more entries following. */
  55. s->buf[1 + s->num_frames - 1] |= 0x80;
  56. }
  57. /* Copy the frame type and quality bits. */
  58. s->buf[1 + s->num_frames++] = buff[0] & 0x7C;
  59. buff++;
  60. size--;
  61. memcpy(s->buf_ptr, buff, size);
  62. s->buf_ptr += size;
  63. }