|
@@ -37,7 +37,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
#include "v4l2-controls.h"
|
|
|
#include "v4l2-helpers.h"
|
|
|
-#include "v4l2-mjpeg.h"
|
|
|
+#include "v4l2-decoder.h"
|
|
|
|
|
|
#if HAVE_UDEV
|
|
|
#include "v4l2-udev.h"
|
|
@@ -81,7 +81,7 @@ struct v4l2_data {
|
|
|
obs_source_t *source;
|
|
|
pthread_t thread;
|
|
|
os_event_t *event;
|
|
|
- struct v4l2_mjpeg_decoder mjpeg_decoder;
|
|
|
+ struct v4l2_decoder decoder;
|
|
|
|
|
|
bool framerate_unchanged;
|
|
|
bool resolution_unchanged;
|
|
@@ -268,10 +268,12 @@ static void *v4l2_thread(void *vptr)
|
|
|
|
|
|
start = (uint8_t *)data->buffers.info[buf.index].start;
|
|
|
|
|
|
- if (data->pixfmt == V4L2_PIX_FMT_MJPEG) {
|
|
|
- if (v4l2_decode_mjpeg(&out, start, buf.bytesused,
|
|
|
- &data->mjpeg_decoder) < 0) {
|
|
|
- blog(LOG_ERROR, "failed to unpack jpeg");
|
|
|
+ if (data->pixfmt == V4L2_PIX_FMT_MJPEG ||
|
|
|
+ data->pixfmt == V4L2_PIX_FMT_H264) {
|
|
|
+ if (v4l2_decode_frame(&out, start, buf.bytesused,
|
|
|
+ &data->decoder) < 0) {
|
|
|
+ blog(LOG_ERROR,
|
|
|
+ "failed to unpack jpeg or h264");
|
|
|
break;
|
|
|
}
|
|
|
} else {
|
|
@@ -477,7 +479,8 @@ static void v4l2_format_list(int dev, obs_property_t *prop)
|
|
|
|
|
|
if (v4l2_to_obs_video_format(fmt.pixelformat) !=
|
|
|
VIDEO_FORMAT_NONE ||
|
|
|
- fmt.pixelformat == V4L2_PIX_FMT_MJPEG) {
|
|
|
+ fmt.pixelformat == V4L2_PIX_FMT_MJPEG ||
|
|
|
+ fmt.pixelformat == V4L2_PIX_FMT_H264) {
|
|
|
obs_property_list_add_int(prop, buffer.array,
|
|
|
fmt.pixelformat);
|
|
|
blog(LOG_INFO, "Pixelformat: %s (available)",
|
|
@@ -910,7 +913,10 @@ static void v4l2_terminate(struct v4l2_data *data)
|
|
|
data->thread = 0;
|
|
|
}
|
|
|
|
|
|
- v4l2_destroy_mjpeg(&data->mjpeg_decoder);
|
|
|
+ if (data->pixfmt == V4L2_PIX_FMT_MJPEG ||
|
|
|
+ data->pixfmt == V4L2_PIX_FMT_H264) {
|
|
|
+ v4l2_destroy_decoder(&data->decoder);
|
|
|
+ }
|
|
|
v4l2_destroy_mmap(&data->buffers);
|
|
|
|
|
|
if (data->dev != -1) {
|
|
@@ -1002,7 +1008,8 @@ static void v4l2_init(struct v4l2_data *data)
|
|
|
goto fail;
|
|
|
}
|
|
|
if (v4l2_to_obs_video_format(data->pixfmt) == VIDEO_FORMAT_NONE &&
|
|
|
- data->pixfmt != V4L2_PIX_FMT_MJPEG) {
|
|
|
+ data->pixfmt != V4L2_PIX_FMT_MJPEG &&
|
|
|
+ data->pixfmt != V4L2_PIX_FMT_H264) {
|
|
|
blog(LOG_ERROR, "Selected video format not supported");
|
|
|
goto fail;
|
|
|
}
|
|
@@ -1025,9 +1032,12 @@ static void v4l2_init(struct v4l2_data *data)
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
|
- if (v4l2_init_mjpeg(&data->mjpeg_decoder) < 0) {
|
|
|
- blog(LOG_ERROR, "Failed to initialize mjpeg decoder");
|
|
|
- goto fail;
|
|
|
+ if (data->pixfmt == V4L2_PIX_FMT_MJPEG ||
|
|
|
+ data->pixfmt == V4L2_PIX_FMT_H264) {
|
|
|
+ if (v4l2_init_decoder(&data->decoder, data->pixfmt) < 0) {
|
|
|
+ blog(LOG_ERROR, "Failed to initialize decoder");
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* start the capture thread */
|