diff mbox series

[2/2] vicodec: set state->info before calling the encode/decode funcs

Message ID 20180910150040.39265-2-hverkuil@xs4all.nl (mailing list archive)
State New, archived
Headers show
Series [1/2] vicodec: check for valid format in v4l2_fwht_en/decode | expand

Commit Message

Hans Verkuil Sept. 10, 2018, 3 p.m. UTC
From: Hans Verkuil <hans.verkuil@cisco.com>

state->info was NULL since I completely forgot to set state->info.
Oops.

Reported-by: Ezequiel Garcia <ezequiel@collabora.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
---
 drivers/media/platform/vicodec/vicodec-core.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

Ezequiel Garcia Sept. 10, 2018, 3:37 p.m. UTC | #1
On Mon, 2018-09-10 at 17:00 +0200, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verkuil@cisco.com>
> 
> state->info was NULL since I completely forgot to set state->info.
> Oops.
> 
> Reported-by: Ezequiel Garcia <ezequiel@collabora.com>
> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>

For both patches:

Tested-by: Ezequiel Garcia <ezequiel@collabora.com>

With these changes, now this gstreamer pipeline no longer
crashes:

gst-launch-1.0 -v videotestsrc num-buffers=30 ! video/x-raw,width=1280,height=720 ! v4l2fwhtenc capture-io-mode=mmap output-io-mode=mmap ! v4l2fwhtdec
capture-io-mode=mmap output-io-mode=mmap ! fakesink

A few things:

  * You now need to mark "[PATCH] vicodec: fix sparse warning" as invalid.
  * v4l2fwhtenc/v4l2fwhtdec elements are not upstream yet.
  * Gstreamer doesn't end properly; and it seems to negotiate
    different sizes for encoded and decoded unless explicitly set.

Thanks!

>  drivers/media/platform/vicodec/vicodec-core.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/media/platform/vicodec/vicodec-core.c b/drivers/media/platform/vicodec/vicodec-core.c
> index fdd77441a47b..5d42a8414283 100644
> --- a/drivers/media/platform/vicodec/vicodec-core.c
> +++ b/drivers/media/platform/vicodec/vicodec-core.c
> @@ -176,12 +176,15 @@ static int device_process(struct vicodec_ctx *ctx,
>  	}
>  
>  	if (ctx->is_enc) {
> -		unsigned int size = v4l2_fwht_encode(state, p_in, p_out);
> -
> -		vb2_set_plane_payload(&out_vb->vb2_buf, 0, size);
> +		state->info = q_out->info;
> +		ret = v4l2_fwht_encode(state, p_in, p_out);
> +		if (ret < 0)
> +			return ret;
> +		vb2_set_plane_payload(&out_vb->vb2_buf, 0, ret);
>  	} else {
> +		state->info = q_cap->info;
>  		ret = v4l2_fwht_decode(state, p_in, p_out);
> -		if (ret)
> +		if (ret < 0)
>  			return ret;
>  		vb2_set_plane_payload(&out_vb->vb2_buf, 0, q_cap->sizeimage);
>  	}
Nicolas Dufresne Sept. 10, 2018, 5:16 p.m. UTC | #2
Le lundi 10 septembre 2018 à 12:37 -0300, Ezequiel Garcia a écrit :
> On Mon, 2018-09-10 at 17:00 +0200, Hans Verkuil wrote:
> > From: Hans Verkuil <hans.verkuil@cisco.com>
> > 
> > state->info was NULL since I completely forgot to set state->info.
> > Oops.
> > 
> > Reported-by: Ezequiel Garcia <ezequiel@collabora.com>
> > Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
> 
> For both patches:
> 
> Tested-by: Ezequiel Garcia <ezequiel@collabora.com>
> 
> With these changes, now this gstreamer pipeline no longer
> crashes:
> 
> gst-launch-1.0 -v videotestsrc num-buffers=30 ! video/x-
> raw,width=1280,height=720 ! v4l2fwhtenc capture-io-mode=mmap output-
> io-mode=mmap ! v4l2fwhtdec
> capture-io-mode=mmap output-io-mode=mmap ! fakesink
> 
> A few things:
> 
>   * You now need to mark "[PATCH] vicodec: fix sparse warning" as
> invalid.
>   * v4l2fwhtenc/v4l2fwhtdec elements are not upstream yet.
>   * Gstreamer doesn't end properly; and it seems to negotiate

Is the driver missing CMD_STOP implementation ? (draining flow)

>     different sizes for encoded and decoded unless explicitly set.
> 
> Thanks!
> 
> >  drivers/media/platform/vicodec/vicodec-core.c | 11 +++++++----
> >  1 file changed, 7 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/media/platform/vicodec/vicodec-core.c
> > b/drivers/media/platform/vicodec/vicodec-core.c
> > index fdd77441a47b..5d42a8414283 100644
> > --- a/drivers/media/platform/vicodec/vicodec-core.c
> > +++ b/drivers/media/platform/vicodec/vicodec-core.c
> > @@ -176,12 +176,15 @@ static int device_process(struct vicodec_ctx
> > *ctx,
> >  	}
> >  
> >  	if (ctx->is_enc) {
> > -		unsigned int size = v4l2_fwht_encode(state, p_in,
> > p_out);
> > -
> > -		vb2_set_plane_payload(&out_vb->vb2_buf, 0, size);
> > +		state->info = q_out->info;
> > +		ret = v4l2_fwht_encode(state, p_in, p_out);
> > +		if (ret < 0)
> > +			return ret;
> > +		vb2_set_plane_payload(&out_vb->vb2_buf, 0, ret);
> >  	} else {
> > +		state->info = q_cap->info;
> >  		ret = v4l2_fwht_decode(state, p_in, p_out);
> > -		if (ret)
> > +		if (ret < 0)
> >  			return ret;
> >  		vb2_set_plane_payload(&out_vb->vb2_buf, 0, q_cap-
> > >sizeimage);
> >  	}
> 
>
Ezequiel Garcia Sept. 10, 2018, 8:20 p.m. UTC | #3
On Mon, 2018-09-10 at 13:16 -0400, Nicolas Dufresne wrote:
> Le lundi 10 septembre 2018 à 12:37 -0300, Ezequiel Garcia a écrit :
> > On Mon, 2018-09-10 at 17:00 +0200, Hans Verkuil wrote:
> > > From: Hans Verkuil <hans.verkuil@cisco.com>
> > > 
> > > state->info was NULL since I completely forgot to set state->info.
> > > Oops.
> > > 
> > > Reported-by: Ezequiel Garcia <ezequiel@collabora.com>
> > > Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
> > 
> > For both patches:
> > 
> > Tested-by: Ezequiel Garcia <ezequiel@collabora.com>
> > 
> > With these changes, now this gstreamer pipeline no longer
> > crashes:
> > 
> > gst-launch-1.0 -v videotestsrc num-buffers=30 ! video/x-
> > raw,width=1280,height=720 ! v4l2fwhtenc capture-io-mode=mmap output-
> > io-mode=mmap ! v4l2fwhtdec
> > capture-io-mode=mmap output-io-mode=mmap ! fakesink
> > 
> > A few things:
> > 
> >   * You now need to mark "[PATCH] vicodec: fix sparse warning" as
> > invalid.
> >   * v4l2fwhtenc/v4l2fwhtdec elements are not upstream yet.
> >   * Gstreamer doesn't end properly; and it seems to negotiate
> 
> Is the driver missing CMD_STOP implementation ? (draining flow)
> 

I think that's the case.

Gstreamer debug log, right before it stalls:

0:00:16.929785442   180 0x5593bcbd18a0 DEBUG           v4l2videodec gstv4l2videodec.c:375:gst_v4l2_video_dec_finish:<v4l2fwhtdec0> Finishing decoding
0:00:16.931866009   180 0x5593bcbd18a0 DEBUG           v4l2videodec gstv4l2videodec.c:340:gst_v4l2_decoder_cmd:<v4l2fwhtdec0> sending v4l2 decoder
command 1 with flags 0
0:00:16.934260349   180 0x5593bcbd18a0 DEBUG           v4l2videodec gstv4l2videodec.c:384:gst_v4l2_video_dec_finish:<v4l2fwhtdec0> Waiting for decoder
stop
[stalls here]

Regards,
Ezequiel
Hans Verkuil Sept. 11, 2018, 6:56 a.m. UTC | #4
On 09/10/2018 05:37 PM, Ezequiel Garcia wrote:
> On Mon, 2018-09-10 at 17:00 +0200, Hans Verkuil wrote:
>> From: Hans Verkuil <hans.verkuil@cisco.com>
>>
>> state->info was NULL since I completely forgot to set state->info.
>> Oops.
>>
>> Reported-by: Ezequiel Garcia <ezequiel@collabora.com>
>> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
> 
> For both patches:
> 
> Tested-by: Ezequiel Garcia <ezequiel@collabora.com>
> 
> With these changes, now this gstreamer pipeline no longer
> crashes:
> 
> gst-launch-1.0 -v videotestsrc num-buffers=30 ! video/x-raw,width=1280,height=720 ! v4l2fwhtenc capture-io-mode=mmap output-io-mode=mmap ! v4l2fwhtdec
> capture-io-mode=mmap output-io-mode=mmap ! fakesink
> 
> A few things:
> 
>   * You now need to mark "[PATCH] vicodec: fix sparse warning" as invalid.

I'll wait for that to be merged (it's already in a pending pull request), then
rework this patch and add your other patches for a new pull request.

>   * v4l2fwhtenc/v4l2fwhtdec elements are not upstream yet.
>   * Gstreamer doesn't end properly; and it seems to negotiate
>     different sizes for encoded and decoded unless explicitly set.

As mentioned before, vicodec isn't fully compliant with the upcoming
codec spec, and is also missing certain features (selection support,
support for custom bytesperline values, padding, midstream resolution
changes). Patches are welcome.

If you are working on gstreamer elements for this codec, then it would
be great if you could look at making the driver compliant. I have no
plans to work on vicodec until that codec spec is fully finalized, so
you can go ahead with that if you want to.

Would be really nice, and after all, that's why I wrote vicodec!

Regards,

	Hans

> 
> Thanks!
> 
>>  drivers/media/platform/vicodec/vicodec-core.c | 11 +++++++----
>>  1 file changed, 7 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/media/platform/vicodec/vicodec-core.c b/drivers/media/platform/vicodec/vicodec-core.c
>> index fdd77441a47b..5d42a8414283 100644
>> --- a/drivers/media/platform/vicodec/vicodec-core.c
>> +++ b/drivers/media/platform/vicodec/vicodec-core.c
>> @@ -176,12 +176,15 @@ static int device_process(struct vicodec_ctx *ctx,
>>  	}
>>  
>>  	if (ctx->is_enc) {
>> -		unsigned int size = v4l2_fwht_encode(state, p_in, p_out);
>> -
>> -		vb2_set_plane_payload(&out_vb->vb2_buf, 0, size);
>> +		state->info = q_out->info;
>> +		ret = v4l2_fwht_encode(state, p_in, p_out);
>> +		if (ret < 0)
>> +			return ret;
>> +		vb2_set_plane_payload(&out_vb->vb2_buf, 0, ret);
>>  	} else {
>> +		state->info = q_cap->info;
>>  		ret = v4l2_fwht_decode(state, p_in, p_out);
>> -		if (ret)
>> +		if (ret < 0)
>>  			return ret;
>>  		vb2_set_plane_payload(&out_vb->vb2_buf, 0, q_cap->sizeimage);
>>  	}
>
diff mbox series

Patch

diff --git a/drivers/media/platform/vicodec/vicodec-core.c b/drivers/media/platform/vicodec/vicodec-core.c
index fdd77441a47b..5d42a8414283 100644
--- a/drivers/media/platform/vicodec/vicodec-core.c
+++ b/drivers/media/platform/vicodec/vicodec-core.c
@@ -176,12 +176,15 @@  static int device_process(struct vicodec_ctx *ctx,
 	}
 
 	if (ctx->is_enc) {
-		unsigned int size = v4l2_fwht_encode(state, p_in, p_out);
-
-		vb2_set_plane_payload(&out_vb->vb2_buf, 0, size);
+		state->info = q_out->info;
+		ret = v4l2_fwht_encode(state, p_in, p_out);
+		if (ret < 0)
+			return ret;
+		vb2_set_plane_payload(&out_vb->vb2_buf, 0, ret);
 	} else {
+		state->info = q_cap->info;
 		ret = v4l2_fwht_decode(state, p_in, p_out);
-		if (ret)
+		if (ret < 0)
 			return ret;
 		vb2_set_plane_payload(&out_vb->vb2_buf, 0, q_cap->sizeimage);
 	}