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

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

Issue 2045293002: Add support for multiple frames in SkCodec (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Rebase; new API Created 4 years, 2 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
« no previous file with comments | « gm/animatedGif.cpp ('k') | src/codec/SkCodecAnimation.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 * This is the default. It will be used if no Options struct is used. 235 * This is the default. It will be used if no Options struct is used.
236 */ 236 */
237 kNo_ZeroInitialized, 237 kNo_ZeroInitialized,
238 }; 238 };
239 239
240 /** 240 /**
241 * Additional options to pass to getPixels. 241 * Additional options to pass to getPixels.
242 */ 242 */
243 struct Options { 243 struct Options {
244 Options() 244 Options()
245 : fZeroInitialized(kNo_ZeroInitialized) 245 : fZeroInitialized(kNo_ZeroInitialized)
msarett 2016/09/21 22:23:48 I dislike having this option. Obviously unrelated
scroggo 2016/09/22 16:46:43 It's certainly awkward to have both fZeroInitializ
246 , fSubset(NULL) 246 , fSubset(NULL)
247 , fFrameIndex(0)
msarett 2016/09/21 22:23:48 I think I might prefer it if all of the "multi-fra
scroggo 2016/09/22 16:46:42 I considered that, but I'm not sure whether it's b
248 , fHasPriorFrame(false)
247 {} 249 {}
msarett 2016/09/21 22:23:48 While I'm nitting on the Options object, here's an
scroggo 2016/09/22 16:46:43 Yeah, we put those in the AndroidOptions object as
248 250
249 ZeroInitialized fZeroInitialized; 251 ZeroInitialized fZeroInitialized;
250 /** 252 /**
251 * If not NULL, represents a subset of the original image to decode. 253 * If not NULL, represents a subset of the original image to decode.
252 * Must be within the bounds returned by getInfo(). 254 * Must be within the bounds returned by getInfo().
253 * If the EncodedFormat is kWEBP_SkEncodedFormat (the only one which 255 * If the EncodedFormat is kWEBP_SkEncodedFormat (the only one which
254 * currently supports subsets), the top and left values must be even. 256 * currently supports subsets), the top and left values must be even.
255 * 257 *
256 * In getPixels and incremental decode, we will attempt to decode the 258 * In getPixels and incremental decode, we will attempt to decode the
257 * exact rectangular subset specified by fSubset. 259 * exact rectangular subset specified by fSubset.
258 * 260 *
259 * In a scanline decode, it does not make sense to specify a subset 261 * In a scanline decode, it does not make sense to specify a subset
260 * top or subset height, since the client already controls which rows 262 * top or subset height, since the client already controls which rows
261 * to get and which rows to skip. During scanline decodes, we will 263 * to get and which rows to skip. During scanline decodes, we will
262 * require that the subset top be zero and the subset height be equal 264 * require that the subset top be zero and the subset height be equal
263 * to the full height. We will, however, use the values of 265 * to the full height. We will, however, use the values of
264 * subset left and subset width to decode partial scanlines on calls 266 * subset left and subset width to decode partial scanlines on calls
265 * to getScanlines(). 267 * to getScanlines().
266 */ 268 */
267 SkIRect* fSubset; 269 SkIRect* fSubset;
270
271 /**
272 * For multiframe images, this represents the frame to decode.
273 *
274 * Ignored by single frame images.
275 */
276 size_t fFrameIndex;
277
278 /**
279 * If true, the dst already contains the prior frame.
280 *
281 * Only meaningful for multiframe images. If fFrameIndex needs to be
282 * blended with a prior frame (as reported by
283 * getRequiredFrame(fFrameIndex)), the client can set this to either
284 * true or false:
285 *
286 * true means that the prior frame is already in the dst, and this
287 * codec only needs to decode fFrameIndex and blend it with the dst.
288 *
289 * false means that the dst is uninitialized, so this codec needs to
290 * first decode the prior frame (which in turn may need to decode its
291 * prior frame).
292 */
293 bool fHasPriorFrame;
cblume 2016/09/22 01:08:47 I am curious about the design of this. As I under
cblume 2016/09/22 01:42:19 Adding to this: If we are still downloading the im
scroggo 2016/09/22 16:46:43 Agreed.
scroggo 2016/09/22 16:46:43 That is correct.
cblume 2016/09/22 21:29:02 I agree with what you are saying. Good thinking.
scroggo 2016/09/23 15:53:15 My preference would be to hide the dispose method
cblume 2016/09/23 19:15:45 I agree. We can cross that bridge if it becomes ne
268 }; 294 };
269 295
270 /** 296 /**
271 * Decode into the given pixels, a block of memory of size at 297 * Decode into the given pixels, a block of memory of size at
272 * least (info.fHeight - 1) * rowBytes + (info.fWidth * 298 * least (info.fHeight - 1) * rowBytes + (info.fWidth *
273 * bytesPerPixel) 299 * bytesPerPixel)
274 * 300 *
275 * Repeated calls to this function should give the same results, 301 * Repeated calls to this function should give the same results,
276 * allowing the PixelRef to be immutable. 302 * allowing the PixelRef to be immutable.
277 * 303 *
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 /** 585 /**
560 * Returns the output y-coordinate of the row that corresponds to an input 586 * Returns the output y-coordinate of the row that corresponds to an input
561 * y-coordinate. The input y-coordinate represents where the scanline 587 * y-coordinate. The input y-coordinate represents where the scanline
562 * is located in the encoded data. 588 * is located in the encoded data.
563 * 589 *
564 * This will equal inputScanline, except in the case of strangely 590 * This will equal inputScanline, except in the case of strangely
565 * encoded image types (bottom-up bmps, interlaced gifs). 591 * encoded image types (bottom-up bmps, interlaced gifs).
566 */ 592 */
567 int outputScanline(int inputScanline) const; 593 int outputScanline(int inputScanline) const;
568 594
595 /**
596 * Return the number of frames in the image.
597 *
598 * May require reading through the stream to determine the number of
599 * frames.
600 *
601 * As such, future decoding calls may require a rewind.
602 */
603 size_t getFrameCount() {
msarett 2016/09/21 22:23:48 Can we get away with not having this? Seems like
cblume 2016/09/22 01:08:47 In the case of gif and apng, we won't know in adva
cblume 2016/09/22 01:42:19 Correcting myself: We could still be wise about wh
joostouwerling 2016/09/22 15:43:16 For apng, the acTL chunk with the number of frames
scroggo 2016/09/22 16:46:42 FWIW, my initial design (patch set 1, which I work
cblume 2016/09/22 21:29:02 Oh man, that is a bummer. As a client, having the
scroggo 2016/09/23 15:53:15 It might be easier not to provide the metadata up
cblume 2016/09/23 19:15:45 An alternative would be if Chrome changed its catc
scroggo 2016/09/23 21:15:00 Those sound like good reasons to change the catchu
cblume 2016/09/23 23:31:32 Oh no no. I didn't mean that the API changes. I me
scroggo 2016/09/26 15:51:43 +1
604 return this->onGetFrameCount();
605 }
606
607 // The required frame for an independent frame is marked as
608 // kIndependentFrame.
609 static constexpr size_t kIndependentFrame = static_cast<size_t>(-1);
610
611 /**
612 * For a multiframed image, return the image that frame |index| needs to
613 * be blended with.
614 *
615 * If the frame needs no blending, return kIndependentFrame.
616 */
617 size_t getRequiredFrame(size_t index) {
618 return this->onGetRequiredFrame(index);
619 }
620
621 /**
622 * For a multiframed image, return the number of 1/100 seconds to
623 * show frame |index|.
624 */
625 size_t getFrameDuration(size_t index) {
626 return this->onGetFrameDuration(index);
627 }
628
569 protected: 629 protected:
570 /** 630 /**
571 * Takes ownership of SkStream* 631 * Takes ownership of SkStream*
572 */ 632 */
573 SkCodec(int width, 633 SkCodec(int width,
574 int height, 634 int height,
575 const SkEncodedInfo&, 635 const SkEncodedInfo&,
576 SkStream*, 636 SkStream*,
577 sk_sp<SkColorSpace> = nullptr, 637 sk_sp<SkColorSpace> = nullptr,
578 Origin = kTopLeft_Origin); 638 Origin = kTopLeft_Origin);
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 /** 759 /**
700 * Returns the number of scanlines that have been decoded so far. 760 * Returns the number of scanlines that have been decoded so far.
701 * This is unaffected by the SkScanlineOrder. 761 * This is unaffected by the SkScanlineOrder.
702 * 762 *
703 * Returns -1 if we have not started a scanline decode. 763 * Returns -1 if we have not started a scanline decode.
704 */ 764 */
705 int currScanline() const { return fCurrScanline; } 765 int currScanline() const { return fCurrScanline; }
706 766
707 virtual int onOutputScanline(int inputScanline) const; 767 virtual int onOutputScanline(int inputScanline) const;
708 768
769 virtual size_t onGetFrameCount() {
770 return 1;
771 }
772
773 virtual size_t onGetRequiredFrame(size_t) {
774 return kIndependentFrame;
775 }
776
777 virtual size_t onGetFrameDuration(size_t) {
778 return 0;
779 }
780
709 /** 781 /**
710 * Used for testing with qcms. 782 * Used for testing with qcms.
711 * FIXME: Remove this when we are done comparing with qcms. 783 * FIXME: Remove this when we are done comparing with qcms.
712 */ 784 */
713 virtual sk_sp<SkData> getICCData() const { return nullptr; } 785 virtual sk_sp<SkData> getICCData() const { return nullptr; }
714 private: 786 private:
715 const SkEncodedInfo fEncodedInfo; 787 const SkEncodedInfo fEncodedInfo;
716 const SkImageInfo fSrcInfo; 788 const SkImageInfo fSrcInfo;
717 SkAutoTDelete<SkStream> fStream; 789 SkAutoTDelete<SkStream> fStream;
718 bool fNeedsRewind; 790 bool fNeedsRewind;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 // For testing with qcms 861 // For testing with qcms
790 // FIXME: Remove these when we are done comparing with qcms. 862 // FIXME: Remove these when we are done comparing with qcms.
791 friend class DM::ColorCodecSrc; 863 friend class DM::ColorCodecSrc;
792 friend class ColorCodecBench; 864 friend class ColorCodecBench;
793 865
794 friend class DM::CodecSrc; // for fillIncompleteImage 866 friend class DM::CodecSrc; // for fillIncompleteImage
795 friend class SkSampledCodec; 867 friend class SkSampledCodec;
796 friend class SkIcoCodec; 868 friend class SkIcoCodec;
797 }; 869 };
798 #endif // SkCodec_DEFINED 870 #endif // SkCodec_DEFINED
OLDNEW
« no previous file with comments | « gm/animatedGif.cpp ('k') | src/codec/SkCodecAnimation.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698