| @@ -58,30 +58,25 @@ static const int8_t exponential[16] = { -128, -64, -32, -16, -8, -4, -2, -1, | |||||
| * @param[in,out] state starting value. it is saved for use in the next call. | * @param[in,out] state starting value. it is saved for use in the next call. | ||||
| */ | */ | ||||
| static void delta_decode(uint8_t *dst, const uint8_t *src, int src_size, | static void delta_decode(uint8_t *dst, const uint8_t *src, int src_size, | ||||
| uint8_t *state, const int8_t *table, int channels) | |||||
| uint8_t *state, const int8_t *table) | |||||
| { | { | ||||
| uint8_t val = *state; | uint8_t val = *state; | ||||
| while (src_size--) { | while (src_size--) { | ||||
| uint8_t d = *src++; | uint8_t d = *src++; | ||||
| val = av_clip_uint8(val + table[d & 0xF]); | val = av_clip_uint8(val + table[d & 0xF]); | ||||
| *dst = val; | |||||
| dst += channels; | |||||
| *dst++ = val; | |||||
| val = av_clip_uint8(val + table[d >> 4]); | val = av_clip_uint8(val + table[d >> 4]); | ||||
| *dst = val; | |||||
| dst += channels; | |||||
| *dst++ = val; | |||||
| } | } | ||||
| *state = val; | *state = val; | ||||
| } | } | ||||
| static void raw_decode(uint8_t *dst, const int8_t *src, int src_size, | |||||
| int channels) | |||||
| static void raw_decode(uint8_t *dst, const int8_t *src, int src_size) | |||||
| { | { | ||||
| while (src_size--) { | |||||
| *dst = *src++ + 128; | |||||
| dst += channels; | |||||
| } | |||||
| while (src_size--) | |||||
| *dst++ = *src++ + 128; | |||||
| } | } | ||||
| /** decode a frame */ | /** decode a frame */ | ||||
| @@ -90,8 +85,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data, | |||||
| { | { | ||||
| EightSvxContext *esc = avctx->priv_data; | EightSvxContext *esc = avctx->priv_data; | ||||
| int buf_size; | int buf_size; | ||||
| uint8_t *out_data; | |||||
| int ret; | |||||
| int ch, ret; | |||||
| int is_compr = (avctx->codec_id != AV_CODEC_ID_PCM_S8_PLANAR); | int is_compr = (avctx->codec_id != AV_CODEC_ID_PCM_S8_PLANAR); | ||||
| /* for the first packet, copy data to buffer */ | /* for the first packet, copy data to buffer */ | ||||
| @@ -146,22 +140,17 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data, | |||||
| av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| out_data = esc->frame.data[0]; | |||||
| if (is_compr) { | |||||
| delta_decode(out_data, &esc->data[0][esc->data_idx], buf_size, | |||||
| &esc->fib_acc[0], esc->table, avctx->channels); | |||||
| if (avctx->channels == 2) { | |||||
| delta_decode(&out_data[1], &esc->data[1][esc->data_idx], buf_size, | |||||
| &esc->fib_acc[1], esc->table, avctx->channels); | |||||
| } | |||||
| } else { | |||||
| int ch; | |||||
| for (ch = 0; ch < avctx->channels; ch++) { | |||||
| raw_decode((int8_t *)&out_data[ch], &esc->data[ch][esc->data_idx], | |||||
| buf_size, avctx->channels); | |||||
| for (ch = 0; ch < avctx->channels; ch++) { | |||||
| if (is_compr) { | |||||
| delta_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx], | |||||
| buf_size, &esc->fib_acc[ch], esc->table); | |||||
| } else { | |||||
| raw_decode(esc->frame.data[ch], &esc->data[ch][esc->data_idx], | |||||
| buf_size); | |||||
| } | } | ||||
| } | } | ||||
| esc->data_idx += buf_size; | esc->data_idx += buf_size; | ||||
| *got_frame_ptr = 1; | *got_frame_ptr = 1; | ||||
| @@ -192,7 +181,7 @@ static av_cold int eightsvx_decode_init(AVCodecContext *avctx) | |||||
| default: | default: | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| avctx->sample_fmt = AV_SAMPLE_FMT_U8; | |||||
| avctx->sample_fmt = AV_SAMPLE_FMT_U8P; | |||||
| avcodec_get_frame_defaults(&esc->frame); | avcodec_get_frame_defaults(&esc->frame); | ||||
| avctx->coded_frame = &esc->frame; | avctx->coded_frame = &esc->frame; | ||||
| @@ -220,6 +209,8 @@ AVCodec ff_eightsvx_fib_decoder = { | |||||
| .decode = eightsvx_decode_frame, | .decode = eightsvx_decode_frame, | ||||
| .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, | .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("8SVX fibonacci"), | .long_name = NULL_IF_CONFIG_SMALL("8SVX fibonacci"), | ||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P, | |||||
| AV_SAMPLE_FMT_NONE }, | |||||
| }; | }; | ||||
| AVCodec ff_eightsvx_exp_decoder = { | AVCodec ff_eightsvx_exp_decoder = { | ||||
| @@ -232,6 +223,8 @@ AVCodec ff_eightsvx_exp_decoder = { | |||||
| .decode = eightsvx_decode_frame, | .decode = eightsvx_decode_frame, | ||||
| .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, | .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("8SVX exponential"), | .long_name = NULL_IF_CONFIG_SMALL("8SVX exponential"), | ||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P, | |||||
| AV_SAMPLE_FMT_NONE }, | |||||
| }; | }; | ||||
| AVCodec ff_pcm_s8_planar_decoder = { | AVCodec ff_pcm_s8_planar_decoder = { | ||||
| @@ -244,4 +237,6 @@ AVCodec ff_pcm_s8_planar_decoder = { | |||||
| .decode = eightsvx_decode_frame, | .decode = eightsvx_decode_frame, | ||||
| .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, | .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, | ||||
| .long_name = NULL_IF_CONFIG_SMALL("PCM signed 8-bit planar"), | .long_name = NULL_IF_CONFIG_SMALL("PCM signed 8-bit planar"), | ||||
| .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P, | |||||
| AV_SAMPLE_FMT_NONE }, | |||||
| }; | }; | ||||