diff options
author | Edward Hervey <bilboed@bilboed.com> | 2006-05-28 13:30:13 +0000 |
---|---|---|
committer | Edward Hervey <bilboed@bilboed.com> | 2006-05-28 13:30:13 +0000 |
commit | bd094da838480330bca3d813e4283befb84a0fff (patch) | |
tree | ac9331a5d51f22ba592907b0a8be05386e9cbafa /ext/jpeg/gstjpegdec.c | |
parent | c4b1e8e4aedc9971c1352a85ce2d1cc7da775c8d (diff) |
ext/jpeg/gstjpegdec.*: Clip outgoing buffers according to currently configured segment.
Original commit message from CVS:
* ext/jpeg/gstjpegdec.c: (gst_jpeg_dec_finalize),
(gst_jpeg_dec_init), (gst_jpeg_dec_chain),
(gst_jpeg_dec_sink_event), (gst_jpeg_dec_change_state):
* ext/jpeg/gstjpegdec.h:
Clip outgoing buffers according to currently configured segment.
Diffstat (limited to 'ext/jpeg/gstjpegdec.c')
-rw-r--r-- | ext/jpeg/gstjpegdec.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/ext/jpeg/gstjpegdec.c b/ext/jpeg/gstjpegdec.c index ca42dc7c..1713b06f 100644 --- a/ext/jpeg/gstjpegdec.c +++ b/ext/jpeg/gstjpegdec.c @@ -117,6 +117,9 @@ gst_jpeg_dec_finalize (GObject * object) if (dec->tempbuf) gst_buffer_unref (dec->tempbuf); + if (dec->segment) + gst_segment_free (dec->segment); + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -246,6 +249,8 @@ gst_jpeg_dec_init (GstJpegDec * dec) gst_pad_new_from_static_template (&gst_jpeg_dec_src_pad_template, "src"); gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); + dec->segment = gst_segment_new (); + /* setup jpeglib */ memset (&dec->cinfo, 0, sizeof (dec->cinfo)); memset (&dec->jerr, 0, sizeof (dec->jerr)); @@ -915,6 +920,34 @@ gst_jpeg_dec_chain (GstPad * pad, GstBuffer * buf) GST_LOG_OBJECT (dec, "decompressing finished"); jpeg_finish_decompress (&dec->cinfo); + /* Clipping */ + if (dec->segment->format == GST_FORMAT_TIME) { + gint64 start, stop, clip_start, clip_stop; + + GST_LOG_OBJECT (dec, "Attempting clipping"); + + start = GST_BUFFER_TIMESTAMP (outbuf); + if (GST_BUFFER_DURATION (outbuf) == GST_CLOCK_TIME_NONE) + stop = start; + else + stop = start + GST_BUFFER_DURATION (outbuf); + + if (gst_segment_clip (dec->segment, GST_FORMAT_TIME, + start, stop, &clip_start, &clip_stop)) { + GST_LOG_OBJECT (dec, "Clipping start to %" GST_TIME_FORMAT, + GST_TIME_ARGS (clip_start)); + GST_BUFFER_TIMESTAMP (outbuf) = clip_start; + if (GST_BUFFER_DURATION (outbuf) != GST_CLOCK_TIME_NONE) { + GST_LOG_OBJECT (dec, "Clipping duration to %" GST_TIME_FORMAT, + GST_TIME_ARGS (clip_stop - clip_start)); + GST_BUFFER_DURATION (outbuf) = clip_stop - clip_start; + } + } else { + GST_WARNING_OBJECT (dec, + "Outgoing buffer is outsided configured segment"); + } + } + GST_LOG_OBJECT (dec, "pushing buffer (ts=%" GST_TIME_FORMAT ", dur=%" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf))); @@ -986,6 +1019,23 @@ gst_jpeg_dec_sink_event (GstPad * pad, GstEvent * event) GST_DEBUG_OBJECT (dec, "Aborting decompress"); jpeg_abort_decompress (&dec->cinfo); break; + case GST_EVENT_NEWSEGMENT:{ + gboolean update; + gdouble rate; + GstFormat format; + gint64 start, stop, position; + + /* Once -good depends on core >= 0.10.6, use newsegment_full */ + gst_event_parse_new_segment (event, &update, &rate, &format, + &start, &stop, &position); + GST_DEBUG_OBJECT (dec, "Got NEWSEGMENT [%" GST_TIME_FORMAT + " - %" GST_TIME_FORMAT " / %" GST_TIME_FORMAT "]", + GST_TIME_ARGS (start), GST_TIME_ARGS (stop), + GST_TIME_ARGS (position)); + gst_segment_set_newsegment (dec->segment, update, rate, format, + start, stop, position); + } + break; default: break; } @@ -1012,6 +1062,7 @@ gst_jpeg_dec_change_state (GstElement * element, GstStateChange transition) dec->caps_height = -1; dec->packetized = FALSE; dec->next_ts = 0; + gst_segment_init (dec->segment, GST_FORMAT_TIME); default: break; } |