Merge commit 'cabb1681697555e2c319c37c1f30f149207e9434'
* commit 'cabb1681697555e2c319c37c1f30f149207e9434': mpegts: Remove one memcpy per packet Conflicts: libavformat/mpegts.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
4ed0b28a45
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user