Skip to contentSkip to conversation

coda: Unable to use encoder video_bitrate

DISCUSSION Frédéric Sureau 5 participants 11 messages Dec 18, 2014 – Dec 22, 2014 Media (V4L/DVB)

lore
Share & tools
lore
#0 lore raw

Hi

I am trying to use the coda encoder through Gstreamer on an iMX6-based board.

I use the (rebased and slightly modified) gstv4l2h264enc plugin from:
https://github.com/hizukiayaka/gst-plugins-good

This pipeline works fine:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc ! h264parse ! mp4mux ! filesink location=test.mp4

When encoder has no bitrate param set (default=0), video encoding works well, but bitrate reaches ~2.5Mbps

When I try to set the bitrate with whatever value like 100,000 or 1,000,000, the encoder produces video with bitrate around 480kbps and a very poor quality.

Here is the gstreamer pipeline I use with bitrate set:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc extra-controls="controls,video_bitrate=1000000;" ! h264parse ! mp4mux ! filesink location=test.mp4

The video_bitrate control seems to be correctly passed to the driver by GStreamer since I can see the VIDIOC_S_CTRL call.

Any idea ?

Thanks
Fred

#1 lore raw

Hi Frédéric,

Am Donnerstag, den 18.12.2014, 17:44 +0100 schrieb Frédéric Sureau:

Quoted 26 lines

Hi

I am trying to use the coda encoder through Gstreamer on an iMX6-based board.

I use the (rebased and slightly modified) gstv4l2h264enc plugin from:
https://github.com/hizukiayaka/gst-plugins-good

This pipeline works fine:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc ! h264parse ! mp4mux ! filesink location=test.mp4

When encoder has no bitrate param set (default=0), video encoding works well, but bitrate reaches ~2.5Mbps

When I try to set the bitrate with whatever value like 100,000 or 1,000,000, the encoder produces video with bitrate around 480kbps and a very poor quality.

Here is the gstreamer pipeline I use with bitrate set:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc extra-controls="controls,video_bitrate=1000000;" ! h264parse ! mp4mux ! filesink location=test.mp4

Quoted 4 lines

The video_bitrate control seems to be correctly passed to the driver by GStreamer since I can see the VIDIOC_S_CTRL call.

Any idea ?

There is a bug in the register definitions that causes the driver to apply a wrong mask before writing the bitrate to the register. I've got a fix for this in the pipeline, sending it right now.

regards
Philipp

#2 lore raw

Hi Philipp,

2014-12-18 17:52 GMT+01:00 Philipp Zabel <[email protected]>:

Quoted 29 lines

Hi Frédéric,

Am Donnerstag, den 18.12.2014, 17:44 +0100 schrieb Frédéric Sureau:

Quoted 26 lines

Hi

I am trying to use the coda encoder through Gstreamer on an iMX6-based board.

I use the (rebased and slightly modified) gstv4l2h264enc plugin from:
https://github.com/hizukiayaka/gst-plugins-good

This pipeline works fine:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc ! h264parse ! mp4mux ! filesink location=test.mp4

When encoder has no bitrate param set (default=0), video encoding works well, but bitrate reaches ~2.5Mbps

When I try to set the bitrate with whatever value like 100,000 or 1,000,000, the encoder produces video with bitrate around 480kbps and a very poor quality.

Here is the gstreamer pipeline I use with bitrate set:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc extra-controls="controls,video_bitrate=1000000;" ! h264parse ! mp4mux ! filesink location=test.mp4

Quoted 8 lines
Quoted 4 lines

The video_bitrate control seems to be correctly passed to the driver by GStreamer since I can see the VIDIOC_S_CTRL call.

Any idea ?

There is a bug in the register definitions that causes the driver to apply a wrong mask before writing the bitrate to the register. I've got a fix for this in the pipeline, sending it right now.

Where can we find the register definitions ? In order to look at it before asking you :) ?

Thanks,
JM

#3 lore raw

Hi Jean-Michel,

Am Donnerstag, den 18.12.2014, 17:55 +0100 schrieb Jean-Michel Hautbois:

Quoted 35 lines

Hi Philipp,

2014-12-18 17:52 GMT+01:00 Philipp Zabel <[email protected]>:

Quoted 32 lines

Hi Frédéric,

Am Donnerstag, den 18.12.2014, 17:44 +0100 schrieb Frédéric Sureau:

Quoted 29 lines

Hi

I am trying to use the coda encoder through Gstreamer on an iMX6-based board.

I use the (rebased and slightly modified) gstv4l2h264enc plugin from:
https://github.com/hizukiayaka/gst-plugins-good

This pipeline works fine:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc ! h264parse ! mp4mux ! filesink location=test.mp4

When encoder has no bitrate param set (default=0), video encoding works well, but bitrate reaches ~2.5Mbps

When I try to set the bitrate with whatever value like 100,000 or 1,000,000, the encoder produces video with bitrate around 480kbps and a very poor quality.

Here is the gstreamer pipeline I use with bitrate set:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc extra-controls="controls,video_bitrate=1000000;" ! h264parse ! mp4mux ! filesink location=test.mp4

The video_bitrate control seems to be correctly passed to the driver by GStreamer since I can see the VIDIOC_S_CTRL call.

Quoted 8 lines
Quoted 5 lines
Quoted 1 line

Any idea ?

There is a bug in the register definitions that causes the driver to apply a wrong mask before writing the bitrate to the register. I've got a fix for this in the pipeline, sending it right now.

Where can we find the register definitions ? In order to look at it before asking you :) ?

Sorry, forgot to put all of you on Cc: for the "[media] coda: fix encoder rate control parameter masks" patch. The coda driver is in drivers/media/platform/coda, register definitions in coda_regs.h. The CODA_RATECONTROL_BITRATE_MASK is 0x7f, but it should be 0x7fff.

regards
Philipp

#4 lore raw

2014-12-18 18:09 GMT+01:00 Philipp Zabel <[email protected]>:

Quoted 44 lines

Hi Jean-Michel,

Am Donnerstag, den 18.12.2014, 17:55 +0100 schrieb Jean-Michel Hautbois:

Quoted 41 lines

Hi Philipp,

2014-12-18 17:52 GMT+01:00 Philipp Zabel <[email protected]>:

Quoted 37 lines

Hi Frédéric,

Am Donnerstag, den 18.12.2014, 17:44 +0100 schrieb Frédéric Sureau:

Quoted 26 lines

Hi

I am trying to use the coda encoder through Gstreamer on an iMX6-based board.

I use the (rebased and slightly modified) gstv4l2h264enc plugin from:
https://github.com/hizukiayaka/gst-plugins-good

This pipeline works fine:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc ! h264parse ! mp4mux ! filesink location=test.mp4

When encoder has no bitrate param set (default=0), video encoding works well, but bitrate reaches ~2.5Mbps

When I try to set the bitrate with whatever value like 100,000 or 1,000,000, the encoder produces video with bitrate around 480kbps and a very poor quality.

Here is the gstreamer pipeline I use with bitrate set:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc extra-controls="controls,video_bitrate=1000000;" ! h264parse ! mp4mux ! filesink location=test.mp4

Quoted 4 lines

The video_bitrate control seems to be correctly passed to the driver by GStreamer since I can see the VIDIOC_S_CTRL call.

Any idea ?

There is a bug in the register definitions that causes the driver to apply a wrong mask before writing the bitrate to the register. I've got a fix for this in the pipeline, sending it right now.

Quoted 8 lines
Quoted 2 lines

Where can we find the register definitions ? In order to look at it before asking you :) ?

Sorry, forgot to put all of you on Cc: for the "[media] coda: fix encoder rate control parameter masks" patch. The coda driver is in drivers/media/platform/coda, register definitions in coda_regs.h. The CODA_RATECONTROL_BITRATE_MASK is 0x7f, but it should be 0x7fff.

Well, I meant, the datasheet of the CODA960 because we don't know, just by reading the coda_regs.h which register is where and does what. But it may be confidential ?

JM

#5 lore raw

Hi Jean-Michel,

Am Donnerstag, den 18.12.2014, 18:10 +0100 schrieb Jean-Michel Hautbois:

Quoted 8 lines
Quoted 5 lines

Sorry, forgot to put all of you on Cc: for the "[media] coda: fix encoder rate control parameter masks" patch. The coda driver is in drivers/media/platform/coda, register definitions in coda_regs.h. The CODA_RATECONTROL_BITRATE_MASK is 0x7f, but it should be 0x7fff.

Well, I meant, the datasheet of the CODA960 because we don't know, just by reading the coda_regs.h which register is where and does what.

I wish. If you search for "cnm-codadx6-datasheet-v2.9.pdf" with a search engine of your choice, on chipsnmedia.com you can get documentation for the very oldest coda version supported by the driver. That's all I have in addition to the old GPLed Freescale imx-vpu-lib for reference.

regards
Philipp

#6 lore raw

2014-12-19 11:28 GMT+01:00 Philipp Zabel <[email protected]>:

Quoted 9 lines

Hi Jean-Michel,

Am Donnerstag, den 18.12.2014, 18:10 +0100 schrieb Jean-Michel Hautbois:

Quoted 6 lines
Quoted 5 lines

Sorry, forgot to put all of you on Cc: for the "[media] coda: fix encoder rate control parameter masks" patch. The coda driver is in drivers/media/platform/coda, register definitions in coda_regs.h. The CODA_RATECONTROL_BITRATE_MASK is 0x7f, but it should be 0x7fff.

Quoted 7 lines
Quoted 2 lines

Well, I meant, the datasheet of the CODA960 because we don't know, just by reading the coda_regs.h which register is where and does what.

I wish. If you search for "cnm-codadx6-datasheet-v2.9.pdf" with a search engine of your choice, on chipsnmedia.com you can get documentation for the very oldest coda version supported by the driver. That's all I have in addition to the old GPLed Freescale imx-vpu-lib for reference.

Uh, ok, didn't think about this. Thx a lot !
JM

#7 lore raw
In reply to Philipp Zabel

Hi Philipp,

Quoted 32 lines · Philipp Zabel

Hi Frédéric,

Am Donnerstag, den 18.12.2014, 17:44 +0100 schrieb Frédéric Sureau:

Quoted 29 lines

Hi

I am trying to use the coda encoder through Gstreamer on an iMX6-based board.

I use the (rebased and slightly modified) gstv4l2h264enc plugin from:
https://github.com/hizukiayaka/gst-plugins-good

This pipeline works fine:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc ! h264parse ! mp4mux ! filesink location=test.mp4

When encoder has no bitrate param set (default=0), video encoding works well, but bitrate reaches ~2.5Mbps

When I try to set the bitrate with whatever value like 100,000 or 1,000,000, the encoder produces video with bitrate around 480kbps and a very poor quality.

Here is the gstreamer pipeline I use with bitrate set:
gst-launch-1.0 -vvv v4l2src device=/dev/video4 ! "video/x-raw,width=1280,height=720" ! videoconvert ! v4l2video0h264enc extra-controls="controls,video_bitrate=1000000;" ! h264parse ! mp4mux ! filesink location=test.mp4

The video_bitrate control seems to be correctly passed to the driver by GStreamer since I can see the VIDIOC_S_CTRL call.

Quoted 8 lines
Quoted 1 line

Any idea ?

There is a bug in the register definitions that causes the driver to apply a wrong mask before writing the bitrate to the register. I've got a fix for this in the pipeline, sending it right now.

regards
Philipp

Thanks for the patch!
It works fine now after forcing framerate to 30fps (which seems to be hardcoded in the driver)

Fred

#8 lore raw
Quoted 2 lines · Frédéric Sureau

Thanks for the patch!
It works fine now after forcing framerate to 30fps (which seems to be hardcoded in the driver)

Can you comment about this on gnome bug. Would make sense for the encoder element in GStreamer to relay the framerate to the driver, so the driver can make any sense out of the bitrate.

https://bugzilla.gnome.org/show_bug.cgi?id=728438

Nicolas

#9 lore raw
In reply to Frédéric Sureau

Hi Frédéric,

Quoted 3 lines · Frédéric Sureau

Thanks for the patch!
It works fine now after forcing framerate to 30fps (which seems to be hardcoded in the driver)

That is a good point, rate control can only work if the encoder has an idea about the framerate. I've sent a patch that allows to use VIDIOC_S_PARM to set it:
"[media] coda: Use S_PARM to set nominal framerate for h.264 encoder"

regards
Philipp

#10 lore raw
Quoted 4 lines · Philipp Zabel

That is a good point, rate control can only work if the encoder has an idea about the framerate. I've sent a patch that allows to use VIDIOC_S_PARM to set it:
"[media] coda: Use S_PARM to set nominal framerate for h.264 encoder"

Thanks, I'll sort out what is needed on Gst side. Kamil, do MFC need to be looked at too ?

Nicolas