int no_resync_search;
int export_xmp;
+
+ int uses_std_ecc;
} ASFContext;
static const AVOption options[] = {
if (sizeX > 40) {
st->codec->extradata_size = ffio_limit(pb, sizeX - 40);
st->codec->extradata = av_mallocz(st->codec->extradata_size +
- FF_INPUT_BUFFER_PADDING_SIZE);
+ AV_INPUT_BUFFER_PADDING_SIZE);
if (!st->codec->extradata)
return AVERROR(ENOMEM);
avio_read(pb, st->codec->extradata, st->codec->extradata_size);
int rsize = 8;
int c, d, e, off;
- // if we do not know packet size, allow skipping up to 32 kB
- off = 32768;
- if (asf->no_resync_search)
- off = 3;
- else if (s->packet_size > 0)
- off = (avio_tell(pb) - s->internal->data_offset) % s->packet_size + 3;
-
- c = d = e = -1;
- while (off-- > 0) {
- c = d;
- d = e;
- e = avio_r8(pb);
- if (c == 0x82 && !d && !e)
- break;
- }
+ if (asf->uses_std_ecc > 0) {
+ // if we do not know packet size, allow skipping up to 32 kB
+ off = 32768;
+ if (asf->no_resync_search)
+ off = 3;
+// else if (s->packet_size > 0 && !asf->uses_std_ecc)
+// off = (avio_tell(pb) - s->internal->data_offset) % s->packet_size + 3;
+
+ c = d = e = -1;
+ while (off-- > 0) {
+ c = d;
+ d = e;
+ e = avio_r8(pb);
+ if (c == 0x82 && !d && !e)
+ break;
+ }
- if (c != 0x82) {
- /* This code allows handling of -EAGAIN at packet boundaries (i.e.
- * if the packet sync code above triggers -EAGAIN). This does not
- * imply complete -EAGAIN handling support at random positions in
- * the stream. */
- if (pb->error == AVERROR(EAGAIN))
- return AVERROR(EAGAIN);
- if (!avio_feof(pb))
- av_log(s, AV_LOG_ERROR,
- "ff asf bad header %x at:%"PRId64"\n", c, avio_tell(pb));
- }
- if ((c & 0x8f) == 0x82) {
- if (d || e) {
+ if (c != 0x82) {
+ /* This code allows handling of -EAGAIN at packet boundaries (i.e.
+ * if the packet sync code above triggers -EAGAIN). This does not
+ * imply complete -EAGAIN handling support at random positions in
+ * the stream. */
+ if (pb->error == AVERROR(EAGAIN))
+ return AVERROR(EAGAIN);
if (!avio_feof(pb))
- av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");
- return AVERROR_INVALIDDATA;
+ av_log(s, AV_LOG_ERROR,
+ "ff asf bad header %x at:%"PRId64"\n", c, avio_tell(pb));
}
- c = avio_r8(pb);
- d = avio_r8(pb);
- rsize += 3;
- } else if(!avio_feof(pb)) {
- avio_seek(pb, -1, SEEK_CUR); // FIXME
+ if ((c & 0x8f) == 0x82) {
+ if (d || e) {
+ if (!avio_feof(pb))
+ av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");
+ return AVERROR_INVALIDDATA;
+ }
+ c = avio_r8(pb);
+ d = avio_r8(pb);
+ rsize += 3;
+ } else if(!avio_feof(pb)) {
+ avio_seek(pb, -1, SEEK_CUR); // FIXME
+ }
+ } else {
+ c = avio_r8(pb);
+ if (c & 0x80) {
+ rsize ++;
+ if (!(c & 0x60)) {
+ d = avio_r8(pb);
+ e = avio_r8(pb);
+ avio_seek(pb, (c & 0xF) - 2, SEEK_CUR);
+ rsize += c & 0xF;
+ }
+
+ if (c != 0x82)
+ avpriv_request_sample(s, "Invalid ECC byte\n");
+
+ if (!asf->uses_std_ecc)
+ asf->uses_std_ecc = (c == 0x82 && !d && !e) ? 1 : -1;
+
+ c = avio_r8(pb);
+ } else
+ asf->uses_std_ecc = -1;
+ d = avio_r8(pb);
}
asf->packet_flags = c;
} else {
/* packet descrambling */
AVBufferRef *buf = av_buffer_alloc(asf_st->pkt.size +
- FF_INPUT_BUFFER_PADDING_SIZE);
+ AV_INPUT_BUFFER_PADDING_SIZE);
if (buf) {
uint8_t *newdata = buf->data;
int offset = 0;
memset(newdata + asf_st->pkt.size, 0,
- FF_INPUT_BUFFER_PADDING_SIZE);
+ AV_INPUT_BUFFER_PADDING_SIZE);
while (offset < asf_st->pkt.size) {
int off = offset / asf_st->ds_chunk_size;
int row = off / asf_st->ds_span;