X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Frtpenc_mpegts.c;h=50cebf68a3b156a0fd589cc136da08af10210331;hb=fd23efb20b701e5074cfaa6e9afc0e176c5e771a;hp=5f81e1a14533ac3a8a71e9157654ebc7081d432e;hpb=5c363d3e595a9e5b7c42897b7aab91b91b154ac1;p=ffmpeg diff --git a/libavformat/rtpenc_mpegts.c b/libavformat/rtpenc_mpegts.c index 5f81e1a1453..50cebf68a3b 100644 --- a/libavformat/rtpenc_mpegts.c +++ b/libavformat/rtpenc_mpegts.c @@ -26,6 +26,7 @@ struct MuxChain { AVFormatContext *mpegts_ctx; AVFormatContext *rtp_ctx; + AVPacket *pkt; }; static int rtp_mpegts_write_close(AVFormatContext *s) @@ -41,6 +42,9 @@ static int rtp_mpegts_write_close(AVFormatContext *s) av_write_trailer(chain->rtp_ctx); avformat_free_context(chain->rtp_ctx); } + + av_packet_free(&chain->pkt); + return 0; } @@ -48,8 +52,8 @@ static int rtp_mpegts_write_header(AVFormatContext *s) { struct MuxChain *chain = s->priv_data; AVFormatContext *mpegts_ctx = NULL, *rtp_ctx = NULL; - AVOutputFormat *mpegts_format = av_guess_format("mpegts", NULL, NULL); - AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL); + ff_const59 AVOutputFormat *mpegts_format = av_guess_format("mpegts", NULL, NULL); + ff_const59 AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL); int i, ret = AVERROR(ENOMEM); AVStream *st; @@ -58,8 +62,12 @@ static int rtp_mpegts_write_header(AVFormatContext *s) mpegts_ctx = avformat_alloc_context(); if (!mpegts_ctx) return AVERROR(ENOMEM); + chain->pkt = av_packet_alloc(); + if (!chain->pkt) + goto fail; mpegts_ctx->oformat = mpegts_format; mpegts_ctx->max_delay = s->max_delay; + av_dict_copy(&mpegts_ctx->metadata, s->metadata, 0); for (i = 0; i < s->nb_streams; i++) { AVStream* st = avformat_new_stream(mpegts_ctx, NULL); if (!st) @@ -102,10 +110,10 @@ static int rtp_mpegts_write_header(AVFormatContext *s) fail: if (mpegts_ctx) { ffio_free_dyn_buf(&mpegts_ctx->pb); + av_dict_free(&mpegts_ctx->metadata); avformat_free_context(mpegts_ctx); } - if (rtp_ctx) - avformat_free_context(rtp_ctx); + avformat_free_context(rtp_ctx); rtp_mpegts_write_close(s); return ret; } @@ -115,7 +123,7 @@ static int rtp_mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) struct MuxChain *chain = s->priv_data; int ret = 0, size; uint8_t *buf; - AVPacket local_pkt; + AVPacket *local_pkt = chain->pkt; if (!chain->mpegts_ctx->pb) { if ((ret = avio_open_dyn_buf(&chain->mpegts_ctx->pb)) < 0) @@ -129,19 +137,19 @@ static int rtp_mpegts_write_packet(AVFormatContext *s, AVPacket *pkt) av_free(buf); return 0; } - av_init_packet(&local_pkt); - local_pkt.data = buf; - local_pkt.size = size; - local_pkt.stream_index = 0; + av_packet_unref(local_pkt); + local_pkt->data = buf; + local_pkt->size = size; + local_pkt->stream_index = 0; if (pkt->pts != AV_NOPTS_VALUE) - local_pkt.pts = av_rescale_q(pkt->pts, + local_pkt->pts = av_rescale_q(pkt->pts, s->streams[pkt->stream_index]->time_base, chain->rtp_ctx->streams[0]->time_base); if (pkt->dts != AV_NOPTS_VALUE) - local_pkt.dts = av_rescale_q(pkt->dts, + local_pkt->dts = av_rescale_q(pkt->dts, s->streams[pkt->stream_index]->time_base, chain->rtp_ctx->streams[0]->time_base); - ret = av_write_frame(chain->rtp_ctx, &local_pkt); + ret = av_write_frame(chain->rtp_ctx, local_pkt); av_free(buf); return ret;