Fixes ticket #6596.
Unified · Split
| @@ -763,6 +763,7 @@ OBJS-$(CONFIG_ADPCM_G722_ENCODER) += g722.o g722dsp.o g722enc.o · 762 unmodified lines | |||
| 763 | OBJS-$(CONFIG_ADPCM_G726_DECODER) += g726.o | 763 | OBJS-$(CONFIG_ADPCM_G726_DECODER) += g726.o |
| 764 | OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o | 764 | OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o |
| 765 | OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o | 765 | OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o |
| 766 | OBJS-$(CONFIG_ADPCM_G726LE_ENCODER) += g726.o | ||
| 766 | OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o | 767 | OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o |
| 767 | OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o | 768 | OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o |
| 768 | OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o | 769 | OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o |
| @@ -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); |
| @@ -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_ENCODER | 295 | #if CONFIG_ADPCM_G726_ENCODER || CONFIG_ADPCM_G726LE_ENCODER |
| 296 | static int16_t g726_encode(G726Context* c, int16_t sig) | 296 | static 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 | ||
| 385 | static const AVCodecDefault defaults[] = { | ||
| 386 | { "b", "0" }, | ||
| 387 | { NULL }, | ||
| 388 | }; | ||
| 389 | #endif | ||
| 390 | |||
| 391 | #if CONFIG_ADPCM_G726_ENCODER | ||
| 375 | static const AVClass g726_class = { | 392 | static 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 | ||
| 382 | static const AVCodecDefault defaults[] = { | ||
| 383 | { "b", "0" }, | ||
| 384 | { NULL }, | ||
| 385 | }; | ||
| 386 | |||
| 387 | AVCodec ff_adpcm_g726_encoder = { | 399 | AVCodec 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 | #endif | 413 | #endif |
| 402 | 414 | ||
| 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 | |||
| 403 | #if CONFIG_ADPCM_G726_DECODER || CONFIG_ADPCM_G726LE_DECODER | 439 | #if CONFIG_ADPCM_G726_DECODER || CONFIG_ADPCM_G726LE_DECODER |
| 404 | static av_cold int g726_decode_init(AVCodecContext *avctx) | 440 | static av_cold int g726_decode_init(AVCodecContext *avctx) |
| 405 | { | 441 | { |
| @@ -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 | ||
| 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 | |||
| 122 | #ifdef BITSTREAM_WRITER_LE | 134 | #ifdef BITSTREAM_WRITER_LE |
| 123 | #define avpriv_align_put_bits align_put_bits_unsupported_here | 135 | #define avpriv_align_put_bits align_put_bits_unsupported_here |
| 124 | #define avpriv_put_string ff_put_string_unsupported_here | 136 | #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 | ||
| 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 | |||
| 200 | static inline void put_sbits(PutBitContext *pb, int n, int32_t value) | 240 | static 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); |
| @@ -28,7 +28,7 @@ · 27 unmodified lines | |||
| 28 | #include "libavutil/version.h" | 28 | #include "libavutil/version.h" |
| 29 | 29 | ||
| 30 | #define LIBAVCODEC_VERSION_MAJOR 57 | 30 | #define LIBAVCODEC_VERSION_MAJOR 57 |
| 31 | #define LIBAVCODEC_VERSION_MINOR 102 | 31 | #define LIBAVCODEC_VERSION_MINOR 103 |
| 32 | #define LIBAVCODEC_VERSION_MICRO 100 | 32 | #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, \ |