Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[linux-dvb] Re: reading two elementary PIDs (Aud and Vid) atonce



Hi Matt,

I applied your patch to CVS but it does not works exactly as expected. 
I'll have to take a closer look on this as soon I have a little more 
time, here the outline of the problem:

When you start test_pes on the audio PID and a second test_pes on the 
video PID the second filter won't get data. But you see that the first 
one gets much more data than before.

Holger



Matt Davis wrote:
> On Friday 01 November 2002 03:42 am, Holger Waechtler wrote:
> 
>>Hi Matt,
>>
>>there are many things changed since your patch, could you please
>>regenerate your patch using "diff -pu" so that I can see the function
>>names?
>>
>>thanks,
>>
>>Holger
>>
> 
> 
> Here is a diff on the changes against the REL-0-9-2 branch checked out today:
> 
> [mdavis REL-0-9-2]$ diff -rpu DVB/ temp/DVB/
> 
> diff -rpu DVB/driver/dmxdev.c temp/DVB/driver/dmxdev.c
> --- DVB/driver/dmxdev.c	Thu Aug  1 11:46:11 2002
> +++ temp/DVB/driver/dmxdev.c	Fri Nov  1 08:48:44 2002
> @@ -722,6 +722,7 @@ DmxDevFilterAlloc(dmxdev_t *dmxdev, stru
>                  return -EMFILE;
>  	}
>          dmxdevfilter=&dmxdev->filter[i];
> +	sema_init(&dmxdevfilter->mutex, 1);
>  	file->private_data=dmxdevfilter;
>  
>  	DmxDevBufferInit(&dmxdevfilter->buffer);
> @@ -747,6 +748,11 @@ DmxDevFilterFree(dmxdev_t *dmxdev, struc
>  	        up(&dmxdev->mutex);
>  	        return -EINVAL;
>          }
> +	
> +	if (down_interruptible(&dmxdevfilter->mutex)) {
> +	        up(&dmxdev->mutex);
> +	        return -ERESTARTSYS;
> +	}
>  
>          DmxDevFilterStop(dmxdevfilter);
>  	DmxDevFilterReset(dmxdevfilter);
> @@ -761,6 +767,7 @@ DmxDevFilterFree(dmxdev_t *dmxdev, struc
>  	}
>  	DmxDevFilterStateSet(dmxdevfilter, DMXDEV_STATE_FREE);
>  	wake_up(&dmxdevfilter->buffer.queue);
> +	up(&dmxdevfilter->mutex);
>  	up(&dmxdev->mutex);
>  	//printk("free filters = %d\n", DmxDevFilterNum(dmxdev));
>          return 0;
> @@ -907,7 +914,7 @@ DmxDevRead(dmxdev_t *dmxdev, struct file
>          dmxdev_filter_t *dmxdevfilter=DmxDevFile2Filter(dmxdev, file);
>  	int ret=0;
>  
> -        if (down_interruptible(&dmxdev->mutex))
> +        if (down_interruptible(&dmxdevfilter->mutex))
>  		return -ERESTARTSYS;
>  
>  	if (dmxdevfilter->type==DMXDEV_TYPE_SEC)
> @@ -916,7 +923,7 @@ DmxDevRead(dmxdev_t *dmxdev, struct file
>  	        ret=DmxDevBufferRead(&dmxdevfilter->buffer, 
>  				     file->f_flags&O_NONBLOCK, 
>  				     buf, count, ppos);
> -        up(&dmxdev->mutex);
> +        up(&dmxdevfilter->mutex);
>  	return ret;
>  }
>  
> @@ -937,14 +944,26 @@ int DmxDevIoctl(dmxdev_t *dmxdev, struct
>  
>  	switch (cmd) {
>  	case DMX_START: 
> +	        if (down_interruptible(&dmxdevfilter->mutex)) {
> +	              up(&dmxdev->mutex);
> +		      return -ERESTARTSYS;
> +	        }
> +
>  	        if (dmxdevfilter->state<DMXDEV_STATE_SET)
>  		        ret=-EINVAL;
>  		else
>  		        ret=DmxDevFilterStart(dmxdevfilter);
> +
> +		up(&dmxdevfilter->mutex);
>  		break;
>  
>  	case DMX_STOP: 
> +	        if (down_interruptible(&dmxdevfilter->mutex)) {
> +	              up(&dmxdev->mutex);
> +		      return -ERESTARTSYS;
> +	        }
>  		ret=DmxDevFilterStop(dmxdevfilter);
> +		up(&dmxdevfilter->mutex);
>  		break;
>  
>  	case DMX_SET_FILTER: 
> @@ -954,8 +973,14 @@ int DmxDevIoctl(dmxdev_t *dmxdev, struct
>  	        if (copy_from_user(&params, parg, sizeof(params)))
>  			
>  		        ret=-EFAULT;
> -		else
> +		else {
> +	                if (down_interruptible(&dmxdevfilter->mutex)) {
> +	                        up(&dmxdev->mutex);
> +				return -ERESTARTSYS;
> +			}
>  		        ret=DmxDevFilterSet(dmxdev, dmxdevfilter, &params);
> +			up(&dmxdevfilter->mutex);
> +		}
>  		break;
>  	}
>  
> @@ -965,13 +990,24 @@ int DmxDevIoctl(dmxdev_t *dmxdev, struct
>  		
>  		if (copy_from_user(&params, parg, sizeof(params)))
>  		        ret=-EFAULT;
> -		else
> +		else {
> +	                if (down_interruptible(&dmxdevfilter->mutex)) {
> +	                      up(&dmxdev->mutex);
> +			      return -ERESTARTSYS;
> +			}
>  			ret=DmxDevPesFilterSet(dmxdev, dmxdevfilter, &params);
> +			up(&dmxdevfilter->mutex);
> +		}
>  		break;
>  	}
>  
>  	case DMX_SET_BUFFER_SIZE: 
> +	        if (down_interruptible(&dmxdevfilter->mutex)) {
> +	              up(&dmxdev->mutex);
> +		      return -ERESTARTSYS;
> +	        }
>  	        ret=DmxDevSetBufferSize(dmxdevfilter, arg);
> +		up(&dmxdevfilter->mutex);
>  		break;
>          
>          case DMX_GET_EVENT: 
> diff -rpu DVB/driver/dmxdev.h temp/DVB/driver/dmxdev.h
> --- DVB/driver/dmxdev.h	Mon Oct 29 05:51:26 2001
> +++ temp/DVB/driver/dmxdev.h	Fri Nov  1 08:48:44 2002
> @@ -96,6 +96,8 @@ typedef struct dmxdev_filter_s {
>          struct dmxdev_s *dev;
>          dmxdev_buffer_t buffer;
>  
> +        struct semaphore mutex;
> +
>          // only for sections
>          struct timer_list timer;
>          int todo;
> 
> 
> 
> 



-- 
Info:
To unsubscribe send a mail to listar@linuxtv.org with "unsubscribe linux-dvb" as subject.



Home | Main Index | Thread Index