A quick follow-up:

On 01/08/2018 02:54 PM, Hans Verkuil wrote:
>> +/*
>> + * Videobuf operations
>> + */
>> +int dvb_vb2_init(struct dvb_vb2_ctx *ctx, const char *name, int nonblocking)
>> +{
>> +    struct vb2_queue *q = &ctx->vb_q;
>> +    int ret;
>> +
>> +    memset(ctx, 0, sizeof(struct dvb_vb2_ctx));
>> +    q->type = DVB_BUF_TYPE_CAPTURE;
> 
> We don't support DVB_BUF_TYPE_OUTPUT? Shouldn't this information come from the
> driver?
> 
>> +    /**capture type*/
> 
> Why /** ?
> 
>> +    q->is_output = 0;
> 
> Can be dropped unless we support DVB_BUF_TYPE_OUTPUT.
> 
>> +    /**only mmap is supported currently*/
> 
> /** ?
> 
>> +    q->io_modes = VB2_MMAP;
>> +    q->drv_priv = ctx;
>> +    q->buf_struct_size = sizeof(struct dvb_buffer);
>> +    q->min_buffers_needed = 1;
>> +    q->ops = &dvb_vb2_qops;
>> +    q->mem_ops = &vb2_vmalloc_memops;
>> +    q->buf_ops = &dvb_vb2_buf_ops;
>> +    q->num_buffers = 0;
> 
> Not needed, is zeroed in the memset above.
> 
> I'm also missing q->timestamp_flags: should be set to 
> V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC.

Ignore this, see my comments later on.

> 
>> +    ret = vb2_core_queue_init(q);
>> +    if (ret) {
>> +            ctx->state = DVB_VB2_STATE_NONE;
>> +            dprintk(1, "[%s] errno=%d\n", ctx->name, ret);
>> +            return ret;
>> +    }
>> +
>> +    mutex_init(&ctx->mutex);
>> +    spin_lock_init(&ctx->slock);
>> +    INIT_LIST_HEAD(&ctx->dvb_q);
>> +
>> +    strncpy(ctx->name, name, DVB_VB2_NAME_MAX);
> 
> I believe strlcpy is recommended.
> 
>> +    ctx->nonblocking = nonblocking;
>> +    ctx->state = DVB_VB2_STATE_INIT;
>> +
>> +    dprintk(3, "[%s]\n", ctx->name);
>> +
>> +    return 0;
>> +}

<snip>

>> diff --git a/include/uapi/linux/dvb/dmx.h b/include/uapi/linux/dvb/dmx.h
>> index c10f1324b4ca..e212aa18ad78 100644
>> --- a/include/uapi/linux/dvb/dmx.h
>> +++ b/include/uapi/linux/dvb/dmx.h
>> @@ -211,6 +211,64 @@ struct dmx_stc {
>>      __u64 stc;
>>  };
>>  
>> +/**
>> + * struct dmx_buffer - dmx buffer info
>> + *
>> + * @index:  id number of the buffer
>> + * @bytesused:      number of bytes occupied by data in the buffer 
>> (payload);
>> + * @offset: for buffers with memory == DMX_MEMORY_MMAP;
>> + *          offset from the start of the device memory for this plane,
>> + *          (or a "cookie" that should be passed to mmap() as offset)
> 
> Since we only support MMAP this is always a 'cookie' in practice. So I think 
> this
> should just be:
> 
>       A "cookie" that should be passed to mmap() as offset.
> 
>> + * @length: size in bytes of the buffer
>> + *
>> + * Contains data exchanged by application and driver using one of the 
>> streaming
>> + * I/O methods.
>> + */
>> +struct dmx_buffer {
>> +    __u32                   index;
>> +    __u32                   bytesused;
>> +    __u32                   offset;
> 
> I suggest making this a __u64: that way we can handle pointers as well in
> the future if we need them (as we do for the USERPTR case for V4L2).
> 
> Should this also be wrapped in a union? Useful when adding dmabuf support in 
> the
> future.
> 
> Do you think there is any use-case for multiplanar formats in the future?
> With perhaps meta data in a separate plane? Having to add support for this 
> later
> has proven to be very painful, so we need to be as certain as possible that
> this isn't going to happen. Otherwise it's better to prepare for this right 
> now.
> 
>> +    __u32                   length;
>> +    __u32                   reserved[4];
> 
> I do believe you need a memory field as well. It's only MMAP today, but in
> the future DMABUF will most likely be supported as well and you need to be
> able to tell what memory mode is being used.
> 
>> +};

There is no 'flags' field here. But without that you cannot check the buffer
states, esp. the ERROR state. Or can that never happen?

Would a timestamp field be useful, if only for debugging?

Regards,

        Hans

Reply via email to