|
|
|
@ -721,7 +721,7 @@ matroska_ebmlnum_sint (uint8_t *data, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
static MatroskaTrack * |
|
|
|
|
matroska_find_track_by_num (MatroskaDemuxContext *matroska, |
|
|
|
|
int num) |
|
|
|
|
{ |
|
|
|
@ -729,9 +729,10 @@ matroska_find_track_by_num (MatroskaDemuxContext *matroska, |
|
|
|
|
|
|
|
|
|
for (i = 0; i < matroska->num_tracks; i++) |
|
|
|
|
if (matroska->tracks[i]->num == num) |
|
|
|
|
return i; |
|
|
|
|
return matroska->tracks[i]; |
|
|
|
|
|
|
|
|
|
return -1; |
|
|
|
|
av_log(matroska->ctx, AV_LOG_ERROR, "Invalid track number %d\n", num); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2745,14 +2746,13 @@ matroska_read_header (AVFormatContext *s, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (matroska->index_parsed) { |
|
|
|
|
int i, track, stream; |
|
|
|
|
int i; |
|
|
|
|
for (i=0; i<matroska->num_indexes; i++) { |
|
|
|
|
MatroskaDemuxIndex *idx = &matroska->index[i]; |
|
|
|
|
track = matroska_find_track_by_num(matroska, idx->track); |
|
|
|
|
if (track < 0) continue; |
|
|
|
|
stream = matroska->tracks[track]->stream->index; |
|
|
|
|
if (stream >= 0 && stream < matroska->ctx->nb_streams) |
|
|
|
|
av_add_index_entry(matroska->ctx->streams[stream], |
|
|
|
|
MatroskaTrack *track = matroska_find_track_by_num(matroska, |
|
|
|
|
idx->track); |
|
|
|
|
if (track && track->stream) |
|
|
|
|
av_add_index_entry(track->stream, |
|
|
|
|
idx->pos, idx->time/AV_TIME_BASE, |
|
|
|
|
0, 0, AVINDEX_KEYFRAME); |
|
|
|
|
} |
|
|
|
@ -2766,8 +2766,8 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, |
|
|
|
|
int64_t pos, uint64_t cluster_time, uint64_t duration, |
|
|
|
|
int is_keyframe) |
|
|
|
|
{ |
|
|
|
|
MatroskaTrack *track; |
|
|
|
|
int res = 0; |
|
|
|
|
int track; |
|
|
|
|
AVStream *st; |
|
|
|
|
AVPacket *pkt; |
|
|
|
|
uint8_t *origdata = data; |
|
|
|
@ -2787,19 +2787,19 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, |
|
|
|
|
|
|
|
|
|
/* fetch track from num */ |
|
|
|
|
track = matroska_find_track_by_num(matroska, num); |
|
|
|
|
if (size <= 3 || track < 0 || track >= matroska->num_tracks) { |
|
|
|
|
if (size <= 3 || !track || !track->stream) { |
|
|
|
|
av_log(matroska->ctx, AV_LOG_INFO, |
|
|
|
|
"Invalid stream %d or size %u\n", track, size); |
|
|
|
|
"Invalid stream %"PRIu64" or size %u\n", num, size); |
|
|
|
|
av_free(origdata); |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
st = matroska->tracks[track]->stream; |
|
|
|
|
st = track->stream; |
|
|
|
|
if (st->discard >= AVDISCARD_ALL) { |
|
|
|
|
av_free(origdata); |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
if (duration == AV_NOPTS_VALUE) |
|
|
|
|
duration = matroska->tracks[track]->default_duration / matroska->time_scale; |
|
|
|
|
duration = track->default_duration / matroska->time_scale; |
|
|
|
|
|
|
|
|
|
/* block_time (relative to cluster time) */ |
|
|
|
|
block_time = AV_RB16(data); |
|
|
|
@ -2904,7 +2904,7 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, |
|
|
|
|
if (st->codec->codec_id == CODEC_ID_RA_288 || |
|
|
|
|
st->codec->codec_id == CODEC_ID_COOK || |
|
|
|
|
st->codec->codec_id == CODEC_ID_ATRAC3) { |
|
|
|
|
MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)matroska->tracks[track]; |
|
|
|
|
MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track; |
|
|
|
|
int a = st->codec->block_align; |
|
|
|
|
int sps = audiotrack->sub_packet_size; |
|
|
|
|
int cfs = audiotrack->coded_framesize; |
|
|
|
@ -2940,9 +2940,9 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, |
|
|
|
|
int offset = 0, pkt_size = lace_size[n]; |
|
|
|
|
uint8_t *pkt_data = data; |
|
|
|
|
|
|
|
|
|
if (matroska->tracks[track]->encoding_scope & 1) { |
|
|
|
|
if (track->encoding_scope & 1) { |
|
|
|
|
offset = matroska_decode_buffer(&pkt_data, &pkt_size, |
|
|
|
|
matroska->tracks[track]); |
|
|
|
|
track); |
|
|
|
|
if (offset < 0) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -2956,7 +2956,7 @@ matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size, |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (offset) |
|
|
|
|
memcpy (pkt->data, matroska->tracks[track]->encoding_settings, offset); |
|
|
|
|
memcpy (pkt->data, track->encoding_settings, offset); |
|
|
|
|
memcpy (pkt->data+offset, pkt_data, pkt_size); |
|
|
|
|
|
|
|
|
|
if (pkt_data != data) |
|
|
|
|