static int detect_unknown_subobject(AVFormatContext *s, int64_t offset, int64_t size);
static const GUIDParseTable *find_guid(ff_asf_guid guid);
-static int asf_probe(AVProbeData *pd)
+static int asf_probe(const AVProbeData *pd)
{
/* check file header */
if (!ff_guidcmp(pd->buf, &ff_asf_header))
* but in reality this is only loosely similar */
static int asf_read_picture(AVFormatContext *s, int len)
{
- ASFContext *asf = s->priv_data;
AVPacket pkt = { 0 };
const CodecMime *mime = ff_id3v2_mime_tags;
enum AVCodecID id = AV_CODEC_ID_NONE;
uint8_t *desc = NULL;
AVStream *st = NULL;
int ret, type, picsize, desc_len;
- ASFStream *asf_st;
/* type + picsize + mime + desc */
if (len < 1 + 4 + 2 + 2) {
ret = AVERROR(ENOMEM);
goto fail;
}
- asf->asf_st[asf->nb_streams] = av_mallocz(sizeof(*asf_st));
- asf_st = asf->asf_st[asf->nb_streams];
- if (!asf_st) {
- ret = AVERROR(ENOMEM);
- goto fail;
- }
st->disposition |= AV_DISPOSITION_ATTACHED_PIC;
- st->codecpar->codec_type = asf_st->type = AVMEDIA_TYPE_VIDEO;
+ st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
st->codecpar->codec_id = id;
st->attached_pic = pkt;
- st->attached_pic.stream_index = asf_st->index = st->index;
+ st->attached_pic.stream_index = st->index;
st->attached_pic.flags |= AV_PKT_FLAG_KEY;
- asf->nb_streams++;
-
if (*desc) {
if (av_dict_set(&st->metadata, "title", desc, AV_DICT_DONT_STRDUP_VAL) < 0)
av_log(s, AV_LOG_WARNING, "av_dict_set failed.\n");
ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta, len);
if (id3v2_extra_meta) {
- ff_id3v2_parse_apic(s, &id3v2_extra_meta);
- ff_id3v2_parse_chapters(s, &id3v2_extra_meta);
+ ff_id3v2_parse_apic(s, id3v2_extra_meta);
+ ff_id3v2_parse_chapters(s, id3v2_extra_meta);
}
ff_id3v2_free_extra_meta(&id3v2_extra_meta);
}
} else {
if (st_num < ASF_MAX_STREAMS) {
if ((ret = process_metadata(s, name, name_len, val_len, type,
- &asf->asf_sd[st_num].asf_met)) < 0) {
+ st_num ? &asf->asf_sd[st_num].asf_met
+ : &s->metadata)) < 0) {
av_freep(&name);
break;
}
st->codecpar->codec_id = ff_codec_get_id(ff_codec_bmp_tags, tag);
size_bmp = FFMAX(size_asf, size_bmp);
- if (size_bmp > BMP_HEADER_SIZE) {
+ if (size_bmp > BMP_HEADER_SIZE &&
+ size_bmp < INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
int ret;
st->codecpar->extradata_size = size_bmp - BMP_HEADER_SIZE;
if (!(st->codecpar->extradata = av_malloc(st->codecpar->extradata_size +
asf_pkt->duration = 0;
asf_pkt->flags = 0;
asf_pkt->dts = 0;
- asf_pkt->duration = 0;
av_packet_unref(&asf_pkt->avpkt);
- av_init_packet(&asf_pkt->avpkt);
}
static int asf_read_replicated_data(AVFormatContext *s, ASFPacket *asf_pkt)
} else
avio_skip(pb, 4); // reading of media object size is already done
asf_pkt->dts = avio_rl32(pb); // read presentation time
- if (asf->rep_data_len && (asf->rep_data_len >= 8))
+ if (asf->rep_data_len >= 8)
avio_skip(pb, asf->rep_data_len - 8); // skip replicated data
return 0;
asf->sub_dts = 0;
for (i = 0; i < asf->nb_streams; i++) {
ASFPacket *pkt = &asf->asf_st[i]->pkt;
- pkt->size_left = 0;
- pkt->data_size = 0;
- pkt->duration = 0;
- pkt->flags = 0;
- pkt->dts = 0;
- pkt->duration = 0;
- av_packet_unref(&pkt->avpkt);
- av_init_packet(&pkt->avpkt);
+ reset_packet(pkt);
}
}
ASFContext *asf = s->priv_data;
int idx, ret;
- if (s->streams[stream_index]->nb_index_entries && asf->is_simple_index) {
+ if (s->streams[stream_index]->internal->nb_index_entries && asf->is_simple_index) {
idx = av_index_search_timestamp(s->streams[stream_index], timestamp, flags);
- if (idx < 0 || idx >= s->streams[stream_index]->nb_index_entries)
+ if (idx < 0 || idx >= s->streams[stream_index]->internal->nb_index_entries)
return AVERROR_INVALIDDATA;
- avio_seek(s->pb, s->streams[stream_index]->index_entries[idx].pos, SEEK_SET);
+ avio_seek(s->pb, s->streams[stream_index]->internal->index_entries[idx].pos, SEEK_SET);
} else {
if ((ret = ff_seek_frame_binary(s, stream_index, timestamp, flags)) < 0)
return ret;