better seeking, (not to keyframes but at least to the start of packets ...)

Originally committed as revision 3182 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2004-05-31 16:57:00 +00:00
parent a811de6e72
commit e05655fbbd

View File

@ -1080,10 +1080,10 @@ static int mpegts_read_header(AVFormatContext *s,
MpegTSContext *ts = s->priv_data;
ByteIOContext *pb = &s->pb;
uint8_t buf[1024];
int len, sid;
int len, sid, i;
int64_t pos;
MpegTSService *service;
if (ap) {
ts->mpeg2ts_raw = ap->mpeg2ts_raw;
ts->mpeg2ts_compute_pcr = ap->mpeg2ts_compute_pcr;
@ -1135,21 +1135,23 @@ static int mpegts_read_header(AVFormatContext *s,
}
/* tune to first service found */
service = ts->services[0];
sid = service->sid;
for(i=0; i<ts->nb_services && ts->set_service_ret; i++){
service = ts->services[i];
sid = service->sid;
#ifdef DEBUG_SI
printf("tuning to '%s'\n", service->name);
printf("tuning to '%s'\n", service->name);
#endif
/* now find the info for the first service if we found any,
otherwise try to filter all PATs */
url_fseek(pb, pos, SEEK_SET);
mpegts_set_service(ts, sid, set_service_cb, ts);
handle_packets(ts, MAX_SCAN_PACKETS);
/* now find the info for the first service if we found any,
otherwise try to filter all PATs */
url_fseek(pb, pos, SEEK_SET);
mpegts_set_service(ts, sid, set_service_cb, ts);
handle_packets(ts, MAX_SCAN_PACKETS);
}
/* if could not find service, exit */
if (ts->set_service_ret != 0)
return -1;
@ -1324,6 +1326,29 @@ static int64_t mpegts_get_pcr(AVFormatContext *s, int stream_index,
return timestamp;
}
static int read_seek(AVFormatContext *s, int stream_index, int64_t target_ts){
MpegTSContext *ts = s->priv_data;
uint8_t buf[TS_PACKET_SIZE];
int64_t pos;
if(av_seek_frame_binary(s, stream_index, target_ts) < 0)
return -1;
pos= url_ftell(&s->pb);
for(;;) {
url_fseek(&s->pb, pos, SEEK_SET);
if (get_buffer(&s->pb, buf, TS_PACKET_SIZE) != TS_PACKET_SIZE)
return -1;
// pid = ((buf[1] & 0x1f) << 8) | buf[2];
if(buf[1] & 0x40) break;
pos += ts->raw_packet_size;
}
url_fseek(&s->pb, pos, SEEK_SET);
return 0;
}
/**************************************************************/
/* parsing functions - called from other demuxers such as RTP */
@ -1385,7 +1410,7 @@ AVInputFormat mpegts_demux = {
mpegts_read_header,
mpegts_read_packet,
mpegts_read_close,
NULL, //mpegts_read_seek,
read_seek,
mpegts_get_pcr,
.flags = AVFMT_SHOW_IDS,
};