static void gst_rsvg_dec_init (GstRsvgDec * rsvg) { GstVideoDecoder *decoder = GST_VIDEO_DECODER (rsvg); gst_video_decoder_set_packetized (decoder, FALSE); dec_reset (rsvg); }
static gboolean gst_rsvg_dec_reset (GstVideoDecoder * decoder, gboolean hard) { GstRsvgDec *dec = GST_RSVG_DEC (decoder); dec_reset (dec); return TRUE; }
void decode (FILE *fin, int size, FILE *fout) { Decoder *dec = dec_new (); List *word, *entry; unsigned int code; uchar chr; chr = fgetc (fin); fputc (chr, fout); word = list_new (chr); for (; size > 1; size--) { chr = fgetc (fin); if (dec->nbits > MAX_BITS) { dec = dec_reset (dec); list_destroy (word); word = list_new (chr); fputc (chr, fout); } else { /* Se agrega el nuevo caracter al buffer. */ dec->bitbuffer.buffer = (dec->bitbuffer.buffer << 8) | chr; dec->bitbuffer.length += 8; while (dec->bitbuffer.length >= dec->nbits) { dec->bitbuffer.length -= dec->nbits; code = dec->bitbuffer.buffer >> dec->bitbuffer.length; dec->bitbuffer.buffer &= (1 << dec->bitbuffer.length) - 1; if (code < dec->charbuffer.nelem) { /* El código está en el diccionario. */ entry = dec->charbuffer.buffer[code]; fputl (entry, fout); /* Agrega word + entry[0] al diccionario. */ word = list_prepend (word, entry->data); dec_add_word (dec, word); list_destroy (word); word = NULL; for (; entry != NULL; entry = entry->next) word = list_prepend (word, entry->data); } else { /* Agrega word + word[0] al diccionario. */ word = list_prepend (word, list_last (word)); dec_add_word (dec, word); fputl (dec->charbuffer.buffer[dec->charbuffer.nelem-1], fout); } } } } list_destroy (word); dec_destroy (dec); }