00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "libavutil/dict.h"
00023 #include "avio_internal.h"
00024 #include "avformat.h"
00025 #include "apetag.h"
00026
00027 static int string_is_ascii(const uint8_t *str)
00028 {
00029 while (*str && *str >= 0x20 && *str <= 0x7e ) str++;
00030 return !*str;
00031 }
00032
00033 void ff_ape_write(AVFormatContext *s)
00034 {
00035 int64_t tag_bytes;
00036 AVDictionaryEntry *t = NULL;
00037 AVIOContext *pb = s->pb;
00038 int tags = 0, vlen;
00039
00040 tag_bytes = avio_tell(s->pb);
00041 while ((t = av_dict_get(s->metadata, "", t, AV_DICT_IGNORE_SUFFIX))) {
00042 if (!string_is_ascii(t->key)) {
00043 av_log(s, AV_LOG_WARNING, "Non ASCII keys are not allowed\n");
00044 continue;
00045 }
00046
00047 vlen = strlen(t->value);
00048 avio_wl32(pb, vlen + 1);
00049 avio_wl32(pb, 0);
00050 avio_put_str(pb, t->key);
00051 avio_put_str(pb, t->value);
00052 tags++;
00053 }
00054 tag_bytes = avio_tell(s->pb) - tag_bytes;
00055
00056 if (!tags)
00057 return;
00058
00059 avio_write(pb, APE_TAG_PREAMBLE, 8);
00060 avio_wl32(pb, APE_TAG_VERSION);
00061 avio_wl32(pb, tag_bytes + APE_TAG_FOOTER_BYTES);
00062 avio_wl32(pb, tags);
00063 avio_wl32(pb, 0);
00064 ffio_fill(pb, 0, 8);
00065 }