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
763OBJS-$(CONFIG_ADPCM_G726_DECODER) += g726.o763OBJS-$(CONFIG_ADPCM_G726_DECODER) += g726.o
764OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o764OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o
765OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o765OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o
766OBJS-$(CONFIG_ADPCM_G726LE_ENCODER) += g726.o
766OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o767OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o
767OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o768OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o
768OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o769OBJS-$(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
549 REGISTER_DECODER(ADPCM_EA_XAS, adpcm_ea_xas);549 REGISTER_DECODER(ADPCM_EA_XAS, adpcm_ea_xas);
550 REGISTER_ENCDEC (ADPCM_G722, adpcm_g722);550 REGISTER_ENCDEC (ADPCM_G722, adpcm_g722);
551 REGISTER_ENCDEC (ADPCM_G726, adpcm_g726);551 REGISTER_ENCDEC (ADPCM_G726, adpcm_g726);
552 REGISTER_DECODER(ADPCM_G726LE, adpcm_g726le);552 REGISTER_ENCDEC (ADPCM_G726LE, adpcm_g726le);
553 REGISTER_DECODER(ADPCM_IMA_AMV, adpcm_ima_amv);553 REGISTER_DECODER(ADPCM_IMA_AMV, adpcm_ima_amv);
554 REGISTER_DECODER(ADPCM_IMA_APC, adpcm_ima_apc);554 REGISTER_DECODER(ADPCM_IMA_APC, adpcm_ima_apc);
555 REGISTER_DECODER(ADPCM_IMA_DAT4, adpcm_ima_dat4);555 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
292 return 0;292 return 0;
293}293}
294 294
295#if CONFIG_ADPCM_G726_ENCODER295#if CONFIG_ADPCM_G726_ENCODER || CONFIG_ADPCM_G726LE_ENCODER
296static int16_t g726_encode(G726Context* c, int16_t sig)296static int16_t g726_encode(G726Context* c, int16_t sig)
297{297{
298 uint8_t i;298 uint8_t i;
@@ -308,6 +308,8 @@ static av_cold int g726_encode_init(AVCodecContext *avctx) · 9 unmodified lines
308{308{
309 G726Context* c = avctx->priv_data;309 G726Context* c = avctx->priv_data;
310 310
311 c->little_endian = !strcmp(avctx->codec->name, "g726le");
312
311 if (avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL &&313 if (avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL &&
312 avctx->sample_rate != 8000) {314 avctx->sample_rate != 8000) {
313 av_log(avctx, AV_LOG_ERROR, "Sample rates other than 8kHz are not "315 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
356 init_put_bits(&pb, avpkt->data, avpkt->size);358 init_put_bits(&pb, avpkt->data, avpkt->size);
357 359
358 for (i = 0; i < frame->nb_samples; i++)360 for (i = 0; i < frame->nb_samples; i++)
359 put_bits(&pb, c->code_size, g726_encode(c, *samples++));361 if (c->little_endian) {
360 362 put_bits_le(&pb, c->code_size, g726_encode(c, *samples++));
361 flush_put_bits(&pb);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 }
362 372
363 avpkt->size = out_size;373 avpkt->size = out_size;
364 *got_packet_ptr = 1;374 *got_packet_ptr = 1;
@@ -372,6 +382,13 @@ static const AVOption options[] = { · 7 unmodified lines
372 { NULL },382 { NULL },
373};383};
374 384
385static const AVCodecDefault defaults[] = {
386 { "b", "0" },
387 { NULL },
388};
389#endif
390
391#if CONFIG_ADPCM_G726_ENCODER
375static const AVClass g726_class = {392static const AVClass g726_class = {
376 .class_name = "g726",393 .class_name = "g726",
377 .item_name = av_default_item_name,394 .item_name = av_default_item_name,
@@ -379,11 +396,6 @@ static const AVClass g726_class = { · 1 unmodified line
379 .version = LIBAVUTIL_VERSION_INT,396 .version = LIBAVUTIL_VERSION_INT,
380};397};
381 398
382static const AVCodecDefault defaults[] = {
383 { "b", "0" },
384 { NULL },
385};
386
387AVCodec ff_adpcm_g726_encoder = {399AVCodec ff_adpcm_g726_encoder = {
388 .name = "g726",400 .name = "g726",
389 .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"),401 .long_name = NULL_IF_CONFIG_SMALL("G.726 ADPCM"),
@@ -400,6 +412,30 @@ AVCodec ff_adpcm_g726_encoder = { · 10 unmodified lines
400};412};
401#endif413#endif
402 414
415#if CONFIG_ADPCM_G726LE_ENCODER
416static 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
423AVCodec 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
403#if CONFIG_ADPCM_G726_DECODER || CONFIG_ADPCM_G726LE_DECODER439#if CONFIG_ADPCM_G726_DECODER || CONFIG_ADPCM_G726LE_DECODER
404static av_cold int g726_decode_init(AVCodecContext *avctx)440static av_cold int g726_decode_init(AVCodecContext *avctx)
405{441{
libavcodec/put_bits.h+40−0
@@ -119,6 +119,18 @@ static inline void flush_put_bits(PutBitContext *s) · 118 unmodified lines
119 s->bit_buf = 0;119 s->bit_buf = 0;
120}120}
121 121
122static 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
122#ifdef BITSTREAM_WRITER_LE134#ifdef BITSTREAM_WRITER_LE
123#define avpriv_align_put_bits align_put_bits_unsupported_here135#define avpriv_align_put_bits align_put_bits_unsupported_here
124#define avpriv_put_string ff_put_string_unsupported_here136#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
197 s->bit_left = bit_left;209 s->bit_left = bit_left;
198}210}
199 211
212static 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
200static inline void put_sbits(PutBitContext *pb, int n, int32_t value)240static inline void put_sbits(PutBitContext *pb, int n, int32_t value)
201{241{
202 av_assert2(n >= 0 && n <= 31);242 av_assert2(n >= 0 && n <= 31);
libavcodec/version.h+1−1
@@ -28,7 +28,7 @@ · 27 unmodified lines
28#include "libavutil/version.h"28#include "libavutil/version.h"
29 29
30#define LIBAVCODEC_VERSION_MAJOR 5730#define LIBAVCODEC_VERSION_MAJOR 57
31#define LIBAVCODEC_VERSION_MINOR 10231#define LIBAVCODEC_VERSION_MINOR 103
32#define LIBAVCODEC_VERSION_MICRO 10032#define LIBAVCODEC_VERSION_MICRO 100
33 33
34#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \34#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