diff options
Diffstat (limited to 'common/recorder.c')
-rw-r--r-- | common/recorder.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/common/recorder.c b/common/recorder.c index 0cbc81d51c..42ae7f88d2 100644 --- a/common/recorder.c +++ b/common/recorder.c @@ -64,6 +64,7 @@ struct mp_recorder_sink { struct mp_recorder *owner; struct sh_stream *sh; AVStream *av_stream; + AVPacket *avpkt; double max_out_pts; bool discont; bool proper_eof; @@ -74,23 +75,26 @@ struct mp_recorder_sink { static int add_stream(struct mp_recorder *priv, struct sh_stream *sh) { enum AVMediaType av_type = mp_to_av_stream_type(sh->type); + int ret = -1; + AVCodecParameters *avp = NULL; if (av_type == AVMEDIA_TYPE_UNKNOWN) - return -1; + goto done; struct mp_recorder_sink *rst = talloc(priv, struct mp_recorder_sink); *rst = (struct mp_recorder_sink) { .owner = priv, .sh = sh, .av_stream = avformat_new_stream(priv->mux, NULL), + .avpkt = av_packet_alloc(), .max_out_pts = MP_NOPTS_VALUE, }; - if (!rst->av_stream) - return -1; + if (!rst->av_stream || !rst->avpkt) + goto done; - AVCodecParameters *avp = mp_codec_params_to_av(sh->codec); + avp = mp_codec_params_to_av(sh->codec); if (!avp) - return -1; + goto done; // Check if we get the same codec_id for the output format; // otherwise clear it to have a chance at muxing @@ -106,15 +110,20 @@ static int add_stream(struct mp_recorder *priv, struct sh_stream *sh) avp->video_delay = 16; if (avp->codec_id == AV_CODEC_ID_NONE) - return -1; + goto done; if (avcodec_parameters_copy(rst->av_stream->codecpar, avp) < 0) - return -1; + goto done; + ret = 0; rst->av_stream->time_base = mp_get_codec_timebase(sh->codec); MP_TARRAY_APPEND(priv, priv->streams, priv->num_streams, rst); - return 0; + +done: + if (avp) + avcodec_parameters_free(&avp); + return ret; } struct mp_recorder *mp_recorder_create(struct mpv_global *global, @@ -237,15 +246,14 @@ static void mux_packet(struct mp_recorder_sink *rst, rst->max_out_pts = MP_PTS_MAX(rst->max_out_pts, pkt->pts); - AVPacket avpkt; - mp_set_av_packet(&avpkt, &mpkt, &rst->av_stream->time_base); + mp_set_av_packet(rst->avpkt, &mpkt, &rst->av_stream->time_base); - avpkt.stream_index = rst->av_stream->index; + rst->avpkt->stream_index = rst->av_stream->index; - if (avpkt.duration < 0 && rst->sh->type != STREAM_SUB) - avpkt.duration = 0; + if (rst->avpkt->duration < 0 && rst->sh->type != STREAM_SUB) + rst->avpkt->duration = 0; - AVPacket *new_packet = av_packet_clone(&avpkt); + AVPacket *new_packet = av_packet_clone(rst->avpkt); if (!new_packet) { MP_ERR(priv, "Failed to allocate packet.\n"); return; @@ -253,6 +261,8 @@ static void mux_packet(struct mp_recorder_sink *rst, if (av_interleaved_write_frame(priv->mux, new_packet) < 0) MP_ERR(priv, "Failed writing packet.\n"); + + av_packet_free(&new_packet); } // Write all packets available in the stream queue @@ -319,6 +329,7 @@ void mp_recorder_destroy(struct mp_recorder *priv) for (int n = 0; n < priv->num_streams; n++) { struct mp_recorder_sink *rst = priv->streams[n]; mux_packets(rst); + mp_free_av_packet(&rst->avpkt); } if (av_write_trailer(priv->mux) < 0) |