[FFmpeg-soc] [soc]: r5826 - in seek2010: . seek2010.patch
Michael Niedermayer
michaelni at gmx.at
Wed Jun 16 22:07:06 CEST 2010
On Wed, Jun 09, 2010 at 03:42:09PM +0200, mchinen wrote:
> Author: mchinen
> Date: Wed Jun 9 15:42:08 2010
> New Revision: 5826
>
> Log:
> creating seek2010 dir for my soc proj and adding current patch
[...]
> +Index: libavformat/avformat.h
> +===================================================================
> +--- libavformat/avformat.h (revision 23548)
> ++++ libavformat/avformat.h (working copy)
> +@@ -390,6 +390,21 @@
> + int min_distance; /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */
> + } AVIndexEntry;
> +
> ++#define AV_SEEKTABLE_BUILDING 0x0001
> ++#define AV_SEEKTABLE_CBR 0x0002
> ++#define AV_SEEKTABLE_FINISHED 0x0004
> ++#define AV_SEEKTABLE_COPIED 0x0008
missing documentation
[...]
> +@@ -531,6 +546,9 @@
> + * Number of frames that have been demuxed during av_find_stream_info()
> + */
> + int codec_info_nb_frames;
> ++
> ++ /* new av_seek_frame() support */
> ++ AVSeekTable seek_table;
> + } AVStream;
we alraedy have a table for seeking, that is AVStream.index_entries
why do you add a second table?
[...]
> +Index: libavformat/utils.c
> +===================================================================
> +--- libavformat/utils.c (revision 23548)
> ++++ libavformat/utils.c (working copy)
> +@@ -1001,7 +1001,38 @@
> + pkt->convergence_duration = pc->convergence_duration;
> + }
> +
> ++static int av_add_table_entry(AVStream *st,
> ++ int64_t pos, int64_t timestamp, int size, int distance, int flags)
> ++{
> ++ AVIndexEntry *entries, *ie;
> ++ int index;
> +
> ++ if((unsigned)st->nb_index_entries + 1 >= UINT_MAX / sizeof(AVIndexEntry))
> ++ return -1;
> ++
> ++ entries = av_fast_realloc(st->seek_table.index_entries,
> ++ &st->seek_table.index_entries_allocated_size,
> ++ (st->seek_table.nb_index_entries + 1) *
> ++ sizeof(AVIndexEntry));
> ++ if(!entries)
> ++ return -1;
> ++
> ++ st->seek_table.index_entries= entries;
> ++
> ++ /* we assume the indecies are placed in order */
> ++ ie = &st->seek_table.index_entries[st->seek_table.nb_index_entries++];
> ++ assert(index==0 || ie[-1].timestamp < timestamp);
> ++
> ++ ie->pos = pos;
> ++ ie->timestamp = timestamp;
> ++ ie->min_distance= distance;
> ++ ie->size= size;
> ++ ie->flags = flags;
> ++
> ++ return st->seek_table.nb_index_entries;
> ++}
> ++
> ++
> + static int av_read_frame_internal(AVFormatContext *s, AVPacket *pkt)
> + {
> + AVStream *st;
> +@@ -1359,6 +1390,7 @@
> + int a, b, m;
> + int64_t timestamp;
> +
> ++
> + a = - 1;
> + b = nb_entries;
> +
> +@@ -1675,6 +1707,11 @@
> + timestamp = av_rescale(timestamp, st->time_base.den, AV_TIME_BASE * (int64_t)st->time_base.num);
> + }
> +
> ++ /* if we've built a seek table, use it. */
> ++ st = s->streams[stream_index];
> ++ if (st->seek_table.flags & AV_SEEKTABLE_FINISHED)
> ++ return av_seek_frame_table(s, stream_index, timestamp, flags);
> ++
> + /* first, we try the format specific seek */
> + if (s->iformat->read_seek)
> + ret = s->iformat->read_seek(s, stream_index, timestamp, flags);
> +@@ -1712,9 +1749,367 @@
> + // try some generic seek like av_seek_frame_generic() but with new ts semantics
> + }
> +
> ++
> + /*******************************************************/
> ++int av_table_search_timestamp(AVStream *st, int64_t wanted_timestamp,
> ++ int flags)
> ++{
> ++ AVIndexEntry *entries= st->seek_table.index_entries;
> ++ int nb_entries= st->seek_table.nb_index_entries;
> ++ int a, b, m;
> ++ int64_t timestamp;
> +
> ++ a = - 1;
> ++ b = nb_entries;
> ++
> ++ //optimize appending index entries at the end
> ++ if(b && entries[b-1].timestamp < wanted_timestamp)
> ++ a= b-1;
> ++
> ++ while (b - a > 1) {
> ++ //TODO: since we have a lot of contiguous entries in the table, we can use something more
> ++ //like dictionary search, which will speed things up quite a bit.
> ++ m = (a + b) >> 1;
> ++ timestamp = entries[m].timestamp;
> ++ if(timestamp >= wanted_timestamp)
> ++ b = m;
> ++ if(timestamp <= wanted_timestamp)
> ++ a = m;
> ++ }
> ++ m= (flags & AVSEEK_FLAG_BACKWARD) ? a : b;
> ++
> ++ if(!(flags & AVSEEK_FLAG_ANY)){
> ++ while(m>=0 && m<nb_entries && !(entries[m].flags & AVINDEX_KEYFRAME)){
> ++ m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;
> ++ }
> ++ }
> ++
> ++ if(m == nb_entries)
> ++ return -1;
> ++ return m;
> ++}
> ++
[...]
> ++static int av_fill_table_internal(AVFormatContext *s, AVPacket *pkt, ByteIOContext *pb)
lots of code duplication
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I know you won't believe me, but the highest form of Human Excellence is
to question oneself and others. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-soc/attachments/20100616/1eed1ba1/attachment.pgp>
More information about the FFmpeg-soc
mailing list