#include <assert.h>
#define MOV_INDEX_CLUSTER_SIZE 16384
-#define globalTimescale 1000
+#define MOV_TIMESCALE 1000
#define MODE_MP4 0x01
#define MODE_MOV 0x02
typedef struct MOVIndex {
int mode;
int entry;
- long timescale;
- long time;
+ unsigned timescale;
+ uint64_t time;
int64_t trackDuration;
long sampleCount;
long sampleSize;
int nb_streams;
int64_t mdat_pos;
uint64_t mdat_size;
- long timescale;
MOVTrack *tracks;
} MOVMuxContext;
tag == MKTAG('t','e','x','t'))))
tag = ff_codec_get_tag(codec_ipod_tags, track->enc->codec_id);
- if (!match_ext(s->filename, "m4a") && !match_ext(s->filename, "m4v"))
+ if (!av_match_ext(s->filename, "m4a") && !av_match_ext(s->filename, "m4v"))
av_log(s, AV_LOG_WARNING, "Warning, extension is not .m4a nor .m4v "
"Quicktime/Ipod might not play the file\n");
static int mov_write_tkhd_tag(ByteIOContext *pb, MOVTrack *track, AVStream *st)
{
- int64_t duration = av_rescale_rnd(track->trackDuration, globalTimescale, track->timescale, AV_ROUND_UP);
+ int64_t duration = av_rescale_rnd(track->trackDuration, MOV_TIMESCALE,
+ track->timescale, AV_ROUND_UP);
int version = duration < INT32_MAX ? 0 : 1;
(version == 1) ? put_be32(pb, 104) : put_be32(pb, 92); /* size */
put_be32(pb, 0x0);
put_be32(pb, 0x1);
- put_be32(pb, av_rescale_rnd(track->trackDuration, globalTimescale, track->timescale, AV_ROUND_UP)); /* duration ... doesn't seem to effect psp */
+ /* duration ... doesn't seem to effect psp */
+ put_be32(pb, av_rescale_rnd(track->trackDuration, MOV_TIMESCALE,
+ track->timescale, AV_ROUND_UP));
put_be32(pb, track->cluster[0].cts); /* first pts is cts since dts is 0 */
put_be32(pb, 0x00010000);
for (i=0; i<mov->nb_streams; i++) {
if(mov->tracks[i].entry > 0) {
- maxTrackLenTemp = av_rescale_rnd(mov->tracks[i].trackDuration, globalTimescale, mov->tracks[i].timescale, AV_ROUND_UP);
+ maxTrackLenTemp = av_rescale_rnd(mov->tracks[i].trackDuration,
+ MOV_TIMESCALE,
+ mov->tracks[i].timescale,
+ AV_ROUND_UP);
if(maxTrackLen < maxTrackLenTemp)
maxTrackLen = maxTrackLenTemp;
if(maxTrackID < mov->tracks[i].trackID)
put_be32(pb, mov->time); /* creation time */
put_be32(pb, mov->time); /* modification time */
}
- put_be32(pb, mov->timescale); /* timescale */
+ put_be32(pb, MOV_TIMESCALE);
(version == 1) ? put_be64(pb, maxTrackLen) : put_be32(pb, maxTrackLen); /* duration of longest track */
put_be32(pb, 0x00010000); /* reserved (preferred rate) 1.0 = normal */
put_tag(pb, "ilst");
mov_write_string_metadata(s, pb, "\251nam", "title" , 1);
mov_write_string_metadata(s, pb, "\251ART", "author" , 1);
+ mov_write_string_metadata(s, pb, "aART", "album_artist", 1);
mov_write_string_metadata(s, pb, "\251wrt", "composer" , 1);
mov_write_string_metadata(s, pb, "\251alb", "album" , 1);
- mov_write_string_metadata(s, pb, "\251day", "year" , 1);
+ mov_write_string_metadata(s, pb, "\251day", "date" , 1);
mov_write_string_tag(pb, "\251too", LIBAVFORMAT_IDENT, 0, 1);
mov_write_string_metadata(s, pb, "\251cmt", "comment" , 1);
mov_write_string_metadata(s, pb, "\251gen", "genre" , 1);
mov_write_string_metadata(s, pb, "\251cpy", "copyright", 1);
+ mov_write_string_metadata(s, pb, "\251grp", "grouping" , 1);
+ mov_write_string_metadata(s, pb, "\251lyr", "lyrics" , 1);
mov_write_string_metadata(s, pb, "desc", "description",1);
mov_write_string_metadata(s, pb, "ldes", "synopsis" , 1);
mov_write_string_metadata(s, pb, "tvsh", "show" , 1);
put_be16(pb, language_code("eng")); /* language */
put_buffer(pb, t->value, strlen(t->value)+1); /* UTF8 string value */
if (!strcmp(tag, "albm") &&
- (t = av_metadata_get(s->metadata, "year", NULL, 0)))
+ (t = av_metadata_get(s->metadata, "date", NULL, 0)))
put_byte(pb, atoi(t->value));
}
return updateSize(pb, pos);
mov_write_3gp_udta_tag(pb_buf, s, "dscp", "comment");
mov_write_3gp_udta_tag(pb_buf, s, "albm", "album");
mov_write_3gp_udta_tag(pb_buf, s, "cprt", "copyright");
- mov_write_3gp_udta_tag(pb_buf, s, "yrrc", "year");
+ mov_write_3gp_udta_tag(pb_buf, s, "yrrc", "date");
} else if (mov->mode == MODE_MOV) { // the title field breaks gtkpod with mp4 and my suspicion is that stuff is not valid in mp4
mov_write_string_metadata(s, pb_buf, "\251nam", "title" , 0);
mov_write_string_metadata(s, pb_buf, "\251aut", "author" , 0);
mov_write_string_metadata(s, pb_buf, "\251alb", "album" , 0);
- mov_write_string_metadata(s, pb_buf, "\251day", "year" , 0);
+ mov_write_string_metadata(s, pb_buf, "\251day", "date" , 0);
mov_write_string_tag(pb_buf, "\251enc", LIBAVFORMAT_IDENT, 0, 0);
mov_write_string_metadata(s, pb_buf, "\251des", "comment" , 0);
mov_write_string_metadata(s, pb_buf, "\251gen", "genre" , 0);
int64_t pos = url_ftell(pb);
put_be32(pb, 0); /* size placeholder*/
put_tag(pb, "moov");
- mov->timescale = globalTimescale;
for (i=0; i<mov->nb_streams; i++) {
if(mov->tracks[i].entry <= 0) continue;
track->sampleSize = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels;
}
if (track->mode != MODE_MOV) {
- if (track->timescale > INT16_MAX) {
+ if (track->timescale > UINT16_MAX) {
av_log(s, AV_LOG_ERROR, "track %d: output format does not support "
"sample rate %dhz\n", i, track->timescale);
goto error;