summaryrefslogtreecommitdiffstats
path: root/ext/jpeg/gstsmokeenc.c
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2004-10-04 16:53:48 +0000
committerWim Taymans <wim.taymans@gmail.com>2004-10-04 16:53:48 +0000
commitb90716dd184e3a270fc31ab39307548fe16337cc (patch)
treee204108290be35fe11b3ecde34ebbc60396cdb5a /ext/jpeg/gstsmokeenc.c
parentd2ba80e45ee0a5b90aa2be7571efb92a560bd1c0 (diff)
ext/jpeg/: Updated smoke, new bitstream, allows embedding in ogg.
Original commit message from CVS: * ext/jpeg/gstjpeg.c: (smoke_type_find), (plugin_init): * ext/jpeg/gstsmokedec.c: (gst_smokedec_init), (gst_smokedec_chain): * ext/jpeg/gstsmokedec.h: * ext/jpeg/gstsmokeenc.c: (gst_smokeenc_class_init), (gst_smokeenc_init), (gst_smokeenc_resync), (gst_smokeenc_chain): * ext/jpeg/gstsmokeenc.h: * ext/jpeg/smokecodec.c: (smokecodec_encode_new), (smokecodec_decode_new), (smokecodec_info_free), (smokecodec_set_quality), (smokecodec_get_quality), (smokecodec_set_threshold), (smokecodec_get_threshold), (smokecodec_set_bitrate), (smokecodec_get_bitrate), (find_best_size), (abs_diff), (put), (smokecodec_encode_id), (smokecodec_encode), (smokecodec_parse_id), (smokecodec_parse_header), (smokecodec_decode): * ext/jpeg/smokecodec.h: * ext/jpeg/smokeformat.h: Updated smoke, new bitstream, allows embedding in ogg.
Diffstat (limited to 'ext/jpeg/gstsmokeenc.c')
-rw-r--r--ext/jpeg/gstsmokeenc.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/ext/jpeg/gstsmokeenc.c b/ext/jpeg/gstsmokeenc.c
index 8776b6fd..212a8bcc 100644
--- a/ext/jpeg/gstsmokeenc.c
+++ b/ext/jpeg/gstsmokeenc.c
@@ -186,6 +186,7 @@ gst_smokeenc_init (GstSmokeEnc * smokeenc)
smokeenc->width = 0;
smokeenc->height = 0;
smokeenc->frame = 0;
+ smokeenc->need_header = TRUE;
gst_smokeenc_resync (smokeenc);
@@ -264,9 +265,21 @@ gst_smokeenc_link (GstPad * pad, const GstCaps * caps)
static void
gst_smokeenc_resync (GstSmokeEnc * smokeenc)
{
+ GValue fps = { 0 };
+ GValue framerate = { 0 };
+
GST_DEBUG ("gst_smokeenc_resync: resync");
- smokecodec_encode_new (&smokeenc->info, smokeenc->width, smokeenc->height);
+ g_value_init (&fps, G_TYPE_DOUBLE);
+ g_value_init (&framerate, GST_TYPE_FRACTION);
+ g_value_set_double (&fps, smokeenc->fps);
+ g_value_transform (&fps, &framerate);
+
+ smokeenc->fps_num = gst_value_get_fraction_numerator (&framerate);
+ smokeenc->fps_denom = gst_value_get_fraction_denominator (&framerate);
+
+ smokecodec_encode_new (&smokeenc->info, smokeenc->width, smokeenc->height,
+ smokeenc->fps_num, smokeenc->fps_denom);
smokecodec_set_quality (smokeenc->info, smokeenc->min_quality,
smokeenc->max_quality);
@@ -292,19 +305,33 @@ gst_smokeenc_chain (GstPad * pad, GstData * _data)
GST_DEBUG ("gst_smokeenc_chain: got buffer of %ld bytes in '%s'", size,
GST_OBJECT_NAME (smokeenc));
+ if (smokeenc->need_header) {
+ outbuf = gst_buffer_new ();
+ outsize = 256;
+ outdata = GST_BUFFER_DATA (outbuf) = g_malloc (outsize);
+ GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf);
+ GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf);
+
+ smokecodec_encode_id (smokeenc->info, outdata, &encsize);
+
+ GST_BUFFER_SIZE (outbuf) = encsize;
+
+ gst_pad_push (smokeenc->srcpad, GST_DATA (outbuf));
+
+ smokeenc->need_header = FALSE;
+ }
+
outbuf = gst_buffer_new ();
outsize = smokeenc->width * smokeenc->height * 3;
outdata = GST_BUFFER_DATA (outbuf) = g_malloc (outsize);
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf);
- GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf);
+ GST_BUFFER_DURATION (outbuf) =
+ smokeenc->fps_denom * GST_SECOND / smokeenc->fps_num;
flags = 0;
- if (smokeenc->frame == 0) {
+ if ((smokeenc->frame % smokeenc->keyframe) == 0) {
flags |= SMOKECODEC_KEYFRAME;
}
-
- smokeenc->frame = (smokeenc->frame + 1) % smokeenc->keyframe;
-
smokecodec_set_quality (smokeenc->info, smokeenc->min_quality,
smokeenc->max_quality);
smokecodec_set_threshold (smokeenc->info, smokeenc->threshold);
@@ -312,9 +339,12 @@ gst_smokeenc_chain (GstPad * pad, GstData * _data)
gst_buffer_unref (buf);
GST_BUFFER_SIZE (outbuf) = encsize;
- //memset(GST_BUFFER_DATA(outbuf)+encsize, 0, outsize - encsize);
+ GST_BUFFER_OFFSET (outbuf) = smokeenc->frame;
+ GST_BUFFER_OFFSET_END (outbuf) = smokeenc->frame + 1;
gst_pad_push (smokeenc->srcpad, GST_DATA (outbuf));
+
+ smokeenc->frame++;
}
static void