summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/g711.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia/g711.c')
-rw-r--r--pjmedia/src/pjmedia/g711.c98
1 files changed, 74 insertions, 24 deletions
diff --git a/pjmedia/src/pjmedia/g711.c b/pjmedia/src/pjmedia/g711.c
index 5844208f..2701879c 100644
--- a/pjmedia/src/pjmedia/g711.c
+++ b/pjmedia/src/pjmedia/g711.c
@@ -40,21 +40,41 @@ static unsigned char linear2ulaw(int pcm_val);
static int ulaw2linear(unsigned char u_val);
/* Prototypes for G711 factory */
-static pj_status_t g711_match_id( pjmedia_codec_factory *factory, const pjmedia_codec_info *id );
-static pj_status_t g711_default_attr( pjmedia_codec_factory *factory, const pjmedia_codec_info *id, pjmedia_codec_param *attr );
-static pj_status_t g711_enum_codecs (pjmedia_codec_factory *factory, unsigned *count, pjmedia_codec_info codecs[]);
-static pj_status_t g711_alloc_codec( pjmedia_codec_factory *factory, const pjmedia_codec_info *id, pjmedia_codec **p_codec);
-static pj_status_t g711_dealloc_codec( pjmedia_codec_factory *factory, pjmedia_codec *codec );
+static pj_status_t g711_test_alloc( pjmedia_codec_factory *factory,
+ const pjmedia_codec_info *id );
+static pj_status_t g711_default_attr( pjmedia_codec_factory *factory,
+ const pjmedia_codec_info *id,
+ pjmedia_codec_param *attr );
+static pj_status_t g711_enum_codecs (pjmedia_codec_factory *factory,
+ unsigned *count,
+ pjmedia_codec_info codecs[]);
+static pj_status_t g711_alloc_codec( pjmedia_codec_factory *factory,
+ const pjmedia_codec_info *id,
+ pjmedia_codec **p_codec);
+static pj_status_t g711_dealloc_codec( pjmedia_codec_factory *factory,
+ pjmedia_codec *codec );
/* Prototypes for G711 implementation. */
-static pj_status_t g711_codec_default_attr (pjmedia_codec *codec, pjmedia_codec_param *attr);
-static pj_status_t g711_init( pjmedia_codec *codec, pj_pool_t *pool );
-static pj_status_t g711_open( pjmedia_codec *codec, pjmedia_codec_param *attr );
+static pj_status_t g711_codec_default_attr (pjmedia_codec *codec,
+ pjmedia_codec_param *attr);
+static pj_status_t g711_init( pjmedia_codec *codec,
+ pj_pool_t *pool );
+static pj_status_t g711_open( pjmedia_codec *codec,
+ pjmedia_codec_param *attr );
static pj_status_t g711_close( pjmedia_codec *codec );
-static pj_status_t g711_encode( pjmedia_codec *codec, const struct pjmedia_frame *input,
- unsigned output_buf_len, struct pjmedia_frame *output);
-static pj_status_t g711_decode( pjmedia_codec *codec, const struct pjmedia_frame *input,
- unsigned output_buf_len, struct pjmedia_frame *output);
+static pj_status_t g711_get_frames(pjmedia_codec *codec,
+ void *pkt,
+ pj_size_t pkt_size,
+ unsigned *frame_cnt,
+ pjmedia_frame frames[]);
+static pj_status_t g711_encode( pjmedia_codec *codec,
+ const struct pjmedia_frame *input,
+ unsigned output_buf_len,
+ struct pjmedia_frame *output);
+static pj_status_t g711_decode( pjmedia_codec *codec,
+ const struct pjmedia_frame *input,
+ unsigned output_buf_len,
+ struct pjmedia_frame *output);
/* Definition for G711 codec operations. */
static pjmedia_codec_op g711_op =
@@ -63,6 +83,7 @@ static pjmedia_codec_op g711_op =
&g711_init,
&g711_open,
&g711_close,
+ &g711_get_frames,
&g711_encode,
&g711_decode
};
@@ -70,7 +91,7 @@ static pjmedia_codec_op g711_op =
/* Definition for G711 codec factory operations. */
static pjmedia_codec_factory_op g711_factory_op =
{
- &g711_match_id,
+ &g711_test_alloc,
&g711_default_attr,
&g711_enum_codecs,
&g711_alloc_codec,
@@ -128,7 +149,7 @@ PJ_DEF(pj_status_t) g711_deinit_factory (pjmedia_codec_factory *factory)
return 0;
}
-static pj_status_t g711_match_id( pjmedia_codec_factory *factory, const pjmedia_codec_info *id )
+static pj_status_t g711_test_alloc( pjmedia_codec_factory *factory, const pjmedia_codec_info *id )
{
PJ_UNUSED_ARG(factory);
@@ -142,7 +163,7 @@ static pj_status_t g711_default_attr (pjmedia_codec_factory *factory,
{
PJ_UNUSED_ARG(factory);
- memset(attr, 0, sizeof(pjmedia_codec_param));
+ pj_memset(attr, 0, sizeof(pjmedia_codec_param));
attr->sample_rate = 8000;
attr->avg_bps = G711_BPS;
attr->pcm_bits_per_sample = 16;
@@ -155,26 +176,29 @@ static pj_status_t g711_default_attr (pjmedia_codec_factory *factory,
}
static pj_status_t g711_enum_codecs(pjmedia_codec_factory *factory,
- unsigned *count,
+ unsigned *max_count,
pjmedia_codec_info codecs[])
{
+ unsigned count = 0;
+
PJ_UNUSED_ARG(factory);
- if (*count > 0) {
- codecs[0].type = PJMEDIA_TYPE_AUDIO;
- codecs[0].pt = PJMEDIA_RTP_PT_PCMU;
- codecs[0].encoding_name = pj_str("PCMU");
- codecs[0].sample_rate = 8000;
+ if (count < *max_count) {
+ codecs[count].type = PJMEDIA_TYPE_AUDIO;
+ codecs[count].pt = PJMEDIA_RTP_PT_PCMU;
+ codecs[count].encoding_name = pj_str("PCMU");
+ codecs[count].sample_rate = 8000;
+ ++count;
}
- if (*count > 1) {
+ if (count < *max_count) {
codecs[1].type = PJMEDIA_TYPE_AUDIO;
codecs[1].pt = PJMEDIA_RTP_PT_PCMA;
codecs[1].encoding_name = pj_str("PCMA");
codecs[1].sample_rate = 8000;
+ ++count;
}
- if (*count > 0) *count=1;
- if (*count > 1) *count=2;
+ *max_count = count;
return PJ_SUCCESS;
}
@@ -260,6 +284,32 @@ static pj_status_t g711_close( pjmedia_codec *codec )
return PJ_SUCCESS;
}
+static pj_status_t g711_get_frames(pjmedia_codec *codec,
+ void *pkt,
+ pj_size_t pkt_size,
+ unsigned *frame_cnt,
+ pjmedia_frame frames[])
+{
+ unsigned count = 0;
+
+ PJ_UNUSED_ARG(codec);
+ PJ_ASSERT_RETURN(frame_cnt, PJ_EINVAL);
+
+ while (pkt_size >= 160 && count < *frame_cnt) {
+ frames[0].type = PJMEDIA_FRAME_TYPE_AUDIO;
+ frames[0].buf = pkt;
+ frames[0].size = 160;
+
+ pkt = ((char*)pkt) + 160;
+ pkt_size -= 160;
+
+ ++count;
+ }
+
+ *frame_cnt = count;
+ return PJ_SUCCESS;
+}
+
static pj_status_t g711_encode( pjmedia_codec *codec, const struct pjmedia_frame *input,
unsigned output_buf_len, struct pjmedia_frame *output)
{