|
@@ -1247,6 +1247,16 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
|
|
{
|
|
{
|
|
unsigned int plane;
|
|
unsigned int plane;
|
|
|
|
|
|
|
|
+ if (V4L2_TYPE_IS_OUTPUT(b->type)) {
|
|
|
|
+ if (WARN_ON_ONCE(b->bytesused == 0)) {
|
|
|
|
+ pr_warn_once("use of bytesused == 0 is deprecated and will be removed in the future,\n");
|
|
|
|
+ if (vb->vb2_queue->allow_zero_bytesused)
|
|
|
|
+ pr_warn_once("use VIDIOC_DECODER_CMD(V4L2_DEC_CMD_STOP) instead.\n");
|
|
|
|
+ else
|
|
|
|
+ pr_warn_once("use the actual size instead.\n");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (V4L2_TYPE_IS_MULTIPLANAR(b->type)) {
|
|
if (V4L2_TYPE_IS_MULTIPLANAR(b->type)) {
|
|
if (b->memory == V4L2_MEMORY_USERPTR) {
|
|
if (b->memory == V4L2_MEMORY_USERPTR) {
|
|
for (plane = 0; plane < vb->num_planes; ++plane) {
|
|
for (plane = 0; plane < vb->num_planes; ++plane) {
|
|
@@ -1276,13 +1286,22 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
|
|
* userspace clearly never bothered to set it and
|
|
* userspace clearly never bothered to set it and
|
|
* it's a safe assumption that they really meant to
|
|
* it's a safe assumption that they really meant to
|
|
* use the full plane sizes.
|
|
* use the full plane sizes.
|
|
|
|
+ *
|
|
|
|
+ * Some drivers, e.g. old codec drivers, use bytesused == 0
|
|
|
|
+ * as a way to indicate that streaming is finished.
|
|
|
|
+ * In that case, the driver should use the
|
|
|
|
+ * allow_zero_bytesused flag to keep old userspace
|
|
|
|
+ * applications working.
|
|
*/
|
|
*/
|
|
for (plane = 0; plane < vb->num_planes; ++plane) {
|
|
for (plane = 0; plane < vb->num_planes; ++plane) {
|
|
struct v4l2_plane *pdst = &v4l2_planes[plane];
|
|
struct v4l2_plane *pdst = &v4l2_planes[plane];
|
|
struct v4l2_plane *psrc = &b->m.planes[plane];
|
|
struct v4l2_plane *psrc = &b->m.planes[plane];
|
|
|
|
|
|
- pdst->bytesused = psrc->bytesused ?
|
|
|
|
- psrc->bytesused : pdst->length;
|
|
|
|
|
|
+ if (vb->vb2_queue->allow_zero_bytesused)
|
|
|
|
+ pdst->bytesused = psrc->bytesused;
|
|
|
|
+ else
|
|
|
|
+ pdst->bytesused = psrc->bytesused ?
|
|
|
|
+ psrc->bytesused : pdst->length;
|
|
pdst->data_offset = psrc->data_offset;
|
|
pdst->data_offset = psrc->data_offset;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1295,6 +1314,11 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
|
|
*
|
|
*
|
|
* If bytesused == 0 for the output buffer, then fall back
|
|
* If bytesused == 0 for the output buffer, then fall back
|
|
* to the full buffer size as that's a sensible default.
|
|
* to the full buffer size as that's a sensible default.
|
|
|
|
+ *
|
|
|
|
+ * Some drivers, e.g. old codec drivers, use bytesused == 0 as
|
|
|
|
+ * a way to indicate that streaming is finished. In that case,
|
|
|
|
+ * the driver should use the allow_zero_bytesused flag to keep
|
|
|
|
+ * old userspace applications working.
|
|
*/
|
|
*/
|
|
if (b->memory == V4L2_MEMORY_USERPTR) {
|
|
if (b->memory == V4L2_MEMORY_USERPTR) {
|
|
v4l2_planes[0].m.userptr = b->m.userptr;
|
|
v4l2_planes[0].m.userptr = b->m.userptr;
|
|
@@ -1306,10 +1330,13 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb, const struct v4l2_buffer *b
|
|
v4l2_planes[0].length = b->length;
|
|
v4l2_planes[0].length = b->length;
|
|
}
|
|
}
|
|
|
|
|
|
- if (V4L2_TYPE_IS_OUTPUT(b->type))
|
|
|
|
- v4l2_planes[0].bytesused = b->bytesused ?
|
|
|
|
- b->bytesused : v4l2_planes[0].length;
|
|
|
|
- else
|
|
|
|
|
|
+ if (V4L2_TYPE_IS_OUTPUT(b->type)) {
|
|
|
|
+ if (vb->vb2_queue->allow_zero_bytesused)
|
|
|
|
+ v4l2_planes[0].bytesused = b->bytesused;
|
|
|
|
+ else
|
|
|
|
+ v4l2_planes[0].bytesused = b->bytesused ?
|
|
|
|
+ b->bytesused : v4l2_planes[0].length;
|
|
|
|
+ } else
|
|
v4l2_planes[0].bytesused = 0;
|
|
v4l2_planes[0].bytesused = 0;
|
|
|
|
|
|
}
|
|
}
|