[vlc-commits] mux: mp4: use samplepriv as fallback location for extra
Francois Cartegnie
git at videolan.org
Fri Dec 21 11:08:59 CET 2018
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Dec 20 17:29:38 2018 +0100| [61a8d24b13b7fab329478b1c350f2ecc299b3445] | committer: Francois Cartegnie
mux: mp4: use samplepriv as fallback location for extra
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=61a8d24b13b7fab329478b1c350f2ecc299b3445
---
modules/mux/mp4/libmp4mux.c | 61 ++++++++++++++++++++++++++++++---------------
1 file changed, 41 insertions(+), 20 deletions(-)
diff --git a/modules/mux/mp4/libmp4mux.c b/modules/mux/mp4/libmp4mux.c
index 7620008feb..366a989f57 100644
--- a/modules/mux/mp4/libmp4mux.c
+++ b/modules/mux/mp4/libmp4mux.c
@@ -870,17 +870,19 @@ static bo_t *GetD263Tag(void)
return d263;
}
-static bo_t *GetHvcCTag(es_format_t *p_fmt, bool b_completeness)
+static bo_t *GetHvcCTag(const uint8_t *p_extra, size_t i_extra,
+ bool b_completeness)
{
+
/* Generate hvcC box matching iso/iec 14496-15 3rd edition */
bo_t *hvcC = box_new("hvcC");
- if(!hvcC || !p_fmt->i_extra)
+ if(!hvcC || !i_extra)
return hvcC;
/* Extradata is already an HEVCDecoderConfigurationRecord */
- if(hevc_ishvcC(p_fmt->p_extra, p_fmt->i_extra))
+ if(hevc_ishvcC(p_extra, i_extra))
{
- (void) bo_add_mem(hvcC, p_fmt->i_extra, p_fmt->p_extra);
+ (void) bo_add_mem(hvcC, i_extra, p_extra);
return hvcC;
}
@@ -889,7 +891,7 @@ static bo_t *GetHvcCTag(es_format_t *p_fmt, bool b_completeness)
size_t i_nal;
hxxx_iterator_ctx_t it;
- hxxx_iterator_init(&it, p_fmt->p_extra, p_fmt->i_extra, 0);
+ hxxx_iterator_init(&it, p_extra, i_extra, 0);
while(hxxx_annexb_iterate_next(&it, &p_nal, &i_nal))
{
switch (hevc_getNALType(p_nal))
@@ -975,12 +977,13 @@ static bo_t *GetWaveFormatExTag(es_format_t *p_fmt, const char *tag)
return box;
}
-static bo_t *GetxxxxTag(es_format_t *p_fmt, const char *tag)
+static bo_t *GetxxxxTag(const uint8_t *p_extra, size_t i_extra,
+ const char *tag)
{
bo_t *box = box_new(tag);
if(!box)
return NULL;
- bo_add_mem(box, p_fmt->i_extra, p_fmt->p_extra);
+ bo_add_mem(box, i_extra, p_extra);
return box;
}
@@ -1028,7 +1031,7 @@ static bo_t *GetClli(const video_format_t *p_vfmt)
return p_box;
}
-static bo_t *GetAvcCTag(es_format_t *p_fmt)
+static bo_t *GetAvcCTag(const uint8_t *p_extra, size_t i_extra)
{
bo_t *avcC = box_new("avcC");/* FIXME use better value */
if(!avcC)
@@ -1036,7 +1039,7 @@ static bo_t *GetAvcCTag(es_format_t *p_fmt)
const uint8_t *p_sps, *p_pps, *p_ext;
size_t i_sps_size, i_pps_size, i_ext_size;
- if(! h264_AnnexB_get_spspps(p_fmt->p_extra, p_fmt->i_extra,
+ if(! h264_AnnexB_get_spspps(p_extra, i_extra,
&p_sps, &i_sps_size,
&p_pps, &i_pps_size,
&p_ext, &i_ext_size ) )
@@ -1093,15 +1096,15 @@ static bo_t *GetAvcCTag(es_format_t *p_fmt)
}
/* TODO: No idea about these values */
-static bo_t *GetSVQ3Tag(es_format_t *p_fmt)
+static bo_t *GetSVQ3Tag(const uint8_t *p_extra, size_t i_extra)
{
bo_t *smi = box_new("SMI ");
if(!smi)
return NULL;
- if (p_fmt->i_extra > 0x4e) {
- uint8_t *p_end = &((uint8_t*)p_fmt->p_extra)[p_fmt->i_extra];
- uint8_t *p = &((uint8_t*)p_fmt->p_extra)[0x46];
+ if (i_extra > 0x4e) {
+ const uint8_t *p_end = &p_extra[i_extra];
+ const uint8_t *p = &p_extra[0x46];
while (p + 8 < p_end) {
int i_size = GetDWBE(p);
@@ -1254,14 +1257,23 @@ static bo_t *GetSounBox(vlc_object_t *p_obj, mp4mux_trackinfo_t *p_track, bool b
if (b_descr) {
bo_t *box;
+ /* codec specific extradata */
+ const uint8_t *p_extradata = p_track->fmt.p_extra;
+ size_t i_extradata = p_track->fmt.i_extra;
+ if(p_track->sample_priv.i_data)
+ {
+ p_extradata = p_track->sample_priv.p_data;
+ i_extradata = p_track->sample_priv.i_data;
+ }
+
if (b_mov && codec == VLC_CODEC_MP4A)
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_track->sample_priv.p_data, p_track->sample_priv.i_data);
+ box = GetDac3Tag(p_extradata, i_extradata);
else if (codec == VLC_CODEC_EAC3)
- box = GetDec3Tag(&p_track->fmt, p_track->sample_priv.p_data, p_track->sample_priv.i_data);
+ box = GetDec3Tag(&p_track->fmt, p_extradata, i_extradata);
else if (codec == VLC_CODEC_WMAP)
box = GetWaveFormatExTag(&p_track->fmt, "wfex");
else
@@ -1337,11 +1349,20 @@ static bo_t *GetVideBox(vlc_object_t *p_obj, mp4mux_trackinfo_t *p_track, bool b
bo_add_16be(vide, 0x18); // depth
bo_add_16be(vide, 0xffff); // predefined
+ /* codec specific extradata */
+ const uint8_t *p_extradata = p_track->fmt.p_extra;
+ size_t i_extradata = p_track->fmt.i_extra;
+ if(p_track->sample_priv.i_data)
+ {
+ p_extradata = p_track->sample_priv.p_data;
+ i_extradata = p_track->sample_priv.i_data;
+ }
+
/* add an ES Descriptor */
switch(p_track->fmt.i_codec)
{
case VLC_CODEC_AV1:
- box_gather(vide, GetxxxxTag(&p_track->fmt, "av1C"));
+ box_gather(vide, GetxxxxTag(p_extradata, i_extradata, "av1C"));
box_gather(vide, GetColrBox(&p_track->fmt.video, b_mov));
box_gather(vide, GetMdcv(&p_track->fmt.video));
box_gather(vide, GetClli(&p_track->fmt.video));
@@ -1357,20 +1378,20 @@ static bo_t *GetVideBox(vlc_object_t *p_obj, mp4mux_trackinfo_t *p_track, bool b
break;
case VLC_CODEC_SVQ3:
- box_gather(vide, GetSVQ3Tag(&p_track->fmt));
+ box_gather(vide, GetSVQ3Tag(p_extradata, i_extradata));
break;
case VLC_CODEC_H264:
- box_gather(vide, GetAvcCTag(&p_track->fmt));
+ box_gather(vide, GetAvcCTag(p_extradata, i_extradata));
break;
case VLC_CODEC_VC1:
- box_gather(vide, GetxxxxTag(&p_track->fmt, "dvc1"));
+ box_gather(vide, GetxxxxTag(p_extradata, i_extradata, "dvc1"));
break;
case VLC_CODEC_HEVC:
/* Write HvcC without forcing VPS/SPS/PPS/SEI array_completeness */
- box_gather(vide, GetHvcCTag(&p_track->fmt, false));
+ box_gather(vide, GetHvcCTag(p_extradata, i_extradata, false));
break;
}
More information about the vlc-commits
mailing list