diff options
Diffstat (limited to 'gst/matroska/matroska-demux.c')
-rw-r--r-- | gst/matroska/matroska-demux.c | 132 |
1 files changed, 68 insertions, 64 deletions
diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index d33786865..42fee5a3b 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -470,8 +470,7 @@ gst_matroska_demux_reset (GstElement * element) if (demux->common.cached_buffer) { if (demux->common.cached_data) { - gst_buffer_unmap (demux->common.cached_buffer, - demux->common.cached_data, -1); + gst_buffer_unmap (demux->common.cached_buffer, &demux->common.cached_map); demux->common.cached_data = NULL; } gst_buffer_unref (demux->common.cached_buffer); @@ -484,28 +483,28 @@ gst_matroska_demux_reset (GstElement * element) static GstBuffer * gst_matroska_decode_buffer (GstMatroskaTrackContext * context, GstBuffer * buf) { - gpointer data, buf_data; - gsize size, buf_size; + GstMapInfo map; + gpointer data; + gsize size; g_return_val_if_fail (GST_IS_BUFFER (buf), NULL); GST_DEBUG ("decoding buffer %p", buf); - buf_data = gst_buffer_map (buf, &buf_size, NULL, GST_MAP_READ); + gst_buffer_map (buf, &map, GST_MAP_READ); + data = map.data; + size = map.size; - g_return_val_if_fail (buf_size > 0, buf); - - data = buf_data; - size = buf_size; + g_return_val_if_fail (size > 0, buf); if (gst_matroska_decode_data (context->encodings, &data, &size, GST_MATROSKA_TRACK_ENCODING_SCOPE_FRAME, FALSE)) { - gst_buffer_unmap (buf, buf_data, buf_size); + gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); return gst_buffer_new_wrapped (data, size); } else { GST_DEBUG ("decode data failed"); - gst_buffer_unmap (buf, buf_data, buf_size); + gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); return NULL; } @@ -1587,6 +1586,7 @@ gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos) GstFlowReturn ret = GST_FLOW_OK; const guint chunk = 64 * 1024; GstBuffer *buf = NULL; + GstMapInfo map; gpointer data = NULL; gsize size; guint64 length; @@ -1625,7 +1625,7 @@ gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos) gint cluster_pos; if (buf != NULL) { - gst_buffer_unmap (buf, data, size); + gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); buf = NULL; } @@ -1635,7 +1635,9 @@ gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos) GST_DEBUG_OBJECT (demux, "read buffer size %" G_GSIZE_FORMAT " at offset %" G_GINT64_FORMAT, gst_buffer_get_size (buf), newpos); - data = gst_buffer_map (buf, &size, NULL, GST_MAP_READ); + gst_buffer_map (buf, &map, GST_MAP_READ); + data = map.data; + size = map.size; gst_byte_reader_init (&reader, data, size); resume: cluster_pos = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff, @@ -1690,7 +1692,7 @@ gst_matroska_demux_search_cluster (GstMatroskaDemux * demux, gint64 * pos) } if (buf) { - gst_buffer_unmap (buf, data, size); + gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); buf = NULL; } @@ -2714,6 +2716,7 @@ gst_matroska_demux_add_wvpk_header (GstElement * element, GstMatroskaTrackAudioContext *audiocontext = (GstMatroskaTrackAudioContext *) stream; GstBuffer *newbuf = NULL; + GstMapInfo map, outmap; guint8 *buf_data, *data; Wavpack4Header wvh; @@ -2744,7 +2747,8 @@ gst_matroska_demux_add_wvpk_header (GstElement * element, /* block_samples, flags and crc are already in the buffer */ newbuf = gst_buffer_new_allocate (NULL, sizeof (Wavpack4Header) - 12, 0); - data = gst_buffer_map (newbuf, NULL, NULL, GST_MAP_WRITE); + gst_buffer_map (newbuf, &outmap, GST_MAP_WRITE); + data = outmap.data; data[0] = 'w'; data[1] = 'v'; data[2] = 'p'; @@ -2769,11 +2773,13 @@ gst_matroska_demux_add_wvpk_header (GstElement * element, gsize buf_size, size, out_size = 0; guint32 block_samples, flags, crc, blocksize; - buf_data = gst_buffer_map (*buf, &buf_size, NULL, GST_MAP_READ); + gst_buffer_map (*buf, &map, GST_MAP_READ); + buf_data = map.data; + buf_size = map.size; if (buf_size < 4) { GST_ERROR_OBJECT (element, "Too small wavpack buffer"); - gst_buffer_unmap (*buf, buf_data, buf_size); + gst_buffer_unmap (*buf, &map); return GST_FLOW_ERROR; } @@ -2808,12 +2814,14 @@ gst_matroska_demux_add_wvpk_header (GstElement * element, GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS, 0, -1); outpos = 0; - outdata = gst_buffer_map (newbuf, NULL, NULL, GST_MAP_WRITE); + gst_buffer_map (newbuf, &outmap, GST_MAP_WRITE); + outdata = outmap.data; } else { - gst_buffer_unmap (newbuf, outdata, out_size); + gst_buffer_unmap (newbuf, &outmap); out_size += sizeof (Wavpack4Header) + blocksize; gst_buffer_set_size (newbuf, out_size); - outdata = gst_buffer_map (newbuf, NULL, NULL, GST_MAP_WRITE); + gst_buffer_map (newbuf, &outmap, GST_MAP_WRITE); + outdata = outmap.data; } outdata[outpos] = 'w'; @@ -2839,11 +2847,11 @@ gst_matroska_demux_add_wvpk_header (GstElement * element, data += blocksize; size -= blocksize; } - gst_buffer_unmap (*buf, buf_data, buf_size); + gst_buffer_unmap (*buf, &map); gst_buffer_unref (*buf); if (newbuf) - gst_buffer_unmap (newbuf, outdata, out_size); + gst_buffer_unmap (newbuf, &outmap); *buf = newbuf; audiocontext->wvpk_block_index += block_samples; @@ -2893,20 +2901,15 @@ gst_matroska_demux_check_subtitle_buffer (GstElement * element, GError *err = NULL; GstBuffer *newbuf; gchar *utf8; - gpointer data; - gsize size; + GstMapInfo map; sub_stream = (GstMatroskaTrackSubtitleContext *) stream; - data = gst_buffer_map (*buf, &size, NULL, GST_MAP_READ); - - if (!data) { - gst_buffer_unmap (*buf, data, -1); + if (!gst_buffer_map (*buf, &map, GST_MAP_READ)) return GST_FLOW_OK; - } if (!sub_stream->invalid_utf8) { - if (g_utf8_validate (data, size, NULL)) { + if (g_utf8_validate ((gchar *) map.data, map.size, NULL)) { goto next; } GST_WARNING_OBJECT (element, "subtitle stream %d is not valid UTF-8, this " @@ -2924,8 +2927,9 @@ gst_matroska_demux_check_subtitle_buffer (GstElement * element, } } - utf8 = g_convert_with_fallback (data, size, "UTF-8", encoding, (char *) "*", - NULL, NULL, &err); + utf8 = + g_convert_with_fallback ((gchar *) map.data, map.size, "UTF-8", encoding, + (char *) "*", NULL, NULL, &err); if (err) { GST_LOG_OBJECT (element, "could not convert string from '%s' to UTF-8: %s", @@ -2935,8 +2939,9 @@ gst_matroska_demux_check_subtitle_buffer (GstElement * element, /* invalid input encoding, fall back to ISO-8859-15 (always succeeds) */ encoding = "ISO-8859-15"; - utf8 = g_convert_with_fallback (data, size, "UTF-8", encoding, (char *) "*", - NULL, NULL, NULL); + utf8 = + g_convert_with_fallback ((gchar *) map.data, map.size, "UTF-8", + encoding, (char *) "*", NULL, NULL, NULL); } GST_LOG_OBJECT (element, "converted subtitle text from %s to UTF-8 %s", @@ -2949,28 +2954,27 @@ gst_matroska_demux_check_subtitle_buffer (GstElement * element, gst_buffer_copy_into (newbuf, *buf, GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_META, 0, -1); - gst_buffer_unmap (*buf, data, size); - + gst_buffer_unmap (*buf, &map); gst_buffer_unref (*buf); *buf = newbuf; - data = gst_buffer_map (*buf, &size, NULL, GST_MAP_READ); + gst_buffer_map (*buf, &map, GST_MAP_READ); next: if (sub_stream->check_markup) { /* caps claim markup text, so we need to escape text, * except if text is already markup and then needs no further escaping */ sub_stream->seen_markup_tag = sub_stream->seen_markup_tag || - gst_matroska_demux_subtitle_chunk_has_tag (element, data); + gst_matroska_demux_subtitle_chunk_has_tag (element, (gchar *) map.data); if (!sub_stream->seen_markup_tag) { - utf8 = g_markup_escape_text (data, size); + utf8 = g_markup_escape_text ((gchar *) map.data, map.size); newbuf = gst_buffer_new_wrapped (utf8, strlen (utf8)); gst_buffer_copy_into (newbuf, *buf, GST_BUFFER_COPY_TIMESTAMPS | GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_META, 0, -1); - gst_buffer_unmap (*buf, data, size); + gst_buffer_unmap (*buf, &map); gst_buffer_unref (*buf); *buf = newbuf; @@ -3017,38 +3021,36 @@ static GstBuffer * gst_matroska_demux_align_buffer (GstMatroskaDemux * demux, GstBuffer * buffer, gsize alignment) { - gpointer data; - gsize size; + GstMapInfo map; - data = gst_buffer_map (buffer, &size, NULL, GST_MAP_READ); + gst_buffer_map (buffer, &map, GST_MAP_READ); - if (size < sizeof (guintptr)) { - gst_buffer_unmap (buffer, data, size); + if (map.size < sizeof (guintptr)) { + gst_buffer_unmap (buffer, &map); return buffer; } - if (((guintptr) data) & (alignment - 1)) { + if (((guintptr) map.data) & (alignment - 1)) { GstBuffer *new_buffer; - gpointer new_data; new_buffer = gst_buffer_new_allocate (NULL, gst_buffer_get_size (buffer), alignment); + /* Copy data "by hand", so ensure alignment is kept: */ - new_data = gst_buffer_map (new_buffer, NULL, NULL, GST_MAP_WRITE); - memcpy (new_data, data, size); - gst_buffer_unmap (new_buffer, new_data, -1); + gst_buffer_fill (new_buffer, 0, map.data, map.size); + gst_buffer_copy_into (new_buffer, buffer, GST_BUFFER_COPY_METADATA, 0, -1); GST_DEBUG_OBJECT (demux, "We want output aligned on %" G_GSIZE_FORMAT ", reallocated", alignment); - gst_buffer_unmap (buffer, data, size); + gst_buffer_unmap (buffer, &map); gst_buffer_unref (buffer); return new_buffer; } - gst_buffer_unmap (buffer, data, size); + gst_buffer_unmap (buffer, &map); return buffer; } @@ -3063,8 +3065,7 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, guint32 id; guint64 block_duration = -1; GstBuffer *buf = NULL; - gpointer buf_data = NULL; - gsize buf_size; + GstMapInfo map; gint stream_num = -1, n, laces = 0; guint size = 0; gint *lace_size = NULL; @@ -3095,16 +3096,16 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, guint8 *data; if (buf) { - gst_buffer_unmap (buf, buf_data, buf_size); + gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); buf = NULL; } if ((ret = gst_ebml_read_buffer (ebml, &id, &buf)) != GST_FLOW_OK) break; - buf_data = gst_buffer_map (buf, &buf_size, NULL, GST_MAP_READ); - data = buf_data; - size = buf_size; + gst_buffer_map (buf, &map, GST_MAP_READ); + data = map.data; + size = map.size; /* first byte(s): blocknum */ if ((n = gst_matroska_ebmlnum_uint (data, size, &num)) < 0) @@ -3637,7 +3638,7 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, done: if (buf) { - gst_buffer_unmap (buf, buf_data, buf_size); + gst_buffer_unmap (buf, &map); gst_buffer_unref (buf); } g_free (lace_size); @@ -5305,8 +5306,11 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext * /* make up decoder-specific data if it is not supplied */ if (priv == NULL) { + GstMapInfo map; + priv = gst_buffer_new_allocate (NULL, 5, 0); - data = gst_buffer_map (priv, NULL, NULL, GST_MAP_WRITE); + gst_buffer_map (priv, &map, GST_MAP_WRITE); + data = map.data; rate_idx = aac_rate_idx (audiocontext->samplerate); profile = aac_profile_idx (codec_id); @@ -5316,7 +5320,7 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext * if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2, strlen (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2))) { mpegversion = 2; - gst_buffer_unmap (priv, data, 5); + gst_buffer_unmap (priv, &map); gst_buffer_set_size (priv, 2); } else if (!strncmp (codec_id, GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4, strlen (GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4))) { @@ -5329,13 +5333,13 @@ gst_matroska_demux_audio_caps (GstMatroskaTrackAudioContext * data[2] = AAC_SYNC_EXTENSION_TYPE >> 3; data[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5; data[4] = (1 << 7) | (rate_idx << 3); - gst_buffer_unmap (priv, data, 5); + gst_buffer_unmap (priv, &map); } else { - gst_buffer_unmap (priv, data, 5); + gst_buffer_unmap (priv, &map); gst_buffer_set_size (priv, 2); } } else { - gst_buffer_unmap (priv, data, 5); + gst_buffer_unmap (priv, &map); gst_buffer_unref (priv); priv = NULL; GST_ERROR ("Unknown AAC profile and no codec private data"); |