Commit 284da7ab authored by Stefan Westerfeld's avatar Stefan Westerfeld

avfilter/asubprocess: optimize 32 bit i/o on little endian systems

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 48b4b5d8
......@@ -310,42 +310,95 @@ static int config_input(AVFilterLink *inlink)
return 0;
}
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
static void read_samples(ASubProcessContext *s, int32_t *data, int count)
{
AVFilterContext *ctx = inlink->dst;
ASubProcessContext *s = ctx->priv;
AVFilterLink *outlink = ctx->outputs[0];
AVFrame *out;
int ret = 0, nb_samples;
int sample_size = s->in_bit_depth / 8;
assert(in->nb_samples <= NB_BUFFER_SAMPLES);
#if !HAVE_BIGENDIAN
if (s->out_bit_depth == 32)
{
/* optimized case: on little endian systems we don't need any conversion */
sp_read(s->sp, (char *)data, count * sample_size);
return;
}
#endif
sp_read(s->sp, s->sample_buffer, count * sample_size);
if (s->out_bit_depth == 8)
{
int8_t *in = s->sample_buffer;
for (int k = 0; k < count; k++)
data[k] = (in[k] << 24) + 0x80000000;
}
if (s->out_bit_depth == 16)
{
int16_t *in = s->sample_buffer;
for (int k = 0; k < count; k++)
data[k] = AV_RL16(in + k) << 16;
}
if (s->out_bit_depth == 24)
{
uint8_t *in = s->sample_buffer;
for (int k = 0; k < count; k++)
{
data[k] = AV_RL24(in) << 8;
in += 3;
}
}
if (s->out_bit_depth == 32)
{
int32_t *in = s->sample_buffer;
for (int k = 0; k < count; k++)
data[k] = AV_RL32(in + k);
}
}
int k = 0;
bool gen_output;
int32_t *xd = (int32_t *)in->data[0];
static void write_samples(ASubProcessContext *s, int32_t *data, int count)
{
int sample_size = s->in_bit_depth / 8;
int todo = in->nb_samples * inlink->ch_layout.nb_channels;
assert (in->nb_samples <= N_SAMPLES);
assert(in->nb_samples <= NB_BUFFER_SAMPLES);
#if !HAVE_BIGENDIAN
if (s->out_bit_depth == 32)
{
/* optimized case: on little endian systems we don't need any conversion */
sp_write(s->sp, (char *)data, sample_size * count);
return;
}
#endif
if (s->in_bit_depth == 16)
{
int16_t *out = s->sample_buffer;
for (k = 0; k < todo; k++)
AV_WL16 (out + k, xd[k] >> 16);
for (int k = 0; k < count; k++)
AV_WL16(out + k, data[k] >> 16);
}
if (s->in_bit_depth == 24)
{
uint8_t *out = s->sample_buffer;
for (int k = 0; k < todo; k++)
for (int k = 0; k < count; k++)
{
AV_WL24 (out, xd[k] >> 8);
AV_WL24(out, data[k] >> 8);
out += 3;
}
}
if (s->in_bit_depth == 32)
{
int32_t *out = s->sample_buffer;
for (k = 0; k < todo; k++)
AV_WL32 (out + k, xd[k]);
for (int k = 0; k < count; k++)
AV_WL32(out + k, data[k]);
}
sp_write (s->sp, s->sample_buffer, sample_size * todo);
sp_write(s->sp, s->sample_buffer, sample_size * count);
}
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
{
AVFilterContext *ctx = inlink->dst;
ASubProcessContext *s = ctx->priv;
AVFilterLink *outlink = ctx->outputs[0];
AVFrame *out;
int ret = 0, nb_samples;
bool gen_output;
write_samples(s, (int32_t *)in->data[0], in->nb_samples * inlink->ch_layout.nb_channels);
if (s->eof)
{
while (!sp_write (s->sp, 0, 0))
......@@ -398,43 +451,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
avail = NB_BUFFER_SAMPLES;
if (avail > 0)
{
int32_t *xd;
int todo;
out = ff_get_audio_buffer(outlink, avail);
if (!out) {
av_frame_free(&in);
return AVERROR(ENOMEM);
}
sp_read (s->sp, s->sample_buffer, avail * sample_size * inlink->ch_layout.nb_channels);
todo = avail * inlink->ch_layout.nb_channels;
xd = (int32_t *)out->data[0];
if (s->out_bit_depth == 8)
{
int8_t *in = s->sample_buffer;
for (int k = 0; k < todo; k++)
xd[k] = (in[k] << 24) + 0x80000000;
}
if (s->out_bit_depth == 16)
{
int16_t *in = s->sample_buffer;
for (int k = 0; k < todo; k++)
xd[k] = AV_RL16 (in + k) << 16;
}
if (s->out_bit_depth == 24)
{
uint8_t *in = s->sample_buffer;
for (int k = 0; k < todo; k++)
{
xd[k] = AV_RL24 (in) << 8;
in += 3;
}
}
if (s->out_bit_depth == 32)
{
int32_t *in = s->sample_buffer;
for (int k = 0; k < todo; k++)
xd[k] = AV_RL32 (in + k);
}
read_samples(s, (int32_t *)out->data[0], avail * inlink->ch_layout.nb_channels);
ret = ff_filter_frame(outlink, out);
}
else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment