On Tue, May 17, 2011 at 6:18 PM, Stefano Sabatini <
[email protected]> wrote:

> On date Tuesday 2011-05-17 12:05:34 +0800, Can Wu encoded:
> > Hi:
> >
> > There are HDTV channel in the broadcast here, but since lack of HDTV
> > program, the provider will transcode SDTV program to HDTV program, the
> > result black margin around the original SDTV video content.
> > So this filter is used for detect it.
> >
> > For the patches:
> > Current ffplay had not put video key_frame and pict_type to refpic, so
> the
> > first one is to add this info, for the blackmargin filter will only check
> if
> > it's key frame;
> > The second patch is the filter itself.
> >
> > Best Regards!
> >
> > --
> > wucan
>
> > From 81281bc59003a779442c3eebc71bda44b3b9b0e2 Mon Sep 17 00:00:00 2001
> > From: Can Wu <[email protected]>
> > Date: Tue, 17 May 2011 11:30:19 +0800
> > Subject: ffplay: fillin more video props for filter
> >
> > Maybe our video filter will use it...
> > ---
> >  ffplay.c |    4 ++++
> >  1 files changed, 4 insertions(+), 0 deletions(-)
> >
> > diff --git a/ffplay.c b/ffplay.c
> > index a5dc358..d31d56a 100644
> > --- a/ffplay.c
> > +++ b/ffplay.c
> > @@ -1706,6 +1706,10 @@ static int input_request_frame(AVFilterLink *link)
> >      picref->pts = pts;
> >      picref->pos = pkt.pos;
> >      picref->video->pixel_aspect =
> priv->is->video_st->codec->sample_aspect_ratio;
> > +    picref->video->interlaced = priv->frame->interlaced_frame;
> > +    picref->video->top_field_first = priv->frame->top_field_first;
> > +    picref->video->pict_type = priv->frame->pict_type;
> > +    picref->video->key_frame = priv->frame->key_frame;
> >      avfilter_start_frame(link, picref);
> >      avfilter_draw_slice(link, 0, link->h, 1);
> >      avfilter_end_frame(link);
> > --
> > 1.7.3.2.168.gd6b63
> >
>
> > From 256eaff7d1df6cdd8a6df21ea836242e5ebc7194 Mon Sep 17 00:00:00 2001
> > From: Can Wu <[email protected]>
> > Date: Tue, 17 May 2011 11:38:25 +0800
> > Subject: libavfilter: add blackmargin filter
> >
> > Used to detect black margin around video content.
> [...]
> > +static void end_frame(AVFilterLink *inlink)
> > +{
> > +    AVFilterContext *ctx = inlink->dst;
> > +    BlackMarginContext *blackmargin = ctx->priv;
> > +    AVFilterBufferRef *picref = inlink->cur_buf;
> > +    int pblack;
> > +    int x, y;
> > +    uint8_t *p;
> > +    unsigned int nblack;
> > +    int margin_top, margin_bottom, margin_left, margin_right;
> > +
> > +    /* only check on key frame */
> > +    if (!picref->video->key_frame)
> > +        return;
> > +
> > +    /* up */
> > +     p = picref->data[0];
> > +    for (y = 0; y < (inlink->h >> 2); y++) {
> > +        p += picref->linesize[0];
> > +        nblack = 0;
> > +        for (x = 0; x < inlink->w; x++) {
> > +            nblack += p[x] < blackmargin->bthresh;
> > +        }
> > +        pblack = nblack * 100 / inlink->w;
> > +        if (pblack < blackmargin->bamount) {
> > +            break;
> > +        }
> > +    }
> > +    margin_top = y;
> > +
> > +    /* down */
> > +     p = picref->data[0] + picref->linesize[0] * inlink->h;
> > +    for (y = inlink->h; y > (inlink->h >> 2); y--) {
> > +        p -= picref->linesize[0];
> > +        nblack = 0;
> > +        for (x = 0; x < inlink->w; x++) {
> > +            nblack += p[x] < blackmargin->bthresh;
> > +        }
> > +        pblack = nblack * 100 / inlink->w;
> > +        if (pblack < blackmargin->bamount) {
> > +            break;
> > +        }
> > +    }
> > +    margin_bottom = (inlink->h - y);
> > +
> > +    if (margin_top + margin_bottom >= inlink->h) {
> > +        margin_left = 0;
> > +        margin_right = 0;
> > +        av_log(ctx, AV_LOG_WARNING, "full black frame!\n");
> > +        goto done;
> > +    }
> > +
> > +    /* left */
> > +     p = picref->data[0] + picref->linesize[0] * margin_top;
> > +    for (x = 0; x < (inlink->w >> 2); x++) {
> > +        p++;
> > +        nblack = 0;
> > +        for (y = margin_top; y < (inlink->h - margin_bottom); y++) {
> > +            nblack += p[x + y * picref->linesize[0]] <
> blackmargin->bthresh;
> > +        }
> > +        pblack = nblack * 100 / (inlink->h - margin_top -
> margin_bottom);
> > +        if (pblack < blackmargin->bamount) {
> > +            break;
> > +        }
> > +    }
> > +    margin_left = x;
> > +
> > +    /* right */
> > +     p = picref->data[0] + picref->linesize[0] * margin_top;
> > +    for (x = inlink->w; x > (inlink->w >> 2); x--) {
> > +        p--;
> > +        nblack = 0;
> > +        for (y = margin_top; y < (inlink->h - margin_bottom); y++) {
> > +            nblack += p[x + y * picref->linesize[0]] <
> blackmargin->bthresh;
> > +        }
> > +        pblack = nblack * 100 / (inlink->h - margin_top -
> margin_bottom);
> > +        if (pblack < blackmargin->bamount) {
> > +            break;
> > +        }
> > +    }
> > +    margin_right = inlink->w - x;
>
> This code can be factorized by using a common routine, maybe the code
> could be shared with blackframe (and put it in the same file and save
> some RAM).
>
> add a common route for this task is not easy really.
yes, It had codes interleaved with blackframe, but a dedicated filter is
better I think.

> +
> > +done:
> > +    av_log(ctx, AV_LOG_INFO, "frame:%u pos:%"PRId64" pts:%"PRId64" t:%f"
> > +        " %d %d %d %d\n",
>
> uhm please annotate these values (e.g.: top:%d bottom:%d left:%d ...),
> or the user will have to read docs every time.
>
fixed

Thanks for review.

> --
> Odd that we think definitions are definitive.   :-)
>                -- Larry Wall in <[email protected]>
> _______________________________________________
> libav-devel mailing list
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
>



-- 
wucan
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to