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.
This commit is contained in:
wm4 2014-12-22 12:53:51 +01:00
parent c912288e57
commit 1ef56e9d08
3 changed files with 34 additions and 1 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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);