46 std::shared_ptr<MediaSample> audio_sample;
47 std::shared_ptr<MediaSample> video_sample;
48 uint32_t audio_stream_id;
49 uint32_t video_stream_id;
50 int64_t audio_sample_duration;
51 int64_t video_sample_duration;
64 KeySource* decryption_key_source)
override;
65 [[nodiscard]]
bool Flush()
override;
66 [[nodiscard]]
bool Parse(
const uint8_t* buf,
int size)
override;
76 TrackTrickPlayFactor = 5,
77 TrackAdaptationInterval = 6,
84 VideoTicksPerFrame = 13,
88 AudioNumChannels = 17,
89 AudioSampleFrequency = 18,
102 VideoPixelWidth = 31,
103 VideoPixelHeight = 32,
105 SparseDownloadUrl = 34,
106 SparseDownloadRangeTranslations = 35,
107 SparseDownloadMap = 36,
108 AudioSampleSize = 37,
109 Audio_EsDescriptor = 38,
110 Video_AVCDecoderConfigurationRecord = 39,
111 Audio_EC3SpecificData = 40,
112 AudioIdentifier = 41,
114 VideoStreamType = 43,
116 AudioStreamType = 45,
117 Audio_DtsSpecificData = 46,
118 Audio_AC3SpecificData = 47,
137 PackHeaderStuffingSkip,
170 bool ParseIndexEntry();
172 bool DemuxNextPes(
bool is_program_end);
174 void StartMediaSampleDemux();
176 template <
typename T>
177 Tag GetTag(
const uint8_t& tag,
178 const uint32_t& length,
179 const uint8_t* start_index,
181 if (length ==
sizeof(uint8_t)) {
182 *value = *start_index;
183 }
else if (length ==
sizeof(int8_t)) {
184 *value = (int8_t)(*start_index);
185 }
else if (length ==
sizeof(uint16_t)) {
186 *value = absl::big_endian::Load16(start_index);
187 }
else if (length ==
sizeof(int16_t)) {
188 *value = (int16_t)(absl::big_endian::Load16(start_index));
189 }
else if (length ==
sizeof(uint32_t)) {
190 *value = absl::big_endian::Load32(start_index);
191 }
else if (length ==
sizeof(int32_t)) {
192 *value = (int32_t)(absl::big_endian::Load32(start_index));
193 }
else if (length ==
sizeof(uint64_t)) {
194 *value = absl::big_endian::Load64(start_index);
195 }
else if (length ==
sizeof(int64_t)) {
196 *value = (int64_t)(absl::big_endian::Load64(start_index));
205 bool Output(
bool must_process_encrypted);
207 bool GetAssetKey(
const uint8_t* asset_id,
EncryptionKey* encryption_key);
211 bool EmitSample(uint32_t parsed_audio_or_video_stream_id,
213 const std::shared_ptr<MediaSample>& new_sample,
216 bool EmitPendingSamples();
218 bool EmitLastSample(uint32_t stream_id,
219 const std::shared_ptr<MediaSample>& new_sample);
226 bool is_initialized_;
230 uint32_t skip_bytes_;
231 bool metadata_is_complete_;
232 uint8_t current_program_id_;
233 uint32_t pes_stream_id_;
234 uint32_t prev_pes_stream_id_;
235 size_t pes_packet_bytes_;
236 uint8_t pes_flags_1_;
237 uint8_t pes_flags_2_;
238 uint8_t prev_pes_flags_1_;
239 size_t pes_header_data_bytes_;
243 uint8_t index_program_id_;
244 std::shared_ptr<MediaSample> media_sample_;
245 size_t crypto_unit_start_pos_;
249 std::vector<uint8_t, std::allocator<uint8_t>> ecm_;
250 std::vector<uint8_t> psm_data_;
251 std::vector<uint8_t> index_data_;
252 std::map<std::string, uint32_t> program_demux_stream_map_;
253 int stream_id_count_;
254 std::vector<std::shared_ptr<StreamInfo>> stream_infos_;
255 std::deque<DemuxStreamIdMediaSample> media_sample_queue_;
256 std::vector<uint8_t> sample_data_;
258 std::unique_ptr<AesCbcDecryptor> content_decryptor_;