static void flx_decode_chunks (GstFlxDec * flxdec, gulong count, guchar * data, guchar * dest) { FlxFrameChunk *hdr; g_return_if_fail (data != NULL); while (count--) { hdr = (FlxFrameChunk *) data; FLX_FRAME_CHUNK_FIX_ENDIANNESS (hdr); data += FlxFrameChunkSize; switch (hdr->id) { case FLX_COLOR64: flx_decode_color (flxdec, data, dest, 2); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_COLOR256: flx_decode_color (flxdec, data, dest, 0); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_BRUN: flx_decode_brun (flxdec, data, dest); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_LC: flx_decode_delta_fli (flxdec, data, dest); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_SS2: flx_decode_delta_flc (flxdec, data, dest); data += rndalign (hdr->size) - FlxFrameChunkSize; break; case FLX_BLACK: memset (dest, 0, flxdec->size); break; case FLX_MINI: data += rndalign (hdr->size) - FlxFrameChunkSize; break; default: GST_WARNING ("Unimplented chunk type: 0x%02x size: %d - skipping", hdr->id, hdr->size); data += rndalign (hdr->size) - FlxFrameChunkSize; break; } } }
static gboolean flx_decode_chunks (GstFlxDec * flxdec, gulong n_chunks, GstByteReader * reader, GstByteWriter * writer) { gboolean ret = TRUE; while (n_chunks--) { GstByteReader chunk; guint32 size; guint16 type; if (!gst_byte_reader_get_uint32_le (reader, &size)) goto parse_error; if (!gst_byte_reader_get_uint16_le (reader, &type)) goto parse_error; GST_LOG_OBJECT (flxdec, "chunk has type 0x%02x size %d", type, size); if (!gst_byte_reader_get_sub_reader (reader, &chunk, size - FlxFrameChunkSize)) { GST_ERROR_OBJECT (flxdec, "Incorrect size in the chunk header"); goto error; } switch (type) { case FLX_COLOR64: ret = flx_decode_color (flxdec, &chunk, writer, 2); break; case FLX_COLOR256: ret = flx_decode_color (flxdec, &chunk, writer, 0); break; case FLX_BRUN: ret = flx_decode_brun (flxdec, &chunk, writer); break; case FLX_LC: ret = flx_decode_delta_fli (flxdec, &chunk, writer); break; case FLX_SS2: ret = flx_decode_delta_flc (flxdec, &chunk, writer); break; case FLX_BLACK: ret = gst_byte_writer_fill (writer, 0, flxdec->size); break; case FLX_MINI: break; default: GST_WARNING ("Unimplemented chunk type: 0x%02x size: %d - skipping", type, size); break; } if (!ret) break; } return ret; parse_error: GST_ERROR_OBJECT (flxdec, "Failed to decode chunk"); error: return FALSE; }