X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fecdec_filter.c;h=13d4f7b22f6a46da75ef4b629275d603fc5f39d1;hp=fb2dba025d37806b2b70bd8f8002cae09e3e4db8;hb=3622134825eb94882a8e99acc0ee1889fc0169d6;hpb=a24d175e6d093d6d9f6e583c3026e45924bad621 diff --git a/fecdec_filter.c b/fecdec_filter.c index fb2dba02..13d4f7b2 100644 --- a/fecdec_filter.c +++ b/fecdec_filter.c @@ -1,19 +1,13 @@ -/* - * Copyright (C) 2009-2011 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ +/* Copyright (C) 2009 Andre Noll , see file COPYING. */ /** \file fecdec_filter.c A filter that fec-decodes an audio stream. */ #include -#include #include "para.h" #include "error.h" #include "list.h" #include "sched.h" -#include "ggo.h" #include "buffer_tree.h" #include "filter.h" #include "string.h" @@ -48,7 +42,7 @@ struct fec_header { uint16_t slice_bytes; /** Non-zero if this group is the beginning of the stream. */ uint8_t bos; - /** Non-zero if this stream embedds audio headers into fec groups. */ + /** Non-zero if this stream embeds audio headers into fec groups. */ uint8_t header_stream; }; @@ -172,7 +166,7 @@ static struct fecdec_group *free_oldest_group(struct private_fecdec_data *pfd) oldest = fg; } if (!group_complete(oldest) && !group_empty(oldest)) - PARA_WARNING_LOG("Clearing incomplete group %d " + PARA_WARNING_LOG("Clearing incomplete group %u " "(contains %d slices)\n", oldest->h.group_num, oldest->num_received_slices); if (oldest == pfd->first_complete_group) @@ -225,7 +219,7 @@ static int add_slice(char *buf, struct fecdec_group *fg) uint8_t slice_num = fg->h.slice_num; if (group_complete(fg)) { - PARA_DEBUG_LOG("group %d complete, ignoring slice %d\n", + PARA_DEBUG_LOG("group %u complete, ignoring slice %d\n", fg->h.group_num, slice_num); return 0; } @@ -237,7 +231,7 @@ static int add_slice(char *buf, struct fecdec_group *fg) r = fg->num_received_slices; /* Check if we already have this slice. */ if (test_and_set_slice_bit(fg, slice_num)) { - PARA_INFO_LOG("ignoring duplicate slice %d:%d\n", fg->h.group_num, + PARA_INFO_LOG("ignoring duplicate slice %u:%d\n", fg->h.group_num, slice_num); return 0; } @@ -291,13 +285,13 @@ static int decode_group(struct fecdec_group *fg, struct filter_node *fn) size_t written, need; struct private_fecdec_data *pfd = fn->private_data; enum fec_group_usability u = group_is_usable(fg, pfd); - char *buf = NULL, *p; + char *buf = NULL; if (u == FEC_GROUP_UNUSABLE) { - PARA_INFO_LOG("dropping unusable group %d\n", fg->h.group_num); + PARA_INFO_LOG("dropping unusable group %u\n", fg->h.group_num); return 0; } - PARA_DEBUG_LOG("decoding group %d (%d slices)\n", fg->h.group_num, + PARA_DEBUG_LOG("decoding group %u (%d slices)\n", fg->h.group_num, fg->h.data_slices_per_group); ret = fec_decode(pfd->fec, fg->data, fg->idx, sb); if (ret < 0) @@ -308,14 +302,13 @@ static int decode_group(struct fecdec_group *fg, struct filter_node *fn) i = DIV_ROUND_UP(fg->h.audio_header_size, fg->h.slice_bytes); PARA_DEBUG_LOG("skipping %d header slices\n", i); } - PARA_DEBUG_LOG("writing group %d (%d/%d decoded data bytes)\n", + PARA_DEBUG_LOG("writing group %u (%u/%d decoded data bytes)\n", fg->h.group_num, fg->h.group_bytes, fg->h.data_slices_per_group * sb); need = (fg->h.data_slices_per_group - i) * sb; if (need > btr_pool_unused(pfd->btrp)) return -E_FECDEC_OVERRUN; btr_pool_get_buffer(pfd->btrp, &buf); - p = buf; if (u == FEC_GROUP_USABLE_WITH_HEADER) { PARA_INFO_LOG("writing audio file header\n"); written = 0; @@ -328,7 +321,6 @@ static int decode_group(struct fecdec_group *fg, struct filter_node *fn) btr_copy(fg->data[i], n, pfd->btrp, fn->btrn); written += n; } - p += written; } written = 0; for (; i < fg->h.data_slices_per_group; i++) { @@ -338,7 +330,6 @@ static int decode_group(struct fecdec_group *fg, struct filter_node *fn) btr_copy(fg->data[i], n, pfd->btrp, fn->btrn); written += n; } - p += written; return 0; } @@ -413,7 +404,7 @@ static int dispatch_slice(char *buf, size_t len, struct fec_header *h, ret = fec_new(k, n, &pfd->fec); if (ret < 0) return ret; - pfd->btrp = btr_pool_new("fecdec", 64 * 1024); + pfd->btrp = btr_pool_new("fecdec", 128 * 1024); /* decode and clear the first group */ ret = decode_group(pfd->first_complete_group, fn); if (ret < 0) @@ -440,9 +431,9 @@ static void fecdec_close(struct filter_node *fn) fn->private_data = NULL; } -static void fecdec_post_select(__a_unused struct sched *s, struct task *t) +static int fecdec_post_select(__a_unused struct sched *s, void *context) { - struct filter_node *fn = container_of(t, struct filter_node, task); + struct filter_node *fn = context; struct btr_node *btrn = fn->btrn; int ret; struct fec_header h; @@ -472,9 +463,9 @@ next_buffer: btr_consume(btrn, FEC_HEADER_SIZE + h.slice_bytes); goto next_buffer; out: - t->error = ret; if (ret < 0) - btr_remove_node(btrn); + btr_remove_node(&fn->btrn); + return ret; } static void fecdec_open(struct filter_node *fn) @@ -485,15 +476,9 @@ static void fecdec_open(struct filter_node *fn) fn->min_iqs = FEC_HEADER_SIZE; } -/** - * The init function of the fecdec filter. - * - * \param f Struct to initialize. - */ -void fecdec_filter_init(struct filter *f) -{ - f->close = fecdec_close; - f->open = fecdec_open; - f->pre_select = generic_filter_pre_select; - f->post_select = fecdec_post_select; -} +const struct filter lsg_filter_cmd_com_fecdec_user_data = { + .open = fecdec_open, + .pre_select = generic_filter_pre_select, + .post_select = fecdec_post_select, + .close = fecdec_close, +};