summaryrefslogtreecommitdiff
path: root/third_party/libyuv/source/mjpeg_validate.cc
diff options
context:
space:
mode:
authorJim Bankoski <jimbankoski@google.com>2016-08-25 06:39:38 -0700
committerJim Bankoski <jimbankoski@google.com>2016-08-25 06:39:38 -0700
commit6d7a9f3e9cdff1a7d714dcb021eb353dff867dbe (patch)
treea7de0122036885928d5e45c0a92d6533593659bd /third_party/libyuv/source/mjpeg_validate.cc
parentce634bbf4d4e995067f47494f57056727751df15 (diff)
downloadlibvpx-6d7a9f3e9cdff1a7d714dcb021eb353dff867dbe.tar
libvpx-6d7a9f3e9cdff1a7d714dcb021eb353dff867dbe.tar.gz
libvpx-6d7a9f3e9cdff1a7d714dcb021eb353dff867dbe.tar.bz2
libvpx-6d7a9f3e9cdff1a7d714dcb021eb353dff867dbe.zip
libyuv: update to c244a3e9
Fixes color issue when scaling without breaking mingw. BUG=https://bugs.chromium.org/p/libyuv/issues/detail?id=605 BUG=https://bugs.chromium.org/p/webm/issues/detail?id=1252 Change-Id: I09437d93fd65964ad57113274d8c819f3eaf2e57
Diffstat (limited to 'third_party/libyuv/source/mjpeg_validate.cc')
-rw-r--r--third_party/libyuv/source/mjpeg_validate.cc72
1 files changed, 21 insertions, 51 deletions
diff --git a/third_party/libyuv/source/mjpeg_validate.cc b/third_party/libyuv/source/mjpeg_validate.cc
index 8edfbe1e7..9c4883204 100644
--- a/third_party/libyuv/source/mjpeg_validate.cc
+++ b/third_party/libyuv/source/mjpeg_validate.cc
@@ -17,51 +17,22 @@ namespace libyuv {
extern "C" {
#endif
-// Enable this to try scasb implementation.
-// #define ENABLE_SCASB 1
-
-#ifdef ENABLE_SCASB
-
-// Multiple of 1.
-__declspec(naked)
-const uint8* ScanRow_ERMS(const uint8* src, uint32 val, int count) {
- __asm {
- mov edx, edi
- mov edi, [esp + 4] // src
- mov eax, [esp + 8] // val
- mov ecx, [esp + 12] // count
- repne scasb
- jne sr99
- mov eax, edi
- sub eax, 1
- mov edi, edx
- ret
-
- sr99:
- mov eax, 0
- mov edi, edx
- ret
- }
-}
-#endif
-
-// Helper function to scan for EOI marker.
+// Helper function to scan for EOI marker (0xff 0xd9).
static LIBYUV_BOOL ScanEOI(const uint8* sample, size_t sample_size) {
- const uint8* end = sample + sample_size - 1;
- const uint8* it = sample;
- for (;;) {
-#ifdef ENABLE_SCASB
- it = ScanRow_ERMS(it, 0xff, end - it);
-#else
- it = static_cast<const uint8*>(memchr(it, 0xff, end - it));
-#endif
- if (it == NULL) {
- break;
+ if (sample_size >= 2) {
+ const uint8* end = sample + sample_size - 1;
+ const uint8* it = sample;
+ while (it < end) {
+ // TODO(fbarchard): scan for 0xd9 instead.
+ it = static_cast<const uint8 *>(memchr(it, 0xff, end - it));
+ if (it == NULL) {
+ break;
+ }
+ if (it[1] == 0xd9) {
+ return LIBYUV_TRUE; // Success: Valid jpeg.
+ }
+ ++it; // Skip over current 0xff.
}
- if (it[1] == 0xd9) {
- return LIBYUV_TRUE; // Success: Valid jpeg.
- }
- ++it; // Skip over current 0xff.
}
// ERROR: Invalid jpeg end code not found. Size sample_size
return LIBYUV_FALSE;
@@ -69,20 +40,19 @@ static LIBYUV_BOOL ScanEOI(const uint8* sample, size_t sample_size) {
// Helper function to validate the jpeg appears intact.
LIBYUV_BOOL ValidateJpeg(const uint8* sample, size_t sample_size) {
+ // Maximum size that ValidateJpeg will consider valid.
+ const size_t kMaxJpegSize = 0x7fffffffull;
const size_t kBackSearchSize = 1024;
- if (sample_size < 64) {
+ if (sample_size < 64 || sample_size > kMaxJpegSize || !sample) {
// ERROR: Invalid jpeg size: sample_size
return LIBYUV_FALSE;
}
- if (sample[0] != 0xff || sample[1] != 0xd8) { // Start Of Image
+ if (sample[0] != 0xff || sample[1] != 0xd8) { // SOI marker
// ERROR: Invalid jpeg initial start code
return LIBYUV_FALSE;
}
- // Step over SOI marker.
- sample += 2;
- sample_size -= 2;
- // Look for the End Of Image (EOI) marker in the end kilobyte of the buffer.
+ // Look for the End Of Image (EOI) marker near the end of the buffer.
if (sample_size > kBackSearchSize) {
if (ScanEOI(sample + sample_size - kBackSearchSize, kBackSearchSize)) {
return LIBYUV_TRUE; // Success: Valid jpeg.
@@ -90,8 +60,8 @@ LIBYUV_BOOL ValidateJpeg(const uint8* sample, size_t sample_size) {
// Reduce search size for forward search.
sample_size = sample_size - kBackSearchSize + 1;
}
- return ScanEOI(sample, sample_size);
-
+ // Step over SOI marker and scan for EOI.
+ return ScanEOI(sample + 2, sample_size - 2);
}
#ifdef __cplusplus