remove $Id: tags after discussion on the mailign list: http://markmail.org/message/fp7ozcywxum3ar7n
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
# $Id$
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
@@ -24,11 +23,6 @@
|
||||
#
|
||||
# ***** END GPL LICENSE BLOCK *****
|
||||
|
||||
if(WITH_CODEC_FFMPEG)
|
||||
# FFMPEG gives warnigns which are hard to avoid across multiple versions.
|
||||
remove_strict_flags()
|
||||
endif()
|
||||
|
||||
set(INC
|
||||
.
|
||||
../avi
|
||||
@@ -62,6 +56,7 @@ set(SRC
|
||||
intern/md5.c
|
||||
intern/metadata.c
|
||||
intern/module.c
|
||||
intern/moviecache.c
|
||||
intern/png.c
|
||||
intern/readimage.c
|
||||
intern/rectop.c
|
||||
@@ -75,6 +70,7 @@ set(SRC
|
||||
|
||||
IMB_imbuf.h
|
||||
IMB_imbuf_types.h
|
||||
IMB_moviecache.h
|
||||
IMB_thumbs.h
|
||||
intern/IMB_allocimbuf.h
|
||||
intern/IMB_anim.h
|
||||
@@ -159,6 +155,12 @@ if(WITH_CODEC_FFMPEG)
|
||||
${FFMPEG_INCLUDE_DIRS}
|
||||
)
|
||||
add_definitions(-DWITH_FFMPEG)
|
||||
|
||||
remove_strict_flags_file(
|
||||
intern/indexer.c
|
||||
intern/util.c
|
||||
intern/anim_movie.c
|
||||
)
|
||||
endif()
|
||||
|
||||
if(WITH_IMAGE_DDS)
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -135,19 +133,6 @@ struct ImBuf *IMB_allocImBuf(unsigned int x, unsigned int y,
|
||||
void IMB_refImBuf(struct ImBuf *ibuf);
|
||||
struct ImBuf * IMB_makeSingleUser(struct ImBuf *ibuf);
|
||||
|
||||
/**
|
||||
*
|
||||
* @attention Defined in allocimbuf.c
|
||||
*/
|
||||
void IMB_cache_limiter_insert(struct ImBuf *i);
|
||||
void IMB_cache_limiter_unmanage(struct ImBuf *i);
|
||||
void IMB_cache_limiter_touch(struct ImBuf *i);
|
||||
void IMB_cache_limiter_ref(struct ImBuf *i);
|
||||
void IMB_cache_limiter_unref(struct ImBuf *i);
|
||||
int IMB_cache_limiter_get_refcount(struct ImBuf *i);
|
||||
|
||||
void IMB_free_cache_limiter(void);
|
||||
|
||||
/**
|
||||
*
|
||||
* @attention Defined in allocimbuf.c
|
||||
|
@@ -11,7 +11,6 @@
|
||||
* are self-explanatory (e.g. IS_amiga tests whether the buffer
|
||||
* contains an Amiga-format file).
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
|
56
source/blender/imbuf/IMB_moviecache.h
Normal file
56
source/blender/imbuf/IMB_moviecache.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2011 Blender Foundation.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Contributor(s): Blender Foundation,
|
||||
* Sergey Sharybin
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
#ifndef IMB_MOVIECACHE_H
|
||||
#define IMB_MOVIECACHE_H
|
||||
|
||||
/** \file IMB_moviecache.h
|
||||
* \ingroup imbuf
|
||||
* \author Sergey Sharybin
|
||||
*/
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BLI_ghash.h"
|
||||
|
||||
/* Cache system for movie data - now supports stoting ImBufs only
|
||||
Supposed to provide unified cache system for movie clips, sequencer and
|
||||
other movie-related areas */
|
||||
|
||||
struct ImBuf;
|
||||
struct MovieCache;
|
||||
|
||||
typedef void (*MovieCacheGetKeyDataFP) (void *userkey, int *framenr, int *proxy, int *render_flags);
|
||||
|
||||
void IMB_moviecache_init(void);
|
||||
void IMB_moviecache_destruct(void);
|
||||
|
||||
struct MovieCache *IMB_moviecache_create(int keysize, GHashHashFP hashfp, GHashCmpFP cmpfp, MovieCacheGetKeyDataFP getdatafp);
|
||||
void IMB_moviecache_put(struct MovieCache *cache, void *userkey, struct ImBuf *ibuf);
|
||||
struct ImBuf* IMB_moviecache_get(struct MovieCache *cache, void *userkey);
|
||||
void IMB_moviecache_free(struct MovieCache *cache);
|
||||
void IMB_moviecache_get_cache_segments(struct MovieCache *cache, int proxy, int render_flags, int *totseg_r, int **points_r);
|
||||
|
||||
#endif
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,7 +1,6 @@
|
||||
/*
|
||||
* allocimbuf.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
|
@@ -1,7 +1,6 @@
|
||||
/*
|
||||
* allocimbuf.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,7 +1,6 @@
|
||||
/*
|
||||
* filter.h
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/**
|
||||
* $Id$
|
||||
*
|
||||
/*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,7 +1,6 @@
|
||||
/*
|
||||
* allocimbuf.c
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
@@ -165,8 +164,9 @@ void IMB_freeImBuf(ImBuf *ibuf)
|
||||
IMB_freezbufImBuf(ibuf);
|
||||
IMB_freezbuffloatImBuf(ibuf);
|
||||
freeencodedbufferImBuf(ibuf);
|
||||
IMB_cache_limiter_unmanage(ibuf);
|
||||
IMB_metadata_free(ibuf);
|
||||
if (ibuf->dds_data.data != NULL)
|
||||
free(ibuf->dds_data.data);
|
||||
MEM_freeN(ibuf);
|
||||
}
|
||||
}
|
||||
@@ -468,60 +468,7 @@ static MEM_CacheLimiterC **get_imbuf_cache_limiter(void)
|
||||
static MEM_CacheLimiterC *c = NULL;
|
||||
|
||||
if(!c)
|
||||
c = new_MEM_CacheLimiter(imbuf_cache_destructor);
|
||||
c = new_MEM_CacheLimiter(imbuf_cache_destructor, NULL);
|
||||
|
||||
return &c;
|
||||
}
|
||||
|
||||
void IMB_free_cache_limiter(void)
|
||||
{
|
||||
delete_MEM_CacheLimiter(*get_imbuf_cache_limiter());
|
||||
*get_imbuf_cache_limiter() = NULL;
|
||||
}
|
||||
|
||||
void IMB_cache_limiter_insert(ImBuf *i)
|
||||
{
|
||||
if(!i->c_handle) {
|
||||
i->c_handle = MEM_CacheLimiter_insert(
|
||||
*get_imbuf_cache_limiter(), i);
|
||||
MEM_CacheLimiter_ref(i->c_handle);
|
||||
MEM_CacheLimiter_enforce_limits(
|
||||
*get_imbuf_cache_limiter());
|
||||
MEM_CacheLimiter_unref(i->c_handle);
|
||||
}
|
||||
}
|
||||
|
||||
void IMB_cache_limiter_unmanage(ImBuf *i)
|
||||
{
|
||||
if(i->c_handle) {
|
||||
MEM_CacheLimiter_unmanage(i->c_handle);
|
||||
i->c_handle = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void IMB_cache_limiter_touch(ImBuf *i)
|
||||
{
|
||||
if(i->c_handle)
|
||||
MEM_CacheLimiter_touch(i->c_handle);
|
||||
}
|
||||
|
||||
void IMB_cache_limiter_ref(ImBuf *i)
|
||||
{
|
||||
if(i->c_handle)
|
||||
MEM_CacheLimiter_ref(i->c_handle);
|
||||
}
|
||||
|
||||
void IMB_cache_limiter_unref(ImBuf *i)
|
||||
{
|
||||
if(i->c_handle)
|
||||
MEM_CacheLimiter_unref(i->c_handle);
|
||||
}
|
||||
|
||||
int IMB_cache_limiter_get_refcount(ImBuf *i)
|
||||
{
|
||||
if(i->c_handle)
|
||||
return MEM_CacheLimiter_get_refcount(i->c_handle);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
/*
|
||||
* anim.c
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,4 +1,3 @@
|
||||
# $Id$
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -27,7 +26,6 @@
|
||||
* cineon.c
|
||||
* contributors: joeedh
|
||||
* I hearby donate this code and all rights to the Blender Foundation.
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/cineon/cineon_dpx.c
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,4 +1,3 @@
|
||||
# $Id: CMakeLists.txt 14444 2008-04-16 22:40:48Z hos $
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -26,7 +25,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* allocimbuf.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/divers.c
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
@@ -28,7 +27,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* filter.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/filter.c
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -39,7 +38,6 @@
|
||||
*
|
||||
* april 95
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@@ -3,7 +3,6 @@
|
||||
*
|
||||
* This header might have to become external...
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
|
@@ -1,7 +1,5 @@
|
||||
/*
|
||||
* imbuf_coca.m
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
|
@@ -1,12 +1,10 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
@@ -22,7 +20,7 @@
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
*/
|
||||
|
||||
#include "IMB_indexer.h"
|
||||
#include "IMB_anim.h"
|
||||
@@ -454,7 +452,7 @@ static int round_up(int x, int mod)
|
||||
static struct proxy_output_ctx * alloc_proxy_output_ffmpeg(
|
||||
struct anim * anim,
|
||||
AVStream * st, int proxy_size, int width, int height,
|
||||
int quality)
|
||||
int UNUSED(quality))
|
||||
{
|
||||
struct proxy_output_ctx * rv = MEM_callocN(
|
||||
sizeof(struct proxy_output_ctx), "alloc_proxy_output");
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -22,7 +20,7 @@
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
*/
|
||||
|
||||
#include "IMB_indexer.h"
|
||||
#include "MEM_guardedalloc.h"
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -24,9 +23,6 @@
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* iris.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/iris.c
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -24,9 +23,6 @@
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* jpeg.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/jpeg.c
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -39,7 +37,6 @@ void IMB_init(void)
|
||||
|
||||
void IMB_exit(void)
|
||||
{
|
||||
IMB_free_cache_limiter();
|
||||
imb_tile_cache_exit();
|
||||
imb_filetypes_exit();
|
||||
}
|
||||
|
382
source/blender/imbuf/intern/moviecache.c
Normal file
382
source/blender/imbuf/intern/moviecache.c
Normal file
@@ -0,0 +1,382 @@
|
||||
/*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* The Original Code is Copyright (C) 2011 Blender Foundation.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Contributor(s): Blender Foundation,
|
||||
* Sergey Sharybin,
|
||||
* Peter Schlaile
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
/** \file blender/blenkernel/intern/moviecache.c
|
||||
* \ingroup bke
|
||||
*/
|
||||
|
||||
#include <stdlib.h> /* for qsort */
|
||||
#include <memory.h>
|
||||
|
||||
#include "MEM_guardedalloc.h"
|
||||
#include "MEM_CacheLimiterC-Api.h"
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
#include "BLI_ghash.h"
|
||||
#include "BLI_mempool.h"
|
||||
|
||||
#include "IMB_moviecache.h"
|
||||
|
||||
#include "IMB_imbuf_types.h"
|
||||
#include "IMB_imbuf.h"
|
||||
|
||||
static MEM_CacheLimiterC *limitor= NULL;
|
||||
|
||||
typedef struct MovieCache {
|
||||
GHash *hash;
|
||||
GHashHashFP hashfp;
|
||||
GHashCmpFP cmpfp;
|
||||
MovieCacheGetKeyDataFP getdatafp;
|
||||
|
||||
struct BLI_mempool *keys_pool;
|
||||
struct BLI_mempool *items_pool;
|
||||
struct BLI_mempool *userkeys_pool;
|
||||
|
||||
int keysize;
|
||||
unsigned long curtime;
|
||||
|
||||
int totseg, *points, proxy, render_flags; /* for visual statistics optimization */
|
||||
int pad;
|
||||
} MovieCache;
|
||||
|
||||
typedef struct MovieCacheKey {
|
||||
MovieCache *cache_owner;
|
||||
void *userkey;
|
||||
} MovieCacheKey;
|
||||
|
||||
typedef struct MovieCacheItem {
|
||||
MovieCache *cache_owner;
|
||||
ImBuf *ibuf;
|
||||
MEM_CacheLimiterHandleC * c_handle;
|
||||
unsigned long last_access;
|
||||
} MovieCacheItem;
|
||||
|
||||
static unsigned int moviecache_hashhash(const void *keyv)
|
||||
{
|
||||
MovieCacheKey *key= (MovieCacheKey*)keyv;
|
||||
|
||||
return key->cache_owner->hashfp(key->userkey);
|
||||
}
|
||||
|
||||
static int moviecache_hashcmp(const void *av, const void *bv)
|
||||
{
|
||||
const MovieCacheKey *a= (MovieCacheKey*)av;
|
||||
const MovieCacheKey *b= (MovieCacheKey*)bv;
|
||||
|
||||
return a->cache_owner->cmpfp(a->userkey, b->userkey);
|
||||
}
|
||||
|
||||
static void moviecache_keyfree(void *val)
|
||||
{
|
||||
MovieCacheKey *key= (MovieCacheKey*)val;
|
||||
|
||||
BLI_mempool_free(key->cache_owner->keys_pool, key);
|
||||
}
|
||||
|
||||
static void moviecache_valfree(void *val)
|
||||
{
|
||||
MovieCacheItem *item= (MovieCacheItem*)val;
|
||||
|
||||
if (item->ibuf) {
|
||||
MEM_CacheLimiter_unmanage(item->c_handle);
|
||||
IMB_freeImBuf(item->ibuf);
|
||||
}
|
||||
|
||||
BLI_mempool_free(item->cache_owner->items_pool, item);
|
||||
}
|
||||
|
||||
static void check_unused_keys(MovieCache *cache)
|
||||
{
|
||||
GHashIterator *iter;
|
||||
|
||||
iter= BLI_ghashIterator_new(cache->hash);
|
||||
while(!BLI_ghashIterator_isDone(iter)) {
|
||||
MovieCacheKey *key= BLI_ghashIterator_getKey(iter);
|
||||
MovieCacheItem *item= BLI_ghashIterator_getValue(iter);
|
||||
|
||||
BLI_ghashIterator_step(iter);
|
||||
|
||||
if(!item->ibuf)
|
||||
BLI_ghash_remove(cache->hash, key, moviecache_keyfree, moviecache_valfree);
|
||||
}
|
||||
|
||||
BLI_ghashIterator_free(iter);
|
||||
}
|
||||
|
||||
static int compare_int(const void *av, const void *bv)
|
||||
{
|
||||
const int *a= (int *)av;
|
||||
const int *b= (int *)bv;
|
||||
return *a-*b;
|
||||
}
|
||||
|
||||
static void IMB_moviecache_destructor(void *p)
|
||||
{
|
||||
MovieCacheItem *item= (MovieCacheItem *) p;
|
||||
|
||||
if (item && item->ibuf) {
|
||||
IMB_freeImBuf(item->ibuf);
|
||||
|
||||
item->ibuf= NULL;
|
||||
item->c_handle= NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* approximate size of ImBuf in memory */
|
||||
static intptr_t IMB_get_size_in_memory(ImBuf *ibuf)
|
||||
{
|
||||
int a;
|
||||
intptr_t size= 0, channel_size= 0;
|
||||
|
||||
size+= sizeof(ImBuf);
|
||||
|
||||
if(ibuf->rect)
|
||||
channel_size+= sizeof(char);
|
||||
|
||||
if(ibuf->rect_float)
|
||||
channel_size+= sizeof(float);
|
||||
|
||||
size+= channel_size*ibuf->x*ibuf->y*ibuf->channels;
|
||||
|
||||
if(ibuf->miptot) {
|
||||
for(a= 0; a<ibuf->miptot; a++) {
|
||||
if(ibuf->mipmap[a])
|
||||
size+= IMB_get_size_in_memory(ibuf->mipmap[a]);
|
||||
}
|
||||
}
|
||||
|
||||
if(ibuf->tiles) {
|
||||
size+= sizeof(unsigned int)*ibuf->ytiles*ibuf->xtiles;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static intptr_t get_item_size (void *p)
|
||||
{
|
||||
intptr_t size= sizeof(MovieCacheItem);
|
||||
MovieCacheItem *item= (MovieCacheItem *) p;
|
||||
|
||||
if(item->ibuf)
|
||||
size+= IMB_get_size_in_memory(item->ibuf);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
void IMB_moviecache_init(void)
|
||||
{
|
||||
limitor= new_MEM_CacheLimiter(IMB_moviecache_destructor, get_item_size);
|
||||
}
|
||||
|
||||
void IMB_moviecache_destruct(void)
|
||||
{
|
||||
if(limitor)
|
||||
delete_MEM_CacheLimiter(limitor);
|
||||
}
|
||||
|
||||
struct MovieCache *IMB_moviecache_create(int keysize, GHashHashFP hashfp, GHashCmpFP cmpfp,
|
||||
MovieCacheGetKeyDataFP getdatafp)
|
||||
{
|
||||
MovieCache *cache;
|
||||
|
||||
cache= MEM_callocN(sizeof(MovieCache), "MovieCache");
|
||||
cache->keys_pool= BLI_mempool_create(sizeof(MovieCacheKey), 64, 64, 0);
|
||||
cache->items_pool= BLI_mempool_create(sizeof(MovieCacheItem), 64, 64, 0);
|
||||
cache->userkeys_pool= BLI_mempool_create(keysize, 64, 64, 0);
|
||||
cache->hash= BLI_ghash_new(moviecache_hashhash, moviecache_hashcmp, "MovieClip ImBuf cache hash");
|
||||
|
||||
cache->keysize= keysize;
|
||||
cache->hashfp= hashfp;
|
||||
cache->cmpfp= cmpfp;
|
||||
cache->getdatafp= getdatafp;
|
||||
cache->proxy= -1;
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
void IMB_moviecache_put(MovieCache *cache, void *userkey, ImBuf *ibuf)
|
||||
{
|
||||
MovieCacheKey *key;
|
||||
MovieCacheItem *item;
|
||||
|
||||
if(!limitor)
|
||||
IMB_moviecache_init();
|
||||
|
||||
IMB_refImBuf(ibuf);
|
||||
|
||||
key= BLI_mempool_alloc(cache->keys_pool);
|
||||
key->cache_owner= cache;
|
||||
key->userkey= BLI_mempool_alloc(cache->userkeys_pool);;
|
||||
memcpy(key->userkey, userkey, cache->keysize);
|
||||
|
||||
item= BLI_mempool_alloc(cache->items_pool);
|
||||
item->ibuf= ibuf;
|
||||
item->cache_owner= cache;
|
||||
item->last_access= cache->curtime++;
|
||||
item->c_handle= NULL;
|
||||
|
||||
BLI_ghash_remove(cache->hash, key, moviecache_keyfree, moviecache_valfree);
|
||||
BLI_ghash_insert(cache->hash, key, item);
|
||||
|
||||
item->c_handle= MEM_CacheLimiter_insert(limitor, item);
|
||||
|
||||
MEM_CacheLimiter_ref(item->c_handle);
|
||||
MEM_CacheLimiter_enforce_limits(limitor);
|
||||
MEM_CacheLimiter_unref(item->c_handle);
|
||||
|
||||
/* cache limiter can't remove unused keys which points to destoryed values */
|
||||
check_unused_keys(cache);
|
||||
|
||||
if(cache->points) {
|
||||
MEM_freeN(cache->points);
|
||||
cache->points= NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ImBuf* IMB_moviecache_get(MovieCache *cache, void *userkey)
|
||||
{
|
||||
MovieCacheKey key;
|
||||
MovieCacheItem *item;
|
||||
|
||||
key.cache_owner= cache;
|
||||
key.userkey= userkey;
|
||||
item= (MovieCacheItem*)BLI_ghash_lookup(cache->hash, &key);
|
||||
|
||||
if(item) {
|
||||
item->last_access= cache->curtime++;
|
||||
|
||||
if(item->ibuf) {
|
||||
MEM_CacheLimiter_touch(item->c_handle);
|
||||
IMB_refImBuf(item->ibuf);
|
||||
|
||||
return item->ibuf;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void IMB_moviecache_free(MovieCache *cache)
|
||||
{
|
||||
BLI_ghash_free(cache->hash, moviecache_keyfree, moviecache_valfree);
|
||||
|
||||
BLI_mempool_destroy(cache->keys_pool);
|
||||
BLI_mempool_destroy(cache->items_pool);
|
||||
BLI_mempool_destroy(cache->userkeys_pool);
|
||||
|
||||
if(cache->points)
|
||||
MEM_freeN(cache->points);
|
||||
|
||||
MEM_freeN(cache);
|
||||
}
|
||||
|
||||
/* get segments of cached frames. useful for debugging cache policies */
|
||||
void IMB_moviecache_get_cache_segments(MovieCache *cache, int proxy, int render_flags, int *totseg_r, int **points_r)
|
||||
{
|
||||
*totseg_r= 0;
|
||||
*points_r= NULL;
|
||||
|
||||
if(!cache->getdatafp)
|
||||
return;
|
||||
|
||||
if(cache->proxy!=proxy || cache->render_flags!=render_flags) {
|
||||
if(cache->points)
|
||||
MEM_freeN(cache->points);
|
||||
|
||||
cache->points= NULL;
|
||||
}
|
||||
|
||||
if(cache->points) {
|
||||
*totseg_r= cache->totseg;
|
||||
*points_r= cache->points;
|
||||
} else {
|
||||
int totframe= BLI_ghash_size(cache->hash);
|
||||
int *frames= MEM_callocN(totframe*sizeof(int), "movieclip cache frames");
|
||||
int a, totseg= 0;
|
||||
GHashIterator *iter;
|
||||
|
||||
iter= BLI_ghashIterator_new(cache->hash);
|
||||
a= 0;
|
||||
while(!BLI_ghashIterator_isDone(iter)) {
|
||||
MovieCacheKey *key= BLI_ghashIterator_getKey(iter);
|
||||
MovieCacheItem *item= BLI_ghashIterator_getValue(iter);
|
||||
int framenr, curproxy, curflags;
|
||||
|
||||
if(item->ibuf) {
|
||||
cache->getdatafp(key->userkey, &framenr, &curproxy, &curflags);
|
||||
|
||||
if(curproxy==proxy && curflags==render_flags)
|
||||
frames[a++]= framenr;
|
||||
}
|
||||
|
||||
BLI_ghashIterator_step(iter);
|
||||
}
|
||||
|
||||
BLI_ghashIterator_free(iter);
|
||||
|
||||
qsort(frames, totframe, sizeof(int), compare_int);
|
||||
|
||||
/* count */
|
||||
for(a= 0; a<totframe; a++) {
|
||||
if(a && frames[a]-frames[a-1]!=1)
|
||||
totseg++;
|
||||
|
||||
if(a==totframe-1)
|
||||
totseg++;
|
||||
}
|
||||
|
||||
if(totseg) {
|
||||
int b, *points;
|
||||
|
||||
points= MEM_callocN(2*sizeof(int)*totseg, "movieclip cache segments");
|
||||
|
||||
/* fill */
|
||||
for(a= 0, b= 0; a<totframe; a++) {
|
||||
if(a==0)
|
||||
points[b++]= frames[a];
|
||||
|
||||
if(a && frames[a]-frames[a-1]!=1) {
|
||||
points[b++]= frames[a-1];
|
||||
points[b++]= frames[a];
|
||||
}
|
||||
|
||||
if(a==totframe-1)
|
||||
points[b++]= frames[a];
|
||||
}
|
||||
|
||||
*totseg_r= totseg;
|
||||
*points_r= points;
|
||||
|
||||
cache->totseg= totseg;
|
||||
cache->points= points;
|
||||
cache->proxy= proxy;
|
||||
cache->render_flags= render_flags;
|
||||
}
|
||||
|
||||
MEM_freeN(frames);
|
||||
}
|
||||
}
|
@@ -1,4 +1,3 @@
|
||||
# $Id$
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -24,7 +23,6 @@
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/png.c
|
||||
|
@@ -1,8 +1,4 @@
|
||||
/*
|
||||
* radiance_hdr.c
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -27,7 +23,7 @@
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/radiance_hdr.c
|
||||
* \ingroup imbuf
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -26,7 +25,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* allocimbuf.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/readimage.c
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -26,7 +25,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* allocimbuf.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/rectop.c
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -26,7 +25,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* rotate.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/rotate.c
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -26,7 +25,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* allocimbuf.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/scaling.c
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -24,7 +23,6 @@
|
||||
* Contributor(s): none yet.
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/targa.c
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,6 +1,4 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@@ -1,7 +1,6 @@
|
||||
/*
|
||||
* tiff.c
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -26,7 +25,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* util.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/util.c
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
@@ -26,7 +25,6 @@
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
* writeimage.c
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/** \file blender/imbuf/intern/writeimage.c
|
||||
|
Reference in New Issue
Block a user