annotate seek.h @ 5149:4a53fcd622ea libavformat

Check for seek failures in avi_load_index, otherwise if the index offset is invalid (e.g. truncated file) we might end up reading the whole file since trying to seek beyond the end of file does not set EOF.
author reimar
date Wed, 26 Aug 2009 08:38:44 +0000
parents 9b2d2f4aa042
children 26ba0ebacbb2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5139
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
1 /*
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
2 * Utility functions for seeking for use within FFmpeg format handlers.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
3 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
4 * Copyright (c) 2009 Ivan Schreter
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
5 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
6 * This file is part of FFmpeg.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
7 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
12 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
16 * Lesser General Public License for more details.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
17 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
21 */
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
22
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
23 #ifndef AVFORMAT_SEEK_H
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
24 #define AVFORMAT_SEEK_H
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
25
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
26 #include "avformat.h"
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
27
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
28 /// Opaque structure for parser state.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
29 typedef struct AVParserState AVParserState;
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
30
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
31 /**
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
32 * Search for sync point of all active streams.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
33 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
34 * This is not supposed to be called directly by a user application,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
35 * but by demuxers.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
36 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
37 * A sync point is a point in stream, so that decoding from this point,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
38 * output of decoders of all streams synchronizes closest to given timestamp
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
39 * ts (but taking timestamp limits into account, i.e., no sooner than ts_min
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
40 * and no later than ts_max).
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
41 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
42 * @param stream_index stream index for time base reference of timestamps.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
43 * @param pos approximate position where to start searching for key frames.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
44 * @param min_ts minimum allowed timestamp (position, if AVSEEK_FLAG_BYTE set).
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
45 * @param ts target timestamp (or position, if AVSEEK_FLAG_BYTE set in flags).
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
46 * @param max_ts maximum allowed timestamp (position, if AVSEEK_FLAG_BYTE set).
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
47 * @param flags if AVSEEK_FLAG_ANY is set, seek to any frame, otherwise only
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
48 * to a keyframe. If AVSEEK_FLAG_BYTE is set, search by
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
49 * position, not by timestamp.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
50 * @return < 0 if no such sync point could be found, otherwise stream position
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
51 * (stream is repositioned to this position).
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
52 */
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
53 int64_t ff_gen_syncpoint_search(AVFormatContext *s,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
54 int stream_index,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
55 int64_t pos,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
56 int64_t min_ts,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
57 int64_t ts,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
58 int64_t max_ts,
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
59 int flags);
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
60
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
61 /**
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
62 * Store current parser state and file position.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
63 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
64 * This function can be used by demuxers before destructive seeking algorithm
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
65 * to store parser state. After the seek, depending on outcome, original state
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
66 * can be restored or new state kept and original state freed.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
67 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
68 * @note As a side effect, original parser state is reset, since structures
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
69 * are relinked to stored state instead of being deeply-copied (for
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
70 * performance reasons and to keep code simple).
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
71 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
72 * @param s context from which to save state.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
73 * @return parser state object or NULL if memory could not be allocated.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
74 */
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
75 AVParserState *ff_store_parser_state(AVFormatContext *s);
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
76
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
77 /**
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
78 * Restore previously saved parser state and file position.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
79 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
80 * Saved state will be invalidated and freed by this call, since internal
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
81 * structures will be relinked back to stored state instead of being
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
82 * deeply-copied.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
83 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
84 * @param s context to which to restore state (same as used for storing state).
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
85 * @param state state to restore.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
86 */
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
87 void ff_restore_parser_state(AVFormatContext *s, AVParserState *state);
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
88
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
89 /**
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
90 * Free previously saved parser state.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
91 *
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
92 * @param s context to which the state belongs (same as used for storing state).
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
93 * @param state state to free.
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
94 */
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
95 void ff_free_parser_state(AVFormatContext *s, AVParserState *state);
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
96
9b2d2f4aa042 Support for generic multi-stream key frame finding for new seek API.
schreter
parents:
diff changeset
97 #endif /* AVFORMAT_SEEK_H */