|
@@ -1078,7 +1078,7 @@ static int mpeg_open(struct inode *inode, struct file *file)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (blackbird_initialize_codec(dev) < 0) {
|
|
|
+ if (!atomic_read(&dev->core->mpeg_users) && blackbird_initialize_codec(dev) < 0) {
|
|
|
if (drv)
|
|
|
drv->request_release(drv);
|
|
|
unlock_kernel();
|
|
@@ -1109,6 +1109,8 @@ static int mpeg_open(struct inode *inode, struct file *file)
|
|
|
fh->mpegq.field);
|
|
|
unlock_kernel();
|
|
|
|
|
|
+ atomic_inc(&dev->core->mpeg_users);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1118,7 +1120,7 @@ static int mpeg_release(struct inode *inode, struct file *file)
|
|
|
struct cx8802_dev *dev = fh->dev;
|
|
|
struct cx8802_driver *drv = NULL;
|
|
|
|
|
|
- if (dev->mpeg_active)
|
|
|
+ if (dev->mpeg_active && atomic_read(&dev->core->mpeg_users) == 1)
|
|
|
blackbird_stop_codec(dev);
|
|
|
|
|
|
cx8802_cancel_buffers(fh->dev);
|
|
@@ -1138,6 +1140,8 @@ static int mpeg_release(struct inode *inode, struct file *file)
|
|
|
if (drv)
|
|
|
drv->request_release(drv);
|
|
|
|
|
|
+ atomic_dec(&dev->core->mpeg_users);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|