mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-27 09:38:17 +00:00
Write multiple blocks/frames per cluster.
Original commit message from CVS: Write multiple blocks/frames per cluster.
This commit is contained in:
parent
d4c469d6bd
commit
56a8d7c680
3 changed files with 49 additions and 10 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2004-09-09 Arwed v. Merkatz <v.merkatz@gmx.net>
|
||||||
|
* gst/matroska/matroska-mux.h:
|
||||||
|
* gst/matroska/matroska-mux.c: (gst_matroska_mux_reset),
|
||||||
|
(gst_matroska_mux_finish), (gst_matroska_mux_write_data):
|
||||||
|
Write multiple blocks/frames per cluster.
|
||||||
|
|
||||||
2004-09-09 Scott Wheeler <wheeler@kde.org>
|
2004-09-09 Scott Wheeler <wheeler@kde.org>
|
||||||
|
|
||||||
* gst/gstplaybin.c: (gst_play_bin_class_init), (gst_play_bin_init),
|
* gst/gstplaybin.c: (gst_play_bin_class_init), (gst_play_bin_init),
|
||||||
|
|
|
@ -323,6 +323,11 @@ gst_matroska_mux_reset (GstElement * element)
|
||||||
}
|
}
|
||||||
/* arbitrary size, 10 should be enough in most cases */
|
/* arbitrary size, 10 should be enough in most cases */
|
||||||
used_uids = g_array_sized_new (FALSE, FALSE, sizeof (guint32), 10);
|
used_uids = g_array_sized_new (FALSE, FALSE, sizeof (guint32), 10);
|
||||||
|
|
||||||
|
/* reset cluster */
|
||||||
|
mux->cluster = 0;
|
||||||
|
mux->cluster_time = 0;
|
||||||
|
mux->cluster_pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstPadLinkReturn
|
static GstPadLinkReturn
|
||||||
|
@ -831,6 +836,11 @@ gst_matroska_mux_finish (GstMatroskaMux * mux)
|
||||||
guint64 duration = 0;
|
guint64 duration = 0;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
|
/* finish last cluster */
|
||||||
|
if (mux->cluster) {
|
||||||
|
gst_ebml_write_master_finish (ebml, mux->cluster);
|
||||||
|
}
|
||||||
|
|
||||||
/* cues */
|
/* cues */
|
||||||
if (mux->index != NULL) {
|
if (mux->index != NULL) {
|
||||||
guint n;
|
guint n;
|
||||||
|
@ -964,6 +974,27 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux)
|
||||||
buf = mux->sink[i].buffer;
|
buf = mux->sink[i].buffer;
|
||||||
mux->sink[i].buffer = NULL;
|
mux->sink[i].buffer = NULL;
|
||||||
|
|
||||||
|
if (mux->cluster) {
|
||||||
|
/* start a new cluster every two seconds */
|
||||||
|
if (mux->cluster_time + GST_SECOND * 2 < GST_BUFFER_TIMESTAMP (buf)) {
|
||||||
|
gst_ebml_write_master_finish (ebml, mux->cluster);
|
||||||
|
mux->cluster_pos = ebml->pos;
|
||||||
|
mux->cluster =
|
||||||
|
gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER);
|
||||||
|
gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE,
|
||||||
|
GST_BUFFER_TIMESTAMP (buf) / mux->time_scale);
|
||||||
|
mux->cluster_time = GST_BUFFER_TIMESTAMP (buf);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* first cluster */
|
||||||
|
mux->cluster_pos = ebml->pos;
|
||||||
|
mux->cluster = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER);
|
||||||
|
gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE,
|
||||||
|
GST_BUFFER_TIMESTAMP (buf) / mux->time_scale);
|
||||||
|
mux->cluster_time = GST_BUFFER_TIMESTAMP (buf);
|
||||||
|
}
|
||||||
|
cluster = mux->cluster;
|
||||||
|
|
||||||
/* update duration of this track */
|
/* update duration of this track */
|
||||||
if (GST_BUFFER_DURATION_IS_VALID (buf))
|
if (GST_BUFFER_DURATION_IS_VALID (buf))
|
||||||
mux->sink[i].duration += GST_BUFFER_DURATION (buf);
|
mux->sink[i].duration += GST_BUFFER_DURATION (buf);
|
||||||
|
@ -983,7 +1014,7 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux)
|
||||||
}
|
}
|
||||||
idx = &mux->index[mux->num_indexes++];
|
idx = &mux->index[mux->num_indexes++];
|
||||||
|
|
||||||
idx->pos = ebml->pos;
|
idx->pos = mux->cluster_pos;
|
||||||
idx->time = GST_BUFFER_TIMESTAMP (buf);
|
idx->time = GST_BUFFER_TIMESTAMP (buf);
|
||||||
idx->track = mux->sink[i].track->num;
|
idx->track = mux->sink[i].track->num;
|
||||||
} else if ((mux->sink[i].track->type == GST_MATROSKA_TRACK_TYPE_AUDIO) &&
|
} else if ((mux->sink[i].track->type == GST_MATROSKA_TRACK_TYPE_AUDIO) &&
|
||||||
|
@ -996,25 +1027,23 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux)
|
||||||
}
|
}
|
||||||
idx = &mux->index[mux->num_indexes++];
|
idx = &mux->index[mux->num_indexes++];
|
||||||
|
|
||||||
idx->pos = ebml->pos;
|
idx->pos = mux->cluster_pos;
|
||||||
idx->time = GST_BUFFER_TIMESTAMP (buf);
|
idx->time = GST_BUFFER_TIMESTAMP (buf);
|
||||||
idx->track = mux->sink[i].track->num;
|
idx->track = mux->sink[i].track->num;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write one cluster with one blockgroup with one block with
|
/* write one blockgroup with one block with
|
||||||
* one slice (*breath*).
|
* one slice (*breath*).
|
||||||
* FIXME: lacing, multiple frames/cluster, etc. */
|
* FIXME: lacing, etc. */
|
||||||
cluster = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_CLUSTER);
|
|
||||||
gst_ebml_write_uint (ebml, GST_MATROSKA_ID_CLUSTERTIMECODE,
|
|
||||||
GST_BUFFER_TIMESTAMP (buf) / mux->time_scale);
|
|
||||||
blockgroup = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_BLOCKGROUP);
|
blockgroup = gst_ebml_write_master_start (ebml, GST_MATROSKA_ID_BLOCKGROUP);
|
||||||
gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_BLOCK,
|
gst_ebml_write_buffer_header (ebml, GST_MATROSKA_ID_BLOCK,
|
||||||
GST_BUFFER_SIZE (buf) + 4);
|
GST_BUFFER_SIZE (buf) + 4);
|
||||||
hdr = gst_buffer_new_and_alloc (4);
|
hdr = gst_buffer_new_and_alloc (4);
|
||||||
/* track num - FIXME: what if num >= 0x80 (unlikely)? */
|
/* track num - FIXME: what if num >= 0x80 (unlikely)? */
|
||||||
GST_BUFFER_DATA (hdr)[0] = mux->sink[i].track->num | 0x80;
|
GST_BUFFER_DATA (hdr)[0] = mux->sink[i].track->num | 0x80;
|
||||||
/* time relative to clustertime - we don't use this yet */
|
/* time relative to clustertime */
|
||||||
*(guint16 *) & GST_BUFFER_DATA (hdr)[1] = GUINT16_TO_BE (0);
|
*(guint16 *) & GST_BUFFER_DATA (hdr)[1] = GUINT16_TO_BE (
|
||||||
|
(GST_BUFFER_TIMESTAMP (buf) - mux->cluster_time) / mux->time_scale);
|
||||||
/* flags - no lacing (yet) */
|
/* flags - no lacing (yet) */
|
||||||
GST_BUFFER_DATA (hdr)[3] = 0;
|
GST_BUFFER_DATA (hdr)[3] = 0;
|
||||||
gst_ebml_write_buffer (ebml, hdr);
|
gst_ebml_write_buffer (ebml, hdr);
|
||||||
|
@ -1028,7 +1057,6 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
gst_ebml_write_master_finish (ebml, blockgroup);
|
gst_ebml_write_master_finish (ebml, blockgroup);
|
||||||
gst_ebml_write_master_finish (ebml, cluster);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -103,6 +103,11 @@ typedef struct _GstMatroskaMux {
|
||||||
tracks_pos,
|
tracks_pos,
|
||||||
duration_pos;
|
duration_pos;
|
||||||
guint64 segment_master;
|
guint64 segment_master;
|
||||||
|
|
||||||
|
/* current cluster */
|
||||||
|
guint64 cluster,
|
||||||
|
cluster_time,
|
||||||
|
cluster_pos;
|
||||||
} GstMatroskaMux;
|
} GstMatroskaMux;
|
||||||
|
|
||||||
typedef struct _GstMatroskaMuxClass {
|
typedef struct _GstMatroskaMuxClass {
|
||||||
|
|
Loading…
Reference in a new issue