| 104 | } // namespace |
| 105 | |
| 106 | Mp4TrackInfo parseMp4(fl::span<const fl::u8> data, fl::string* error) { |
| 107 | Mp4TrackInfo info; |
| 108 | |
| 109 | if (data.size() < 8) { |
| 110 | if (error) *error = "Data too small for MP4"; |
| 111 | return info; |
| 112 | } |
| 113 | |
| 114 | // Find moov box at top level |
| 115 | fl::size moovPos = findBox(data, 0, data.size(), "moov"); |
| 116 | if (moovPos == fl::size(-1)) { |
| 117 | if (error) *error = "No moov box found"; |
| 118 | return info; |
| 119 | } |
| 120 | |
| 121 | bool ok = true; |
| 122 | fl::u32 moovSize = readU32BE(data, moovPos, ok); |
| 123 | if (!ok) { |
| 124 | if (error) *error = "Invalid moov box size"; |
| 125 | return info; |
| 126 | } |
| 127 | fl::size moovEnd = moovPos + moovSize; |
| 128 | if (moovEnd > data.size()) moovEnd = data.size(); |
| 129 | fl::size moovBody = moovPos + 8; |
| 130 | |
| 131 | // Find trak box inside moov |
| 132 | fl::size trakPos = findBox(data, moovBody, moovEnd, "trak"); |
| 133 | if (trakPos == fl::size(-1)) { |
| 134 | if (error) *error = "No trak box found"; |
| 135 | return info; |
| 136 | } |
| 137 | |
| 138 | fl::u32 trakSize = readU32BE(data, trakPos, ok); |
| 139 | if (!ok) { |
| 140 | if (error) *error = "Invalid trak box size"; |
| 141 | return info; |
| 142 | } |
| 143 | fl::size trakEnd = trakPos + trakSize; |
| 144 | if (trakEnd > moovEnd) trakEnd = moovEnd; |
| 145 | fl::size trakBody = trakPos + 8; |
| 146 | |
| 147 | // Find mdia box inside trak |
| 148 | fl::size mdiaPos = findBox(data, trakBody, trakEnd, "mdia"); |
| 149 | if (mdiaPos == fl::size(-1)) { |
| 150 | if (error) *error = "No mdia box found"; |
| 151 | return info; |
| 152 | } |
| 153 | |
| 154 | fl::u32 mdiaSize = readU32BE(data, mdiaPos, ok); |
| 155 | if (!ok) { |
| 156 | if (error) *error = "Invalid mdia box size"; |
| 157 | return info; |
| 158 | } |
| 159 | fl::size mdiaEnd = mdiaPos + mdiaSize; |
| 160 | if (mdiaEnd > trakEnd) mdiaEnd = trakEnd; |
| 161 | fl::size mdiaBody = mdiaPos + 8; |
| 162 | |
| 163 | // Find minf box inside mdia |
no test coverage detected