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>tags/n0.8
| @@ -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 | |||||
| * 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; | |||||
| avcodec_copy_context(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 | |||||
| * context instead, to give the rtp muxer access to | |||||
| * codec parameters. */ | |||||
| av_free(rtpctx->streams[0]->codec); | |||||
| rtpctx->streams[0]->codec = st->codec; | |||||
| avcodec_copy_context(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); | ||||