summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demuxer.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2010-01-26 03:31:31 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2010-01-27 14:26:48 +0200
commit49b80fe6b45dad5b04d3903987b287f957b94259 (patch)
tree7cf380b94c7750bb5d3fe60af3781d6efa3cee1c /libmpdemux/demuxer.c
parent298808cddc40b66dde9578ec8abb71094357c3ce (diff)
downloadmpv-49b80fe6b45dad5b04d3903987b287f957b94259.tar.bz2
mpv-49b80fe6b45dad5b04d3903987b287f957b94259.tar.xz
demux: take chapter/attachment name strings without 0-termination
Change the demuxer_add_attachment() and demuxer_add_chapter() functions to take a length argument for various name strings, so those strings do not need to be 0-terminated. This will make it easier to directly pass demuxed data without first making a copy just to add 0-termination. Also allocate the struct demuxer data structures for attachments and chapters with talloc.
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r--libmpdemux/demuxer.c57
1 files changed, 24 insertions, 33 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 78c18e7640..a336940dfe 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -396,19 +396,6 @@ void free_demuxer(demuxer_t *demuxer)
free(demuxer->info);
}
free(demuxer->filename);
- if (demuxer->chapters) {
- for (i = 0; i < demuxer->num_chapters; i++)
- free(demuxer->chapters[i].name);
- free(demuxer->chapters);
- }
- if (demuxer->attachments) {
- for (i = 0; i < demuxer->num_attachments; i++) {
- free(demuxer->attachments[i].name);
- free(demuxer->attachments[i].type);
- free(demuxer->attachments[i].data);
- }
- free(demuxer->attachments);
- }
if (demuxer->teletext)
teletext_control(demuxer->teletext, TV_VBI_CONTROL_STOP, NULL);
talloc_free(demuxer);
@@ -1432,41 +1419,45 @@ int demuxer_switch_video(demuxer_t *demuxer, int index)
}
int demuxer_add_attachment(demuxer_t *demuxer, const char *name,
- const char *type, const void *data, size_t size)
+ int name_maxlen, const char *type, int type_maxlen,
+ const void *data, size_t size)
{
- if (!(demuxer->num_attachments & 31))
- demuxer->attachments = realloc(demuxer->attachments,
- (demuxer->num_attachments + 32) * sizeof(demux_attachment_t));
-
- demuxer->attachments[demuxer->num_attachments].name = strdup(name);
- demuxer->attachments[demuxer->num_attachments].type = strdup(type);
- demuxer->attachments[demuxer->num_attachments].data = malloc(size);
- memcpy(demuxer->attachments[demuxer->num_attachments].data, data, size);
- demuxer->attachments[demuxer->num_attachments].data_size = size;
+ if (!(demuxer->num_attachments % 32))
+ demuxer->attachments = talloc_realloc(demuxer, demuxer->attachments,
+ struct demux_attachment,
+ demuxer->num_attachments + 32);
+
+ struct demux_attachment *att =
+ demuxer->attachments + demuxer->num_attachments;
+ att->name = talloc_strndup(demuxer->attachments, name, name_maxlen);
+ att->type = talloc_strndup(demuxer->attachments, type, type_maxlen);
+ att->data = talloc_size(demuxer->attachments, size);
+ memcpy(att->data, data, size);
+ att->data_size = size;
return demuxer->num_attachments++;
}
-int demuxer_add_chapter(demuxer_t *demuxer, const char *name, uint64_t start,
- uint64_t end)
+int demuxer_add_chapter(demuxer_t *demuxer, const char *name, int name_maxlen,
+ uint64_t start, uint64_t end)
{
- if (demuxer->chapters == NULL)
- demuxer->chapters = malloc(32 * sizeof(*demuxer->chapters));
- else if (!(demuxer->num_chapters % 32))
- demuxer->chapters = realloc(demuxer->chapters,
- (demuxer->num_chapters + 32) *
- sizeof(*demuxer->chapters));
+ if (!(demuxer->num_chapters % 32))
+ demuxer->chapters = talloc_realloc(demuxer, demuxer->chapters,
+ struct demux_chapter,
+ demuxer->num_chapters + 32);
demuxer->chapters[demuxer->num_chapters].start = start;
demuxer->chapters[demuxer->num_chapters].end = end;
- demuxer->chapters[demuxer->num_chapters].name = strdup(name ? name : mp_gtext("unknown"));
+ demuxer->chapters[demuxer->num_chapters].name = name ?
+ talloc_strndup(demuxer->chapters, name, name_maxlen) :
+ talloc_strdup(demuxer->chapters, mp_gtext("unknown"));
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_ID=%d\n", demuxer->num_chapters);
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_START=%"PRIu64"\n", demuxer->num_chapters, start);
if (end)
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_END=%"PRIu64"\n", demuxer->num_chapters, end);
if (name)
- mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_NAME=%s\n", demuxer->num_chapters, name);
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CHAPTER_%d_NAME=%.*s\n", demuxer->num_chapters, name_maxlen, name);
return demuxer->num_chapters++;
}