summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorBen Boeckel <mathstuf@gmail.com>2013-10-06 20:49:12 -0400
committerBen Boeckel <mathstuf@gmail.com>2013-10-07 22:40:39 -0400
commit07fbba3935e9d4327d3ae946b747486693d9d0f7 (patch)
tree010116fd240cbe7e628ebb6c341b1d1ac3d83db6 /demux
parentccdaecfc5cc53b6c6ca3f46ca37ff74a36eb58dd (diff)
downloadmpv-07fbba3935e9d4327d3ae946b747486693d9d0f7.tar.bz2
mpv-07fbba3935e9d4327d3ae946b747486693d9d0f7.tar.xz
matroska: store segment/edition uids in a single structure
To support edition references in matroska chapters, editions need to be remembered for each chapter and source. To facilitate easier management of these now-paired uids, a single structure is used.
Diffstat (limited to 'demux')
-rw-r--r--demux/demux.h14
-rw-r--r--demux/demux_mkv.c23
2 files changed, 26 insertions, 11 deletions
diff --git a/demux/demux.h b/demux/demux.h
index 1e0546a6d0..0c8f9cb3f8 100644
--- a/demux/demux.h
+++ b/demux/demux.h
@@ -128,14 +128,19 @@ typedef struct demux_chapter
uint64_t demuxer_id; // for mapping to internal demuxer data structures
} demux_chapter_t;
+struct matroska_segment_uid {
+ unsigned char segment[16];
+ uint64_t edition;
+};
+
struct matroska_data {
- unsigned char segment_uid[16];
+ struct matroska_segment_uid uid;
// Ordered chapter information if any
struct matroska_chapter {
uint64_t start;
uint64_t end;
bool has_segment_uid;
- unsigned char segment_uid[16];
+ struct matroska_segment_uid uid;
char *name;
} *ordered_chapters;
int num_ordered_chapters;
@@ -151,7 +156,7 @@ typedef struct demux_attachment
struct demuxer_params {
int matroska_num_wanted_uids;
- unsigned char (*matroska_wanted_uids)[16];
+ struct matroska_segment_uid *matroska_wanted_uids;
int matroska_wanted_segment;
bool *matroska_was_valid;
struct ass_library *ass_library;
@@ -301,4 +306,7 @@ void mp_tags_set_bstr(struct mp_tags *tags, bstr key, bstr value);
char *mp_tags_get_str(struct mp_tags *tags, const char *key);
char *mp_tags_get_bstr(struct mp_tags *tags, bstr key);
+bool demux_matroska_uid_cmp(struct matroska_segment_uid *a,
+ struct matroska_segment_uid *b);
+
#endif /* MPLAYER_DEMUXER_H */
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index bbbe88d903..9ca4e62ecb 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -377,24 +377,24 @@ static int demux_mkv_read_info(demuxer_t *demuxer)
}
if (info.n_segment_uid) {
int len = info.segment_uid.len;
- if (len != sizeof(demuxer->matroska_data.segment_uid)) {
+ if (len != sizeof(demuxer->matroska_data.uid.segment)) {
mp_msg(MSGT_DEMUX, MSGL_INFO,
"[mkv] segment uid invalid length %d\n", len);
} else {
- memcpy(demuxer->matroska_data.segment_uid, info.segment_uid.start,
+ memcpy(demuxer->matroska_data.uid.segment, info.segment_uid.start,
len);
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + segment uid");
for (int i = 0; i < len; i++)
mp_msg(MSGT_DEMUX, MSGL_V, " %02x",
- demuxer->matroska_data.segment_uid[i]);
+ demuxer->matroska_data.uid.segment[i]);
mp_msg(MSGT_DEMUX, MSGL_V, "\n");
}
}
if (demuxer->params && demuxer->params->matroska_wanted_uids) {
- unsigned char (*uids)[16] = demuxer->params->matroska_wanted_uids;
if (info.n_segment_uid) {
for (int i = 0; i < demuxer->params->matroska_num_wanted_uids; i++) {
- if (!memcmp(info.segment_uid.start, uids[i], 16))
+ struct matroska_segment_uid *uid = demuxer->params->matroska_wanted_uids + i;
+ if (!memcmp(info.segment_uid.start, uid->segment, 16))
goto out;
}
}
@@ -847,7 +847,7 @@ static int demux_mkv_read_chapters(struct demuxer *demuxer)
if (ca->n_chapter_segment_uid) {
chapter.has_segment_uid = true;
int len = ca->chapter_segment_uid.len;
- if (len != sizeof(chapter.segment_uid))
+ if (len != sizeof(chapter.uid.segment))
mp_msg(MSGT_DEMUX, warn_level,
"[mkv] Chapter segment uid bad length %d\n", len);
else if (ca->n_chapter_segment_edition_uid) {
@@ -855,12 +855,12 @@ static int demux_mkv_read_chapters(struct demuxer *demuxer)
"unsupported edition recursion in chapter; "
"will skip on playback!\n");
} else {
- memcpy(chapter.segment_uid, ca->chapter_segment_uid.start,
+ memcpy(chapter.uid.segment, ca->chapter_segment_uid.start,
len);
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Chapter segment uid ");
for (int n = 0; n < len; n++)
mp_msg(MSGT_DEMUX, MSGL_V, "%02x ",
- chapter.segment_uid[n]);
+ chapter.uid.segment[n]);
mp_msg(MSGT_DEMUX, MSGL_V, "\n");
}
}
@@ -2737,3 +2737,10 @@ const demuxer_desc_t demuxer_desc_matroska = {
.seek = demux_mkv_seek,
.control = demux_mkv_control
};
+
+bool demux_matroska_uid_cmp(struct matroska_segment_uid *a,
+ struct matroska_segment_uid *b)
+{
+ return (!memcmp(a->segment, b->segment, 16) &&
+ a->edition == b->edition);
+}