On Tue, Aug 5, 2014 at 12:05 PM, wm4 <[email protected]> wrote: > On Tue, 5 Aug 2014 11:13:04 -0400 > Andrew Stone <[email protected]> wrote: > >> The only flags, for now, indicate if metadata was updated and are set after >> each call to >> av_read_frame(). This comes with the caveat that, on stream start, it might >> not be set properly >> as packets might be buffered in AVFormatContext.packet_buffer before being >> given to the user >> in av_read_frame(). >> --- >> doc/APIchanges | 4 ++++ >> libavformat/avformat.h | 14 ++++++++++++++ >> libavformat/utils.c | 2 ++ >> libavformat/version.h | 2 +- >> 4 files changed, 21 insertions(+), 1 deletion(-) >> >> diff --git a/doc/APIchanges b/doc/APIchanges >> index 261993b..a677e42 100644 >> --- a/doc/APIchanges >> +++ b/doc/APIchanges >> @@ -13,6 +13,10 @@ libavutil: 2013-12-xx >> >> API changes, most recent first: >> >> +2014-xx-xx - xxxxxxx - lavf 55.21.0 - avformat.h >> + Add AVFormatContext.event_flags for signaling to the user when events >> + have happened in the stream. >> + >> 2014-07-xx - xxxxxxx - lavu 53.19.0 - avstring.h >> Make name matching function from lavf public as av_match_name(). >> >> diff --git a/libavformat/avformat.h b/libavformat/avformat.h >> index ab2081a..f69765e 100644 >> --- a/libavformat/avformat.h >> +++ b/libavformat/avformat.h >> @@ -296,6 +296,10 @@ struct AVFormatContext; >> * - sorting -- a modified version of a tag that should be used for >> * sorting will have '-sort' appended. E.g. artist="The Beatles", >> * artist-sort="Beatles, The". >> + * - Some protocols and demuxers support metadata updates. After a >> successful >> + * call to av_read_packet(), AVFormatContext.event_flags will be updated >> to >> + * indicate if metadata was updated. Currently, only file >> (AVFormatContext) >> + * and stream (AVStream) metadata change. >> * >> * - Demuxers attempt to export metadata in a generic format, however tags >> * with no generic equivalents are left as they are stored in the >> container. >> @@ -1177,6 +1181,16 @@ typedef struct AVFormatContext { >> * @see AVCodecContext.strict_std_compliance >> */ >> int strict_std_compliance; >> + >> + /** >> + * Flags for the user to detect events happening on the stream. These >> + * are cleared and set anew after each call to av_read_frame(). >> + * A combination of AVFMT_EVENT_FLAG_*. >> + */ >> + int event_flags; >> +#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call >> resulted in updated metadata for the whole file. >> +#define AVFMT_EVENT_FLAG_STREAM_METADATA_UPDATED 0x0002 ///< The call >> resulted in updated metadata for a stream. >> + >> /***************************************************************** >> * All fields below this line are not part of the public API. They >> * may not be used outside of libavformat and can be changed and >> diff --git a/libavformat/utils.c b/libavformat/utils.c >> index 698fcfe..6d191f1 100644 >> --- a/libavformat/utils.c >> +++ b/libavformat/utils.c >> @@ -982,6 +982,8 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) >> const int genpts = s->flags & AVFMT_FLAG_GENPTS; >> int eof = 0; >> >> + s->event_flags = 0; >> + > > Why? IMO it would be better to have the user reset them. This reduces > the chance that events are accidentally missed.
To me, as a user, it seems more awkward that I would have to reset a flag in a struct from a library than the library resetting it after a call. Plus, since the user should be checking the flags after every call to av_read_packet, it's unlikely they'll miss the event. _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
