[FFmpeg-devel] [PATCH] lavfi: add dejudder filter to remove judder produced by partially telecined material.
Nicholas Robbins
nickrobbins at yahoo.com
Sun Feb 9 00:51:00 CET 2014
> On Saturday, February 8, 2014 5:56 PM, Stefano Sabatini <stefasab at gmail.com> wrote:
> > Subject nit:
> lavfi: add dejudder filter to remove judder ...
Fixed.
>> + at section dejudder
>> +
>> +Remove judder. Judder can be introduced, for instance, by
> @ref{pullup} filter.
>
> Remove judder produced by partially interlaced telecined content.
>
> Judder can be introduced ...
>
> Note: I'm always suprised by the amont of cr at p relared to interlaced
> content (it seems most our filters are used to fix one problem or
> another related to it...).
Fixed. Well, less and less material is interlaced, so hopefully this problem will fade.
>> +This filter accepts the following option:
>
> options:
Fixed.
>> +typedef struct {
>> + const AVClass *class;
>
>> + int64_t *ringbuff;
>> + int a, b, c, d;
>
> comments/doxy are welcome here, also "a, b, c, d" are not very
> descriptive variable names.
a--d are indexes to a ring buffer. I could name them "previous, second-previous, ultimate, penultimate" but that seemed cumbersome. Would a comment here about what they are be helpful?
>> + {"cycle", "length of the cycle to use for
> dejuddering",
>
> nit: set length ...
Fixed.
>> + outlink->time_base = av_mul_q(inlink->time_base, av_make_q(1, 2
> * dj->cycle));
>
>> + outlink->frame_rate = av_mul_q(inlink->frame_rate, av_make_q(2 *
> dj->cycle, 1));
>
> What happens if frame_rate is not defined? Maybe you should abort in
> that case.
If frame_rate is not defined isn't it 1/0? in this case, I want to leave it at 1/0 which my code does.
> nit++: remove duplicated empty lines, here and below
Fixed.
>> + dj->ringbuff = av_mallocz(sizeof(int64_t) * (dj->cycle+2));
>
> nit: sizeof(*dj->ringbuff) * ...)
Fixed.
>> +static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
>> +{
>> + int i;
>> + AVFilterContext *ctx = inlink->dst;
>> + AVFilterLink *outlink = ctx->outputs[0];
>> + DejudderContext *dj = ctx->priv;
>
>> + int64_t *judbuff = dj->ringbuff;
>
> you can probably remove the indirection and leave optims to the
> compiler
If I understand you, you are suggesting I replace all my judbuff's in the code with "inlink->dst->priv->ringbuff". This seems a little cumbersome. Is that what you mean? Other filters seem to do what I've done here.
>> + int64_t next_pts = frame->pts;
>> + int64_t offset;
>> +
>> +
>
>> + if (dj->start_count) {
>> + dj->start_count--;
>> + dj->new_pts = next_pts * 2 * dj->cycle;
>
> what happens in case pts == AV_NOPTS_VALUE?
I didn't consider that. I've added code to just pass the frame then. When might a frame have AV_NOPTS_VALUE?
>> + for (i = 0; i < dj->cycle + 2; i++) judbuff[i] +=
> offset;
>
> style: judbuff[i] += offset; in a separate line
Fixed.
>> +AVFilter ff_vf_dejudder = {
>> + .name = "dejudder",
>
>> + .description = NULL_IF_CONFIG_SMALL("Remove judder produced by
> pullup"),
>
> missing ending point
Fixed.
Thanks for all your comments,
--
Nicholas Robbins
More information about the ffmpeg-devel
mailing list