[FFmpeg-devel] [PATCH 2/4] Change the PTS time base to AV_TIME_BASE before to process a frame in the filter chain, and change it back to the stream time base in the filtered frame.

Michael Niedermayer michaelni
Mon Jul 19 20:32:23 CEST 2010


On Mon, Jul 19, 2010 at 06:26:20PM +0200, Stefano Sabatini wrote:
> On date Tuesday 2010-06-15 03:05:41 +0200, Michael Niedermayer encoded:
> > On Sat, Jun 12, 2010 at 12:45:29AM +0200, Stefano Sabatini wrote:
> > > On date Wednesday 2010-06-09 00:17:27 +0200, Stefano Sabatini encoded:
> > > > This is required, since all the frames in the filterchain are supposed
> > > > to use a time base of AV_TIME_BASE.
> > > > ---
> > > >  ffplay.c |    3 ++-
> > > >  1 files changed, 2 insertions(+), 1 deletions(-)
> > > > 
> > > > diff --git a/ffplay.c b/ffplay.c
> > > > index 129cd28..dd3cba0 100644
> > > > --- a/ffplay.c
> > > > +++ b/ffplay.c
> > > > @@ -1678,7 +1678,7 @@ static int input_request_frame(AVFilterLink *link)
> > > >      }
> > > >      av_free_packet(&pkt);
> > > >  
> > > > -    picref->pts = pts;
> > > > +    picref->pts = av_rescale_q(pkt.pts, priv->is->video_st->time_base, AV_TIME_BASE_Q);
> > > >      picref->pos = pkt.pos;
> > > >      picref->pixel_aspect = priv->is->video_st->codec->sample_aspect_ratio;
> > > >      avfilter_start_frame(link, picref);
> > > > @@ -1838,6 +1838,7 @@ static int video_thread(void *arg)
> > > >              SDL_Delay(10);
> > > >  #if CONFIG_AVFILTER
> > > >          ret = get_filtered_video_frame(filt_out, frame, &pts_int, &pos);
> > > > +        pts_int = av_rescale_q(pts_int, AV_TIME_BASE_Q, is->video_st->time_base);
> > > >  #else
> > > >          ret = get_video_frame(is, frame, &pts_int, &pkt);
> > > >  #endif
> > > 
> > > Ping? (That's required by the setpts patch).
> > 
> > we need the timebase for muxing, a lazy filter could always
> > set that to AV_TIME_BASE_Q if it likes but we should support keeping track
> > of it.
> > If you disagree then which timebase should the muxer store?
> > some containers dont like it if the timebase is 1000000 times smaller than
> > 1/average fps
> 
> Have a look at the attached patch, the ffplay patch is merely intended
> to show how this stuff is supposed to be used.
> 
> I have also a settb filter I'm using here for testing.
> 
> Regards.
> -- 
> FFmpeg = Furious & Fierce Meaningless Pitiless Exxagerate Guru

>  avfilter.c |   14 ++++++++++++++
>  avfilter.h |   15 ++++++++++++++-
>  2 files changed, 28 insertions(+), 1 deletion(-)
> 578baaf67db407587df6072646d398c3eb051912  0002-Add-a-time_base-field-to-AVFilterPad.patch
> >From 54a936a6cb3af89f6c4042e77750a69b56f68d39 Mon Sep 17 00:00:00 2001
> From: Stefano Sabatini <stefano.sabatini-lala at poste.it>
> Date: Mon, 19 Jul 2010 12:55:27 +0200
> Subject: [PATCH 2/5] Add a time_base field to AVFilterPad.
> 
> This is required for allowing a filter to use a time base different
> from AV_TIME_BASE_Q, as it was previously assumed.
> ---
>  libavfilter/avfilter.c |   14 ++++++++++++++
>  libavfilter/avfilter.h |   15 ++++++++++++++-
>  2 files changed, 28 insertions(+), 1 deletions(-)
> 
> diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
> index e81fa48..5b4e4e7 100644
> --- a/libavfilter/avfilter.c
> +++ b/libavfilter/avfilter.c
> @@ -149,11 +149,15 @@ int avfilter_config_links(AVFilterContext *filter)
>              if(avfilter_config_links(link->src))
>                  return -1;
>  
> +            if (link_spad(link).time_base.num == 0 && link_spad(link).time_base.den == 0)
> +                link_spad(link).time_base = AV_TIME_BASE_Q;
>              if(!(config_link = link_spad(link).config_props))
>                  config_link  = avfilter_default_config_output_link;
>              if(config_link(link))
>                  return -1;
>  
> +            if (link_dpad(link).time_base.num == 0 && link_dpad(link).time_base.den == 0)
> +                link_dpad(link).time_base = link_spad(link).time_base;
>              if((config_link = link_dpad(link).config_props))
>                  if(config_link(link))
>                      return -1;
> @@ -240,6 +244,7 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref)
>  {
>      void (*start_frame)(AVFilterLink *, AVFilterPicRef *);
>      AVFilterPad *dst = &link_dpad(link);
> +    AVFilterPad *src = &link_spad(link);
>  
>      FF_DPRINTF_START(NULL, start_frame); ff_dprintf_link(NULL, link, 0); dprintf(NULL, " "); ff_dprintf_picref(NULL, picref, 1);
>  
> @@ -263,6 +268,15 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref)
>      else
>          link->cur_pic = picref;
>  
> +    if (dst->time_base.num != src->time_base.num || dst->time_base.den != src->time_base.den) {

av_cmp_q()

patch ok except that


[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The real ebay dictionary, page 3
"Rare item" - "Common item with rare defect or maybe just a lie"
"Professional" - "'Toy' made in china, not functional except as doorstop"
"Experts will know" - "The seller hopes you are not an expert"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 190 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20100719/86d56ee0/attachment.pgp>



More information about the ffmpeg-devel mailing list