summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2015-09-28 05:54:25 +0000
committerNanang Izzuddin <nanang@teluu.com>2015-09-28 05:54:25 +0000
commit6a9c496c75a57ee4cf4e8650000cdbad40bd5021 (patch)
treea335a266047937c1d391b3b44e791a3578b73bbe /pjmedia
parent302728f91263d767164f2b756daf007243794ff6 (diff)
Fix #1887: Feed only one PCM input frame at a time to iOS iLBC encoder.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5182 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/src/pjmedia-codec/ilbc.c68
1 files changed, 33 insertions, 35 deletions
diff --git a/pjmedia/src/pjmedia-codec/ilbc.c b/pjmedia/src/pjmedia-codec/ilbc.c
index 3a79ae33..7e780249 100644
--- a/pjmedia/src/pjmedia-codec/ilbc.c
+++ b/pjmedia/src/pjmedia-codec/ilbc.c
@@ -669,11 +669,6 @@ static pj_status_t ilbc_codec_encode(pjmedia_codec *codec,
struct ilbc_codec *ilbc_codec = (struct ilbc_codec*)codec;
pj_int16_t *pcm_in;
pj_size_t nsamples;
-#if defined(PJMEDIA_ILBC_CODEC_USE_COREAUDIO)&& PJMEDIA_ILBC_CODEC_USE_COREAUDIO
- UInt32 npackets;
- OSStatus err;
- AudioBufferList theABL;
-#endif
pj_assert(ilbc_codec && input && output);
@@ -714,41 +709,44 @@ static pj_status_t ilbc_codec_encode(pjmedia_codec *codec,
/* Encode */
output->size = 0;
+ while (nsamples >= ilbc_codec->enc_samples_per_frame) {
#if defined(PJMEDIA_ILBC_CODEC_USE_COREAUDIO)&& PJMEDIA_ILBC_CODEC_USE_COREAUDIO
- npackets = nsamples / ilbc_codec->enc_samples_per_frame;
-
- theABL.mNumberBuffers = 1;
- theABL.mBuffers[0].mNumberChannels = 1;
- theABL.mBuffers[0].mDataByteSize = output_buf_len;
- theABL.mBuffers[0].mData = output->buf;
-
- ilbc_codec->enc_total_packets = npackets;
- ilbc_codec->enc_buffer = (char *)input->buf;
- ilbc_codec->enc_buffer_offset = 0;
-
- err = AudioConverterFillComplexBuffer(ilbc_codec->enc, encodeDataProc,
- ilbc_codec, &npackets,
- &theABL, NULL);
- if (err == noErr) {
- output->size = npackets * ilbc_codec->enc_frame_size;
- }
+ OSStatus err;
+ AudioBufferList theABL;
+ UInt32 npackets = 1;
+
+ theABL.mNumberBuffers = 1;
+ theABL.mBuffers[0].mNumberChannels = 1;
+ theABL.mBuffers[0].mDataByteSize = output_buf_len;
+ theABL.mBuffers[0].mData = output->buf + output->size;
+
+ ilbc_codec->enc_total_packets = 1;
+ ilbc_codec->enc_buffer = (char *)input->buf;
+ ilbc_codec->enc_buffer_offset = input->size - (nsamples << 1);
+
+ err = AudioConverterFillComplexBuffer(ilbc_codec->enc, encodeDataProc,
+ ilbc_codec, &npackets,
+ &theABL, NULL);
+ if (err == noErr && npackets) {
+ output->size += npackets * ilbc_codec->enc_frame_size;
+ }
#else
- while (nsamples >= ilbc_codec->enc_samples_per_frame) {
- unsigned i;
-
- /* Convert to float */
- for (i=0; i<ilbc_codec->enc_samples_per_frame; ++i) {
- ilbc_codec->enc_block[i] = (float) (*pcm_in++);
- }
-
- iLBC_encode((unsigned char *)output->buf + output->size,
- ilbc_codec->enc_block,
- &ilbc_codec->enc);
+ unsigned i;
+
+ /* Convert to float */
+ for (i=0; i<ilbc_codec->enc_samples_per_frame; ++i) {
+ ilbc_codec->enc_block[i] = (float) (*pcm_in++);
+ }
+
+ iLBC_encode((unsigned char *)output->buf + output->size,
+ ilbc_codec->enc_block,
+ &ilbc_codec->enc);
+
+ output->size += ilbc_codec->enc.no_of_bytes;
+#endif
- output->size += ilbc_codec->enc.no_of_bytes;
nsamples -= ilbc_codec->enc_samples_per_frame;
}
-#endif
output->type = PJMEDIA_FRAME_TYPE_AUDIO;
output->timestamp = input->timestamp;