mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-30 13:41:48 +00:00
qtmux: Use a better default value for the movie header timescale
Take the maximum video timescale, or if no video track is present the previous value of 1800. https://bugzilla.gnome.org/show_bug.cgi?id=769041
This commit is contained in:
parent
727fa1c7c3
commit
e0aec317ff
1 changed files with 37 additions and 4 deletions
|
@ -273,7 +273,7 @@ enum
|
||||||
/* some spare for header size as well */
|
/* some spare for header size as well */
|
||||||
#define MDAT_LARGE_FILE_LIMIT ((guint64) 1024 * 1024 * 1024 * 2)
|
#define MDAT_LARGE_FILE_LIMIT ((guint64) 1024 * 1024 * 1024 * 2)
|
||||||
|
|
||||||
#define DEFAULT_MOVIE_TIMESCALE 1800
|
#define DEFAULT_MOVIE_TIMESCALE 0
|
||||||
#define DEFAULT_TRAK_TIMESCALE 0
|
#define DEFAULT_TRAK_TIMESCALE 0
|
||||||
#define DEFAULT_DO_CTTS TRUE
|
#define DEFAULT_DO_CTTS TRUE
|
||||||
#define DEFAULT_FAST_START FALSE
|
#define DEFAULT_FAST_START FALSE
|
||||||
|
@ -402,8 +402,8 @@ gst_qt_mux_class_init (GstQTMuxClass * klass)
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, PROP_MOVIE_TIMESCALE,
|
g_object_class_install_property (gobject_class, PROP_MOVIE_TIMESCALE,
|
||||||
g_param_spec_uint ("movie-timescale", "Movie timescale",
|
g_param_spec_uint ("movie-timescale", "Movie timescale",
|
||||||
"Timescale to use in the movie (units per second)",
|
"Timescale to use in the movie (units per second, 0 == default)",
|
||||||
1, G_MAXUINT32, DEFAULT_MOVIE_TIMESCALE,
|
0, G_MAXUINT32, DEFAULT_MOVIE_TIMESCALE,
|
||||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
|
||||||
g_object_class_install_property (gobject_class, PROP_TRAK_TIMESCALE,
|
g_object_class_install_property (gobject_class, PROP_TRAK_TIMESCALE,
|
||||||
g_param_spec_uint ("trak-timescale", "Track timescale",
|
g_param_spec_uint ("trak-timescale", "Track timescale",
|
||||||
|
@ -2149,8 +2149,41 @@ gst_qt_mux_start_file (GstQTMux * qtmux)
|
||||||
gst_segment_init (&segment, GST_FORMAT_BYTES);
|
gst_segment_init (&segment, GST_FORMAT_BYTES);
|
||||||
gst_pad_push_event (qtmux->srcpad, gst_event_new_segment (&segment));
|
gst_pad_push_event (qtmux->srcpad, gst_event_new_segment (&segment));
|
||||||
|
|
||||||
/* initialize our moov recovery file */
|
|
||||||
GST_OBJECT_LOCK (qtmux);
|
GST_OBJECT_LOCK (qtmux);
|
||||||
|
|
||||||
|
if (qtmux->timescale == 0) {
|
||||||
|
guint32 suggested_timescale = 0;
|
||||||
|
GSList *walk;
|
||||||
|
|
||||||
|
/* Calculate a reasonable timescale for the moov:
|
||||||
|
* If there is video, it is the biggest video track timescale or an even
|
||||||
|
* multiple of it if it's smaller than 1800.
|
||||||
|
* Otherwise it is 1800 */
|
||||||
|
for (walk = qtmux->sinkpads; walk; walk = g_slist_next (walk)) {
|
||||||
|
GstCollectData *cdata = (GstCollectData *) walk->data;
|
||||||
|
GstQTPad *qpad = (GstQTPad *) cdata;
|
||||||
|
|
||||||
|
if (!qpad->trak)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* not video */
|
||||||
|
if (!qpad->trak->mdia.minf.vmhd)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
suggested_timescale =
|
||||||
|
MAX (qpad->trak->mdia.mdhd.time_info.timescale, suggested_timescale);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (suggested_timescale == 0)
|
||||||
|
suggested_timescale = 1800;
|
||||||
|
|
||||||
|
while (suggested_timescale < 1800)
|
||||||
|
suggested_timescale *= 2;
|
||||||
|
|
||||||
|
qtmux->timescale = suggested_timescale;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialize our moov recovery file */
|
||||||
if (qtmux->moov_recov_file_path) {
|
if (qtmux->moov_recov_file_path) {
|
||||||
gst_qt_mux_prepare_moov_recovery (qtmux);
|
gst_qt_mux_prepare_moov_recovery (qtmux);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue