Mercurial > libavformat.hg
comparison mov.c @ 1060:ede2bcaaf9e7 libavformat
always skip garbage at end of atom
author | bcoudurier |
---|---|
date | Wed, 19 Apr 2006 12:51:58 +0000 |
parents | 172781cd7c9d |
children | b1ac9677e7f5 |
comparison
equal
deleted
inserted
replaced
1059:172781cd7c9d | 1060:ede2bcaaf9e7 |
---|---|
459 break; | 459 break; |
460 | 460 |
461 if (c->parse_table[i].type == 0) { /* skip leaf atoms data */ | 461 if (c->parse_table[i].type == 0) { /* skip leaf atoms data */ |
462 url_fskip(pb, a.size); | 462 url_fskip(pb, a.size); |
463 } else { | 463 } else { |
464 offset_t start_pos = url_ftell(pb); | |
465 int64_t left; | |
464 err = (c->parse_table[i].func)(c, pb, a); | 466 err = (c->parse_table[i].func)(c, pb, a); |
467 left = a.size - url_ftell(pb) + start_pos; | |
468 if (left > 0) /* skip garbage at atom end */ | |
469 url_fskip(pb, left); | |
465 } | 470 } |
466 | 471 |
467 a.offset += a.size; | 472 a.offset += a.size; |
468 total_size += a.size; | 473 total_size += a.size; |
469 } | 474 } |
569 | 574 |
570 static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) | 575 static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) |
571 { | 576 { |
572 AVStream *st = c->fc->streams[c->fc->nb_streams-1]; | 577 AVStream *st = c->fc->streams[c->fc->nb_streams-1]; |
573 MOVStreamContext *sc = (MOVStreamContext *)st->priv_data; | 578 MOVStreamContext *sc = (MOVStreamContext *)st->priv_data; |
574 int64_t start_pos = url_ftell(pb); | |
575 int tag, len; | 579 int tag, len; |
576 | 580 |
577 /* Well, broken but suffisant for some MP4 streams */ | 581 /* Well, broken but suffisant for some MP4 streams */ |
578 get_be32(pb); /* version + flags */ | 582 get_be32(pb); /* version + flags */ |
579 len = mov_mp4_read_descr(pb, &tag); | 583 len = mov_mp4_read_descr(pb, &tag); |
604 st->codec->codec_id = CODEC_ID_MP3ON4; | 608 st->codec->codec_id = CODEC_ID_MP3ON4; |
605 } | 609 } |
606 } | 610 } |
607 } | 611 } |
608 } | 612 } |
609 /* in any case, skip garbage */ | |
610 url_fskip(pb, atom.size - ((url_ftell(pb) - start_pos))); | |
611 return 0; | 613 return 0; |
612 } | 614 } |
613 | 615 |
614 /* this atom contains actual media data */ | 616 /* this atom contains actual media data */ |
615 static int mov_read_mdat(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) | 617 static int mov_read_mdat(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) |
799 return 0; | 801 return 0; |
800 } | 802 } |
801 | 803 |
802 static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) | 804 static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) |
803 { | 805 { |
804 offset_t start_pos = url_ftell(pb); | |
805 AVStream *st = c->fc->streams[c->fc->nb_streams-1]; | 806 AVStream *st = c->fc->streams[c->fc->nb_streams-1]; |
806 | 807 |
807 if((uint64_t)atom.size > (1<<30)) | 808 if((uint64_t)atom.size > (1<<30)) |
808 return -1; | 809 return -1; |
809 | 810 |
817 get_buffer(pb, st->codec->extradata, atom.size); | 818 get_buffer(pb, st->codec->extradata, atom.size); |
818 } else | 819 } else |
819 url_fskip(pb, atom.size); | 820 url_fskip(pb, atom.size); |
820 } else if (atom.size > 8) { /* to read frma, esds atoms */ | 821 } else if (atom.size > 8) { /* to read frma, esds atoms */ |
821 mov_read_default(c, pb, atom); | 822 mov_read_default(c, pb, atom); |
822 } else if (atom.size > 0) | 823 } else |
823 url_fskip(pb, atom.size); | 824 url_fskip(pb, atom.size); |
824 /* in any case, skip garbage */ | |
825 url_fskip(pb, atom.size - ((url_ftell(pb) - start_pos))); | |
826 return 0; | 825 return 0; |
827 } | 826 } |
828 | 827 |
829 static int mov_read_jp2h(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) | 828 static int mov_read_jp2h(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) |
830 { | 829 { |