[FFmpeg-devel] [PATCH] lavfi/select/WIP: add scene detection.
David Rice
daverice at mac.com
Sun May 27 02:31:12 CEST 2012
On May 26, 2012, at 3:17 PM, Clément Bœsch wrote:
> On Sat, May 26, 2012 at 06:45:09PM +0200, Michael Niedermayer wrote:
> [...]
>>> +static void set_scene_values(AVFilterContext *ctx, AVFilterBufferRef *picref)
>>> +{
>>> + SelectContext *select = ctx->priv;
>>> + AVFilterBufferRef *prev_picref = select->prev_picref;
>>> +
>>> + if (prev_picref &&
>>> + picref->video->h == prev_picref->video->h &&
>>> + picref->video->w == prev_picref->video->w) {
>>> + int64_t score = 0, diff;
>>> + int x, y;
>>> +
>>
>>> +#define ABSSC(a) abs((int)p[a] - (int)q[a])
>>> + for (y = 0; y < picref->video->h; y++) {
>>> + for (x = 0; x < picref->video->w; x++) {
>>> + const uint8_t *p = picref->data[0] + y * picref->linesize[0] + x*3;
>>> + const uint8_t *q = prev_picref->data[0] + y * prev_picref->linesize[0] + x*3;
>>> + score += ABSSC(0) + ABSSC(1) + ABSSC(2);
>>> + }
>>
>> theres some optimized code in dsputil to calculate sum of abs diff
>> not sure how easy it is to use from lavfi but above looks pretty
>> inefficient so a TODO/FIXME should be added at least
>>
>
> It seems some DSP stuff is going to move to lavu. I added a "TODO: use
> DSPContext.sad[]".
>
> Also, I'm looking for a better algorithm ATM; I'd like to avoid having the
> need of a user threshold (there was a linked paper mentioning another
> method), so users would just have to use select=scene, with scene being 0
> or 1 (and eventually in the whole [0,1] so it could be used like
> select=gt(scene\,0.8))
Here's a link to the scene detection filter I've been using, http://www.silicontrip.net/~mark/view.php/lavtools/20111103-yuvdiff. In additions to sequential frame comparison, it can look at sequential fields to detect scene changes that are produced with pulldown.
Dave Rice
More information about the ffmpeg-devel
mailing list