[FFmpeg-devel] [PATCH] avformat/movenc: add EAC3 muxing support.
Michael Niedermayer
michaelni at gmx.at
Fri Oct 10 00:32:58 CEST 2014
On Tue, Oct 07, 2014 at 03:02:38PM +0200, Benoit Fouet wrote:
> Support only one independent substream right now, and only syncframes
> containing 6 blocks.
>
> Fixes part of ticket #3074
> ---
>
> Right now, this produces the same output as the previous patch for supported
> streams, and rejects the unsupported ones.
> Support for syncframes concatenation will come afterwards.
>
> libavformat/isom.c | 1 +
> libavformat/movenc.c | 184 +++++++++++++++++++++++++++++++++++++++++++++++++++
> libavformat/movenc.h | 2 +
> 3 files changed, 187 insertions(+)
>
> diff --git a/libavformat/isom.c b/libavformat/isom.c
> index d768c32..1509021 100644
> --- a/libavformat/isom.c
> +++ b/libavformat/isom.c
> @@ -57,6 +57,7 @@ const AVCodecTag ff_mp4_obj_type[] = {
> { AV_CODEC_ID_VC1 , 0xA3 },
> { AV_CODEC_ID_DIRAC , 0xA4 },
> { AV_CODEC_ID_AC3 , 0xA5 },
> + { AV_CODEC_ID_EAC3 , 0xA6 },
> { AV_CODEC_ID_DTS , 0xA9 }, /* mp4ra.org */
> { AV_CODEC_ID_VORBIS , 0xDD }, /* non standard, gpac uses it */
> { AV_CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* non standard, see unsupported-embedded-subs-2.mp4 */
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index bfee866..18c5955 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -31,6 +31,7 @@
> #include "avio.h"
> #include "isom.h"
> #include "avc.h"
> +#include "libavcodec/ac3_parser.h"
> #include "libavcodec/get_bits.h"
> #include "libavcodec/put_bits.h"
> #include "libavcodec/vc1_common.h"
> @@ -292,6 +293,178 @@ static int mov_write_ac3_tag(AVIOContext *pb, MOVTrack *track)
> return 11;
> }
>
> +struct eac3_info {
> + uint8_t ec3_done;
> +
> + /* Layout of the EC3SpecificBox */
> + /* maximum bitrate */
> + uint16_t data_rate;
> + /* number of independent substreams */
> + uint8_t num_ind_sub;
> + struct {
> + /* sample rate code (see ff_ac3_sample_rate_tab) 2 bits */
> + uint8_t fscod;
> + /* bit stream identification 5 bits */
> + uint8_t bsid;
> + /* one bit reserved */
> + /* audio service mixing (not supported yet) 1 bit */
> + /* bit stream mode 3 bits */
> + uint8_t bsmod;
> + /* audio coding mode 3 bits */
> + uint8_t acmod;
> + /* sub woofer on 1 bit */
> + uint8_t lfeon;
> + /* 3 bits reserved */
> + /* number of dependent substreams associated with this substream 4 bits */
> + uint8_t num_dep_sub;
> + /* channel locations of the dependent substream(s), if any, 9 bits */
> + uint16_t chan_loc;
> + /* if there is no dependent substream, then one bit reserved instead */
> + } substream[1]; /* TODO: support 8 independent substreams */
> +};
> +
> +static int handle_eac3(AVPacket *pkt, MOVTrack *track)
> +{
> + GetBitContext gbc;
> + AC3HeaderInfo tmp, *hdr = &tmp;
> + struct eac3_info *info;
> + int ret, num_blocks;
> +
> + if (!track->eac3_priv && !(track->eac3_priv = av_mallocz(sizeof(*info))))
> + return AVERROR(ENOMEM);
> + info = track->eac3_priv;
> +
> + init_get_bits(&gbc, pkt->data, pkt->size * 8);
> + if ((ret = avpriv_ac3_parse_header2(&gbc, &hdr)) < 0)
> + return ret;
[...]
> + if ((ret = avpriv_ac3_parse_header2(&gbc, &hdr)) < 0)
> + return ret;
these forward internal error codes like AAC_AC3_PARSE_ERROR_FRAME_TYPE
to the lib user
av_strerror() for example will not be able to interpret these
also this would prevent remuxing a stream that contains a
single damaged packet if i understand correctly, this may be
annoying for sources recoded over somewhat noisy channels
also how can this patch be tested ?
carls testcase from the ticket does not seem to work
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
When you are offended at any man's fault, turn to yourself and study your
own failings. Then you will forget your anger. -- Epictetus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141010/f1801159/attachment.asc>
More information about the ffmpeg-devel
mailing list