summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2023-10-20 17:05:52 +0200
committersfan5 <sfan5@live.de>2023-10-21 11:07:59 +0200
commite8e1466426687620dcc7bf8990107b8e42cc105b (patch)
tree298ba015f92c59b696280ff3a87103aa645da570 /stream
parenta394e5cd1d36bddf8ef7437b2a5dd3560ecdd1fb (diff)
downloadmpv-e8e1466426687620dcc7bf8990107b8e42cc105b.tar.bz2
mpv-e8e1466426687620dcc7bf8990107b8e42cc105b.tar.xz
stream_dvb: use talloc
Diffstat (limited to 'stream')
-rw-r--r--stream/dvbin.h1
-rw-r--r--stream/stream_dvb.c98
2 files changed, 19 insertions, 80 deletions
diff --git a/stream/dvbin.h b/stream/dvbin.h
index 43acc9264b..ba7851669f 100644
--- a/stream/dvbin.h
+++ b/stream/dvbin.h
@@ -138,6 +138,5 @@ void dvb_update_config(stream_t *);
int dvb_parse_path(stream_t *);
int dvb_set_channel(stream_t *, unsigned int, unsigned int);
dvb_state_t *dvb_get_state(stream_t *);
-void dvb_free_state(dvb_state_t *);
#endif /* MPLAYER_DVBIN_H */
diff --git a/stream/stream_dvb.c b/stream/stream_dvb.c
index 5f27f0e4f7..21cc272511 100644
--- a/stream/stream_dvb.c
+++ b/stream/stream_dvb.c
@@ -43,8 +43,6 @@
#include <errno.h>
#include <pthread.h>
-#include <libavutil/avstring.h>
-
#include "osdep/io.h"
#include "misc/ctype.h"
#include "osdep/timer.h"
@@ -266,7 +264,7 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
int fields, cnt, k;
int has8192, has0;
- dvb_channel_t *ptr, *tmp, chn;
+ dvb_channel_t *ptr, chn;
char tmp_lcr[256], tmp_hier[256], inv[256], bw[256], cr[256], mod[256],
transm[256], gi[256], vpid_str[256], apid_str[256], tpid_str[256],
vdr_par_str[256], vdr_loc_str[256];
@@ -286,15 +284,8 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
return list;
}
- if (list == NULL) {
- list = malloc(sizeof(dvb_channels_list_t));
- if (list == NULL) {
- fclose(f);
- mp_verbose(log, "DVB_GET_CHANNELS: couldn't malloc enough memory\n");
- return NULL;
- }
- memset(list, 0x00, sizeof(dvb_channels_list_t));
- }
+ if (!list)
+ list = talloc_zero(NULL, dvb_channels_list_t);
ptr = &chn;
while (!feof(f)) {
@@ -319,10 +310,7 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
int channel_name_length = k;
if (bouquet_sep && bouquet_sep < colon)
channel_name_length = (bouquet_sep - line);
- ptr->name = malloc((channel_name_length + 1));
- if (!ptr->name)
- continue;
- av_strlcpy(ptr->name, line, (channel_name_length + 1));
+ ptr->name = talloc_strndup(list, line, channel_name_length);
} else {
continue;
}
@@ -702,48 +690,16 @@ static dvb_channels_list_t *dvb_get_channels(struct mp_log *log,
}
}
- tmp = realloc(list->channels, sizeof(dvb_channel_t) *
- (list->NUM_CHANNELS + 1));
- if (tmp == NULL)
- break;
-
- list->channels = tmp;
- memcpy(&(list->channels[list->NUM_CHANNELS]), ptr, sizeof(dvb_channel_t));
- list->NUM_CHANNELS++;
- if (sizeof(dvb_channel_t) * list->NUM_CHANNELS >= 1024 * 1024) {
- mp_verbose(log, "dvbin.c, > 1MB allocated for channels struct, "
- "dropping the rest of the file\n");
- break;
- }
+ MP_TARRAY_APPEND(list, list->channels, list->NUM_CHANNELS, *ptr);
}
fclose(f);
- if (list->NUM_CHANNELS == 0) {
- free(list->channels);
- free(list);
- return NULL;
- }
+ if (list->NUM_CHANNELS == 0)
+ TA_FREEP(&list);
return list;
}
-void dvb_free_state(dvb_state_t *state)
-{
- int i, j;
-
- for (i = 0; i < state->adapters_count; i++) {
- if (!state->adapters[i].list)
- continue;
- if (state->adapters[i].list->channels) {
- for (j = 0; j < state->adapters[i].list->NUM_CHANNELS; j++)
- free(state->adapters[i].list->channels[j].name);
- free(state->adapters[i].list->channels);
- }
- free(state->adapters[i].list);
- }
- free(state);
-}
-
static int dvb_streaming_read(stream_t *stream, void *buffer, int size)
{
struct pollfd pfds[1];
@@ -941,8 +897,7 @@ void dvbin_close(stream_t *stream)
state->cur_frontend = -1;
pthread_mutex_lock(&global_dvb_state_lock);
- dvb_free_state(state);
- global_dvb_state = NULL;
+ TA_FREEP(&global_dvb_state);
pthread_mutex_unlock(&global_dvb_state_lock);
}
@@ -1158,18 +1113,14 @@ dvb_state_t *dvb_get_state(stream_t *stream)
struct mp_log *log = stream->log;
struct mpv_global *global = stream->global;
dvb_priv_t *priv = stream->priv;
- unsigned int delsys, delsys_mask[MAX_FRONTENDS], size;
+ unsigned int delsys, delsys_mask[MAX_FRONTENDS];
char filename[PATH_MAX], *conf_file;
const char *conf_file_name;
void *talloc_ctx;
dvb_channels_list_t *list;
- dvb_adapter_config_t *adapters = NULL, *tmp;
dvb_state_t *state = NULL;
- state = malloc(sizeof(dvb_state_t));
- if (state == NULL)
- return NULL;
- memset(state, 0x00, sizeof(dvb_state_t));
+ state = talloc_zero(NULL, dvb_state_t);
state->switching_channel = false;
state->is_on = 0;
state->stream_used = true;
@@ -1253,30 +1204,19 @@ dvb_state_t *dvb_get_state(stream_t *stream)
if (list == NULL)
continue;
- size = sizeof(dvb_adapter_config_t) * (state->adapters_count + 1);
- tmp = realloc(state->adapters, size);
+ dvb_adapter_config_t tmp = {
+ .devno = i,
+ .list = talloc_steal(state, list),
+ };
+ memcpy(&tmp.delsys_mask, delsys_mask, sizeof(delsys_mask));
+
+ MP_TARRAY_APPEND(state, state->adapters, state->adapters_count, tmp);
- if (tmp == NULL) {
- mp_err(log, "DVB_CONFIG, can't realloc %d bytes, skipping\n",
- size);
- free(list);
- continue;
- }
- adapters = tmp;
-
- state->adapters = adapters;
- state->adapters[state->adapters_count].devno = i;
- memcpy(&state->adapters[state->adapters_count].delsys_mask,
- &delsys_mask, (sizeof(unsigned int) * MAX_FRONTENDS));
- state->adapters[state->adapters_count].list = list;
- state->adapters_count++;
mp_verbose(log, "Added adapter with channels to state list, contains %d adapters.\n", state->adapters_count);
}
- if (state->adapters_count == 0) {
- free(state);
- state = NULL;
- }
+ if (state->adapters_count == 0)
+ TA_FREEP(&state);
global_dvb_state = state;
return state;