It is 14-bit sample packed to 2 bytes. fourcc "DS14".
Signed-off-by: Antti Palosaari <[email protected]>
---
contrib/freebsd/include/linux/videodev2.h | 1 +
include/linux/videodev2.h | 1 +
lib/libv4lconvert/libv4lconvert.c | 23 +++++++++++++++++++++++
3 files changed, 25 insertions(+)
diff --git a/contrib/freebsd/include/linux/videodev2.h
b/contrib/freebsd/include/linux/videodev2.h
index c2f6a71..7ad5ef5 100644
--- a/contrib/freebsd/include/linux/videodev2.h
+++ b/contrib/freebsd/include/linux/videodev2.h
@@ -471,6 +471,7 @@ struct v4l2_pix_format {
#define V4L2_PIX_FMT_SDR_S8 v4l2_fourcc('D', 'S', '0', '8') /* signed
8-bit */
#define V4L2_PIX_FMT_SDR_MSI2500_384 v4l2_fourcc('M', '3', '8', '4') /* Mirics
MSi2500 format 384 */
#define V4L2_PIX_FMT_SDR_S12 v4l2_fourcc('D', 'S', '1', '2') /* signed
12-bit */
+#define V4L2_PIX_FMT_SDR_S14 v4l2_fourcc('D', 'S', '1', '4') /* signed
14-bit */
/*
* F O R M A T E N U M E R A T I O N
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
index 80b17d9..b8ee904 100644
--- a/include/linux/videodev2.h
+++ b/include/linux/videodev2.h
@@ -437,6 +437,7 @@ struct v4l2_pix_format {
#define V4L2_PIX_FMT_SDR_S8 v4l2_fourcc('D', 'S', '0', '8') /* signed
8-bit */
#define V4L2_PIX_FMT_SDR_MSI2500_384 v4l2_fourcc('M', '3', '8', '4') /* Mirics
MSi2500 format 384 */
#define V4L2_PIX_FMT_SDR_S12 v4l2_fourcc('D', 'S', '1', '2') /* signed
12-bit */
+#define V4L2_PIX_FMT_SDR_S14 v4l2_fourcc('D', 'S', '1', '4') /* signed
14-bit */
/*
* F O R M A T E N U M E R A T I O N
diff --git a/lib/libv4lconvert/libv4lconvert.c
b/lib/libv4lconvert/libv4lconvert.c
index ccb9c0f..f58ffdc 100644
--- a/lib/libv4lconvert/libv4lconvert.c
+++ b/lib/libv4lconvert/libv4lconvert.c
@@ -450,6 +450,7 @@ static int v4lconvert_do_try_format_sdr(struct
v4lconvert_data *data,
V4L2_PIX_FMT_SDR_S8,
V4L2_PIX_FMT_SDR_MSI2500_384,
V4L2_PIX_FMT_SDR_S12,
+ V4L2_PIX_FMT_SDR_S14,
};
for (i = 0; i < ARRAY_SIZE(supported_src_pixfmts_sdr); i++) {
@@ -1429,6 +1430,28 @@ static int v4lconvert_convert_sdr(struct v4lconvert_data
*data,
*fptr++ = (sample[1] + 0.5f) / 2047.5f;
}
break;
+ case V4L2_PIX_FMT_SDR_S14:
+ /* 14-bit signed to 32-bit float */
+ dest_needed = src_size / 4 * 2 * sizeof(float);
+ if (dest_size < dest_needed)
+ goto err_buf_too_small;
+
+ for (i = 0; i < src_size; i += 4) {
+ uint32_t usample[2];
+ int sample[2];
+
+ usample[0] = src[i + 0] >> 0 | src[i + 1] << 8;
+ usample[1] = src[i + 2] >> 0 | src[i + 3] << 8;
+
+ /* Sign extension from 14-bit */
+ struct {signed int x:14; } s;
+ sample[0] = s.x = usample[0];
+ sample[1] = s.x = usample[1];
+
+ *fptr++ = (sample[0] + 0.5f) / 8192.5f;
+ *fptr++ = (sample[1] + 0.5f) / 8192.5f;
+ }
+ break;
default:
V4LCONVERT_ERR("Unknown src format in conversion\n");
errno = EINVAL;
--
1.8.4.2
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html