Commit 6f9f7b1e authored by michael's avatar michael

iTunes metadata encoding support patch by (Patrice Bensoussan <patrice.bensoussan at free dot fr>)


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@3388 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 587bc053
...@@ -2,6 +2,7 @@ This file contains the name of the people who have contributed to ...@@ -2,6 +2,7 @@ This file contains the name of the people who have contributed to
ffmpeg. The names are sorted alphabetically. ffmpeg. The names are sorted alphabetically.
Fabrice Bellard Fabrice Bellard
Patrice Bensoussan
Alex Beregszaszi Alex Beregszaszi
BERO BERO
Mario Brito Mario Brito
......
...@@ -776,6 +776,219 @@ static int mov_write_mvhd_tag(ByteIOContext *pb, MOVContext *mov) ...@@ -776,6 +776,219 @@ static int mov_write_mvhd_tag(ByteIOContext *pb, MOVContext *mov)
return 0x6c; return 0x6c;
} }
static int mov_write_itunes_hdlr_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "hdlr");
put_be32(pb, 0);
put_be32(pb, 0);
put_tag(pb, "mdir");
put_tag(pb, "appl");
put_be32(pb, 0);
put_be32(pb, 0);
put_be16(pb, 0);
return updateSize(pb, pos);
}
/* helper function to write a data tag with the specified string as data */
static int mov_write_string_data_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s, const char *data)
{
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "data");
put_be32(pb, 1);
put_be32(pb, 0);
put_buffer(pb, data, strlen(data));
return updateSize(pb, pos);
}
/* iTunes name of the song/movie */
static int mov_write_nam_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int size = 0;
if ( s->title[0] ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "\251nam");
mov_write_string_data_tag(pb, mov, s, s->title);
size = updateSize(pb, pos);
}
return size;
}
/* iTunes name of the artist/performer */
static int mov_write_ART_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int size = 0;
if ( s->author[0] ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "\251ART");
// we use the author here as this is the only thing that we have...
mov_write_string_data_tag(pb, mov, s, s->author);
size = updateSize(pb, pos);
}
return size;
}
/* iTunes name of the writer */
static int mov_write_wrt_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int size = 0;
if ( s->author[0] ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "\251wrt");
mov_write_string_data_tag(pb, mov, s, s->author);
size = updateSize(pb, pos);
}
return size;
}
/* iTunes name of the album */
static int mov_write_alb_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int size = 0;
if ( s->album[0] ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "\251alb");
mov_write_string_data_tag(pb, mov, s, s->album);
size = updateSize(pb, pos);
}
return size;
}
/* iTunes year */
static int mov_write_day_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
char year[5];
int size = 0;
if ( s->year ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "\251day");
snprintf(year, 5, "%04d", s->year);
mov_write_string_data_tag(pb, mov, s, year);
size = updateSize(pb, pos);
}
return size;
}
/* iTunes tool used to create the file */
static int mov_write_too_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "\251too");
mov_write_string_data_tag(pb, mov, s, LIBAVFORMAT_IDENT);
return updateSize(pb, pos);
}
/* iTunes comment */
static int mov_write_cmt_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int size = 0;
if ( s->comment[0] ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "\251cmt");
mov_write_string_data_tag(pb, mov, s, s->comment);
size = updateSize(pb, pos);
}
return size;
}
/* iTunes custom genre */
static int mov_write_gen_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int size = 0;
if ( s->genre[0] ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "\251gen");
mov_write_string_data_tag(pb, mov, s, s->genre);
size = updateSize(pb, pos);
}
return size;
}
/* iTunes track number */
static int mov_write_trkn_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int size = 0;
if ( s->track ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "trkn");
{
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "data");
put_be32(pb, 0); // 8 bytes empty
put_be32(pb, 0);
put_be16(pb, 0); // empty
put_be16(pb, s->track); // track number
put_be16(pb, 0); // total track number
put_be16(pb, 0); // empty
updateSize(pb, pos);
}
size = updateSize(pb, pos);
}
return size;
}
/* iTunes meta data list */
static int mov_write_ilst_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "ilst");
mov_write_nam_tag(pb, mov, s);
mov_write_ART_tag(pb, mov, s);
mov_write_wrt_tag(pb, mov, s);
mov_write_alb_tag(pb, mov, s);
mov_write_day_tag(pb, mov, s);
mov_write_too_tag(pb, mov, s);
mov_write_cmt_tag(pb, mov, s);
mov_write_gen_tag(pb, mov, s);
mov_write_trkn_tag(pb, mov, s);
return updateSize(pb, pos);
}
/* iTunes meta data tag */
static int mov_write_meta_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s)
{
int size = 0;
// only save meta tag if required
if ( s->title[0] || s->author[0] || s->album[0] || s->year ||
s->comment[0] || s->genre[0] || s->track ) {
int pos = url_ftell(pb);
put_be32(pb, 0); /* size */
put_tag(pb, "meta");
put_be32(pb, 0);
mov_write_itunes_hdlr_tag(pb, mov, s);
mov_write_ilst_tag(pb, mov, s);
size = updateSize(pb, pos);
}
return size;
}
static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov, static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov,
AVFormatContext *s) AVFormatContext *s)
{ {
...@@ -785,6 +998,9 @@ static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov, ...@@ -785,6 +998,9 @@ static int mov_write_udta_tag(ByteIOContext *pb, MOVContext* mov,
put_be32(pb, 0); /* size */ put_be32(pb, 0); /* size */
put_tag(pb, "udta"); put_tag(pb, "udta");
/* iTunes meta data */
mov_write_meta_tag(pb, mov, s);
/* Requirements */ /* Requirements */
for (i=0; i<MAX_STREAMS; i++) { for (i=0; i<MAX_STREAMS; i++) {
if(mov->tracks[i].entry <= 0) continue; if(mov->tracks[i].entry <= 0) continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment