static pixmap_t * fa_image_from_video(const char *url0, const image_meta_t *im, char *errbuf, size_t errlen, int *cache_control, cancellable_t *c) { static char *stated_url; static fa_stat_t fs; time_t stattime = 0; time_t mtime = 0; pixmap_t *pm = NULL; char cacheid[512]; char *url = mystrdupa(url0); char *tim = strchr(url, '#'); const char *siz; *tim++ = 0; int secs = atoi(tim); hts_mutex_lock(&image_from_video_mutex[0]); if(strcmp(url, stated_url ?: "")) { free(stated_url); stated_url = NULL; if(fa_stat(url, &fs, errbuf, errlen)) { hts_mutex_unlock(&image_from_video_mutex[0]); return NULL; } stated_url = strdup(url); } stattime = fs.fs_mtime; hts_mutex_unlock(&image_from_video_mutex[0]); if(im->im_req_width < 100 && im->im_req_height < 100) { siz = "min"; } else if(im->im_req_width < 200 && im->im_req_height < 200) { siz = "mid"; } else { siz = "max"; } snprintf(cacheid, sizeof(cacheid), "%s-%s", url0, siz); buf_t *b = blobcache_get(cacheid, "videothumb", 0, 0, NULL, &mtime); if(b != NULL && mtime == stattime) { pm = pixmap_alloc_coded(b->b_ptr, b->b_size, PIXMAP_JPEG); buf_release(b); return pm; } buf_release(b); if(ONLY_CACHED(cache_control)) { snprintf(errbuf, errlen, "Not cached"); return NULL; } hts_mutex_lock(&image_from_video_mutex[1]); pm = fa_image_from_video2(url, im, cacheid, errbuf, errlen, secs, stattime, c); hts_mutex_unlock(&image_from_video_mutex[1]); return pm; }
static pixmap_t * fa_image_from_video(const char *url0, const image_meta_t *im, char *errbuf, size_t errlen, int *cache_control, fa_load_cb_t *cb, void *opaque) { static char *stated_url; static fa_stat_t fs; time_t stattime = 0; time_t mtime = 0; pixmap_t *pm = NULL; char cacheid[512]; void *data; size_t datasize; char *url = mystrdupa(url0); char *tim = strchr(url, '#'); *tim++ = 0; int secs = atoi(tim); hts_mutex_lock(&image_from_video_mutex); if(strcmp(url, stated_url ?: "")) { free(stated_url); stated_url = NULL; if(fa_stat(url, &fs, errbuf, errlen)) { hts_mutex_unlock(&image_from_video_mutex); return NULL; } stated_url = strdup(url); } stattime = fs.fs_mtime; hts_mutex_unlock(&image_from_video_mutex); snprintf(cacheid, sizeof(cacheid), "%s-%d-%d-3", url0, im->im_req_width, im->im_req_height); data = blobcache_get(cacheid, "videothumb", &datasize, 0, 0, NULL, &mtime); if(data != NULL && mtime == stattime) { pm = pixmap_alloc_coded(data, datasize, PIXMAP_PNG); free(data); return pm; } if(ONLY_CACHED(cache_control)) { snprintf(errbuf, errlen, "Not cached"); return NULL; } hts_mutex_lock(&image_from_video_mutex); pm = fa_image_from_video2(url, im, cacheid, errbuf, errlen, secs, stattime, cb, opaque); hts_mutex_unlock(&image_from_video_mutex); return pm; }
JSBool js_cache_get(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { void *value; size_t vsize; char stash[256]; char errbuf[256]; const char *key,*lstash; JSObject *o; js_plugin_t *jsp = JS_GetPrivate(cx, obj); if (!JS_ConvertArguments(cx, argc, argv, "ss", &lstash, &key)) return JS_FALSE; // fetch json from cache snprintf(stash, sizeof(stash), "plugin/%s/%s", jsp->jsp_id, lstash); value = blobcache_get(key, stash, &vsize, 0, NULL, NULL, NULL); if(value == NULL) { *rval = OBJECT_TO_JSVAL(NULL); return JS_TRUE; } // deserialize into json object if(!JS_EnterLocalRootScope(cx)) return JS_FALSE; o = json_deserialize(value, &json_to_jsapi, cx, errbuf, sizeof(errbuf)); *rval = OBJECT_TO_JSVAL(o); JS_LeaveLocalRootScope(cx); if(o == NULL) { JS_ReportError(cx, "Invalid JSON stored in cache -- %s", errbuf); return JS_FALSE; } return JS_TRUE; }
static pixmap_t * fa_image_from_video(const char *url0, const image_meta_t *im) { pixmap_t *pm = NULL; char cacheid[512]; void *data; size_t datasize; snprintf(cacheid, sizeof(cacheid), "%s-%d-%d", url0, im->req_width, im->req_height); data = blobcache_get(cacheid, "videothumb", &datasize, 0); if(data != NULL) { pm = pixmap_alloc_coded(data, datasize, CODEC_ID_PNG); free(data); return pm; } hts_mutex_lock(&image_from_video_mutex); pm = fa_image_from_video2(url0, im, cacheid); hts_mutex_unlock(&image_from_video_mutex); return pm; }
static image_t * fa_image_from_video(const char *url0, const image_meta_t *im, char *errbuf, size_t errlen, int *cache_control, cancellable_t *c) { static char *stated_url; static fa_stat_t fs; time_t stattime = 0; time_t mtime = 0; image_t *img = NULL; char cacheid[512]; char *url = mystrdupa(url0); char *tim = strchr(url, '#'); const char *siz; *tim++ = 0; int secs; if(!strcmp(tim, "cover")) secs = -1; else secs = atoi(tim); hts_mutex_lock(&image_from_video_mutex[0]); if(strcmp(url, stated_url ?: "")) { free(stated_url); stated_url = NULL; if(fa_stat(url, &fs, errbuf, errlen)) { hts_mutex_unlock(&image_from_video_mutex[0]); return NULL; } stated_url = strdup(url); } stattime = fs.fs_mtime; hts_mutex_unlock(&image_from_video_mutex[0]); if(im->im_req_width < 100 && im->im_req_height < 100) { siz = "min"; } else if(im->im_req_width < 200 && im->im_req_height < 200) { siz = "mid"; } else { siz = "max"; } snprintf(cacheid, sizeof(cacheid), "%s-%s", url0, siz); buf_t *b = blobcache_get(cacheid, "videothumb", 0, 0, NULL, &mtime); if(b != NULL && mtime == stattime) { img = image_coded_create_from_buf(b, IMAGE_JPEG); buf_release(b); return img; } buf_release(b); if(ONLY_CACHED(cache_control)) { snprintf(errbuf, errlen, "Not cached"); return NULL; } hts_mutex_lock(&image_from_video_mutex[1]); img = fa_image_from_video2(url, im, cacheid, errbuf, errlen, secs, stattime, c); hts_mutex_unlock(&image_from_video_mutex[1]); if(img != NULL) img->im_flags |= IMAGE_ADAPTED; return img; }