[FFmpeg-devel] [PATCH] Add a slice_dir parameter to avfilter_start_frame()

Michael Niedermayer michaelni
Fri Dec 4 13:43:30 CET 2009


On Fri, Dec 04, 2009 at 01:21:06AM +0100, Stefano Sabatini wrote:
> On date Wednesday 2009-12-02 13:00:30 +0100, Michael Niedermayer encoded:
> > On Wed, Dec 02, 2009 at 09:18:48AM +0100, Stefano Sabatini wrote:
> > > On date Wednesday 2009-12-02 03:08:37 +0100, Michael Niedermayer encoded:
> > > > On Wed, Dec 02, 2009 at 01:39:43AM +0100, Stefano Sabatini wrote:
> > > > > Hi,
> > > > > 
> > > > > this is useful for the scale, slicify and pad filters, which have
> > > > > otherwise to heuristically determine the slice direction, so
> > > > > duplicating code.
> > > > > 
> > > > > Also I'm not sure about which values to use for the slice_dir, now I'm
> > > > > using 1/-1 but >0/<0 may be better, suggestions?
> > > > 
> > > > 1/-1
> > > > 
> > > > 
> > > > [...]
> > > > > -void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref)
> > > > > +void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref, int slice_dir)
> > > > 
> > > > i suggested draw_slice()
> > > > we need it only in draw_slice()
> > > > your code now must store it always in the context because its never needed
> > > > in start_frame but always in draw_slice()
> > > > you dont even attempt to explain why you do it like that and not like i
> > > > suggested.
> > > > YOu didnt expect me to do anything except rejecting this did you?
> > > > its more complex and its completely unclear why its done like that
> > > 
> > > I tried to explain it in another mail, since the direction is
> > > *per-frame* I thougth it was slightly more robust to pass this
> > > information just one time per frame.
> > > 
> > > That said, I see your point and if you prefer the slice_dir in
> > > draw_slice() for me it is absolutely fine.
> > 
> > i prefer it in draw_slice()
> 
> Updated.
> 
> One funny thing I noticed:
> ffplay -loglevel debug in.avi -vfilters "scale=100:100, vflip, slicify=10, format=argb" ^| grep "scale           ->ffplay_output"
> start_frame     : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] picref[0xa194b60 data[0xa30a840, 0xa30d400, 0xa30e080, (nil)] linesize[112, 64, 64, 0] pts:1400000 s:100x100]
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:92 h:8 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:82 h:10 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:72 h:10 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:62 h:10 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:52 h:10 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:42 h:10 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:32 h:10 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:22 h:10 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:12 h:10 dir:-1
> draw_slice      : link[0xa0e08c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:0 h:12 dir:-1
> 
> Then I tried to comment the following lines in the scale filter: 
>     if (scale->slice_y == 0 && slice_dir == -1)
>         scale->slice_y = link->dst->outputs[0]->h;
> 
> start_frame     : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] picref[0x99d3040 data[0x9c72590, 0x9c75150, 0x9c75dd0, (nil)] linesize[112, 64, 64, 0] pts:2966000 s:100x100]
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-8 h:8 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-18 h:10 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-28 h:10 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-38 h:10 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-48 h:10 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-58 h:10 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-68 h:10 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-78 h:10 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-88 h:10 dir:-1
> draw_slice      : link[0x996f8c0 s:100x100 fmt:yuv420p          scale           ->ffplay_output   ] y:-100 h:12 dir:-1
> 
> libswscale seems to work fine with negative values for y.
> 
> BTW, the abovementioned lines in draw_slice() are also the reason for
> which I prefer to put in start_frame the slice_dir, apart for the
> already mentioned reasons I think a filter may need to do something in
> start_frame() with the slice_dir parameter (in this case set the
> scale->slice_y parameter), rather than do that in draw_slice(), with
> slice_dir in draw_slice() this is not possible.
> 
> Regards.
> -- 
> FFmpeg = Funny and Friendly Martial Ponderous Ecstatic Gymnast

>  avfilter.c   |    8 ++++----
>  avfilter.h   |   12 ++++++++----
>  defaults.c   |    4 ++--
>  vf_crop.c    |    4 ++--
>  vf_format.c  |    4 ++--
>  vf_scale.c   |   21 +++++++--------------
>  vf_slicify.c |    6 +++---
>  vf_vflip.c   |    4 ++--
>  8 files changed, 30 insertions(+), 33 deletions(-)
> e8e67b6905245c552a1ba8dc6e07ca8ffc4c727a  lavfi-add-slice-dir-to-draw-slice.patch

ok

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Dictatorship naturally arises out of democracy, and the most aggravated
form of tyranny and slavery out of the most extreme liberty. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20091204/dd590e8f/attachment.pgp>



More information about the ffmpeg-devel mailing list