mirror of
https://github.com/mpv-player/mpv
synced 2025-02-20 14:56:55 +00:00
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.
This commit is contained in:
parent
298808cddc
commit
49b80fe6b4
@ -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++)
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
if (!(demuxer->num_attachments % 32))
|
||||
demuxer->attachments = talloc_realloc(demuxer, demuxer->attachments,
|
||||
struct demux_attachment,
|
||||
demuxer->num_attachments + 32);
|
||||
|
||||
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;
|
||||
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++;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user