[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.
Stefano Sabatini
stefano.sabatini-lala
Wed Jul 21 17:56:27 CEST 2010
On date Monday 2010-07-19 20:32:23 +0200, Michael Niedermayer encoded:
> 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
I did more tests and I noticed this problem.
In the case of a filterchain of the kind:
buffer -> filter -> ffmpeg_output
After configuration this results like this:
buffer [TB1] <-> [TB1] filter [AVTB] <-> [TB1] ffmpeg_output
while I want to avoid conversions, that is I want this:
buffer [TB1] <-> [TB1] filter [TB1] <-> [TB1] ffmpeg_output
This is done configuring by default the output link to make it use the
same timebase of the *first* input pad if it exists.
Patch updated.
--
FFmpeg = Fostering and Frenzy Magnificient Pitiless Extreme Gargoyle
More information about the ffmpeg-devel
mailing list