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