Unified · Split
| @@ -50,6 +50,7 @@ version <next>: · 49 unmodified lines | ||
| 50 | 50 | - avgblur_vulkan, overlay_vulkan, scale_vulkan and chromaber_vulkan filters |
| 51 | 51 | - ADPCM IMA MTF decoder |
| 52 | 52 | - FWSE demuxer |
| 53 | +- DERF DPCM decoder | |
| 53 | 54 | |
| 54 | 55 | |
| 55 | 56 | version 4.2: |
| @@ -265,6 +265,7 @@ OBJS-$(CONFIG_DCA_DECODER) += dcadec.o dca.o dcadata.o dcahuff.o \ · 264 unmodified lines | ||
| 265 | 265 | OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o dca.o dcadata.o dcahuff.o \ |
| 266 | 266 | dcaadpcm.o |
| 267 | 267 | OBJS-$(CONFIG_DDS_DECODER) += dds.o |
| 268 | +OBJS-$(CONFIG_DERF_DPCM_DECODER) += dpcm.o | |
| 268 | 269 | OBJS-$(CONFIG_DIRAC_DECODER) += diracdec.o dirac.o diracdsp.o diractab.o \ |
| 269 | 270 | dirac_arith.o dirac_dwt.o dirac_vlc.o |
| 270 | 271 | OBJS-$(CONFIG_DFA_DECODER) += dfa.o |
| @@ -569,6 +569,7 @@ extern AVCodec ff_pcm_vidc_encoder; · 568 unmodified lines | ||
| 569 | 569 | extern AVCodec ff_pcm_vidc_decoder; |
| 570 | 570 | |
| 571 | 571 | /* DPCM codecs */ |
| 572 | +extern AVCodec ff_derf_dpcm_decoder; | |
| 572 | 573 | extern AVCodec ff_gremlin_dpcm_decoder; |
| 573 | 574 | extern AVCodec ff_interplay_dpcm_decoder; |
| 574 | 575 | extern AVCodec ff_roq_dpcm_encoder; |
| @@ -571,6 +571,7 @@ enum AVCodecID { · 570 unmodified lines | ||
| 571 | 571 | |
| 572 | 572 | AV_CODEC_ID_SDX2_DPCM = 0x14800, |
| 573 | 573 | AV_CODEC_ID_GREMLIN_DPCM, |
| 574 | + AV_CODEC_ID_DERF_DPCM, | |
| 574 | 575 | |
| 575 | 576 | /* audio codecs */ |
| 576 | 577 | AV_CODEC_ID_MP2 = 0x15000, |
| @@ -2415,6 +2415,13 @@ static const AVCodecDescriptor codec_descriptors[] = { · 2414 unmodified lines | ||
| 2415 | 2415 | .long_name = NULL_IF_CONFIG_SMALL("DPCM Gremlin"), |
| 2416 | 2416 | .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, |
| 2417 | 2417 | }, |
| 2418 | + { | |
| 2419 | + .id = AV_CODEC_ID_DERF_DPCM, | |
| 2420 | + .type = AVMEDIA_TYPE_AUDIO, | |
| 2421 | + .name = "derf_dpcm", | |
| 2422 | + .long_name = NULL_IF_CONFIG_SMALL("DPCM Xilam DERF"), | |
| 2423 | + .props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSY, | |
| 2424 | + }, | |
| 2418 | 2425 | |
| 2419 | 2426 | /* audio codecs */ |
| 2420 | 2427 | { |
| @@ -49,6 +49,21 @@ typedef struct DPCMContext { · 48 unmodified lines | ||
| 49 | 49 | const int8_t *sol_table; ///< delta table for SOL_DPCM |
| 50 | 50 | } DPCMContext; |
| 51 | 51 | |
| 52 | +static const int32_t derf_steps[96] = { | |
| 53 | + 0, 1, 2, 3, 4, 5, 6, 7, | |
| 54 | + 8, 9, 10, 11, 12, 13, 14, 16, | |
| 55 | + 17, 19, 21, 23, 25, 28, 31, 34, | |
| 56 | + 37, 41, 45, 50, 55, 60, 66, 73, | |
| 57 | + 80, 88, 97, 107, 118, 130, 143, 157, | |
| 58 | + 173, 190, 209, 230, 253, 279, 307, 337, | |
| 59 | + 371, 408, 449, 494, 544, 598, 658, 724, | |
| 60 | + 796, 876, 963, 1060, 1166, 1282, 1411, 1552, | |
| 61 | + 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, | |
| 62 | + 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, | |
| 63 | + 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, | |
| 64 | + 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767, | |
| 65 | +}; | |
| 66 | + | |
| 52 | 67 | static const int16_t interplay_delta_table[] = { |
| 53 | 68 | 0, 1, 2, 3, 4, 5, 6, 7, |
| 54 | 69 | 8, 9, 10, 11, 12, 13, 14, 15, |
| @@ -225,6 +240,7 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, · 170 unmodified lines | ||
| 225 | 240 | else |
| 226 | 241 | out = buf_size; |
| 227 | 242 | break; |
| 243 | + case AV_CODEC_ID_DERF_DPCM: | |
| 228 | 244 | case AV_CODEC_ID_GREMLIN_DPCM: |
| 229 | 245 | case AV_CODEC_ID_SDX2_DPCM: |
| 230 | 246 | out = buf_size; |
| @@ -372,6 +388,21 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data, · 141 unmodified lines | ||
| 372 | 388 | } |
| 373 | 389 | } |
| 374 | 390 | break; |
| 391 | + | |
| 392 | + case AV_CODEC_ID_DERF_DPCM: { | |
| 393 | + int idx = 0; | |
| 394 | + | |
| 395 | + while (output_samples < samples_end) { | |
| 396 | + uint8_t n = bytestream2_get_byteu(&gb); | |
| 397 | + int index = FFMIN(n & 0x7f, 95); | |
| 398 | + | |
| 399 | + s->sample[idx] += (n & 0x80 ? -1: 1) * derf_steps[index]; | |
| 400 | + s->sample[idx] = av_clip_int16(s->sample[idx]); | |
| 401 | + *output_samples++ = s->sample[idx]; | |
| 402 | + idx ^= stereo; | |
| 403 | + } | |
| 404 | + } | |
| 405 | + break; | |
| 375 | 406 | } |
| 376 | 407 | |
| 377 | 408 | *got_frame_ptr = 1; |
| @@ -391,6 +422,7 @@ AVCodec ff_ ## name_ ## _decoder = { \ · 13 unmodified lines | ||
| 391 | 422 | .capabilities = AV_CODEC_CAP_DR1, \ |
| 392 | 423 | } |
| 393 | 424 | |
| 425 | +DPCM_DECODER(AV_CODEC_ID_DERF_DPCM, derf_dpcm, "DPCM Xilam DERF"); | |
| 394 | 426 | DPCM_DECODER(AV_CODEC_ID_GREMLIN_DPCM, gremlin_dpcm, "DPCM Gremlin"); |
| 395 | 427 | DPCM_DECODER(AV_CODEC_ID_INTERPLAY_DPCM, interplay_dpcm, "DPCM Interplay"); |
| 396 | 428 | DPCM_DECODER(AV_CODEC_ID_ROQ_DPCM, roq_dpcm, "DPCM id RoQ"); |
| @@ -1478,6 +1478,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id) · 1477 unmodified lines | ||
| 1478 | 1478 | case AV_CODEC_ID_PCM_S8_PLANAR: |
| 1479 | 1479 | case AV_CODEC_ID_PCM_U8: |
| 1480 | 1480 | case AV_CODEC_ID_SDX2_DPCM: |
| 1481 | + case AV_CODEC_ID_DERF_DPCM: | |
| 1481 | 1482 | return 8; |
| 1482 | 1483 | case AV_CODEC_ID_PCM_S16BE: |
| 1483 | 1484 | case AV_CODEC_ID_PCM_S16BE_PLANAR: |