mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-07 09:16:48 +08:00
Add commment for jpeg parameters.
Bug: None Test: Try bots Change-Id: I7b90731e828169af96b3e0b8f8821635cff57755 Reviewed-on: https://chromium-review.googlesource.com/c/1308819 Reviewed-by: Frank Barchard <fbarchard@chromium.org>
This commit is contained in:
parent
76630fb27a
commit
12f9b5f351
@ -1,6 +1,6 @@
|
|||||||
Name: libyuv
|
Name: libyuv
|
||||||
URL: http://code.google.com/p/libyuv/
|
URL: http://code.google.com/p/libyuv/
|
||||||
Version: 1722
|
Version: 1724
|
||||||
License: BSD
|
License: BSD
|
||||||
License File: LICENSE
|
License File: LICENSE
|
||||||
|
|
||||||
|
|||||||
@ -375,11 +375,13 @@ int ARGB4444ToI420(const uint8_t* src_argb4444,
|
|||||||
int height);
|
int height);
|
||||||
|
|
||||||
#ifdef HAVE_JPEG
|
#ifdef HAVE_JPEG
|
||||||
|
// src_mjpg is pointer to raw jpeg bytes in memory
|
||||||
|
// src_size_mjpg is size of jpeg in bytes
|
||||||
// src_width/height provided by capture.
|
// src_width/height provided by capture.
|
||||||
// dst_width/height for clipping determine final size.
|
// dst_width/height for clipping determine final size.
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int MJPGToI420(const uint8_t* sample,
|
int MJPGToI420(const uint8_t* src_mjpg,
|
||||||
size_t sample_size,
|
size_t src_size_mjpg,
|
||||||
uint8_t* dst_y,
|
uint8_t* dst_y,
|
||||||
int dst_stride_y,
|
int dst_stride_y,
|
||||||
uint8_t* dst_u,
|
uint8_t* dst_u,
|
||||||
@ -393,8 +395,8 @@ int MJPGToI420(const uint8_t* sample,
|
|||||||
|
|
||||||
// JPEG to NV21
|
// JPEG to NV21
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int MJPGToNV21(const uint8_t* sample,
|
int MJPGToNV21(const uint8_t* src_mjpg,
|
||||||
size_t sample_size,
|
size_t src_size_mjpg,
|
||||||
uint8_t* dst_y,
|
uint8_t* dst_y,
|
||||||
int dst_stride_y,
|
int dst_stride_y,
|
||||||
uint8_t* dst_vu,
|
uint8_t* dst_vu,
|
||||||
@ -406,8 +408,8 @@ int MJPGToNV21(const uint8_t* sample,
|
|||||||
|
|
||||||
// Query size of MJPG in pixels.
|
// Query size of MJPG in pixels.
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int MJPGSize(const uint8_t* sample,
|
int MJPGSize(const uint8_t* src_mjpg,
|
||||||
size_t sample_size,
|
size_t src_size_mjpg,
|
||||||
int* width,
|
int* width,
|
||||||
int* height);
|
int* height);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -627,8 +627,8 @@ int AR30ToAB30(const uint8_t* src_ar30,
|
|||||||
// src_width/height provided by capture
|
// src_width/height provided by capture
|
||||||
// dst_width/height for clipping determine final size.
|
// dst_width/height for clipping determine final size.
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int MJPGToARGB(const uint8_t* sample,
|
int MJPGToARGB(const uint8_t* src_mjpg,
|
||||||
size_t sample_size,
|
size_t src_size_mjpg,
|
||||||
uint8_t* dst_argb,
|
uint8_t* dst_argb,
|
||||||
int dst_stride_argb,
|
int dst_stride_argb,
|
||||||
int src_width,
|
int src_width,
|
||||||
|
|||||||
@ -26,7 +26,7 @@ namespace libyuv {
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LIBYUV_BOOL ValidateJpeg(const uint8_t* sample, size_t sample_size);
|
LIBYUV_BOOL ValidateJpeg(const uint8_t* src_mjpg, size_t src_size_mjpg_size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@ -11,6 +11,6 @@
|
|||||||
#ifndef INCLUDE_LIBYUV_VERSION_H_
|
#ifndef INCLUDE_LIBYUV_VERSION_H_
|
||||||
#define INCLUDE_LIBYUV_VERSION_H_
|
#define INCLUDE_LIBYUV_VERSION_H_
|
||||||
|
|
||||||
#define LIBYUV_VERSION 1723
|
#define LIBYUV_VERSION 1724
|
||||||
|
|
||||||
#endif // INCLUDE_LIBYUV_VERSION_H_
|
#endif // INCLUDE_LIBYUV_VERSION_H_
|
||||||
|
|||||||
@ -89,12 +89,12 @@ static void JpegI400ToI420(void* opaque,
|
|||||||
|
|
||||||
// Query size of MJPG in pixels.
|
// Query size of MJPG in pixels.
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int MJPGSize(const uint8_t* sample,
|
int MJPGSize(const uint8_t* src_mjpg,
|
||||||
size_t sample_size,
|
size_t src_size_mjpg,
|
||||||
int* width,
|
int* width,
|
||||||
int* height) {
|
int* height) {
|
||||||
MJpegDecoder mjpeg_decoder;
|
MJpegDecoder mjpeg_decoder;
|
||||||
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size);
|
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
*width = mjpeg_decoder.GetWidth();
|
*width = mjpeg_decoder.GetWidth();
|
||||||
*height = mjpeg_decoder.GetHeight();
|
*height = mjpeg_decoder.GetHeight();
|
||||||
@ -107,8 +107,8 @@ int MJPGSize(const uint8_t* sample,
|
|||||||
// TODO(fbarchard): review src_width and src_height requirement. dst_width and
|
// TODO(fbarchard): review src_width and src_height requirement. dst_width and
|
||||||
// dst_height may be enough.
|
// dst_height may be enough.
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int MJPGToI420(const uint8_t* sample,
|
int MJPGToI420(const uint8_t* src_mjpg,
|
||||||
size_t sample_size,
|
size_t src_size_mjpg,
|
||||||
uint8_t* dst_y,
|
uint8_t* dst_y,
|
||||||
int dst_stride_y,
|
int dst_stride_y,
|
||||||
uint8_t* dst_u,
|
uint8_t* dst_u,
|
||||||
@ -119,14 +119,14 @@ int MJPGToI420(const uint8_t* sample,
|
|||||||
int src_height,
|
int src_height,
|
||||||
int dst_width,
|
int dst_width,
|
||||||
int dst_height) {
|
int dst_height) {
|
||||||
if (sample_size == kUnknownDataSize) {
|
if (src_size_mjpg == kUnknownDataSize) {
|
||||||
// ERROR: MJPEG frame size unknown
|
// ERROR: MJPEG frame size unknown
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(fbarchard): Port MJpeg to C.
|
// TODO(fbarchard): Port MJpeg to C.
|
||||||
MJpegDecoder mjpeg_decoder;
|
MJpegDecoder mjpeg_decoder;
|
||||||
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size);
|
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
||||||
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
||||||
mjpeg_decoder.GetHeight() != src_height)) {
|
mjpeg_decoder.GetHeight() != src_height)) {
|
||||||
// ERROR: MJPEG frame has unexpected dimensions
|
// ERROR: MJPEG frame has unexpected dimensions
|
||||||
@ -180,9 +180,9 @@ int MJPGToI420(const uint8_t* sample,
|
|||||||
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToI420, &bufs, dst_width,
|
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToI420, &bufs, dst_width,
|
||||||
dst_height);
|
dst_height);
|
||||||
} else {
|
} else {
|
||||||
// TODO(fbarchard): Implement conversion for any other colorspace/sample
|
// TODO(fbarchard): Implement conversion for any other
|
||||||
// factors that occur in practice.
|
// colorspace/subsample factors that occur in practice. ERROR: Unable to
|
||||||
// ERROR: Unable to convert MJPEG frame because format is not supported
|
// convert MJPEG frame because format is not supported
|
||||||
mjpeg_decoder.UnloadFrame();
|
mjpeg_decoder.UnloadFrame();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -249,8 +249,8 @@ static void JpegI400ToNV21(void* opaque,
|
|||||||
|
|
||||||
// MJPG (Motion JPeg) to NV21
|
// MJPG (Motion JPeg) to NV21
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int MJPGToNV21(const uint8_t* sample,
|
int MJPGToNV21(const uint8_t* src_mjpg,
|
||||||
size_t sample_size,
|
size_t src_size_mjpg,
|
||||||
uint8_t* dst_y,
|
uint8_t* dst_y,
|
||||||
int dst_stride_y,
|
int dst_stride_y,
|
||||||
uint8_t* dst_vu,
|
uint8_t* dst_vu,
|
||||||
@ -259,14 +259,14 @@ int MJPGToNV21(const uint8_t* sample,
|
|||||||
int src_height,
|
int src_height,
|
||||||
int dst_width,
|
int dst_width,
|
||||||
int dst_height) {
|
int dst_height) {
|
||||||
if (sample_size == kUnknownDataSize) {
|
if (src_size_mjpg == kUnknownDataSize) {
|
||||||
// ERROR: MJPEG frame size unknown
|
// ERROR: MJPEG frame size unknown
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(fbarchard): Port MJpeg to C.
|
// TODO(fbarchard): Port MJpeg to C.
|
||||||
MJpegDecoder mjpeg_decoder;
|
MJpegDecoder mjpeg_decoder;
|
||||||
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size);
|
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
||||||
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
||||||
mjpeg_decoder.GetHeight() != src_height)) {
|
mjpeg_decoder.GetHeight() != src_height)) {
|
||||||
// ERROR: MJPEG frame has unexpected dimensions
|
// ERROR: MJPEG frame has unexpected dimensions
|
||||||
@ -382,22 +382,22 @@ static void JpegI400ToARGB(void* opaque,
|
|||||||
// TODO(fbarchard): review src_width and src_height requirement. dst_width and
|
// TODO(fbarchard): review src_width and src_height requirement. dst_width and
|
||||||
// dst_height may be enough.
|
// dst_height may be enough.
|
||||||
LIBYUV_API
|
LIBYUV_API
|
||||||
int MJPGToARGB(const uint8_t* sample,
|
int MJPGToARGB(const uint8_t* src_mjpg,
|
||||||
size_t sample_size,
|
size_t src_size_mjpg,
|
||||||
uint8_t* dst_argb,
|
uint8_t* dst_argb,
|
||||||
int dst_stride_argb,
|
int dst_stride_argb,
|
||||||
int src_width,
|
int src_width,
|
||||||
int src_height,
|
int src_height,
|
||||||
int dst_width,
|
int dst_width,
|
||||||
int dst_height) {
|
int dst_height) {
|
||||||
if (sample_size == kUnknownDataSize) {
|
if (src_size_mjpg == kUnknownDataSize) {
|
||||||
// ERROR: MJPEG frame size unknown
|
// ERROR: MJPEG frame size unknown
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(fbarchard): Port MJpeg to C.
|
// TODO(fbarchard): Port MJpeg to C.
|
||||||
MJpegDecoder mjpeg_decoder;
|
MJpegDecoder mjpeg_decoder;
|
||||||
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(sample, sample_size);
|
LIBYUV_BOOL ret = mjpeg_decoder.LoadFrame(src_mjpg, src_size_mjpg);
|
||||||
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
if (ret && (mjpeg_decoder.GetWidth() != src_width ||
|
||||||
mjpeg_decoder.GetHeight() != src_height)) {
|
mjpeg_decoder.GetHeight() != src_height)) {
|
||||||
// ERROR: MJPEG frame has unexpected dimensions
|
// ERROR: MJPEG frame has unexpected dimensions
|
||||||
@ -450,9 +450,9 @@ int MJPGToARGB(const uint8_t* sample,
|
|||||||
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToARGB, &bufs, dst_width,
|
ret = mjpeg_decoder.DecodeToCallback(&JpegI400ToARGB, &bufs, dst_width,
|
||||||
dst_height);
|
dst_height);
|
||||||
} else {
|
} else {
|
||||||
// TODO(fbarchard): Implement conversion for any other colorspace/sample
|
// TODO(fbarchard): Implement conversion for any other
|
||||||
// factors that occur in practice.
|
// colorspace/subsample factors that occur in practice. ERROR: Unable to
|
||||||
// ERROR: Unable to convert MJPEG frame because format is not supported
|
// convert MJPEG frame because format is not supported
|
||||||
mjpeg_decoder.UnloadFrame();
|
mjpeg_decoder.UnloadFrame();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,10 +18,10 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Helper function to scan for EOI marker (0xff 0xd9).
|
// Helper function to scan for EOI marker (0xff 0xd9).
|
||||||
static LIBYUV_BOOL ScanEOI(const uint8_t* sample, size_t sample_size) {
|
static LIBYUV_BOOL ScanEOI(const uint8_t* src_mjpg, size_t src_size_mjpg) {
|
||||||
if (sample_size >= 2) {
|
if (src_size_mjpg >= 2) {
|
||||||
const uint8_t* end = sample + sample_size - 1;
|
const uint8_t* end = src_mjpg + src_size_mjpg - 1;
|
||||||
const uint8_t* it = sample;
|
const uint8_t* it = src_mjpg;
|
||||||
while (it < end) {
|
while (it < end) {
|
||||||
// TODO(fbarchard): scan for 0xd9 instead.
|
// TODO(fbarchard): scan for 0xd9 instead.
|
||||||
it = (const uint8_t*)(memchr(it, 0xff, end - it));
|
it = (const uint8_t*)(memchr(it, 0xff, end - it));
|
||||||
@ -34,34 +34,34 @@ static LIBYUV_BOOL ScanEOI(const uint8_t* sample, size_t sample_size) {
|
|||||||
++it; // Skip over current 0xff.
|
++it; // Skip over current 0xff.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ERROR: Invalid jpeg end code not found. Size sample_size
|
// ERROR: Invalid jpeg end code not found. Size src_size_mjpg
|
||||||
return LIBYUV_FALSE;
|
return LIBYUV_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to validate the jpeg appears intact.
|
// Helper function to validate the jpeg appears intact.
|
||||||
LIBYUV_BOOL ValidateJpeg(const uint8_t* sample, size_t sample_size) {
|
LIBYUV_BOOL ValidateJpeg(const uint8_t* src_mjpg, size_t src_size_mjpg) {
|
||||||
// Maximum size that ValidateJpeg will consider valid.
|
// Maximum size that ValidateJpeg will consider valid.
|
||||||
const size_t kMaxJpegSize = 0x7fffffffull;
|
const size_t kMaxJpegSize = 0x7fffffffull;
|
||||||
const size_t kBackSearchSize = 1024;
|
const size_t kBackSearchSize = 1024;
|
||||||
if (sample_size < 64 || sample_size > kMaxJpegSize || !sample) {
|
if (src_size_mjpg < 64 || src_size_mjpg > kMaxJpegSize || !src_mjpg) {
|
||||||
// ERROR: Invalid jpeg size: sample_size
|
// ERROR: Invalid jpeg size: src_size_mjpg
|
||||||
return LIBYUV_FALSE;
|
return LIBYUV_FALSE;
|
||||||
}
|
}
|
||||||
if (sample[0] != 0xff || sample[1] != 0xd8) { // SOI marker
|
if (src_mjpg[0] != 0xff || src_mjpg[1] != 0xd8) { // SOI marker
|
||||||
// ERROR: Invalid jpeg initial start code
|
// ERROR: Invalid jpeg initial start code
|
||||||
return LIBYUV_FALSE;
|
return LIBYUV_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for the End Of Image (EOI) marker near the end of the buffer.
|
// Look for the End Of Image (EOI) marker near the end of the buffer.
|
||||||
if (sample_size > kBackSearchSize) {
|
if (src_size_mjpg > kBackSearchSize) {
|
||||||
if (ScanEOI(sample + sample_size - kBackSearchSize, kBackSearchSize)) {
|
if (ScanEOI(src_mjpg + src_size_mjpg - kBackSearchSize, kBackSearchSize)) {
|
||||||
return LIBYUV_TRUE; // Success: Valid jpeg.
|
return LIBYUV_TRUE; // Success: Valid jpeg.
|
||||||
}
|
}
|
||||||
// Reduce search size for forward search.
|
// Reduce search size for forward search.
|
||||||
sample_size = sample_size - kBackSearchSize + 1;
|
src_size_mjpg = src_size_mjpg - kBackSearchSize + 1;
|
||||||
}
|
}
|
||||||
// Step over SOI marker and scan for EOI.
|
// Step over SOI marker and scan for EOI.
|
||||||
return ScanEOI(sample + 2, sample_size - 2);
|
return ScanEOI(src_mjpg + 2, src_size_mjpg - 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@ -26,6 +26,8 @@ extern "C" {
|
|||||||
// This module is for Mips MMI.
|
// This module is for Mips MMI.
|
||||||
#if !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A)
|
#if !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A)
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
|
||||||
// CPU agnostic row functions
|
// CPU agnostic row functions
|
||||||
void ScaleRowDown2_MMI(const uint8_t* src_ptr,
|
void ScaleRowDown2_MMI(const uint8_t* src_ptr,
|
||||||
ptrdiff_t src_stride,
|
ptrdiff_t src_stride,
|
||||||
@ -1101,6 +1103,8 @@ void ScaleRowUp2_16_MMI(const uint16_t* src_ptr,
|
|||||||
: "memory");
|
: "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
#endif // !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A)
|
#endif // !defined(LIBYUV_DISABLE_MMI) && defined(_MIPS_ARCH_LOONGSON3A)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user