diff options
Diffstat (limited to 'ext/tarkin/tarkin.c')
-rw-r--r-- | ext/tarkin/tarkin.c | 638 |
1 files changed, 318 insertions, 320 deletions
diff --git a/ext/tarkin/tarkin.c b/ext/tarkin/tarkin.c index 163fa87c..b15b5512 100644 --- a/ext/tarkin/tarkin.c +++ b/ext/tarkin/tarkin.c @@ -16,244 +16,249 @@ -TarkinStream* tarkin_stream_new () +TarkinStream * +tarkin_stream_new () { - TarkinStream *s = (TarkinStream*) CALLOC (1, sizeof(TarkinStream)); + TarkinStream *s = (TarkinStream *) CALLOC (1, sizeof (TarkinStream)); - if (!s) - return NULL; - memset(s,0,sizeof(*s)); + if (!s) + return NULL; + memset (s, 0, sizeof (*s)); - s->frames_per_buf = N_FRAMES; + s->frames_per_buf = N_FRAMES; - return s; + return s; } -void tarkin_stream_destroy (TarkinStream *s) +void +tarkin_stream_destroy (TarkinStream * s) { - uint32_t i, j; - - if (!s) - return; - - for (i=0; i<s->n_layers; i++) { - if (s->layer[i].waveletbuf) { - for (j=0; j<s->layer[i].n_comp; j++) { - wavelet_3d_buf_destroy (s->layer[i].waveletbuf[j]); - FREE (s->layer[i].packet[j].data); - } - FREE(s->layer[i].waveletbuf); - FREE(s->layer[i].packet); + uint32_t i, j; + + if (!s) + return; + + for (i = 0; i < s->n_layers; i++) { + if (s->layer[i].waveletbuf) { + for (j = 0; j < s->layer[i].n_comp; j++) { + wavelet_3d_buf_destroy (s->layer[i].waveletbuf[j]); + FREE (s->layer[i].packet[j].data); } - } - - if (s->layer) - FREE(s->layer); + FREE (s->layer[i].waveletbuf); + FREE (s->layer[i].packet); + } + } + + if (s->layer) + FREE (s->layer); - if (s->headers.header) - FREE(s->headers.header); + if (s->headers.header) + FREE (s->headers.header); - if (s->headers.header1) - FREE(s->headers.header1); + if (s->headers.header1) + FREE (s->headers.header1); - if (s->headers.header2) - FREE(s->headers.header2); + if (s->headers.header2) + FREE (s->headers.header2); - FREE(s); + FREE (s); } -int tarkin_analysis_init(TarkinStream *s, TarkinInfo *ti, - TarkinError (*free_frame)(void *s, void *ptr), - TarkinError (*packet_out)(void *s, ogg_packet *ptr), - void *user_ptr) +int +tarkin_analysis_init (TarkinStream * s, TarkinInfo * ti, + TarkinError (*free_frame) (void *s, void *ptr), + TarkinError (*packet_out) (void *s, ogg_packet * ptr), void *user_ptr) { - if((!ti->inter.numerator)||(!ti->inter.denominator))return (-TARKIN_FAULT); - if((!free_frame) || (!packet_out)) return (-TARKIN_FAULT); - s->ti = ti; - s->free_frame = free_frame; - s->packet_out = packet_out; - s->user_ptr = user_ptr; - return(0); + if ((!ti->inter.numerator) || (!ti->inter.denominator)) + return (-TARKIN_FAULT); + if ((!free_frame) || (!packet_out)) + return (-TARKIN_FAULT); + s->ti = ti; + s->free_frame = free_frame; + s->packet_out = packet_out; + s->user_ptr = user_ptr; + return (0); } -extern int tarkin_analysis_add_layer(TarkinStream *s, - TarkinVideoLayerDesc *tvld) +extern int +tarkin_analysis_add_layer (TarkinStream * s, TarkinVideoLayerDesc * tvld) { - int i; - TarkinVideoLayer *layer; - if(s->n_layers) { - s->layer = REALLOC(s->layer,(s->n_layers+1) * sizeof(*s->layer)); - } else { - s->layer = MALLOC(sizeof(*s->layer)); - } - layer = s->layer + s->n_layers; - memset(layer,0,sizeof(*s->layer)); - memcpy (&layer->desc , tvld, sizeof(TarkinVideoLayerDesc)); - - s->n_layers++; - s->ti->n_layers = s->n_layers; - s->ti->layer = s->layer; - - switch (layer->desc.format) { - case TARKIN_GRAYSCALE: - layer->n_comp = 1; - layer->color_fwd_xform = grayscale_to_y; - layer->color_inv_xform = y_to_grayscale; - break; - case TARKIN_RGB24: - layer->n_comp = 3; - layer->color_fwd_xform = rgb24_to_yuv; - layer->color_inv_xform = yuv_to_rgb24; - break; - case TARKIN_RGB32: - layer->n_comp = 3; - layer->color_fwd_xform = rgb32_to_yuv; - layer->color_inv_xform = yuv_to_rgb32; - break; - case TARKIN_RGBA: - layer->n_comp = 4; - layer->color_fwd_xform = rgba_to_yuv; - layer->color_inv_xform = yuv_to_rgba; - break; - default: - return -TARKIN_INVALID_COLOR_FORMAT; - }; - -#ifdef DBG_OGG - printf("dbg_ogg:add_layer %d with %d components\n", - s->n_layers, layer->n_comp); -#endif - - layer->waveletbuf = (Wavelet3DBuf**) CALLOC (layer->n_comp, - sizeof(Wavelet3DBuf*)); - - layer->packet = MALLOC (layer->n_comp * sizeof(*layer->packet)); - memset(layer->packet, 0, layer->n_comp * sizeof(*layer->packet)); - - for (i=0; i<layer->n_comp; i++){ - layer->waveletbuf[i] = wavelet_3d_buf_new (layer->desc.width, - layer->desc.height, - layer->desc.frames_per_buf); - layer->packet[i].data = MALLOC(layer->desc.bitstream_len); - layer->packet[i].storage = layer->desc.bitstream_len; - } - /* - max_bitstream_len += layer->desc.bitstream_len - + 2 * 10 * sizeof(uint32_t) * layer->n_comp; + int i; + TarkinVideoLayer *layer; + + if (s->n_layers) { + s->layer = REALLOC (s->layer, (s->n_layers + 1) * sizeof (*s->layer)); + } else { + s->layer = MALLOC (sizeof (*s->layer)); + } + layer = s->layer + s->n_layers; + memset (layer, 0, sizeof (*s->layer)); + memcpy (&layer->desc, tvld, sizeof (TarkinVideoLayerDesc)); + + s->n_layers++; + s->ti->n_layers = s->n_layers; + s->ti->layer = s->layer; + + switch (layer->desc.format) { + case TARKIN_GRAYSCALE: + layer->n_comp = 1; + layer->color_fwd_xform = grayscale_to_y; + layer->color_inv_xform = y_to_grayscale; + break; + case TARKIN_RGB24: + layer->n_comp = 3; + layer->color_fwd_xform = rgb24_to_yuv; + layer->color_inv_xform = yuv_to_rgb24; + break; + case TARKIN_RGB32: + layer->n_comp = 3; + layer->color_fwd_xform = rgb32_to_yuv; + layer->color_inv_xform = yuv_to_rgb32; + break; + case TARKIN_RGBA: + layer->n_comp = 4; + layer->color_fwd_xform = rgba_to_yuv; + layer->color_inv_xform = yuv_to_rgba; + break; + default: + return -TARKIN_INVALID_COLOR_FORMAT; + }; + +#ifdef DBG_OGG + printf ("dbg_ogg:add_layer %d with %d components\n", + s->n_layers, layer->n_comp); +#endif + + layer->waveletbuf = (Wavelet3DBuf **) CALLOC (layer->n_comp, + sizeof (Wavelet3DBuf *)); + + layer->packet = MALLOC (layer->n_comp * sizeof (*layer->packet)); + memset (layer->packet, 0, layer->n_comp * sizeof (*layer->packet)); + + for (i = 0; i < layer->n_comp; i++) { + layer->waveletbuf[i] = wavelet_3d_buf_new (layer->desc.width, + layer->desc.height, layer->desc.frames_per_buf); + layer->packet[i].data = MALLOC (layer->desc.bitstream_len); + layer->packet[i].storage = layer->desc.bitstream_len; + } + /* + max_bitstream_len += layer->desc.bitstream_len + + 2 * 10 * sizeof(uint32_t) * layer->n_comp; */ - return (TARKIN_OK); + return (TARKIN_OK); } -TarkinError _analysis_packetout(TarkinStream *s, uint32_t layer_id, - uint32_t comp) +TarkinError +_analysis_packetout (TarkinStream * s, uint32_t layer_id, uint32_t comp) { - ogg_packet op; - oggpack_buffer opb; - uint8_t *data; - uint32_t data_len; - int i; - data = s->layer[layer_id].packet[comp].data; - data_len = s->layer[layer_id].packet[comp].data_len; - - oggpack_writeinit(&opb); - oggpack_write(&opb,0,8); /* No feature flags for now */ - oggpack_write(&opb,layer_id,12); - oggpack_write(&opb,comp,12); - for(i=0;i<data_len;i++) - oggpack_write(&opb,*(data + i), 8); - - op.b_o_s = 0; - op.e_o_s = data_len?0:1; - op.granulepos = 0; - op.bytes = oggpack_bytes(&opb)+4; - op.packet = opb.buffer; + ogg_packet op; + oggpack_buffer opb; + uint8_t *data; + uint32_t data_len; + int i; + + data = s->layer[layer_id].packet[comp].data; + data_len = s->layer[layer_id].packet[comp].data_len; + + oggpack_writeinit (&opb); + oggpack_write (&opb, 0, 8); /* No feature flags for now */ + oggpack_write (&opb, layer_id, 12); + oggpack_write (&opb, comp, 12); + for (i = 0; i < data_len; i++) + oggpack_write (&opb, *(data + i), 8); + + op.b_o_s = 0; + op.e_o_s = data_len ? 0 : 1; + op.granulepos = 0; + op.bytes = oggpack_bytes (&opb) + 4; + op.packet = opb.buffer; #ifdef DBG_OGG - printf("dbg_ogg: writing packet layer %d, comp %d, data_len %d %s\n", - layer_id, comp, data_len, op.e_o_s?"eos":""); + printf ("dbg_ogg: writing packet layer %d, comp %d, data_len %d %s\n", + layer_id, comp, data_len, op.e_o_s ? "eos" : ""); #endif - s->layer[layer_id].packet[comp].data_len = 0; /* so direct call => eos */ - return(s->packet_out(s,&op)); + s->layer[layer_id].packet[comp].data_len = 0; /* so direct call => eos */ + return (s->packet_out (s, &op)); } -void _stream_flush (TarkinStream *s) +void +_stream_flush (TarkinStream * s) { - uint32_t i, j; + uint32_t i, j; - s->current_frame_in_buf=0; + s->current_frame_in_buf = 0; - for (i=0; i<s->n_layers; i++) { - TarkinVideoLayer *layer = &s->layer[i]; + for (i = 0; i < s->n_layers; i++) { + TarkinVideoLayer *layer = &s->layer[i]; - for (j=0; j<layer->n_comp; j++) { - uint32_t comp_bitstream_len; - TarkinPacket *packet = layer->packet + j; + for (j = 0; j < layer->n_comp; j++) { + uint32_t comp_bitstream_len; + TarkinPacket *packet = layer->packet + j; - /** + /** * implicit 6:1:1 subsampling */ - if (j == 0) - comp_bitstream_len = 6*layer->desc.bitstream_len/(layer->n_comp+5); - else - comp_bitstream_len = layer->desc.bitstream_len/(layer->n_comp+5); - - if(packet->storage < comp_bitstream_len) { - packet->storage = comp_bitstream_len; - packet->data = REALLOC (packet->data, comp_bitstream_len); - } - - wavelet_3d_buf_dump ("color-%d-%03d.pgm", - s->current_frame, j, - layer->waveletbuf[j], j == 0 ? 0 : 128); - - wavelet_3d_buf_fwd_xform (layer->waveletbuf[j], - layer->desc.a_moments, - layer->desc.s_moments); - - wavelet_3d_buf_dump ("coeff-%d-%03d.pgm", - s->current_frame, j, - layer->waveletbuf[j], 128); - - packet->data_len = wavelet_3d_buf_encode_coeff (layer->waveletbuf[j], - packet->data, - comp_bitstream_len); - - _analysis_packetout (s, i, j); + if (j == 0) + comp_bitstream_len = + 6 * layer->desc.bitstream_len / (layer->n_comp + 5); + else + comp_bitstream_len = layer->desc.bitstream_len / (layer->n_comp + 5); + + if (packet->storage < comp_bitstream_len) { + packet->storage = comp_bitstream_len; + packet->data = REALLOC (packet->data, comp_bitstream_len); } - } + + wavelet_3d_buf_dump ("color-%d-%03d.pgm", + s->current_frame, j, layer->waveletbuf[j], j == 0 ? 0 : 128); + + wavelet_3d_buf_fwd_xform (layer->waveletbuf[j], + layer->desc.a_moments, layer->desc.s_moments); + + wavelet_3d_buf_dump ("coeff-%d-%03d.pgm", + s->current_frame, j, layer->waveletbuf[j], 128); + + packet->data_len = wavelet_3d_buf_encode_coeff (layer->waveletbuf[j], + packet->data, comp_bitstream_len); + + _analysis_packetout (s, i, j); + } + } } -uint32_t tarkin_analysis_framein (TarkinStream *s, uint8_t *frame, - uint32_t layer_id, TarkinTime *date) +uint32_t +tarkin_analysis_framein (TarkinStream * s, uint8_t * frame, + uint32_t layer_id, TarkinTime * date) { - TarkinVideoLayer *layer; - - if(!frame) return (_analysis_packetout(s, 0, 0)); /* eos */ - if((layer_id>=s->n_layers) || (date->denominator==0)) return (TARKIN_FAULT); - - layer = s->layer + layer_id; - layer->color_fwd_xform (frame, layer->waveletbuf, - s->current_frame_in_buf); - /* We don't use this feature for now, neither date... */ - s->free_frame(s,frame); - - s->current_frame_in_buf++; - - if (s->current_frame_in_buf == s->frames_per_buf) - _stream_flush (s); - + TarkinVideoLayer *layer; + + if (!frame) + return (_analysis_packetout (s, 0, 0)); /* eos */ + if ((layer_id >= s->n_layers) || (date->denominator == 0)) + return (TARKIN_FAULT); + + layer = s->layer + layer_id; + layer->color_fwd_xform (frame, layer->waveletbuf, s->current_frame_in_buf); + /* We don't use this feature for now, neither date... */ + s->free_frame (s, frame); + + s->current_frame_in_buf++; + + if (s->current_frame_in_buf == s->frames_per_buf) + _stream_flush (s); + #ifdef DBG_OGG - printf("dbg_ogg: framein at pos %d/%d, n° %d,%d on layer %d\n", - date->numerator, date->denominator, - layer->frameno, s->current_frame, layer_id); + printf ("dbg_ogg: framein at pos %d/%d, n° %d,%d on layer %d\n", + date->numerator, date->denominator, + layer->frameno, s->current_frame, layer_id); #endif - - layer->frameno++; - return (++s->current_frame); + + layer->frameno++; + return (++s->current_frame); } @@ -265,158 +270,151 @@ uint32_t tarkin_analysis_framein (TarkinStream *s, uint8_t *frame, -TarkinError tarkin_stream_get_layer_desc (TarkinStream *s, - uint32_t layer_id, - TarkinVideoLayerDesc *desc) +TarkinError +tarkin_stream_get_layer_desc (TarkinStream * s, + uint32_t layer_id, TarkinVideoLayerDesc * desc) { - if (layer_id > s->n_layers-1) - return -TARKIN_INVALID_LAYER; + if (layer_id > s->n_layers - 1) + return -TARKIN_INVALID_LAYER; - memcpy (desc, &(s->layer[layer_id].desc), sizeof(TarkinVideoLayerDesc)); + memcpy (desc, &(s->layer[layer_id].desc), sizeof (TarkinVideoLayerDesc)); - return TARKIN_OK; + return TARKIN_OK; } -TarkinError tarkin_synthesis_init (TarkinStream *s, TarkinInfo *ti) +TarkinError +tarkin_synthesis_init (TarkinStream * s, TarkinInfo * ti) { - s->ti = ti; - s->layer = ti->layer; /* It was malloc()ed by headerin() */ - s->n_layers = ti->n_layers; - return (TARKIN_OK); + s->ti = ti; + s->layer = ti->layer; /* It was malloc()ed by headerin() */ + s->n_layers = ti->n_layers; + return (TARKIN_OK); } -TarkinError tarkin_synthesis_packetin (TarkinStream *s, ogg_packet *op) +TarkinError +tarkin_synthesis_packetin (TarkinStream * s, ogg_packet * op) { - uint32_t i, layer_id, comp, data_len; - uint32_t flags, junk; - int nread; - oggpack_buffer opb; - TarkinPacket *packet; + uint32_t i, layer_id, comp, data_len; + uint32_t flags, junk; + int nread; + oggpack_buffer opb; + TarkinPacket *packet; + #ifdef DBG_OGG - printf("dbg_ogg: Reading packet n° %lld, granulepos %lld, len %ld, %s%s\n", - op->packetno, op->granulepos, op->bytes, - op->b_o_s?"b_o_s":"", op->e_o_s?"e_o_s":""); + printf ("dbg_ogg: Reading packet n° %lld, granulepos %lld, len %ld, %s%s\n", + op->packetno, op->granulepos, op->bytes, + op->b_o_s ? "b_o_s" : "", op->e_o_s ? "e_o_s" : ""); #endif - oggpack_readinit(&opb,op->packet,op->bytes); - flags = oggpack_read(&opb,8); - layer_id = oggpack_read(&opb,12); /* Theses are required for */ - comp = oggpack_read(&opb,12); /* data hole handling (or maybe - * packetno would be enough ?) */ - nread = 4; - - if(flags){ /* This is void "infinite future features" feature ;) */ - if(flags & 1<<7){ - junk = flags; - while (junk & 1<<7) - junk = oggpack_read(&opb,8); /* allow for many future flags - that must be correctly ordonned. */ - } - /* This shows how to get a feature's data: - if (flags & TARKIN_FLAGS_EXAMPLE){ - tp->example = oggpack_read(&opb,32); - junk = tp->example & 3<<30; - tp->example &= 0x4fffffff; - } + oggpack_readinit (&opb, op->packet, op->bytes); + flags = oggpack_read (&opb, 8); + layer_id = oggpack_read (&opb, 12); /* Theses are required for */ + comp = oggpack_read (&opb, 12); /* data hole handling (or maybe + * packetno would be enough ?) */ + nread = 4; + + if (flags) { /* This is void "infinite future features" feature ;) */ + if (flags & 1 << 7) { + junk = flags; + while (junk & 1 << 7) + junk = oggpack_read (&opb, 8); /* allow for many future flags + that must be correctly ordonned. */ + } + /* This shows how to get a feature's data: + if (flags & TARKIN_FLAGS_EXAMPLE){ + tp->example = oggpack_read(&opb,32); + junk = tp->example & 3<<30; + tp->example &= 0x4fffffff; + } */ - for(junk=1<<31;junk & 1<<31;) /* and many future data */ - while((junk=oggpack_read(&opb,32)) & 1<<30); - /* That is, feature data comes in 30 bit chunks. We also have - * 31 potentially usefull bits in last chunk. */ - } - - nread = (opb.ptr - opb.buffer); - data_len = op->bytes - nread; - -#ifdef DBG_OGG - printf(" layer_id %d, comp %d, meta-data %dB, w3d data %dB.\n", - layer_id, comp,nread, data_len); -#endif + for (junk = 1 << 31; junk & 1 << 31;) /* and many future data */ + while ((junk = oggpack_read (&opb, 32)) & 1 << 30); + /* That is, feature data comes in 30 bit chunks. We also have + * 31 potentially usefull bits in last chunk. */ + } - /* We now have for shure our data. */ - packet = &s->layer[layer_id].packet[comp]; - if(packet->data_len)return(-TARKIN_UNUSED); /* Previous data wasn't used */ - - if(packet->storage < data_len){ - packet->storage = data_len + 255; - packet->data = REALLOC (packet->data, packet->storage); - } - - for(i=0;i < data_len ; i++) - packet->data[i] = oggpack_read(&opb,8); - - packet->data_len = data_len; - - return(TARKIN_OK); -} - -TarkinError tarkin_synthesis_frameout(TarkinStream *s, - uint8_t **frame, - uint32_t layer_id, TarkinTime *date) -{ - int j; - TarkinVideoLayer *layer = &s->layer[layer_id]; - if (s->current_frame_in_buf == 0) { - *frame = MALLOC (layer->desc.width * layer->desc.height * layer->n_comp); - for (j=0; j<layer->n_comp; j++) { - TarkinPacket *packet = layer->packet + j; - - if(packet->data_len == 0)goto err_out ; - - wavelet_3d_buf_decode_coeff (layer->waveletbuf[j], packet->data, - packet->data_len); - - wavelet_3d_buf_dump ("rcoeff-%d-%03d.pgm", - s->current_frame, j, layer->waveletbuf[j], - 128); - - wavelet_3d_buf_inv_xform (layer->waveletbuf[j], - layer->desc.a_moments, - layer->desc.s_moments); - - wavelet_3d_buf_dump ("rcolor-%d-%03d.pgm", - s->current_frame, j, - layer->waveletbuf[j], j == 0 ? 0 : 128); - } + nread = (opb.ptr - opb.buffer); + data_len = op->bytes - nread; - /* We did successfylly read a block from this layer, acknowledge it. */ - for (j=0; j < layer->n_comp; j++) - layer->packet[j].data_len = 0; - } - - layer->color_inv_xform (layer->waveletbuf, *frame, - s->current_frame_in_buf); - s->current_frame_in_buf++; - s->current_frame++; - - if (s->current_frame_in_buf == s->frames_per_buf) - s->current_frame_in_buf=0; - - date->numerator = layer->frameno * s->ti->inter.numerator; - date->denominator = s->ti->inter.denominator; #ifdef DBG_OGG - printf("dbg_ogg: outputting frame pos %d/%d from layer %d.\n", - date->numerator, date->denominator, layer_id); + printf (" layer_id %d, comp %d, meta-data %dB, w3d data %dB.\n", + layer_id, comp, nread, data_len); #endif - layer->frameno++; - return (TARKIN_OK); -err_out: - FREE(*frame); - return (TARKIN_NEED_MORE); + + /* We now have for shure our data. */ + packet = &s->layer[layer_id].packet[comp]; + if (packet->data_len) + return (-TARKIN_UNUSED); /* Previous data wasn't used */ + + if (packet->storage < data_len) { + packet->storage = data_len + 255; + packet->data = REALLOC (packet->data, packet->storage); + } + + for (i = 0; i < data_len; i++) + packet->data[i] = oggpack_read (&opb, 8); + + packet->data_len = data_len; + + return (TARKIN_OK); } -int tarkin_synthesis_freeframe(TarkinStream *s, uint8_t *frame) +TarkinError +tarkin_synthesis_frameout (TarkinStream * s, + uint8_t ** frame, uint32_t layer_id, TarkinTime * date) { - FREE(frame); - - return(TARKIN_OK); -} + int j; + TarkinVideoLayer *layer = &s->layer[layer_id]; + if (s->current_frame_in_buf == 0) { + *frame = MALLOC (layer->desc.width * layer->desc.height * layer->n_comp); + for (j = 0; j < layer->n_comp; j++) { + TarkinPacket *packet = layer->packet + j; + if (packet->data_len == 0) + goto err_out; + wavelet_3d_buf_decode_coeff (layer->waveletbuf[j], packet->data, + packet->data_len); + wavelet_3d_buf_dump ("rcoeff-%d-%03d.pgm", + s->current_frame, j, layer->waveletbuf[j], 128); + wavelet_3d_buf_inv_xform (layer->waveletbuf[j], + layer->desc.a_moments, layer->desc.s_moments); + wavelet_3d_buf_dump ("rcolor-%d-%03d.pgm", + s->current_frame, j, layer->waveletbuf[j], j == 0 ? 0 : 128); + } + /* We did successfylly read a block from this layer, acknowledge it. */ + for (j = 0; j < layer->n_comp; j++) + layer->packet[j].data_len = 0; + } + layer->color_inv_xform (layer->waveletbuf, *frame, s->current_frame_in_buf); + s->current_frame_in_buf++; + s->current_frame++; + if (s->current_frame_in_buf == s->frames_per_buf) + s->current_frame_in_buf = 0; + date->numerator = layer->frameno * s->ti->inter.numerator; + date->denominator = s->ti->inter.denominator; +#ifdef DBG_OGG + printf ("dbg_ogg: outputting frame pos %d/%d from layer %d.\n", + date->numerator, date->denominator, layer_id); +#endif + layer->frameno++; + return (TARKIN_OK); +err_out: + FREE (*frame); + return (TARKIN_NEED_MORE); +} + +int +tarkin_synthesis_freeframe (TarkinStream * s, uint8_t * frame) +{ + FREE (frame); + + return (TARKIN_OK); +} |