---
 libavformat/mov.c |   74 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 74 insertions(+), 0 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 6baddeb..99f688a 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -126,6 +126,78 @@ static int mov_metadata_stik(MOVContext *c, AVIOContext 
*pb,
   return 0;
 }
 
+static int mov_metadata_gnre(MOVContext *c, AVIOContext *pb,
+                             unsigned len, const char *key)
+{
+const char * const mp4_genre_str[126] = {
+    [0] = "Blues", [1] = "Classic Rock", [2] = "Country",
+    [3] = "Dance", [4] = "Disco", [5] = "Funk", [6] = "Grunge",
+    [7] = "Hip-Hop", [8] = "Jazz", [9] = "Metal", [10] = "New Age",
+    [11] = "Oldies", [12] = "Other", [13] = "Pop", [14] = "R&B",
+    [15] = "Rap", [16] = "Reggae", [17] = "Rock", [18] = "Techno",
+    [19] = "Industrial", [20] = "Alternative", [21] = "Ska",
+    [22] = "Death Metal", [23] = "Pranks", [24] = "Soundtrack",
+    [25] = "Euro-Techno", [26] = "Ambient", [27] = "Trip-Hop",
+    [28] = "Vocal", [29] = "Jazz+Funk", [30] = "Fusion",
+    [31] = "Trance", [32] = "Classical", [33] = "Instrumental",
+    [34] = "Acid", [35] = "House", [36] = "Game", [37] = "Sound Clip",
+    [38] = "Gospel", [39] = "Noise", [40] = "AlternRock",
+    [41] = "Bass", [42] = "Soul", [43] = "Punk", [44] = "Space",
+    [45] = "Meditative", [46] = "Instrumental Pop",
+    [47] = "Instrumental Rock", [48] = "Ethnic", [49] = "Gothic",
+    [50] = "Darkwave", [51] = "Techno-Industrial",
+    [52] = "Electronic", [53] = "Pop-Folk", [54] = "Eurodance",
+    [55] = "Dream", [56] = "Southern Rock", [57] = "Comedy",
+    [58] = "Cult", [59] = "Gangsta", [60] = "Top 40",
+    [61] = "Christian Rap", [62] = "Pop/Funk", [63] = "Jungle",
+    [64] = "Native American", [65] = "Cabaret", [66] = "New Wave",
+    [67] = "Psychadelic", [68] = "Rave", [69] = "Showtunes",
+    [70] = "Trailer", [71] = "Lo-Fi", [72] = "Tribal",
+    [73] = "Acid Punk", [74] = "Acid Jazz", [75] = "Polka",
+    [76] = "Retro", [77] = "Musical", [78] = "Rock & Roll",
+    [79] = "Hard Rock", [80] = "Folk", [81] = "Folk-Rock",
+    [82] = "National Folk", [83] = "Swing", [84] = "Fast Fusion",
+    [85] = "Bebob", [86] = "Latin", [87] = "Revival",
+    [88] = "Celtic", [89] = "Bluegrass", [90] = "Avantgarde",
+    [91] = "Gothic Rock", [92] = "Progressive Rock",
+    [93] = "Psychedelic Rock", [94] = "Symphonic Rock",
+    [95] = "Slow Rock", [96] = "Big Band", [97] = "Chorus",
+    [98] = "Easy Listening", [99] = "Acoustic", [100] = "Humour",
+    [101] = "Speech", [102] = "Chanson", [103] = "Opera",
+    [104] = "Chamber Music", [105] = "Sonata", [106] = "Symphony",
+    [107] = "Booty Bass", [108] = "Primus", [109] = "Porn Groove",
+    [110] = "Satire", [111] = "Slow Jam", [112] = "Club",
+    [113] = "Tango", [114] = "Samba", [115] = "Folklore",
+    [116] = "Ballad", [117] = "Power Ballad", [118] = "Rhythmic Soul",
+    [119] = "Freestyle", [120] = "Duet", [121] = "Punk Rock",
+    [122] = "Drum Solo", [123]  = "A capella", [124] = "Euro-House",
+    [125] = "Dance Hall",
+// Apparently iTunes does not use the gnre atom
+// for the remaining few id3v1 tags. Adding them
+// in a commented form just for reference.
+//    [126] = "Goa", [127] = "Drum & Bass", [128] = "Club-House",
+//    [129] = "Hardcore", [130] = "Terror", [131] = "Indie",
+//    [132] = "BritPop", [133] = "Negerpunk", [134] = "Polsk Punk",
+//    [135] = "Beat", [136] = "Christian Gangsta", [137] = "Heavy Metal",
+//    [138] = "Black Metal", [139] = "Crossover",
+//    [140] = "Contemporary Christian",  [141] = "Christian Rock",
+//    [142] = "Merengue", [143] = "Salsa", [144] = "Thrash Metal",
+//    [145] = "Anime", [146] = "JPop", [147] = "SynthPop",
+};
+
+    char genre;
+    char buf[20];
+
+    avio_r8(pb); // unknown
+
+    genre = avio_r8(pb);
+    if (genre < 1 || genre > 126) { genre = 1; }       
+        snprintf(buf, sizeof(buf), "%s", mp4_genre_str[genre-1]);  
+    av_dict_set(&c->fc->metadata, key, buf, 0);       
+
+    return 0;
+}
+
 static const uint32_t mac_to_unicode[128] = {
     0x00C4,0x00C5,0x00C7,0x00C9,0x00D1,0x00D6,0x00DC,0x00E1,
     0x00E0,0x00E2,0x00E4,0x00E3,0x00E5,0x00E7,0x00E9,0x00E8,
@@ -187,6 +259,8 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext 
*pb, MOVAtom atom)
     case MKTAG(0xa9,'a','l','b'): key = "album";     break;
     case MKTAG(0xa9,'d','a','y'): key = "date";      break;
     case MKTAG(0xa9,'g','e','n'): key = "genre";     break;
+    case MKTAG( 'g','n','r','e'): key = "genre";
+        parse = mov_metadata_gnre; break;
     case MKTAG(0xa9,'t','o','o'):
     case MKTAG(0xa9,'s','w','r'): key = "encoder";   break;
     case MKTAG(0xa9,'e','n','c'): key = "encoder";   break;
-- 
1.7.5.4

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to