coda: Unable to use encoder video_bitrate
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
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-goodThis 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.mp4When 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_bitratecontrol seems to be correctly passed to the driver by GStreamer since I can see theVIDIOC_S_CTRLcall.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
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-goodThis 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.mp4When 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_bitratecontrol seems to be correctly passed to the driver by GStreamer since I can see theVIDIOC_S_CTRLcall.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
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-goodThis 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.mp4When 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.mp4The
video_bitratecontrol seems to be correctly passed to the driver by GStreamer since I can see theVIDIOC_S_CTRLcall.
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
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-goodThis 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.mp4When 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.mp4Quoted 4 lines
The
video_bitratecontrol seems to be correctly passed to the driver by GStreamer since I can see theVIDIOC_S_CTRLcall.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 incoda_regs.h. TheCODA_RATECONTROL_BITRATE_MASKis0x7f, but it should be0x7fff.
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
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 incoda_regs.h. TheCODA_RATECONTROL_BITRATE_MASKis0x7f, but it should be0x7fff.Well, I meant, the datasheet of the CODA960 because we don't know, just by reading the
coda_regs.hwhich 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
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 incoda_regs.h. TheCODA_RATECONTROL_BITRATE_MASKis0x7f, but it should be0x7fff.
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.hwhich 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
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-goodThis 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.mp4When 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.mp4The
video_bitratecontrol seems to be correctly passed to the driver by GStreamer since I can see theVIDIOC_S_CTRLcall.
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
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
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
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_PARMto set it:
"[media] coda: UseS_PARMto 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