rendered paste bodyFrom d5902ad6a1c81d27cf2612b347eba82fa9ad34c3 Mon Sep 17 00:00:00 2001From: Anton Khirnov <wyskas@gmail.com>Date: Sun, 28 Mar 2010 14:03:15 +0200Subject: [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.cindex 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.hindex 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.hindex b2fed46..ecdba75 100644--- a/libmpdemux/ebml.h+++ b/libmpdemux/ebml.h@@ -24,6 +24,7 @@ #include <stdbool.h> #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