Commit 63b169cd authored by Tim-Philipp Müller's avatar Tim-Philipp Müller 🐠
Browse files

gst/matroska/matroska-mux.c: Don't strcmp() NULL strings.

Original commit message from CVS:
* gst/matroska/matroska-mux.c:
(gst_matroska_mux_stream_is_vorbis_header),
(gst_matroska_mux_write_data):
Don't strcmp() NULL strings.
Only start new clusters on video keyframes, not on any
random audio buffer that doesn't have the DELTA_UNIT
flag set (fixes 'make check' again).
parent fcd464ea
2006-05-03 Tim-Philipp Müller <tim at centricular dot net>
* gst/matroska/matroska-mux.c:
(gst_matroska_mux_stream_is_vorbis_header),
(gst_matroska_mux_write_data):
Don't strcmp() NULL strings.
Only start new clusters on video keyframes, not on any
random audio buffer that doesn't have the DELTA_UNIT
flag set (fixes 'make check' again).
2006-05-03 Tim-Philipp Müller <tim at centricular dot net> 2006-05-03 Tim-Philipp Müller <tim at centricular dot net>
Patch by: Mark Nauwelaerts <manauw at skynet be> Patch by: Mark Nauwelaerts <manauw at skynet be>
......
...@@ -1318,7 +1318,8 @@ gst_matroska_mux_stream_is_vorbis_header (GstMatroskaMux * mux, ...@@ -1318,7 +1318,8 @@ gst_matroska_mux_stream_is_vorbis_header (GstMatroskaMux * mux,
if (audio_ctx->first_frame != FALSE) if (audio_ctx->first_frame != FALSE)
return FALSE; return FALSE;
if (strcmp (collect_pad->track->codec_id, GST_MATROSKA_CODEC_ID_AUDIO_VORBIS)) if (collect_pad->track->codec_id == NULL ||
strcmp (collect_pad->track->codec_id, GST_MATROSKA_CODEC_ID_AUDIO_VORBIS))
return FALSE; return FALSE;
/* HACK: three frame headers are counted using pos */ /* HACK: three frame headers are counted using pos */
...@@ -1379,6 +1380,7 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad) ...@@ -1379,6 +1380,7 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad)
gint16 relative_timestamp; gint16 relative_timestamp;
gint64 relative_timestamp64; gint64 relative_timestamp64;
guint64 block_duration; guint64 block_duration;
gboolean is_video_keyframe = FALSE;
/* write data */ /* write data */
buf = collect_pad->buffer; buf = collect_pad->buffer;
...@@ -1386,6 +1388,7 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad) ...@@ -1386,6 +1388,7 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad)
/* vorbis header are retrieved from caps and placed in CodecPrivate */ /* vorbis header are retrieved from caps and placed in CodecPrivate */
if (gst_matroska_mux_stream_is_vorbis_header (mux, collect_pad)) { if (gst_matroska_mux_stream_is_vorbis_header (mux, collect_pad)) {
GST_LOG_OBJECT (collect_pad->collect.pad, "dropping vorbis header buffer");
gst_buffer_unref (buf); gst_buffer_unref (buf);
return GST_FLOW_OK; return GST_FLOW_OK;
} }
...@@ -1402,10 +1405,17 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad) ...@@ -1402,10 +1405,17 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad)
/* set the timestamp for outgoing buffers */ /* set the timestamp for outgoing buffers */
ebml->timestamp = GST_BUFFER_TIMESTAMP (buf); ebml->timestamp = GST_BUFFER_TIMESTAMP (buf);
if (collect_pad->track->type == GST_MATROSKA_TRACK_TYPE_VIDEO &&
!GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT)) {
GST_LOG_OBJECT (mux, "have video keyframe, ts=%" GST_TIME_FORMAT,
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)));
is_video_keyframe = TRUE;
}
if (mux->cluster) { if (mux->cluster) {
/* start a new cluster every two seconds or at keyframe */ /* start a new cluster every two seconds or at keyframe */
if (mux->cluster_time + GST_SECOND * 2 < GST_BUFFER_TIMESTAMP (buf) if (mux->cluster_time + GST_SECOND * 2 < GST_BUFFER_TIMESTAMP (buf)
|| !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT)) { || is_video_keyframe) {
GstMatroskaMetaSeekIndex *idx; GstMatroskaMetaSeekIndex *idx;
gst_ebml_write_master_finish (ebml, mux->cluster); gst_ebml_write_master_finish (ebml, mux->cluster);
...@@ -1453,8 +1463,7 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad) ...@@ -1453,8 +1463,7 @@ gst_matroska_mux_write_data (GstMatroskaMux * mux, GstMatroskaPad * collect_pad)
* for audio only files. This can be largely improved, such as doing * for audio only files. This can be largely improved, such as doing
* one for each keyframe or each second (for all-keyframe * one for each keyframe or each second (for all-keyframe
* streams), only the *first* video track. But that'll come later... */ * streams), only the *first* video track. But that'll come later... */
if (collect_pad->track->type == GST_MATROSKA_TRACK_TYPE_VIDEO && if (is_video_keyframe) {
!GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT)) {
GstMatroskaIndex *idx; GstMatroskaIndex *idx;
if (mux->num_indexes % 32 == 0) { if (mux->num_indexes % 32 == 0) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment