freeimage: Add more buffer metadata

This commit is contained in:
Joshua M. Doe 2011-02-02 13:10:49 -05:00
parent 8549479892
commit fbe6b50379
3 changed files with 31 additions and 10 deletions

View File

@ -2,11 +2,15 @@ add_definitions(-DHAVE_CONFIG_H)
set ( SOURCES set ( SOURCES
gstfreeimage.c gstfreeimage.c
gstfreeimagedec.c) gstfreeimagedec.c
gstfreeimageenc.c
gstfreeimageutils.c)
set ( HEADERS set ( HEADERS
gstfreeimage.h gstfreeimage.h
gstfreeimagedec.h) gstfreeimagedec.h
gstfreeimageenc.h
gstfreeimageutils.h)
include_directories ( AFTER include_directories ( AFTER
${FREEIMAGE_INCLUDE_DIR} ) ${FREEIMAGE_INCLUDE_DIR} )

View File

@ -100,7 +100,7 @@ gst_freeimagedec_user_tell (fi_handle handle)
} }
unsigned DLL_CALLCONV 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; GstFreeImageDec *freeimagedec;
GstBuffer *buffer; GstBuffer *buffer;
@ -235,6 +235,7 @@ gst_freeimagedec_init (GstFreeImageDec * freeimagedec)
freeimagedec->in_timestamp = GST_CLOCK_TIME_NONE; freeimagedec->in_timestamp = GST_CLOCK_TIME_NONE;
freeimagedec->in_duration = GST_CLOCK_TIME_NONE; freeimagedec->in_duration = GST_CLOCK_TIME_NONE;
freeimagedec->in_offset = GST_BUFFER_OFFSET_NONE;
freeimagedec->fps_n = 0; freeimagedec->fps_n = 0;
freeimagedec->fps_d = 1; freeimagedec->fps_d = 1;
@ -242,7 +243,7 @@ gst_freeimagedec_init (GstFreeImageDec * freeimagedec)
gst_segment_init (&freeimagedec->segment, GST_FORMAT_UNDEFINED); gst_segment_init (&freeimagedec->segment, GST_FORMAT_UNDEFINED);
/* Set user IO functions to FreeImageIO struct */ /* 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.write_proc = NULL;
freeimagedec->fiio.seek_proc = gst_freeimagedec_user_seek; freeimagedec->fiio.seek_proc = gst_freeimagedec_user_seek;
freeimagedec->fiio.tell_proc = gst_freeimagedec_user_tell; freeimagedec->fiio.tell_proc = gst_freeimagedec_user_tell;
@ -485,6 +486,10 @@ gst_freeimagedec_sink_event (GstPad * pad, GstEvent * event)
gst_event_unref (event); gst_event_unref (event);
res = TRUE; res = TRUE;
} }
/* set offset of outgoing buffers */
freeimagedec->in_offset = 0;
break; break;
} }
case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_STOP:
@ -661,15 +666,26 @@ gst_freeimagedec_push_dib (GstFreeImageDec * freeimagedec)
FreeImage_GetBits (freeimagedec->dib) + (height - i - 1) * pitch, pitch); FreeImage_GetBits (freeimagedec->dib) + (height - i - 1) * pitch, pitch);
} }
if (GST_BUFFER_TIMESTAMP_IS_VALID (freeimagedec->in_timestamp))
if (GST_CLOCK_TIME_IS_VALID (freeimagedec->in_timestamp))
GST_BUFFER_TIMESTAMP (buffer) = freeimagedec->in_timestamp; GST_BUFFER_TIMESTAMP (buffer) = freeimagedec->in_timestamp;
if (GST_CLOCK_TIME_IS_VALID (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; 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 */ /* Push the raw frame */
ret = gst_pad_push (freeimagedec->srcpad, buffer); ret = gst_pad_push (freeimagedec->srcpad, buffer);
/* increment output buffer offset */
freeimagedec->in_offset++;
return ret; return ret;
} }

View File

@ -51,6 +51,7 @@ struct _GstFreeImageDec
guint64 in_timestamp; guint64 in_timestamp;
guint64 in_duration; guint64 in_duration;
guint64 in_offset;
gboolean framed; gboolean framed;