History

lavc/g726: Add a little-endian G.726 encoder.

Fixes ticket #6596.

Carl Eugen Hoyos committed 9 years ago

Commit 898ea651 parent 8754ccd5 files · +88 −11Browse files

Unified · Split

5 files
  1. libavcodec/Makefile +1 −0
  2. libavcodec/allcodecs.c +1 −1
  3. libavcodec/g726.c +45 −9
  4. libavcodec/put_bits.h +40 −0
  5. libavcodec/version.h +1 −1
libavcodec/Makefile+1−0
@@ -763,6 +763,7 @@ OBJS-$(CONFIG_ADPCM_G722_ENCODER) += g722.o g722dsp.o g722enc.o · 762 unmodified lines
763763 OBJS-$(CONFIG_ADPCM_G726_DECODER) += g726.o
764764 OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o
765765 OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o
766+OBJS-$(CONFIG_ADPCM_G726LE_ENCODER) += g726.o
766767 OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o
767768 OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o
768769 OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o
libavcodec/allcodecs.c+1−1
@@ -549,7 +549,7 @@ static void register_all(void) · 548 unmodified lines
549549 REGISTER_DECODER(ADPCM_EA_XAS, adpcm_ea_xas);
550550 REGISTER_ENCDEC (ADPCM_G722, adpcm_g722);
551551 REGISTER_ENCDEC (ADPCM_G726, adpcm_g726);
552− REGISTER_DECODER(ADPCM_G726LE, adpcm_g726le);
552+ REGISTER_ENCDEC (ADPCM_G726LE, adpcm_g726le);
553553 REGISTER_DECODER(ADPCM_IMA_AMV, adpcm_ima_amv);
554554 REGISTER_DECODER(ADPCM_IMA_APC, adpcm_ima_apc);
555555 REGISTER_DECODER(ADPCM_IMA_DAT4, adpcm_ima_dat4);
libavcodec/g726.c+45−9
@@ -292,7 +292,7 @@ static av_cold int g726_reset(G726Context *c) · 291 unmodified lines
292292 return 0;
293293 }
294294
295−#if CONFIG_ADPCM_G726_ENCODER
295+#if CONFIG_ADPCM_G726_ENCODER || CONFIG_ADPCM_G726LE_ENCODER
296296 static int16_t g726_encode(G726Context* c, int16_t sig)
297297 {
298298 uint8_t i;
@@ -308,6 +308,8 @@ static av_cold int g726_encode_init(AVCodecContext *avctx) · 9 unmodified lines
308308 {
309309 G726Context* c = avctx->priv_data;
310310
311+ c->little_endian = !strcmp(avctx->codec->name, "g726le");
312+
311313 if (avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL &&
312314 avctx->sample_rate != 8000) {
313315 av_log(avctx, AV_LOG_ERROR, "Sample rates other than 8kHz are not "
@@ -356,9 +358,17 @@ static int g726_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, · 42 unmodified lines
356358 init_put_bits(&pb, avpkt->data, avpkt->size);
357359
358360 for (i = 0; i < frame->nb_samples; i++)
359− put_bits(&pb, c->code_size, g726_encode(c, *samples++));
360−
361− flush_put_bits(&pb);
361+ if (c->little_endian) {
362+ put_bits_le(&pb, c->code_size, g726_encode(c, *samples++));
363+ } else {
364+ put_bits(&pb, c->code_size, g726_encode(c, *samples++));
365+ }
366+
367+ if (c->little_endian) {
368+ flush_put_bits_le(&pb);
369+ } else {
370+ flush_put_bits(&pb);
371+ }
362372
363373 avpkt->size = out_size;
364374 *got_packet_ptr = 1;
@@ -372,6 +382,13 @@ static const AVOption options[] = { · 7 unmodified lines
372382 { NULL },
373383 };
374384
385+static const AVCodecDefault defaults[] = {
386+ { "b", "0" },
387+ { NULL },
388+};
389+#endif
390+
391+#if CONFIG_ADPCM_G726_ENCODER
375392 static const AVClass g726_class = {
376393 .class_name = "g726",
377394 .item_name = av_default_item_name,
@@ -379,11 +396,6 @@ static const AVClass g726_class = { · 1 unmodified line
379396 .version = LIBAVUTIL_VERSION_INT,
380397 };
381398
382−static const AVCodecDefault defaults[] = {
383− { "b", "0" },
384− { NULL },
385−};
386−
387399 AVCodec ff_adpcm_g726_encoder = {
388400 .name = "g726",
389401 .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"),
@@ -400,6 +412,30 @@ AVCodec ff_adpcm_g726_encoder = { · 10 unmodified lines
400412 };
401413 #endif
402414
415+#if CONFIG_ADPCM_G726LE_ENCODER
416+static const AVClass g726le_class = {
417+ .class_name = "g726le",
418+ .item_name = av_default_item_name,
419+ .option = options,
420+ .version = LIBAVUTIL_VERSION_INT,
421+};
422+
423+AVCodec ff_adpcm_g726le_encoder = {
424+ .name = "g726le",
425+ .long_name = NULL_IF_CONFIG_SMALL("G.726 little endian ADPCM (\"right-justified\")"),
426+ .type = AVMEDIA_TYPE_AUDIO,
427+ .id = AV_CODEC_ID_ADPCM_G726LE,
428+ .priv_data_size = sizeof(G726Context),
429+ .init = g726_encode_init,
430+ .encode2 = g726_encode_frame,
431+ .capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME,
432+ .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
433+ AV_SAMPLE_FMT_NONE },
434+ .priv_class = &g726le_class,
435+ .defaults = defaults,
436+};
437+#endif
438+
403439 #if CONFIG_ADPCM_G726_DECODER || CONFIG_ADPCM_G726LE_DECODER
404440 static av_cold int g726_decode_init(AVCodecContext *avctx)
405441 {
libavcodec/put_bits.h+40−0
@@ -119,6 +119,18 @@ static inline void flush_put_bits(PutBitContext *s) · 118 unmodified lines
119119 s->bit_buf = 0;
120120 }
121121
122+static inline void flush_put_bits_le(PutBitContext *s)
123+{
124+ while (s->bit_left < 32) {
125+ av_assert0(s->buf_ptr < s->buf_end);
126+ *s->buf_ptr++ = s->bit_buf;
127+ s->bit_buf >>= 8;
128+ s->bit_left += 8;
129+ }
130+ s->bit_left = 32;
131+ s->bit_buf = 0;
132+}
133+
122134 #ifdef BITSTREAM_WRITER_LE
123135 #define avpriv_align_put_bits align_put_bits_unsupported_here
124136 #define avpriv_put_string ff_put_string_unsupported_here
@@ -197,6 +209,34 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) · 72 unmodified lines
197209 s->bit_left = bit_left;
198210 }
199211
212+static inline void put_bits_le(PutBitContext *s, int n, unsigned int value)
213+{
214+ unsigned int bit_buf;
215+ int bit_left;
216+
217+ av_assert2(n <= 31 && value < (1U << n));
218+
219+ bit_buf = s->bit_buf;
220+ bit_left = s->bit_left;
221+
222+ bit_buf |= value << (32 - bit_left);
223+ if (n >= bit_left) {
224+ if (3 < s->buf_end - s->buf_ptr) {
225+ AV_WL32(s->buf_ptr, bit_buf);
226+ s->buf_ptr += 4;
227+ } else {
228+ av_log(NULL, AV_LOG_ERROR, "Internal error, put_bits buffer too small\n");
229+ av_assert2(0);
230+ }
231+ bit_buf = value >> bit_left;
232+ bit_left += 32;
233+ }
234+ bit_left -= n;
235+
236+ s->bit_buf = bit_buf;
237+ s->bit_left = bit_left;
238+}
239+
200240 static inline void put_sbits(PutBitContext *pb, int n, int32_t value)
201241 {
202242 av_assert2(n >= 0 && n <= 31);
libavcodec/version.h+1−1
@@ -28,7 +28,7 @@ · 27 unmodified lines
2828 #include "libavutil/version.h"
2929
3030 #define LIBAVCODEC_VERSION_MAJOR 57
31−#define LIBAVCODEC_VERSION_MINOR 102
31+#define LIBAVCODEC_VERSION_MINOR 103
3232 #define LIBAVCODEC_VERSION_MICRO 100
3333
3434 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t