static void *y4frame_thread(void *arg) { y4data *thread_data=(y4data *)arg; lives_yuv4m_t *yuv4mpeg=thread_data->yuv4mpeg; char buff[5],bchar; thread_data->i=Y4M_OK; // read 5 bytes FRAME fill_read(yuv4mpeg->fd,buff,5); if (strncmp(buff,"FRAME",5)) { thread_data->i=Y4M_ERR_MAGIC; pthread_exit(NULL); } do { fill_read(yuv4mpeg->fd,&bchar,1); } while (strncmp(&bchar,"\n",1)); // read YUV420 fill_read(yuv4mpeg->fd,(char *)yuv4mpeg->pixel_data[0],yuv4mpeg->hsize*yuv4mpeg->vsize); fill_read(yuv4mpeg->fd,(char *)yuv4mpeg->pixel_data[1],yuv4mpeg->hsize*yuv4mpeg->vsize/4); fill_read(yuv4mpeg->fd,(char *)yuv4mpeg->pixel_data[2],yuv4mpeg->hsize*yuv4mpeg->vsize/4); pthread_exit(NULL); }
static ssize_t read(struct file * file, char __user * userbuf, size_t count, loff_t * off) { char *buffer = file->private_data; struct dentry *dentry = file->f_dentry; int size = dentry->d_inode->i_size; loff_t offs = *off; int ret; if (count > PAGE_SIZE) count = PAGE_SIZE; if (size) { if (offs > size) return 0; if (offs + count > size) count = size - offs; } ret = fill_read(dentry, buffer, offs, count); if (ret < 0) return ret; count = ret; if (copy_to_user(userbuf, buffer, count)) return -EFAULT; pr_debug("offs = %lld, *off = %lld, count = %zd\n", offs, *off, count); *off = offs + count; return count; }
static ssize_t read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off) { struct bin_buffer *bb = file->private_data; struct dentry *dentry = file->f_path.dentry; int size = dentry->d_inode->i_size; loff_t offs = *off; int count = min_t(size_t, bytes, PAGE_SIZE); if (size) { if (offs > size) return 0; if (offs + count > size) count = size - offs; } mutex_lock(&bb->mutex); count = fill_read(dentry, bb->buffer, offs, count); if (count < 0) goto out_unlock; if (copy_to_user(userbuf, bb->buffer, count)) { count = -EFAULT; goto out_unlock; } pr_debug("offs = %lld, *off = %lld, count = %d\n", offs, *off, count); *off = offs + count; out_unlock: mutex_unlock(&bb->mutex); return count; }
static ssize_t read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off) { struct bin_buffer *bb = file->private_data; struct dentry *dentry = file->f_path.dentry; int size = dentry->d_inode->i_size; loff_t offs = *off; int count = min_t(size_t, bytes, PAGE_SIZE); char *temp; if (!bytes) return 0; if (size) { if (offs > size) return 0; if (offs + count > size) count = size - offs; } temp = kmalloc(count, GFP_KERNEL); if (!temp) return -ENOMEM; mutex_lock(&bb->mutex); count = fill_read(dentry, bb->buffer, offs, count); if (count < 0) { mutex_unlock(&bb->mutex); goto out_free; } memcpy(temp, bb->buffer, count); mutex_unlock(&bb->mutex); if (copy_to_user(userbuf, temp, count)) { count = -EFAULT; goto out_free; } pr_debug("offs = %lld, *off = %lld, count = %d\n", offs, *off, count); *off = offs + count; out_free: kfree(temp); return count; }