|
|
@ -19,8 +19,6 @@ |
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
//#define USE_SYNCPOINT_SEARCH
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "libavutil/crc.h" |
|
|
|
#include "libavutil/crc.h" |
|
|
|
#include "libavutil/intreadwrite.h" |
|
|
|
#include "libavutil/intreadwrite.h" |
|
|
|
#include "libavutil/log.h" |
|
|
|
#include "libavutil/log.h" |
|
|
@ -2093,92 +2091,6 @@ static int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index, |
|
|
|
return timestamp; |
|
|
|
return timestamp; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#ifdef USE_SYNCPOINT_SEARCH |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int read_seek2(AVFormatContext *s, |
|
|
|
|
|
|
|
int stream_index, |
|
|
|
|
|
|
|
int64_t min_ts, |
|
|
|
|
|
|
|
int64_t target_ts, |
|
|
|
|
|
|
|
int64_t max_ts, |
|
|
|
|
|
|
|
int flags) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int64_t pos; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int64_t ts_ret, ts_adj; |
|
|
|
|
|
|
|
int stream_index_gen_search; |
|
|
|
|
|
|
|
AVStream *st; |
|
|
|
|
|
|
|
AVParserState *backup; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
backup = ff_store_parser_state(s); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// detect direction of seeking for search purposes
|
|
|
|
|
|
|
|
flags |= (target_ts - min_ts > (uint64_t)(max_ts - target_ts)) ? |
|
|
|
|
|
|
|
AVSEEK_FLAG_BACKWARD : 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (flags & AVSEEK_FLAG_BYTE) { |
|
|
|
|
|
|
|
// use position directly, we will search starting from it
|
|
|
|
|
|
|
|
pos = target_ts; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// search for some position with good timestamp match
|
|
|
|
|
|
|
|
if (stream_index < 0) { |
|
|
|
|
|
|
|
stream_index_gen_search = av_find_default_stream_index(s); |
|
|
|
|
|
|
|
if (stream_index_gen_search < 0) { |
|
|
|
|
|
|
|
ff_restore_parser_state(s, backup); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
st = s->streams[stream_index_gen_search]; |
|
|
|
|
|
|
|
// timestamp for default must be expressed in AV_TIME_BASE units
|
|
|
|
|
|
|
|
ts_adj = av_rescale(target_ts, |
|
|
|
|
|
|
|
st->time_base.den, |
|
|
|
|
|
|
|
AV_TIME_BASE * (int64_t)st->time_base.num); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
ts_adj = target_ts; |
|
|
|
|
|
|
|
stream_index_gen_search = stream_index; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
pos = ff_gen_search(s, stream_index_gen_search, ts_adj, |
|
|
|
|
|
|
|
0, INT64_MAX, -1, |
|
|
|
|
|
|
|
AV_NOPTS_VALUE, |
|
|
|
|
|
|
|
AV_NOPTS_VALUE, |
|
|
|
|
|
|
|
flags, &ts_ret, mpegts_get_pcr); |
|
|
|
|
|
|
|
if (pos < 0) { |
|
|
|
|
|
|
|
ff_restore_parser_state(s, backup); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// search for actual matching keyframe/starting position for all streams
|
|
|
|
|
|
|
|
if (ff_gen_syncpoint_search(s, stream_index, pos, |
|
|
|
|
|
|
|
min_ts, target_ts, max_ts, |
|
|
|
|
|
|
|
flags) < 0) { |
|
|
|
|
|
|
|
ff_restore_parser_state(s, backup); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ff_free_parser_state(s, backup); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int ret; |
|
|
|
|
|
|
|
if (flags & AVSEEK_FLAG_BACKWARD) { |
|
|
|
|
|
|
|
flags &= ~AVSEEK_FLAG_BACKWARD; |
|
|
|
|
|
|
|
ret = read_seek2(s, stream_index, INT64_MIN, target_ts, target_ts, flags); |
|
|
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
|
|
// for compatibility reasons, seek to the best-fitting timestamp
|
|
|
|
|
|
|
|
ret = read_seek2(s, stream_index, INT64_MIN, target_ts, INT64_MAX, flags); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
ret = read_seek2(s, stream_index, target_ts, target_ts, INT64_MAX, flags); |
|
|
|
|
|
|
|
if (ret < 0) |
|
|
|
|
|
|
|
// for compatibility reasons, seek to the best-fitting timestamp
|
|
|
|
|
|
|
|
ret = read_seek2(s, stream_index, INT64_MIN, target_ts, INT64_MAX, flags); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){ |
|
|
|
static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, int flags){ |
|
|
|
MpegTSContext *ts = s->priv_data; |
|
|
|
MpegTSContext *ts = s->priv_data; |
|
|
|
uint8_t buf[TS_PACKET_SIZE]; |
|
|
|
uint8_t buf[TS_PACKET_SIZE]; |
|
|
@ -2202,8 +2114,6 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts, in |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************/ |
|
|
|
/**************************************************************/ |
|
|
|
/* parsing functions - called from other demuxers such as RTP */ |
|
|
|
/* parsing functions - called from other demuxers such as RTP */ |
|
|
|
|
|
|
|
|
|
|
@ -2268,9 +2178,6 @@ AVInputFormat ff_mpegts_demuxer = { |
|
|
|
.read_seek = read_seek, |
|
|
|
.read_seek = read_seek, |
|
|
|
.read_timestamp = mpegts_get_pcr, |
|
|
|
.read_timestamp = mpegts_get_pcr, |
|
|
|
.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT, |
|
|
|
.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT, |
|
|
|
#ifdef USE_SYNCPOINT_SEARCH |
|
|
|
|
|
|
|
.read_seek2 = read_seek2, |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
AVInputFormat ff_mpegtsraw_demuxer = { |
|
|
|
AVInputFormat ff_mpegtsraw_demuxer = { |
|
|
@ -2283,8 +2190,5 @@ AVInputFormat ff_mpegtsraw_demuxer = { |
|
|
|
.read_seek = read_seek, |
|
|
|
.read_seek = read_seek, |
|
|
|
.read_timestamp = mpegts_get_pcr, |
|
|
|
.read_timestamp = mpegts_get_pcr, |
|
|
|
.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT, |
|
|
|
.flags = AVFMT_SHOW_IDS | AVFMT_TS_DISCONT, |
|
|
|
#ifdef USE_SYNCPOINT_SEARCH |
|
|
|
|
|
|
|
.read_seek2 = read_seek2, |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
.priv_class = &mpegtsraw_class, |
|
|
|
.priv_class = &mpegtsraw_class, |
|
|
|
}; |
|
|
|
}; |
|
|
|