summaryrefslogtreecommitdiffstats
path: root/demux/demux_mkv.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-12-08 18:49:39 +0100
committerwm4 <wm4@nowhere>2014-12-08 18:52:32 +0100
commite40792c820fc9e6ecfc26061b231fa9b809ec96a (patch)
treea82c391d13250418a1e8db8568adb2b0afa35cf7 /demux/demux_mkv.c
parent6a88de05a79314cff6ee69160d0708e9d67b77ab (diff)
downloadmpv-e40792c820fc9e6ecfc26061b231fa9b809ec96a.tar.bz2
mpv-e40792c820fc9e6ecfc26061b231fa9b809ec96a.tar.xz
demux_mkv: support svq3
The most awesome codec, not. The actual code for svq3 is actually just the part that checks for MKV_V_QUICKTIME (no other QT-muxed codecs are supported). The rest is minor refactoring, that actually improves the code in general. This is just enough to support the 2 svq3-in-mkv sample files I have.
Diffstat (limited to 'demux/demux_mkv.c')
-rw-r--r--demux/demux_mkv.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index 2a0f5c08b3..2d3e98fcc3 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -1176,7 +1176,6 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track)
{
unsigned char *extradata = NULL;
unsigned int extradata_size = 0;
- bool raw = false;
struct sh_stream *sh = new_sh_stream(demuxer, STREAM_VIDEO);
if (!sh)
return 1;
@@ -1200,6 +1199,7 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track)
extradata = track->private_data + 40;
extradata_size = track->private_size - 40;
+ mp_set_codec_from_tag(sh);
} else {
sh_v->bits_per_coded_sample = 24;
@@ -1224,28 +1224,38 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track)
extradata_size = cnt + 8;
extradata = src - 8;
track->realmedia = 1;
+ mp_set_codec_from_tag(sh);
} else if (strcmp(track->codec_id, MKV_V_UNCOMPRESSED) == 0) {
// raw video, "like AVI" - this is a FourCC
sh->format = track->colorspace;
- raw = true;
+ sh->codec = "rawvideo";
+ } else if (strcmp(track->codec_id, MKV_V_QUICKTIME) == 0) {
+ uint32_t fourcc1 = 0, fourcc2 = 0;
+ if (track->private_size >= 8) {
+ fourcc1 = AV_RL32(track->private_data + 0);
+ fourcc2 = AV_RL32(track->private_data + 4);
+ }
+ if (fourcc1 == MP_FOURCC('S', 'V', 'Q', '3') ||
+ fourcc2 == MP_FOURCC('S', 'V', 'Q', '3'))
+ {
+ sh->codec = "svq3";
+ extradata = track->private_data;
+ extradata_size = track->private_size;
+ }
} else {
const videocodec_info_t *vi = vinfo;
while (vi->id && strcmp(vi->id, track->codec_id))
vi++;
- sh->format = vi->fourcc;
+ if (vi->id) {
+ sh->format = vi->fourcc;
+ mp_set_codec_from_tag(sh);
+ }
if (vi->extradata && track->private_data && track->private_size > 0)
{
extradata = track->private_data;
extradata_size = track->private_size;
}
track->parse = vi->parse;
- if (!vi->id) {
- MP_WARN(demuxer, "Unknown/unsupported "
- "CodecID (%s) or missing/bad CodecPrivate\n"
- "data (track %u).\n",
- track->codec_id, track->tnum);
- return 1;
- }
}
}
@@ -1258,10 +1268,10 @@ static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track)
sh_v->coded_height = track->v_height;
sh_v->extradata = talloc_memdup(sh_v, extradata, extradata_size);
sh_v->extradata_len = extradata_size;
- if (raw) {
- sh->codec = "rawvideo";
- } else {
- mp_set_codec_from_tag(sh);
+ if (!sh->codec) {
+ MP_WARN(demuxer, "Unknown/unsupported CodecID (%s) or missing/bad "
+ "CodecPrivate data (track %u).\n",
+ track->codec_id, track->tnum);
}
if (track->v_frate == 0.0)
track->v_frate = 25.0;