mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
qtmux: Adding GstTagXmpWriter interface
Adds GstTagXmpWriter interface support to qtmux
This commit is contained in:
parent
d178329eb0
commit
aba8000188
3 changed files with 25 additions and 14 deletions
|
@ -2937,20 +2937,17 @@ atom_moov_add_3gp_uint_tag (AtomMOOV * moov, guint32 fourcc, guint16 value)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
atom_moov_add_xmp_tags (AtomMOOV * moov, const GstTagList * tags)
|
atom_moov_add_xmp_tags (AtomMOOV * moov, GstBuffer * xmpbuffer)
|
||||||
{
|
{
|
||||||
GstBuffer *xmpbuffer;
|
|
||||||
AtomData *data_atom = NULL;
|
AtomData *data_atom = NULL;
|
||||||
|
|
||||||
if (moov->context.flavor == ATOMS_TREE_FLAVOR_MOV) {
|
if (moov->context.flavor == ATOMS_TREE_FLAVOR_MOV) {
|
||||||
xmpbuffer = gst_tag_list_to_xmp_buffer (tags, TRUE);
|
|
||||||
if (xmpbuffer) {
|
if (xmpbuffer) {
|
||||||
data_atom = atom_data_new_from_gst_buffer (FOURCC_XMP_, xmpbuffer);
|
data_atom = atom_data_new_from_gst_buffer (FOURCC_XMP_, xmpbuffer);
|
||||||
atom_moov_init_metatags (moov, &moov->context);
|
atom_moov_init_metatags (moov, &moov->context);
|
||||||
moov->udta->entries = g_list_append (moov->udta->entries,
|
moov->udta->entries = g_list_append (moov->udta->entries,
|
||||||
build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data,
|
build_atom_info_wrapper ((Atom *) data_atom, atom_data_copy_data,
|
||||||
atom_data_free));
|
atom_data_free));
|
||||||
gst_buffer_unref (xmpbuffer);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG ("Not adding xmp to moov atom, it is only used in 'mov' format");
|
GST_DEBUG ("Not adding xmp to moov atom, it is only used in 'mov' format");
|
||||||
|
@ -4402,9 +4399,8 @@ build_ima_adpcm_extension (gint channels, gint rate, gint blocksize)
|
||||||
}
|
}
|
||||||
|
|
||||||
AtomInfo *
|
AtomInfo *
|
||||||
build_uuid_xmp_atom (const GstTagList * taglist)
|
build_uuid_xmp_atom (GstBuffer * xmp_data)
|
||||||
{
|
{
|
||||||
GstBuffer *xmp_data;
|
|
||||||
AtomUUID *uuid;
|
AtomUUID *uuid;
|
||||||
static guint8 xmp_uuid[] = { 0xBE, 0x7A, 0xCF, 0xCB,
|
static guint8 xmp_uuid[] = { 0xBE, 0x7A, 0xCF, 0xCB,
|
||||||
0x97, 0xA9, 0x42, 0xE8,
|
0x97, 0xA9, 0x42, 0xE8,
|
||||||
|
@ -4412,7 +4408,6 @@ build_uuid_xmp_atom (const GstTagList * taglist)
|
||||||
0x91, 0xE3, 0xAF, 0xAC
|
0x91, 0xE3, 0xAF, 0xAC
|
||||||
};
|
};
|
||||||
|
|
||||||
xmp_data = gst_tag_list_to_xmp_buffer (taglist, TRUE);
|
|
||||||
if (xmp_data == NULL)
|
if (xmp_data == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -4423,7 +4418,6 @@ build_uuid_xmp_atom (const GstTagList * taglist)
|
||||||
uuid->datalen = GST_BUFFER_SIZE (xmp_data);
|
uuid->datalen = GST_BUFFER_SIZE (xmp_data);
|
||||||
memcpy (uuid->data, GST_BUFFER_DATA (xmp_data), GST_BUFFER_SIZE (xmp_data));
|
memcpy (uuid->data, GST_BUFFER_DATA (xmp_data), GST_BUFFER_SIZE (xmp_data));
|
||||||
|
|
||||||
gst_buffer_unref (xmp_data);
|
|
||||||
return build_atom_info_wrapper ((Atom *) uuid, atom_uuid_copy_data,
|
return build_atom_info_wrapper ((Atom *) uuid, atom_uuid_copy_data,
|
||||||
atom_uuid_free);
|
atom_uuid_free);
|
||||||
}
|
}
|
||||||
|
|
|
@ -928,7 +928,7 @@ AtomInfo * build_gama_atom (gdouble gamma);
|
||||||
AtomInfo * build_SMI_atom (const GstBuffer *seqh);
|
AtomInfo * build_SMI_atom (const GstBuffer *seqh);
|
||||||
AtomInfo * build_ima_adpcm_extension (gint channels, gint rate,
|
AtomInfo * build_ima_adpcm_extension (gint channels, gint rate,
|
||||||
gint blocksize);
|
gint blocksize);
|
||||||
AtomInfo * build_uuid_xmp_atom (const GstTagList * taglist);
|
AtomInfo * build_uuid_xmp_atom (GstBuffer * xmp);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -948,7 +948,7 @@ void atom_moov_add_3gp_str_int_tag (AtomMOOV * moov, guint32 fourcc, const gch
|
||||||
void atom_moov_add_3gp_tag (AtomMOOV * moov, guint32 fourcc, guint8 * data,
|
void atom_moov_add_3gp_tag (AtomMOOV * moov, guint32 fourcc, guint8 * data,
|
||||||
guint size);
|
guint size);
|
||||||
|
|
||||||
void atom_moov_add_xmp_tags (AtomMOOV * moov, const GstTagList * tags);
|
void atom_moov_add_xmp_tags (AtomMOOV * moov, GstBuffer * xmp);
|
||||||
|
|
||||||
#define GST_QT_MUX_DEFAULT_TAG_LANGUAGE "eng"
|
#define GST_QT_MUX_DEFAULT_TAG_LANGUAGE "eng"
|
||||||
guint16 language_code (const char * lang);
|
guint16 language_code (const char * lang);
|
||||||
|
|
|
@ -117,6 +117,7 @@
|
||||||
|
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
#include <gst/base/gstcollectpads.h>
|
#include <gst/base/gstcollectpads.h>
|
||||||
|
#include <gst/tag/xmpwriter.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#ifdef G_OS_WIN32
|
#ifdef G_OS_WIN32
|
||||||
|
@ -1015,6 +1016,7 @@ static void
|
||||||
gst_qt_mux_add_xmp_tags (GstQTMux * qtmux, const GstTagList * list)
|
gst_qt_mux_add_xmp_tags (GstQTMux * qtmux, const GstTagList * list)
|
||||||
{
|
{
|
||||||
GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux));
|
GstQTMuxClass *qtmux_klass = (GstQTMuxClass *) (G_OBJECT_GET_CLASS (qtmux));
|
||||||
|
GstBuffer *xmp = NULL;
|
||||||
|
|
||||||
/* adobe specs only have 'quicktime' and 'mp4',
|
/* adobe specs only have 'quicktime' and 'mp4',
|
||||||
* but I guess we can extrapolate to gpp.
|
* but I guess we can extrapolate to gpp.
|
||||||
|
@ -1026,14 +1028,24 @@ gst_qt_mux_add_xmp_tags (GstQTMux * qtmux, const GstTagList * list)
|
||||||
GST_DEBUG_OBJECT (qtmux, "Adding xmp tags");
|
GST_DEBUG_OBJECT (qtmux, "Adding xmp tags");
|
||||||
|
|
||||||
if (qtmux_klass->format == GST_QT_MUX_FORMAT_QT) {
|
if (qtmux_klass->format == GST_QT_MUX_FORMAT_QT) {
|
||||||
atom_moov_add_xmp_tags (qtmux->moov, list);
|
xmp = gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER (qtmux),
|
||||||
|
list, TRUE);
|
||||||
|
if (xmp)
|
||||||
|
atom_moov_add_xmp_tags (qtmux->moov, xmp);
|
||||||
} else {
|
} else {
|
||||||
|
AtomInfo *ainfo;
|
||||||
/* for isom/mp4, it is a top level uuid atom */
|
/* for isom/mp4, it is a top level uuid atom */
|
||||||
AtomInfo *ainfo = build_uuid_xmp_atom (list);
|
xmp = gst_tag_xmp_writer_tag_list_to_xmp_buffer (GST_TAG_XMP_WRITER (qtmux),
|
||||||
if (ainfo) {
|
list, TRUE);
|
||||||
qtmux->extra_atoms = g_slist_prepend (qtmux->extra_atoms, ainfo);
|
if (xmp) {
|
||||||
|
ainfo = build_uuid_xmp_atom (xmp);
|
||||||
|
if (ainfo) {
|
||||||
|
qtmux->extra_atoms = g_slist_prepend (qtmux->extra_atoms, ainfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (xmp)
|
||||||
|
gst_buffer_unref (xmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -3426,6 +3438,9 @@ gst_qt_mux_register (GstPlugin * plugin)
|
||||||
static const GInterfaceInfo tag_setter_info = {
|
static const GInterfaceInfo tag_setter_info = {
|
||||||
NULL, NULL, NULL
|
NULL, NULL, NULL
|
||||||
};
|
};
|
||||||
|
static const GInterfaceInfo tag_xmp_writer_info = {
|
||||||
|
NULL, NULL, NULL
|
||||||
|
};
|
||||||
GType type;
|
GType type;
|
||||||
GstQTMuxFormat format;
|
GstQTMuxFormat format;
|
||||||
GstQTMuxClassParams *params;
|
GstQTMuxClassParams *params;
|
||||||
|
@ -3455,6 +3470,8 @@ gst_qt_mux_register (GstPlugin * plugin)
|
||||||
0);
|
0);
|
||||||
g_type_set_qdata (type, GST_QT_MUX_PARAMS_QDATA, (gpointer) params);
|
g_type_set_qdata (type, GST_QT_MUX_PARAMS_QDATA, (gpointer) params);
|
||||||
g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info);
|
g_type_add_interface_static (type, GST_TYPE_TAG_SETTER, &tag_setter_info);
|
||||||
|
g_type_add_interface_static (type, GST_TYPE_TAG_XMP_WRITER,
|
||||||
|
&tag_xmp_writer_info);
|
||||||
|
|
||||||
if (!gst_element_register (plugin, prop->name, GST_RANK_PRIMARY, type))
|
if (!gst_element_register (plugin, prop->name, GST_RANK_PRIMARY, type))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Reference in a new issue