Even more improved cluster caching/freeing system.

This commit is contained in:
Moritz Bunkus 2003-02-28 13:01:29 +00:00
parent 1d615475f2
commit 70502c11bb
7 changed files with 31 additions and 65 deletions

View File

@ -13,7 +13,7 @@
/*!
\file
\version \$Id: p_pcm.h,v 1.3 2003/02/27 09:52:37 mosu Exp $
\version \$Id: p_pcm.h,v 1.4 2003/02/28 13:01:29 mosu Exp $
\brief class definition for the PCM output module
\author Moritz Bunkus <moritz @ bunkus.org>
*/
@ -28,7 +28,7 @@ class pcm_packetizer_c: public q_c {
private:
int packetno;
int bps;
u_int64_t bytes_output;
u_int64_t bytes_output, remaining_sync;
unsigned long samples_per_sec;
int channels;
int bits_per_sample;

View File

@ -13,7 +13,7 @@
/*!
\file
\version \$Id: p_video.cpp,v 1.5 2003/02/27 19:51:53 mosu Exp $
\version \$Id: p_video.cpp,v 1.6 2003/02/28 13:01:29 mosu Exp $
\brief video output module
\author Moritz Bunkus <moritz @ bunkus.org>
*/
@ -59,7 +59,6 @@ video_packetizer_c::video_packetizer_c(void *pr_data, int pd_size,
frames_output = 0;
avi_compat_mode = 1;
last_id = 1;
last_keyframe = NULL;
set_private_data(pr_data, pd_size);
set_header();
}
@ -147,11 +146,7 @@ video_packetizer_c::~video_packetizer_c() {
void video_packetizer_c::added_packet_to_cluster(packet_t *packet) {
if (packet->bref == 0) { // this is a keyframe
// Free the last key frame and all others that (indirectly) reference it.
if (last_keyframe != NULL)
cluster_helper->free_ref(last_keyframe->id);
// Save this key frame so that we can later free all references to it
// (and make references to it in the first place).
last_keyframe = packet;
// Free all previous frames up until this on.
cluster_helper->free_ref(packet->id - 1, this);
}
}

View File

@ -13,7 +13,7 @@
/*!
\file
\version \$Id: p_video.h,v 1.6 2003/02/27 19:51:53 mosu Exp $
\version \$Id: p_video.h,v 1.7 2003/02/28 13:01:29 mosu Exp $
\brief class definition for the video output module
\author Moritz Bunkus <moritz @ bunkus.org>
*/
@ -34,7 +34,6 @@ private:
int avi_compat_mode;
range_t range;
u_int64_t last_id;
packet_t *last_keyframe;
public:
video_packetizer_c(void *, int, char *, double, int, int, int, int,

View File

@ -13,7 +13,7 @@
/*!
\file
\version \$Id: pr_generic.cpp,v 1.4 2003/02/27 19:51:53 mosu Exp $
\version \$Id: pr_generic.cpp,v 1.5 2003/02/28 13:01:29 mosu Exp $
\brief functions common for all readers/packetizers
\author Moritz Bunkus <moritz @ bunkus.org>
*/
@ -309,17 +309,18 @@ int cluster_helper_c::free_clusters() {
for (i = 0; i < num_clusters; i++) {
for (k = 0; k < clusters[i]->num_packets; k++) {
p = clusters[i]->packets[k];
if (!p->superseeded)
if (!p->superseeded) {
clusters[i]->is_referenced = 1;
if (p->bref == 0)
continue;
clstr = find_packet_cluster(p->bref);
if (clstr == NULL) {
fprintf(stderr, "Error: backward refenrece could not be resolved "
"(%llu).\n", p->bref);
die("internal error");
if (p->bref == 0)
continue;
clstr = find_packet_cluster(p->bref);
if (clstr == NULL) {
fprintf(stderr, "Error: backward refenrece could not be resolved "
"(%llu).\n", p->bref);
die("internal error");
}
clstr->is_referenced = 1;
}
clstr->is_referenced = 1;
}
}
@ -366,49 +367,20 @@ int cluster_helper_c::free_clusters() {
return 1;
}
int cluster_helper_c::free_ref(u_int64_t pid) {
int cluster_helper_c::free_ref(u_int64_t pid, void *source) {
int i, k;
packet_t *p;
int l;
p = find_packet(pid);
// fprintf(stdout, "> asked to prune %llu\n", pid);
assert(p != NULL);
free_ref_recursive(pid, p->source);
l = num_clusters;
for (i = 0; i < num_clusters; i++)
for (k = 0; k < clusters[i]->num_packets; k++) {
p = clusters[i]->packets[k];
if ((source == p->source) && (p->id <= pid))
p->superseeded = 1;
}
walk_clusters();
free_clusters();
walk_clusters();
fprintf(stdout, "freed %d of %d, new: %d\n", l - num_clusters, l,
num_clusters);
return 1;
}
int cluster_helper_c::free_ref_recursive(u_int64_t pid, void *source) {
int i, k;
packet_t *p;
if (clusters == NULL)
return 0;
for (i = 0; i < num_clusters; i++) {
if (!clusters[i]->rendered)
continue;
for (k = 0; k < clusters[i]->num_packets; k++) {
p = clusters[i]->packets[k];
if (p->bref == 0)
continue;
if ((source == p->source) && (p->bref <= pid)) {
// fprintf(stdout, ". cleaning %llu\n", p->id);
p->superseeded = 1;
p->bref = 0;
free_ref_recursive(p->id, source);
}
}
}
return 1;
}

View File

@ -13,7 +13,7 @@
/*!
\file
\version \$Id: pr_generic.h,v 1.7 2003/02/27 19:51:53 mosu Exp $
\version \$Id: pr_generic.h,v 1.8 2003/02/28 13:01:29 mosu Exp $
\brief class definition for the generic reader and packetizer
\author Moritz Bunkus <moritz @ bunkus.org>
*/
@ -59,7 +59,7 @@ public:
packet_t *get_packet(int num);
int get_packet_count();
int render(IOCallback *out);
int free_ref(u_int64_t pid);
int free_ref(u_int64_t pid, void *source);
int free_clusters();
int get_cluster_content_size();
@ -69,7 +69,6 @@ private:
packet_t *find_packet(u_int64_t pid);
void free_contents(ch_contents *clstr);
void check_clusters(int num);
int free_ref_recursive(u_int64_t pid, void *source);
};
extern cluster_helper_c *cluster_helper;

View File

@ -13,7 +13,7 @@
/*!
\file
\version \$Id: queue.cpp,v 1.6 2003/02/27 19:51:53 mosu Exp $
\version \$Id: queue.cpp,v 1.7 2003/02/28 13:01:29 mosu Exp $
\brief packet queueing class used by every packetizer
\author Moritz Bunkus <moritz @ bunkus.org>
*/
@ -66,6 +66,7 @@ u_int64_t q_c::add_packet(char *data, int length, u_int64_t timestamp,
qpage->pack = (packet_t *)malloc(sizeof(packet_t));
if (qpage->pack == NULL)
die("malloc");
memset(qpage->pack, 0, sizeof(packet_t));
qpage->pack->data = (char *)malloc(length);
if (qpage->pack->data == NULL)
die("malloc");

View File

@ -13,7 +13,7 @@
/*!
\file
\version \$Id: r_avi.cpp,v 1.10 2003/02/26 19:20:26 mosu Exp $
\version \$Id: r_avi.cpp,v 1.11 2003/02/28 13:01:29 mosu Exp $
\brief AVI demultiplexer module
\author Moritz Bunkus <moritz @ bunkus.org>
*/
@ -182,7 +182,7 @@ avi_reader_c::avi_reader_c(char *fname, unsigned char *astreams,
for (i = 0; i < strlen((char *)vstreams); i++) {
if (vstreams[i] > 1)
fprintf(stderr, "Warning: avi_reader: only one video stream per AVI " \
"is supported. Will not ignore -d %d.\n", vstreams[i]);
"is supported. Will ignore -d %d.\n", vstreams[i]);
else if (vstreams[i] == 1)
extract_video = 1;
}