From 70502c11bb15f73c5c2ec0c7d04f60ee8ffffbec Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Fri, 28 Feb 2003 13:01:29 +0000 Subject: [PATCH] Even more improved cluster caching/freeing system. --- p_pcm.h | 4 +-- p_video.cpp | 11 +++------ p_video.h | 3 +-- pr_generic.cpp | 66 +++++++++++++++----------------------------------- pr_generic.h | 5 ++-- queue.cpp | 3 ++- r_avi.cpp | 4 +-- 7 files changed, 31 insertions(+), 65 deletions(-) diff --git a/p_pcm.h b/p_pcm.h index 40466ed5c..7665da8f0 100644 --- a/p_pcm.h +++ b/p_pcm.h @@ -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 */ @@ -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; diff --git a/p_video.cpp b/p_video.cpp index 20085544c..92eabab8a 100644 --- a/p_video.cpp +++ b/p_video.cpp @@ -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 */ @@ -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); } } diff --git a/p_video.h b/p_video.h index c8b66159c..e7be0c96b 100644 --- a/p_video.h +++ b/p_video.h @@ -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 */ @@ -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, diff --git a/pr_generic.cpp b/pr_generic.cpp index 4eaad014d..236035376 100644 --- a/pr_generic.cpp +++ b/pr_generic.cpp @@ -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 */ @@ -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; } diff --git a/pr_generic.h b/pr_generic.h index fd1324d41..b4d08a7da 100644 --- a/pr_generic.h +++ b/pr_generic.h @@ -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 */ @@ -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; diff --git a/queue.cpp b/queue.cpp index bc1800643..b974ac348 100644 --- a/queue.cpp +++ b/queue.cpp @@ -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 */ @@ -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"); diff --git a/r_avi.cpp b/r_avi.cpp index 2a25dc56d..d6ec94968 100644 --- a/r_avi.cpp +++ b/r_avi.cpp @@ -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 */ @@ -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; }