[FFmpeg-devel] [PATCH] matroska: Set CodecDelay and SeekPreroll in the AVStream

Michael Niedermayer michaelni at gmx.at
Tue Sep 24 20:36:53 CEST 2013


On Tue, Sep 24, 2013 at 10:35:47AM -0700, Vignesh Venkatasubramanian wrote:
> On Tue, Sep 24, 2013 at 3:53 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
> > On Mon, Sep 23, 2013 at 04:03:25PM -0700, Vignesh Venkatasubramanian wrote:
> >> On Mon, Sep 23, 2013 at 4:02 PM, Vignesh Venkatasubramanian
> >> <vigneshv at google.com> wrote:
> >> > This patch exports the values of Codec Delay and Seek Preroll
> >> > container elements as in the AVStream structure. The seek_preroll
> >> > field has been added to the AVStream struct and the minor version
> >> > of libavformat has been bumped.
> >> >
> >> > Signed-off-by: Vignesh Venkatasubramanian <vigneshv at google.com>
> >> > ---
> >> >  libavformat/avformat.h    | 16 ++++++++++++++++
> >> >  libavformat/matroskadec.c | 14 ++++++++++++++
> >> >  libavformat/version.h     |  2 +-
> >> >  3 files changed, 31 insertions(+), 1 deletion(-)
> >> >
> >> > diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> >> > index b18eb3f..6671a83 100644
> >> > --- a/libavformat/avformat.h
> >> > +++ b/libavformat/avformat.h
> >> > @@ -856,6 +856,9 @@ typedef struct AVStream {
> >> >
> >> >      /**
> >> >       * Number of samples to skip at the start of the frame decoded from the next packet.
> >> > +     *
> >> > +     * Code outside avformat should access this field using:
> >> > +     * av_stream_get_skip_samples/set_skip_samples(stream)
> >> >       */
> >> >      int skip_samples;
> >
> > when does code outside lavf need to access this ?
> >
> 
> you are right. it need not be accessed outside lavf.
> 
> >
> >> >
> >> > @@ -888,10 +891,23 @@ typedef struct AVStream {
> >> >       */
> >> >      int pts_wrap_behavior;
> >> >
> >> > +    /**
> >> > +     * Number of samples to skip after a discontinuity. For example, when a seek
> >> > +     * happens.
> >> > +     *
> >> > +     * Code outside avformat should access this field using:
> >> > +     * av_stream_get/set_seek_preroll(stream)
> >> > +     */
> >> > +    int seek_preroll;
> >> > +
> >> >  } AVStream;
> >> >
> >> >  AVRational av_stream_get_r_frame_rate(const AVStream *s);
> >> >  void       av_stream_set_r_frame_rate(AVStream *s, AVRational r);
> >> > +int  av_stream_get_skip_samples(const AVStream *s);
> >> > +void av_stream_set_skip_samples(AVStream *s, int skip_samples);
> >> > +int  av_stream_get_seek_preroll(const AVStream *s);
> >> > +void av_stream_set_seek_preroll(AVStream *s, int seek_preroll);
> >> >
> >> >  #define AV_PROGRAM_RUNNING 1
> >> >
> >> > diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> >> > index a1b7f56..ecbc723 100644
> >> > --- a/libavformat/matroskadec.c
> >> > +++ b/libavformat/matroskadec.c
> >> > @@ -163,6 +163,8 @@ typedef struct {
> >> >      uint64_t default_duration;
> >> >      uint64_t flag_default;
> >> >      uint64_t flag_forced;
> >> > +    uint64_t codec_delay;
> >> > +    uint64_t seek_preroll;
> >> >      MatroskaTrackVideo video;
> >> >      MatroskaTrackAudio audio;
> >> >      MatroskaTrackOperation operation;
> >> > @@ -410,6 +412,8 @@ static EbmlSyntax matroska_track[] = {
> >> >      { MATROSKA_ID_TRACKOPERATION,       EBML_NEST, 0, offsetof(MatroskaTrack,operation), {.n=matroska_track_operation} },
> >> >      { MATROSKA_ID_TRACKCONTENTENCODINGS,EBML_NEST, 0, 0, {.n=matroska_track_encodings} },
> >> >      { MATROSKA_ID_TRACKMAXBLKADDID,     EBML_UINT, 0, offsetof(MatroskaTrack,max_block_additional_id) },
> >> > +    { MATROSKA_ID_CODECDELAY,           EBML_UINT, 0, offsetof(MatroskaTrack,codec_delay) },
> >> > +    { MATROSKA_ID_SEEKPREROLL,          EBML_UINT, 0, offsetof(MatroskaTrack,seek_preroll) },
> >> >      { MATROSKA_ID_TRACKFLAGENABLED,     EBML_NONE },
> >> >      { MATROSKA_ID_TRACKFLAGLACING,      EBML_NONE },
> >> >      { MATROSKA_ID_CODECNAME,            EBML_NONE },
> >
> >> > @@ -1874,6 +1878,16 @@ static int matroska_read_header(AVFormatContext *s)
> >> >              st->codec->bits_per_coded_sample = track->audio.bitdepth;
> >> >              if (st->codec->codec_id != AV_CODEC_ID_AAC)
> >> >              st->need_parsing = AVSTREAM_PARSE_HEADERS;
> >> > +            if (track->codec_delay > 0) {
> >> > +                st->skip_samples = av_rescale_q(track->codec_delay,
> >> > +                                                (AVRational){1, 1000000000},
> >> > +                                                (AVRational){1, st->codec->sample_rate});
> >> > +            }
> >
> > i suspect this alone wont work when the user seeks back to the first
> > packet
> 
> i don't understand why. can you please explain?

because its set when parsing the header but when seeking back the
header is not re parsed so its not set again so the first packet
would then skip a different amount
thats unless iam missing something

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

Those who are best at talking, realize last or never when they are wrong.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130924/dd1cdd5c/attachment.asc>


More information about the ffmpeg-devel mailing list