aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2020-01-27 19:07:00 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2020-07-01 12:49:26 +0200
commit5e81e1fb114fcb47bcc0f5bf5a5b249a3ba3f1ac (patch)
tree019e54f3c1744cec04023a78e6489f27fb2806e1
parent1bed5bf9e296a1967b16ed9315eea8ab72edf6eb (diff)
downloadffmpeg-5e81e1fb114fcb47bcc0f5bf5a5b249a3ba3f1ac.tar.gz
avformat/mpegts: Improve the position determination for avpriv_mpegts_parse_packet()
Fixes: assertion failure Fixes: Ticket 8005 Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> (cherry picked from commit e5bb48ae5990347dff22fc38ff5a1c1f7f60a1c5) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavformat/mpegts.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 67b25233ec..a92a7971f5 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -2247,13 +2247,12 @@ static int parse_pcr(int64_t *ppcr_high, int *ppcr_low,
const uint8_t *packet);
/* handle one TS packet */
-static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
+static int handle_packet(MpegTSContext *ts, const uint8_t *packet, int64_t pos)
{
MpegTSFilter *tss;
int len, pid, cc, expected_cc, cc_ok, afc, is_start, is_discontinuity,
has_adaptation, has_payload;
const uint8_t *p, *p_end;
- int64_t pos;
pid = AV_RB16(packet + 1) & 0x1fff;
if (pid && discard_pid(ts, pid))
@@ -2310,7 +2309,6 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet)
if (p >= p_end || !has_payload)
return 0;
- pos = avio_tell(ts->stream->pb);
if (pos >= 0) {
av_assert0(pos >= TS_PACKET_SIZE);
ts->pos47_full = pos - TS_PACKET_SIZE;
@@ -2521,7 +2519,7 @@ static int handle_packets(MpegTSContext *ts, int64_t nb_packets)
ret = read_packet(s, packet, ts->raw_packet_size, &data);
if (ret != 0)
break;
- ret = handle_packet(ts, data);
+ ret = handle_packet(ts, data, avio_tell(s->pb));
finished_reading_packet(s, ts->raw_packet_size);
if (ret != 0)
break;
@@ -2916,7 +2914,7 @@ int avpriv_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
buf++;
len--;
} else {
- handle_packet(ts, buf);
+ handle_packet(ts, buf, len1 - len + TS_PACKET_SIZE);
buf += TS_PACKET_SIZE;
len -= TS_PACKET_SIZE;
if (ts->stop_parse == 1)