return mov_write_string_tag(pb, name, t->value, lang, long_style);
}
-/* iTunes track number */
+/* iTunes bpm number */
+static int mov_write_tmpo_tag(AVIOContext *pb, AVFormatContext *s)
+{
+ AVDictionaryEntry *t = av_dict_get(s->metadata, "tmpo", NULL, 0);
+ int size = 0, tmpo = t ? atoi(t->value) : 0;
+ if (tmpo) {
+ size = 26;
+ avio_wb32(pb, size);
+ ffio_wfourcc(pb, "tmpo");
+ avio_wb32(pb, size-8); /* size */
+ ffio_wfourcc(pb, "data");
+ avio_wb32(pb, 0x15); //type specifier
+ avio_wb32(pb, 0);
+ avio_wb16(pb, tmpo); // data
+ }
+ return size;
+}
+
+ /* 3GPP TS 26.244 */
+ static int mov_write_loci_tag(AVFormatContext *s, AVIOContext *pb)
+ {
+ int lang;
+ int64_t pos = avio_tell(pb);
+ double latitude, longitude, altitude;
+ int32_t latitude_fix, longitude_fix, altitude_fix;
+ AVDictionaryEntry *t = get_metadata_lang(s, "location", &lang);
+ const char *ptr, *place = "";
+ char *end;
+ const char *astronomical_body = "earth";
+ if (!t)
+ return 0;
+
+ ptr = t->value;
+ longitude = strtod(ptr, &end);
+ if (end == ptr) {
+ av_log(s, AV_LOG_WARNING, "malformed location metadata\n");
+ return 0;
+ }
+ ptr = end;
+ latitude = strtod(ptr, &end);
+ if (end == ptr) {
+ av_log(s, AV_LOG_WARNING, "malformed location metadata\n");
+ return 0;
+ }
+ ptr = end;
+ altitude = strtod(ptr, &end);
+ /* If no altitude was present, the default 0 should be fine */
+ if (*end == '/')
+ place = end + 1;
+
+ latitude_fix = (int32_t) ((1 << 16) * latitude);
+ longitude_fix = (int32_t) ((1 << 16) * longitude);
+ altitude_fix = (int32_t) ((1 << 16) * altitude);
+
+ avio_wb32(pb, 0); /* size */
+ ffio_wfourcc(pb, "loci"); /* type */
+ avio_wb32(pb, 0); /* version + flags */
+ avio_wb16(pb, lang);
+ avio_write(pb, place, strlen(place) + 1);
+ avio_w8(pb, 0); /* role of place (0 == shooting location, 1 == real location, 2 == fictional location) */
+ avio_wb32(pb, latitude_fix);
+ avio_wb32(pb, longitude_fix);
+ avio_wb32(pb, altitude_fix);
+ avio_write(pb, astronomical_body, strlen(astronomical_body) + 1);
+ avio_w8(pb, 0); /* additional notes, null terminated string */
+
+ return update_size(pb, pos);
+ }
+
+/* iTunes track or disc number */
static int mov_write_trkn_tag(AVIOContext *pb, MOVMuxContext *mov,
- AVFormatContext *s)
+ AVFormatContext *s, int disc)
{
- AVDictionaryEntry *t = av_dict_get(s->metadata, "track", NULL, 0);
+ AVDictionaryEntry *t = av_dict_get(s->metadata,
+ disc ? "disc" : "track",
+ NULL, 0);
int size = 0, track = t ? atoi(t->value) : 0;
if (track) {
+ int tracks = 0;
+ char *slash = strchr(t->value, '/');
+ if (slash)
+ tracks = atoi(slash + 1);
avio_wb32(pb, 32); /* size */
- ffio_wfourcc(pb, "trkn");
+ ffio_wfourcc(pb, disc ? "disk" : "trkn");
avio_wb32(pb, 24); /* size */
ffio_wfourcc(pb, "data");
avio_wb32(pb, 0); // 8 bytes empty