[vlc-commits] mux: mp4: mov AC3SpecificBox to extradata builder
Francois Cartegnie
git at videolan.org
Fri Dec 21 16:13:32 CET 2018
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Dec 21 15:24:03 2018 +0100| [bbcb0972106cce72516199dbde895d63cd2adeab] | committer: Francois Cartegnie
mux: mp4: mov AC3SpecificBox to extradata builder
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bbcb0972106cce72516199dbde895d63cd2adeab
---
modules/mux/extradata.c | 40 ++++++++++++++++++++++++++++++++++
modules/mux/mp4/libmp4mux.c | 53 ++-------------------------------------------
modules/mux/mp4/mp4.c | 1 -
3 files changed, 42 insertions(+), 52 deletions(-)
diff --git a/modules/mux/extradata.c b/modules/mux/extradata.c
index 79076cc23e..b9152bf8cf 100644
--- a/modules/mux/extradata.c
+++ b/modules/mux/extradata.c
@@ -26,6 +26,7 @@
#include "extradata.h"
#include "../packetizer/av1_obu.h"
+#include "../packetizer/a52.h"
struct mux_extradata_builder_cb
{
@@ -43,6 +44,42 @@ struct mux_extradata_builder_t
vlc_fourcc_t fcc;
};
+static void ac3_extradata_builder_Feed(mux_extradata_builder_t *m,
+ const uint8_t *p_data, size_t i_data)
+{
+ if(m->i_extra || i_data < VLC_A52_MIN_HEADER_SIZE ||
+ p_data[0] != 0x0B || p_data[1] != 0x77)
+ return;
+
+ struct vlc_a52_bitstream_info bsi;
+ if(vlc_a52_ParseAc3BitstreamInfo(&bsi, &p_data[4], /* start code + CRC */
+ VLC_A52_MIN_HEADER_SIZE - 4 ) != VLC_SUCCESS)
+ return;
+
+ m->p_extra = malloc(3);
+ if(!m->p_extra)
+ return;
+ m->i_extra = 3;
+
+ bs_t s;
+ bs_write_init(&s, m->p_extra, m->i_extra);
+ bs_write(&s, 2, bsi.i_fscod);
+ bs_write(&s, 5, bsi.i_bsid);
+ bs_write(&s, 3, bsi.i_bsmod);
+ bs_write(&s, 2, 0);
+ bs_write(&s, 3, bsi.i_acmod);
+ bs_write(&s, 1, bsi.i_lfeon);
+ bs_write(&s, 5, bsi.i_frmsizcod >> 1); // bit_rate_code
+ bs_write(&s, 3, 0); // reserved
+}
+
+const struct mux_extradata_builder_cb ac3_cb =
+{
+ NULL,
+ ac3_extradata_builder_Feed,
+ NULL,
+};
+
static void av1_extradata_builder_Feed(mux_extradata_builder_t *m,
const uint8_t *p_data, size_t i_data)
{
@@ -91,6 +128,9 @@ mux_extradata_builder_t * mux_extradata_builder_New(vlc_fourcc_t fcc)
case VLC_CODEC_AV1:
cb = &av1_cb;
break;
+ case VLC_CODEC_A52:
+ cb = &ac3_cb;
+ break;
default:
return NULL;
}
diff --git a/modules/mux/mp4/libmp4mux.c b/modules/mux/mp4/libmp4mux.c
index 208a7c47ee..327397d3f8 100644
--- a/modules/mux/mp4/libmp4mux.c
+++ b/modules/mux/mp4/libmp4mux.c
@@ -791,55 +791,6 @@ static bo_t *GetDec3Tag(es_format_t *p_fmt,
return dec3;
}
-static bo_t *GetDac3Tag(const uint8_t *p_data, size_t i_data)
-{
- if (!i_data)
- return NULL;
-
- bo_t *dac3 = box_new("dac3");
- if(!dac3)
- return NULL;
-
- bs_t s;
- bs_init(&s, p_data, i_data);
-
- uint8_t fscod, bsid, bsmod, acmod, lfeon, frmsizecod;
-
- bs_skip(&s, 16 + 16); // syncword + crc
-
- fscod = bs_read(&s, 2);
- frmsizecod = bs_read(&s, 6);
- bsid = bs_read(&s, 5);
- bsmod = bs_read(&s, 3);
- acmod = bs_read(&s, 3);
- if (acmod == 2)
- bs_skip(&s, 2); // dsurmod
- else {
- if ((acmod & 1) && acmod != 1)
- bs_skip(&s, 2); // cmixlev
- if (acmod & 4)
- bs_skip(&s, 2); // surmixlev
- }
-
- lfeon = bs_read1(&s);
-
- uint8_t mp4_a52_header[3];
- bs_write_init(&s, mp4_a52_header, sizeof(mp4_a52_header));
-
- bs_write(&s, 2, fscod);
- bs_write(&s, 5, bsid);
- bs_write(&s, 3, bsmod);
- bs_write(&s, 2, 0);
- bs_write(&s, 3, acmod);
- bs_write(&s, 1, lfeon);
- bs_write(&s, 5, frmsizecod >> 1); // bit_rate_code
- bs_write(&s, 3, 0); // reserved
-
- bo_add_mem(dac3, sizeof(mp4_a52_header), mp4_a52_header);
-
- return dac3;
-}
-
static bo_t *GetDamrTag(es_format_t *p_fmt)
{
bo_t *damr = box_new("damr");
@@ -1271,8 +1222,8 @@ static bo_t *GetSounBox(vlc_object_t *p_obj, mp4mux_trackinfo_t *p_track, bool b
box = GetWaveTag(p_track);
else if (codec == VLC_CODEC_AMR_NB)
box = GetDamrTag(&p_track->fmt);
- else if (codec == VLC_CODEC_A52)
- box = GetDac3Tag(p_extradata, i_extradata);
+ else if (codec == VLC_CODEC_A52 && i_extradata >= 3)
+ box = GetxxxxTag(p_extradata, i_extradata, "dac3");
else if (codec == VLC_CODEC_EAC3)
box = GetDec3Tag(&p_track->fmt, p_extradata, i_extradata);
else if (codec == VLC_CODEC_WMAP)
diff --git a/modules/mux/mp4/mp4.c b/modules/mux/mp4/mp4.c
index 8413a393bf..6b4eed5eed 100644
--- a/modules/mux/mp4/mp4.c
+++ b/modules/mux/mp4/mp4.c
@@ -632,7 +632,6 @@ static block_t * BlockDequeue(sout_input_t *p_input, mp4_stream_t *p_stream)
case VLC_CODEC_SUBT:
p_block = ConvertSUBT(p_block);
break;
- case VLC_CODEC_A52:
case VLC_CODEC_EAC3:
if(!mp4mux_track_HasSamplePriv(p_stream->tinfo) &&
p_block->i_buffer >= 8)
More information about the vlc-commits
mailing list