diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-01-26 14:55:06 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-01-27 14:26:48 +0200 |
commit | 7ecafde34f206b713eb9ceb174415966ba30b64a (patch) | |
tree | c5a88349a8cebebe66f81ceaac30ba8d03cdf64c /libmpdemux/demux_mkv.c | |
parent | db41501f230f8f29c1c32584bc4d12dfc87ce498 (diff) | |
download | mpv-7ecafde34f206b713eb9ceb174415966ba30b64a.tar.bz2 mpv-7ecafde34f206b713eb9ceb174415966ba30b64a.tar.xz |
demux_mkv: use new EBML parser to read Video element
Diffstat (limited to 'libmpdemux/demux_mkv.c')
-rw-r--r-- | libmpdemux/demux_mkv.c | 94 |
1 files changed, 33 insertions, 61 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 3234171256..e2ae02080e 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -628,69 +628,41 @@ static int demux_mkv_read_trackaudio(demuxer_t *demuxer, mkv_track_t *track) static int demux_mkv_read_trackvideo(demuxer_t *demuxer, mkv_track_t *track) { stream_t *s = demuxer->stream; - uint64_t len, length, l; - uint64_t num; - double fnum; - int il; - - len = length = ebml_read_length(s, &il); - len += il; - while (length > 0) { - switch (ebml_read_id(s, &il)) { - case MATROSKA_ID_FRAMERATE: - fnum = ebml_read_float(s, &l); - if (fnum == EBML_FLOAT_INVALID) - return 0; - track->v_frate = fnum; - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n", - track->v_frate); - if (track->v_frate > 0) - track->default_duration = 1 / track->v_frate; - break; - - case MATROSKA_ID_DISPLAYWIDTH: - num = ebml_read_uint(s, &l); - if (num == EBML_UINT_INVALID) - return 0; - track->v_dwidth = num; - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n", - track->v_dwidth); - break; - - case MATROSKA_ID_DISPLAYHEIGHT: - num = ebml_read_uint(s, &l); - if (num == EBML_UINT_INVALID) - return 0; - track->v_dheight = num; - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n", - track->v_dheight); - break; - - case MATROSKA_ID_PIXELWIDTH: - num = ebml_read_uint(s, &l); - if (num == EBML_UINT_INVALID) - return 0; - track->v_width = num; - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n", - track->v_width); - break; - case MATROSKA_ID_PIXELHEIGHT: - num = ebml_read_uint(s, &l); - if (num == EBML_UINT_INVALID) - return 0; - track->v_height = num; - mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n", - track->v_height); - break; - - default: - ebml_read_skip(s, &l); - break; - } - length -= l + il; + struct ebml_video video = {}; + struct ebml_parse_ctx parse_ctx = {}; + if (ebml_read_element(s, &parse_ctx, &video, &ebml_video_desc) < 0) + return 0; + if (video.n_frame_rate) { + track->v_frate = video.frame_rate; + mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n", + track->v_frate); + // XXX default_duration should take priority + if (track->v_frate > 0) + track->default_duration = 1 / track->v_frate; } - return len; + if (video.n_display_width) { + track->v_dwidth = video.display_width; + mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n", + track->v_dwidth); + } + if (video.n_display_height) { + track->v_dheight = video.display_height; + mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n", + track->v_dheight); + } + if (video.n_pixel_width) { + track->v_width = video.pixel_width; + mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n", + track->v_width); + } + if (video.n_pixel_height) { + track->v_height = video.pixel_height; + mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n", + track->v_height); + } + talloc_free(parse_ctx.talloc_ctx); + return parse_ctx.bytes_read; } /** |