Skip to content

Commit

Permalink
Adding Jetson support!
Browse files Browse the repository at this point in the history
  • Loading branch information
shortstheory committed Mar 29, 2019
1 parent d6efd60 commit 26caab4
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 101 deletions.
2 changes: 2 additions & 0 deletions 2do
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
*add tegra support
*see how its cameras work and which way to interface with the nvidia elements
*if tegra doesn't support it, just remove the file recorder. it's too buggy
*detect omxh264enc and give the option to use it?
*simplify camera detecting logic
1 change: 1 addition & 0 deletions src/Common/Constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ static const string SOCKET_PATH = "/tmp/rtsp_server.sock";
static const string V4L2_DEVICE_PATH = "/dev/";
static const string V4L2_DEVICE_PREFIX = "video";
static const string MOUNT_POINT_PREFIX = "/cam";
static const string JETSON_CAM_DRIVER = "tegra-video";


#endif
2 changes: 1 addition & 1 deletion src/Common/DeviceDatatypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

using namespace std;

enum CameraType {RAW_CAM, UVC_CAM, H264_CAM};
enum CameraType {RAW_CAM, UVC_CAM, H264_CAM, JETSON_CAM};
enum ResolutionPresets {LOW, MED, HIGH};
enum FramePresets {FRAME_320x240, FRAME_640x480, FRAME_1280x720, FRAME_COUNT};
enum VideoPresets {VIDEO_320x240x15, VIDEO_640x480x15, VIDEO_1280x720x15,
Expand Down
4 changes: 4 additions & 0 deletions src/Common/PipelineManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ void PipelineManager::set_encoding_bitrate(guint32 bitrate)
case UVC_CAM:
g_object_set(camera, "average-bitrate", h264_bitrate*1000, NULL);
break;
case JETSON_CAM:
break;
};
}

Expand Down Expand Up @@ -285,6 +287,8 @@ bool PipelineManager::get_element_references()
} else {
return false;
}
case JETSON_CAM:
return true;
};
}
return false;
Expand Down
8 changes: 8 additions & 0 deletions src/RTSP_Stream_Server/RTSPAdaptiveStreaming.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,14 @@ void RTSPAdaptiveStreaming::init_media_factory()
" ! queue"
" ! h264parse"
" ! rtph264pay name=pay0";
case JETSON_CAM:
launch_string = "nvcamerasrc intent=3 name=src"
" ! nvvidconv flip-method=6"
" ! capsfilter name=capsfilter caps=video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)I420, framerate=(fraction)60/1"
" ! omxh264enc name=omxh264enc control-rate=1 bitrate=500"
" ! video/x-h264, stream-format=(string)byte-stream"
" ! h264parse"
" ! rtph264pay name=pay0";
break;
};
gst_rtsp_media_factory_set_launch(media_factory, launch_string.c_str());
Expand Down
214 changes: 114 additions & 100 deletions src/RTSP_Stream_Server/RTSPStreamServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,122 +80,136 @@ void RTSPStreamServer::get_v4l2_devices_info()

cout << "Name - " << caps.card << " Driver - " << caps.driver << endl;

v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
v4l2_fmtdesc fmt;
v4l2_frmsizeenum frmsize;
v4l2_frmivalenum frmival;
if (string((char*)caps.driver) == JETSON_CAM_DRIVER) {
info.camera_type = JETSON_CAM;
info.frame_property_bitmask |= (1 << VIDEO_320x240x15);
info.frame_property_bitmask |= (1 << VIDEO_320x240x30);
info.frame_property_bitmask |= (1 << VIDEO_320x240x60);

info.frame_property_bitmask |= (1 << VIDEO_640x480x15);
info.frame_property_bitmask |= (1 << VIDEO_640x480x30);
info.frame_property_bitmask |= (1 << VIDEO_640x480x60);

info.frame_property_bitmask |= (1 << VIDEO_1280x720x15);
info.frame_property_bitmask |= (1 << VIDEO_1280x720x30);
info.frame_property_bitmask |= (1 << VIDEO_1280x720x60);
} else {
v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
v4l2_fmtdesc fmt;
v4l2_frmsizeenum frmsize;
v4l2_frmivalenum frmival;

memset(&fmt, 0, sizeof(fmt));
memset(&frmsize, 0, sizeof(frmsize));
memset(&frmival, 0, sizeof(frmival));
memset(&fmt, 0, sizeof(fmt));
memset(&frmsize, 0, sizeof(frmsize));
memset(&frmival, 0, sizeof(frmival));

int mjpg_index = -1;
int h264_index = -1;
int mjpg_index = -1;
int h264_index = -1;

fmt.index = 0;
fmt.type = type;
fmt.index = 0;
fmt.type = type;

while (ioctl(fd, VIDIOC_ENUM_FMT, &fmt) >= 0) {
if (!strcmp((char*)fmt.description, "Motion-JPEG")) {
mjpg_index = fmt.index;
}
if (!strcmp((char*)fmt.description, "H264") || !strcmp((char*)fmt.description, "H.264")) {
h264_index = fmt.index;
while (ioctl(fd, VIDIOC_ENUM_FMT, &fmt) >= 0) {
if (!strcmp((char*)fmt.description, "Motion-JPEG")) {
mjpg_index = fmt.index;
}
if (!strcmp((char*)fmt.description, "H264") || !strcmp((char*)fmt.description, "H.264")) {
h264_index = fmt.index;
}
fmt.index++;
}
fmt.index++;
}

if (mjpg_index != -1) {
fmt.index = mjpg_index;
}

if (h264_index != -1) {
fmt.index = h264_index;
if (check_h264_ioctls(fd)) {
info.camera_type = H264_CAM;
} else {
info.camera_type = UVC_CAM;
if (mjpg_index != -1) {
fmt.index = mjpg_index;
}
} else {
info.camera_type = RAW_CAM;
}

frmsize.pixel_format = fmt.pixelformat;

for (frmsize.index = 0; ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) >= 0; frmsize.index++) {
if (frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE) {
FramePresets preset;
if (frmsize.discrete.width == 320 && frmsize.discrete.height == 240) {
preset = FRAME_320x240;
} else if (frmsize.discrete.width == 640 && frmsize.discrete.height == 480) {
preset = FRAME_640x480;
} else if (frmsize.discrete.width == 1280 && frmsize.discrete.height == 720) {
preset = FRAME_1280x720;
if (h264_index != -1) {
fmt.index = h264_index;
if (check_h264_ioctls(fd)) {
info.camera_type = H264_CAM;
} else {
continue;
info.camera_type = UVC_CAM;
}
} else {
info.camera_type = RAW_CAM;
}

frmival.pixel_format = fmt.pixelformat;
frmival.width = frmsize.discrete.width;
frmival.height = frmsize.discrete.height;

for (frmival.index = 0; ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &frmival) >= 0; frmival.index++) {
int framerate = frmival.discrete.denominator;
// For simplicity in maintenance, we only support 240p, 480p
// and 720p. If a camera supports a resolution we use a bitmask
// for saving its capabilities as it greatly simplifies our IPC
switch (preset) {
case FRAME_320x240:
if (framerate == 15) {
info.frame_property_bitmask |= (1 << VIDEO_320x240x15);
} else if (framerate == 30) {
info.frame_property_bitmask |= (1 << VIDEO_320x240x30);
} else if (framerate == 60) {
info.frame_property_bitmask |= (1 << VIDEO_320x240x60);
}
break;
case FRAME_640x480:
if (framerate == 15) {
info.frame_property_bitmask |= (1 << VIDEO_640x480x15);
} else if (framerate == 30) {
info.frame_property_bitmask |= (1 << VIDEO_640x480x30);
} else if (framerate == 60) {
info.frame_property_bitmask |= (1 << VIDEO_640x480x60);
}
break;
case FRAME_1280x720:
if (framerate == 15) {
info.frame_property_bitmask |= (1 << VIDEO_1280x720x15);
} else if (framerate == 30) {
info.frame_property_bitmask |= (1 << VIDEO_1280x720x30);
} else if (framerate == 60) {
info.frame_property_bitmask |= (1 << VIDEO_1280x720x60);
frmsize.pixel_format = fmt.pixelformat;

for (frmsize.index = 0; ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize) >= 0; frmsize.index++) {
if (frmsize.type == V4L2_FRMSIZE_TYPE_DISCRETE) {
FramePresets preset;
if (frmsize.discrete.width == 320 && frmsize.discrete.height == 240) {
preset = FRAME_320x240;
} else if (frmsize.discrete.width == 640 && frmsize.discrete.height == 480) {
preset = FRAME_640x480;
} else if (frmsize.discrete.width == 1280 && frmsize.discrete.height == 720) {
preset = FRAME_1280x720;
} else {
continue;
}

frmival.pixel_format = fmt.pixelformat;
frmival.width = frmsize.discrete.width;
frmival.height = frmsize.discrete.height;

for (frmival.index = 0; ioctl(fd, VIDIOC_ENUM_FRAMEINTERVALS, &frmival) >= 0; frmival.index++) {
int framerate = frmival.discrete.denominator;
// For simplicity in maintenance, we only support 240p, 480p
// and 720p. If a camera supports a resolution we use a bitmask
// for saving its capabilities as it greatly simplifies our IPC
switch (preset) {
case FRAME_320x240:
if (framerate == 15) {
info.frame_property_bitmask |= (1 << VIDEO_320x240x15);
} else if (framerate == 30) {
info.frame_property_bitmask |= (1 << VIDEO_320x240x30);
} else if (framerate == 60) {
info.frame_property_bitmask |= (1 << VIDEO_320x240x60);
}
break;
case FRAME_640x480:
if (framerate == 15) {
info.frame_property_bitmask |= (1 << VIDEO_640x480x15);
} else if (framerate == 30) {
info.frame_property_bitmask |= (1 << VIDEO_640x480x30);
} else if (framerate == 60) {
info.frame_property_bitmask |= (1 << VIDEO_640x480x60);
}
break;
case FRAME_1280x720:
if (framerate == 15) {
info.frame_property_bitmask |= (1 << VIDEO_1280x720x15);
} else if (framerate == 30) {
info.frame_property_bitmask |= (1 << VIDEO_1280x720x30);
} else if (framerate == 60) {
info.frame_property_bitmask |= (1 << VIDEO_1280x720x60);
}
break;
default:
;
}
break;
default:
;
}
}

// The PiCam doesn't list the resolutions explicitly, so we have
// to guess its capabilities
} else if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
// How do I get the framerates for stepwise cams?
info.frame_property_bitmask |= (1 << VIDEO_320x240x15);
info.frame_property_bitmask |= (1 << VIDEO_320x240x30);
info.frame_property_bitmask |= (1 << VIDEO_320x240x60);

info.frame_property_bitmask |= (1 << VIDEO_640x480x15);
info.frame_property_bitmask |= (1 << VIDEO_640x480x30);
info.frame_property_bitmask |= (1 << VIDEO_640x480x60);

info.frame_property_bitmask |= (1 << VIDEO_1280x720x15);
info.frame_property_bitmask |= (1 << VIDEO_1280x720x30);
info.frame_property_bitmask |= (1 << VIDEO_1280x720x60);
break;
// The PiCam doesn't list the resolutions explicitly, so we have
// to guess its capabilities
} else if (frmsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) {
// How do I get the framerates for stepwise cams?
info.frame_property_bitmask |= (1 << VIDEO_320x240x15);
info.frame_property_bitmask |= (1 << VIDEO_320x240x30);
info.frame_property_bitmask |= (1 << VIDEO_320x240x60);

info.frame_property_bitmask |= (1 << VIDEO_640x480x15);
info.frame_property_bitmask |= (1 << VIDEO_640x480x30);
info.frame_property_bitmask |= (1 << VIDEO_640x480x60);

info.frame_property_bitmask |= (1 << VIDEO_1280x720x15);
info.frame_property_bitmask |= (1 << VIDEO_1280x720x30);
info.frame_property_bitmask |= (1 << VIDEO_1280x720x60);
break;
}
}
}

device_properties_map.insert(pair<string, v4l2_info>(dev, info));
close(fd);
}
Expand Down

0 comments on commit 26caab4

Please sign in to comment.