Mercurial > libavformat.hg
comparison aiff.c @ 2206:c049274b7bd4 libavformat
support files with COMM chunk after SSND, fix invalid_nocommon.aiff which is spec compliant
author | bcoudurier |
---|---|
date | Mon, 25 Jun 2007 21:31:33 +0000 |
parents | 1f62f2f021d5 |
children | 87818c05d64d |
comparison
equal
deleted
inserted
replaced
2205:28eb72f5208a | 2206:c049274b7bd4 |
---|---|
287 | 287 |
288 /* aiff input */ | 288 /* aiff input */ |
289 static int aiff_read_header(AVFormatContext *s, | 289 static int aiff_read_header(AVFormatContext *s, |
290 AVFormatParameters *ap) | 290 AVFormatParameters *ap) |
291 { | 291 { |
292 int size, filesize, offset; | 292 int size, filesize; |
293 offset_t offset = 0; | |
293 uint32_t tag; | 294 uint32_t tag; |
294 unsigned version = AIFF_C_VERSION1; | 295 unsigned version = AIFF_C_VERSION1; |
295 ByteIOContext *pb = &s->pb; | 296 ByteIOContext *pb = &s->pb; |
296 AVStream * st = s->streams[0]; | 297 AVStream * st = s->streams[0]; |
297 | 298 |
325 case MKTAG('C', 'O', 'M', 'M'): /* Common chunk */ | 326 case MKTAG('C', 'O', 'M', 'M'): /* Common chunk */ |
326 /* Then for the complete header info */ | 327 /* Then for the complete header info */ |
327 st->nb_frames = get_aiff_header (pb, st->codec, size, version); | 328 st->nb_frames = get_aiff_header (pb, st->codec, size, version); |
328 if (st->nb_frames < 0) | 329 if (st->nb_frames < 0) |
329 return st->nb_frames; | 330 return st->nb_frames; |
331 if (offset > 0) // COMM is after SSND | |
332 goto got_sound; | |
330 break; | 333 break; |
331 | 334 |
332 case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */ | 335 case MKTAG('F', 'V', 'E', 'R'): /* Version chunk */ |
333 version = get_be32(pb); | 336 version = get_be32(pb); |
334 break; | 337 break; |
350 break; | 353 break; |
351 | 354 |
352 case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */ | 355 case MKTAG('S', 'S', 'N', 'D'): /* Sampled sound chunk */ |
353 get_be32(pb); /* Block align... don't care */ | 356 get_be32(pb); /* Block align... don't care */ |
354 offset = get_be32(pb); /* Offset of sound data */ | 357 offset = get_be32(pb); /* Offset of sound data */ |
355 goto got_sound; | 358 offset += url_ftell(pb); /* Compute absolute data offset */ |
359 if (st->codec->codec_id) /* Assume COMM already parsed */ | |
360 goto got_sound; | |
361 if (url_is_streamed(pb)) { | |
362 av_log(s, AV_LOG_ERROR, "file is not seekable\n"); | |
363 return -1; | |
364 } | |
365 url_fskip(pb, size - 8); | |
366 break; | |
356 | 367 |
357 default: /* Jump */ | 368 default: /* Jump */ |
358 if (size & 1) /* Always even aligned */ | 369 if (size & 1) /* Always even aligned */ |
359 size++; | 370 size++; |
360 url_fskip (pb, size); | 371 url_fskip (pb, size); |
372 av_set_pts_info(st, 64, 1, st->codec->sample_rate); | 383 av_set_pts_info(st, 64, 1, st->codec->sample_rate); |
373 st->start_time = 0; | 384 st->start_time = 0; |
374 st->duration = st->nb_frames; | 385 st->duration = st->nb_frames; |
375 | 386 |
376 /* Position the stream at the first block */ | 387 /* Position the stream at the first block */ |
377 url_fskip(pb, offset); | 388 url_fseek(pb, offset, SEEK_SET); |
378 | 389 |
379 return 0; | 390 return 0; |
380 } | 391 } |
381 | 392 |
382 #define MAX_SIZE 4096 | 393 #define MAX_SIZE 4096 |