diff --git a/libavformat/movenc.c b/libavformat/movenc.c index b799491fd4..8316fd9a45 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -384,6 +384,7 @@ struct eac3_info { /* Layout of the EC3SpecificBox */ /* maximum bitrate */ uint16_t data_rate; + int8_t ac3_bit_rate_code; /* number of independent substreams */ uint8_t num_ind_sub; struct { @@ -414,8 +415,12 @@ static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track) struct eac3_info *info; int num_blocks, ret; - if (!track->eac3_priv && !(track->eac3_priv = av_mallocz(sizeof(*info)))) - return AVERROR(ENOMEM); + if (!track->eac3_priv) { + if (!(track->eac3_priv = av_mallocz(sizeof(*info)))) + return AVERROR(ENOMEM); + + ((struct eac3_info *)track->eac3_priv)->ac3_bit_rate_code = -1; + } info = track->eac3_priv; if (!info->pkt && !(info->pkt = av_packet_alloc())) @@ -432,6 +437,8 @@ static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track) } info->data_rate = FFMAX(info->data_rate, hdr->bit_rate / 1000); + info->ac3_bit_rate_code = FFMAX(info->ac3_bit_rate_code, + hdr->ac3_bit_rate_code); num_blocks = hdr->num_blocks; if (!info->ec3_done) { @@ -443,7 +450,8 @@ static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track) /* this should always be the case, given that our AC-3 parser * concatenates dependent frames to their independent parent */ - if (hdr->frame_type == EAC3_FRAME_TYPE_INDEPENDENT) { + if (hdr->frame_type == EAC3_FRAME_TYPE_INDEPENDENT || + hdr->frame_type == EAC3_FRAME_TYPE_AC3_CONVERT) { /* substream ids must be incremental */ if (hdr->substreamid > info->num_ind_sub + 1) { ret = AVERROR(EINVAL); @@ -475,6 +483,14 @@ static int handle_eac3(MOVMuxContext *mov, AVPacket *pkt, MOVTrack *track) info->substream[hdr->substreamid].acmod = hdr->channel_mode; info->substream[hdr->substreamid].lfeon = hdr->lfe_on; + if (track->par->codec_id == AV_CODEC_ID_AC3) { + // with AC-3 we only require the information of a single packet, + // so we can finish as soon as the basic values of the bit stream + // have been set to the track's informational structure. + info->ec3_done = 1; + goto concatenate; + } + /* Parse dependent substream(s), if any */ if (pkt->size != hdr->frame_size) { int cumul_size = hdr->frame_size;