hi
i derive this code from aravis viewer to display video on frame buffer instead of gtk
int main (int argc, char **argv){
gst_init(&argc, &argv);
ArvViewer* viewer = new ArvViewer;
ApplicationData data;
GstElement *videoconvert;
GstElement *videosink;
GstCaps *caps;
ArvPixelFormat pixel_format;
double frame_rate;
double gain_min, gain_max;
unsigned payload;
gint width, height;
char *string;
const char *caps_string;
gboolean auto_gain, auto_exposure;
gboolean is_frame_rate_available;
gboolean is_exposure_available;
gboolean is_exposure_auto_available;
gboolean is_gain_available;
gboolean is_gain_auto_available;
data.buffer_count = 0;
/* Instantiation of the first available camera */
viewer->camera = arv_camera_new (NULL);
arv_viewer_init(viewer);
if (viewer->camera != NULL) {
void (*old_sigint_handler)(int);
gint payload;
arv_camera_set_region (viewer->camera, 0, 0, 2592, 2048);
arv_camera_set_frame_rate (viewer->camera, 50.0);
payload = arv_camera_get_payload (viewer->camera);
viewer->stream = arv_camera_create_stream (viewer->camera, NULL, NULL);
if (viewer->stream != NULL) {
for (int i = 0; i < 50; i++)
arv_stream_push_buffer (viewer->stream, arv_buffer_new (payload, NULL));
arv_camera_get_region (viewer->camera, NULL, NULL, &width, &height);
pixel_format = arv_camera_get_pixel_format (viewer->camera);
arv_camera_get_exposure_time_bounds (viewer->camera, &viewer->exposure_min, &viewer-
>exposure_max);
arv_camera_get_gain_bounds (viewer->camera, &gain_min, &gain_max);
frame_rate = arv_camera_get_frame_rate (viewer->camera);
caps_string = arv_pixel_format_to_gst_caps_string (pixel_format);
if (caps_string == NULL) {
g_message ("GStreamer cannot understand the camera pixel format: 0x%x!\n", (int)
pixel_format);
stop_video (viewer);
return -1;
}
arv_camera_start_acquisition (viewer->camera);
viewer->pipeline = gst_pipeline_new ("pipeline");
viewer->appsrc = gst_element_factory_make ("appsrc", NULL);
videoconvert = gst_element_factory_make ("videoconvert", NULL);
viewer->transform = gst_element_factory_make ("videoflip", NULL);
gst_bin_add_many (GST_BIN (viewer->pipeline), viewer->appsrc, videoconvert, viewer-
>transform, NULL);
if (g_str_has_prefix (caps_string, "video/x-bayer")) {
GstElement *bayer2rgb;
bayer2rgb = gst_element_factory_make ("bayer2rgb", NULL);
gst_bin_add (GST_BIN (viewer->pipeline), bayer2rgb);
gst_element_link_many (viewer->appsrc, bayer2rgb, videoconvert, viewer->transform,
NULL);
}
else {
gst_element_link_many (viewer->appsrc, videoconvert, viewer->transform, NULL);
}
videosink = gst_element_factory_make ("fbdevsink", NULL);
g_object_set(G_OBJECT (videosink), "device", "/dev/fb0", NULL);
gst_bin_add (GST_BIN (viewer->pipeline), videosink) ;
gst_element_link_many (viewer->transform, videosink, NULL);
MyStruct myst;
myst.arvViewer=viewer;
myst.appData=&data;
g_signal_connect (viewer->stream, "new-buffer", G_CALLBACK (new_buffer_cb),&myst);
arv_stream_set_emit_signals (viewer->stream, TRUE);
g_signal_connect (arv_camera_get_device (viewer->camera), "control-lost",G_CALLBACK (control_lost_cb), NULL);
g_timeout_add_seconds (1, periodic_task_cb, &data);
gst_element_set_state (viewer->pipeline, GST_STATE_PLAYING);
data.main_loop = g_main_loop_new (NULL, FALSE);
old_sigint_handler = signal (SIGINT, set_cancel);
g_main_loop_run (data.main_loop);
signal (SIGINT, old_sigint_handler);
g_main_loop_unref (data.main_loop);
arv_camera_stop_acquisition (viewer->camera);
arv_stream_set_emit_signals (viewer->stream, FALSE);
g_object_unref (viewer->stream);
} else
printf ("Can't create stream thread (check if the device is not already used)\n");
g_object_unref (viewer->camera);
} else
printf ("No camera found\n");
return 0;
}
and i know frame entrance to pipeline line is in this fucntion:
static void new_buffer_cb (ArvStream *stream, MyStruct *myst){
ArvBuffer *arv_buffer;
gint n_input_buffers, n_output_buffers;
arv_buffer = arv_stream_pop_buffer (stream);
if (arv_buffer == NULL)
return;
arv_stream_get_n_buffers (stream, &n_input_buffers, &n_output_buffers);
if (arv_buffer_get_status (arv_buffer) == ARV_BUFFER_STATUS_SUCCESS) {
myst->appData->buffer_count++;
gst_app_src_push_buffer (GST_APP_SRC (myst->arvViewer->appsrc), arv_to_gst_buffer
(arv_buffer, stream));
}
else {
arv_stream_push_buffer (stream, arv_buffer);
}
}
but my problem is framerate is zero and nothing display and i understand after a few second arv_to_gst_buffer fuction didnt call i dont realy know why?