39 #include <config_auto.h> 42 #include "allheaders.h" 47 #include "webp/decode.h" 48 #include "webp/encode.h" 50 #include "webp/demux.h" 72 pixaWriteWebPAnim(
const char *filename,
82 PROCNAME(
"pixaWriteWebPAnim");
85 return ERROR_INT(
"filename not defined", procName, 1);
87 return ERROR_INT(
"pixa not defined", procName, 1);
90 return ERROR_INT(
"stream not opened", procName, 1);
91 ret = pixaWriteStreamWebPAnim(fp, pixa, loopcount, duration,
95 return ERROR_INT(
"pixs not compressed to stream", procName, 1);
119 pixaWriteStreamWebPAnim(FILE *fp,
127 size_t filebytes, nbytes;
129 PROCNAME(
"pixaWriteStreamWebpAnim");
132 return ERROR_INT(
"stream not open", procName, 1);
134 return ERROR_INT(
"pixa not defined", procName, 1);
137 pixaWriteMemWebPAnim(&filedata, &filebytes, pixa, loopcount,
138 duration, quality, lossless);
141 return ERROR_INT(
"filedata not made", procName, 1);
142 nbytes = fwrite(filedata, 1, filebytes, fp);
144 if (nbytes != filebytes)
145 return ERROR_INT(
"Write error", procName, 1);
168 pixaWriteMemWebPAnim(l_uint8 **pencdata,
176 l_int32 i, n, same, w, h, wpl, ret;
179 WebPAnimEncoder *enc;
180 WebPAnimEncoderOptions enc_options;
184 WebPMuxAnimParams newparams;
187 PROCNAME(
"pixaWriteMemWebPAnim");
190 return ERROR_INT(
"&encdata not defined", procName, 1);
193 return ERROR_INT(
"&encsize not defined", procName, 1);
196 return ERROR_INT(
"&pixa not defined", procName, 1);
198 return ERROR_INT(
"no images in pixa", procName, 1);
199 if (loopcount < 0) loopcount = 0;
200 if (lossless == 0 && (quality < 0 || quality > 100))
201 return ERROR_INT(
"quality not in [0 ... 100]", procName, 1);
205 return ERROR_INT(
"sizes of all pix are not the same", procName, 1);
208 WebPAnimEncoderOptionsInit(&enc_options);
209 enc = WebPAnimEncoderNew(w, h, &enc_options);
211 for (i = 0; i < n; i++) {
219 wpl = pixGetWpl(pix2);
220 WebPPictureInit(&frame);
223 WebPPictureImportRGBA(&frame, data, 4 * wpl);
228 WebPConfigInit(&config);
229 config.lossless = lossless;
230 config.quality = quality;
231 WebPAnimEncoderAdd(enc, &frame, duration * i, &config);
232 WebPPictureFree(&frame);
234 WebPAnimEncoderAdd(enc, NULL, duration * i, NULL);
235 WebPAnimEncoderAssemble(enc, &webp_data);
236 WebPAnimEncoderDelete(enc);
245 mux = WebPMuxCreate(&webp_data, 1);
247 L_ERROR(
"could not re-mux to add loop count\n", procName);
249 ret = WebPMuxGetAnimationParams(mux, &newparams);
250 if (ret != WEBP_MUX_OK) {
251 L_ERROR(
"failed to get loop count\n", procName);
253 newparams.loop_count = loopcount;
254 ret = WebPMuxSetAnimationParams(mux, &newparams);
255 if (ret != WEBP_MUX_OK)
256 L_ERROR(
"failed to set loop count\n", procName);
258 WebPDataClear(&webp_data);
259 WebPMuxAssemble(mux, &webp_data);
264 *pencdata = (l_uint8 *)webp_data.bytes;
265 *pencsize = webp_data.size;
266 L_INFO(
"data size = %zu\n", procName, webp_data.size);
PIX * pixConvertTo32(PIX *pixs)
pixConvertTo32()
l_ok pixSetComponentArbitrary(PIX *pix, l_int32 comp, l_int32 val)
pixSetComponentArbitrary()
l_uint32 * pixGetData(PIX *pix)
pixGetData()
l_ok pixEndianByteSwap(PIX *pixs)
pixEndianByteSwap()
void pixDestroy(PIX **ppix)
pixDestroy()
FILE * fopenWriteStream(const char *filename, const char *modestring)
fopenWriteStream()
l_ok pixaVerifyDimensions(PIXA *pixa, l_int32 *psame, l_int32 *pmaxw, l_int32 *pmaxh)
pixaVerifyDimensions()
PIX * pixaGetPix(PIXA *pixa, l_int32 index, l_int32 accesstype)
pixaGetPix()
l_int32 pixaGetCount(PIXA *pixa)
pixaGetCount()