- GstFlowReturn ret = GST_FLOW_OK;
- GstJpegDec *dec;
- GstBuffer *outbuf = NULL;
- gint img_len;
- gint width, height;
- gint r_h, r_v;
- guint code, hdr_ok;
- GstClockTime timestamp, duration;
- GstVideoFrame frame;
-
- dec = GST_JPEG_DEC (parent);
-
- timestamp = GST_BUFFER_TIMESTAMP (buf);
- duration = GST_BUFFER_DURATION (buf);
-
- if (GST_CLOCK_TIME_IS_VALID (timestamp))
- dec->next_ts = timestamp;
-
- if (GST_BUFFER_IS_DISCONT (buf)) {
- GST_DEBUG_OBJECT (dec, "buffer has DISCONT flag set");
- dec->discont = TRUE;
- if (!dec->packetized && gst_adapter_available (dec->adapter)) {
- GST_WARNING_OBJECT (dec, "DISCONT buffer in non-packetized mode, bad");
- gst_adapter_clear (dec->adapter);
- }
- }
-
- gst_adapter_push (dec->adapter, buf);
- buf = NULL;
-
- /* If we are non-packetized and know the total incoming size in bytes,
- * just wait until we have enough before doing any processing. */
-
- if (!dec->packetized && (dec->segment.format == GST_FORMAT_BYTES) &&
- (dec->segment.stop != -1) &&
- (gst_adapter_available (dec->adapter) < dec->segment.stop)) {
- /* We assume that non-packetized input in bytes is *one* single jpeg image */
- GST_DEBUG ("Non-packetized mode. Got %" G_GSIZE_FORMAT " bytes, "
- "need %" G_GINT64_FORMAT, gst_adapter_available (dec->adapter),
- dec->segment.stop);
- goto need_more_data;
- }
-
-again:
- if (!gst_jpeg_dec_ensure_header (dec))
- goto need_more_data;
-
- /* If we know that each input buffer contains data
- * for a whole jpeg image (e.g. MJPEG streams), just
- * do some sanity checking instead of parsing all of
- * the jpeg data */
- if (dec->packetized) {
- img_len = gst_adapter_available (dec->adapter);
- } else {
- /* Parse jpeg image to handle jpeg input that
- * is not aligned to buffer boundaries */
- img_len = gst_jpeg_dec_parse_image_data (dec);
-
- if (img_len == 0) {
- goto need_more_data;
- } else if (img_len < 0) {
- gst_adapter_flush (dec->adapter, -img_len);
- goto again;
- }
- }
-
- dec->rem_img_len = img_len;
-
- GST_LOG_OBJECT (dec, "image size = %u", img_len);
-
- /* QoS: if we're too late anyway, skip decoding */
- if (dec->packetized && !gst_jpeg_dec_do_qos (dec, timestamp))
- goto skip_decoding;
-
-#ifndef GST_DISABLE_GST_DEBUG
- {
- guchar data[4];
-
- gst_adapter_copy (dec->adapter, data, 0, 4);
- GST_LOG_OBJECT (dec, "reading header %02x %02x %02x %02x", data[0], data[1],
- data[2], data[3]);
- }
-#endif
-
- gst_jpeg_dec_fill_input_buffer (&dec->cinfo);
-
- if (setjmp (dec->jerr.setjmp_buffer)) {
- code = dec->jerr.pub.msg_code;
-
- if (code == JERR_INPUT_EOF) {
- GST_DEBUG ("jpeg input EOF error, we probably need more data");
- goto need_more_data;
- }
- goto decode_error;
- }