/* Stop */
if (i)
i->mi_close_service(i, s);
+
+ /* Save some memory */
+ sbuf_free(&s->s_tsbuf);
}
/*
pktbuf_t *pb;
sbuf_t *sb = &t->s_tsbuf;
+ if (sb->sb_data == NULL)
+ sbuf_init_fixed(sb, TS_REMUX_BUFSIZE);
+
sbuf_append(sb, src, 188);
if(sb->sb_ptr < TS_REMUX_BUFSIZE)
service_set_streaming_status_flags((service_t*)t, TSS_PACKETS);
- sbuf_reset(sb);
+ sbuf_reset(sb, TS_REMUX_BUFSIZE);
}
/*
/* Payload unit start */
st->es_parser_state = 1;
st->es_parser_ptr = 0;
- sbuf_reset(&st->es_buf);
+ sbuf_reset(&st->es_buf, 4000);
}
if(st->es_parser_state == 0)
r = 1;
}
- assert(st->es_buf.sb_data != NULL);
-
if(r == 2) {
+ assert(st->es_buf.sb_data != NULL);
+
// Drop packet
st->es_buf.sb_ptr = st->es_startcode_offset;
if(r == 1) {
/* Reset packet parser upon length error or if parser
tells us so */
- sbuf_reset(&st->es_buf);
+ sbuf_reset_and_alloc(&st->es_buf, 256);
st->es_buf.sb_data[st->es_buf.sb_ptr++] = sc >> 24;
st->es_buf.sb_data[st->es_buf.sb_ptr++] = sc >> 16;
st->es_buf.sb_data[st->es_buf.sb_ptr++] = sc >> 8;
st->es_buf.sb_data[st->es_buf.sb_ptr++] = sc;
}
+ assert(st->es_buf.sb_data != NULL);
st->es_startcode = sc;
st->es_startcode_offset = st->es_buf.sb_ptr - 4;
}
pkt->pkt_payload = pktbuf_make(st->es_buf.sb_data,
st->es_buf.sb_ptr - 4);
pkt->pkt_duration = st->es_frame_duration;
+ sbuf_steal_data(&st->es_buf);
parser_deliver(t, st, pkt, st->es_buf.sb_err);
st->es_curpkt = NULL;
- st->es_buf.sb_data = malloc(st->es_buf.sb_size);
- if(st->es_buf.sb_data == NULL) {
- fprintf(stderr, "Unable to allocate %d bytes\n",
- st->es_buf.sb_size);
- abort();
- }
-
return 1;
}
break;
pkt->pkt_payload = pktbuf_make(st->es_buf.sb_data,
st->es_buf.sb_ptr - 4);
+ sbuf_steal_data(&st->es_buf);
parser_deliver(t, st, pkt, st->es_buf.sb_err);
st->es_curpkt = NULL;
- st->es_buf.sb_data = malloc(st->es_buf.sb_size);
st->es_curdts = PTS_UNSET;
st->es_curpts = PTS_UNSET;
if(start) {
/* Payload unit start */
st->es_parser_state = 1;
- sbuf_reset(&st->es_buf);
+ sbuf_reset(&st->es_buf, 4000);
}
if(st->es_parser_state == 0)
if(start) {
st->es_parser_state = 1;
st->es_parser_ptr = 0;
- sbuf_reset(&st->es_buf);
+ sbuf_reset(&st->es_buf, 4000);
}
if(st->es_parser_state == 0)
void sbuf_init(sbuf_t *sb);
+void sbuf_init_fixed(sbuf_t *sb, int len);
+
void sbuf_free(sbuf_t *sb);
-void sbuf_reset(sbuf_t *sb);
+void sbuf_reset(sbuf_t *sb, int max_len);
+
+void sbuf_reset_and_alloc(sbuf_t *sb, int len);
+
+static inline void sbuf_steal_data(sbuf_t *sb)
+{
+ sb->sb_data = NULL;
+ sb->sb_ptr = sb->sb_size = 0;
+}
+
+static inline void sbuf_err(sbuf_t *sb)
+{
+ sb->sb_err = 1;
+}
-void sbuf_err(sbuf_t *sb);
+void sbuf_alloc_(sbuf_t *sb, int len);
-void sbuf_alloc(sbuf_t *sb, int len);
+static inline void sbuf_alloc(sbuf_t *sb, int len)
+{
+ if (sb->sb_ptr + len >= sb->sb_size)
+ sbuf_alloc_(sb, len);
+}
void sbuf_append(sbuf_t *sb, const void *data, int len);
return 6;
}
+static void
+sbuf_alloc_fail(int len)
+{
+ fprintf(stderr, "Unable to allocate %d bytes\n", len);
+ abort();
+}
void
sbuf_init(sbuf_t *sb)
memset(sb, 0, sizeof(sbuf_t));
}
+void
+sbuf_init_fixed(sbuf_t *sb, int len)
+{
+ memset(sb, 0, sizeof(sbuf_t));
+ sb->sb_data = malloc(len);
+ if (sb->sb_data == NULL)
+ sbuf_alloc_fail(len);
+ sb->sb_size = len;
+}
void
sbuf_free(sbuf_t *sb)
{
- if(sb->sb_data)
- free(sb->sb_data);
+ free(sb->sb_data);
sb->sb_size = sb->sb_ptr = sb->sb_err = 0;
sb->sb_data = NULL;
}
void
-sbuf_reset(sbuf_t *sb)
+sbuf_reset(sbuf_t *sb, int max_len)
{
- sb->sb_ptr = 0;
- sb->sb_err = 0;
+ sb->sb_ptr = sb->sb_err = 0;
+ if (sb->sb_size > max_len) {
+ void *n = realloc(sb->sb_data, max_len);
+ if (n) {
+ sb->sb_data = n;
+ sb->sb_size = max_len;
+ }
+ }
}
void
-sbuf_err(sbuf_t *sb)
+sbuf_reset_and_alloc(sbuf_t *sb, int len)
{
- sb->sb_err = 1;
+ if (sb->sb_data) {
+ if (len != sb->sb_size) {
+ void *n = realloc(sb->sb_data, len);
+ if (n) {
+ sb->sb_data = n;
+ sb->sb_size = len;
+ }
+ }
+ } else {
+ sb->sb_data = malloc(len);
+ sb->sb_size = len;
+ }
+ if (sb->sb_data == NULL)
+ sbuf_alloc_fail(len);
+ sb->sb_ptr = sb->sb_err = 0;
}
void
-sbuf_alloc(sbuf_t *sb, int len)
+sbuf_alloc_(sbuf_t *sb, int len)
{
if(sb->sb_data == NULL) {
sb->sb_size = len * 4 > 4000 ? len * 4 : 4000;
sb->sb_data = malloc(sb->sb_size);
return;
- }
-
- if(sb->sb_ptr + len >= sb->sb_size) {
+ } else {
sb->sb_size += len * 4;
sb->sb_data = realloc(sb->sb_data, sb->sb_size);
}
-}
-
-static void
-sbuf_alloc1(sbuf_t *sb, int len)
-{
- if(sb->sb_data == NULL) {
- sb->sb_size = len * 4 > 4000 ? len * 4 : 4000;
- sb->sb_data = malloc(sb->sb_size);
- return;
- }
- sb->sb_size += len * 4;
- sb->sb_data = realloc(sb->sb_data, sb->sb_size);
+ if(sb->sb_data == NULL)
+ sbuf_alloc_fail(sb->sb_size);
}
void
sbuf_append(sbuf_t *sb, const void *data, int len)
{
- if(sb->sb_ptr + len >= sb->sb_size)
- sbuf_alloc1(sb, len);
+ sbuf_alloc(sb, len);
memcpy(sb->sb_data + sb->sb_ptr, data, len);
sb->sb_ptr += len;
}