Mercurial > libavformat.hg
comparison mov.c @ 4560:284c22e8f739 libavformat
return AVERROR(ENOMEM) if alloc failed, set count after alloc, use variable when reallocing, based on patch by Netgem
author | bcoudurier |
---|---|
date | Sun, 22 Feb 2009 00:20:07 +0000 |
parents | 7590f1edf959 |
children | 86bbca6f1738 |
comparison
equal
deleted
inserted
replaced
4559:ee5d7f52e4bc | 4560:284c22e8f739 |
---|---|
244 | 244 |
245 get_be32(pb); // version + flags | 245 get_be32(pb); // version + flags |
246 entries = get_be32(pb); | 246 entries = get_be32(pb); |
247 if (entries >= UINT_MAX / sizeof(*sc->drefs)) | 247 if (entries >= UINT_MAX / sizeof(*sc->drefs)) |
248 return -1; | 248 return -1; |
249 sc->drefs = av_mallocz(entries * sizeof(*sc->drefs)); | |
250 if (!sc->drefs) | |
251 return AVERROR(ENOMEM); | |
249 sc->drefs_count = entries; | 252 sc->drefs_count = entries; |
250 sc->drefs = av_mallocz(entries * sizeof(*sc->drefs)); | |
251 | 253 |
252 for (i = 0; i < sc->drefs_count; i++) { | 254 for (i = 0; i < sc->drefs_count; i++) { |
253 MOVDref *dref = &sc->drefs[i]; | 255 MOVDref *dref = &sc->drefs[i]; |
254 uint32_t size = get_be32(pb); | 256 uint32_t size = get_be32(pb); |
255 int64_t next = url_ftell(pb) + size - 4; | 257 int64_t next = url_ftell(pb) + size - 4; |
684 entries = get_be32(pb); | 686 entries = get_be32(pb); |
685 | 687 |
686 if(entries >= UINT_MAX/sizeof(int64_t)) | 688 if(entries >= UINT_MAX/sizeof(int64_t)) |
687 return -1; | 689 return -1; |
688 | 690 |
689 sc->chunk_count = entries; | |
690 sc->chunk_offsets = av_malloc(entries * sizeof(int64_t)); | 691 sc->chunk_offsets = av_malloc(entries * sizeof(int64_t)); |
691 if (!sc->chunk_offsets) | 692 if (!sc->chunk_offsets) |
692 return -1; | 693 return AVERROR(ENOMEM); |
694 sc->chunk_count = entries; | |
695 | |
693 if (atom.type == MKTAG('s','t','c','o')) | 696 if (atom.type == MKTAG('s','t','c','o')) |
694 for(i=0; i<entries; i++) | 697 for(i=0; i<entries; i++) |
695 sc->chunk_offsets[i] = get_be32(pb); | 698 sc->chunk_offsets[i] = get_be32(pb); |
696 else if (atom.type == MKTAG('c','o','6','4')) | 699 else if (atom.type == MKTAG('c','o','6','4')) |
697 for(i=0; i<entries; i++) | 700 for(i=0; i<entries; i++) |
1068 get_byte(pb); /* version */ | 1071 get_byte(pb); /* version */ |
1069 get_be24(pb); /* flags */ | 1072 get_be24(pb); /* flags */ |
1070 | 1073 |
1071 entries = get_be32(pb); | 1074 entries = get_be32(pb); |
1072 | 1075 |
1076 dprintf(c->fc, "track[%i].stsc.entries = %i\n", c->fc->nb_streams-1, entries); | |
1077 | |
1073 if(entries >= UINT_MAX / sizeof(*sc->stsc_data)) | 1078 if(entries >= UINT_MAX / sizeof(*sc->stsc_data)) |
1074 return -1; | 1079 return -1; |
1075 | |
1076 dprintf(c->fc, "track[%i].stsc.entries = %i\n", c->fc->nb_streams-1, entries); | |
1077 | |
1078 sc->stsc_count = entries; | |
1079 sc->stsc_data = av_malloc(entries * sizeof(*sc->stsc_data)); | 1080 sc->stsc_data = av_malloc(entries * sizeof(*sc->stsc_data)); |
1080 if (!sc->stsc_data) | 1081 if (!sc->stsc_data) |
1081 return -1; | 1082 return AVERROR(ENOMEM); |
1083 sc->stsc_count = entries; | |
1084 | |
1082 for(i=0; i<entries; i++) { | 1085 for(i=0; i<entries; i++) { |
1083 sc->stsc_data[i].first = get_be32(pb); | 1086 sc->stsc_data[i].first = get_be32(pb); |
1084 sc->stsc_data[i].count = get_be32(pb); | 1087 sc->stsc_data[i].count = get_be32(pb); |
1085 sc->stsc_data[i].id = get_be32(pb); | 1088 sc->stsc_data[i].id = get_be32(pb); |
1086 } | 1089 } |
1096 get_byte(pb); /* version */ | 1099 get_byte(pb); /* version */ |
1097 get_be24(pb); /* flags */ | 1100 get_be24(pb); /* flags */ |
1098 | 1101 |
1099 entries = get_be32(pb); | 1102 entries = get_be32(pb); |
1100 | 1103 |
1104 dprintf(c->fc, "keyframe_count = %d\n", entries); | |
1105 | |
1101 if(entries >= UINT_MAX / sizeof(int)) | 1106 if(entries >= UINT_MAX / sizeof(int)) |
1102 return -1; | 1107 return -1; |
1103 | |
1104 sc->keyframe_count = entries; | |
1105 | |
1106 dprintf(c->fc, "keyframe_count = %d\n", sc->keyframe_count); | |
1107 | |
1108 sc->keyframes = av_malloc(entries * sizeof(int)); | 1108 sc->keyframes = av_malloc(entries * sizeof(int)); |
1109 if (!sc->keyframes) | 1109 if (!sc->keyframes) |
1110 return -1; | 1110 return AVERROR(ENOMEM); |
1111 sc->keyframe_count = entries; | |
1112 | |
1111 for(i=0; i<entries; i++) { | 1113 for(i=0; i<entries; i++) { |
1112 sc->keyframes[i] = get_be32(pb); | 1114 sc->keyframes[i] = get_be32(pb); |
1113 //dprintf(c->fc, "keyframes[]=%d\n", sc->keyframes[i]); | 1115 //dprintf(c->fc, "keyframes[]=%d\n", sc->keyframes[i]); |
1114 } | 1116 } |
1115 return 0; | 1117 return 0; |
1126 | 1128 |
1127 sample_size = get_be32(pb); | 1129 sample_size = get_be32(pb); |
1128 if (!sc->sample_size) /* do not overwrite value computed in stsd */ | 1130 if (!sc->sample_size) /* do not overwrite value computed in stsd */ |
1129 sc->sample_size = sample_size; | 1131 sc->sample_size = sample_size; |
1130 entries = get_be32(pb); | 1132 entries = get_be32(pb); |
1131 if(entries >= UINT_MAX / sizeof(int)) | 1133 |
1132 return -1; | 1134 dprintf(c->fc, "sample_size = %d sample_count = %d\n", sc->sample_size, entries); |
1133 | 1135 |
1134 sc->sample_count = entries; | 1136 sc->sample_count = entries; |
1135 if (sample_size) | 1137 if (sample_size) |
1136 return 0; | 1138 return 0; |
1137 | 1139 |
1138 dprintf(c->fc, "sample_size = %d sample_count = %d\n", sc->sample_size, sc->sample_count); | 1140 if(entries >= UINT_MAX / sizeof(int)) |
1139 | 1141 return -1; |
1140 sc->sample_sizes = av_malloc(entries * sizeof(int)); | 1142 sc->sample_sizes = av_malloc(entries * sizeof(int)); |
1141 if (!sc->sample_sizes) | 1143 if (!sc->sample_sizes) |
1142 return -1; | 1144 return AVERROR(ENOMEM); |
1145 | |
1143 for(i=0; i<entries; i++) | 1146 for(i=0; i<entries; i++) |
1144 sc->sample_sizes[i] = get_be32(pb); | 1147 sc->sample_sizes[i] = get_be32(pb); |
1145 return 0; | 1148 return 0; |
1146 } | 1149 } |
1147 | 1150 |
1154 int64_t total_sample_count=0; | 1157 int64_t total_sample_count=0; |
1155 | 1158 |
1156 get_byte(pb); /* version */ | 1159 get_byte(pb); /* version */ |
1157 get_be24(pb); /* flags */ | 1160 get_be24(pb); /* flags */ |
1158 entries = get_be32(pb); | 1161 entries = get_be32(pb); |
1162 | |
1163 dprintf(c->fc, "track[%i].stts.entries = %i\n", c->fc->nb_streams-1, entries); | |
1164 | |
1159 if(entries >= UINT_MAX / sizeof(*sc->stts_data)) | 1165 if(entries >= UINT_MAX / sizeof(*sc->stts_data)) |
1160 return -1; | 1166 return -1; |
1161 | |
1162 sc->stts_count = entries; | |
1163 sc->stts_data = av_malloc(entries * sizeof(*sc->stts_data)); | 1167 sc->stts_data = av_malloc(entries * sizeof(*sc->stts_data)); |
1164 if (!sc->stts_data) | 1168 if (!sc->stts_data) |
1165 return -1; | 1169 return AVERROR(ENOMEM); |
1166 dprintf(c->fc, "track[%i].stts.entries = %i\n", c->fc->nb_streams-1, entries); | 1170 sc->stts_count = entries; |
1167 | 1171 |
1168 for(i=0; i<entries; i++) { | 1172 for(i=0; i<entries; i++) { |
1169 int sample_duration; | 1173 int sample_duration; |
1170 int sample_count; | 1174 int sample_count; |
1171 | 1175 |
1195 unsigned int i, entries; | 1199 unsigned int i, entries; |
1196 | 1200 |
1197 get_byte(pb); /* version */ | 1201 get_byte(pb); /* version */ |
1198 get_be24(pb); /* flags */ | 1202 get_be24(pb); /* flags */ |
1199 entries = get_be32(pb); | 1203 entries = get_be32(pb); |
1204 | |
1205 dprintf(c->fc, "track[%i].ctts.entries = %i\n", c->fc->nb_streams-1, entries); | |
1206 | |
1200 if(entries >= UINT_MAX / sizeof(*sc->ctts_data)) | 1207 if(entries >= UINT_MAX / sizeof(*sc->ctts_data)) |
1201 return -1; | 1208 return -1; |
1202 | |
1203 sc->ctts_count = entries; | |
1204 sc->ctts_data = av_malloc(entries * sizeof(*sc->ctts_data)); | 1209 sc->ctts_data = av_malloc(entries * sizeof(*sc->ctts_data)); |
1205 if (!sc->ctts_data) | 1210 if (!sc->ctts_data) |
1206 return -1; | 1211 return AVERROR(ENOMEM); |
1207 dprintf(c->fc, "track[%i].ctts.entries = %i\n", c->fc->nb_streams-1, entries); | 1212 sc->ctts_count = entries; |
1208 | 1213 |
1209 for(i=0; i<entries; i++) { | 1214 for(i=0; i<entries; i++) { |
1210 int count =get_be32(pb); | 1215 int count =get_be32(pb); |
1211 int duration =get_be32(pb); | 1216 int duration =get_be32(pb); |
1212 | 1217 |
1603 { | 1608 { |
1604 MOVTrackExt *trex; | 1609 MOVTrackExt *trex; |
1605 | 1610 |
1606 if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data)) | 1611 if ((uint64_t)c->trex_count+1 >= UINT_MAX / sizeof(*c->trex_data)) |
1607 return -1; | 1612 return -1; |
1608 c->trex_data = av_realloc(c->trex_data, (c->trex_count+1)*sizeof(*c->trex_data)); | 1613 trex = av_realloc(c->trex_data, (c->trex_count+1)*sizeof(*c->trex_data)); |
1609 if (!c->trex_data) | 1614 if (!trex) |
1610 return AVERROR(ENOMEM); | 1615 return AVERROR(ENOMEM); |
1616 c->trex_data = trex; | |
1611 trex = &c->trex_data[c->trex_count++]; | 1617 trex = &c->trex_data[c->trex_count++]; |
1612 get_byte(pb); /* version */ | 1618 get_byte(pb); /* version */ |
1613 get_be24(pb); /* flags */ | 1619 get_be24(pb); /* flags */ |
1614 trex->track_id = get_be32(pb); | 1620 trex->track_id = get_be32(pb); |
1615 trex->stsd_id = get_be32(pb); | 1621 trex->stsd_id = get_be32(pb); |
1641 entries = get_be32(pb); | 1647 entries = get_be32(pb); |
1642 dprintf(c->fc, "flags 0x%x entries %d\n", flags, entries); | 1648 dprintf(c->fc, "flags 0x%x entries %d\n", flags, entries); |
1643 if (flags & 0x001) data_offset = get_be32(pb); | 1649 if (flags & 0x001) data_offset = get_be32(pb); |
1644 if (flags & 0x004) first_sample_flags = get_be32(pb); | 1650 if (flags & 0x004) first_sample_flags = get_be32(pb); |
1645 if (flags & 0x800) { | 1651 if (flags & 0x800) { |
1652 MOVStts *ctts_data; | |
1646 if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data)) | 1653 if ((uint64_t)entries+sc->ctts_count >= UINT_MAX/sizeof(*sc->ctts_data)) |
1647 return -1; | 1654 return -1; |
1648 sc->ctts_data = av_realloc(sc->ctts_data, | 1655 ctts_data = av_realloc(sc->ctts_data, |
1649 (entries+sc->ctts_count)*sizeof(*sc->ctts_data)); | 1656 (entries+sc->ctts_count)*sizeof(*sc->ctts_data)); |
1650 if (!sc->ctts_data) | 1657 if (!ctts_data) |
1651 return AVERROR(ENOMEM); | 1658 return AVERROR(ENOMEM); |
1659 sc->ctts_data = ctts_data; | |
1652 } | 1660 } |
1653 dts = st->duration; | 1661 dts = st->duration; |
1654 offset = frag->base_data_offset + data_offset; | 1662 offset = frag->base_data_offset + data_offset; |
1655 distance = 0; | 1663 distance = 0; |
1656 dprintf(c->fc, "first sample flags 0x%x\n", first_sample_flags); | 1664 dprintf(c->fc, "first sample flags 0x%x\n", first_sample_flags); |
1733 moov_len = get_be32(pb); /* uncompressed size */ | 1741 moov_len = get_be32(pb); /* uncompressed size */ |
1734 cmov_len = atom.size - 6 * 4; | 1742 cmov_len = atom.size - 6 * 4; |
1735 | 1743 |
1736 cmov_data = av_malloc(cmov_len); | 1744 cmov_data = av_malloc(cmov_len); |
1737 if (!cmov_data) | 1745 if (!cmov_data) |
1738 return -1; | 1746 return AVERROR(ENOMEM); |
1739 moov_data = av_malloc(moov_len); | 1747 moov_data = av_malloc(moov_len); |
1740 if (!moov_data) { | 1748 if (!moov_data) { |
1741 av_free(cmov_data); | 1749 av_free(cmov_data); |
1742 return -1; | 1750 return AVERROR(ENOMEM); |
1743 } | 1751 } |
1744 get_buffer(pb, cmov_data, cmov_len); | 1752 get_buffer(pb, cmov_data, cmov_len); |
1745 if(uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK) | 1753 if(uncompress (moov_data, (uLongf *) &moov_len, (const Bytef *)cmov_data, cmov_len) != Z_OK) |
1746 goto free_and_return; | 1754 goto free_and_return; |
1747 if(init_put_byte(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL) != 0) | 1755 if(init_put_byte(&ctx, moov_data, moov_len, 0, NULL, NULL, NULL, NULL) != 0) |