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