diff --git a/ext/freeimage/CMakeLists.txt b/ext/freeimage/CMakeLists.txt index 734d4d6..12341f6 100644 --- a/ext/freeimage/CMakeLists.txt +++ b/ext/freeimage/CMakeLists.txt @@ -1,12 +1,16 @@ add_definitions(-DHAVE_CONFIG_H) set ( SOURCES - gstfreeimage.c - gstfreeimagedec.c) + gstfreeimage.c + gstfreeimagedec.c + gstfreeimageenc.c + gstfreeimageutils.c) set ( HEADERS - gstfreeimage.h - gstfreeimagedec.h) + gstfreeimage.h + gstfreeimagedec.h + gstfreeimageenc.h + gstfreeimageutils.h) include_directories ( AFTER ${FREEIMAGE_INCLUDE_DIR} ) diff --git a/ext/freeimage/gstfreeimagedec.c b/ext/freeimage/gstfreeimagedec.c index 32cbc6d..58cb25d 100644 --- a/ext/freeimage/gstfreeimagedec.c +++ b/ext/freeimage/gstfreeimagedec.c @@ -100,7 +100,7 @@ gst_freeimagedec_user_tell (fi_handle handle) } unsigned DLL_CALLCONV -user_read (void *data, unsigned elsize, unsigned elcount, fi_handle handle) +gst_freeimagedec_user_read (void *data, unsigned elsize, unsigned elcount, fi_handle handle) { GstFreeImageDec *freeimagedec; GstBuffer *buffer; @@ -235,6 +235,7 @@ gst_freeimagedec_init (GstFreeImageDec * freeimagedec) freeimagedec->in_timestamp = GST_CLOCK_TIME_NONE; freeimagedec->in_duration = GST_CLOCK_TIME_NONE; + freeimagedec->in_offset = GST_BUFFER_OFFSET_NONE; freeimagedec->fps_n = 0; freeimagedec->fps_d = 1; @@ -242,7 +243,7 @@ gst_freeimagedec_init (GstFreeImageDec * freeimagedec) gst_segment_init (&freeimagedec->segment, GST_FORMAT_UNDEFINED); /* Set user IO functions to FreeImageIO struct */ - freeimagedec->fiio.read_proc = user_read; + freeimagedec->fiio.read_proc = gst_freeimagedec_user_read; freeimagedec->fiio.write_proc = NULL; freeimagedec->fiio.seek_proc = gst_freeimagedec_user_seek; freeimagedec->fiio.tell_proc = gst_freeimagedec_user_tell; @@ -485,6 +486,10 @@ gst_freeimagedec_sink_event (GstPad * pad, GstEvent * event) gst_event_unref (event); res = TRUE; } + + /* set offset of outgoing buffers */ + freeimagedec->in_offset = 0; + break; } case GST_EVENT_FLUSH_STOP: @@ -661,15 +666,26 @@ gst_freeimagedec_push_dib (GstFreeImageDec * freeimagedec) FreeImage_GetBits (freeimagedec->dib) + (height - i - 1) * pitch, pitch); } - - if (GST_CLOCK_TIME_IS_VALID (freeimagedec->in_timestamp)) + if (GST_BUFFER_TIMESTAMP_IS_VALID (freeimagedec->in_timestamp)) GST_BUFFER_TIMESTAMP (buffer) = freeimagedec->in_timestamp; - if (GST_CLOCK_TIME_IS_VALID (freeimagedec->in_duration)) - GST_BUFFER_DURATION (buffer) = freeimagedec->in_duration; + else + if (freeimagedec->fps_d != 0) + GST_BUFFER_TIMESTAMP (buffer) = + (freeimagedec->in_offset * freeimagedec->fps_n) / freeimagedec->fps_d; + if (GST_BUFFER_TIMESTAMP_IS_VALID (freeimagedec->in_duration)) + GST_BUFFER_DURATION (buffer) = freeimagedec->in_duration; + else + if (freeimagedec->fps_n != 0) + GST_BUFFER_DURATION (buffer) = freeimagedec->fps_d / freeimagedec->fps_n; + GST_BUFFER_OFFSET (buffer) = freeimagedec->in_offset; + GST_BUFFER_OFFSET_END (buffer) = freeimagedec->in_offset; /* Push the raw frame */ ret = gst_pad_push (freeimagedec->srcpad, buffer); + /* increment output buffer offset */ + freeimagedec->in_offset++; + return ret; } diff --git a/ext/freeimage/gstfreeimagedec.h b/ext/freeimage/gstfreeimagedec.h index 883447e..ca3763e 100644 --- a/ext/freeimage/gstfreeimagedec.h +++ b/ext/freeimage/gstfreeimagedec.h @@ -51,6 +51,7 @@ struct _GstFreeImageDec guint64 in_timestamp; guint64 in_duration; + guint64 in_offset; gboolean framed;