From ce1c2530ce0b4072e0ac245755e41e5fcac95a90 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Thu, 31 Jan 2002 22:22:42 +0000 Subject: [PATCH] Various fixes Original commit message from CVS: Various fixes --- sys/v4l/TODO | 7 +++++++ sys/v4l/gstv4lelement.c | 2 +- sys/v4l/gstv4lelement.h | 2 +- sys/v4l/gstv4lmjpegsink.c | 12 +++++------- sys/v4l/gstv4lmjpegsink.h | 3 ++- sys/v4l/gstv4lmjpegsrc.c | 2 +- sys/v4l/gstv4lmjpegsrc.h | 2 +- sys/v4l/gstv4lsrc.c | 5 +---- sys/v4l/gstv4lsrc.h | 4 ++-- sys/v4l/v4l_calls.c | 2 +- sys/v4l/v4l_calls.h | 2 +- sys/v4l/v4lmjpegsink_calls.c | 2 +- sys/v4l/v4lmjpegsink_calls.h | 2 +- sys/v4l/v4lmjpegsrc_calls.c | 2 +- sys/v4l/v4lmjpegsrc_calls.h | 2 +- sys/v4l/v4lsrc_calls.c | 33 ++++++++++++++++++--------------- sys/v4l/v4lsrc_calls.h | 2 +- 17 files changed, 46 insertions(+), 40 deletions(-) diff --git a/sys/v4l/TODO b/sys/v4l/TODO index 907d644577..49d2fd5ffe 100644 --- a/sys/v4l/TODO +++ b/sys/v4l/TODO @@ -5,6 +5,13 @@ TODO list (short term): * v4lsrc: actually try the format out on capsnego * all three: fix interlacing (not handled at all...) * libgstrec: build (a library for video recording) +For other plugins: +* SDL: seems okay for now +* jpegmmxenc/dec: seems okay for now +* avidemux: seems okay for now, though it doesn't really handle + events yet +* avimux: interaction with disksink, maxfilesize support, events + (GST_EVENT_RESTART!!->s/RESTART/NEW_MEDIA/), etc. - big TODO TODO list (long term): ====================== diff --git a/sys/v4l/gstv4lelement.c b/sys/v4l/gstv4lelement.c index 930ba5f772..63b18e4422 100644 --- a/sys/v4l/gstv4lelement.c +++ b/sys/v4l/gstv4lelement.c @@ -1,5 +1,5 @@ /* G-Streamer generic V4L element - generic V4L calls handling - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/gstv4lelement.h b/sys/v4l/gstv4lelement.h index 276bb49181..9e8e7bdcc7 100644 --- a/sys/v4l/gstv4lelement.h +++ b/sys/v4l/gstv4lelement.h @@ -1,5 +1,5 @@ /* G-Streamer generic V4L element - generic V4L calls handling - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/gstv4lmjpegsink.c b/sys/v4l/gstv4lmjpegsink.c index 922413c711..8f383148ca 100644 --- a/sys/v4l/gstv4lmjpegsink.c +++ b/sys/v4l/gstv4lmjpegsink.c @@ -1,5 +1,5 @@ /* G-Streamer hardware MJPEG video sink plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -185,13 +185,13 @@ gst_v4lmjpegsink_sinkconnect (GstPad *pad, v4lmjpegsink = GST_V4LMJPEGSINK (gst_pad_get_parent (pad)); /* we are not going to act on variable caps */ - if (!GST_CAPS_IS_FIXED (vscapslist)) + if (!GST_CAPS_IS_FIXED (vscapslist) || !GST_V4L_IS_OPEN(GST_V4LELEMENT(v4lmjpegsink))) return GST_PAD_CONNECT_DELAYED; - for (caps = capslist; caps != NULL; caps = vscapslist = vscapslist->next) + for (caps = vscapslist; caps != NULL; caps = vscapslist = vscapslist->next) { - v4lmjpegsink->width = gst_caps_get_int (caps, "width"); - v4lmjpegsink->height = gst_caps_get_int (caps, "height"); + v4lmjpegsink->width = gst_caps_get_int (caps, "width"); + v4lmjpegsink->height = gst_caps_get_int (caps, "height"); if (!gst_v4lmjpegsink_set_playback(v4lmjpegsink, v4lmjpegsink->width, v4lmjpegsink->height, @@ -206,8 +206,6 @@ gst_v4lmjpegsink_sinkconnect (GstPad *pad, } /* if we got here - it's not good */ - gst_element_error(GST_ELEMENT(v4lmjpegsink), - "Failed to find acceptable caps"); return GST_PAD_CONNECT_REFUSED; } diff --git a/sys/v4l/gstv4lmjpegsink.h b/sys/v4l/gstv4lmjpegsink.h index 7c8debba6f..a9810499ca 100644 --- a/sys/v4l/gstv4lmjpegsink.h +++ b/sys/v4l/gstv4lmjpegsink.h @@ -1,5 +1,5 @@ /* G-Streamer hardware MJPEG video sink plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -71,6 +71,7 @@ struct _GstV4lMjpegSink { /* width/height/norm of the jpeg stream */ gint width; gint height; + gint norm; /* cache values */ gint x_offset; diff --git a/sys/v4l/gstv4lmjpegsrc.c b/sys/v4l/gstv4lmjpegsrc.c index ee7977550a..3a9469ffb7 100644 --- a/sys/v4l/gstv4lmjpegsrc.c +++ b/sys/v4l/gstv4lmjpegsrc.c @@ -1,5 +1,5 @@ /* G-Streamer hardware MJPEG video source plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/gstv4lmjpegsrc.h b/sys/v4l/gstv4lmjpegsrc.h index e77da9b5b0..641fd606d2 100644 --- a/sys/v4l/gstv4lmjpegsrc.h +++ b/sys/v4l/gstv4lmjpegsrc.h @@ -1,5 +1,5 @@ /* G-Streamer hardware MJPEG video source plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/gstv4lsrc.c b/sys/v4l/gstv4lsrc.c index 8ca26d5474..94a7e491ac 100644 --- a/sys/v4l/gstv4lsrc.c +++ b/sys/v4l/gstv4lsrc.c @@ -1,5 +1,5 @@ /* G-Streamer BT8x8/V4L frame grabber plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -329,8 +329,6 @@ gst_v4lsrc_srcconnect (GstPad *pad, } /* still nothing - no good caps */ - gst_element_error(GST_ELEMENT(v4lsrc), - "Failed to find acceptable caps"); return GST_PAD_CONNECT_REFUSED; } @@ -445,7 +443,6 @@ gst_v4lsrc_change_state (GstElement *element) { GstV4lSrc *v4lsrc; GstElementStateReturn parent_value; - GstCaps *caps; gint transition = GST_STATE_TRANSITION (element); g_return_val_if_fail(GST_IS_V4LSRC(element), GST_STATE_FAILURE); diff --git a/sys/v4l/gstv4lsrc.h b/sys/v4l/gstv4lsrc.h index 091227964a..6dcc083983 100644 --- a/sys/v4l/gstv4lsrc.h +++ b/sys/v4l/gstv4lsrc.h @@ -1,5 +1,5 @@ /* G-Streamer BT8x8/V4L frame grabber plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -53,7 +53,7 @@ struct _GstV4lSrc { struct video_mmap mmap; struct video_mbuf mbuf; gint sync_frame; - gboolean *frame_queued; + gint8 *frame_queued; guint buffer_size; /* a seperate pthread for the sync() thread (improves correctness of timestamps) */ diff --git a/sys/v4l/v4l_calls.c b/sys/v4l/v4l_calls.c index b2c16ead46..b2bdcaf413 100644 --- a/sys/v4l/v4l_calls.c +++ b/sys/v4l/v4l_calls.c @@ -1,5 +1,5 @@ /* G-Streamer generic V4L element - generic V4L calls handling - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/v4l_calls.h b/sys/v4l/v4l_calls.h index 01038d6da4..e69674ed08 100644 --- a/sys/v4l/v4l_calls.h +++ b/sys/v4l/v4l_calls.h @@ -1,5 +1,5 @@ /* G-Streamer generic V4L element - generic V4L calls handling - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/v4lmjpegsink_calls.c b/sys/v4l/v4lmjpegsink_calls.c index 4a69fb21f5..5fdda3b846 100644 --- a/sys/v4l/v4lmjpegsink_calls.c +++ b/sys/v4l/v4lmjpegsink_calls.c @@ -1,5 +1,5 @@ /* G-Streamer hardware MJPEG video sink plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/v4lmjpegsink_calls.h b/sys/v4l/v4lmjpegsink_calls.h index bfa90d882a..1a68a3c8fd 100644 --- a/sys/v4l/v4lmjpegsink_calls.h +++ b/sys/v4l/v4lmjpegsink_calls.h @@ -1,5 +1,5 @@ /* G-Streamer hardware MJPEG video sink plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/v4lmjpegsrc_calls.c b/sys/v4l/v4lmjpegsrc_calls.c index f6584e29af..8bb70a3eb1 100644 --- a/sys/v4l/v4lmjpegsrc_calls.c +++ b/sys/v4l/v4lmjpegsrc_calls.c @@ -1,5 +1,5 @@ /* G-Streamer hardware MJPEG video source plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/v4lmjpegsrc_calls.h b/sys/v4l/v4lmjpegsrc_calls.h index 9b5919a60f..17b4097d28 100644 --- a/sys/v4l/v4lmjpegsrc_calls.h +++ b/sys/v4l/v4lmjpegsrc_calls.h @@ -1,5 +1,5 @@ /* G-Streamer hardware MJPEG video source plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public diff --git a/sys/v4l/v4lsrc_calls.c b/sys/v4l/v4lsrc_calls.c index bc01266567..5c592e7bf2 100644 --- a/sys/v4l/v4lsrc_calls.c +++ b/sys/v4l/v4lsrc_calls.c @@ -1,5 +1,5 @@ /* G-Streamer BT8x8/V4L frame grabber plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -78,6 +78,12 @@ gst_v4lsrc_queue_frame (GstV4lSrc *v4lsrc, v4lsrc->mmap.frame = num; + if (v4lsrc->frame_queued[num] < 0) + { + v4lsrc->frame_queued[num] = 0; + return TRUE; + } + if (ioctl(GST_V4LELEMENT(v4lsrc)->video_fd, VIDIOCMCAPTURE, &(v4lsrc->mmap)) < 0) { gst_element_error(GST_ELEMENT(v4lsrc), @@ -86,7 +92,7 @@ gst_v4lsrc_queue_frame (GstV4lSrc *v4lsrc, return FALSE; } - v4lsrc->frame_queued[num] = TRUE; + v4lsrc->frame_queued[num] = 1; pthread_mutex_lock(&(v4lsrc->mutex_queued_frames)); v4lsrc->num_queued_frames++; @@ -123,6 +129,8 @@ gst_v4lsrc_soft_sync_thread (void *arg) pthread_mutex_lock(&(v4lsrc->mutex_queued_frames)); if (v4lsrc->num_queued_frames < MIN_BUFFERS_QUEUED) { + if (v4lsrc->frame_queued[frame] < 0) + break; #ifdef DEBUG fprintf(stderr, "Waiting for new frames to be queued (%d < %d)\n", v4lsrc->num_queued_frames, MIN_BUFFERS_QUEUED); @@ -132,11 +140,10 @@ gst_v4lsrc_soft_sync_thread (void *arg) } pthread_mutex_unlock(&(v4lsrc->mutex_queued_frames)); - /* if still wrong, we got interrupted and we should exit */ - if (v4lsrc->num_queued_frames < MIN_BUFFERS_QUEUED) + if (!v4lsrc->num_queued_frames) { #ifdef DEBUG - fprintf(stderr, "Still not enough frames, quitting...\n"); + fprintf(stderr, "Got signal to exit...\n"); #endif goto end; } @@ -169,11 +176,12 @@ retry: pthread_mutex_unlock(&(v4lsrc->mutex_soft_sync)); } - frame = (frame+1)%v4lsrc->mbuf.frames; - pthread_mutex_lock(&(v4lsrc->mutex_queued_frames)); v4lsrc->num_queued_frames--; + v4lsrc->frame_queued[frame] = 0; pthread_mutex_unlock(&(v4lsrc->mutex_queued_frames)); + + frame = (frame+1)%v4lsrc->mbuf.frames; } end: @@ -217,8 +225,6 @@ gst_v4lsrc_sync_next_frame (GstV4lSrc *v4lsrc, v4lsrc->isready_soft_sync[*num] = 0; pthread_mutex_unlock(&(v4lsrc->mutex_soft_sync)); - v4lsrc->frame_queued[*num] = FALSE; - return TRUE; } @@ -292,7 +298,7 @@ gst_v4lsrc_capture_init (GstV4lSrc *v4lsrc) v4lsrc->mbuf.size/(v4lsrc->mbuf.frames*1024)); /* keep trakc of queued buffers */ - v4lsrc->frame_queued = (gint *) malloc(sizeof(int) * v4lsrc->mbuf.frames); + v4lsrc->frame_queued = (gint8 *) malloc(sizeof(gint8) * v4lsrc->mbuf.frames); if (!v4lsrc->frame_queued) { gst_element_error(GST_ELEMENT(v4lsrc), @@ -301,7 +307,7 @@ gst_v4lsrc_capture_init (GstV4lSrc *v4lsrc) return FALSE; } for (n=0;nmbuf.frames;n++) - v4lsrc->frame_queued[n] = FALSE; + v4lsrc->frame_queued[n] = 0; /* init the pthread stuff */ pthread_mutex_init(&(v4lsrc->mutex_soft_sync), NULL); @@ -490,11 +496,8 @@ gst_v4lsrc_capture_stop (GstV4lSrc *v4lsrc) /* we actually need to sync on all queued buffers but not on the non-queued ones */ for (n=0;nmbuf.frames;n++) - while (v4lsrc->frame_queued[n]) - if (!gst_v4lsrc_sync_next_frame(v4lsrc, &num)) - return FALSE; + v4lsrc->frame_queued[n] = -1; - pthread_cancel(v4lsrc->thread_soft_sync); pthread_join(v4lsrc->thread_soft_sync, NULL); return TRUE; diff --git a/sys/v4l/v4lsrc_calls.h b/sys/v4l/v4lsrc_calls.h index 529186c0fc..a85735c6a4 100644 --- a/sys/v4l/v4lsrc_calls.h +++ b/sys/v4l/v4lsrc_calls.h @@ -1,5 +1,5 @@ /* G-Streamer BT8x8/V4L frame grabber plugin - * Copyright (C) 2001 Ronald Bultje + * Copyright (C) 2001-2002 Ronald Bultje * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public