|
|
|
@@ -35,45 +35,38 @@ typedef struct NoiseContext { |
|
|
|
unsigned int state; |
|
|
|
} NoiseContext; |
|
|
|
|
|
|
|
static int noise(AVBSFContext *ctx, AVPacket *out) |
|
|
|
static int noise(AVBSFContext *ctx, AVPacket *pkt) |
|
|
|
{ |
|
|
|
NoiseContext *s = ctx->priv_data; |
|
|
|
AVPacket *in; |
|
|
|
int amount = s->amount > 0 ? s->amount : (s->state % 10001 + 1); |
|
|
|
int i, ret = 0; |
|
|
|
|
|
|
|
if (amount <= 0) |
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
|
|
|
ret = ff_bsf_get_packet(ctx, &in); |
|
|
|
ret = ff_bsf_get_packet_ref(ctx, pkt); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
|
|
|
|
if (s->dropamount > 0 && s->state % s->dropamount == 0) { |
|
|
|
s->state++; |
|
|
|
av_packet_free(&in); |
|
|
|
av_packet_unref(pkt); |
|
|
|
return AVERROR(EAGAIN); |
|
|
|
} |
|
|
|
|
|
|
|
ret = av_new_packet(out, in->size); |
|
|
|
ret = av_packet_make_writable(pkt); |
|
|
|
if (ret < 0) |
|
|
|
goto fail; |
|
|
|
|
|
|
|
ret = av_packet_copy_props(out, in); |
|
|
|
if (ret < 0) |
|
|
|
goto fail; |
|
|
|
|
|
|
|
memcpy(out->data, in->data, in->size); |
|
|
|
|
|
|
|
for (i = 0; i < out->size; i++) { |
|
|
|
s->state += out->data[i] + 1; |
|
|
|
for (i = 0; i < pkt->size; i++) { |
|
|
|
s->state += pkt->data[i] + 1; |
|
|
|
if (s->state % amount == 0) |
|
|
|
out->data[i] = s->state; |
|
|
|
pkt->data[i] = s->state; |
|
|
|
} |
|
|
|
fail: |
|
|
|
if (ret < 0) |
|
|
|
av_packet_unref(out); |
|
|
|
av_packet_free(&in); |
|
|
|
av_packet_unref(pkt); |
|
|
|
|
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
|