From d5902ad6a1c81d27cf2612b347eba82fa9ad34c3 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 28 Mar 2010 14:03:15 +0200 Subject: [PATCH 1/2] Add demux_info_add_len() function for non-terminated strings. Also change demuxer info to use talloc. demux_info_add is now a wrapper around demux_info_add_len. --- libmpdemux/demuxer.c | 30 ++++++++++++++++-------------- libmpdemux/demuxer.h | 6 ++++++ libmpdemux/ebml.h | 6 +----- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index df1dea6..e637a96 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -387,11 +387,6 @@ void free_demuxer(demuxer_t *demuxer) free_demuxer_stream(demuxer->video); free_demuxer_stream(demuxer->sub); skip_streamfree: - if (demuxer->info) { - for (i = 0; demuxer->info[i] != NULL; i++) - free(demuxer->info[i]); - free(demuxer->info); - } free(demuxer->filename); if (demuxer->teletext) teletext_control(demuxer->teletext, TV_VBI_CONTROL_STOP, NULL); @@ -1282,27 +1277,34 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param) { + return demux_info_add_len(demuxer, (struct bstr){opt, strlen(opt)}, + (struct bstr){param, strlen(param)}); +} + +int demux_info_add_len(demuxer_t *demuxer, struct bstr opt, struct bstr param) +{ char **info = demuxer->info; int n = 0; for (n = 0; info && info[2 * n] != NULL; n++) { - if (!strcasecmp(opt, info[2 * n])) { - if (!strcmp(param, info[2 * n + 1])) { - mp_msg(MSGT_DEMUX, MSGL_V, "Demuxer info %s set to unchanged value %s\n", opt, param); + if (!strncasecmp(opt.start, info[2 * n], opt.len)) { + if (!strncmp(param.start, info[2 * n + 1], param.len)) { + mp_msg(MSGT_DEMUX, MSGL_V, "Demuxer info %.*s set to unchanged value %.*s\n", + opt.len, opt.start, param.len, param.start); return 0; } - mp_tmsg(MSGT_DEMUX, MSGL_INFO, "Demuxer info %s changed to %s\n", opt, - param); + mp_tmsg(MSGT_DEMUX, MSGL_INFO, "Demuxer info %.*s changed to %.*s\n", + opt.len, opt.start, param.len, param.start); free(info[2 * n + 1]); - info[2 * n + 1] = strdup(param); + info[2 * n + 1] = talloc_strndup(demuxer->info, param.start, param.len); return 0; } } - info = demuxer->info = realloc(info, (2 * (n + 2)) * sizeof(char *)); - info[2 * n] = strdup(opt); - info[2 * n + 1] = strdup(param); + info = demuxer->info = talloc_realloc(demuxer, info, char *, 2 * (n + 2)); + info[2 * n] = talloc_strndup(demuxer->info, opt.start, opt.len); + info[2 * n + 1] = talloc_strndup(demuxer->info, param.start, param.len); memset(&info[2 * (n + 1)], 0, 2 * sizeof(char *)); return 1; diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index 1f16ea4..683caaf 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -278,6 +278,11 @@ typedef struct { int aid, vid, sid; //audio, video and subtitle id } demux_program_t; +struct bstr { + const uint8_t *start; + int len; +}; + static inline demux_packet_t* new_demux_packet(int len){ demux_packet_t* dp=(demux_packet_t*)malloc(sizeof(demux_packet_t)); dp->len=len; @@ -428,6 +433,7 @@ extern int pts_from_bps; extern int extension_parsing; int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param); +int demux_info_add_len(demuxer_t *demuxer, struct bstr opt, struct bstr param); char* demux_info_get(demuxer_t *demuxer, const char *opt); int demux_info_print(demuxer_t *demuxer); int demux_control(demuxer_t *demuxer, int cmd, void *arg); diff --git a/libmpdemux/ebml.h b/libmpdemux/ebml.h index b2fed46..ecdba75 100644 --- a/libmpdemux/ebml.h +++ b/libmpdemux/ebml.h @@ -24,6 +24,7 @@ #include #include "stream/stream.h" +#include "demuxer.h" /* EBML version supported */ @@ -62,11 +63,6 @@ struct ebml_parse_ctx { bool no_error_messages; }; -struct bstr { - uint8_t *start; - int len; -}; - #include "ebml_types.h" #define EBML_ID_INVALID 0xffffffff -- 1.7.0