diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-01-26 03:31:31 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2010-01-27 14:26:48 +0200 |
commit | 49b80fe6b45dad5b04d3903987b287f957b94259 (patch) | |
tree | 7cf380b94c7750bb5d3fe60af3781d6efa3cee1c /libmpdemux | |
parent | 298808cddc40b66dde9578ec8abb71094357c3ce (diff) | |
download | mpv-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')
-rw-r--r-- | libmpdemux/demux_lavf.c | 6 | ||||
-rw-r--r-- | libmpdemux/demux_mkv.c | 5 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 57 | ||||
-rw-r--r-- | libmpdemux/demuxer.h | 9 |
4 files changed, 35 insertions, 42 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 622b87d45a..ad958889ed 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -408,8 +408,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) { } case CODEC_TYPE_ATTACHMENT:{ if (st->codec->codec_id == CODEC_ID_TTF) - demuxer_add_attachment(demuxer, st->filename, - "application/x-truetype-font", + demuxer_add_attachment(demuxer, st->filename, INT_MAX, + "application/x-truetype-font", INT_MAX, codec->extradata, codec->extradata_size); break; } @@ -489,7 +489,7 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000}); uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000}); t = av_metadata_get(c->metadata, "title", NULL, 0); - demuxer_add_chapter(demuxer, t ? t->value : NULL, start, end); + demuxer_add_chapter(demuxer, t ? t->value : NULL, INT_MAX, start, end); } for(i=0; i<avfc->nb_streams; i++) diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 6b7ed5a7b4..2fc0661da1 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -1199,7 +1199,7 @@ static int demux_mkv_read_chapters(struct demuxer *demuxer) cur_idx + 1, selected_edition); for (i = 0; i < num_selected_chapters; i++) - demuxer_add_chapter(demuxer, selected_chapters[i].name, + demuxer_add_chapter(demuxer, selected_chapters[i].name, INT_MAX, selected_chapters[i].start, selected_chapters[i].end); struct matroska_data *m = &demuxer->matroska_data; @@ -1298,7 +1298,8 @@ static int demux_mkv_read_attachments(demuxer_t *demuxer) len -= l + il; } - demuxer_add_attachment(demuxer, name, mime, data, data_size); + demuxer_add_attachment(demuxer, name, INT_MAX, mime, + INT_MAX, data, data_size); free(data); free(mime); free(name); 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++; } diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index 5da35efa03..375c0d0ccf 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -452,10 +452,11 @@ int demuxer_type_by_filename(char* filename); void demuxer_help(void); int get_demuxer_type_from_name(char *demuxer_name, int *force); -int demuxer_add_attachment(demuxer_t* demuxer, const char* name, - const char* type, const void* data, size_t size); - -int demuxer_add_chapter(demuxer_t* demuxer, const char* name, uint64_t start, uint64_t end); +int demuxer_add_attachment(demuxer_t *demuxer, const char *name, + int name_maxlen, const char *type, int type_maxlen, + const void *data, size_t size); +int demuxer_add_chapter(demuxer_t *demuxer, const char *name, int name_maxlen, + uint64_t start, uint64_t end); int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, double *seek_pts, char **chapter_name); |