summaryrefslogtreecommitdiffstats
path: root/sys/v4l2/gstv4l2tuner.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/v4l2/gstv4l2tuner.c')
-rw-r--r--sys/v4l2/gstv4l2tuner.c294
1 files changed, 71 insertions, 223 deletions
diff --git a/sys/v4l2/gstv4l2tuner.c b/sys/v4l2/gstv4l2tuner.c
index ff813b5e..d0a9a1f4 100644
--- a/sys/v4l2/gstv4l2tuner.c
+++ b/sys/v4l2/gstv4l2tuner.c
@@ -27,12 +27,10 @@
#include <gst/gst.h>
#include "gstv4l2tuner.h"
-#include "gstv4l2element.h"
+#include "gstv4l2object.h"
#include "v4l2_calls.h"
#include "v4l2src_calls.h"
-#include <sys/ioctl.h>
-
static void gst_v4l2_tuner_channel_class_init (GstV4l2TunerChannelClass *
klass);
static void gst_v4l2_tuner_channel_init (GstV4l2TunerChannel * channel);
@@ -40,36 +38,6 @@ static void gst_v4l2_tuner_channel_init (GstV4l2TunerChannel * channel);
static void gst_v4l2_tuner_norm_class_init (GstV4l2TunerNormClass * klass);
static void gst_v4l2_tuner_norm_init (GstV4l2TunerNorm * norm);
-static const GList *gst_v4l2_tuner_list_channels (GstTuner * mixer);
-
-static void
-gst_v4l2_tuner_set_channel_and_notify (GstTuner * mixer,
- GstTunerChannel * channel);
-static GstTunerChannel *gst_v4l2_tuner_get_channel (GstTuner * mixer);
-
-static const GList *gst_v4l2_tuner_list_norms (GstTuner * mixer);
-
-static void
-gst_v4l2_tuner_set_norm_and_notify (GstTuner * mixer, GstTunerNorm * norm);
-static GstTunerNorm *gst_v4l2_tuner_get_norm (GstTuner * mixer);
-
-static void
-gst_v4l2_tuner_set_frequency_and_notify (GstTuner * mixer,
- GstTunerChannel * channel, gulong frequency);
-static gulong gst_v4l2_tuner_get_frequency (GstTuner * mixer,
- GstTunerChannel * channel);
-static gint gst_v4l2_tuner_signal_strength (GstTuner * mixer,
- GstTunerChannel * channel);
-
-static gboolean gst_v4l2_get_input (GstV4l2Element * v4l2element, gint * input);
-static gboolean gst_v4l2_set_input (GstV4l2Element * v4l2element, gint input);
-
-#if 0 /* output not handled by now */
-static gboolean
-gst_v4l2_get_output (GstV4l2Element * v4l2element, gint * output);
-static gboolean gst_v4l2_set_output (GstV4l2Element * v4l2element, gint output);
-#endif /* #if 0 - output not handled by now */
-
static GstTunerNormClass *norm_parent_class = NULL;
static GstTunerChannelClass *channel_parent_class = NULL;
@@ -153,26 +121,9 @@ gst_v4l2_tuner_norm_init (GstV4l2TunerNorm * norm)
norm->index = 0;
}
-void
-gst_v4l2_tuner_interface_init (GstTunerClass * klass)
-{
- /* default virtual functions */
- klass->list_channels = gst_v4l2_tuner_list_channels;
- klass->set_channel = gst_v4l2_tuner_set_channel_and_notify;
- klass->get_channel = gst_v4l2_tuner_get_channel;
-
- klass->list_norms = gst_v4l2_tuner_list_norms;
- klass->set_norm = gst_v4l2_tuner_set_norm_and_notify;
- klass->get_norm = gst_v4l2_tuner_get_norm;
-
- klass->set_frequency = gst_v4l2_tuner_set_frequency_and_notify;
- klass->get_frequency = gst_v4l2_tuner_get_frequency;
- klass->signal_strength = gst_v4l2_tuner_signal_strength;
-}
-
#if 0 /* output not handled by now */
static gboolean
-gst_v4l2_tuner_is_sink (GstV4l2Element * v4l2element)
+gst_v4l2_tuner_is_sink (GstV4l2Object * v4l2object)
{
GstPadDirection dir = GST_PAD_UNKNOWN;
@@ -181,56 +132,47 @@ gst_v4l2_tuner_is_sink (GstV4l2Element * v4l2element)
#endif /* #if 0 - output not handled by now */
static G_GNUC_UNUSED gboolean
-gst_v4l2_tuner_contains_channel (GstV4l2Element * v4l2element,
+gst_v4l2_tuner_contains_channel (GstV4l2Object * v4l2object,
GstV4l2TunerChannel * v4l2channel)
{
const GList *item;
- for (item = v4l2element->inputs; item != NULL; item = item->next)
+ for (item = v4l2object->inputs; item != NULL; item = item->next)
if (item->data == v4l2channel)
return TRUE;
return FALSE;
}
-static const GList *
-gst_v4l2_tuner_list_channels (GstTuner * mixer)
+const GList *
+gst_v4l2_tuner_list_channels (GstV4l2Object * v4l2object)
{
- return GST_V4L2ELEMENT (mixer)->inputs;
+ return v4l2object->inputs;
}
-static void
-gst_v4l2_tuner_set_channel_and_notify (GstTuner * mixer,
+void
+gst_v4l2_tuner_set_channel_and_notify (GstV4l2Object * v4l2object,
GstTunerChannel * channel)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
-
- if (gst_v4l2_tuner_set_channel (mixer, channel)) {
- g_object_notify (G_OBJECT (v4l2element), "input");
+ if (gst_v4l2_tuner_set_channel (v4l2object, channel)) {
+ g_object_notify (G_OBJECT (v4l2object->element), "input");
}
}
gboolean
-gst_v4l2_tuner_set_channel (GstTuner * mixer, GstTunerChannel * channel)
+gst_v4l2_tuner_set_channel (GstV4l2Object * v4l2object,
+ GstTunerChannel * channel)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
- GstV4l2Src *v4l2src = GST_V4L2SRC (v4l2element);
GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel);
/* assert that we're opened and that we're using a known item */
- g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), FALSE);
- g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2element,
+ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE);
+ g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object,
v4l2channel), FALSE);
- if (
-#if 0 /* output not handled by now */
- gst_v4l2_tuner_is_sink (v4l2element) ?
- gst_v4l2_set_output (v4l2element, v4l2channel->index) :
-#endif /* #if 0 - output not handled by now */
- gst_v4l2_set_input (v4l2element, v4l2channel->index)
- ) {
- gst_tuner_channel_changed (mixer, channel);
- gst_v4l2src_get_fps (v4l2src, &v4l2src->fps_n, &v4l2src->fps_d);
+ if (v4l2object->set_in_out_func (v4l2object, v4l2channel->index)) {
+ gst_tuner_channel_changed (GST_TUNER (v4l2object->element), channel);
+ v4l2object->update_fps_func (v4l2object);
return TRUE;
}
@@ -238,62 +180,18 @@ gst_v4l2_tuner_set_channel (GstTuner * mixer, GstTunerChannel * channel)
}
-static gboolean
-gst_v4l2_get_input (GstV4l2Element * v4l2element, gint * input)
+GstTunerChannel *
+gst_v4l2_tuner_get_channel (GstV4l2Object * v4l2object)
{
- gint n;
-
- GST_DEBUG_OBJECT (v4l2element, "trying to get input");
- if (!GST_V4L2_IS_OPEN (v4l2element))
- return FALSE;
-
- if (ioctl (v4l2element->video_fd, VIDIOC_G_INPUT, &n) < 0) {
- GST_WARNING_OBJECT (v4l2element,
- "Failed to get current input on device %s: %s",
- v4l2element->videodev, g_strerror (errno));
- return FALSE;
- }
-
- *input = n;
-
- return TRUE;
-}
-
-static gboolean
-gst_v4l2_set_input (GstV4l2Element * v4l2element, gint input)
-{
- GST_DEBUG_OBJECT (v4l2element, "trying to set input to %d", input);
- if (!GST_V4L2_IS_OPEN (v4l2element))
- return FALSE;
-
- if (ioctl (v4l2element->video_fd, VIDIOC_S_INPUT, &input) < 0) {
- GST_WARNING_OBJECT (v4l2element, "Failed to set input %d on device %s: %s",
- input, v4l2element->videodev, g_strerror (errno));
- return FALSE;
- }
-
- return TRUE;
-}
-
-
-static GstTunerChannel *
-gst_v4l2_tuner_get_channel (GstTuner * mixer)
-{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
GList *item;
gint channel;
/* assert that we're opened and that we're using a known item */
- g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), NULL);
+ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), NULL);
-#if 0 /* output not handled by now */
- if (gst_v4l2_tuner_is_sink (v4l2element))
- gst_v4l2_get_output (v4l2element, &channel);
- else
-#endif /* #if 0 - output not handled by now */
- gst_v4l2_get_input (v4l2element, &channel);
+ v4l2object->get_in_out_func (v4l2object, &channel);
- for (item = v4l2element->inputs; item != NULL; item = item->next) {
+ for (item = v4l2object->inputs; item != NULL; item = item->next) {
if (channel == GST_V4L2_TUNER_CHANNEL (item->data)->index)
return (GstTunerChannel *) item->data;
}
@@ -302,49 +200,46 @@ gst_v4l2_tuner_get_channel (GstTuner * mixer)
}
static G_GNUC_UNUSED gboolean
-gst_v4l2_tuner_contains_norm (GstV4l2Element * v4l2element,
+gst_v4l2_tuner_contains_norm (GstV4l2Object * v4l2object,
GstV4l2TunerNorm * v4l2norm)
{
const GList *item;
- for (item = v4l2element->stds; item != NULL; item = item->next)
+ for (item = v4l2object->stds; item != NULL; item = item->next)
if (item->data == v4l2norm)
return TRUE;
return FALSE;
}
-static const GList *
-gst_v4l2_tuner_list_norms (GstTuner * mixer)
+const GList *
+gst_v4l2_tuner_list_norms (GstV4l2Object * v4l2object)
{
- return GST_V4L2ELEMENT (mixer)->stds;
+ return v4l2object->stds;
}
-static void
-gst_v4l2_tuner_set_norm_and_notify (GstTuner * mixer, GstTunerNorm * norm)
+void
+gst_v4l2_tuner_set_norm_and_notify (GstV4l2Object * v4l2object,
+ GstTunerNorm * norm)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
-
- if (gst_v4l2_tuner_set_norm (mixer, norm)) {
- g_object_notify (G_OBJECT (v4l2element), "std");
+ if (gst_v4l2_tuner_set_norm (v4l2object, norm)) {
+ g_object_notify (G_OBJECT (v4l2object->element), "std");
}
}
gboolean
-gst_v4l2_tuner_set_norm (GstTuner * mixer, GstTunerNorm * norm)
+gst_v4l2_tuner_set_norm (GstV4l2Object * v4l2object, GstTunerNorm * norm)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
- GstV4l2Src *v4l2src = GST_V4L2SRC (v4l2element);
GstV4l2TunerNorm *v4l2norm = GST_V4L2_TUNER_NORM (norm);
/* assert that we're opened and that we're using a known item */
- g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), FALSE);
- g_return_val_if_fail (gst_v4l2_tuner_contains_norm (v4l2element, v4l2norm),
+ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE);
+ g_return_val_if_fail (gst_v4l2_tuner_contains_norm (v4l2object, v4l2norm),
FALSE);
- if (gst_v4l2_set_norm (v4l2element, v4l2norm->index)) {
- gst_tuner_norm_changed (mixer, norm);
- gst_v4l2src_get_fps (v4l2src, &v4l2src->fps_n, &v4l2src->fps_d);
+ if (gst_v4l2_set_norm (v4l2object, v4l2norm->index)) {
+ gst_tuner_norm_changed (GST_TUNER (v4l2object->element), norm);
+ v4l2object->update_fps_func (v4l2object);
return TRUE;
}
@@ -352,19 +247,18 @@ gst_v4l2_tuner_set_norm (GstTuner * mixer, GstTunerNorm * norm)
}
-static GstTunerNorm *
-gst_v4l2_tuner_get_norm (GstTuner * mixer)
+GstTunerNorm *
+gst_v4l2_tuner_get_norm (GstV4l2Object * v4l2object)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
GList *item;
v4l2_std_id norm;
/* assert that we're opened and that we're using a known item */
- g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), NULL);
+ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), NULL);
- gst_v4l2_get_norm (v4l2element, &norm);
+ gst_v4l2_get_norm (v4l2object, &norm);
- for (item = v4l2element->stds; item != NULL; item = item->next) {
+ for (item = v4l2object->stds; item != NULL; item = item->next) {
if (norm == GST_V4L2_TUNER_NORM (item->data)->index)
return (GstTunerNorm *) item->data;
}
@@ -372,131 +266,85 @@ gst_v4l2_tuner_get_norm (GstTuner * mixer)
return NULL;
}
-static void
-gst_v4l2_tuner_set_frequency_and_notify (GstTuner * mixer,
+void
+gst_v4l2_tuner_set_frequency_and_notify (GstV4l2Object * v4l2object,
GstTunerChannel * channel, gulong frequency)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
-
- if (gst_v4l2_tuner_set_frequency (mixer, channel, frequency)) {
- g_object_notify (G_OBJECT (v4l2element), "frequency");
+ if (gst_v4l2_tuner_set_frequency (v4l2object, channel, frequency)) {
+ g_object_notify (G_OBJECT (v4l2object->element), "frequency");
}
}
gboolean
-gst_v4l2_tuner_set_frequency (GstTuner * mixer,
+gst_v4l2_tuner_set_frequency (GstV4l2Object * v4l2object,
GstTunerChannel * channel, gulong frequency)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel);
gint chan;
/* assert that we're opened and that we're using a known item */
- g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), FALSE);
+ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), FALSE);
g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
GST_TUNER_CHANNEL_FREQUENCY), FALSE);
- g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2element,
+ g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object,
v4l2channel), FALSE);
- gst_v4l2_get_input (v4l2element, &chan);
+ v4l2object->get_in_out_func (v4l2object, &chan);
if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index &&
GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) {
- if (gst_v4l2_set_frequency (v4l2element, v4l2channel->tuner, frequency)) {
- gst_tuner_frequency_changed (mixer, channel, frequency);
+ if (gst_v4l2_set_frequency (v4l2object, v4l2channel->tuner, frequency)) {
+ gst_tuner_frequency_changed (GST_TUNER (v4l2object->element), channel,
+ frequency);
return TRUE;
}
}
return FALSE;
}
-static gulong
-gst_v4l2_tuner_get_frequency (GstTuner * mixer, GstTunerChannel * channel)
+gulong
+gst_v4l2_tuner_get_frequency (GstV4l2Object * v4l2object,
+ GstTunerChannel * channel)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel);
gint chan;
gulong frequency = 0;
/* assert that we're opened and that we're using a known item */
- g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), 0);
+ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), 0);
g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
GST_TUNER_CHANNEL_FREQUENCY), 0);
- g_return_val_if_fail (gst_v4l2_tuner_contains_channel
- (v4l2element, v4l2channel), 0);
+ g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object,
+ v4l2channel), 0);
- gst_v4l2_get_input (v4l2element, &chan);
+ v4l2object->get_in_out_func (v4l2object, &chan);
if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index &&
GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) {
- gst_v4l2_get_frequency (v4l2element, v4l2channel->tuner, &frequency);
+ gst_v4l2_get_frequency (v4l2object, v4l2channel->tuner, &frequency);
}
return frequency;
}
-static gint
-gst_v4l2_tuner_signal_strength (GstTuner * mixer, GstTunerChannel * channel)
+gint
+gst_v4l2_tuner_signal_strength (GstV4l2Object * v4l2object,
+ GstTunerChannel * channel)
{
- GstV4l2Element *v4l2element = GST_V4L2ELEMENT (mixer);
GstV4l2TunerChannel *v4l2channel = GST_V4L2_TUNER_CHANNEL (channel);
gint chan;
gulong signal = 0;
/* assert that we're opened and that we're using a known item */
- g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), 0);
+ g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2object), 0);
g_return_val_if_fail (GST_TUNER_CHANNEL_HAS_FLAG (channel,
GST_TUNER_CHANNEL_FREQUENCY), 0);
- g_return_val_if_fail (gst_v4l2_tuner_contains_channel
- (v4l2element, v4l2channel), 0);
+ g_return_val_if_fail (gst_v4l2_tuner_contains_channel (v4l2object,
+ v4l2channel), 0);
- gst_v4l2_get_input (v4l2element, &chan);
+ v4l2object->get_in_out_func (v4l2object, &chan);
if (chan == GST_V4L2_TUNER_CHANNEL (channel)->index &&
GST_TUNER_CHANNEL_HAS_FLAG (channel, GST_TUNER_CHANNEL_FREQUENCY)) {
- gst_v4l2_signal_strength (v4l2element, v4l2channel->tuner, &signal);
+ gst_v4l2_signal_strength (v4l2object, v4l2channel->tuner, &signal);
}
return signal;
}
-
-#if 0 /* output not handled by now */
-
-static gboolean
-gst_v4l2_get_output (GstV4l2Element * v4l2element, gint * output)
-{
- gint n;
-
- GST_DEBUG_OBJECT (v4l2element, "trying to get output");
- if (!GST_V4L2_IS_OPEN (v4l2element))
- return FALSE;
-
- if (ioctl (v4l2element->video_fd, VIDIOC_G_OUTPUT, &n) < 0) {
- GST_WARNING_OBJECT (v4l2element,
- "Failed to get current output on device %s: %s",
- v4l2element->videodev, g_strerror (errno));
- return FALSE;
- }
-
- *output = n;
-
- return TRUE;
-}
-
-static gboolean
-gst_v4l2_set_output (GstV4l2Element * v4l2element, gint output)
-{
- GST_DEBUG_OBJECT (v4l2element, "trying to set output to %d", output);
- if (!GST_V4L2_IS_OPEN (v4l2element))
- return FALSE;
- if (!GST_V4L2_IS_ACTIVE (v4l2element))
- return FALSE;
-
- if (ioctl (v4l2element->video_fd, VIDIOC_S_OUTPUT, &output) < 0) {
- GST_WARNING_OBJECT (v4l2element,
- "Failed to set current output on device %s to %d: %s",
- v4l2element->videodev, output, g_strerror (errno));
- return FALSE;
- }
-
- return TRUE;
-}
-
-#endif /* #if 0 - output not handled by now */