initial av_read_frame() and av_seek_frame() support

Originally committed as revision 2494 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Fabrice Bellard 21 years ago
parent c6f353ff61
commit fb2758c83d
  1. 86
      libavformat/avformat.h
  2. 916
      libavformat/utils.c

@ -5,7 +5,7 @@
extern "C" { extern "C" {
#endif #endif
#define LIBAVFORMAT_BUILD 4609 #define LIBAVFORMAT_BUILD 4610
#define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT #define LIBAVFORMAT_VERSION_INT FFMPEG_VERSION_INT
#define LIBAVFORMAT_VERSION FFMPEG_VERSION #define LIBAVFORMAT_VERSION FFMPEG_VERSION
@ -31,12 +31,15 @@ extern "C" {
#define AV_TIME_BASE 1000000 #define AV_TIME_BASE 1000000
typedef struct AVPacket { typedef struct AVPacket {
int64_t pts; /* presentation time stamp in stream units (set av_set_pts_info) */ int64_t pts; /* presentation time stamp in AV_TIME_BASE units (or
pts_den units in muxers or demuxers) */
int64_t dts; /* decompression time stamp in AV_TIME_BASE units (or
pts_den units in muxers or demuxers) */
uint8_t *data; uint8_t *data;
int size; int size;
int stream_index; int stream_index;
int flags; int flags;
int duration; int duration; /* presentation duration (0 if not available) */
void (*destruct)(struct AVPacket *); void (*destruct)(struct AVPacket *);
void *priv; void *priv;
} AVPacket; } AVPacket;
@ -46,11 +49,14 @@ typedef struct AVPacket {
static inline void av_init_packet(AVPacket *pkt) static inline void av_init_packet(AVPacket *pkt)
{ {
pkt->pts = AV_NOPTS_VALUE; pkt->pts = AV_NOPTS_VALUE;
pkt->dts = AV_NOPTS_VALUE;
pkt->duration = 0;
pkt->flags = 0; pkt->flags = 0;
pkt->stream_index = 0; pkt->stream_index = 0;
} }
int av_new_packet(AVPacket *pkt, int size); int av_new_packet(AVPacket *pkt, int size);
int av_dup_packet(AVPacket *pkt);
/** /**
* Free a packet * Free a packet
@ -107,6 +113,8 @@ typedef struct AVFormatParameters {
int mpeg2ts_compute_pcr:1; /* compute exact PCR for each transport int mpeg2ts_compute_pcr:1; /* compute exact PCR for each transport
stream packet (only meaningful if stream packet (only meaningful if
mpeg2ts_raw is TRUE */ mpeg2ts_raw is TRUE */
int initial_pause:1; /* do not begin to play the stream
immediately (RTSP only) */
} AVFormatParameters; } AVFormatParameters;
#define AVFMT_NOFILE 0x0001 /* no file should be opened */ #define AVFMT_NOFILE 0x0001 /* no file should be opened */
@ -158,9 +166,10 @@ typedef struct AVInputFormat {
/* close the stream. The AVFormatContext and AVStreams are not /* close the stream. The AVFormatContext and AVStreams are not
freed by this function */ freed by this function */
int (*read_close)(struct AVFormatContext *); int (*read_close)(struct AVFormatContext *);
/* seek at or before a given pts (given in microsecond). The pts /* seek at or before a given timestamp (given in AV_TIME_BASE
origin is defined by the stream */ units) relative to the frames in stream component stream_index */
int (*read_seek)(struct AVFormatContext *, int64_t pts); int (*read_seek)(struct AVFormatContext *,
int stream_index, int64_t timestamp);
/* can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER */ /* can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER */
int flags; int flags;
/* if extensions are defined, then no probe is done. You should /* if extensions are defined, then no probe is done. You should
@ -169,10 +178,26 @@ typedef struct AVInputFormat {
const char *extensions; const char *extensions;
/* general purpose read only value that the format can use */ /* general purpose read only value that the format can use */
int value; int value;
/* start/resume playing - only meaningful if using a network based format
(RTSP) */
int (*read_play)(struct AVFormatContext *);
/* pause playing - only meaningful if using a network based format
(RTSP) */
int (*read_pause)(struct AVFormatContext *);
/* private fields */ /* private fields */
struct AVInputFormat *next; struct AVInputFormat *next;
} AVInputFormat; } AVInputFormat;
typedef struct AVIndexEntry {
int64_t pos;
int64_t timestamp;
#define AVINDEX_KEYFRAME 0x0001
int flags;
} AVIndexEntry;
typedef struct AVStream { typedef struct AVStream {
int index; /* stream index in AVFormatContext */ int index; /* stream index in AVFormatContext */
int id; /* format specific stream id */ int id; /* format specific stream id */
@ -181,9 +206,8 @@ typedef struct AVStream {
int r_frame_rate_base;/* real frame rate base of the stream */ int r_frame_rate_base;/* real frame rate base of the stream */
void *priv_data; void *priv_data;
/* internal data used in av_find_stream_info() */ /* internal data used in av_find_stream_info() */
int codec_info_state; int64_t codec_info_duration;
int codec_info_nb_repeat_frames; int codec_info_nb_frames;
int codec_info_nb_real_frames;
/* encoding: PTS generation when outputing stream */ /* encoding: PTS generation when outputing stream */
AVFrac pts; AVFrac pts;
/* ffmpeg.c private use */ /* ffmpeg.c private use */
@ -197,6 +221,20 @@ typedef struct AVStream {
/* decoding: duration of the stream, in AV_TIME_BASE fractional /* decoding: duration of the stream, in AV_TIME_BASE fractional
seconds. */ seconds. */
int64_t duration; int64_t duration;
/* av_read_frame() support */
int need_parsing;
struct AVCodecParserContext *parser;
int got_frame;
int64_t cur_frame_pts;
int64_t cur_frame_dts;
int64_t cur_dts;
int last_IP_duration;
/* av_seek_frame() support */
AVIndexEntry *index_entries; /* only used if the format does not
support seeking natively */
int nb_index_entries;
int index_entries_allocated_size;
} AVStream; } AVStream;
#define AVFMTCTX_NOHEADER 0x0001 /* signal that no header is present #define AVFMTCTX_NOHEADER 0x0001 /* signal that no header is present
@ -247,6 +285,24 @@ typedef struct AVFormatContext {
available. Never set it directly if the file_size and the available. Never set it directly if the file_size and the
duration are known as ffmpeg can compute it automatically. */ duration are known as ffmpeg can compute it automatically. */
int bit_rate; int bit_rate;
/* av_read_frame() support */
AVStream *cur_st;
const uint8_t *cur_ptr;
int cur_len;
AVPacket cur_pkt;
/* the following are used for pts/dts unit conversion */
int64_t last_pkt_stream_pts;
int64_t last_pkt_stream_dts;
int64_t last_pkt_pts;
int64_t last_pkt_dts;
int last_pkt_pts_frac;
int last_pkt_dts_frac;
/* av_seek_frame() support */
int64_t data_offset; /* offset of the first packet */
int index_built;
} AVFormatContext; } AVFormatContext;
typedef struct AVPacketList { typedef struct AVPacketList {
@ -373,6 +429,8 @@ int amr_init(void);
int wav_init(void); int wav_init(void);
/* raw.c */ /* raw.c */
int pcm_read_seek(AVFormatContext *s,
int stream_index, int64_t timestamp);
int raw_init(void); int raw_init(void);
/* mp3.c */ /* mp3.c */
@ -436,7 +494,8 @@ AVOutputFormat *guess_stream_format(const char *short_name,
AVOutputFormat *guess_format(const char *short_name, AVOutputFormat *guess_format(const char *short_name,
const char *filename, const char *mime_type); const char *filename, const char *mime_type);
void av_hex_dump(uint8_t *buf, int size); void av_hex_dump(FILE *f, uint8_t *buf, int size);
void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload);
void av_register_all(void); void av_register_all(void);
@ -468,9 +527,14 @@ int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
#define AVERROR_INVALIDDATA (-4) /* invalid data found */ #define AVERROR_INVALIDDATA (-4) /* invalid data found */
#define AVERROR_NOMEM (-5) /* not enough memory */ #define AVERROR_NOMEM (-5) /* not enough memory */
#define AVERROR_NOFMT (-6) /* unknown format */ #define AVERROR_NOFMT (-6) /* unknown format */
#define AVERROR_NOTSUPP (-7) /* operation not supported */
int av_find_stream_info(AVFormatContext *ic); int av_find_stream_info(AVFormatContext *ic);
int av_read_packet(AVFormatContext *s, AVPacket *pkt); int av_read_packet(AVFormatContext *s, AVPacket *pkt);
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp);
int av_read_play(AVFormatContext *s);
int av_read_pause(AVFormatContext *s);
void av_close_input_file(AVFormatContext *s); void av_close_input_file(AVFormatContext *s);
AVStream *av_new_stream(AVFormatContext *s, int id); AVStream *av_new_stream(AVFormatContext *s, int id);
void av_set_pts_info(AVFormatContext *s, int pts_wrap_bits, void av_set_pts_info(AVFormatContext *s, int pts_wrap_bits,

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save