mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-21 09:53:47 +00:00
avidemux: parse fuji strd
We can get maker, model and capture date from this chunk. Fixes #636143
This commit is contained in:
parent
1be2922802
commit
5384da2a1f
1 changed files with 62 additions and 1 deletions
|
@ -124,6 +124,7 @@ static void gst_avi_demux_get_buffer_info (GstAviDemux * avi,
|
||||||
GstClockTime * ts_end, guint64 * offset, guint64 * offset_end);
|
GstClockTime * ts_end, guint64 * offset, guint64 * offset_end);
|
||||||
|
|
||||||
static void gst_avi_demux_parse_idit (GstAviDemux * avi, GstBuffer * buf);
|
static void gst_avi_demux_parse_idit (GstAviDemux * avi, GstBuffer * buf);
|
||||||
|
static void gst_avi_demux_parse_strd (GstAviDemux * avi, GstBuffer * buf);
|
||||||
|
|
||||||
/* GObject methods */
|
/* GObject methods */
|
||||||
|
|
||||||
|
@ -2197,7 +2198,10 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf)
|
||||||
if (stream->initdata)
|
if (stream->initdata)
|
||||||
gst_buffer_unref (stream->initdata);
|
gst_buffer_unref (stream->initdata);
|
||||||
stream->initdata = sub;
|
stream->initdata = sub;
|
||||||
|
if (sub != NULL) {
|
||||||
|
gst_avi_demux_parse_strd (avi, sub);
|
||||||
sub = NULL;
|
sub = NULL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case GST_RIFF_TAG_strn:
|
case GST_RIFF_TAG_strn:
|
||||||
g_free (stream->name);
|
g_free (stream->name);
|
||||||
|
@ -3721,6 +3725,63 @@ parse_tag_value (GstAviDemux * avi, GstTagList * taglist, const gchar * type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_avi_demux_parse_strd (GstAviDemux * avi, GstBuffer * buf)
|
||||||
|
{
|
||||||
|
GstMapInfo map;
|
||||||
|
guint32 tag;
|
||||||
|
|
||||||
|
gst_buffer_map (buf, &map, GST_MAP_READ);
|
||||||
|
if (map.size > 4) {
|
||||||
|
guint8 *ptr = map.data;
|
||||||
|
gsize left = map.size;
|
||||||
|
|
||||||
|
/* parsing based on
|
||||||
|
* http://www.eden-foundation.org/products/code/film_date_stamp/index.html
|
||||||
|
*/
|
||||||
|
tag = GST_READ_UINT32_LE (ptr);
|
||||||
|
if ((tag == GST_MAKE_FOURCC ('A', 'V', 'I', 'F')) && (map.size > 98)) {
|
||||||
|
gsize sub_size;
|
||||||
|
|
||||||
|
ptr += 98;
|
||||||
|
left -= 98;
|
||||||
|
if (!memcmp (ptr, "FUJIFILM", 8)) {
|
||||||
|
GST_MEMDUMP_OBJECT (avi, "fujifim tag", ptr, 48);
|
||||||
|
|
||||||
|
ptr += 10;
|
||||||
|
left -= 10;
|
||||||
|
sub_size = 0;
|
||||||
|
while (ptr[sub_size] && sub_size < left)
|
||||||
|
sub_size++;
|
||||||
|
|
||||||
|
if (avi->globaltags == NULL)
|
||||||
|
avi->globaltags = gst_tag_list_new_empty ();
|
||||||
|
|
||||||
|
gst_tag_list_add (avi->globaltags, GST_TAG_MERGE_APPEND,
|
||||||
|
GST_TAG_DEVICE_MANUFACTURER, "FUJIFILM",
|
||||||
|
GST_TAG_DEVICE_MODEL, ptr, NULL);
|
||||||
|
|
||||||
|
while (ptr[sub_size] == '\0' && sub_size < left)
|
||||||
|
sub_size++;
|
||||||
|
|
||||||
|
ptr += sub_size;
|
||||||
|
left -= sub_size;
|
||||||
|
sub_size = 0;
|
||||||
|
while (ptr[sub_size] && sub_size < left)
|
||||||
|
sub_size++;
|
||||||
|
if (ptr[4] == ':')
|
||||||
|
ptr[4] = '-';
|
||||||
|
if (ptr[7] == ':')
|
||||||
|
ptr[7] = '-';
|
||||||
|
|
||||||
|
parse_tag_value (avi, avi->globaltags, GST_TAG_DATE_TIME, ptr,
|
||||||
|
sub_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gst_buffer_unmap (buf, &map);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* gst_avi_demux_parse_ncdt:
|
* gst_avi_demux_parse_ncdt:
|
||||||
* @element: caller element (used for debugging/error).
|
* @element: caller element (used for debugging/error).
|
||||||
|
|
Loading…
Reference in a new issue