diff options
author | wm4 <wm4@nowhere> | 2014-12-22 12:53:51 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-12-22 12:53:51 +0100 |
commit | 1ef56e9d080103f0f40797cb65592710c9b91a5e (patch) | |
tree | d0a5a32b7afad6065678704fec9a18c15fff98bf | |
parent | c912288e57cde1aa5f70249c065b1c0a4cfef6ec (diff) | |
download | mpv-1ef56e9d080103f0f40797cb65592710c9b91a5e.tar.bz2 mpv-1ef56e9d080103f0f40797cb65592710c9b91a5e.tar.xz |
demux_mkv: support embedded coverart
The code could as well be in demux.c, but it's better to avoid
accidental clashes with demux_lavf.c.
FFmpeg provides no way yet to map a mime type to a codec, so do it
manually. (It _can_ map a mime type to an "input format", but not a
codec.)
Fixes #1374.
-rw-r--r-- | demux/codec_tags.c | 17 | ||||
-rw-r--r-- | demux/codec_tags.h | 2 | ||||
-rw-r--r-- | demux/demux_mkv.c | 16 |
3 files changed, 34 insertions, 1 deletions
diff --git a/demux/codec_tags.c b/demux/codec_tags.c index ba99380b67..fd95f83363 100644 --- a/demux/codec_tags.c +++ b/demux/codec_tags.c @@ -141,3 +141,20 @@ void mp_set_pcm_codec(struct sh_stream *sh, bool sign, bool is_float, int bits, mp_snprintf_cat(codec, sizeof(codec), is_be ? "be" : "le"); sh->codec = talloc_strdup(sh->audio, codec); } + +static const char *const mimetype_to_codec[][2] = { + {"image/jpeg", "mjpeg"}, + {"image/png", "png"}, + {0} +}; + +const char *mp_map_mimetype_to_video_codec(const char *mimetype) +{ + if (mimetype) { + for (int n = 0; mimetype_to_codec[n][0]; n++) { + if (strcmp(mimetype_to_codec[n][0], mimetype) == 0) + return mimetype_to_codec[n][1]; + } + } + return NULL; +} diff --git a/demux/codec_tags.h b/demux/codec_tags.h index c31e389e98..3489f0da5c 100644 --- a/demux/codec_tags.h +++ b/demux/codec_tags.h @@ -28,4 +28,6 @@ void mp_set_codec_from_tag(struct sh_stream *sh); void mp_set_pcm_codec(struct sh_stream *sh, bool sign, bool is_float, int bits, bool is_be); +const char *mp_map_mimetype_to_video_codec(const char *mimetype); + #endif diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 2d3e98fcc3..c3996e85fc 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1123,7 +1123,20 @@ skip: return 0; } - +static void add_coverart(struct demuxer *demuxer) +{ + for (int n = 0; n < demuxer->num_attachments; n++) { + struct demux_attachment *att = &demuxer->attachments[n]; + const char *codec = mp_map_mimetype_to_video_codec(att->type); + if (!codec) + continue; + struct sh_stream *sh = new_sh_stream(demuxer, STREAM_VIDEO); + if (!sh) + break; + sh->codec = codec; + sh->attached_picture = new_demux_packet_from(att->data, att->data_size); + } +} static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track); static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track); @@ -1831,6 +1844,7 @@ static int demux_mkv_open(demuxer_t *demuxer, enum demux_check check) process_tags(demuxer); display_create_tracks(demuxer); + add_coverart(demuxer); if (demuxer->opts->mkv_probe_duration) probe_last_timestamp(demuxer); |