diff options
author | Justin Ruggles | 2012-08-27 12:01:16 -0400 |
---|---|---|
committer | Justin Ruggles | 2012-10-01 13:42:43 -0400 |
commit | cf8c93ada4a7643425636ab5c3914c777fc1120f (patch) | |
tree | a84622d8c1a43af6cfc2bea7331b97af304b11ad | |
parent | fd41cb43702498948ff14ba8c284fd5c15fc729d (diff) |
8svx: use planar sample format
-rw-r--r-- | libavcodec/8svx.c | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/libavcodec/8svx.c b/libavcodec/8svx.c index 328fc65b41..1839617b96 100644 --- a/libavcodec/8svx.c +++ b/libavcodec/8svx.c @@ -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. */ 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; while (src_size--) { uint8_t d = *src++; val = av_clip_uint8(val + table[d & 0xF]); - *dst = val; - dst += channels; + *dst++ = val; val = av_clip_uint8(val + table[d >> 4]); - *dst = val; - dst += channels; + *dst++ = 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 */ @@ -90,8 +85,7 @@ static int eightsvx_decode_frame(AVCodecContext *avctx, void *data, { EightSvxContext *esc = avctx->priv_data; int buf_size; - uint8_t *out_data; - int ret; + int ch, ret; int is_compr = (avctx->codec_id != AV_CODEC_ID_PCM_S8_PLANAR); /* 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"); 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; *got_frame_ptr = 1; @@ -192,7 +181,7 @@ static av_cold int eightsvx_decode_init(AVCodecContext *avctx) default: return -1; } - avctx->sample_fmt = AV_SAMPLE_FMT_U8; + avctx->sample_fmt = AV_SAMPLE_FMT_U8P; avcodec_get_frame_defaults(&esc->frame); avctx->coded_frame = &esc->frame; @@ -220,6 +209,8 @@ AVCodec ff_eightsvx_fib_decoder = { .decode = eightsvx_decode_frame, .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, .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 = { @@ -232,6 +223,8 @@ AVCodec ff_eightsvx_exp_decoder = { .decode = eightsvx_decode_frame, .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, .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 = { @@ -244,4 +237,6 @@ AVCodec ff_pcm_s8_planar_decoder = { .decode = eightsvx_decode_frame, .capabilities = CODEC_CAP_DELAY | CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("PCM signed 8-bit planar"), + .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P, + AV_SAMPLE_FMT_NONE }, }; |