mirror of https://github.com/mpv-player/mpv
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:
parent
c912288e57
commit
1ef56e9d08
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue