From e4221f318936aa970eeb1d220d8deae95fb91d98 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 5 Jul 2014 16:45:12 +0200 Subject: demux: move packet list functions Move them to the only place where they are used, demux_subreader.c. --- demux/demux.c | 66 ------------------------------------------------- demux/demux.h | 7 ------ demux/demux_subreader.c | 49 ++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 73 deletions(-) (limited to 'demux') diff --git a/demux/demux.c b/demux/demux.c index 2c47bcefe3..f2310d2aa7 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -957,69 +957,3 @@ int demuxer_set_angle(demuxer_t *demuxer, int angle) return angle; } - -static int packet_sort_compare(const void *p1, const void *p2) -{ - struct demux_packet *c1 = *(struct demux_packet **)p1; - struct demux_packet *c2 = *(struct demux_packet **)p2; - - if (c1->pts > c2->pts) - return 1; - else if (c1->pts < c2->pts) - return -1; - return 0; -} - -void demux_packet_list_sort(struct demux_packet **pkts, int num_pkts) -{ - qsort(pkts, num_pkts, sizeof(struct demux_packet *), packet_sort_compare); -} - -void demux_packet_list_seek(struct demux_packet **pkts, int num_pkts, - int *current, float rel_seek_secs, int flags) -{ - double ref_time = 0; - if (*current >= 0 && *current < num_pkts) { - ref_time = pkts[*current]->pts; - } else if (*current == num_pkts && num_pkts > 0) { - ref_time = pkts[num_pkts - 1]->pts + pkts[num_pkts - 1]->duration; - } - - if (flags & SEEK_ABSOLUTE) - ref_time = 0; - - if (flags & SEEK_FACTOR) { - ref_time += demux_packet_list_duration(pkts, num_pkts) * rel_seek_secs; - } else { - ref_time += rel_seek_secs; - } - - // Could do binary search, but it's probably not worth the complexity. - int last_index = 0; - for (int n = 0; n < num_pkts; n++) { - if (pkts[n]->pts > ref_time) - break; - last_index = n; - } - *current = last_index; -} - -double demux_packet_list_duration(struct demux_packet **pkts, int num_pkts) -{ - if (num_pkts > 0) - return pkts[num_pkts - 1]->pts + pkts[num_pkts - 1]->duration; - return 0; -} - -struct demux_packet *demux_packet_list_fill(struct demux_packet **pkts, - int num_pkts, int *current) -{ - if (*current < 0) - *current = 0; - if (*current >= num_pkts) - return NULL; - struct demux_packet *new = talloc(NULL, struct demux_packet); - *new = *pkts[*current]; - *current += 1; - return new; -} diff --git a/demux/demux.h b/demux/demux.h index 641afe6908..fce46faf31 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -280,13 +280,6 @@ struct sh_stream *demuxer_stream_by_demuxer_id(struct demuxer *d, bool demuxer_stream_is_selected(struct demuxer *d, struct sh_stream *stream); bool demuxer_stream_has_packets_queued(struct demuxer *d, struct sh_stream *stream); -void demux_packet_list_sort(struct demux_packet **pkts, int num_pkts); -void demux_packet_list_seek(struct demux_packet **pkts, int num_pkts, - int *current, float rel_seek_secs, int flags); -double demux_packet_list_duration(struct demux_packet **pkts, int num_pkts); -struct demux_packet *demux_packet_list_fill(struct demux_packet **pkts, - int num_pkts, int *current); - bool demux_matroska_uid_cmp(struct matroska_segment_uid *a, struct matroska_segment_uid *b); diff --git a/demux/demux_subreader.c b/demux/demux_subreader.c index 6eb58f0033..89e9645f0e 100644 --- a/demux/demux_subreader.c +++ b/demux/demux_subreader.c @@ -111,6 +111,55 @@ struct readline_args { /* Maximal length of line of a subtitle */ #define LINE_LEN 1000 +static double demux_packet_list_duration(struct demux_packet **pkts, int num_pkts) +{ + if (num_pkts > 0) + return pkts[num_pkts - 1]->pts + pkts[num_pkts - 1]->duration; + return 0; +} + +static void demux_packet_list_seek(struct demux_packet **pkts, int num_pkts, + int *current, float rel_seek_secs, int flags) +{ + double ref_time = 0; + if (*current >= 0 && *current < num_pkts) { + ref_time = pkts[*current]->pts; + } else if (*current == num_pkts && num_pkts > 0) { + ref_time = pkts[num_pkts - 1]->pts + pkts[num_pkts - 1]->duration; + } + + if (flags & SEEK_ABSOLUTE) + ref_time = 0; + + if (flags & SEEK_FACTOR) { + ref_time += demux_packet_list_duration(pkts, num_pkts) * rel_seek_secs; + } else { + ref_time += rel_seek_secs; + } + + // Could do binary search, but it's probably not worth the complexity. + int last_index = 0; + for (int n = 0; n < num_pkts; n++) { + if (pkts[n]->pts > ref_time) + break; + last_index = n; + } + *current = last_index; +} + +static struct demux_packet *demux_packet_list_fill(struct demux_packet **pkts, + int num_pkts, int *current) +{ + if (*current < 0) + *current = 0; + if (*current >= num_pkts) + return NULL; + struct demux_packet *new = talloc(NULL, struct demux_packet); + *new = *pkts[*current]; + *current += 1; + return new; +} + static int eol(char p) { return p=='\r' || p=='\n' || p=='\0'; } -- cgit v1.2.3