X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aacdec_filter.c;h=26d5f652c5d8fbd21933290d55cf0296118b9a17;hp=797e5b9cb168745087eb0b1303f7f0aba62b67bf;hb=a85b3b947174c64ce06b4d6e438677055bf3f1ae;hpb=597de66c60f58d1e659630e40b3cf67033b8ce3d diff --git a/aacdec_filter.c b/aacdec_filter.c index 797e5b9c..26d5f652 100644 --- a/aacdec_filter.c +++ b/aacdec_filter.c @@ -17,7 +17,6 @@ #include "portable_io.h" #include "list.h" #include "sched.h" -#include "ggo.h" #include "buffer_tree.h" #include "filter.h" #include "error.h" @@ -34,10 +33,8 @@ struct private_aacdec_data { /** the return value of aac_open */ NeAACDecHandle handle; - /** info about the currently decoded frame */ - NeAACDecFrameInfo frame_info; /** whether this instance of the aac decoder is already initialized */ - int initialized; + bool initialized; /** number of times the decoder returned an error */ unsigned error_count; /** number of bytes already consumed from the imput stream */ @@ -48,23 +45,6 @@ struct private_aacdec_data { unsigned int sample_rate; }; -/* - * Get a new libfaad decoder handle. - * - * \return The handle returned by NeAACDecOpen(). - */ -static NeAACDecHandle aac_open(void) -{ - NeAACDecHandle h = NeAACDecOpen(); - NeAACDecConfigurationPtr c = NeAACDecGetCurrentConfiguration(h); - - c->defObjectType = LC; - c->outputFormat = FAAD_FMT_16BIT; - c->downMatrix = 0; - NeAACDecSetConfiguration(h, c); - return h; -} - static int aacdec_execute(struct btr_node *btrn, const char *cmd, char **result) { struct filter_node *fn = btr_context(btrn); @@ -75,11 +55,18 @@ static int aacdec_execute(struct btr_node *btrn, const char *cmd, char **result) static void aacdec_open(struct filter_node *fn) { + NeAACDecConfigurationPtr c; struct private_aacdec_data *padd = para_calloc(sizeof(*padd)); + padd->handle = NeAACDecOpen(); + c = NeAACDecGetCurrentConfiguration(padd->handle); + c->defObjectType = LC; + c->outputFormat = FAAD_FMT_16BIT; + c->downMatrix = 0; + NeAACDecSetConfiguration(padd->handle, c); + fn->private_data = padd; fn->min_iqs = 2048; - padd->handle = aac_open(); } static void aacdec_close(struct filter_node *fn) @@ -98,7 +85,8 @@ static int aacdec_post_select(__a_unused struct sched *s, void *context) struct private_aacdec_data *padd = fn->private_data; int i, ret; char *inbuf, *outbuf, *btrbuf; - size_t len, consumed, loaded; + size_t len, consumed, loaded = 0; + NeAACDecFrameInfo frame_info; next_buffer: ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL); @@ -125,16 +113,16 @@ next_buffer: padd->channels = channels; PARA_INFO_LOG("rate: %u, channels: %u\n", padd->sample_rate, padd->channels); - padd->initialized = 1; + padd->initialized = true; } if (consumed >= len) goto success; //PARA_CRIT_LOG("consumed: %zu (%zu + %zu), have: %zu\n", padd->consumed_total + consumed, // padd->consumed_total, consumed, len - consumed); - outbuf = NeAACDecDecode(padd->handle, &padd->frame_info, + outbuf = NeAACDecDecode(padd->handle, &frame_info, (unsigned char *)inbuf + consumed, len - consumed); - if (padd->frame_info.error) { - int err = padd->frame_info.error; + if (frame_info.error) { + int err = frame_info.error; ret = -E_AAC_DECODE; if (padd->error_count++ > MAX_ERRORS) goto err; @@ -143,18 +131,17 @@ next_buffer: PARA_NOTICE_LOG("consumed (total, buffer, frame): " "%zu, %zu, %lu\n", padd->consumed_total, consumed, - padd->frame_info.bytesconsumed); + frame_info.bytesconsumed); consumed++; /* just eat one byte and hope for the best */ goto success; } padd->error_count = 0; - //PARA_CRIT_LOG("decoder ate %lu\n", padd->frame_info.bytesconsumed); - consumed += padd->frame_info.bytesconsumed; - if (!padd->frame_info.samples) + //PARA_CRIT_LOG("decoder ate %lu\n", frame_info.bytesconsumed); + consumed += frame_info.bytesconsumed; + if (!frame_info.samples) goto success; - btrbuf = para_malloc(2 * padd->frame_info.samples); - loaded = 0; - for (i = 0; i < padd->frame_info.samples; i++) { + btrbuf = para_malloc(2 * frame_info.samples); + for (i = 0; i < frame_info.samples; i++) { short sh = ((short *)outbuf)[i]; write_int16_host_endian(btrbuf + loaded, sh); loaded += 2; @@ -163,25 +150,19 @@ next_buffer: success: btr_consume(btrn, consumed); padd->consumed_total += consumed; - goto next_buffer; + if (loaded == 0) + goto next_buffer; + return 1; err: assert(ret < 0); btr_remove_node(&fn->btrn); return ret; } -/** - * The init function of the aacdec filter. - * - * \param f Pointer to the filter struct to initialize. - * - * \sa filter::init - */ -void aacdec_filter_init(struct filter *f) -{ - f->open = aacdec_open; - f->close = aacdec_close; - f->pre_select = generic_filter_pre_select; - f->post_select = aacdec_post_select; - f->execute = aacdec_execute; -} +const struct filter lsg_filter_cmd_com_aacdec_user_data = { + .open = aacdec_open, + .close = aacdec_close, + .pre_select = generic_filter_pre_select, + .post_select = aacdec_post_select, + .execute = aacdec_execute +};