qtmux: simplify and fix pts_offset storing

In particular, only write a ctts atom if and only if ever a non-zero offset.
This commit is contained in:
Mark Nauwelaerts 2011-01-03 16:56:57 +01:00 committed by Tim-Philipp Müller
parent b852dde2db
commit b6945d4afe
4 changed files with 26 additions and 28 deletions

View file

@ -538,6 +538,7 @@ atom_ctts_init (AtomCTTS * ctts)
atom_full_init (&ctts->header, FOURCC_ctts, 0, 0, 0, flags); atom_full_init (&ctts->header, FOURCC_ctts, 0, 0, 0, flags);
atom_array_init (&ctts->entries, 128); atom_array_init (&ctts->entries, 128);
ctts->do_pts = FALSE;
} }
static AtomCTTS * static AtomCTTS *
@ -2019,7 +2020,7 @@ atom_stbl_copy_data (AtomSTBL * stbl, guint8 ** buffer, guint64 * size,
if (!atom_stsz_copy_data (&stbl->stsz, buffer, size, offset)) { if (!atom_stsz_copy_data (&stbl->stsz, buffer, size, offset)) {
return 0; return 0;
} }
if (stbl->ctts) { if (stbl->ctts && stbl->ctts->do_pts) {
if (!atom_ctts_copy_data (stbl->ctts, buffer, size, offset)) { if (!atom_ctts_copy_data (stbl->ctts, buffer, size, offset)) {
return 0; return 0;
} }
@ -2553,6 +2554,8 @@ atom_ctts_add_entry (AtomCTTS * ctts, guint32 nsamples, guint32 offset)
nentry.samplecount = nsamples; nentry.samplecount = nsamples;
nentry.sampleoffset = offset; nentry.sampleoffset = offset;
atom_array_append (&ctts->entries, nentry, 256); atom_array_append (&ctts->entries, nentry, 256);
if (offset != 0)
ctts->do_pts = TRUE;
} else { } else {
entry->samplecount += nsamples; entry->samplecount += nsamples;
} }
@ -2569,8 +2572,7 @@ atom_stbl_add_ctts_entry (AtomSTBL * stbl, guint32 nsamples, guint32 offset)
void void
atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples, guint32 delta, atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples, guint32 delta,
guint32 size, guint64 chunk_offset, gboolean sync, guint32 size, guint64 chunk_offset, gboolean sync, gint64 pts_offset)
gboolean do_pts, gint64 pts_offset)
{ {
atom_stts_add_entry (&stbl->stts, nsamples, delta); atom_stts_add_entry (&stbl->stts, nsamples, delta);
atom_stsz_add_entry (&stbl->stsz, nsamples, size); atom_stsz_add_entry (&stbl->stsz, nsamples, size);
@ -2579,18 +2581,17 @@ atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples, guint32 delta,
atom_stco64_get_entry_count (&stbl->stco64), nsamples); atom_stco64_get_entry_count (&stbl->stco64), nsamples);
if (sync) if (sync)
atom_stbl_add_stss_entry (stbl); atom_stbl_add_stss_entry (stbl);
if (do_pts) /* always store to arrange for consistent content */
atom_stbl_add_ctts_entry (stbl, nsamples, pts_offset); atom_stbl_add_ctts_entry (stbl, nsamples, pts_offset);
} }
void void
atom_trak_add_samples (AtomTRAK * trak, guint32 nsamples, guint32 delta, atom_trak_add_samples (AtomTRAK * trak, guint32 nsamples, guint32 delta,
guint32 size, guint64 chunk_offset, gboolean sync, guint32 size, guint64 chunk_offset, gboolean sync, gint64 pts_offset)
gboolean do_pts, gint64 pts_offset)
{ {
AtomSTBL *stbl = &trak->mdia.minf.stbl; AtomSTBL *stbl = &trak->mdia.minf.stbl;
atom_stbl_add_samples (stbl, nsamples, delta, size, chunk_offset, sync, atom_stbl_add_samples (stbl, nsamples, delta, size, chunk_offset, sync,
do_pts, pts_offset); pts_offset);
} }
/* trak and moov molding */ /* trak and moov molding */
@ -3593,18 +3594,17 @@ atom_sdtp_add_samples (AtomSDTP * sdtp, guint8 val)
static void static void
atom_trun_add_samples (AtomTRUN * trun, guint32 delta, guint32 size, atom_trun_add_samples (AtomTRUN * trun, guint32 delta, guint32 size,
guint32 flags, gboolean do_pts, gint64 pts_offset) guint32 flags, gint64 pts_offset)
{ {
TRUNSampleEntry nentry; TRUNSampleEntry nentry;
if (do_pts) { if (pts_offset != 0)
trun->header.flags[1] |= TR_COMPOSITION_TIME_OFFSETS; trun->header.flags[1] |= TR_COMPOSITION_TIME_OFFSETS;
}
nentry.sample_duration = delta; nentry.sample_duration = delta;
nentry.sample_size = size; nentry.sample_size = size;
nentry.sample_flags = flags; nentry.sample_flags = flags;
nentry.sample_composition_time_offset = do_pts ? pts_offset : 0; nentry.sample_composition_time_offset = pts_offset;
atom_array_append (&trun->entries, nentry, 256); atom_array_append (&trun->entries, nentry, 256);
trun->sample_count++; trun->sample_count++;
} }
@ -3637,7 +3637,7 @@ atom_traf_add_trun (AtomTRAF * traf, AtomTRUN * trun)
void void
atom_traf_add_samples (AtomTRAF * traf, guint32 delta, guint32 size, atom_traf_add_samples (AtomTRAF * traf, guint32 delta, guint32 size,
gboolean sync, gboolean do_pts, gint64 pts_offset, gboolean sdtp_sync) gboolean sync, gint64 pts_offset, gboolean sdtp_sync)
{ {
AtomTRUN *trun; AtomTRUN *trun;
guint32 flags; guint32 flags;
@ -3683,8 +3683,7 @@ atom_traf_add_samples (AtomTRAF * traf, guint32 delta, guint32 size,
} }
} }
atom_trun_add_samples (traf->truns->data, delta, size, flags, do_pts, atom_trun_add_samples (traf->truns->data, delta, size, flags, pts_offset);
pts_offset);
if (traf->sdtps) if (traf->sdtps)
atom_sdtp_add_samples (traf->sdtps->data, 0x10 | ((flags & 0xff) >> 4)); atom_sdtp_add_samples (traf->sdtps->data, 0x10 | ((flags & 0xff) >> 4));

View file

@ -479,6 +479,7 @@ typedef struct _AtomCTTS
/* also entry count here */ /* also entry count here */
ATOM_ARRAY (CTTSEntry) entries; ATOM_ARRAY (CTTSEntry) entries;
gboolean do_pts;
} AtomCTTS; } AtomCTTS;
typedef struct _AtomSTBL typedef struct _AtomSTBL
@ -806,7 +807,7 @@ void atom_ftyp_free (AtomFTYP *ftyp);
AtomTRAK* atom_trak_new (AtomsContext *context); AtomTRAK* atom_trak_new (AtomsContext *context);
void atom_trak_add_samples (AtomTRAK * trak, guint32 nsamples, guint32 delta, void atom_trak_add_samples (AtomTRAK * trak, guint32 nsamples, guint32 delta,
guint32 size, guint64 chunk_offset, gboolean sync, guint32 size, guint64 chunk_offset, gboolean sync,
gboolean do_pts, gint64 pts_offset); gint64 pts_offset);
void atom_trak_add_elst_entry (AtomTRAK * trak, guint32 duration, void atom_trak_add_elst_entry (AtomTRAK * trak, guint32 duration,
guint32 media_time, guint32 rate); guint32 media_time, guint32 rate);
guint32 atom_trak_get_timescale (AtomTRAK *trak); guint32 atom_trak_get_timescale (AtomTRAK *trak);
@ -814,7 +815,7 @@ guint32 atom_trak_get_id (AtomTRAK * trak);
void atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples, void atom_stbl_add_samples (AtomSTBL * stbl, guint32 nsamples,
guint32 delta, guint32 size, guint32 delta, guint32 size,
guint64 chunk_offset, gboolean sync, guint64 chunk_offset, gboolean sync,
gboolean do_pts, gint64 pts_offset); gint64 pts_offset);
AtomMOOV* atom_moov_new (AtomsContext *context); AtomMOOV* atom_moov_new (AtomsContext *context);
void atom_moov_free (AtomMOOV *moov); void atom_moov_free (AtomMOOV *moov);
@ -850,8 +851,7 @@ guint64 atom_moof_copy_data (AtomMOOF *moof, guint8 **buffer, guint64
AtomTRAF * atom_traf_new (AtomsContext * context, guint32 track_ID); AtomTRAF * atom_traf_new (AtomsContext * context, guint32 track_ID);
void atom_traf_free (AtomTRAF * traf); void atom_traf_free (AtomTRAF * traf);
void atom_traf_add_samples (AtomTRAF * traf, guint32 delta, void atom_traf_add_samples (AtomTRAF * traf, guint32 delta,
guint32 size, gboolean sync, guint32 size, gboolean sync, gint64 pts_offset,
gboolean do_pts, gint64 pts_offset,
gboolean sdtp_sync); gboolean sdtp_sync);
guint32 atom_traf_get_sample_num (AtomTRAF * traf); guint32 atom_traf_get_sample_num (AtomTRAF * traf);
void atom_moof_add_traf (AtomMOOF *moof, AtomTRAF *traf); void atom_moof_add_traf (AtomMOOF *moof, AtomTRAF *traf);

View file

@ -761,7 +761,7 @@ trak_recov_data_add_sample (TrakRecovData * trak, TrakBufferEntryInfo * b)
{ {
trak->duration += b->nsamples * b->delta; trak->duration += b->nsamples * b->delta;
atom_stbl_add_samples (&trak->stbl, b->nsamples, b->delta, b->size, atom_stbl_add_samples (&trak->stbl, b->nsamples, b->delta, b->size,
b->chunk_offset, b->sync, b->do_pts, b->pts_offset); b->chunk_offset, b->sync, b->pts_offset);
} }
/** /**

View file

@ -1838,8 +1838,7 @@ ftyp_error:
static GstFlowReturn static GstFlowReturn
gst_qt_mux_pad_fragment_add_buffer (GstQTMux * qtmux, GstQTPad * pad, gst_qt_mux_pad_fragment_add_buffer (GstQTMux * qtmux, GstQTPad * pad,
GstBuffer * buf, gboolean force, guint32 nsamples, gint64 dts, GstBuffer * buf, gboolean force, guint32 nsamples, gint64 dts,
guint32 delta, guint32 size, gboolean sync, gboolean do_pts, guint32 delta, guint32 size, gboolean sync, gint64 pts_offset)
gint64 pts_offset)
{ {
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
@ -1913,7 +1912,7 @@ init:
} }
/* add buffer and metadata */ /* add buffer and metadata */
atom_traf_add_samples (pad->traf, delta, size, sync, do_pts, pts_offset, atom_traf_add_samples (pad->traf, delta, size, sync, pts_offset,
pad->sync && sync); pad->sync && sync);
atom_array_append (&pad->fragment_buffers, buf, 256); atom_array_append (&pad->fragment_buffers, buf, 256);
pad->fragment_duration -= delta; pad->fragment_duration -= delta;
@ -2159,8 +2158,8 @@ gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf)
/* note that a new chunk is started each time (not fancy but works) */ /* note that a new chunk is started each time (not fancy but works) */
if (qtmux->moov_recov_file) { if (qtmux->moov_recov_file) {
if (!atoms_recov_write_trak_samples (qtmux->moov_recov_file, pad->trak, if (!atoms_recov_write_trak_samples (qtmux->moov_recov_file, pad->trak,
nsamples, scaled_duration, sample_size, chunk_offset, sync, do_pts, nsamples, (gint32) scaled_duration, sample_size, chunk_offset, sync,
pts_offset)) { do_pts, pts_offset)) {
GST_WARNING_OBJECT (qtmux, "Failed to write sample information to " GST_WARNING_OBJECT (qtmux, "Failed to write sample information to "
"recovery file, disabling recovery"); "recovery file, disabling recovery");
fclose (qtmux->moov_recov_file); fclose (qtmux->moov_recov_file);
@ -2175,10 +2174,10 @@ gst_qt_mux_add_buffer (GstQTMux * qtmux, GstQTPad * pad, GstBuffer * buf)
/* ensure that always sync samples are marked as such */ /* ensure that always sync samples are marked as such */
return gst_qt_mux_pad_fragment_add_buffer (qtmux, pad, last_buf, return gst_qt_mux_pad_fragment_add_buffer (qtmux, pad, last_buf,
buf == NULL, nsamples, last_dts, scaled_duration, sample_size, buf == NULL, nsamples, last_dts, scaled_duration, sample_size,
!pad->sync || sync, do_pts, pts_offset); !pad->sync || sync, pts_offset);
} else { } else {
atom_trak_add_samples (pad->trak, nsamples, scaled_duration, sample_size, atom_trak_add_samples (pad->trak, nsamples, scaled_duration,
chunk_offset, sync, do_pts, pts_offset); sample_size, chunk_offset, sync, pts_offset);
return gst_qt_mux_send_buffer (qtmux, last_buf, &qtmux->mdat_size, TRUE); return gst_qt_mux_send_buffer (qtmux, last_buf, &qtmux->mdat_size, TRUE);
} }