1b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
2b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III/*
3b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III * Copyright 2008 The Android Open Source Project
4b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III *
5b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III * Use of this source code is governed by a BSD-style license that can be
6b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III * found in the LICENSE file.
7b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III */
8b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
9b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
10b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III#ifndef Movie_DEFINED
11b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III#define Movie_DEFINED
12b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
13b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III#include "SkRefCnt.h"
14b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III#include "SkCanvas.h"
15b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
16b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins IIIclass SkStreamRewindable;
17b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
18b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins IIIclass Movie : public SkRefCnt {
19b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins IIIpublic:
20b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    /** Try to create a movie from the stream. If the stream format is not
21b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        supported, return NULL.
22b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    */
23b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    static Movie* DecodeStream(SkStreamRewindable*);
24b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    /** Try to create a movie from the specified file path. If the file is not
25b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        found, or the format is not supported, return NULL. If a movie is
26b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        returned, the stream may be retained by the movie (via ref()) until
27b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        the movie is finished with it (by calling unref()).
28b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    */
29b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    static Movie* DecodeFile(const char path[]);
30b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    /** Try to create a movie from the specified memory.
31b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        If the format is not supported, return NULL. If a movie is returned,
32b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        the data will have been read or copied, and so the caller may free
33b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        it.
34b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    */
35b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    static Movie* DecodeMemory(const void* data, size_t length);
36b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
37b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    SkMSec  duration();
38b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    int     width();
39b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    int     height();
40b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    int     isOpaque();
41b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
42b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    /** Specify the time code (between 0...duration) to sample a bitmap
43b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        from the movie. Returns true if this time code generated a different
44b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        bitmap/frame from the previous state (i.e. true means you need to
45b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        redraw).
46b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    */
47b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    bool setTime(SkMSec);
48b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
49b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    // return the right bitmap for the current time code
50b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    const SkBitmap& bitmap();
51b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
52b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins IIIprotected:
53b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    struct Info {
54b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        SkMSec  fDuration;
55b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        int     fWidth;
56b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        int     fHeight;
57b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III        bool    fIsOpaque;
58b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    };
59b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
60b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    virtual bool onGetInfo(Info*) = 0;
61b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    virtual bool onSetTime(SkMSec) = 0;
62b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    virtual bool onGetBitmap(SkBitmap*) = 0;
63b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
64b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    // visible for subclasses
65b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    Movie();
66b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
67b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins IIIprivate:
68b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    Info        fInfo;
69b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    SkMSec      fCurrTime;
70b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    SkBitmap    fBitmap;
71b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    bool        fNeedBitmap;
72b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
73b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    void ensureInfo();
74b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
75b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III    typedef SkRefCnt INHERITED;
76b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III};
77b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III
78b5e74b90b26e6ad7c075d60ff11a14c1fd99230dLeon Scroggins III#endif
79