summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-12-22 12:53:51 +0100
committerwm4 <wm4@nowhere>2014-12-22 12:53:51 +0100
commit1ef56e9d080103f0f40797cb65592710c9b91a5e (patch)
treed0a5a32b7afad6065678704fec9a18c15fff98bf /demux
parentc912288e57cde1aa5f70249c065b1c0a4cfef6ec (diff)
downloadmpv-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.
Diffstat (limited to 'demux')
-rw-r--r--demux/codec_tags.c17
-rw-r--r--demux/codec_tags.h2
-rw-r--r--demux/demux_mkv.c16
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);