avformat/tee: Avoid stack packet

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2021-09-06 00:41:22 +02:00
parent b0e4865187
commit e54bad3fce

View File

@ -540,7 +540,7 @@ static int tee_write_packet(AVFormatContext *avf, AVPacket *pkt)
TeeContext *tee = avf->priv_data; TeeContext *tee = avf->priv_data;
AVFormatContext *avf2; AVFormatContext *avf2;
AVBSFContext *bsfs; AVBSFContext *bsfs;
AVPacket pkt2; AVPacket *const pkt2 = ffformatcontext(avf)->pkt;
int ret_all = 0, ret; int ret_all = 0, ret;
unsigned i, s; unsigned i, s;
int s2; int s2;
@ -565,17 +565,17 @@ static int tee_write_packet(AVFormatContext *avf, AVPacket *pkt)
if (s2 < 0) if (s2 < 0)
continue; continue;
if ((ret = av_packet_ref(&pkt2, pkt)) < 0) { if ((ret = av_packet_ref(pkt2, pkt)) < 0) {
if (!ret_all) if (!ret_all)
ret_all = ret; ret_all = ret;
continue; continue;
} }
bsfs = tee->slaves[i].bsfs[s2]; bsfs = tee->slaves[i].bsfs[s2];
pkt2.stream_index = s2; pkt2->stream_index = s2;
ret = av_bsf_send_packet(bsfs, &pkt2); ret = av_bsf_send_packet(bsfs, pkt2);
if (ret < 0) { if (ret < 0) {
av_packet_unref(&pkt2); av_packet_unref(pkt2);
av_log(avf, AV_LOG_ERROR, "Error while sending packet to bitstream filter: %s\n", av_log(avf, AV_LOG_ERROR, "Error while sending packet to bitstream filter: %s\n",
av_err2str(ret)); av_err2str(ret));
ret = tee_process_slave_failure(avf, i, ret); ret = tee_process_slave_failure(avf, i, ret);
@ -584,7 +584,7 @@ static int tee_write_packet(AVFormatContext *avf, AVPacket *pkt)
} }
while(1) { while(1) {
ret = av_bsf_receive_packet(bsfs, &pkt2); ret = av_bsf_receive_packet(bsfs, pkt2);
if (ret == AVERROR(EAGAIN)) { if (ret == AVERROR(EAGAIN)) {
ret = 0; ret = 0;
break; break;
@ -592,9 +592,9 @@ static int tee_write_packet(AVFormatContext *avf, AVPacket *pkt)
break; break;
} }
av_packet_rescale_ts(&pkt2, bsfs->time_base_out, av_packet_rescale_ts(pkt2, bsfs->time_base_out,
avf2->streams[s2]->time_base); avf2->streams[s2]->time_base);
ret = av_interleaved_write_frame(avf2, &pkt2); ret = av_interleaved_write_frame(avf2, pkt2);
if (ret < 0) if (ret < 0)
break; break;
}; };