support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
Originally committed as revision 9428 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
05d00e953f
commit
620d1d7878
@ -289,7 +289,8 @@ static int aiff_probe(AVProbeData *p)
|
||||
static int aiff_read_header(AVFormatContext *s,
|
||||
AVFormatParameters *ap)
|
||||
{
|
||||
int size, filesize, offset;
|
||||
int size, filesize;
|
||||
offset_t offset = 0;
|
||||
uint32_t tag;
|
||||
unsigned version = AIFF_C_VERSION1;
|
||||
ByteIOContext *pb = &s->pb;
|
||||
@ -327,6 +328,8 @@ static int aiff_read_header(AVFormatContext *s,
|
||||
st->nb_frames = get_aiff_header (pb, st->codec, size, version);
|
||||
if (st->nb_frames < 0)
|
||||
return st->nb_frames;
|
||||
if (offset > 0) // COMM is after SSND
|
||||
goto got_sound;
|
||||
break;
|
||||
|
||||
case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */
|
||||
@ -352,7 +355,15 @@ static int aiff_read_header(AVFormatContext *s,
|
||||
case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */
|
||||
get_be32(pb); /* Block align... don't care */
|
||||
offset = get_be32(pb); /* Offset of sound data */
|
||||
goto got_sound;
|
||||
offset += url_ftell(pb); /* Compute absolute data offset */
|
||||
if (st->codec->codec_id) /* Assume COMM already parsed */
|
||||
goto got_sound;
|
||||
if (url_is_streamed(pb)) {
|
||||
av_log(s, AV_LOG_ERROR, "file is not seekable\n");
|
||||
return -1;
|
||||
}
|
||||
url_fskip(pb, size - 8);
|
||||
break;
|
||||
|
||||
default: /* Jump */
|
||||
if (size & 1) /* Always even aligned */
|
||||
@ -374,7 +385,7 @@ got_sound:
|
||||
st->duration = st->nb_frames;
|
||||
|
||||
/* Position the stream at the first block */
|
||||
url_fskip(pb, offset);
|
||||
url_fseek(pb, offset, SEEK_SET);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user