Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(617)

Side by Side Diff: media/filters/jpeg_parser.cc

Issue 1291933002: File video capture device supports MJPEG format (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« media/filters/jpeg_parser.h ('K') | « media/filters/jpeg_parser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/jpeg_parser.h" 5 #include "media/filters/jpeg_parser.h"
6 6
7 #include "base/big_endian.h" 7 #include "base/big_endian.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 9
10 using base::BigEndianReader; 10 using base::BigEndianReader;
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 return false; 262 return false;
263 } 263 }
264 if (point_transform != 0) { 264 if (point_transform != 0) {
265 DLOG(ERROR) << "Point transform should be 0 for baseline mode"; 265 DLOG(ERROR) << "Point transform should be 0 for baseline mode";
266 return false; 266 return false;
267 } 267 }
268 268
269 return true; 269 return true;
270 } 270 }
271 271
272 static bool ParseEOI(const char* buffer,
kcwu 2015/08/14 09:01:37 s/ParseEOI/SearchEOI/ ?
henryhsu 2015/08/14 11:22:26 Done.
273 size_t length,
274 const char** eoi_ptr) {
275 DCHECK(buffer);
276 DCHECK(eoi_ptr);
277 BigEndianReader reader(buffer, length);
278 uint8_t marker1;
279 uint8_t marker2;
280
281 while (reader.remaining() > 0) {
282 READ_U8_OR_RETURN_FALSE(&marker1);
283 if (marker1 != JPEG_MARKER_PREFIX)
284 continue;
285
286 do {
287 READ_U8_OR_RETURN_FALSE(&marker2);
288 } while (marker2 == JPEG_MARKER_PREFIX); // skip fill bytes
289
290 switch (marker2) {
291 // Compressed data escape.
292 case 0x00:
kcwu 2015/08/14 09:01:37 add break;
henryhsu 2015/08/14 11:22:26 Done.
293 // Restart
294 case JPEG_RST0:
295 case JPEG_RST1:
296 case JPEG_RST2:
297 case JPEG_RST3:
298 case JPEG_RST4:
299 case JPEG_RST5:
300 case JPEG_RST6:
301 case JPEG_RST7:
302 break;
303 case JPEG_EOI:
304 *eoi_ptr = reader.ptr();
305 return true;
306 default:
307 // Skip for other markers.
308 uint16_t size;
309 READ_U16_OR_RETURN_FALSE(&size);
310 if (size < sizeof(size)) {
311 DLOG(ERROR) << "Ill-formed JPEG. Segment size (" << size
312 << ") is smaller than size field (" << sizeof(size)
313 << ")";
314 return false;
315 }
316 size -= sizeof(size);
317
318 if (reader.remaining() < size) {
kcwu 2015/08/14 09:01:37 if (!reader.Skip(size)) { ... }
henryhsu 2015/08/14 11:22:26 Done.
319 DLOG(ERROR) << "Ill-formed JPEG. Remaining size ("
320 << reader.remaining()
321 << ") is smaller than header specified (" << size << ")";
322 return false;
323 }
324 reader.Skip(size);
325 break;
326 }
327 }
328 return false;
329 }
330
272 // |result| is already initialized to 0 in ParseJpegPicture. 331 // |result| is already initialized to 0 in ParseJpegPicture.
273 static bool ParseSOI(const char* buffer, 332 static bool ParseSOI(const char* buffer,
274 size_t length, 333 size_t length,
275 JpegParseResult* result) { 334 JpegParseResult* result) {
276 // Spec B.2.1 High-level syntax 335 // Spec B.2.1 High-level syntax
277 DCHECK(buffer); 336 DCHECK(buffer);
278 DCHECK(result); 337 DCHECK(result);
279 BigEndianReader reader(buffer, length); 338 BigEndianReader reader(buffer, length);
280 uint8_t marker1; 339 uint8_t marker1;
281 uint8_t marker2; 340 uint8_t marker2;
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 reader.Skip(size); 423 reader.Skip(size);
365 } 424 }
366 425
367 if (!has_marker_dqt) { 426 if (!has_marker_dqt) {
368 DLOG(ERROR) << "No DQT marker found"; 427 DLOG(ERROR) << "No DQT marker found";
369 return false; 428 return false;
370 } 429 }
371 430
372 // Scan data follows scan header immediately. 431 // Scan data follows scan header immediately.
373 result->data = reader.ptr(); 432 result->data = reader.ptr();
374 result->data_size = reader.remaining(); 433 const char* eoi_ptr = nullptr;
434 if (!ParseEOI(reader.ptr(), reader.remaining(), &eoi_ptr)) {
435 DLOG(ERROR) << "ParseEOI failed";
436 return false;
437 }
438 result->data_size = eoi_ptr - result->data;
439 result->image_size = eoi_ptr - buffer + 2;
kcwu 2015/08/14 09:01:37 const int kEoiSize = 2; ?
henryhsu 2015/08/14 11:22:26 no. This 2 is SOI size which is read in beginning.
375 440
376 return true; 441 return true;
377 } 442 }
378 443
379 bool ParseJpegPicture(const uint8_t* buffer, 444 bool ParseJpegPicture(const uint8_t* buffer,
380 size_t length, 445 size_t length,
381 JpegParseResult* result) { 446 JpegParseResult* result) {
382 DCHECK(buffer); 447 DCHECK(buffer);
383 DCHECK(result); 448 DCHECK(result);
384 BigEndianReader reader(reinterpret_cast<const char*>(buffer), length); 449 BigEndianReader reader(reinterpret_cast<const char*>(buffer), length);
385 memset(result, 0, sizeof(JpegParseResult)); 450 memset(result, 0, sizeof(JpegParseResult));
386 451
387 uint8_t marker1, marker2; 452 uint8_t marker1, marker2;
388 READ_U8_OR_RETURN_FALSE(&marker1); 453 READ_U8_OR_RETURN_FALSE(&marker1);
389 READ_U8_OR_RETURN_FALSE(&marker2); 454 READ_U8_OR_RETURN_FALSE(&marker2);
390 if (marker1 != JPEG_MARKER_PREFIX || marker2 != JPEG_SOI) { 455 if (marker1 != JPEG_MARKER_PREFIX || marker2 != JPEG_SOI) {
391 DLOG(ERROR) << "Not a JPEG"; 456 DLOG(ERROR) << "Not a JPEG";
392 return false; 457 return false;
393 } 458 }
394 459
395 return ParseSOI(reader.ptr(), reader.remaining(), result); 460 return ParseSOI(reader.ptr(), reader.remaining(), result);
396 } 461 }
397 462
398 } // namespace media 463 } // namespace media
OLDNEW
« media/filters/jpeg_parser.h ('K') | « media/filters/jpeg_parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698