mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2025-02-26 08:22:31 +00:00
Even more improved cluster caching/freeing system.
This commit is contained in:
parent
1d615475f2
commit
70502c11bb
4
p_pcm.h
4
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 <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;
|
||||
|
11
p_video.cpp
11
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 <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);
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user