[FFmpeg-devel] [PATCH] movie video source

Stefano Sabatini stefano.sabatini-lala
Fri Dec 31 16:35:30 CET 2010


On date Thursday 2010-12-30 01:03:38 +0100, Michael Niedermayer encoded:
> On Tue, Dec 28, 2010 at 02:42:33PM +0100, Stefano Sabatini wrote:
[...]
> >  doc/filters.texi         |   35 ++++++
> >  libavfilter/Makefile     |    2 +
> >  libavfilter/allfilters.c |    1 +
> >  libavfilter/vsrc_movie.c |  266 ++++++++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 304 insertions(+), 0 deletions(-)
> >  create mode 100644 libavfilter/vsrc_movie.c
> > 
> > diff --git a/doc/filters.texi b/doc/filters.texi
> > index 0039044..8f17a4e 100644
> > --- a/doc/filters.texi
> > +++ b/doc/filters.texi
> > @@ -1086,6 +1086,41 @@ to the pad with identifier "in".
> >  "color=red@@0.2:qcif:10 [color]; [in][color] overlay [out]"
> >  @end example
> >  
> > + at section movie
> > +
> > +Read a video stream from a movie container.
> > +
> > +It accepts the syntax:
> > + at example
> > + at var{seekpoint}:@var{format}:@var{filename}[:@var{stream_index}]
> > + at end example
> > +
> 
> > + at var{seekpoint} specifies the seek point in microseconds, the frames
> > +will be output starting from this seek point.
> 
> should be seconds and SI postfixes should be supported, we have code for that

Fixed.

> > +
> > + at var{format} specifies the assumed format for the input file, and can
> > +be either the name of a container of an input device.
> 
> thats not a english sentance

Fixed.

[...]
> > diff --git a/libavfilter/vsrc_movie.c b/libavfilter/vsrc_movie.c
> > new file mode 100644
> > index 0000000..ffc0480
> > --- /dev/null
> > +++ b/libavfilter/vsrc_movie.c
> > @@ -0,0 +1,266 @@
[...]
> > +/**
> > + * @file
> > + * movie file video source filter
> > + *
> > + * @todo use direct rendering (no allocation of a new frame)
> 
> + support more than one output stream
>
> > + */
> > +
> 
> > +#define DEBUG
> 
> ?

Useful for debugging, left but commented out.

[...]
> > +static int movie_get_frame(AVFilterLink *outlink)
> > +{
> > +    MovieContext *movie = outlink->src->priv;
> > +    AVPacket packet;
> > +    int frame_finished;
> > +
> > +    if (movie->is_done == 1)
> > +        return 0;
> > +
> > +    while (av_read_frame(movie->format_ctx, &packet) >= 0) {
> 
> missing EAGAIN handling

Should be fixed.

> > +        // Is this a packet from the video stream?
> > +        if (packet.stream_index == movie->stream_idx) {
> > +            // Decode video frame
> > +            avcodec_decode_video2(movie->codec_ctx, movie->frame, &frame_finished, &packet);
> > +
> > +            // Did we get a video frame?
> > +            if (frame_finished) {
> > +                movie->picref =
> > +                    avfilter_get_video_buffer_ref_from_arrays(movie->frame->data, movie->frame->linesize,
> > +                                                              AV_PERM_READ,
> > +                                                              outlink->format, outlink->w, outlink->h);
 
> > +                movie->picref->pts = packet.pts;
> 
> this is wrong
> 
> 
> > +                movie->picref->pos = packet.pos;
> 
> so is this

wtf why?
-- 
FFmpeg = Frightening & Fostering Mournful Plastic Elaborated Gem



More information about the ffmpeg-devel mailing list