1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-07 07:31:48 +00:00

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.
This commit is contained in:
wm4 2015-02-05 21:54:19 +01:00
parent e68f4be17a
commit 5e10b74b78

View File

@ -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')) {