1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
#include "mpeg3private.h"
#include <stdlib.h>
#include <string.h>
// This is basically qtcache.c with quicktime_ replaced by mpeg3_
mpeg3_cache_t* mpeg3_new_cache()
{
mpeg3_cache_t *result = calloc(1, sizeof(mpeg3_cache_t));
return result;
}
void mpeg3_delete_cache(mpeg3_cache_t *ptr)
{
if(ptr->frames)
{
int i;
for(i = 0; i < ptr->allocation; i++)
{
mpeg3_cacheframe_t *frame = &ptr->frames[i];
if(frame->y) free(frame->y);
if(frame->u) free(frame->u);
if(frame->v) free(frame->v);
}
free(ptr->frames);
free(ptr);
}
}
void mpeg3_reset_cache(mpeg3_cache_t *ptr)
{
ptr->total = 0;
}
void mpeg3_cache_put_frame(mpeg3_cache_t *ptr,
int64_t frame_number,
unsigned char *y,
unsigned char *u,
unsigned char *v,
int y_size,
int u_size,
int v_size)
{
mpeg3_cacheframe_t *frame = 0;
int i;
//printf("mpeg3_put_frame 1\n");
// Get existing frame
for(i = 0; i < ptr->total; i++)
{
if(ptr->frames[i].frame_number == frame_number)
{
frame = &ptr->frames[i];
break;
}
}
if(!frame)
{
if(ptr->total >= ptr->allocation)
{
int new_allocation = ptr->allocation * 2;
//printf("mpeg3_put_frame 10 %d\n", new_allocation);
if(!new_allocation) new_allocation = 32;
ptr->frames = realloc(ptr->frames,
sizeof(mpeg3_cacheframe_t) * new_allocation);
bzero(ptr->frames + ptr->total,
sizeof(mpeg3_cacheframe_t) * (new_allocation - ptr->allocation));
//printf("mpeg3_put_frame 20 %d %d %d\n", new_allocation, ptr->allocation, ptr->total);
ptr->allocation = new_allocation;
}
frame = &ptr->frames[ptr->total];
//printf("mpeg3_put_frame 30 %d %p %p %p\n", ptr->total, frame->y, frame->u, frame->v);
ptr->total++;
// Memcpy is a lot slower than just dropping the seeking frames.
if(y)
{
frame->y = realloc(frame->y, y_size);
frame->y_size = y_size;
memcpy(frame->y, y, y_size);
}
if(u)
{
frame->u = realloc(frame->u, u_size);
frame->u_size = u_size;
memcpy(frame->u, u, u_size);
}
if(v)
{
frame->v = realloc(frame->v, v_size);
frame->v_size = v_size;
memcpy(frame->v, v, v_size);
}
frame->frame_number = frame_number;
}
//printf("mpeg3_put_frame 100\n");
}
int mpeg3_cache_get_frame(mpeg3_cache_t *ptr,
int64_t frame_number,
unsigned char **y,
unsigned char **u,
unsigned char **v)
{
int i;
for(i = 0; i < ptr->total; i++)
{
mpeg3_cacheframe_t *frame = &ptr->frames[i];
if(frame->frame_number == frame_number)
{
*y = frame->y;
*u = frame->u;
*v = frame->v;
return 1;
break;
}
}
return 0;
}
int mpeg3_cache_has_frame(mpeg3_cache_t *ptr,
int64_t frame_number)
{
int i;
for(i = 0; i < ptr->total; i++)
{
mpeg3_cacheframe_t *frame = &ptr->frames[i];
if(frame->frame_number == frame_number)
return 1;
}
return 0;
}
int64_t mpeg3_cache_usage(mpeg3_cache_t *ptr)
{
int64_t result = 0;
int i;
for(i = 0; i < ptr->allocation; i++)
{
mpeg3_cacheframe_t *frame = &ptr->frames[i];
result += frame->y_size + frame->u_size + frame->v_size;
}
return result;
}
|