summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2010-01-25 19:42:37 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2010-01-27 14:26:48 +0200
commit8c0e224097ad01ad85841c62d493fd3033c2702e (patch)
tree549392231c6469971172187922762765015bb929 /libmpdemux
parent49b80fe6b45dad5b04d3903987b287f957b94259 (diff)
downloadmpv-8c0e224097ad01ad85841c62d493fd3033c2702e.tar.bz2
mpv-8c0e224097ad01ad85841c62d493fd3033c2702e.tar.xz
demux_mkv: use new EBML parser for attachment parsing
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_mkv.c101
1 files changed, 21 insertions, 80 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 2fc0661da1..2825e88453 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -1227,94 +1227,35 @@ static int demux_mkv_read_tags(demuxer_t *demuxer)
static int demux_mkv_read_attachments(demuxer_t *demuxer)
{
stream_t *s = demuxer->stream;
- uint64_t length, l;
- int il;
mp_msg(MSGT_DEMUX, MSGL_V,
"[mkv] /---- [ parsing attachments ] ---------\n");
- length = ebml_read_length(s, NULL);
-
- while (length > 0) {
- switch (ebml_read_id(s, &il)) {
- case MATROSKA_ID_ATTACHEDFILE:;
- uint64_t len;
- int i;
- char *name = NULL;
- char *mime = NULL;
- char *data = NULL;
- int data_size = 0;
-
- len = ebml_read_length(s, &i);
- l = len + i;
-
- mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + an attachment...\n");
-
- while (len > 0) {
- uint64_t l;
- int il;
- switch (ebml_read_id(s, &il)) {
- case MATROSKA_ID_FILENAME:
- free(name);
- name = ebml_read_utf8(s, &l);
- if (name == NULL)
- goto error;
- mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + FileName: %s\n",
- name);
- break;
-
- case MATROSKA_ID_FILEMIMETYPE:
- free(mime);
- mime = ebml_read_ascii(s, &l);
- if (mime == NULL)
- goto error;
- mp_msg(MSGT_DEMUX, MSGL_V,
- "[mkv] | + FileMimeType: %s\n", mime);
- break;
-
- case MATROSKA_ID_FILEDATA:;
- int x;
- uint64_t num = ebml_read_length(s, &x);
- l = x + num;
- free(data);
- data = malloc(num);
- if (stream_read(s, data, num) != (int) num) {
- error:
- free(data);
- free(mime);
- free(name);
- return 0;
- }
- data_size = num;
- mp_msg(MSGT_DEMUX, MSGL_V,
- "[mkv] | + FileData, length " "%u\n",
- data_size);
- break;
-
- default:
- ebml_read_skip(s, &l);
- break;
- }
- len -= l + il;
- }
-
- demuxer_add_attachment(demuxer, name, INT_MAX, mime,
- INT_MAX, data, data_size);
- free(data);
- free(mime);
- free(name);
- mp_msg(MSGT_DEMUX, MSGL_V,
- "[mkv] Attachment: %s, %s, %u bytes\n", name, mime,
- data_size);
- break;
+ struct ebml_attachments attachments = {};
+ struct ebml_parse_ctx parse_ctx = {};
+ if (ebml_read_element(s, &parse_ctx, &attachments,
+ &ebml_attachments_desc) < 0)
+ goto out;
- default:
- ebml_read_skip(s, &l);
- break;
+ for (int i = 0; i < attachments.n_attached_file; i++) {
+ struct ebml_attached_file *attachment = &attachments.attached_file[i];
+ if (!attachment->n_file_name || !attachment->n_file_mime_type
+ || !attachment->n_file_data) {
+ mp_msg(MSGT_DEMUX, MSGL_WARN, "[mkv] Malformed attachment\n");
+ continue;
}
- length -= l + il;
+ struct bstr name = attachment->file_name;
+ struct bstr mime = attachment->file_mime_type;
+ char *data = attachment->file_data.start;
+ int data_size = attachment->file_data.len;
+ demuxer_add_attachment(demuxer, name.start, name.len, mime.start,
+ mime.len, data, data_size);
+ mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Attachment: %.*s, %.*s, %u bytes\n",
+ name.len, name.start, mime.len, mime.start, data_size);
}
+ out:
+ talloc_free(parse_ctx.talloc_ctx);
mp_msg(MSGT_DEMUX, MSGL_V,
"[mkv] \\---- [ parsing attachments ] ---------\n");
return 0;