summaryrefslogtreecommitdiff
path: root/recordmydesktop/include
diff options
context:
space:
mode:
Diffstat (limited to 'recordmydesktop/include')
-rw-r--r--recordmydesktop/include/rmdmacro.h47
-rw-r--r--recordmydesktop/include/rmdtypes.h26
2 files changed, 54 insertions, 19 deletions
diff --git a/recordmydesktop/include/rmdmacro.h b/recordmydesktop/include/rmdmacro.h
index 87ac39f..c14785f 100644
--- a/recordmydesktop/include/rmdmacro.h
+++ b/recordmydesktop/include/rmdmacro.h
@@ -69,8 +69,35 @@
//avoid problems (amd64 has 8byte ulong)
#define RMD_ULONG_SIZE_T (sizeof(unsigned long))
+//size of stride when comparing planes(depending on type)
+//this is just to avoid thousands of sizeof's
+#ifdef HAVE_U_INT64_T
+ #define COMPARE_STRIDE 8
+#else
+ #define COMPARE_STRIDE 4
+#endif
+
//500 mb file size
#define CACHE_FILE_SIZE_LIMIT (500*1<<20)
+//minimize hard disk access
+#define CACHE_OUT_BUFFER_SIZE 4096
+
+
+//The width, in bytes, of the blocks
+//on which the y,u and v planes are broken.
+//These blocks are square.
+#define Y_UNIT_WIDTH 0x0010
+#define UV_UNIT_WIDTH 0x0008
+
+//The number of bytes for every
+//sub-block of the y,u and v planes.
+//Since the blocks are square
+//these are obviously the squares
+//of the widths(specified above),
+//but the definitions bellow are only
+//for convenience anyway.
+#define Y_UNIT_BYTES 0x0100
+#define UV_UNIT_BYTES 0x0040
#define CLIP_EVENT_AREA(e,brwin,wgeom){\
@@ -251,10 +278,10 @@
__copy_type,\
__bit_depth__){ \
int k,i;\
- register RMD_TYPE_##__bit_depth__ t_val;\
+ register u_int##__bit_depth__##_t t_val;\
register unsigned char *yuv_y=yuv->y+x_tm+y_tm*yuv->y_width,\
*_yr=Yr,*_yg=Yg,*_yb=Yb;\
- register RMD_TYPE_##__bit_depth__ *datapi=(RMD_TYPE_##__bit_depth__ *)data\
+ register u_int##__bit_depth__##_t *datapi=(u_int##__bit_depth__##_t *)data\
+((__copy_type==__X_SHARED)?\
(x_tm+y_tm*yuv->y_width):0);\
for(k=0;k<height_tm;k++){\
@@ -282,12 +309,12 @@
__sampling_type,\
__bit_depth__){ \
int k,i;\
- register RMD_TYPE_##__bit_depth__ t_val;\
+ register u_int##__bit_depth__##_t t_val;\
register unsigned char *yuv_u=yuv->u+x_tm/2+(y_tm*yuv->uv_width)/2,\
*yuv_v=yuv->v+x_tm/2+(y_tm*yuv->uv_width)/2,\
*_ur=Ur,*_ug=Ug,*_ub=Ub,\
*_vr=Vr,*_vg=Vg,*_vb=Vb;\
- register RMD_TYPE_##__bit_depth__ *datapi=(RMD_TYPE_##__bit_depth__ *)data\
+ register u_int##__bit_depth__##_t *datapi=(u_int##__bit_depth__##_t *)data\
+((__copy_type==__X_SHARED)?\
(x_tm+y_tm*yuv->y_width):0),\
*datapi_next=NULL;\
@@ -445,20 +472,18 @@
free(t_buf);\
};\
-#define INIT_FRAME(frame_t,fheader_t,yuv_t){\
+#define INIT_FRAME(frame_t,fheader_t,yuv_t,\
+ YBlocks_t,UBlocks_t,VBlocks_t){\
(frame_t)->header=(fheader_t);\
- (frame_t)->YBlocks=malloc(256);\
- (frame_t)->UBlocks=malloc(64);\
- (frame_t)->VBlocks=malloc(64);\
+ (frame_t)->YBlocks=YBlocks_t;\
+ (frame_t)->UBlocks=UBlocks_t;\
+ (frame_t)->VBlocks=VBlocks_t;\
(frame_t)->YData=malloc((yuv_t)->y_width*(yuv_t)->y_height);\
(frame_t)->UData=malloc((yuv_t)->uv_width*(yuv_t)->uv_height);\
(frame_t)->VData=malloc((yuv_t)->uv_width*(yuv_t)->uv_height);\
};
#define CLEAR_FRAME(frame_t){\
- free((frame_t)->YBlocks);\
- free((frame_t)->UBlocks);\
- free((frame_t)->VBlocks);\
free((frame_t)->YData);\
free((frame_t)->UData);\
free((frame_t)->VData);\
diff --git a/recordmydesktop/include/rmdtypes.h b/recordmydesktop/include/rmdtypes.h
index ea1e517..7da30e9 100644
--- a/recordmydesktop/include/rmdtypes.h
+++ b/recordmydesktop/include/rmdtypes.h
@@ -31,6 +31,7 @@
#include <config.h>
#endif
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -61,8 +62,19 @@
#include <ogg/ogg.h>
#include <alsa/asoundlib.h>
-typedef u_int16_t RMD_TYPE_16;
-typedef u_int32_t RMD_TYPE_32;
+//this type exists only
+//for comparing the planes at caching.
+//u_int64_t mught not be available everywhere.
+//The performance gain comes from casting the unsigned char
+//buffers to this type before comparing the two blocks.
+//This is made possible by the fact that blocks
+//for the Y plane are 16 bytes in width and blocks
+//for the U,V planes are 8 bytes in width
+#ifdef HAVE_U_INT64_T
+typedef u_int64_t cmp_int_t;
+#else
+typedef u_int32_t cmp_int_t;
+#endif
//how we obtained the image we are converting to yuv
enum{
@@ -293,11 +305,9 @@ typedef struct _FrameHeader{
u_int32_t frameno, //number of frame(cached frames)
current_total; //number of frames that should have been
//taken at time of caching this one
- u_int16_t Ynum, //number of changed blocks in the Y plane
+ u_int32_t Ynum, //number of changed blocks in the Y plane
Unum, //number of changed blocks in the U plane
Vnum; //number of changed blocks in the V plane
- u_int16_t pad; //always zero
-
}FrameHeader;
//The frame after retrieval.
@@ -307,9 +317,9 @@ typedef struct _FrameHeader{
typedef struct _CachedFrame{
FrameHeader *header;
- unsigned char *YBlocks; //identifying number on the grid,
- unsigned char *UBlocks; //starting at top left
- unsigned char *VBlocks; // >> >>
+ u_int32_t *YBlocks; //identifying number on the grid,
+ u_int32_t *UBlocks; //starting at top left
+ u_int32_t *VBlocks; // >> >>
unsigned char *YData; //pointer to data for the blocks that have changed,
unsigned char *UData; //which have to be remapped
unsigned char *VData; //on the buffer when reading
© All Rights Reserved