| 141 | } |
| 142 | |
| 143 | static std::unique_ptr<ByteData> MakeMP4Data(const VideoSequence* videoSequence, bool includeMdat) { |
| 144 | auto mp4Track = MakeMP4Track(videoSequence); |
| 145 | if (!mp4Track || mp4Track->len == 0) { |
| 146 | return nullptr; |
| 147 | } |
| 148 | |
| 149 | BoxParam boxParam; |
| 150 | boxParam.tracks = {mp4Track}; |
| 151 | boxParam.track = mp4Track; |
| 152 | boxParam.duration = mp4Track->duration; |
| 153 | boxParam.timescale = mp4Track->timescale; |
| 154 | boxParam.sequenceNumber = SEQUENCE_NUMBER; |
| 155 | boxParam.baseMediaDecodeTime = BASE_MEDIA_DECODE_TIME; |
| 156 | boxParam.nalusBytesLen = mp4Track->len; |
| 157 | boxParam.videoSequence = videoSequence; |
| 158 | |
| 159 | float sizeFactor = includeMdat ? 1.5f : 0.5f; |
| 160 | EncodeStream stream(nullptr, |
| 161 | static_cast<uint32_t>(static_cast<float>(mp4Track->len) * sizeFactor)); |
| 162 | stream.setByteOrder(tgfx::ByteOrder::BigEndian); |
| 163 | MP4Generator mp4Generator(boxParam); |
| 164 | mp4Generator.ftyp(&stream, true); |
| 165 | mp4Generator.moov(&stream, true); |
| 166 | mp4Generator.moof(&stream, true); |
| 167 | if (includeMdat) { |
| 168 | mp4Generator.mdat(&stream, true); |
| 169 | } |
| 170 | return stream.release(); |
| 171 | } |
| 172 | |
| 173 | std::unique_ptr<ByteData> MP4BoxHelper::CovertToMP4(const VideoSequence* videoSequence) { |
| 174 | if (!videoSequence->MP4Header) { |
no test coverage detected