mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-25 16:52:31 +00:00
8svx: use planar sample format
This commit is contained in:
parent
fd41cb4370
commit
cf8c93ada4
@ -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 },
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user