lists.zerezo.com
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [MPlayer-dev-eng] [PATCH] fix v4l2 free_demuxer crash - uvcvideo
- Date: Fri, 27 Jun 2008 12:04:52 +0700
- From: "Vladimir Voroshilov" <voroshil@xxxxxxxxx>
- Subject: Re: [MPlayer-dev-eng] [PATCH] fix v4l2 free_demuxer crash - uvcvideo
2008/6/25 Jindrich Makovicka <makovick@xxxxxxxxx>:
> On Fri, 6 Jun 2008 18:38:05 +0200
> Ötvös Attila <dc@xxxxxxxxx> wrote:
>
>> Ezzel a dátummal: Friday 30 May 2008 13.28.33 Vladimir Voroshilov ezt
>> írta:
>>
>> Hi Vladimir Voroshilov!
>>
>> >
>> > if (ioctl(priv->video_fd, VIDIOC_G_STD, &id) < 0) {
> [...]
>> >
>> > And the rest of your patch is not needed.
>> >
>> > P.S. i didn't test code above.
>> > P.P.S i don't know how much "hackish" is either my or your solution.
>>
>> I tested. It work.
>
> Nevertheless, it would still be nice to have some fallback when the fps
> is really unknown. getfps() in the attachment should be consistent with
> the fallback code in tv.c.
Here is the same patch with cosmetics removed.
I'll apply it tomorrow.
--
Regards,
Vladimir Voroshilov mailto:voroshil@xxxxxxxxx
JID: voroshil@xxxxxxxxx, voroshil@xxxxxxxxx
ICQ: 95587719
Index: tvi_v4l2.c
===================================================================
--- tvi_v4l2.c (revision 27057)
+++ tvi_v4l2.c (working copy)
@@ -336,13 +336,23 @@
}
+/*
+** Get current FPS.
+*/
+static double getfps(priv_t *priv)
+{
+ if (priv->tv_param->fps > 0)
+ return priv->tv_param->fps;
+ if (priv->standard.frameperiod.denominator && priv->standard.frameperiod.numerator)
+ return (double)priv->standard.frameperiod.denominator / priv->standard.frameperiod.numerator;
+ return 25.0;
+}
+
// sets and sanitizes audio buffer/block sizes
static void setup_audio_buffer_sizes(priv_t *priv)
{
int bytes_per_sample = priv->audio_in.bytes_per_sample;
- double fps = (double)priv->standard.frameperiod.denominator /
- priv->standard.frameperiod.numerator;
- int seconds = priv->video_buffer_size_max/fps;
+ int seconds = priv->video_buffer_size_max/getfps(priv);
if (seconds < 5) seconds = 5;
if (seconds > 500) seconds = 500;
@@ -438,6 +448,18 @@
int i=0;
if (ioctl(priv->video_fd, VIDIOC_G_STD, &id) < 0) {
+ struct v4l2_streamparm parm;
+
+ parm.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ if(ioctl(priv->video_fd, VIDIOC_G_PARM, &parm) >= 0) {
+ mp_msg(MSGT_TV, MSGL_WARN, "%s: your device driver does not support VIDIOC_G_STD ioctl,"
+ " VIDIOC_G_PARM was used instead.\n", info.short_name);
+ priv->standard.index=0;
+ priv->standard.id=0;
+ priv->standard.frameperiod=parm.parm.capture.timeperframe;
+ return 0;
+ }
+
mp_msg(MSGT_TV, MSGL_ERR, "%s: ioctl get standard failed: %s\n",
info.short_name, strerror(errno));
return -1;
@@ -701,6 +723,10 @@
priv->immediate_mode = 1;
return TVI_CONTROL_TRUE;
case TVI_CONTROL_VID_GET_FPS:
+ if (!priv->standard.frameperiod.denominator || !priv->standard.frameperiod.numerator) {
+ mp_msg(MSGT_TV, MSGL_ERR, "%s: Cannot get fps\n", info.short_name);
+ return TVI_CONTROL_FALSE;
+ }
*(float *)arg = (float)priv->standard.frameperiod.denominator /
priv->standard.frameperiod.numerator;
mp_msg(MSGT_TV, MSGL_V, "%s: get fps: %f\n", info.short_name,
@@ -1089,11 +1115,7 @@
struct v4l2_buffer buf;
/* get performance */
- frames = 1 + (priv->curr_frame - priv->first_frame +
- priv->standard.frameperiod.numerator * 500000 /
- priv->standard.frameperiod.denominator) *
- priv->standard.frameperiod.denominator /
- priv->standard.frameperiod.numerator / 1000000;
+ frames = 1 + lrintf((double)(priv->curr_frame - priv->first_frame) / (1e6 * getfps(priv)));
dropped = frames - priv->frames;
/* turn off streaming */
_______________________________________________
MPlayer-dev-eng mailing list
MPlayer-dev-eng@xxxxxxxxxxxx
https://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng