From b9be20b529de8f47e795d9a869299548d8788528 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 7 Sep 2018 15:12:24 +0200 Subject: demux: return packets directly from demuxer instead of using sh_stream Preparation for other potential changes to separate demuxer cache/thread and actual demuxers. Most things are untested, but it seems to work somewhat. --- demux/demux_mkv.c | 52 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 14 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index a62057dfa0..4ffe804faf 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -210,6 +210,10 @@ typedef struct mkv_demuxer { // temporary data, and not normally larger than 0 or 1 elements. struct block_info *blocks; int num_blocks; + + // Packets to return. + struct demux_packet **packets; + int num_packets; } mkv_demuxer_t; #define OPT_BASE_STRUCT struct demux_mkv_opts @@ -256,6 +260,17 @@ static void probe_first_timestamp(struct demuxer *demuxer); static int read_next_block_into_queue(demuxer_t *demuxer); static void free_block(struct block_info *block); +static void add_packet(struct demuxer *demuxer, struct sh_stream *stream, + struct demux_packet *pkt) +{ + mkv_demuxer_t *mkv_d = demuxer->priv; + if (!pkt) + return; + + pkt->stream = stream->index; + MP_TARRAY_APPEND(mkv_d, mkv_d->packets, mkv_d->num_packets, pkt); +} + #define AAC_SYNC_EXTENSION_TYPE 0x02b7 static int aac_get_sample_rate_index(uint32_t sample_rate) { @@ -2312,7 +2327,7 @@ static bool handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, track->audio_timestamp[x * apk_usize / w]; dp->pos = orig->pos + x; dp->keyframe = !x; // Mark first packet as keyframe - demux_add_packet(track->stream, dp); + add_packet(demuxer, track->stream, dp); } } @@ -2337,6 +2352,10 @@ static void mkv_seek_reset(demuxer_t *demuxer) free_block(&mkv_d->blocks[n]); mkv_d->num_blocks = 0; + for (int n = 0; n < mkv_d->num_packets; n++) + talloc_free(mkv_d->packets[n]); + mkv_d->num_packets = 0; + mkv_d->skip_to_timecode = INT64_MIN; } @@ -2440,7 +2459,7 @@ static void mkv_parse_and_add_packet(demuxer_t *demuxer, mkv_track_t *track, if (new) { demux_packet_copy_attribs(new, dp); talloc_free(dp); - demux_add_packet(stream, new); + add_packet(demuxer, stream, new); return; } } @@ -2455,7 +2474,7 @@ static void mkv_parse_and_add_packet(demuxer_t *demuxer, mkv_track_t *track, memcpy(new->buffer + 8, dp->buffer, dp->len); demux_packet_copy_attribs(new, dp); talloc_free(dp); - demux_add_packet(stream, new); + add_packet(demuxer, stream, new); return; } } @@ -2469,7 +2488,7 @@ static void mkv_parse_and_add_packet(demuxer_t *demuxer, mkv_track_t *track, } if (!track->parse || !track->av_parser || !track->av_parser_codec) { - demux_add_packet(stream, dp); + add_packet(demuxer, stream, dp); return; } @@ -2503,13 +2522,13 @@ static void mkv_parse_and_add_packet(demuxer_t *demuxer, mkv_track_t *track, new->dts = track->av_parser->dts == AV_NOPTS_VALUE ? MP_NOPTS_VALUE : track->av_parser->dts / tb; } - demux_add_packet(stream, new); + add_packet(demuxer, stream, new); } pts = dts = AV_NOPTS_VALUE; } if (dp->len) { - demux_add_packet(stream, dp); + add_packet(demuxer, stream, dp); } else { talloc_free(dp); } @@ -2897,19 +2916,26 @@ static int read_next_block(demuxer_t *demuxer, struct block_info *block) return 1; } -static int demux_mkv_fill_buffer(demuxer_t *demuxer) +static bool demux_mkv_read_packet(struct demuxer *demuxer, + struct demux_packet **pkt) { + struct mkv_demuxer *mkv_d = demuxer->priv; + for (;;) { + if (mkv_d->num_packets) { + *pkt = mkv_d->packets[0]; + MP_TARRAY_REMOVE_AT(mkv_d->packets, mkv_d->num_packets, 0); + return true; + } + int res; struct block_info block; res = read_next_block(demuxer, &block); if (res < 0) - return 0; + return false; if (res > 0) { - res = handle_block(demuxer, &block); + handle_block(demuxer, &block); free_block(&block); - if (res > 0) - return 1; } } } @@ -3130,8 +3156,6 @@ static void demux_mkv_seek(demuxer_t *demuxer, double seek_pts, int flags) mkv_d->v_skip_to_keyframe = st_active[STREAM_VIDEO]; mkv_d->a_skip_to_keyframe = st_active[STREAM_AUDIO]; mkv_d->a_skip_preroll = mkv_d->a_skip_to_keyframe; - - demux_mkv_fill_buffer(demuxer); } static void probe_last_timestamp(struct demuxer *demuxer, int64_t start_pos) @@ -3238,7 +3262,7 @@ const demuxer_desc_t demuxer_desc_matroska = { .name = "mkv", .desc = "Matroska", .open = demux_mkv_open, - .fill_buffer = demux_mkv_fill_buffer, + .read_packet = demux_mkv_read_packet, .close = mkv_free, .seek = demux_mkv_seek, .load_timeline = build_ordered_chapter_timeline, -- cgit v1.2.3