avformat/mpegts: use av_packet_alloc() to allocate packets

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2021-01-29 11:23:45 -03:00
parent ecdad29b67
commit 42422b6dca
1 changed files with 20 additions and 16 deletions

View File

@ -981,7 +981,7 @@ static void reset_pes_packet_state(PESContext *pes)
static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt) static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt)
{ {
av_init_packet(pkt); av_packet_unref(pkt);
pkt->data = (uint8_t *)buffer; pkt->data = (uint8_t *)buffer;
pkt->size = len; pkt->size = len;
} }
@ -990,7 +990,7 @@ static int new_pes_packet(PESContext *pes, AVPacket *pkt)
{ {
uint8_t *sd; uint8_t *sd;
av_init_packet(pkt); av_packet_unref(pkt);
pkt->buf = pes->buffer; pkt->buf = pes->buffer;
pkt->data = pes->buffer->data; pkt->data = pes->buffer->data;
@ -3298,33 +3298,37 @@ static int64_t mpegts_get_dts(AVFormatContext *s, int stream_index,
int64_t *ppos, int64_t pos_limit) int64_t *ppos, int64_t pos_limit)
{ {
MpegTSContext *ts = s->priv_data; MpegTSContext *ts = s->priv_data;
AVPacket *pkt;
int64_t pos; int64_t pos;
int pos47 = ts->pos47_full % ts->raw_packet_size; int pos47 = ts->pos47_full % ts->raw_packet_size;
pos = ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) * ts->raw_packet_size + pos47; pos = ((*ppos + ts->raw_packet_size - 1 - pos47) / ts->raw_packet_size) * ts->raw_packet_size + pos47;
ff_read_frame_flush(s); ff_read_frame_flush(s);
if (avio_seek(s->pb, pos, SEEK_SET) < 0) if (avio_seek(s->pb, pos, SEEK_SET) < 0)
return AV_NOPTS_VALUE; return AV_NOPTS_VALUE;
pkt = av_packet_alloc();
if (!pkt)
return AV_NOPTS_VALUE;
while(pos < pos_limit) { while(pos < pos_limit) {
int ret; int ret = av_read_frame(s, pkt);
AVPacket pkt; if (ret < 0) {
av_init_packet(&pkt); av_packet_free(&pkt);
ret = av_read_frame(s, &pkt);
if (ret < 0)
return AV_NOPTS_VALUE; return AV_NOPTS_VALUE;
if (pkt.dts != AV_NOPTS_VALUE && pkt.pos >= 0) { }
ff_reduce_index(s, pkt.stream_index); if (pkt->dts != AV_NOPTS_VALUE && pkt->pos >= 0) {
av_add_index_entry(s->streams[pkt.stream_index], pkt.pos, pkt.dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */); ff_reduce_index(s, pkt->stream_index);
if (pkt.stream_index == stream_index && pkt.pos >= *ppos) { av_add_index_entry(s->streams[pkt->stream_index], pkt->pos, pkt->dts, 0, 0, AVINDEX_KEYFRAME /* FIXME keyframe? */);
int64_t dts = pkt.dts; if (pkt->stream_index == stream_index && pkt->pos >= *ppos) {
*ppos = pkt.pos; int64_t dts = pkt->dts;
av_packet_unref(&pkt); *ppos = pkt->pos;
av_packet_free(&pkt);
return dts; return dts;
} }
} }
pos = pkt.pos; pos = pkt->pos;
av_packet_unref(&pkt); av_packet_unref(pkt);
} }
av_packet_free(&pkt);
return AV_NOPTS_VALUE; return AV_NOPTS_VALUE;
} }