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");
|
mp_snprintf_cat(codec, sizeof(codec), is_be ? "be" : "le");
|
||||||
sh->codec = talloc_strdup(sh->audio, codec);
|
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,
|
void mp_set_pcm_codec(struct sh_stream *sh, bool sign, bool is_float, int bits,
|
||||||
bool is_be);
|
bool is_be);
|
||||||
|
|
||||||
|
const char *mp_map_mimetype_to_video_codec(const char *mimetype);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1123,7 +1123,20 @@ skip:
|
||||||
return 0;
|
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_video(demuxer_t *demuxer, mkv_track_t *track);
|
||||||
static int demux_mkv_open_audio(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);
|
process_tags(demuxer);
|
||||||
display_create_tracks(demuxer);
|
display_create_tracks(demuxer);
|
||||||
|
add_coverart(demuxer);
|
||||||
|
|
||||||
if (demuxer->opts->mkv_probe_duration)
|
if (demuxer->opts->mkv_probe_duration)
|
||||||
probe_last_timestamp(demuxer);
|
probe_last_timestamp(demuxer);
|
||||||
|
|
Loading…
Reference in New Issue