|
|
@@ -26,6 +26,7 @@ |
|
|
|
#include "libavutil/avstring.h" |
|
|
|
#include "libavutil/dict.h" |
|
|
|
#include "libavutil/mathematics.h" |
|
|
|
#include "libavutil/opt.h" |
|
|
|
#include "avformat.h" |
|
|
|
#include "internal.h" |
|
|
|
#include "avio_internal.h" |
|
|
@@ -35,6 +36,7 @@ |
|
|
|
#include "avlanguage.h" |
|
|
|
|
|
|
|
typedef struct { |
|
|
|
const AVClass *class; |
|
|
|
int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID |
|
|
|
ASFStream streams[128]; ///< it's max number and it's not that big |
|
|
|
uint32_t stream_bitrates[128]; ///< max number of streams, bitrate for each (for streaming) |
|
|
@@ -72,8 +74,22 @@ typedef struct { |
|
|
|
int stream_index; |
|
|
|
|
|
|
|
ASFStream* asf_st; ///< currently decoded stream |
|
|
|
|
|
|
|
int no_resync_search; |
|
|
|
} ASFContext; |
|
|
|
|
|
|
|
static const AVOption options[] = { |
|
|
|
{"no_resync_search", "Don't try to resynchronize by looking for a certain optional start code", offsetof(ASFContext, no_resync_search), AV_OPT_TYPE_INT, {.dbl = 0}, 0, 1, AV_OPT_FLAG_DECODING_PARAM }, |
|
|
|
{ NULL }, |
|
|
|
}; |
|
|
|
|
|
|
|
static const AVClass asf_class = { |
|
|
|
.class_name = "asf demuxer", |
|
|
|
.item_name = av_default_item_name, |
|
|
|
.option = options, |
|
|
|
.version = LIBAVUTIL_VERSION_INT, |
|
|
|
}; |
|
|
|
|
|
|
|
#undef NDEBUG |
|
|
|
#include <assert.h> |
|
|
|
|
|
|
@@ -709,7 +725,9 @@ static int ff_asf_get_packet(AVFormatContext *s, AVIOContext *pb) |
|
|
|
|
|
|
|
// if we do not know packet size, allow skipping up to 32 kB |
|
|
|
off= 32768; |
|
|
|
if (s->packet_size > 0) |
|
|
|
if (asf->no_resync_search) |
|
|
|
off = 3; |
|
|
|
else if (s->packet_size > 0) |
|
|
|
off= (avio_tell(pb) - s->data_offset) % s->packet_size + 3; |
|
|
|
|
|
|
|
c=d=e=-1; |
|
|
@@ -1293,4 +1311,5 @@ AVInputFormat ff_asf_demuxer = { |
|
|
|
.read_seek = asf_read_seek, |
|
|
|
.read_timestamp = asf_read_pts, |
|
|
|
.flags = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH, |
|
|
|
.priv_class = &asf_class, |
|
|
|
}; |