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 {