[FFmpeg-devel] [PATCH 1/2] avformat/mpegtsenc: Don't use heap allocated array to store pids
Marton Balint
cus at passwd.hu
Fri May 1 18:54:21 EEST 2020
On Thu, 30 Apr 2020, Andriy Gelman wrote:
> From: Andriy Gelman <andriy.gelman at gmail.com>
>
> A temporary heap array currently stores pids from all streams. It is
> used to make sure there are no duplicated pids. However, this array is
> not needed because the pids from past streams are stored in the
> MpegTSWriteStream structs.
>
LGTM, thanks.
Marton
> Signed-off-by: Andriy Gelman <andriy.gelman at gmail.com>
> ---
> libavformat/mpegtsenc.c | 51 +++++++++++------------------------------
> 1 file changed, 14 insertions(+), 37 deletions(-)
>
> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
> index f2be6c6632..8ca1ddf003 100644
> --- a/libavformat/mpegtsenc.c
> +++ b/libavformat/mpegtsenc.c
> @@ -931,7 +931,6 @@ static int mpegts_init(AVFormatContext *s)
> {
> MpegTSWrite *ts = s->priv_data;
> int i, j;
> - int *pids;
> int ret;
>
> if (ts->m2ts_mode == -1) {
> @@ -989,12 +988,6 @@ static int mpegts_init(AVFormatContext *s)
> ts->sdt.write_packet = section_write_packet;
> ts->sdt.opaque = s;
>
> - pids = av_malloc_array(s->nb_streams, sizeof(*pids));
> - if (!pids) {
> - ret = AVERROR(ENOMEM);
> - goto fail;
> - }
> -
> /* assign pids to each stream */
> for (i = 0; i < s->nb_streams; i++) {
> AVStream *st = s->streams[i];
> @@ -1002,8 +995,7 @@ static int mpegts_init(AVFormatContext *s)
>
> ts_st = av_mallocz(sizeof(MpegTSWriteStream));
> if (!ts_st) {
> - ret = AVERROR(ENOMEM);
> - goto fail;
> + return AVERROR(ENOMEM);
> }
> st->priv_data = ts_st;
>
> @@ -1011,8 +1003,7 @@ static int mpegts_init(AVFormatContext *s)
>
> ts_st->payload = av_mallocz(ts->pes_payload_size);
> if (!ts_st->payload) {
> - ret = AVERROR(ENOMEM);
> - goto fail;
> + return AVERROR(ENOMEM);
> }
>
> /* MPEG pid values < 16 are reserved. Applications which set st->id in
> @@ -1043,8 +1034,7 @@ static int mpegts_init(AVFormatContext *s)
> ts->m2ts_textsub_pid > M2TS_TEXTSUB_PID + 1 ||
> ts_st->pid < 16) {
> av_log(s, AV_LOG_ERROR, "Cannot automatically assign PID for stream %d\n", st->index);
> - ret = AVERROR(EINVAL);
> - goto fail;
> + return AVERROR(EINVAL);
> }
> } else {
> ts_st->pid = ts->start_pid + i;
> @@ -1055,30 +1045,26 @@ static int mpegts_init(AVFormatContext *s)
> if (ts_st->pid >= 0x1FFF) {
> av_log(s, AV_LOG_ERROR,
> "Invalid stream id %d, must be less than 8191\n", st->id);
> - ret = AVERROR(EINVAL);
> - goto fail;
> + return AVERROR(EINVAL);
> }
> for (j = 0; j < ts->nb_services; j++) {
> if (ts->services[j]->pmt.pid > LAST_OTHER_PID) {
> av_log(s, AV_LOG_ERROR,
> "Invalid PMT PID %d, must be less than %d\n", ts->services[j]->pmt.pid, LAST_OTHER_PID + 1);
> - ret = AVERROR(EINVAL);
> - goto fail;
> + return AVERROR(EINVAL);
> }
> if (ts_st->pid == ts->services[j]->pmt.pid) {
> av_log(s, AV_LOG_ERROR, "PID %d cannot be both elementary and PMT PID\n", ts_st->pid);
> - ret = AVERROR(EINVAL);
> - goto fail;
> + return AVERROR(EINVAL);
> }
> }
> for (j = 0; j < i; j++) {
> - if (pids[j] == ts_st->pid) {
> + MpegTSWriteStream *ts_st_prev = s->streams[j]->priv_data;
> + if (ts_st_prev->pid == ts_st->pid) {
> av_log(s, AV_LOG_ERROR, "Duplicate stream id %d\n", ts_st->pid);
> - ret = AVERROR(EINVAL);
> - goto fail;
> + return AVERROR(EINVAL);
> }
> }
> - pids[i] = ts_st->pid;
> ts_st->payload_pts = AV_NOPTS_VALUE;
> ts_st->payload_dts = AV_NOPTS_VALUE;
> ts_st->first_pts_check = 1;
> @@ -1089,35 +1075,30 @@ static int mpegts_init(AVFormatContext *s)
> AVStream *ast;
> ts_st->amux = avformat_alloc_context();
> if (!ts_st->amux) {
> - ret = AVERROR(ENOMEM);
> - goto fail;
> + return AVERROR(ENOMEM);
> }
> ts_st->amux->oformat =
> av_guess_format((ts->flags & MPEGTS_FLAG_AAC_LATM) ? "latm" : "adts",
> NULL, NULL);
> if (!ts_st->amux->oformat) {
> - ret = AVERROR(EINVAL);
> - goto fail;
> + return AVERROR(EINVAL);
> }
> if (!(ast = avformat_new_stream(ts_st->amux, NULL))) {
> - ret = AVERROR(ENOMEM);
> - goto fail;
> + return AVERROR(ENOMEM);
> }
> ret = avcodec_parameters_copy(ast->codecpar, st->codecpar);
> if (ret != 0)
> - goto fail;
> + return ret;
> ast->time_base = st->time_base;
> ret = avformat_write_header(ts_st->amux, NULL);
> if (ret < 0)
> - goto fail;
> + return ret;
> }
> if (st->codecpar->codec_id == AV_CODEC_ID_OPUS) {
> ts_st->opus_pending_trim_start = st->codecpar->initial_padding * 48000 / st->codecpar->sample_rate;
> }
> }
>
> - av_freep(&pids);
> -
> if (ts->copyts < 1)
> ts->first_pcr = av_rescale(s->max_delay, PCR_TIME_BASE, AV_TIME_BASE);
>
> @@ -1138,10 +1119,6 @@ static int mpegts_init(AVFormatContext *s)
> av_rescale(ts->pat_period, 1000, PCR_TIME_BASE));
>
> return 0;
> -
> -fail:
> - av_freep(&pids);
> - return ret;
> }
>
> /* send SDT, PAT and PMT tables regularly */
> --
> 2.25.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list