mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-20 04:56:24 +00:00
flacenc: Add support for writing METADATA_BLOCK_PICTURE blocks for GST_TAG_IMAGE and GST_TAG_PREVIEW_IMAGE
This commit is contained in:
parent
ce66aea7b0
commit
6fd1546bce
1 changed files with 54 additions and 5 deletions
|
@ -473,6 +473,7 @@ gst_flac_enc_set_metadata (GstFlacEnc * flacenc, guint64 total_samples)
|
||||||
const GstTagList *user_tags;
|
const GstTagList *user_tags;
|
||||||
GstTagList *copy;
|
GstTagList *copy;
|
||||||
gint entries = 1;
|
gint entries = 1;
|
||||||
|
gint n_images, n_preview_images;
|
||||||
|
|
||||||
g_return_if_fail (flacenc != NULL);
|
g_return_if_fail (flacenc != NULL);
|
||||||
user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (flacenc));
|
user_tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (flacenc));
|
||||||
|
@ -481,33 +482,81 @@ gst_flac_enc_set_metadata (GstFlacEnc * flacenc, guint64 total_samples)
|
||||||
}
|
}
|
||||||
copy = gst_tag_list_merge (user_tags, flacenc->tags,
|
copy = gst_tag_list_merge (user_tags, flacenc->tags,
|
||||||
gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (flacenc)));
|
gst_tag_setter_get_tag_merge_mode (GST_TAG_SETTER (flacenc)));
|
||||||
flacenc->meta = g_new0 (FLAC__StreamMetadata *, 3);
|
n_images = gst_tag_list_get_tag_size (copy, GST_TAG_IMAGE);
|
||||||
|
n_preview_images = gst_tag_list_get_tag_size (copy, GST_TAG_PREVIEW_IMAGE);
|
||||||
|
|
||||||
|
flacenc->meta =
|
||||||
|
g_new0 (FLAC__StreamMetadata *, 3 + n_images + n_preview_images);
|
||||||
|
|
||||||
flacenc->meta[0] =
|
flacenc->meta[0] =
|
||||||
FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT);
|
FLAC__metadata_object_new (FLAC__METADATA_TYPE_VORBIS_COMMENT);
|
||||||
gst_tag_list_foreach (copy, add_one_tag, flacenc);
|
gst_tag_list_foreach (copy, add_one_tag, flacenc);
|
||||||
|
|
||||||
|
if (n_images + n_preview_images > 0) {
|
||||||
|
GstBuffer *buffer;
|
||||||
|
GstCaps *caps;
|
||||||
|
GstStructure *structure;
|
||||||
|
GstTagImageType image_type = GST_TAG_IMAGE_TYPE_NONE;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_images + n_preview_images; i++) {
|
||||||
|
if (i < n_images) {
|
||||||
|
if (!gst_tag_list_get_buffer_index (copy, GST_TAG_IMAGE, i, &buffer))
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
if (!gst_tag_list_get_buffer_index (copy, GST_TAG_PREVIEW_IMAGE,
|
||||||
|
i - n_images, &buffer))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
flacenc->meta[entries] =
|
||||||
|
FLAC__metadata_object_new (FLAC__METADATA_TYPE_PICTURE);
|
||||||
|
|
||||||
|
caps = gst_buffer_get_caps (buffer);
|
||||||
|
structure = gst_caps_get_structure (caps, 0);
|
||||||
|
|
||||||
|
gst_structure_get (structure, "image-type", GST_TYPE_TAG_IMAGE_TYPE,
|
||||||
|
&image_type, NULL);
|
||||||
|
/* Convert to ID3v2 APIC image type */
|
||||||
|
if (image_type == GST_TAG_IMAGE_TYPE_NONE)
|
||||||
|
image_type = (i < n_images) ? 0x00 : 0x01;
|
||||||
|
else
|
||||||
|
image_type = image_type + 2;
|
||||||
|
|
||||||
|
FLAC__metadata_object_picture_set_data (flacenc->meta[entries],
|
||||||
|
GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), TRUE);
|
||||||
|
/* FIXME: There's no way to set the picture type in libFLAC */
|
||||||
|
flacenc->meta[entries]->data.picture.type = image_type;
|
||||||
|
FLAC__metadata_object_picture_set_mime_type (flacenc->meta[entries],
|
||||||
|
(char *) gst_structure_get_name (structure), TRUE);
|
||||||
|
|
||||||
|
gst_caps_unref (caps);
|
||||||
|
gst_buffer_unref (buffer);
|
||||||
|
entries++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (flacenc->seekpoints && total_samples != GST_CLOCK_TIME_NONE) {
|
if (flacenc->seekpoints && total_samples != GST_CLOCK_TIME_NONE) {
|
||||||
gboolean res;
|
gboolean res;
|
||||||
guint samples;
|
guint samples;
|
||||||
|
|
||||||
flacenc->meta[1] =
|
flacenc->meta[entries] =
|
||||||
FLAC__metadata_object_new (FLAC__METADATA_TYPE_SEEKTABLE);
|
FLAC__metadata_object_new (FLAC__METADATA_TYPE_SEEKTABLE);
|
||||||
if (flacenc->seekpoints > 0) {
|
if (flacenc->seekpoints > 0) {
|
||||||
res =
|
res =
|
||||||
FLAC__metadata_object_seektable_template_append_spaced_points
|
FLAC__metadata_object_seektable_template_append_spaced_points
|
||||||
(flacenc->meta[1], flacenc->seekpoints, total_samples);
|
(flacenc->meta[entries], flacenc->seekpoints, total_samples);
|
||||||
} else {
|
} else {
|
||||||
samples = -flacenc->seekpoints * flacenc->sample_rate;
|
samples = -flacenc->seekpoints * flacenc->sample_rate;
|
||||||
res =
|
res =
|
||||||
FLAC__metadata_object_seektable_template_append_spaced_points_by_samples
|
FLAC__metadata_object_seektable_template_append_spaced_points_by_samples
|
||||||
(flacenc->meta[1], samples, total_samples);
|
(flacenc->meta[entries], samples, total_samples);
|
||||||
}
|
}
|
||||||
if (!res) {
|
if (!res) {
|
||||||
GST_DEBUG_OBJECT (flacenc, "adding seekpoint template %d failed",
|
GST_DEBUG_OBJECT (flacenc, "adding seekpoint template %d failed",
|
||||||
flacenc->seekpoints);
|
flacenc->seekpoints);
|
||||||
FLAC__metadata_object_delete (flacenc->meta[1]);
|
FLAC__metadata_object_delete (flacenc->meta[1]);
|
||||||
flacenc->meta[1] = NULL;
|
flacenc->meta[entries] = NULL;
|
||||||
} else {
|
} else {
|
||||||
entries++;
|
entries++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue