Commit 4ed0b28a authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'cabb1681'

* commit 'cabb1681':
  mpegts: Remove one memcpy per packet

Conflicts:
	libavformat/mpegts.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 8878aef0 cabb1681
...@@ -1911,17 +1911,17 @@ static int mpegts_resync(AVFormatContext *s) ...@@ -1911,17 +1911,17 @@ static int mpegts_resync(AVFormatContext *s)
} }
/* return -1 if error or EOF. Return 0 if OK. */ /* return -1 if error or EOF. Return 0 if OK. */
static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size) static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size, uint8_t **data)
{ {
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
int skip, len; int len;
for(;;) { for(;;) {
len = avio_read(pb, buf, TS_PACKET_SIZE); len = ffio_read_indirect(pb, buf, TS_PACKET_SIZE, data);
if (len != TS_PACKET_SIZE) if (len != TS_PACKET_SIZE)
return len < 0 ? len : AVERROR_EOF; return len < 0 ? len : AVERROR_EOF;
/* check packet sync byte */ /* check packet sync byte */
if (buf[0] != 0x47) { if ((*data)[0] != 0x47) {
/* find a new packet start */ /* find a new packet start */
avio_seek(pb, -TS_PACKET_SIZE, SEEK_CUR); avio_seek(pb, -TS_PACKET_SIZE, SEEK_CUR);
if (mpegts_resync(s) < 0) if (mpegts_resync(s) < 0)
...@@ -1929,19 +1929,25 @@ static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size) ...@@ -1929,19 +1929,25 @@ static int read_packet(AVFormatContext *s, uint8_t *buf, int raw_packet_size)
else else
continue; continue;
} else { } else {
skip = raw_packet_size - TS_PACKET_SIZE;
if (skip > 0)
avio_skip(pb, skip);
break; break;
} }
} }
return 0; return 0;
} }
static void finished_reading_packet(AVFormatContext *s, int raw_packet_size)
{
AVIOContext *pb = s->pb;
int skip = raw_packet_size - TS_PACKET_SIZE;
if (skip > 0)
avio_skip(pb, skip);
}
static int handle_packets(MpegTSContext *ts, int nb_packets) static int handle_packets(MpegTSContext *ts, int nb_packets)
{ {
AVFormatContext *s = ts->stream; AVFormatContext *s = ts->stream;
uint8_t packet[TS_PACKET_SIZE + FF_INPUT_BUFFER_PADDING_SIZE]; uint8_t packet[TS_PACKET_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
uint8_t *data;
int packet_num, ret = 0; int packet_num, ret = 0;
if (avio_tell(s->pb) != ts->last_pos) { if (avio_tell(s->pb) != ts->last_pos) {
...@@ -1975,10 +1981,11 @@ static int handle_packets(MpegTSContext *ts, int nb_packets) ...@@ -1975,10 +1981,11 @@ static int handle_packets(MpegTSContext *ts, int nb_packets)
if (ts->stop_parse > 0) if (ts->stop_parse > 0)
break; break;
ret = read_packet(s, packet, ts->raw_packet_size); ret = read_packet(s, packet, ts->raw_packet_size, &data);
if (ret != 0) if (ret != 0)
break; break;
ret = handle_packet(ts, packet); ret = handle_packet(ts, data);
finished_reading_packet(s, ts->raw_packet_size);
if (ret != 0) if (ret != 0)
break; break;
} }
...@@ -2102,6 +2109,7 @@ static int mpegts_read_header(AVFormatContext *s) ...@@ -2102,6 +2109,7 @@ static int mpegts_read_header(AVFormatContext *s)
int64_t pcrs[2], pcr_h; int64_t pcrs[2], pcr_h;
int packet_count[2]; int packet_count[2];
uint8_t packet[TS_PACKET_SIZE]; uint8_t packet[TS_PACKET_SIZE];
uint8_t *data;
/* only read packets */ /* only read packets */
...@@ -2117,18 +2125,21 @@ static int mpegts_read_header(AVFormatContext *s) ...@@ -2117,18 +2125,21 @@ static int mpegts_read_header(AVFormatContext *s)
nb_pcrs = 0; nb_pcrs = 0;
nb_packets = 0; nb_packets = 0;
for(;;) { for(;;) {
ret = read_packet(s, packet, ts->raw_packet_size); ret = read_packet(s, packet, ts->raw_packet_size, &data);
if (ret < 0) if (ret < 0)
goto fail; goto fail;
pid = AV_RB16(packet + 1) & 0x1fff; pid = AV_RB16(data + 1) & 0x1fff;
if ((pcr_pid == -1 || pcr_pid == pid) && if ((pcr_pid == -1 || pcr_pid == pid) &&
parse_pcr(&pcr_h, &pcr_l, packet) == 0) { parse_pcr(&pcr_h, &pcr_l, data) == 0) {
finished_reading_packet(s, ts->raw_packet_size);
pcr_pid = pid; pcr_pid = pid;
packet_count[nb_pcrs] = nb_packets; packet_count[nb_pcrs] = nb_packets;
pcrs[nb_pcrs] = pcr_h * 300 + pcr_l; pcrs[nb_pcrs] = pcr_h * 300 + pcr_l;
nb_pcrs++; nb_pcrs++;
if (nb_pcrs >= 2) if (nb_pcrs >= 2)
break; break;
} else {
finished_reading_packet(s, ts->raw_packet_size);
} }
nb_packets++; nb_packets++;
} }
...@@ -2160,15 +2171,19 @@ static int mpegts_raw_read_packet(AVFormatContext *s, ...@@ -2160,15 +2171,19 @@ static int mpegts_raw_read_packet(AVFormatContext *s,
int64_t pcr_h, next_pcr_h, pos; int64_t pcr_h, next_pcr_h, pos;
int pcr_l, next_pcr_l; int pcr_l, next_pcr_l;
uint8_t pcr_buf[12]; uint8_t pcr_buf[12];
uint8_t *data;
if (av_new_packet(pkt, TS_PACKET_SIZE) < 0) if (av_new_packet(pkt, TS_PACKET_SIZE) < 0)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
pkt->pos= avio_tell(s->pb); pkt->pos= avio_tell(s->pb);
ret = read_packet(s, pkt->data, ts->raw_packet_size); ret = read_packet(s, pkt->data, ts->raw_packet_size, &data);
if (ret < 0) { if (ret < 0) {
av_free_packet(pkt); av_free_packet(pkt);
return ret; return ret;
} }
if (data != pkt->data)
memcpy(pkt->data, data, ts->raw_packet_size);
finished_reading_packet(s, ts->raw_packet_size);
if (ts->mpeg2ts_compute_pcr) { if (ts->mpeg2ts_compute_pcr) {
/* compute exact PCR for each packet */ /* compute exact PCR for each packet */
if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) { if (parse_pcr(&pcr_h, &pcr_l, pkt->data) == 0) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment