mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
qtmux: Do not check timecode data for mp4 container
Timecode trak is only supported for mov right now, not for mp4. That code would otherwise create an invalid trak if the muxed video contained timecode metadata. https://bugzilla.gnome.org/show_bug.cgi?id=782684
This commit is contained in:
parent
347e814074
commit
5f7fe63fea
1 changed files with 38 additions and 27 deletions
|
@ -2443,6 +2443,7 @@ gst_qt_mux_prefill_samples (GstQTMux * qtmux)
|
||||||
{
|
{
|
||||||
GstQTPad *qpad;
|
GstQTPad *qpad;
|
||||||
GSList *walk;
|
GSList *walk;
|
||||||
|
GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux));
|
||||||
|
|
||||||
/* Update expected sample sizes/durations as needed, this is for raw
|
/* Update expected sample sizes/durations as needed, this is for raw
|
||||||
* audio where samples are actual audio samples. */
|
* audio where samples are actual audio samples. */
|
||||||
|
@ -2454,41 +2455,43 @@ gst_qt_mux_prefill_samples (GstQTMux * qtmux)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For the first sample check/update timecode as needed. We do that before
|
if (qtmux_klass->format == GST_QT_MUX_FORMAT_QT) {
|
||||||
* all actual samples as the code in gst_qt_mux_add_buffer() does it with
|
/* For the first sample check/update timecode as needed. We do that before
|
||||||
* initial buffer directly, not with last_buf */
|
* all actual samples as the code in gst_qt_mux_add_buffer() does it with
|
||||||
for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) {
|
* initial buffer directly, not with last_buf */
|
||||||
GstCollectData *cdata = (GstCollectData *) walk->data;
|
for (walk = qtmux->collect->data; walk; walk = g_slist_next (walk)) {
|
||||||
GstQTPad *qpad = (GstQTPad *) cdata;
|
GstCollectData *cdata = (GstCollectData *) walk->data;
|
||||||
GstBuffer *buffer =
|
GstQTPad *qpad = (GstQTPad *) cdata;
|
||||||
gst_collect_pads_peek (qtmux->collect, (GstCollectData *) qpad);
|
GstBuffer *buffer =
|
||||||
GstVideoTimeCodeMeta *tc_meta;
|
gst_collect_pads_peek (qtmux->collect, (GstCollectData *) qpad);
|
||||||
|
GstVideoTimeCodeMeta *tc_meta;
|
||||||
|
|
||||||
if (buffer && (tc_meta = gst_buffer_get_video_time_code_meta (buffer))) {
|
if (buffer && (tc_meta = gst_buffer_get_video_time_code_meta (buffer))) {
|
||||||
GstVideoTimeCode *tc = &tc_meta->tc;
|
GstVideoTimeCode *tc = &tc_meta->tc;
|
||||||
|
|
||||||
qpad->tc_trak = atom_trak_new (qtmux->context);
|
qpad->tc_trak = atom_trak_new (qtmux->context);
|
||||||
atom_moov_add_trak (qtmux->moov, qpad->tc_trak);
|
atom_moov_add_trak (qtmux->moov, qpad->tc_trak);
|
||||||
|
|
||||||
qpad->trak->tref = atom_tref_new (FOURCC_tmcd);
|
qpad->trak->tref = atom_tref_new (FOURCC_tmcd);
|
||||||
atom_tref_add_entry (qpad->trak->tref, qpad->tc_trak->tkhd.track_ID);
|
atom_tref_add_entry (qpad->trak->tref, qpad->tc_trak->tkhd.track_ID);
|
||||||
|
|
||||||
atom_trak_set_timecode_type (qpad->tc_trak, qtmux->context, tc);
|
atom_trak_set_timecode_type (qpad->tc_trak, qtmux->context, tc);
|
||||||
|
|
||||||
atom_trak_add_samples (qpad->tc_trak, 1, 1, 4,
|
atom_trak_add_samples (qpad->tc_trak, 1, 1, 4,
|
||||||
qtmux->mdat_size, FALSE, 0);
|
qtmux->mdat_size, FALSE, 0);
|
||||||
|
|
||||||
qpad->tc_pos = qtmux->mdat_size;
|
qpad->tc_pos = qtmux->mdat_size;
|
||||||
qpad->first_tc = gst_video_time_code_copy (tc);
|
qpad->first_tc = gst_video_time_code_copy (tc);
|
||||||
qpad->first_pts = GST_BUFFER_PTS (buffer);
|
qpad->first_pts = GST_BUFFER_PTS (buffer);
|
||||||
|
|
||||||
qtmux->current_chunk_offset = -1;
|
qtmux->current_chunk_offset = -1;
|
||||||
qtmux->current_chunk_size = 0;
|
qtmux->current_chunk_size = 0;
|
||||||
qtmux->current_chunk_duration = 0;
|
qtmux->current_chunk_duration = 0;
|
||||||
qtmux->mdat_size += 4;
|
qtmux->mdat_size += 4;
|
||||||
|
}
|
||||||
|
if (buffer)
|
||||||
|
gst_buffer_unref (buffer);
|
||||||
}
|
}
|
||||||
if (buffer)
|
|
||||||
gst_buffer_unref (buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((qpad = find_best_pad_prefill (qtmux))) {
|
while ((qpad = find_best_pad_prefill (qtmux))) {
|
||||||
|
@ -3173,6 +3176,10 @@ gst_qt_mux_update_timecode (GstQTMux * qtmux, GstQTPad * qtpad)
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
GstMapInfo map;
|
GstMapInfo map;
|
||||||
guint64 offset = qtpad->tc_pos;
|
guint64 offset = qtpad->tc_pos;
|
||||||
|
GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux));
|
||||||
|
|
||||||
|
if (qtmux_klass->format != GST_QT_MUX_FORMAT_QT)
|
||||||
|
return GST_FLOW_OK;
|
||||||
|
|
||||||
g_assert (qtpad->tc_pos != -1);
|
g_assert (qtpad->tc_pos != -1);
|
||||||
|
|
||||||
|
@ -3893,6 +3900,10 @@ gst_qt_mux_check_and_update_timecode (GstQTMux * qtmux, GstQTPad * pad,
|
||||||
GstBuffer *tc_buf;
|
GstBuffer *tc_buf;
|
||||||
gsize szret;
|
gsize szret;
|
||||||
guint32 frames_since_daily_jam;
|
guint32 frames_since_daily_jam;
|
||||||
|
GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux));
|
||||||
|
|
||||||
|
if (qtmux_klass->format != GST_QT_MUX_FORMAT_QT)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if (buf == NULL || (pad->tc_trak != NULL && pad->tc_pos == -1))
|
if (buf == NULL || (pad->tc_trak != NULL && pad->tc_pos == -1))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in a new issue