From 5e10b74b787c8dac81e1465faafb9af99de4cae1 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 5 Feb 2015 21:54:19 +0100 Subject: demux_mkv: simplify realaudio handling Staring at the code, it doesn't look like the extra code for "normal" audio is needed. Most of it looks like artifacts from the previous code structure (much of it was added in the initial commit). I couldn't find a sample that uses this code path to fully confirm this, though. --- demux/demux_mkv.c | 47 +++++++++++++++++------------------------------ 1 file changed, 17 insertions(+), 30 deletions(-) (limited to 'demux/demux_mkv.c') diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index a39accda7b..4a3ef3a3ea 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -138,7 +138,6 @@ typedef struct mkv_track { unsigned char *audio_buf; ///< place to store reordered audio data double *audio_timestamp; ///< timestamp for each audio packet uint32_t sub_packet_cnt; ///< number of subpacket already received - int audio_filepos; ///< file position of first audio packet in block /* generic content encoding support */ mkv_content_encoding_t *encodings; @@ -1939,17 +1938,17 @@ static int demux_mkv_read_block_lacing(bstr *buffer, int *laces, return 1; } -static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, - bstr data, bool keyframe) +// Return whether the packet was handled & freed. +static bool handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, + struct demux_packet *orig) { - mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; uint32_t sps = track->sub_packet_size; uint32_t sph = track->sub_packet_h; uint32_t cfs = track->coded_framesize; // restricted to [1,0x40000000] uint32_t w = track->audiopk_size; uint32_t spc = track->sub_packet_cnt; - uint8_t *buffer = data.start; - uint32_t size = data.len; + uint8_t *buffer = orig->buffer; + uint32_t size = orig->len; demux_packet_t *dp; // track->audio_buf allocation size @@ -2026,10 +2025,8 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, break; } track->audio_timestamp[track->sub_packet_cnt] = - (track->ra_pts == mkv_d->last_pts) ? 0 : (mkv_d->last_pts); - track->ra_pts = mkv_d->last_pts; - if (track->sub_packet_cnt == 0) - track->audio_filepos = mkv_d->last_filepos; + track->ra_pts == orig->pts ? 0 : orig->pts; + track->ra_pts = orig->pts; if (++(track->sub_packet_cnt) == sph) { track->sub_packet_cnt = 0; // apk_usize has same range as coded_framesize in worst case @@ -2046,28 +2043,20 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track, * audio packets in file */ dp->pts = (x * apk_usize % w) ? MP_NOPTS_VALUE : track->audio_timestamp[x * apk_usize / w]; - dp->pos = track->audio_filepos; // all equal + dp->pos = orig->pos; dp->keyframe = !x; // Mark first packet as keyframe demux_add_packet(track->stream, dp); } } + talloc_free(orig); + return true; + error: + MP_ERR(demuxer, "RealAudio packet extraction or decryption error.\n"); + talloc_free(orig); + return true; } else { // Not a codec that requires reordering - dp = new_demux_packet_from(buffer, size); - if (!dp) - goto error; - if (track->ra_pts == mkv_d->last_pts && !mkv_d->a_skip_to_keyframe) - dp->pts = MP_NOPTS_VALUE; - else - dp->pts = mkv_d->last_pts; - track->ra_pts = mkv_d->last_pts; - - dp->pos = mkv_d->last_filepos; - dp->keyframe = keyframe; - demux_add_packet(track->stream, dp); + return false; } - return; -error: - MP_ERR(demuxer, "RealAudio packet extraction or decryption error.\n"); } static void mkv_seek_reset(demuxer_t *demuxer) @@ -2177,10 +2166,8 @@ static void mkv_parse_and_add_packet(demuxer_t *demuxer, mkv_track_t *track, struct sh_stream *stream = track->stream; if (track->realmedia && stream->type == STREAM_AUDIO) { - bstr block = {dp->buffer, dp->len}; - handle_realaudio(demuxer, track, block, dp->keyframe); - talloc_free(dp); - return; + if (handle_realaudio(demuxer, track, dp)) + return; } if (track->a_formattag == MP_FOURCC('W', 'V', 'P', 'K')) { -- cgit v1.2.3