X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmov.c;h=fc1aaa8cf3f7c56e2e92da9b68555d6802642892;hb=82f0f0482ed67f32414df7791e26cc473cdcb3bb;hp=e18050a99f1df1e7cfa8803199e65d10573f84ed;hpb=d0b0fe6691fc67a95f985cad10d7e66c9bc23587;p=ffmpeg diff --git a/libavformat/mov.c b/libavformat/mov.c index e18050a99f1..fc1aaa8cf3f 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -27,8 +27,6 @@ #include #include -//#define MOV_EXPORT_ALL_METADATA - #include "libavutil/attributes.h" #include "libavutil/channel_layout.h" #include "libavutil/display.h" @@ -260,9 +258,7 @@ static int mov_metadata_loci(MOVContext *c, AVIOContext *pb, unsigned len) static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom) { -#ifdef MOV_EXPORT_ALL_METADATA char tmp_key[5]; -#endif char key2[32], language[4] = {0}; char *str = NULL; const char *key = NULL; @@ -271,57 +267,57 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom) int (*parse)(MOVContext*, AVIOContext*, unsigned, const char*) = NULL; switch (atom.type) { - case MKTAG(0xa9,'n','a','m'): key = "title"; break; - case MKTAG(0xa9,'a','u','t'): - case MKTAG(0xa9,'A','R','T'): key = "artist"; break; case MKTAG( 'a','A','R','T'): key = "album_artist"; break; - case MKTAG(0xa9,'w','r','t'): key = "composer"; break; case MKTAG( 'c','p','i','l'): key = "compilation"; parse = mov_metadata_int8_no_padding; break; - case MKTAG( 'c','p','r','t'): - case MKTAG(0xa9,'c','p','y'): key = "copyright"; break; - case MKTAG(0xa9,'g','r','p'): key = "grouping"; break; - case MKTAG(0xa9,'l','y','r'): key = "lyrics"; break; - case MKTAG(0xa9,'c','m','t'): - case MKTAG(0xa9,'i','n','f'): key = "comment"; break; - 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; - case MKTAG(0xa9,'m','a','k'): key = "make"; break; - case MKTAG(0xa9,'m','o','d'): key = "model"; break; - case MKTAG(0xa9,'x','y','z'): key = "location"; break; - case MKTAG( 'd','e','s','c'): key = "description";break; - case MKTAG( 'l','d','e','s'): key = "synopsis"; break; - case MKTAG( 't','v','s','h'): key = "show"; break; - case MKTAG( 't','v','e','n'): key = "episode_id";break; - case MKTAG( 't','v','n','n'): key = "network"; break; - case MKTAG( 't','r','k','n'): key = "track"; - parse = mov_metadata_track_or_disc_number; break; + case MKTAG( 'c','p','r','t'): key = "copyright"; break; + case MKTAG( 'd','e','s','c'): key = "description"; break; case MKTAG( 'd','i','s','k'): key = "disc"; parse = mov_metadata_track_or_disc_number; break; - case MKTAG( 't','v','e','s'): key = "episode_sort"; - parse = mov_metadata_int8_bypass_padding; break; - case MKTAG( 't','v','s','n'): key = "season_number"; - parse = mov_metadata_int8_bypass_padding; break; - case MKTAG( 's','t','i','k'): key = "media_type"; - parse = mov_metadata_int8_no_padding; break; + case MKTAG( 'g','n','r','e'): key = "genre"; + parse = mov_metadata_gnre; break; case MKTAG( 'h','d','v','d'): key = "hd_video"; parse = mov_metadata_int8_no_padding; break; + case MKTAG( 'l','d','e','s'): key = "synopsis"; break; + case MKTAG( 'l','o','c','i'): + return mov_metadata_loci(c, pb, atom.size); case MKTAG( 'p','g','a','p'): key = "gapless_playback"; parse = mov_metadata_int8_no_padding; break; case MKTAG( '@','P','R','M'): return mov_metadata_raw(c, pb, atom.size, "premiere_version"); case MKTAG( '@','P','R','Q'): return mov_metadata_raw(c, pb, atom.size, "quicktime_version"); - case MKTAG( 'l','o','c','i'): - return mov_metadata_loci(c, pb, atom.size); + case MKTAG( 's','t','i','k'): key = "media_type"; + parse = mov_metadata_int8_no_padding; break; + case MKTAG( 't','r','k','n'): key = "track"; + parse = mov_metadata_track_or_disc_number; break; + case MKTAG( 't','v','e','n'): key = "episode_id"; break; + case MKTAG( 't','v','e','s'): key = "episode_sort"; + parse = mov_metadata_int8_bypass_padding; break; + case MKTAG( 't','v','n','n'): key = "network"; break; + case MKTAG( 't','v','s','h'): key = "show"; break; + case MKTAG( 't','v','s','n'): key = "season_number"; + parse = mov_metadata_int8_bypass_padding; break; case MKTAG( 'X','M','P','_'): return mov_metadata_raw(c, pb, atom.size, "xmp"); + case MKTAG(0xa9,'A','R','T'): key = "artist"; break; + case MKTAG(0xa9,'a','l','b'): key = "album"; break; + case MKTAG(0xa9,'a','u','t'): key = "artist"; break; + case MKTAG(0xa9,'c','m','t'): key = "comment"; break; + case MKTAG(0xa9,'c','p','y'): key = "copyright"; break; + case MKTAG(0xa9,'d','a','y'): key = "date"; break; + case MKTAG(0xa9,'e','n','c'): key = "encoder"; break; + case MKTAG(0xa9,'g','e','n'): key = "genre"; break; + case MKTAG(0xa9,'g','r','p'): key = "grouping"; break; + case MKTAG(0xa9,'i','n','f'): key = "comment"; break; + case MKTAG(0xa9,'l','y','r'): key = "lyrics"; break; + case MKTAG(0xa9,'m','a','k'): key = "make"; break; + case MKTAG(0xa9,'m','o','d'): key = "model"; break; + case MKTAG(0xa9,'n','a','m'): key = "title"; break; + case MKTAG(0xa9,'s','w','r'): key = "encoder"; break; + case MKTAG(0xa9,'t','o','o'): key = "encoder"; break; + case MKTAG(0xa9,'w','r','t'): key = "composer"; break; + case MKTAG(0xa9,'x','y','z'): key = "location"; break; } if (c->itunes_metadata && atom.size > 8) { @@ -349,12 +345,10 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom) } else str_size = atom.size; -#ifdef MOV_EXPORT_ALL_METADATA - if (!key) { + if (c->export_all && !key) { snprintf(tmp_key, 5, "%.4s", (char*)&atom.type); key = tmp_key; } -#endif if (!key) return 0; @@ -391,7 +385,6 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom) key, str, (char*)&atom.type, str_size_alloc, atom.size); av_freep(&str); - return 0; } @@ -4199,7 +4192,9 @@ static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti return 0; } -static const AVOption options[] = { +#define OFFSET(x) offsetof(MOVContext, x) +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM +static const AVOption mov_options[] = { {"use_absolute_path", "allow using absolute path when opening alias, this is a possible security issue", offsetof(MOVContext, use_absolute_path), FF_OPT_TYPE_INT, {.i64 = 0}, @@ -4217,19 +4212,22 @@ static const AVOption options[] = { AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_DECODING_PARAM, "use_mfra_for" }, {"pts", "pts", 0, AV_OPT_TYPE_CONST, {.i64 = FF_MOV_FLAG_MFRA_PTS}, 0, 0, AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_DECODING_PARAM, "use_mfra_for" }, - {NULL} + { "export_all", "Export unrecognized metadata entries", OFFSET(export_all), + AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, .flags = FLAGS }, + { NULL }, }; static const AVClass mov_class = { .class_name = "mov,mp4,m4a,3gp,3g2,mj2", .item_name = av_default_item_name, - .option = options, + .option = mov_options, .version = LIBAVUTIL_VERSION_INT, }; AVInputFormat ff_mov_demuxer = { .name = "mov,mp4,m4a,3gp,3g2,mj2", .long_name = NULL_IF_CONFIG_SMALL("QuickTime / MOV"), + .priv_class = &mov_class, .priv_data_size = sizeof(MOVContext), .extensions = "mov,mp4,m4a,3gp,3g2,mj2", .read_probe = mov_probe, @@ -4237,6 +4235,5 @@ AVInputFormat ff_mov_demuxer = { .read_packet = mov_read_packet, .read_close = mov_read_close, .read_seek = mov_read_seek, - .priv_class = &mov_class, .flags = AVFMT_NO_BYTE_SEEK, };