mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +00:00
jpegformat: get rid of unnecessary private structs
This commit is contained in:
parent
bfcc073ed4
commit
2fac53fa51
4 changed files with 154 additions and 188 deletions
|
@ -95,16 +95,6 @@ typedef struct _GstJifMuxMarker
|
|||
gboolean owned;
|
||||
} GstJifMuxMarker;
|
||||
|
||||
struct _GstJifMuxPrivate
|
||||
{
|
||||
GstPad *srcpad;
|
||||
|
||||
/* list of GstJifMuxMarker */
|
||||
GList *markers;
|
||||
guint scan_size;
|
||||
const guint8 *scan_data;
|
||||
};
|
||||
|
||||
static void gst_jif_mux_finalize (GObject * object);
|
||||
|
||||
static void gst_jif_mux_reset (GstJifMux * self);
|
||||
|
@ -130,8 +120,6 @@ gst_jif_mux_class_init (GstJifMuxClass * klass)
|
|||
gobject_class = (GObjectClass *) klass;
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (GstJifMuxPrivate));
|
||||
|
||||
gobject_class->finalize = gst_jif_mux_finalize;
|
||||
|
||||
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_jif_mux_change_state);
|
||||
|
@ -156,9 +144,6 @@ gst_jif_mux_init (GstJifMux * self)
|
|||
{
|
||||
GstPad *sinkpad;
|
||||
|
||||
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GST_TYPE_JIF_MUX,
|
||||
GstJifMuxPrivate);
|
||||
|
||||
/* create the sink and src pads */
|
||||
sinkpad = gst_pad_new_from_static_template (&gst_jif_mux_sink_pad_template,
|
||||
"sink");
|
||||
|
@ -167,9 +152,9 @@ gst_jif_mux_init (GstJifMux * self)
|
|||
GST_DEBUG_FUNCPTR (gst_jif_mux_sink_event));
|
||||
gst_element_add_pad (GST_ELEMENT (self), sinkpad);
|
||||
|
||||
self->priv->srcpad =
|
||||
self->srcpad =
|
||||
gst_pad_new_from_static_template (&gst_jif_mux_src_pad_template, "src");
|
||||
gst_element_add_pad (GST_ELEMENT (self), self->priv->srcpad);
|
||||
gst_element_add_pad (GST_ELEMENT (self), self->srcpad);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -193,7 +178,7 @@ gst_jif_mux_sink_setcaps (GstJifMux * self, GstCaps * caps)
|
|||
/* FIXME: do we want to switch it like this or use a gobject property ? */
|
||||
}
|
||||
|
||||
return gst_pad_set_caps (self->priv->srcpad, caps);
|
||||
return gst_pad_set_caps (self->srcpad, caps);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -246,12 +231,12 @@ gst_jif_mux_reset (GstJifMux * self)
|
|||
GList *node;
|
||||
GstJifMuxMarker *m;
|
||||
|
||||
for (node = self->priv->markers; node; node = g_list_next (node)) {
|
||||
for (node = self->markers; node; node = g_list_next (node)) {
|
||||
m = (GstJifMuxMarker *) node->data;
|
||||
gst_jif_mux_marker_free (m);
|
||||
}
|
||||
g_list_free (self->priv->markers);
|
||||
self->priv->markers = NULL;
|
||||
g_list_free (self->markers);
|
||||
self->markers = NULL;
|
||||
}
|
||||
|
||||
static GstJifMuxMarker *
|
||||
|
@ -305,12 +290,12 @@ gst_jif_mux_parse_image (GstJifMux * self, GstBuffer * buf)
|
|||
case SOI:
|
||||
GST_DEBUG_OBJECT (self, "marker = %x", marker);
|
||||
m = gst_jif_mux_new_marker (marker, 0, NULL, FALSE);
|
||||
self->priv->markers = g_list_prepend (self->priv->markers, m);
|
||||
self->markers = g_list_prepend (self->markers, m);
|
||||
break;
|
||||
case EOI:
|
||||
GST_DEBUG_OBJECT (self, "marker = %x", marker);
|
||||
m = gst_jif_mux_new_marker (marker, 0, NULL, FALSE);
|
||||
self->priv->markers = g_list_prepend (self->priv->markers, m);
|
||||
self->markers = g_list_prepend (self->markers, m);
|
||||
goto done;
|
||||
default:
|
||||
if (!gst_byte_reader_get_uint16_be (&reader, &size))
|
||||
|
@ -319,7 +304,7 @@ gst_jif_mux_parse_image (GstJifMux * self, GstBuffer * buf)
|
|||
goto error;
|
||||
|
||||
m = gst_jif_mux_new_marker (marker, size - 2, data, FALSE);
|
||||
self->priv->markers = g_list_prepend (self->priv->markers, m);
|
||||
self->markers = g_list_prepend (self->markers, m);
|
||||
|
||||
GST_DEBUG_OBJECT (self, "marker = %2x, size = %u", marker, size);
|
||||
break;
|
||||
|
@ -343,12 +328,12 @@ gst_jif_mux_parse_image (GstJifMux * self, GstBuffer * buf)
|
|||
}
|
||||
|
||||
/* remaining size except EOI is scan data */
|
||||
self->priv->scan_size = eoi_pos - gst_byte_reader_get_pos (&reader);
|
||||
if (!gst_byte_reader_get_data (&reader, self->priv->scan_size,
|
||||
&self->priv->scan_data))
|
||||
self->scan_size = eoi_pos - gst_byte_reader_get_pos (&reader);
|
||||
if (!gst_byte_reader_get_data (&reader, self->scan_size,
|
||||
&self->scan_data))
|
||||
goto error;
|
||||
|
||||
GST_DEBUG_OBJECT (self, "scan data, size = %u", self->priv->scan_size);
|
||||
GST_DEBUG_OBJECT (self, "scan data, size = %u", self->scan_size);
|
||||
}
|
||||
|
||||
if (!gst_byte_reader_peek_uint8 (&reader, &marker))
|
||||
|
@ -358,7 +343,7 @@ gst_jif_mux_parse_image (GstJifMux * self, GstBuffer * buf)
|
|||
gst_byte_reader_get_pos (&reader), (guint) map.size);
|
||||
|
||||
done:
|
||||
self->priv->markers = g_list_reverse (self->priv->markers);
|
||||
self->markers = g_list_reverse (self->markers);
|
||||
gst_buffer_unmap (buf, &map);
|
||||
|
||||
return TRUE;
|
||||
|
@ -396,8 +381,8 @@ gst_jif_mux_mangle_markers (GstJifMux * self)
|
|||
*/
|
||||
|
||||
/* find some reference points where we insert before/after */
|
||||
file_hdr = self->priv->markers;
|
||||
for (node = self->priv->markers; node; node = g_list_next (node)) {
|
||||
file_hdr = self->markers;
|
||||
for (node = self->markers; node; node = g_list_next (node)) {
|
||||
m = (GstJifMuxMarker *) node->data;
|
||||
|
||||
switch (m->marker) {
|
||||
|
@ -506,8 +491,8 @@ gst_jif_mux_mangle_markers (GstJifMux * self)
|
|||
m = gst_jif_mux_new_marker (APP0, sizeof (jfif_data),
|
||||
(const guint8 *) &jfif_data, FALSE);
|
||||
/* insert into self->markers list */
|
||||
self->priv->markers = g_list_insert (self->priv->markers, m, 1);
|
||||
app0_jfif = g_list_nth (self->priv->markers, 1);
|
||||
self->markers = g_list_insert (self->markers, m, 1);
|
||||
app0_jfif = g_list_nth (self->markers, 1);
|
||||
}
|
||||
/* else */
|
||||
/* remove JFIF if exists */
|
||||
|
@ -563,12 +548,11 @@ gst_jif_mux_mangle_markers (GstJifMux * self)
|
|||
pos = app0_jfif;
|
||||
pos = g_list_next (pos);
|
||||
|
||||
self->priv->markers =
|
||||
g_list_insert_before (self->priv->markers, pos, m);
|
||||
self->markers = g_list_insert_before (self->markers, pos, m);
|
||||
if (pos) {
|
||||
app1_exif = g_list_previous (pos);
|
||||
} else {
|
||||
app1_exif = g_list_last (self->priv->markers);
|
||||
app1_exif = g_list_last (self->markers);
|
||||
}
|
||||
}
|
||||
modified = TRUE;
|
||||
|
@ -607,7 +591,7 @@ gst_jif_mux_mangle_markers (GstJifMux * self)
|
|||
pos = app0_jfif;
|
||||
pos = g_list_next (pos);
|
||||
|
||||
self->priv->markers = g_list_insert_before (self->priv->markers, pos, m);
|
||||
self->markers = g_list_insert_before (self->markers, pos, m);
|
||||
|
||||
}
|
||||
gst_buffer_unref (xmp_data);
|
||||
|
@ -626,8 +610,7 @@ gst_jif_mux_mangle_markers (GstJifMux * self)
|
|||
TRUE);
|
||||
/* FIXME: if we have one already, replace */
|
||||
/* this should go before SOS, maybe at the end of file-header */
|
||||
self->priv->markers = g_list_insert_before (self->priv->markers,
|
||||
frame_hdr, m);
|
||||
self->markers = g_list_insert_before (self->markers, frame_hdr, m);
|
||||
|
||||
modified = TRUE;
|
||||
}
|
||||
|
@ -645,12 +628,12 @@ gst_jif_mux_recombine_image (GstJifMux * self, GstBuffer ** new_buf,
|
|||
GstByteWriter *writer;
|
||||
GstJifMuxMarker *m;
|
||||
GList *node;
|
||||
guint size = self->priv->scan_size;
|
||||
guint size = self->scan_size;
|
||||
gboolean writer_status = TRUE;
|
||||
GstMapInfo map;
|
||||
|
||||
/* iterate list and collect size */
|
||||
for (node = self->priv->markers; node; node = g_list_next (node)) {
|
||||
for (node = self->markers; node; node = g_list_next (node)) {
|
||||
m = (GstJifMuxMarker *) node->data;
|
||||
|
||||
/* some markers like e.g. SOI are empty */
|
||||
|
@ -674,8 +657,7 @@ gst_jif_mux_recombine_image (GstJifMux * self, GstBuffer ** new_buf,
|
|||
gst_buffer_map (buf, &map, GST_MAP_WRITE);
|
||||
writer = gst_byte_writer_new_with_data (map.data, map.size, TRUE);
|
||||
|
||||
for (node = self->priv->markers; node && writer_status;
|
||||
node = g_list_next (node)) {
|
||||
for (node = self->markers; node && writer_status; node = g_list_next (node)) {
|
||||
m = (GstJifMuxMarker *) node->data;
|
||||
|
||||
writer_status &= gst_byte_writer_put_uint8 (writer, 0xff);
|
||||
|
@ -689,10 +671,9 @@ gst_jif_mux_recombine_image (GstJifMux * self, GstBuffer ** new_buf,
|
|||
}
|
||||
|
||||
if (m->marker == SOS) {
|
||||
GST_DEBUG_OBJECT (self, "scan data, size = %u", self->priv->scan_size);
|
||||
GST_DEBUG_OBJECT (self, "scan data, size = %u", self->scan_size);
|
||||
writer_status &=
|
||||
gst_byte_writer_put_data (writer, self->priv->scan_data,
|
||||
self->priv->scan_size);
|
||||
gst_byte_writer_put_data (writer, self->scan_data, self->scan_size);
|
||||
}
|
||||
}
|
||||
gst_buffer_unmap (buf, &map);
|
||||
|
@ -736,7 +717,7 @@ gst_jif_mux_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
|
|||
gst_jif_mux_reset (self);
|
||||
|
||||
if (fret == GST_FLOW_OK) {
|
||||
fret = gst_pad_push (self->priv->srcpad, buf);
|
||||
fret = gst_pad_push (self->srcpad, buf);
|
||||
}
|
||||
return fret;
|
||||
}
|
||||
|
|
|
@ -42,12 +42,17 @@ G_BEGIN_DECLS
|
|||
#define GST_JIF_MUX_CAST(obj) ((GstJifMux *) (obj))
|
||||
|
||||
typedef struct _GstJifMux GstJifMux;
|
||||
typedef struct _GstJifMuxPrivate GstJifMuxPrivate;
|
||||
typedef struct _GstJifMuxClass GstJifMuxClass;
|
||||
|
||||
struct _GstJifMux {
|
||||
GstElement element;
|
||||
GstJifMuxPrivate *priv;
|
||||
|
||||
GstPad *srcpad;
|
||||
|
||||
/* list of GstJifMuxMarker */
|
||||
GList *markers;
|
||||
guint scan_size;
|
||||
const guint8 *scan_data;
|
||||
};
|
||||
|
||||
struct _GstJifMuxClass {
|
||||
|
|
|
@ -75,40 +75,6 @@ GST_STATIC_PAD_TEMPLATE ("sink",
|
|||
GST_DEBUG_CATEGORY_STATIC (jpeg_parse_debug);
|
||||
#define GST_CAT_DEFAULT jpeg_parse_debug
|
||||
|
||||
struct _GstJpegParsePrivate
|
||||
{
|
||||
guint last_offset;
|
||||
guint last_entropy_len;
|
||||
gboolean last_resync;
|
||||
|
||||
/* negotiated state */
|
||||
gint caps_width, caps_height;
|
||||
gint caps_framerate_numerator;
|
||||
gint caps_framerate_denominator;
|
||||
|
||||
/* the parsed frame size */
|
||||
guint16 width, height;
|
||||
|
||||
/* format color space */
|
||||
const gchar *format;
|
||||
|
||||
/* TRUE if the src caps sets a specific framerate */
|
||||
gboolean has_fps;
|
||||
|
||||
/* the (expected) timestamp of the next frame */
|
||||
guint64 next_ts;
|
||||
|
||||
/* duration of the current frame */
|
||||
guint64 duration;
|
||||
|
||||
/* video state */
|
||||
gint framerate_numerator;
|
||||
gint framerate_denominator;
|
||||
|
||||
/* tags */
|
||||
GstTagList *tags;
|
||||
};
|
||||
|
||||
static GstFlowReturn
|
||||
gst_jpeg_parse_handle_frame (GstBaseParse * bparse, GstBaseParseFrame * frame,
|
||||
gint * skipsize);
|
||||
|
@ -129,13 +95,9 @@ gst_jpeg_parse_class_init (GstJpegParseClass * klass)
|
|||
{
|
||||
GstBaseParseClass *gstbaseparse_class;
|
||||
GstElementClass *gstelement_class;
|
||||
GObjectClass *gobject_class;
|
||||
|
||||
gstbaseparse_class = (GstBaseParseClass *) klass;
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (GstJpegParsePrivate));
|
||||
|
||||
gstbaseparse_class->start = gst_jpeg_parse_start;
|
||||
gstbaseparse_class->stop = gst_jpeg_parse_stop;
|
||||
|
@ -161,10 +123,7 @@ gst_jpeg_parse_class_init (GstJpegParseClass * klass)
|
|||
static void
|
||||
gst_jpeg_parse_init (GstJpegParse * parse)
|
||||
{
|
||||
parse->priv = G_TYPE_INSTANCE_GET_PRIVATE (parse, GST_TYPE_JPEG_PARSE,
|
||||
GstJpegParsePrivate);
|
||||
|
||||
parse->priv->next_ts = GST_CLOCK_TIME_NONE;
|
||||
parse->next_ts = GST_CLOCK_TIME_NONE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -176,13 +135,12 @@ gst_jpeg_parse_set_sink_caps (GstBaseParse * bparse, GstCaps * caps)
|
|||
|
||||
if ((framerate = gst_structure_get_value (s, "framerate")) != NULL) {
|
||||
if (GST_VALUE_HOLDS_FRACTION (framerate)) {
|
||||
parse->priv->framerate_numerator =
|
||||
gst_value_get_fraction_numerator (framerate);
|
||||
parse->priv->framerate_denominator =
|
||||
parse->framerate_numerator = gst_value_get_fraction_numerator (framerate);
|
||||
parse->framerate_denominator =
|
||||
gst_value_get_fraction_denominator (framerate);
|
||||
parse->priv->has_fps = TRUE;
|
||||
parse->has_fps = TRUE;
|
||||
GST_DEBUG_OBJECT (parse, "got framerate of %d/%d",
|
||||
parse->priv->framerate_numerator, parse->priv->framerate_denominator);
|
||||
parse->framerate_numerator, parse->framerate_denominator);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -253,15 +211,14 @@ gst_jpeg_parse_get_image_length (GstJpegParse * parse, GstMapInfo * mapinfo)
|
|||
GST_DEBUG ("Parsing jpeg image data (%u bytes)", size);
|
||||
|
||||
GST_DEBUG ("Parse state: offset=%d, resync=%d, entropy len=%d",
|
||||
parse->priv->last_offset, parse->priv->last_resync,
|
||||
parse->priv->last_entropy_len);
|
||||
parse->last_offset, parse->last_resync, parse->last_entropy_len);
|
||||
|
||||
/* offset is 2 less than actual offset;
|
||||
* - adapter needs at least 4 bytes for scanning,
|
||||
* - start and end marker ensure at least that much
|
||||
*/
|
||||
/* resume from state offset */
|
||||
offset = parse->priv->last_offset;
|
||||
offset = parse->last_offset;
|
||||
|
||||
while (1) {
|
||||
guint frame_len;
|
||||
|
@ -275,7 +232,7 @@ gst_jpeg_parse_get_image_length (GstJpegParse * parse, GstMapInfo * mapinfo)
|
|||
GST_DEBUG ("Lost sync at 0x%08x, resyncing", offset + 2);
|
||||
}
|
||||
/* may have marker, but could have been resyncng */
|
||||
resync = resync || parse->priv->last_resync;
|
||||
resync = resync || parse->last_resync;
|
||||
/* Skip over extra 0xff */
|
||||
while ((noffset >= 0) && ((value & 0xff) == 0xff)) {
|
||||
noffset++;
|
||||
|
@ -295,15 +252,15 @@ gst_jpeg_parse_get_image_length (GstJpegParse * parse, GstMapInfo * mapinfo)
|
|||
if (value == 0xd9) {
|
||||
GST_DEBUG ("0x%08x: EOI marker", offset + 2);
|
||||
/* clear parse state */
|
||||
parse->priv->last_resync = FALSE;
|
||||
parse->priv->last_offset = 0;
|
||||
parse->last_resync = FALSE;
|
||||
parse->last_offset = 0;
|
||||
return (offset + 4);
|
||||
} else if (value == 0xd8) {
|
||||
/* Skip this frame if we found another SOI marker */
|
||||
GST_DEBUG ("0x%08x: SOI marker before EOI, skipping", offset + 2);
|
||||
/* clear parse state */
|
||||
parse->priv->last_resync = FALSE;
|
||||
parse->priv->last_offset = 0;
|
||||
parse->last_resync = FALSE;
|
||||
parse->last_offset = 0;
|
||||
return -(offset + 2);
|
||||
}
|
||||
|
||||
|
@ -326,7 +283,7 @@ gst_jpeg_parse_get_image_length (GstJpegParse * parse, GstMapInfo * mapinfo)
|
|||
}
|
||||
|
||||
if (gst_jpeg_parse_parse_tag_has_entropy_segment (value)) {
|
||||
guint eseglen = parse->priv->last_entropy_len;
|
||||
guint eseglen = parse->last_entropy_len;
|
||||
|
||||
GST_DEBUG ("0x%08x: finding entropy segment length", offset + 2);
|
||||
noffset = offset + 2 + frame_len + eseglen;
|
||||
|
@ -335,7 +292,7 @@ gst_jpeg_parse_get_image_length (GstJpegParse * parse, GstMapInfo * mapinfo)
|
|||
0x0000ff00, noffset, size - noffset, &value);
|
||||
if (noffset < 0) {
|
||||
/* need more data */
|
||||
parse->priv->last_entropy_len = size - offset - 4 - frame_len - 2;
|
||||
parse->last_entropy_len = size - offset - 4 - frame_len - 2;
|
||||
goto need_more_data;
|
||||
}
|
||||
if ((value & 0xff) != 0x00) {
|
||||
|
@ -344,7 +301,7 @@ gst_jpeg_parse_get_image_length (GstJpegParse * parse, GstMapInfo * mapinfo)
|
|||
}
|
||||
noffset++;
|
||||
}
|
||||
parse->priv->last_entropy_len = 0;
|
||||
parse->last_entropy_len = 0;
|
||||
frame_len += eseglen;
|
||||
GST_DEBUG ("entropy segment length=%u => frame_len=%u", eseglen,
|
||||
frame_len);
|
||||
|
@ -371,8 +328,8 @@ gst_jpeg_parse_get_image_length (GstJpegParse * parse, GstMapInfo * mapinfo)
|
|||
/* EXITS */
|
||||
need_more_data:
|
||||
{
|
||||
parse->priv->last_offset = offset;
|
||||
parse->priv->last_resync = resync;
|
||||
parse->last_offset = offset;
|
||||
parse->last_resync = resync;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -400,9 +357,9 @@ gst_jpeg_parse_sof (GstJpegParse * parse, GstByteReader * reader)
|
|||
return FALSE;
|
||||
|
||||
/* Get w and h */
|
||||
if (!gst_byte_reader_get_uint16_be (reader, &parse->priv->height))
|
||||
if (!gst_byte_reader_get_uint16_be (reader, &parse->height))
|
||||
return FALSE;
|
||||
if (!gst_byte_reader_get_uint16_be (reader, &parse->priv->width))
|
||||
if (!gst_byte_reader_get_uint16_be (reader, &parse->width))
|
||||
return FALSE;
|
||||
|
||||
/* Get number of components */
|
||||
|
@ -433,20 +390,20 @@ gst_jpeg_parse_sof (GstJpegParse * parse, GstByteReader * reader)
|
|||
|
||||
if (numcomps == 1) {
|
||||
/* gray image - no format */
|
||||
parse->priv->format = "";
|
||||
parse->format = "";
|
||||
} else if (numcomps == 3) {
|
||||
temp = (blockWidth[0] * blockHeight[0]) / (blockWidth[1] * blockHeight[1]);
|
||||
|
||||
if (temp == 4 && blockHeight[0] == 2)
|
||||
parse->priv->format = "I420";
|
||||
parse->format = "I420";
|
||||
else if (temp == 4 && blockHeight[0] == 4)
|
||||
parse->priv->format = "Y41B";
|
||||
parse->format = "Y41B";
|
||||
else if (temp == 2)
|
||||
parse->priv->format = "UYVY";
|
||||
parse->format = "UYVY";
|
||||
else if (temp == 1)
|
||||
parse->priv->format = "YV12";
|
||||
parse->format = "YV12";
|
||||
else
|
||||
parse->priv->format = "";
|
||||
parse->format = "";
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -492,9 +449,9 @@ gst_jpeg_parse_skip_marker (GstJpegParse * parse,
|
|||
static inline GstTagList *
|
||||
get_tag_list (GstJpegParse * parse)
|
||||
{
|
||||
if (!parse->priv->tags)
|
||||
parse->priv->tags = gst_tag_list_new_empty ();
|
||||
return parse->priv->tags;
|
||||
if (!parse->tags)
|
||||
parse->tags = gst_tag_list_new_empty ();
|
||||
return parse->tags;
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
@ -511,15 +468,14 @@ extract_and_queue_tags (GstJpegParse * parse, guint size, guint8 * data,
|
|||
gst_buffer_unref (buf);
|
||||
|
||||
if (tags) {
|
||||
GstTagList *taglist = parse->priv->tags;
|
||||
GstTagList *taglist = parse->tags;
|
||||
if (taglist) {
|
||||
gst_tag_list_insert (taglist, tags, GST_TAG_MERGE_REPLACE);
|
||||
gst_tag_list_unref (tags);
|
||||
} else {
|
||||
parse->priv->tags = tags;
|
||||
parse->tags = tags;
|
||||
}
|
||||
GST_DEBUG_OBJECT (parse, "collected tags: %" GST_PTR_FORMAT,
|
||||
parse->priv->tags);
|
||||
GST_DEBUG_OBJECT (parse, "collected tags: %" GST_PTR_FORMAT, parse->tags);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -719,32 +675,31 @@ gst_jpeg_parse_set_new_caps (GstJpegParse * parse, gboolean header_ok)
|
|||
gboolean res;
|
||||
|
||||
GST_DEBUG_OBJECT (parse, "setting caps on srcpad (hdr_ok=%d, have_fps=%d)",
|
||||
header_ok, parse->priv->has_fps);
|
||||
header_ok, parse->has_fps);
|
||||
|
||||
caps = gst_caps_new_simple ("image/jpeg",
|
||||
"parsed", G_TYPE_BOOLEAN, TRUE, NULL);
|
||||
|
||||
if (header_ok == TRUE) {
|
||||
gst_caps_set_simple (caps,
|
||||
"format", G_TYPE_STRING, parse->priv->format,
|
||||
"width", G_TYPE_INT, parse->priv->width,
|
||||
"height", G_TYPE_INT, parse->priv->height, NULL);
|
||||
"format", G_TYPE_STRING, parse->format,
|
||||
"width", G_TYPE_INT, parse->width,
|
||||
"height", G_TYPE_INT, parse->height, NULL);
|
||||
}
|
||||
|
||||
if (parse->priv->has_fps == TRUE) {
|
||||
if (parse->has_fps == TRUE) {
|
||||
/* we have a framerate */
|
||||
gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION,
|
||||
parse->priv->framerate_numerator,
|
||||
parse->priv->framerate_denominator, NULL);
|
||||
parse->framerate_numerator, parse->framerate_denominator, NULL);
|
||||
|
||||
if (!GST_CLOCK_TIME_IS_VALID (parse->priv->duration)
|
||||
&& parse->priv->framerate_numerator != 0) {
|
||||
parse->priv->duration = gst_util_uint64_scale_int (GST_SECOND,
|
||||
parse->priv->framerate_denominator, parse->priv->framerate_numerator);
|
||||
if (!GST_CLOCK_TIME_IS_VALID (parse->duration)
|
||||
&& parse->framerate_numerator != 0) {
|
||||
parse->duration = gst_util_uint64_scale_int (GST_SECOND,
|
||||
parse->framerate_denominator, parse->framerate_numerator);
|
||||
}
|
||||
} else {
|
||||
/* unknown duration */
|
||||
parse->priv->duration = GST_CLOCK_TIME_NONE;
|
||||
parse->duration = GST_CLOCK_TIME_NONE;
|
||||
gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, 1, 1, NULL);
|
||||
}
|
||||
|
||||
|
@ -764,17 +719,17 @@ gst_jpeg_parse_pre_push_frame (GstBaseParse * bparse, GstBaseParseFrame * frame)
|
|||
GstJpegParse *parse = GST_JPEG_PARSE_CAST (bparse);
|
||||
GstBuffer *outbuf = frame->buffer;
|
||||
|
||||
GST_BUFFER_TIMESTAMP (outbuf) = parse->priv->next_ts;
|
||||
GST_BUFFER_TIMESTAMP (outbuf) = parse->next_ts;
|
||||
|
||||
if (parse->priv->has_fps && GST_CLOCK_TIME_IS_VALID (parse->priv->next_ts)
|
||||
&& GST_CLOCK_TIME_IS_VALID (parse->priv->duration)) {
|
||||
parse->priv->next_ts += parse->priv->duration;
|
||||
if (parse->has_fps && GST_CLOCK_TIME_IS_VALID (parse->next_ts)
|
||||
&& GST_CLOCK_TIME_IS_VALID (parse->duration)) {
|
||||
parse->next_ts += parse->duration;
|
||||
} else {
|
||||
parse->priv->duration = GST_CLOCK_TIME_NONE;
|
||||
parse->priv->next_ts = GST_CLOCK_TIME_NONE;
|
||||
parse->duration = GST_CLOCK_TIME_NONE;
|
||||
parse->next_ts = GST_CLOCK_TIME_NONE;
|
||||
}
|
||||
|
||||
GST_BUFFER_DURATION (outbuf) = parse->priv->duration;
|
||||
GST_BUFFER_DURATION (outbuf) = parse->duration;
|
||||
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
|
@ -801,11 +756,11 @@ gst_jpeg_parse_handle_frame (GstBaseParse * bparse, GstBaseParseFrame * frame,
|
|||
return GST_FLOW_OK;
|
||||
}
|
||||
|
||||
if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (parse->priv->next_ts)))
|
||||
parse->priv->next_ts = timestamp;
|
||||
if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (parse->next_ts)))
|
||||
parse->next_ts = timestamp;
|
||||
|
||||
if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (duration)))
|
||||
parse->priv->duration = duration;
|
||||
parse->duration = duration;
|
||||
|
||||
len = gst_jpeg_parse_get_image_length (parse, &mapinfo);
|
||||
if (len == 0) {
|
||||
|
@ -821,38 +776,35 @@ gst_jpeg_parse_handle_frame (GstBaseParse * bparse, GstBaseParseFrame * frame,
|
|||
GST_LOG_OBJECT (parse, "parsed image of size %d", len);
|
||||
|
||||
/* reset the offset (only when we flushed) */
|
||||
parse->priv->last_offset = 0;
|
||||
parse->priv->last_entropy_len = 0;
|
||||
parse->last_offset = 0;
|
||||
parse->last_entropy_len = 0;
|
||||
|
||||
header_ok = gst_jpeg_parse_read_header (parse, &mapinfo, len);
|
||||
|
||||
gst_buffer_unmap (frame->buffer, &mapinfo);
|
||||
|
||||
if (parse->priv->width != parse->priv->caps_width
|
||||
|| parse->priv->height != parse->priv->caps_height
|
||||
|| parse->priv->framerate_numerator !=
|
||||
parse->priv->caps_framerate_numerator
|
||||
|| parse->priv->framerate_denominator !=
|
||||
parse->priv->caps_framerate_denominator) {
|
||||
if (parse->width != parse->caps_width
|
||||
|| parse->height != parse->caps_height
|
||||
|| parse->framerate_numerator !=
|
||||
parse->caps_framerate_numerator
|
||||
|| parse->framerate_denominator != parse->caps_framerate_denominator) {
|
||||
if (!gst_jpeg_parse_set_new_caps (parse, header_ok)) {
|
||||
GST_ELEMENT_ERROR (parse, CORE, NEGOTIATION,
|
||||
("Can't set caps to the src pad"), ("Can't set caps to the src pad"));
|
||||
return GST_FLOW_ERROR;
|
||||
}
|
||||
|
||||
if (parse->priv->tags) {
|
||||
GST_DEBUG_OBJECT (parse, "Pushing tags: %" GST_PTR_FORMAT,
|
||||
parse->priv->tags);
|
||||
if (parse->tags) {
|
||||
GST_DEBUG_OBJECT (parse, "Pushing tags: %" GST_PTR_FORMAT, parse->tags);
|
||||
gst_pad_push_event (GST_BASE_PARSE_SRC_PAD (parse),
|
||||
gst_event_new_tag (parse->priv->tags));
|
||||
parse->priv->tags = NULL;
|
||||
gst_event_new_tag (parse->tags));
|
||||
parse->tags = NULL;
|
||||
}
|
||||
|
||||
parse->priv->caps_width = parse->priv->width;
|
||||
parse->priv->caps_height = parse->priv->height;
|
||||
parse->priv->caps_framerate_numerator = parse->priv->framerate_numerator;
|
||||
parse->priv->caps_framerate_denominator =
|
||||
parse->priv->framerate_denominator;
|
||||
parse->caps_width = parse->width;
|
||||
parse->caps_height = parse->height;
|
||||
parse->caps_framerate_numerator = parse->framerate_numerator;
|
||||
parse->caps_framerate_denominator = parse->framerate_denominator;
|
||||
}
|
||||
|
||||
|
||||
|
@ -869,11 +821,11 @@ gst_jpeg_parse_sink_event (GstBaseParse * bparse, GstEvent * event)
|
|||
|
||||
switch (GST_EVENT_TYPE (event)) {
|
||||
case GST_EVENT_FLUSH_STOP:
|
||||
parse->priv->next_ts = GST_CLOCK_TIME_NONE;
|
||||
parse->priv->duration = GST_CLOCK_TIME_NONE;
|
||||
parse->priv->last_offset = 0;
|
||||
parse->priv->last_entropy_len = 0;
|
||||
parse->priv->last_resync = FALSE;
|
||||
parse->next_ts = GST_CLOCK_TIME_NONE;
|
||||
parse->duration = GST_CLOCK_TIME_NONE;
|
||||
parse->last_offset = 0;
|
||||
parse->last_entropy_len = 0;
|
||||
parse->last_resync = FALSE;
|
||||
res = GST_BASE_PARSE_CLASS (parent_class)->sink_event (bparse, event);
|
||||
break;
|
||||
case GST_EVENT_TAG:{
|
||||
|
@ -886,7 +838,7 @@ gst_jpeg_parse_sink_event (GstBaseParse * bparse, GstEvent * event)
|
|||
/* Hold on to the tags till the srcpad caps are definitely set */
|
||||
gst_tag_list_insert (get_tag_list (parse), taglist,
|
||||
GST_TAG_MERGE_REPLACE);
|
||||
GST_DEBUG ("collected tags: %" GST_PTR_FORMAT, parse->priv->tags);
|
||||
GST_DEBUG ("collected tags: %" GST_PTR_FORMAT, parse->tags);
|
||||
gst_event_unref (event);
|
||||
}
|
||||
break;
|
||||
|
@ -906,24 +858,23 @@ gst_jpeg_parse_start (GstBaseParse * bparse)
|
|||
|
||||
parse = GST_JPEG_PARSE_CAST (bparse);
|
||||
|
||||
parse->priv->has_fps = FALSE;
|
||||
parse->has_fps = FALSE;
|
||||
|
||||
parse->priv->width = parse->priv->height = 0;
|
||||
parse->priv->framerate_numerator = 0;
|
||||
parse->priv->framerate_denominator = 1;
|
||||
parse->width = parse->height = 0;
|
||||
parse->framerate_numerator = 0;
|
||||
parse->framerate_denominator = 1;
|
||||
|
||||
parse->priv->caps_framerate_numerator =
|
||||
parse->priv->caps_framerate_denominator = 0;
|
||||
parse->priv->caps_width = parse->priv->caps_height = -1;
|
||||
parse->caps_framerate_numerator = parse->caps_framerate_denominator = 0;
|
||||
parse->caps_width = parse->caps_height = -1;
|
||||
|
||||
parse->priv->next_ts = GST_CLOCK_TIME_NONE;
|
||||
parse->priv->duration = GST_CLOCK_TIME_NONE;
|
||||
parse->next_ts = GST_CLOCK_TIME_NONE;
|
||||
parse->duration = GST_CLOCK_TIME_NONE;
|
||||
|
||||
parse->priv->last_offset = 0;
|
||||
parse->priv->last_entropy_len = 0;
|
||||
parse->priv->last_resync = FALSE;
|
||||
parse->last_offset = 0;
|
||||
parse->last_entropy_len = 0;
|
||||
parse->last_resync = FALSE;
|
||||
|
||||
parse->priv->tags = NULL;
|
||||
parse->tags = NULL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -935,9 +886,9 @@ gst_jpeg_parse_stop (GstBaseParse * bparse)
|
|||
|
||||
parse = GST_JPEG_PARSE_CAST (bparse);
|
||||
|
||||
if (parse->priv->tags) {
|
||||
gst_tag_list_unref (parse->priv->tags);
|
||||
parse->priv->tags = NULL;
|
||||
if (parse->tags) {
|
||||
gst_tag_list_unref (parse->tags);
|
||||
parse->tags = NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -44,12 +44,41 @@ G_BEGIN_DECLS
|
|||
#define GST_JPEG_PARSE_CAST(obj) ((GstJpegParse *)obj)
|
||||
|
||||
typedef struct _GstJpegParse GstJpegParse;
|
||||
typedef struct _GstJpegParsePrivate GstJpegParsePrivate;
|
||||
typedef struct _GstJpegParseClass GstJpegParseClass;
|
||||
|
||||
struct _GstJpegParse {
|
||||
GstBaseParse parse;
|
||||
GstJpegParsePrivate *priv;
|
||||
|
||||
guint last_offset;
|
||||
guint last_entropy_len;
|
||||
gboolean last_resync;
|
||||
|
||||
/* negotiated state */
|
||||
gint caps_width, caps_height;
|
||||
gint caps_framerate_numerator;
|
||||
gint caps_framerate_denominator;
|
||||
|
||||
/* the parsed frame size */
|
||||
guint16 width, height;
|
||||
|
||||
/* format color space */
|
||||
const gchar *format;
|
||||
|
||||
/* TRUE if the src caps sets a specific framerate */
|
||||
gboolean has_fps;
|
||||
|
||||
/* the (expected) timestamp of the next frame */
|
||||
guint64 next_ts;
|
||||
|
||||
/* duration of the current frame */
|
||||
guint64 duration;
|
||||
|
||||
/* video state */
|
||||
gint framerate_numerator;
|
||||
gint framerate_denominator;
|
||||
|
||||
/* tags */
|
||||
GstTagList *tags;
|
||||
};
|
||||
|
||||
struct _GstJpegParseClass {
|
||||
|
|
Loading…
Reference in a new issue