mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
gppmux: enhance ftyp brand heuristic. Fixes #584360.
This commit is contained in:
parent
7709bf5f2a
commit
7f82fe3b46
4 changed files with 57 additions and 4 deletions
|
@ -2783,6 +2783,9 @@ atom_trak_set_audio_type (AtomTRAK * trak, AtomsContext * context,
|
||||||
atom_trak_set_audio_commons (trak, context, scale);
|
atom_trak_set_audio_commons (trak, context, scale);
|
||||||
ste = atom_trak_add_audio_entry (trak, context, entry->fourcc);
|
ste = atom_trak_add_audio_entry (trak, context, entry->fourcc);
|
||||||
|
|
||||||
|
trak->is_video = FALSE;
|
||||||
|
trak->is_h264 = FALSE;
|
||||||
|
|
||||||
ste->version = entry->version;
|
ste->version = entry->version;
|
||||||
ste->compression_id = entry->compression_id;
|
ste->compression_id = entry->compression_id;
|
||||||
ste->sample_size = entry->sample_size;
|
ste->sample_size = entry->sample_size;
|
||||||
|
@ -2811,6 +2814,9 @@ atom_trak_set_video_type (AtomTRAK * trak, AtomsContext * context,
|
||||||
entry->height);
|
entry->height);
|
||||||
ste = atom_trak_add_video_entry (trak, context, entry->fourcc);
|
ste = atom_trak_add_video_entry (trak, context, entry->fourcc);
|
||||||
|
|
||||||
|
trak->is_video = TRUE;
|
||||||
|
trak->is_h264 = (entry->fourcc == FOURCC_avc1);
|
||||||
|
|
||||||
ste->width = entry->width;
|
ste->width = entry->width;
|
||||||
ste->height = entry->height;
|
ste->height = entry->height;
|
||||||
ste->depth = entry->depth;
|
ste->depth = entry->depth;
|
||||||
|
|
|
@ -518,6 +518,10 @@ typedef struct _AtomTRAK
|
||||||
|
|
||||||
AtomTKHD tkhd;
|
AtomTKHD tkhd;
|
||||||
AtomMDIA mdia;
|
AtomMDIA mdia;
|
||||||
|
|
||||||
|
/* some helper info for structural conformity checks */
|
||||||
|
gboolean is_video;
|
||||||
|
gboolean is_h264;
|
||||||
} AtomTRAK;
|
} AtomTRAK;
|
||||||
|
|
||||||
typedef struct _AtomMOOV
|
typedef struct _AtomMOOV
|
||||||
|
|
|
@ -53,6 +53,9 @@ G_BEGIN_DECLS
|
||||||
#define FOURCC_mp41 GST_MAKE_FOURCC('m','p','4','1')
|
#define FOURCC_mp41 GST_MAKE_FOURCC('m','p','4','1')
|
||||||
#define FOURCC_mp42 GST_MAKE_FOURCC('m','p','4','2')
|
#define FOURCC_mp42 GST_MAKE_FOURCC('m','p','4','2')
|
||||||
#define FOURCC_mjp2 GST_MAKE_FOURCC('m','j','p','2')
|
#define FOURCC_mjp2 GST_MAKE_FOURCC('m','j','p','2')
|
||||||
|
#define FOURCC_3gp4 GST_MAKE_FOURCC('3','g','p','4')
|
||||||
|
#define FOURCC_3gp6 GST_MAKE_FOURCC('3','g','p','6')
|
||||||
|
#define FOURCC_3gg6 GST_MAKE_FOURCC('3','g','g','6')
|
||||||
#define FOURCC_3gg7 GST_MAKE_FOURCC('3','g','g','7')
|
#define FOURCC_3gg7 GST_MAKE_FOURCC('3','g','g','7')
|
||||||
#define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1')
|
#define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1')
|
||||||
#define FOURCC_qt__ GST_MAKE_FOURCC('q','t',' ',' ')
|
#define FOURCC_qt__ GST_MAKE_FOURCC('q','t',' ',' ')
|
||||||
|
|
|
@ -205,14 +205,40 @@ gst_qt_mux_map_format_to_flavor (GstQTMuxFormat format)
|
||||||
return ATOMS_TREE_FLAVOR_ISOM;
|
return ATOMS_TREE_FLAVOR_ISOM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_qt_mux_map_check_tracks (AtomMOOV * moov, gint * _video, gint * _audio,
|
||||||
|
gboolean * _has_h264)
|
||||||
|
{
|
||||||
|
GList *it;
|
||||||
|
gint video = 0, audio = 0;
|
||||||
|
gboolean has_h264 = FALSE;
|
||||||
|
|
||||||
|
for (it = moov->traks; it != NULL; it = g_list_next (it)) {
|
||||||
|
AtomTRAK *track = it->data;
|
||||||
|
|
||||||
|
if (track->is_video) {
|
||||||
|
video++;
|
||||||
|
if (track->is_h264)
|
||||||
|
has_h264 = TRUE;
|
||||||
|
} else
|
||||||
|
audio++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_video)
|
||||||
|
*_video = video;
|
||||||
|
if (_audio)
|
||||||
|
*_audio = audio;
|
||||||
|
if (_has_h264)
|
||||||
|
*_has_h264 = has_h264;
|
||||||
|
}
|
||||||
|
|
||||||
/* pretty static, but possibly dynamic format info */
|
/* pretty static, but possibly dynamic format info */
|
||||||
|
|
||||||
/* notes:
|
/* notes:
|
||||||
* - avc1 brand is not used, since the specific extensions indicated by it
|
* - avc1 brand is not used, since the specific extensions indicated by it
|
||||||
* are not used (e.g. sample groupings, etc)
|
* are not used (e.g. sample groupings, etc)
|
||||||
* - 3GPP2 specific formats not (yet) used, only 3GPP, so no need yet either
|
* - TODO: maybe even more 3GPP brand fine-tuning ??
|
||||||
* for 3g2a (but later on, moov might be used to conditionally switch to
|
* (but that might need ftyp rewriting at the end) */
|
||||||
* 3g2a if needed) */
|
|
||||||
void
|
void
|
||||||
gst_qt_mux_map_format_to_header (GstQTMuxFormat format, GstBuffer ** _prefix,
|
gst_qt_mux_map_format_to_header (GstQTMuxFormat format, GstBuffer ** _prefix,
|
||||||
guint32 * _major, guint32 * _version, GList ** _compatible, AtomMOOV * moov)
|
guint32 * _major, guint32 * _version, GList ** _compatible, AtomMOOV * moov)
|
||||||
|
@ -244,9 +270,23 @@ gst_qt_mux_map_format_to_header (GstQTMuxFormat format, GstBuffer ** _prefix,
|
||||||
comp = mp4_brands;
|
comp = mp4_brands;
|
||||||
break;
|
break;
|
||||||
case GST_QT_MUX_FORMAT_3GP:
|
case GST_QT_MUX_FORMAT_3GP:
|
||||||
major = FOURCC_3gg7;
|
{
|
||||||
|
gint video, audio;
|
||||||
|
gboolean has_h264;
|
||||||
|
|
||||||
|
gst_qt_mux_map_check_tracks (moov, &video, &audio, &has_h264);
|
||||||
|
/* only track restriction really matters for Basic Profile */
|
||||||
|
if (video <= 1 && audio <= 1) {
|
||||||
|
/* it seems only newer spec knows about H264 */
|
||||||
|
major = has_h264 ? FOURCC_3gp6 : FOURCC_3gp4;
|
||||||
|
version = has_h264 ? 0x100 : 0x200;
|
||||||
|
} else {
|
||||||
|
major = FOURCC_3gg6;
|
||||||
|
version = 0x100;
|
||||||
|
}
|
||||||
comp = gpp_brands;
|
comp = gpp_brands;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case GST_QT_MUX_FORMAT_MJ2:
|
case GST_QT_MUX_FORMAT_MJ2:
|
||||||
major = FOURCC_mjp2;
|
major = FOURCC_mjp2;
|
||||||
comp = mjp2_brands;
|
comp = mjp2_brands;
|
||||||
|
|
Loading…
Reference in a new issue