|
|
|
@ -449,24 +449,26 @@ static int oma_read_seek(struct AVFormatContext *s, |
|
|
|
|
int stream_index, int64_t timestamp, int flags) |
|
|
|
|
{ |
|
|
|
|
OMAContext *oc = s->priv_data; |
|
|
|
|
|
|
|
|
|
ff_pcm_read_seek(s, stream_index, timestamp, flags); |
|
|
|
|
|
|
|
|
|
if (oc->encrypted) { |
|
|
|
|
/* readjust IV for CBC */ |
|
|
|
|
int64_t pos = avio_tell(s->pb); |
|
|
|
|
if (pos < oc->content_start) |
|
|
|
|
memset(oc->iv, 0, 8); |
|
|
|
|
else { |
|
|
|
|
if (avio_seek(s->pb, -8, SEEK_CUR) < 0 || |
|
|
|
|
avio_read(s->pb, oc->iv, 8) < 8) { |
|
|
|
|
memset(oc->iv, 0, 8); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
int err = ff_pcm_read_seek(s, stream_index, timestamp, flags); |
|
|
|
|
|
|
|
|
|
if (!oc->encrypted) |
|
|
|
|
return err; |
|
|
|
|
|
|
|
|
|
/* readjust IV for CBC */ |
|
|
|
|
if (err || avio_tell(s->pb) < oc->content_start) |
|
|
|
|
goto wipe; |
|
|
|
|
if ((err = avio_seek(s->pb, -8, SEEK_CUR)) < 0) |
|
|
|
|
goto wipe; |
|
|
|
|
if ((err = avio_read(s->pb, oc->iv, 8)) < 8) { |
|
|
|
|
if (err >= 0) |
|
|
|
|
err = AVERROR_EOF; |
|
|
|
|
goto wipe; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
wipe: |
|
|
|
|
memset(oc->iv, 0, 8); |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
AVInputFormat ff_oma_demuxer = { |
|
|
|
|