[3/3] rtpenc: Add support for G726 audio

Message ID 1322688143-57029-3-git-send-email-martin@martin.st
State Superseded
Headers show

Commit Message

Martin Storsjö Nov. 30, 2011, 9:22 p.m.
---
 libavformat/rtpenc.c |    5 +++++
 libavformat/sdp.c    |   10 ++++++++++
 2 files changed, 15 insertions(+), 0 deletions(-)

Comments

Justin Ruggles Nov. 30, 2011, 10 p.m. | #1
On 11/30/2011 04:22 PM, Martin Storsjö wrote:

> ---
>  libavformat/rtpenc.c |    5 +++++
>  libavformat/sdp.c    |   10 ++++++++++
>  2 files changed, 15 insertions(+), 0 deletions(-)
> 
> diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c
> index 7434837..1f036a6 100644
> --- a/libavformat/rtpenc.c
> +++ b/libavformat/rtpenc.c
> @@ -72,6 +72,7 @@ static int is_supported(enum CodecID id)
>      case CODEC_ID_THEORA:
>      case CODEC_ID_VP8:
>      case CODEC_ID_ADPCM_G722:
> +    case CODEC_ID_ADPCM_G726:
>          return 1;
>      default:
>          return 0;
> @@ -411,6 +412,10 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
>           * clock. */
>          rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
>          break;
> +    case CODEC_ID_ADPCM_G726:
> +        rtp_send_samples(s1, pkt->data, size,
> +                         st->codec->bits_per_coded_sample * st->codec->channels);
> +        break;
>      case CODEC_ID_MP2:
>      case CODEC_ID_MP3:
>          rtp_send_mpegaudio(s1, pkt->data, size);
> diff --git a/libavformat/sdp.c b/libavformat/sdp.c
> index ba3d4dd..c27c671 100644
> --- a/libavformat/sdp.c
> +++ b/libavformat/sdp.c
> @@ -517,6 +517,16 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
>                                           payload_type,
>                                           8000, c->channels);
>              break;
> +        case CODEC_ID_ADPCM_G726: {
> +            int bitrate = c->bit_rate;
> +            if (!bitrate)
> +                bitrate = c->sample_rate * c->bits_per_coded_sample;
> +            if (payload_type >= RTP_PT_PRIVATE)
> +                av_strlcatf(buff, size, "a=rtpmap:%d G726-%d/%d\r\n",
> +                                         payload_type, bitrate/1000,
> +                                         c->sample_rate);
> +            break;
> +        }
>          default:
>              /* Nothing special to do here... */
>              break;


non-standard rates might not work well here.

if we want to support that, it probably would be best to use
bits_per_coded_sample to map 2,3,4,5 to 16,24,32,40 independent of the
actual bitrate.

-Justin
Martin Storsjö Dec. 1, 2011, 10:25 a.m. | #2
On Wed, 30 Nov 2011, Justin Ruggles wrote:

> On 11/30/2011 04:22 PM, Martin Storsjö wrote:
>
>> ---
>>  libavformat/rtpenc.c |    5 +++++
>>  libavformat/sdp.c    |   10 ++++++++++
>>  2 files changed, 15 insertions(+), 0 deletions(-)
>>
>> diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c
>> index 7434837..1f036a6 100644
>> --- a/libavformat/rtpenc.c
>> +++ b/libavformat/rtpenc.c
>> @@ -72,6 +72,7 @@ static int is_supported(enum CodecID id)
>>      case CODEC_ID_THEORA:
>>      case CODEC_ID_VP8:
>>      case CODEC_ID_ADPCM_G722:
>> +    case CODEC_ID_ADPCM_G726:
>>          return 1;
>>      default:
>>          return 0;
>> @@ -411,6 +412,10 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
>>           * clock. */
>>          rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
>>          break;
>> +    case CODEC_ID_ADPCM_G726:
>> +        rtp_send_samples(s1, pkt->data, size,
>> +                         st->codec->bits_per_coded_sample * st->codec->channels);
>> +        break;
>>      case CODEC_ID_MP2:
>>      case CODEC_ID_MP3:
>>          rtp_send_mpegaudio(s1, pkt->data, size);
>> diff --git a/libavformat/sdp.c b/libavformat/sdp.c
>> index ba3d4dd..c27c671 100644
>> --- a/libavformat/sdp.c
>> +++ b/libavformat/sdp.c
>> @@ -517,6 +517,16 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
>>                                           payload_type,
>>                                           8000, c->channels);
>>              break;
>> +        case CODEC_ID_ADPCM_G726: {
>> +            int bitrate = c->bit_rate;
>> +            if (!bitrate)
>> +                bitrate = c->sample_rate * c->bits_per_coded_sample;
>> +            if (payload_type >= RTP_PT_PRIVATE)
>> +                av_strlcatf(buff, size, "a=rtpmap:%d G726-%d/%d\r\n",
>> +                                         payload_type, bitrate/1000,
>> +                                         c->sample_rate);
>> +            break;
>> +        }
>>          default:
>>              /* Nothing special to do here... */
>>              break;
>
>
> non-standard rates might not work well here.
>
> if we want to support that, it probably would be best to use
> bits_per_coded_sample to map 2,3,4,5 to 16,24,32,40 independent of the
> actual bitrate.

Indeed, that probably is more straightforward.

// Martin

Patch

diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c
index 7434837..1f036a6 100644
--- a/libavformat/rtpenc.c
+++ b/libavformat/rtpenc.c
@@ -72,6 +72,7 @@  static int is_supported(enum CodecID id)
     case CODEC_ID_THEORA:
     case CODEC_ID_VP8:
     case CODEC_ID_ADPCM_G722:
+    case CODEC_ID_ADPCM_G726:
         return 1;
     default:
         return 0;
@@ -411,6 +412,10 @@  static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
          * clock. */
         rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
         break;
+    case CODEC_ID_ADPCM_G726:
+        rtp_send_samples(s1, pkt->data, size,
+                         st->codec->bits_per_coded_sample * st->codec->channels);
+        break;
     case CODEC_ID_MP2:
     case CODEC_ID_MP3:
         rtp_send_mpegaudio(s1, pkt->data, size);
diff --git a/libavformat/sdp.c b/libavformat/sdp.c
index ba3d4dd..c27c671 100644
--- a/libavformat/sdp.c
+++ b/libavformat/sdp.c
@@ -517,6 +517,16 @@  static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
                                          payload_type,
                                          8000, c->channels);
             break;
+        case CODEC_ID_ADPCM_G726: {
+            int bitrate = c->bit_rate;
+            if (!bitrate)
+                bitrate = c->sample_rate * c->bits_per_coded_sample;
+            if (payload_type >= RTP_PT_PRIVATE)
+                av_strlcatf(buff, size, "a=rtpmap:%d G726-%d/%d\r\n",
+                                         payload_type, bitrate/1000,
+                                         c->sample_rate);
+            break;
+        }
         default:
             /* Nothing special to do here... */
             break;