summaryrefslogtreecommitdiff
path: root/ext/schroedinger
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2011-08-12 12:08:20 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2011-08-12 12:08:20 +0200
commit935b3828a3e926ac89d33c0b77ca4b44519cce41 (patch)
treeeaf15ca007cfdcfe4c02b04fd7906476f2397437 /ext/schroedinger
parent896a0edbdcc14765b7ac8bc7cc8a52158b7535d9 (diff)
downloadgstreamer-plugins-bad-935b3828a3e926ac89d33c0b77ca4b44519cce41.tar.gz
schroenc: Update for basevideoencoder ::get_caps() removal
Diffstat (limited to 'ext/schroedinger')
-rw-r--r--ext/schroedinger/gstschroenc.c145
1 files changed, 50 insertions, 95 deletions
diff --git a/ext/schroedinger/gstschroenc.c b/ext/schroedinger/gstschroenc.c
index 3190e950e..beda4eac9 100644
--- a/ext/schroedinger/gstschroenc.c
+++ b/ext/schroedinger/gstschroenc.c
@@ -60,7 +60,6 @@ struct _GstSchroEnc
/* state */
SchroEncoder *encoder;
SchroVideoFormat *video_format;
- GstBuffer *seq_header_buffer;
guint64 last_granulepos;
guint64 granule_offset;
@@ -102,8 +101,6 @@ static GstFlowReturn gst_schro_enc_handle_frame (GstBaseVideoEncoder *
base_video_encoder, GstVideoFrame * frame);
static GstFlowReturn gst_schro_enc_shape_output (GstBaseVideoEncoder *
base_video_encoder, GstVideoFrame * frame);
-static GstCaps *gst_schro_enc_get_caps (GstBaseVideoEncoder *
- base_video_encoder);
static GstStaticPadTemplate gst_schro_enc_sink_template =
GST_STATIC_PAD_TEMPLATE ("sink",
@@ -219,7 +216,6 @@ gst_schro_enc_class_init (GstSchroEncClass * klass)
GST_DEBUG_FUNCPTR (gst_schro_enc_handle_frame);
basevideocoder_class->shape_output =
GST_DEBUG_FUNCPTR (gst_schro_enc_shape_output);
- basevideocoder_class->get_caps = GST_DEBUG_FUNCPTR (gst_schro_enc_get_caps);
}
static void
@@ -242,6 +238,9 @@ gst_schro_enc_set_format (GstBaseVideoEncoder * base_video_encoder,
GstVideoState * state)
{
GstSchroEnc *schro_enc = GST_SCHRO_ENC (base_video_encoder);
+ GstCaps *caps;
+ GstBuffer *seq_header_buffer;
+ gboolean ret;
GST_DEBUG ("set_output_caps");
@@ -292,13 +291,58 @@ gst_schro_enc_set_format (GstBaseVideoEncoder * base_video_encoder,
schro_encoder_set_video_format (schro_enc->encoder, schro_enc->video_format);
schro_encoder_start (schro_enc->encoder);
- schro_enc->seq_header_buffer =
+ seq_header_buffer =
gst_schro_wrap_schro_buffer (schro_encoder_encode_sequence_header
(schro_enc->encoder));
schro_enc->granule_offset = ~0;
- return TRUE;
+ caps = gst_caps_new_simple ("video/x-dirac",
+ "width", G_TYPE_INT, state->width,
+ "height", G_TYPE_INT, state->height,
+ "framerate", GST_TYPE_FRACTION, state->fps_n,
+ state->fps_d,
+ "pixel-aspect-ratio", GST_TYPE_FRACTION, state->par_n,
+ state->par_d, NULL);
+
+ GST_BUFFER_FLAG_SET (seq_header_buffer, GST_BUFFER_FLAG_IN_CAPS);
+ {
+ GValue array = { 0 };
+ GValue value = { 0 };
+ GstBuffer *buf;
+ int size;
+
+ g_value_init (&array, GST_TYPE_ARRAY);
+ g_value_init (&value, GST_TYPE_BUFFER);
+ size = GST_BUFFER_SIZE (seq_header_buffer);
+ buf = gst_buffer_new_and_alloc (size + SCHRO_PARSE_HEADER_SIZE);
+
+ /* ogg(mux) expects the header buffers to have 0 timestamps -
+ set OFFSET and OFFSET_END accordingly */
+ GST_BUFFER_OFFSET (buf) = 0;
+ GST_BUFFER_OFFSET_END (buf) = 0;
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
+
+ memcpy (GST_BUFFER_DATA (buf), GST_BUFFER_DATA (seq_header_buffer), size);
+ GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + size + 0, 0x42424344);
+ GST_WRITE_UINT8 (GST_BUFFER_DATA (buf) + size + 4,
+ SCHRO_PARSE_CODE_END_OF_SEQUENCE);
+ GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + size + 5, 0);
+ GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + size + 9, size);
+ gst_value_set_buffer (&value, buf);
+ gst_buffer_unref (buf);
+ gst_value_array_append_value (&array, &value);
+ gst_structure_set_value (gst_caps_get_structure (caps, 0),
+ "streamheader", &array);
+ g_value_unset (&value);
+ g_value_unset (&array);
+ }
+ gst_buffer_unref (seq_header_buffer);
+
+ ret = gst_pad_set_caps (GST_BASE_VIDEO_CODEC_SRC_PAD (schro_enc), caps);
+ gst_caps_unref (caps);
+
+ return ret;
}
static void
@@ -385,10 +429,6 @@ gst_schro_enc_stop (GstBaseVideoEncoder * base_video_encoder)
schro_encoder_free (schro_enc->encoder);
schro_enc->encoder = NULL;
}
- if (schro_enc->seq_header_buffer) {
- gst_buffer_unref (schro_enc->seq_header_buffer);
- schro_enc->seq_header_buffer = NULL;
- }
if (schro_enc->video_format) {
g_free (schro_enc->video_format);
schro_enc->video_format = NULL;
@@ -439,91 +479,6 @@ gst_schro_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder,
return ret;
}
-#if 0
-static void
-gst_caps_add_streamheader (GstCaps * caps, GList * list)
-{
- GValue array = { 0 };
- GValue value = { 0 };
- GstBuffer *buf;
- GList *g;
-
- g_value_init (&array, GST_TYPE_ARRAY);
-
- for (g = g_list_first (list); g; g = g_list_next (list)) {
- g_value_init (&value, GST_TYPE_BUFFER);
- buf = gst_buffer_copy (GST_BUFFER (g->data));
- gst_value_set_buffer (&value, buf);
- gst_buffer_unref (buf);
- gst_value_array_append_value (&array, &value);
- g_value_unset (&value);
- }
- gst_structure_set_value (gst_caps_get_structure (caps, 0),
- "streamheader", &array);
- g_value_unset (&array);
-}
-#endif
-
-static GstCaps *
-gst_schro_enc_get_caps (GstBaseVideoEncoder * base_video_encoder)
-{
- GstCaps *caps;
- const GstVideoState *state;
- GstSchroEnc *schro_enc;
-
- schro_enc = GST_SCHRO_ENC (base_video_encoder);
-
- state = gst_base_video_encoder_get_state (base_video_encoder);
-
- caps = gst_caps_new_simple ("video/x-dirac",
- "width", G_TYPE_INT, state->width,
- "height", G_TYPE_INT, state->height,
- "framerate", GST_TYPE_FRACTION, state->fps_n,
- state->fps_d,
- "pixel-aspect-ratio", GST_TYPE_FRACTION, state->par_n,
- state->par_d, NULL);
-
- GST_BUFFER_FLAG_SET (schro_enc->seq_header_buffer, GST_BUFFER_FLAG_IN_CAPS);
-
- {
- GValue array = { 0 };
- GValue value = { 0 };
- GstBuffer *buf;
- int size;
-
- g_value_init (&array, GST_TYPE_ARRAY);
- g_value_init (&value, GST_TYPE_BUFFER);
- size = GST_BUFFER_SIZE (schro_enc->seq_header_buffer);
- buf = gst_buffer_new_and_alloc (size + SCHRO_PARSE_HEADER_SIZE);
-
- /* ogg(mux) expects the header buffers to have 0 timestamps -
- set OFFSET and OFFSET_END accordingly */
- GST_BUFFER_OFFSET (buf) = 0;
- GST_BUFFER_OFFSET_END (buf) = 0;
- GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_IN_CAPS);
-
- memcpy (GST_BUFFER_DATA (buf),
- GST_BUFFER_DATA (schro_enc->seq_header_buffer), size);
- GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + size + 0, 0x42424344);
- GST_WRITE_UINT8 (GST_BUFFER_DATA (buf) + size + 4,
- SCHRO_PARSE_CODE_END_OF_SEQUENCE);
- GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + size + 5, 0);
- GST_WRITE_UINT32_BE (GST_BUFFER_DATA (buf) + size + 9, size);
- gst_value_set_buffer (&value, buf);
- gst_buffer_unref (buf);
- gst_value_array_append_value (&array, &value);
- gst_structure_set_value (gst_caps_get_structure (caps, 0),
- "streamheader", &array);
- g_value_unset (&value);
- g_value_unset (&array);
- }
-
- return caps;
-}
-
-
-
-
static GstFlowReturn
gst_schro_enc_shape_output (GstBaseVideoEncoder * base_video_encoder,
GstVideoFrame * frame)