g7221_sdp_match.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
  3. * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. */
  19. #include <pjmedia-codec/g7221_sdp_match.h>
  20. #include <pjmedia/errno.h>
  21. #include <pj/pool.h>
  22. #include <pj/string.h>
  23. #define GET_FMTP_IVAL_BASE(ival, base, fmtp, param, default_val) \
  24. do { \
  25. pj_str_t s; \
  26. char *p; \
  27. p = pj_stristr(&fmtp.fmt_param, &param); \
  28. if (!p) { \
  29. ival = default_val; \
  30. break; \
  31. } \
  32. pj_strset(&s, p + param.slen, fmtp.fmt_param.slen - \
  33. (p - fmtp.fmt_param.ptr) - param.slen); \
  34. ival = pj_strtoul2(&s, NULL, base); \
  35. } while (0)
  36. #define GET_FMTP_IVAL(ival, fmtp, param, default_val) \
  37. GET_FMTP_IVAL_BASE(ival, 10, fmtp, param, default_val)
  38. PJ_DEF(pj_status_t) pjmedia_codec_g7221_match_sdp(pj_pool_t *pool,
  39. pjmedia_sdp_media *offer,
  40. unsigned o_fmt_idx,
  41. pjmedia_sdp_media *answer,
  42. unsigned a_fmt_idx,
  43. unsigned option)
  44. {
  45. const pjmedia_sdp_attr *attr_ans;
  46. const pjmedia_sdp_attr *attr_ofr;
  47. pjmedia_sdp_fmtp fmtp;
  48. unsigned a_bitrate, o_bitrate;
  49. const pj_str_t bitrate = {"bitrate=", 8};
  50. pj_status_t status;
  51. PJ_UNUSED_ARG(pool);
  52. PJ_UNUSED_ARG(option);
  53. /* Parse offer */
  54. attr_ofr = pjmedia_sdp_media_find_attr2(offer, "fmtp",
  55. &offer->desc.fmt[o_fmt_idx]);
  56. if (!attr_ofr)
  57. return PJMEDIA_SDP_EINFMTP;
  58. status = pjmedia_sdp_attr_get_fmtp(attr_ofr, &fmtp);
  59. if (status != PJ_SUCCESS)
  60. return status;
  61. GET_FMTP_IVAL(o_bitrate, fmtp, bitrate, 0);
  62. /* Parse answer */
  63. attr_ans = pjmedia_sdp_media_find_attr2(answer, "fmtp",
  64. &answer->desc.fmt[a_fmt_idx]);
  65. if (!attr_ans)
  66. return PJMEDIA_SDP_EINFMTP;
  67. status = pjmedia_sdp_attr_get_fmtp(attr_ans, &fmtp);
  68. if (status != PJ_SUCCESS)
  69. return status;
  70. GET_FMTP_IVAL(a_bitrate, fmtp, bitrate, 0);
  71. /* Compare bitrate in answer and offer. */
  72. if (a_bitrate != o_bitrate)
  73. return PJMEDIA_SDP_EFORMATNOTEQUAL;
  74. return PJ_SUCCESS;
  75. }