v4l2_stateful_encoder: add support for /dev/video-enc1
v4l2_stateful_encoder only supports /dev/video-enc0 but on RK3399,
the VP8 capabilities are only present in /dev/video-enc1. This
CL extends the code to support this secondary dev file. AFAIK
other SoCs using v4l2 do not present several dev files, so I just
added support for these two dev files -- leaving as a TODO to
extend to /dev/video-enc* if and when this is needed.
BUG=b:191672965
TEST=emerge+deploy+tast run <hana> video.PlatformEncoding.v4l2_vp8_180
Change-Id: I9ee1e1cb9434c9d92a8681d7e28702b55e8ca734
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/drm-tests/+/3101454
Tested-by: Miguel Casas <mcasas@chromium.org>
Reviewed-by: Fritz Koenig <frkoenig@chromium.org>
Commit-Queue: Miguel Casas <mcasas@chromium.org>
diff --git a/v4l2_stateful_encoder.c b/v4l2_stateful_encoder.c
index 65e5c7e..d05ade1 100644
--- a/v4l2_stateful_encoder.c
+++ b/v4l2_stateful_encoder.c
@@ -21,7 +21,10 @@
#include <time.h>
#include <unistd.h>
-static const char* kEncodeDevice = "/dev/video-enc0";
+// TODO(mcasas): Consider trying all /dev/video-enc* device files if a platform
+// has more than two.
+static const char* kEncodeDeviceFiles[] = {"/dev/video-enc0",
+ "/dev/video-enc1"};
static const int kInputbufferMaxSize = 4 * 1024 * 1024;
static const int kRequestBufferCount = 8;
static const uint32_t kIVFHeaderSignature = v4l2_fourcc('D', 'K', 'I', 'F');
@@ -108,7 +111,7 @@
}
}
-int capabilities(int v4lfd,
+int verify_capabilities(int v4lfd,
uint32_t OUTPUT_format,
uint32_t CAPTURE_format) {
struct v4l2_capability cap;
@@ -121,15 +124,19 @@
cap.bus_info, cap.card, v4lfd);
if (!query_format(v4lfd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, OUTPUT_format)) {
- printf("Supported OUTPUT formats:\n");
+ printf("Insufficient supported OUTPUT formats:\n");
query_format(v4lfd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, 0);
+ printf("Wanted: ");
+ print_fourcc(OUTPUT_format);
ret = 1;
}
if (!query_format(v4lfd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
CAPTURE_format)) {
- printf("Supported CAPTURE formats:\n");
+ printf("Insufficient supported CAPTURE formats:\n");
query_format(v4lfd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, 0);
+ printf("Wanted: ");
+ print_fourcc(CAPTURE_format);
ret = 1;
}
@@ -1012,14 +1019,26 @@
stderr, "encoding %d frames using %s bitrate control\n", frames_to_encode,
(bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) ? "CBR" : "VBR");
- int v4lfd = open(kEncodeDevice, O_RDWR | O_NONBLOCK | O_CLOEXEC);
- if (v4lfd < 0) {
- fprintf(stderr, "Unable to open device file: %s\n", kEncodeDevice);
- exit(EXIT_FAILURE);
+ int v4lfd = -1;
+ const size_t kEncodeDeviceFilesSize =
+ sizeof(kEncodeDeviceFiles) / sizeof(char*);
+ for (int index = 0; index < kEncodeDeviceFilesSize; ++index) {
+ int temp_fd =
+ open(kEncodeDeviceFiles[index], O_RDWR | O_NONBLOCK | O_CLOEXEC);
+ if (temp_fd < 0)
+ continue;
+
+ if (verify_capabilities(temp_fd, OUTPUT_format, CAPTURE_format) == 0) {
+ v4lfd = temp_fd;
+ break;
+ } else {
+ close(temp_fd);
+ }
}
- if (capabilities(v4lfd, OUTPUT_format, CAPTURE_format) != 0) {
- fprintf(stderr, "Capabilities not present for encode.\n");
+ if (v4lfd < 0) {
+ fprintf(stderr,
+ "Did not find a device file with the needed capabilities\n");
exit(EXIT_FAILURE);
}