libavformat: Use avcodec_copy_context for chained muxers

This avoids having the chained AVStream->codec point to the same
AVCodecContext owned by the outer AVStream. The downside is that
changes to the AVCodecContext made after calling av_write_header
cannot be detected automatically within the chained muxer.

This avoids having to manually unlink the chained AVStream->codec
by setting it to null before freeing the chained muxer via generic
freeing functions.

Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
oldabi
Martin Storsjö 14 years ago committed by Ronald S. Bultje
parent 8a2c99b486
commit 1338dc0823
  1. 9
      libavformat/movenchint.c
  2. 8
      libavformat/rtpenc_chain.c
  3. 2
      libavformat/rtsp.c
  4. 2
      libavformat/sapenc.c

@ -57,10 +57,7 @@ int ff_mov_init_hinting(AVFormatContext *s, int index, int src_index)
track->rtp_ctx->streams[0]->sample_aspect_ratio = track->rtp_ctx->streams[0]->sample_aspect_ratio =
src_st->sample_aspect_ratio; src_st->sample_aspect_ratio;
/* Remove the allocated codec context, link to the original one avcodec_copy_context(track->rtp_ctx->streams[0]->codec, src_st->codec);
* instead, to give the rtp muxer access to codec parameters. */
av_free(track->rtp_ctx->streams[0]->codec);
track->rtp_ctx->streams[0]->codec = src_st->codec;
if ((ret = url_open_dyn_packet_buf(&track->rtp_ctx->pb, if ((ret = url_open_dyn_packet_buf(&track->rtp_ctx->pb,
RTP_MAX_PACKET_SIZE)) < 0) RTP_MAX_PACKET_SIZE)) < 0)
@ -86,6 +83,8 @@ fail:
} }
if (track->rtp_ctx && track->rtp_ctx->streams[0]) { if (track->rtp_ctx && track->rtp_ctx->streams[0]) {
av_metadata_free(&track->rtp_ctx->streams[0]->metadata); av_metadata_free(&track->rtp_ctx->streams[0]->metadata);
av_free(track->rtp_ctx->streams[0]->codec->extradata);
av_free(track->rtp_ctx->streams[0]->codec);
av_free(track->rtp_ctx->streams[0]->info); av_free(track->rtp_ctx->streams[0]->info);
av_free(track->rtp_ctx->streams[0]); av_free(track->rtp_ctx->streams[0]);
} }
@ -491,6 +490,8 @@ void ff_mov_close_hinting(MOVTrack *track) {
} }
av_metadata_free(&rtp_ctx->streams[0]->metadata); av_metadata_free(&rtp_ctx->streams[0]->metadata);
av_metadata_free(&rtp_ctx->metadata); av_metadata_free(&rtp_ctx->metadata);
av_free(rtp_ctx->streams[0]->codec->extradata);
av_free(rtp_ctx->streams[0]->codec);
av_free(rtp_ctx->streams[0]->info); av_free(rtp_ctx->streams[0]->info);
av_free(rtp_ctx->streams[0]); av_free(rtp_ctx->streams[0]);
av_freep(&rtp_ctx); av_freep(&rtp_ctx);

@ -50,11 +50,7 @@ AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st,
/* Set the synchronized start time. */ /* Set the synchronized start time. */
rtpctx->start_time_realtime = s->start_time_realtime; rtpctx->start_time_realtime = s->start_time_realtime;
/* Remove the local codec, link to the original codec avcodec_copy_context(rtpctx->streams[0]->codec, st->codec);
* context instead, to give the rtp muxer access to
* codec parameters. */
av_free(rtpctx->streams[0]->codec);
rtpctx->streams[0]->codec = st->codec;
if (handle) { if (handle) {
url_fdopen(&rtpctx->pb, handle); url_fdopen(&rtpctx->pb, handle);
@ -70,6 +66,8 @@ AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st,
url_close_dyn_buf(rtpctx->pb, &ptr); url_close_dyn_buf(rtpctx->pb, &ptr);
av_free(ptr); av_free(ptr);
} }
av_free(rtpctx->streams[0]->codec->extradata);
av_free(rtpctx->streams[0]->codec);
av_free(rtpctx->streams[0]->info); av_free(rtpctx->streams[0]->info);
av_free(rtpctx->streams[0]); av_free(rtpctx->streams[0]);
av_free(rtpctx); av_free(rtpctx);

@ -500,6 +500,8 @@ void ff_rtsp_undo_setup(AVFormatContext *s)
} }
av_metadata_free(&rtpctx->streams[0]->metadata); av_metadata_free(&rtpctx->streams[0]->metadata);
av_metadata_free(&rtpctx->metadata); av_metadata_free(&rtpctx->metadata);
av_free(rtpctx->streams[0]->codec->extradata);
av_free(rtpctx->streams[0]->codec);
av_free(rtpctx->streams[0]->info); av_free(rtpctx->streams[0]->info);
av_free(rtpctx->streams[0]); av_free(rtpctx->streams[0]);
av_free(rtpctx); av_free(rtpctx);

@ -48,6 +48,8 @@ static int sap_write_close(AVFormatContext *s)
url_fclose(rtpctx->pb); url_fclose(rtpctx->pb);
av_metadata_free(&rtpctx->streams[0]->metadata); av_metadata_free(&rtpctx->streams[0]->metadata);
av_metadata_free(&rtpctx->metadata); av_metadata_free(&rtpctx->metadata);
av_free(rtpctx->streams[0]->codec->extradata);
av_free(rtpctx->streams[0]->codec);
av_free(rtpctx->streams[0]->info); av_free(rtpctx->streams[0]->info);
av_free(rtpctx->streams[0]); av_free(rtpctx->streams[0]);
av_free(rtpctx); av_free(rtpctx);

Loading…
Cancel
Save