00001 #include "funcprotos.h"
00002 #include "qtprivate.h"
00003 #include <string.h>
00004
00005
00006 quicktime_cache_t* quicktime_new_cache()
00007 {
00008 quicktime_cache_t *result = calloc(1, sizeof(quicktime_cache_t));
00009 return result;
00010 }
00011
00012 void quicktime_delete_cache(quicktime_cache_t *ptr)
00013 {
00014 if(ptr->frames)
00015 {
00016 int i;
00017
00018 for(i = 0; i < ptr->allocation; i++)
00019 {
00020 quicktime_cacheframe_t *frame = &ptr->frames[i];
00021 if(frame->y) free(frame->y);
00022 if(frame->u) free(frame->u);
00023 if(frame->v) free(frame->v);
00024 }
00025 free(ptr->frames);
00026 free(ptr);
00027 }
00028 }
00029
00030 void quicktime_reset_cache(quicktime_cache_t *ptr)
00031 {
00032 ptr->total = 0;
00033 }
00034
00035 void quicktime_put_frame(quicktime_cache_t *ptr,
00036 int64_t frame_number,
00037 unsigned char *y,
00038 unsigned char *u,
00039 unsigned char *v,
00040 int y_size,
00041 int u_size,
00042 int v_size)
00043 {
00044 quicktime_cacheframe_t *frame = 0;
00045 int i;
00046
00047
00048
00049 for(i = 0; i < ptr->total; i++)
00050 {
00051 if(ptr->frames[i].frame_number == frame_number)
00052 {
00053 frame = &ptr->frames[i];
00054 break;
00055 }
00056 }
00057
00058
00059 if(!frame)
00060 {
00061 if(ptr->total >= ptr->allocation)
00062 {
00063 int new_allocation = ptr->allocation * 2;
00064
00065 if(!new_allocation) new_allocation = 32;
00066 ptr->frames = realloc(ptr->frames,
00067 sizeof(quicktime_cacheframe_t) * new_allocation);
00068 bzero(ptr->frames + ptr->total,
00069 sizeof(quicktime_cacheframe_t) * (new_allocation - ptr->allocation));
00070 ptr->allocation = new_allocation;
00071
00072 }
00073
00074 frame = &ptr->frames[ptr->total];
00075
00076 ptr->total++;
00077
00078
00079 if(y)
00080 {
00081 frame->y = realloc(frame->y, y_size);
00082 frame->y_size = y_size;
00083 memcpy(frame->y, y, y_size);
00084 }
00085
00086 if(u)
00087 {
00088 frame->u = realloc(frame->u, u_size);
00089 frame->u_size = u_size;
00090 memcpy(frame->u, u, u_size);
00091 }
00092
00093 if(v)
00094 {
00095 frame->v = realloc(frame->v, v_size);
00096 frame->v_size = v_size;
00097 memcpy(frame->v, v, v_size);
00098 }
00099 frame->frame_number = frame_number;
00100 }
00101
00102 }
00103
00104 int quicktime_get_frame(quicktime_cache_t *ptr,
00105 int64_t frame_number,
00106 unsigned char **y,
00107 unsigned char **u,
00108 unsigned char **v)
00109 {
00110 int i;
00111
00112 for(i = 0; i < ptr->total; i++)
00113 {
00114 quicktime_cacheframe_t *frame = &ptr->frames[i];
00115 if(frame->frame_number == frame_number)
00116 {
00117
00118 *y = frame->y;
00119 *u = frame->u;
00120 *v = frame->v;
00121 return 1;
00122 break;
00123 }
00124 }
00125
00126 return 0;
00127 }
00128
00129 int quicktime_has_frame(quicktime_cache_t *ptr,
00130 int64_t frame_number)
00131 {
00132 int i;
00133
00134 for(i = 0; i < ptr->total; i++)
00135 {
00136 quicktime_cacheframe_t *frame = &ptr->frames[i];
00137 if(frame->frame_number == frame_number)
00138 {
00139 return 1;
00140 break;
00141 }
00142 }
00143
00144 return 0;
00145 }
00146
00147 int64_t quicktime_cache_usage(quicktime_cache_t *ptr)
00148 {
00149 int64_t result = 0;
00150 int i;
00151
00152 for(i = 0; i < ptr->allocation; i++)
00153 {
00154 quicktime_cacheframe_t *frame = &ptr->frames[i];
00155 result += frame->y_size + frame->u_size + frame->v_size;
00156 }
00157 return result;
00158 }
00159
00160
00161