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

Side by Side Diff: include/codec/SkCodec.h

Issue 1549473003: Add getYUV8Planes() API to SkCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Add a test to DM Created 4 years, 11 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
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkCodec_DEFINED 8 #ifndef SkCodec_DEFINED
9 #define SkCodec_DEFINED 9 #define SkCodec_DEFINED
10 10
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 */ 270 */
271 Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, con st Options*, 271 Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, con st Options*,
272 SkPMColor ctable[], int* ctableCount); 272 SkPMColor ctable[], int* ctableCount);
273 273
274 /** 274 /**
275 * Simplified version of getPixels() that asserts that info is NOT kIndex8_ SkColorType and 275 * Simplified version of getPixels() that asserts that info is NOT kIndex8_ SkColorType and
276 * uses the default Options. 276 * uses the default Options.
277 */ 277 */
278 Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes); 278 Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes);
279 279
280 struct YUVPlanesSizes {
281 SkISize YSize;
282 SkISize USize;
283 SkISize VSize;
284 };
285
286 /**
287 * While the widths of the Y, U, and V planes are not restricted, the
288 * implementation requires that the width of the memory allocated for
289 * each plane be a multiple of DCTSIZE (which is always 8).
290 *
291 * This struct allows us to inform the client how many "widthBytes"
292 * that we need. Note that we use the new idea of "widthBytes" because
293 * this idea is distinct from "rowBytes" (used elsewhere in Skia).
294 * "rowBytes" allow the last row of the allocation to not include any
295 * extra padding, while, in this case, every single row of the allocation
296 * must be at least "widthBytes".
297 */
298 struct YUVPlanesWidthBytes {
299 size_t YWidthBytes;
300 size_t UWidthBytes;
301 size_t VWidthBytes;
302 };
303
304 /**
305 * If decoding to YUV is supported, this returns true. Otherwise, this
306 * returns false and does not modify any of the parameters.
307 *
308 * @param sizes Output parameter indicating the sizes of the Y, U,
309 * and V planes.
310 * @param widthBytes Output parameter indicating the required allocation
311 * width in bytes for each of the Y, U, and V planes.
312 * @param colorSpace Output parameter. If non-NULL this is set to kJPEG,
313 * otherwise this is ignored.
314 */
315 bool queryYUV8(YUVPlanesSizes* sizes, YUVPlanesWidthBytes* widthBytes,
316 SkYUVColorSpace* colorSpace) const {
317 if (nullptr == sizes || nullptr == widthBytes) {
318 return false;
319 }
320
321 return this->onQueryYUV8(sizes, widthBytes, colorSpace);
322 }
323
324 /**
325 * Returns kSuccess, or another value explaining the type of failure.
326 * This always attempts to perform a full decode. If the client only
327 * wants size, it should call queryYUV8().
328 *
329 * @param sizes Sizes of each of the Y, U, and V planes. The size
330 * of the Y plane will be the same size as the image.
331 * The size of the U and V planes may be the same size
332 * as the image, or they may be a fraction of the size
333 * of the image (due to sampling). It is quite common
334 * for the width to be sampled at a different rate than
335 * the height. 2 and 4 are common sampling rates. The
336 * U and V planes are often the same size.
337 * @param planes Memory for each of the Y, U, and V planes.
338 * @param widthBytes Width in bytes of each row of the Y, U, and V planes.
339 * Each Y, U, or V "sample" is a single byte. Also,
340 * the implementation requires that the width of the
341 * memory allocated be padded to a multiple of 8. So
342 * the widthBytes should at least equal the Y, U, and V
343 * widths rounded up to the nearest multiples of 8.
344 */
345 Result getYUV8Planes(const YUVPlanesSizes* sizes, void* planes[3],
346 const YUVPlanesWidthBytes* widthBytes) {
347 if (nullptr == sizes || nullptr == planes || nullptr == planes[0] ||
348 nullptr == planes[1] || nullptr == planes[2] || nullptr == width Bytes) {
349 return kInvalidInput;
350 }
351
352 if (!this->rewindIfNeeded()) {
353 return kCouldNotRewind;
354 }
355
356 return this->onGetYUV8Planes(sizes, planes, widthBytes);
357 }
358
280 /** 359 /**
281 * The remaining functions revolve around decoding scanlines. 360 * The remaining functions revolve around decoding scanlines.
282 */ 361 */
283 362
284 /** 363 /**
285 * Prepare for a scanline decode with the specified options. 364 * Prepare for a scanline decode with the specified options.
286 * 365 *
287 * After this call, this class will be ready to decode the first scanline. 366 * After this call, this class will be ready to decode the first scanline.
288 * 367 *
289 * This must be called in order to call getScanlines or skipScanlines. 368 * This must be called in order to call getScanlines or skipScanlines.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 * is located in the encoded data. 514 * is located in the encoded data.
436 * 515 *
437 * This will equal inputScanline, except in the case of strangely 516 * This will equal inputScanline, except in the case of strangely
438 * encoded image types (bottom-up bmps, interlaced gifs). 517 * encoded image types (bottom-up bmps, interlaced gifs).
439 */ 518 */
440 int outputScanline(int inputScanline) const; 519 int outputScanline(int inputScanline) const;
441 520
442 protected: 521 protected:
443 SkCodec(const SkImageInfo&, SkStream*); 522 SkCodec(const SkImageInfo&, SkStream*);
444 523
445 virtual SkISize onGetScaledDimensions(float /* desiredScale */) const { 524 virtual SkISize onGetScaledDimensions(float /*desiredScale*/) const {
446 // By default, scaling is not supported. 525 // By default, scaling is not supported.
447 return this->getInfo().dimensions(); 526 return this->getInfo().dimensions();
448 } 527 }
449 528
450 // FIXME: What to do about subsets?? 529 // FIXME: What to do about subsets??
451 /** 530 /**
452 * Subclasses should override if they support dimensions other than the 531 * Subclasses should override if they support dimensions other than the
453 * srcInfo's. 532 * srcInfo's.
454 */ 533 */
455 virtual bool onDimensionsSupported(const SkISize&) { 534 virtual bool onDimensionsSupported(const SkISize&) {
456 return false; 535 return false;
457 } 536 }
458 537
459 virtual SkEncodedFormat onGetEncodedFormat() const = 0; 538 virtual SkEncodedFormat onGetEncodedFormat() const = 0;
460 539
461 /** 540 /**
462 * @param rowsDecoded When the encoded image stream is incomplete, this func tion 541 * @param rowsDecoded When the encoded image stream is incomplete, this func tion
463 * will return kIncompleteInput and rowsDecoded will be s et to 542 * will return kIncompleteInput and rowsDecoded will be s et to
464 * the number of scanlines that were successfully decoded . 543 * the number of scanlines that were successfully decoded .
465 * This will allow getPixels() to fill the uninitialized memory. 544 * This will allow getPixels() to fill the uninitialized memory.
466 */ 545 */
467 virtual Result onGetPixels(const SkImageInfo& info, 546 virtual Result onGetPixels(const SkImageInfo& info,
468 void* pixels, size_t rowBytes, const Options&, 547 void* pixels, size_t rowBytes, const Options&,
469 SkPMColor ctable[], int* ctableCount, 548 SkPMColor ctable[], int* ctableCount,
470 int* rowsDecoded) = 0; 549 int* rowsDecoded) = 0;
471 550
472 virtual bool onGetValidSubset(SkIRect* /* desiredSubset */) const { 551 virtual bool onQueryYUV8(YUVPlanesSizes*, YUVPlanesWidthBytes*, SkYUVColorSp ace*) const {
552 return false;
553 }
554
555 virtual Result onGetYUV8Planes(const YUVPlanesSizes*, void*[3] /*planes*/,
556 const YUVPlanesWidthBytes*) {
557 return kUnimplemented;
558 }
559
560 virtual bool onGetValidSubset(SkIRect* /*desiredSubset*/) const {
473 // By default, subsets are not supported. 561 // By default, subsets are not supported.
474 return false; 562 return false;
475 } 563 }
476 564
477 /** 565 /**
478 * If the stream was previously read, attempt to rewind. 566 * If the stream was previously read, attempt to rewind.
479 * 567 *
480 * If the stream needed to be rewound, call onRewind. 568 * If the stream needed to be rewound, call onRewind.
481 * @returns true if the codec is at the right position and can be used. 569 * @returns true if the codec is at the right position and can be used.
482 * false if there was a failure to rewind. 570 * false if there was a failure to rewind.
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 * not affect ownership. 715 * not affect ownership.
628 * 716 *
629 * Only valid during scanline decoding. 717 * Only valid during scanline decoding.
630 */ 718 */
631 virtual SkSampler* getSampler(bool /*createIfNecessary*/) { return nullptr; } 719 virtual SkSampler* getSampler(bool /*createIfNecessary*/) { return nullptr; }
632 720
633 friend class SkSampledCodec; 721 friend class SkSampledCodec;
634 friend class SkIcoCodec; 722 friend class SkIcoCodec;
635 }; 723 };
636 #endif // SkCodec_DEFINED 724 #endif // SkCodec_DEFINED
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698