Mercurial > libavformat.hg
changeset 4615:12a7cd9178dd libavformat
Change TS seeking so it returns position/timestamp of a key frame.
Patch by Ivan Schreter, schreter gmx net
author | cehoyos |
---|---|
date | Sat, 28 Feb 2009 18:35:53 +0000 |
parents | b4c4ee906a60 |
children | 5315c722e61e |
files | mpegts.c |
diffstat | 1 files changed, 12 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/mpegts.c Sat Feb 28 18:23:19 2009 +0000 +++ b/mpegts.c Sat Feb 28 18:35:53 2009 +0000 @@ -48,7 +48,7 @@ typedef struct MpegTSFilter MpegTSFilter; -typedef void PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start); +typedef void PESCallback(MpegTSFilter *f, const uint8_t *buf, int len, int is_start, int64_t pos); typedef struct MpegTSPESFilter { PESCallback *pes_cb; @@ -147,6 +147,7 @@ int total_size; int pes_header_size; int64_t pts, dts; + int64_t ts_packet_pos; /**< position of first TS packet of this PES packet */ uint8_t header[MAX_PES_HEADER_SIZE]; }; @@ -819,7 +820,8 @@ /* return non zero if a packet could be constructed */ static void mpegts_push_data(MpegTSFilter *filter, - const uint8_t *buf, int buf_size, int is_start) + const uint8_t *buf, int buf_size, int is_start, + int64_t pos) { PESContext *pes = filter->u.pes_filter.opaque; MpegTSContext *ts = pes->ts; @@ -832,6 +834,7 @@ if (is_start) { pes->state = MPEGTS_HEADER; pes->data_index = 0; + pes->ts_packet_pos = pos; } p = buf; while (buf_size > 0) { @@ -924,6 +927,8 @@ pkt->stream_index = pes->st->index; pkt->pts = pes->pts; pkt->dts = pes->dts; + /* store position of first TS packet of this PES packet */ + pkt->pos = pes->ts_packet_pos; /* reset pts values */ pes->pts = AV_NOPTS_VALUE; pes->dts = AV_NOPTS_VALUE; @@ -1045,6 +1050,7 @@ MpegTSFilter *tss; int len, pid, cc, cc_ok, afc, is_start; const uint8_t *p, *p_end; + int64_t pos; pid = AV_RB16(packet + 1) & 0x1fff; if(pid && discard_pid(ts, pid)) @@ -1079,7 +1085,8 @@ if (p >= p_end) return; - ts->pos47= url_ftell(ts->stream->pb) % ts->raw_packet_size; + pos = url_ftell(ts->stream->pb); + ts->pos47= pos % ts->raw_packet_size; if (tss->type == MPEGTS_SECTION) { if (is_start) { @@ -1107,8 +1114,9 @@ } } } else { + // Note: The position here points actually behind the current packet. tss->u.pes_filter.pes_cb(tss, - p, p_end - p, is_start); + p, p_end - p, is_start, pos - ts->raw_packet_size); } }