1
0
Fork 0

matroskadec_haali: implement support for DiscardPadding

This commit is contained in:
Hendrik Leppkes 2013-11-29 22:54:13 +01:00
parent c304388bfa
commit 018aa81f83
Signed by: hendrik
GPG Key ID: 846079A4B0A7C1B5
3 changed files with 35 additions and 3 deletions

View File

@ -117,6 +117,8 @@ struct QueueEntry {
ulonglong End;
ulonglong Position;
longlong DiscardPadding;
unsigned int flags;
};
@ -2161,6 +2163,7 @@ static void parseBlockAdditions(MatroskaFile *mf, ulonglong toplen, ulonglong ti
qe->Data = (char *)add_data;
qe->flags = FRAME_UNKNOWN_START | FRAME_UNKNOWN_END |
(((unsigned)add_id << FRAME_STREAM_SHIFT) & FRAME_STREAM_MASK);
qe->DiscardPadding = 0;
QPut(&mf->Queues[track],qe);
} else if(add_data) {
@ -2174,6 +2177,7 @@ static void parseBlockGroup(MatroskaFile *mf,ulonglong toplen,ulonglong timecode
ulonglong v;
ulonglong duration = 0;
ulonglong dpos;
longlong discard = 0;
struct QueueEntry *qe,*qf = NULL;
unsigned char have_duration = 0, have_block = 0;
unsigned char gap = 0;
@ -2297,6 +2301,7 @@ found:
qe->flags |= FRAME_GAP;
if (i > 0)
qe->flags |= FRAME_UNKNOWN_START;
qe->DiscardPadding = 0;
QPut(&mf->Queues[tracknum],qe);
@ -2322,6 +2327,9 @@ found:
else
skipbytes(mf, len);
break;
case 0x75a2: // DiscardPadding
discard = readSInt(mf,(unsigned)len);
break;
ENDFOR(mf);
out:
@ -2365,6 +2373,7 @@ out:
qf->End = qf->Start + mf->Tracks[tracknum]->DefaultDuration;
qf->flags &= ~FRAME_UNKNOWN_END;
}
qf->DiscardPadding = discard;
}
if (ref)
@ -3339,7 +3348,7 @@ int mkv_ReadFrame(MatroskaFile *mf,
ulonglong mask,unsigned int *track,
ulonglong *StartTime,ulonglong *EndTime,
ulonglong *FilePos,unsigned int *FrameSize,
char **FrameData,unsigned int *FrameFlags)
char **FrameData,unsigned int *FrameFlags, longlong *FrameDiscard)
{
unsigned int i,j;
struct QueueEntry *qe;
@ -3371,6 +3380,7 @@ int mkv_ReadFrame(MatroskaFile *mf,
*FrameSize = qe->Length;
*FrameData = qe->Data;
*FrameFlags = qe->flags;
*FrameDiscard = qe->DiscardPadding;
qe->Data = NULL;
QFree(mf,qe);

View File

@ -383,7 +383,8 @@ X int mkv_ReadFrame(/* in */ MatroskaFile *mf,
/* out */ ulonglong *FilePos /* in bytes from start of file */,
/* out */ unsigned int *FrameSize /* in bytes */,
/* out */ char **FrameData,
/* out */ unsigned int *FrameFlags);
/* out */ unsigned int *FrameFlags,
/* out */ longlong *FrameDiscard);
#ifdef MATROSKA_COMPRESSION_SUPPORT
/* Compressed streams support */

View File

@ -1443,6 +1443,7 @@ static int mkv_read_packet(AVFormatContext *s, AVPacket *pkt)
int ret;
unsigned int size, flags, track_num;
ulonglong start_time, end_time, pos;
longlong discard_padding;
MatroskaTrack *track;
char *frame_data = NULL;
@ -1456,7 +1457,7 @@ static int mkv_read_packet(AVFormatContext *s, AVPacket *pkt)
}
again:
ret = mkv_ReadFrame(ctx->matroska, mask, &track_num, &start_time, &end_time, &pos, &size, &frame_data, &flags);
ret = mkv_ReadFrame(ctx->matroska, mask, &track_num, &start_time, &end_time, &pos, &size, &frame_data, &flags, &discard_padding);
if (ctx->virtual_timeline) {
if (ret < 0)
ret = mkv_packet_timeline_update(s, 0, 0, FRAME_EOF);
@ -1547,6 +1548,26 @@ again:
track->refresh_extradata = 0;
}
if (discard_padding) {
uint8_t *side_data = av_packet_new_side_data(pkt,
AV_PKT_DATA_SKIP_SAMPLES,
10);
if(side_data == NULL) {
av_free_packet(pkt);
return AVERROR(ENOMEM);
}
discard_padding = av_rescale_q(discard_padding,
(AVRational){1, 1000000000},
(AVRational){1, track->stream->codec->sample_rate});
if (discard_padding > 0) {
AV_WL32(side_data, 0);
AV_WL32(side_data + 4, discard_padding);
} else {
AV_WL32(side_data, -discard_padding);
AV_WL32(side_data + 4, 0);
}
}
if (!(flags & FRAME_UNKNOWN_START)) {
if (track->ms_compat)
pkt->dts = start_time - track->info->CodecDelay;