56 {
58
61
62 if (FLAGS_input.size() == 0) {
63 SkDebugf(
"-i input_file.json argument required\n");
64 return -1;
65 }
66
70
72 if (FLAGS_assetPath.size() > 0) {
73 assetPath.
set(FLAGS_assetPath[0]);
74 } else {
76 }
78
80
81
82#if defined(SK_BUILD_FOR_MAC) && defined(SK_FONTMGR_CORETEXT_AVAILABLE)
84#elif defined(SK_BUILD_FOR_ANDROID) && defined(SK_FONTMGR_ANDROID_AVAILABLE)
86#elif defined(SK_BUILD_FOR_UNIX) && defined(SK_FONTMGR_FONTCONFIG_AVAILABLE)
88#else
90#endif
91
96 .makeFromFile(FLAGS_input[0]);
97 if (!animation) {
98 SkDebugf(
"failed to load %s\n", FLAGS_input[0]);
99 return -1;
100 }
101
102 SkISize dim = animation->size().toRound();
103 double duration = animation->duration();
104 int fps =
SkTPin(FLAGS_fps, 1, 240);
105 double fps_scale = animation->fps() / fps;
106
108 if (FLAGS_set_dst_width > 0) {
111 }
112
114 const double frame_duration = 1.0 / fps;
115
116 if (FLAGS_verbose) {
117 SkDebugf(
"Size %dx%d duration %g, fps %d, frame_duration %g\n",
119 }
120
122
126
128 do {
130
131 if (!
encoder.beginRecording(dim, fps)) {
132 SkDEBUGF(
"Invalid video stream configuration.\n");
133 return -1;
134 }
135
136
137 if (!surf) {
138 if (FLAGS_gpu) {
139 grctx = factory.getContextInfo(contextType).directContext();
143 0,
145 nullptr);
146 if (!surf) {
147 grctx = nullptr;
148 }
149 }
150 if (!surf) {
152 }
154 }
155
156 for (
int i = 0;
i <= frames; ++
i) {
157 const double frame =
i * fps_scale;
158 if (FLAGS_verbose) {
160 }
161
163
165 if (grctx) {
167 std::unique_ptr<const SkSurface::AsyncReadResult>
result) {
171 }
172 };
176 read_pixels_cb, &asyncRec);
178 } else {
182 }
183 }
184
185 if (grctx) {
186
188 }
190
191 if (FLAGS_loop) {
193 SkDebugf(
"recording secs %g, frames %d, recording fps %d\n",
194 loop_dur, frames, (int)(frames / loop_dur));
195 }
196 } while (FLAGS_loop);
197
198 if (FLAGS_output.size() == 0) {
199 SkDebugf(
"missing -o output_file.mp4 argument\n");
200 return 0;
201 }
202
204 if (!ostream.isValid()) {
205 SkDebugf(
"Can't create output file %s\n", FLAGS_output[0]);
206 return -1;
207 }
208 ostream.write(
data->data(),
data->size());
209 return 0;
210}
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, std::size(glyphs))==count)
@ kTopLeft_GrSurfaceOrigin
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
SK_API sk_sp< SkFontMgr > SkFontMgr_New_Android(const SkFontMgr_Android_CustomFonts *custom)
SK_API sk_sp< SkFontMgr > SkFontMgr_New_Custom_Empty()
SK_API sk_sp< SkFontMgr > SkFontMgr_New_FontConfig(FcConfig *fc)
SK_API sk_sp< SkFontMgr > SkFontMgr_New_CoreText(CTFontCollectionRef)
#define SkScalarRoundToInt(x)
static constexpr const T & SkTPin(const T &x, const T &lo, const T &hi)
static void Parse(int argc, const char *const *argv)
static void SetUsage(const char *usage)
bool submit(GrSyncCpu sync=GrSyncCpu::kNo)
void flushAndSubmit(GrSyncCpu sync=GrSyncCpu::kNo)
void scale(SkScalar sx, SkScalar sy)
static SkString Dirname(const char *fullPath)
void set(const SkString &src)
const char * c_str() const
void asyncRescaleAndReadPixels(const SkImageInfo &info, const SkIRect &srcRect, RescaleGamma rescaleGamma, RescaleMode rescaleMode, ReadPixelsCallback callback, ReadPixelsContext context)
bool peekPixels(SkPixmap *pixmap)
bool addFrame(const SkPixmap &)
static sk_sp< FileResourceProvider > Make(SkString base_dir, ImageDecodeStrategy=ImageDecodeStrategy::kLazyDecode)
sk_sp< SkFontMgr > fontMgr
void RegisterAllAvailable()
sk_sp< Factory > BestAvailable()
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)
SK_API sk_sp< SkSurface > RenderTarget(GrRecordingContext *context, skgpu::Budgeted budgeted, const SkImageInfo &imageInfo, int sampleCount, GrSurfaceOrigin surfaceOrigin, const SkSurfaceProps *surfaceProps, bool shouldCreateWithMips=false, bool isProtected=false)
DlVertices::Builder Builder
static void produce_frame(SkSurface *surf, skottie::Animation *anim, double frame)
constexpr int32_t width() const
constexpr int32_t height() const
static SkImageInfo MakeN32Premul(int width, int height)
std::shared_ptr< const fml::Mapping > data