pngdec->color_type = -1;
pngdec->image_ready = FALSE;
+ pngdec->read_data = 0;
}
static void
gconstpointer data;
guint64 signature;
gsize size;
+ GstPngDec *pngdec = (GstPngDec *) decoder;
GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame);
data = gst_adapter_map (adapter, size);
gst_byte_reader_init (&reader, data, size);
- if (!gst_byte_reader_peek_uint64_be (&reader, &signature))
- goto need_more_data;
+ if (pngdec->read_data == 0) {
+ if (!gst_byte_reader_peek_uint64_be (&reader, &signature))
+ goto need_more_data;
- if (signature != PNG_SIGNATURE) {
- for (;;) {
- guint offset;
+ if (signature != PNG_SIGNATURE) {
+ for (;;) {
+ guint offset;
- offset = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff,
- 0x89504E47, 0, gst_byte_reader_get_remaining (&reader));
+ offset = gst_byte_reader_masked_scan_uint32 (&reader, 0xffffffff,
+ 0x89504E47, 0, gst_byte_reader_get_remaining (&reader));
- if (offset == -1) {
- gst_adapter_flush (adapter,
- gst_byte_reader_get_remaining (&reader) - 4);
- goto need_more_data;
- }
+ if (offset == -1) {
+ gst_adapter_flush (adapter,
+ gst_byte_reader_get_remaining (&reader) - 4);
+ goto need_more_data;
+ }
- if (!gst_byte_reader_skip (&reader, offset))
- goto need_more_data;
+ if (!gst_byte_reader_skip (&reader, offset))
+ goto need_more_data;
- if (!gst_byte_reader_peek_uint64_be (&reader, &signature))
- goto need_more_data;
+ if (!gst_byte_reader_peek_uint64_be (&reader, &signature))
+ goto need_more_data;
- if (signature == PNG_SIGNATURE) {
- /* We're skipping, go out, we'll be back */
- gst_adapter_flush (adapter, gst_byte_reader_get_pos (&reader));
- goto need_more_data;
+ if (signature == PNG_SIGNATURE) {
+ /* We're skipping, go out, we'll be back */
+ gst_adapter_flush (adapter, gst_byte_reader_get_pos (&reader));
+ goto need_more_data;
+ }
+ if (!gst_byte_reader_skip (&reader, 4))
+ goto need_more_data;
}
- if (!gst_byte_reader_skip (&reader, 4))
- goto need_more_data;
}
+ pngdec->read_data = 8;
}
- if (!gst_byte_reader_skip (&reader, 8))
+ if (!gst_byte_reader_skip (&reader, pngdec->read_data))
goto need_more_data;
for (;;) {
toadd = gst_byte_reader_get_pos (&reader);
GST_DEBUG_OBJECT (decoder, "Have complete frame of size %" G_GSIZE_FORMAT,
toadd);
+ pngdec->read_data = 0;
goto have_full_frame;
- }
+ } else
+ pngdec->read_data += length + 12;
}
g_assert_not_reached ();
}
pngdec->color_type = -1;
+ pngdec->read_data = 0;
}
static gboolean