react-native-vision-camera-spoof-detector 1.0.21 → 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +2 -0
- package/.gitignore +27 -0
- package/CHANGELOG.md +2 -2
- package/CONTRIBUTING.md +2 -2
- package/README.md +442 -443
- package/android/build.gradle +12 -4
- package/android/src/main/cpp/CMakeLists.txt +101 -94
- package/android/src/main/cpp/libyuv/.clang-format +6 -6
- package/android/src/main/cpp/libyuv/.gn +40 -40
- package/android/src/main/cpp/libyuv/.vpython3 +410 -410
- package/android/src/main/cpp/libyuv/AUTHORS +7 -7
- package/android/src/main/cpp/libyuv/Android.bp +202 -202
- package/android/src/main/cpp/libyuv/Android.mk +106 -106
- package/android/src/main/cpp/libyuv/BUILD.gn +490 -490
- package/android/src/main/cpp/libyuv/CM_linux_packages.cmake +70 -70
- package/android/src/main/cpp/libyuv/CMakeLists.txt +259 -252
- package/android/src/main/cpp/libyuv/DEPS +935 -935
- package/android/src/main/cpp/libyuv/DIR_METADATA +3 -3
- package/android/src/main/cpp/libyuv/LICENSE +29 -29
- package/android/src/main/cpp/libyuv/OWNERS +11 -11
- package/android/src/main/cpp/libyuv/PATENTS +23 -23
- package/android/src/main/cpp/libyuv/PRESUBMIT.py +65 -65
- package/android/src/main/cpp/libyuv/README.chromium +11 -11
- package/android/src/main/cpp/libyuv/README.md +19 -19
- package/android/src/main/cpp/libyuv/build_overrides/build.gni +60 -60
- package/android/src/main/cpp/libyuv/build_overrides/gtest.gni +19 -19
- package/android/src/main/cpp/libyuv/build_overrides/partition_alloc.gni +17 -17
- package/android/src/main/cpp/libyuv/codereview.settings +5 -5
- package/android/src/main/cpp/libyuv/docs/deprecated_builds.md +409 -409
- package/android/src/main/cpp/libyuv/docs/environment_variables.md +64 -64
- package/android/src/main/cpp/libyuv/docs/feature_detection.md +108 -108
- package/android/src/main/cpp/libyuv/docs/filtering.md +196 -196
- package/android/src/main/cpp/libyuv/docs/formats.md +208 -208
- package/android/src/main/cpp/libyuv/docs/getting_started.md +296 -296
- package/android/src/main/cpp/libyuv/docs/rotation.md +107 -107
- package/android/src/main/cpp/libyuv/download_vs_toolchain.py +29 -29
- package/android/src/main/cpp/libyuv/include/libyuv/basic_types.h +68 -68
- package/android/src/main/cpp/libyuv/include/libyuv/compare.h +111 -111
- package/android/src/main/cpp/libyuv/include/libyuv/compare_row.h +112 -112
- package/android/src/main/cpp/libyuv/include/libyuv/convert.h +1117 -1117
- package/android/src/main/cpp/libyuv/include/libyuv/convert_argb.h +2335 -2335
- package/android/src/main/cpp/libyuv/include/libyuv/convert_from.h +203 -203
- package/android/src/main/cpp/libyuv/include/libyuv/convert_from_argb.h +394 -394
- package/android/src/main/cpp/libyuv/include/libyuv/cpu_id.h +147 -147
- package/android/src/main/cpp/libyuv/include/libyuv/cpu_support.h +99 -99
- package/android/src/main/cpp/libyuv/include/libyuv/loongson_intrinsics.h +1949 -1949
- package/android/src/main/cpp/libyuv/include/libyuv/mjpeg_decoder.h +195 -195
- package/android/src/main/cpp/libyuv/include/libyuv/planar_functions.h +1131 -1131
- package/android/src/main/cpp/libyuv/include/libyuv/rotate.h +296 -296
- package/android/src/main/cpp/libyuv/include/libyuv/rotate_argb.h +37 -37
- package/android/src/main/cpp/libyuv/include/libyuv/rotate_row.h +265 -265
- package/android/src/main/cpp/libyuv/include/libyuv/row.h +6738 -6738
- package/android/src/main/cpp/libyuv/include/libyuv/row_sve.h +2154 -2154
- package/android/src/main/cpp/libyuv/include/libyuv/scale.h +336 -336
- package/android/src/main/cpp/libyuv/include/libyuv/scale_argb.h +76 -76
- package/android/src/main/cpp/libyuv/include/libyuv/scale_rgb.h +42 -42
- package/android/src/main/cpp/libyuv/include/libyuv/scale_row.h +1726 -1726
- package/android/src/main/cpp/libyuv/include/libyuv/scale_uv.h +51 -51
- package/android/src/main/cpp/libyuv/include/libyuv/version.h +16 -16
- package/android/src/main/cpp/libyuv/include/libyuv/video_common.h +222 -222
- package/android/src/main/cpp/libyuv/include/libyuv.h +33 -33
- package/android/src/main/cpp/libyuv/infra/config/OWNERS +3 -3
- package/android/src/main/cpp/libyuv/infra/config/PRESUBMIT.py +17 -17
- package/android/src/main/cpp/libyuv/infra/config/README.md +2 -2
- package/android/src/main/cpp/libyuv/infra/config/codereview.settings +6 -6
- package/android/src/main/cpp/libyuv/infra/config/commit-queue.cfg +144 -144
- package/android/src/main/cpp/libyuv/infra/config/cr-buildbucket.cfg +1185 -1185
- package/android/src/main/cpp/libyuv/infra/config/luci-logdog.cfg +9 -9
- package/android/src/main/cpp/libyuv/infra/config/luci-milo.cfg +246 -246
- package/android/src/main/cpp/libyuv/infra/config/luci-scheduler.cfg +385 -385
- package/android/src/main/cpp/libyuv/infra/config/main.star +402 -402
- package/android/src/main/cpp/libyuv/infra/config/project.cfg +16 -16
- package/android/src/main/cpp/libyuv/infra/config/realms.cfg +111 -111
- package/android/src/main/cpp/libyuv/libyuv.gni +34 -34
- package/android/src/main/cpp/libyuv/libyuv.gyp +149 -149
- package/android/src/main/cpp/libyuv/libyuv.gypi +87 -87
- package/android/src/main/cpp/libyuv/linux.mk +96 -96
- package/android/src/main/cpp/libyuv/public.mk +13 -13
- package/android/src/main/cpp/libyuv/pylintrc +49 -49
- package/android/src/main/cpp/libyuv/riscv_script/prepare_toolchain_qemu.sh +74 -74
- package/android/src/main/cpp/libyuv/riscv_script/riscv-clang.cmake +56 -56
- package/android/src/main/cpp/libyuv/riscv_script/run_qemu.sh +15 -15
- package/android/src/main/cpp/libyuv/source/compare.cc +435 -435
- package/android/src/main/cpp/libyuv/source/compare_common.cc +74 -74
- package/android/src/main/cpp/libyuv/source/compare_gcc.cc +362 -362
- package/android/src/main/cpp/libyuv/source/compare_neon.cc +96 -96
- package/android/src/main/cpp/libyuv/source/compare_neon64.cc +223 -223
- package/android/src/main/cpp/libyuv/source/compare_win.cc +241 -241
- package/android/src/main/cpp/libyuv/source/convert.cc +4746 -4746
- package/android/src/main/cpp/libyuv/source/convert_argb.cc +9179 -9179
- package/android/src/main/cpp/libyuv/source/convert_from.cc +866 -866
- package/android/src/main/cpp/libyuv/source/convert_from_argb.cc +3671 -3671
- package/android/src/main/cpp/libyuv/source/convert_jpeg.cc +602 -602
- package/android/src/main/cpp/libyuv/source/convert_to_argb.cc +391 -391
- package/android/src/main/cpp/libyuv/source/convert_to_i420.cc +288 -288
- package/android/src/main/cpp/libyuv/source/cpu_id.cc +496 -496
- package/android/src/main/cpp/libyuv/source/mjpeg_decoder.cc +580 -580
- package/android/src/main/cpp/libyuv/source/mjpeg_validate.cc +71 -71
- package/android/src/main/cpp/libyuv/source/planar_functions.cc +5663 -5663
- package/android/src/main/cpp/libyuv/source/rotate.cc +1241 -1241
- package/android/src/main/cpp/libyuv/source/rotate_any.cc +76 -76
- package/android/src/main/cpp/libyuv/source/rotate_argb.cc +259 -259
- package/android/src/main/cpp/libyuv/source/rotate_common.cc +208 -208
- package/android/src/main/cpp/libyuv/source/rotate_gcc.cc +505 -505
- package/android/src/main/cpp/libyuv/source/rotate_lsx.cc +233 -233
- package/android/src/main/cpp/libyuv/source/rotate_neon.cc +219 -219
- package/android/src/main/cpp/libyuv/source/rotate_neon64.cc +273 -273
- package/android/src/main/cpp/libyuv/source/rotate_sme.cc +174 -174
- package/android/src/main/cpp/libyuv/source/rotate_win.cc +253 -253
- package/android/src/main/cpp/libyuv/source/row_any.cc +2519 -2519
- package/android/src/main/cpp/libyuv/source/row_common.cc +4461 -4461
- package/android/src/main/cpp/libyuv/source/row_gcc.cc +9570 -9570
- package/android/src/main/cpp/libyuv/source/row_lasx.cc +2343 -2343
- package/android/src/main/cpp/libyuv/source/row_lsx.cc +3030 -3030
- package/android/src/main/cpp/libyuv/source/row_neon.cc +4026 -4026
- package/android/src/main/cpp/libyuv/source/row_neon64.cc +5617 -5617
- package/android/src/main/cpp/libyuv/source/row_rvv.cc +2599 -2599
- package/android/src/main/cpp/libyuv/source/row_sme.cc +1183 -1183
- package/android/src/main/cpp/libyuv/source/row_sve.cc +1088 -1088
- package/android/src/main/cpp/libyuv/source/row_win.cc +6453 -6453
- package/android/src/main/cpp/libyuv/source/scale.cc +2710 -2710
- package/android/src/main/cpp/libyuv/source/scale_any.cc +991 -991
- package/android/src/main/cpp/libyuv/source/scale_argb.cc +1158 -1158
- package/android/src/main/cpp/libyuv/source/scale_common.cc +1977 -1977
- package/android/src/main/cpp/libyuv/source/scale_gcc.cc +2947 -2947
- package/android/src/main/cpp/libyuv/source/scale_lsx.cc +739 -739
- package/android/src/main/cpp/libyuv/source/scale_neon.cc +1449 -1449
- package/android/src/main/cpp/libyuv/source/scale_neon64.cc +1552 -1552
- package/android/src/main/cpp/libyuv/source/scale_rgb.cc +82 -82
- package/android/src/main/cpp/libyuv/source/scale_rvv.cc +1971 -1971
- package/android/src/main/cpp/libyuv/source/scale_sme.cc +555 -555
- package/android/src/main/cpp/libyuv/source/scale_uv.cc +1159 -1159
- package/android/src/main/cpp/libyuv/source/scale_win.cc +1392 -1392
- package/android/src/main/cpp/libyuv/source/test.sh +35 -35
- package/android/src/main/cpp/libyuv/source/video_common.cc +62 -62
- package/android/src/main/cpp/libyuv/tools_libyuv/OWNERS +4 -4
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/roll_deps.py +931 -931
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +164 -164
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS +21 -21
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new +13 -13
- package/android/src/main/cpp/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old +13 -13
- package/android/src/main/cpp/libyuv/tools_libyuv/get_landmines.py +38 -38
- package/android/src/main/cpp/libyuv/tools_libyuv/msan/OWNERS +3 -3
- package/android/src/main/cpp/libyuv/tools_libyuv/msan/blacklist.txt +9 -9
- package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/OWNERS +3 -3
- package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/blacklist.txt +15 -15
- package/android/src/main/cpp/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt +25 -25
- package/android/src/main/cpp/libyuv/unit_test/basictypes_test.cc +43 -43
- package/android/src/main/cpp/libyuv/unit_test/color_test.cc +848 -848
- package/android/src/main/cpp/libyuv/unit_test/compare_test.cc +739 -739
- package/android/src/main/cpp/libyuv/unit_test/convert_argb_test.cc +2867 -2867
- package/android/src/main/cpp/libyuv/unit_test/convert_test.cc +2133 -2133
- package/android/src/main/cpp/libyuv/unit_test/cpu_test.cc +427 -427
- package/android/src/main/cpp/libyuv/unit_test/cpu_thread_test.cc +63 -63
- package/android/src/main/cpp/libyuv/unit_test/math_test.cc +160 -160
- package/android/src/main/cpp/libyuv/unit_test/planar_test.cc +4731 -4731
- package/android/src/main/cpp/libyuv/unit_test/rotate_argb_test.cc +334 -334
- package/android/src/main/cpp/libyuv/unit_test/rotate_test.cc +962 -962
- package/android/src/main/cpp/libyuv/unit_test/scale_argb_test.cc +590 -590
- package/android/src/main/cpp/libyuv/unit_test/scale_plane_test.cc +465 -465
- package/android/src/main/cpp/libyuv/unit_test/scale_rgb_test.cc +280 -280
- package/android/src/main/cpp/libyuv/unit_test/scale_test.cc +1135 -1135
- package/android/src/main/cpp/libyuv/unit_test/scale_uv_test.cc +249 -249
- package/android/src/main/cpp/libyuv/unit_test/testdata/arm_v7.txt +12 -12
- package/android/src/main/cpp/libyuv/unit_test/testdata/mips.txt +7 -7
- package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson2k.txt +5 -5
- package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson3.txt +10 -10
- package/android/src/main/cpp/libyuv/unit_test/testdata/mips_loongson_mmi.txt +7 -7
- package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64.txt +3 -3
- package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv.txt +3 -3
- package/android/src/main/cpp/libyuv/unit_test/testdata/riscv64_rvv_zvfh.txt +3 -3
- package/android/src/main/cpp/libyuv/unit_test/testdata/tegra3.txt +23 -23
- package/android/src/main/cpp/libyuv/unit_test/unit_test.cc +581 -581
- package/android/src/main/cpp/libyuv/unit_test/unit_test.h +232 -232
- package/android/src/main/cpp/libyuv/unit_test/video_common_test.cc +112 -112
- package/android/src/main/cpp/libyuv/util/Makefile +9 -9
- package/android/src/main/cpp/libyuv/util/color.cc +120 -120
- package/android/src/main/cpp/libyuv/util/compare.cc +67 -67
- package/android/src/main/cpp/libyuv/util/cpuid.c +211 -211
- package/android/src/main/cpp/libyuv/util/i444tonv12_eg.cc +27 -27
- package/android/src/main/cpp/libyuv/util/psnr.cc +291 -291
- package/android/src/main/cpp/libyuv/util/psnr.h +47 -47
- package/android/src/main/cpp/libyuv/util/psnr_main.cc +620 -620
- package/android/src/main/cpp/libyuv/util/ssim.cc +364 -364
- package/android/src/main/cpp/libyuv/util/ssim.h +38 -38
- package/android/src/main/cpp/libyuv/util/yuvconstants.c +114 -114
- package/android/src/main/cpp/libyuv/util/yuvconvert.cc +367 -367
- package/android/src/main/cpp/libyuv/winarm.mk +47 -47
- package/package.json +86 -84
- package/android/.gradle/8.9/checksums/checksums.lock +0 -0
- package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.9/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
- package/android/.gradle/vcs-1/gc.properties +0 -0
|
@@ -1,602 +1,602 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2011 The LibYuv Project Authors. All rights reserved.
|
|
3
|
-
*
|
|
4
|
-
* Use of this source code is governed by a BSD-style license
|
|
5
|
-
* that can be found in the LICENSE file in the root of the source
|
|
6
|
-
* tree. An additional intellectual property rights grant can be found
|
|
7
|
-
* in the file PATENTS. All contributing project authors may
|
|
8
|
-
* be found in the AUTHORS file in the root of the source tree.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#include "libyuv/convert.h"
|
|
12
|
-
#include "libyuv/convert_argb.h"
|
|
13
|
-
|
|
14
|
-
#ifdef HAVE_JPEG
|
|
15
|
-
#include "libyuv/mjpeg_decoder.h"
|
|
16
|
-
#endif
|
|
17
|
-
|
|
18
|
-
#ifdef __cplusplus
|
|
19
|
-
namespace libyuv {
|
|
20
|
-
extern "C" {
|
|
21
|
-
#endif
|
|
22
|
-
|
|
23
|
-
#ifdef HAVE_JPEG
|
|
24
|
-
struct I420Buffers {
|
|
25
|
-
uint8_t* y;
|
|
26
|
-
int y_stride;
|
|
27
|
-
uint8_t* u;
|
|
28
|
-
int u_stride;
|
|
29
|
-
uint8_t* v;
|
|
30
|
-
int v_stride;
|
|
31
|
-
int w;
|
|
32
|
-
int h;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
static void JpegCopyI420(void* opaque,
|
|
36
|
-
const uint8_t* const* data,
|
|
37
|
-
const int* strides,
|
|
38
|
-
int rows) {
|
|
39
|
-
I420Buffers* dest = (I420Buffers*)(opaque);
|
|
40
|
-
I420Copy(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
41
|
-
dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
|
|
42
|
-
dest->v_stride, dest->w, rows);
|
|
43
|
-
dest->y += rows * dest->y_stride;
|
|
44
|
-
dest->u += ((rows + 1) >> 1) * dest->u_stride;
|
|
45
|
-
dest->v += ((rows + 1) >> 1) * dest->v_stride;
|
|
46
|
-
dest->h -= rows;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
static void JpegI422ToI420(void* opaque,
|
|
50
|
-
const uint8_t* const* data,
|
|
51
|
-
const int* strides,
|
|
52
|
-
int rows) {
|
|
53
|
-
I420Buffers* dest = (I420Buffers*)(opaque);
|
|
54
|
-
I422ToI420(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
55
|
-
dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
|
|
56
|
-
dest->v_stride, dest->w, rows);
|
|
57
|
-
dest->y += rows * dest->y_stride;
|
|
58
|
-
dest->u += ((rows + 1) >> 1) * dest->u_stride;
|
|
59
|
-
dest->v += ((rows + 1) >> 1) * dest->v_stride;
|
|
60
|
-
dest->h -= rows;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
static void JpegI444ToI420(void* opaque,
|
|
64
|
-
const uint8_t* const* data,
|
|
65
|
-
const int* strides,
|
|
66
|
-
int rows) {
|
|
67
|
-
I420Buffers* dest = (I420Buffers*)(opaque);
|
|
68
|
-
I444ToI420(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
69
|
-
dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
|
|
70
|
-
dest->v_stride, dest->w, rows);
|
|
71
|
-
dest->y += rows * dest->y_stride;
|
|
72
|
-
dest->u += ((rows + 1) >> 1) * dest->u_stride;
|
|
73
|
-
dest->v += ((rows + 1) >> 1) * dest->v_stride;
|
|
74
|
-
dest->h -= rows;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
static void JpegI400ToI420(void* opaque,
|
|
78
|
-
const uint8_t* const* data,
|
|
79
|
-
const int* strides,
|
|
80
|
-
int rows) {
|
|
81
|
-
I420Buffers* dest = (I420Buffers*)(opaque);
|
|
82
|
-
I400ToI420(data[0], strides[0], dest->y, dest->y_stride, dest->u,
|
|
83
|
-
dest->u_stride, dest->v, dest->v_stride, dest->w, rows);
|
|
84
|
-
dest->y += rows * dest->y_stride;
|
|
85
|
-
dest->u += ((rows + 1) >> 1) * dest->u_stride;
|
|
86
|
-
dest->v += ((rows + 1) >> 1) * dest->v_stride;
|
|
87
|
-
dest->h -= rows;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Query size of MJPG in pixels.
|
|
91
|
-
LIBYUV_API
|
|
92
|
-
int MJPGSize(const uint8_t* src_mjpg,
|
|
93
|
-
size_t src_size_mjpg,
|
|
94
|
-
int* width,
|
|
95
|
-
int* height) {
|
|
96
|
-
MJpegDecoder mjpeg_decoder;
|
|
97
|
-
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
|
98
|
-
if (ret) {
|
|
99
|
-
*width = mjpeg_decoder.GetWidth();
|
|
100
|
-
*height = mjpeg_decoder.GetHeight();
|
|
101
|
-
}
|
|
102
|
-
mjpeg_decoder.UnloadFrame();
|
|
103
|
-
return ret ? 0 : -1; // -1 for runtime failure.
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// MJPG (Motion JPeg) to I420
|
|
107
|
-
// TODO(fbarchard): review src_width and src_height requirement. dst_width and
|
|
108
|
-
// dst_height may be enough.
|
|
109
|
-
LIBYUV_API
|
|
110
|
-
int MJPGToI420(const uint8_t* src_mjpg,
|
|
111
|
-
size_t src_size_mjpg,
|
|
112
|
-
uint8_t* dst_y,
|
|
113
|
-
int dst_stride_y,
|
|
114
|
-
uint8_t* dst_u,
|
|
115
|
-
int dst_stride_u,
|
|
116
|
-
uint8_t* dst_v,
|
|
117
|
-
int dst_stride_v,
|
|
118
|
-
int src_width,
|
|
119
|
-
int src_height,
|
|
120
|
-
int dst_width,
|
|
121
|
-
int dst_height) {
|
|
122
|
-
if (src_size_mjpg == kUnknownDataSize) {
|
|
123
|
-
// ERROR: MJPEG frame size unknown
|
|
124
|
-
return -1;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// TODO(fbarchard): Port MJpeg to C.
|
|
128
|
-
MJpegDecoder mjpeg_decoder;
|
|
129
|
-
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
|
130
|
-
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
|
131
|
-
mjpeg_decoder.GetHeight() != src_height)) {
|
|
132
|
-
// ERROR: MJPEG frame has unexpected dimensions
|
|
133
|
-
mjpeg_decoder.UnloadFrame();
|
|
134
|
-
return 1; // runtime failure
|
|
135
|
-
}
|
|
136
|
-
if (ret) {
|
|
137
|
-
I420Buffers bufs = {dst_y, dst_stride_y, dst_u, dst_stride_u,
|
|
138
|
-
dst_v, dst_stride_v, dst_width, dst_height};
|
|
139
|
-
// YUV420
|
|
140
|
-
if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
|
|
141
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
142
|
-
mjpeg_decoder.GetVertSampFactor(0) == 2 &&
|
|
143
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
144
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
145
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
146
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
147
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
148
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegCopyI420, &bufs, dst_width,
|
|
149
|
-
dst_height);
|
|
150
|
-
// YUV422
|
|
151
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
152
|
-
MJpegDecoder::kColorSpaceYCbCr &&
|
|
153
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
154
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
155
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
156
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
157
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
158
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
159
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
160
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToI420, &bufs, dst_width,
|
|
161
|
-
dst_height);
|
|
162
|
-
// YUV444
|
|
163
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
164
|
-
MJpegDecoder::kColorSpaceYCbCr &&
|
|
165
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
166
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
167
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
|
|
168
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
169
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
170
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
171
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
172
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToI420, &bufs, dst_width,
|
|
173
|
-
dst_height);
|
|
174
|
-
// YUV400
|
|
175
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
176
|
-
MJpegDecoder::kColorSpaceGrayscale &&
|
|
177
|
-
mjpeg_decoder.GetNumComponents() == 1 &&
|
|
178
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
179
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 1) {
|
|
180
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToI420, &bufs, dst_width,
|
|
181
|
-
dst_height);
|
|
182
|
-
} else {
|
|
183
|
-
// TODO(fbarchard): Implement conversion for any other
|
|
184
|
-
// colorspace/subsample factors that occur in practice. ERROR: Unable to
|
|
185
|
-
// convert MJPEG frame because format is not supported
|
|
186
|
-
mjpeg_decoder.UnloadFrame();
|
|
187
|
-
return 1;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return ret ? 0 : 1;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
struct NV21Buffers {
|
|
194
|
-
uint8_t* y;
|
|
195
|
-
int y_stride;
|
|
196
|
-
uint8_t* vu;
|
|
197
|
-
int vu_stride;
|
|
198
|
-
int w;
|
|
199
|
-
int h;
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
static void JpegI420ToNV21(void* opaque,
|
|
203
|
-
const uint8_t* const* data,
|
|
204
|
-
const int* strides,
|
|
205
|
-
int rows) {
|
|
206
|
-
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
207
|
-
I420ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
208
|
-
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
209
|
-
dest->y += rows * dest->y_stride;
|
|
210
|
-
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
211
|
-
dest->h -= rows;
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
static void JpegI422ToNV21(void* opaque,
|
|
215
|
-
const uint8_t* const* data,
|
|
216
|
-
const int* strides,
|
|
217
|
-
int rows) {
|
|
218
|
-
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
219
|
-
I422ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
220
|
-
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
221
|
-
dest->y += rows * dest->y_stride;
|
|
222
|
-
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
223
|
-
dest->h -= rows;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
static void JpegI444ToNV21(void* opaque,
|
|
227
|
-
const uint8_t* const* data,
|
|
228
|
-
const int* strides,
|
|
229
|
-
int rows) {
|
|
230
|
-
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
231
|
-
I444ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
232
|
-
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
233
|
-
dest->y += rows * dest->y_stride;
|
|
234
|
-
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
235
|
-
dest->h -= rows;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
static void JpegI400ToNV21(void* opaque,
|
|
239
|
-
const uint8_t* const* data,
|
|
240
|
-
const int* strides,
|
|
241
|
-
int rows) {
|
|
242
|
-
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
243
|
-
I400ToNV21(data[0], strides[0], dest->y, dest->y_stride, dest->vu,
|
|
244
|
-
dest->vu_stride, dest->w, rows);
|
|
245
|
-
dest->y += rows * dest->y_stride;
|
|
246
|
-
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
247
|
-
dest->h -= rows;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// MJPG (Motion JPeg) to NV21
|
|
251
|
-
LIBYUV_API
|
|
252
|
-
int MJPGToNV21(const uint8_t* src_mjpg,
|
|
253
|
-
size_t src_size_mjpg,
|
|
254
|
-
uint8_t* dst_y,
|
|
255
|
-
int dst_stride_y,
|
|
256
|
-
uint8_t* dst_vu,
|
|
257
|
-
int dst_stride_vu,
|
|
258
|
-
int src_width,
|
|
259
|
-
int src_height,
|
|
260
|
-
int dst_width,
|
|
261
|
-
int dst_height) {
|
|
262
|
-
if (src_size_mjpg == kUnknownDataSize) {
|
|
263
|
-
// ERROR: MJPEG frame size unknown
|
|
264
|
-
return -1;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// TODO(fbarchard): Port MJpeg to C.
|
|
268
|
-
MJpegDecoder mjpeg_decoder;
|
|
269
|
-
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
|
270
|
-
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
|
271
|
-
mjpeg_decoder.GetHeight() != src_height)) {
|
|
272
|
-
// ERROR: MJPEG frame has unexpected dimensions
|
|
273
|
-
mjpeg_decoder.UnloadFrame();
|
|
274
|
-
return 1; // runtime failure
|
|
275
|
-
}
|
|
276
|
-
if (ret) {
|
|
277
|
-
NV21Buffers bufs = {dst_y, dst_stride_y, dst_vu,
|
|
278
|
-
dst_stride_vu, dst_width, dst_height};
|
|
279
|
-
// YUV420
|
|
280
|
-
if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
|
|
281
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
282
|
-
mjpeg_decoder.GetVertSampFactor(0) == 2 &&
|
|
283
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
284
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
285
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
286
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
287
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
288
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToNV21, &bufs, dst_width,
|
|
289
|
-
dst_height);
|
|
290
|
-
// YUV422
|
|
291
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
292
|
-
MJpegDecoder::kColorSpaceYCbCr &&
|
|
293
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
294
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
295
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
296
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
297
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
298
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
299
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
300
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToNV21, &bufs, dst_width,
|
|
301
|
-
dst_height);
|
|
302
|
-
// YUV444
|
|
303
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
304
|
-
MJpegDecoder::kColorSpaceYCbCr &&
|
|
305
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
306
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
307
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
|
|
308
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
309
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
310
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
311
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
312
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToNV21, &bufs, dst_width,
|
|
313
|
-
dst_height);
|
|
314
|
-
// YUV400
|
|
315
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
316
|
-
MJpegDecoder::kColorSpaceGrayscale &&
|
|
317
|
-
mjpeg_decoder.GetNumComponents() == 1 &&
|
|
318
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
319
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 1) {
|
|
320
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToNV21, &bufs, dst_width,
|
|
321
|
-
dst_height);
|
|
322
|
-
} else {
|
|
323
|
-
// Unknown colorspace.
|
|
324
|
-
mjpeg_decoder.UnloadFrame();
|
|
325
|
-
return 1;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
return ret ? 0 : 1;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
static void JpegI420ToNV12(void* opaque,
|
|
332
|
-
const uint8_t* const* data,
|
|
333
|
-
const int* strides,
|
|
334
|
-
int rows) {
|
|
335
|
-
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
336
|
-
// Use NV21 with VU swapped.
|
|
337
|
-
I420ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
|
|
338
|
-
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
339
|
-
dest->y += rows * dest->y_stride;
|
|
340
|
-
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
341
|
-
dest->h -= rows;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
static void JpegI422ToNV12(void* opaque,
|
|
345
|
-
const uint8_t* const* data,
|
|
346
|
-
const int* strides,
|
|
347
|
-
int rows) {
|
|
348
|
-
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
349
|
-
// Use NV21 with VU swapped.
|
|
350
|
-
I422ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
|
|
351
|
-
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
352
|
-
dest->y += rows * dest->y_stride;
|
|
353
|
-
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
354
|
-
dest->h -= rows;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
static void JpegI444ToNV12(void* opaque,
|
|
358
|
-
const uint8_t* const* data,
|
|
359
|
-
const int* strides,
|
|
360
|
-
int rows) {
|
|
361
|
-
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
362
|
-
// Use NV21 with VU swapped.
|
|
363
|
-
I444ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
|
|
364
|
-
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
365
|
-
dest->y += rows * dest->y_stride;
|
|
366
|
-
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
367
|
-
dest->h -= rows;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
static void JpegI400ToNV12(void* opaque,
|
|
371
|
-
const uint8_t* const* data,
|
|
372
|
-
const int* strides,
|
|
373
|
-
int rows) {
|
|
374
|
-
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
375
|
-
// Use NV21 since there is no UV plane.
|
|
376
|
-
I400ToNV21(data[0], strides[0], dest->y, dest->y_stride, dest->vu,
|
|
377
|
-
dest->vu_stride, dest->w, rows);
|
|
378
|
-
dest->y += rows * dest->y_stride;
|
|
379
|
-
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
380
|
-
dest->h -= rows;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
// MJPG (Motion JPEG) to NV12.
|
|
384
|
-
LIBYUV_API
|
|
385
|
-
int MJPGToNV12(const uint8_t* sample,
|
|
386
|
-
size_t sample_size,
|
|
387
|
-
uint8_t* dst_y,
|
|
388
|
-
int dst_stride_y,
|
|
389
|
-
uint8_t* dst_uv,
|
|
390
|
-
int dst_stride_uv,
|
|
391
|
-
int src_width,
|
|
392
|
-
int src_height,
|
|
393
|
-
int dst_width,
|
|
394
|
-
int dst_height) {
|
|
395
|
-
if (sample_size == kUnknownDataSize) {
|
|
396
|
-
// ERROR: MJPEG frame size unknown
|
|
397
|
-
return -1;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
// TODO(fbarchard): Port MJpeg to C.
|
|
401
|
-
MJpegDecoder mjpeg_decoder;
|
|
402
|
-
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size);
|
|
403
|
-
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
|
404
|
-
mjpeg_decoder.GetHeight() != src_height)) {
|
|
405
|
-
// ERROR: MJPEG frame has unexpected dimensions
|
|
406
|
-
mjpeg_decoder.UnloadFrame();
|
|
407
|
-
return 1; // runtime failure
|
|
408
|
-
}
|
|
409
|
-
if (ret) {
|
|
410
|
-
// Use NV21Buffers but with UV instead of VU.
|
|
411
|
-
NV21Buffers bufs = {dst_y, dst_stride_y, dst_uv,
|
|
412
|
-
dst_stride_uv, dst_width, dst_height};
|
|
413
|
-
// YUV420
|
|
414
|
-
if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
|
|
415
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
416
|
-
mjpeg_decoder.GetVertSampFactor(0) == 2 &&
|
|
417
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
418
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
419
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
420
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
421
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
422
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToNV12, &bufs, dst_width,
|
|
423
|
-
dst_height);
|
|
424
|
-
// YUV422
|
|
425
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
426
|
-
MJpegDecoder::kColorSpaceYCbCr &&
|
|
427
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
428
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
429
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
430
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
431
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
432
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
433
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
434
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToNV12, &bufs, dst_width,
|
|
435
|
-
dst_height);
|
|
436
|
-
// YUV444
|
|
437
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
438
|
-
MJpegDecoder::kColorSpaceYCbCr &&
|
|
439
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
440
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
441
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
|
|
442
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
443
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
444
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
445
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
446
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToNV12, &bufs, dst_width,
|
|
447
|
-
dst_height);
|
|
448
|
-
// YUV400
|
|
449
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
450
|
-
MJpegDecoder::kColorSpaceGrayscale &&
|
|
451
|
-
mjpeg_decoder.GetNumComponents() == 1 &&
|
|
452
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
453
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 1) {
|
|
454
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToNV12, &bufs, dst_width,
|
|
455
|
-
dst_height);
|
|
456
|
-
} else {
|
|
457
|
-
// Unknown colorspace.
|
|
458
|
-
mjpeg_decoder.UnloadFrame();
|
|
459
|
-
return 1;
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
return ret ? 0 : 1;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
struct ARGBBuffers {
|
|
466
|
-
uint8_t* argb;
|
|
467
|
-
int argb_stride;
|
|
468
|
-
int w;
|
|
469
|
-
int h;
|
|
470
|
-
};
|
|
471
|
-
|
|
472
|
-
static void JpegI420ToARGB(void* opaque,
|
|
473
|
-
const uint8_t* const* data,
|
|
474
|
-
const int* strides,
|
|
475
|
-
int rows) {
|
|
476
|
-
ARGBBuffers* dest = (ARGBBuffers*)(opaque);
|
|
477
|
-
I420ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
478
|
-
dest->argb, dest->argb_stride, dest->w, rows);
|
|
479
|
-
dest->argb += rows * dest->argb_stride;
|
|
480
|
-
dest->h -= rows;
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
static void JpegI422ToARGB(void* opaque,
|
|
484
|
-
const uint8_t* const* data,
|
|
485
|
-
const int* strides,
|
|
486
|
-
int rows) {
|
|
487
|
-
ARGBBuffers* dest = (ARGBBuffers*)(opaque);
|
|
488
|
-
I422ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
489
|
-
dest->argb, dest->argb_stride, dest->w, rows);
|
|
490
|
-
dest->argb += rows * dest->argb_stride;
|
|
491
|
-
dest->h -= rows;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
static void JpegI444ToARGB(void* opaque,
|
|
495
|
-
const uint8_t* const* data,
|
|
496
|
-
const int* strides,
|
|
497
|
-
int rows) {
|
|
498
|
-
ARGBBuffers* dest = (ARGBBuffers*)(opaque);
|
|
499
|
-
I444ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
500
|
-
dest->argb, dest->argb_stride, dest->w, rows);
|
|
501
|
-
dest->argb += rows * dest->argb_stride;
|
|
502
|
-
dest->h -= rows;
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
static void JpegI400ToARGB(void* opaque,
|
|
506
|
-
const uint8_t* const* data,
|
|
507
|
-
const int* strides,
|
|
508
|
-
int rows) {
|
|
509
|
-
ARGBBuffers* dest = (ARGBBuffers*)(opaque);
|
|
510
|
-
I400ToARGB(data[0], strides[0], dest->argb, dest->argb_stride, dest->w, rows);
|
|
511
|
-
dest->argb += rows * dest->argb_stride;
|
|
512
|
-
dest->h -= rows;
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
// MJPG (Motion JPeg) to ARGB
|
|
516
|
-
// TODO(fbarchard): review src_width and src_height requirement. dst_width and
|
|
517
|
-
// dst_height may be enough.
|
|
518
|
-
LIBYUV_API
|
|
519
|
-
int MJPGToARGB(const uint8_t* src_mjpg,
|
|
520
|
-
size_t src_size_mjpg,
|
|
521
|
-
uint8_t* dst_argb,
|
|
522
|
-
int dst_stride_argb,
|
|
523
|
-
int src_width,
|
|
524
|
-
int src_height,
|
|
525
|
-
int dst_width,
|
|
526
|
-
int dst_height) {
|
|
527
|
-
if (src_size_mjpg == kUnknownDataSize) {
|
|
528
|
-
// ERROR: MJPEG frame size unknown
|
|
529
|
-
return -1;
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
// TODO(fbarchard): Port MJpeg to C.
|
|
533
|
-
MJpegDecoder mjpeg_decoder;
|
|
534
|
-
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
|
535
|
-
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
|
536
|
-
mjpeg_decoder.GetHeight() != src_height)) {
|
|
537
|
-
// ERROR: MJPEG frame has unexpected dimensions
|
|
538
|
-
mjpeg_decoder.UnloadFrame();
|
|
539
|
-
return 1; // runtime failure
|
|
540
|
-
}
|
|
541
|
-
if (ret) {
|
|
542
|
-
ARGBBuffers bufs = {dst_argb, dst_stride_argb, dst_width, dst_height};
|
|
543
|
-
// YUV420
|
|
544
|
-
if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
|
|
545
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
546
|
-
mjpeg_decoder.GetVertSampFactor(0) == 2 &&
|
|
547
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
548
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
549
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
550
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
551
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
552
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToARGB, &bufs, dst_width,
|
|
553
|
-
dst_height);
|
|
554
|
-
// YUV422
|
|
555
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
556
|
-
MJpegDecoder::kColorSpaceYCbCr &&
|
|
557
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
558
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
559
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
560
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
561
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
562
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
563
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
564
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToARGB, &bufs, dst_width,
|
|
565
|
-
dst_height);
|
|
566
|
-
// YUV444
|
|
567
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
568
|
-
MJpegDecoder::kColorSpaceYCbCr &&
|
|
569
|
-
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
570
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
571
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
|
|
572
|
-
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
573
|
-
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
574
|
-
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
575
|
-
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
576
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToARGB, &bufs, dst_width,
|
|
577
|
-
dst_height);
|
|
578
|
-
// YUV400
|
|
579
|
-
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
580
|
-
MJpegDecoder::kColorSpaceGrayscale &&
|
|
581
|
-
mjpeg_decoder.GetNumComponents() == 1 &&
|
|
582
|
-
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
583
|
-
mjpeg_decoder.GetHorizSampFactor(0) == 1) {
|
|
584
|
-
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToARGB, &bufs, dst_width,
|
|
585
|
-
dst_height);
|
|
586
|
-
} else {
|
|
587
|
-
// TODO(fbarchard): Implement conversion for any other
|
|
588
|
-
// colorspace/subsample factors that occur in practice. ERROR: Unable to
|
|
589
|
-
// convert MJPEG frame because format is not supported
|
|
590
|
-
mjpeg_decoder.UnloadFrame();
|
|
591
|
-
return 1;
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
return ret ? 0 : 1;
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
#endif // HAVE_JPEG
|
|
598
|
-
|
|
599
|
-
#ifdef __cplusplus
|
|
600
|
-
} // extern "C"
|
|
601
|
-
} // namespace libyuv
|
|
602
|
-
#endif
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2011 The LibYuv Project Authors. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Use of this source code is governed by a BSD-style license
|
|
5
|
+
* that can be found in the LICENSE file in the root of the source
|
|
6
|
+
* tree. An additional intellectual property rights grant can be found
|
|
7
|
+
* in the file PATENTS. All contributing project authors may
|
|
8
|
+
* be found in the AUTHORS file in the root of the source tree.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#include "libyuv/convert.h"
|
|
12
|
+
#include "libyuv/convert_argb.h"
|
|
13
|
+
|
|
14
|
+
#ifdef HAVE_JPEG
|
|
15
|
+
#include "libyuv/mjpeg_decoder.h"
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
#ifdef __cplusplus
|
|
19
|
+
namespace libyuv {
|
|
20
|
+
extern "C" {
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
#ifdef HAVE_JPEG
|
|
24
|
+
struct I420Buffers {
|
|
25
|
+
uint8_t* y;
|
|
26
|
+
int y_stride;
|
|
27
|
+
uint8_t* u;
|
|
28
|
+
int u_stride;
|
|
29
|
+
uint8_t* v;
|
|
30
|
+
int v_stride;
|
|
31
|
+
int w;
|
|
32
|
+
int h;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
static void JpegCopyI420(void* opaque,
|
|
36
|
+
const uint8_t* const* data,
|
|
37
|
+
const int* strides,
|
|
38
|
+
int rows) {
|
|
39
|
+
I420Buffers* dest = (I420Buffers*)(opaque);
|
|
40
|
+
I420Copy(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
41
|
+
dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
|
|
42
|
+
dest->v_stride, dest->w, rows);
|
|
43
|
+
dest->y += rows * dest->y_stride;
|
|
44
|
+
dest->u += ((rows + 1) >> 1) * dest->u_stride;
|
|
45
|
+
dest->v += ((rows + 1) >> 1) * dest->v_stride;
|
|
46
|
+
dest->h -= rows;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static void JpegI422ToI420(void* opaque,
|
|
50
|
+
const uint8_t* const* data,
|
|
51
|
+
const int* strides,
|
|
52
|
+
int rows) {
|
|
53
|
+
I420Buffers* dest = (I420Buffers*)(opaque);
|
|
54
|
+
I422ToI420(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
55
|
+
dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
|
|
56
|
+
dest->v_stride, dest->w, rows);
|
|
57
|
+
dest->y += rows * dest->y_stride;
|
|
58
|
+
dest->u += ((rows + 1) >> 1) * dest->u_stride;
|
|
59
|
+
dest->v += ((rows + 1) >> 1) * dest->v_stride;
|
|
60
|
+
dest->h -= rows;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
static void JpegI444ToI420(void* opaque,
|
|
64
|
+
const uint8_t* const* data,
|
|
65
|
+
const int* strides,
|
|
66
|
+
int rows) {
|
|
67
|
+
I420Buffers* dest = (I420Buffers*)(opaque);
|
|
68
|
+
I444ToI420(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
69
|
+
dest->y, dest->y_stride, dest->u, dest->u_stride, dest->v,
|
|
70
|
+
dest->v_stride, dest->w, rows);
|
|
71
|
+
dest->y += rows * dest->y_stride;
|
|
72
|
+
dest->u += ((rows + 1) >> 1) * dest->u_stride;
|
|
73
|
+
dest->v += ((rows + 1) >> 1) * dest->v_stride;
|
|
74
|
+
dest->h -= rows;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static void JpegI400ToI420(void* opaque,
|
|
78
|
+
const uint8_t* const* data,
|
|
79
|
+
const int* strides,
|
|
80
|
+
int rows) {
|
|
81
|
+
I420Buffers* dest = (I420Buffers*)(opaque);
|
|
82
|
+
I400ToI420(data[0], strides[0], dest->y, dest->y_stride, dest->u,
|
|
83
|
+
dest->u_stride, dest->v, dest->v_stride, dest->w, rows);
|
|
84
|
+
dest->y += rows * dest->y_stride;
|
|
85
|
+
dest->u += ((rows + 1) >> 1) * dest->u_stride;
|
|
86
|
+
dest->v += ((rows + 1) >> 1) * dest->v_stride;
|
|
87
|
+
dest->h -= rows;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Query size of MJPG in pixels.
|
|
91
|
+
LIBYUV_API
|
|
92
|
+
int MJPGSize(const uint8_t* src_mjpg,
|
|
93
|
+
size_t src_size_mjpg,
|
|
94
|
+
int* width,
|
|
95
|
+
int* height) {
|
|
96
|
+
MJpegDecoder mjpeg_decoder;
|
|
97
|
+
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
|
98
|
+
if (ret) {
|
|
99
|
+
*width = mjpeg_decoder.GetWidth();
|
|
100
|
+
*height = mjpeg_decoder.GetHeight();
|
|
101
|
+
}
|
|
102
|
+
mjpeg_decoder.UnloadFrame();
|
|
103
|
+
return ret ? 0 : -1; // -1 for runtime failure.
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// MJPG (Motion JPeg) to I420
|
|
107
|
+
// TODO(fbarchard): review src_width and src_height requirement. dst_width and
|
|
108
|
+
// dst_height may be enough.
|
|
109
|
+
LIBYUV_API
|
|
110
|
+
int MJPGToI420(const uint8_t* src_mjpg,
|
|
111
|
+
size_t src_size_mjpg,
|
|
112
|
+
uint8_t* dst_y,
|
|
113
|
+
int dst_stride_y,
|
|
114
|
+
uint8_t* dst_u,
|
|
115
|
+
int dst_stride_u,
|
|
116
|
+
uint8_t* dst_v,
|
|
117
|
+
int dst_stride_v,
|
|
118
|
+
int src_width,
|
|
119
|
+
int src_height,
|
|
120
|
+
int dst_width,
|
|
121
|
+
int dst_height) {
|
|
122
|
+
if (src_size_mjpg == kUnknownDataSize) {
|
|
123
|
+
// ERROR: MJPEG frame size unknown
|
|
124
|
+
return -1;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// TODO(fbarchard): Port MJpeg to C.
|
|
128
|
+
MJpegDecoder mjpeg_decoder;
|
|
129
|
+
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
|
130
|
+
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
|
131
|
+
mjpeg_decoder.GetHeight() != src_height)) {
|
|
132
|
+
// ERROR: MJPEG frame has unexpected dimensions
|
|
133
|
+
mjpeg_decoder.UnloadFrame();
|
|
134
|
+
return 1; // runtime failure
|
|
135
|
+
}
|
|
136
|
+
if (ret) {
|
|
137
|
+
I420Buffers bufs = {dst_y, dst_stride_y, dst_u, dst_stride_u,
|
|
138
|
+
dst_v, dst_stride_v, dst_width, dst_height};
|
|
139
|
+
// YUV420
|
|
140
|
+
if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
|
|
141
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
142
|
+
mjpeg_decoder.GetVertSampFactor(0) == 2 &&
|
|
143
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
144
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
145
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
146
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
147
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
148
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegCopyI420, &bufs, dst_width,
|
|
149
|
+
dst_height);
|
|
150
|
+
// YUV422
|
|
151
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
152
|
+
MJpegDecoder::kColorSpaceYCbCr &&
|
|
153
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
154
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
155
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
156
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
157
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
158
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
159
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
160
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToI420, &bufs, dst_width,
|
|
161
|
+
dst_height);
|
|
162
|
+
// YUV444
|
|
163
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
164
|
+
MJpegDecoder::kColorSpaceYCbCr &&
|
|
165
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
166
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
167
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
|
|
168
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
169
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
170
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
171
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
172
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToI420, &bufs, dst_width,
|
|
173
|
+
dst_height);
|
|
174
|
+
// YUV400
|
|
175
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
176
|
+
MJpegDecoder::kColorSpaceGrayscale &&
|
|
177
|
+
mjpeg_decoder.GetNumComponents() == 1 &&
|
|
178
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
179
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 1) {
|
|
180
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToI420, &bufs, dst_width,
|
|
181
|
+
dst_height);
|
|
182
|
+
} else {
|
|
183
|
+
// TODO(fbarchard): Implement conversion for any other
|
|
184
|
+
// colorspace/subsample factors that occur in practice. ERROR: Unable to
|
|
185
|
+
// convert MJPEG frame because format is not supported
|
|
186
|
+
mjpeg_decoder.UnloadFrame();
|
|
187
|
+
return 1;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return ret ? 0 : 1;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
struct NV21Buffers {
|
|
194
|
+
uint8_t* y;
|
|
195
|
+
int y_stride;
|
|
196
|
+
uint8_t* vu;
|
|
197
|
+
int vu_stride;
|
|
198
|
+
int w;
|
|
199
|
+
int h;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
static void JpegI420ToNV21(void* opaque,
|
|
203
|
+
const uint8_t* const* data,
|
|
204
|
+
const int* strides,
|
|
205
|
+
int rows) {
|
|
206
|
+
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
207
|
+
I420ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
208
|
+
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
209
|
+
dest->y += rows * dest->y_stride;
|
|
210
|
+
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
211
|
+
dest->h -= rows;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
static void JpegI422ToNV21(void* opaque,
|
|
215
|
+
const uint8_t* const* data,
|
|
216
|
+
const int* strides,
|
|
217
|
+
int rows) {
|
|
218
|
+
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
219
|
+
I422ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
220
|
+
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
221
|
+
dest->y += rows * dest->y_stride;
|
|
222
|
+
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
223
|
+
dest->h -= rows;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
static void JpegI444ToNV21(void* opaque,
|
|
227
|
+
const uint8_t* const* data,
|
|
228
|
+
const int* strides,
|
|
229
|
+
int rows) {
|
|
230
|
+
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
231
|
+
I444ToNV21(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
232
|
+
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
233
|
+
dest->y += rows * dest->y_stride;
|
|
234
|
+
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
235
|
+
dest->h -= rows;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
static void JpegI400ToNV21(void* opaque,
|
|
239
|
+
const uint8_t* const* data,
|
|
240
|
+
const int* strides,
|
|
241
|
+
int rows) {
|
|
242
|
+
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
243
|
+
I400ToNV21(data[0], strides[0], dest->y, dest->y_stride, dest->vu,
|
|
244
|
+
dest->vu_stride, dest->w, rows);
|
|
245
|
+
dest->y += rows * dest->y_stride;
|
|
246
|
+
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
247
|
+
dest->h -= rows;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// MJPG (Motion JPeg) to NV21
|
|
251
|
+
LIBYUV_API
|
|
252
|
+
int MJPGToNV21(const uint8_t* src_mjpg,
|
|
253
|
+
size_t src_size_mjpg,
|
|
254
|
+
uint8_t* dst_y,
|
|
255
|
+
int dst_stride_y,
|
|
256
|
+
uint8_t* dst_vu,
|
|
257
|
+
int dst_stride_vu,
|
|
258
|
+
int src_width,
|
|
259
|
+
int src_height,
|
|
260
|
+
int dst_width,
|
|
261
|
+
int dst_height) {
|
|
262
|
+
if (src_size_mjpg == kUnknownDataSize) {
|
|
263
|
+
// ERROR: MJPEG frame size unknown
|
|
264
|
+
return -1;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// TODO(fbarchard): Port MJpeg to C.
|
|
268
|
+
MJpegDecoder mjpeg_decoder;
|
|
269
|
+
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
|
270
|
+
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
|
271
|
+
mjpeg_decoder.GetHeight() != src_height)) {
|
|
272
|
+
// ERROR: MJPEG frame has unexpected dimensions
|
|
273
|
+
mjpeg_decoder.UnloadFrame();
|
|
274
|
+
return 1; // runtime failure
|
|
275
|
+
}
|
|
276
|
+
if (ret) {
|
|
277
|
+
NV21Buffers bufs = {dst_y, dst_stride_y, dst_vu,
|
|
278
|
+
dst_stride_vu, dst_width, dst_height};
|
|
279
|
+
// YUV420
|
|
280
|
+
if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
|
|
281
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
282
|
+
mjpeg_decoder.GetVertSampFactor(0) == 2 &&
|
|
283
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
284
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
285
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
286
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
287
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
288
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToNV21, &bufs, dst_width,
|
|
289
|
+
dst_height);
|
|
290
|
+
// YUV422
|
|
291
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
292
|
+
MJpegDecoder::kColorSpaceYCbCr &&
|
|
293
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
294
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
295
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
296
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
297
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
298
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
299
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
300
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToNV21, &bufs, dst_width,
|
|
301
|
+
dst_height);
|
|
302
|
+
// YUV444
|
|
303
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
304
|
+
MJpegDecoder::kColorSpaceYCbCr &&
|
|
305
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
306
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
307
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
|
|
308
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
309
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
310
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
311
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
312
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToNV21, &bufs, dst_width,
|
|
313
|
+
dst_height);
|
|
314
|
+
// YUV400
|
|
315
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
316
|
+
MJpegDecoder::kColorSpaceGrayscale &&
|
|
317
|
+
mjpeg_decoder.GetNumComponents() == 1 &&
|
|
318
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
319
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 1) {
|
|
320
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToNV21, &bufs, dst_width,
|
|
321
|
+
dst_height);
|
|
322
|
+
} else {
|
|
323
|
+
// Unknown colorspace.
|
|
324
|
+
mjpeg_decoder.UnloadFrame();
|
|
325
|
+
return 1;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return ret ? 0 : 1;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
static void JpegI420ToNV12(void* opaque,
|
|
332
|
+
const uint8_t* const* data,
|
|
333
|
+
const int* strides,
|
|
334
|
+
int rows) {
|
|
335
|
+
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
336
|
+
// Use NV21 with VU swapped.
|
|
337
|
+
I420ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
|
|
338
|
+
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
339
|
+
dest->y += rows * dest->y_stride;
|
|
340
|
+
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
341
|
+
dest->h -= rows;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
static void JpegI422ToNV12(void* opaque,
|
|
345
|
+
const uint8_t* const* data,
|
|
346
|
+
const int* strides,
|
|
347
|
+
int rows) {
|
|
348
|
+
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
349
|
+
// Use NV21 with VU swapped.
|
|
350
|
+
I422ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
|
|
351
|
+
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
352
|
+
dest->y += rows * dest->y_stride;
|
|
353
|
+
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
354
|
+
dest->h -= rows;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
static void JpegI444ToNV12(void* opaque,
|
|
358
|
+
const uint8_t* const* data,
|
|
359
|
+
const int* strides,
|
|
360
|
+
int rows) {
|
|
361
|
+
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
362
|
+
// Use NV21 with VU swapped.
|
|
363
|
+
I444ToNV21(data[0], strides[0], data[2], strides[2], data[1], strides[1],
|
|
364
|
+
dest->y, dest->y_stride, dest->vu, dest->vu_stride, dest->w, rows);
|
|
365
|
+
dest->y += rows * dest->y_stride;
|
|
366
|
+
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
367
|
+
dest->h -= rows;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
static void JpegI400ToNV12(void* opaque,
|
|
371
|
+
const uint8_t* const* data,
|
|
372
|
+
const int* strides,
|
|
373
|
+
int rows) {
|
|
374
|
+
NV21Buffers* dest = (NV21Buffers*)(opaque);
|
|
375
|
+
// Use NV21 since there is no UV plane.
|
|
376
|
+
I400ToNV21(data[0], strides[0], dest->y, dest->y_stride, dest->vu,
|
|
377
|
+
dest->vu_stride, dest->w, rows);
|
|
378
|
+
dest->y += rows * dest->y_stride;
|
|
379
|
+
dest->vu += ((rows + 1) >> 1) * dest->vu_stride;
|
|
380
|
+
dest->h -= rows;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// MJPG (Motion JPEG) to NV12.
|
|
384
|
+
LIBYUV_API
|
|
385
|
+
int MJPGToNV12(const uint8_t* sample,
|
|
386
|
+
size_t sample_size,
|
|
387
|
+
uint8_t* dst_y,
|
|
388
|
+
int dst_stride_y,
|
|
389
|
+
uint8_t* dst_uv,
|
|
390
|
+
int dst_stride_uv,
|
|
391
|
+
int src_width,
|
|
392
|
+
int src_height,
|
|
393
|
+
int dst_width,
|
|
394
|
+
int dst_height) {
|
|
395
|
+
if (sample_size == kUnknownDataSize) {
|
|
396
|
+
// ERROR: MJPEG frame size unknown
|
|
397
|
+
return -1;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// TODO(fbarchard): Port MJpeg to C.
|
|
401
|
+
MJpegDecoder mjpeg_decoder;
|
|
402
|
+
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size);
|
|
403
|
+
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
|
404
|
+
mjpeg_decoder.GetHeight() != src_height)) {
|
|
405
|
+
// ERROR: MJPEG frame has unexpected dimensions
|
|
406
|
+
mjpeg_decoder.UnloadFrame();
|
|
407
|
+
return 1; // runtime failure
|
|
408
|
+
}
|
|
409
|
+
if (ret) {
|
|
410
|
+
// Use NV21Buffers but with UV instead of VU.
|
|
411
|
+
NV21Buffers bufs = {dst_y, dst_stride_y, dst_uv,
|
|
412
|
+
dst_stride_uv, dst_width, dst_height};
|
|
413
|
+
// YUV420
|
|
414
|
+
if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
|
|
415
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
416
|
+
mjpeg_decoder.GetVertSampFactor(0) == 2 &&
|
|
417
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
418
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
419
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
420
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
421
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
422
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToNV12, &bufs, dst_width,
|
|
423
|
+
dst_height);
|
|
424
|
+
// YUV422
|
|
425
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
426
|
+
MJpegDecoder::kColorSpaceYCbCr &&
|
|
427
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
428
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
429
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
430
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
431
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
432
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
433
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
434
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToNV12, &bufs, dst_width,
|
|
435
|
+
dst_height);
|
|
436
|
+
// YUV444
|
|
437
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
438
|
+
MJpegDecoder::kColorSpaceYCbCr &&
|
|
439
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
440
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
441
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
|
|
442
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
443
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
444
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
445
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
446
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToNV12, &bufs, dst_width,
|
|
447
|
+
dst_height);
|
|
448
|
+
// YUV400
|
|
449
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
450
|
+
MJpegDecoder::kColorSpaceGrayscale &&
|
|
451
|
+
mjpeg_decoder.GetNumComponents() == 1 &&
|
|
452
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
453
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 1) {
|
|
454
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToNV12, &bufs, dst_width,
|
|
455
|
+
dst_height);
|
|
456
|
+
} else {
|
|
457
|
+
// Unknown colorspace.
|
|
458
|
+
mjpeg_decoder.UnloadFrame();
|
|
459
|
+
return 1;
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
return ret ? 0 : 1;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
struct ARGBBuffers {
|
|
466
|
+
uint8_t* argb;
|
|
467
|
+
int argb_stride;
|
|
468
|
+
int w;
|
|
469
|
+
int h;
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
static void JpegI420ToARGB(void* opaque,
|
|
473
|
+
const uint8_t* const* data,
|
|
474
|
+
const int* strides,
|
|
475
|
+
int rows) {
|
|
476
|
+
ARGBBuffers* dest = (ARGBBuffers*)(opaque);
|
|
477
|
+
I420ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
478
|
+
dest->argb, dest->argb_stride, dest->w, rows);
|
|
479
|
+
dest->argb += rows * dest->argb_stride;
|
|
480
|
+
dest->h -= rows;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
static void JpegI422ToARGB(void* opaque,
|
|
484
|
+
const uint8_t* const* data,
|
|
485
|
+
const int* strides,
|
|
486
|
+
int rows) {
|
|
487
|
+
ARGBBuffers* dest = (ARGBBuffers*)(opaque);
|
|
488
|
+
I422ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
489
|
+
dest->argb, dest->argb_stride, dest->w, rows);
|
|
490
|
+
dest->argb += rows * dest->argb_stride;
|
|
491
|
+
dest->h -= rows;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
static void JpegI444ToARGB(void* opaque,
|
|
495
|
+
const uint8_t* const* data,
|
|
496
|
+
const int* strides,
|
|
497
|
+
int rows) {
|
|
498
|
+
ARGBBuffers* dest = (ARGBBuffers*)(opaque);
|
|
499
|
+
I444ToARGB(data[0], strides[0], data[1], strides[1], data[2], strides[2],
|
|
500
|
+
dest->argb, dest->argb_stride, dest->w, rows);
|
|
501
|
+
dest->argb += rows * dest->argb_stride;
|
|
502
|
+
dest->h -= rows;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
static void JpegI400ToARGB(void* opaque,
|
|
506
|
+
const uint8_t* const* data,
|
|
507
|
+
const int* strides,
|
|
508
|
+
int rows) {
|
|
509
|
+
ARGBBuffers* dest = (ARGBBuffers*)(opaque);
|
|
510
|
+
I400ToARGB(data[0], strides[0], dest->argb, dest->argb_stride, dest->w, rows);
|
|
511
|
+
dest->argb += rows * dest->argb_stride;
|
|
512
|
+
dest->h -= rows;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// MJPG (Motion JPeg) to ARGB
|
|
516
|
+
// TODO(fbarchard): review src_width and src_height requirement. dst_width and
|
|
517
|
+
// dst_height may be enough.
|
|
518
|
+
LIBYUV_API
|
|
519
|
+
int MJPGToARGB(const uint8_t* src_mjpg,
|
|
520
|
+
size_t src_size_mjpg,
|
|
521
|
+
uint8_t* dst_argb,
|
|
522
|
+
int dst_stride_argb,
|
|
523
|
+
int src_width,
|
|
524
|
+
int src_height,
|
|
525
|
+
int dst_width,
|
|
526
|
+
int dst_height) {
|
|
527
|
+
if (src_size_mjpg == kUnknownDataSize) {
|
|
528
|
+
// ERROR: MJPEG frame size unknown
|
|
529
|
+
return -1;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// TODO(fbarchard): Port MJpeg to C.
|
|
533
|
+
MJpegDecoder mjpeg_decoder;
|
|
534
|
+
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
|
535
|
+
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
|
536
|
+
mjpeg_decoder.GetHeight() != src_height)) {
|
|
537
|
+
// ERROR: MJPEG frame has unexpected dimensions
|
|
538
|
+
mjpeg_decoder.UnloadFrame();
|
|
539
|
+
return 1; // runtime failure
|
|
540
|
+
}
|
|
541
|
+
if (ret) {
|
|
542
|
+
ARGBBuffers bufs = {dst_argb, dst_stride_argb, dst_width, dst_height};
|
|
543
|
+
// YUV420
|
|
544
|
+
if (mjpeg_decoder.GetColorSpace() == MJpegDecoder::kColorSpaceYCbCr &&
|
|
545
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
546
|
+
mjpeg_decoder.GetVertSampFactor(0) == 2 &&
|
|
547
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
548
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
549
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
550
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
551
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
552
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI420ToARGB, &bufs, dst_width,
|
|
553
|
+
dst_height);
|
|
554
|
+
// YUV422
|
|
555
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
556
|
+
MJpegDecoder::kColorSpaceYCbCr &&
|
|
557
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
558
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
559
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 2 &&
|
|
560
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
561
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
562
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
563
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
564
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI422ToARGB, &bufs, dst_width,
|
|
565
|
+
dst_height);
|
|
566
|
+
// YUV444
|
|
567
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
568
|
+
MJpegDecoder::kColorSpaceYCbCr &&
|
|
569
|
+
mjpeg_decoder.GetNumComponents() == 3 &&
|
|
570
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
571
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 1 &&
|
|
572
|
+
mjpeg_decoder.GetVertSampFactor(1) == 1 &&
|
|
573
|
+
mjpeg_decoder.GetHorizSampFactor(1) == 1 &&
|
|
574
|
+
mjpeg_decoder.GetVertSampFactor(2) == 1 &&
|
|
575
|
+
mjpeg_decoder.GetHorizSampFactor(2) == 1) {
|
|
576
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI444ToARGB, &bufs, dst_width,
|
|
577
|
+
dst_height);
|
|
578
|
+
// YUV400
|
|
579
|
+
} else if (mjpeg_decoder.GetColorSpace() ==
|
|
580
|
+
MJpegDecoder::kColorSpaceGrayscale &&
|
|
581
|
+
mjpeg_decoder.GetNumComponents() == 1 &&
|
|
582
|
+
mjpeg_decoder.GetVertSampFactor(0) == 1 &&
|
|
583
|
+
mjpeg_decoder.GetHorizSampFactor(0) == 1) {
|
|
584
|
+
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToARGB, &bufs, dst_width,
|
|
585
|
+
dst_height);
|
|
586
|
+
} else {
|
|
587
|
+
// TODO(fbarchard): Implement conversion for any other
|
|
588
|
+
// colorspace/subsample factors that occur in practice. ERROR: Unable to
|
|
589
|
+
// convert MJPEG frame because format is not supported
|
|
590
|
+
mjpeg_decoder.UnloadFrame();
|
|
591
|
+
return 1;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
return ret ? 0 : 1;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
#endif // HAVE_JPEG
|
|
598
|
+
|
|
599
|
+
#ifdef __cplusplus
|
|
600
|
+
} // extern "C"
|
|
601
|
+
} // namespace libyuv
|
|
602
|
+
#endif
|