From 217460328f820433af487de6a46351db9491ffa6 Mon Sep 17 00:00:00 2001 From: KongQun Yang Date: Mon, 11 Dec 2017 18:14:43 -0800 Subject: [PATCH] Generate documents for commit 7e46ad1021554f9fc8418f15d0d6a257bc5d158c --- docs/annotated.html | 378 +-- docs/classes.html | 172 +- ...ia_1_1mp4_1_1HandlerReference-members.html | 2 +- ..._1_1media_1_1RsaRequestSigner-members.html | 2 +- docs/d0/d06/mpd__flags_8cc_source.html | 2 +- ...ka_1_1media_1_1HttpKeyFetcher-members.html | 2 +- ...oder__configuration__record_8h_source.html | 2 +- docs/d0/d0e/muxer__options_8h_source.html | 2 +- ...media_1_1mp2t_1_1TsSectionPmt-members.html | 2 +- .../structshaka_1_1media_1_1VPxFrameInfo.html | 2 +- ...tshaka_1_1media_1_1StreamData-members.html | 18 +- docs/d0/d1a/text__sample_8h_source.html | 2 +- ...H265ByteToUnitStreamConverter-members.html | 2 +- ..._1_1media_1_1mp4_1_1VTTCueBox-members.html | 2 +- ...haka_1_1media_1_1mp2t_1_1TsSectionPat.html | 2 +- .../structshaka_1_1media_1_1MuxerOptions.html | 2 +- .../d0/d30/mock__mpd__notifier_8h_source.html | 2 +- docs/d0/d32/mp2t__common_8h_source.html | 2 +- .../d33/classshaka_1_1MockRepresentation.html | 2 +- docs/d0/d35/es__descriptor_8cc_source.html | 2 +- ...1_1EncryptedStreamAttributes_1_1OneOf.html | 34 +- ...s__notify__muxer__listener_8cc_source.html | 4 +- docs/d0/d3a/webm__constants_8h_source.html | 2 +- ...mp4_1_1ProtectionSystemSpecificHeader.html | 2 +- docs/d0/d42/aes__cryptor_8h_source.html | 2 +- ...idevine__encryption__flags_8cc_source.html | 2 +- .../d43/structshaka_1_1Mp4OutputParams.html | 2 +- docs/d0/d46/fourccs_8h_source.html | 297 +-- ...shaka_1_1media_1_1SegmentInfo-members.html | 2 +- ...nfo__dump__muxer__listener_8cc_source.html | 2 +- ...ia_1_1mp4_1_1MediaInformation-members.html | 2 +- .../structshaka_1_1media_1_1StreamData.html | 33 +- ...haka_1_1media_1_1AudioTimestampHelper.html | 2 +- .../d4e/libcrypto__threading_8cc_source.html | 2 +- ...a_1_1media_1_1mp2t_1_1TsMuxer-members.html | 6 +- ...dia_1_1MpdNotifyMuxerListener-members.html | 2 +- ...ad__cue__generator__flags_8cc_source.html} | 54 +- ...a_1_1media_1_1mp4_1_1VideoSampleEntry.html | 2 +- ...haka_1_1media_1_1mp4_1_1SampleToGroup.html | 2 +- docs/d0/d7d/decryptor__source_8h_source.html | 2 +- ...a_1_1media_1_1AesCbcEncryptor-members.html | 2 +- .../structshaka_1_1media_1_1mp4_1_1Movie.html | 2 +- ...ka_1_1media_1_1AACAudioSpecificConfig.html | 2 +- ...aka_1_1media_1_1RequestSigner-members.html | 2 +- ...uctshaka_1_1xml_1_1XmlDeleter-members.html | 2 +- .../d0/da6/stream__descriptor_8cc_source.html | 30 +- docs/d0/da8/structshaka_1_1HlsParams.html | 19 +- ...edia_1_1mp4_1_1SingleSegmentSegmenter.html | 2 +- ...1_1media_1_1EncryptionHandler-members.html | 6 +- docs/d0/dae/file__util_8h_source.html | 2 +- docs/d0/db4/structshaka_1_1RawKeyParams.html | 2 +- ...1_1media_1_1mp2t_1_1Ac3Header-members.html | 118 + docs/d0/dbc/bit__writer_8h_source.html | 152 ++ ...webm_1_1MultiSegmentSegmenter-members.html | 2 +- ...tructshaka_1_1RawKeyParams_1_1KeyInfo.html | 2 +- .../structshaka_1_1media_1_1SegmentInfo.html | 4 +- ...edia_1_1mp4_1_1VTTEmptyCueBox-members.html | 2 +- ..._1xml_1_1AdaptationSetXmlNode-members.html | 2 +- .../classshaka_1_1media_1_1RsaPrivateKey.html | 2 +- ...aka_1_1media_1_1mp4_1_1CueSettingsBox.html | 2 +- ...media_1_1ProtectionSystemSpecificInfo.html | 2 +- .../dd6/webm__crypto__helpers_8cc_source.html | 2 +- ...lassshaka_1_1media_1_1AesCtrEncryptor.html | 2 +- .../dee/segmenter__test__base_8h_source.html | 2 +- docs/d0/df3/packager__util_8cc_source.html | 2 +- ...haka_1_1hls_1_1MasterPlaylist-members.html | 2 +- ...ia_1_1mp4_1_1AudioSampleEntry-members.html | 2 +- ...media_1_1MuxerListener_1_1MediaRanges.html | 2 +- ...haka_1_1AdCueGeneratorParams-members.html} | 20 +- .../d07/structshaka_1_1Cuepoint-members.html} | 21 +- .../d0a/classshaka_1_1media_1_1MkvWriter.html | 2 +- .../d0a/structshaka_1_1media_1_1H264Sps.html | 2 +- ...der__configuration__record_8cc_source.html | 2 +- ...media_1_1mp2t_1_1EsParserH264-members.html | 2 +- docs/d1/d12/range_8h_source.html | 2 +- docs/d1/d13/status_8h_source.html | 2 +- ...a_1_1WidevineDecryptionParams-members.html | 2 +- ...single__segment__segmenter_8cc_source.html | 2 +- docs/d1/d1d/muxer__flags_8cc_source.html | 2 +- docs/d1/d1e/hls__notifier_8h_source.html | 2 +- .../d1f/classshaka_1_1media_1_1KeySource.html | 2 +- ...1media_1_1mp4_1_1DecodingTimeIterator.html | 2 +- ...media_1_1MediaHandlerTestBase-members.html | 2 +- docs/d1/d27/key__fetcher_8h_source.html | 2 +- ..._1media_1_1mp2t_1_1AdtsHeader-members.html | 25 +- docs/d1/d2a/decryptor__source_8cc_source.html | 2 +- docs/d1/d2b/file__util_8cc_source.html | 2 +- ...media_1_1mp4_1_1DataReference-members.html | 2 +- .../structshaka_1_1media_1_1mp4_1_1Box.html | 2 +- .../d2f/webvtt__media__parser_8cc_source.html | 2 +- ...haka_1_1media_1_1mp2t_1_1TsSectionPes.html | 2 +- docs/d1/d31/classshaka_1_1xml_1_1XmlNode.html | 2 +- ...tructshaka_1_1media_1_1SubsampleEntry.html | 2 +- ...assshaka_1_1media_1_1FakeMediaHandler.html | 18 +- docs/d1/d37/es__parser__h264_8h_source.html | 2 +- .../d3b/mpd__generator__flags_8h_source.html | 2 +- ...shaka_1_1media_1_1mp4_1_1MovieExtends.html | 2 +- .../d40/classshaka_1_1MpdWriter-members.html | 2 +- .../structshaka_1_1media_1_1Scte35Event.html | 129 + ..._1hls_1_1MediaPlaylistFactory-members.html | 2 +- .../decoding__time__iterator_8cc_source.html | 2 +- .../d1/d48/text__track__config_8h_source.html | 2 +- ...a_1_1media_1_1OffsetByteQueue-members.html | 2 +- .../d4f/structshaka_1_1DecryptionParams.html | 2 +- ...aka_1_1media_1_1EncryptionKey-members.html | 2 +- ..._1media_1_1mp4_1_1TrackFragmentHeader.html | 2 +- docs/d1/d70/vp8__parser_8cc_source.html | 2 +- docs/d1/d72/language__utils_8cc_source.html | 2 +- .../d74/mp2t__media__parser_8cc_source.html | 824 +++--- ..._1media_1_1H265VideoSliceHeaderParser.html | 2 +- ...shaka_1_1media_1_1Scte35Event-members.html | 109 + .../d7d/webm__video__client_8cc_source.html | 2 +- ...ia_1_1H265ReferencePictureSet-members.html | 2 +- ..._1_1media_1_1WebMParserClient-members.html | 2 +- .../classshaka_1_1hls_1_1MasterPlaylist.html | 8 +- .../d8e/webm__audio__client_8cc_source.html | 2 +- docs/d1/d8f/retired__flags_8h_source.html | 2 +- ...aka_1_1media_1_1H26xBitReader-members.html | 2 +- ...a_1_1WidevineEncryptionParams-members.html | 2 +- ...ssshaka_1_1media_1_1ByteQueue-members.html | 2 +- docs/d1/d9d/tracks__builder_8h_source.html | 2 +- ..._1_1mp4_1_1CodecConfiguration-members.html | 2 +- ...assshaka_1_1media_1_1mp4_1_1BoxBuffer.html | 2 +- ...ia_1_1wvm_1_1DemuxStreamIdMediaSample.html | 2 +- ...1NalUnitToByteStreamConverter-members.html | 2 +- ..._1media_1_1VPCodecConfigurationRecord.html | 2 +- ...lassshaka_1_1media_1_1Demuxer-members.html | 6 +- ...a_1_1media_1_1mp4_1_1VideoMediaHeader.html | 2 +- ...oder__configuration__record_8h_source.html | 2 +- ...shaka_1_1media_1_1mp2t_1_1AudioHeader.html | 445 ++++ ...sshaka_1_1media_1_1mp2t_1_1AudioHeader.png | Bin 0 -> 1077 bytes ..._1media_1_1PlayReadyKeySource-members.html | 2 +- docs/d1/dc2/h26x__bit__reader_8h_source.html | 2 +- .../dd5/classshaka_1_1media_1_1Cluster.html | 2 +- ...dia_1_1mp4_1_1DataInformation-members.html | 2 +- ...tructshaka_1_1PackagingParams-members.html | 23 +- ..._1_1media_1_1EncryptionConfig-members.html | 2 +- ...a_1_1media_1_1VideoStreamInfo-members.html | 2 +- ...position__offset__iterator_8cc_source.html | 2 +- ...sshaka_1_1media_1_1KeyFetcher-members.html | 2 +- ...sshaka_1_1xml_1_1AdaptationSetXmlNode.html | 2 +- ...rencePictureListModifications-members.html | 2 +- ..._1_1media_1_1ProgressListener-members.html | 2 +- ...assshaka_1_1media_1_1mp4_1_1BoxReader.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1SampleTable.html | 2 +- docs/d1/df0/aes__encryptor_8h_source.html | 2 +- docs/d1/df3/structshaka_1_1MpdOptions.html | 2 +- docs/d1/df5/nalu__reader_8cc_source.html | 2 +- ...ia_1_1mp4_1_1VideoMediaHeader-members.html | 2 +- docs/d2/d02/timestamp_8h_source.html | 2 +- ...assshaka_1_1media_1_1SeekHead-members.html | 2 +- .../d0f/classshaka_1_1MpdBuilder-members.html | 2 +- ...aka_1_1media_1_1wvm_1_1PrevSampleData.html | 2 +- ...aka_1_1media_1_1MuxerListener-members.html | 2 +- docs/d2/d17/ts__section__pat_8cc_source.html | 2 +- .../d2/d1f/structshaka_1_1ChunkingParams.html | 2 +- docs/d2/d20/classshaka_1_1Status.html | 2 +- .../d2/d23/threaded__io__file_8cc_source.html | 2 +- docs/d2/d24/packager__util_8h_source.html | 2 +- .../d2/d2a/classshaka_1_1IoCache-members.html | 2 +- docs/d2/d30/tracks__builder_8cc_source.html | 2 +- ...ideo__slice__header__parser_8h_source.html | 2 +- ...1_1media_1_1WidevineKeySource-members.html | 2 +- ...1_1mp4_1_1TrackFragmentHeader-members.html | 2 +- ...rogram__map__table__writer_8cc_source.html | 745 +++--- ...o__byte__stream__converter_8cc_source.html | 2 +- docs/d2/d4d/file_8h_source.html | 2 +- .../d4f/structshaka_1_1Element-members.html | 2 +- ...classshaka_1_1MockMpdNotifier-members.html | 2 +- docs/d2/d57/master__playlist_8h_source.html | 8 +- ...ructshaka_1_1media_1_1H264SliceHeader.html | 2 +- ...ssshaka_1_1media_1_1KeySource-members.html | 2 +- ...assshaka_1_1SimpleMpdNotifier-members.html | 2 +- ...a_1_1H264ModificationOfPicNum-members.html | 2 +- .../d62/simple__mpd__notifier_8h_source.html | 2 +- ...haka_1_1media_1_1mp4_1_1Movie-members.html | 2 +- ...sshaka_1_1media_1_1AesCryptor-members.html | 2 +- docs/d2/d6f/classBandwidthEstimator.html | 2 +- ...ctshaka_1_1media_1_1mp4_1_1SchemeInfo.html | 2 +- ...edia_1_1CombinedMuxerListener-members.html | 2 +- ...ssshaka_1_1DashIopMpdNotifier-members.html | 2 +- .../d7b/simple__mpd__notifier_8cc_source.html | 2 +- .../d7b/structshaka_1_1StreamDescriptor.html | 26 +- ...ac__audio__specific__config_8h_source.html | 2 +- ...haka_1_1media_1_1mp4_1_1CuePayloadBox.html | 2 +- ...shaka_1_1BufferCallbackParams-members.html | 2 +- ...ls__notify__muxer__listener_8h_source.html | 2 +- ...media_1_1mp4_1_1CuePayloadBox-members.html | 2 +- docs/d2/d92/box__reader_8h_source.html | 2 +- ...ssshaka_1_1media_1_1mp2t_1_1PesPacket.html | 2 +- .../structshaka_1_1FileCloser-members.html | 2 +- ..._1_1media_1_1TrickPlayHandler-members.html | 6 +- docs/d2/da6/threaded__io__file_8h_source.html | 2 +- docs/d2/da8/mp4_2segmenter_8cc_source.html | 4 +- ...haka_1_1media_1_1BufferWriter-members.html | 2 +- ...assshaka_1_1MockAdaptationSet-members.html | 2 +- docs/d2/dae/webm__muxer_8cc_source.html | 2 +- docs/d2/db1/master__playlist_8cc_source.html | 316 +-- ...media_1_1mp4_1_1SampleToGroup-members.html | 2 +- ...a_1_1media_1_1mp4_1_1FileType-members.html | 2 +- ...edia_1_1mp4_1_1CueSourceIDBox-members.html | 2 +- ...lassshaka_1_1media_1_1SegmentTestBase.html | 2 +- ...haka_1_1media_1_1mp4_1_1Track-members.html | 2 +- ...media__handler__test__base_8cc_source.html | 2 +- .../structshaka_1_1MpdOptions-members.html | 2 +- ...program__map__table__writer_8h_source.html | 162 +- ...a_1_1media_1_1mp4_1_1EditList-members.html | 2 +- ...structshaka_1_1WidevineSigner-members.html | 2 +- ...edia_1_1webm_1_1MultiSegmentSegmenter.html | 2 +- docs/d2/dd6/mkv__writer_8h_source.html | 2 +- .../structshaka_1_1RawKeyParams-members.html | 2 +- ...a_1_1media_1_1ChunkingHandler-members.html | 6 +- ...lassshaka_1_1media_1_1WebMMediaParser.html | 2 +- docs/d2/de1/webvtt__timestamp_8h_source.html | 2 +- ...haka_1_1media_1_1mp2t_1_1TsSectionPmt.html | 2 +- docs/d2/de6/packager__main_8cc_source.html | 922 +++---- ...ka_1_1media_1_1TextStreamInfo-members.html | 2 +- ...shaka_1_1media_1_1mp4_1_1Edit-members.html | 2 +- docs/d2/de9/media__handler_8cc_source.html | 2 +- .../de9/mock__muxer__listener_8h_source.html | 2 +- docs/d2/deb/es__parser_8h_source.html | 2 +- ...media_1_1mp2t_1_1TsSectionPes-members.html | 2 +- .../pes__packet__generator_8cc_source.html | 229 +- ...a_1_1SegmentTestBase_1_1ClusterParser.html | 2 +- ...ssshaka_1_1media_1_1MkvWriter-members.html | 2 +- docs/d2/dfd/adts__header_8h_source.html | 83 +- ..._1_1media_1_1mp4_1_1BoxReader-members.html | 2 +- docs/d3/d07/mpd__params_8h_source.html | 2 +- ..._1_1mp4_1_1SyncSampleIterator-members.html | 2 +- .../classshaka_1_1media_1_1MediaParser.html | 2 +- ...sshaka_1_1media_1_1mp2t_1_1AdtsHeader.html | 380 ++- ...ssshaka_1_1media_1_1mp2t_1_1AdtsHeader.png | Bin 0 -> 792 bytes ..._1media_1_1LibcryptoThreading-members.html | 2 +- ...media_1_1mp2t_1_1TsSectionPat-members.html | 2 +- docs/d3/d19/io__cache_8h_source.html | 2 +- .../classshaka_1_1media_1_1Replicator.html | 18 +- ...aka_1_1media_1_1FakeInputMediaHandler.html | 18 +- ...deo__slice__header__parser_8cc_source.html | 2 +- ...uctshaka_1_1media_1_1mp4_1_1PrivFrame.html | 2 +- docs/d3/d48/packager_8cc_source.html | 1788 ++++++------- ...sshaka_1_1media_1_1LibcryptoThreading.html | 2 +- docs/d3/d56/decrypt__config_8cc_source.html | 2 +- .../d3/d62/continuity__counter_8h_source.html | 2 +- docs/d3/d62/rcheck_8h_source.html | 2 +- ...1media_1_1mp4_1_1DataEntryUrl-members.html | 2 +- ...lassshaka_1_1media_1_1WebMVideoClient.html | 2 +- .../ad__cue__generator__params_8h_source.html | 129 + ...lassshaka_1_1media_1_1mp2t_1_1TsMuxer.html | 18 +- docs/d3/d73/classshaka_1_1File.html | 2 +- ...ssshaka_1_1media_1_1webm_1_1WebMMuxer.html | 18 +- .../classshaka_1_1media_1_1AesEncryptor.html | 2 +- ...a_1_1mp4_1_1ChunkInfoIterator-members.html | 2 +- docs/d3/d76/muxer__flags_8h_source.html | 2 +- ...dia_1_1mp4_1_1TextSampleEntry-members.html | 2 +- ...haka_1_1media_1_1RsaPublicKey-members.html | 2 +- ...lassshaka_1_1media_1_1WebMAudioClient.html | 2 +- docs/d3/d80/muxer__util_8h_source.html | 2 +- ...haka_1_1media_1_1mp4_1_1SampleToChunk.html | 2 +- .../d87/trick__play__handler_8cc_source.html | 2 +- .../d3/d8d/webm__audio__client_8h_source.html | 2 +- docs/d3/d90/ec3__audio__util_8cc_source.html | 2 +- .../classshaka_1_1media_1_1H264Parser.html | 2 +- docs/d3/d93/media__handler_8h_source.html | 342 +-- ...lassshaka_1_1hls_1_1MockMediaPlaylist.html | 7 +- ...1_1media_1_1MediaHandlerGraphTestBase.html | 2 +- .../d9c/encryption__handler_8cc_source.html | 668 ++--- docs/d3/da0/ec3__audio__util_8h_source.html | 2 +- ...dia_1_1webm_1_1SingleSegmentSegmenter.html | 2 +- ...ctshaka_1_1media_1_1mp4_1_1SchemeType.html | 2 +- .../structshaka_1_1media_1_1mp4_1_1ID3v2.html | 2 +- ..._1_1media_1_1WebMWebVTTParser-members.html | 2 +- .../structshaka_1_1media_1_1mp4_1_1Track.html | 2 +- docs/d3/db6/webm__parser_8cc_source.html | 2 +- docs/d3/dbc/seek__head_8cc_source.html | 2 +- docs/d3/dbe/demuxer_8cc_source.html | 6 +- ...ructshaka_1_1media_1_1mp4_1_1EditList.html | 2 +- ...ructshaka_1_1DecryptionParams-members.html | 2 +- ...a_1_1media_1_1mp2t_1_1Mp2tMediaParser.html | 8 +- docs/d3/dd0/classshaka_1_1MpdNotifier.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1SegmentType.html | 2 +- docs/d3/dd7/ad__cue__generator_8h_source.html | 139 + docs/d3/de2/structshaka_1_1FileCloser.html | 2 +- docs/d3/de4/seek__head_8h_source.html | 2 +- ..._1_1media_1_1mp4_1_1BoxBuffer-members.html | 2 +- ...mp4_1_1SampleGroupDescription-members.html | 2 +- docs/d3/df1/box__reader_8cc_source.html | 2 +- ...uctshaka_1_1PlayreadyEncryptionParams.html | 2 +- ...ssshaka_1_1media_1_1AesPatternCryptor.html | 2 +- ...2multi__segment__segmenter_8cc_source.html | 2 +- ...edia_1_1mp4_1_1MP4MediaParser-members.html | 2 +- .../d0b/classshaka_1_1media_1_1TextTrack.html | 2 +- ...1_1media_1_1WebVttMediaParser-members.html | 2 +- .../d4/d15/gflags__hex__bytes_8cc_source.html | 2 +- ...haka_1_1media_1_1mp4_1_1EditListEntry.html | 2 +- ...lassshaka_1_1media_1_1AesCbcEncryptor.html | 2 +- ...ia_1_1mp4_1_1ChunkLargeOffset-members.html | 2 +- ...haka_1_1media_1_1mp4_1_1ID3v2-members.html | 2 +- ...1media_1_1mp4_1_1WebVTTSourceLabelBox.html | 2 +- docs/d4/d37/io__cache_8cc_source.html | 2 +- ...ructshaka_1_1media_1_1H264Sps-members.html | 2 +- ...lassshaka_1_1media_1_1ChunkingHandler.html | 21 +- ...pleAuxiliaryInformationOffset-members.html | 2 +- ...haka_1_1media_1_1H264WeightingFactors.html | 2 +- .../classshaka_1_1media_1_1Nalu-members.html | 2 +- ...assshaka_1_1media_1_1WebMWebVTTParser.html | 2 +- ...aka_1_1media_1_1DecryptConfig-members.html | 2 +- .../ad__cue__generator__flags_8h_source.html} | 44 +- .../d70/classshaka_1_1DashIopMpdNotifier.html | 2 +- .../structshaka_1_1SegmentInfo-members.html | 2 +- docs/d4/d83/cue_8cc_source.html | 2 +- docs/d4/d87/nalu__reader_8h_source.html | 2 +- docs/d4/d87/text__sample_8cc_source.html | 2 +- ...dia_1_1HEVCDecoderConfigurationRecord.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1EC3Specific.html | 2 +- ...haka_1_1media_1_1MediaHandlerTestBase.html | 2 +- ...sshaka_1_1media_1_1PlayReadyKeySource.html | 2 +- .../da7/segmenter__test__base_8cc_source.html | 2 +- ...a_1_1media_1_1mp4_1_1SampleEncryption.html | 2 +- ...a_1_1mp4_1_1CompactSampleSize-members.html | 2 +- docs/d4/db2/cluster__builder_8h_source.html | 2 +- .../db4/classshaka_1_1MpdNotifierFactory.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1MediaHeader.html | 2 +- ...ia_1_1mp2t_1_1AacProgramMapTableWriter.png | Bin 1124 -> 0 bytes docs/d4/dcb/classshaka_1_1UdpFile.html | 2 +- docs/d4/dd3/bit__reader_8h_source.html | 2 +- ...ka_1_1media_1_1mp4_1_1FullBox-members.html | 2 +- docs/d4/dd6/raw__key__source_8cc_source.html | 2 +- docs/d4/dde/webvtt__util_8h_source.html | 2 +- ...haka_1_1media_1_1mp4_1_1DataReference.html | 2 +- ...assshaka_1_1media_1_1ProgressListener.html | 2 +- ...VodMediaInfoDumpMuxerListener-members.html | 2 +- docs/d4/dec/hls__flags_8h_source.html | 9 +- docs/d4/df5/request__signer_8cc_source.html | 2 +- .../webvtt__sample__converter_8cc_source.html | 2 +- ...shaka_1_1media_1_1mp4_1_1SegmentIndex.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1AC3Specific.html | 2 +- .../dfd/structshaka_1_1media_1_1H265Sps.html | 2 +- .../dff/webm__media__parser_8cc_source.html | 2 +- ...ructshaka_1_1media_1_1mp4_1_1FileType.html | 2 +- ...aka_1_1media_1_1mp4_1_1OriginalFormat.html | 2 +- ...ructshaka_1_1media_1_1mp4_1_1CueIDBox.html | 2 +- ..._1_1EncryptedStreamAttributes-members.html | 2 +- ...ka_1_1media_1_1WebMInfoParser-members.html | 2 +- ..._1_1mp4_1_1ElementaryStreamDescriptor.html | 2 +- .../classshaka_1_1media_1_1ESDescriptor.html | 2 +- .../producer__consumer__queue_8h_source.html | 2 +- .../d1a/classshaka_1_1Packager-members.html | 2 +- docs/d5/d1a/ts__section_8h_source.html | 2 +- ...ia_1_1mp4_1_1TrackRunIterator-members.html | 2 +- docs/d5/d27/key__fetcher_8cc_source.html | 2 +- ...aka_1_1media_1_1ProducerConsumerQueue.html | 2 +- ...haka_1_1media_1_1mp4_1_1Media-members.html | 2 +- ...2single__segment__segmenter_8h_source.html | 2 +- ...media_1_1mp2t_1_1TsSectionPsi-members.html | 2 +- docs/d5/d4d/box_8cc_source.html | 2 +- docs/d5/d52/ts__section__pes_8h_source.html | 2 +- ...ampleAuxiliaryInformationSize-members.html | 2 +- ...esentationStateChangeListener-members.html | 2 +- ...ssshaka_1_1MockRepresentation-members.html | 2 +- docs/d5/d5a/webvtt__timestamp_8cc_source.html | 2 +- .../d5c/continuity__counter_8cc_source.html | 2 +- ...haka_1_1media_1_1mp2t_1_1EsParserH265.html | 2 +- docs/d5/d63/network__util_8cc_source.html | 2 +- ...media_1_1NalUnitToByteStreamConverter.html | 2 +- docs/d5/d6f/vlog__flags_8cc_source.html | 2 +- ...der__configuration__record_8cc_source.html | 2 +- .../d5/d76/classshaka_1_1hls_1_1HlsEntry.html | 2 +- docs/d5/d7b/box__definitions_8h_source.html | 2 +- ...a_1_1media_1_1mp4_1_1MediaInformation.html | 2 +- .../d89/widevine__key__source_8cc_source.html | 2 +- ..._1_1media_1_1mp4_1_1CompositionOffset.html | 2 +- .../d8f/webm__cluster__parser_8cc_source.html | 2 +- ...media_1_1mp4_1_1EditListEntry-members.html | 2 +- docs/d5/d98/encryptor_8cc_source.html | 2 +- ...odec__configuration__record_8h_source.html | 2 +- ...H265ReferencePictureListModifications.html | 2 +- docs/d5/da4/aes__encryptor_8cc_source.html | 2 +- ...a_1_1media_1_1H265ReferencePictureSet.html | 2 +- .../classshaka_1_1media_1_1StreamInfo.html | 2 +- ...haka_1_1media_1_1mp2t_1_1EsParserH264.html | 2 +- docs/d5/dba/ts__packet_8cc_source.html | 2 +- .../dc1/webm__webvtt__parser_8cc_source.html | 2 +- ...media_1_1mp4_1_1TrackFragment-members.html | 2 +- ...4_1_1SampleAuxiliaryInformationOffset.html | 2 +- ...raw__key__encryption__flags_8h_source.html | 2 +- docs/d5/dcf/rsa__key_8h_source.html | 2 +- docs/d5/dda/ts__section__psi_8h_source.html | 2 +- docs/d5/de0/bit__reader_8cc_source.html | 2 +- ..._1media_1_1mp2t_1_1PesPacketGenerator.html | 12 +- .../de3/structshaka_1_1PackagingParams.html | 10 +- docs/d5/de9/replicator_8cc_source.html | 2 +- ...assshaka_1_1media_1_1WebMParserClient.html | 2 +- ...der__configuration__record_8cc_source.html | 2 +- ...mp4_1_1WebVTTConfigurationBox-members.html | 2 +- docs/d5/def/ts__section__pmt_8h_source.html | 2 +- docs/d5/df2/media__playlist_8cc_source.html | 163 +- ...ka_1_1media_1_1HlsNotifyMuxerListener.html | 2 +- ...shaka_1_1media_1_1MediaParser-members.html | 2 +- docs/d5/dfc/file_8cc_source.html | 2 +- docs/d5/dfe/classshaka_1_1File-members.html | 2 +- ...ady__key__encryption__flags_8h_source.html | 2 +- ...a_1_1media_1_1AesCbcDecryptor-members.html | 2 +- .../d09/aes__pattern__cryptor_8h_source.html | 2 +- .../d6/d16/text__stream__info_8cc_source.html | 2 +- docs/d6/d17/es__parser__h264_8cc_source.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1MovieHeader.html | 2 +- .../ts__packet__writer__util_8cc_source.html | 2 +- ...1_1media_1_1VideoStreamInfoParameters.html | 2 +- docs/d6/d2c/ts__stream__type_8h_source.html | 148 ++ .../d2e/mpd__notifier__util_8cc_source.html | 2 +- ...ssshaka_1_1media_1_1TextTrack-members.html | 2 +- .../webm__content__encodings_8cc_source.html | 2 +- .../combined__muxer__listener_8cc_source.html | 2 +- .../d3b/chunk__info__iterator_8cc_source.html | 2 +- docs/d6/d47/hls__params_8h_source.html | 14 +- ...ssshaka_1_1media_1_1EncryptionHandler.html | 18 +- ...2multi__segment__segmenter_8cc_source.html | 2 +- docs/d6/d55/aes__cryptor_8cc_source.html | 2 +- ...edia_1_1AVCDecoderConfigurationRecord.html | 2 +- ...ion__system__specific__info_8h_source.html | 2 +- docs/d6/d5b/classshaka_1_1Status-members.html | 2 +- ...1_1VPCodecConfigurationRecord-members.html | 2 +- docs/d6/d62/structshaka_1_1TestParams.html | 8 +- ...ka_1_1RawKeyParams_1_1KeyInfo-members.html | 2 +- docs/d6/d6a/cue_8h_source.html | 2 +- ...haka_1_1media_1_1RawKeySource-members.html | 2 +- docs/d6/d6c/h26x__bit__reader_8cc_source.html | 2 +- docs/d6/d6e/ts__section__pes_8cc_source.html | 234 +- docs/d6/d71/scoped__xml__ptr_8h_source.html | 2 +- .../d74/classshaka_1_1UdpOptions-members.html | 2 +- .../dash__iop__mpd__notifier_8h_source.html | 2 +- ...1media_1_1mp4_1_1VTTAdditionalTextBox.html | 2 +- .../d7b/webm__tracks__parser_8h_source.html | 2 +- ..._1media_1_1mp4_1_1AC3Specific-members.html | 2 +- .../d86/bandwidth__estimator_8cc_source.html | 2 +- ..._1_1media_1_1FakeMediaHandler-members.html | 6 +- docs/d6/d8a/vp9__parser_8cc_source.html | 2 +- ..._1_1RepresentationBaseXmlNode-members.html | 2 +- docs/d6/d9b/h264__parser_8h_source.html | 2 +- docs/d6/d9f/hls__flags_8cc_source.html | 17 +- docs/d6/da0/ts__section__pat_8h_source.html | 2 +- docs/d6/da3/mpd__builder_8h_source.html | 2 +- ...AVCDecoderConfigurationRecord-members.html | 2 +- ...iceHeader_1_1LongTermPicsInfo-members.html | 2 +- .../da9/classshaka_1_1media_1_1BitReader.html | 2 +- ...uctshaka_1_1media_1_1mp4_1_1VTTCueBox.html | 2 +- ...lassshaka_1_1media_1_1VideoStreamInfo.html | 2 +- ..._1_1VideoStreamInfoParameters-members.html | 2 +- .../d6/dbe/mp4__output__params_8h_source.html | 2 +- ...classshaka_1_1hls_1_1HlsEntry-members.html | 2 +- ...sParserH26x_1_1VideoSliceInfo-members.html | 2 +- ...media_1_1mp2t_1_1EsParserH26x-members.html | 2 +- docs/d6/dc8/mkv__writer_8cc_source.html | 2 +- ...media_1_1mp4_1_1SampleEncryptionEntry.html | 2 +- ...ssshaka_1_1media_1_1VP9Parser-members.html | 2 +- ...ia_1_1mp4_1_1SegmentReference-members.html | 2 +- ...shaka_1_1media_1_1mp2t_1_1EsParserAdts.png | Bin 828 -> 0 bytes ...tructshaka_1_1media_1_1H264SEIMessage.html | 2 +- ...tructshaka_1_1Mp4OutputParams-members.html | 2 +- ...1_1media_1_1H265VuiParameters-members.html | 2 +- ...1_1media_1_1mp4_1_1CueTimeBox-members.html | 2 +- ...haka_1_1media_1_1VPxFrameInfo-members.html | 2 +- docs/d6/de8/local__file_8cc_source.html | 2 +- docs/d6/de8/network__util_8h_source.html | 2 +- docs/d6/de9/ts__segmenter_8cc_source.html | 307 ++- docs/d6/ded/ts__packet_8h_source.html | 2 +- .../sync__sample__iterator_8cc_source.html | 2 +- ...ructshaka_1_1StreamDescriptor-members.html | 2 +- ...1media_1_1mp2t_1_1AudioHeader-members.html | 116 + docs/d6/dff/classshaka_1_1media_1_1Nalu.html | 2 +- ...edia_1_1mp4_1_1SampleGroupDescription.html | 2 +- ...ka_1_1media_1_1AdCueGenerator-members.html | 127 + ...a_1_1media_1_1mp4_1_1SoundMediaHeader.html | 2 +- ...xer__listener__test__helper_8h_source.html | 2 +- docs/d7/d12/media__parser_8h_source.html | 2 +- docs/d7/d15/mpd__notifier_8h_source.html | 2 +- ...ia_1_1mp4_1_1VideoSampleEntry-members.html | 2 +- .../d22/libcrypto__threading_8h_source.html | 2 +- ...1_1media_1_1mp4_1_1SyncSampleIterator.html | 2 +- ...ructshaka_1_1media_1_1H265Sps-members.html | 2 +- ...p4_1_1CompositionTimeToSample-members.html | 2 +- ...uctshaka_1_1media_1_1EncryptionConfig.html | 2 +- ...a_1_1media_1_1ContentEncoding-members.html | 2 +- ...on__system__specific__info_8cc_source.html | 2 +- ...ctshaka_1_1media_1_1mp4_1_1SampleSize.html | 2 +- ...ia_1_1mp4_1_1SampleEncryption-members.html | 2 +- ...ka_1_1media_1_1WebMListParser-members.html | 2 +- ...H26xByteToUnitStreamConverter-members.html | 2 +- ...lassshaka_1_1media_1_1DecryptorSource.html | 2 +- ...lassshaka_1_1hls_1_1SimpleHlsNotifier.html | 25 +- .../d6c/structshaka_1_1HlsParams-members.html | 9 +- .../classshaka_1_1media_1_1MediaSample.html | 2 +- ...onParams_1_1EncryptedStreamAttributes.html | 2 +- docs/d7/d75/callback__file_8h_source.html | 2 +- ..._1media_1_1mp4_1_1MediaHeader-members.html | 2 +- ...ka_1_1media_1_1H264SEIMessage-members.html | 2 +- docs/d7/d79/chunking__handler_8h_source.html | 162 +- docs/d7/d7c/vlog__flags_8h_source.html | 2 +- .../d7/d87/video__stream__info_8h_source.html | 2 +- ..._1H265SliceHeader_1_1LongTermPicsInfo.html | 2 +- docs/d7/d9d/progress__listener_8h_source.html | 2 +- .../da4/track__run__iterator_8h_source.html | 22 +- .../dad/simple__hls__notifier_8cc_source.html | 402 +-- ...uctshaka_1_1media_1_1mp4_1_1MediaData.html | 2 +- docs/d7/db0/mpd__writer_8h_source.html | 2 +- ...media_1_1mp4_1_1SampleToChunk-members.html | 2 +- docs/d7/dbd/classshaka_1_1LocalFile.html | 2 +- ...ka_1_1media_1_1mp4_1_1TextSampleEntry.html | 2 +- docs/d7/dc6/byte__queue_8h_source.html | 2 +- .../d7/dd0/mpd__notifier__util_8h_source.html | 2 +- docs/d7/dd4/request__signer_8h_source.html | 2 +- ...aka_1_1media_1_1mp4_1_1MP4MediaParser.html | 2 +- docs/d7/dd6/key__source_8cc_source.html | 2 +- .../dda/classshaka_1_1media_1_1ByteQueue.html | 2 +- ...assshaka_1_1media_1_1RsaRequestSigner.html | 2 +- ...classshaka_1_1media_1_1HttpKeyFetcher.html | 2 +- ...1_1media_1_1mp4_1_1SampleToGroupEntry.html | 2 +- ...to__unit__stream__converter_8h_source.html | 2 +- docs/d7/dee/mpd__generator_8cc_source.html | 2 +- .../d7/def/mp4__media__parser_8cc_source.html | 1066 ++++---- docs/d7/df9/byte__queue_8cc_source.html | 2 +- ..._1_1PlayreadyEncryptionParams-members.html | 2 +- ...edia_1_1H264ByteToUnitStreamConverter.html | 2 +- ...1_1media_1_1WebMClusterParser-members.html | 6 +- ..._1_1media_1_1mp2t_1_1TsWriter-members.html | 8 +- ..._1media_1_1mp4_1_1MovieHeader-members.html | 2 +- docs/d8/d0d/media__sample_8cc_source.html | 2 +- ...shaka_1_1media_1_1mp4_1_1DecodingTime.html | 2 +- ..._1_1media_1_1mp4_1_1PrivFrame-members.html | 2 +- ...ssshaka_1_1media_1_1BitReader-members.html | 2 +- .../d14/classshaka_1_1media_1_1VP8Parser.html | 2 +- ...haka_1_1media_1_1MuxerOptions-members.html | 2 +- .../d19/bandwidth__estimator_8h_source.html | 2 +- docs/d8/d1c/crypto__flags_8cc_source.html | 2 +- ...edia_1_1mp4_1_1WebVTTConfigurationBox.html | 2 +- ...ka_1_1media_1_1SubsampleEntry-members.html | 2 +- docs/d8/d28/es__parser__h265_8h_source.html | 2 +- ..._content__encodings__client_8h_source.html | 2 +- ...ructshaka_1_1WidevineDecryptionParams.html | 2 +- docs/d8/d4d/aes__decryptor_8h_source.html | 2 +- ...sshaka_1_1media_1_1TextSample-members.html | 2 +- docs/d8/d53/crypto__flags_8h_source.html | 2 +- ...a_1_1media_1_1mp4_1_1AudioSampleEntry.html | 2 +- .../d8/d66/classshaka_1_1UdpFile-members.html | 2 +- ...ka_1_1media_1_1ClusterBuilder-members.html | 2 +- ...ka_1_1media_1_1mp4_1_1DataInformation.html | 2 +- docs/d8/d6f/origin__handler_8h_source.html | 4 +- ...a_1_1media_1_1mp4_1_1Metadata-members.html | 2 +- .../classshaka_1_1media_1_1TracksBuilder.html | 2 +- .../d81/classshaka_1_1LocalFile-members.html | 2 +- ...assshaka_1_1media_1_1WebMTracksParser.html | 2 +- ...1media_1_1mp4_1_1MovieExtends-members.html | 2 +- docs/d8/d8e/classshaka_1_1AdaptationSet.html | 2 +- ...a_1_1media_1_1AesCtrEncryptor-members.html | 2 +- ..._1_1media_1_1AesRequestSigner-members.html | 2 +- ...media_1_1H264DecRefPicMarking-members.html | 2 +- ...1_1mp4_1_1SubtitleMediaHeader-members.html | 2 +- docs/d8/d94/pes__packet_8h_source.html | 2 +- ..._1mp4_1_1VTTAdditionalTextBox-members.html | 2 +- docs/d8/d9a/fragmenter_8cc_source.html | 2 +- .../d9c/webm__tracks__parser_8cc_source.html | 2 +- docs/d8/d9f/udp__file_8h_source.html | 2 +- ...a_1_1media_1_1DecryptorSource-members.html | 2 +- ...1_1media_1_1mp4_1_1SampleSize-members.html | 2 +- ...sshaka_1_1media_1_1NaluReader-members.html | 2 +- docs/d8/daa/stream__info_8h_source.html | 2 +- docs/d8/daf/namespaceshaka.html | 7 +- ...media_1_1mp4_1_1MultiSegmentSegmenter.html | 2 +- ...1_1WebMContentEncodingsClient-members.html | 2 +- ...sshaka_1_1media_1_1Replicator-members.html | 6 +- ...p2t_1_1EsParserH26x_1_1VideoSliceInfo.html | 2 +- ...ctshaka_1_1media_1_1mp4_1_1CueTimeBox.html | 2 +- docs/d8/dca/ts__writer_8h_source.html | 96 +- ...1media_1_1mp4_1_1DecodingTime-members.html | 2 +- ...1media_1_1mp4_1_1TrackExtends-members.html | 2 +- ...1_1media_1_1mp2t_1_1ContinuityCounter.html | 2 +- ...1mp4_1_1CencSampleEncryptionInfoEntry.html | 2 +- .../de1/classshaka_1_1SimpleMpdNotifier.html | 2 +- .../de6/webm__crypto__helpers_8h_source.html | 2 +- ..._1_1media_1_1mp2t_1_1EsParser-members.html | 2 +- docs/d8/deb/retired__flags_8cc_source.html | 2 +- ...media_1_1AudioTimestampHelper-members.html | 2 +- ...ssshaka_1_1media_1_1VPxParser-members.html | 2 +- ...single__segment__segmenter_8cc_source.html | 2 +- ...a_1_1media_1_1SegmentTestBase-members.html | 2 +- ...to__byte__stream__converter_8h_source.html | 2 +- ...media_1_1OnMediaEndParameters-members.html | 2 +- ...2single__segment__segmenter_8h_source.html | 2 +- docs/d9/d08/mock__mpd__builder_8h_source.html | 2 +- ...dia_1_1HlsNotifyMuxerListener-members.html | 2 +- .../classshaka_1_1media_1_1RsaPublicKey.html | 2 +- docs/d9/d12/chunking__handler_8cc_source.html | 385 +-- .../classshaka_1_1media_1_1BufferReader.html | 2 +- ...haka_1_1media_1_1mp4_1_1MovieFragment.html | 2 +- ...haka_1_1media_1_1AesEncryptor-members.html | 2 +- ...assshaka_1_1media_1_1mp4_1_1Segmenter.html | 2 +- ...aka_1_1media_1_1TracksBuilder-members.html | 2 +- .../webm__content__encodings_8h_source.html | 2 +- ...aka_1_1media_1_1mp4_1_1VTTEmptyCueBox.html | 2 +- ...aka_1_1media_1_1mp4_1_1CueSourceIDBox.html | 2 +- ..._1_1media_1_1mp4_1_1ChunkInfoIterator.html | 2 +- ...1MuxerListener_1_1MediaRanges-members.html | 2 +- ...ctshaka_1_1media_1_1H265VuiParameters.html | 2 +- ...aka_1_1media_1_1CombinedMuxerListener.html | 2 +- ...a_1_1media_1_1H264SliceHeader-members.html | 2 +- docs/d9/d76/ts__muxer_8cc_source.html | 2 +- ...aka_1_1media_1_1ClosureThread-members.html | 2 +- docs/d9/d86/limits_8h_source.html | 2 +- ..._1media_1_1WebMContentEncodingsClient.html | 2 +- ...assshaka_1_1media_1_1AesRequestSigner.html | 2 +- ...1ProtectionSystemSpecificInfo-members.html | 2 +- docs/d9/d90/text__track_8h_source.html | 2 +- ...sshaka_1_1hls_1_1MediaPlaylistFactory.html | 2 +- docs/d9/da4/stream__descriptor_8h_source.html | 2 +- ...ka_1_1media_1_1MpdNotifyMuxerListener.html | 2 +- .../structshaka_1_1media_1_1Cue-members.html | 2 +- ..._1_1media_1_1mp4_1_1Segmenter-members.html | 2 +- .../structshaka_1_1BufferCallbackParams.html | 2 +- ..._1_1CompositionOffsetIterator-members.html | 2 +- ...ntent__protection__element_8cc_source.html | 2 +- docs/d9/db9/muxer_8cc_source.html | 2 +- ...haka_1_1media_1_1BufferReader-members.html | 2 +- ...1mp4_1_1SampleEncryptionEntry-members.html | 2 +- ...sshaka_1_1media_1_1BitWriter-members.html} | 22 +- docs/d9/dc8/webm__constants_8cc_source.html | 2 +- .../d9/dcc/webm__video__client_8h_source.html | 2 +- ...ructshaka_1_1WidevineEncryptionParams.html | 2 +- docs/d9/dda/ac3__header_8cc_source.html | 257 ++ .../d9/de0/structshaka_1_1media_1_1Range.html | 2 +- .../de2/mock__media__playlist_8cc_source.html | 2 +- .../muxer__listener__internal_8cc_source.html | 2 +- .../deb/classshaka_1_1hls_1_1HlsNotifier.html | 2 +- ...c__audio__specific__config_8cc_source.html | 2 +- ...p4_1_1TrackFragmentDecodeTime-members.html | 2 +- ...lassshaka_1_1media_1_1OffsetByteQueue.html | 2 +- docs/d9/dfe/classshaka_1_1UdpOptions.html | 2 +- ..._1_1media_1_1H264ModificationOfPicNum.html | 2 +- .../d04/audio__stream__info_8cc_source.html | 2 +- ...shaka_1_1hls_1_1MediaPlaylist-members.html | 25 +- ...assshaka_1_1media_1_1mp2t_1_1EsParser.html | 10 +- ...lassshaka_1_1media_1_1mp2t_1_1EsParser.png | Bin 1824 -> 1900 bytes ...1_1AudioProgramMapTableWriter-members.html | 113 + ...ructshaka_1_1media_1_1mp4_1_1Language.html | 2 +- ...ssshaka_1_1media_1_1mp2t_1_1TsSection.html | 2 +- docs/da/d1d/udp__options_8cc_source.html | 2 +- ...haka_1_1media_1_1mp2t_1_1EsParserH26x.html | 2 +- docs/da/d23/ts__muxer_8h_source.html | 4 +- docs/da/d24/h265__parser_8h_source.html | 2 +- docs/da/d2a/text__stream__info_8h_source.html | 2 +- ...1_1media_1_1webm_1_1WebMMuxer-members.html | 6 +- ...ia_1_1mp4_1_1PixelAspectRatio-members.html | 2 +- ..._2multi__segment__segmenter_8h_source.html | 2 +- ...ructshaka_1_1ContentProtectionElement.html | 2 +- docs/da/d4a/media__playlist_8h_source.html | 87 +- ...lassshaka_1_1media_1_1AudioStreamInfo.html | 2 +- ...1_1media_1_1mp4_1_1MovieExtendsHeader.html | 2 +- docs/da/d53/es__parser__h265_8cc_source.html | 2 +- .../d55/simple__hls__notifier_8h_source.html | 128 +- ..._1_1media_1_1mp4_1_1CompactSampleSize.html | 2 +- .../d5c/widevine__key__source_8h_source.html | 2 +- ...1_1H264VideoSliceHeaderParser-members.html | 2 +- ...mp4_1_1SingleSegmentSegmenter-members.html | 2 +- ..._1mp2t_1_1VideoProgramMapTableWriter.html} | 54 +- ..._1_1mp2t_1_1VideoProgramMapTableWriter.png | Bin 0 -> 1151 bytes ...edia_1_1mp4_1_1AudioRollRecoveryEntry.html | 2 +- ...1media_1_1mp2t_1_1TsSegmenter-members.html | 2 +- docs/da/d88/mp4__muxer_8cc_source.html | 2 +- ...a_1_1media_1_1WebMMediaParser-members.html | 2 +- docs/da/d8e/container__names_8cc_source.html | 2 +- docs/da/d93/origin__handler_8cc_source.html | 2 +- .../d93/structshaka_1_1media_1_1CueEvent.html | 123 + ...a_1_1mp4_1_1CompositionOffset-members.html | 2 +- ..._1media_1_1mp4_1_1EC3Specific-members.html | 2 +- ...ssshaka_1_1MpdNotifierFactory-members.html | 2 +- ...1_1media_1_1MockMuxerListener-members.html | 2 +- ...assshaka_1_1media_1_1mp2t_1_1TsPacket.html | 2 +- .../classshaka_1_1Representation-members.html | 2 +- ...a_1_1media_1_1mp4_1_1HandlerReference.html | 2 +- docs/da/dc3/status_8cc_source.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1TrackHeader.html | 2 +- ...aka_1_1media_1_1OriginHandler-members.html | 6 +- docs/da/dcb/es__descriptor_8h_source.html | 2 +- .../playready__key__source_8cc_source.html | 2 +- .../structshaka_1_1media_1_1mp4_1_1Edit.html | 2 +- docs/da/dd0/webm__info__parser_8h_source.html | 2 +- docs/da/dd1/fragmenter_8h_source.html | 2 +- ..._1_1media_1_1mp2t_1_1TsPacket-members.html | 2 +- ...H264ByteToUnitStreamConverter-members.html | 2 +- ...ia_1_1mp2t_1_1Mp2tMediaParser-members.html | 2 +- ...media_1_1H264SEIRecoveryPoint-members.html | 2 +- ...ssshaka_1_1media_1_1WidevineKeySource.html | 2 +- ...a_1_1mp4_1_1SampleDescription-members.html | 2 +- .../da/de2/mock__mpd__builder_8cc_source.html | 2 +- ...ssshaka_1_1media_1_1WebMClusterParser.html | 14 +- ...1_1media_1_1mp4_1_1SchemeType-members.html | 2 +- ...a_1_1media_1_1AudioStreamInfo-members.html | 2 +- ...1media_1_1mp4_1_1ProtectionSchemeInfo.html | 2 +- ..._1media_1_1H264VideoSliceHeaderParser.html | 2 +- docs/da/df4/aes__decryptor_8cc_source.html | 2 +- ..._1_1media_1_1mp4_1_1SampleDescription.html | 2 +- ...1_1media_1_1AesPatternCryptor-members.html | 2 +- .../classshaka_1_1media_1_1MediaHandler.html | 39 +- .../classshaka_1_1media_1_1MediaHandler.png | Bin 4964 -> 5471 bytes ...ructshaka_1_1media_1_1H265SliceHeader.html | 2 +- .../webvtt__sample__converter_8h_source.html | 2 +- ...1_1media_1_1mp4_1_1CodecConfiguration.html | 2 +- ...sshaka_1_1media_1_1H265Parser-members.html | 2 +- ...media_1_1H264WeightingFactors-members.html | 2 +- .../d1b/classshaka_1_1MemoryFile-members.html | 2 +- .../classshaka_1_1media_1_1TextSample.html | 2 +- ..._1media_1_1mp4_1_1SubtitleMediaHeader.html | 2 +- ..._1VideoProgramMapTableWriter-members.html} | 21 +- ...lassshaka_1_1media_1_1mp4_1_1MP4Muxer.html | 18 +- ...to__unit__stream__converter_8h_source.html | 2 +- .../d31/track__run__iterator_8cc_source.html | 904 +++---- ...1_1mp2t_1_1PesPacketGenerator-members.html | 2 +- ...dia_1_1VideoSliceHeaderParser-members.html | 2 +- ...pd__notify__muxer__listener_8h_source.html | 2 +- .../d4b/classshaka_1_1MockAdaptationSet.html | 2 +- ...a_1_1mp4_1_1CompositionOffsetIterator.html | 2 +- .../db/d51/mp2t__media__parser_8h_source.html | 26 +- ..._single__segment__segmenter_8h_source.html | 2 +- .../media__handler__test__base_8h_source.html | 6 +- .../d5a/classshaka_1_1media_1_1VP9Parser.html | 2 +- docs/db/d60/mpd__options_8h_source.html | 2 +- .../d64/webvtt__media__parser_8h_source.html | 2 +- ..._1media_1_1mp4_1_1SegmentType-members.html | 2 +- docs/db/d66/udp__file_8cc_source.html | 94 +- .../d6b/structshaka_1_1MpdParams-members.html | 2 +- docs/db/d71/http__key__fetcher_8h_source.html | 2 +- ...EVCDecoderConfigurationRecord-members.html | 2 +- ...TwoPassSingleSegmentSegmenter-members.html | 2 +- ..._1_1mp2t_1_1ContinuityCounter-members.html | 2 +- docs/db/d79/chunking__params_8h_source.html | 2 +- docs/db/d7e/muxer__options_8cc_source.html | 2 +- ...dia_1_1AACAudioSpecificConfig-members.html | 2 +- .../classshaka_1_1media_1_1NaluReader.html | 2 +- docs/db/d8f/mp4__muxer_8h_source.html | 4 +- ...classshaka_1_1media_1_1ClusterBuilder.html | 2 +- ...ssshaka_1_1media_1_1mp4_1_1Fragmenter.html | 2 +- ...a_1_1media_1_1mp4_1_1ChunkLargeOffset.html | 2 +- docs/db/d96/wvm__media__parser_8h_source.html | 8 +- .../da4/classBandwidthEstimator-members.html | 2 +- docs/db/da6/memory__file_8h_source.html | 2 +- ...edia_1_1WebVttSampleConverter-members.html | 2 +- ...classshaka_1_1media_1_1TextStreamInfo.html | 2 +- ...classshaka_1_1media_1_1WebMInfoParser.html | 2 +- ...ia_1_1mp4_1_1SoundMediaHeader-members.html | 2 +- ...CencSampleEncryptionInfoEntry-members.html | 2 +- ...haka_1_1media_1_1OnMediaEndParameters.html | 2 +- ...ka_1_1media_1_1mp4_1_1TrackEncryption.html | 2 +- .../dcb/classshaka_1_1media_1_1VPxParser.html | 2 +- docs/db/dcd/classshaka_1_1MpdWriter.html | 2 +- ..._1media_1_1mp4_1_1DTSSpecific-members.html | 2 +- docs/db/dd0/classshaka_1_1Packager.html | 12 +- .../classshaka_1_1media_1_1RawKeySource.html | 2 +- ...edia_1_1VodMediaInfoDumpMuxerListener.html | 2 +- .../dd2/chunk__info__iterator_8h_source.html | 2 +- .../dd9/sync__sample__iterator_8h_source.html | 2 +- docs/db/dde/h265__parser_8cc_source.html | 2 +- ...assshaka_1_1media_1_1TrickPlayHandler.html | 18 +- .../audio__timestamp__helper_8cc_source.html | 2 +- docs/db/dee/pes__packet_8cc_source.html | 2 +- ...a_1_1media_1_1H265SliceHeader-members.html | 2 +- ...lassshaka_1_1media_1_1Cluster-members.html | 2 +- docs/db/df6/muxer_8h_source.html | 4 +- ...edia_1_1H265ByteToUnitStreamConverter.html | 2 +- docs/db/dfb/mpd__utils_8cc_source.html | 2 +- ...d__notify__muxer__listener_8cc_source.html | 2 +- ..._1_1media_1_1mp4_1_1ChunkInfo-members.html | 2 +- ...edia_1_1mp2t_1_1ProgramMapTableWriter.html | 65 +- ...media_1_1mp2t_1_1ProgramMapTableWriter.png | Bin 1590 -> 1587 bytes ...sshaka_1_1media_1_1StreamInfo-members.html | 2 +- ...aw__key__encryption__flags_8cc_source.html | 2 +- ...haka_1_1media_1_1ESDescriptor-members.html | 2 +- .../d16/classshaka_1_1media_1_1SeekHead.html | 2 +- docs/dc/d17/status__test__util_8h_source.html | 2 +- ...aka_1_1media_1_1wvm_1_1WvmMediaParser.html | 8 +- ..._1mp4_1_1ProtectionSchemeInfo-members.html | 2 +- docs/dc/d19/box_8h_source.html | 2 +- ..._1mp2t_1_1AudioProgramMapTableWriter.html} | 54 +- ..._1_1mp2t_1_1AudioProgramMapTableWriter.png | Bin 0 -> 1141 bytes docs/dc/d1c/replicator_8h_source.html | 4 +- ...ssshaka_1_1media_1_1mp2t_1_1Ac3Header.html | 468 ++++ ...assshaka_1_1media_1_1mp2t_1_1Ac3Header.png | Bin 0 -> 789 bytes .../dash__iop__mpd__notifier_8cc_source.html | 2 +- ...ructshaka_1_1EncryptionParams-members.html | 2 +- .../d3c/webm__cluster__parser_8h_source.html | 10 +- docs/dc/d3f/key__source_8h_source.html | 2 +- ...ssshaka_1_1hls_1_1HlsNotifier-members.html | 2 +- .../classshaka_1_1xml_1_1XmlNode-members.html | 2 +- .../classshaka_1_1media_1_1BufferWriter.html | 2 +- ...rotectionSystemSpecificHeader-members.html | 2 +- ..._1media_1_1mp4_1_1TrackHeader-members.html | 2 +- ...o__unit__stream__converter_8cc_source.html | 26 +- .../decoding__time__iterator_8h_source.html | 2 +- docs/dc/d53/webm_2segmenter_8cc_source.html | 2 +- ...haka_1_1media_1_1H264DecRefPicMarking.html | 2 +- docs/dc/d56/audio__header_8h_source.html | 162 ++ .../dc/d58/webm__media__parser_8h_source.html | 2 +- .../dc/d5c/classshaka_1_1MockMpdNotifier.html | 2 +- ...edia_1_1mp4_1_1CueSettingsBox-members.html | 2 +- ...1_1media_1_1webm_1_1Segmenter-members.html | 2 +- ...1_1media_1_1mp2t_1_1TsSection-members.html | 2 +- ...ssshaka_1_1media_1_1MockMuxerListener.html | 2 +- .../d76/classshaka_1_1media_1_1BitWriter.html | 250 ++ docs/dc/d7b/closure__thread_8cc_source.html | 2 +- docs/dc/d7b/h264__parser_8cc_source.html | 2 +- ...1_1ElementaryStreamDescriptor-members.html | 2 +- ...ka_1_1media_1_1mp2t_1_1EsParserAudio.html} | 42 +- ...haka_1_1media_1_1mp2t_1_1EsParserAudio.png | Bin 0 -> 828 bytes ..._1media_1_1mp4_1_1MovieFragmentHeader.html | 2 +- ...structshaka_1_1media_1_1Range-members.html | 2 +- .../da0/structshaka_1_1EncryptionParams.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1DTSSpecific.html | 2 +- docs/dc/da1/classshaka_1_1MpdBuilder.html | 2 +- .../buffer__callback__params_8h_source.html | 2 +- .../da3/es__parser__audio_8h_source.html} | 140 +- ...lassshaka_1_1media_1_1ContentEncoding.html | 2 +- docs/dc/dbf/box__buffer_8h_source.html | 2 +- ...1xml_1_1RepresentationXmlNode-members.html | 2 +- ...dia_1_1mp2t_1_1EsParserAudio-members.html} | 18 +- ...classshaka_1_1media_1_1WebMListParser.html | 2 +- ...uctshaka_1_1media_1_1CueEvent-members.html | 107 + docs/dc/dd9/rsa__key_8cc_source.html | 2 +- .../structshaka_1_1media_1_1mp4_1_1Media.html | 2 +- docs/dc/de1/structshaka_1_1SegmentInfo.html | 2 +- ...1_1media_1_1mp4_1_1Fragmenter-members.html | 2 +- ...to__unit__stream__converter_8h_source.html | 2 +- docs/dc/dec/ts__section__pmt_8cc_source.html | 2 +- .../classshaka_1_1media_1_1ClosureThread.html | 2 +- .../structshaka_1_1TestParams-members.html | 2 +- ...ssshaka_1_1media_1_1WebVttMediaParser.html | 2 +- ...ebm_1_1SingleSegmentSegmenter-members.html | 2 +- ...ia_1_1mp4_1_1TrackFragmentRun-members.html | 2 +- docs/dc/df8/closure__thread_8h_source.html | 2 +- docs/dd/d05/encryption__config_8h_source.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1ChunkOffset.html | 2 +- docs/dd/d0c/classshaka_1_1ThreadedIoFile.html | 2 +- docs/dd/d11/mpd__builder_8cc_source.html | 2 +- docs/dd/d12/mpd__writer_8cc_source.html | 2 +- ...mp4_1_1SampleAuxiliaryInformationSize.html | 2 +- .../d17/classshaka_1_1media_1_1Demuxer.html | 18 +- .../d19/video__stream__info_8cc_source.html | 2 +- .../classshaka_1_1hls_1_1MediaPlaylist.html | 32 +- .../dd/d30/wvm__media__parser_8cc_source.html | 2241 ++++++++--------- docs/dd/d3a/gflags__hex__bytes_8h_source.html | 2 +- docs/dd/d3b/mp4_2segmenter_8h_source.html | 4 +- docs/dd/d3e/callback__file_8cc_source.html | 2 +- ...ctshaka_1_1media_1_1mp4_1_1SyncSample.html | 2 +- docs/dd/d40/classshaka_1_1CallbackFile.html | 2 +- docs/dd/d42/encryptor_8h_source.html | 2 +- docs/dd/d46/webm__parser_8h_source.html | 2 +- ...media_1_1mp4_1_1MovieFragment-members.html | 2 +- ...a_1_1hls_1_1SimpleHlsNotifier-members.html | 4 +- ...m_1_1DemuxStreamIdMediaSample-members.html | 2 +- ...widevine__encryption__flags_8h_source.html | 2 +- docs/dd/d58/bit__writer_8cc_source.html | 143 ++ docs/dd/d58/crypto__params_8h_source.html | 2 +- ...media_1_1mp2t_1_1EsParserH265-members.html | 2 +- ...1_1media_1_1mp4_1_1SchemeInfo-members.html | 2 +- docs/dd/d60/raw__key__source_8h_source.html | 2 +- ...1_1media_1_1mp4_1_1SyncSample-members.html | 2 +- docs/dd/d65/vp8__parser_8h_source.html | 2 +- ...o__unit__stream__converter_8cc_source.html | 2 +- ...1_1H265VideoSliceHeaderParser-members.html | 2 +- ...a_1_1media_1_1mp4_1_1PixelAspectRatio.html | 2 +- ..._1_1MediaHandlerGraphTestBase-members.html | 2 +- .../classshaka_1_1media_1_1MuxerListener.html | 2 +- docs/dd/d80/media__sample_8h_source.html | 2 +- docs/dd/d87/memory__file_8cc_source.html | 2 +- .../d88/pes__packet__generator_8h_source.html | 34 +- docs/dd/d8c/file__test__util_8h_source.html | 2 +- ...1media_1_1mp4_1_1SegmentIndex-members.html | 2 +- .../classshaka_1_1ThreadedIoFile-members.html | 2 +- .../ts__packet__writer__util_8h_source.html | 2 +- .../audio__timestamp__helper_8h_source.html | 2 +- ...a_1_1media_1_1mp4_1_1SegmentReference.html | 2 +- .../classshaka_1_1MpdNotifier-members.html | 2 +- .../da4/structshaka_1_1xml_1_1XmlDeleter.html | 2 +- ...webm_1_1TwoPassSingleSegmentSegmenter.html | 2 +- ...info__dump__muxer__listener_8h_source.html | 2 +- docs/dd/dab/webm__muxer_8h_source.html | 4 +- ..._1mp4_1_1WebVTTSourceLabelBox-members.html | 2 +- ...a_1_1media_1_1WebMAudioClient-members.html | 2 +- ..._1media_1_1mp4_1_1SampleTable-members.html | 2 +- docs/dd/db5/packager_8h_source.html | 223 +- ...a_1_1xml_1_1RepresentationBaseXmlNode.html | 2 +- docs/dd/dbc/buffer__reader_8cc_source.html | 2 +- .../dd/dbc/encryption__handler_8h_source.html | 106 +- ...structshaka_1_1media_1_1EncryptionKey.html | 2 +- ...dia_1_1mp4_1_1TrackEncryption-members.html | 2 +- .../dbf/webm__webvtt__parser_8h_source.html | 2 +- ...tructshaka_1_1media_1_1mp4_1_1FullBox.html | 2 +- ...edia_1_1ProducerConsumerQueue-members.html | 2 +- ...ssshaka_1_1media_1_1webm_1_1Segmenter.html | 2 +- ...edia_1_1mp4_1_1OriginalFormat-members.html | 2 +- docs/dd/dce/structshaka_1_1media_1_1Cue.html | 2 +- docs/dd/dd2/buffer__writer_8h_source.html | 2 +- docs/dd/dd3/buffer__writer_8cc_source.html | 2 +- ...a_1_1media_1_1WebMVideoClient-members.html | 2 +- .../dd8/mock__muxer__listener_8cc_source.html | 2 +- ...tshaka_1_1media_1_1mp4_1_1Box-members.html | 2 +- .../ddc/trick__play__handler_8h_source.html | 4 +- ...ka_1_1media_1_1VideoSliceHeaderParser.html | 2 +- ...ructshaka_1_1media_1_1H265Pps-members.html | 2 +- docs/dd/de7/xml__node_8h_source.html | 2 +- ...haka_1_1media_1_1MediaHandler-members.html | 6 +- ...structshaka_1_1ChunkingParams-members.html | 2 +- docs/dd/dee/box__definitions_8cc_source.html | 2 +- ..._2multi__segment__segmenter_8h_source.html | 2 +- ...a_1_1media_1_1mp4_1_1TrackFragmentRun.html | 2 +- ...ructshaka_1_1media_1_1mp4_1_1Metadata.html | 2 +- .../structshaka_1_1AdCueGeneratorParams.html | 124 + docs/de/d00/ac3__header_8h_source.html | 162 ++ docs/de/d0f/local__file_8h_source.html | 2 +- docs/de/d12/container__names_8h_source.html | 2 +- docs/de/d13/ts__writer_8cc_source.html | 178 +- ...a_1_1media_1_1TextTrackConfig-members.html | 2 +- docs/de/d17/cluster__builder_8cc_source.html | 2 +- ...edia_1_1wvm_1_1WvmMediaParser-members.html | 2 +- ...single__segment__segmenter_8cc_source.html | 2 +- .../d22/aes__pattern__cryptor_8cc_source.html | 2 +- ...a_1_1mp2t_1_1H264ProgramMapTableWriter.png | Bin 1147 -> 0 bytes .../d27/es__parser__audio_8cc_source.html} | 477 ++-- ...shaka_1_1media_1_1mp4_1_1TrackExtends.html | 2 +- ..._1_1media_1_1WebMTracksParser-members.html | 2 +- .../d33/structshaka_1_1media_1_1H265Pps.html | 2 +- .../de/d34/offset__byte__queue_8h_source.html | 2 +- ...o__unit__stream__converter_8cc_source.html | 2 +- docs/de/d3c/macros_8h_source.html | 2 +- docs/de/d3e/buffer__reader_8h_source.html | 2 +- ...sshaka_1_1media_1_1H264Parser-members.html | 2 +- ...1_1media_1_1mp2t_1_1PesPacket-members.html | 2 +- .../classshaka_1_1media_1_1DecryptConfig.html | 2 +- .../muxer__listener__internal_8h_source.html | 2 +- docs/de/d52/classshaka_1_1Representation.html | 2 +- ...edia_1_1FakeInputMediaHandler-members.html | 6 +- ...a_1_1media_1_1mp4_1_1Language-members.html | 2 +- docs/de/d5b/adts__header_8cc_source.html | 204 +- docs/de/d5c/mpd__flags_8h_source.html | 2 +- ...mp2t_1_1ProgramMapTableWriter-members.html | 15 +- ...assshaka_1_1media_1_1mp2t_1_1TsWriter.html | 53 +- .../d6c/mock__media__playlist_8h_source.html | 22 +- ..._1_1mp4_1_1SampleToGroupEntry-members.html | 2 +- ...dia_1_1MockOutputMediaHandler-members.html | 6 +- docs/de/d6e/language__utils_8h_source.html | 2 +- .../de/d70/http__key__fetcher_8cc_source.html | 2 +- ...content__encodings__client_8cc_source.html | 2 +- docs/de/d7b/mp4__media__parser_8h_source.html | 2 +- ...haka_1_1media_1_1mp2t_1_1TsSectionPsi.html | 2 +- ...ptedStreamAttributes_1_1OneOf-members.html | 2 +- ...ox__definitions__comparison_8h_source.html | 2 +- .../classshaka_1_1media_1_1OriginHandler.html | 18 +- ...edia_1_1wvm_1_1PrevSampleData-members.html | 2 +- ...1_1mp4_1_1MovieFragmentHeader-members.html | 2 +- ...ssshaka_1_1media_1_1VP8Parser-members.html | 2 +- docs/de/da9/structshaka_1_1Element.html | 2 +- docs/de/dab/es__parser__h26x_8cc_source.html | 2 +- docs/de/dad/classshaka_1_1MemoryFile.html | 2 +- docs/de/dad/validate__flag_8cc_source.html | 2 +- ...ka_1_1media_1_1MockOutputMediaHandler.html | 18 +- ...lassshaka_1_1media_1_1TextTrackConfig.html | 2 +- .../classshaka_1_1media_1_1H26xBitReader.html | 2 +- docs/de/dbf/udp__options_8h_source.html | 6 +- docs/de/dc1/demuxer_8h_source.html | 2 +- .../classshaka_1_1media_1_1H265Parser.html | 2 +- ..._1mp4_1_1DecodingTimeToSample-members.html | 2 +- docs/de/dcb/ts__segmenter_8h_source.html | 70 +- .../dcc/mock__mpd__notifier_8cc_source.html | 2 +- docs/de/dcf/file__closer_8h_source.html | 2 +- ...ontent__protection__element_8h_source.html | 2 +- ...er__listener__test__helper_8cc_source.html | 2 +- .../classshaka_1_1media_1_1Muxer-members.html | 6 +- ...aka_1_1media_1_1WebVttSampleConverter.html | 2 +- ...shaka_1_1media_1_1mp2t_1_1TsSegmenter.html | 12 +- ..._1_1media_1_1mp4_1_1MediaData-members.html | 2 +- ..._1media_1_1DecoderConfigurationRecord.html | 2 +- ...a_1_1media_1_1mp4_1_1MP4Muxer-members.html | 6 +- ...classshaka_1_1media_1_1AdCueGenerator.html | 208 ++ .../classshaka_1_1media_1_1AdCueGenerator.png | Bin 0 -> 743 bytes .../de4/structshaka_1_1media_1_1H264Pps.html | 2 +- ...edia_1_1H26xByteToUnitStreamConverter.html | 2 +- docs/de/deb/structshaka_1_1Cuepoint.html | 122 + ...1media_1_1mp4_1_1DecodingTimeToSample.html | 2 +- .../combined__muxer__listener_8h_source.html | 2 +- ...a_1_1media_1_1mp4_1_1TrackRunIterator.html | 20 +- docs/de/dfa/muxer__listener_8h_source.html | 2 +- ...shaka_1_1media_1_1mp4_1_1OpusSpecific.html | 2 +- docs/de/dfd/stream__info_8cc_source.html | 2 +- .../d00/playready__key__source_8h_source.html | 2 +- ...dec__configuration__record_8cc_source.html | 2 +- .../d1a/offset__byte__queue_8cc_source.html | 2 +- ...shaka_1_1media_1_1MediaSample-members.html | 2 +- ...mposition__offset__iterator_8h_source.html | 2 +- ...mentTestBase_1_1ClusterParser-members.html | 2 +- .../df/d22/structshaka_1_1WidevineSigner.html | 32 +- docs/df/d22/validate__flag_8h_source.html | 2 +- ..._1mp4_1_1DecodingTimeIterator-members.html | 2 +- ...lassshaka_1_1media_1_1AesCbcDecryptor.html | 2 +- docs/df/d31/muxer__util_8cc_source.html | 2 +- .../df/d32/audio__stream__info_8h_source.html | 2 +- .../classshaka_1_1AdaptationSet-members.html | 2 +- ...uctshaka_1_1media_1_1mp4_1_1ChunkInfo.html | 2 +- ..._1_1mp4_1_1MovieExtendsHeader-members.html | 2 +- .../classshaka_1_1media_1_1RequestSigner.html | 2 +- docs/df/d46/classshaka_1_1media_1_1Muxer.html | 18 +- docs/df/d4e/classshaka_1_1IoCache.html | 2 +- ...aka_1_1media_1_1RsaPrivateKey-members.html | 2 +- .../classshaka_1_1CallbackFile-members.html | 2 +- docs/df/d60/classshaka_1_1MockMpdBuilder.html | 2 +- .../df/d62/ad__cue__generator_8cc_source.html | 162 ++ ...mp4_1_1AudioRollRecoveryEntry-members.html | 2 +- .../classshaka_1_1media_1_1KeyFetcher.html | 2 +- .../classshaka_1_1MockMpdBuilder-members.html | 2 +- ...1media_1_1mp4_1_1OpusSpecific-members.html | 2 +- ...dia_1_1mp4_1_1CompositionTimeToSample.html | 2 +- ...haka_1_1media_1_1mp4_1_1TrackFragment.html | 2 +- .../df/d7d/webm__info__parser_8cc_source.html | 2 +- ...1_1DecoderConfigurationRecord-members.html | 2 +- .../classshaka_1_1media_1_1AesCryptor.html | 2 +- ...shaka_1_1media_1_1mp4_1_1DataEntryUrl.html | 2 +- docs/df/d8a/vp9__parser_8h_source.html | 2 +- docs/df/d8a/vpx__parser_8h_source.html | 2 +- ...1mp4_1_1MultiSegmentSegmenter-members.html | 2 +- docs/df/d8d/es__parser__h26x_8h_source.html | 2 +- ..._1_1RepresentationStateChangeListener.html | 2 +- docs/df/d96/xml__node_8cc_source.html | 2 +- ...dia_1_1mp4_1_1TrackFragmentDecodeTime.html | 2 +- ...shaka_1_1xml_1_1RepresentationXmlNode.html | 2 +- ..._1media_1_1mp4_1_1ChunkOffset-members.html | 2 +- ...a_1_1media_1_1mp4_1_1CueIDBox-members.html | 2 +- docs/df/dad/decrypt__config_8h_source.html | 2 +- ...oder__configuration__record_8h_source.html | 2 +- ...a_1_1hls_1_1MockMediaPlaylist-members.html | 16 +- docs/df/dd2/mpd__utils_8h_source.html | 2 +- ...ructshaka_1_1media_1_1H264Pps-members.html | 2 +- docs/df/ddc/structshaka_1_1MpdParams.html | 2 +- docs/df/ddc/webm_2segmenter_8h_source.html | 2 +- docs/df/dde/ts__section__psi_8cc_source.html | 2 +- ...haka_1_1media_1_1H264SEIRecoveryPoint.html | 2 +- .../de3/text__track__config_8cc_source.html | 2 +- docs/df/de9/segment__info_8h_source.html | 2 +- ...a_1_1ContentProtectionElement-members.html | 2 +- ...dy__key__encryption__flags_8cc_source.html | 2 +- .../dir_1338cd99faf71b6cb1609e99e3340e45.html | 2 +- .../dir_35c1fdffcdd4ade6d7f948073ab165de.html | 14 +- .../dir_375ba2cfd8fd5b05c50b92d996b9d386.html | 4 +- .../dir_3f8eec2fc361645de4b1ec14c19fffc7.html | 2 +- .../dir_48fdaa95ed78e499807eaa909d50b2cd.html | 2 +- .../dir_51897ee7df8868b4f901d3ff10922ac3.html | 2 +- .../dir_588b87f799233a7c3afc1168633bb252.html | 4 +- .../dir_64597db6ac7a9160e951a4226a03f10e.html | 2 +- .../dir_65bafb41b3669ba481c8da543a696a08.html | 2 +- .../dir_6fe4b0529cd3ec97045d3314254a0cce.html | 2 +- .../dir_7053349436b45d276056de3c928a6fc6.html | 2 +- .../dir_7fa7c3de4a91b9652697b9f1c2d38e70.html | 2 +- .../dir_83c56f445d5c796bd14e4ebf939c29ad.html | 2 +- .../dir_880f0837661bea0e588ff6a42c226fba.html | 2 +- ...dir_89aadd87adc268d697d42604fc1bbfe1.html} | 12 +- .../dir_933242dc2ed3ec7a82c146e98110781e.html | 2 +- .../dir_aa847bee70cdde822696c7e33a504139.html | 2 +- .../dir_ae142483ff91a68c468a97c037f98d4d.html | 2 +- .../dir_b23f8e22c8c095d1c8c0cb8f88104a00.html | 2 +- .../dir_b7f276137d53b05d7f6b34219adc0a31.html | 2 +- .../dir_b885194e7131202a9b4650a8967e838c.html | 2 +- .../dir_b8a35a7f00287a46b0da66a108ec1239.html | 2 +- .../dir_bf7f1d16febc509cca62cff27fb88644.html | 6 +- .../dir_c41da90e13af52a77978e497cf9cac63.html | 2 +- .../dir_d258fb6e36cbaad69b44b6c9489b2bbb.html | 2 +- .../dir_e329e4913ca1adf6e112c00fbb0d634f.html | 2 +- .../dir_e3bda0bde998a4d5063328245b9909be.html | 6 +- .../dir_f74090996960c752a82246b98a23aa62.html | 2 +- .../dir_f99dae54fe7170f791f339b952d5067a.html | 4 +- .../dir_ffb529e2a1792bf603304ea6ff9bf092.html | 2 +- docs/files.html | 745 +++--- docs/functions.html | 7 +- docs/functions_b.html | 11 +- docs/functions_c.html | 14 +- docs/functions_d.html | 13 +- docs/functions_e.html | 6 +- docs/functions_enum.html | 2 +- docs/functions_eval.html | 6 +- docs/functions_f.html | 3 +- docs/functions_func.html | 2 +- docs/functions_func_b.html | 13 +- docs/functions_func_c.html | 9 +- docs/functions_func_d.html | 10 +- docs/functions_func_e.html | 6 +- docs/functions_func_f.html | 3 +- docs/functions_func_g.html | 47 +- docs/functions_func_h.html | 2 +- docs/functions_func_i.html | 10 +- docs/functions_func_l.html | 2 +- docs/functions_func_m.html | 2 +- docs/functions_func_n.html | 2 +- docs/functions_func_o.html | 2 +- docs/functions_func_p.html | 10 +- docs/functions_func_r.html | 2 +- docs/functions_func_s.html | 7 +- docs/functions_func_t.html | 2 +- docs/functions_func_u.html | 2 +- docs/functions_func_v.html | 2 +- docs/functions_func_w.html | 5 +- docs/functions_func_x.html | 2 +- docs/functions_func_~.html | 2 +- docs/functions_g.html | 49 +- docs/functions_h.html | 2 +- docs/functions_i.html | 8 +- docs/functions_k.html | 9 +- docs/functions_l.html | 2 +- docs/functions_m.html | 2 +- docs/functions_n.html | 2 +- docs/functions_o.html | 2 +- docs/functions_p.html | 8 +- docs/functions_r.html | 2 +- docs/functions_rela.html | 2 +- docs/functions_s.html | 12 +- docs/functions_t.html | 2 +- docs/functions_type.html | 2 +- docs/functions_u.html | 2 +- docs/functions_v.html | 2 +- docs/functions_vars.html | 22 +- docs/functions_w.html | 5 +- docs/functions_x.html | 2 +- docs/functions_~.html | 2 +- docs/hierarchy.html | 628 ++--- docs/index.html | 2 +- docs/namespacemembers.html | 2 +- docs/namespacemembers_enum.html | 2 +- docs/namespacemembers_func.html | 2 +- docs/namespaces.html | 2 +- docs/search/all_0.js | 13 +- docs/search/all_1.js | 10 +- docs/search/all_10.js | 9 +- docs/search/all_13.js | 1 + docs/search/all_14.js | 1 + docs/search/all_2.js | 10 +- docs/search/all_3.js | 7 +- docs/search/all_4.js | 4 +- docs/search/all_5.js | 2 +- docs/search/all_6.js | 15 +- docs/search/all_7.js | 7 +- docs/search/all_8.js | 3 +- docs/search/all_9.js | 5 +- docs/search/all_b.js | 3 +- docs/search/all_e.js | 7 +- docs/search/classes_0.js | 6 +- docs/search/classes_1.js | 1 + docs/search/classes_12.js | 1 + docs/search/classes_2.js | 2 + docs/search/classes_4.js | 2 +- docs/search/classes_6.js | 1 - docs/search/classes_a.js | 3 +- docs/search/classes_d.js | 1 - docs/search/classes_f.js | 5 +- docs/search/enumvalues_0.js | 4 +- docs/search/functions_1.js | 3 + docs/search/functions_13.js | 1 + docs/search/functions_2.js | 3 +- docs/search/functions_3.js | 4 +- docs/search/functions_4.js | 2 +- docs/search/functions_5.js | 2 +- docs/search/functions_6.js | 15 +- docs/search/functions_8.js | 3 +- docs/search/functions_d.js | 2 +- docs/search/functions_f.js | 3 +- docs/search/search.js | 2 +- docs/search/variables_0.js | 5 +- docs/search/variables_1.js | 11 +- docs/search/variables_10.js | 2 +- docs/search/variables_11.js | 2 +- docs/search/variables_12.html | 26 + docs/search/variables_12.js | 4 + docs/search/variables_2.js | 11 +- docs/search/variables_3.js | 5 +- docs/search/variables_4.js | 4 +- docs/search/variables_5.js | 7 +- docs/search/variables_6.js | 11 +- docs/search/variables_7.js | 19 +- docs/search/variables_8.js | 14 +- docs/search/variables_9.js | 8 +- docs/search/variables_a.js | 11 +- docs/search/variables_b.js | 9 +- docs/search/variables_c.js | 6 +- docs/search/variables_d.js | 14 +- docs/search/variables_e.js | 17 +- docs/search/variables_f.js | 4 +- html/.buildinfo | 2 +- ...064d3d3c78c2f86da25ace49db3e3c4e03a691.png | Bin 0 -> 75226 bytes ...3d3c78c2f86da25ace49db3e3c4e03a691.png.map | 2 + ...6ceb00b0739eba2ed2de6d0d71f24a0021c268.png | Bin 0 -> 14328 bytes ...00b0739eba2ed2de6d0d71f24a0021c268.png.map | 2 + ...7838559a989a01982bde69df7d1ba50dba3dae.png | Bin 0 -> 6762 bytes ...559a989a01982bde69df7d1ba50dba3dae.png.map | 2 + ...8592da92fae1a4929d96c1cb6e446e05714101.png | Bin 0 -> 50735 bytes ...da92fae1a4929d96c1cb6e446e05714101.png.map | 2 + ...88f7ab1eb3f4d70c57feb299c189351a097db9.png | Bin 0 -> 10479 bytes html/_sources/design.rst.txt | 131 + html/_sources/docker_instructions.md.txt | 8 + html/_sources/index.rst.txt | 2 +- html/_sources/options/hls_options.rst.txt | 5 + .../_sources/options/udp_file_options.rst.txt | 2 +- html/_sources/tutorials/basic_usage.md.txt | 61 - html/_sources/tutorials/basic_usage.rst.txt | 59 + html/_sources/tutorials/tutorials.rst.txt | 6 +- html/design.html | 238 ++ html/docker_instructions.html | 6 + html/documentation.html | 5 + html/genindex.html | 4 + html/index.html | 5 + html/library.html | 10 +- html/library_details.html | 12 + html/objects.inv | Bin 5633 -> 5723 bytes html/options/hls_options.html | 5 + html/options/udp_file_options.html | 2 +- html/searchindex.js | 2 +- html/tutorials/basic_usage.html | 70 +- html/tutorials/ffmpeg_piping.html | 10 +- html/tutorials/hls.html | 5 + html/tutorials/live.html | 2 +- 1221 files changed, 15166 insertions(+), 10017 deletions(-) rename docs/{d1/d82/adts__constants_8h_source.html => d0/d65/ad__cue__generator__flags_8cc_source.html} (68%) create mode 100644 docs/d0/dbb/classshaka_1_1media_1_1mp2t_1_1Ac3Header-members.html create mode 100644 docs/d0/dbc/bit__writer_8h_source.html rename docs/{df/dd3/structshaka_1_1media_1_1MediaEvent.html => d1/d07/structshaka_1_1AdCueGeneratorParams-members.html} (84%) rename docs/{d7/d58/structshaka_1_1media_1_1PeriodInfo.html => d1/d07/structshaka_1_1Cuepoint-members.html} (82%) create mode 100644 docs/d1/d41/structshaka_1_1media_1_1Scte35Event.html create mode 100644 docs/d1/d79/structshaka_1_1media_1_1Scte35Event-members.html create mode 100644 docs/d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html create mode 100644 docs/d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.png create mode 100644 docs/d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.png create mode 100644 docs/d3/d6f/ad__cue__generator__params_8h_source.html create mode 100644 docs/d3/dd7/ad__cue__generator_8h_source.html rename docs/{d8/d94/adts__constants_8cc_source.html => d4/d61/ad__cue__generator__flags_8h_source.html} (64%) delete mode 100644 docs/d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.png create mode 100644 docs/d6/d2c/ts__stream__type_8h_source.html delete mode 100644 docs/d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.png create mode 100644 docs/d6/dfd/classshaka_1_1media_1_1mp2t_1_1AudioHeader-members.html create mode 100644 docs/d7/d04/classshaka_1_1media_1_1AdCueGenerator-members.html rename docs/{da/d64/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter-members.html => d9/dc7/classshaka_1_1media_1_1BitWriter-members.html} (56%) create mode 100644 docs/d9/dda/ac3__header_8cc_source.html create mode 100644 docs/da/d17/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter-members.html rename docs/{de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html => da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.html} (57%) create mode 100644 docs/da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.png create mode 100644 docs/da/d93/structshaka_1_1media_1_1CueEvent.html rename docs/{df/d50/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter-members.html => db/d2c/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter-members.html} (65%) rename docs/{d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html => dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.html} (57%) create mode 100644 docs/dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.png create mode 100644 docs/dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html create mode 100644 docs/dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.png create mode 100644 docs/dc/d56/audio__header_8h_source.html create mode 100644 docs/dc/d76/classshaka_1_1media_1_1BitWriter.html rename docs/{d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.html => dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.html} (83%) create mode 100644 docs/dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.png rename docs/{dd/d18/es__parser__adts_8h_source.html => dc/da3/es__parser__audio_8h_source.html} (66%) rename docs/{d9/d66/classshaka_1_1media_1_1mp2t_1_1EsParserAdts-members.html => dc/dc2/classshaka_1_1media_1_1mp2t_1_1EsParserAudio-members.html} (77%) create mode 100644 docs/dc/dd8/structshaka_1_1media_1_1CueEvent-members.html create mode 100644 docs/dd/d58/bit__writer_8cc_source.html create mode 100644 docs/dd/dfd/structshaka_1_1AdCueGeneratorParams.html create mode 100644 docs/de/d00/ac3__header_8h_source.html delete mode 100644 docs/de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.png rename docs/{d5/d91/es__parser__adts_8cc_source.html => de/d27/es__parser__audio_8cc_source.html} (67%) create mode 100644 docs/de/de4/classshaka_1_1media_1_1AdCueGenerator.html create mode 100644 docs/de/de4/classshaka_1_1media_1_1AdCueGenerator.png create mode 100644 docs/de/deb/structshaka_1_1Cuepoint.html create mode 100644 docs/df/d62/ad__cue__generator_8cc_source.html rename docs/{dir_0ff8490546c67558c1586a7b16b2189f.html => dir_89aadd87adc268d697d42604fc1bbfe1.html} (84%) create mode 100644 docs/search/variables_12.html create mode 100644 docs/search/variables_12.js create mode 100644 html/_images/graphviz-3d064d3d3c78c2f86da25ace49db3e3c4e03a691.png create mode 100644 html/_images/graphviz-3d064d3d3c78c2f86da25ace49db3e3c4e03a691.png.map create mode 100644 html/_images/graphviz-426ceb00b0739eba2ed2de6d0d71f24a0021c268.png create mode 100644 html/_images/graphviz-426ceb00b0739eba2ed2de6d0d71f24a0021c268.png.map create mode 100644 html/_images/graphviz-787838559a989a01982bde69df7d1ba50dba3dae.png create mode 100644 html/_images/graphviz-787838559a989a01982bde69df7d1ba50dba3dae.png.map create mode 100644 html/_images/graphviz-d08592da92fae1a4929d96c1cb6e446e05714101.png create mode 100644 html/_images/graphviz-d08592da92fae1a4929d96c1cb6e446e05714101.png.map create mode 100644 html/_images/plantuml-d388f7ab1eb3f4d70c57feb299c189351a097db9.png create mode 100644 html/_sources/design.rst.txt delete mode 100644 html/_sources/tutorials/basic_usage.md.txt create mode 100644 html/_sources/tutorials/basic_usage.rst.txt create mode 100644 html/design.html diff --git a/docs/annotated.html b/docs/annotated.html index 3181ec1a51..8e4f88635a 100644 --- a/docs/annotated.html +++ b/docs/annotated.html @@ -99,29 +99,31 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); ||\CSimpleHlsNotifierThis is thread safe |oNmedia ||oNmp2t -|||oCAdtsHeader -|||oCContinuityCounter -|||oCEsParser -|||oCEsParserAdts -|||oCEsParserH264 -|||oCEsParserH265 -|||oCEsParserH26x -||||\CVideoSliceInfo -|||oCMp2tMediaParser -|||oCPesPacketClass that carries PES packet information -|||oCPesPacketGenerator -|||oCProgramMapTableWriter -|||oCH264ProgramMapTableWriter -|||oCAacProgramMapTableWriter -|||oCTsMuxer -|||oCTsPacket -|||oCTsSection -|||oCTsSectionPat -|||oCTsSectionPes -|||oCTsSectionPmt -|||oCTsSectionPsi -|||oCTsSegmenter -|||\CTsWriter +|||oCAc3Header +|||oCAdtsHeader +|||oCAudioHeader +|||oCContinuityCounter +|||oCEsParser +|||oCEsParserAudio +|||oCEsParserH264 +|||oCEsParserH265 +|||oCEsParserH26x +||||\CVideoSliceInfo +|||oCMp2tMediaParser +|||oCPesPacketClass that carries PES packet information +|||oCPesPacketGenerator +|||oCProgramMapTableWriterPuts PMT into TS packets and writes them to buffer +|||oCVideoProgramMapTableWriterProgramMapTableWriter for video codecs +|||oCAudioProgramMapTableWriterProgramMapTableWriter for video codecs +|||oCTsMuxer +|||oCTsPacket +|||oCTsSection +|||oCTsSectionPat +|||oCTsSectionPes +|||oCTsSectionPmt +|||oCTsSectionPsi +|||oCTsSegmenter +|||\CTsWriter ||oNmp4 |||oCBox |||oCFullBox @@ -232,133 +234,135 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); |||oCPrevSampleData |||\CWvmMediaParser ||oCLibcryptoThreadingConvenience class which initializes and terminates libcrypto threading -||oCAesCryptor -||oCAesCbcDecryptorClass which implements AES-CBC (Cipher block chaining) decryption -||oCAesEncryptor -||oCAesCtrEncryptor -||oCAesCbcEncryptor -||oCAesPatternCryptorImplements pattern-based encryption/decryption -||oCAudioStreamInfoHolds audio stream information -||oCAudioTimestampHelper -||oCBitReaderA class to read bit streams -||oCBufferReader -||oCBufferWriter -||oCByteQueue -||oCClosureThread -||oCSubsampleEntry -||oCDecryptConfig -||oCDecryptorSourceDecryptorSource wraps KeySource and is responsible for decryptor management -||oCEncryptionConfig -||oCHttpKeyFetcher -||oCKeyFetcherBase class for fetching keys from the license service -||oCEncryptionKey -||oCKeySourceKeySource is responsible for encryption key acquisition -||oCPeriodInfo -||oCMediaEvent -||oCSegmentInfo -||oCStreamData -||oCMediaHandler -||oCFakeInputMediaHandler -||oCMockOutputMediaHandler -||oCFakeMediaHandler -||oCMediaHandlerTestBase -||oCMediaHandlerGraphTestBase -||oCMediaParser -||oCMediaSampleClass to hold a media sample -||oCMuxer -||oCMuxerOptionsThis structure contains the list of configuration options for Muxer -||oCOffsetByteQueue -||oCPlayReadyKeySourceA key source that uses playready for encryption -||oCProducerConsumerQueue -||oCProtectionSystemSpecificInfo -||oCRange -||oCRawKeySourceA key source that uses raw keys for encryption -||oCRequestSignerAbstract class used for signature generation -||oCAesRequestSignerAesRequestSigner uses AES-CBC signing -||oCRsaRequestSignerRsaRequestSigner uses RSA-PSS signing -||oCRsaPrivateKeyRsa private key, used for message signing and decryption -||oCRsaPublicKeyRsa public key, used for signature verification and encryption -||oCStreamInfoAbstract class holds stream information -||oCTextSample -||oCTextStreamInfo -||oCTextTrack -||oCTextTrackConfig -||oCVideoStreamInfoHolds video stream information -||oCWidevineKeySource -||oCChunkingHandler -||oCAACAudioSpecificConfig -||oCAVCDecoderConfigurationRecordClass for parsing AVC decoder configuration record -||oCDecoderConfigurationRecord -||oCESDescriptor -||oCH264ByteToUnitStreamConverter -||oCH264Sps -||oCH264Pps -||oCH264ModificationOfPicNum -||oCH264WeightingFactors -||oCH264DecRefPicMarking -||oCH264SliceHeader -||oCH264SEIRecoveryPoint -||oCH264SEIMessage -||oCH264Parser -||oCH265ByteToUnitStreamConverter -||oCH265ReferencePictureSet -||oCH265VuiParameters -||oCH265Pps -||oCH265Sps -||oCH265ReferencePictureListModifications -||oCH265SliceHeader -|||\CLongTermPicsInfo -||oCH265Parser -||oCH26xBitReader -||oCH26xByteToUnitStreamConverterA base class that is used to convert H.26x byte streams to NAL unit streams -||oCHEVCDecoderConfigurationRecordClass for parsing HEVC decoder configuration record -||oCNalUnitToByteStreamConverter -||oCNalu -||oCNaluReader -||oCVideoSliceHeaderParser -||oCH264VideoSliceHeaderParser -||oCH265VideoSliceHeaderParser -||oCVP8Parser -||oCVP9ParserClass to parse a vp9 bit stream -||oCVPCodecConfigurationRecordClass for parsing or writing VP codec configuration record -||oCVPxFrameInfo -||oCVPxParser -||oCEncryptionHandler -||oCDemuxer -||oCCombinedMuxerListener -||oCHlsNotifyMuxerListenerMuxerListener that uses HlsNotifier -||oCMockMuxerListener -||oCMpdNotifyMuxerListener -||oCMuxerListener -|||\CMediaRanges -||oCVideoStreamInfoParameters -||oCOnMediaEndParameters -||oCProgressListenerThis class listens to progress updates events -||oCVodMediaInfoDumpMuxerListener -||oCCluster -||oCClusterBuilder -||oCMkvWriterAn implementation of IMkvWriter using our File type -||oCSeekHead -||oCSegmentTestBase -|||\CClusterParser -||oCTracksBuilder -||oCWebMAudioClientHelper class used to parse an Audio element inside a TrackEntry element -||oCWebMClusterParser -||oCContentEncoding -||oCWebMContentEncodingsClientParser for WebM ContentEncodings element -||oCWebMInfoParserParser for WebM Info element -||oCWebMMediaParser -||oCWebMParserClient -||oCWebMListParser -||oCWebMTracksParserParser for WebM Tracks element -||oCWebMVideoClientHelper class used to parse a Video element inside a TrackEntry element -||oCWebMWebVTTParser -||oCCue -||oCWebVttMediaParser -||oCWebVttSampleConverter -||oCOriginHandler -||oCReplicator -||\CTrickPlayHandler +||oCAdCueGeneratorAdCueGenerator converts out of band cuepoint markers into SCTE-35 events +||oCAesCryptor +||oCAesCbcDecryptorClass which implements AES-CBC (Cipher block chaining) decryption +||oCAesEncryptor +||oCAesCtrEncryptor +||oCAesCbcEncryptor +||oCAesPatternCryptorImplements pattern-based encryption/decryption +||oCAudioStreamInfoHolds audio stream information +||oCAudioTimestampHelper +||oCBitReaderA class to read bit streams +||oCBitWriter +||oCBufferReader +||oCBufferWriter +||oCByteQueue +||oCClosureThread +||oCSubsampleEntry +||oCDecryptConfig +||oCDecryptorSourceDecryptorSource wraps KeySource and is responsible for decryptor management +||oCEncryptionConfig +||oCHttpKeyFetcher +||oCKeyFetcherBase class for fetching keys from the license service +||oCEncryptionKey +||oCKeySourceKeySource is responsible for encryption key acquisition +||oCScte35Event +||oCCueEvent +||oCSegmentInfo +||oCStreamData +||oCMediaHandler +||oCFakeInputMediaHandler +||oCMockOutputMediaHandler +||oCFakeMediaHandler +||oCMediaHandlerTestBase +||oCMediaHandlerGraphTestBase +||oCMediaParser +||oCMediaSampleClass to hold a media sample +||oCMuxer +||oCMuxerOptionsThis structure contains the list of configuration options for Muxer +||oCOffsetByteQueue +||oCPlayReadyKeySourceA key source that uses playready for encryption +||oCProducerConsumerQueue +||oCProtectionSystemSpecificInfo +||oCRange +||oCRawKeySourceA key source that uses raw keys for encryption +||oCRequestSignerAbstract class used for signature generation +||oCAesRequestSignerAesRequestSigner uses AES-CBC signing +||oCRsaRequestSignerRsaRequestSigner uses RSA-PSS signing +||oCRsaPrivateKeyRsa private key, used for message signing and decryption +||oCRsaPublicKeyRsa public key, used for signature verification and encryption +||oCStreamInfoAbstract class holds stream information +||oCTextSample +||oCTextStreamInfo +||oCTextTrack +||oCTextTrackConfig +||oCVideoStreamInfoHolds video stream information +||oCWidevineKeySource +||oCChunkingHandler +||oCAACAudioSpecificConfig +||oCAVCDecoderConfigurationRecordClass for parsing AVC decoder configuration record +||oCDecoderConfigurationRecord +||oCESDescriptor +||oCH264ByteToUnitStreamConverter +||oCH264Sps +||oCH264Pps +||oCH264ModificationOfPicNum +||oCH264WeightingFactors +||oCH264DecRefPicMarking +||oCH264SliceHeader +||oCH264SEIRecoveryPoint +||oCH264SEIMessage +||oCH264Parser +||oCH265ByteToUnitStreamConverter +||oCH265ReferencePictureSet +||oCH265VuiParameters +||oCH265Pps +||oCH265Sps +||oCH265ReferencePictureListModifications +||oCH265SliceHeader +|||\CLongTermPicsInfo +||oCH265Parser +||oCH26xBitReader +||oCH26xByteToUnitStreamConverterA base class that is used to convert H.26x byte streams to NAL unit streams +||oCHEVCDecoderConfigurationRecordClass for parsing HEVC decoder configuration record +||oCNalUnitToByteStreamConverter +||oCNalu +||oCNaluReader +||oCVideoSliceHeaderParser +||oCH264VideoSliceHeaderParser +||oCH265VideoSliceHeaderParser +||oCVP8Parser +||oCVP9ParserClass to parse a vp9 bit stream +||oCVPCodecConfigurationRecordClass for parsing or writing VP codec configuration record +||oCVPxFrameInfo +||oCVPxParser +||oCEncryptionHandler +||oCDemuxer +||oCCombinedMuxerListener +||oCHlsNotifyMuxerListenerMuxerListener that uses HlsNotifier +||oCMockMuxerListener +||oCMpdNotifyMuxerListener +||oCMuxerListener +|||\CMediaRanges +||oCVideoStreamInfoParameters +||oCOnMediaEndParameters +||oCProgressListenerThis class listens to progress updates events +||oCVodMediaInfoDumpMuxerListener +||oCCluster +||oCClusterBuilder +||oCMkvWriterAn implementation of IMkvWriter using our File type +||oCSeekHead +||oCSegmentTestBase +|||\CClusterParser +||oCTracksBuilder +||oCWebMAudioClientHelper class used to parse an Audio element inside a TrackEntry element +||oCWebMClusterParser +||oCContentEncoding +||oCWebMContentEncodingsClientParser for WebM ContentEncodings element +||oCWebMInfoParserParser for WebM Info element +||oCWebMMediaParser +||oCWebMParserClient +||oCWebMListParser +||oCWebMTracksParserParser for WebM Tracks element +||oCWebMVideoClientHelper class used to parse a Video element inside a TrackEntry element +||oCWebMWebVTTParser +||oCCue +||oCWebVttMediaParser +||oCWebVttSampleConverter +||oCOriginHandler +||oCReplicator +||\CTrickPlayHandler |oNxml ||oCXmlDeleter ||oCXmlNode @@ -376,48 +380,50 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); |oCUdpFileImplements UdpFile, which receives UDP unicast and multicast streams |oCUdpOptionsOptions parsed from UDP url string of the form: udp://ip:port[?options] |oCHlsParamsHLS related parameters -|oCChunkingParamsChunking (segmentation) related parameters -|oCWidevineSignerSigner credential for Widevine license server -|oCWidevineEncryptionParamsWidevine encryption parameters -|oCPlayreadyEncryptionParams -|oCRawKeyParamsRaw key encryption/decryption parameters, i.e. with key parameters provided -||\CKeyInfo -|oCEncryptionParamsEncryption parameters -||\CEncryptedStreamAttributesEncrypted stream information that is used to determine stream label -|| \COneOf -|oCWidevineDecryptionParamsWidevine decryption parameters -|oCDecryptionParamsDecryption parameters -|oCMp4OutputParamsMP4 (ISO-BMFF) output related parameters -|oCElement -|oCContentProtectionElement -|oCDashIopMpdNotifier -|oCMockMpdBuilder -|oCMockAdaptationSet -|oCMockRepresentation -|oCMockMpdNotifier -|oCMpdBuilderThis class generates DASH MPDs (Media Presentation Descriptions) -|oCAdaptationSet -|oCRepresentationStateChangeListener -|oCRepresentation -|oCMpdNotifier -|oCMpdOptionsDefines Mpd Options -|oCSegmentInfo -|oCSimpleMpdNotifier -|oCMpdParamsDASH MPD related parameters -|oCMpdNotifierFactory -|oCMpdWriter -|oCTestParamsParameters used for testing -|oCPackagingParamsPackaging parameters -|oCStreamDescriptorDefines a single input/output stream -|oCPackager -|\CStatus +|oCCuepoint +|oCAdCueGeneratorParamsCuepoint generator related parameters +|oCChunkingParamsChunking (segmentation) related parameters +|oCWidevineSignerSigner credential for Widevine license server +|oCWidevineEncryptionParamsWidevine encryption parameters +|oCPlayreadyEncryptionParams +|oCRawKeyParamsRaw key encryption/decryption parameters, i.e. with key parameters provided +||\CKeyInfo +|oCEncryptionParamsEncryption parameters +||\CEncryptedStreamAttributesEncrypted stream information that is used to determine stream label +|| \COneOf +|oCWidevineDecryptionParamsWidevine decryption parameters +|oCDecryptionParamsDecryption parameters +|oCMp4OutputParamsMP4 (ISO-BMFF) output related parameters +|oCElement +|oCContentProtectionElement +|oCDashIopMpdNotifier +|oCMockMpdBuilder +|oCMockAdaptationSet +|oCMockRepresentation +|oCMockMpdNotifier +|oCMpdBuilderThis class generates DASH MPDs (Media Presentation Descriptions) +|oCAdaptationSet +|oCRepresentationStateChangeListener +|oCRepresentation +|oCMpdNotifier +|oCMpdOptionsDefines Mpd Options +|oCSegmentInfo +|oCSimpleMpdNotifier +|oCMpdParamsDASH MPD related parameters +|oCMpdNotifierFactory +|oCMpdWriter +|oCTestParamsParameters used for testing +|oCPackagingParamsPackaging parameters +|oCStreamDescriptorDefines a single input/output stream +|oCPackager +|\CStatus \CBandwidthEstimator diff --git a/docs/classes.html b/docs/classes.html index 8c05467f24..13374d70fd 100644 --- a/docs/classes.html +++ b/docs/classes.html @@ -89,105 +89,107 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
A | B | C | D | E | F | H | I | K | L | M | N | O | P | R | S | T | U | V | W | X
- - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - + + + + + + + + + - - - + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + +
  A  
-
DecryptorSource (shaka::media)   KeySource (shaka::media)   PeriodInfo (shaka::media)   TextTrackConfig (shaka::media)   
Demuxer (shaka::media)   
  L  
-
PesPacket (shaka::media::mp2t)   ThreadedIoFile (shaka)   
AACAudioSpecificConfig (shaka::media)   DemuxStreamIdMediaSample (shaka::media::wvm)   PesPacketGenerator (shaka::media::mp2t)   Track (shaka::media::mp4)   
AacProgramMapTableWriter (shaka::media::mp2t)   DTSSpecific (shaka::media::mp4)   Language (shaka::media::mp4)   PixelAspectRatio (shaka::media::mp4)   TrackEncryption (shaka::media::mp4)   
AC3Specific (shaka::media::mp4)   
  E  
-
LibcryptoThreading (shaka::media)   PlayreadyEncryptionParams (shaka)   TrackExtends (shaka::media::mp4)   
AdaptationSet (shaka)   LocalFile (shaka)   PlayReadyKeySource (shaka::media)   TrackFragment (shaka::media::mp4)   
AdaptationSetXmlNode (shaka::xml)   EC3Specific (shaka::media::mp4)   H265SliceHeader::LongTermPicsInfo (shaka::media)   PrevSampleData (shaka::media::wvm)   TrackFragmentDecodeTime (shaka::media::mp4)   
AdtsHeader (shaka::media::mp2t)   Edit (shaka::media::mp4)   
  M  
-
PrivFrame (shaka::media::mp4)   TrackFragmentHeader (shaka::media::mp4)   
AesCbcDecryptor (shaka::media)   EditList (shaka::media::mp4)   ProducerConsumerQueue (shaka::media)   TrackFragmentRun (shaka::media::mp4)   
AesCbcEncryptor (shaka::media)   EditListEntry (shaka::media::mp4)   MasterPlaylist (shaka::hls)   ProgramMapTableWriter (shaka::media::mp2t)   TrackHeader (shaka::media::mp4)   
AesCryptor (shaka::media)   Element (shaka)   Media (shaka::media::mp4)   ProgressListener (shaka::media)   TrackRunIterator (shaka::media::mp4)   
AesCtrEncryptor (shaka::media)   ElementaryStreamDescriptor (shaka::media::mp4)   MediaData (shaka::media::mp4)   ProtectionSchemeInfo (shaka::media::mp4)   TracksBuilder (shaka::media)   
AesEncryptor (shaka::media)   EncryptionParams::EncryptedStreamAttributes (shaka)   MediaEvent (shaka::media)   ProtectionSystemSpecificHeader (shaka::media::mp4)   TrickPlayHandler (shaka::media)   
AesPatternCryptor (shaka::media)   EncryptionConfig (shaka::media)   MediaHandler (shaka::media)   ProtectionSystemSpecificInfo (shaka::media)   TsMuxer (shaka::media::mp2t)   
AesRequestSigner (shaka::media)   EncryptionHandler (shaka::media)   MediaHandlerGraphTestBase (shaka::media)   
  R  
+
DecoderConfigurationRecord (shaka::media)   
  K  
+
PackagingParams (shaka)   TextTrackConfig (shaka::media)   
DecodingTime (shaka::media::mp4)   PesPacket (shaka::media::mp2t)   ThreadedIoFile (shaka)   
AACAudioSpecificConfig (shaka::media)   DecodingTimeIterator (shaka::media::mp4)   KeyFetcher (shaka::media)   PesPacketGenerator (shaka::media::mp2t)   Track (shaka::media::mp4)   
Ac3Header (shaka::media::mp2t)   DecodingTimeToSample (shaka::media::mp4)   RawKeyParams::KeyInfo (shaka)   PixelAspectRatio (shaka::media::mp4)   TrackEncryption (shaka::media::mp4)   
AC3Specific (shaka::media::mp4)   DecryptConfig (shaka::media)   KeySource (shaka::media)   PlayreadyEncryptionParams (shaka)   TrackExtends (shaka::media::mp4)   
AdaptationSet (shaka)   DecryptionParams (shaka)   
  L  
+
PlayReadyKeySource (shaka::media)   TrackFragment (shaka::media::mp4)   
AdaptationSetXmlNode (shaka::xml)   DecryptorSource (shaka::media)   PrevSampleData (shaka::media::wvm)   TrackFragmentDecodeTime (shaka::media::mp4)   
AdCueGenerator (shaka::media)   Demuxer (shaka::media)   Language (shaka::media::mp4)   PrivFrame (shaka::media::mp4)   TrackFragmentHeader (shaka::media::mp4)   
AdCueGeneratorParams (shaka)   DemuxStreamIdMediaSample (shaka::media::wvm)   LibcryptoThreading (shaka::media)   ProducerConsumerQueue (shaka::media)   TrackFragmentRun (shaka::media::mp4)   
AdtsHeader (shaka::media::mp2t)   DTSSpecific (shaka::media::mp4)   LocalFile (shaka)   ProgramMapTableWriter (shaka::media::mp2t)   TrackHeader (shaka::media::mp4)   
AesCbcDecryptor (shaka::media)   
  E  
+
H265SliceHeader::LongTermPicsInfo (shaka::media)   ProgressListener (shaka::media)   TrackRunIterator (shaka::media::mp4)   
AesCbcEncryptor (shaka::media)   
  M  
+
ProtectionSchemeInfo (shaka::media::mp4)   TracksBuilder (shaka::media)   
AesCryptor (shaka::media)   EC3Specific (shaka::media::mp4)   ProtectionSystemSpecificHeader (shaka::media::mp4)   TrickPlayHandler (shaka::media)   
AesCtrEncryptor (shaka::media)   Edit (shaka::media::mp4)   MasterPlaylist (shaka::hls)   ProtectionSystemSpecificInfo (shaka::media)   TsMuxer (shaka::media::mp2t)   
AesEncryptor (shaka::media)   EditList (shaka::media::mp4)   Media (shaka::media::mp4)   
  R  
TsPacket (shaka::media::mp2t)   
AudioRollRecoveryEntry (shaka::media::mp4)   EncryptionKey (shaka::media)   MediaHandlerTestBase (shaka::media)   TsSection (shaka::media::mp2t)   
AudioSampleEntry (shaka::media::mp4)   EncryptionParams (shaka)   MediaHeader (shaka::media::mp4)   Range (shaka::media)   TsSectionPat (shaka::media::mp2t)   
AudioStreamInfo (shaka::media)   ESDescriptor (shaka::media)   MediaInformation (shaka::media::mp4)   RawKeyParams (shaka)   TsSectionPes (shaka::media::mp2t)   
AudioTimestampHelper (shaka::media)   EsParser (shaka::media::mp2t)   MediaParser (shaka::media)   RawKeySource (shaka::media)   TsSectionPmt (shaka::media::mp2t)   
AVCDecoderConfigurationRecord (shaka::media)   EsParserAdts (shaka::media::mp2t)   MediaPlaylist (shaka::hls)   Replicator (shaka::media)   TsSectionPsi (shaka::media::mp2t)   
AesPatternCryptor (shaka::media)   EditListEntry (shaka::media::mp4)   MediaData (shaka::media::mp4)   TsSection (shaka::media::mp2t)   
AesRequestSigner (shaka::media)   Element (shaka)   MediaHandler (shaka::media)   Range (shaka::media)   TsSectionPat (shaka::media::mp2t)   
AudioHeader (shaka::media::mp2t)   ElementaryStreamDescriptor (shaka::media::mp4)   MediaHandlerGraphTestBase (shaka::media)   RawKeyParams (shaka)   TsSectionPes (shaka::media::mp2t)   
AudioProgramMapTableWriter (shaka::media::mp2t)   EncryptionParams::EncryptedStreamAttributes (shaka)   MediaHandlerTestBase (shaka::media)   RawKeySource (shaka::media)   TsSectionPmt (shaka::media::mp2t)   
AudioRollRecoveryEntry (shaka::media::mp4)   EncryptionConfig (shaka::media)   MediaHeader (shaka::media::mp4)   Replicator (shaka::media)   TsSectionPsi (shaka::media::mp2t)   
AudioSampleEntry (shaka::media::mp4)   EncryptionHandler (shaka::media)   MediaInformation (shaka::media::mp4)   Representation (shaka)   TsSegmenter (shaka::media::mp2t)   
AudioStreamInfo (shaka::media)   EncryptionKey (shaka::media)   MediaParser (shaka::media)   RepresentationBaseXmlNode (shaka::xml)   TsWriter (shaka::media::mp2t)   
AudioTimestampHelper (shaka::media)   EncryptionParams (shaka)   MediaPlaylist (shaka::hls)   RepresentationStateChangeListener (shaka)   TwoPassSingleSegmentSegmenter (shaka::media::webm)   
AVCDecoderConfigurationRecord (shaka::media)   ESDescriptor (shaka::media)   MediaPlaylistFactory (shaka::hls)   RepresentationXmlNode (shaka::xml)   
  U  
+
  B  
-
EsParserH264 (shaka::media::mp2t)   MediaPlaylistFactory (shaka::hls)   Representation (shaka)   TsSegmenter (shaka::media::mp2t)   
EsParserH265 (shaka::media::mp2t)   MuxerListener::MediaRanges (shaka::media)   RepresentationBaseXmlNode (shaka::xml)   TsWriter (shaka::media::mp2t)   
BandwidthEstimator   EsParserH26x (shaka::media::mp2t)   MediaSample (shaka::media)   RepresentationStateChangeListener (shaka)   TwoPassSingleSegmentSegmenter (shaka::media::webm)   
BitReader (shaka::media)   
  F  
-
MemoryFile (shaka)   RepresentationXmlNode (shaka::xml)   
  U  
+
EsParser (shaka::media::mp2t)   MuxerListener::MediaRanges (shaka::media)   RequestSigner (shaka::media)   
EsParserAudio (shaka::media::mp2t)   MediaSample (shaka::media)   RsaPrivateKey (shaka::media)   UdpFile (shaka)   
BandwidthEstimator   EsParserH264 (shaka::media::mp2t)   MemoryFile (shaka)   RsaPublicKey (shaka::media)   UdpOptions (shaka)   
BitReader (shaka::media)   EsParserH265 (shaka::media::mp2t)   Metadata (shaka::media::mp4)   RsaRequestSigner (shaka::media)   
  V  
Box (shaka::media::mp4)   Metadata (shaka::media::mp4)   RequestSigner (shaka::media)   
BoxBuffer (shaka::media::mp4)   FakeInputMediaHandler (shaka::media)   MkvWriter (shaka::media)   RsaPrivateKey (shaka::media)   UdpFile (shaka)   
BoxReader (shaka::media::mp4)   FakeMediaHandler (shaka::media)   MockAdaptationSet (shaka)   RsaPublicKey (shaka::media)   UdpOptions (shaka)   
BufferCallbackParams (shaka)   File (shaka)   MockMediaPlaylist (shaka::hls)   RsaRequestSigner (shaka::media)   
  V  
+
BitWriter (shaka::media)   EsParserH26x (shaka::media::mp2t)   MkvWriter (shaka::media)   
  S  
BufferReader (shaka::media)   FileCloser (shaka)   MockMpdBuilder (shaka)   
  S  
-
BufferWriter (shaka::media)   FileType (shaka::media::mp4)   MockMpdNotifier (shaka)   VideoMediaHeader (shaka::media::mp4)   
ByteQueue (shaka::media)   Fragmenter (shaka::media::mp4)   MockMuxerListener (shaka::media)   SampleAuxiliaryInformationOffset (shaka::media::mp4)   VideoSampleEntry (shaka::media::mp4)   
Box (shaka::media::mp4)   
  F  
+
MockAdaptationSet (shaka)   VideoMediaHeader (shaka::media::mp4)   
BoxBuffer (shaka::media::mp4)   MockMediaPlaylist (shaka::hls)   SampleAuxiliaryInformationOffset (shaka::media::mp4)   VideoProgramMapTableWriter (shaka::media::mp2t)   
BoxReader (shaka::media::mp4)   FakeInputMediaHandler (shaka::media)   MockMpdBuilder (shaka)   SampleAuxiliaryInformationSize (shaka::media::mp4)   VideoSampleEntry (shaka::media::mp4)   
BufferCallbackParams (shaka)   FakeMediaHandler (shaka::media)   MockMpdNotifier (shaka)   SampleDescription (shaka::media::mp4)   VideoSliceHeaderParser (shaka::media)   
BufferReader (shaka::media)   File (shaka)   MockMuxerListener (shaka::media)   SampleEncryption (shaka::media::mp4)   EsParserH26x::VideoSliceInfo (shaka::media::mp2t)   
BufferWriter (shaka::media)   FileCloser (shaka)   MockOutputMediaHandler (shaka::media)   SampleEncryptionEntry (shaka::media::mp4)   VideoStreamInfo (shaka::media)   
ByteQueue (shaka::media)   FileType (shaka::media::mp4)   MockRepresentation (shaka)   SampleGroupDescription (shaka::media::mp4)   VideoStreamInfoParameters (shaka::media)   
  C  
-
FullBox (shaka::media::mp4)   MockOutputMediaHandler (shaka::media)   SampleAuxiliaryInformationSize (shaka::media::mp4)   VideoSliceHeaderParser (shaka::media)   
  H  
-
MockRepresentation (shaka)   SampleDescription (shaka::media::mp4)   EsParserH26x::VideoSliceInfo (shaka::media::mp2t)   
CallbackFile (shaka)   Movie (shaka::media::mp4)   SampleEncryption (shaka::media::mp4)   VideoStreamInfo (shaka::media)   
CencSampleEncryptionInfoEntry (shaka::media::mp4)   H264ByteToUnitStreamConverter (shaka::media)   MovieExtends (shaka::media::mp4)   SampleEncryptionEntry (shaka::media::mp4)   VideoStreamInfoParameters (shaka::media)   
ChunkInfo (shaka::media::mp4)   H264DecRefPicMarking (shaka::media)   MovieExtendsHeader (shaka::media::mp4)   SampleGroupDescription (shaka::media::mp4)   VodMediaInfoDumpMuxerListener (shaka::media)   
ChunkInfoIterator (shaka::media::mp4)   H264ModificationOfPicNum (shaka::media)   MovieFragment (shaka::media::mp4)   SampleSize (shaka::media::mp4)   VP8Parser (shaka::media)   
ChunkingHandler (shaka::media)   H264Parser (shaka::media)   MovieFragmentHeader (shaka::media::mp4)   SampleTable (shaka::media::mp4)   VP9Parser (shaka::media)   
ChunkingParams (shaka)   H264Pps (shaka::media)   MovieHeader (shaka::media::mp4)   SampleToChunk (shaka::media::mp4)   VPCodecConfigurationRecord (shaka::media)   
ChunkLargeOffset (shaka::media::mp4)   H264ProgramMapTableWriter (shaka::media::mp2t)   Mp2tMediaParser (shaka::media::mp2t)   SampleToGroup (shaka::media::mp4)   VPxFrameInfo (shaka::media)   
ChunkOffset (shaka::media::mp4)   H264SEIMessage (shaka::media)   MP4MediaParser (shaka::media::mp4)   SampleToGroupEntry (shaka::media::mp4)   VPxParser (shaka::media)   
ClosureThread (shaka::media)   H264SEIRecoveryPoint (shaka::media)   MP4Muxer (shaka::media::mp4)   SchemeInfo (shaka::media::mp4)   VTTAdditionalTextBox (shaka::media::mp4)   
Cluster (shaka::media)   H264SliceHeader (shaka::media)   Mp4OutputParams (shaka)   SchemeType (shaka::media::mp4)   VTTCueBox (shaka::media::mp4)   
ClusterBuilder (shaka::media)   H264Sps (shaka::media)   MpdBuilder (shaka)   SeekHead (shaka::media)   VTTEmptyCueBox (shaka::media::mp4)   
SegmentTestBase::ClusterParser (shaka::media)   H264VideoSliceHeaderParser (shaka::media)   MpdNotifier (shaka)   Segmenter (shaka::media::mp4)   
  W  
+
Fragmenter (shaka::media::mp4)   Movie (shaka::media::mp4)   SampleSize (shaka::media::mp4)   VodMediaInfoDumpMuxerListener (shaka::media)   
FullBox (shaka::media::mp4)   MovieExtends (shaka::media::mp4)   SampleTable (shaka::media::mp4)   VP8Parser (shaka::media)   
CallbackFile (shaka)   
  H  
+
MovieExtendsHeader (shaka::media::mp4)   SampleToChunk (shaka::media::mp4)   VP9Parser (shaka::media)   
CencSampleEncryptionInfoEntry (shaka::media::mp4)   MovieFragment (shaka::media::mp4)   SampleToGroup (shaka::media::mp4)   VPCodecConfigurationRecord (shaka::media)   
ChunkInfo (shaka::media::mp4)   H264ByteToUnitStreamConverter (shaka::media)   MovieFragmentHeader (shaka::media::mp4)   SampleToGroupEntry (shaka::media::mp4)   VPxFrameInfo (shaka::media)   
ChunkInfoIterator (shaka::media::mp4)   H264DecRefPicMarking (shaka::media)   MovieHeader (shaka::media::mp4)   SchemeInfo (shaka::media::mp4)   VPxParser (shaka::media)   
ChunkingHandler (shaka::media)   H264ModificationOfPicNum (shaka::media)   Mp2tMediaParser (shaka::media::mp2t)   SchemeType (shaka::media::mp4)   VTTAdditionalTextBox (shaka::media::mp4)   
ChunkingParams (shaka)   H264Parser (shaka::media)   MP4MediaParser (shaka::media::mp4)   Scte35Event (shaka::media)   VTTCueBox (shaka::media::mp4)   
ChunkLargeOffset (shaka::media::mp4)   H264Pps (shaka::media)   MP4Muxer (shaka::media::mp4)   SeekHead (shaka::media)   VTTEmptyCueBox (shaka::media::mp4)   
ChunkOffset (shaka::media::mp4)   H264SEIMessage (shaka::media)   Mp4OutputParams (shaka)   Segmenter (shaka::media::webm)   
  W  
CodecConfiguration (shaka::media::mp4)   H264WeightingFactors (shaka::media)   MpdNotifierFactory (shaka)   Segmenter (shaka::media::webm)   
CombinedMuxerListener (shaka::media)   H265ByteToUnitStreamConverter (shaka::media)   MpdNotifyMuxerListener (shaka::media)   SegmentIndex (shaka::media::mp4)   WebMAudioClient (shaka::media)   
CompactSampleSize (shaka::media::mp4)   H265Parser (shaka::media)   MpdOptions (shaka)   SegmentInfo (shaka::media)   WebMClusterParser (shaka::media)   
CompositionOffset (shaka::media::mp4)   H265Pps (shaka::media)   MpdParams (shaka)   SegmentInfo (shaka)   WebMContentEncodingsClient (shaka::media)   
CompositionOffsetIterator (shaka::media::mp4)   H265ReferencePictureListModifications (shaka::media)   MpdWriter (shaka)   SegmentReference (shaka::media::mp4)   WebMInfoParser (shaka::media)   
CompositionTimeToSample (shaka::media::mp4)   H265ReferencePictureSet (shaka::media)   MultiSegmentSegmenter (shaka::media::mp4)   SegmentTestBase (shaka::media)   WebMListParser (shaka::media)   
ContentEncoding (shaka::media)   H265SliceHeader (shaka::media)   MultiSegmentSegmenter (shaka::media::webm)   SegmentType (shaka::media::mp4)   WebMMediaParser (shaka::media)   
ContentProtectionElement (shaka)   H265Sps (shaka::media)   Muxer (shaka::media)   SimpleHlsNotifier (shaka::hls)   WebMMuxer (shaka::media::webm)   
ContinuityCounter (shaka::media::mp2t)   H265VideoSliceHeaderParser (shaka::media)   MuxerListener (shaka::media)   SimpleMpdNotifier (shaka)   WebMParserClient (shaka::media)   
Cue (shaka::media)   H265VuiParameters (shaka::media)   MuxerOptions (shaka::media)   SingleSegmentSegmenter (shaka::media::webm)   WebMTracksParser (shaka::media)   
CueIDBox (shaka::media::mp4)   H26xBitReader (shaka::media)   
  N  
-
SingleSegmentSegmenter (shaka::media::mp4)   WebMVideoClient (shaka::media)   
CuePayloadBox (shaka::media::mp4)   H26xByteToUnitStreamConverter (shaka::media)   SoundMediaHeader (shaka::media::mp4)   WebMWebVTTParser (shaka::media)   
CueSettingsBox (shaka::media::mp4)   HandlerReference (shaka::media::mp4)   Nalu (shaka::media)   Status (shaka)   WebVTTConfigurationBox (shaka::media::mp4)   
CueSourceIDBox (shaka::media::mp4)   HEVCDecoderConfigurationRecord (shaka::media)   NalUnitToByteStreamConverter (shaka::media)   StreamData (shaka::media)   WebVttMediaParser (shaka::media)   
CueTimeBox (shaka::media::mp4)   HlsEntry (shaka::hls)   NaluReader (shaka::media)   StreamDescriptor (shaka)   WebVttSampleConverter (shaka::media)   
  D  
-
HlsNotifier (shaka::hls)   
  O  
-
StreamInfo (shaka::media)   WebVTTSourceLabelBox (shaka::media::mp4)   
HlsNotifyMuxerListener (shaka::media)   SubsampleEntry (shaka::media)   WidevineDecryptionParams (shaka)   
DashIopMpdNotifier (shaka)   HlsParams (shaka)   OffsetByteQueue (shaka::media)   SubtitleMediaHeader (shaka::media::mp4)   WidevineEncryptionParams (shaka)   
DataEntryUrl (shaka::media::mp4)   HttpKeyFetcher (shaka::media)   EncryptionParams::EncryptedStreamAttributes::OneOf (shaka)   SyncSample (shaka::media::mp4)   WidevineKeySource (shaka::media)   
DataInformation (shaka::media::mp4)   
  I  
-
OnMediaEndParameters (shaka::media)   SyncSampleIterator (shaka::media::mp4)   WidevineSigner (shaka)   
DataReference (shaka::media::mp4)   OpusSpecific (shaka::media::mp4)   
  T  
+
ClosureThread (shaka::media)   H264SEIRecoveryPoint (shaka::media)   MpdBuilder (shaka)   Segmenter (shaka::media::mp4)   
Cluster (shaka::media)   H264SliceHeader (shaka::media)   MpdNotifier (shaka)   SegmentIndex (shaka::media::mp4)   WebMAudioClient (shaka::media)   
ClusterBuilder (shaka::media)   H264Sps (shaka::media)   MpdNotifierFactory (shaka)   SegmentInfo (shaka)   WebMClusterParser (shaka::media)   
SegmentTestBase::ClusterParser (shaka::media)   H264VideoSliceHeaderParser (shaka::media)   MpdNotifyMuxerListener (shaka::media)   SegmentInfo (shaka::media)   WebMContentEncodingsClient (shaka::media)   
CodecConfiguration (shaka::media::mp4)   H264WeightingFactors (shaka::media)   MpdOptions (shaka)   SegmentReference (shaka::media::mp4)   WebMInfoParser (shaka::media)   
CombinedMuxerListener (shaka::media)   H265ByteToUnitStreamConverter (shaka::media)   MpdParams (shaka)   SegmentTestBase (shaka::media)   WebMListParser (shaka::media)   
CompactSampleSize (shaka::media::mp4)   H265Parser (shaka::media)   MpdWriter (shaka)   SegmentType (shaka::media::mp4)   WebMMediaParser (shaka::media)   
CompositionOffset (shaka::media::mp4)   H265Pps (shaka::media)   MultiSegmentSegmenter (shaka::media::mp4)   SimpleHlsNotifier (shaka::hls)   WebMMuxer (shaka::media::webm)   
CompositionOffsetIterator (shaka::media::mp4)   H265ReferencePictureListModifications (shaka::media)   MultiSegmentSegmenter (shaka::media::webm)   SimpleMpdNotifier (shaka)   WebMParserClient (shaka::media)   
CompositionTimeToSample (shaka::media::mp4)   H265ReferencePictureSet (shaka::media)   Muxer (shaka::media)   SingleSegmentSegmenter (shaka::media::mp4)   WebMTracksParser (shaka::media)   
ContentEncoding (shaka::media)   H265SliceHeader (shaka::media)   MuxerListener (shaka::media)   SingleSegmentSegmenter (shaka::media::webm)   WebMVideoClient (shaka::media)   
ContentProtectionElement (shaka)   H265Sps (shaka::media)   MuxerOptions (shaka::media)   SoundMediaHeader (shaka::media::mp4)   WebMWebVTTParser (shaka::media)   
ContinuityCounter (shaka::media::mp2t)   H265VideoSliceHeaderParser (shaka::media)   
  N  
+
Status (shaka)   WebVTTConfigurationBox (shaka::media::mp4)   
Cue (shaka::media)   H265VuiParameters (shaka::media)   StreamData (shaka::media)   WebVttMediaParser (shaka::media)   
CueEvent (shaka::media)   H26xBitReader (shaka::media)   Nalu (shaka::media)   StreamDescriptor (shaka)   WebVttSampleConverter (shaka::media)   
CueIDBox (shaka::media::mp4)   H26xByteToUnitStreamConverter (shaka::media)   NalUnitToByteStreamConverter (shaka::media)   StreamInfo (shaka::media)   WebVTTSourceLabelBox (shaka::media::mp4)   
CuePayloadBox (shaka::media::mp4)   HandlerReference (shaka::media::mp4)   NaluReader (shaka::media)   SubsampleEntry (shaka::media)   WidevineDecryptionParams (shaka)   
Cuepoint (shaka)   HEVCDecoderConfigurationRecord (shaka::media)   
  O  
+
SubtitleMediaHeader (shaka::media::mp4)   WidevineEncryptionParams (shaka)   
CueSettingsBox (shaka::media::mp4)   HlsEntry (shaka::hls)   SyncSample (shaka::media::mp4)   WidevineKeySource (shaka::media)   
CueSourceIDBox (shaka::media::mp4)   HlsNotifier (shaka::hls)   OffsetByteQueue (shaka::media)   SyncSampleIterator (shaka::media::mp4)   WidevineSigner (shaka)   
CueTimeBox (shaka::media::mp4)   HlsNotifyMuxerListener (shaka::media)   EncryptionParams::EncryptedStreamAttributes::OneOf (shaka)   
  T  
WvmMediaParser (shaka::media::wvm)   
DecoderConfigurationRecord (shaka::media)   ID3v2 (shaka::media::mp4)   OriginalFormat (shaka::media::mp4)   
  X  
+
  D  
+
HlsParams (shaka)   OnMediaEndParameters (shaka::media)   
  X  
DecodingTime (shaka::media::mp4)   IoCache (shaka)   OriginHandler (shaka::media)   TestParams (shaka)   
DecodingTimeIterator (shaka::media::mp4)   
  K  
-
  P  
-
TextSample (shaka::media)   XmlDeleter (shaka::xml)   
DecodingTimeToSample (shaka::media::mp4)   TextSampleEntry (shaka::media::mp4)   XmlNode (shaka::xml)   
DecryptConfig (shaka::media)   KeyFetcher (shaka::media)   Packager (shaka)   TextStreamInfo (shaka::media)   
DecryptionParams (shaka)   RawKeyParams::KeyInfo (shaka)   PackagingParams (shaka)   TextTrack (shaka::media)   
HttpKeyFetcher (shaka::media)   OpusSpecific (shaka::media::mp4)   TestParams (shaka)   
DashIopMpdNotifier (shaka)   
  I  
+
OriginalFormat (shaka::media::mp4)   TextSample (shaka::media)   XmlDeleter (shaka::xml)   
DataEntryUrl (shaka::media::mp4)   OriginHandler (shaka::media)   TextSampleEntry (shaka::media::mp4)   XmlNode (shaka::xml)   
DataInformation (shaka::media::mp4)   ID3v2 (shaka::media::mp4)   
  P  
+
TextStreamInfo (shaka::media)   
DataReference (shaka::media::mp4)   IoCache (shaka)   TextTrack (shaka::media)   
Packager (shaka)   
A | B | C | D | E | F | H | I | K | L | M | N | O | P | R | S | T | U | V | W | X
diff --git a/docs/d0/d00/structshaka_1_1media_1_1mp4_1_1HandlerReference-members.html b/docs/d0/d00/structshaka_1_1media_1_1mp4_1_1HandlerReference-members.html index 72770e7273..47d2cda295 100644 --- a/docs/d0/d00/structshaka_1_1media_1_1mp4_1_1HandlerReference-members.html +++ b/docs/d0/d00/structshaka_1_1media_1_1mp4_1_1HandlerReference-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d04/classshaka_1_1media_1_1RsaRequestSigner-members.html b/docs/d0/d04/classshaka_1_1media_1_1RsaRequestSigner-members.html index b50f89e29b..db84d7a34a 100644 --- a/docs/d0/d04/classshaka_1_1media_1_1RsaRequestSigner-members.html +++ b/docs/d0/d04/classshaka_1_1media_1_1RsaRequestSigner-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d06/mpd__flags_8cc_source.html b/docs/d0/d06/mpd__flags_8cc_source.html index d9a35c864c..d1b37e05a6 100644 --- a/docs/d0/d06/mpd__flags_8cc_source.html +++ b/docs/d0/d06/mpd__flags_8cc_source.html @@ -148,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d0e/classshaka_1_1media_1_1HttpKeyFetcher-members.html b/docs/d0/d0e/classshaka_1_1media_1_1HttpKeyFetcher-members.html index db24ac3fbf..1f7846c3b9 100644 --- a/docs/d0/d0e/classshaka_1_1media_1_1HttpKeyFetcher-members.html +++ b/docs/d0/d0e/classshaka_1_1media_1_1HttpKeyFetcher-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d0e/hevc__decoder__configuration__record_8h_source.html b/docs/d0/d0e/hevc__decoder__configuration__record_8h_source.html index 637761db77..0b3ed82131 100644 --- a/docs/d0/d0e/hevc__decoder__configuration__record_8h_source.html +++ b/docs/d0/d0e/hevc__decoder__configuration__record_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d0e/muxer__options_8h_source.html b/docs/d0/d0e/muxer__options_8h_source.html index 0d06336f75..4464ef1618 100644 --- a/docs/d0/d0e/muxer__options_8h_source.html +++ b/docs/d0/d0e/muxer__options_8h_source.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d0f/classshaka_1_1media_1_1mp2t_1_1TsSectionPmt-members.html b/docs/d0/d0f/classshaka_1_1media_1_1mp2t_1_1TsSectionPmt-members.html index 5c1160ff05..b738063d9e 100644 --- a/docs/d0/d0f/classshaka_1_1media_1_1mp2t_1_1TsSectionPmt-members.html +++ b/docs/d0/d0f/classshaka_1_1media_1_1mp2t_1_1TsSectionPmt-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d11/structshaka_1_1media_1_1VPxFrameInfo.html b/docs/d0/d11/structshaka_1_1media_1_1VPxFrameInfo.html index 9b2f65a796..43187eacbe 100644 --- a/docs/d0/d11/structshaka_1_1media_1_1VPxFrameInfo.html +++ b/docs/d0/d11/structshaka_1_1media_1_1VPxFrameInfo.html @@ -121,7 +121,7 @@ uint32_t height diff --git a/docs/d0/d17/structshaka_1_1media_1_1StreamData-members.html b/docs/d0/d17/structshaka_1_1media_1_1StreamData-members.html index 10c631495f..6951c0d802 100644 --- a/docs/d0/d17/structshaka_1_1media_1_1StreamData-members.html +++ b/docs/d0/d17/structshaka_1_1media_1_1StreamData-members.html @@ -93,15 +93,15 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');

This is the complete list of members for shaka::media::StreamData, including all inherited members.

- - - - - - - + + + + + + + - + @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
FromMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
media_event (defined in shaka::media::StreamData)shaka::media::StreamData
cue_event (defined in shaka::media::StreamData)shaka::media::StreamData
FromCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
FromTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample) (defined in shaka::media::StreamData)shaka::media::StreamDatainlinestatic
media_sample (defined in shaka::media::StreamData)shaka::media::StreamData
period_info (defined in shaka::media::StreamData)shaka::media::StreamData
scte35_event (defined in shaka::media::StreamData)shaka::media::StreamData
segment_info (defined in shaka::media::StreamData)shaka::media::StreamData
stream_data_type (defined in shaka::media::StreamData)shaka::media::StreamData
stream_index (defined in shaka::media::StreamData)shaka::media::StreamData
diff --git a/docs/d0/d1a/text__sample_8h_source.html b/docs/d0/d1a/text__sample_8h_source.html index 4273600447..b2b49625d1 100644 --- a/docs/d0/d1a/text__sample_8h_source.html +++ b/docs/d0/d1a/text__sample_8h_source.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d1e/classshaka_1_1media_1_1H265ByteToUnitStreamConverter-members.html b/docs/d0/d1e/classshaka_1_1media_1_1H265ByteToUnitStreamConverter-members.html index aca3df1703..f91cd25942 100644 --- a/docs/d0/d1e/classshaka_1_1media_1_1H265ByteToUnitStreamConverter-members.html +++ b/docs/d0/d1e/classshaka_1_1media_1_1H265ByteToUnitStreamConverter-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d1f/structshaka_1_1media_1_1mp4_1_1VTTCueBox-members.html b/docs/d0/d1f/structshaka_1_1media_1_1mp4_1_1VTTCueBox-members.html index c7ea79746c..764bb5ddff 100644 --- a/docs/d0/d1f/structshaka_1_1media_1_1mp4_1_1VTTCueBox-members.html +++ b/docs/d0/d1f/structshaka_1_1media_1_1mp4_1_1VTTCueBox-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d26/classshaka_1_1media_1_1mp2t_1_1TsSectionPat.html b/docs/d0/d26/classshaka_1_1media_1_1mp2t_1_1TsSectionPat.html index c1a1d37850..c51b89dcf9 100644 --- a/docs/d0/d26/classshaka_1_1media_1_1mp2t_1_1TsSectionPat.html +++ b/docs/d0/d26/classshaka_1_1media_1_1mp2t_1_1TsSectionPat.html @@ -155,7 +155,7 @@ void Reset () override diff --git a/docs/d0/d27/structshaka_1_1media_1_1MuxerOptions.html b/docs/d0/d27/structshaka_1_1media_1_1MuxerOptions.html index af45071a0a..d0f75b6891 100644 --- a/docs/d0/d27/structshaka_1_1media_1_1MuxerOptions.html +++ b/docs/d0/d27/structshaka_1_1media_1_1MuxerOptions.html @@ -173,7 +173,7 @@ std::string  diff --git a/docs/d0/d30/mock__mpd__notifier_8h_source.html b/docs/d0/d30/mock__mpd__notifier_8h_source.html index f1e739f7ff..a9ceec5451 100644 --- a/docs/d0/d30/mock__mpd__notifier_8h_source.html +++ b/docs/d0/d30/mock__mpd__notifier_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d32/mp2t__common_8h_source.html b/docs/d0/d32/mp2t__common_8h_source.html index ec7fcf18fd..ffa002e93c 100644 --- a/docs/d0/d32/mp2t__common_8h_source.html +++ b/docs/d0/d32/mp2t__common_8h_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d33/classshaka_1_1MockRepresentation.html b/docs/d0/d33/classshaka_1_1MockRepresentation.html index 6a40f257b2..9484fe5f3b 100644 --- a/docs/d0/d33/classshaka_1_1MockRepresentation.html +++ b/docs/d0/d33/classshaka_1_1MockRepresentation.html @@ -160,7 +160,7 @@ Additional Inherited Members diff --git a/docs/d0/d35/es__descriptor_8cc_source.html b/docs/d0/d35/es__descriptor_8cc_source.html index 6eb671d5ee..62f2b7c392 100644 --- a/docs/d0/d35/es__descriptor_8cc_source.html +++ b/docs/d0/d35/es__descriptor_8cc_source.html @@ -285,7 +285,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d37/unionshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes_1_1OneOf.html b/docs/d0/d37/unionshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes_1_1OneOf.html index 22f9faaaa9..f5f366a82d 100644 --- a/docs/d0/d37/unionshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes_1_1OneOf.html +++ b/docs/d0/d37/unionshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes_1_1OneOf.html @@ -96,29 +96,29 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - - - - + - - + - - + - - - - + + + - - - - + + +

Public Attributes

+
struct {
+
   int   width = 0
 
+
 
   int   height = 0
 
+
 
   float   frame_rate = 0
 
+
 
   int   bit_depth = 0
 
video
 
+
 
video
 
struct {
+
   int   number_of_channels = 0
 
audio
 
 
audio
 

Detailed Description

@@ -129,7 +129,7 @@ struct {
diff --git a/docs/d0/d3a/hls__notify__muxer__listener_8cc_source.html b/docs/d0/d3a/hls__notify__muxer__listener_8cc_source.html index 9a1da73a67..60a5c3149e 100644 --- a/docs/d0/d3a/hls__notify__muxer__listener_8cc_source.html +++ b/docs/d0/d3a/hls__notify__muxer__listener_8cc_source.html @@ -286,7 +286,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
base::Optional< Range > init_range
Range of the initialization section of a segment.
Abstract class holds stream information.
Definition: stream_info.h:58
void OnEncryptionInfoReady(bool is_initial_encryption_info, FourCC protection_scheme, const std::vector< uint8_t > &key_id, const std::vector< uint8_t > &iv, const std::vector< ProtectionSystemSpecificInfo > &key_system_info) override
-
Definition: media_handler.h:35
+
Definition: media_handler.h:53
base::Optional< Range > index_range
Range of the index section of a segment.
std::vector< Range > subsegment_ranges
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
@@ -305,7 +305,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d3a/webm__constants_8h_source.html b/docs/d0/d3a/webm__constants_8h_source.html index bd2e00b2d0..9963054ca2 100644 --- a/docs/d0/d3a/webm__constants_8h_source.html +++ b/docs/d0/d3a/webm__constants_8h_source.html @@ -333,7 +333,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d3c/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html b/docs/d0/d3c/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html index b3433f5aea..3f2367cff2 100644 --- a/docs/d0/d3c/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html +++ b/docs/d0/d3c/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d0/d42/aes__cryptor_8h_source.html b/docs/d0/d42/aes__cryptor_8h_source.html index c03dcd393f..db8d3b1ddb 100644 --- a/docs/d0/d42/aes__cryptor_8h_source.html +++ b/docs/d0/d42/aes__cryptor_8h_source.html @@ -215,7 +215,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d42/widevine__encryption__flags_8cc_source.html b/docs/d0/d42/widevine__encryption__flags_8cc_source.html index b95eee3735..d5c552ede9 100644 --- a/docs/d0/d42/widevine__encryption__flags_8cc_source.html +++ b/docs/d0/d42/widevine__encryption__flags_8cc_source.html @@ -274,7 +274,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d43/structshaka_1_1Mp4OutputParams.html b/docs/d0/d43/structshaka_1_1Mp4OutputParams.html index 11497df0fc..cc99edbe48 100644 --- a/docs/d0/d43/structshaka_1_1Mp4OutputParams.html +++ b/docs/d0/d43/structshaka_1_1Mp4OutputParams.html @@ -168,7 +168,7 @@ static constexpr int kSing diff --git a/docs/d0/d46/fourccs_8h_source.html b/docs/d0/d46/fourccs_8h_source.html index a55edb1caa..b920aff43c 100644 --- a/docs/d0/d46/fourccs_8h_source.html +++ b/docs/d0/d46/fourccs_8h_source.html @@ -109,155 +109,160 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
20 
21  FOURCC_aacd = 0x61616364,
22  FOURCC_ac_3 = 0x61632d33, // "ac-3"
-
23  FOURCC_apad = 0x61706164,
-
24  FOURCC_avc1 = 0x61766331,
-
25  FOURCC_avc3 = 0x61766333,
-
26  FOURCC_avcC = 0x61766343,
-
27  FOURCC_bloc = 0x626C6F63,
-
28  FOURCC_cbc1 = 0x63626331,
-
29  // This is a fake protection scheme fourcc code to indicate Apple Sample AES.
-
30  FOURCC_cbca = 0x63626361,
-
31  FOURCC_cbcs = 0x63626373,
-
32  FOURCC_cenc = 0x63656e63,
-
33  FOURCC_cens = 0x63656e73,
-
34  FOURCC_co64 = 0x636f3634,
-
35  FOURCC_cmfc = 0x636d6663,
-
36  FOURCC_cmfs = 0x636d6673,
-
37  FOURCC_ctim = 0x6374696d,
-
38  FOURCC_ctts = 0x63747473,
-
39  FOURCC_dOps = 0x644f7073,
-
40  FOURCC_dac3 = 0x64616333,
-
41  FOURCC_dash = 0x64617368,
-
42  FOURCC_ddts = 0x64647473,
-
43  FOURCC_dec3 = 0x64656333,
-
44  FOURCC_dinf = 0x64696e66,
-
45  FOURCC_dref = 0x64726566,
-
46  FOURCC_dtsc = 0x64747363,
-
47  FOURCC_dtse = 0x64747365,
-
48  FOURCC_dtsh = 0x64747368,
-
49  FOURCC_dtsl = 0x6474736c,
-
50  FOURCC_dtsm = 0x6474732d, // "dts-"
-
51  FOURCC_dtsp = 0x6474732b, // "dts+"
-
52  FOURCC_ec_3 = 0x65632d33, // "ec-3"
-
53  FOURCC_edts = 0x65647473,
-
54  FOURCC_elst = 0x656c7374,
-
55  FOURCC_enca = 0x656e6361,
-
56  FOURCC_encv = 0x656e6376,
-
57  FOURCC_esds = 0x65736473,
-
58  FOURCC_free = 0x66726565,
-
59  FOURCC_frma = 0x66726d61,
-
60  FOURCC_ftyp = 0x66747970,
-
61  FOURCC_hdlr = 0x68646c72,
-
62  FOURCC_hev1 = 0x68657631,
-
63  FOURCC_hint = 0x68696e74,
-
64  FOURCC_hvc1 = 0x68766331,
-
65  FOURCC_hvcC = 0x68766343,
-
66  FOURCC_iden = 0x6964656e,
-
67  FOURCC_iso6 = 0x69736f36,
-
68  FOURCC_iso8 = 0x69736f38,
-
69  FOURCC_isom = 0x69736f6d,
-
70  FOURCC_iods = 0x696f6473,
-
71  FOURCC_mdat = 0x6d646174,
-
72  FOURCC_mdhd = 0x6d646864,
-
73  FOURCC_mdia = 0x6d646961,
-
74  FOURCC_meco = 0x6d65636f,
-
75  FOURCC_mehd = 0x6d656864,
-
76  FOURCC_meta = 0x6d657461,
-
77  FOURCC_mfhd = 0x6d666864,
-
78  FOURCC_mfra = 0x6d667261,
-
79  FOURCC_minf = 0x6d696e66,
-
80  FOURCC_moof = 0x6d6f6f66,
-
81  FOURCC_moov = 0x6d6f6f76,
-
82  FOURCC_mp41 = 0x6d703431,
-
83  FOURCC_mp4a = 0x6d703461,
-
84  FOURCC_mp4v = 0x6d703476,
-
85  FOURCC_mvex = 0x6d766578,
-
86  FOURCC_mvhd = 0x6d766864,
-
87  FOURCC_pasp = 0x70617370,
-
88  FOURCC_payl = 0x7061796c,
-
89  FOURCC_pdin = 0x7064696e,
-
90  FOURCC_prft = 0x70726674,
-
91  FOURCC_pssh = 0x70737368,
-
92  FOURCC_roll = 0x726f6c6c,
-
93  FOURCC_saio = 0x7361696f,
-
94  FOURCC_saiz = 0x7361697a,
-
95  FOURCC_sbgp = 0x73626770,
-
96  FOURCC_schi = 0x73636869,
-
97  FOURCC_schm = 0x7363686d,
-
98  FOURCC_sdtp = 0x73647470,
-
99  FOURCC_seig = 0x73656967,
-
100  FOURCC_senc = 0x73656e63,
-
101  FOURCC_sgpd = 0x73677064,
-
102  FOURCC_sidx = 0x73696478,
-
103  FOURCC_sinf = 0x73696e66,
-
104  FOURCC_skip = 0x736b6970,
-
105  FOURCC_smhd = 0x736d6864,
-
106  FOURCC_soun = 0x736f756e,
-
107  FOURCC_ssix = 0x73736978,
-
108  FOURCC_stbl = 0x7374626c,
-
109  FOURCC_stco = 0x7374636f,
-
110  FOURCC_sthd = 0x73746864,
-
111  FOURCC_stsc = 0x73747363,
-
112  FOURCC_stsd = 0x73747364,
-
113  FOURCC_stss = 0x73747373,
-
114  FOURCC_stsz = 0x7374737a,
-
115  FOURCC_sttg = 0x73747467,
-
116  FOURCC_stts = 0x73747473,
-
117  FOURCC_styp = 0x73747970,
-
118  FOURCC_stz2 = 0x73747a32,
-
119  FOURCC_subt = 0x73756274,
-
120  FOURCC_tenc = 0x74656e63,
-
121  FOURCC_text = 0x74657874,
-
122  FOURCC_tfdt = 0x74666474,
-
123  FOURCC_tfhd = 0x74666864,
-
124  FOURCC_tkhd = 0x746b6864,
-
125  FOURCC_traf = 0x74726166,
-
126  FOURCC_trak = 0x7472616b,
-
127  FOURCC_trex = 0x74726578,
-
128  FOURCC_trun = 0x7472756e,
-
129  FOURCC_udta = 0x75647461,
-
130  FOURCC_url = 0x75726c20, // "url "
-
131  FOURCC_urn = 0x75726e20, // "urn "
-
132  FOURCC_uuid = 0x75756964,
-
133  FOURCC_vide = 0x76696465,
-
134  FOURCC_vlab = 0x766c6162,
-
135  FOURCC_vmhd = 0x766d6864,
-
136  FOURCC_vp08 = 0x76703038,
-
137  FOURCC_vp09 = 0x76703039,
-
138  FOURCC_vp10 = 0x76703130,
-
139  FOURCC_vpcC = 0x76706343,
-
140  FOURCC_vsid = 0x76736964,
-
141  FOURCC_vttC = 0x76747443,
-
142  FOURCC_vtta = 0x76747461,
-
143  FOURCC_vttc = 0x76747463,
-
144  FOURCC_vtte = 0x76747465,
-
145  FOURCC_wide = 0x77696465,
-
146  FOURCC_wvtt = 0x77767474,
-
147  FOURCC_zaac = 0x7A616163,
-
148  FOURCC_zach = 0x7A616368,
-
149  FOURCC_zacp = 0x7A616370,
-
150 };
-
151 
-
152 const FourCC kAppleSampleAesProtectionScheme = FOURCC_cbca;
-
153 
-
154 const inline std::string FourCCToString(FourCC fourcc) {
-
155  char buf[5];
-
156  buf[0] = (fourcc >> 24) & 0xff;
-
157  buf[1] = (fourcc >> 16) & 0xff;
-
158  buf[2] = (fourcc >> 8) & 0xff;
-
159  buf[3] = (fourcc) & 0xff;
-
160  buf[4] = 0;
-
161  return std::string(buf);
-
162 }
-
163 
-
164 } // namespace media
-
165 } // namespace shaka
-
166 
-
167 #endif // PACKAGER_MEDIA_BASE_FOURCCS_H_
+
23  FOURCC_ac3d = 0x61633364,
+
24  FOURCC_apad = 0x61706164,
+
25  FOURCC_avc1 = 0x61766331,
+
26  FOURCC_avc3 = 0x61766333,
+
27  FOURCC_avcC = 0x61766343,
+
28  FOURCC_bloc = 0x626C6F63,
+
29  FOURCC_cbc1 = 0x63626331,
+
30  // This is a fake protection scheme fourcc code to indicate Apple Sample AES.
+
31  FOURCC_cbca = 0x63626361,
+
32  FOURCC_cbcs = 0x63626373,
+
33  FOURCC_cenc = 0x63656e63,
+
34  FOURCC_cens = 0x63656e73,
+
35  FOURCC_co64 = 0x636f3634,
+
36  FOURCC_cmfc = 0x636d6663,
+
37  FOURCC_cmfs = 0x636d6673,
+
38  FOURCC_ctim = 0x6374696d,
+
39  FOURCC_ctts = 0x63747473,
+
40  FOURCC_dOps = 0x644f7073,
+
41  FOURCC_dac3 = 0x64616333,
+
42  FOURCC_dash = 0x64617368,
+
43  FOURCC_ddts = 0x64647473,
+
44  FOURCC_dec3 = 0x64656333,
+
45  FOURCC_dinf = 0x64696e66,
+
46  FOURCC_dref = 0x64726566,
+
47  FOURCC_dtsc = 0x64747363,
+
48  FOURCC_dtse = 0x64747365,
+
49  FOURCC_dtsh = 0x64747368,
+
50  FOURCC_dtsl = 0x6474736c,
+
51  FOURCC_dtsm = 0x6474732d, // "dts-"
+
52  FOURCC_dtsp = 0x6474732b, // "dts+"
+
53  FOURCC_ec_3 = 0x65632d33, // "ec-3"
+
54  FOURCC_ec3d = 0x65633364,
+
55  FOURCC_edts = 0x65647473,
+
56  FOURCC_elst = 0x656c7374,
+
57  FOURCC_enca = 0x656e6361,
+
58  FOURCC_encv = 0x656e6376,
+
59  FOURCC_esds = 0x65736473,
+
60  FOURCC_free = 0x66726565,
+
61  FOURCC_frma = 0x66726d61,
+
62  FOURCC_ftyp = 0x66747970,
+
63  FOURCC_hdlr = 0x68646c72,
+
64  FOURCC_hev1 = 0x68657631,
+
65  FOURCC_hint = 0x68696e74,
+
66  FOURCC_hvc1 = 0x68766331,
+
67  FOURCC_hvcC = 0x68766343,
+
68  FOURCC_iden = 0x6964656e,
+
69  FOURCC_iso6 = 0x69736f36,
+
70  FOURCC_iso8 = 0x69736f38,
+
71  FOURCC_isom = 0x69736f6d,
+
72  FOURCC_iods = 0x696f6473,
+
73  FOURCC_mdat = 0x6d646174,
+
74  FOURCC_mdhd = 0x6d646864,
+
75  FOURCC_mdia = 0x6d646961,
+
76  FOURCC_meco = 0x6d65636f,
+
77  FOURCC_mehd = 0x6d656864,
+
78  FOURCC_meta = 0x6d657461,
+
79  FOURCC_mfhd = 0x6d666864,
+
80  FOURCC_mfra = 0x6d667261,
+
81  FOURCC_minf = 0x6d696e66,
+
82  FOURCC_moof = 0x6d6f6f66,
+
83  FOURCC_moov = 0x6d6f6f76,
+
84  FOURCC_mp41 = 0x6d703431,
+
85  FOURCC_mp4a = 0x6d703461,
+
86  FOURCC_mp4v = 0x6d703476,
+
87  FOURCC_mvex = 0x6d766578,
+
88  FOURCC_mvhd = 0x6d766864,
+
89  FOURCC_pasp = 0x70617370,
+
90  FOURCC_payl = 0x7061796c,
+
91  FOURCC_pdin = 0x7064696e,
+
92  FOURCC_prft = 0x70726674,
+
93  FOURCC_pssh = 0x70737368,
+
94  FOURCC_roll = 0x726f6c6c,
+
95  FOURCC_saio = 0x7361696f,
+
96  FOURCC_saiz = 0x7361697a,
+
97  FOURCC_sbgp = 0x73626770,
+
98  FOURCC_schi = 0x73636869,
+
99  FOURCC_schm = 0x7363686d,
+
100  FOURCC_sdtp = 0x73647470,
+
101  FOURCC_seig = 0x73656967,
+
102  FOURCC_senc = 0x73656e63,
+
103  FOURCC_sgpd = 0x73677064,
+
104  FOURCC_sidx = 0x73696478,
+
105  FOURCC_sinf = 0x73696e66,
+
106  FOURCC_skip = 0x736b6970,
+
107  FOURCC_smhd = 0x736d6864,
+
108  FOURCC_soun = 0x736f756e,
+
109  FOURCC_ssix = 0x73736978,
+
110  FOURCC_stbl = 0x7374626c,
+
111  FOURCC_stco = 0x7374636f,
+
112  FOURCC_sthd = 0x73746864,
+
113  FOURCC_stsc = 0x73747363,
+
114  FOURCC_stsd = 0x73747364,
+
115  FOURCC_stss = 0x73747373,
+
116  FOURCC_stsz = 0x7374737a,
+
117  FOURCC_sttg = 0x73747467,
+
118  FOURCC_stts = 0x73747473,
+
119  FOURCC_styp = 0x73747970,
+
120  FOURCC_stz2 = 0x73747a32,
+
121  FOURCC_subt = 0x73756274,
+
122  FOURCC_tenc = 0x74656e63,
+
123  FOURCC_text = 0x74657874,
+
124  FOURCC_tfdt = 0x74666474,
+
125  FOURCC_tfhd = 0x74666864,
+
126  FOURCC_tkhd = 0x746b6864,
+
127  FOURCC_traf = 0x74726166,
+
128  FOURCC_trak = 0x7472616b,
+
129  FOURCC_trex = 0x74726578,
+
130  FOURCC_trun = 0x7472756e,
+
131  FOURCC_udta = 0x75647461,
+
132  FOURCC_url = 0x75726c20, // "url "
+
133  FOURCC_urn = 0x75726e20, // "urn "
+
134  FOURCC_uuid = 0x75756964,
+
135  FOURCC_vide = 0x76696465,
+
136  FOURCC_vlab = 0x766c6162,
+
137  FOURCC_vmhd = 0x766d6864,
+
138  FOURCC_vp08 = 0x76703038,
+
139  FOURCC_vp09 = 0x76703039,
+
140  FOURCC_vp10 = 0x76703130,
+
141  FOURCC_vpcC = 0x76706343,
+
142  FOURCC_vsid = 0x76736964,
+
143  FOURCC_vttC = 0x76747443,
+
144  FOURCC_vtta = 0x76747461,
+
145  FOURCC_vttc = 0x76747463,
+
146  FOURCC_vtte = 0x76747465,
+
147  FOURCC_wide = 0x77696465,
+
148  FOURCC_wvtt = 0x77767474,
+
149  FOURCC_zaac = 0x7A616163,
+
150  FOURCC_zac3 = 0x7A616333,
+
151  FOURCC_zach = 0x7A616368,
+
152  FOURCC_zacp = 0x7A616370,
+
153  FOURCC_zavc = 0x7A617663,
+
154  FOURCC_zec3 = 0x7A656333,
+
155 };
+
156 
+
157 const FourCC kAppleSampleAesProtectionScheme = FOURCC_cbca;
+
158 
+
159 const inline std::string FourCCToString(FourCC fourcc) {
+
160  char buf[5];
+
161  buf[0] = (fourcc >> 24) & 0xff;
+
162  buf[1] = (fourcc >> 16) & 0xff;
+
163  buf[2] = (fourcc >> 8) & 0xff;
+
164  buf[3] = (fourcc) & 0xff;
+
165  buf[4] = 0;
+
166  return std::string(buf);
+
167 }
+
168 
+
169 } // namespace media
+
170 } // namespace shaka
+
171 
+
172 #endif // PACKAGER_MEDIA_BASE_FOURCCS_H_
diff --git a/docs/d0/d48/structshaka_1_1media_1_1SegmentInfo-members.html b/docs/d0/d48/structshaka_1_1media_1_1SegmentInfo-members.html index c408ab449a..8bc3723986 100644 --- a/docs/d0/d48/structshaka_1_1media_1_1SegmentInfo-members.html +++ b/docs/d0/d48/structshaka_1_1media_1_1SegmentInfo-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d49/vod__media__info__dump__muxer__listener_8cc_source.html b/docs/d0/d49/vod__media__info__dump__muxer__listener_8cc_source.html index aaa5866be6..526a656f83 100644 --- a/docs/d0/d49/vod__media__info__dump__muxer__listener_8cc_source.html +++ b/docs/d0/d49/vod__media__info__dump__muxer__listener_8cc_source.html @@ -225,7 +225,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d4b/structshaka_1_1media_1_1mp4_1_1MediaInformation-members.html b/docs/d0/d4b/structshaka_1_1media_1_1mp4_1_1MediaInformation-members.html index 1d499b6484..7e997346a8 100644 --- a/docs/d0/d4b/structshaka_1_1media_1_1mp4_1_1MediaInformation-members.html +++ b/docs/d0/d4b/structshaka_1_1media_1_1mp4_1_1MediaInformation-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d4c/structshaka_1_1media_1_1StreamData.html b/docs/d0/d4c/structshaka_1_1media_1_1StreamData.html index ea9e4294de..6aba343dc1 100644 --- a/docs/d0/d4c/structshaka_1_1media_1_1StreamData.html +++ b/docs/d0/d4c/structshaka_1_1media_1_1StreamData.html @@ -97,10 +97,6 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - - @@ -113,14 +109,18 @@ static std::unique_ptr
static std::unique_ptr
< StreamData >  - - + + + +

Static Public Member Functions

-static std::unique_ptr
-< StreamData
FromPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)
 
static std::unique_ptr
< StreamData
FromStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
FromTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)
 
-static std::unique_ptr
-< StreamData
FromMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event)
 
static std::unique_ptr
< StreamData
FromSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
 
+static std::unique_ptr
+< StreamData
FromScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)
 
+static std::unique_ptr
+< StreamData
FromCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event)
 
@@ -130,9 +130,6 @@ size_t  - - @@ -143,24 +140,28 @@ std::shared_ptr< const
- - + + + +

Public Attributes

stream_index =
StreamDataType stream_data_type = StreamDataType::kUnknown
 
-std::shared_ptr< const PeriodInfoperiod_info
 
std::shared_ptr< const StreamInfostream_info
 
std::shared_ptr< const TextSampletext_sample
 
-std::shared_ptr< const MediaEventmedia_event
 
std::shared_ptr< const
SegmentInfo
segment_info
 
+std::shared_ptr< const
+Scte35Event
scte35_event
 
+std::shared_ptr< const CueEventcue_event
 

Detailed Description

-

Definition at line 47 of file media_handler.h.

+

Definition at line 65 of file media_handler.h.


The documentation for this struct was generated from the following file: diff --git a/docs/d0/d4d/classshaka_1_1media_1_1AudioTimestampHelper.html b/docs/d0/d4d/classshaka_1_1media_1_1AudioTimestampHelper.html index b2842023e0..321b946747 100644 --- a/docs/d0/d4d/classshaka_1_1media_1_1AudioTimestampHelper.html +++ b/docs/d0/d4d/classshaka_1_1media_1_1AudioTimestampHelper.html @@ -131,7 +131,7 @@ int64_t GetFramesToTarget< diff --git a/docs/d0/d4e/libcrypto__threading_8cc_source.html b/docs/d0/d4e/libcrypto__threading_8cc_source.html index 2c2f5d5c46..312033167a 100644 --- a/docs/d0/d4e/libcrypto__threading_8cc_source.html +++ b/docs/d0/d4e/libcrypto__threading_8cc_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d53/classshaka_1_1media_1_1mp2t_1_1TsMuxer-members.html b/docs/d0/d53/classshaka_1_1media_1_1mp2t_1_1TsMuxer-members.html index 79aef164c5..0e7654e57c 100644 --- a/docs/d0/d53/classshaka_1_1media_1_1mp2t_1_1TsMuxer-members.html +++ b/docs/d0/d53/classshaka_1_1media_1_1mp2t_1_1TsMuxer-members.html @@ -97,9 +97,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); Cancel()shaka::media::Muxer clock() (defined in shaka::media::Muxer)shaka::media::Muxerinlineprotected Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected - DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected + DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected - DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected + DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d5b/classshaka_1_1media_1_1MpdNotifyMuxerListener-members.html b/docs/d0/d5b/classshaka_1_1media_1_1MpdNotifyMuxerListener-members.html index 7a7f490dbc..2fb5fa49ce 100644 --- a/docs/d0/d5b/classshaka_1_1media_1_1MpdNotifyMuxerListener-members.html +++ b/docs/d0/d5b/classshaka_1_1media_1_1MpdNotifyMuxerListener-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d82/adts__constants_8h_source.html b/docs/d0/d65/ad__cue__generator__flags_8cc_source.html similarity index 68% rename from docs/d1/d82/adts__constants_8h_source.html rename to docs/d0/d65/ad__cue__generator__flags_8cc_source.html index 7e2ba5188d..b7313c45df 100644 --- a/docs/d1/d82/adts__constants_8h_source.html +++ b/docs/d0/d65/ad__cue__generator__flags_8cc_source.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: packager/media/formats/mpeg/adts_constants.h Source File +Shaka Packager SDK: packager/app/ad_cue_generator_flags.cc Source File @@ -79,45 +79,37 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
adts_constants.h
+
ad_cue_generator_flags.cc
-
1 // Copyright 2014 The Chromium Authors. All rights reserved.
-
2 // Use of this source code is governed by a BSD-style license that can be
-
3 // found in the LICENSE file.
-
4 
-
5 #ifndef MEDIA_FORMATS_MPEG_ADTS_CONSTANTS_H_
-
6 #define MEDIA_FORMATS_MPEG_ADTS_CONSTANTS_H_
-
7 
-
8 #include <stddef.h>
-
9 
-
10 namespace shaka {
-
11 namespace media {
-
12 
-
13 enum {
-
14  kAdtsHeaderMinSize = 7,
-
15  kSamplesPerAACFrame = 1024,
-
16 };
-
17 
-
18 extern const int kAdtsFrequencyTable[];
-
19 extern const size_t kAdtsFrequencyTableSize;
-
20 
-
21 extern const int kAdtsNumChannelsTable[];
-
22 extern const size_t kAdtsNumChannelsTableSize;
-
23 
-
24 } // namespace media
-
25 } // namespace shaka
-
26 
-
27 #endif // MEDIA_FORMATS_MPEG_ADTS_CONSTANTS_H_
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 //
+
7 // Defines cuepoint generator flags.
+
8 
+
9 #include "packager/app/ad_cue_generator_flags.h"
+
10 
+
11 DEFINE_string(ad_cues,
+
12  "",
+
13  "List of cuepoint markers."
+
14  "This flag accepts semicolon separated pairs and components in "
+
15  "the pair are separated by a comma and the second component "
+
16  "duration is optional. For example --ad_cues "
+
17  "{start_time}[,{duration}][;{start_time}[,{duration}]]..."
+
18  "The start_time represents the start of the cue marker in "
+
19  "seconds relative to the start of the program.");
diff --git a/docs/d0/d73/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry.html b/docs/d0/d73/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry.html index 5a22290123..a07a018e17 100644 --- a/docs/d0/d73/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry.html +++ b/docs/d0/d73/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry.html @@ -197,7 +197,7 @@ Additional Inherited Members
diff --git a/docs/d0/d7c/structshaka_1_1media_1_1mp4_1_1SampleToGroup.html b/docs/d0/d7c/structshaka_1_1media_1_1mp4_1_1SampleToGroup.html index 2b009fe6b1..c31fdc0bfa 100644 --- a/docs/d0/d7c/structshaka_1_1media_1_1mp4_1_1SampleToGroup.html +++ b/docs/d0/d7c/structshaka_1_1media_1_1mp4_1_1SampleToGroup.html @@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/d0/d7d/decryptor__source_8h_source.html b/docs/d0/d7d/decryptor__source_8h_source.html index eea5dcbb00..2f0388ba5d 100644 --- a/docs/d0/d7d/decryptor__source_8h_source.html +++ b/docs/d0/d7d/decryptor__source_8h_source.html @@ -136,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d80/classshaka_1_1media_1_1AesCbcEncryptor-members.html b/docs/d0/d80/classshaka_1_1media_1_1AesCbcEncryptor-members.html index 97e51fbae5..6fbc74d481 100644 --- a/docs/d0/d80/classshaka_1_1media_1_1AesCbcEncryptor-members.html +++ b/docs/d0/d80/classshaka_1_1media_1_1AesCbcEncryptor-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d9a/structshaka_1_1media_1_1mp4_1_1Movie.html b/docs/d0/d9a/structshaka_1_1media_1_1mp4_1_1Movie.html index 13c44f0b57..c05618cab7 100644 --- a/docs/d0/d9a/structshaka_1_1media_1_1mp4_1_1Movie.html +++ b/docs/d0/d9a/structshaka_1_1media_1_1mp4_1_1Movie.html @@ -186,7 +186,7 @@ Additional Inherited Members diff --git a/docs/d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html b/docs/d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html index e95a28a368..5889c5285f 100644 --- a/docs/d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html +++ b/docs/d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html @@ -344,7 +344,7 @@ static const size_t  diff --git a/docs/d0/da2/classshaka_1_1media_1_1RequestSigner-members.html b/docs/d0/da2/classshaka_1_1media_1_1RequestSigner-members.html index d08387d367..53e3730902 100644 --- a/docs/d0/da2/classshaka_1_1media_1_1RequestSigner-members.html +++ b/docs/d0/da2/classshaka_1_1media_1_1RequestSigner-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/da2/structshaka_1_1xml_1_1XmlDeleter-members.html b/docs/d0/da2/structshaka_1_1xml_1_1XmlDeleter-members.html index b16c70f5d5..5d137467d9 100644 --- a/docs/d0/da2/structshaka_1_1xml_1_1XmlDeleter-members.html +++ b/docs/d0/da2/structshaka_1_1xml_1_1XmlDeleter-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/da6/stream__descriptor_8cc_source.html b/docs/d0/da6/stream__descriptor_8cc_source.html index 04329a1ec9..0d34cf8f83 100644 --- a/docs/d0/da6/stream__descriptor_8cc_source.html +++ b/docs/d0/da6/stream__descriptor_8cc_source.html @@ -260,25 +260,25 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
171 }
172 
173 } // namespace shaka
-
std::string stream_selector
Definition: packager.h:71
-
Defines a single input/output stream.
Definition: packager.h:65
-
std::string input
Input/source media file path or network stream URL. Required.
Definition: packager.h:67
-
std::string hls_playlist_name
Definition: packager.h:110
-
std::string hls_name
Definition: packager.h:104
+
std::string stream_selector
Definition: packager.h:75
+
Defines a single input/output stream.
Definition: packager.h:69
+
std::string input
Input/source media file path or network stream URL. Required.
Definition: packager.h:71
+
std::string hls_playlist_name
Definition: packager.h:114
+
std::string hls_name
Definition: packager.h:108
base::Optional< StreamDescriptor > ParseStreamDescriptor(const std::string &descriptor_string)
-
std::string segment_template
Specifies segment template. Can be empty.
Definition: packager.h:77
-
std::string output_format
Definition: packager.h:81
-
std::string drm_label
Definition: packager.h:89
-
uint32_t trick_play_factor
Definition: packager.h:93
-
std::string output
Definition: packager.h:75
- - -
std::string language
Definition: packager.h:100
-
std::string hls_group_id
Definition: packager.h:107
+
std::string segment_template
Specifies segment template. Can be empty.
Definition: packager.h:81
+
std::string output_format
Definition: packager.h:85
+
std::string drm_label
Definition: packager.h:93
+
uint32_t trick_play_factor
Definition: packager.h:97
+
std::string output
Definition: packager.h:79
+ + +
std::string language
Definition: packager.h:104
+
std::string hls_group_id
Definition: packager.h:111
diff --git a/docs/d0/da8/structshaka_1_1HlsParams.html b/docs/d0/da8/structshaka_1_1HlsParams.html index c024071c7e..70b59b43ec 100644 --- a/docs/d0/da8/structshaka_1_1HlsParams.html +++ b/docs/d0/da8/structshaka_1_1HlsParams.html @@ -113,6 +113,8 @@ std::string   double time_shift_buffer_depth = 0   +std::string key_uri

Detailed Description

HLS related parameters.

@@ -132,6 +134,21 @@ std::string Definition at line 30 of file hls_params.h.

+
+ + +
+
+ + + + +
std::string shaka::HlsParams::key_uri
+
+

Defines the key uri for "identity" and "com.apple.streamingkeydelivery" key formats. Ignored if the playlist is not encrypted or not using the above key formats.

+ +

Definition at line 37 of file hls_params.h.

+
@@ -155,7 +172,7 @@ std::string  diff --git a/docs/d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html b/docs/d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html index 4cca42596f..8d8493cb25 100644 --- a/docs/d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html +++ b/docs/d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html @@ -264,7 +264,7 @@ void set_progress_target diff --git a/docs/d0/dac/classshaka_1_1media_1_1EncryptionHandler-members.html b/docs/d0/dac/classshaka_1_1media_1_1EncryptionHandler-members.html index 62b99291e7..1321be7838 100644 --- a/docs/d0/dac/classshaka_1_1media_1_1EncryptionHandler-members.html +++ b/docs/d0/dac/classshaka_1_1media_1_1EncryptionHandler-members.html @@ -95,9 +95,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - + - + @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline
Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected
DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected
DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected
DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected
DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected
DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected
DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected
DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected
DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected
diff --git a/docs/d0/dae/file__util_8h_source.html b/docs/d0/dae/file__util_8h_source.html index 2960d82cdf..1c3e8a550f 100644 --- a/docs/d0/dae/file__util_8h_source.html +++ b/docs/d0/dae/file__util_8h_source.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/db4/structshaka_1_1RawKeyParams.html b/docs/d0/db4/structshaka_1_1RawKeyParams.html index ee400bd172..b3b4644837 100644 --- a/docs/d0/db4/structshaka_1_1RawKeyParams.html +++ b/docs/d0/db4/structshaka_1_1RawKeyParams.html @@ -177,7 +177,7 @@ Public Attributes diff --git a/docs/d0/dbb/classshaka_1_1media_1_1mp2t_1_1Ac3Header-members.html b/docs/d0/dbb/classshaka_1_1media_1_1mp2t_1_1Ac3Header-members.html new file mode 100644 index 0000000000..fbc1740df2 --- /dev/null +++ b/docs/d0/dbb/classshaka_1_1media_1_1mp2t_1_1Ac3Header-members.html @@ -0,0 +1,118 @@ + + + + + + +Shaka Packager SDK: Member List + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
shaka::media::mp2t::Ac3Header Member List
+
+
+ +

This is the complete list of members for shaka::media::mp2t::Ac3Header, including all inherited members.

+ + + + + + + + + + + + + + + +
Ac3Header()=default (defined in shaka::media::mp2t::Ac3Header)shaka::media::mp2t::Ac3Header
AudioHeader()=default (defined in shaka::media::mp2t::AudioHeader)shaka::media::mp2t::AudioHeader
GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const overrideshaka::media::mp2t::Ac3Headervirtual
GetFrameSize() const overrideshaka::media::mp2t::Ac3Headervirtual
GetHeaderSize() const overrideshaka::media::mp2t::Ac3Headervirtual
GetMinFrameSize() const overrideshaka::media::mp2t::Ac3Headervirtual
GetNumChannels() const overrideshaka::media::mp2t::Ac3Headervirtual
GetObjectType() const overrideshaka::media::mp2t::Ac3Headervirtual
GetSamplesPerFrame() const overrideshaka::media::mp2t::Ac3Headervirtual
GetSamplingFrequency() const overrideshaka::media::mp2t::Ac3Headervirtual
IsSyncWord(const uint8_t *buf) const overrideshaka::media::mp2t::Ac3Headervirtual
Parse(const uint8_t *adts_frame, size_t adts_frame_size) overrideshaka::media::mp2t::Ac3Headervirtual
~Ac3Header() override=default (defined in shaka::media::mp2t::Ac3Header)shaka::media::mp2t::Ac3Header
~AudioHeader()=default (defined in shaka::media::mp2t::AudioHeader)shaka::media::mp2t::AudioHeadervirtual
+ + + + diff --git a/docs/d0/dbc/bit__writer_8h_source.html b/docs/d0/dbc/bit__writer_8h_source.html new file mode 100644 index 0000000000..2c60bbeac4 --- /dev/null +++ b/docs/d0/dbc/bit__writer_8h_source.html @@ -0,0 +1,152 @@ + + + + + + +Shaka Packager SDK: packager/media/base/bit_writer.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
bit_writer.h
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #ifndef PACKAGER_MEDIA_BASE_BIT_WRITER_H_
+
8 #define PACKAGER_MEDIA_BASE_BIT_WRITER_H_
+
9 
+
10 #include <stdint.h>
+
11 
+
12 #include <vector>
+
13 
+
14 #include "packager/base/logging.h"
+
15 
+
16 namespace shaka {
+
17 namespace media {
+
18 
+
19 class BitWriter {
+
20  public:
+
24  explicit BitWriter(std::vector<uint8_t>* storage);
+
25  ~BitWriter() = default;
+
26 
+
33  void WriteBits(uint32_t bits, size_t number_of_bits);
+
34 
+
36  void Flush();
+
37 
+
39  size_t BitPos() const { return BytePos() * 8 + num_bits_; }
+
40 
+
42  size_t BytePos() const { return storage_->size() - initial_storage_size_; }
+
43 
+
44  private:
+
45  BitWriter(const BitWriter&) = delete;
+
46  BitWriter& operator=(const BitWriter&) = delete;
+
47 
+
48  // Accumulator for unwritten bits.
+
49  uint64_t bits_ = 0;
+
50  // Number of unwritten bits.
+
51  int num_bits_ = 0;
+
52  // Buffer contains the written bits.
+
53  std::vector<uint8_t>* const storage_ = nullptr;
+
54  const size_t initial_storage_size_ = 0;
+
55 };
+
56 
+
57 } // namespace media
+
58 } // namespace shaka
+
59 
+
60 #endif // PACKAGER_MEDIA_BASE_BIT_WRITER_H_
+
size_t BytePos() const
Definition: bit_writer.h:42
+ +
void WriteBits(uint32_t bits, size_t number_of_bits)
Definition: bit_writer.cc:15
+
BitWriter(std::vector< uint8_t > *storage)
Definition: bit_writer.cc:12
+
void Flush()
Write pending bits, and align bitstream with extra zero bits.
Definition: bit_writer.cc:31
+
size_t BitPos() const
Definition: bit_writer.h:39
+
+ + + + diff --git a/docs/d0/dbd/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter-members.html b/docs/d0/dbd/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter-members.html index 4d4764c71c..f33384004e 100644 --- a/docs/d0/dbd/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter-members.html +++ b/docs/d0/dbd/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter-members.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dbe/structshaka_1_1RawKeyParams_1_1KeyInfo.html b/docs/d0/dbe/structshaka_1_1RawKeyParams_1_1KeyInfo.html index 29deb5be61..68a507bbcb 100644 --- a/docs/d0/dbe/structshaka_1_1RawKeyParams_1_1KeyInfo.html +++ b/docs/d0/dbe/structshaka_1_1RawKeyParams_1_1KeyInfo.html @@ -112,7 +112,7 @@ std::vector< uint8_t >  diff --git a/docs/d0/dc0/structshaka_1_1media_1_1SegmentInfo.html b/docs/d0/dc0/structshaka_1_1media_1_1SegmentInfo.html index cdc394212c..da2fd666c8 100644 --- a/docs/d0/dc0/structshaka_1_1media_1_1SegmentInfo.html +++ b/docs/d0/dc0/structshaka_1_1media_1_1SegmentInfo.html @@ -114,14 +114,14 @@ std::shared_ptr<

Detailed Description

-

Definition at line 35 of file media_handler.h.

+

Definition at line 53 of file media_handler.h.


The documentation for this struct was generated from the following file: diff --git a/docs/d0/dc1/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox-members.html b/docs/d0/dc1/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox-members.html index 528f23fab6..533209c9b8 100644 --- a/docs/d0/dc1/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox-members.html +++ b/docs/d0/dc1/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dc8/classshaka_1_1xml_1_1AdaptationSetXmlNode-members.html b/docs/d0/dc8/classshaka_1_1xml_1_1AdaptationSetXmlNode-members.html index 5924bf40e8..e5f5689514 100644 --- a/docs/d0/dc8/classshaka_1_1xml_1_1AdaptationSetXmlNode-members.html +++ b/docs/d0/dc8/classshaka_1_1xml_1_1AdaptationSetXmlNode-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dce/classshaka_1_1media_1_1RsaPrivateKey.html b/docs/d0/dce/classshaka_1_1media_1_1RsaPrivateKey.html index 2f472f949f..4c1dbae410 100644 --- a/docs/d0/dce/classshaka_1_1media_1_1RsaPrivateKey.html +++ b/docs/d0/dce/classshaka_1_1media_1_1RsaPrivateKey.html @@ -224,7 +224,7 @@ Static Public Member Functions diff --git a/docs/d0/dd0/structshaka_1_1media_1_1mp4_1_1CueSettingsBox.html b/docs/d0/dd0/structshaka_1_1media_1_1mp4_1_1CueSettingsBox.html index 277cad746f..8549ea77c9 100644 --- a/docs/d0/dd0/structshaka_1_1media_1_1mp4_1_1CueSettingsBox.html +++ b/docs/d0/dd0/structshaka_1_1media_1_1mp4_1_1CueSettingsBox.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html b/docs/d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html index e45958faec..680f982476 100644 --- a/docs/d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html +++ b/docs/d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html @@ -222,7 +222,7 @@ Static Public Member Functions diff --git a/docs/d0/dd6/webm__crypto__helpers_8cc_source.html b/docs/d0/dd6/webm__crypto__helpers_8cc_source.html index baa0c459f3..05a178066d 100644 --- a/docs/d0/dd6/webm__crypto__helpers_8cc_source.html +++ b/docs/d0/dd6/webm__crypto__helpers_8cc_source.html @@ -205,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dd8/classshaka_1_1media_1_1AesCtrEncryptor.html b/docs/d0/dd8/classshaka_1_1media_1_1AesCtrEncryptor.html index 432a23847a..d9bbc86cfa 100644 --- a/docs/d0/dd8/classshaka_1_1media_1_1AesCtrEncryptor.html +++ b/docs/d0/dd8/classshaka_1_1media_1_1AesCtrEncryptor.html @@ -165,7 +165,7 @@ AES_KEY * mutable_aes_key< diff --git a/docs/d0/dee/segmenter__test__base_8h_source.html b/docs/d0/dee/segmenter__test__base_8h_source.html index d49c4aa65f..503c9db0fb 100644 --- a/docs/d0/dee/segmenter__test__base_8h_source.html +++ b/docs/d0/dee/segmenter__test__base_8h_source.html @@ -213,7 +213,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/df3/packager__util_8cc_source.html b/docs/d0/df3/packager__util_8cc_source.html index d2da4e93d6..1af4e282af 100644 --- a/docs/d0/df3/packager__util_8cc_source.html +++ b/docs/d0/df3/packager__util_8cc_source.html @@ -287,7 +287,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/df4/classshaka_1_1hls_1_1MasterPlaylist-members.html b/docs/d0/df4/classshaka_1_1hls_1_1MasterPlaylist-members.html index eca8078ad1..a98b00857a 100644 --- a/docs/d0/df4/classshaka_1_1hls_1_1MasterPlaylist-members.html +++ b/docs/d0/df4/classshaka_1_1hls_1_1MasterPlaylist-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dfc/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry-members.html b/docs/d0/dfc/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry-members.html index badfad666c..61efe1ace1 100644 --- a/docs/d0/dfc/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry-members.html +++ b/docs/d0/dfc/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry-members.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html b/docs/d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html index 1e2a3d90af..8f8accee92 100644 --- a/docs/d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html +++ b/docs/d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html @@ -135,7 +135,7 @@ base::Optional< diff --git a/docs/df/dd3/structshaka_1_1media_1_1MediaEvent.html b/docs/d1/d07/structshaka_1_1AdCueGeneratorParams-members.html similarity index 84% rename from docs/df/dd3/structshaka_1_1media_1_1MediaEvent.html rename to docs/d1/d07/structshaka_1_1AdCueGeneratorParams-members.html index bd51ebad94..01bd7d5a50 100644 --- a/docs/df/dd3/structshaka_1_1media_1_1MediaEvent.html +++ b/docs/d1/d07/structshaka_1_1AdCueGeneratorParams-members.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: shaka::media::MediaEvent Struct Reference +Shaka Packager SDK: Member List @@ -82,24 +82,22 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
shaka::media::MediaEvent Struct Reference
+
shaka::AdCueGeneratorParams Member List
-

Detailed Description

-
-

Definition at line 34 of file media_handler.h.

-

The documentation for this struct was generated from the following file: -
+ +

This is the complete list of members for shaka::AdCueGeneratorParams, including all inherited members.

+ + +
cue_pointsshaka::AdCueGeneratorParams
diff --git a/docs/d7/d58/structshaka_1_1media_1_1PeriodInfo.html b/docs/d1/d07/structshaka_1_1Cuepoint-members.html similarity index 82% rename from docs/d7/d58/structshaka_1_1media_1_1PeriodInfo.html rename to docs/d1/d07/structshaka_1_1Cuepoint-members.html index 7e315e2bf9..d531d97832 100644 --- a/docs/d7/d58/structshaka_1_1media_1_1PeriodInfo.html +++ b/docs/d1/d07/structshaka_1_1Cuepoint-members.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: shaka::media::PeriodInfo Struct Reference +Shaka Packager SDK: Member List @@ -82,24 +82,23 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
shaka::media::PeriodInfo Struct Reference
+
shaka::Cuepoint Member List
-

Detailed Description

-
-

Definition at line 33 of file media_handler.h.

-

The documentation for this struct was generated from the following file: -
+ +

This is the complete list of members for shaka::Cuepoint, including all inherited members.

+ + + +
duration_in_secondsshaka::Cuepoint
start_time_in_secondsshaka::Cuepoint
diff --git a/docs/d1/d0a/classshaka_1_1media_1_1MkvWriter.html b/docs/d1/d0a/classshaka_1_1media_1_1MkvWriter.html index 457a7b4bfb..556ca346a2 100644 --- a/docs/d1/d0a/classshaka_1_1media_1_1MkvWriter.html +++ b/docs/d1/d0a/classshaka_1_1media_1_1MkvWriter.html @@ -376,7 +376,7 @@ Public Member Functions diff --git a/docs/d1/d0a/structshaka_1_1media_1_1H264Sps.html b/docs/d1/d0a/structshaka_1_1media_1_1H264Sps.html index bcb10c20eb..f0b0d0242b 100644 --- a/docs/d1/d0a/structshaka_1_1media_1_1H264Sps.html +++ b/docs/d1/d0a/structshaka_1_1media_1_1H264Sps.html @@ -242,7 +242,7 @@ int chroma_array_type< diff --git a/docs/d1/d0b/hevc__decoder__configuration__record_8cc_source.html b/docs/d1/d0b/hevc__decoder__configuration__record_8cc_source.html index 3356ab993e..b666c13733 100644 --- a/docs/d1/d0b/hevc__decoder__configuration__record_8cc_source.html +++ b/docs/d1/d0b/hevc__decoder__configuration__record_8cc_source.html @@ -245,7 +245,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d12/classshaka_1_1media_1_1mp2t_1_1EsParserH264-members.html b/docs/d1/d12/classshaka_1_1media_1_1mp2t_1_1EsParserH264-members.html index e99fd2cba3..da6ff84cb6 100644 --- a/docs/d1/d12/classshaka_1_1media_1_1mp2t_1_1EsParserH264-members.html +++ b/docs/d1/d12/classshaka_1_1media_1_1mp2t_1_1EsParserH264-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d12/range_8h_source.html b/docs/d1/d12/range_8h_source.html index 763e6ae9d4..5d7cfa550a 100644 --- a/docs/d1/d12/range_8h_source.html +++ b/docs/d1/d12/range_8h_source.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d13/status_8h_source.html b/docs/d1/d13/status_8h_source.html index 5115ec5156..bb07233437 100644 --- a/docs/d1/d13/status_8h_source.html +++ b/docs/d1/d13/status_8h_source.html @@ -272,7 +272,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d17/structshaka_1_1WidevineDecryptionParams-members.html b/docs/d1/d17/structshaka_1_1WidevineDecryptionParams-members.html index e7b0cfba82..ddd528a5fd 100644 --- a/docs/d1/d17/structshaka_1_1WidevineDecryptionParams-members.html +++ b/docs/d1/d17/structshaka_1_1WidevineDecryptionParams-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d1c/two__pass__single__segment__segmenter_8cc_source.html b/docs/d1/d1c/two__pass__single__segment__segmenter_8cc_source.html index 1cbc226e73..c8e7d86e7b 100644 --- a/docs/d1/d1c/two__pass__single__segment__segmenter_8cc_source.html +++ b/docs/d1/d1c/two__pass__single__segment__segmenter_8cc_source.html @@ -282,7 +282,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d1d/muxer__flags_8cc_source.html b/docs/d1/d1d/muxer__flags_8cc_source.html index f5903f6916..2e4de22ef5 100644 --- a/docs/d1/d1d/muxer__flags_8cc_source.html +++ b/docs/d1/d1d/muxer__flags_8cc_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d1e/hls__notifier_8h_source.html b/docs/d1/d1e/hls__notifier_8h_source.html index d228b7f4f2..d049034ac1 100644 --- a/docs/d1/d1e/hls__notifier_8h_source.html +++ b/docs/d1/d1e/hls__notifier_8h_source.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d1f/classshaka_1_1media_1_1KeySource.html b/docs/d1/d1f/classshaka_1_1media_1_1KeySource.html index 77f09b88a3..9e0180780b 100644 --- a/docs/d1/d1f/classshaka_1_1media_1_1KeySource.html +++ b/docs/d1/d1f/classshaka_1_1media_1_1KeySource.html @@ -320,7 +320,7 @@ Public Member Functions diff --git a/docs/d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html b/docs/d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html index 7f386599f8..5d5c9d84e8 100644 --- a/docs/d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html +++ b/docs/d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html @@ -235,7 +235,7 @@ Public Member Functions diff --git a/docs/d1/d25/classshaka_1_1media_1_1MediaHandlerTestBase-members.html b/docs/d1/d25/classshaka_1_1media_1_1MediaHandlerTestBase-members.html index 17f477711f..7b03be77f7 100644 --- a/docs/d1/d25/classshaka_1_1media_1_1MediaHandlerTestBase-members.html +++ b/docs/d1/d25/classshaka_1_1media_1_1MediaHandlerTestBase-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d27/key__fetcher_8h_source.html b/docs/d1/d27/key__fetcher_8h_source.html index 67e3e7cd50..7e3f7d5b3f 100644 --- a/docs/d1/d27/key__fetcher_8h_source.html +++ b/docs/d1/d27/key__fetcher_8h_source.html @@ -126,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d28/classshaka_1_1media_1_1mp2t_1_1AdtsHeader-members.html b/docs/d1/d28/classshaka_1_1media_1_1mp2t_1_1AdtsHeader-members.html index efa511679a..87869dd5e1 100644 --- a/docs/d1/d28/classshaka_1_1media_1_1mp2t_1_1AdtsHeader-members.html +++ b/docs/d1/d28/classshaka_1_1media_1_1mp2t_1_1AdtsHeader-members.html @@ -93,19 +93,24 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');

This is the complete list of members for shaka::media::mp2t::AdtsHeader, including all inherited members.

- - - - - - - - - + + + + + + + + + + + + + +
AdtsHeader() (defined in shaka::media::mp2t::AdtsHeader)shaka::media::mp2t::AdtsHeader
GetAdtsFrameSize(const uint8_t *data, size_t num_bytes)shaka::media::mp2t::AdtsHeaderstatic
GetAdtsHeaderSize(const uint8_t *data, size_t num_bytes)shaka::media::mp2t::AdtsHeaderstatic
GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const shaka::media::mp2t::AdtsHeader
GetNumChannels() const shaka::media::mp2t::AdtsHeader
GetObjectType() const shaka::media::mp2t::AdtsHeader
GetSamplingFrequency() const shaka::media::mp2t::AdtsHeader
Parse(const uint8_t *adts_frame, size_t adts_frame_size)shaka::media::mp2t::AdtsHeader
~AdtsHeader() (defined in shaka::media::mp2t::AdtsHeader)shaka::media::mp2t::AdtsHeaderinline
AdtsHeader()=default (defined in shaka::media::mp2t::AdtsHeader)shaka::media::mp2t::AdtsHeader
AudioHeader()=default (defined in shaka::media::mp2t::AudioHeader)shaka::media::mp2t::AudioHeader
GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const overrideshaka::media::mp2t::AdtsHeadervirtual
GetFrameSize() const overrideshaka::media::mp2t::AdtsHeadervirtual
GetHeaderSize() const overrideshaka::media::mp2t::AdtsHeadervirtual
GetMinFrameSize() const overrideshaka::media::mp2t::AdtsHeadervirtual
GetNumChannels() const overrideshaka::media::mp2t::AdtsHeadervirtual
GetObjectType() const overrideshaka::media::mp2t::AdtsHeadervirtual
GetSamplesPerFrame() const overrideshaka::media::mp2t::AdtsHeadervirtual
GetSamplingFrequency() const overrideshaka::media::mp2t::AdtsHeadervirtual
IsSyncWord(const uint8_t *buf) const overrideshaka::media::mp2t::AdtsHeadervirtual
Parse(const uint8_t *adts_frame, size_t adts_frame_size) overrideshaka::media::mp2t::AdtsHeadervirtual
~AdtsHeader() override=default (defined in shaka::media::mp2t::AdtsHeader)shaka::media::mp2t::AdtsHeader
~AudioHeader()=default (defined in shaka::media::mp2t::AudioHeader)shaka::media::mp2t::AudioHeadervirtual
diff --git a/docs/d1/d2a/decryptor__source_8cc_source.html b/docs/d1/d2a/decryptor__source_8cc_source.html index d502aaa06c..7424718322 100644 --- a/docs/d1/d2a/decryptor__source_8cc_source.html +++ b/docs/d1/d2a/decryptor__source_8cc_source.html @@ -240,7 +240,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d2b/file__util_8cc_source.html b/docs/d1/d2b/file__util_8cc_source.html index c59db5edad..e037f037fe 100644 --- a/docs/d1/d2b/file__util_8cc_source.html +++ b/docs/d1/d2b/file__util_8cc_source.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d2c/structshaka_1_1media_1_1mp4_1_1DataReference-members.html b/docs/d1/d2c/structshaka_1_1media_1_1mp4_1_1DataReference-members.html index ac800bd4a0..433e03304e 100644 --- a/docs/d1/d2c/structshaka_1_1media_1_1mp4_1_1DataReference-members.html +++ b/docs/d1/d2c/structshaka_1_1media_1_1mp4_1_1DataReference-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html b/docs/d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html index 46375bd7b3..cb529125a0 100644 --- a/docs/d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html +++ b/docs/d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html @@ -385,7 +385,7 @@ class BoxBuffer diff --git a/docs/d1/d2f/webvtt__media__parser_8cc_source.html b/docs/d1/d2f/webvtt__media__parser_8cc_source.html index e0e5fd1566..f463dfca3e 100644 --- a/docs/d1/d2f/webvtt__media__parser_8cc_source.html +++ b/docs/d1/d2f/webvtt__media__parser_8cc_source.html @@ -408,7 +408,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d30/classshaka_1_1media_1_1mp2t_1_1TsSectionPes.html b/docs/d1/d30/classshaka_1_1media_1_1mp2t_1_1TsSectionPes.html index c885859df5..45f0dc05e8 100644 --- a/docs/d1/d30/classshaka_1_1media_1_1mp2t_1_1TsSectionPes.html +++ b/docs/d1/d30/classshaka_1_1media_1_1mp2t_1_1TsSectionPes.html @@ -142,7 +142,7 @@ Additional Inherited Members diff --git a/docs/d1/d31/classshaka_1_1xml_1_1XmlNode.html b/docs/d1/d31/classshaka_1_1xml_1_1XmlNode.html index f8ac5d2ade..49e25c9277 100644 --- a/docs/d1/d31/classshaka_1_1xml_1_1XmlNode.html +++ b/docs/d1/d31/classshaka_1_1xml_1_1XmlNode.html @@ -419,7 +419,7 @@ bool  diff --git a/docs/d1/d34/structshaka_1_1media_1_1SubsampleEntry.html b/docs/d1/d34/structshaka_1_1media_1_1SubsampleEntry.html index 8ea4109f3b..b599362f7d 100644 --- a/docs/d1/d34/structshaka_1_1media_1_1SubsampleEntry.html +++ b/docs/d1/d34/structshaka_1_1media_1_1SubsampleEntry.html @@ -122,7 +122,7 @@ uint32_t cipher_bytes< diff --git a/docs/d1/d36/classshaka_1_1media_1_1FakeMediaHandler.html b/docs/d1/d36/classshaka_1_1media_1_1FakeMediaHandler.html index 8ed4c7680c..d8b43eb6fd 100644 --- a/docs/d1/d36/classshaka_1_1media_1_1FakeMediaHandler.html +++ b/docs/d1/d36/classshaka_1_1media_1_1FakeMediaHandler.html @@ -147,10 +147,6 @@ bool - Protected Member Functions inherited from shaka::media::MediaHandler Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -163,14 +159,18 @@ bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -269,7 +269,7 @@ std::vector< std::unique_ptr
diff --git a/docs/d1/d37/es__parser__h264_8h_source.html b/docs/d1/d37/es__parser__h264_8h_source.html index bc7763272d..cc7df81567 100644 --- a/docs/d1/d37/es__parser__h264_8h_source.html +++ b/docs/d1/d37/es__parser__h264_8h_source.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d3b/mpd__generator__flags_8h_source.html b/docs/d1/d3b/mpd__generator__flags_8h_source.html index 9c4adeb037..b1edf35b3e 100644 --- a/docs/d1/d3b/mpd__generator__flags_8h_source.html +++ b/docs/d1/d3b/mpd__generator__flags_8h_source.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d3e/structshaka_1_1media_1_1mp4_1_1MovieExtends.html b/docs/d1/d3e/structshaka_1_1media_1_1mp4_1_1MovieExtends.html index ec86e63cf6..4331a8b01b 100644 --- a/docs/d1/d3e/structshaka_1_1media_1_1mp4_1_1MovieExtends.html +++ b/docs/d1/d3e/structshaka_1_1media_1_1mp4_1_1MovieExtends.html @@ -176,7 +176,7 @@ Additional Inherited Members diff --git a/docs/d1/d40/classshaka_1_1MpdWriter-members.html b/docs/d1/d40/classshaka_1_1MpdWriter-members.html index a2e67e910a..d3195e384c 100644 --- a/docs/d1/d40/classshaka_1_1MpdWriter-members.html +++ b/docs/d1/d40/classshaka_1_1MpdWriter-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d41/structshaka_1_1media_1_1Scte35Event.html b/docs/d1/d41/structshaka_1_1media_1_1Scte35Event.html new file mode 100644 index 0000000000..26054301ff --- /dev/null +++ b/docs/d1/d41/structshaka_1_1media_1_1Scte35Event.html @@ -0,0 +1,129 @@ + + + + + + +Shaka Packager SDK: shaka::media::Scte35Event Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
shaka::media::Scte35Event Struct Reference
+
+
+ + + + + + + + + + + + +

+Public Attributes

+std::string id
 
+int type = 0
 
+int64_t start_time = 0
 
+int64_t duration = 0
 
+std::string cue_data
 
+

Detailed Description

+
+

Definition at line 34 of file media_handler.h.

+

The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/d1/d45/classshaka_1_1hls_1_1MediaPlaylistFactory-members.html b/docs/d1/d45/classshaka_1_1hls_1_1MediaPlaylistFactory-members.html index d97ec1babd..d6ffd70539 100644 --- a/docs/d1/d45/classshaka_1_1hls_1_1MediaPlaylistFactory-members.html +++ b/docs/d1/d45/classshaka_1_1hls_1_1MediaPlaylistFactory-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d45/decoding__time__iterator_8cc_source.html b/docs/d1/d45/decoding__time__iterator_8cc_source.html index d54ed3da76..4622985745 100644 --- a/docs/d1/d45/decoding__time__iterator_8cc_source.html +++ b/docs/d1/d45/decoding__time__iterator_8cc_source.html @@ -168,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d48/text__track__config_8h_source.html b/docs/d1/d48/text__track__config_8h_source.html index a8ed5c7234..20b4204ca0 100644 --- a/docs/d1/d48/text__track__config_8h_source.html +++ b/docs/d1/d48/text__track__config_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d4f/classshaka_1_1media_1_1OffsetByteQueue-members.html b/docs/d1/d4f/classshaka_1_1media_1_1OffsetByteQueue-members.html index 5e299519d0..44d4ac611b 100644 --- a/docs/d1/d4f/classshaka_1_1media_1_1OffsetByteQueue-members.html +++ b/docs/d1/d4f/classshaka_1_1media_1_1OffsetByteQueue-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d4f/structshaka_1_1DecryptionParams.html b/docs/d1/d4f/structshaka_1_1DecryptionParams.html index 691d5f74aa..cdcf282e71 100644 --- a/docs/d1/d4f/structshaka_1_1DecryptionParams.html +++ b/docs/d1/d4f/structshaka_1_1DecryptionParams.html @@ -136,7 +136,7 @@ Public Attributes diff --git a/docs/d1/d5a/structshaka_1_1media_1_1EncryptionKey-members.html b/docs/d1/d5a/structshaka_1_1media_1_1EncryptionKey-members.html index f6b99b6ca8..995eeab0b2 100644 --- a/docs/d1/d5a/structshaka_1_1media_1_1EncryptionKey-members.html +++ b/docs/d1/d5a/structshaka_1_1media_1_1EncryptionKey-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d6e/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader.html b/docs/d1/d6e/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader.html index bc0a5df13c..3e8eecebc7 100644 --- a/docs/d1/d6e/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader.html +++ b/docs/d1/d6e/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader.html @@ -222,7 +222,7 @@ Additional Inherited Members diff --git a/docs/d1/d70/vp8__parser_8cc_source.html b/docs/d1/d70/vp8__parser_8cc_source.html index caede52688..6496a5f6f4 100644 --- a/docs/d1/d70/vp8__parser_8cc_source.html +++ b/docs/d1/d70/vp8__parser_8cc_source.html @@ -289,7 +289,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d72/language__utils_8cc_source.html b/docs/d1/d72/language__utils_8cc_source.html index 4918726b2c..031a3aa57a 100644 --- a/docs/d1/d72/language__utils_8cc_source.html +++ b/docs/d1/d72/language__utils_8cc_source.html @@ -231,7 +231,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d74/mp2t__media__parser_8cc_source.html b/docs/d1/d74/mp2t__media__parser_8cc_source.html index 0124124bd7..e22ac00324 100644 --- a/docs/d1/d74/mp2t__media__parser_8cc_source.html +++ b/docs/d1/d74/mp2t__media__parser_8cc_source.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
9 #include "packager/media/base/media_sample.h"
10 #include "packager/media/base/stream_info.h"
11 #include "packager/media/formats/mp2t/es_parser.h"
-
12 #include "packager/media/formats/mp2t/es_parser_adts.h"
+
12 #include "packager/media/formats/mp2t/es_parser_audio.h"
13 #include "packager/media/formats/mp2t/es_parser_h264.h"
14 #include "packager/media/formats/mp2t/es_parser_h265.h"
15 #include "packager/media/formats/mp2t/mp2t_common.h"
@@ -107,435 +107,429 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
18 #include "packager/media/formats/mp2t/ts_section_pat.h"
19 #include "packager/media/formats/mp2t/ts_section_pes.h"
20 #include "packager/media/formats/mp2t/ts_section_pmt.h"
-
21 
-
22 namespace shaka {
-
23 namespace media {
-
24 namespace mp2t {
-
25 
-
26 enum StreamType {
-
27  // ISO-13818.1 / ITU H.222 Table 2.34 "Stream type assignments"
-
28  kStreamTypeMpeg1Audio = 0x3,
-
29  kStreamTypeAAC = 0xf,
-
30  kStreamTypeAVC = 0x1b,
-
31  kStreamTypeHEVC = 0x24,
-
32 };
-
33 
-
34 class PidState {
-
35  public:
-
36  enum PidType {
-
37  kPidPat,
-
38  kPidPmt,
-
39  kPidAudioPes,
-
40  kPidVideoPes,
-
41  };
-
42 
-
43  PidState(int pid,
-
44  PidType pid_type,
-
45  std::unique_ptr<TsSection> section_parser);
-
46 
-
47  // Extract the content of the TS packet and parse it.
-
48  // Return true if successful.
-
49  bool PushTsPacket(const TsPacket& ts_packet);
-
50 
-
51  // Flush the PID state (possibly emitting some pending frames)
-
52  // and reset its state.
-
53  void Flush();
+
21 #include "packager/media/formats/mp2t/ts_stream_type.h"
+
22 
+
23 namespace shaka {
+
24 namespace media {
+
25 namespace mp2t {
+
26 
+
27 class PidState {
+
28  public:
+
29  enum PidType {
+
30  kPidPat,
+
31  kPidPmt,
+
32  kPidAudioPes,
+
33  kPidVideoPes,
+
34  };
+
35 
+
36  PidState(int pid,
+
37  PidType pid_type,
+
38  std::unique_ptr<TsSection> section_parser);
+
39 
+
40  // Extract the content of the TS packet and parse it.
+
41  // Return true if successful.
+
42  bool PushTsPacket(const TsPacket& ts_packet);
+
43 
+
44  // Flush the PID state (possibly emitting some pending frames)
+
45  // and reset its state.
+
46  void Flush();
+
47 
+
48  // Enable/disable the PID.
+
49  // Disabling a PID will reset its state and ignore any further incoming TS
+
50  // packets.
+
51  void Enable();
+
52  void Disable();
+
53  bool IsEnabled() const;
54 
-
55  // Enable/disable the PID.
-
56  // Disabling a PID will reset its state and ignore any further incoming TS
-
57  // packets.
-
58  void Enable();
-
59  void Disable();
-
60  bool IsEnabled() const;
+
55  PidType pid_type() const { return pid_type_; }
+
56 
+
57  std::shared_ptr<StreamInfo>& config() { return config_; }
+
58  void set_config(const std::shared_ptr<StreamInfo>& config) {
+
59  config_ = config;
+
60  }
61 
-
62  PidType pid_type() const { return pid_type_; }
+
62  SampleQueue& sample_queue() { return sample_queue_; }
63 
-
64  std::shared_ptr<StreamInfo>& config() { return config_; }
-
65  void set_config(const std::shared_ptr<StreamInfo>& config) {
-
66  config_ = config;
-
67  }
-
68 
-
69  SampleQueue& sample_queue() { return sample_queue_; }
+
64  private:
+
65  void ResetState();
+
66 
+
67  int pid_;
+
68  PidType pid_type_;
+
69  std::unique_ptr<TsSection> section_parser_;
70 
-
71  private:
-
72  void ResetState();
-
73 
-
74  int pid_;
-
75  PidType pid_type_;
-
76  std::unique_ptr<TsSection> section_parser_;
-
77 
-
78  bool enable_;
-
79  int continuity_counter_;
-
80  std::shared_ptr<StreamInfo> config_;
-
81  SampleQueue sample_queue_;
-
82 };
-
83 
-
84 PidState::PidState(int pid,
-
85  PidType pid_type,
-
86  std::unique_ptr<TsSection> section_parser)
-
87  : pid_(pid),
-
88  pid_type_(pid_type),
-
89  section_parser_(std::move(section_parser)),
-
90  enable_(false),
-
91  continuity_counter_(-1) {
-
92  DCHECK(section_parser_);
-
93 }
-
94 
-
95 bool PidState::PushTsPacket(const TsPacket& ts_packet) {
-
96  DCHECK_EQ(ts_packet.pid(), pid_);
-
97 
-
98  // The current PID is not part of the PID filter,
-
99  // just discard the incoming TS packet.
-
100  if (!enable_)
-
101  return true;
-
102 
-
103  int expected_continuity_counter = (continuity_counter_ + 1) % 16;
-
104  if (continuity_counter_ >= 0 &&
-
105  ts_packet.continuity_counter() != expected_continuity_counter) {
-
106  DVLOG(1) << "TS discontinuity detected for pid: " << pid_;
-
107  // TODO(tinskip): Handle discontinuity better.
-
108  return false;
-
109  }
-
110 
-
111  bool status = section_parser_->Parse(
-
112  ts_packet.payload_unit_start_indicator(),
-
113  ts_packet.payload(),
-
114  ts_packet.payload_size());
+
71  bool enable_;
+
72  int continuity_counter_;
+
73  std::shared_ptr<StreamInfo> config_;
+
74  SampleQueue sample_queue_;
+
75 };
+
76 
+
77 PidState::PidState(int pid,
+
78  PidType pid_type,
+
79  std::unique_ptr<TsSection> section_parser)
+
80  : pid_(pid),
+
81  pid_type_(pid_type),
+
82  section_parser_(std::move(section_parser)),
+
83  enable_(false),
+
84  continuity_counter_(-1) {
+
85  DCHECK(section_parser_);
+
86 }
+
87 
+
88 bool PidState::PushTsPacket(const TsPacket& ts_packet) {
+
89  DCHECK_EQ(ts_packet.pid(), pid_);
+
90 
+
91  // The current PID is not part of the PID filter,
+
92  // just discard the incoming TS packet.
+
93  if (!enable_)
+
94  return true;
+
95 
+
96  int expected_continuity_counter = (continuity_counter_ + 1) % 16;
+
97  if (continuity_counter_ >= 0 &&
+
98  ts_packet.continuity_counter() != expected_continuity_counter) {
+
99  DVLOG(1) << "TS discontinuity detected for pid: " << pid_;
+
100  // TODO(tinskip): Handle discontinuity better.
+
101  return false;
+
102  }
+
103 
+
104  bool status = section_parser_->Parse(
+
105  ts_packet.payload_unit_start_indicator(),
+
106  ts_packet.payload(),
+
107  ts_packet.payload_size());
+
108 
+
109  // At the minimum, when parsing failed, auto reset the section parser.
+
110  // Components that use the Mp2tMediaParser can take further action if needed.
+
111  if (!status) {
+
112  DVLOG(1) << "Parsing failed for pid = " << pid_;
+
113  ResetState();
+
114  }
115 
-
116  // At the minimum, when parsing failed, auto reset the section parser.
-
117  // Components that use the Mp2tMediaParser can take further action if needed.
-
118  if (!status) {
-
119  DVLOG(1) << "Parsing failed for pid = " << pid_;
-
120  ResetState();
-
121  }
-
122 
-
123  return status;
-
124 }
-
125 
-
126 void PidState::Flush() {
-
127  section_parser_->Flush();
-
128  ResetState();
-
129 }
-
130 
-
131 void PidState::Enable() {
-
132  enable_ = true;
-
133 }
-
134 
-
135 void PidState::Disable() {
-
136  if (!enable_)
-
137  return;
-
138 
-
139  ResetState();
-
140  enable_ = false;
-
141 }
-
142 
-
143 bool PidState::IsEnabled() const {
-
144  return enable_;
-
145 }
-
146 
-
147 void PidState::ResetState() {
-
148  section_parser_->Reset();
-
149  continuity_counter_ = -1;
-
150 }
+
116  return status;
+
117 }
+
118 
+
119 void PidState::Flush() {
+
120  section_parser_->Flush();
+
121  ResetState();
+
122 }
+
123 
+
124 void PidState::Enable() {
+
125  enable_ = true;
+
126 }
+
127 
+
128 void PidState::Disable() {
+
129  if (!enable_)
+
130  return;
+
131 
+
132  ResetState();
+
133  enable_ = false;
+
134 }
+
135 
+
136 bool PidState::IsEnabled() const {
+
137  return enable_;
+
138 }
+
139 
+
140 void PidState::ResetState() {
+
141  section_parser_->Reset();
+
142  continuity_counter_ = -1;
+
143 }
+
144 
+
145 Mp2tMediaParser::Mp2tMediaParser()
+
146  : sbr_in_mimetype_(false),
+
147  is_initialized_(false) {
+
148 }
+
149 
+
150 Mp2tMediaParser::~Mp2tMediaParser() {}
151 
-
152 Mp2tMediaParser::Mp2tMediaParser()
-
153  : sbr_in_mimetype_(false),
-
154  is_initialized_(false) {
-
155 }
-
156 
-
157 Mp2tMediaParser::~Mp2tMediaParser() {}
-
158 
- -
160  const InitCB& init_cb,
-
161  const NewSampleCB& new_sample_cb,
-
162  KeySource* decryption_key_source) {
-
163  DCHECK(!is_initialized_);
-
164  DCHECK(init_cb_.is_null());
-
165  DCHECK(!init_cb.is_null());
-
166  DCHECK(!new_sample_cb.is_null());
+ +
153  const InitCB& init_cb,
+
154  const NewSampleCB& new_sample_cb,
+
155  KeySource* decryption_key_source) {
+
156  DCHECK(!is_initialized_);
+
157  DCHECK(init_cb_.is_null());
+
158  DCHECK(!init_cb.is_null());
+
159  DCHECK(!new_sample_cb.is_null());
+
160 
+
161  init_cb_ = init_cb;
+
162  new_sample_cb_ = new_sample_cb;
+
163 }
+
164 
+ +
166  DVLOG(1) << "Mp2tMediaParser::Flush";
167 
-
168  init_cb_ = init_cb;
-
169  new_sample_cb_ = new_sample_cb;
-
170 }
-
171 
- -
173  DVLOG(1) << "Mp2tMediaParser::Flush";
-
174 
-
175  // Flush the buffers and reset the pids.
-
176  for (const auto& pair : pids_) {
-
177  DVLOG(1) << "Flushing PID: " << pair.first;
-
178  PidState* pid_state = pair.second.get();
-
179  pid_state->Flush();
-
180  }
-
181  bool result = EmitRemainingSamples();
-
182  pids_.clear();
-
183 
-
184  // Remove any bytes left in the TS buffer.
-
185  // (i.e. any partial TS packet => less than 188 bytes).
-
186  ts_byte_queue_.Reset();
-
187  return result;
-
188 }
-
189 
-
190 bool Mp2tMediaParser::Parse(const uint8_t* buf, int size) {
-
191  DVLOG(1) << "Mp2tMediaParser::Parse size=" << size;
-
192 
-
193  // Add the data to the parser state.
-
194  ts_byte_queue_.Push(buf, size);
+
168  // Flush the buffers and reset the pids.
+
169  for (const auto& pair : pids_) {
+
170  DVLOG(1) << "Flushing PID: " << pair.first;
+
171  PidState* pid_state = pair.second.get();
+
172  pid_state->Flush();
+
173  }
+
174  bool result = EmitRemainingSamples();
+
175  pids_.clear();
+
176 
+
177  // Remove any bytes left in the TS buffer.
+
178  // (i.e. any partial TS packet => less than 188 bytes).
+
179  ts_byte_queue_.Reset();
+
180  return result;
+
181 }
+
182 
+
183 bool Mp2tMediaParser::Parse(const uint8_t* buf, int size) {
+
184  DVLOG(1) << "Mp2tMediaParser::Parse size=" << size;
+
185 
+
186  // Add the data to the parser state.
+
187  ts_byte_queue_.Push(buf, size);
+
188 
+
189  while (true) {
+
190  const uint8_t* ts_buffer;
+
191  int ts_buffer_size;
+
192  ts_byte_queue_.Peek(&ts_buffer, &ts_buffer_size);
+
193  if (ts_buffer_size < TsPacket::kPacketSize)
+
194  break;
195 
-
196  while (true) {
-
197  const uint8_t* ts_buffer;
-
198  int ts_buffer_size;
-
199  ts_byte_queue_.Peek(&ts_buffer, &ts_buffer_size);
-
200  if (ts_buffer_size < TsPacket::kPacketSize)
-
201  break;
-
202 
-
203  // Synchronization.
-
204  int skipped_bytes = TsPacket::Sync(ts_buffer, ts_buffer_size);
-
205  if (skipped_bytes > 0) {
-
206  DVLOG(1) << "Packet not aligned on a TS syncword:"
-
207  << " skipped_bytes=" << skipped_bytes;
-
208  ts_byte_queue_.Pop(skipped_bytes);
-
209  continue;
-
210  }
-
211 
-
212  // Parse the TS header, skipping 1 byte if the header is invalid.
-
213  std::unique_ptr<TsPacket> ts_packet(
-
214  TsPacket::Parse(ts_buffer, ts_buffer_size));
-
215  if (!ts_packet) {
-
216  DVLOG(1) << "Error: invalid TS packet";
-
217  ts_byte_queue_.Pop(1);
-
218  continue;
-
219  }
-
220  DVLOG(LOG_LEVEL_TS)
-
221  << "Processing PID=" << ts_packet->pid()
-
222  << " start_unit=" << ts_packet->payload_unit_start_indicator();
-
223 
-
224  // Parse the section.
-
225  std::map<int, std::unique_ptr<PidState>>::iterator it =
-
226  pids_.find(ts_packet->pid());
-
227  if (it == pids_.end() &&
-
228  ts_packet->pid() == TsSection::kPidPat) {
-
229  // Create the PAT state here if needed.
-
230  std::unique_ptr<TsSection> pat_section_parser(new TsSectionPat(
-
231  base::Bind(&Mp2tMediaParser::RegisterPmt, base::Unretained(this))));
-
232  std::unique_ptr<PidState> pat_pid_state(new PidState(
-
233  ts_packet->pid(), PidState::kPidPat, std::move(pat_section_parser)));
-
234  pat_pid_state->Enable();
-
235  it = pids_
-
236  .insert(std::pair<int, std::unique_ptr<PidState>>(
-
237  ts_packet->pid(), std::move(pat_pid_state)))
-
238  .first;
+
196  // Synchronization.
+
197  int skipped_bytes = TsPacket::Sync(ts_buffer, ts_buffer_size);
+
198  if (skipped_bytes > 0) {
+
199  DVLOG(1) << "Packet not aligned on a TS syncword:"
+
200  << " skipped_bytes=" << skipped_bytes;
+
201  ts_byte_queue_.Pop(skipped_bytes);
+
202  continue;
+
203  }
+
204 
+
205  // Parse the TS header, skipping 1 byte if the header is invalid.
+
206  std::unique_ptr<TsPacket> ts_packet(
+
207  TsPacket::Parse(ts_buffer, ts_buffer_size));
+
208  if (!ts_packet) {
+
209  DVLOG(1) << "Error: invalid TS packet";
+
210  ts_byte_queue_.Pop(1);
+
211  continue;
+
212  }
+
213  DVLOG(LOG_LEVEL_TS)
+
214  << "Processing PID=" << ts_packet->pid()
+
215  << " start_unit=" << ts_packet->payload_unit_start_indicator();
+
216 
+
217  // Parse the section.
+
218  std::map<int, std::unique_ptr<PidState>>::iterator it =
+
219  pids_.find(ts_packet->pid());
+
220  if (it == pids_.end() &&
+
221  ts_packet->pid() == TsSection::kPidPat) {
+
222  // Create the PAT state here if needed.
+
223  std::unique_ptr<TsSection> pat_section_parser(new TsSectionPat(
+
224  base::Bind(&Mp2tMediaParser::RegisterPmt, base::Unretained(this))));
+
225  std::unique_ptr<PidState> pat_pid_state(new PidState(
+
226  ts_packet->pid(), PidState::kPidPat, std::move(pat_section_parser)));
+
227  pat_pid_state->Enable();
+
228  it = pids_
+
229  .insert(std::pair<int, std::unique_ptr<PidState>>(
+
230  ts_packet->pid(), std::move(pat_pid_state)))
+
231  .first;
+
232  }
+
233 
+
234  if (it != pids_.end()) {
+
235  if (!it->second->PushTsPacket(*ts_packet))
+
236  return false;
+
237  } else {
+
238  DVLOG(LOG_LEVEL_TS) << "Ignoring TS packet for pid: " << ts_packet->pid();
239  }
240 
-
241  if (it != pids_.end()) {
-
242  if (!it->second->PushTsPacket(*ts_packet))
-
243  return false;
-
244  } else {
-
245  DVLOG(LOG_LEVEL_TS) << "Ignoring TS packet for pid: " << ts_packet->pid();
-
246  }
-
247 
-
248  // Go to the next packet.
-
249  ts_byte_queue_.Pop(TsPacket::kPacketSize);
-
250  }
-
251 
-
252  // Emit the A/V buffers that kept accumulating during TS parsing.
-
253  return EmitRemainingSamples();
-
254 }
-
255 
-
256 void Mp2tMediaParser::RegisterPmt(int program_number, int pmt_pid) {
-
257  DVLOG(1) << "RegisterPmt:"
-
258  << " program_number=" << program_number
-
259  << " pmt_pid=" << pmt_pid;
-
260 
-
261  // Only one TS program is allowed. Ignore the incoming program map table,
-
262  // if there is already one registered.
-
263  for (const auto& pair : pids_) {
-
264  if (pair.second->pid_type() == PidState::kPidPmt) {
-
265  DVLOG_IF(1, pmt_pid != pair.first) << "More than one program is defined";
-
266  return;
-
267  }
-
268  }
-
269 
-
270  // Create the PMT state here if needed.
-
271  DVLOG(1) << "Create a new PMT parser";
-
272  std::unique_ptr<TsSection> pmt_section_parser(new TsSectionPmt(base::Bind(
-
273  &Mp2tMediaParser::RegisterPes, base::Unretained(this), pmt_pid)));
-
274  std::unique_ptr<PidState> pmt_pid_state(
-
275  new PidState(pmt_pid, PidState::kPidPmt, std::move(pmt_section_parser)));
-
276  pmt_pid_state->Enable();
-
277  pids_.insert(std::pair<int, std::unique_ptr<PidState>>(
-
278  pmt_pid, std::move(pmt_pid_state)));
-
279 }
-
280 
-
281 void Mp2tMediaParser::RegisterPes(int pmt_pid,
-
282  int pes_pid,
-
283  int stream_type) {
-
284  DVLOG(1) << "RegisterPes:"
-
285  << " pes_pid=" << pes_pid
-
286  << " stream_type=" << std::hex << stream_type << std::dec;
-
287  std::map<int, std::unique_ptr<PidState>>::iterator it = pids_.find(pes_pid);
-
288  if (it != pids_.end())
-
289  return;
-
290 
-
291  // Create a stream parser corresponding to the stream type.
-
292  bool is_audio = false;
-
293  std::unique_ptr<EsParser> es_parser;
-
294  if (stream_type == kStreamTypeAVC) {
-
295  es_parser.reset(
-
296  new EsParserH264(
-
297  pes_pid,
-
298  base::Bind(&Mp2tMediaParser::OnNewStreamInfo,
-
299  base::Unretained(this)),
-
300  base::Bind(&Mp2tMediaParser::OnEmitSample,
-
301  base::Unretained(this))));
-
302  } else if (stream_type == kStreamTypeHEVC) {
-
303  es_parser.reset(
-
304  new EsParserH265(
-
305  pes_pid,
-
306  base::Bind(&Mp2tMediaParser::OnNewStreamInfo,
-
307  base::Unretained(this)),
-
308  base::Bind(&Mp2tMediaParser::OnEmitSample,
-
309  base::Unretained(this))));
-
310  } else if (stream_type == kStreamTypeAAC) {
-
311  es_parser.reset(
-
312  new EsParserAdts(
-
313  pes_pid,
-
314  base::Bind(&Mp2tMediaParser::OnNewStreamInfo,
-
315  base::Unretained(this)),
-
316  base::Bind(&Mp2tMediaParser::OnEmitSample,
-
317  base::Unretained(this)),
-
318  sbr_in_mimetype_));
-
319  is_audio = true;
-
320  } else {
-
321  VLOG(1) << "Ignore unsupported stream type 0x" << std::hex << stream_type
-
322  << std::dec;
-
323  return;
-
324  }
-
325 
-
326  // Create the PES state here.
-
327  DVLOG(1) << "Create a new PES state";
-
328  std::unique_ptr<TsSection> pes_section_parser(
-
329  new TsSectionPes(std::move(es_parser)));
-
330  PidState::PidType pid_type =
-
331  is_audio ? PidState::kPidAudioPes : PidState::kPidVideoPes;
-
332  std::unique_ptr<PidState> pes_pid_state(
-
333  new PidState(pes_pid, pid_type, std::move(pes_section_parser)));
-
334  pes_pid_state->Enable();
-
335  pids_.insert(std::pair<int, std::unique_ptr<PidState>>(
-
336  pes_pid, std::move(pes_pid_state)));
-
337 }
-
338 
-
339 void Mp2tMediaParser::OnNewStreamInfo(
-
340  const std::shared_ptr<StreamInfo>& new_stream_info) {
-
341  DCHECK(new_stream_info);
-
342  DVLOG(1) << "OnVideoConfigChanged for pid=" << new_stream_info->track_id();
-
343 
-
344  PidMap::iterator pid_state = pids_.find(new_stream_info->track_id());
-
345  if (pid_state == pids_.end()) {
-
346  LOG(ERROR) << "PID State for new stream not found (pid = "
-
347  << new_stream_info->track_id() << ").";
-
348  return;
-
349  }
-
350 
-
351  // Set the stream configuration information for the PID.
-
352  pid_state->second->set_config(new_stream_info);
-
353 
-
354  // Finish initialization if all streams have configs.
-
355  FinishInitializationIfNeeded();
-
356 }
-
357 
-
358 bool Mp2tMediaParser::FinishInitializationIfNeeded() {
-
359  // Nothing to be done if already initialized.
-
360  if (is_initialized_)
-
361  return true;
-
362 
-
363  // Wait for more data to come to finish initialization.
-
364  if (pids_.empty())
-
365  return true;
-
366 
-
367  std::vector<std::shared_ptr<StreamInfo>> all_stream_info;
-
368  uint32_t num_es(0);
-
369  for (PidMap::const_iterator iter = pids_.begin(); iter != pids_.end();
-
370  ++iter) {
-
371  if (((iter->second->pid_type() == PidState::kPidAudioPes) ||
-
372  (iter->second->pid_type() == PidState::kPidVideoPes))) {
-
373  ++num_es;
-
374  if (iter->second->config())
-
375  all_stream_info.push_back(iter->second->config());
-
376  }
-
377  }
-
378  if (num_es && (all_stream_info.size() == num_es)) {
-
379  // All stream configurations have been received. Initialization can
-
380  // be completed.
-
381  init_cb_.Run(all_stream_info);
-
382  DVLOG(1) << "Mpeg2TS stream parser initialization done";
-
383  is_initialized_ = true;
-
384  }
-
385  return true;
-
386 }
-
387 
-
388 void Mp2tMediaParser::OnEmitSample(
-
389  uint32_t pes_pid,
-
390  const std::shared_ptr<MediaSample>& new_sample) {
-
391  DCHECK(new_sample);
-
392  DVLOG(LOG_LEVEL_ES)
-
393  << "OnEmitSample: "
-
394  << " pid="
-
395  << pes_pid
-
396  << " size="
-
397  << new_sample->data_size()
-
398  << " dts="
-
399  << new_sample->dts()
-
400  << " pts="
-
401  << new_sample->pts();
-
402 
-
403  // Add the sample to the appropriate PID sample queue.
-
404  PidMap::iterator pid_state = pids_.find(pes_pid);
-
405  if (pid_state == pids_.end()) {
-
406  LOG(ERROR) << "PID State for new sample not found (pid = "
-
407  << pes_pid << ").";
-
408  return;
-
409  }
-
410  pid_state->second->sample_queue().push_back(new_sample);
-
411 }
-
412 
-
413 bool Mp2tMediaParser::EmitRemainingSamples() {
-
414  DVLOG(LOG_LEVEL_ES) << "Mp2tMediaParser::EmitRemainingBuffers";
-
415 
-
416  // No buffer should be sent until fully initialized.
-
417  if (!is_initialized_)
-
418  return true;
-
419 
-
420  // Buffer emission.
-
421  for (PidMap::const_iterator pid_iter = pids_.begin(); pid_iter != pids_.end();
-
422  ++pid_iter) {
-
423  SampleQueue& sample_queue = pid_iter->second->sample_queue();
-
424  for (SampleQueue::iterator sample_iter = sample_queue.begin();
-
425  sample_iter != sample_queue.end();
-
426  ++sample_iter) {
-
427  if (!new_sample_cb_.Run(pid_iter->first, *sample_iter)) {
-
428  // Error processing sample. Propagate error condition.
-
429  return false;
-
430  }
-
431  }
-
432  sample_queue.clear();
-
433  }
-
434 
-
435  return true;
-
436 }
-
437 
-
438 } // namespace mp2t
-
439 } // namespace media
-
440 } // namespace shaka
-
void Init(const InitCB &init_cb, const NewSampleCB &new_sample_cb, KeySource *decryption_key_source) override
-
bool Flush() override WARN_UNUSED_RESULT
+
241  // Go to the next packet.
+
242  ts_byte_queue_.Pop(TsPacket::kPacketSize);
+
243  }
+
244 
+
245  // Emit the A/V buffers that kept accumulating during TS parsing.
+
246  return EmitRemainingSamples();
+
247 }
+
248 
+
249 void Mp2tMediaParser::RegisterPmt(int program_number, int pmt_pid) {
+
250  DVLOG(1) << "RegisterPmt:"
+
251  << " program_number=" << program_number
+
252  << " pmt_pid=" << pmt_pid;
+
253 
+
254  // Only one TS program is allowed. Ignore the incoming program map table,
+
255  // if there is already one registered.
+
256  for (const auto& pair : pids_) {
+
257  if (pair.second->pid_type() == PidState::kPidPmt) {
+
258  DVLOG_IF(1, pmt_pid != pair.first) << "More than one program is defined";
+
259  return;
+
260  }
+
261  }
+
262 
+
263  // Create the PMT state here if needed.
+
264  DVLOG(1) << "Create a new PMT parser";
+
265  std::unique_ptr<TsSection> pmt_section_parser(new TsSectionPmt(base::Bind(
+
266  &Mp2tMediaParser::RegisterPes, base::Unretained(this), pmt_pid)));
+
267  std::unique_ptr<PidState> pmt_pid_state(
+
268  new PidState(pmt_pid, PidState::kPidPmt, std::move(pmt_section_parser)));
+
269  pmt_pid_state->Enable();
+
270  pids_.insert(std::pair<int, std::unique_ptr<PidState>>(
+
271  pmt_pid, std::move(pmt_pid_state)));
+
272 }
+
273 
+
274 void Mp2tMediaParser::RegisterPes(int pmt_pid,
+
275  int pes_pid,
+
276  int stream_type) {
+
277  DVLOG(1) << "RegisterPes:"
+
278  << " pes_pid=" << pes_pid
+
279  << " stream_type=" << std::hex << stream_type << std::dec;
+
280  std::map<int, std::unique_ptr<PidState>>::iterator it = pids_.find(pes_pid);
+
281  if (it != pids_.end())
+
282  return;
+
283 
+
284  // Create a stream parser corresponding to the stream type.
+
285  bool is_audio = false;
+
286  std::unique_ptr<EsParser> es_parser;
+
287  switch (static_cast<TsStreamType>(stream_type)) {
+
288  case TsStreamType::kAvc:
+
289  es_parser.reset(new EsParserH264(
+
290  pes_pid,
+
291  base::Bind(&Mp2tMediaParser::OnNewStreamInfo, base::Unretained(this)),
+
292  base::Bind(&Mp2tMediaParser::OnEmitSample, base::Unretained(this))));
+
293  break;
+
294  case TsStreamType::kHevc:
+
295  es_parser.reset(new EsParserH265(
+
296  pes_pid,
+
297  base::Bind(&Mp2tMediaParser::OnNewStreamInfo, base::Unretained(this)),
+
298  base::Bind(&Mp2tMediaParser::OnEmitSample, base::Unretained(this))));
+
299  break;
+
300  case TsStreamType::kAdtsAac:
+
301  case TsStreamType::kAc3:
+
302  es_parser.reset(new EsParserAudio(
+
303  pes_pid, static_cast<TsStreamType>(stream_type),
+
304  base::Bind(&Mp2tMediaParser::OnNewStreamInfo, base::Unretained(this)),
+
305  base::Bind(&Mp2tMediaParser::OnEmitSample, base::Unretained(this)),
+
306  sbr_in_mimetype_));
+
307  is_audio = true;
+
308  break;
+
309  default: {
+
310  LOG_IF(ERROR, !stream_type_logged_once_[stream_type])
+
311  << "Ignore unsupported MPEG2TS stream type 0x" << std::hex
+
312  << stream_type << std::dec;
+
313  stream_type_logged_once_[stream_type] = true;
+
314  return;
+
315  }
+
316  }
+
317 
+
318  // Create the PES state here.
+
319  DVLOG(1) << "Create a new PES state";
+
320  std::unique_ptr<TsSection> pes_section_parser(
+
321  new TsSectionPes(std::move(es_parser)));
+
322  PidState::PidType pid_type =
+
323  is_audio ? PidState::kPidAudioPes : PidState::kPidVideoPes;
+
324  std::unique_ptr<PidState> pes_pid_state(
+
325  new PidState(pes_pid, pid_type, std::move(pes_section_parser)));
+
326  pes_pid_state->Enable();
+
327  pids_.insert(std::pair<int, std::unique_ptr<PidState>>(
+
328  pes_pid, std::move(pes_pid_state)));
+
329 }
+
330 
+
331 void Mp2tMediaParser::OnNewStreamInfo(
+
332  const std::shared_ptr<StreamInfo>& new_stream_info) {
+
333  DCHECK(new_stream_info);
+
334  DVLOG(1) << "OnVideoConfigChanged for pid=" << new_stream_info->track_id();
+
335 
+
336  PidMap::iterator pid_state = pids_.find(new_stream_info->track_id());
+
337  if (pid_state == pids_.end()) {
+
338  LOG(ERROR) << "PID State for new stream not found (pid = "
+
339  << new_stream_info->track_id() << ").";
+
340  return;
+
341  }
+
342 
+
343  // Set the stream configuration information for the PID.
+
344  pid_state->second->set_config(new_stream_info);
+
345 
+
346  // Finish initialization if all streams have configs.
+
347  FinishInitializationIfNeeded();
+
348 }
+
349 
+
350 bool Mp2tMediaParser::FinishInitializationIfNeeded() {
+
351  // Nothing to be done if already initialized.
+
352  if (is_initialized_)
+
353  return true;
+
354 
+
355  // Wait for more data to come to finish initialization.
+
356  if (pids_.empty())
+
357  return true;
+
358 
+
359  std::vector<std::shared_ptr<StreamInfo>> all_stream_info;
+
360  uint32_t num_es(0);
+
361  for (PidMap::const_iterator iter = pids_.begin(); iter != pids_.end();
+
362  ++iter) {
+
363  if (((iter->second->pid_type() == PidState::kPidAudioPes) ||
+
364  (iter->second->pid_type() == PidState::kPidVideoPes))) {
+
365  ++num_es;
+
366  if (iter->second->config())
+
367  all_stream_info.push_back(iter->second->config());
+
368  }
+
369  }
+
370  if (num_es && (all_stream_info.size() == num_es)) {
+
371  // All stream configurations have been received. Initialization can
+
372  // be completed.
+
373  init_cb_.Run(all_stream_info);
+
374  DVLOG(1) << "Mpeg2TS stream parser initialization done";
+
375  is_initialized_ = true;
+
376  }
+
377  return true;
+
378 }
+
379 
+
380 void Mp2tMediaParser::OnEmitSample(
+
381  uint32_t pes_pid,
+
382  const std::shared_ptr<MediaSample>& new_sample) {
+
383  DCHECK(new_sample);
+
384  DVLOG(LOG_LEVEL_ES)
+
385  << "OnEmitSample: "
+
386  << " pid="
+
387  << pes_pid
+
388  << " size="
+
389  << new_sample->data_size()
+
390  << " dts="
+
391  << new_sample->dts()
+
392  << " pts="
+
393  << new_sample->pts();
+
394 
+
395  // Add the sample to the appropriate PID sample queue.
+
396  PidMap::iterator pid_state = pids_.find(pes_pid);
+
397  if (pid_state == pids_.end()) {
+
398  LOG(ERROR) << "PID State for new sample not found (pid = "
+
399  << pes_pid << ").";
+
400  return;
+
401  }
+
402  pid_state->second->sample_queue().push_back(new_sample);
+
403 }
+
404 
+
405 bool Mp2tMediaParser::EmitRemainingSamples() {
+
406  DVLOG(LOG_LEVEL_ES) << "Mp2tMediaParser::EmitRemainingBuffers";
+
407 
+
408  // No buffer should be sent until fully initialized.
+
409  if (!is_initialized_)
+
410  return true;
+
411 
+
412  // Buffer emission.
+
413  for (PidMap::const_iterator pid_iter = pids_.begin(); pid_iter != pids_.end();
+
414  ++pid_iter) {
+
415  SampleQueue& sample_queue = pid_iter->second->sample_queue();
+
416  for (SampleQueue::iterator sample_iter = sample_queue.begin();
+
417  sample_iter != sample_queue.end();
+
418  ++sample_iter) {
+
419  if (!new_sample_cb_.Run(pid_iter->first, *sample_iter)) {
+
420  // Error processing sample. Propagate error condition.
+
421  return false;
+
422  }
+
423  }
+
424  sample_queue.clear();
+
425  }
+
426 
+
427  return true;
+
428 }
+
429 
+
430 } // namespace mp2t
+
431 } // namespace media
+
432 } // namespace shaka
+
void Init(const InitCB &init_cb, const NewSampleCB &new_sample_cb, KeySource *decryption_key_source) override
+
base::Callback< void(const std::vector< std::shared_ptr< StreamInfo > > &stream_info)> InitCB
Definition: media_parser.h:34
+
bool Flush() override WARN_UNUSED_RESULT
+
base::Callback< bool(uint32_t track_id, const std::shared_ptr< MediaSample > &media_sample)> NewSampleCB
Definition: media_parser.h:43
KeySource is responsible for encryption key acquisition.
Definition: key_source.h:45
-
bool Parse(const uint8_t *buf, int size) override WARN_UNUSED_RESULT
+
bool Parse(const uint8_t *buf, int size) override WARN_UNUSED_RESULT
diff --git a/docs/d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html b/docs/d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html index 9ff42e313d..889f8fe6e6 100644 --- a/docs/d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html +++ b/docs/d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html @@ -152,7 +152,7 @@ int64_t  diff --git a/docs/d1/d79/structshaka_1_1media_1_1Scte35Event-members.html b/docs/d1/d79/structshaka_1_1media_1_1Scte35Event-members.html new file mode 100644 index 0000000000..d9028cdb8e --- /dev/null +++ b/docs/d1/d79/structshaka_1_1media_1_1Scte35Event-members.html @@ -0,0 +1,109 @@ + + + + + + +Shaka Packager SDK: Member List + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
shaka::media::Scte35Event Member List
+
+
+ +

This is the complete list of members for shaka::media::Scte35Event, including all inherited members.

+ + + + + + +
cue_data (defined in shaka::media::Scte35Event)shaka::media::Scte35Event
duration (defined in shaka::media::Scte35Event)shaka::media::Scte35Event
id (defined in shaka::media::Scte35Event)shaka::media::Scte35Event
start_time (defined in shaka::media::Scte35Event)shaka::media::Scte35Event
type (defined in shaka::media::Scte35Event)shaka::media::Scte35Event
+ + + + diff --git a/docs/d1/d7d/webm__video__client_8cc_source.html b/docs/d1/d7d/webm__video__client_8cc_source.html index 4a33254cb4..4f1a82ef20 100644 --- a/docs/d1/d7d/webm__video__client_8cc_source.html +++ b/docs/d1/d7d/webm__video__client_8cc_source.html @@ -350,7 +350,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d81/structshaka_1_1media_1_1H265ReferencePictureSet-members.html b/docs/d1/d81/structshaka_1_1media_1_1H265ReferencePictureSet-members.html index 254984d542..923f787c52 100644 --- a/docs/d1/d81/structshaka_1_1media_1_1H265ReferencePictureSet-members.html +++ b/docs/d1/d81/structshaka_1_1media_1_1H265ReferencePictureSet-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d82/classshaka_1_1media_1_1WebMParserClient-members.html b/docs/d1/d82/classshaka_1_1media_1_1WebMParserClient-members.html index 7b0da1cb7a..c0421b5e25 100644 --- a/docs/d1/d82/classshaka_1_1media_1_1WebMParserClient-members.html +++ b/docs/d1/d82/classshaka_1_1media_1_1WebMParserClient-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d87/classshaka_1_1hls_1_1MasterPlaylist.html b/docs/d1/d87/classshaka_1_1hls_1_1MasterPlaylist.html index b084866692..38cff44ec1 100644 --- a/docs/d1/d87/classshaka_1_1hls_1_1MasterPlaylist.html +++ b/docs/d1/d87/classshaka_1_1hls_1_1MasterPlaylist.html @@ -138,7 +138,7 @@ Public Member Functions -

Definition at line 45 of file master_playlist.cc.

+

Definition at line 65 of file master_playlist.cc.

@@ -172,7 +172,7 @@ Public Member Functions
Returns
true on success, false otherwise.
-

Definition at line 49 of file master_playlist.cc.

+

Definition at line 69 of file master_playlist.cc.

@@ -217,7 +217,7 @@ Public Member Functions
Returns
true if the playlist is updated successfully or there is no difference since the last write, false otherwise.
-

Definition at line 72 of file master_playlist.cc.

+

Definition at line 92 of file master_playlist.cc.

@@ -228,7 +228,7 @@ Public Member Functions diff --git a/docs/d1/d8e/webm__audio__client_8cc_source.html b/docs/d1/d8e/webm__audio__client_8cc_source.html index 7a819c4b7d..2675cf77d7 100644 --- a/docs/d1/d8e/webm__audio__client_8cc_source.html +++ b/docs/d1/d8e/webm__audio__client_8cc_source.html @@ -213,7 +213,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d8f/retired__flags_8h_source.html b/docs/d1/d8f/retired__flags_8h_source.html index 9c407c8553..8124763377 100644 --- a/docs/d1/d8f/retired__flags_8h_source.html +++ b/docs/d1/d8f/retired__flags_8h_source.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d91/classshaka_1_1media_1_1H26xBitReader-members.html b/docs/d1/d91/classshaka_1_1media_1_1H26xBitReader-members.html index 62738b8301..9b05a51e44 100644 --- a/docs/d1/d91/classshaka_1_1media_1_1H26xBitReader-members.html +++ b/docs/d1/d91/classshaka_1_1media_1_1H26xBitReader-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d95/structshaka_1_1WidevineEncryptionParams-members.html b/docs/d1/d95/structshaka_1_1WidevineEncryptionParams-members.html index b11b92b480..8ea4247d29 100644 --- a/docs/d1/d95/structshaka_1_1WidevineEncryptionParams-members.html +++ b/docs/d1/d95/structshaka_1_1WidevineEncryptionParams-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d9d/classshaka_1_1media_1_1ByteQueue-members.html b/docs/d1/d9d/classshaka_1_1media_1_1ByteQueue-members.html index 210238af12..d9a00d82c6 100644 --- a/docs/d1/d9d/classshaka_1_1media_1_1ByteQueue-members.html +++ b/docs/d1/d9d/classshaka_1_1media_1_1ByteQueue-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d9d/tracks__builder_8h_source.html b/docs/d1/d9d/tracks__builder_8h_source.html index d17cf92655..3cf628226f 100644 --- a/docs/d1/d9d/tracks__builder_8h_source.html +++ b/docs/d1/d9d/tracks__builder_8h_source.html @@ -210,7 +210,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d9e/structshaka_1_1media_1_1mp4_1_1CodecConfiguration-members.html b/docs/d1/d9e/structshaka_1_1media_1_1mp4_1_1CodecConfiguration-members.html index 3680629448..42a09ce0ef 100644 --- a/docs/d1/d9e/structshaka_1_1media_1_1mp4_1_1CodecConfiguration-members.html +++ b/docs/d1/d9e/structshaka_1_1media_1_1mp4_1_1CodecConfiguration-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html b/docs/d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html index 85df4db5ad..0f22a8bba9 100644 --- a/docs/d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html +++ b/docs/d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html @@ -589,7 +589,7 @@ bool ReadWriteInt64 (i diff --git a/docs/d1/da1/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html b/docs/d1/da1/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html index 62a38f9109..c4bc0b3673 100644 --- a/docs/d1/da1/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html +++ b/docs/d1/da1/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html @@ -116,7 +116,7 @@ std::shared_ptr< diff --git a/docs/d1/da2/classshaka_1_1media_1_1NalUnitToByteStreamConverter-members.html b/docs/d1/da2/classshaka_1_1media_1_1NalUnitToByteStreamConverter-members.html index b3bbf172cf..66da152753 100644 --- a/docs/d1/da2/classshaka_1_1media_1_1NalUnitToByteStreamConverter-members.html +++ b/docs/d1/da2/classshaka_1_1media_1_1NalUnitToByteStreamConverter-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/da5/classshaka_1_1media_1_1VPCodecConfigurationRecord.html b/docs/d1/da5/classshaka_1_1media_1_1VPCodecConfigurationRecord.html index ed1f8064c4..ba784c11b6 100644 --- a/docs/d1/da5/classshaka_1_1media_1_1VPCodecConfigurationRecord.html +++ b/docs/d1/da5/classshaka_1_1media_1_1VPCodecConfigurationRecord.html @@ -359,7 +359,7 @@ uint8_t chroma_location diff --git a/docs/d1/dad/classshaka_1_1media_1_1Demuxer-members.html b/docs/d1/dad/classshaka_1_1media_1_1Demuxer-members.html index 068b9c349c..ca68bf9a94 100644 --- a/docs/d1/dad/classshaka_1_1media_1_1Demuxer-members.html +++ b/docs/d1/dad/classshaka_1_1media_1_1Demuxer-members.html @@ -98,9 +98,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); container_name()shaka::media::Demuxerinline Demuxer(const std::string &file_name)shaka::media::Demuxerexplicit Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected - DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected + DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected - DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected + DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected @@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/db0/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader.html b/docs/d1/db0/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader.html index 4cf6aac8b0..f0d2f97ea7 100644 --- a/docs/d1/db0/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader.html +++ b/docs/d1/db0/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader.html @@ -191,7 +191,7 @@ Additional Inherited Members diff --git a/docs/d1/db2/decoder__configuration__record_8h_source.html b/docs/d1/db2/decoder__configuration__record_8h_source.html index eb4e1a5a29..4b183c6abe 100644 --- a/docs/d1/db2/decoder__configuration__record_8h_source.html +++ b/docs/d1/db2/decoder__configuration__record_8h_source.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html b/docs/d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html new file mode 100644 index 0000000000..f58266f98c --- /dev/null +++ b/docs/d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html @@ -0,0 +1,445 @@ + + + + + + +Shaka Packager SDK: shaka::media::mp2t::AudioHeader Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
shaka::media::mp2t::AudioHeader Class Referenceabstract
+
+
+
+Inheritance diagram for shaka::media::mp2t::AudioHeader:
+
+
+ + +shaka::media::mp2t::Ac3Header +shaka::media::mp2t::AdtsHeader + +
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

virtual bool IsSyncWord (const uint8_t *buf) const =0
 
virtual size_t GetMinFrameSize () const =0
 
virtual size_t GetSamplesPerFrame () const =0
 
virtual bool Parse (const uint8_t *audio_frame, size_t audio_frame_size)=0
 
virtual size_t GetHeaderSize () const =0
 
virtual size_t GetFrameSize () const =0
 
virtual void GetAudioSpecificConfig (std::vector< uint8_t > *buffer) const =0
 
virtual uint8_t GetObjectType () const =0
 
virtual uint32_t GetSamplingFrequency () const =0
 
virtual uint8_t GetNumChannels () const =0
 
+

Detailed Description

+
+

Definition at line 19 of file audio_header.h.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void shaka::media::mp2t::AudioHeader::GetAudioSpecificConfig (std::vector< uint8_t > * buffer) const
+
+pure virtual
+
+

Synthesize an AudioSpecificConfig record from the fields within the audio header. Should only be called after a successful Parse.

+
Parameters
+ + +
[out]bufferis a pointer to a vector to contain the AudioSpecificConfig.
+
+
+
Returns
true if successful, false otherwise.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t shaka::media::mp2t::AudioHeader::GetFrameSize () const
+
+pure virtual
+
+

Should only be called after a successful Parse.

+
Returns
the size of frame (header + payload).
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t shaka::media::mp2t::AudioHeader::GetHeaderSize () const
+
+pure virtual
+
+

Should only be called after a successful Parse.

+
Returns
The size of audio header.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t shaka::media::mp2t::AudioHeader::GetMinFrameSize () const
+
+pure virtual
+
+
Returns
The minium frame size.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
virtual uint8_t shaka::media::mp2t::AudioHeader::GetNumChannels () const
+
+pure virtual
+
+

Should only be called after a successful Parse.

+
Returns
Number of channels for this frame.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
virtual uint8_t shaka::media::mp2t::AudioHeader::GetObjectType () const
+
+pure virtual
+
+

Should only be called after a successful Parse.

+
Returns
The audio profile for this frame. Only meaningful for AAC.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
virtual size_t shaka::media::mp2t::AudioHeader::GetSamplesPerFrame () const
+
+pure virtual
+
+
Returns
Number of audio samples per frame.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
virtual uint32_t shaka::media::mp2t::AudioHeader::GetSamplingFrequency () const
+
+pure virtual
+
+

Should only be called after a successful Parse.

+
Returns
The sampling frequency for this frame.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
virtual bool shaka::media::mp2t::AudioHeader::IsSyncWord (const uint8_t * buf) const
+
+pure virtual
+
+

Check if the leading word (2 bytes) is sync signal.

+
Parameters
+ + +
bufpoints to the buffer to be checked. Must be at least 2 bytes.
+
+
+
Returns
true if corresponds to a syncword.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual bool shaka::media::mp2t::AudioHeader::Parse (const uint8_t * audio_frame,
size_t audio_frame_size 
)
+
+pure virtual
+
+

Parse a partial audio frame, extracting the fields within. Only audio frame header / metadata is parsed. The audio_frame_size must contain the full header / metadata.

+
Parameters
+ + + +
audio_frameis an input parameter pointing to an audio frame.
audio_frame_sizeis the size, in bytes of the input data. It can be smaller than the actual frame size, but it should not be smaller than the header size.
+
+
+
Returns
true if successful, false otherwise.
+ +

Implemented in shaka::media::mp2t::Ac3Header, and shaka::media::mp2t::AdtsHeader.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/docs/d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.png b/docs/d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e62dd93dcfbb24dda55927e0c62d5b8b79c7b3 GIT binary patch literal 1077 zcmeAS@N?(olHy`uVBq!ia0y~yV4MPE2XHV0Nlww?79b@N;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|zoz6U`b6L&PS%FJ* z%-`nBw$#owTe2lJEq9;pQk@>t3q0Xl?S4AiNBn;~DP_^0zV1uU+OqEDhc0*gDRpu) zH`fE78^);y?%&gH%dy>U+okIx1MFM(=5CCyC`hB z_si{k5yvBy@*Y0xu`2w@RAD-Q=DGE02H1+E^9ACAtSyn*RK=LDt)eF01ldVn+mTrlPI(;`b@2K)0T zrxkcG7PygtkEvhs)Li<#2uy4%nWXa9VylSfuR^CT6-(tM9+QmW47VUP&!^Y#d0v{Z zf5YyHmrHn89-g&u)%U~awz=Jy{Ap^=t8e|!KYM9T+H!oBv#4dM<%LXVA1mpagJn^@Qv{aW~c;{(4{S&=#YhqW4!7ey%&0;e6`)rk#5;%KlxfSu-W| z#?IYYns=(s^{>Ahdfy@|`S6>N>l545I;(_UJ6?-<_ioDj)Zkm!H@1I%x#UXmlxVZr zXM581s}sM<8&A+=yuP&f@5_CMW8R#*KjqWfoSwe+&yv&E@44+Ib=voLZQ7PgY0ACZ zcC9-bt$EDvXWz4jjmA%_Z$9~!_FVq#a_blD+RG;2d~@cY*}a&iv%lZD?!G%)#rw5# z(7x%u^N%V2FVdQ&MBb@0KilRD*ylh literal 0 HcmV?d00001 diff --git a/docs/d1/dbe/classshaka_1_1media_1_1PlayReadyKeySource-members.html b/docs/d1/dbe/classshaka_1_1media_1_1PlayReadyKeySource-members.html index 51662b21f9..f7521ca182 100644 --- a/docs/d1/dbe/classshaka_1_1media_1_1PlayReadyKeySource-members.html +++ b/docs/d1/dbe/classshaka_1_1media_1_1PlayReadyKeySource-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/dc2/h26x__bit__reader_8h_source.html b/docs/d1/dc2/h26x__bit__reader_8h_source.html index bbcf3fe101..4999dbf731 100644 --- a/docs/d1/dc2/h26x__bit__reader_8h_source.html +++ b/docs/d1/dc2/h26x__bit__reader_8h_source.html @@ -192,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/dd5/classshaka_1_1media_1_1Cluster.html b/docs/d1/dd5/classshaka_1_1media_1_1Cluster.html index 61cb41a1fa..12f8e9bc77 100644 --- a/docs/d1/dd5/classshaka_1_1media_1_1Cluster.html +++ b/docs/d1/dd5/classshaka_1_1media_1_1Cluster.html @@ -116,7 +116,7 @@ int size () const diff --git a/docs/d1/dd6/structshaka_1_1media_1_1mp4_1_1DataInformation-members.html b/docs/d1/dd6/structshaka_1_1media_1_1mp4_1_1DataInformation-members.html index 10a28f1416..705c3439b5 100644 --- a/docs/d1/dd6/structshaka_1_1media_1_1mp4_1_1DataInformation-members.html +++ b/docs/d1/dd6/structshaka_1_1media_1_1mp4_1_1DataInformation-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/dd8/structshaka_1_1PackagingParams-members.html b/docs/d1/dd8/structshaka_1_1PackagingParams-members.html index 2c657e3251..cd8f4f8a84 100644 --- a/docs/d1/dd8/structshaka_1_1PackagingParams-members.html +++ b/docs/d1/dd8/structshaka_1_1PackagingParams-members.html @@ -93,20 +93,21 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');

This is the complete list of members for shaka::PackagingParams, including all inherited members.

- - - - - - - - - - + + + + + + + + + + +
buffer_callback_paramsshaka::PackagingParams
chunking_paramsshaka::PackagingParams
decryption_params (defined in shaka::PackagingParams)shaka::PackagingParams
encryption_paramsshaka::PackagingParams
hls_paramsshaka::PackagingParams
mp4_output_paramsshaka::PackagingParams
mpd_paramsshaka::PackagingParams
output_media_infoshaka::PackagingParams
temp_dirshaka::PackagingParams
test_params (defined in shaka::PackagingParams)shaka::PackagingParams
ad_cue_generator_paramsshaka::PackagingParams
buffer_callback_paramsshaka::PackagingParams
chunking_paramsshaka::PackagingParams
decryption_params (defined in shaka::PackagingParams)shaka::PackagingParams
encryption_paramsshaka::PackagingParams
hls_paramsshaka::PackagingParams
mp4_output_paramsshaka::PackagingParams
mpd_paramsshaka::PackagingParams
output_media_infoshaka::PackagingParams
temp_dirshaka::PackagingParams
test_params (defined in shaka::PackagingParams)shaka::PackagingParams
diff --git a/docs/d1/dda/structshaka_1_1media_1_1EncryptionConfig-members.html b/docs/d1/dda/structshaka_1_1media_1_1EncryptionConfig-members.html index 0798fd1378..a9aadd9734 100644 --- a/docs/d1/dda/structshaka_1_1media_1_1EncryptionConfig-members.html +++ b/docs/d1/dda/structshaka_1_1media_1_1EncryptionConfig-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/de2/classshaka_1_1media_1_1VideoStreamInfo-members.html b/docs/d1/de2/classshaka_1_1media_1_1VideoStreamInfo-members.html index b9bcca66ca..cc785ec7aa 100644 --- a/docs/d1/de2/classshaka_1_1media_1_1VideoStreamInfo-members.html +++ b/docs/d1/de2/classshaka_1_1media_1_1VideoStreamInfo-members.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/de2/composition__offset__iterator_8cc_source.html b/docs/d1/de2/composition__offset__iterator_8cc_source.html index bf96a9cb36..47afd275bf 100644 --- a/docs/d1/de2/composition__offset__iterator_8cc_source.html +++ b/docs/d1/de2/composition__offset__iterator_8cc_source.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/de4/classshaka_1_1media_1_1KeyFetcher-members.html b/docs/d1/de4/classshaka_1_1media_1_1KeyFetcher-members.html index e22b1c61e0..5c455a0da7 100644 --- a/docs/d1/de4/classshaka_1_1media_1_1KeyFetcher-members.html +++ b/docs/d1/de4/classshaka_1_1media_1_1KeyFetcher-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/de7/classshaka_1_1xml_1_1AdaptationSetXmlNode.html b/docs/d1/de7/classshaka_1_1xml_1_1AdaptationSetXmlNode.html index 0284cc13e6..51eaadb769 100644 --- a/docs/d1/de7/classshaka_1_1xml_1_1AdaptationSetXmlNode.html +++ b/docs/d1/de7/classshaka_1_1xml_1_1AdaptationSetXmlNode.html @@ -201,7 +201,7 @@ Additional Inherited Members diff --git a/docs/d1/de7/structshaka_1_1media_1_1H265ReferencePictureListModifications-members.html b/docs/d1/de7/structshaka_1_1media_1_1H265ReferencePictureListModifications-members.html index e6f3eb4d43..ef28e8d65e 100644 --- a/docs/d1/de7/structshaka_1_1media_1_1H265ReferencePictureListModifications-members.html +++ b/docs/d1/de7/structshaka_1_1media_1_1H265ReferencePictureListModifications-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/de9/classshaka_1_1media_1_1ProgressListener-members.html b/docs/d1/de9/classshaka_1_1media_1_1ProgressListener-members.html index b81ee0481f..9242b3235c 100644 --- a/docs/d1/de9/classshaka_1_1media_1_1ProgressListener-members.html +++ b/docs/d1/de9/classshaka_1_1media_1_1ProgressListener-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html b/docs/d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html index d2684bc30a..c89926eb38 100644 --- a/docs/d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html +++ b/docs/d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html @@ -468,7 +468,7 @@ template<typename T > diff --git a/docs/d1/dee/structshaka_1_1media_1_1mp4_1_1SampleTable.html b/docs/d1/dee/structshaka_1_1media_1_1mp4_1_1SampleTable.html index fddf21dd8c..025d3c1bf6 100644 --- a/docs/d1/dee/structshaka_1_1media_1_1mp4_1_1SampleTable.html +++ b/docs/d1/dee/structshaka_1_1media_1_1mp4_1_1SampleTable.html @@ -198,7 +198,7 @@ Additional Inherited Members diff --git a/docs/d1/df0/aes__encryptor_8h_source.html b/docs/d1/df0/aes__encryptor_8h_source.html index b9cd1166c6..623517bd4b 100644 --- a/docs/d1/df0/aes__encryptor_8h_source.html +++ b/docs/d1/df0/aes__encryptor_8h_source.html @@ -194,7 +194,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/df3/structshaka_1_1MpdOptions.html b/docs/d1/df3/structshaka_1_1MpdOptions.html index 74ba93799d..8bfc81f1b1 100644 --- a/docs/d1/df3/structshaka_1_1MpdOptions.html +++ b/docs/d1/df3/structshaka_1_1MpdOptions.html @@ -121,7 +121,7 @@ MpdType mpd_type = Mpd diff --git a/docs/d1/df5/nalu__reader_8cc_source.html b/docs/d1/df5/nalu__reader_8cc_source.html index 65278733c6..7ac0db7fd4 100644 --- a/docs/d1/df5/nalu__reader_8cc_source.html +++ b/docs/d1/df5/nalu__reader_8cc_source.html @@ -574,7 +574,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/df9/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader-members.html b/docs/d1/df9/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader-members.html index 7b2f1f8b83..51676c50ac 100644 --- a/docs/d1/df9/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader-members.html +++ b/docs/d1/df9/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d02/timestamp_8h_source.html b/docs/d2/d02/timestamp_8h_source.html index 201b4d2375..7ee6f97255 100644 --- a/docs/d2/d02/timestamp_8h_source.html +++ b/docs/d2/d02/timestamp_8h_source.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d0b/classshaka_1_1media_1_1SeekHead-members.html b/docs/d2/d0b/classshaka_1_1media_1_1SeekHead-members.html index d5fab61242..60d16e31cb 100644 --- a/docs/d2/d0b/classshaka_1_1media_1_1SeekHead-members.html +++ b/docs/d2/d0b/classshaka_1_1media_1_1SeekHead-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d0f/classshaka_1_1MpdBuilder-members.html b/docs/d2/d0f/classshaka_1_1MpdBuilder-members.html index 91c760cfb9..431eeed15c 100644 --- a/docs/d2/d0f/classshaka_1_1MpdBuilder-members.html +++ b/docs/d2/d0f/classshaka_1_1MpdBuilder-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d0f/structshaka_1_1media_1_1wvm_1_1PrevSampleData.html b/docs/d2/d0f/structshaka_1_1media_1_1wvm_1_1PrevSampleData.html index f420d977d4..15b9aac2ab 100644 --- a/docs/d2/d0f/structshaka_1_1media_1_1wvm_1_1PrevSampleData.html +++ b/docs/d2/d0f/structshaka_1_1media_1_1wvm_1_1PrevSampleData.html @@ -132,7 +132,7 @@ int64_t video_sample_durat diff --git a/docs/d2/d11/classshaka_1_1media_1_1MuxerListener-members.html b/docs/d2/d11/classshaka_1_1media_1_1MuxerListener-members.html index 168b16f04a..5ac76d3ae7 100644 --- a/docs/d2/d11/classshaka_1_1media_1_1MuxerListener-members.html +++ b/docs/d2/d11/classshaka_1_1media_1_1MuxerListener-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d17/ts__section__pat_8cc_source.html b/docs/d2/d17/ts__section__pat_8cc_source.html index af27f66a18..a148ee837c 100644 --- a/docs/d2/d17/ts__section__pat_8cc_source.html +++ b/docs/d2/d17/ts__section__pat_8cc_source.html @@ -214,7 +214,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d1f/structshaka_1_1ChunkingParams.html b/docs/d2/d1f/structshaka_1_1ChunkingParams.html index dde08cd4fc..77617576fb 100644 --- a/docs/d2/d1f/structshaka_1_1ChunkingParams.html +++ b/docs/d2/d1f/structshaka_1_1ChunkingParams.html @@ -168,7 +168,7 @@ double  diff --git a/docs/d2/d20/classshaka_1_1Status.html b/docs/d2/d20/classshaka_1_1Status.html index 1d48437867..3abc5ee943 100644 --- a/docs/d2/d20/classshaka_1_1Status.html +++ b/docs/d2/d20/classshaka_1_1Status.html @@ -302,7 +302,7 @@ static const Status< diff --git a/docs/d2/d23/threaded__io__file_8cc_source.html b/docs/d2/d23/threaded__io__file_8cc_source.html index c46b70892f..b87238413a 100644 --- a/docs/d2/d23/threaded__io__file_8cc_source.html +++ b/docs/d2/d23/threaded__io__file_8cc_source.html @@ -326,7 +326,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d24/packager__util_8h_source.html b/docs/d2/d24/packager__util_8h_source.html index ca5ca65e2a..eede74431e 100644 --- a/docs/d2/d24/packager__util_8h_source.html +++ b/docs/d2/d24/packager__util_8h_source.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d2a/classshaka_1_1IoCache-members.html b/docs/d2/d2a/classshaka_1_1IoCache-members.html index 5be3792a6d..075ff76096 100644 --- a/docs/d2/d2a/classshaka_1_1IoCache-members.html +++ b/docs/d2/d2a/classshaka_1_1IoCache-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d30/tracks__builder_8cc_source.html b/docs/d2/d30/tracks__builder_8cc_source.html index 60599d7510..6bfd591ab8 100644 --- a/docs/d2/d30/tracks__builder_8cc_source.html +++ b/docs/d2/d30/tracks__builder_8cc_source.html @@ -486,7 +486,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d33/video__slice__header__parser_8h_source.html b/docs/d2/d33/video__slice__header__parser_8h_source.html index 6db4254841..b6ac057b66 100644 --- a/docs/d2/d33/video__slice__header__parser_8h_source.html +++ b/docs/d2/d33/video__slice__header__parser_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d35/classshaka_1_1media_1_1WidevineKeySource-members.html b/docs/d2/d35/classshaka_1_1media_1_1WidevineKeySource-members.html index 00ff59d3f4..985ec939e5 100644 --- a/docs/d2/d35/classshaka_1_1media_1_1WidevineKeySource-members.html +++ b/docs/d2/d35/classshaka_1_1media_1_1WidevineKeySource-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d3c/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader-members.html b/docs/d2/d3c/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader-members.html index ffc24ce1af..3b99717535 100644 --- a/docs/d2/d3c/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader-members.html +++ b/docs/d2/d3c/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader-members.html @@ -133,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d45/program__map__table__writer_8cc_source.html b/docs/d2/d45/program__map__table__writer_8cc_source.html index f68af66853..cfc84c89e2 100644 --- a/docs/d2/d45/program__map__table__writer_8cc_source.html +++ b/docs/d2/d45/program__map__table__writer_8cc_source.html @@ -101,8 +101,8 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
12 #include "packager/media/base/buffer_writer.h"
13 #include "packager/media/base/fourccs.h"
14 #include "packager/media/codecs/aac_audio_specific_config.h"
-
15 #include "packager/media/formats/mp2t/continuity_counter.h"
-
16 #include "packager/media/formats/mp2t/ts_packet_writer_util.h"
+
15 #include "packager/media/formats/mp2t/ts_packet_writer_util.h"
+
16 #include "packager/media/formats/mp2t/ts_stream_type.h"
17 
18 namespace shaka {
19 namespace media {
@@ -122,380 +122,393 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
33 const uint8_t kProgramNumber = 0x01;
34 const uint8_t kProgramMapTableId = 0x02;
35 
-
36 // Stream types.
-
37 // Clear.
-
38 const uint8_t kStreamTypeH264 = 0x1B;
-
39 const uint8_t kStreamTypeAdtsAac = 0x0F;
-
40 // Encrypted.
-
41 const uint8_t kStreamTypeEncryptedH264 = 0xDB;
-
42 const uint8_t kStreamTypeEncryptedAdtsAac = 0xCF;
-
43 
-
44 // Table for CRC32/MPEG2.
-
45 const uint32_t kCrcTable[] = {
-
46  0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
-
47  0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
-
48  0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
-
49  0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
-
50  0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
-
51  0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
-
52  0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
-
53  0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
-
54  0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
-
55  0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
-
56  0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
-
57  0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
-
58  0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
-
59  0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
-
60  0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
-
61  0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
-
62  0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
-
63  0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
-
64  0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
-
65  0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
-
66  0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
-
67  0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
-
68  0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
-
69  0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
-
70  0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
-
71  0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
-
72  0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
-
73  0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
-
74  0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
-
75  0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
-
76  0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
-
77  0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
-
78  0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
-
79  0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
-
80  0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
-
81  0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
-
82  0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
-
83  0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
-
84  0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
-
85  0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
-
86  0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
-
87  0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
-
88  0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
-
89  0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
-
90  0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
-
91  0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
-
92  0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
-
93  0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
-
94  0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
-
95  0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
-
96  0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
-
97  0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
-
98  0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
-
99  0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
-
100  0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
-
101  0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
-
102  0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
-
103  0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
-
104  0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
-
105  0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
-
106  0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
-
107  0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
-
108  0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
-
109  0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,
-
110 };
-
111 
-
112 // Note there are dozens of CRCs. This is one of them.
-
113 // http://reveng.sourceforge.net/crc-catalogue/all.htm
-
114 uint32_t Crc32Mpeg2(const uint8_t* data, size_t data_size) {
-
115  uint32_t crc = 0xFFFFFFFF;
-
116  for (size_t i = 0; i < data_size; ++i) {
-
117  crc = kCrcTable[((crc >> 24) ^ data[i]) & 0xFF] ^ (crc << 8);
-
118  }
-
119  return crc;
-
120 }
-
121 
-
122 // For all the pointer fields in the PMTs, they are not really part of the PMT
-
123 // but it's there so that an extra buffer isn't required to prepend the 0x00
-
124 // byte.
+
36 // Table for CRC32/MPEG2.
+
37 const uint32_t kCrcTable[] = {
+
38  0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
+
39  0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
+
40  0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
+
41  0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
+
42  0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
+
43  0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
+
44  0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
+
45  0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
+
46  0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
+
47  0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
+
48  0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
+
49  0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
+
50  0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
+
51  0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
+
52  0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
+
53  0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
+
54  0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
+
55  0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
+
56  0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
+
57  0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
+
58  0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
+
59  0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
+
60  0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
+
61  0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
+
62  0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
+
63  0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
+
64  0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
+
65  0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
+
66  0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
+
67  0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
+
68  0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
+
69  0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
+
70  0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
+
71  0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
+
72  0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
+
73  0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
+
74  0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
+
75  0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
+
76  0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
+
77  0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
+
78  0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
+
79  0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
+
80  0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
+
81  0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
+
82  0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
+
83  0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
+
84  0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
+
85  0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
+
86  0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
+
87  0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
+
88  0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
+
89  0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
+
90  0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
+
91  0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
+
92  0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
+
93  0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
+
94  0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
+
95  0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
+
96  0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
+
97  0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
+
98  0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
+
99  0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
+
100  0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
+
101  0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,
+
102 };
+
103 
+
104 // Note there are dozens of CRCs. This is one of them.
+
105 // http://reveng.sourceforge.net/crc-catalogue/all.htm
+
106 uint32_t Crc32Mpeg2(const uint8_t* data, size_t data_size) {
+
107  uint32_t crc = 0xFFFFFFFF;
+
108  for (size_t i = 0; i < data_size; ++i) {
+
109  crc = kCrcTable[((crc >> 24) ^ data[i]) & 0xFF] ^ (crc << 8);
+
110  }
+
111  return crc;
+
112 }
+
113 
+
114 void WritePmtToBuffer(const uint8_t* pmt,
+
115  size_t pmt_size,
+
116  ContinuityCounter* continuity_counter,
+
117  BufferWriter* writer) {
+
118  const bool kPayloadUnitStartIndicator = true;
+
119  const bool kHasPcr = true;
+
120  const uint64_t kAnyPcrBase = 0;
+
121  WritePayloadToBufferWriter(pmt, pmt_size, kPayloadUnitStartIndicator,
+
122  ProgramMapTableWriter::kPmtPid, !kHasPcr,
+
123  kAnyPcrBase, continuity_counter, writer);
+
124 }
125 
-
126 // PMT for H264 clear segments.
-
127 // Note that this is version 0, so it only works for clear lead or clear stream.
-
128 const uint8_t kPmtH264[] = {
-
129  0x00, // pointer field
-
130  kProgramMapTableId,
-
131  0xB0, // assumes length is <= 256 bytes.
-
132  0x12, // length of the rest of this array.
-
133  0x00, kProgramNumber,
-
134  0xC1, // version 0, current next indicator 1.
-
135  0x00, // section number
-
136  0x00, // last section number.
-
137  0xE0, // first 3 bits reserved.
-
138  // PCR PID is the elementary streams PID.
-
139  ProgramMapTableWriter::kElementaryPid,
-
140  0xF0, // first 4 bits reserved.
-
141  0x00, // No descriptor at this level.
-
142  // stream_type -> PID.
-
143  kStreamTypeH264, 0xE0, ProgramMapTableWriter::kElementaryPid,
-
144  0xF0, 0x00, // Es_info_length is 0.
-
145  // CRC32.
-
146  0x43, 0x49, 0x97, 0xBE,
-
147 };
-
148 
-
149 // PMT for AAC clear segments.
-
150 // Note that this is version 0, so it only works for clear lead or clear stream.
-
151 const uint8_t kPmtAac[] = {
-
152  0x00, // pointer field
-
153  0x02, // table id must be 0x02.
-
154  0xB0, // assumes length is <= 256 bytes.
-
155  0x12, // length of the rest of this array.
-
156  0x00, kProgramNumber,
-
157  0xC1, // version 0, current next indicator 1.
-
158  0x00, // section number
-
159  0x00, // last section number.
-
160  0xE0, // first 3 bits reserved.
-
161  // PCR PID is the elementary streams PID.
-
162  ProgramMapTableWriter::kElementaryPid,
-
163  0xF0, // first 4 bits reserved.
-
164  0x00, // No descriptor at this level.
-
165  // stream_type -> PID.
-
166  kStreamTypeAdtsAac, 0xE0, ProgramMapTableWriter::kElementaryPid,
-
167  0xF0, 0x00, // Es_info_length is 0.
-
168  // CRC32.
-
169  0xE0, 0x6F, 0x1A, 0x31,
-
170 };
-
171 
-
172 // private_data_indicator for SAMPLE-AES H264. This is the same for all H264
-
173 // streams.
-
174 const uint8_t kPrivateDataIndicatorDescriptorEncryptedH264[] = {
-
175  0x0F, // descriptor_tag.
-
176  0x04, // Length of the rest of this descriptor.
-
177  // 'zavc'.
-
178  0x7A, 0x61, 0x76, 0x63,
-
179 };
-
180 
-
181 void WritePmtToBuffer(const uint8_t* pmt,
-
182  size_t pmt_size,
-
183  ContinuityCounter* continuity_counter,
-
184  BufferWriter* writer) {
-
185  const bool kPayloadUnitStartIndicator = true;
-
186  const bool kHasPcr = true;
-
187  const uint64_t kAnyPcrBase = 0;
-
188  WritePayloadToBufferWriter(pmt, pmt_size, kPayloadUnitStartIndicator,
-
189  ProgramMapTableWriter::kPmtPid, !kHasPcr,
-
190  kAnyPcrBase, continuity_counter, writer);
-
191 }
-
192 
-
193 void WritePrivateDataIndicatorDescriptor(FourCC fourcc, BufferWriter* output) {
-
194  const uint8_t kPrivateDataIndicatorDescriptor = 15;
-
195  output->AppendInt(kPrivateDataIndicatorDescriptor);
-
196  output->AppendInt(static_cast<uint8_t>(sizeof(fourcc)));
-
197  output->AppendInt(fourcc);
-
198 }
-
199 
-
200 bool WriteAacAudioSetupInformation(const uint8_t* aac_audio_specific_config,
-
201  size_t aac_audio_specific_config_size,
-
202  BufferWriter* audio_setup_information) {
-
203  AACAudioSpecificConfig config;
-
204  const bool result = config.Parse(std::vector<uint8_t>(
-
205  aac_audio_specific_config,
-
206  aac_audio_specific_config + aac_audio_specific_config_size));
-
207  if (!result) {
-
208  LOG(WARNING) << "Failed to parse config. Assuming AAC-LC.";
-
209  return false;
-
210  }
-
211 
-
212  auto audio_object_type = config.GetAudioObjectType();
-
213  switch (audio_object_type) {
-
214  case AACAudioSpecificConfig::AOT_AAC_LC:
-
215  audio_setup_information->AppendInt(FOURCC_zaac);
-
216  break;
-
217  case AACAudioSpecificConfig::AOT_SBR:
-
218  audio_setup_information->AppendInt(FOURCC_zach);
-
219  break;
-
220  case AACAudioSpecificConfig::AOT_PS:
-
221  audio_setup_information->AppendInt(FOURCC_zacp);
-
222  break;
-
223  default:
-
224  LOG(ERROR) << "Unknown object type for aac " << audio_object_type;
-
225  return false;
-
226  }
-
227 
-
228  // Priming. Since no info from encoder, set it to 0x0000.
-
229  audio_setup_information->AppendInt(static_cast<uint16_t>(0x0000));
-
230  // Version is always 0x01.
-
231  audio_setup_information->AppendInt(static_cast<uint8_t>(0x01));
-
232  audio_setup_information->AppendInt(
-
233  static_cast<uint8_t>(aac_audio_specific_config_size));
-
234  audio_setup_information->AppendArray(aac_audio_specific_config,
-
235  aac_audio_specific_config_size);
-
236  return true;
-
237 }
-
238 
-
239 bool WriteRegistrationDescriptorForEncryptedAudio(const uint8_t* setup_data,
-
240  size_t setup_data_size,
-
241  BufferWriter* output) {
-
242  const uint8_t kRegistrationDescriptor = 5;
-
243  BufferWriter audio_setup_information;
-
244  if (!WriteAacAudioSetupInformation(setup_data, setup_data_size,
-
245  &audio_setup_information)) {
-
246  return false;
-
247  }
-
248 
-
249  output->AppendInt(kRegistrationDescriptor);
-
250  // Length of the rest of this descriptor is size of audio_setup_information +
-
251  // 4 bytes (for 'apad').
-
252  output->AppendInt(static_cast<uint8_t>(audio_setup_information.Size() +
-
253  sizeof(FOURCC_apad)));
-
254  output->AppendInt(FOURCC_apad);
-
255  output->AppendBuffer(audio_setup_information);
-
256  return true;
-
257 }
-
258 
-
259 void WritePmtWithParameters(uint8_t stream_type,
-
260  int version,
-
261  int current_next_indicator,
-
262  const uint8_t* descriptors,
-
263  size_t descriptors_size,
-
264  ContinuityCounter* continuity_counter,
-
265  BufferWriter* output) {
-
266  DCHECK(current_next_indicator == kCurrent || current_next_indicator == kNext);
-
267  // Body starting from program number.
-
268  BufferWriter pmt_body;
-
269  pmt_body.AppendInt(static_cast<uint8_t>(0x00));
-
270  pmt_body.AppendInt(kProgramNumber);
-
271  // resevered bits then version and current_next_indicator.
-
272  pmt_body.AppendInt(
-
273  static_cast<uint8_t>(0xC0 |
-
274  static_cast<uint8_t>(version) << 1 |
-
275  static_cast<uint8_t>(current_next_indicator)));
-
276  // section number.
-
277  pmt_body.AppendInt(static_cast<uint8_t>(0x00));
-
278  // last section number.
-
279  pmt_body.AppendInt(static_cast<uint8_t>(0x00));
-
280  // first 3 bits reserved. Rest is unused bits for PCR PID.
-
281  pmt_body.AppendInt(static_cast<uint8_t>(0xE0));
-
282  pmt_body.AppendInt(ProgramMapTableWriter::kElementaryPid);
-
283  // First 4 bits are reserved. Next 12 bits is program_info_length which is 0.
-
284  pmt_body.AppendInt(static_cast<uint8_t>(0xF0));
-
285  pmt_body.AppendInt(static_cast<uint8_t>(0x00));
-
286 
-
287  pmt_body.AppendInt(stream_type);
-
288  // 3 reserved bits followed by 13 bit elementary_PID.
-
289  pmt_body.AppendInt(static_cast<uint8_t>(0xE0));
-
290  pmt_body.AppendInt(ProgramMapTableWriter::kElementaryPid);
-
291 
-
292  // 4 reserved bits followed by ES_info_length.
-
293  pmt_body.AppendInt(static_cast<uint16_t>(0xF000 | descriptors_size));
-
294  pmt_body.AppendArray(descriptors, descriptors_size);
-
295 
-
296  // The whole PMT has 3 bytes before the body and 4 more bytes for CRC. This
-
297  // also includes pointer field (1 byte) so + 8 in total.
-
298  BufferWriter pmt(pmt_body.Size() + 8);
-
299  // Pointer field.
-
300  pmt.AppendInt(static_cast<uint8_t>(0x00));
-
301  // PMT table ID is always 2.
-
302  pmt.AppendInt(static_cast<uint8_t>(0x02));
-
303  // First four bits must be '1011'. +4 for CRC.
-
304  pmt.AppendInt(static_cast<uint16_t>(0xB000 | (pmt_body.Size() + 4)));
-
305  pmt.AppendBuffer(pmt_body);
-
306 
-
307  // Don't include the pointer field.
-
308  const uint32_t crc = Crc32Mpeg2(pmt.Buffer() + 1, pmt.Size() - 1);
-
309  pmt.AppendInt(crc);
-
310  WritePmtToBuffer(pmt.Buffer(), pmt.Size(), continuity_counter, output);
+
126 void WritePrivateDataIndicatorDescriptor(FourCC fourcc, BufferWriter* output) {
+
127  const uint8_t kPrivateDataIndicatorDescriptor = 15;
+
128  output->AppendInt(kPrivateDataIndicatorDescriptor);
+
129  output->AppendInt(static_cast<uint8_t>(sizeof(fourcc)));
+
130  output->AppendInt(fourcc);
+
131 }
+
132 
+
133 bool WriteAudioSetupInformation(Codec codec,
+
134  const uint8_t* audio_specific_config,
+
135  size_t audio_specific_config_size,
+
136  BufferWriter* audio_setup_information) {
+
137  uint32_t audio_type = FOURCC_NULL;
+
138  switch (codec) {
+
139  case kCodecAAC: {
+
140  AACAudioSpecificConfig config;
+
141  const bool result = config.Parse(std::vector<uint8_t>(
+
142  audio_specific_config,
+
143  audio_specific_config + audio_specific_config_size));
+
144 
+
145  AACAudioSpecificConfig::AudioObjectType audio_object_type;
+
146  if (!result) {
+
147  LOG(WARNING) << "Failed to parse config. Assuming AAC-LC.";
+
148  audio_object_type = AACAudioSpecificConfig::AOT_AAC_LC;
+
149  } else {
+
150  audio_object_type = config.GetAudioObjectType();
+
151  }
+
152 
+
153  switch (audio_object_type) {
+
154  case AACAudioSpecificConfig::AOT_AAC_LC:
+
155  audio_type = FOURCC_zaac;
+
156  break;
+
157  case AACAudioSpecificConfig::AOT_SBR:
+
158  audio_type = FOURCC_zach;
+
159  break;
+
160  case AACAudioSpecificConfig::AOT_PS:
+
161  audio_type = FOURCC_zacp;
+
162  break;
+
163  default:
+
164  LOG(ERROR) << "Unknown object type for aac " << audio_object_type;
+
165  return false;
+
166  }
+
167  } break;
+
168  case kCodecAC3:
+
169  audio_type = FOURCC_zac3;
+
170  break;
+
171  case kCodecEAC3:
+
172  audio_type = FOURCC_zec3;
+
173  break;
+
174  default:
+
175  LOG(ERROR) << "Codec " << codec << " is not supported in encrypted TS.";
+
176  return false;
+
177  }
+
178 
+
179  DCHECK_NE(audio_type, FOURCC_NULL);
+
180  audio_setup_information->AppendInt(audio_type);
+
181  // Priming. Since no info from encoder, set it to 0x0000.
+
182  audio_setup_information->AppendInt(static_cast<uint16_t>(0x0000));
+
183  // Version is always 0x01.
+
184  audio_setup_information->AppendInt(static_cast<uint8_t>(0x01));
+
185  audio_setup_information->AppendInt(
+
186  static_cast<uint8_t>(audio_specific_config_size));
+
187  audio_setup_information->AppendArray(audio_specific_config,
+
188  audio_specific_config_size);
+
189  return true;
+
190 }
+
191 
+
192 bool WriteRegistrationDescriptorForEncryptedAudio(Codec codec,
+
193  const uint8_t* setup_data,
+
194  size_t setup_data_size,
+
195  BufferWriter* output) {
+
196  const uint8_t kRegistrationDescriptor = 5;
+
197  BufferWriter audio_setup_information;
+
198  if (!WriteAudioSetupInformation(codec, setup_data, setup_data_size,
+
199  &audio_setup_information)) {
+
200  return false;
+
201  }
+
202 
+
203  const size_t registration_descriptor_size =
+
204  audio_setup_information.Size() + sizeof(FOURCC_apad);
+
205  if (registration_descriptor_size > std::numeric_limits<uint8_t>::max()) {
+
206  LOG(ERROR) << "Audio setup data of size: " << setup_data_size
+
207  << " will not fit in the descriptor.";
+
208  return false;
+
209  }
+
210 
+
211  output->AppendInt(kRegistrationDescriptor);
+
212  output->AppendInt(static_cast<uint8_t>(registration_descriptor_size));
+
213  output->AppendInt(FOURCC_apad);
+
214  output->AppendBuffer(audio_setup_information);
+
215  return true;
+
216 }
+
217 
+
218 void WritePmtWithParameters(uint8_t stream_type,
+
219  int version,
+
220  int current_next_indicator,
+
221  const uint8_t* descriptors,
+
222  size_t descriptors_size,
+
223  BufferWriter* pmt) {
+
224  DCHECK(current_next_indicator == kCurrent || current_next_indicator == kNext);
+
225  // Body starting from program number.
+
226  BufferWriter pmt_body;
+
227  pmt_body.AppendInt(static_cast<uint8_t>(0x00));
+
228  pmt_body.AppendInt(kProgramNumber);
+
229  // resevered bits then version and current_next_indicator.
+
230  pmt_body.AppendInt(
+
231  static_cast<uint8_t>(0xC0 |
+
232  static_cast<uint8_t>(version) << 1 |
+
233  static_cast<uint8_t>(current_next_indicator)));
+
234  // section number.
+
235  pmt_body.AppendInt(static_cast<uint8_t>(0x00));
+
236  // last section number.
+
237  pmt_body.AppendInt(static_cast<uint8_t>(0x00));
+
238  // first 3 bits reserved. Rest is unused bits for PCR PID.
+
239  pmt_body.AppendInt(static_cast<uint8_t>(0xE0));
+
240  pmt_body.AppendInt(ProgramMapTableWriter::kElementaryPid);
+
241  // First 4 bits are reserved. Next 12 bits is program_info_length which is 0.
+
242  pmt_body.AppendInt(static_cast<uint8_t>(0xF0));
+
243  pmt_body.AppendInt(static_cast<uint8_t>(0x00));
+
244 
+
245  pmt_body.AppendInt(stream_type);
+
246  // 3 reserved bits followed by 13 bit elementary_PID.
+
247  pmt_body.AppendInt(static_cast<uint8_t>(0xE0));
+
248  pmt_body.AppendInt(ProgramMapTableWriter::kElementaryPid);
+
249 
+
250  // 4 reserved bits followed by ES_info_length.
+
251  pmt_body.AppendInt(static_cast<uint16_t>(0xF000 | descriptors_size));
+
252  if (descriptors_size > 0) {
+
253  DCHECK(descriptors);
+
254  pmt_body.AppendArray(descriptors, descriptors_size);
+
255  }
+
256 
+
257  pmt->Clear();
+
258  // Pointer field is not really part of the PMT but it's there so that an extra
+
259  // buffer isn't required to prepend the 0x00 byte.
+
260  const uint8_t kPointerField = 0;
+
261  pmt->AppendInt(kPointerField);
+
262  pmt->AppendInt(kProgramMapTableId);
+
263  // First four bits must be '1011'. +4 for CRC.
+
264  pmt->AppendInt(static_cast<uint16_t>(0xB000 | (pmt_body.Size() + 4)));
+
265  pmt->AppendBuffer(pmt_body);
+
266 
+
267  // Don't include the pointer field.
+
268  const uint32_t crc = Crc32Mpeg2(pmt->Buffer() + 1, pmt->Size() - 1);
+
269  pmt->AppendInt(crc);
+
270 }
+
271 
+
272 } // namespace
+
273 
+
274 ProgramMapTableWriter::ProgramMapTableWriter(Codec codec) : codec_(codec) {}
+
275 
+ +
277  if (encrypted_pmt_.Size() == 0) {
+
278  TsStreamType stream_type;
+
279  switch (codec_) {
+
280  case kCodecH264:
+
281  stream_type = TsStreamType::kEncryptedAvc;
+
282  break;
+
283  case kCodecAAC:
+
284  stream_type = TsStreamType::kEncryptedAdtsAac;
+
285  break;
+
286  case kCodecAC3:
+
287  stream_type = TsStreamType::kEncryptedAc3;
+
288  break;
+
289  case kCodecEAC3:
+
290  stream_type = TsStreamType::kEncryptedEac3;
+
291  break;
+
292  default:
+
293  LOG(ERROR) << "Codec " << codec_ << " is not supported in TS yet.";
+
294  return false;
+
295  }
+
296 
+
297  BufferWriter descriptors;
+
298  if (!WriteDescriptors(&descriptors))
+
299  return false;
+
300 
+
301  const bool has_clear_lead = clear_pmt_.Size() > 0;
+
302  WritePmtWithParameters(static_cast<uint8_t>(stream_type),
+
303  has_clear_lead ? kVersion1 : kVersion0, kCurrent,
+
304  descriptors.Buffer(), descriptors.Size(),
+
305  &encrypted_pmt_);
+
306  DCHECK_NE(encrypted_pmt_.Size(), 0u);
+
307  }
+
308  WritePmtToBuffer(encrypted_pmt_.Buffer(), encrypted_pmt_.Size(),
+
309  &continuity_counter_, writer);
+
310  return true;
311 }
312 
-
313 } // namespace
-
314 
-
315 ProgramMapTableWriter::ProgramMapTableWriter() {}
-
316 ProgramMapTableWriter::~ProgramMapTableWriter() {}
-
317 
-
318 H264ProgramMapTableWriter::H264ProgramMapTableWriter(
-
319  ContinuityCounter* continuity_counter)
-
320  : continuity_counter_(continuity_counter) {
-
321  DCHECK(continuity_counter);
-
322 }
-
323 
-
324 H264ProgramMapTableWriter::~H264ProgramMapTableWriter() {}
-
325 
- -
327  WritePmtWithParameters(
-
328  kStreamTypeEncryptedH264, has_clear_lead_ ? kVersion1 : kVersion0,
-
329  kCurrent, kPrivateDataIndicatorDescriptorEncryptedH264,
-
330  arraysize(kPrivateDataIndicatorDescriptorEncryptedH264),
-
331  continuity_counter_, writer);
-
332  return true;
-
333 }
-
334 
- -
336  has_clear_lead_ = true;
-
337  WritePmtToBuffer(kPmtH264, arraysize(kPmtH264), continuity_counter_, writer);
-
338  // Cannot insert PMT for following encrypted segments because
-
339  // some players consider encrypted segments as "zavc" codec which is different
-
340  // from "avc1" codec, which causes problems.
-
341  return true;
-
342 }
-
343 
-
344 AacProgramMapTableWriter::AacProgramMapTableWriter(
-
345  const std::vector<uint8_t>& aac_audio_specific_config,
-
346  ContinuityCounter* continuity_counter)
-
347  : aac_audio_specific_config_(aac_audio_specific_config),
-
348  continuity_counter_(continuity_counter) {
-
349  DCHECK(!aac_audio_specific_config.empty());
-
350  DCHECK(continuity_counter_);
-
351 }
-
352 
-
353 AacProgramMapTableWriter::~AacProgramMapTableWriter() {}
-
354 
-
355 // TODO(rkuroiwa): Cache the PMT for encrypted segments, it doesn't need to
-
356 // be recalculated.
- -
358  // Version 1 and current.
-
359  return EncryptedSegmentPmtWithParameters(
-
360  has_clear_lead_ ? kVersion1 : kVersion0, kCurrent, writer);
-
361 }
-
362 
- -
364  has_clear_lead_ = true;
-
365  WritePmtToBuffer(kPmtAac, arraysize(kPmtAac), continuity_counter_, writer);
-
366  return true;
+ +
314  if (clear_pmt_.Size() == 0) {
+
315  TsStreamType stream_type;
+
316  switch (codec_) {
+
317  case kCodecH264:
+
318  stream_type = TsStreamType::kAvc;
+
319  break;
+
320  case kCodecAAC:
+
321  stream_type = TsStreamType::kAdtsAac;
+
322  break;
+
323  case kCodecAC3:
+
324  stream_type = TsStreamType::kAc3;
+
325  break;
+
326  case kCodecEAC3:
+
327  stream_type = TsStreamType::kEac3;
+
328  break;
+
329  default:
+
330  LOG(ERROR) << "Codec " << codec_ << " is not supported in TS yet.";
+
331  return false;
+
332  }
+
333 
+
334  WritePmtWithParameters(static_cast<uint8_t>(stream_type), kVersion0,
+
335  kCurrent, nullptr, 0, &clear_pmt_);
+
336  DCHECK_NE(clear_pmt_.Size(), 0u);
+
337  }
+
338  WritePmtToBuffer(clear_pmt_.Buffer(), clear_pmt_.Size(), &continuity_counter_,
+
339  writer);
+
340  return true;
+
341 }
+
342 
+
343 VideoProgramMapTableWriter::VideoProgramMapTableWriter(Codec codec)
+
344  : ProgramMapTableWriter(codec) {}
+
345 
+
346 bool VideoProgramMapTableWriter::WriteDescriptors(
+
347  BufferWriter* descriptors) const {
+
348  FourCC fourcc;
+
349  switch (codec()) {
+
350  case kCodecH264:
+
351  fourcc = FOURCC_zavc;
+
352  break;
+
353  default:
+
354  LOG(ERROR) << "Codec " << codec() << " is not supported in TS yet.";
+
355  return false;
+
356  }
+
357  WritePrivateDataIndicatorDescriptor(fourcc, descriptors);
+
358  return true;
+
359 }
+
360 
+
361 AudioProgramMapTableWriter::AudioProgramMapTableWriter(
+
362  Codec codec,
+
363  const std::vector<uint8_t>& audio_specific_config)
+
364  : ProgramMapTableWriter(codec),
+
365  audio_specific_config_(audio_specific_config) {
+
366  DCHECK(!audio_specific_config.empty());
367 }
368 
-
369 bool AacProgramMapTableWriter::EncryptedSegmentPmtWithParameters(
-
370  int version,
-
371  int current_next_indicator,
-
372  BufferWriter* writer) {
-
373  // -12 because there are 12 bytes between 'descriptor_length' in
-
374  // registration_descriptor and 'setup_data_length' in audio_setup_information.
-
375  if (aac_audio_specific_config_.size() >
-
376  std::numeric_limits<uint8_t>::max() - 12U) {
-
377  LOG(ERROR) << "AACAudioSpecificConfig of size: "
-
378  << aac_audio_specific_config_.size()
-
379  << " will not fit in the descriptor.";
-
380  return false;
-
381  }
-
382  BufferWriter descriptors;
-
383  WritePrivateDataIndicatorDescriptor(FOURCC_aacd, &descriptors);
-
384  if (!WriteRegistrationDescriptorForEncryptedAudio(
-
385  aac_audio_specific_config_.data(), aac_audio_specific_config_.size(),
-
386  &descriptors)) {
-
387  return false;
-
388  }
-
389 
-
390  WritePmtWithParameters(
-
391  kStreamTypeEncryptedAdtsAac, version, current_next_indicator,
-
392  descriptors.Buffer(), descriptors.Size(), continuity_counter_, writer);
-
393  return true;
-
394 }
-
395 
-
396 } // namespace mp2t
-
397 } // namespace media
-
398 } // namespace shaka
-
bool ClearSegmentPmt(BufferWriter *writer) override
Writes TS packets with PMT for clear segments.
-
bool EncryptedSegmentPmt(BufferWriter *writer) override
Writes TS packets with PMT for encrypted segments.
+
369 bool AudioProgramMapTableWriter::WriteDescriptors(
+
370  BufferWriter* descriptors) const {
+
371  FourCC fourcc;
+
372  switch (codec()) {
+
373  case kCodecAAC:
+
374  fourcc = FOURCC_aacd;
+
375  break;
+
376  case kCodecAC3:
+
377  fourcc = FOURCC_ac3d;
+
378  break;
+
379  case kCodecEAC3:
+
380  fourcc = FOURCC_ec3d;
+
381  break;
+
382  default:
+
383  LOG(ERROR) << "Codec " << codec() << " is not supported in TS yet.";
+
384  return false;
+
385  }
+
386  WritePrivateDataIndicatorDescriptor(fourcc, descriptors);
+
387 
+
388  // NOTE: There are two specifications of carrying AC-3 bit stream in MPEG-2
+
389  // transport stream (ISO/IEC 13818-1):
+
390  // System A used by ATSC (TS 102 366 Digital Audio Compression Standard)
+
391  // stream_type: 0x81
+
392  // system_id: 0xBD (private_stream_1)
+
393  // Requires Registration_descriptor, AC-3_audio_stream_descriptor.
+
394  // Optional ISO_639_language_code descriptor.
+
395  // System B used by DVB (TS 101 154 DVB specification for ... based on the
+
396  // MPEG-2 Transport Stream)
+
397  // stream_type: 0x06 (private data)
+
398  // stream_id: 0xBD (private_stream_1)
+
399  // Requires AC-3_descriptor (not the same as AC-3_audio_stream_descriptor
+
400  // in ATSC)
+
401  // Optional ISO_639_language_code descriptor.
+
402  // We follow "System A" but not strictly as we do not include Registration
+
403  // descriptor and AC-3_audio_stream_descriptor right now.
+
404 
+
405  return WriteRegistrationDescriptorForEncryptedAudio(
+
406  codec(), audio_specific_config_.data(), audio_specific_config_.size(),
+
407  descriptors);
+
408 }
+
409 
+
410 } // namespace mp2t
+
411 } // namespace media
+
412 } // namespace shaka
+
const uint8_t * Buffer() const
Definition: buffer_writer.h:60
- -
bool ClearSegmentPmt(BufferWriter *writer) override
Writes TS packets with PMT for clear segments.
-
bool EncryptedSegmentPmt(BufferWriter *writer) override
Writes TS packets with PMT for encrypted segments.
+
virtual bool ClearSegmentPmt(BufferWriter *writer)
Writes TS packets with PMT for clear segments.
+
virtual bool EncryptedSegmentPmt(BufferWriter *writer)
Writes TS packets with PMT for encrypted segments.
+
Puts PMT into TS packets and writes them to buffer.
diff --git a/docs/d2/d4c/nal__unit__to__byte__stream__converter_8cc_source.html b/docs/d2/d4c/nal__unit__to__byte__stream__converter_8cc_source.html index 85578f9a07..55a7211d00 100644 --- a/docs/d2/d4c/nal__unit__to__byte__stream__converter_8cc_source.html +++ b/docs/d2/d4c/nal__unit__to__byte__stream__converter_8cc_source.html @@ -486,7 +486,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d4d/file_8h_source.html b/docs/d2/d4d/file_8h_source.html index ef5bb1bea5..1fea41b515 100644 --- a/docs/d2/d4d/file_8h_source.html +++ b/docs/d2/d4d/file_8h_source.html @@ -214,7 +214,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d4f/structshaka_1_1Element-members.html b/docs/d2/d4f/structshaka_1_1Element-members.html index 9de7ddf5ef..5b543b96aa 100644 --- a/docs/d2/d4f/structshaka_1_1Element-members.html +++ b/docs/d2/d4f/structshaka_1_1Element-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d51/classshaka_1_1MockMpdNotifier-members.html b/docs/d2/d51/classshaka_1_1MockMpdNotifier-members.html index 75d8842618..e849acb4d9 100644 --- a/docs/d2/d51/classshaka_1_1MockMpdNotifier-members.html +++ b/docs/d2/d51/classshaka_1_1MockMpdNotifier-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d57/master__playlist_8h_source.html b/docs/d2/d57/master__playlist_8h_source.html index 09272e7a6b..d889e52413 100644 --- a/docs/d2/d57/master__playlist_8h_source.html +++ b/docs/d2/d57/master__playlist_8h_source.html @@ -133,14 +133,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
59 
60 #endif // PACKAGER_HLS_BASE_MASTER_PLAYLIST_H_
-
virtual bool WriteMasterPlaylist(const std::string &base_url, const std::string &output_dir)
-
MasterPlaylist(const std::string &file_name)
-
virtual void AddMediaPlaylist(MediaPlaylist *media_playlist)
+
virtual bool WriteMasterPlaylist(const std::string &base_url, const std::string &output_dir)
+
MasterPlaylist(const std::string &file_name)
+
virtual void AddMediaPlaylist(MediaPlaylist *media_playlist)
Methods are virtual for mocking.
diff --git a/docs/d2/d59/structshaka_1_1media_1_1H264SliceHeader.html b/docs/d2/d59/structshaka_1_1media_1_1H264SliceHeader.html index 4298097a9c..3c21d45c99 100644 --- a/docs/d2/d59/structshaka_1_1media_1_1H264SliceHeader.html +++ b/docs/d2/d59/structshaka_1_1media_1_1H264SliceHeader.html @@ -264,7 +264,7 @@ int slice_beta_offset_div2 diff --git a/docs/d2/d5b/classshaka_1_1media_1_1KeySource-members.html b/docs/d2/d5b/classshaka_1_1media_1_1KeySource-members.html index 152bd4ffa9..a8f87cf9ba 100644 --- a/docs/d2/d5b/classshaka_1_1media_1_1KeySource-members.html +++ b/docs/d2/d5b/classshaka_1_1media_1_1KeySource-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d5c/classshaka_1_1SimpleMpdNotifier-members.html b/docs/d2/d5c/classshaka_1_1SimpleMpdNotifier-members.html index 44a106a1e3..a43989ccec 100644 --- a/docs/d2/d5c/classshaka_1_1SimpleMpdNotifier-members.html +++ b/docs/d2/d5c/classshaka_1_1SimpleMpdNotifier-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d61/structshaka_1_1media_1_1H264ModificationOfPicNum-members.html b/docs/d2/d61/structshaka_1_1media_1_1H264ModificationOfPicNum-members.html index 641599d238..2b56bbbbaa 100644 --- a/docs/d2/d61/structshaka_1_1media_1_1H264ModificationOfPicNum-members.html +++ b/docs/d2/d61/structshaka_1_1media_1_1H264ModificationOfPicNum-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d62/simple__mpd__notifier_8h_source.html b/docs/d2/d62/simple__mpd__notifier_8h_source.html index facda662ef..a2230092ff 100644 --- a/docs/d2/d62/simple__mpd__notifier_8h_source.html +++ b/docs/d2/d62/simple__mpd__notifier_8h_source.html @@ -182,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d62/structshaka_1_1media_1_1mp4_1_1Movie-members.html b/docs/d2/d62/structshaka_1_1media_1_1mp4_1_1Movie-members.html index c09c2a4eac..ae5a3bc6ba 100644 --- a/docs/d2/d62/structshaka_1_1media_1_1mp4_1_1Movie-members.html +++ b/docs/d2/d62/structshaka_1_1media_1_1mp4_1_1Movie-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d6a/classshaka_1_1media_1_1AesCryptor-members.html b/docs/d2/d6a/classshaka_1_1media_1_1AesCryptor-members.html index c2fa6b6f0b..54599f31a5 100644 --- a/docs/d2/d6a/classshaka_1_1media_1_1AesCryptor-members.html +++ b/docs/d2/d6a/classshaka_1_1media_1_1AesCryptor-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d6f/classBandwidthEstimator.html b/docs/d2/d6f/classBandwidthEstimator.html index b23b7559f3..5aaac6ddb0 100644 --- a/docs/d2/d6f/classBandwidthEstimator.html +++ b/docs/d2/d6f/classBandwidthEstimator.html @@ -151,7 +151,7 @@ static const int kUseAllBl diff --git a/docs/d2/d70/structshaka_1_1media_1_1mp4_1_1SchemeInfo.html b/docs/d2/d70/structshaka_1_1media_1_1mp4_1_1SchemeInfo.html index db0eee21d1..8faceae899 100644 --- a/docs/d2/d70/structshaka_1_1media_1_1mp4_1_1SchemeInfo.html +++ b/docs/d2/d70/structshaka_1_1media_1_1mp4_1_1SchemeInfo.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d2/d71/classshaka_1_1media_1_1CombinedMuxerListener-members.html b/docs/d2/d71/classshaka_1_1media_1_1CombinedMuxerListener-members.html index 0e832df3d3..0bd71a7796 100644 --- a/docs/d2/d71/classshaka_1_1media_1_1CombinedMuxerListener-members.html +++ b/docs/d2/d71/classshaka_1_1media_1_1CombinedMuxerListener-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d7b/classshaka_1_1DashIopMpdNotifier-members.html b/docs/d2/d7b/classshaka_1_1DashIopMpdNotifier-members.html index 59f6dc2e06..689105edab 100644 --- a/docs/d2/d7b/classshaka_1_1DashIopMpdNotifier-members.html +++ b/docs/d2/d7b/classshaka_1_1DashIopMpdNotifier-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d7b/simple__mpd__notifier_8cc_source.html b/docs/d2/d7b/simple__mpd__notifier_8cc_source.html index 776f337044..cfa3df68ed 100644 --- a/docs/d2/d7b/simple__mpd__notifier_8cc_source.html +++ b/docs/d2/d7b/simple__mpd__notifier_8cc_source.html @@ -233,7 +233,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d7b/structshaka_1_1StreamDescriptor.html b/docs/d2/d7b/structshaka_1_1StreamDescriptor.html index ba9e3e8a9c..9655ec4e43 100644 --- a/docs/d2/d7b/structshaka_1_1StreamDescriptor.html +++ b/docs/d2/d7b/structshaka_1_1StreamDescriptor.html @@ -135,7 +135,7 @@ std::string 

Detailed Description

Defines a single input/output stream.

-

Definition at line 65 of file packager.h.

+

Definition at line 69 of file packager.h.

Member Data Documentation

@@ -163,7 +163,7 @@ std::string  @@ -178,7 +178,7 @@ std::string  @@ -193,7 +193,7 @@ std::string  @@ -208,7 +208,7 @@ std::string  @@ -223,7 +223,7 @@ std::string  @@ -238,7 +238,7 @@ std::string  @@ -253,7 +253,7 @@ std::string  @@ -268,7 +268,7 @@ std::string  @@ -283,7 +283,7 @@ std::string  @@ -298,7 +298,7 @@ std::string  @@ -308,7 +308,7 @@ std::string  diff --git a/docs/d2/d7e/aac__audio__specific__config_8h_source.html b/docs/d2/d7e/aac__audio__specific__config_8h_source.html index d5082aafbc..d6c1ffbc21 100644 --- a/docs/d2/d7e/aac__audio__specific__config_8h_source.html +++ b/docs/d2/d7e/aac__audio__specific__config_8h_source.html @@ -215,7 +215,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d7f/structshaka_1_1media_1_1mp4_1_1CuePayloadBox.html b/docs/d2/d7f/structshaka_1_1media_1_1mp4_1_1CuePayloadBox.html index a551f358f6..f4adb955e6 100644 --- a/docs/d2/d7f/structshaka_1_1media_1_1mp4_1_1CuePayloadBox.html +++ b/docs/d2/d7f/structshaka_1_1media_1_1mp4_1_1CuePayloadBox.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d2/d82/structshaka_1_1BufferCallbackParams-members.html b/docs/d2/d82/structshaka_1_1BufferCallbackParams-members.html index b1a16134a7..8cc23ce69c 100644 --- a/docs/d2/d82/structshaka_1_1BufferCallbackParams-members.html +++ b/docs/d2/d82/structshaka_1_1BufferCallbackParams-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d8a/hls__notify__muxer__listener_8h_source.html b/docs/d2/d8a/hls__notify__muxer__listener_8h_source.html index 5a687af788..a3273aa47c 100644 --- a/docs/d2/d8a/hls__notify__muxer__listener_8h_source.html +++ b/docs/d2/d8a/hls__notify__muxer__listener_8h_source.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d91/structshaka_1_1media_1_1mp4_1_1CuePayloadBox-members.html b/docs/d2/d91/structshaka_1_1media_1_1mp4_1_1CuePayloadBox-members.html index 579a6c2b38..2a928caf5e 100644 --- a/docs/d2/d91/structshaka_1_1media_1_1mp4_1_1CuePayloadBox-members.html +++ b/docs/d2/d91/structshaka_1_1media_1_1mp4_1_1CuePayloadBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d92/box__reader_8h_source.html b/docs/d2/d92/box__reader_8h_source.html index 194a4be960..ab7eeabf28 100644 --- a/docs/d2/d92/box__reader_8h_source.html +++ b/docs/d2/d92/box__reader_8h_source.html @@ -246,7 +246,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d93/classshaka_1_1media_1_1mp2t_1_1PesPacket.html b/docs/d2/d93/classshaka_1_1media_1_1mp2t_1_1PesPacket.html index 42f0c2721a..e1a391ca68 100644 --- a/docs/d2/d93/classshaka_1_1media_1_1mp2t_1_1PesPacket.html +++ b/docs/d2/d93/classshaka_1_1media_1_1mp2t_1_1PesPacket.html @@ -387,7 +387,7 @@ const std::vector< uint8_t > &  diff --git a/docs/d2/d9d/structshaka_1_1FileCloser-members.html b/docs/d2/d9d/structshaka_1_1FileCloser-members.html index 377a6f0509..0be45042ea 100644 --- a/docs/d2/d9d/structshaka_1_1FileCloser-members.html +++ b/docs/d2/d9d/structshaka_1_1FileCloser-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/da0/classshaka_1_1media_1_1TrickPlayHandler-members.html b/docs/d2/da0/classshaka_1_1media_1_1TrickPlayHandler-members.html index 342f7170d3..6cb638a61b 100644 --- a/docs/d2/da0/classshaka_1_1media_1_1TrickPlayHandler-members.html +++ b/docs/d2/da0/classshaka_1_1media_1_1TrickPlayHandler-members.html @@ -95,9 +95,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - + - + @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline
Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected
DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected
DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected
DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected
DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected
DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected
DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected
DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected
DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected
diff --git a/docs/d2/da6/threaded__io__file_8h_source.html b/docs/d2/da6/threaded__io__file_8h_source.html index 43000ac27a..27905d1665 100644 --- a/docs/d2/da6/threaded__io__file_8h_source.html +++ b/docs/d2/da6/threaded__io__file_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/da8/mp4_2segmenter_8cc_source.html b/docs/d2/da8/mp4_2segmenter_8cc_source.html index 35b8506975..b582277209 100644 --- a/docs/d2/da8/mp4_2segmenter_8cc_source.html +++ b/docs/d2/da8/mp4_2segmenter_8cc_source.html @@ -385,7 +385,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
296 } // namespace shaka
uint32_t HeaderSize() const final
Definition: box.cc:75
- +
Status AddSample(const MediaSample &sample)
Definition: segmenter.cc:159
virtual Status FinalizeSegment(uint64_t start_timestamp, uint64_t duration_timestamp, bool is_subsegment)=0
Finalize the (sub)segment.
Definition: segmenter.cc:195
@@ -408,7 +408,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/da9/classshaka_1_1media_1_1BufferWriter-members.html b/docs/d2/da9/classshaka_1_1media_1_1BufferWriter-members.html index 706b6768b3..4519372688 100644 --- a/docs/d2/da9/classshaka_1_1media_1_1BufferWriter-members.html +++ b/docs/d2/da9/classshaka_1_1media_1_1BufferWriter-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dae/classshaka_1_1MockAdaptationSet-members.html b/docs/d2/dae/classshaka_1_1MockAdaptationSet-members.html index 3823b8d6c4..532fe60aaf 100644 --- a/docs/d2/dae/classshaka_1_1MockAdaptationSet-members.html +++ b/docs/d2/dae/classshaka_1_1MockAdaptationSet-members.html @@ -126,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dae/webm__muxer_8cc_source.html b/docs/d2/dae/webm__muxer_8cc_source.html index 8caffa0a2c..96645a5182 100644 --- a/docs/d2/dae/webm__muxer_8cc_source.html +++ b/docs/d2/dae/webm__muxer_8cc_source.html @@ -226,7 +226,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/db1/master__playlist_8cc_source.html b/docs/d2/db1/master__playlist_8cc_source.html index 885db8cdfd..42ac293c53 100644 --- a/docs/d2/db1/master__playlist_8cc_source.html +++ b/docs/d2/db1/master__playlist_8cc_source.html @@ -109,166 +109,172 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
20 
21 namespace {
22 
-
23 void AppendStreamInfoTag(uint64_t bitrate,
-
24  const std::string& codecs,
-
25  uint32_t width,
-
26  uint32_t height,
-
27  const std::string* audio_group_id,
-
28  const std::string& base_url,
-
29  const std::string& file_name,
-
30  std::string* out) {
-
31  DCHECK(out);
-
32  base::StringAppendF(out, "#EXT-X-STREAM-INF:");
-
33  base::StringAppendF(out, "BANDWIDTH=%" PRIu64, bitrate);
-
34  base::StringAppendF(out, ",CODECS=\"%s\"", codecs.c_str());
-
35  base::StringAppendF(out, ",RESOLUTION=%" PRIu32 "x%" PRIu32, width, height);
-
36 
-
37  if (audio_group_id) {
-
38  base::StringAppendF(out, ",AUDIO=\"%s\"", audio_group_id->c_str());
-
39  }
-
40 
-
41  base::StringAppendF(out, "\n%s%s\n", base_url.c_str(), file_name.c_str());
-
42 }
-
43 } // namespace
-
44 
-
45 MasterPlaylist::MasterPlaylist(const std::string& file_name)
-
46  : file_name_(file_name) {}
-
47 MasterPlaylist::~MasterPlaylist() {}
-
48 
- -
50  DCHECK(media_playlist);
-
51  switch (media_playlist->stream_type()) {
-
52  case MediaPlaylist::MediaPlaylistStreamType::kPlayListAudio: {
-
53  const std::string& group_id = media_playlist->group_id();
-
54  audio_playlist_groups_[group_id].push_back(media_playlist);
-
55  break;
-
56  }
-
57  case MediaPlaylist::MediaPlaylistStreamType::kPlayListVideo: {
-
58  video_playlists_.push_back(media_playlist);
-
59  break;
-
60  }
-
61  default: {
-
62  NOTIMPLEMENTED() << static_cast<int>(media_playlist->stream_type())
-
63  << " not handled.";
-
64  break;
-
65  }
-
66  }
-
67  // Sometimes we need to iterate over all playlists, so keep a collection
-
68  // of all playlists to make iterating easier.
-
69  all_playlists_.push_back(media_playlist);
-
70 }
-
71 
-
72 bool MasterPlaylist::WriteMasterPlaylist(const std::string& base_url,
-
73  const std::string& output_dir) {
-
74  // TODO(rkuroiwa): Handle audio only.
-
75  std::string audio_output;
-
76  std::string video_output;
-
77  for (const auto& group_id_audio_playlists : audio_playlist_groups_) {
-
78  const std::string& group_id = group_id_audio_playlists.first;
-
79  const std::list<const MediaPlaylist*>& audio_playlists =
-
80  group_id_audio_playlists.second;
-
81 
-
82  uint64_t max_audio_bitrate = 0;
-
83  for (const MediaPlaylist* audio_playlist : audio_playlists) {
-
84  base::StringAppendF(
-
85  &audio_output,
-
86  "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"%s\",NAME=\"%s\",",
-
87  group_id.c_str(), audio_playlist->name().c_str());
-
88  std::string language = audio_playlist->GetLanguage();
-
89  if (!language.empty()) {
-
90  base::StringAppendF(
-
91  &audio_output,
-
92  "LANGUAGE=\"%s\",",
-
93  language.c_str());
-
94  }
-
95  base::StringAppendF(
-
96  &audio_output,
-
97  "URI=\"%s\"\n",
-
98  (base_url + audio_playlist->file_name()).c_str());
-
99  const uint64_t audio_bitrate = audio_playlist->Bitrate();
-
100  if (audio_bitrate > max_audio_bitrate)
-
101  max_audio_bitrate = audio_bitrate;
-
102  }
-
103  for (const MediaPlaylist* video_playlist : video_playlists_) {
-
104  const std::string& video_codec = video_playlist->codec();
-
105  const uint64_t video_bitrate = video_playlist->Bitrate();
-
106 
-
107  // Assume all codecs are the same for same group ID.
-
108  const std::string& audio_codec = audio_playlists.front()->codec();
-
109 
-
110  uint32_t video_width;
-
111  uint32_t video_height;
-
112  CHECK(video_playlist->GetDisplayResolution(&video_width, &video_height));
-
113 
-
114  AppendStreamInfoTag(video_bitrate + max_audio_bitrate,
-
115  video_codec + "," + audio_codec,
-
116  video_width,
-
117  video_height,
-
118  &group_id,
-
119  base_url,
-
120  video_playlist->file_name(),
-
121  &video_output);
-
122  }
-
123  }
-
124 
-
125  if (audio_playlist_groups_.empty()) {
-
126  for (const MediaPlaylist* video_playlist : video_playlists_) {
-
127  const std::string& video_codec = video_playlist->codec();
-
128  const uint64_t video_bitrate = video_playlist->Bitrate();
-
129 
-
130  uint32_t video_width;
-
131  uint32_t video_height;
-
132  CHECK(video_playlist->GetDisplayResolution(&video_width, &video_height));
-
133 
-
134  AppendStreamInfoTag(video_bitrate,
-
135  video_codec,
-
136  video_width,
-
137  video_height,
-
138  nullptr,
-
139  base_url,
-
140  video_playlist->file_name(),
-
141  &video_output);
-
142  }
-
143  }
-
144 
-
145  const std::string version = GetPackagerVersion();
-
146  std::string version_line;
-
147  if (!version.empty()) {
-
148  version_line =
-
149  base::StringPrintf("## Generated with %s version %s\n",
-
150  GetPackagerProjectUrl().c_str(), version.c_str());
-
151  }
-
152 
-
153  std::string content =
-
154  "#EXTM3U\n" + version_line + audio_output + video_output;
-
155 
-
156  // Skip if the playlist is already written.
-
157  if (content == written_playlist_)
-
158  return true;
-
159 
-
160  std::string file_path =
-
161  base::FilePath::FromUTF8Unsafe(output_dir)
-
162  .Append(base::FilePath::FromUTF8Unsafe(file_name_))
-
163  .AsUTF8Unsafe();
-
164  if (!File::WriteFileAtomically(file_path.c_str(), content)) {
-
165  LOG(ERROR) << "Failed to write master playlist to: " << file_path;
-
166  return false;
-
167  }
-
168  written_playlist_ = content;
-
169  return true;
-
170 }
-
171 
-
172 } // namespace hls
-
173 } // namespace shaka
-
virtual bool WriteMasterPlaylist(const std::string &base_url, const std::string &output_dir)
-
MasterPlaylist(const std::string &file_name)
-
virtual void AddMediaPlaylist(MediaPlaylist *media_playlist)
+
23 void AppendMediaTag(const std::string& base_url,
+
24  const std::string& group_id,
+
25  const MediaPlaylist* audio_playlist,
+
26  std::string* out) {
+
27  DCHECK(audio_playlist);
+
28  DCHECK(out);
+
29 
+
30  out->append("#EXT-X-MEDIA:TYPE=AUDIO");
+
31  base::StringAppendF(out, ",URI=\"%s\"",
+
32  (base_url + audio_playlist->file_name()).c_str());
+
33  base::StringAppendF(out, ",GROUP-ID=\"%s\"", group_id.c_str());
+
34  std::string language = audio_playlist->GetLanguage();
+
35  if (!language.empty())
+
36  base::StringAppendF(out, ",LANGUAGE=\"%s\"", language.c_str());
+
37  base::StringAppendF(out, ",NAME=\"%s\"", audio_playlist->name().c_str());
+
38  base::StringAppendF(out, ",CHANNELS=\"%d\"",
+
39  audio_playlist->GetNumChannels());
+
40  out->append("\n");
+
41 }
+
42 
+
43 void AppendStreamInfoTag(uint64_t bitrate,
+
44  const std::string& codecs,
+
45  uint32_t width,
+
46  uint32_t height,
+
47  const std::string* audio_group_id,
+
48  const std::string& base_url,
+
49  const std::string& file_name,
+
50  std::string* out) {
+
51  DCHECK(out);
+
52  base::StringAppendF(out, "#EXT-X-STREAM-INF:");
+
53  base::StringAppendF(out, "BANDWIDTH=%" PRIu64, bitrate);
+
54  base::StringAppendF(out, ",CODECS=\"%s\"", codecs.c_str());
+
55  base::StringAppendF(out, ",RESOLUTION=%" PRIu32 "x%" PRIu32, width, height);
+
56 
+
57  if (audio_group_id) {
+
58  base::StringAppendF(out, ",AUDIO=\"%s\"", audio_group_id->c_str());
+
59  }
+
60 
+
61  base::StringAppendF(out, "\n%s%s\n", base_url.c_str(), file_name.c_str());
+
62 }
+
63 } // namespace
+
64 
+
65 MasterPlaylist::MasterPlaylist(const std::string& file_name)
+
66  : file_name_(file_name) {}
+
67 MasterPlaylist::~MasterPlaylist() {}
+
68 
+ +
70  DCHECK(media_playlist);
+
71  switch (media_playlist->stream_type()) {
+
72  case MediaPlaylist::MediaPlaylistStreamType::kPlayListAudio: {
+
73  const std::string& group_id = media_playlist->group_id();
+
74  audio_playlist_groups_[group_id].push_back(media_playlist);
+
75  break;
+
76  }
+
77  case MediaPlaylist::MediaPlaylistStreamType::kPlayListVideo: {
+
78  video_playlists_.push_back(media_playlist);
+
79  break;
+
80  }
+
81  default: {
+
82  NOTIMPLEMENTED() << static_cast<int>(media_playlist->stream_type())
+
83  << " not handled.";
+
84  break;
+
85  }
+
86  }
+
87  // Sometimes we need to iterate over all playlists, so keep a collection
+
88  // of all playlists to make iterating easier.
+
89  all_playlists_.push_back(media_playlist);
+
90 }
+
91 
+
92 bool MasterPlaylist::WriteMasterPlaylist(const std::string& base_url,
+
93  const std::string& output_dir) {
+
94  // TODO(rkuroiwa): Handle audio only.
+
95  std::string audio_output;
+
96  std::string video_output;
+
97  for (const auto& group_id_audio_playlists : audio_playlist_groups_) {
+
98  const std::string& group_id = group_id_audio_playlists.first;
+
99  const std::list<const MediaPlaylist*>& audio_playlists =
+
100  group_id_audio_playlists.second;
+
101 
+
102  uint64_t max_audio_bitrate = 0;
+
103  for (const MediaPlaylist* audio_playlist : audio_playlists) {
+
104  AppendMediaTag(base_url, group_id, audio_playlist, &audio_output);
+
105  const uint64_t audio_bitrate = audio_playlist->Bitrate();
+
106  if (audio_bitrate > max_audio_bitrate)
+
107  max_audio_bitrate = audio_bitrate;
+
108  }
+
109  for (const MediaPlaylist* video_playlist : video_playlists_) {
+
110  const std::string& video_codec = video_playlist->codec();
+
111  const uint64_t video_bitrate = video_playlist->Bitrate();
+
112 
+
113  // Assume all codecs are the same for same group ID.
+
114  const std::string& audio_codec = audio_playlists.front()->codec();
+
115 
+
116  uint32_t video_width;
+
117  uint32_t video_height;
+
118  CHECK(video_playlist->GetDisplayResolution(&video_width, &video_height));
+
119 
+
120  AppendStreamInfoTag(video_bitrate + max_audio_bitrate,
+
121  video_codec + "," + audio_codec,
+
122  video_width,
+
123  video_height,
+
124  &group_id,
+
125  base_url,
+
126  video_playlist->file_name(),
+
127  &video_output);
+
128  }
+
129  }
+
130 
+
131  if (audio_playlist_groups_.empty()) {
+
132  for (const MediaPlaylist* video_playlist : video_playlists_) {
+
133  const std::string& video_codec = video_playlist->codec();
+
134  const uint64_t video_bitrate = video_playlist->Bitrate();
+
135 
+
136  uint32_t video_width;
+
137  uint32_t video_height;
+
138  CHECK(video_playlist->GetDisplayResolution(&video_width, &video_height));
+
139 
+
140  AppendStreamInfoTag(video_bitrate,
+
141  video_codec,
+
142  video_width,
+
143  video_height,
+
144  nullptr,
+
145  base_url,
+
146  video_playlist->file_name(),
+
147  &video_output);
+
148  }
+
149  }
+
150 
+
151  const std::string version = GetPackagerVersion();
+
152  std::string version_line;
+
153  if (!version.empty()) {
+
154  version_line =
+
155  base::StringPrintf("## Generated with %s version %s\n",
+
156  GetPackagerProjectUrl().c_str(), version.c_str());
+
157  }
+
158 
+
159  std::string content =
+
160  "#EXTM3U\n" + version_line + audio_output + video_output;
+
161 
+
162  // Skip if the playlist is already written.
+
163  if (content == written_playlist_)
+
164  return true;
+
165 
+
166  std::string file_path =
+
167  base::FilePath::FromUTF8Unsafe(output_dir)
+
168  .Append(base::FilePath::FromUTF8Unsafe(file_name_))
+
169  .AsUTF8Unsafe();
+
170  if (!File::WriteFileAtomically(file_path.c_str(), content)) {
+
171  LOG(ERROR) << "Failed to write master playlist to: " << file_path;
+
172  return false;
+
173  }
+
174  written_playlist_ = content;
+
175  return true;
+
176 }
+
177 
+
178 } // namespace hls
+
179 } // namespace shaka
+
virtual bool WriteMasterPlaylist(const std::string &base_url, const std::string &output_dir)
+
MasterPlaylist(const std::string &file_name)
+
virtual void AddMediaPlaylist(MediaPlaylist *media_playlist)
Methods are virtual for mocking.
static bool WriteFileAtomically(const char *file_name, const std::string &contents)
Definition: file.cc:262
diff --git a/docs/d2/db1/structshaka_1_1media_1_1mp4_1_1SampleToGroup-members.html b/docs/d2/db1/structshaka_1_1media_1_1mp4_1_1SampleToGroup-members.html index 55a1bfe162..6c4cb1d689 100644 --- a/docs/d2/db1/structshaka_1_1media_1_1mp4_1_1SampleToGroup-members.html +++ b/docs/d2/db1/structshaka_1_1media_1_1mp4_1_1SampleToGroup-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/db6/structshaka_1_1media_1_1mp4_1_1FileType-members.html b/docs/d2/db6/structshaka_1_1media_1_1mp4_1_1FileType-members.html index 49e9fdb92c..7b8dc66716 100644 --- a/docs/d2/db6/structshaka_1_1media_1_1mp4_1_1FileType-members.html +++ b/docs/d2/db6/structshaka_1_1media_1_1mp4_1_1FileType-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/db8/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox-members.html b/docs/d2/db8/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox-members.html index 48a1ba7b61..6ad6f521f0 100644 --- a/docs/d2/db8/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox-members.html +++ b/docs/d2/db8/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dba/classshaka_1_1media_1_1SegmentTestBase.html b/docs/d2/dba/classshaka_1_1media_1_1SegmentTestBase.html index 31a31db687..f8fc11535f 100644 --- a/docs/d2/dba/classshaka_1_1media_1_1SegmentTestBase.html +++ b/docs/d2/dba/classshaka_1_1media_1_1SegmentTestBase.html @@ -183,7 +183,7 @@ bool single_segment_ diff --git a/docs/d2/dc3/structshaka_1_1media_1_1mp4_1_1Track-members.html b/docs/d2/dc3/structshaka_1_1media_1_1mp4_1_1Track-members.html index 92846d2148..a28090a7dd 100644 --- a/docs/d2/dc3/structshaka_1_1media_1_1mp4_1_1Track-members.html +++ b/docs/d2/dc3/structshaka_1_1media_1_1mp4_1_1Track-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dc7/media__handler__test__base_8cc_source.html b/docs/d2/dc7/media__handler__test__base_8cc_source.html index 57a731635e..c00596a91e 100644 --- a/docs/d2/dc7/media__handler__test__base_8cc_source.html +++ b/docs/d2/dc7/media__handler__test__base_8cc_source.html @@ -401,7 +401,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dc7/structshaka_1_1MpdOptions-members.html b/docs/d2/dc7/structshaka_1_1MpdOptions-members.html index ee913b0ba0..f7b259f72d 100644 --- a/docs/d2/dc7/structshaka_1_1MpdOptions-members.html +++ b/docs/d2/dc7/structshaka_1_1MpdOptions-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dcd/program__map__table__writer_8h_source.html b/docs/d2/dcd/program__map__table__writer_8h_source.html index 44ad043aaa..59af4f5ad9 100644 --- a/docs/d2/dcd/program__map__table__writer_8h_source.html +++ b/docs/d2/dcd/program__map__table__writer_8h_source.html @@ -100,97 +100,99 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
11 
12 #include <vector>
13 
-
14 #include "packager/base/macros.h"
-
15 
-
16 namespace shaka {
-
17 namespace media {
+
14 #include "packager/media/base/buffer_writer.h"
+
15 // TODO(kqyang): Move codec to codec.h.
+
16 #include "packager/media/base/stream_info.h"
+
17 #include "packager/media/formats/mp2t/continuity_counter.h"
18 
-
19 class BufferWriter;
-
20 
-
21 namespace mp2t {
-
22 
-
23 class ContinuityCounter;
-
24 
+
19 namespace shaka {
+
20 namespace media {
+
21 
+
22 class BufferWriter;
+
23 
+
24 namespace mp2t {
+
25 
28  public:
- -
30  virtual ~ProgramMapTableWriter();
+
29  explicit ProgramMapTableWriter(Codec codec);
+
30  virtual ~ProgramMapTableWriter() = default;
31 
-
33  virtual bool EncryptedSegmentPmt(BufferWriter* writer) = 0;
-
34 
-
36  virtual bool ClearSegmentPmt(BufferWriter* writer) = 0;
-
37 
-
38  // The pid can be 13 bits long but 8 bits is sufficient for this library.
-
39  // This is the minimum PID that can be used for PMT.
-
40  static const uint8_t kPmtPid = 0x20;
-
41 
-
42  // This is arbitrary number that is not reserved by the spec.
-
43  static const uint8_t kElementaryPid = 0x50;
-
44 };
-
45 
- -
49  public:
-
50  explicit H264ProgramMapTableWriter(ContinuityCounter* continuity_counter);
-
51  ~H264ProgramMapTableWriter() override;
-
52 
-
53  bool EncryptedSegmentPmt(BufferWriter* writer) override;
-
54  bool ClearSegmentPmt(BufferWriter* writer) override;
-
55 
-
56  private:
-
57  ContinuityCounter* const continuity_counter_;
-
58  // Set to true if ClearLeadSegmentPmt() has been called. This determines the
-
59  // version number set in EncryptedSegmentPmt().
-
60  bool has_clear_lead_ = false;
-
61 
-
62  DISALLOW_COPY_AND_ASSIGN(H264ProgramMapTableWriter);
-
63 };
-
64 
-
65 // TODO(rkuroiwa): For now just handle AAC, we would want AudioProgramMapTable
-
66 // later when we support other audio codecs.
- -
70  public:
- -
72  const std::vector<uint8_t>& aac_audio_specific_config,
-
73  ContinuityCounter* continuity_counter);
-
74  ~AacProgramMapTableWriter() override;
-
75 
-
76  bool EncryptedSegmentPmt(BufferWriter* writer) override;
-
77  bool ClearSegmentPmt(BufferWriter* writer) override;
-
78 
-
79  private:
-
80  bool EncryptedSegmentPmtWithParameters(int version,
-
81  int current_next_indicator,
-
82  BufferWriter* writer);
-
83 
-
84  const std::vector<uint8_t> aac_audio_specific_config_;
-
85  ContinuityCounter* const continuity_counter_;
-
86  // Set to true if ClearLeadSegmentPmt() has been called. This determines the
-
87  // version number set in EncryptedSegmentPmt().
-
88  bool has_clear_lead_ = false;
+
33  // Virtual for testing.
+
34  virtual bool EncryptedSegmentPmt(BufferWriter* writer);
+
35 
+
37  // Virtual for testing.
+
38  virtual bool ClearSegmentPmt(BufferWriter* writer);
+
39 
+
40  // The pid can be 13 bits long but 8 bits is sufficient for this library.
+
41  // This is the minimum PID that can be used for PMT.
+
42  static const uint8_t kPmtPid = 0x20;
+
43 
+
44  // This is arbitrary number that is not reserved by the spec.
+
45  static const uint8_t kElementaryPid = 0x50;
+
46 
+
47  protected:
+
49  Codec codec() const { return codec_; }
+
50 
+
51  private:
+ +
53  ProgramMapTableWriter& operator=(const ProgramMapTableWriter&) = delete;
+
54 
+
55  // Writes descriptors for PMT (only needed for encrypted PMT).
+
56  virtual bool WriteDescriptors(BufferWriter* writer) const = 0;
+
57 
+
58  const Codec codec_;
+
59  ContinuityCounter continuity_counter_;
+
60  BufferWriter clear_pmt_;
+
61  BufferWriter encrypted_pmt_;
+
62 };
+
63 
+ +
66  public:
+
67  explicit VideoProgramMapTableWriter(Codec codec);
+
68  ~VideoProgramMapTableWriter() override = default;
+
69 
+
70  private:
+ + +
73  delete;
+
74 
+
75  bool WriteDescriptors(BufferWriter* writer) const override;
+
76 };
+
77 
+ +
80  public:
+ +
82  const std::vector<uint8_t>& audio_specific_config);
+
83  ~AudioProgramMapTableWriter() override = default;
+
84 
+
85  private:
+ + +
88  delete;
89 
-
90  DISALLOW_COPY_AND_ASSIGN(AacProgramMapTableWriter);
-
91 };
+
90  // Writers descriptors for PMT (only needed for encrypted PMT).
+
91  bool WriteDescriptors(BufferWriter* descriptors) const override;
92 
-
93 } // namespace mp2t
-
94 } // namespace media
-
95 } // namespace shaka
-
96 
-
97 #endif // PACKAGER_MEDIA_FORMATS_MP2T_PROGRAM_MAP_TABLE_WRITER_H_
- -
bool ClearSegmentPmt(BufferWriter *writer) override
Writes TS packets with PMT for clear segments.
-
bool EncryptedSegmentPmt(BufferWriter *writer) override
Writes TS packets with PMT for encrypted segments.
+
93  const std::vector<uint8_t> audio_specific_config_;
+
94 };
+
95 
+
96 } // namespace mp2t
+
97 } // namespace media
+
98 } // namespace shaka
+
99 
+
100 #endif // PACKAGER_MEDIA_FORMATS_MP2T_PROGRAM_MAP_TABLE_WRITER_H_
+ +
ProgramMapTableWriter for video codecs.
- -
virtual bool EncryptedSegmentPmt(BufferWriter *writer)=0
Writes TS packets with PMT for encrypted segments.
-
virtual bool ClearSegmentPmt(BufferWriter *writer)=0
Writes TS packets with PMT for clear segments.
-
bool ClearSegmentPmt(BufferWriter *writer) override
Writes TS packets with PMT for clear segments.
-
bool EncryptedSegmentPmt(BufferWriter *writer) override
Writes TS packets with PMT for encrypted segments.
- +
ProgramMapTableWriter for video codecs.
+
virtual bool ClearSegmentPmt(BufferWriter *writer)
Writes TS packets with PMT for clear segments.
+
virtual bool EncryptedSegmentPmt(BufferWriter *writer)
Writes TS packets with PMT for encrypted segments.
+
Puts PMT into TS packets and writes them to buffer.
diff --git a/docs/d2/dcd/structshaka_1_1media_1_1mp4_1_1EditList-members.html b/docs/d2/dcd/structshaka_1_1media_1_1mp4_1_1EditList-members.html index 98436995ca..009ec1c54a 100644 --- a/docs/d2/dcd/structshaka_1_1media_1_1mp4_1_1EditList-members.html +++ b/docs/d2/dcd/structshaka_1_1media_1_1mp4_1_1EditList-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dce/structshaka_1_1WidevineSigner-members.html b/docs/d2/dce/structshaka_1_1WidevineSigner-members.html index a6fb001809..44efe1d7d0 100644 --- a/docs/d2/dce/structshaka_1_1WidevineSigner-members.html +++ b/docs/d2/dce/structshaka_1_1WidevineSigner-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html b/docs/d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html index 4dbadaa1db..c9aed611e7 100644 --- a/docs/d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html +++ b/docs/d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html @@ -283,7 +283,7 @@ uint64_t duration () c diff --git a/docs/d2/dd6/mkv__writer_8h_source.html b/docs/d2/dd6/mkv__writer_8h_source.html index 29743abfb3..8b40f7b3f4 100644 --- a/docs/d2/dd6/mkv__writer_8h_source.html +++ b/docs/d2/dd6/mkv__writer_8h_source.html @@ -152,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dd7/structshaka_1_1RawKeyParams-members.html b/docs/d2/dd7/structshaka_1_1RawKeyParams-members.html index 9517d7f6f7..4d423383f7 100644 --- a/docs/d2/dd7/structshaka_1_1RawKeyParams-members.html +++ b/docs/d2/dd7/structshaka_1_1RawKeyParams-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dd8/classshaka_1_1media_1_1ChunkingHandler-members.html b/docs/d2/dd8/classshaka_1_1media_1_1ChunkingHandler-members.html index bc684a1bdf..f9eab0c011 100644 --- a/docs/d2/dd8/classshaka_1_1media_1_1ChunkingHandler-members.html +++ b/docs/d2/dd8/classshaka_1_1media_1_1ChunkingHandler-members.html @@ -97,9 +97,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); ChunkingHandler(const ChunkingParams &chunking_params) (defined in shaka::media::ChunkingHandler)shaka::media::ChunkingHandlerexplicit ChunkingHandlerTest (defined in shaka::media::ChunkingHandler)shaka::media::ChunkingHandlerfriend Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected - DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected + DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected - DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected + DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html b/docs/d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html index 680e76f4cb..35bb2f3fef 100644 --- a/docs/d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html +++ b/docs/d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html @@ -257,7 +257,7 @@ std::shared_ptr< diff --git a/docs/d2/de1/webvtt__timestamp_8h_source.html b/docs/d2/de1/webvtt__timestamp_8h_source.html index 2e3502c9aa..e771a76f99 100644 --- a/docs/d2/de1/webvtt__timestamp_8h_source.html +++ b/docs/d2/de1/webvtt__timestamp_8h_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/de3/classshaka_1_1media_1_1mp2t_1_1TsSectionPmt.html b/docs/d2/de3/classshaka_1_1media_1_1mp2t_1_1TsSectionPmt.html index 03b0c2ef7f..ddc7396a16 100644 --- a/docs/d2/de3/classshaka_1_1media_1_1mp2t_1_1TsSectionPmt.html +++ b/docs/d2/de3/classshaka_1_1media_1_1mp2t_1_1TsSectionPmt.html @@ -155,7 +155,7 @@ void Reset () override diff --git a/docs/d2/de6/packager__main_8cc_source.html b/docs/d2/de6/packager__main_8cc_source.html index fb0af31c4c..5b6eb511bd 100644 --- a/docs/d2/de6/packager__main_8cc_source.html +++ b/docs/d2/de6/packager__main_8cc_source.html @@ -96,458 +96,506 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
7 #include <gflags/gflags.h>
8 #include <iostream>
9 
-
10 #include "packager/app/crypto_flags.h"
-
11 #include "packager/app/hls_flags.h"
-
12 #include "packager/app/mpd_flags.h"
-
13 #include "packager/app/muxer_flags.h"
-
14 #include "packager/app/packager_util.h"
-
15 #include "packager/app/playready_key_encryption_flags.h"
-
16 #include "packager/app/raw_key_encryption_flags.h"
-
17 #include "packager/app/stream_descriptor.h"
-
18 #include "packager/app/vlog_flags.h"
-
19 #include "packager/app/widevine_encryption_flags.h"
-
20 #include "packager/base/command_line.h"
-
21 #include "packager/base/logging.h"
-
22 #include "packager/base/optional.h"
-
23 #include "packager/base/strings/string_number_conversions.h"
-
24 #include "packager/base/strings/string_split.h"
-
25 #include "packager/base/strings/string_util.h"
-
26 #include "packager/base/strings/stringprintf.h"
-
27 #include "packager/file/file.h"
-
28 #include "packager/packager.h"
-
29 
-
30 #if defined(OS_WIN)
-
31 #include <codecvt>
-
32 #include <functional>
-
33 #include <locale>
-
34 #endif // defined(OS_WIN)
-
35 
-
36 DEFINE_bool(dump_stream_info, false, "Dump demuxed stream info.");
-
37 DEFINE_bool(use_fake_clock_for_muxer,
-
38  false,
-
39  "Set to true to use a fake clock for muxer. With this flag set, "
-
40  "creation time and modification time in outputs are set to 0. "
-
41  "Should only be used for testing.");
-
42 DEFINE_bool(override_version,
-
43  false,
-
44  "Override packager version in the generated outputs with "
-
45  "--test_version if it is set to true. Should be used for "
-
46  "testing only.");
-
47 DEFINE_string(test_version,
-
48  "",
-
49  "Packager version for testing. Ignored if --override_version is "
-
50  "false. Should be used for testing only.");
-
51 
-
52 namespace shaka {
-
53 namespace {
-
54 
-
55 const char kUsage[] =
-
56  "%s [flags] <stream_descriptor> ...\n\n"
-
57  " stream_descriptor consists of comma separated field_name/value pairs:\n"
-
58  " field_name=value,[field_name=value,]...\n"
-
59  " Supported field names are as follows (names in parenthesis are alias):\n"
-
60  " - input (in): Required input/source media file path or network stream\n"
-
61  " URL.\n"
-
62  " - stream_selector (stream): Required field with value 'audio',\n"
-
63  " 'video', 'text', or stream number (zero based).\n"
-
64  " - output (out,init_segment): Required output file (single file) or\n"
-
65  " initialization file path (multiple file).\n"
-
66  " - segment_template (segment): Optional value which specifies the\n"
-
67  " naming pattern for the segment files, and that the stream should be\n"
-
68  " split into multiple files. Its presence should be consistent across\n"
-
69  " streams.\n"
-
70  " - bandwidth (bw): Optional value which contains a user-specified\n"
-
71  " content bit rate for the stream, in bits/sec. If specified, this\n"
-
72  " value is propagated to (HLS) EXT-X-STREAM-INF:BANDWIDTH or (DASH)\n"
-
73  " Representation@bandwidth and the $Bandwidth$ template parameter for\n"
-
74  " segment names. If not specified, the bandwidth value is estimated\n"
-
75  " from content bitrate. Note that it only affects the generated\n"
-
76  " manifests/playlists; it has no effect on the media content itself.\n"
-
77  " - language (lang): Optional value which contains a user-specified\n"
-
78  " language tag. If specified, this value overrides any language\n"
-
79  " metadata in the input stream.\n"
-
80  " - output_format (format): Optional value which specifies the format\n"
-
81  " of the output files (MP4 or WebM). If not specified, it will be\n"
-
82  " derived from the file extension of the output file.\n"
-
83  " - skip_encryption=0|1: Optional. Defaults to 0 if not specified. If\n"
-
84  " it is set to 1, no encryption of the stream will be made.\n"
-
85  " - drm_label: Optional value for custom DRM label, which defines the\n"
-
86  " encryption key applied to the stream. Typical values include AUDIO,\n"
-
87  " SD, HD, UHD1, UHD2. For raw key, it should be a label defined in\n"
-
88  " --keys. If not provided, the DRM label is derived from stream type\n"
-
89  " (video, audio), resolution, etc.\n"
-
90  " Note that it is case sensitive.\n"
-
91  " - trick_play_factor (tpf): Optional value which specifies the trick\n"
-
92  " play, a.k.a. trick mode, stream sampling rate among key frames.\n"
-
93  " If specified, the output is a trick play stream.\n"
-
94  " - hls_name: Used for HLS audio to set the NAME attribute for\n"
-
95  " EXT-X-MEDIA. Defaults to the base of the playlist name.\n"
-
96  " - hls_group_id: Used for HLS audio to set the GROUP-ID attribute for\n"
-
97  " EXT-X-MEDIA. Defaults to 'audio' if not specified.\n"
-
98  " - playlist_name: Used for HLS to name the playlist for the stream.\n"
-
99  " Usually ends with '.m3u8'. If unspecified, defaults to something of\n"
-
100  " the form 'stream_0.m3u8', 'stream_1.m3u8', 'stream_2.m3u8', etc.\n";
-
101 
-
102 // Labels for parameters in RawKey key info.
-
103 const char kDrmLabelLabel[] = "label";
-
104 const char kKeyIdLabel[] = "key_id";
-
105 const char kKeyLabel[] = "key";
-
106 
-
107 enum ExitStatus {
-
108  kSuccess = 0,
-
109  kArgumentValidationFailed,
-
110  kPackagingFailed,
-
111  kInternalError,
-
112 };
-
113 
-
114 bool GetWidevineSigner(WidevineSigner* signer) {
-
115  signer->signer_name = FLAGS_signer;
-
116  if (!FLAGS_aes_signing_key_bytes.empty()) {
-
117  signer->signing_key_type = WidevineSigner::SigningKeyType::kAes;
-
118  signer->aes.key = FLAGS_aes_signing_key_bytes;
-
119  signer->aes.iv = FLAGS_aes_signing_iv_bytes;
-
120  } else if (!FLAGS_rsa_signing_key_path.empty()) {
-
121  signer->signing_key_type = WidevineSigner::SigningKeyType::kRsa;
-
122  if (!File::ReadFileToString(FLAGS_rsa_signing_key_path.c_str(),
-
123  &signer->rsa.key)) {
-
124  LOG(ERROR) << "Failed to read from '" << FLAGS_rsa_signing_key_path
-
125  << "'.";
-
126  return false;
-
127  }
-
128  }
-
129  return true;
-
130 }
-
131 
-
132 bool GetHlsPlaylistType(const std::string& playlist_type,
-
133  HlsPlaylistType* playlist_type_enum) {
-
134  if (base::ToUpperASCII(playlist_type) == "VOD") {
-
135  *playlist_type_enum = HlsPlaylistType::kVod;
-
136  } else if (base::ToUpperASCII(playlist_type) == "LIVE") {
-
137  *playlist_type_enum = HlsPlaylistType::kLive;
-
138  } else if (base::ToUpperASCII(playlist_type) == "EVENT") {
-
139  *playlist_type_enum = HlsPlaylistType::kEvent;
-
140  } else {
-
141  LOG(ERROR) << "Unrecognized playlist type " << playlist_type;
-
142  return false;
-
143  }
-
144  return true;
-
145 }
-
146 
-
147 bool GetProtectionScheme(uint32_t* protection_scheme) {
-
148  if (FLAGS_protection_scheme == "cenc") {
-
149  *protection_scheme = EncryptionParams::kProtectionSchemeCenc;
-
150  return true;
-
151  }
-
152  if (FLAGS_protection_scheme == "cbc1") {
-
153  *protection_scheme = EncryptionParams::kProtectionSchemeCbc1;
-
154  return true;
-
155  }
-
156  if (FLAGS_protection_scheme == "cbcs") {
-
157  *protection_scheme = EncryptionParams::kProtectionSchemeCbcs;
-
158  return true;
-
159  }
-
160  if (FLAGS_protection_scheme == "cens") {
-
161  *protection_scheme = EncryptionParams::kProtectionSchemeCens;
-
162  return true;
-
163  }
-
164  LOG(ERROR) << "Unrecognized protection_scheme " << FLAGS_protection_scheme;
-
165  return false;
-
166 }
-
167 
-
168 bool ParseKeys(const std::string& keys, RawKeyParams* raw_key) {
-
169  for (const std::string& key_data : base::SplitString(
-
170  keys, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
-
171  base::StringPairs string_pairs;
-
172  base::SplitStringIntoKeyValuePairs(key_data, '=', ':', &string_pairs);
-
173 
-
174  std::map<std::string, std::string> value_map;
-
175  for (const auto& string_pair : string_pairs)
-
176  value_map[string_pair.first] = string_pair.second;
-
177  const std::string drm_label = value_map[kDrmLabelLabel];
-
178  if (raw_key->key_map.find(drm_label) != raw_key->key_map.end()) {
-
179  LOG(ERROR) << "Seeing duplicated DRM label '" << drm_label << "'.";
-
180  return false;
-
181  }
-
182  auto& key_info = raw_key->key_map[drm_label];
-
183  if (value_map[kKeyIdLabel].empty() ||
-
184  !base::HexStringToBytes(value_map[kKeyIdLabel], &key_info.key_id)) {
-
185  LOG(ERROR) << "Empty key id or invalid hex string for key id: "
-
186  << value_map[kKeyIdLabel];
-
187  return false;
-
188  }
-
189  if (value_map[kKeyLabel].empty() ||
-
190  !base::HexStringToBytes(value_map[kKeyLabel], &key_info.key)) {
-
191  LOG(ERROR) << "Empty key or invalid hex string for key: "
-
192  << value_map[kKeyLabel];
-
193  return false;
-
194  }
-
195  }
-
196  return true;
-
197 }
-
198 
-
199 bool GetRawKeyParams(RawKeyParams* raw_key) {
-
200  raw_key->iv = FLAGS_iv_bytes;
-
201  raw_key->pssh = FLAGS_pssh_bytes;
-
202  if (!FLAGS_keys.empty()) {
-
203  if (!ParseKeys(FLAGS_keys, raw_key)) {
-
204  LOG(ERROR) << "Failed to parse --keys " << FLAGS_keys;
-
205  return false;
-
206  }
-
207  } else {
-
208  // An empty StreamLabel specifies the default key info.
-
209  RawKeyParams::KeyInfo& key_info = raw_key->key_map[""];
-
210  key_info.key_id = FLAGS_key_id_bytes;
-
211  key_info.key = FLAGS_key_bytes;
-
212  }
-
213  return true;
-
214 }
-
215 
-
216 base::Optional<PackagingParams> GetPackagingParams() {
-
217  PackagingParams packaging_params;
-
218 
-
219  ChunkingParams& chunking_params = packaging_params.chunking_params;
-
220  chunking_params.segment_duration_in_seconds = FLAGS_segment_duration;
-
221  chunking_params.subsegment_duration_in_seconds = FLAGS_fragment_duration;
-
222  chunking_params.segment_sap_aligned = FLAGS_segment_sap_aligned;
-
223  chunking_params.subsegment_sap_aligned = FLAGS_fragment_sap_aligned;
-
224 
-
225  int num_key_providers = 0;
-
226  EncryptionParams& encryption_params = packaging_params.encryption_params;
-
227  if (FLAGS_enable_widevine_encryption) {
-
228  encryption_params.key_provider = KeyProvider::kWidevine;
-
229  ++num_key_providers;
-
230  }
-
231  if (FLAGS_enable_playready_encryption) {
-
232  encryption_params.key_provider = KeyProvider::kPlayready;
-
233  ++num_key_providers;
-
234  }
-
235  if (FLAGS_enable_raw_key_encryption) {
-
236  encryption_params.key_provider = KeyProvider::kRawKey;
-
237  ++num_key_providers;
-
238  }
-
239  if (num_key_providers > 1) {
-
240  LOG(ERROR) << "Only one of --enable_widevine_encryption, "
-
241  "--enable_playready_encryption, "
-
242  "--enable_raw_key_encryption can be enabled.";
-
243  return base::nullopt;
-
244  }
-
245 
-
246  if (encryption_params.key_provider != KeyProvider::kNone) {
-
247  encryption_params.clear_lead_in_seconds = FLAGS_clear_lead;
-
248  if (!GetProtectionScheme(&encryption_params.protection_scheme))
-
249  return base::nullopt;
-
250  encryption_params.crypto_period_duration_in_seconds =
-
251  FLAGS_crypto_period_duration;
-
252  encryption_params.vp9_subsample_encryption = FLAGS_vp9_subsample_encryption;
-
253  encryption_params.stream_label_func = std::bind(
-
254  &Packager::DefaultStreamLabelFunction, FLAGS_max_sd_pixels,
-
255  FLAGS_max_hd_pixels, FLAGS_max_uhd1_pixels, std::placeholders::_1);
-
256  }
-
257  switch (encryption_params.key_provider) {
-
258  case KeyProvider::kWidevine: {
-
259  WidevineEncryptionParams& widevine = encryption_params.widevine;
-
260  widevine.key_server_url = FLAGS_key_server_url;
-
261  widevine.include_common_pssh = FLAGS_include_common_pssh;
-
262 
-
263  widevine.content_id = FLAGS_content_id_bytes;
-
264  widevine.policy = FLAGS_policy;
-
265  widevine.group_id = FLAGS_group_id_bytes;
-
266  if (!GetWidevineSigner(&widevine.signer))
-
267  return base::nullopt;
-
268  break;
-
269  }
-
270  case KeyProvider::kPlayready: {
-
271  PlayreadyEncryptionParams& playready = encryption_params.playready;
-
272  playready.key_server_url = FLAGS_playready_server_url;
-
273  playready.program_identifier = FLAGS_program_identifier;
-
274  playready.ca_file = FLAGS_ca_file;
-
275  playready.client_cert_file = FLAGS_client_cert_file;
-
276  playready.client_cert_private_key_file =
-
277  FLAGS_client_cert_private_key_file;
-
278  playready.client_cert_private_key_password =
-
279  FLAGS_client_cert_private_key_password;
-
280  playready.key_id = FLAGS_playready_key_id_bytes;
-
281  playready.key = FLAGS_playready_key_bytes;
-
282  break;
-
283  }
-
284  case KeyProvider::kRawKey: {
-
285  if (!GetRawKeyParams(&encryption_params.raw_key))
-
286  return base::nullopt;
-
287  break;
-
288  }
-
289  case KeyProvider::kNone:
-
290  break;
+
10 #include "packager/app/ad_cue_generator_flags.h"
+
11 #include "packager/app/crypto_flags.h"
+
12 #include "packager/app/hls_flags.h"
+
13 #include "packager/app/mpd_flags.h"
+
14 #include "packager/app/muxer_flags.h"
+
15 #include "packager/app/packager_util.h"
+
16 #include "packager/app/playready_key_encryption_flags.h"
+
17 #include "packager/app/raw_key_encryption_flags.h"
+
18 #include "packager/app/stream_descriptor.h"
+
19 #include "packager/app/vlog_flags.h"
+
20 #include "packager/app/widevine_encryption_flags.h"
+
21 #include "packager/base/command_line.h"
+
22 #include "packager/base/logging.h"
+
23 #include "packager/base/optional.h"
+
24 #include "packager/base/strings/string_number_conversions.h"
+
25 #include "packager/base/strings/string_split.h"
+
26 #include "packager/base/strings/string_util.h"
+
27 #include "packager/base/strings/stringprintf.h"
+
28 #include "packager/file/file.h"
+
29 #include "packager/packager.h"
+
30 
+
31 #if defined(OS_WIN)
+
32 #include <codecvt>
+
33 #include <functional>
+
34 #include <locale>
+
35 #endif // defined(OS_WIN)
+
36 
+
37 DEFINE_bool(dump_stream_info, false, "Dump demuxed stream info.");
+
38 DEFINE_bool(use_fake_clock_for_muxer,
+
39  false,
+
40  "Set to true to use a fake clock for muxer. With this flag set, "
+
41  "creation time and modification time in outputs are set to 0. "
+
42  "Should only be used for testing.");
+
43 DEFINE_bool(override_version,
+
44  false,
+
45  "Override packager version in the generated outputs with "
+
46  "--test_version if it is set to true. Should be used for "
+
47  "testing only.");
+
48 DEFINE_string(test_version,
+
49  "",
+
50  "Packager version for testing. Ignored if --override_version is "
+
51  "false. Should be used for testing only.");
+
52 
+
53 namespace shaka {
+
54 namespace {
+
55 
+
56 const char kUsage[] =
+
57  "%s [flags] <stream_descriptor> ...\n\n"
+
58  " stream_descriptor consists of comma separated field_name/value pairs:\n"
+
59  " field_name=value,[field_name=value,]...\n"
+
60  " Supported field names are as follows (names in parenthesis are alias):\n"
+
61  " - input (in): Required input/source media file path or network stream\n"
+
62  " URL.\n"
+
63  " - stream_selector (stream): Required field with value 'audio',\n"
+
64  " 'video', 'text', or stream number (zero based).\n"
+
65  " - output (out,init_segment): Required output file (single file) or\n"
+
66  " initialization file path (multiple file).\n"
+
67  " - segment_template (segment): Optional value which specifies the\n"
+
68  " naming pattern for the segment files, and that the stream should be\n"
+
69  " split into multiple files. Its presence should be consistent across\n"
+
70  " streams.\n"
+
71  " - bandwidth (bw): Optional value which contains a user-specified\n"
+
72  " content bit rate for the stream, in bits/sec. If specified, this\n"
+
73  " value is propagated to (HLS) EXT-X-STREAM-INF:BANDWIDTH or (DASH)\n"
+
74  " Representation@bandwidth and the $Bandwidth$ template parameter for\n"
+
75  " segment names. If not specified, the bandwidth value is estimated\n"
+
76  " from content bitrate. Note that it only affects the generated\n"
+
77  " manifests/playlists; it has no effect on the media content itself.\n"
+
78  " - language (lang): Optional value which contains a user-specified\n"
+
79  " language tag. If specified, this value overrides any language\n"
+
80  " metadata in the input stream.\n"
+
81  " - output_format (format): Optional value which specifies the format\n"
+
82  " of the output files (MP4 or WebM). If not specified, it will be\n"
+
83  " derived from the file extension of the output file.\n"
+
84  " - skip_encryption=0|1: Optional. Defaults to 0 if not specified. If\n"
+
85  " it is set to 1, no encryption of the stream will be made.\n"
+
86  " - drm_label: Optional value for custom DRM label, which defines the\n"
+
87  " encryption key applied to the stream. Typical values include AUDIO,\n"
+
88  " SD, HD, UHD1, UHD2. For raw key, it should be a label defined in\n"
+
89  " --keys. If not provided, the DRM label is derived from stream type\n"
+
90  " (video, audio), resolution, etc.\n"
+
91  " Note that it is case sensitive.\n"
+
92  " - trick_play_factor (tpf): Optional value which specifies the trick\n"
+
93  " play, a.k.a. trick mode, stream sampling rate among key frames.\n"
+
94  " If specified, the output is a trick play stream.\n"
+
95  " - hls_name: Used for HLS audio to set the NAME attribute for\n"
+
96  " EXT-X-MEDIA. Defaults to the base of the playlist name.\n"
+
97  " - hls_group_id: Used for HLS audio to set the GROUP-ID attribute for\n"
+
98  " EXT-X-MEDIA. Defaults to 'audio' if not specified.\n"
+
99  " - playlist_name: Used for HLS to name the playlist for the stream.\n"
+
100  " Usually ends with '.m3u8'. If unspecified, defaults to something of\n"
+
101  " the form 'stream_0.m3u8', 'stream_1.m3u8', 'stream_2.m3u8', etc.\n";
+
102 
+
103 // Labels for parameters in RawKey key info.
+
104 const char kDrmLabelLabel[] = "label";
+
105 const char kKeyIdLabel[] = "key_id";
+
106 const char kKeyLabel[] = "key";
+
107 
+
108 enum ExitStatus {
+
109  kSuccess = 0,
+
110  kArgumentValidationFailed,
+
111  kPackagingFailed,
+
112  kInternalError,
+
113 };
+
114 
+
115 bool GetWidevineSigner(WidevineSigner* signer) {
+
116  signer->signer_name = FLAGS_signer;
+
117  if (!FLAGS_aes_signing_key_bytes.empty()) {
+
118  signer->signing_key_type = WidevineSigner::SigningKeyType::kAes;
+
119  signer->aes.key = FLAGS_aes_signing_key_bytes;
+
120  signer->aes.iv = FLAGS_aes_signing_iv_bytes;
+
121  } else if (!FLAGS_rsa_signing_key_path.empty()) {
+
122  signer->signing_key_type = WidevineSigner::SigningKeyType::kRsa;
+
123  if (!File::ReadFileToString(FLAGS_rsa_signing_key_path.c_str(),
+
124  &signer->rsa.key)) {
+
125  LOG(ERROR) << "Failed to read from '" << FLAGS_rsa_signing_key_path
+
126  << "'.";
+
127  return false;
+
128  }
+
129  }
+
130  return true;
+
131 }
+
132 
+
133 bool GetHlsPlaylistType(const std::string& playlist_type,
+
134  HlsPlaylistType* playlist_type_enum) {
+
135  if (base::ToUpperASCII(playlist_type) == "VOD") {
+
136  *playlist_type_enum = HlsPlaylistType::kVod;
+
137  } else if (base::ToUpperASCII(playlist_type) == "LIVE") {
+
138  *playlist_type_enum = HlsPlaylistType::kLive;
+
139  } else if (base::ToUpperASCII(playlist_type) == "EVENT") {
+
140  *playlist_type_enum = HlsPlaylistType::kEvent;
+
141  } else {
+
142  LOG(ERROR) << "Unrecognized playlist type " << playlist_type;
+
143  return false;
+
144  }
+
145  return true;
+
146 }
+
147 
+
148 bool GetProtectionScheme(uint32_t* protection_scheme) {
+
149  if (FLAGS_protection_scheme == "cenc") {
+
150  *protection_scheme = EncryptionParams::kProtectionSchemeCenc;
+
151  return true;
+
152  }
+
153  if (FLAGS_protection_scheme == "cbc1") {
+
154  *protection_scheme = EncryptionParams::kProtectionSchemeCbc1;
+
155  return true;
+
156  }
+
157  if (FLAGS_protection_scheme == "cbcs") {
+
158  *protection_scheme = EncryptionParams::kProtectionSchemeCbcs;
+
159  return true;
+
160  }
+
161  if (FLAGS_protection_scheme == "cens") {
+
162  *protection_scheme = EncryptionParams::kProtectionSchemeCens;
+
163  return true;
+
164  }
+
165  LOG(ERROR) << "Unrecognized protection_scheme " << FLAGS_protection_scheme;
+
166  return false;
+
167 }
+
168 
+
169 bool ParseKeys(const std::string& keys, RawKeyParams* raw_key) {
+
170  for (const std::string& key_data : base::SplitString(
+
171  keys, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
+
172  base::StringPairs string_pairs;
+
173  base::SplitStringIntoKeyValuePairs(key_data, '=', ':', &string_pairs);
+
174 
+
175  std::map<std::string, std::string> value_map;
+
176  for (const auto& string_pair : string_pairs)
+
177  value_map[string_pair.first] = string_pair.second;
+
178  const std::string drm_label = value_map[kDrmLabelLabel];
+
179  if (raw_key->key_map.find(drm_label) != raw_key->key_map.end()) {
+
180  LOG(ERROR) << "Seeing duplicated DRM label '" << drm_label << "'.";
+
181  return false;
+
182  }
+
183  auto& key_info = raw_key->key_map[drm_label];
+
184  if (value_map[kKeyIdLabel].empty() ||
+
185  !base::HexStringToBytes(value_map[kKeyIdLabel], &key_info.key_id)) {
+
186  LOG(ERROR) << "Empty key id or invalid hex string for key id: "
+
187  << value_map[kKeyIdLabel];
+
188  return false;
+
189  }
+
190  if (value_map[kKeyLabel].empty() ||
+
191  !base::HexStringToBytes(value_map[kKeyLabel], &key_info.key)) {
+
192  LOG(ERROR) << "Empty key or invalid hex string for key: "
+
193  << value_map[kKeyLabel];
+
194  return false;
+
195  }
+
196  }
+
197  return true;
+
198 }
+
199 
+
200 bool GetRawKeyParams(RawKeyParams* raw_key) {
+
201  raw_key->iv = FLAGS_iv_bytes;
+
202  raw_key->pssh = FLAGS_pssh_bytes;
+
203  if (!FLAGS_keys.empty()) {
+
204  if (!ParseKeys(FLAGS_keys, raw_key)) {
+
205  LOG(ERROR) << "Failed to parse --keys " << FLAGS_keys;
+
206  return false;
+
207  }
+
208  } else {
+
209  // An empty StreamLabel specifies the default key info.
+
210  RawKeyParams::KeyInfo& key_info = raw_key->key_map[""];
+
211  key_info.key_id = FLAGS_key_id_bytes;
+
212  key_info.key = FLAGS_key_bytes;
+
213  }
+
214  return true;
+
215 }
+
216 
+
217 bool ParseAdCues(const std::string& ad_cues, std::vector<Cuepoint>* cuepoints) {
+
218  // Track if optional field is supplied consistently across all cue points.
+
219  size_t duration_count = 0;
+
220 
+
221  for (const std::string& ad_cue : base::SplitString(
+
222  ad_cues, ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
+
223  Cuepoint cuepoint;
+
224  auto split_ad_cue = base::SplitString(ad_cue, ",", base::TRIM_WHITESPACE,
+
225  base::SPLIT_WANT_NONEMPTY);
+
226  if (split_ad_cue.size() > 2) {
+
227  LOG(ERROR) << "Failed to parse --ad_cues " << ad_cues
+
228  << " Each ad cue must contain no more than 2 components.";
+
229  }
+
230  if (!base::StringToDouble(split_ad_cue.front(),
+
231  &cuepoint.start_time_in_seconds)) {
+
232  LOG(ERROR) << "Failed to parse --ad_cues " << ad_cues
+
233  << " Start time component must be of type double.";
+
234  return false;
+
235  }
+
236  if (split_ad_cue.size() > 1) {
+
237  duration_count++;
+
238  if (!base::StringToDouble(split_ad_cue[1],
+
239  &cuepoint.duration_in_seconds)) {
+
240  LOG(ERROR) << "Failed to parse --ad_cues " << ad_cues
+
241  << " Duration component must be of type double.";
+
242  return false;
+
243  }
+
244  }
+
245  cuepoints->push_back(cuepoint);
+
246  }
+
247 
+
248  if (duration_count > 0 && duration_count != cuepoints->size()) {
+
249  LOG(ERROR) << "Failed to parse --ad_cues " << ad_cues
+
250  << " Duration component is optional. However if it is supplied,"
+
251  << " it must be supplied consistently across all cuepoints.";
+
252  return false;
+
253  }
+
254  return true;
+
255 }
+
256 
+
257 base::Optional<PackagingParams> GetPackagingParams() {
+
258  PackagingParams packaging_params;
+
259 
+
260  AdCueGeneratorParams& ad_cue_generator_params =
+
261  packaging_params.ad_cue_generator_params;
+
262  if (!ParseAdCues(FLAGS_ad_cues, &ad_cue_generator_params.cue_points)) {
+
263  return base::nullopt;
+
264  }
+
265 
+
266  ChunkingParams& chunking_params = packaging_params.chunking_params;
+
267  chunking_params.segment_duration_in_seconds = FLAGS_segment_duration;
+
268  chunking_params.subsegment_duration_in_seconds = FLAGS_fragment_duration;
+
269  chunking_params.segment_sap_aligned = FLAGS_segment_sap_aligned;
+
270  chunking_params.subsegment_sap_aligned = FLAGS_fragment_sap_aligned;
+
271 
+
272  int num_key_providers = 0;
+
273  EncryptionParams& encryption_params = packaging_params.encryption_params;
+
274  if (FLAGS_enable_widevine_encryption) {
+
275  encryption_params.key_provider = KeyProvider::kWidevine;
+
276  ++num_key_providers;
+
277  }
+
278  if (FLAGS_enable_playready_encryption) {
+
279  encryption_params.key_provider = KeyProvider::kPlayready;
+
280  ++num_key_providers;
+
281  }
+
282  if (FLAGS_enable_raw_key_encryption) {
+
283  encryption_params.key_provider = KeyProvider::kRawKey;
+
284  ++num_key_providers;
+
285  }
+
286  if (num_key_providers > 1) {
+
287  LOG(ERROR) << "Only one of --enable_widevine_encryption, "
+
288  "--enable_playready_encryption, "
+
289  "--enable_raw_key_encryption can be enabled.";
+
290  return base::nullopt;
291  }
292 
-
293  num_key_providers = 0;
-
294  DecryptionParams& decryption_params = packaging_params.decryption_params;
-
295  if (FLAGS_enable_widevine_decryption) {
-
296  decryption_params.key_provider = KeyProvider::kWidevine;
-
297  ++num_key_providers;
-
298  }
-
299  if (FLAGS_enable_raw_key_decryption) {
-
300  decryption_params.key_provider = KeyProvider::kRawKey;
-
301  ++num_key_providers;
-
302  }
-
303  if (num_key_providers > 1) {
-
304  LOG(ERROR) << "Only one of --enable_widevine_decryption, "
-
305  "--enable_raw_key_decryption can be enabled.";
-
306  return base::nullopt;
-
307  }
-
308  switch (decryption_params.key_provider) {
-
309  case KeyProvider::kWidevine: {
-
310  WidevineDecryptionParams& widevine = decryption_params.widevine;
-
311  widevine.key_server_url = FLAGS_key_server_url;
-
312  if (!GetWidevineSigner(&widevine.signer))
-
313  return base::nullopt;
-
314  break;
-
315  }
-
316  case KeyProvider::kRawKey: {
-
317  if (!GetRawKeyParams(&decryption_params.raw_key))
-
318  return base::nullopt;
-
319  break;
-
320  }
-
321  case KeyProvider::kPlayready:
-
322  case KeyProvider::kNone:
-
323  break;
-
324  }
-
325 
-
326  Mp4OutputParams& mp4_params = packaging_params.mp4_output_params;
-
327  mp4_params.num_subsegments_per_sidx = FLAGS_num_subsegments_per_sidx;
-
328  if (FLAGS_mp4_use_decoding_timestamp_in_timeline) {
-
329  LOG(WARNING) << "Flag --mp4_use_decoding_timestamp_in_timeline is set. "
-
330  "Note that it is a temporary hack to workaround Chromium "
-
331  "bug https://crbug.com/398130. The flag may be removed "
-
332  "when the Chromium bug is fixed.";
-
333  }
-
334  mp4_params.use_decoding_timestamp_in_timeline =
-
335  FLAGS_mp4_use_decoding_timestamp_in_timeline;
-
336  mp4_params.include_pssh_in_stream = FLAGS_mp4_include_pssh_in_stream;
-
337 
-
338  packaging_params.output_media_info = FLAGS_output_media_info;
+
293  if (encryption_params.key_provider != KeyProvider::kNone) {
+
294  encryption_params.clear_lead_in_seconds = FLAGS_clear_lead;
+
295  if (!GetProtectionScheme(&encryption_params.protection_scheme))
+
296  return base::nullopt;
+
297  encryption_params.crypto_period_duration_in_seconds =
+
298  FLAGS_crypto_period_duration;
+
299  encryption_params.vp9_subsample_encryption = FLAGS_vp9_subsample_encryption;
+
300  encryption_params.stream_label_func = std::bind(
+
301  &Packager::DefaultStreamLabelFunction, FLAGS_max_sd_pixels,
+
302  FLAGS_max_hd_pixels, FLAGS_max_uhd1_pixels, std::placeholders::_1);
+
303  }
+
304  switch (encryption_params.key_provider) {
+
305  case KeyProvider::kWidevine: {
+
306  WidevineEncryptionParams& widevine = encryption_params.widevine;
+
307  widevine.key_server_url = FLAGS_key_server_url;
+
308  widevine.include_common_pssh = FLAGS_include_common_pssh;
+
309 
+
310  widevine.content_id = FLAGS_content_id_bytes;
+
311  widevine.policy = FLAGS_policy;
+
312  widevine.group_id = FLAGS_group_id_bytes;
+
313  if (!GetWidevineSigner(&widevine.signer))
+
314  return base::nullopt;
+
315  break;
+
316  }
+
317  case KeyProvider::kPlayready: {
+
318  PlayreadyEncryptionParams& playready = encryption_params.playready;
+
319  playready.key_server_url = FLAGS_playready_server_url;
+
320  playready.program_identifier = FLAGS_program_identifier;
+
321  playready.ca_file = FLAGS_ca_file;
+
322  playready.client_cert_file = FLAGS_client_cert_file;
+
323  playready.client_cert_private_key_file =
+
324  FLAGS_client_cert_private_key_file;
+
325  playready.client_cert_private_key_password =
+
326  FLAGS_client_cert_private_key_password;
+
327  playready.key_id = FLAGS_playready_key_id_bytes;
+
328  playready.key = FLAGS_playready_key_bytes;
+
329  break;
+
330  }
+
331  case KeyProvider::kRawKey: {
+
332  if (!GetRawKeyParams(&encryption_params.raw_key))
+
333  return base::nullopt;
+
334  break;
+
335  }
+
336  case KeyProvider::kNone:
+
337  break;
+
338  }
339 
-
340  MpdParams& mpd_params = packaging_params.mpd_params;
-
341  mpd_params.generate_static_live_mpd = FLAGS_generate_static_mpd;
-
342  mpd_params.mpd_output = FLAGS_mpd_output;
-
343  mpd_params.base_urls = base::SplitString(
-
344  FLAGS_base_urls, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
-
345  mpd_params.generate_dash_if_iop_compliant_mpd =
-
346  FLAGS_generate_dash_if_iop_compliant_mpd;
-
347  mpd_params.minimum_update_period = FLAGS_minimum_update_period;
-
348  mpd_params.min_buffer_time = FLAGS_min_buffer_time;
-
349  mpd_params.time_shift_buffer_depth = FLAGS_time_shift_buffer_depth;
-
350  mpd_params.suggested_presentation_delay = FLAGS_suggested_presentation_delay;
-
351  mpd_params.default_language = FLAGS_default_language;
-
352 
-
353  HlsParams& hls_params = packaging_params.hls_params;
-
354  if (!GetHlsPlaylistType(FLAGS_hls_playlist_type, &hls_params.playlist_type)) {
-
355  return base::nullopt;
-
356  }
-
357  hls_params.master_playlist_output = FLAGS_hls_master_playlist_output;
-
358  hls_params.base_url = FLAGS_hls_base_url;
-
359  hls_params.time_shift_buffer_depth = FLAGS_time_shift_buffer_depth;
-
360 
-
361  TestParams& test_params = packaging_params.test_params;
-
362  test_params.dump_stream_info = FLAGS_dump_stream_info;
-
363  test_params.inject_fake_clock = FLAGS_use_fake_clock_for_muxer;
-
364  if (FLAGS_override_version)
-
365  test_params.injected_library_version = FLAGS_test_version;
-
366 
-
367  return packaging_params;
-
368 }
-
369 
-
370 int PackagerMain(int argc, char** argv) {
-
371  // Needed to enable VLOG/DVLOG through --vmodule or --v.
-
372  base::CommandLine::Init(argc, argv);
-
373 
-
374  // Set up logging.
-
375  logging::LoggingSettings log_settings;
-
376  log_settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
-
377  CHECK(logging::InitLogging(log_settings));
-
378 
-
379  google::SetVersionString(shaka::Packager::GetLibraryVersion());
-
380  google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
-
381  google::ParseCommandLineFlags(&argc, &argv, true);
-
382  if (argc < 2) {
-
383  google::ShowUsageWithFlags("Usage");
-
384  return kSuccess;
-
385  }
+
340  num_key_providers = 0;
+
341  DecryptionParams& decryption_params = packaging_params.decryption_params;
+
342  if (FLAGS_enable_widevine_decryption) {
+
343  decryption_params.key_provider = KeyProvider::kWidevine;
+
344  ++num_key_providers;
+
345  }
+
346  if (FLAGS_enable_raw_key_decryption) {
+
347  decryption_params.key_provider = KeyProvider::kRawKey;
+
348  ++num_key_providers;
+
349  }
+
350  if (num_key_providers > 1) {
+
351  LOG(ERROR) << "Only one of --enable_widevine_decryption, "
+
352  "--enable_raw_key_decryption can be enabled.";
+
353  return base::nullopt;
+
354  }
+
355  switch (decryption_params.key_provider) {
+
356  case KeyProvider::kWidevine: {
+
357  WidevineDecryptionParams& widevine = decryption_params.widevine;
+
358  widevine.key_server_url = FLAGS_key_server_url;
+
359  if (!GetWidevineSigner(&widevine.signer))
+
360  return base::nullopt;
+
361  break;
+
362  }
+
363  case KeyProvider::kRawKey: {
+
364  if (!GetRawKeyParams(&decryption_params.raw_key))
+
365  return base::nullopt;
+
366  break;
+
367  }
+
368  case KeyProvider::kPlayready:
+
369  case KeyProvider::kNone:
+
370  break;
+
371  }
+
372 
+
373  Mp4OutputParams& mp4_params = packaging_params.mp4_output_params;
+
374  mp4_params.num_subsegments_per_sidx = FLAGS_num_subsegments_per_sidx;
+
375  if (FLAGS_mp4_use_decoding_timestamp_in_timeline) {
+
376  LOG(WARNING) << "Flag --mp4_use_decoding_timestamp_in_timeline is set. "
+
377  "Note that it is a temporary hack to workaround Chromium "
+
378  "bug https://crbug.com/398130. The flag may be removed "
+
379  "when the Chromium bug is fixed.";
+
380  }
+
381  mp4_params.use_decoding_timestamp_in_timeline =
+
382  FLAGS_mp4_use_decoding_timestamp_in_timeline;
+
383  mp4_params.include_pssh_in_stream = FLAGS_mp4_include_pssh_in_stream;
+
384 
+
385  packaging_params.output_media_info = FLAGS_output_media_info;
386 
- - -
389  return kArgumentValidationFailed;
-
390  }
-
391 
-
392  base::Optional<PackagingParams> packaging_params = GetPackagingParams();
-
393  if (!packaging_params)
-
394  return kArgumentValidationFailed;
-
395 
-
396  std::vector<StreamDescriptor> stream_descriptors;
-
397  for (int i = 1; i < argc; ++i) {
-
398  base::Optional<StreamDescriptor> stream_descriptor =
-
399  ParseStreamDescriptor(argv[i]);
-
400  if (!stream_descriptor)
-
401  return kArgumentValidationFailed;
-
402  stream_descriptors.push_back(stream_descriptor.value());
+
387  MpdParams& mpd_params = packaging_params.mpd_params;
+
388  mpd_params.generate_static_live_mpd = FLAGS_generate_static_mpd;
+
389  mpd_params.mpd_output = FLAGS_mpd_output;
+
390  mpd_params.base_urls = base::SplitString(
+
391  FLAGS_base_urls, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+
392  mpd_params.generate_dash_if_iop_compliant_mpd =
+
393  FLAGS_generate_dash_if_iop_compliant_mpd;
+
394  mpd_params.minimum_update_period = FLAGS_minimum_update_period;
+
395  mpd_params.min_buffer_time = FLAGS_min_buffer_time;
+
396  mpd_params.time_shift_buffer_depth = FLAGS_time_shift_buffer_depth;
+
397  mpd_params.suggested_presentation_delay = FLAGS_suggested_presentation_delay;
+
398  mpd_params.default_language = FLAGS_default_language;
+
399 
+
400  HlsParams& hls_params = packaging_params.hls_params;
+
401  if (!GetHlsPlaylistType(FLAGS_hls_playlist_type, &hls_params.playlist_type)) {
+
402  return base::nullopt;
403  }
-
404  Packager packager;
-
405  Status status =
-
406  packager.Initialize(packaging_params.value(), stream_descriptors);
-
407  if (!status.ok()) {
-
408  LOG(ERROR) << "Failed to initialize packager: " << status.ToString();
-
409  return kArgumentValidationFailed;
-
410  }
-
411  status = packager.Run();
-
412  if (!status.ok()) {
-
413  LOG(ERROR) << "Packaging Error: " << status.ToString();
-
414  return kPackagingFailed;
-
415  }
-
416  printf("Packaging completed successfully.\n");
-
417  return kSuccess;
-
418 }
-
419 
-
420 } // namespace
-
421 } // namespace shaka
-
422 
-
423 #if defined(OS_WIN)
-
424 // Windows wmain, which converts wide character arguments to UTF-8.
-
425 int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) {
-
426  std::unique_ptr<char* [], std::function<void(char**)>> utf8_argv(
-
427  new char*[argc], [argc](char** utf8_args) {
-
428  // TODO(tinskip): This leaks, but if this code is enabled, it crashes.
-
429  // Figure out why. I suspect gflags does something funny with the
-
430  // argument array.
-
431  // for (int idx = 0; idx < argc; ++idx)
-
432  // delete[] utf8_args[idx];
-
433  delete[] utf8_args;
-
434  });
-
435  std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
-
436  for (int idx = 0; idx < argc; ++idx) {
-
437  std::string utf8_arg(converter.to_bytes(argv[idx]));
-
438  utf8_arg += '\0';
-
439  utf8_argv[idx] = new char[utf8_arg.size()];
-
440  memcpy(utf8_argv[idx], &utf8_arg[0], utf8_arg.size());
-
441  }
-
442  return shaka::PackagerMain(argc, utf8_argv.get());
-
443 }
-
444 #else
-
445 int main(int argc, char** argv) {
-
446  return shaka::PackagerMain(argc, argv);
-
447 }
-
448 #endif // defined(OS_WIN)
-
static std::string DefaultStreamLabelFunction(int max_sd_pixels, int max_hd_pixels, int max_uhd1_pixels, const EncryptionParams::EncryptedStreamAttributes &stream_attributes)
Definition: packager.cc:893
+
404  hls_params.master_playlist_output = FLAGS_hls_master_playlist_output;
+
405  hls_params.base_url = FLAGS_hls_base_url;
+
406  hls_params.key_uri = FLAGS_hls_key_uri;
+
407  hls_params.time_shift_buffer_depth = FLAGS_time_shift_buffer_depth;
+
408 
+
409  TestParams& test_params = packaging_params.test_params;
+
410  test_params.dump_stream_info = FLAGS_dump_stream_info;
+
411  test_params.inject_fake_clock = FLAGS_use_fake_clock_for_muxer;
+
412  if (FLAGS_override_version)
+
413  test_params.injected_library_version = FLAGS_test_version;
+
414 
+
415  return packaging_params;
+
416 }
+
417 
+
418 int PackagerMain(int argc, char** argv) {
+
419  // Needed to enable VLOG/DVLOG through --vmodule or --v.
+
420  base::CommandLine::Init(argc, argv);
+
421 
+
422  // Set up logging.
+
423  logging::LoggingSettings log_settings;
+
424  log_settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
+
425  CHECK(logging::InitLogging(log_settings));
+
426 
+
427  google::SetVersionString(shaka::Packager::GetLibraryVersion());
+
428  google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
+
429  google::ParseCommandLineFlags(&argc, &argv, true);
+
430  if (argc < 2) {
+
431  google::ShowUsageWithFlags("Usage");
+
432  return kSuccess;
+
433  }
+
434 
+ + +
437  return kArgumentValidationFailed;
+
438  }
+
439 
+
440  base::Optional<PackagingParams> packaging_params = GetPackagingParams();
+
441  if (!packaging_params)
+
442  return kArgumentValidationFailed;
+
443 
+
444  std::vector<StreamDescriptor> stream_descriptors;
+
445  for (int i = 1; i < argc; ++i) {
+
446  base::Optional<StreamDescriptor> stream_descriptor =
+
447  ParseStreamDescriptor(argv[i]);
+
448  if (!stream_descriptor)
+
449  return kArgumentValidationFailed;
+
450  stream_descriptors.push_back(stream_descriptor.value());
+
451  }
+
452  Packager packager;
+
453  Status status =
+
454  packager.Initialize(packaging_params.value(), stream_descriptors);
+
455  if (!status.ok()) {
+
456  LOG(ERROR) << "Failed to initialize packager: " << status.ToString();
+
457  return kArgumentValidationFailed;
+
458  }
+
459  status = packager.Run();
+
460  if (!status.ok()) {
+
461  LOG(ERROR) << "Packaging Error: " << status.ToString();
+
462  return kPackagingFailed;
+
463  }
+
464  printf("Packaging completed successfully.\n");
+
465  return kSuccess;
+
466 }
+
467 
+
468 } // namespace
+
469 } // namespace shaka
+
470 
+
471 #if defined(OS_WIN)
+
472 // Windows wmain, which converts wide character arguments to UTF-8.
+
473 int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) {
+
474  std::unique_ptr<char* [], std::function<void(char**)>> utf8_argv(
+
475  new char*[argc], [argc](char** utf8_args) {
+
476  // TODO(tinskip): This leaks, but if this code is enabled, it crashes.
+
477  // Figure out why. I suspect gflags does something funny with the
+
478  // argument array.
+
479  // for (int idx = 0; idx < argc; ++idx)
+
480  // delete[] utf8_args[idx];
+
481  delete[] utf8_args;
+
482  });
+
483  std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
+
484  for (int idx = 0; idx < argc; ++idx) {
+
485  std::string utf8_arg(converter.to_bytes(argv[idx]));
+
486  utf8_arg += '\0';
+
487  utf8_argv[idx] = new char[utf8_arg.size()];
+
488  memcpy(utf8_argv[idx], &utf8_arg[0], utf8_arg.size());
+
489  }
+
490  return shaka::PackagerMain(argc, utf8_argv.get());
+
491 }
+
492 #else
+
493 int main(int argc, char** argv) {
+
494  return shaka::PackagerMain(argc, argv);
+
495 }
+
496 #endif // defined(OS_WIN)
+
static std::string DefaultStreamLabelFunction(int max_sd_pixels, int max_hd_pixels, int max_uhd1_pixels, const EncryptionParams::EncryptedStreamAttributes &stream_attributes)
Definition: packager.cc:892
HlsPlaylistType
Definition: hls_params.h:16
base::Optional< StreamDescriptor > ParseStreamDescriptor(const std::string &descriptor_string)
static bool ReadFileToString(const char *file_name, std::string *contents)
Definition: file.cc:216
bool ValidateRawKeyCryptoFlags()
bool ValidateWidevineCryptoFlags()
-
static std::string GetLibraryVersion()
Definition: packager.cc:889
+
static std::string GetLibraryVersion()
Definition: packager.cc:888
static constexpr uint32_t kProtectionSchemeCenc
The protection scheme: "cenc", "cens", "cbc1", "cbcs".
diff --git a/docs/d2/de7/classshaka_1_1media_1_1TextStreamInfo-members.html b/docs/d2/de7/classshaka_1_1media_1_1TextStreamInfo-members.html index 60c518a034..2d61bc5a6b 100644 --- a/docs/d2/de7/classshaka_1_1media_1_1TextStreamInfo-members.html +++ b/docs/d2/de7/classshaka_1_1media_1_1TextStreamInfo-members.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/de7/structshaka_1_1media_1_1mp4_1_1Edit-members.html b/docs/d2/de7/structshaka_1_1media_1_1mp4_1_1Edit-members.html index c9383399a8..5fa2e15b81 100644 --- a/docs/d2/de7/structshaka_1_1media_1_1mp4_1_1Edit-members.html +++ b/docs/d2/de7/structshaka_1_1media_1_1mp4_1_1Edit-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/de9/media__handler_8cc_source.html b/docs/d2/de9/media__handler_8cc_source.html index 633db9350f..ba93b55d05 100644 --- a/docs/d2/de9/media__handler_8cc_source.html +++ b/docs/d2/de9/media__handler_8cc_source.html @@ -182,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/de9/mock__muxer__listener_8h_source.html b/docs/d2/de9/mock__muxer__listener_8h_source.html index 31bb011af9..eb2a1a4222 100644 --- a/docs/d2/de9/mock__muxer__listener_8h_source.html +++ b/docs/d2/de9/mock__muxer__listener_8h_source.html @@ -170,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/deb/es__parser_8h_source.html b/docs/d2/deb/es__parser_8h_source.html index 87a6852768..0ba3c18721 100644 --- a/docs/d2/deb/es__parser_8h_source.html +++ b/docs/d2/deb/es__parser_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dee/classshaka_1_1media_1_1mp2t_1_1TsSectionPes-members.html b/docs/d2/dee/classshaka_1_1media_1_1mp2t_1_1TsSectionPes-members.html index 40931ac3a5..8e3a3988d5 100644 --- a/docs/d2/dee/classshaka_1_1media_1_1mp2t_1_1TsSectionPes-members.html +++ b/docs/d2/dee/classshaka_1_1media_1_1mp2t_1_1TsSectionPes-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dee/pes__packet__generator_8cc_source.html b/docs/d2/dee/pes__packet__generator_8cc_source.html index 66d1f04907..6abe61ec62 100644 --- a/docs/d2/dee/pes__packet__generator_8cc_source.html +++ b/docs/d2/dee/pes__packet__generator_8cc_source.html @@ -114,117 +114,126 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
25 
26 namespace {
27 const uint8_t kVideoStreamId = 0xE0;
-
28 const uint8_t kAudioStreamId = 0xC0;
-
29 const double kTsTimescale = 90000.0;
-
30 } // namespace
-
31 
-
32 PesPacketGenerator::PesPacketGenerator() {}
-
33 PesPacketGenerator::~PesPacketGenerator() {}
-
34 
-
35 bool PesPacketGenerator::Initialize(const StreamInfo& stream_info) {
-
36  pes_packets_.clear();
-
37  stream_type_ = stream_info.stream_type();
-
38 
-
39  if (stream_type_ == kStreamVideo) {
-
40  const VideoStreamInfo& video_stream_info =
-
41  static_cast<const VideoStreamInfo&>(stream_info);
-
42  if (video_stream_info.codec() != Codec::kCodecH264) {
-
43  NOTIMPLEMENTED() << "Video codec " << video_stream_info.codec()
-
44  << " is not supported.";
-
45  return false;
-
46  }
-
47  timescale_scale_ = kTsTimescale / video_stream_info.time_scale();
-
48  converter_.reset(new NalUnitToByteStreamConverter());
-
49  return converter_->Initialize(video_stream_info.codec_config().data(),
-
50  video_stream_info.codec_config().size());
-
51  } else if (stream_type_ == kStreamAudio) {
-
52  const AudioStreamInfo& audio_stream_info =
-
53  static_cast<const AudioStreamInfo&>(stream_info);
-
54  if (audio_stream_info.codec() != Codec::kCodecAAC) {
-
55  NOTIMPLEMENTED() << "Audio codec " << audio_stream_info.codec()
-
56  << " is not supported yet.";
-
57  return false;
-
58  }
-
59  timescale_scale_ = kTsTimescale / audio_stream_info.time_scale();
-
60  adts_converter_.reset(new AACAudioSpecificConfig());
-
61  return adts_converter_->Parse(audio_stream_info.codec_config());
-
62  }
-
63 
-
64  NOTIMPLEMENTED() << "Stream type: " << stream_type_ << " not implemented.";
-
65  return false;
-
66 }
-
67 
- -
69  if (!current_processing_pes_)
-
70  current_processing_pes_.reset(new PesPacket());
-
71 
-
72  current_processing_pes_->set_pts(timescale_scale_ * sample.pts());
-
73  current_processing_pes_->set_dts(timescale_scale_ * sample.dts());
-
74  if (stream_type_ == kStreamVideo) {
-
75  DCHECK(converter_);
-
76  std::vector<SubsampleEntry> subsamples;
-
77  if (sample.decrypt_config())
-
78  subsamples = sample.decrypt_config()->subsamples();
-
79  const bool kEscapeEncryptedNalu = true;
-
80  std::vector<uint8_t> byte_stream;
-
81  if (!converter_->ConvertUnitToByteStreamWithSubsamples(
-
82  sample.data(), sample.data_size(), sample.is_key_frame(),
-
83  kEscapeEncryptedNalu, &byte_stream, &subsamples)) {
-
84  LOG(ERROR) << "Failed to convert sample to byte stream.";
-
85  return false;
-
86  }
-
87 
-
88  current_processing_pes_->mutable_data()->swap(byte_stream);
-
89  current_processing_pes_->set_stream_id(kVideoStreamId);
-
90  pes_packets_.push_back(std::move(current_processing_pes_));
-
91  return true;
-
92  }
-
93  DCHECK_EQ(stream_type_, kStreamAudio);
-
94  DCHECK(adts_converter_);
-
95 
-
96  std::vector<uint8_t> aac_frame(sample.data(),
-
97  sample.data() + sample.data_size());
-
98 
-
99  // TODO(rkuroiwa): ConvertToADTS() makes another copy of aac_frame internally.
-
100  // Optimize copying in this function, possibly by adding a method on
-
101  // AACAudioSpecificConfig that takes {pointer, length} pair and returns a
-
102  // vector that has the ADTS header.
-
103  if (!adts_converter_->ConvertToADTS(&aac_frame))
-
104  return false;
-
105 
-
106  // TODO(rkuriowa): Put multiple samples in the PES packet to reduce # of PES
-
107  // packets.
-
108  current_processing_pes_->mutable_data()->swap(aac_frame);
-
109  current_processing_pes_->set_stream_id(kAudioStreamId);
-
110  pes_packets_.push_back(std::move(current_processing_pes_));
-
111  return true;
-
112 }
-
113 
- -
115  return pes_packets_.size();
-
116 }
-
117 
-
118 std::unique_ptr<PesPacket> PesPacketGenerator::GetNextPesPacket() {
-
119  DCHECK(!pes_packets_.empty());
-
120  std::unique_ptr<PesPacket> pes = std::move(pes_packets_.front());
-
121  pes_packets_.pop_front();
-
122  return pes;
-
123 }
-
124 
- -
126  return true;
-
127 }
-
128 
-
129 } // namespace mp2t
-
130 } // namespace media
-
131 } // namespace shaka
+
28 const uint8_t kAacAudioStreamId = 0xC0;
+
29 const uint8_t kAc3AudioStreamId = 0xBD; // AC3 uses private stream 1 id.
+
30 const double kTsTimescale = 90000.0;
+
31 } // namespace
+
32 
+
33 PesPacketGenerator::PesPacketGenerator() {}
+
34 PesPacketGenerator::~PesPacketGenerator() {}
+
35 
+
36 bool PesPacketGenerator::Initialize(const StreamInfo& stream_info) {
+
37  pes_packets_.clear();
+
38  stream_type_ = stream_info.stream_type();
+
39 
+
40  if (stream_type_ == kStreamVideo) {
+
41  const VideoStreamInfo& video_stream_info =
+
42  static_cast<const VideoStreamInfo&>(stream_info);
+
43  if (video_stream_info.codec() != Codec::kCodecH264) {
+
44  NOTIMPLEMENTED() << "Video codec " << video_stream_info.codec()
+
45  << " is not supported.";
+
46  return false;
+
47  }
+
48  timescale_scale_ = kTsTimescale / video_stream_info.time_scale();
+
49  converter_.reset(new NalUnitToByteStreamConverter());
+
50  return converter_->Initialize(video_stream_info.codec_config().data(),
+
51  video_stream_info.codec_config().size());
+
52  } else if (stream_type_ == kStreamAudio) {
+
53  const AudioStreamInfo& audio_stream_info =
+
54  static_cast<const AudioStreamInfo&>(stream_info);
+
55  timescale_scale_ = kTsTimescale / audio_stream_info.time_scale();
+
56  if (audio_stream_info.codec() == Codec::kCodecAAC) {
+
57  audio_stream_id_ = kAacAudioStreamId;
+
58  adts_converter_.reset(new AACAudioSpecificConfig());
+
59  return adts_converter_->Parse(audio_stream_info.codec_config());
+
60  } else if (audio_stream_info.codec() == Codec::kCodecAC3 ||
+
61  audio_stream_info.codec() == Codec::kCodecEAC3) {
+
62  audio_stream_id_ = kAc3AudioStreamId;
+
63  // No converter needed for AC3 and E-AC3.
+
64  return true;
+
65  }
+
66  NOTIMPLEMENTED() << "Audio codec " << audio_stream_info.codec()
+
67  << " is not supported yet.";
+
68  return false;
+
69  }
+
70 
+
71  NOTIMPLEMENTED() << "Stream type: " << stream_type_ << " not implemented.";
+
72  return false;
+
73 }
+
74 
+ +
76  if (!current_processing_pes_)
+
77  current_processing_pes_.reset(new PesPacket());
+
78 
+
79  current_processing_pes_->set_pts(timescale_scale_ * sample.pts());
+
80  current_processing_pes_->set_dts(timescale_scale_ * sample.dts());
+
81  if (stream_type_ == kStreamVideo) {
+
82  DCHECK(converter_);
+
83  std::vector<SubsampleEntry> subsamples;
+
84  if (sample.decrypt_config())
+
85  subsamples = sample.decrypt_config()->subsamples();
+
86  const bool kEscapeEncryptedNalu = true;
+
87  std::vector<uint8_t> byte_stream;
+
88  if (!converter_->ConvertUnitToByteStreamWithSubsamples(
+
89  sample.data(), sample.data_size(), sample.is_key_frame(),
+
90  kEscapeEncryptedNalu, &byte_stream, &subsamples)) {
+
91  LOG(ERROR) << "Failed to convert sample to byte stream.";
+
92  return false;
+
93  }
+
94 
+
95  current_processing_pes_->mutable_data()->swap(byte_stream);
+
96  current_processing_pes_->set_stream_id(kVideoStreamId);
+
97  pes_packets_.push_back(std::move(current_processing_pes_));
+
98  return true;
+
99  }
+
100  DCHECK_EQ(stream_type_, kStreamAudio);
+
101 
+
102  std::vector<uint8_t> audio_frame(sample.data(),
+
103  sample.data() + sample.data_size());
+
104 
+
105  // AAC is carried in ADTS.
+
106  if (adts_converter_) {
+
107  // TODO(rkuroiwa): ConvertToADTS() makes another copy of audio_frame
+
108  // internally. Optimize copying in this function, possibly by adding a
+
109  // method on AACAudioSpecificConfig that takes {pointer, length} pair and
+
110  // returns a vector that has the ADTS header.
+
111  if (!adts_converter_->ConvertToADTS(&audio_frame))
+
112  return false;
+
113  }
+
114 
+
115  // TODO(rkuriowa): Put multiple samples in the PES packet to reduce # of PES
+
116  // packets.
+
117  current_processing_pes_->mutable_data()->swap(audio_frame);
+
118  current_processing_pes_->set_stream_id(audio_stream_id_);
+
119  pes_packets_.push_back(std::move(current_processing_pes_));
+
120  return true;
+
121 }
+
122 
+ +
124  return pes_packets_.size();
+
125 }
+
126 
+
127 std::unique_ptr<PesPacket> PesPacketGenerator::GetNextPesPacket() {
+
128  DCHECK(!pes_packets_.empty());
+
129  std::unique_ptr<PesPacket> pes = std::move(pes_packets_.front());
+
130  pes_packets_.pop_front();
+
131  return pes;
+
132 }
+
133 
+ +
135  return true;
+
136 }
+
137 
+
138 } // namespace mp2t
+
139 } // namespace media
+
140 } // namespace shaka
Abstract class holds stream information.
Definition: stream_info.h:58
-
virtual bool PushSample(const MediaSample &sample)
-
virtual std::unique_ptr< PesPacket > GetNextPesPacket()
- - -
virtual bool Initialize(const StreamInfo &stream)
+
virtual bool PushSample(const MediaSample &sample)
+
virtual std::unique_ptr< PesPacket > GetNextPesPacket()
+ + +
virtual bool Initialize(const StreamInfo &stream)
Class to hold a media sample.
Definition: media_sample.h:22
Class that carries PES packet information.
Definition: pes_packet.h:20
Holds video stream information.
@@ -233,7 +242,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/df8/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser.html b/docs/d2/df8/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser.html index 39052522b7..c94dad9644 100644 --- a/docs/d2/df8/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser.html +++ b/docs/d2/df8/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser.html @@ -131,7 +131,7 @@ size_t cluster_count ( diff --git a/docs/d2/dfc/classshaka_1_1media_1_1MkvWriter-members.html b/docs/d2/dfc/classshaka_1_1media_1_1MkvWriter-members.html index 56a91fecfa..fa668d5569 100644 --- a/docs/d2/dfc/classshaka_1_1media_1_1MkvWriter-members.html +++ b/docs/d2/dfc/classshaka_1_1media_1_1MkvWriter-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dfd/adts__header_8h_source.html b/docs/d2/dfd/adts__header_8h_source.html index 03d7fac874..167355fe6c 100644 --- a/docs/d2/dfd/adts__header_8h_source.html +++ b/docs/d2/dfd/adts__header_8h_source.html @@ -100,57 +100,60 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
11 
12 #include <vector>
13 
-
14 #include "packager/base/macros.h"
+
14 #include "packager/media/formats/mp2t/audio_header.h"
15 
16 namespace shaka {
17 namespace media {
18 namespace mp2t {
19 
-
22 class AdtsHeader {
+
22 class AdtsHeader : public AudioHeader {
23  public:
-
24  AdtsHeader();
-
25  ~AdtsHeader() {}
+
24  AdtsHeader() = default;
+
25  ~AdtsHeader() override = default;
26 
-
32  static size_t GetAdtsFrameSize(const uint8_t* data, size_t num_bytes);
-
33 
-
38  static size_t GetAdtsHeaderSize(const uint8_t* data, size_t num_bytes);
-
39 
-
45  bool Parse(const uint8_t* adts_frame, size_t adts_frame_size);
-
46 
-
52  bool GetAudioSpecificConfig(std::vector<uint8_t>* buffer) const;
-
53 
-
55  uint8_t GetObjectType() const;
-
56 
-
58  uint32_t GetSamplingFrequency() const;
-
59 
-
61  uint8_t GetNumChannels() const;
-
62 
-
63  private:
-
64  bool valid_config_;
-
65  uint8_t profile_;
-
66  uint8_t sampling_frequency_index_;
-
67  uint8_t channel_configuration_;
-
68 
-
69  DISALLOW_COPY_AND_ASSIGN(AdtsHeader);
-
70 };
-
71 
-
72 } // namespace mp2t
-
73 } // namespace media
-
74 } // namespace shaka
-
75 
-
76 #endif // MEDIA_FORMATS_MP2T_ADTS_HEADER_H_
-
uint8_t GetObjectType() const
Definition: adts_header.cc:97
-
uint8_t GetNumChannels() const
Definition: adts_header.cc:106
-
bool Parse(const uint8_t *adts_frame, size_t adts_frame_size)
Definition: adts_header.cc:39
-
uint32_t GetSamplingFrequency() const
Definition: adts_header.cc:101
-
static size_t GetAdtsFrameSize(const uint8_t *data, size_t num_bytes)
Definition: adts_header.cc:23
-
bool GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const
Definition: adts_header.cc:85
+
29  bool IsSyncWord(const uint8_t* buf) const override;
+
30  size_t GetMinFrameSize() const override;
+
31  size_t GetSamplesPerFrame() const override;
+
32  bool Parse(const uint8_t* adts_frame, size_t adts_frame_size) override;
+
33  size_t GetHeaderSize() const override;
+
34  size_t GetFrameSize() const override;
+
35  void GetAudioSpecificConfig(std::vector<uint8_t>* buffer) const override;
+
36  uint8_t GetObjectType() const override;
+
37  uint32_t GetSamplingFrequency() const override;
+
38  uint8_t GetNumChannels() const override;
+
40 
+
41  private:
+
42  AdtsHeader(const AdtsHeader&) = delete;
+
43  AdtsHeader& operator=(const AdtsHeader&) = delete;
+
44 
+
45  uint8_t protection_absent_ = 0;
+
46  uint16_t frame_size_ = 0;
+
47  uint8_t profile_ = 0;
+
48  uint8_t sampling_frequency_index_ = 0;
+
49  uint8_t channel_configuration_ = 0;
+
50 };
+
51 
+
52 } // namespace mp2t
+
53 } // namespace media
+
54 } // namespace shaka
+
55 
+
56 #endif // MEDIA_FORMATS_MP2T_ADTS_HEADER_H_
+
size_t GetHeaderSize() const override
Definition: adts_header.cc:83
+
uint8_t GetObjectType() const override
Definition: adts_header.cc:102
+
size_t GetSamplesPerFrame() const override
Definition: adts_header.cc:41
+
size_t GetMinFrameSize() const override
Definition: adts_header.cc:37
+
bool IsSyncWord(const uint8_t *buf) const override
Definition: adts_header.cc:33
+
uint8_t GetNumChannels() const override
Definition: adts_header.cc:111
+
uint32_t GetSamplingFrequency() const override
Definition: adts_header.cc:106
+
void GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const override
Definition: adts_header.cc:92
+ +
bool Parse(const uint8_t *adts_frame, size_t adts_frame_size) override
Definition: adts_header.cc:46
-
static size_t GetAdtsHeaderSize(const uint8_t *data, size_t num_bytes)
Definition: adts_header.cc:31
+
size_t GetFrameSize() const override
Definition: adts_header.cc:88
diff --git a/docs/d3/d07/classshaka_1_1media_1_1mp4_1_1BoxReader-members.html b/docs/d3/d07/classshaka_1_1media_1_1mp4_1_1BoxReader-members.html index 5274477911..ae6ecb50b6 100644 --- a/docs/d3/d07/classshaka_1_1media_1_1mp4_1_1BoxReader-members.html +++ b/docs/d3/d07/classshaka_1_1media_1_1mp4_1_1BoxReader-members.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d07/mpd__params_8h_source.html b/docs/d3/d07/mpd__params_8h_source.html index 71bb6387d8..7e3a6c53a3 100644 --- a/docs/d3/d07/mpd__params_8h_source.html +++ b/docs/d3/d07/mpd__params_8h_source.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d09/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator-members.html b/docs/d3/d09/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator-members.html index e5080185c6..cda5ef116f 100644 --- a/docs/d3/d09/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator-members.html +++ b/docs/d3/d09/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d0a/classshaka_1_1media_1_1MediaParser.html b/docs/d3/d0a/classshaka_1_1media_1_1MediaParser.html index ae796e16a6..d61dd5c43d 100644 --- a/docs/d3/d0a/classshaka_1_1media_1_1MediaParser.html +++ b/docs/d3/d0a/classshaka_1_1media_1_1MediaParser.html @@ -299,7 +299,7 @@ Public Member Functions diff --git a/docs/d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html b/docs/d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html index 933a53c3df..5dfbf51a92 100644 --- a/docs/d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html +++ b/docs/d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html @@ -87,8 +87,6 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
shaka::media::mp2t::AdtsHeader Class Reference
@@ -96,33 +94,46 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');

#include <adts_header.h>

+
+Inheritance diagram for shaka::media::mp2t::AdtsHeader:
+
+
+ + +shaka::media::mp2t::AudioHeader + +
- - - - - - - - - - -

Public Member Functions

bool Parse (const uint8_t *adts_frame, size_t adts_frame_size)
 
bool GetAudioSpecificConfig (std::vector< uint8_t > *buffer) const
 
uint8_t GetObjectType () const
 
uint32_t GetSamplingFrequency () const
 
uint8_t GetNumChannels () const
 
- - - - - + + + + + + + + + + + + + + + + + + + + +

-Static Public Member Functions

static size_t GetAdtsFrameSize (const uint8_t *data, size_t num_bytes)
 
static size_t GetAdtsHeaderSize (const uint8_t *data, size_t num_bytes)
 
AudioHeader implementation overrides.
bool IsSyncWord (const uint8_t *buf) const override
 
size_t GetMinFrameSize () const override
 
size_t GetSamplesPerFrame () const override
 
bool Parse (const uint8_t *adts_frame, size_t adts_frame_size) override
 
size_t GetHeaderSize () const override
 
size_t GetFrameSize () const override
 
void GetAudioSpecificConfig (std::vector< uint8_t > *buffer) const override
 
uint8_t GetObjectType () const override
 
uint32_t GetSamplingFrequency () const override
 
uint8_t GetNumChannels () const override
 

Detailed Description

-

Class which parses ADTS headers and synthesizes AudioSpecificConfig and audio mime type from ADTS header contents.

+

Class which parses ADTS frame (header / metadata) and synthesizes AudioSpecificConfig from audio frame content.

Definition at line 22 of file adts_header.h.

Member Function Documentation

- +
@@ -130,102 +141,20 @@ Static Public Member Functions - - -
- - - - - - - - - - - - - - - - -
size_t shaka::media::mp2t::AdtsHeader::GetAdtsFrameSize (const uint8_t * data,
size_t num_bytes 
)
-
-static
-
-

Get the size of the ADTS frame from a partial or complete frame.

-
Parameters
- - - -
datais a pointer to the beginning of the ADTS frame.
num_bytesis the number of data bytes at data.
-
-
-
Returns
Size of the ADTS frame (header + payload) if successful, or zero otherwise.
- -

Definition at line 23 of file adts_header.cc.

- -
-
- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t shaka::media::mp2t::AdtsHeader::GetAdtsHeaderSize (const uint8_t * data,
size_t num_bytes 
)
-
-static
-
-

Get the size of the ADTS header from a partial or complete frame.

-
Parameters
- - - -
datais a pointer to the beginning of the ADTS frame.
num_bytesis the number of data bytes at data.
-
-
-
Returns
Size of the ADTS header if successful, or zero otherwise.
- -

Definition at line 31 of file adts_header.cc.

- -
-
- -
-
- - - +
bool shaka::media::mp2t::AdtsHeader::GetAudioSpecificConfig void shaka::media::mp2t::AdtsHeader::GetAudioSpecificConfig ( std::vector< uint8_t > *  buffer) const
+ + +overridevirtual + +
-

Synthesize an AudioSpecificConfig record from the fields within the ADTS header.

+

Synthesize an AudioSpecificConfig record from the fields within the audio header. Should only be called after a successful Parse.

Parameters
@@ -234,13 +163,104 @@ Static Public Member Functions
Returns
true if successful, false otherwise.
-

Definition at line 85 of file adts_header.cc.

+

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 92 of file adts_header.cc.

- +
+
[out]bufferis a pointer to a vector to contain the AudioSpecificConfig.
+ + + + +
+ + + + + + + +
size_t shaka::media::mp2t::AdtsHeader::GetFrameSize () const
+
+overridevirtual
+
+

Should only be called after a successful Parse.

+
Returns
the size of frame (header + payload).
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 88 of file adts_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t shaka::media::mp2t::AdtsHeader::GetHeaderSize () const
+
+overridevirtual
+
+

Should only be called after a successful Parse.

+
Returns
The size of audio header.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 83 of file adts_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t shaka::media::mp2t::AdtsHeader::GetMinFrameSize () const
+
+overridevirtual
+
+
Returns
The minium frame size.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 37 of file adts_header.cc.

+ +
+
+ +
+
+ + + + + +
@@ -249,16 +269,27 @@ Static Public Member Functions
uint8_t shaka::media::mp2t::AdtsHeader::GetNumChannels
const
+
+overridevirtual
-
Returns
Number of channels for this AAC config.
+

Should only be called after a successful Parse.

+
Returns
Number of channels for this frame.
-

Definition at line 106 of file adts_header.cc.

+

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 111 of file adts_header.cc.

- +
+ + + + + +
@@ -267,16 +298,55 @@ Static Public Member Functions
uint8_t shaka::media::mp2t::AdtsHeader::GetObjectType
const
+
+overridevirtual
-
Returns
The audio profile for this ADTS frame.
+

Should only be called after a successful Parse.

+
Returns
The audio profile for this frame. Only meaningful for AAC.
-

Definition at line 97 of file adts_header.cc.

+

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 102 of file adts_header.cc.

- +
+ + + + + +
+ + + + + + + +
size_t shaka::media::mp2t::AdtsHeader::GetSamplesPerFrame () const
+
+overridevirtual
+
+
Returns
Number of audio samples per frame.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 41 of file adts_header.cc.

+ +
+
+ +
+
+ + + + + +
@@ -285,28 +355,75 @@ Static Public Member Functions
uint32_t shaka::media::mp2t::AdtsHeader::GetSamplingFrequency
const
+
+overridevirtual
-
Returns
The sampling frequency for this ADTS frame.
+

Should only be called after a successful Parse.

+
Returns
The sampling frequency for this frame.
-

Definition at line 101 of file adts_header.cc.

+

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 106 of file adts_header.cc.

- +
+ + + + + +
+ + + + + + + + +
bool shaka::media::mp2t::AdtsHeader::IsSyncWord (const uint8_t * buf) const
+
+overridevirtual
+
+

Check if the leading word (2 bytes) is sync signal.

+
Parameters
+ + +
bufpoints to the buffer to be checked. Must be at least 2 bytes.
+
+
+
Returns
true if corresponds to a syncword.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 33 of file adts_header.cc.

+ +
+
+ +
+
+ + + + + +
- + - + @@ -314,18 +431,25 @@ Static Public Member Functions
bool shaka::media::mp2t::AdtsHeader::Parse ( const uint8_t * adts_frame, audio_frame,
size_t adts_frame_size audio_frame_size 
+
+overridevirtual
-

Parse an ADTS header, extracting the fields within.

+

Parse a partial audio frame, extracting the fields within. Only audio frame header / metadata is parsed. The audio_frame_size must contain the full header / metadata.

Parameters
- - + +
adts_frameis an input parameter pointing to the ADTS header of an ADTS-framed audio sample.
adts_frame_sizeis the size, in bytes of the input ADTS frame.
audio_frameis an input parameter pointing to an audio frame.
audio_frame_sizeis the size, in bytes of the input data. It can be smaller than the actual frame size, but it should not be smaller than the header size.
Returns
true if successful, false otherwise.
-

Definition at line 39 of file adts_header.cc.

+

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 46 of file adts_header.cc.

@@ -336,7 +460,7 @@ Static Public Member Functions
diff --git a/docs/d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.png b/docs/d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9431384d26af06d62956377bacef5d7e2c7ca0 GIT binary patch literal 792 zcmeAS@N?(olHy`uVBq!ia0vp^M}atigBeK9^K~==QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;+=UY3x8<6TQgWvomEKOR51XWY`c-|ZH{;{n zrza|WXE;s#yrN{MXzk3T{*C+2{9L^9!yC4#8*U%JRm6Jcchp{kEGg@KNA3lzIIz)w zo>lGT6m9R+jLZLh7L`rV{QB*B&xx3#J!!5_jl{b42J)X*(X3??`D)dF_qa%^+Tx2# zg7?0@dw1qTsi>wY@%3|gyu&`gW_3GlRim&@#u-Hn?i@o4`l23Ee)48>UI~IAV z79Cdla&E;jvGXgo{JTNET4!l6ra#!cs3!J;fx}h0?Af^Lr+~9cI<#@colGiU0rehHs|M6(;}jGUjO@j zcHR!hKK>vEP$2tF{WDplaML#LnY-R@ve&MilKOT3rlk!Zw-qh{j$nbIE@f75+gdsT>%xsKEOo~)dYJzlT<_v%ZV z@)lOOJ)QTo=hxfqzr`izFg=L)zJTG!I+(ws_IoI{6cqktym44F)LJMy0+@^$JYD@< J);T3K0RU7|b;|$% literal 0 HcmV?d00001 diff --git a/docs/d3/d12/classshaka_1_1media_1_1LibcryptoThreading-members.html b/docs/d3/d12/classshaka_1_1media_1_1LibcryptoThreading-members.html index 04b9c49c00..0bff0d1e1a 100644 --- a/docs/d3/d12/classshaka_1_1media_1_1LibcryptoThreading-members.html +++ b/docs/d3/d12/classshaka_1_1media_1_1LibcryptoThreading-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
diff --git a/docs/d3/d18/classshaka_1_1media_1_1mp2t_1_1TsSectionPat-members.html b/docs/d3/d18/classshaka_1_1media_1_1mp2t_1_1TsSectionPat-members.html index 5951ac3143..459279d394 100644 --- a/docs/d3/d18/classshaka_1_1media_1_1mp2t_1_1TsSectionPat-members.html +++ b/docs/d3/d18/classshaka_1_1media_1_1mp2t_1_1TsSectionPat-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
diff --git a/docs/d3/d19/io__cache_8h_source.html b/docs/d3/d19/io__cache_8h_source.html index d74bf7b856..d2c5739af8 100644 --- a/docs/d3/d19/io__cache_8h_source.html +++ b/docs/d3/d19/io__cache_8h_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d1a/classshaka_1_1media_1_1Replicator.html b/docs/d3/d1a/classshaka_1_1media_1_1Replicator.html index 0199cd359b..c089c71c8c 100644 --- a/docs/d3/d1a/classshaka_1_1media_1_1Replicator.html +++ b/docs/d3/d1a/classshaka_1_1media_1_1Replicator.html @@ -124,10 +124,6 @@ bool - Protected Member Functions inherited from shaka::media::MediaHandler Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -140,14 +136,18 @@ bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -182,7 +182,7 @@ std::pair< std::shared_ptr
diff --git a/docs/d3/d1e/classshaka_1_1media_1_1FakeInputMediaHandler.html b/docs/d3/d1e/classshaka_1_1media_1_1FakeInputMediaHandler.html index c91b1153c7..4e173625d7 100644 --- a/docs/d3/d1e/classshaka_1_1media_1_1FakeInputMediaHandler.html +++ b/docs/d3/d1e/classshaka_1_1media_1_1FakeInputMediaHandler.html @@ -126,10 +126,6 @@ virtual Status&#   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -142,14 +138,18 @@ virtual Status&# Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -183,7 +183,7 @@ std::pair< std::shared_ptr
diff --git a/docs/d3/d35/video__slice__header__parser_8cc_source.html b/docs/d3/d35/video__slice__header__parser_8cc_source.html index a32e3b0d80..92a679a3ee 100644 --- a/docs/d3/d35/video__slice__header__parser_8cc_source.html +++ b/docs/d3/d35/video__slice__header__parser_8cc_source.html @@ -200,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d47/structshaka_1_1media_1_1mp4_1_1PrivFrame.html b/docs/d3/d47/structshaka_1_1media_1_1mp4_1_1PrivFrame.html index 75cffa17e9..55730bd12b 100644 --- a/docs/d3/d47/structshaka_1_1media_1_1mp4_1_1PrivFrame.html +++ b/docs/d3/d47/structshaka_1_1media_1_1mp4_1_1PrivFrame.html @@ -129,7 +129,7 @@ std::string value diff --git a/docs/d3/d48/packager_8cc_source.html b/docs/d3/d48/packager_8cc_source.html index 2510751525..c534257993 100644 --- a/docs/d3/d48/packager_8cc_source.html +++ b/docs/d3/d48/packager_8cc_source.html @@ -110,538 +110,538 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
21 #include "packager/file/file.h"
22 #include "packager/hls/base/hls_notifier.h"
23 #include "packager/hls/base/simple_hls_notifier.h"
-
24 #include "packager/media/base/container_names.h"
-
25 #include "packager/media/base/fourccs.h"
-
26 #include "packager/media/base/key_source.h"
-
27 #include "packager/media/base/language_utils.h"
-
28 #include "packager/media/base/muxer_options.h"
-
29 #include "packager/media/base/muxer_util.h"
-
30 #include "packager/media/chunking/chunking_handler.h"
-
31 #include "packager/media/crypto/encryption_handler.h"
-
32 #include "packager/media/demuxer/demuxer.h"
-
33 #include "packager/media/event/combined_muxer_listener.h"
-
34 #include "packager/media/event/hls_notify_muxer_listener.h"
-
35 #include "packager/media/event/mpd_notify_muxer_listener.h"
-
36 #include "packager/media/event/vod_media_info_dump_muxer_listener.h"
-
37 #include "packager/media/formats/mp2t/ts_muxer.h"
-
38 #include "packager/media/formats/mp4/mp4_muxer.h"
-
39 #include "packager/media/formats/webm/webm_muxer.h"
-
40 #include "packager/media/replicator/replicator.h"
-
41 #include "packager/media/trick_play/trick_play_handler.h"
-
42 #include "packager/mpd/base/dash_iop_mpd_notifier.h"
-
43 #include "packager/mpd/base/media_info.pb.h"
-
44 #include "packager/mpd/base/mpd_builder.h"
-
45 #include "packager/mpd/base/simple_mpd_notifier.h"
-
46 #include "packager/version/version.h"
-
47 
-
48 namespace shaka {
-
49 
-
50 // TODO(kqyang): Clean up namespaces.
-
51 using media::Demuxer;
-
52 using media::KeySource;
-
53 using media::MuxerOptions;
-
54 
-
55 namespace media {
-
56 namespace {
-
57 
-
58 const char kMediaInfoSuffix[] = ".media_info";
-
59 
-
60 // TODO(rkuroiwa): Write TTML and WebVTT parser (demuxing) for a better check
-
61 // and for supporting live/segmenting (muxing). With a demuxer and a muxer,
-
62 // CreateAllJobs() shouldn't treat text as a special case.
-
63 std::string DetermineTextFileFormat(const std::string& file) {
-
64  std::string content;
-
65  if (!File::ReadFileToString(file.c_str(), &content)) {
-
66  LOG(ERROR) << "Failed to open file " << file
-
67  << " to determine file format.";
-
68  return "";
-
69  }
-
70  MediaContainerName container_name = DetermineContainer(
-
71  reinterpret_cast<const uint8_t*>(content.data()), content.size());
-
72  if (container_name == CONTAINER_WEBVTT) {
-
73  return "vtt";
-
74  } else if (container_name == CONTAINER_TTML) {
-
75  return "ttml";
-
76  }
-
77 
-
78  return "";
-
79 }
-
80 
-
81 MediaContainerName GetOutputFormat(const StreamDescriptor& descriptor) {
-
82  MediaContainerName output_format = CONTAINER_UNKNOWN;
-
83  if (!descriptor.output_format.empty()) {
-
84  output_format = DetermineContainerFromFormatName(descriptor.output_format);
-
85  if (output_format == CONTAINER_UNKNOWN) {
-
86  LOG(ERROR) << "Unable to determine output format from '"
-
87  << descriptor.output_format << "'.";
-
88  }
-
89  } else {
-
90  const std::string& output_name = descriptor.output.empty()
-
91  ? descriptor.segment_template
-
92  : descriptor.output;
-
93  if (output_name.empty())
-
94  return CONTAINER_UNKNOWN;
-
95  output_format = DetermineContainerFromFileName(output_name);
-
96  if (output_format == CONTAINER_UNKNOWN) {
-
97  LOG(ERROR) << "Unable to determine output format from '" << output_name
-
98  << "'.";
-
99  }
-
100  }
-
101  return output_format;
-
102 }
-
103 
-
104 Status ValidateStreamDescriptor(bool dump_stream_info,
-
105  const StreamDescriptor& stream) {
-
106  if (stream.input.empty()) {
-
107  return Status(error::INVALID_ARGUMENT, "Stream input not specified.");
-
108  }
-
109 
-
110  // The only time a stream can have no outputs, is when dump stream info is
-
111  // set.
-
112  if (dump_stream_info && stream.output.empty() &&
-
113  stream.segment_template.empty()) {
-
114  return Status::OK;
-
115  }
-
116 
-
117  if (stream.output.empty() && stream.segment_template.empty()) {
-
118  return Status(error::INVALID_ARGUMENT,
-
119  "Streams must specify 'output' or 'segment template'.");
-
120  }
-
121 
-
122  // Whenever there is output, a stream must be selected.
-
123  if (stream.stream_selector.empty()) {
-
124  return Status(error::INVALID_ARGUMENT,
-
125  "Stream stream_selector not specified.");
-
126  }
-
127 
-
128  // If a segment template is provided, it must be valid.
-
129  if (stream.segment_template.length()) {
-
130  Status template_check = ValidateSegmentTemplate(stream.segment_template);
-
131  if (!template_check.ok()) {
-
132  return template_check;
-
133  }
-
134  }
-
135 
-
136  // There are some specifics that must be checked based on which format
-
137  // we are writing to.
-
138  const MediaContainerName output_format = GetOutputFormat(stream);
-
139 
-
140  if (output_format == CONTAINER_UNKNOWN) {
-
141  return Status(error::INVALID_ARGUMENT, "Unsupported output format.");
-
142  } else if (output_format == MediaContainerName::CONTAINER_MPEG2TS) {
-
143  if (stream.segment_template.empty()) {
-
144  return Status(error::INVALID_ARGUMENT,
-
145  "Please specify segment_template. Single file TS output is "
-
146  "not supported.");
-
147  }
-
148 
-
149  // Right now the init segment is saved in |output| for multi-segment
-
150  // content. However, for TS all segments must be self-initializing so
-
151  // there cannot be an init segment.
-
152  if (stream.output.length()) {
-
153  return Status(error::INVALID_ARGUMENT,
-
154  "All TS segments must be self-initializing. Stream "
-
155  "descriptors 'output' or 'init_segment' are not allowed.");
-
156  }
-
157  } else {
-
158  // For any other format, if there is a segment template, there must be an
-
159  // init segment provided.
-
160  if (stream.segment_template.length() && stream.output.empty()) {
-
161  return Status(error::INVALID_ARGUMENT,
-
162  "Please specify 'init_segment'. All non-TS multi-segment "
-
163  "content must provide an init segment.");
-
164  }
-
165  }
-
166 
-
167  return Status::OK;
-
168 }
-
169 
-
170 Status ValidateParams(const PackagingParams& packaging_params,
-
171  const std::vector<StreamDescriptor>& stream_descriptors) {
-
172  if (!packaging_params.chunking_params.segment_sap_aligned &&
-
173  packaging_params.chunking_params.subsegment_sap_aligned) {
-
174  return Status(error::INVALID_ARGUMENT,
-
175  "Setting segment_sap_aligned to false but "
-
176  "subsegment_sap_aligned to true is not allowed.");
-
177  }
-
178 
-
179  if (stream_descriptors.empty()) {
-
180  return Status(error::INVALID_ARGUMENT,
-
181  "Stream descriptors cannot be empty.");
-
182  }
-
183 
-
184  // On demand profile generates single file segment while live profile
-
185  // generates multiple segments specified using segment template.
-
186  const bool on_demand_dash_profile =
-
187  stream_descriptors.begin()->segment_template.empty();
-
188  for (const auto& descriptor : stream_descriptors) {
-
189  if (on_demand_dash_profile != descriptor.segment_template.empty()) {
-
190  return Status(error::INVALID_ARGUMENT,
-
191  "Inconsistent stream descriptor specification: "
-
192  "segment_template should be specified for none or all "
-
193  "stream descriptors.");
-
194  }
-
195 
-
196  Status stream_check = ValidateStreamDescriptor(
-
197  packaging_params.test_params.dump_stream_info, descriptor);
-
198 
-
199  if (!stream_check.ok()) {
-
200  return stream_check;
-
201  }
-
202  }
-
203 
-
204  if (packaging_params.output_media_info && !on_demand_dash_profile) {
-
205  // TODO(rkuroiwa, kqyang): Support partial media info dump for live.
-
206  return Status(error::UNIMPLEMENTED,
-
207  "--output_media_info is only supported for on-demand profile "
-
208  "(not using segment_template).");
-
209  }
-
210 
-
211  return Status::OK;
-
212 }
-
213 
-
214 bool StreamDescriptorCompareFn(const StreamDescriptor& a,
-
215  const StreamDescriptor& b) {
-
216  if (a.input == b.input) {
-
217  if (a.stream_selector == b.stream_selector) {
-
218  // The MPD notifier requires that the main track comes first, so make
-
219  // sure that happens.
-
220  if (a.trick_play_factor == 0 || b.trick_play_factor == 0) {
-
221  return a.trick_play_factor == 0;
-
222  } else {
-
223  return a.trick_play_factor > b.trick_play_factor;
-
224  }
-
225  } else {
-
226  return a.stream_selector < b.stream_selector;
-
227  }
-
228  }
-
229 
-
230  return a.input < b.input;
-
231 }
-
232 
-
233 // A fake clock that always return time 0 (epoch). Should only be used for
-
234 // testing.
-
235 class FakeClock : public base::Clock {
-
236  public:
-
237  base::Time Now() override { return base::Time(); }
-
238 };
-
239 
-
240 class Job : public base::SimpleThread {
-
241  public:
-
242  Job(const std::string& name, std::shared_ptr<OriginHandler> work)
-
243  : SimpleThread(name),
-
244  work_(work),
-
245  wait_(base::WaitableEvent::ResetPolicy::MANUAL,
-
246  base::WaitableEvent::InitialState::NOT_SIGNALED) {}
-
247 
-
248  void Initialize() {
-
249  DCHECK(work_);
-
250  status_ = work_->Initialize();
-
251  }
-
252 
-
253  void Cancel() {
-
254  DCHECK(work_);
-
255  work_->Cancel();
-
256  }
-
257 
-
258  const Status& status() const { return status_; }
-
259 
-
260  base::WaitableEvent* wait() { return &wait_; }
-
261 
-
262  private:
-
263  Job(const Job&) = delete;
-
264  Job& operator=(const Job&) = delete;
-
265 
-
266  void Run() override {
-
267  DCHECK(work_);
-
268  status_ = work_->Run();
-
269  wait_.Signal();
-
270  }
-
271 
-
272  std::shared_ptr<OriginHandler> work_;
-
273  Status status_;
-
274 
-
275  base::WaitableEvent wait_;
-
276 };
-
277 
-
278 bool StreamInfoToTextMediaInfo(const StreamDescriptor& stream_descriptor,
-
279  MediaInfo* text_media_info) {
-
280  const std::string& language = stream_descriptor.language;
-
281  const std::string format = DetermineTextFileFormat(stream_descriptor.input);
-
282  if (format.empty()) {
-
283  LOG(ERROR) << "Failed to determine the text file format for "
-
284  << stream_descriptor.input;
-
285  return false;
-
286  }
-
287 
-
288  if (!File::Copy(stream_descriptor.input.c_str(),
-
289  stream_descriptor.output.c_str())) {
-
290  LOG(ERROR) << "Failed to copy the input file (" << stream_descriptor.input
-
291  << ") to output file (" << stream_descriptor.output << ").";
-
292  return false;
-
293  }
-
294 
-
295  text_media_info->set_media_file_name(stream_descriptor.output);
-
296  text_media_info->set_container_type(MediaInfo::CONTAINER_TEXT);
-
297 
-
298  if (stream_descriptor.bandwidth != 0) {
-
299  text_media_info->set_bandwidth(stream_descriptor.bandwidth);
-
300  } else {
-
301  // Text files are usually small and since the input is one file; there's no
-
302  // way for the player to do ranged requests. So set this value to something
-
303  // reasonable.
-
304  const int kDefaultTextBandwidth = 256;
-
305  text_media_info->set_bandwidth(kDefaultTextBandwidth);
-
306  }
-
307 
-
308  MediaInfo::TextInfo* text_info = text_media_info->mutable_text_info();
-
309  text_info->set_format(format);
-
310  if (!language.empty())
-
311  text_info->set_language(language);
-
312 
-
313  return true;
-
314 }
-
315 
-
316 std::unique_ptr<MuxerListener> CreateMuxerListener(
-
317  const StreamDescriptor& stream,
-
318  int stream_number,
-
319  bool output_media_info,
-
320  MpdNotifier* mpd_notifier,
-
321  hls::HlsNotifier* hls_notifier) {
-
322  std::unique_ptr<CombinedMuxerListener> combined_listener(
-
323  new CombinedMuxerListener);
-
324 
-
325  if (output_media_info) {
-
326  std::unique_ptr<MuxerListener> listener(
-
327  new VodMediaInfoDumpMuxerListener(stream.output + kMediaInfoSuffix));
-
328  combined_listener->AddListener(std::move(listener));
-
329  }
-
330 
-
331  if (mpd_notifier) {
-
332  std::unique_ptr<MuxerListener> listener(
-
333  new MpdNotifyMuxerListener(mpd_notifier));
-
334  combined_listener->AddListener(std::move(listener));
-
335  }
-
336 
-
337  if (hls_notifier) {
-
338  // TODO(rkuroiwa): Do some smart stuff to group the audios, e.g. detect
-
339  // languages.
-
340  std::string group_id = stream.hls_group_id;
-
341  std::string name = stream.hls_name;
-
342  std::string hls_playlist_name = stream.hls_playlist_name;
-
343  if (group_id.empty())
-
344  group_id = "audio";
-
345  if (name.empty())
-
346  name = base::StringPrintf("stream_%d", stream_number);
-
347  if (hls_playlist_name.empty())
-
348  hls_playlist_name = base::StringPrintf("stream_%d.m3u8", stream_number);
-
349 
-
350  std::unique_ptr<MuxerListener> listener(new HlsNotifyMuxerListener(
-
351  hls_playlist_name, name, group_id, hls_notifier));
-
352  combined_listener->AddListener(std::move(listener));
-
353  }
-
354 
-
355  return std::move(combined_listener);
-
356 }
-
357 
-
358 std::shared_ptr<Muxer> CreateMuxer(const PackagingParams& packaging_params,
-
359  const StreamDescriptor& stream,
-
360  base::Clock* clock,
-
361  std::unique_ptr<MuxerListener> listener) {
-
362  const MediaContainerName format = GetOutputFormat(stream);
-
363 
-
364  MuxerOptions options;
-
365  options.mp4_params = packaging_params.mp4_output_params;
-
366  options.temp_dir = packaging_params.temp_dir;
-
367  options.bandwidth = stream.bandwidth;
-
368  options.output_file_name = stream.output;
-
369  options.segment_template = stream.segment_template;
-
370 
-
371  std::shared_ptr<Muxer> muxer;
-
372 
-
373  switch (format) {
-
374  case CONTAINER_WEBM:
-
375  muxer = std::make_shared<webm::WebMMuxer>(options);
-
376  break;
-
377  case CONTAINER_MPEG2TS:
-
378  muxer = std::make_shared<mp2t::TsMuxer>(options);
-
379  break;
-
380  case CONTAINER_MOV:
-
381  muxer = std::make_shared<mp4::MP4Muxer>(options);
-
382  break;
-
383  default:
-
384  LOG(ERROR) << "Cannot support muxing to " << format;
-
385  break;
-
386  }
-
387 
-
388  if (!muxer) {
-
389  return nullptr;
-
390  }
-
391 
-
392  // We successfully created a muxer, then there is a couple settings
-
393  // we should set before returning it.
-
394  if (clock) {
-
395  muxer->set_clock(clock);
-
396  }
-
397 
-
398  if (listener) {
-
399  muxer->SetMuxerListener(std::move(listener));
-
400  }
-
401 
-
402  return muxer;
-
403 }
-
404 
-
405 std::shared_ptr<MediaHandler> CreateEncryptionHandler(
-
406  const PackagingParams& packaging_params,
-
407  const StreamDescriptor& stream,
-
408  KeySource* key_source) {
-
409  if (stream.skip_encryption) {
-
410  return nullptr;
-
411  }
-
412 
-
413  if (!key_source) {
-
414  return nullptr;
-
415  }
-
416 
-
417  // Make a copy so that we can modify it for this specific stream.
-
418  EncryptionParams encryption_params = packaging_params.encryption_params;
-
419 
-
420  // Use Sample AES in MPEG2TS.
-
421  // TODO(kqyang): Consider adding a new flag to enable Sample AES as we
-
422  // will support CENC in TS in the future.
-
423  if (GetOutputFormat(stream) == CONTAINER_MPEG2TS) {
-
424  VLOG(1) << "Use Apple Sample AES encryption for MPEG2TS.";
-
425  encryption_params.protection_scheme = kAppleSampleAesProtectionScheme;
-
426  }
-
427 
-
428  if (!stream.drm_label.empty()) {
-
429  const std::string& drm_label = stream.drm_label;
-
430  encryption_params.stream_label_func =
-
431  [drm_label](const EncryptionParams::EncryptedStreamAttributes&) {
-
432  return drm_label;
-
433  };
-
434  } else if (!encryption_params.stream_label_func) {
-
435  const int kDefaultMaxSdPixels = 768 * 576;
-
436  const int kDefaultMaxHdPixels = 1920 * 1080;
-
437  const int kDefaultMaxUhd1Pixels = 4096 * 2160;
-
438  encryption_params.stream_label_func = std::bind(
-
439  &Packager::DefaultStreamLabelFunction, kDefaultMaxSdPixels,
-
440  kDefaultMaxHdPixels, kDefaultMaxUhd1Pixels, std::placeholders::_1);
-
441  }
-
442 
-
443  return std::make_shared<EncryptionHandler>(encryption_params, key_source);
-
444 }
-
445 
-
446 Status CreateTextJobs(
-
447  int first_stream_number,
+
24 #include "packager/media/ad_cue_generator/ad_cue_generator.h"
+
25 #include "packager/media/base/container_names.h"
+
26 #include "packager/media/base/fourccs.h"
+
27 #include "packager/media/base/key_source.h"
+
28 #include "packager/media/base/language_utils.h"
+
29 #include "packager/media/base/muxer_options.h"
+
30 #include "packager/media/base/muxer_util.h"
+
31 #include "packager/media/chunking/chunking_handler.h"
+
32 #include "packager/media/crypto/encryption_handler.h"
+
33 #include "packager/media/demuxer/demuxer.h"
+
34 #include "packager/media/event/combined_muxer_listener.h"
+
35 #include "packager/media/event/hls_notify_muxer_listener.h"
+
36 #include "packager/media/event/mpd_notify_muxer_listener.h"
+
37 #include "packager/media/event/vod_media_info_dump_muxer_listener.h"
+
38 #include "packager/media/formats/mp2t/ts_muxer.h"
+
39 #include "packager/media/formats/mp4/mp4_muxer.h"
+
40 #include "packager/media/formats/webm/webm_muxer.h"
+
41 #include "packager/media/replicator/replicator.h"
+
42 #include "packager/media/trick_play/trick_play_handler.h"
+
43 #include "packager/mpd/base/dash_iop_mpd_notifier.h"
+
44 #include "packager/mpd/base/media_info.pb.h"
+
45 #include "packager/mpd/base/mpd_builder.h"
+
46 #include "packager/mpd/base/simple_mpd_notifier.h"
+
47 #include "packager/version/version.h"
+
48 
+
49 namespace shaka {
+
50 
+
51 // TODO(kqyang): Clean up namespaces.
+
52 using media::Demuxer;
+
53 using media::KeySource;
+
54 using media::MuxerOptions;
+
55 
+
56 namespace media {
+
57 namespace {
+
58 
+
59 const char kMediaInfoSuffix[] = ".media_info";
+
60 
+
61 // TODO(rkuroiwa): Write TTML and WebVTT parser (demuxing) for a better check
+
62 // and for supporting live/segmenting (muxing). With a demuxer and a muxer,
+
63 // CreateAllJobs() shouldn't treat text as a special case.
+
64 std::string DetermineTextFileFormat(const std::string& file) {
+
65  std::string content;
+
66  if (!File::ReadFileToString(file.c_str(), &content)) {
+
67  LOG(ERROR) << "Failed to open file " << file
+
68  << " to determine file format.";
+
69  return "";
+
70  }
+
71  MediaContainerName container_name = DetermineContainer(
+
72  reinterpret_cast<const uint8_t*>(content.data()), content.size());
+
73  if (container_name == CONTAINER_WEBVTT) {
+
74  return "vtt";
+
75  } else if (container_name == CONTAINER_TTML) {
+
76  return "ttml";
+
77  }
+
78 
+
79  return "";
+
80 }
+
81 
+
82 MediaContainerName GetOutputFormat(const StreamDescriptor& descriptor) {
+
83  MediaContainerName output_format = CONTAINER_UNKNOWN;
+
84  if (!descriptor.output_format.empty()) {
+
85  output_format = DetermineContainerFromFormatName(descriptor.output_format);
+
86  if (output_format == CONTAINER_UNKNOWN) {
+
87  LOG(ERROR) << "Unable to determine output format from '"
+
88  << descriptor.output_format << "'.";
+
89  }
+
90  } else {
+
91  const std::string& output_name = descriptor.output.empty()
+
92  ? descriptor.segment_template
+
93  : descriptor.output;
+
94  if (output_name.empty())
+
95  return CONTAINER_UNKNOWN;
+
96  output_format = DetermineContainerFromFileName(output_name);
+
97  if (output_format == CONTAINER_UNKNOWN) {
+
98  LOG(ERROR) << "Unable to determine output format from '" << output_name
+
99  << "'.";
+
100  }
+
101  }
+
102  return output_format;
+
103 }
+
104 
+
105 Status ValidateStreamDescriptor(bool dump_stream_info,
+
106  const StreamDescriptor& stream) {
+
107  if (stream.input.empty()) {
+
108  return Status(error::INVALID_ARGUMENT, "Stream input not specified.");
+
109  }
+
110 
+
111  // The only time a stream can have no outputs, is when dump stream info is
+
112  // set.
+
113  if (dump_stream_info && stream.output.empty() &&
+
114  stream.segment_template.empty()) {
+
115  return Status::OK;
+
116  }
+
117 
+
118  if (stream.output.empty() && stream.segment_template.empty()) {
+
119  return Status(error::INVALID_ARGUMENT,
+
120  "Streams must specify 'output' or 'segment template'.");
+
121  }
+
122 
+
123  // Whenever there is output, a stream must be selected.
+
124  if (stream.stream_selector.empty()) {
+
125  return Status(error::INVALID_ARGUMENT,
+
126  "Stream stream_selector not specified.");
+
127  }
+
128 
+
129  // If a segment template is provided, it must be valid.
+
130  if (stream.segment_template.length()) {
+
131  Status template_check = ValidateSegmentTemplate(stream.segment_template);
+
132  if (!template_check.ok()) {
+
133  return template_check;
+
134  }
+
135  }
+
136 
+
137  // There are some specifics that must be checked based on which format
+
138  // we are writing to.
+
139  const MediaContainerName output_format = GetOutputFormat(stream);
+
140 
+
141  if (output_format == CONTAINER_UNKNOWN) {
+
142  return Status(error::INVALID_ARGUMENT, "Unsupported output format.");
+
143  } else if (output_format == MediaContainerName::CONTAINER_MPEG2TS) {
+
144  if (stream.segment_template.empty()) {
+
145  return Status(error::INVALID_ARGUMENT,
+
146  "Please specify segment_template. Single file TS output is "
+
147  "not supported.");
+
148  }
+
149 
+
150  // Right now the init segment is saved in |output| for multi-segment
+
151  // content. However, for TS all segments must be self-initializing so
+
152  // there cannot be an init segment.
+
153  if (stream.output.length()) {
+
154  return Status(error::INVALID_ARGUMENT,
+
155  "All TS segments must be self-initializing. Stream "
+
156  "descriptors 'output' or 'init_segment' are not allowed.");
+
157  }
+
158  } else {
+
159  // For any other format, if there is a segment template, there must be an
+
160  // init segment provided.
+
161  if (stream.segment_template.length() && stream.output.empty()) {
+
162  return Status(error::INVALID_ARGUMENT,
+
163  "Please specify 'init_segment'. All non-TS multi-segment "
+
164  "content must provide an init segment.");
+
165  }
+
166  }
+
167 
+
168  return Status::OK;
+
169 }
+
170 
+
171 Status ValidateParams(const PackagingParams& packaging_params,
+
172  const std::vector<StreamDescriptor>& stream_descriptors) {
+
173  if (!packaging_params.chunking_params.segment_sap_aligned &&
+
174  packaging_params.chunking_params.subsegment_sap_aligned) {
+
175  return Status(error::INVALID_ARGUMENT,
+
176  "Setting segment_sap_aligned to false but "
+
177  "subsegment_sap_aligned to true is not allowed.");
+
178  }
+
179 
+
180  if (stream_descriptors.empty()) {
+
181  return Status(error::INVALID_ARGUMENT,
+
182  "Stream descriptors cannot be empty.");
+
183  }
+
184 
+
185  // On demand profile generates single file segment while live profile
+
186  // generates multiple segments specified using segment template.
+
187  const bool on_demand_dash_profile =
+
188  stream_descriptors.begin()->segment_template.empty();
+
189  for (const auto& descriptor : stream_descriptors) {
+
190  if (on_demand_dash_profile != descriptor.segment_template.empty()) {
+
191  return Status(error::INVALID_ARGUMENT,
+
192  "Inconsistent stream descriptor specification: "
+
193  "segment_template should be specified for none or all "
+
194  "stream descriptors.");
+
195  }
+
196 
+
197  Status stream_check = ValidateStreamDescriptor(
+
198  packaging_params.test_params.dump_stream_info, descriptor);
+
199 
+
200  if (!stream_check.ok()) {
+
201  return stream_check;
+
202  }
+
203  }
+
204 
+
205  if (packaging_params.output_media_info && !on_demand_dash_profile) {
+
206  // TODO(rkuroiwa, kqyang): Support partial media info dump for live.
+
207  return Status(error::UNIMPLEMENTED,
+
208  "--output_media_info is only supported for on-demand profile "
+
209  "(not using segment_template).");
+
210  }
+
211 
+
212  return Status::OK;
+
213 }
+
214 
+
215 bool StreamDescriptorCompareFn(const StreamDescriptor& a,
+
216  const StreamDescriptor& b) {
+
217  if (a.input == b.input) {
+
218  if (a.stream_selector == b.stream_selector) {
+
219  // The MPD notifier requires that the main track comes first, so make
+
220  // sure that happens.
+
221  if (a.trick_play_factor == 0 || b.trick_play_factor == 0) {
+
222  return a.trick_play_factor == 0;
+
223  } else {
+
224  return a.trick_play_factor > b.trick_play_factor;
+
225  }
+
226  } else {
+
227  return a.stream_selector < b.stream_selector;
+
228  }
+
229  }
+
230 
+
231  return a.input < b.input;
+
232 }
+
233 
+
234 // A fake clock that always return time 0 (epoch). Should only be used for
+
235 // testing.
+
236 class FakeClock : public base::Clock {
+
237  public:
+
238  base::Time Now() override { return base::Time(); }
+
239 };
+
240 
+
241 class Job : public base::SimpleThread {
+
242  public:
+
243  Job(const std::string& name, std::shared_ptr<OriginHandler> work)
+
244  : SimpleThread(name),
+
245  work_(work),
+
246  wait_(base::WaitableEvent::ResetPolicy::MANUAL,
+
247  base::WaitableEvent::InitialState::NOT_SIGNALED) {}
+
248 
+
249  void Initialize() {
+
250  DCHECK(work_);
+
251  status_ = work_->Initialize();
+
252  }
+
253 
+
254  void Cancel() {
+
255  DCHECK(work_);
+
256  work_->Cancel();
+
257  }
+
258 
+
259  const Status& status() const { return status_; }
+
260 
+
261  base::WaitableEvent* wait() { return &wait_; }
+
262 
+
263  private:
+
264  Job(const Job&) = delete;
+
265  Job& operator=(const Job&) = delete;
+
266 
+
267  void Run() override {
+
268  DCHECK(work_);
+
269  status_ = work_->Run();
+
270  wait_.Signal();
+
271  }
+
272 
+
273  std::shared_ptr<OriginHandler> work_;
+
274  Status status_;
+
275 
+
276  base::WaitableEvent wait_;
+
277 };
+
278 
+
279 bool StreamInfoToTextMediaInfo(const StreamDescriptor& stream_descriptor,
+
280  MediaInfo* text_media_info) {
+
281  const std::string& language = stream_descriptor.language;
+
282  const std::string format = DetermineTextFileFormat(stream_descriptor.input);
+
283  if (format.empty()) {
+
284  LOG(ERROR) << "Failed to determine the text file format for "
+
285  << stream_descriptor.input;
+
286  return false;
+
287  }
+
288 
+
289  if (!File::Copy(stream_descriptor.input.c_str(),
+
290  stream_descriptor.output.c_str())) {
+
291  LOG(ERROR) << "Failed to copy the input file (" << stream_descriptor.input
+
292  << ") to output file (" << stream_descriptor.output << ").";
+
293  return false;
+
294  }
+
295 
+
296  text_media_info->set_media_file_name(stream_descriptor.output);
+
297  text_media_info->set_container_type(MediaInfo::CONTAINER_TEXT);
+
298 
+
299  if (stream_descriptor.bandwidth != 0) {
+
300  text_media_info->set_bandwidth(stream_descriptor.bandwidth);
+
301  } else {
+
302  // Text files are usually small and since the input is one file; there's no
+
303  // way for the player to do ranged requests. So set this value to something
+
304  // reasonable.
+
305  const int kDefaultTextBandwidth = 256;
+
306  text_media_info->set_bandwidth(kDefaultTextBandwidth);
+
307  }
+
308 
+
309  MediaInfo::TextInfo* text_info = text_media_info->mutable_text_info();
+
310  text_info->set_format(format);
+
311  if (!language.empty())
+
312  text_info->set_language(language);
+
313 
+
314  return true;
+
315 }
+
316 
+
317 std::unique_ptr<MuxerListener> CreateMuxerListener(
+
318  const StreamDescriptor& stream,
+
319  int stream_number,
+
320  bool output_media_info,
+
321  MpdNotifier* mpd_notifier,
+
322  hls::HlsNotifier* hls_notifier) {
+
323  std::unique_ptr<CombinedMuxerListener> combined_listener(
+
324  new CombinedMuxerListener);
+
325 
+
326  if (output_media_info) {
+
327  std::unique_ptr<MuxerListener> listener(
+
328  new VodMediaInfoDumpMuxerListener(stream.output + kMediaInfoSuffix));
+
329  combined_listener->AddListener(std::move(listener));
+
330  }
+
331 
+
332  if (mpd_notifier) {
+
333  std::unique_ptr<MuxerListener> listener(
+
334  new MpdNotifyMuxerListener(mpd_notifier));
+
335  combined_listener->AddListener(std::move(listener));
+
336  }
+
337 
+
338  if (hls_notifier) {
+
339  // TODO(rkuroiwa): Do some smart stuff to group the audios, e.g. detect
+
340  // languages.
+
341  std::string group_id = stream.hls_group_id;
+
342  std::string name = stream.hls_name;
+
343  std::string hls_playlist_name = stream.hls_playlist_name;
+
344  if (group_id.empty())
+
345  group_id = "audio";
+
346  if (name.empty())
+
347  name = base::StringPrintf("stream_%d", stream_number);
+
348  if (hls_playlist_name.empty())
+
349  hls_playlist_name = base::StringPrintf("stream_%d.m3u8", stream_number);
+
350 
+
351  std::unique_ptr<MuxerListener> listener(new HlsNotifyMuxerListener(
+
352  hls_playlist_name, name, group_id, hls_notifier));
+
353  combined_listener->AddListener(std::move(listener));
+
354  }
+
355 
+
356  return std::move(combined_listener);
+
357 }
+
358 
+
359 std::shared_ptr<Muxer> CreateMuxer(const PackagingParams& packaging_params,
+
360  const StreamDescriptor& stream,
+
361  base::Clock* clock,
+
362  std::unique_ptr<MuxerListener> listener) {
+
363  const MediaContainerName format = GetOutputFormat(stream);
+
364 
+
365  MuxerOptions options;
+
366  options.mp4_params = packaging_params.mp4_output_params;
+
367  options.temp_dir = packaging_params.temp_dir;
+
368  options.bandwidth = stream.bandwidth;
+
369  options.output_file_name = stream.output;
+
370  options.segment_template = stream.segment_template;
+
371 
+
372  std::shared_ptr<Muxer> muxer;
+
373 
+
374  switch (format) {
+
375  case CONTAINER_WEBM:
+
376  muxer = std::make_shared<webm::WebMMuxer>(options);
+
377  break;
+
378  case CONTAINER_MPEG2TS:
+
379  muxer = std::make_shared<mp2t::TsMuxer>(options);
+
380  break;
+
381  case CONTAINER_MOV:
+
382  muxer = std::make_shared<mp4::MP4Muxer>(options);
+
383  break;
+
384  default:
+
385  LOG(ERROR) << "Cannot support muxing to " << format;
+
386  break;
+
387  }
+
388 
+
389  if (!muxer) {
+
390  return nullptr;
+
391  }
+
392 
+
393  // We successfully created a muxer, then there is a couple settings
+
394  // we should set before returning it.
+
395  if (clock) {
+
396  muxer->set_clock(clock);
+
397  }
+
398 
+
399  if (listener) {
+
400  muxer->SetMuxerListener(std::move(listener));
+
401  }
+
402 
+
403  return muxer;
+
404 }
+
405 
+
406 std::shared_ptr<MediaHandler> CreateEncryptionHandler(
+
407  const PackagingParams& packaging_params,
+
408  const StreamDescriptor& stream,
+
409  KeySource* key_source) {
+
410  if (stream.skip_encryption) {
+
411  return nullptr;
+
412  }
+
413 
+
414  if (!key_source) {
+
415  return nullptr;
+
416  }
+
417 
+
418  // Make a copy so that we can modify it for this specific stream.
+
419  EncryptionParams encryption_params = packaging_params.encryption_params;
+
420 
+
421  // Use Sample AES in MPEG2TS.
+
422  // TODO(kqyang): Consider adding a new flag to enable Sample AES as we
+
423  // will support CENC in TS in the future.
+
424  if (GetOutputFormat(stream) == CONTAINER_MPEG2TS) {
+
425  VLOG(1) << "Use Apple Sample AES encryption for MPEG2TS.";
+
426  encryption_params.protection_scheme = kAppleSampleAesProtectionScheme;
+
427  }
+
428 
+
429  if (!stream.drm_label.empty()) {
+
430  const std::string& drm_label = stream.drm_label;
+
431  encryption_params.stream_label_func =
+
432  [drm_label](const EncryptionParams::EncryptedStreamAttributes&) {
+
433  return drm_label;
+
434  };
+
435  } else if (!encryption_params.stream_label_func) {
+
436  const int kDefaultMaxSdPixels = 768 * 576;
+
437  const int kDefaultMaxHdPixels = 1920 * 1080;
+
438  const int kDefaultMaxUhd1Pixels = 4096 * 2160;
+
439  encryption_params.stream_label_func = std::bind(
+
440  &Packager::DefaultStreamLabelFunction, kDefaultMaxSdPixels,
+
441  kDefaultMaxHdPixels, kDefaultMaxUhd1Pixels, std::placeholders::_1);
+
442  }
+
443 
+
444  return std::make_shared<EncryptionHandler>(encryption_params, key_source);
+
445 }
+
446 
+
447 Status CreateTextJobs(
448  const std::vector<std::reference_wrapper<const StreamDescriptor>>& streams,
449  const PackagingParams& packaging_params,
450  MpdNotifier* mpd_notifier,
451  std::vector<std::unique_ptr<Job>>* jobs) {
-
452  // -1 so that it will be back at |first_stream_number| on the first
-
453  // iteration.
-
454  int stream_number = first_stream_number - 1;
-
455 
-
456  for (const StreamDescriptor& stream : streams) {
-
457  stream_number += 1;
-
458 
-
459  const MediaContainerName output_format = GetOutputFormat(stream);
-
460 
-
461  if (output_format == CONTAINER_MOV) {
-
462  // TODO(vaage): Complete this part of the text pipeline. This path will
-
463  // be similar to the audio/video pipeline but with some components
-
464  // removed (e.g. trick play).
-
465  } else {
-
466  MediaInfo text_media_info;
-
467  if (!StreamInfoToTextMediaInfo(stream, &text_media_info)) {
-
468  return Status(error::INVALID_ARGUMENT,
-
469  "Could not create media info for stream.");
-
470  }
-
471 
-
472  if (mpd_notifier) {
-
473  uint32_t unused;
-
474  if (mpd_notifier->NotifyNewContainer(text_media_info, &unused)) {
-
475  mpd_notifier->Flush();
-
476  } else {
-
477  return Status(error::PARSER_FAILURE,
-
478  "Failed to process text file " + stream.input);
-
479  }
-
480  }
-
481 
-
482  if (packaging_params.output_media_info) {
- -
484  text_media_info, stream.output + kMediaInfoSuffix);
-
485  }
-
486  }
-
487  }
-
488 
-
489  return Status::OK;
-
490 }
-
491 
-
492 Status CreateAudioVideoJobs(
-
493  int first_stream_number,
-
494  const std::vector<std::reference_wrapper<const StreamDescriptor>>& streams,
-
495  const PackagingParams& packaging_params,
-
496  FakeClock* fake_clock,
-
497  KeySource* encryption_key_source,
-
498  MpdNotifier* mpd_notifier,
-
499  hls::HlsNotifier* hls_notifier,
-
500  std::vector<std::unique_ptr<Job>>* jobs) {
-
501  DCHECK(jobs);
+
452  for (const StreamDescriptor& stream : streams) {
+
453  const MediaContainerName output_format = GetOutputFormat(stream);
+
454 
+
455  if (output_format == CONTAINER_MOV) {
+
456  // TODO(vaage): Complete this part of the text pipeline. This path will
+
457  // be similar to the audio/video pipeline but with some components
+
458  // removed (e.g. trick play).
+
459  } else {
+
460  MediaInfo text_media_info;
+
461  if (!StreamInfoToTextMediaInfo(stream, &text_media_info)) {
+
462  return Status(error::INVALID_ARGUMENT,
+
463  "Could not create media info for stream.");
+
464  }
+
465 
+
466  if (mpd_notifier) {
+
467  uint32_t unused;
+
468  if (mpd_notifier->NotifyNewContainer(text_media_info, &unused)) {
+
469  mpd_notifier->Flush();
+
470  } else {
+
471  return Status(error::PARSER_FAILURE,
+
472  "Failed to process text file " + stream.input);
+
473  }
+
474  }
+
475 
+
476  if (packaging_params.output_media_info) {
+ +
478  text_media_info, stream.output + kMediaInfoSuffix);
+
479  }
+
480  }
+
481  }
+
482 
+
483  return Status::OK;
+
484 }
+
485 
+
486 Status CreateAudioVideoJobs(
+
487  int first_stream_number,
+
488  const std::vector<std::reference_wrapper<const StreamDescriptor>>& streams,
+
489  const PackagingParams& packaging_params,
+
490  FakeClock* fake_clock,
+
491  KeySource* encryption_key_source,
+
492  MpdNotifier* mpd_notifier,
+
493  hls::HlsNotifier* hls_notifier,
+
494  std::vector<std::unique_ptr<Job>>* jobs) {
+
495  DCHECK(jobs);
+
496 
+
497  // Demuxers are shared among all streams with the same input.
+
498  std::shared_ptr<Demuxer> demuxer;
+
499  // Replicators are shared among all streams with the same input and stream
+
500  // selector.
+
501  std::shared_ptr<MediaHandler> replicator;
502 
-
503  // Demuxers are shared among all streams with the same input.
-
504  std::shared_ptr<Demuxer> demuxer;
-
505  // Replicators are shared among all streams with the same input and stream
-
506  // selector.
-
507  std::shared_ptr<MediaHandler> replicator;
-
508 
-
509  std::string previous_input;
-
510  std::string previous_selector;
-
511 
-
512  // -1 so that it will be back at |first_stream_number| on the first
-
513  // iteration.
-
514  int stream_number = first_stream_number - 1;
-
515 
-
516  for (const StreamDescriptor& stream : streams) {
-
517  stream_number += 1;
-
518 
-
519  // If we changed our input files, we need a new demuxer.
-
520  if (previous_input != stream.input) {
-
521  demuxer = std::make_shared<Demuxer>(stream.input);
-
522 
-
523  demuxer->set_dump_stream_info(
-
524  packaging_params.test_params.dump_stream_info);
-
525  if (packaging_params.decryption_params.key_provider !=
-
526  KeyProvider::kNone) {
-
527  std::unique_ptr<KeySource> decryption_key_source(
-
528  CreateDecryptionKeySource(packaging_params.decryption_params));
-
529  if (!decryption_key_source) {
-
530  return Status(
-
531  error::INVALID_ARGUMENT,
-
532  "Must define decryption key source when defining key provider");
-
533  }
-
534  demuxer->SetKeySource(std::move(decryption_key_source));
-
535  }
-
536 
-
537  jobs->emplace_back(new media::Job("RemuxJob", demuxer));
-
538  }
-
539 
-
540  if (!stream.language.empty()) {
-
541  demuxer->SetLanguageOverride(stream.stream_selector, stream.language);
-
542  }
-
543 
-
544  const bool new_source = previous_input != stream.input ||
-
545  previous_selector != stream.stream_selector;
-
546  previous_input = stream.input;
-
547  previous_selector = stream.stream_selector;
+
503  std::string previous_input;
+
504  std::string previous_selector;
+
505 
+
506  // -1 so that it will be back at |first_stream_number| on the first
+
507  // iteration.
+
508  int stream_number = first_stream_number - 1;
+
509 
+
510  for (const StreamDescriptor& stream : streams) {
+
511  stream_number += 1;
+
512 
+
513  // If we changed our input files, we need a new demuxer.
+
514  if (previous_input != stream.input) {
+
515  demuxer = std::make_shared<Demuxer>(stream.input);
+
516 
+
517  demuxer->set_dump_stream_info(
+
518  packaging_params.test_params.dump_stream_info);
+
519  if (packaging_params.decryption_params.key_provider !=
+
520  KeyProvider::kNone) {
+
521  std::unique_ptr<KeySource> decryption_key_source(
+
522  CreateDecryptionKeySource(packaging_params.decryption_params));
+
523  if (!decryption_key_source) {
+
524  return Status(
+
525  error::INVALID_ARGUMENT,
+
526  "Must define decryption key source when defining key provider");
+
527  }
+
528  demuxer->SetKeySource(std::move(decryption_key_source));
+
529  }
+
530 
+
531  jobs->emplace_back(new media::Job("RemuxJob", demuxer));
+
532  }
+
533 
+
534  if (!stream.language.empty()) {
+
535  demuxer->SetLanguageOverride(stream.stream_selector, stream.language);
+
536  }
+
537 
+
538  const bool new_stream = previous_input != stream.input ||
+
539  previous_selector != stream.stream_selector;
+
540  previous_input = stream.input;
+
541  previous_selector = stream.stream_selector;
+
542 
+
543  // If the stream has no output, then there is no reason setting-up the rest
+
544  // of the pipeline.
+
545  if (stream.output.empty() && stream.segment_template.empty()) {
+
546  continue;
+
547  }
548 
-
549  // If the stream has no output, then there is no reason setting-up the rest
-
550  // of the pipeline.
-
551  if (stream.output.empty() && stream.segment_template.empty()) {
-
552  continue;
-
553  }
-
554 
-
555  if (new_source) {
+
549  if (new_stream) {
+
550  std::shared_ptr<MediaHandler> ad_cue_generator;
+
551  if (!packaging_params.ad_cue_generator_params.cue_points.empty()) {
+
552  ad_cue_generator = std::make_shared<AdCueGenerator>(
+
553  packaging_params.ad_cue_generator_params);
+
554  }
+
555 
556  replicator = std::make_shared<Replicator>();
557 
558  std::shared_ptr<MediaHandler> chunker =
@@ -651,399 +651,399 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
562  packaging_params, stream, encryption_key_source);
563 
564  Status status;
-
565 
-
566  // The path is different if there is encryption. Even though there are
-
567  // common elements, it is easier to understand the path if they are
-
568  // expressed independently of each other.
-
569  if (encryptor) {
+
565  if (ad_cue_generator) {
+
566  status.Update(
+
567  demuxer->SetHandler(stream.stream_selector, ad_cue_generator));
+
568  status.Update(ad_cue_generator->AddHandler(chunker));
+
569  } else {
570  status.Update(demuxer->SetHandler(stream.stream_selector, chunker));
-
571  status.Update(chunker->AddHandler(encryptor));
-
572  status.Update(encryptor->AddHandler(replicator));
-
573  } else {
-
574  status.Update(demuxer->SetHandler(stream.stream_selector, chunker));
-
575  status.Update(chunker->AddHandler(replicator));
-
576  }
-
577 
-
578  if (!status.ok()) {
-
579  return status;
-
580  }
-
581 
-
582  if (!stream.language.empty()) {
-
583  demuxer->SetLanguageOverride(stream.stream_selector, stream.language);
-
584  }
-
585  }
-
586 
-
587  // Create the muxer (output) for this track.
-
588  std::unique_ptr<MuxerListener> muxer_listener = CreateMuxerListener(
-
589  stream, stream_number, packaging_params.output_media_info, mpd_notifier,
-
590  hls_notifier);
-
591  std::shared_ptr<Muxer> muxer = CreateMuxer(
-
592  packaging_params, stream,
-
593  packaging_params.test_params.inject_fake_clock ? fake_clock : nullptr,
-
594  std::move(muxer_listener));
-
595 
-
596  if (!muxer) {
-
597  return Status(error::INVALID_ARGUMENT, "Failed to create muxer for " +
-
598  stream.input + ":" +
-
599  stream.stream_selector);
-
600  }
-
601 
-
602  std::shared_ptr<MediaHandler> trick_play;
-
603  if (stream.trick_play_factor) {
-
604  trick_play = std::make_shared<TrickPlayHandler>(stream.trick_play_factor);
-
605  }
-
606 
-
607  Status status;
-
608  if (trick_play) {
-
609  status.Update(replicator->AddHandler(trick_play));
-
610  status.Update(trick_play->AddHandler(muxer));
-
611  } else {
-
612  status.Update(replicator->AddHandler(muxer));
-
613  }
-
614 
-
615  if (!status.ok()) {
-
616  return status;
-
617  }
-
618  }
-
619 
-
620  return Status::OK;
-
621 }
-
622 
-
623 Status CreateAllJobs(const std::vector<StreamDescriptor>& stream_descriptors,
-
624  const PackagingParams& packaging_params,
-
625  FakeClock* fake_clock,
-
626  KeySource* encryption_key_source,
-
627  MpdNotifier* mpd_notifier,
-
628  hls::HlsNotifier* hls_notifier,
-
629  std::vector<std::unique_ptr<Job>>* jobs) {
-
630  DCHECK(jobs);
-
631 
-
632  // Group all streams based on which pipeline they will use.
-
633  std::vector<std::reference_wrapper<const StreamDescriptor>> text_streams;
-
634  std::vector<std::reference_wrapper<const StreamDescriptor>>
-
635  audio_video_streams;
-
636 
-
637  for (const StreamDescriptor& stream : stream_descriptors) {
-
638  // TODO: Find a better way to determine what stream type a stream
-
639  // descriptor is as |stream_selector| may use an index. This would
-
640  // also allow us to use a simpler audio pipeline.
-
641  if (stream.stream_selector == "text") {
-
642  text_streams.push_back(stream);
-
643  } else {
-
644  audio_video_streams.push_back(stream);
-
645  }
-
646  }
-
647 
-
648  // Audio/Video streams need to be in sorted order so that demuxers and trick
-
649  // play handlers get setup correctly.
-
650  std::sort(audio_video_streams.begin(), audio_video_streams.end(),
-
651  media::StreamDescriptorCompareFn);
-
652 
-
653  int stream_number = 0;
-
654 
-
655  Status status;
-
656 
-
657  status.Update(CreateTextJobs(stream_number, text_streams, packaging_params,
-
658  mpd_notifier, jobs));
-
659 
-
660  stream_number += text_streams.size();
-
661 
-
662  status.Update(CreateAudioVideoJobs(
-
663  stream_number, audio_video_streams, packaging_params, fake_clock,
-
664  encryption_key_source, mpd_notifier, hls_notifier, jobs));
-
665 
-
666  if (!status.ok()) {
-
667  return status;
-
668  }
-
669 
-
670  // Initialize processing graph.
-
671  for (const std::unique_ptr<Job>& job : *jobs) {
-
672  job->Initialize();
-
673  status.Update(job->status());
-
674  }
-
675 
-
676  return status;
-
677 }
-
678 
-
679 Status RunJobs(const std::vector<std::unique_ptr<Job>>& jobs) {
-
680  // We need to store the jobs and the waits separately in order to use the
-
681  // |WaitMany| function. |WaitMany| takes an array of WaitableEvents but we
-
682  // need to access the jobs in order to join the thread and check the status.
-
683  // The indexes needs to be check in sync or else we won't be able to relate a
-
684  // WaitableEvent back to the job.
-
685  std::vector<Job*> active_jobs;
-
686  std::vector<base::WaitableEvent*> active_waits;
-
687 
-
688  // Start every job and add it to the active jobs list so that we can wait
-
689  // on each one.
-
690  for (auto& job : jobs) {
-
691  job->Start();
-
692 
-
693  active_jobs.push_back(job.get());
-
694  active_waits.push_back(job->wait());
-
695  }
-
696 
-
697  // Wait for all jobs to complete or an error occurs.
-
698  Status status;
-
699  while (status.ok() && active_jobs.size()) {
-
700  // Wait for an event to finish and then update our status so that we can
-
701  // quit if something has gone wrong.
-
702  const size_t done =
-
703  base::WaitableEvent::WaitMany(active_waits.data(), active_waits.size());
-
704  Job* job = active_jobs[done];
-
705 
-
706  job->Join();
-
707  status.Update(job->status());
-
708 
-
709  // Remove the job and the wait from our tracking.
-
710  active_jobs.erase(active_jobs.begin() + done);
-
711  active_waits.erase(active_waits.begin() + done);
-
712  }
-
713 
-
714  // If the main loop has exited and there are still jobs running,
-
715  // we need to cancel them and clean-up.
-
716  for (auto& job : active_jobs) {
-
717  job->Cancel();
-
718  }
-
719 
-
720  for (auto& job : active_jobs) {
-
721  job->Join();
-
722  }
-
723 
-
724  return status;
-
725 }
-
726 
-
727 } // namespace
-
728 } // namespace media
-
729 
-
730 struct Packager::PackagerInternal {
-
731  media::FakeClock fake_clock;
-
732  std::unique_ptr<KeySource> encryption_key_source;
-
733  std::unique_ptr<MpdNotifier> mpd_notifier;
-
734  std::unique_ptr<hls::HlsNotifier> hls_notifier;
-
735  std::vector<std::unique_ptr<media::Job>> jobs;
-
736  BufferCallbackParams buffer_callback_params;
-
737 };
-
738 
-
739 Packager::Packager() {}
-
740 
-
741 Packager::~Packager() {}
-
742 
- -
744  const PackagingParams& packaging_params,
-
745  const std::vector<StreamDescriptor>& stream_descriptors) {
-
746  // Needed by base::WorkedPool used in ThreadedIoFile.
-
747  static base::AtExitManager exit;
-
748  static media::LibcryptoThreading libcrypto_threading;
-
749 
-
750  if (internal_)
-
751  return Status(error::INVALID_ARGUMENT, "Already initialized.");
-
752 
-
753  Status param_check =
-
754  media::ValidateParams(packaging_params, stream_descriptors);
-
755  if (!param_check.ok()) {
-
756  return param_check;
-
757  }
-
758 
-
759  if (!packaging_params.test_params.injected_library_version.empty()) {
-
760  SetPackagerVersionForTesting(
-
761  packaging_params.test_params.injected_library_version);
-
762  }
-
763 
-
764  std::unique_ptr<PackagerInternal> internal(new PackagerInternal);
-
765 
-
766  // Create encryption key source if needed.
-
767  if (packaging_params.encryption_params.key_provider != KeyProvider::kNone) {
-
768  internal->encryption_key_source = CreateEncryptionKeySource(
-
769  static_cast<media::FourCC>(
-
770  packaging_params.encryption_params.protection_scheme),
-
771  packaging_params.encryption_params);
-
772  if (!internal->encryption_key_source)
-
773  return Status(error::INVALID_ARGUMENT, "Failed to create key source.");
-
774  }
-
775 
-
776  // Store callback params to make it available during packaging.
-
777  internal->buffer_callback_params = packaging_params.buffer_callback_params;
-
778 
-
779  // Update mpd output and hls output if callback param is specified.
-
780  MpdParams mpd_params = packaging_params.mpd_params;
-
781  HlsParams hls_params = packaging_params.hls_params;
-
782  if (internal->buffer_callback_params.write_func) {
- -
784  internal->buffer_callback_params, mpd_params.mpd_output);
- -
786  internal->buffer_callback_params, hls_params.master_playlist_output);
-
787  }
-
788 
-
789  if (!mpd_params.mpd_output.empty()) {
-
790  const bool on_demand_dash_profile =
-
791  stream_descriptors.begin()->segment_template.empty();
-
792  MpdOptions mpd_options =
-
793  media::GetMpdOptions(on_demand_dash_profile, mpd_params);
-
794  if (mpd_params.generate_dash_if_iop_compliant_mpd) {
-
795  internal->mpd_notifier.reset(new DashIopMpdNotifier(mpd_options));
-
796  } else {
-
797  internal->mpd_notifier.reset(new SimpleMpdNotifier(mpd_options));
-
798  }
-
799  if (!internal->mpd_notifier->Init()) {
-
800  LOG(ERROR) << "MpdNotifier failed to initialize.";
-
801  return Status(error::INVALID_ARGUMENT,
-
802  "Failed to initialize MpdNotifier.");
-
803  }
-
804  }
-
805 
-
806  if (!hls_params.master_playlist_output.empty()) {
-
807  base::FilePath master_playlist_path(
-
808  base::FilePath::FromUTF8Unsafe(hls_params.master_playlist_output));
-
809  base::FilePath master_playlist_name = master_playlist_path.BaseName();
-
810 
-
811  internal->hls_notifier.reset(new hls::SimpleHlsNotifier(
-
812  hls_params.playlist_type, hls_params.time_shift_buffer_depth,
-
813  hls_params.base_url,
-
814  master_playlist_path.DirName().AsEndingWithSeparator().AsUTF8Unsafe(),
-
815  master_playlist_name.AsUTF8Unsafe()));
-
816  }
-
817 
-
818  std::vector<StreamDescriptor> streams_for_jobs;
-
819 
-
820  for (const StreamDescriptor& descriptor : stream_descriptors) {
-
821  // We may need to overwrite some values, so make a copy first.
-
822  StreamDescriptor copy = descriptor;
-
823 
-
824  if (internal->buffer_callback_params.read_func) {
-
825  copy.input = File::MakeCallbackFileName(internal->buffer_callback_params,
-
826  descriptor.input);
-
827  }
-
828 
-
829  if (internal->buffer_callback_params.write_func) {
-
830  copy.output = File::MakeCallbackFileName(internal->buffer_callback_params,
-
831  descriptor.output);
- -
833  internal->buffer_callback_params, descriptor.segment_template);
-
834  }
-
835 
-
836  // Update language to ISO_639_2 code if set.
-
837  if (!copy.language.empty()) {
-
838  copy.language = LanguageToISO_639_2(descriptor.language);
-
839  if (copy.language == "und") {
-
840  return Status(
-
841  error::INVALID_ARGUMENT,
-
842  "Unknown/invalid language specified: " + descriptor.language);
-
843  }
-
844  }
-
845 
-
846  streams_for_jobs.push_back(copy);
-
847  }
-
848 
-
849  Status status = media::CreateAllJobs(
-
850  streams_for_jobs, packaging_params, &internal->fake_clock,
-
851  internal->encryption_key_source.get(), internal->mpd_notifier.get(),
-
852  internal->hls_notifier.get(), &internal->jobs);
-
853 
-
854  if (!status.ok()) {
-
855  return status;
-
856  }
-
857 
-
858  internal_ = std::move(internal);
-
859  return Status::OK;
-
860 }
-
861 
- -
863  if (!internal_)
-
864  return Status(error::INVALID_ARGUMENT, "Not yet initialized.");
-
865  Status status = media::RunJobs(internal_->jobs);
-
866  if (!status.ok())
-
867  return status;
-
868 
-
869  if (internal_->hls_notifier) {
-
870  if (!internal_->hls_notifier->Flush())
-
871  return Status(error::INVALID_ARGUMENT, "Failed to flush Hls.");
-
872  }
-
873  if (internal_->mpd_notifier) {
-
874  if (!internal_->mpd_notifier->Flush())
-
875  return Status(error::INVALID_ARGUMENT, "Failed to flush Mpd.");
-
876  }
-
877  return Status::OK;
-
878 }
-
879 
- -
881  if (!internal_) {
-
882  LOG(INFO) << "Not yet initialized. Return directly.";
-
883  return;
-
884  }
-
885  for (const std::unique_ptr<media::Job>& job : internal_->jobs)
-
886  job->Cancel();
-
887 }
-
888 
- -
890  return GetPackagerVersion();
-
891 }
-
892 
- -
894  int max_sd_pixels,
-
895  int max_hd_pixels,
-
896  int max_uhd1_pixels,
-
897  const EncryptionParams::EncryptedStreamAttributes& stream_attributes) {
-
898  if (stream_attributes.stream_type ==
-
899  EncryptionParams::EncryptedStreamAttributes::kAudio)
-
900  return "AUDIO";
-
901  if (stream_attributes.stream_type ==
-
902  EncryptionParams::EncryptedStreamAttributes::kVideo) {
-
903  const int pixels = stream_attributes.oneof.video.width *
-
904  stream_attributes.oneof.video.height;
-
905  if (pixels <= max_sd_pixels)
-
906  return "SD";
-
907  if (pixels <= max_hd_pixels)
-
908  return "HD";
-
909  if (pixels <= max_uhd1_pixels)
-
910  return "UHD1";
-
911  return "UHD2";
-
912  }
-
913  return "";
-
914 }
-
915 
-
916 } // namespace shaka
-
BufferCallbackParams buffer_callback_params
Buffer callback params.
Definition: packager.h:58
+
571  }
+
572  if (encryptor) {
+
573  status.Update(chunker->AddHandler(encryptor));
+
574  status.Update(encryptor->AddHandler(replicator));
+
575  } else {
+
576  status.Update(chunker->AddHandler(replicator));
+
577  }
+
578 
+
579  if (!status.ok()) {
+
580  return status;
+
581  }
+
582 
+
583  if (!stream.language.empty()) {
+
584  demuxer->SetLanguageOverride(stream.stream_selector, stream.language);
+
585  }
+
586  }
+
587 
+
588  // Create the muxer (output) for this track.
+
589  std::unique_ptr<MuxerListener> muxer_listener = CreateMuxerListener(
+
590  stream, stream_number, packaging_params.output_media_info, mpd_notifier,
+
591  hls_notifier);
+
592  std::shared_ptr<Muxer> muxer = CreateMuxer(
+
593  packaging_params, stream,
+
594  packaging_params.test_params.inject_fake_clock ? fake_clock : nullptr,
+
595  std::move(muxer_listener));
+
596 
+
597  if (!muxer) {
+
598  return Status(error::INVALID_ARGUMENT, "Failed to create muxer for " +
+
599  stream.input + ":" +
+
600  stream.stream_selector);
+
601  }
+
602 
+
603  std::shared_ptr<MediaHandler> trick_play;
+
604  if (stream.trick_play_factor) {
+
605  trick_play = std::make_shared<TrickPlayHandler>(stream.trick_play_factor);
+
606  }
+
607 
+
608  Status status;
+
609  if (trick_play) {
+
610  status.Update(replicator->AddHandler(trick_play));
+
611  status.Update(trick_play->AddHandler(muxer));
+
612  } else {
+
613  status.Update(replicator->AddHandler(muxer));
+
614  }
+
615 
+
616  if (!status.ok()) {
+
617  return status;
+
618  }
+
619  }
+
620 
+
621  return Status::OK;
+
622 }
+
623 
+
624 Status CreateAllJobs(const std::vector<StreamDescriptor>& stream_descriptors,
+
625  const PackagingParams& packaging_params,
+
626  FakeClock* fake_clock,
+
627  KeySource* encryption_key_source,
+
628  MpdNotifier* mpd_notifier,
+
629  hls::HlsNotifier* hls_notifier,
+
630  std::vector<std::unique_ptr<Job>>* jobs) {
+
631  DCHECK(jobs);
+
632 
+
633  // Group all streams based on which pipeline they will use.
+
634  std::vector<std::reference_wrapper<const StreamDescriptor>> text_streams;
+
635  std::vector<std::reference_wrapper<const StreamDescriptor>>
+
636  audio_video_streams;
+
637 
+
638  for (const StreamDescriptor& stream : stream_descriptors) {
+
639  // TODO: Find a better way to determine what stream type a stream
+
640  // descriptor is as |stream_selector| may use an index. This would
+
641  // also allow us to use a simpler audio pipeline.
+
642  if (stream.stream_selector == "text") {
+
643  text_streams.push_back(stream);
+
644  } else {
+
645  audio_video_streams.push_back(stream);
+
646  }
+
647  }
+
648 
+
649  // Audio/Video streams need to be in sorted order so that demuxers and trick
+
650  // play handlers get setup correctly.
+
651  std::sort(audio_video_streams.begin(), audio_video_streams.end(),
+
652  media::StreamDescriptorCompareFn);
+
653 
+
654  Status status;
+
655 
+
656  status.Update(
+
657  CreateTextJobs(text_streams, packaging_params, mpd_notifier, jobs));
+
658 
+
659  int stream_number = text_streams.size();
+
660 
+
661  status.Update(CreateAudioVideoJobs(
+
662  stream_number, audio_video_streams, packaging_params, fake_clock,
+
663  encryption_key_source, mpd_notifier, hls_notifier, jobs));
+
664 
+
665  if (!status.ok()) {
+
666  return status;
+
667  }
+
668 
+
669  // Initialize processing graph.
+
670  for (const std::unique_ptr<Job>& job : *jobs) {
+
671  job->Initialize();
+
672  status.Update(job->status());
+
673  }
+
674 
+
675  return status;
+
676 }
+
677 
+
678 Status RunJobs(const std::vector<std::unique_ptr<Job>>& jobs) {
+
679  // We need to store the jobs and the waits separately in order to use the
+
680  // |WaitMany| function. |WaitMany| takes an array of WaitableEvents but we
+
681  // need to access the jobs in order to join the thread and check the status.
+
682  // The indexes needs to be check in sync or else we won't be able to relate a
+
683  // WaitableEvent back to the job.
+
684  std::vector<Job*> active_jobs;
+
685  std::vector<base::WaitableEvent*> active_waits;
+
686 
+
687  // Start every job and add it to the active jobs list so that we can wait
+
688  // on each one.
+
689  for (auto& job : jobs) {
+
690  job->Start();
+
691 
+
692  active_jobs.push_back(job.get());
+
693  active_waits.push_back(job->wait());
+
694  }
+
695 
+
696  // Wait for all jobs to complete or an error occurs.
+
697  Status status;
+
698  while (status.ok() && active_jobs.size()) {
+
699  // Wait for an event to finish and then update our status so that we can
+
700  // quit if something has gone wrong.
+
701  const size_t done =
+
702  base::WaitableEvent::WaitMany(active_waits.data(), active_waits.size());
+
703  Job* job = active_jobs[done];
+
704 
+
705  job->Join();
+
706  status.Update(job->status());
+
707 
+
708  // Remove the job and the wait from our tracking.
+
709  active_jobs.erase(active_jobs.begin() + done);
+
710  active_waits.erase(active_waits.begin() + done);
+
711  }
+
712 
+
713  // If the main loop has exited and there are still jobs running,
+
714  // we need to cancel them and clean-up.
+
715  for (auto& job : active_jobs) {
+
716  job->Cancel();
+
717  }
+
718 
+
719  for (auto& job : active_jobs) {
+
720  job->Join();
+
721  }
+
722 
+
723  return status;
+
724 }
+
725 
+
726 } // namespace
+
727 } // namespace media
+
728 
+
729 struct Packager::PackagerInternal {
+
730  media::FakeClock fake_clock;
+
731  std::unique_ptr<KeySource> encryption_key_source;
+
732  std::unique_ptr<MpdNotifier> mpd_notifier;
+
733  std::unique_ptr<hls::HlsNotifier> hls_notifier;
+
734  std::vector<std::unique_ptr<media::Job>> jobs;
+
735  BufferCallbackParams buffer_callback_params;
+
736 };
+
737 
+
738 Packager::Packager() {}
+
739 
+
740 Packager::~Packager() {}
+
741 
+ +
743  const PackagingParams& packaging_params,
+
744  const std::vector<StreamDescriptor>& stream_descriptors) {
+
745  // Needed by base::WorkedPool used in ThreadedIoFile.
+
746  static base::AtExitManager exit;
+
747  static media::LibcryptoThreading libcrypto_threading;
+
748 
+
749  if (internal_)
+
750  return Status(error::INVALID_ARGUMENT, "Already initialized.");
+
751 
+
752  Status param_check =
+
753  media::ValidateParams(packaging_params, stream_descriptors);
+
754  if (!param_check.ok()) {
+
755  return param_check;
+
756  }
+
757 
+
758  if (!packaging_params.test_params.injected_library_version.empty()) {
+
759  SetPackagerVersionForTesting(
+
760  packaging_params.test_params.injected_library_version);
+
761  }
+
762 
+
763  std::unique_ptr<PackagerInternal> internal(new PackagerInternal);
+
764 
+
765  // Create encryption key source if needed.
+
766  if (packaging_params.encryption_params.key_provider != KeyProvider::kNone) {
+
767  internal->encryption_key_source = CreateEncryptionKeySource(
+
768  static_cast<media::FourCC>(
+
769  packaging_params.encryption_params.protection_scheme),
+
770  packaging_params.encryption_params);
+
771  if (!internal->encryption_key_source)
+
772  return Status(error::INVALID_ARGUMENT, "Failed to create key source.");
+
773  }
+
774 
+
775  // Store callback params to make it available during packaging.
+
776  internal->buffer_callback_params = packaging_params.buffer_callback_params;
+
777 
+
778  // Update mpd output and hls output if callback param is specified.
+
779  MpdParams mpd_params = packaging_params.mpd_params;
+
780  HlsParams hls_params = packaging_params.hls_params;
+
781  if (internal->buffer_callback_params.write_func) {
+ +
783  internal->buffer_callback_params, mpd_params.mpd_output);
+ +
785  internal->buffer_callback_params, hls_params.master_playlist_output);
+
786  }
+
787 
+
788  if (!mpd_params.mpd_output.empty()) {
+
789  const bool on_demand_dash_profile =
+
790  stream_descriptors.begin()->segment_template.empty();
+
791  MpdOptions mpd_options =
+
792  media::GetMpdOptions(on_demand_dash_profile, mpd_params);
+
793  if (mpd_params.generate_dash_if_iop_compliant_mpd) {
+
794  internal->mpd_notifier.reset(new DashIopMpdNotifier(mpd_options));
+
795  } else {
+
796  internal->mpd_notifier.reset(new SimpleMpdNotifier(mpd_options));
+
797  }
+
798  if (!internal->mpd_notifier->Init()) {
+
799  LOG(ERROR) << "MpdNotifier failed to initialize.";
+
800  return Status(error::INVALID_ARGUMENT,
+
801  "Failed to initialize MpdNotifier.");
+
802  }
+
803  }
+
804 
+
805  if (!hls_params.master_playlist_output.empty()) {
+
806  base::FilePath master_playlist_path(
+
807  base::FilePath::FromUTF8Unsafe(hls_params.master_playlist_output));
+
808  base::FilePath master_playlist_name = master_playlist_path.BaseName();
+
809 
+
810  internal->hls_notifier.reset(new hls::SimpleHlsNotifier(
+
811  hls_params.playlist_type, hls_params.time_shift_buffer_depth,
+
812  hls_params.base_url, hls_params.key_uri,
+
813  master_playlist_path.DirName().AsEndingWithSeparator().AsUTF8Unsafe(),
+
814  master_playlist_name.AsUTF8Unsafe()));
+
815  }
+
816 
+
817  std::vector<StreamDescriptor> streams_for_jobs;
+
818 
+
819  for (const StreamDescriptor& descriptor : stream_descriptors) {
+
820  // We may need to overwrite some values, so make a copy first.
+
821  StreamDescriptor copy = descriptor;
+
822 
+
823  if (internal->buffer_callback_params.read_func) {
+
824  copy.input = File::MakeCallbackFileName(internal->buffer_callback_params,
+
825  descriptor.input);
+
826  }
+
827 
+
828  if (internal->buffer_callback_params.write_func) {
+
829  copy.output = File::MakeCallbackFileName(internal->buffer_callback_params,
+
830  descriptor.output);
+ +
832  internal->buffer_callback_params, descriptor.segment_template);
+
833  }
+
834 
+
835  // Update language to ISO_639_2 code if set.
+
836  if (!copy.language.empty()) {
+
837  copy.language = LanguageToISO_639_2(descriptor.language);
+
838  if (copy.language == "und") {
+
839  return Status(
+
840  error::INVALID_ARGUMENT,
+
841  "Unknown/invalid language specified: " + descriptor.language);
+
842  }
+
843  }
+
844 
+
845  streams_for_jobs.push_back(copy);
+
846  }
+
847 
+
848  Status status = media::CreateAllJobs(
+
849  streams_for_jobs, packaging_params, &internal->fake_clock,
+
850  internal->encryption_key_source.get(), internal->mpd_notifier.get(),
+
851  internal->hls_notifier.get(), &internal->jobs);
+
852 
+
853  if (!status.ok()) {
+
854  return status;
+
855  }
+
856 
+
857  internal_ = std::move(internal);
+
858  return Status::OK;
+
859 }
+
860 
+ +
862  if (!internal_)
+
863  return Status(error::INVALID_ARGUMENT, "Not yet initialized.");
+
864  Status status = media::RunJobs(internal_->jobs);
+
865  if (!status.ok())
+
866  return status;
+
867 
+
868  if (internal_->hls_notifier) {
+
869  if (!internal_->hls_notifier->Flush())
+
870  return Status(error::INVALID_ARGUMENT, "Failed to flush Hls.");
+
871  }
+
872  if (internal_->mpd_notifier) {
+
873  if (!internal_->mpd_notifier->Flush())
+
874  return Status(error::INVALID_ARGUMENT, "Failed to flush Mpd.");
+
875  }
+
876  return Status::OK;
+
877 }
+
878 
+ +
880  if (!internal_) {
+
881  LOG(INFO) << "Not yet initialized. Return directly.";
+
882  return;
+
883  }
+
884  for (const std::unique_ptr<media::Job>& job : internal_->jobs)
+
885  job->Cancel();
+
886 }
+
887 
+ +
889  return GetPackagerVersion();
+
890 }
+
891 
+ +
893  int max_sd_pixels,
+
894  int max_hd_pixels,
+
895  int max_uhd1_pixels,
+
896  const EncryptionParams::EncryptedStreamAttributes& stream_attributes) {
+
897  if (stream_attributes.stream_type ==
+
898  EncryptionParams::EncryptedStreamAttributes::kAudio)
+
899  return "AUDIO";
+
900  if (stream_attributes.stream_type ==
+
901  EncryptionParams::EncryptedStreamAttributes::kVideo) {
+
902  const int pixels = stream_attributes.oneof.video.width *
+
903  stream_attributes.oneof.video.height;
+
904  if (pixels <= max_sd_pixels)
+
905  return "SD";
+
906  if (pixels <= max_hd_pixels)
+
907  return "HD";
+
908  if (pixels <= max_uhd1_pixels)
+
909  return "UHD1";
+
910  return "UHD2";
+
911  }
+
912  return "";
+
913 }
+
914 
+
915 } // namespace shaka
+
BufferCallbackParams buffer_callback_params
Buffer callback params.
Definition: packager.h:62
std::string master_playlist_output
HLS master playlist output path.
Definition: hls_params.h:27
DASH MPD related parameters.
Definition: mpd_params.h:16
-
Defines a single input/output stream.
Definition: packager.h:65
-
std::string input
Input/source media file path or network stream URL. Required.
Definition: packager.h:67
-
HlsParams hls_params
HLS related parameters.
Definition: packager.h:51
-
Status Initialize(const PackagingParams &packaging_params, const std::vector< StreamDescriptor > &stream_descriptors)
Definition: packager.cc:743
+
Defines a single input/output stream.
Definition: packager.h:69
+
std::string input
Input/source media file path or network stream URL. Required.
Definition: packager.h:71
+
HlsParams hls_params
HLS related parameters.
Definition: packager.h:55
+
Status Initialize(const PackagingParams &packaging_params, const std::vector< StreamDescriptor > &stream_descriptors)
Definition: packager.cc:742
-
static std::string DefaultStreamLabelFunction(int max_sd_pixels, int max_hd_pixels, int max_uhd1_pixels, const EncryptionParams::EncryptedStreamAttributes &stream_attributes)
Definition: packager.cc:893
+
static std::string DefaultStreamLabelFunction(int max_sd_pixels, int max_hd_pixels, int max_uhd1_pixels, const EncryptionParams::EncryptedStreamAttributes &stream_attributes)
Definition: packager.cc:892
HLS related parameters.
Definition: hls_params.h:23
-
std::string segment_template
Specifies segment template. Can be empty.
Definition: packager.h:77
+
std::string segment_template
Specifies segment template. Can be empty.
Definition: packager.h:81
static bool Copy(const char *from_file_name, const char *to_file_name)
Definition: file.cc:281
static bool ReadFileToString(const char *file_name, std::string *contents)
Definition: file.cc:216
Convenience class which initializes and terminates libcrypto threading.
bool generate_dash_if_iop_compliant_mpd
Try to generate DASH-IF IOP compliant MPD.
Definition: mpd_params.h:48
-
static std::string GetLibraryVersion()
Definition: packager.cc:889
+
static std::string GetLibraryVersion()
Definition: packager.cc:888
std::string LanguageToISO_639_2(const std::string &language)
-
std::string injected_library_version
Definition: packager.h:33
-
MpdParams mpd_params
DASH MPD related parameters.
Definition: packager.h:49
+
std::string injected_library_version
Definition: packager.h:34
+
MpdParams mpd_params
DASH MPD related parameters.
Definition: packager.h:53
double time_shift_buffer_depth
Definition: hls_params.h:33
static bool WriteMediaInfoToFile(const MediaInfo &media_info, const std::string &output_file_path)
-
EncryptionParams encryption_params
Encryption and Decryption Parameters.
Definition: packager.h:54
+
EncryptionParams encryption_params
Encryption and Decryption Parameters.
Definition: packager.h:58
std::string mpd_output
MPD output file path.
Definition: mpd_params.h:18
-
Status Run()
Definition: packager.cc:862
+
Status Run()
Definition: packager.cc:861
static std::string MakeCallbackFileName(const BufferCallbackParams &callback_params, const std::string &name)
Definition: file.cc:354
-
std::string output
Definition: packager.h:75
+
std::string output
Definition: packager.h:79
Encrypted stream information that is used to determine stream label.
std::string base_url
Definition: hls_params.h:30
Defines Mpd Options.
Definition: mpd_options.h:25
-
void Cancel()
Cancel packaging. Note that it has to be called from another thread.
Definition: packager.cc:880
-
Packaging parameters.
Definition: packager.h:37
+
void Cancel()
Cancel packaging. Note that it has to be called from another thread.
Definition: packager.cc:879
+
Packaging parameters.
Definition: packager.h:38
HlsPlaylistType playlist_type
HLS playlist type. See HLS specification for details.
Definition: hls_params.h:25
-
std::string language
Definition: packager.h:100
+
std::string language
Definition: packager.h:104
+
std::string key_uri
Definition: hls_params.h:37
diff --git a/docs/d3/d51/classshaka_1_1media_1_1LibcryptoThreading.html b/docs/d3/d51/classshaka_1_1media_1_1LibcryptoThreading.html index fafc585291..55f76d6398 100644 --- a/docs/d3/d51/classshaka_1_1media_1_1LibcryptoThreading.html +++ b/docs/d3/d51/classshaka_1_1media_1_1LibcryptoThreading.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d56/decrypt__config_8cc_source.html b/docs/d3/d56/decrypt__config_8cc_source.html index ef6aa973c6..2f2c966211 100644 --- a/docs/d3/d56/decrypt__config_8cc_source.html +++ b/docs/d3/d56/decrypt__config_8cc_source.html @@ -136,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d62/continuity__counter_8h_source.html b/docs/d3/d62/continuity__counter_8h_source.html index 8d5b14ec69..3a4fe76029 100644 --- a/docs/d3/d62/continuity__counter_8h_source.html +++ b/docs/d3/d62/continuity__counter_8h_source.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d62/rcheck_8h_source.html b/docs/d3/d62/rcheck_8h_source.html index bcd1066481..98108f7ed0 100644 --- a/docs/d3/d62/rcheck_8h_source.html +++ b/docs/d3/d62/rcheck_8h_source.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d66/structshaka_1_1media_1_1mp4_1_1DataEntryUrl-members.html b/docs/d3/d66/structshaka_1_1media_1_1mp4_1_1DataEntryUrl-members.html index 8ac001ed89..ae4700a06e 100644 --- a/docs/d3/d66/structshaka_1_1media_1_1mp4_1_1DataEntryUrl-members.html +++ b/docs/d3/d66/structshaka_1_1media_1_1mp4_1_1DataEntryUrl-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d67/classshaka_1_1media_1_1WebMVideoClient.html b/docs/d3/d67/classshaka_1_1media_1_1WebMVideoClient.html index ee81a1565d..3de24e7286 100644 --- a/docs/d3/d67/classshaka_1_1media_1_1WebMVideoClient.html +++ b/docs/d3/d67/classshaka_1_1media_1_1WebMVideoClient.html @@ -199,7 +199,7 @@ An empty pointer if there was unexpected values in the provided parameters or vi diff --git a/docs/d3/d6f/ad__cue__generator__params_8h_source.html b/docs/d3/d6f/ad__cue__generator__params_8h_source.html new file mode 100644 index 0000000000..732f1c3e51 --- /dev/null +++ b/docs/d3/d6f/ad__cue__generator__params_8h_source.html @@ -0,0 +1,129 @@ + + + + + + +Shaka Packager SDK: packager/media/public/ad_cue_generator_params.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
ad_cue_generator_params.h
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #ifndef PACKAGER_MEDIA_PUBLIC_AD_CUE_GENERATOR_PARAMS_H_
+
8 #define PACKAGER_MEDIA_PUBLIC_AD_CUE_GENERATOR_PARAMS_H_
+
9 
+
10 #include <vector>
+
11 
+
12 namespace shaka {
+
13 
+
14 struct Cuepoint {
+ +
17 
+
19  double duration_in_seconds = 0;
+
20 };
+
21 
+ +
25  std::vector<Cuepoint> cue_points;
+
26 };
+
27 
+
28 } // namespace shaka
+
29 
+
30 #endif // PACKAGER_MEDIA_PUBLIC_AD_CUE_GENERATOR_PARAMS_H_
+ +
std::vector< Cuepoint > cue_points
List of cuepoints.
+
double duration_in_seconds
Duration of the ad.
+
Cuepoint generator related parameters.
+
double start_time_in_seconds
Start time of the cuepoint relative to start of the stream.
+
+ + + + diff --git a/docs/d3/d71/classshaka_1_1media_1_1mp2t_1_1TsMuxer.html b/docs/d3/d71/classshaka_1_1media_1_1mp2t_1_1TsMuxer.html index 36d284cb54..719a394d1e 100644 --- a/docs/d3/d71/classshaka_1_1media_1_1mp2t_1_1TsMuxer.html +++ b/docs/d3/d71/classshaka_1_1media_1_1mp2t_1_1TsMuxer.html @@ -174,10 +174,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -190,14 +186,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -232,7 +232,7 @@ std::pair< std::shared_ptr
diff --git a/docs/d3/d73/classshaka_1_1File.html b/docs/d3/d73/classshaka_1_1File.html index 3e09adb2ae..004cf471ee 100644 --- a/docs/d3/d73/classshaka_1_1File.html +++ b/docs/d3/d73/classshaka_1_1File.html @@ -1006,7 +1006,7 @@ class ThreadedIoFile diff --git a/docs/d3/d73/classshaka_1_1media_1_1webm_1_1WebMMuxer.html b/docs/d3/d73/classshaka_1_1media_1_1webm_1_1WebMMuxer.html index 544e74455d..6ad508003f 100644 --- a/docs/d3/d73/classshaka_1_1media_1_1webm_1_1WebMMuxer.html +++ b/docs/d3/d73/classshaka_1_1media_1_1webm_1_1WebMMuxer.html @@ -178,10 +178,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -194,14 +190,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -236,7 +236,7 @@ std::pair< std::shared_ptr
diff --git a/docs/d3/d75/classshaka_1_1media_1_1AesEncryptor.html b/docs/d3/d75/classshaka_1_1media_1_1AesEncryptor.html index 8acfc07b74..473d413976 100644 --- a/docs/d3/d75/classshaka_1_1media_1_1AesEncryptor.html +++ b/docs/d3/d75/classshaka_1_1media_1_1AesEncryptor.html @@ -236,7 +236,7 @@ AES_KEY * mutable_aes_key< diff --git a/docs/d3/d75/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator-members.html b/docs/d3/d75/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator-members.html index 9a249ae210..ad2071c40f 100644 --- a/docs/d3/d75/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator-members.html +++ b/docs/d3/d75/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d76/muxer__flags_8h_source.html b/docs/d3/d76/muxer__flags_8h_source.html index 11048a631e..51ce784a03 100644 --- a/docs/d3/d76/muxer__flags_8h_source.html +++ b/docs/d3/d76/muxer__flags_8h_source.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d77/structshaka_1_1media_1_1mp4_1_1TextSampleEntry-members.html b/docs/d3/d77/structshaka_1_1media_1_1mp4_1_1TextSampleEntry-members.html index d1bd2fa9c6..04e68881b5 100644 --- a/docs/d3/d77/structshaka_1_1media_1_1mp4_1_1TextSampleEntry-members.html +++ b/docs/d3/d77/structshaka_1_1media_1_1mp4_1_1TextSampleEntry-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d7b/classshaka_1_1media_1_1RsaPublicKey-members.html b/docs/d3/d7b/classshaka_1_1media_1_1RsaPublicKey-members.html index b57b93b8ed..cbeb807fad 100644 --- a/docs/d3/d7b/classshaka_1_1media_1_1RsaPublicKey-members.html +++ b/docs/d3/d7b/classshaka_1_1media_1_1RsaPublicKey-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d7c/classshaka_1_1media_1_1WebMAudioClient.html b/docs/d3/d7c/classshaka_1_1media_1_1WebMAudioClient.html index 1671e674e0..e2e1e36531 100644 --- a/docs/d3/d7c/classshaka_1_1media_1_1WebMAudioClient.html +++ b/docs/d3/d7c/classshaka_1_1media_1_1WebMAudioClient.html @@ -223,7 +223,7 @@ An empty pointer if there was unexpected values in the provided parameters or au diff --git a/docs/d3/d80/muxer__util_8h_source.html b/docs/d3/d80/muxer__util_8h_source.html index 021d6cf11a..5d81465113 100644 --- a/docs/d3/d80/muxer__util_8h_source.html +++ b/docs/d3/d80/muxer__util_8h_source.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d87/structshaka_1_1media_1_1mp4_1_1SampleToChunk.html b/docs/d3/d87/structshaka_1_1media_1_1mp4_1_1SampleToChunk.html index 014e43913e..4ccd760929 100644 --- a/docs/d3/d87/structshaka_1_1media_1_1mp4_1_1SampleToChunk.html +++ b/docs/d3/d87/structshaka_1_1media_1_1mp4_1_1SampleToChunk.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d3/d87/trick__play__handler_8cc_source.html b/docs/d3/d87/trick__play__handler_8cc_source.html index 199d011735..f467c19466 100644 --- a/docs/d3/d87/trick__play__handler_8cc_source.html +++ b/docs/d3/d87/trick__play__handler_8cc_source.html @@ -283,7 +283,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d8d/webm__audio__client_8h_source.html b/docs/d3/d8d/webm__audio__client_8h_source.html index 39130e8c9f..3dc6131be6 100644 --- a/docs/d3/d8d/webm__audio__client_8h_source.html +++ b/docs/d3/d8d/webm__audio__client_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d90/ec3__audio__util_8cc_source.html b/docs/d3/d90/ec3__audio__util_8cc_source.html index 175d97e9e3..d888e4510f 100644 --- a/docs/d3/d90/ec3__audio__util_8cc_source.html +++ b/docs/d3/d90/ec3__audio__util_8cc_source.html @@ -245,7 +245,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d91/classshaka_1_1media_1_1H264Parser.html b/docs/d3/d91/classshaka_1_1media_1_1H264Parser.html index 4a255fc4e9..c8fc6a56b0 100644 --- a/docs/d3/d91/classshaka_1_1media_1_1H264Parser.html +++ b/docs/d3/d91/classshaka_1_1media_1_1H264Parser.html @@ -135,7 +135,7 @@ Result ParseSEI (const diff --git a/docs/d3/d93/media__handler_8h_source.html b/docs/d3/d93/media__handler_8h_source.html index d7295f6223..e3b4259501 100644 --- a/docs/d3/d93/media__handler_8h_source.html +++ b/docs/d3/d93/media__handler_8h_source.html @@ -110,82 +110,82 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
21 
22 enum class StreamDataType {
23  kUnknown,
-
24  kPeriodInfo,
-
25  kStreamInfo,
-
26  kMediaSample,
-
27  kTextSample,
-
28  kMediaEvent,
-
29  kSegmentInfo,
+
24  kStreamInfo,
+
25  kMediaSample,
+
26  kTextSample,
+
27  kSegmentInfo,
+
28  kScte35Event,
+
29  kCueEvent,
30 };
31 
-
32 // TODO(kqyang): Define these structures.
-
33 struct PeriodInfo {};
-
34 struct MediaEvent {};
-
35 struct SegmentInfo {
-
36  bool is_subsegment = false;
-
37  bool is_encrypted = false;
-
38  int64_t start_timestamp = -1;
+
32 // Scte35Event represents cuepoint markers in input streams. It will be used
+
33 // to represent out of band cuepoint markers too.
+
34 struct Scte35Event {
+
35  std::string id;
+
36  // Segmentation type id from SCTE35 segmentation descriptor.
+
37  int type = 0;
+
38  int64_t start_time = 0;
39  int64_t duration = 0;
-
40  // This is only available if key rotation is enabled. Note that we may have
-
41  // a |key_rotation_encryption_config| even if the segment is not encrypted,
-
42  // which is the case for clear lead.
-
43  std::shared_ptr<EncryptionConfig> key_rotation_encryption_config;
-
44 };
-
45 
-
46 // TODO(kqyang): Should we use protobuf?
-
47 struct StreamData {
-
48  size_t stream_index = static_cast<size_t>(-1);
-
49  StreamDataType stream_data_type = StreamDataType::kUnknown;
-
50 
-
51  std::shared_ptr<const PeriodInfo> period_info;
-
52  std::shared_ptr<const StreamInfo> stream_info;
-
53  std::shared_ptr<const MediaSample> media_sample;
-
54  std::shared_ptr<const TextSample> text_sample;
-
55  std::shared_ptr<const MediaEvent> media_event;
-
56  std::shared_ptr<const SegmentInfo> segment_info;
-
57 
-
58  static std::unique_ptr<StreamData> FromPeriodInfo(
-
59  size_t stream_index, std::shared_ptr<const PeriodInfo> period_info) {
-
60  std::unique_ptr<StreamData> stream_data(new StreamData);
-
61  stream_data->stream_index = stream_index;
-
62  stream_data->stream_data_type = StreamDataType::kPeriodInfo;
-
63  stream_data->period_info = std::move(period_info);
-
64  return stream_data;
-
65  }
-
66 
-
67  static std::unique_ptr<StreamData> FromStreamInfo(
-
68  size_t stream_index, std::shared_ptr<const StreamInfo> stream_info) {
-
69  std::unique_ptr<StreamData> stream_data(new StreamData);
-
70  stream_data->stream_index = stream_index;
-
71  stream_data->stream_data_type = StreamDataType::kStreamInfo;
-
72  stream_data->stream_info = std::move(stream_info);
-
73  return stream_data;
-
74  }
+
40  std::string cue_data;
+
41 };
+
42 
+
43 enum class CueEventType { kCueIn, kCueOut, kCuePoint };
+
44 
+
45 // In server-based model, Chunking Handler consolidates SCTE-35 events and
+
46 // generates CueEvent before an ad is about to be inserted.
+
47 struct CueEvent {
+
48  int64_t timestamp = 0;
+
49  CueEventType type = CueEventType::kCuePoint;
+
50  std::string cue_data;
+
51 };
+
52 
+
53 struct SegmentInfo {
+
54  bool is_subsegment = false;
+
55  bool is_encrypted = false;
+
56  int64_t start_timestamp = -1;
+
57  int64_t duration = 0;
+
58  // This is only available if key rotation is enabled. Note that we may have
+
59  // a |key_rotation_encryption_config| even if the segment is not encrypted,
+
60  // which is the case for clear lead.
+
61  std::shared_ptr<EncryptionConfig> key_rotation_encryption_config;
+
62 };
+
63 
+
64 // TODO(kqyang): Should we use protobuf?
+
65 struct StreamData {
+
66  size_t stream_index = static_cast<size_t>(-1);
+
67  StreamDataType stream_data_type = StreamDataType::kUnknown;
+
68 
+
69  std::shared_ptr<const StreamInfo> stream_info;
+
70  std::shared_ptr<const MediaSample> media_sample;
+
71  std::shared_ptr<const TextSample> text_sample;
+
72  std::shared_ptr<const SegmentInfo> segment_info;
+
73  std::shared_ptr<const Scte35Event> scte35_event;
+
74  std::shared_ptr<const CueEvent> cue_event;
75 
-
76  static std::unique_ptr<StreamData> FromMediaSample(
-
77  size_t stream_index, std::shared_ptr<const MediaSample> media_sample) {
+
76  static std::unique_ptr<StreamData> FromStreamInfo(
+
77  size_t stream_index, std::shared_ptr<const StreamInfo> stream_info) {
78  std::unique_ptr<StreamData> stream_data(new StreamData);
79  stream_data->stream_index = stream_index;
-
80  stream_data->stream_data_type = StreamDataType::kMediaSample;
-
81  stream_data->media_sample = std::move(media_sample);
+
80  stream_data->stream_data_type = StreamDataType::kStreamInfo;
+
81  stream_data->stream_info = std::move(stream_info);
82  return stream_data;
83  }
84 
-
85  static std::unique_ptr<StreamData> FromTextSample(
-
86  size_t stream_index, std::shared_ptr<const TextSample> text_sample) {
+
85  static std::unique_ptr<StreamData> FromMediaSample(
+
86  size_t stream_index, std::shared_ptr<const MediaSample> media_sample) {
87  std::unique_ptr<StreamData> stream_data(new StreamData);
88  stream_data->stream_index = stream_index;
-
89  stream_data->stream_data_type = StreamDataType::kTextSample;
-
90  stream_data->text_sample = std::move(text_sample);
+
89  stream_data->stream_data_type = StreamDataType::kMediaSample;
+
90  stream_data->media_sample = std::move(media_sample);
91  return stream_data;
92  }
93 
-
94  static std::unique_ptr<StreamData> FromMediaEvent(
-
95  size_t stream_index, std::shared_ptr<const MediaEvent> media_event) {
+
94  static std::unique_ptr<StreamData> FromTextSample(
+
95  size_t stream_index, std::shared_ptr<const TextSample> text_sample) {
96  std::unique_ptr<StreamData> stream_data(new StreamData);
97  stream_data->stream_index = stream_index;
-
98  stream_data->stream_data_type = StreamDataType::kMediaEvent;
-
99  stream_data->media_event = std::move(media_event);
+
98  stream_data->stream_data_type = StreamDataType::kTextSample;
+
99  stream_data->text_sample = std::move(text_sample);
100  return stream_data;
101  }
102 
@@ -197,124 +197,144 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
108  stream_data->segment_info = std::move(segment_info);
109  return stream_data;
110  }
-
111 };
-
112 
- -
129  public:
-
130  MediaHandler() = default;
-
131  virtual ~MediaHandler() = default;
+
111 
+
112  static std::unique_ptr<StreamData> FromScte35Event(
+
113  size_t stream_index,
+
114  std::shared_ptr<const Scte35Event> scte35_event) {
+
115  std::unique_ptr<StreamData> stream_data(new StreamData);
+
116  stream_data->stream_index = stream_index;
+
117  stream_data->stream_data_type = StreamDataType::kScte35Event;
+
118  stream_data->scte35_event = std::move(scte35_event);
+
119  return stream_data;
+
120  }
+
121 
+
122  static std::unique_ptr<StreamData> FromCueEvent(
+
123  size_t stream_index,
+
124  std::shared_ptr<const CueEvent> cue_event) {
+
125  std::unique_ptr<StreamData> stream_data(new StreamData);
+
126  stream_data->stream_index = stream_index;
+
127  stream_data->stream_data_type = StreamDataType::kCueEvent;
+
128  stream_data->cue_event = std::move(cue_event);
+
129  return stream_data;
+
130  }
+
131 };
132 
-
134  Status SetHandler(size_t output_stream_index,
-
135  std::shared_ptr<MediaHandler> handler);
-
136 
-
138  Status AddHandler(std::shared_ptr<MediaHandler> handler) {
-
139  return SetHandler(next_output_stream_index_, handler);
-
140  }
-
141 
-
144  Status Initialize();
-
145 
-
147  bool IsConnected() { return num_input_streams_ > 0; }
-
148 
-
149  protected:
-
152  virtual Status InitializeInternal() = 0;
-
153 
-
158  virtual Status Process(std::unique_ptr<StreamData> stream_data) = 0;
-
159 
-
161  virtual Status OnFlushRequest(size_t input_stream_index);
-
162 
-
164  virtual bool ValidateOutputStreamIndex(size_t stream_index) const;
+ +
149  public:
+
150  MediaHandler() = default;
+
151  virtual ~MediaHandler() = default;
+
152 
+
154  Status SetHandler(size_t output_stream_index,
+
155  std::shared_ptr<MediaHandler> handler);
+
156 
+
158  Status AddHandler(std::shared_ptr<MediaHandler> handler) {
+
159  return SetHandler(next_output_stream_index_, handler);
+
160  }
+
161 
+
164  Status Initialize();
165 
-
168  Status Dispatch(std::unique_ptr<StreamData> stream_data);
-
169 
- -
172  size_t stream_index, std::shared_ptr<const PeriodInfo> period_info) {
-
173  return Dispatch(StreamData::FromPeriodInfo(stream_index, period_info));
-
174  }
-
175 
- -
178  size_t stream_index, std::shared_ptr<const StreamInfo> stream_info) {
-
179  return Dispatch(StreamData::FromStreamInfo(stream_index, stream_info));
-
180  }
-
181 
- -
184  size_t stream_index, std::shared_ptr<const MediaSample> media_sample) {
-
185  return Dispatch(StreamData::FromMediaSample(stream_index, media_sample));
-
186  }
-
187 
-
189  // DispatchTextSample should only be override for testing.
- -
191  size_t stream_index, std::shared_ptr<const TextSample> text_sample) {
-
192  return Dispatch(StreamData::FromTextSample(stream_index, text_sample));
-
193  }
-
194 
- -
197  size_t stream_index, std::shared_ptr<const MediaEvent> media_event) {
-
198  return Dispatch(StreamData::FromMediaEvent(stream_index, media_event));
-
199  }
-
200 
- -
203  size_t stream_index, std::shared_ptr<const SegmentInfo> segment_info) {
-
204  return Dispatch(StreamData::FromSegmentInfo(stream_index, segment_info));
-
205  }
-
206 
-
208  Status FlushDownstream(size_t output_stream_index);
-
209 
- -
212 
-
213  bool initialized() { return initialized_; }
-
214  size_t num_input_streams() const { return num_input_streams_; }
-
215  size_t next_output_stream_index() const { return next_output_stream_index_; }
-
216  const std::map<size_t, std::pair<std::shared_ptr<MediaHandler>, size_t>>&
-
217  output_handlers() {
-
218  return output_handlers_;
+
167  bool IsConnected() { return num_input_streams_ > 0; }
+
168 
+
169  protected:
+
172  virtual Status InitializeInternal() = 0;
+
173 
+
178  virtual Status Process(std::unique_ptr<StreamData> stream_data) = 0;
+
179 
+
181  virtual Status OnFlushRequest(size_t input_stream_index);
+
182 
+
184  virtual bool ValidateOutputStreamIndex(size_t stream_index) const;
+
185 
+
188  Status Dispatch(std::unique_ptr<StreamData> stream_data);
+
189 
+ +
192  size_t stream_index, std::shared_ptr<const StreamInfo> stream_info) {
+
193  return Dispatch(StreamData::FromStreamInfo(stream_index, stream_info));
+
194  }
+
195 
+ +
198  size_t stream_index, std::shared_ptr<const MediaSample> media_sample) {
+
199  return Dispatch(StreamData::FromMediaSample(stream_index, media_sample));
+
200  }
+
201 
+
203  // DispatchTextSample should only be override for testing.
+ +
205  size_t stream_index, std::shared_ptr<const TextSample> text_sample) {
+
206  return Dispatch(StreamData::FromTextSample(stream_index, text_sample));
+
207  }
+
208 
+ +
211  size_t stream_index, std::shared_ptr<const SegmentInfo> segment_info) {
+
212  return Dispatch(StreamData::FromSegmentInfo(stream_index, segment_info));
+
213  }
+
214 
+
216  Status DispatchScte35Event(size_t stream_index,
+
217  std::shared_ptr<const Scte35Event> scte35_event) {
+
218  return Dispatch(StreamData::FromScte35Event(stream_index, scte35_event));
219  }
220 
-
221  private:
-
222  MediaHandler(const MediaHandler&) = delete;
-
223  MediaHandler& operator=(const MediaHandler&) = delete;
-
224 
-
225  bool initialized_ = false;
-
226  // Number of input streams.
-
227  size_t num_input_streams_ = 0;
-
228  // The next available output stream index, used by AddHandler.
-
229  size_t next_output_stream_index_ = 0;
-
230  // output stream index -> {output handler, output handler input stream index}
-
231  // map.
-
232  std::map<size_t, std::pair<std::shared_ptr<MediaHandler>, size_t>>
-
233  output_handlers_;
-
234 };
-
235 
-
236 } // namespace media
-
237 } // namespace shaka
-
238 
-
239 #endif // PACKAGER_MEDIA_BASE_MEDIA_HANDLER_H_
+
222  Status DispatchCueEvent(size_t stream_index,
+
223  std::shared_ptr<const CueEvent> cue_event) {
+
224  return Dispatch(StreamData::FromCueEvent(stream_index, cue_event));
+
225  }
+
226 
+
228  Status FlushDownstream(size_t output_stream_index);
+
229 
+ +
232 
+
233  bool initialized() { return initialized_; }
+
234  size_t num_input_streams() const { return num_input_streams_; }
+
235  size_t next_output_stream_index() const { return next_output_stream_index_; }
+
236  const std::map<size_t, std::pair<std::shared_ptr<MediaHandler>, size_t>>&
+
237  output_handlers() {
+
238  return output_handlers_;
+
239  }
+
240 
+
241  private:
+
242  MediaHandler(const MediaHandler&) = delete;
+
243  MediaHandler& operator=(const MediaHandler&) = delete;
+
244 
+
245  bool initialized_ = false;
+
246  // Number of input streams.
+
247  size_t num_input_streams_ = 0;
+
248  // The next available output stream index, used by AddHandler.
+
249  size_t next_output_stream_index_ = 0;
+
250  // output stream index -> {output handler, output handler input stream index}
+
251  // map.
+
252  std::map<size_t, std::pair<std::shared_ptr<MediaHandler>, size_t>>
+
253  output_handlers_;
+
254 };
+
255 
+
256 } // namespace media
+
257 } // namespace shaka
+
258 
+
259 #endif // PACKAGER_MEDIA_BASE_MEDIA_HANDLER_H_
virtual bool ValidateOutputStreamIndex(size_t stream_index) const
Validate if the stream at the specified index actually exists.
-
Status DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)
Dispatch the period info to downstream handlers.
-
virtual Status InitializeInternal()=0
Status Dispatch(std::unique_ptr< StreamData > stream_data)
- - - + + +
virtual Status OnFlushRequest(size_t input_stream_index)
Event handler for flush request at the specific input stream index.
-
bool IsConnected()
Validate if the handler is connected to its upstream handler.
-
Status DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)
Dispatch the media event to downstream handlers.
+
bool IsConnected()
Validate if the handler is connected to its upstream handler.
+
virtual Status Process(std::unique_ptr< StreamData > stream_data)=0
Status FlushAllDownstreams()
Flush all connected downstreams.
-
Status DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)
Dispatch the text sample to downsream handlers.
-
Status AddHandler(std::shared_ptr< MediaHandler > handler)
Connect downstream handler to the next availble output stream index.
+
Status DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)
Dispatch the text sample to downsream handlers.
+
Status DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)
Dispatch the scte35 event to downstream handlers.
+
Status AddHandler(std::shared_ptr< MediaHandler > handler)
Connect downstream handler to the next availble output stream index.
Status FlushDownstream(size_t output_stream_index)
Flush the downstream connected at the specified output stream index.
-
Status DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
Dispatch the stream info to downstream handlers.
-
Status DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)
Dispatch the media sample to downstream handlers.
-
Status DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
Dispatch the segment info to downstream handlers.
+
Status DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
Dispatch the stream info to downstream handlers.
+
Status DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)
Dispatch the media sample to downstream handlers.
+
Status DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)
Dispatch the cue event to downstream handlers.
+
Status DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
Dispatch the segment info to downstream handlers.
+
Status SetHandler(size_t output_stream_index, std::shared_ptr< MediaHandler > handler)
Connect downstream handler at the specified output stream index.
- diff --git a/docs/d3/d95/classshaka_1_1hls_1_1MockMediaPlaylist.html b/docs/d3/d95/classshaka_1_1hls_1_1MockMediaPlaylist.html index 7d2b13bade..fa4641af51 100644 --- a/docs/d3/d95/classshaka_1_1hls_1_1MockMediaPlaylist.html +++ b/docs/d3/d95/classshaka_1_1hls_1_1MockMediaPlaylist.html @@ -132,6 +132,9 @@ Public Member Functions  MOCK_CONST_METHOD0 (GetLanguage, std::string())   +MOCK_CONST_METHOD0 (GetNumChannels, int()) +   MOCK_CONST_METHOD2 (GetDisplayResolution, bool(uint32_t *width, uint32_t *height))   @@ -177,6 +180,8 @@ void   virtual std::string GetLanguage () const   +virtual int GetNumChannels () const +  virtual bool GetDisplayResolution (uint32_t *width, uint32_t *height) const   @@ -206,7 +211,7 @@ Additional Inherited Members diff --git a/docs/d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html b/docs/d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html index 5d8f27f40c..9690e51424 100644 --- a/docs/d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html +++ b/docs/d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html @@ -256,7 +256,7 @@ std::unique_ptr< diff --git a/docs/d3/d9c/encryption__handler_8cc_source.html b/docs/d3/d9c/encryption__handler_8cc_source.html index e4461d8b7c..22df6308ee 100644 --- a/docs/d3/d9c/encryption__handler_8cc_source.html +++ b/docs/d3/d9c/encryption__handler_8cc_source.html @@ -369,301 +369,393 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
280  }
281  DCHECK_EQ(decrypt_config->GetTotalSizeOfSubsamples(),
282  clear_sample->data_size());
-
283  } else {
-
284  memcpy(&cipher_sample_data.get()[0], clear_sample->data(),
-
285  std::min(clear_sample->data_size(), leading_clear_bytes_size_));
-
286  if (clear_sample->data_size() > leading_clear_bytes_size_) {
-
287  EncryptBytes(clear_sample->data() + leading_clear_bytes_size_,
-
288  clear_sample->data_size() - leading_clear_bytes_size_,
-
289  &cipher_sample_data.get()[leading_clear_bytes_size_]);
+
283  } else if (codec_ == kCodecEAC3 &&
+
284  protection_scheme_ == kAppleSampleAesProtectionScheme) {
+
285  if (!SampleAesEncryptEac3Frame(clear_sample->data(),
+
286  clear_sample->data_size(),
+
287  &cipher_sample_data.get()[0])) {
+
288  return Status(error::ENCRYPTION_FAILURE,
+
289  "Failed to encrypt E-AC3 frame.");
290  }
-
291  }
-
292 
-
293  cipher_sample->TransferData(std::move(cipher_sample_data),
-
294  clear_sample->data_size());
-
295  // Finish initializing the sample before sending it downstream. We must
-
296  // wait until now to finish the initialization as we will lose access to
-
297  // |decrypt_config| once we set it.
-
298  cipher_sample->set_is_encrypted(true);
-
299  cipher_sample->set_decrypt_config(std::move(decrypt_config));
-
300 
-
301  encryptor_->UpdateIv();
+
291  } else {
+
292  memcpy(&cipher_sample_data.get()[0], clear_sample->data(),
+
293  std::min(clear_sample->data_size(), leading_clear_bytes_size_));
+
294  if (clear_sample->data_size() > leading_clear_bytes_size_) {
+
295  // The residual block is left unecrypted (copied without encryption). No
+
296  // need to do special handling here.
+
297  EncryptBytes(clear_sample->data() + leading_clear_bytes_size_,
+
298  clear_sample->data_size() - leading_clear_bytes_size_,
+
299  &cipher_sample_data.get()[leading_clear_bytes_size_]);
+
300  }
+
301  }
302 
-
303  return DispatchMediaSample(kStreamIndex, std::move(cipher_sample));
-
304 }
-
305 
-
306 Status EncryptionHandler::SetupProtectionPattern(StreamType stream_type) {
-
307  switch (protection_scheme_) {
-
308  case kAppleSampleAesProtectionScheme: {
-
309  const size_t kH264LeadingClearBytesSize = 32u;
-
310  const size_t kSmallNalUnitSize = 32u + 16u;
-
311  const size_t kAudioLeadingClearBytesSize = 16u;
-
312  switch (codec_) {
-
313  case kCodecH264:
-
314  // Apple Sample AES uses 1:9 pattern for video.
-
315  crypt_byte_block_ = 1u;
-
316  skip_byte_block_ = 9u;
-
317  leading_clear_bytes_size_ = kH264LeadingClearBytesSize;
-
318  min_protected_data_size_ = kSmallNalUnitSize + 1u;
-
319  break;
-
320  case kCodecAAC:
-
321  FALLTHROUGH_INTENDED;
-
322  case kCodecAC3:
-
323  // Audio is whole sample encrypted. We could not use a
-
324  // crypto_byte_block_ of 1 here as if there is one crypto block
-
325  // remaining, it need not be encrypted for video but it needs to be
-
326  // encrypted for audio.
-
327  crypt_byte_block_ = 0u;
-
328  skip_byte_block_ = 0u;
-
329  leading_clear_bytes_size_ = kAudioLeadingClearBytesSize;
-
330  min_protected_data_size_ = leading_clear_bytes_size_ + 1u;
-
331  break;
-
332  default:
-
333  return Status(error::ENCRYPTION_FAILURE,
-
334  "Only AAC/AC3 and H264 are supported in Sample AES.");
-
335  }
-
336  break;
-
337  }
-
338  case FOURCC_cbcs:
-
339  FALLTHROUGH_INTENDED;
-
340  case FOURCC_cens:
-
341  if (stream_type == kStreamVideo) {
-
342  // Use 1:9 pattern for video.
-
343  crypt_byte_block_ = 1u;
-
344  skip_byte_block_ = 9u;
-
345  } else {
-
346  // Tracks other than video are protected using whole-block full-sample
-
347  // encryption, which is essentially a pattern of 1:0. Note that this may
-
348  // not be the same as the non-pattern based encryption counterparts,
-
349  // e.g. in 'cens' for full sample encryption, the whole sample is
-
350  // encrypted up to the last 16-byte boundary, see 23001-7:2016(E) 9.7;
-
351  // while in 'cenc' for full sample encryption, the last partial 16-byte
-
352  // block is also encrypted, see 23001-7:2016(E) 9.4.2. Another
-
353  // difference is the use of constant iv.
-
354  crypt_byte_block_ = 1u;
-
355  skip_byte_block_ = 0u;
-
356  }
-
357  break;
-
358  default:
-
359  // Not using pattern encryption.
-
360  crypt_byte_block_ = 0u;
-
361  skip_byte_block_ = 0u;
-
362  }
-
363  return Status::OK;
-
364 }
-
365 
-
366 bool EncryptionHandler::CreateEncryptor(const EncryptionKey& encryption_key) {
-
367  std::unique_ptr<AesCryptor> encryptor;
-
368  switch (protection_scheme_) {
-
369  case FOURCC_cenc:
-
370  encryptor.reset(new AesCtrEncryptor);
-
371  break;
-
372  case FOURCC_cbc1:
-
373  encryptor.reset(new AesCbcEncryptor(kNoPadding));
-
374  break;
-
375  case FOURCC_cens:
-
376  encryptor.reset(new AesPatternCryptor(
-
377  crypt_byte_block_, skip_byte_block_,
- -
379  AesCryptor::kDontUseConstantIv,
-
380  std::unique_ptr<AesCryptor>(new AesCtrEncryptor())));
-
381  break;
-
382  case FOURCC_cbcs:
-
383  encryptor.reset(new AesPatternCryptor(
-
384  crypt_byte_block_, skip_byte_block_,
- -
386  AesCryptor::kUseConstantIv,
-
387  std::unique_ptr<AesCryptor>(new AesCbcEncryptor(kNoPadding))));
-
388  break;
-
389  case kAppleSampleAesProtectionScheme:
-
390  if (crypt_byte_block_ == 0 && skip_byte_block_ == 0) {
-
391  encryptor.reset(
-
392  new AesCbcEncryptor(kNoPadding, AesCryptor::kUseConstantIv));
-
393  } else {
-
394  encryptor.reset(new AesPatternCryptor(
-
395  crypt_byte_block_, skip_byte_block_,
- -
397  AesCryptor::kUseConstantIv,
-
398  std::unique_ptr<AesCryptor>(new AesCbcEncryptor(kNoPadding))));
-
399  }
+
303  cipher_sample->TransferData(std::move(cipher_sample_data),
+
304  clear_sample->data_size());
+
305  // Finish initializing the sample before sending it downstream. We must
+
306  // wait until now to finish the initialization as we will lose access to
+
307  // |decrypt_config| once we set it.
+
308  cipher_sample->set_is_encrypted(true);
+
309  cipher_sample->set_decrypt_config(std::move(decrypt_config));
+
310 
+
311  encryptor_->UpdateIv();
+
312 
+
313  return DispatchMediaSample(kStreamIndex, std::move(cipher_sample));
+
314 }
+
315 
+
316 Status EncryptionHandler::SetupProtectionPattern(StreamType stream_type) {
+
317  switch (protection_scheme_) {
+
318  case kAppleSampleAesProtectionScheme: {
+
319  const size_t kH264LeadingClearBytesSize = 32u;
+
320  const size_t kSmallNalUnitSize = 32u + 16u;
+
321  const size_t kAudioLeadingClearBytesSize = 16u;
+
322  switch (codec_) {
+
323  case kCodecH264:
+
324  // Apple Sample AES uses 1:9 pattern for video.
+
325  crypt_byte_block_ = 1u;
+
326  skip_byte_block_ = 9u;
+
327  leading_clear_bytes_size_ = kH264LeadingClearBytesSize;
+
328  min_protected_data_size_ = kSmallNalUnitSize + 1u;
+
329  break;
+
330  case kCodecAAC:
+
331  FALLTHROUGH_INTENDED;
+
332  case kCodecAC3:
+
333  case kCodecEAC3:
+
334  // Audio is whole sample encrypted. We could not use a
+
335  // crypto_byte_block_ of 1 here as if there is one crypto block
+
336  // remaining, it need not be encrypted for video but it needs to be
+
337  // encrypted for audio.
+
338  crypt_byte_block_ = 0u;
+
339  skip_byte_block_ = 0u;
+
340  leading_clear_bytes_size_ = kAudioLeadingClearBytesSize;
+
341  min_protected_data_size_ = leading_clear_bytes_size_ + 15u;
+
342  break;
+
343  default:
+
344  return Status(
+
345  error::ENCRYPTION_FAILURE,
+
346  "Only AAC/AC3/EAC3 and H264 are supported in Sample AES.");
+
347  }
+
348  break;
+
349  }
+
350  case FOURCC_cbcs:
+
351  FALLTHROUGH_INTENDED;
+
352  case FOURCC_cens:
+
353  if (stream_type == kStreamVideo) {
+
354  // Use 1:9 pattern for video.
+
355  crypt_byte_block_ = 1u;
+
356  skip_byte_block_ = 9u;
+
357  } else {
+
358  // Tracks other than video are protected using whole-block full-sample
+
359  // encryption, which is essentially a pattern of 1:0. Note that this may
+
360  // not be the same as the non-pattern based encryption counterparts,
+
361  // e.g. in 'cens' for full sample encryption, the whole sample is
+
362  // encrypted up to the last 16-byte boundary, see 23001-7:2016(E) 9.7;
+
363  // while in 'cenc' for full sample encryption, the last partial 16-byte
+
364  // block is also encrypted, see 23001-7:2016(E) 9.4.2. Another
+
365  // difference is the use of constant iv.
+
366  crypt_byte_block_ = 1u;
+
367  skip_byte_block_ = 0u;
+
368  }
+
369  break;
+
370  default:
+
371  // Not using pattern encryption.
+
372  crypt_byte_block_ = 0u;
+
373  skip_byte_block_ = 0u;
+
374  }
+
375  return Status::OK;
+
376 }
+
377 
+
378 bool EncryptionHandler::CreateEncryptor(const EncryptionKey& encryption_key) {
+
379  std::unique_ptr<AesCryptor> encryptor;
+
380  switch (protection_scheme_) {
+
381  case FOURCC_cenc:
+
382  encryptor.reset(new AesCtrEncryptor);
+
383  break;
+
384  case FOURCC_cbc1:
+
385  encryptor.reset(new AesCbcEncryptor(kNoPadding));
+
386  break;
+
387  case FOURCC_cens:
+
388  encryptor.reset(new AesPatternCryptor(
+
389  crypt_byte_block_, skip_byte_block_,
+ +
391  AesCryptor::kDontUseConstantIv,
+
392  std::unique_ptr<AesCryptor>(new AesCtrEncryptor())));
+
393  break;
+
394  case FOURCC_cbcs:
+
395  encryptor.reset(new AesPatternCryptor(
+
396  crypt_byte_block_, skip_byte_block_,
+ +
398  AesCryptor::kUseConstantIv,
+
399  std::unique_ptr<AesCryptor>(new AesCbcEncryptor(kNoPadding))));
400  break;
-
401  default:
-
402  LOG(ERROR) << "Unsupported protection scheme.";
-
403  return false;
-
404  }
-
405 
-
406  std::vector<uint8_t> iv = encryption_key.iv;
-
407  if (iv.empty()) {
-
408  if (!AesCryptor::GenerateRandomIv(protection_scheme_, &iv)) {
-
409  LOG(ERROR) << "Failed to generate random iv.";
-
410  return false;
-
411  }
-
412  }
-
413  const bool initialized =
-
414  encryptor->InitializeWithIv(encryption_key.key, iv);
-
415  encryptor_ = std::move(encryptor);
-
416 
-
417  encryption_config_.reset(new EncryptionConfig);
-
418  encryption_config_->protection_scheme = protection_scheme_;
-
419  encryption_config_->crypt_byte_block = crypt_byte_block_;
-
420  encryption_config_->skip_byte_block = skip_byte_block_;
-
421  if (encryptor_->use_constant_iv()) {
-
422  encryption_config_->per_sample_iv_size = 0;
-
423  encryption_config_->constant_iv = iv;
-
424  } else {
-
425  encryption_config_->per_sample_iv_size = static_cast<uint8_t>(iv.size());
-
426  }
-
427  encryption_config_->key_id = encryption_key.key_id;
-
428  encryption_config_->key_system_info = encryption_key.key_system_info;
-
429  return initialized;
-
430 }
-
431 
-
432 bool EncryptionHandler::EncryptVpxFrame(
-
433  const std::vector<VPxFrameInfo>& vpx_frames,
-
434  const uint8_t* source,
-
435  size_t source_size,
-
436  uint8_t* dest,
-
437  DecryptConfig* decrypt_config) {
-
438  const uint8_t* data = source;
-
439  for (const VPxFrameInfo& frame : vpx_frames) {
-
440  uint16_t clear_bytes =
-
441  static_cast<uint16_t>(frame.uncompressed_header_size);
-
442  uint32_t cipher_bytes = static_cast<uint32_t>(
-
443  frame.frame_size - frame.uncompressed_header_size);
-
444 
-
445  // "VP Codec ISO Media File Format Binding" document requires that the
-
446  // encrypted bytes of each frame within the superframe must be block
-
447  // aligned so that the counter state can be computed for each frame
-
448  // within the superframe.
-
449  // ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens'
-
450  // The BytesOfProtectedData size SHALL be a multiple of 16 bytes to
-
451  // avoid partial blocks in Subsamples.
-
452  // For consistency, apply block alignment to all frames.
-
453  const uint16_t misalign_bytes = cipher_bytes % kCencBlockSize;
-
454  clear_bytes += misalign_bytes;
-
455  cipher_bytes -= misalign_bytes;
-
456 
-
457  decrypt_config->AddSubsample(clear_bytes, cipher_bytes);
-
458  memcpy(dest, data, clear_bytes);
-
459  if (cipher_bytes > 0)
-
460  EncryptBytes(data + clear_bytes, cipher_bytes, dest + clear_bytes);
-
461  data += frame.frame_size;
-
462  dest += frame.frame_size;
-
463  }
-
464  // Add subsample for the superframe index if exists.
-
465  const bool is_superframe = vpx_frames.size() > 1;
-
466  if (is_superframe) {
-
467  size_t index_size = source + source_size - data;
-
468  DCHECK_LE(index_size, 2 + vpx_frames.size() * 4);
-
469  DCHECK_GE(index_size, 2 + vpx_frames.size() * 1);
-
470  uint16_t clear_bytes = static_cast<uint16_t>(index_size);
-
471  uint32_t cipher_bytes = 0;
-
472  decrypt_config->AddSubsample(clear_bytes, cipher_bytes);
-
473  memcpy(dest, data, clear_bytes);
-
474  }
-
475  return true;
-
476 }
+
401  case kAppleSampleAesProtectionScheme:
+
402  if (crypt_byte_block_ == 0 && skip_byte_block_ == 0) {
+
403  auto constant_iv_flag = AesCryptor::kUseConstantIv;
+
404  if (codec_ == kCodecEAC3) {
+
405  // MPEG-2 Stream Encryption Format for HTTP Live Streaming 2.3.1.3
+
406  // Enhanced AC-3: Within an Enhanced AC-3 audio frame, the AES-128
+
407  // cipher block chaining (CBC) initialization vector (IV) is not reset
+
408  // at syncframe boundaries. The IV is reset at the beginning of each
+
409  // audio frame.
+
410  // We'll manage the reset of IV outside of AesCryptor.
+
411  constant_iv_flag = AesCryptor::kDontUseConstantIv;
+
412  }
+
413  encryptor.reset(new AesCbcEncryptor(kNoPadding, constant_iv_flag));
+
414  } else {
+
415  encryptor.reset(new AesPatternCryptor(
+
416  crypt_byte_block_, skip_byte_block_,
+ +
418  AesCryptor::kUseConstantIv,
+
419  std::unique_ptr<AesCryptor>(new AesCbcEncryptor(kNoPadding))));
+
420  }
+
421  break;
+
422  default:
+
423  LOG(ERROR) << "Unsupported protection scheme.";
+
424  return false;
+
425  }
+
426 
+
427  std::vector<uint8_t> iv = encryption_key.iv;
+
428  if (iv.empty()) {
+
429  if (!AesCryptor::GenerateRandomIv(protection_scheme_, &iv)) {
+
430  LOG(ERROR) << "Failed to generate random iv.";
+
431  return false;
+
432  }
+
433  }
+
434  const bool initialized =
+
435  encryptor->InitializeWithIv(encryption_key.key, iv);
+
436  encryptor_ = std::move(encryptor);
+
437 
+
438  encryption_config_.reset(new EncryptionConfig);
+
439  encryption_config_->protection_scheme = protection_scheme_;
+
440  encryption_config_->crypt_byte_block = crypt_byte_block_;
+
441  encryption_config_->skip_byte_block = skip_byte_block_;
+
442  if (encryptor_->use_constant_iv()) {
+
443  encryption_config_->per_sample_iv_size = 0;
+
444  encryption_config_->constant_iv = iv;
+
445  } else {
+
446  encryption_config_->per_sample_iv_size = static_cast<uint8_t>(iv.size());
+
447  }
+
448  encryption_config_->key_id = encryption_key.key_id;
+
449  encryption_config_->key_system_info = encryption_key.key_system_info;
+
450  return initialized;
+
451 }
+
452 
+
453 bool EncryptionHandler::EncryptVpxFrame(
+
454  const std::vector<VPxFrameInfo>& vpx_frames,
+
455  const uint8_t* source,
+
456  size_t source_size,
+
457  uint8_t* dest,
+
458  DecryptConfig* decrypt_config) {
+
459  const uint8_t* data = source;
+
460  for (const VPxFrameInfo& frame : vpx_frames) {
+
461  uint16_t clear_bytes =
+
462  static_cast<uint16_t>(frame.uncompressed_header_size);
+
463  uint32_t cipher_bytes = static_cast<uint32_t>(
+
464  frame.frame_size - frame.uncompressed_header_size);
+
465 
+
466  // "VP Codec ISO Media File Format Binding" document requires that the
+
467  // encrypted bytes of each frame within the superframe must be block
+
468  // aligned so that the counter state can be computed for each frame
+
469  // within the superframe.
+
470  // ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens'
+
471  // The BytesOfProtectedData size SHALL be a multiple of 16 bytes to
+
472  // avoid partial blocks in Subsamples.
+
473  // For consistency, apply block alignment to all frames.
+
474  const uint16_t misalign_bytes = cipher_bytes % kCencBlockSize;
+
475  clear_bytes += misalign_bytes;
+
476  cipher_bytes -= misalign_bytes;
477 
-
478 bool EncryptionHandler::EncryptNalFrame(const uint8_t* source,
-
479  size_t source_size,
-
480  uint8_t* dest,
-
481  DecryptConfig* decrypt_config) {
-
482  DCHECK_NE(nalu_length_size_, 0u);
-
483  DCHECK(header_parser_);
-
484  const Nalu::CodecType nalu_type =
-
485  (codec_ == kCodecH265) ? Nalu::kH265 : Nalu::kH264;
-
486  NaluReader reader(nalu_type, nalu_length_size_, source, source_size);
-
487 
-
488  // Store the current length of clear data. This is used to squash
-
489  // multiple unencrypted NAL units into fewer subsample entries.
-
490  uint64_t accumulated_clear_bytes = 0;
-
491 
-
492  Nalu nalu;
-
493  NaluReader::Result result;
-
494  while ((result = reader.Advance(&nalu)) == NaluReader::kOk) {
-
495  const uint64_t nalu_total_size = nalu.header_size() + nalu.payload_size();
-
496  if (nalu.is_video_slice() && nalu_total_size >= min_protected_data_size_) {
-
497  uint64_t current_clear_bytes = leading_clear_bytes_size_;
-
498  if (current_clear_bytes == 0) {
-
499  // For video-slice NAL units, encrypt the video slice. This skips
-
500  // the frame header.
-
501  const int64_t video_slice_header_size =
-
502  header_parser_->GetHeaderSize(nalu);
-
503  if (video_slice_header_size < 0) {
-
504  LOG(ERROR) << "Failed to read slice header.";
-
505  return false;
-
506  }
-
507  current_clear_bytes = nalu.header_size() + video_slice_header_size;
-
508  }
-
509  uint64_t cipher_bytes = nalu_total_size - current_clear_bytes;
-
510 
-
511  // ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens'
-
512  // The BytesOfProtectedData size SHALL be a multiple of 16 bytes to
-
513  // avoid partial blocks in Subsamples.
-
514  // CMAF requires 'cenc' scheme BytesOfProtectedData SHALL be a multiple
-
515  // of 16 bytes; while 'cbcs' scheme BytesOfProtectedData SHALL start on
-
516  // the first byte of video data following the slice header.
-
517  if (protection_scheme_ == FOURCC_cbc1 ||
-
518  protection_scheme_ == FOURCC_cens ||
-
519  protection_scheme_ == FOURCC_cenc) {
-
520  const uint16_t misalign_bytes = cipher_bytes % kCencBlockSize;
-
521  current_clear_bytes += misalign_bytes;
-
522  cipher_bytes -= misalign_bytes;
-
523  }
-
524 
-
525  accumulated_clear_bytes += nalu_length_size_ + current_clear_bytes;
-
526  AddSubsample(accumulated_clear_bytes, cipher_bytes, decrypt_config);
-
527  memcpy(dest, source, accumulated_clear_bytes);
-
528  source += accumulated_clear_bytes;
-
529  dest += accumulated_clear_bytes;
-
530  accumulated_clear_bytes = 0;
+
478  decrypt_config->AddSubsample(clear_bytes, cipher_bytes);
+
479  memcpy(dest, data, clear_bytes);
+
480  if (cipher_bytes > 0)
+
481  EncryptBytes(data + clear_bytes, cipher_bytes, dest + clear_bytes);
+
482  data += frame.frame_size;
+
483  dest += frame.frame_size;
+
484  }
+
485  // Add subsample for the superframe index if exists.
+
486  const bool is_superframe = vpx_frames.size() > 1;
+
487  if (is_superframe) {
+
488  size_t index_size = source + source_size - data;
+
489  DCHECK_LE(index_size, 2 + vpx_frames.size() * 4);
+
490  DCHECK_GE(index_size, 2 + vpx_frames.size() * 1);
+
491  uint16_t clear_bytes = static_cast<uint16_t>(index_size);
+
492  uint32_t cipher_bytes = 0;
+
493  decrypt_config->AddSubsample(clear_bytes, cipher_bytes);
+
494  memcpy(dest, data, clear_bytes);
+
495  }
+
496  return true;
+
497 }
+
498 
+
499 bool EncryptionHandler::EncryptNalFrame(const uint8_t* source,
+
500  size_t source_size,
+
501  uint8_t* dest,
+
502  DecryptConfig* decrypt_config) {
+
503  DCHECK_NE(nalu_length_size_, 0u);
+
504  DCHECK(header_parser_);
+
505  const Nalu::CodecType nalu_type =
+
506  (codec_ == kCodecH265) ? Nalu::kH265 : Nalu::kH264;
+
507  NaluReader reader(nalu_type, nalu_length_size_, source, source_size);
+
508 
+
509  // Store the current length of clear data. This is used to squash
+
510  // multiple unencrypted NAL units into fewer subsample entries.
+
511  uint64_t accumulated_clear_bytes = 0;
+
512 
+
513  Nalu nalu;
+
514  NaluReader::Result result;
+
515  while ((result = reader.Advance(&nalu)) == NaluReader::kOk) {
+
516  const uint64_t nalu_total_size = nalu.header_size() + nalu.payload_size();
+
517  if (nalu.is_video_slice() && nalu_total_size >= min_protected_data_size_) {
+
518  uint64_t current_clear_bytes = leading_clear_bytes_size_;
+
519  if (current_clear_bytes == 0) {
+
520  // For video-slice NAL units, encrypt the video slice. This skips
+
521  // the frame header.
+
522  const int64_t video_slice_header_size =
+
523  header_parser_->GetHeaderSize(nalu);
+
524  if (video_slice_header_size < 0) {
+
525  LOG(ERROR) << "Failed to read slice header.";
+
526  return false;
+
527  }
+
528  current_clear_bytes = nalu.header_size() + video_slice_header_size;
+
529  }
+
530  uint64_t cipher_bytes = nalu_total_size - current_clear_bytes;
531 
-
532  DCHECK_EQ(nalu.data() + current_clear_bytes, source);
-
533  EncryptBytes(source, cipher_bytes, dest);
-
534  source += cipher_bytes;
-
535  dest += cipher_bytes;
-
536  } else {
-
537  // For non-video-slice or small NAL units, don't encrypt.
-
538  accumulated_clear_bytes += nalu_length_size_ + nalu_total_size;
-
539  }
-
540  }
-
541  if (result != NaluReader::kEOStream) {
-
542  LOG(ERROR) << "Failed to parse NAL units.";
-
543  return false;
-
544  }
-
545  AddSubsample(accumulated_clear_bytes, 0, decrypt_config);
-
546  memcpy(dest, source, accumulated_clear_bytes);
-
547  return true;
-
548 }
-
549 
-
550 void EncryptionHandler::EncryptBytes(const uint8_t* source,
-
551  size_t source_size,
-
552  uint8_t* dest) {
-
553  DCHECK(source);
-
554  DCHECK(dest);
-
555  DCHECK(encryptor_);
-
556  CHECK(encryptor_->Crypt(source, source_size, dest));
-
557 }
-
558 
-
559 void EncryptionHandler::InjectVpxParserForTesting(
-
560  std::unique_ptr<VPxParser> vpx_parser) {
-
561  vpx_parser_ = std::move(vpx_parser);
-
562 }
-
563 
-
564 void EncryptionHandler::InjectVideoSliceHeaderParserForTesting(
-
565  std::unique_ptr<VideoSliceHeaderParser> header_parser) {
-
566  header_parser_ = std::move(header_parser);
-
567 }
-
568 
-
569 } // namespace media
-
570 } // namespace shaka
+
532  // ISO/IEC 23001-7:2016 10.2 'cbc1' 10.3 'cens'
+
533  // The BytesOfProtectedData size SHALL be a multiple of 16 bytes to
+
534  // avoid partial blocks in Subsamples.
+
535  // CMAF requires 'cenc' scheme BytesOfProtectedData SHALL be a multiple
+
536  // of 16 bytes; while 'cbcs' scheme BytesOfProtectedData SHALL start on
+
537  // the first byte of video data following the slice header.
+
538  if (protection_scheme_ == FOURCC_cbc1 ||
+
539  protection_scheme_ == FOURCC_cens ||
+
540  protection_scheme_ == FOURCC_cenc) {
+
541  const uint16_t misalign_bytes = cipher_bytes % kCencBlockSize;
+
542  current_clear_bytes += misalign_bytes;
+
543  cipher_bytes -= misalign_bytes;
+
544  }
+
545 
+
546  accumulated_clear_bytes += nalu_length_size_ + current_clear_bytes;
+
547  AddSubsample(accumulated_clear_bytes, cipher_bytes, decrypt_config);
+
548  memcpy(dest, source, accumulated_clear_bytes);
+
549  source += accumulated_clear_bytes;
+
550  dest += accumulated_clear_bytes;
+
551  accumulated_clear_bytes = 0;
+
552 
+
553  DCHECK_EQ(nalu.data() + current_clear_bytes, source);
+
554  EncryptBytes(source, cipher_bytes, dest);
+
555  source += cipher_bytes;
+
556  dest += cipher_bytes;
+
557  } else {
+
558  // For non-video-slice or small NAL units, don't encrypt.
+
559  accumulated_clear_bytes += nalu_length_size_ + nalu_total_size;
+
560  }
+
561  }
+
562  if (result != NaluReader::kEOStream) {
+
563  LOG(ERROR) << "Failed to parse NAL units.";
+
564  return false;
+
565  }
+
566  AddSubsample(accumulated_clear_bytes, 0, decrypt_config);
+
567  memcpy(dest, source, accumulated_clear_bytes);
+
568  return true;
+
569 }
+
570 
+
571 bool EncryptionHandler::SampleAesEncryptEac3Frame(const uint8_t* source,
+
572  size_t source_size,
+
573  uint8_t* dest) {
+
574  DCHECK(source);
+
575  DCHECK(dest);
+
576 
+
577  std::vector<size_t> syncframe_sizes;
+
578  if (!ExtractEac3SyncframeSizes(source, source_size, &syncframe_sizes))
+
579  return false;
+
580 
+
581  // MPEG-2 Stream Encryption Format for HTTP Live Streaming 2.3.1.3 Enhanced
+
582  // AC-3: The IV is reset at the beginning of each audio frame.
+
583  encryptor_->SetIv(encryptor_->iv());
+
584 
+
585  for (size_t syncframe_size : syncframe_sizes) {
+
586  memcpy(dest, source, std::min(syncframe_size, leading_clear_bytes_size_));
+
587  if (syncframe_size > leading_clear_bytes_size_) {
+
588  // The residual block is left unecrypted (copied without encryption). No
+
589  // need to do special handling here.
+
590  EncryptBytes(source + leading_clear_bytes_size_,
+
591  syncframe_size - leading_clear_bytes_size_,
+
592  dest + leading_clear_bytes_size_);
+
593  }
+
594  source += syncframe_size;
+
595  dest += syncframe_size;
+
596  }
+
597  return true;
+
598 }
+
599 
+
600 void EncryptionHandler::EncryptBytes(const uint8_t* source,
+
601  size_t source_size,
+
602  uint8_t* dest) {
+
603  DCHECK(source);
+
604  DCHECK(dest);
+
605  DCHECK(encryptor_);
+
606  CHECK(encryptor_->Crypt(source, source_size, dest));
+
607 }
+
608 
+
609 bool EncryptionHandler::ExtractEac3SyncframeSizes(
+
610  const uint8_t* source,
+
611  size_t source_size,
+
612  std::vector<size_t>* syncframe_sizes) {
+
613  DCHECK(source);
+
614  DCHECK(syncframe_sizes);
+
615 
+
616  syncframe_sizes->clear();
+
617  BufferReader frame(source, source_size);
+
618  // ASTC Standard A/52:2012 Annex E: Enhanced AC-3.
+
619  while (frame.HasBytes(1)) {
+
620  uint16_t syncword;
+
621  if (!frame.Read2(&syncword)) {
+
622  LOG(ERROR) << "Not enough bytes for syncword.";
+
623  return false;
+
624  }
+
625  if (syncword != 0x0B77) {
+
626  LOG(ERROR) << "Invalid E-AC3 frame. Seeing 0x" << std::hex << syncword
+
627  << std::dec
+
628  << ". The sync frame does not start with "
+
629  "the valid syncword 0x0B77.";
+
630  return false;
+
631  }
+
632  uint16_t stream_type_and_syncframe_size;
+
633  if (!frame.Read2(&stream_type_and_syncframe_size)) {
+
634  LOG(ERROR) << "Not enough bytes for syncframe size.";
+
635  return false;
+
636  }
+
637  // frmsiz = least significant 11 bits. syncframe_size is (frmsiz + 1) * 2.
+
638  const size_t syncframe_size =
+
639  ((stream_type_and_syncframe_size & 0x7FF) + 1) * 2;
+
640  if (!frame.SkipBytes(syncframe_size - sizeof(syncword) -
+
641  sizeof(stream_type_and_syncframe_size))) {
+
642  LOG(ERROR) << "Not enough bytes for syncframe. Expecting "
+
643  << syncframe_size << " bytes.";
+
644  return false;
+
645  }
+
646  syncframe_sizes->push_back(syncframe_size);
+
647  }
+
648  return true;
+
649 }
+
650 
+
651 void EncryptionHandler::InjectVpxParserForTesting(
+
652  std::unique_ptr<VPxParser> vpx_parser) {
+
653  vpx_parser_ = std::move(vpx_parser);
+
654 }
+
655 
+
656 void EncryptionHandler::InjectVideoSliceHeaderParserForTesting(
+
657  std::unique_ptr<VideoSliceHeaderParser> header_parser) {
+
658  header_parser_ = std::move(header_parser);
+
659 }
+
660 
+
661 } // namespace media
+
662 } // namespace shaka
Abstract class holds stream information.
Definition: stream_info.h:58
virtual std::unique_ptr< StreamInfo > Clone() const =0
std::function< std::string(const EncryptedStreamAttributes &stream_attributes)> stream_label_func
virtual Status GetCryptoPeriodKey(uint32_t crypto_period_index, const std::string &stream_label, EncryptionKey *key)=0
Status Dispatch(std::unique_ptr< StreamData > stream_data)
- +
virtual Status GetKey(const std::string &stream_label, EncryptionKey *key)=0
double clear_lead_in_seconds
Clear lead duration in seconds.
@@ -672,13 +764,13 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
Status Process(std::unique_ptr< StreamData > stream_data) override
static bool GenerateRandomIv(FourCC protection_scheme, std::vector< uint8_t > *iv)
Definition: aes_cryptor.cc:107
-
Status DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
Dispatch the stream info to downstream handlers.
-
Status DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)
Dispatch the media sample to downstream handlers.
-
Status DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
Dispatch the segment info to downstream handlers.
+
Status DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
Dispatch the stream info to downstream handlers.
+
Status DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)
Dispatch the media sample to downstream handlers.
+
Status DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
Dispatch the segment info to downstream handlers.
diff --git a/docs/d3/da0/ec3__audio__util_8h_source.html b/docs/d3/da0/ec3__audio__util_8h_source.html index 29575d9a92..baae44172a 100644 --- a/docs/d3/da0/ec3__audio__util_8h_source.html +++ b/docs/d3/da0/ec3__audio__util_8h_source.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html b/docs/d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html index 93b7f77b7e..cff6031f58 100644 --- a/docs/d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html +++ b/docs/d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html @@ -302,7 +302,7 @@ uint64_t  diff --git a/docs/d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html b/docs/d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html index d383b4e42a..f4e4596116 100644 --- a/docs/d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html +++ b/docs/d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html @@ -189,7 +189,7 @@ Additional Inherited Members diff --git a/docs/d3/db4/classshaka_1_1media_1_1WebMWebVTTParser-members.html b/docs/d3/db4/classshaka_1_1media_1_1WebMWebVTTParser-members.html index 27a3028347..631c81af57 100644 --- a/docs/d3/db4/classshaka_1_1media_1_1WebMWebVTTParser-members.html +++ b/docs/d3/db4/classshaka_1_1media_1_1WebMWebVTTParser-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
duration () c diff --git a/docs/d3/da2/structshaka_1_1media_1_1mp4_1_1SchemeType.html b/docs/d3/da2/structshaka_1_1media_1_1mp4_1_1SchemeType.html index 7cdf84b2d9..638d823966 100644 --- a/docs/d3/da2/structshaka_1_1media_1_1mp4_1_1SchemeType.html +++ b/docs/d3/da2/structshaka_1_1media_1_1mp4_1_1SchemeType.html @@ -185,7 +185,7 @@ Additional Inherited Members
diff --git a/docs/d3/db5/structshaka_1_1media_1_1mp4_1_1Track.html b/docs/d3/db5/structshaka_1_1media_1_1mp4_1_1Track.html index 42fbb00032..f1a9620cf7 100644 --- a/docs/d3/db5/structshaka_1_1media_1_1mp4_1_1Track.html +++ b/docs/d3/db5/structshaka_1_1media_1_1mp4_1_1Track.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d3/db6/webm__parser_8cc_source.html b/docs/d3/db6/webm__parser_8cc_source.html index bc14f92e7a..ed82fc6de3 100644 --- a/docs/d3/db6/webm__parser_8cc_source.html +++ b/docs/d3/db6/webm__parser_8cc_source.html @@ -1088,7 +1088,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dbc/seek__head_8cc_source.html b/docs/d3/dbc/seek__head_8cc_source.html index a74accfd1d..b66a074cc8 100644 --- a/docs/d3/dbc/seek__head_8cc_source.html +++ b/docs/d3/dbc/seek__head_8cc_source.html @@ -206,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dbe/demuxer_8cc_source.html b/docs/d3/dbe/demuxer_8cc_source.html index d31cb461f8..bbff3c2870 100644 --- a/docs/d3/dbe/demuxer_8cc_source.html +++ b/docs/d3/dbe/demuxer_8cc_source.html @@ -438,8 +438,8 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
virtual bool Close()=0
void SetKeySource(std::unique_ptr< KeySource > key_source)
Definition: demuxer.cc:83
Status FlushDownstream(size_t output_stream_index)
Flush the downstream connected at the specified output stream index.
-
Status DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
Dispatch the stream info to downstream handlers.
-
Status DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)
Dispatch the media sample to downstream handlers.
+
Status DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
Dispatch the stream info to downstream handlers.
+
Status DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)
Dispatch the media sample to downstream handlers.
Demuxer(const std::string &file_name)
Definition: demuxer.cc:75
virtual bool Open()=0
Internal open. Should not be used directly.
void Cancel() override
Definition: demuxer.cc:128
@@ -447,7 +447,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dbe/structshaka_1_1media_1_1mp4_1_1EditList.html b/docs/d3/dbe/structshaka_1_1media_1_1mp4_1_1EditList.html index a8eee8ffbd..8234ec7f6b 100644 --- a/docs/d3/dbe/structshaka_1_1media_1_1mp4_1_1EditList.html +++ b/docs/d3/dbe/structshaka_1_1media_1_1mp4_1_1EditList.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d3/dc0/structshaka_1_1DecryptionParams-members.html b/docs/d3/dc0/structshaka_1_1DecryptionParams-members.html index 2f46d7cd43..e1860f68c7 100644 --- a/docs/d3/dc0/structshaka_1_1DecryptionParams-members.html +++ b/docs/d3/dc0/structshaka_1_1DecryptionParams-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html b/docs/d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html index 2e527d7000..f480efc0da 100644 --- a/docs/d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html +++ b/docs/d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html @@ -154,7 +154,7 @@ std::shared_ptr< shaka::media::MediaParser.

-

Definition at line 172 of file mp2t_media_parser.cc.

+

Definition at line 165 of file mp2t_media_parser.cc.

@@ -206,7 +206,7 @@ std::shared_ptr< shaka::media::MediaParser.

-

Definition at line 159 of file mp2t_media_parser.cc.

+

Definition at line 152 of file mp2t_media_parser.cc.

@@ -246,7 +246,7 @@ std::shared_ptr< shaka::media::MediaParser.

-

Definition at line 190 of file mp2t_media_parser.cc.

+

Definition at line 183 of file mp2t_media_parser.cc.

@@ -257,7 +257,7 @@ std::shared_ptr< diff --git a/docs/d3/dd0/classshaka_1_1MpdNotifier.html b/docs/d3/dd0/classshaka_1_1MpdNotifier.html index 30c2ff68bb..5c35be8af8 100644 --- a/docs/d3/dd0/classshaka_1_1MpdNotifier.html +++ b/docs/d3/dd0/classshaka_1_1MpdNotifier.html @@ -500,7 +500,7 @@ Public Member Functions diff --git a/docs/d3/dd0/structshaka_1_1media_1_1mp4_1_1SegmentType.html b/docs/d3/dd0/structshaka_1_1media_1_1mp4_1_1SegmentType.html index 5698c83b6e..12597b87b6 100644 --- a/docs/d3/dd0/structshaka_1_1media_1_1mp4_1_1SegmentType.html +++ b/docs/d3/dd0/structshaka_1_1media_1_1mp4_1_1SegmentType.html @@ -177,7 +177,7 @@ std::vector< FourCC > < diff --git a/docs/d3/dd7/ad__cue__generator_8h_source.html b/docs/d3/dd7/ad__cue__generator_8h_source.html new file mode 100644 index 0000000000..681b290a23 --- /dev/null +++ b/docs/d3/dd7/ad__cue__generator_8h_source.html @@ -0,0 +1,139 @@ + + + + + + +Shaka Packager SDK: packager/media/ad_cue_generator/ad_cue_generator.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
ad_cue_generator.h
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #ifndef PACKAGER_MEDIA_AD_CUE_GENERATOR_AD_CUE_GENERATOR_H_
+
8 #define PACKAGER_MEDIA_AD_CUE_GENERATOR_AD_CUE_GENERATOR_H_
+
9 
+
10 #include "packager/media/base/media_handler.h"
+
11 #include "packager/media/public/ad_cue_generator_params.h"
+
12 
+
13 namespace shaka {
+
14 namespace media {
+
15 
+
17 class AdCueGenerator : public MediaHandler {
+
18  public:
+
19  explicit AdCueGenerator(const AdCueGeneratorParams& ad_cue_generator_params);
+
20  ~AdCueGenerator() override;
+
21 
+
22  private:
+
23  AdCueGenerator(const AdCueGenerator&) = delete;
+
24  AdCueGenerator& operator=(const AdCueGenerator&) = delete;
+
25 
+
26  Status InitializeInternal() override;
+
27  Status Process(std::unique_ptr<StreamData> stream_data) override;
+
28 
+
29  // Dispatches SCTE35 events that are built from AdCueGenerator params.
+
30  Status DispatchScte35Events(size_t stream_index, uint32_t time_scale);
+
31 
+
32  const AdCueGeneratorParams ad_cue_generator_params_;
+
33 };
+
34 
+
35 } // namespace media
+
36 } // namespace shaka
+
37 
+
38 #endif // PACKAGER_MEDIA_AD_CUE_GENERATOR_AD_CUE_GENERATOR_H_
+ + +
Cuepoint generator related parameters.
+
AdCueGenerator converts out of band cuepoint markers into SCTE-35 events.
+
+ + + + diff --git a/docs/d3/de2/structshaka_1_1FileCloser.html b/docs/d3/de2/structshaka_1_1FileCloser.html index 101e36cebf..d1b3a76cf3 100644 --- a/docs/d3/de2/structshaka_1_1FileCloser.html +++ b/docs/d3/de2/structshaka_1_1FileCloser.html @@ -112,7 +112,7 @@ void operator() ( diff --git a/docs/d3/de4/seek__head_8h_source.html b/docs/d3/de4/seek__head_8h_source.html index 7f69067b58..0e6241798c 100644 --- a/docs/d3/de4/seek__head_8h_source.html +++ b/docs/d3/de4/seek__head_8h_source.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/de9/classshaka_1_1media_1_1mp4_1_1BoxBuffer-members.html b/docs/d3/de9/classshaka_1_1media_1_1mp4_1_1BoxBuffer-members.html index 1f85821200..41f13304dd 100644 --- a/docs/d3/de9/classshaka_1_1media_1_1mp4_1_1BoxBuffer-members.html +++ b/docs/d3/de9/classshaka_1_1media_1_1mp4_1_1BoxBuffer-members.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/de9/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription-members.html b/docs/d3/de9/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription-members.html index 8a2077cbd4..a87ff42a6e 100644 --- a/docs/d3/de9/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription-members.html +++ b/docs/d3/de9/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/df1/box__reader_8cc_source.html b/docs/d3/df1/box__reader_8cc_source.html index 0cab49e1ab..9b8a135e92 100644 --- a/docs/d3/df1/box__reader_8cc_source.html +++ b/docs/d3/df1/box__reader_8cc_source.html @@ -259,7 +259,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/df5/structshaka_1_1PlayreadyEncryptionParams.html b/docs/d3/df5/structshaka_1_1PlayreadyEncryptionParams.html index ed96b0621e..60562523b6 100644 --- a/docs/d3/df5/structshaka_1_1PlayreadyEncryptionParams.html +++ b/docs/d3/df5/structshaka_1_1PlayreadyEncryptionParams.html @@ -155,7 +155,7 @@ std::vector< uint8_t >  diff --git a/docs/d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html b/docs/d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html index febfd58386..2626943d00 100644 --- a/docs/d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html +++ b/docs/d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html @@ -297,7 +297,7 @@ AES_KEY * mutable_aes_key< diff --git a/docs/d4/d00/mp4_2multi__segment__segmenter_8cc_source.html b/docs/d4/d00/mp4_2multi__segment__segmenter_8cc_source.html index 71751b77f1..3f983a5cac 100644 --- a/docs/d4/d00/mp4_2multi__segment__segmenter_8cc_source.html +++ b/docs/d4/d00/mp4_2multi__segment__segmenter_8cc_source.html @@ -310,7 +310,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d08/classshaka_1_1media_1_1mp4_1_1MP4MediaParser-members.html b/docs/d4/d08/classshaka_1_1media_1_1mp4_1_1MP4MediaParser-members.html index 09dc96824b..6f93ac265d 100644 --- a/docs/d4/d08/classshaka_1_1media_1_1mp4_1_1MP4MediaParser-members.html +++ b/docs/d4/d08/classshaka_1_1media_1_1mp4_1_1MP4MediaParser-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d0b/classshaka_1_1media_1_1TextTrack.html b/docs/d4/d0b/classshaka_1_1media_1_1TextTrack.html index 113ac5d685..44f6407ea5 100644 --- a/docs/d4/d0b/classshaka_1_1media_1_1TextTrack.html +++ b/docs/d4/d0b/classshaka_1_1media_1_1TextTrack.html @@ -109,7 +109,7 @@ virtual void addWebVTTCue< diff --git a/docs/d4/d14/classshaka_1_1media_1_1WebVttMediaParser-members.html b/docs/d4/d14/classshaka_1_1media_1_1WebVttMediaParser-members.html index e45d3d660b..d76ef1ba88 100644 --- a/docs/d4/d14/classshaka_1_1media_1_1WebVttMediaParser-members.html +++ b/docs/d4/d14/classshaka_1_1media_1_1WebVttMediaParser-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d15/gflags__hex__bytes_8cc_source.html b/docs/d4/d15/gflags__hex__bytes_8cc_source.html index 6abf746ac8..239fd85b8d 100644 --- a/docs/d4/d15/gflags__hex__bytes_8cc_source.html +++ b/docs/d4/d15/gflags__hex__bytes_8cc_source.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d18/structshaka_1_1media_1_1mp4_1_1EditListEntry.html b/docs/d4/d18/structshaka_1_1media_1_1mp4_1_1EditListEntry.html index 1dde9f0405..ce1bcb9bd9 100644 --- a/docs/d4/d18/structshaka_1_1media_1_1mp4_1_1EditListEntry.html +++ b/docs/d4/d18/structshaka_1_1media_1_1mp4_1_1EditListEntry.html @@ -118,7 +118,7 @@ int16_t media_rate_fractio diff --git a/docs/d4/d20/classshaka_1_1media_1_1AesCbcEncryptor.html b/docs/d4/d20/classshaka_1_1media_1_1AesCbcEncryptor.html index 8731b60b18..d2aef0588e 100644 --- a/docs/d4/d20/classshaka_1_1media_1_1AesCbcEncryptor.html +++ b/docs/d4/d20/classshaka_1_1media_1_1AesCbcEncryptor.html @@ -235,7 +235,7 @@ AES_KEY * mutable_aes_key< diff --git a/docs/d4/d20/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset-members.html b/docs/d4/d20/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset-members.html index 19533fe029..9dc2d7083f 100644 --- a/docs/d4/d20/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset-members.html +++ b/docs/d4/d20/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d2c/structshaka_1_1media_1_1mp4_1_1ID3v2-members.html b/docs/d4/d2c/structshaka_1_1media_1_1mp4_1_1ID3v2-members.html index 9d83e4090f..9d487931d1 100644 --- a/docs/d4/d2c/structshaka_1_1media_1_1mp4_1_1ID3v2-members.html +++ b/docs/d4/d2c/structshaka_1_1media_1_1mp4_1_1ID3v2-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d33/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html b/docs/d4/d33/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html index 23d7039548..d6a0342a81 100644 --- a/docs/d4/d33/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html +++ b/docs/d4/d33/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d4/d37/io__cache_8cc_source.html b/docs/d4/d37/io__cache_8cc_source.html index 902708099b..bbb654135b 100644 --- a/docs/d4/d37/io__cache_8cc_source.html +++ b/docs/d4/d37/io__cache_8cc_source.html @@ -243,7 +243,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d3a/structshaka_1_1media_1_1H264Sps-members.html b/docs/d4/d3a/structshaka_1_1media_1_1H264Sps-members.html index 03aa89f6e4..dcddcec5db 100644 --- a/docs/d4/d3a/structshaka_1_1media_1_1H264Sps-members.html +++ b/docs/d4/d3a/structshaka_1_1media_1_1H264Sps-members.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d43/classshaka_1_1media_1_1ChunkingHandler.html b/docs/d4/d43/classshaka_1_1media_1_1ChunkingHandler.html index ad5c194895..aae4bb3953 100644 --- a/docs/d4/d43/classshaka_1_1media_1_1ChunkingHandler.html +++ b/docs/d4/d43/classshaka_1_1media_1_1ChunkingHandler.html @@ -87,6 +87,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
@@ -145,10 +146,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -161,14 +158,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -207,7 +208,7 @@ class ChunkingHandlerTest<

This algorithm will make sure the chunks from different video streams are aligned if they have aligned GoPs. However, this algorithm will only work for video streams. To be able to chunk non video streams at similar positions as video streams, ChunkingHandler is designed to accept one video input and multiple non video inputs, the non video inputs are chunked when the video input is chunked. If the inputs are synchronized - which is true if the inputs come from the same demuxer, the video and non video chunks are aligned.

-

Definition at line 44 of file chunking_handler.h.

+

Definition at line 46 of file chunking_handler.h.

Member Function Documentation

@@ -273,7 +274,7 @@ class ChunkingHandlerTest<
diff --git a/docs/d4/d4a/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset-members.html b/docs/d4/d4a/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset-members.html index 193fc3aaca..e13a5268ee 100644 --- a/docs/d4/d4a/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset-members.html +++ b/docs/d4/d4a/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d4c/structshaka_1_1media_1_1H264WeightingFactors.html b/docs/d4/d4c/structshaka_1_1media_1_1H264WeightingFactors.html index 2bd79ba81f..34d5318803 100644 --- a/docs/d4/d4c/structshaka_1_1media_1_1H264WeightingFactors.html +++ b/docs/d4/d4c/structshaka_1_1media_1_1H264WeightingFactors.html @@ -124,7 +124,7 @@ int chroma_offset [32] diff --git a/docs/d4/d58/classshaka_1_1media_1_1Nalu-members.html b/docs/d4/d58/classshaka_1_1media_1_1Nalu-members.html index a8708e165c..5f11fbc243 100644 --- a/docs/d4/d58/classshaka_1_1media_1_1Nalu-members.html +++ b/docs/d4/d58/classshaka_1_1media_1_1Nalu-members.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d59/classshaka_1_1media_1_1WebMWebVTTParser.html b/docs/d4/d59/classshaka_1_1media_1_1WebMWebVTTParser.html index 50230094a7..9fe87ea483 100644 --- a/docs/d4/d59/classshaka_1_1media_1_1WebMWebVTTParser.html +++ b/docs/d4/d59/classshaka_1_1media_1_1WebMWebVTTParser.html @@ -111,7 +111,7 @@ static void  diff --git a/docs/d4/d5c/classshaka_1_1media_1_1DecryptConfig-members.html b/docs/d4/d5c/classshaka_1_1media_1_1DecryptConfig-members.html index 7174ec59cd..0e011acf3e 100644 --- a/docs/d4/d5c/classshaka_1_1media_1_1DecryptConfig-members.html +++ b/docs/d4/d5c/classshaka_1_1media_1_1DecryptConfig-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d94/adts__constants_8cc_source.html b/docs/d4/d61/ad__cue__generator__flags_8h_source.html similarity index 64% rename from docs/d8/d94/adts__constants_8cc_source.html rename to docs/d4/d61/ad__cue__generator__flags_8h_source.html index 7fcabed5bb..0b73ee3a9b 100644 --- a/docs/d8/d94/adts__constants_8cc_source.html +++ b/docs/d4/d61/ad__cue__generator__flags_8h_source.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: packager/media/formats/mpeg/adts_constants.cc Source File +Shaka Packager SDK: packager/app/ad_cue_generator_flags.h Source File @@ -79,44 +79,32 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
adts_constants.cc
+
ad_cue_generator_flags.h
-
1 // Copyright 2014 The Chromium Authors. All rights reserved.
-
2 // Use of this source code is governed by a BSD-style license that can be
-
3 // found in the LICENSE file.
-
4 
-
5 #include "packager/media/formats/mpeg/adts_constants.h"
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
6 
-
7 #include "packager/base/macros.h"
-
8 
-
9 namespace shaka {
-
10 namespace media {
+
7 #ifndef PACKAGER_APP_AD_CUE_GENERATOR_FLAGS_H_
+
8 #define PACKAGER_APP_AD_CUE_GENERATOR_FLAGS_H_
+
9 
+
10 #include <gflags/gflags.h>
11 
-
12 // The following conversion table is extracted from ISO 14496 Part 3 -
-
13 // Table 1.16 - Sampling Frequency Index.
-
14 const int kAdtsFrequencyTable[] = {96000, 88200, 64000, 48000, 44100,
-
15  32000, 24000, 22050, 16000, 12000,
-
16  11025, 8000, 7350};
-
17 const size_t kAdtsFrequencyTableSize = arraysize(kAdtsFrequencyTable);
-
18 
-
19 // The following conversion table is extracted from ISO 14496 Part 3 -
-
20 // Table 1.17 - Channel Configuration.
-
21 const int kAdtsNumChannelsTable[] = {
-
22  0, 1, 2, 3, 4, 5, 6, 8 };
-
23 const size_t kAdtsNumChannelsTableSize = arraysize(kAdtsNumChannelsTable);
-
24 
-
25 } // namespace media
-
26 } // namespace shaka
+
12 DECLARE_string(ad_cues);
+
13 
+
14 #endif // PACKAGER_APP_AD_CUE_GENERATOR_FLAGS_H_
diff --git a/docs/d4/d70/classshaka_1_1DashIopMpdNotifier.html b/docs/d4/d70/classshaka_1_1DashIopMpdNotifier.html index 6240a668f3..93e3186c07 100644 --- a/docs/d4/d70/classshaka_1_1DashIopMpdNotifier.html +++ b/docs/d4/d70/classshaka_1_1DashIopMpdNotifier.html @@ -475,7 +475,7 @@ class DashIopMpdNotifierTe
diff --git a/docs/d4/d70/structshaka_1_1SegmentInfo-members.html b/docs/d4/d70/structshaka_1_1SegmentInfo-members.html index 3055da4d61..500157e368 100644 --- a/docs/d4/d70/structshaka_1_1SegmentInfo-members.html +++ b/docs/d4/d70/structshaka_1_1SegmentInfo-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d83/cue_8cc_source.html b/docs/d4/d83/cue_8cc_source.html index b7144b5750..23d20833ba 100644 --- a/docs/d4/d83/cue_8cc_source.html +++ b/docs/d4/d83/cue_8cc_source.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d87/nalu__reader_8h_source.html b/docs/d4/d87/nalu__reader_8h_source.html index d56146e04e..6531c9a9a4 100644 --- a/docs/d4/d87/nalu__reader_8h_source.html +++ b/docs/d4/d87/nalu__reader_8h_source.html @@ -320,7 +320,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d87/text__sample_8cc_source.html b/docs/d4/d87/text__sample_8cc_source.html index c296000f21..380098abd0 100644 --- a/docs/d4/d87/text__sample_8cc_source.html +++ b/docs/d4/d87/text__sample_8cc_source.html @@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d8a/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord.html b/docs/d4/d8a/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord.html index f946a1cc07..b722254427 100644 --- a/docs/d4/d8a/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord.html +++ b/docs/d4/d8a/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord.html @@ -171,7 +171,7 @@ void  diff --git a/docs/d4/d8d/structshaka_1_1media_1_1mp4_1_1EC3Specific.html b/docs/d4/d8d/structshaka_1_1media_1_1mp4_1_1EC3Specific.html index 20b3c38408..640905b28a 100644 --- a/docs/d4/d8d/structshaka_1_1media_1_1mp4_1_1EC3Specific.html +++ b/docs/d4/d8d/structshaka_1_1media_1_1mp4_1_1EC3Specific.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d4/d9b/classshaka_1_1media_1_1MediaHandlerTestBase.html b/docs/d4/d9b/classshaka_1_1media_1_1MediaHandlerTestBase.html index 8a3cadcb26..1212efadc8 100644 --- a/docs/d4/d9b/classshaka_1_1media_1_1MediaHandlerTestBase.html +++ b/docs/d4/d9b/classshaka_1_1media_1_1MediaHandlerTestBase.html @@ -161,7 +161,7 @@ std::unique_ptr< diff --git a/docs/d4/da6/classshaka_1_1media_1_1PlayReadyKeySource.html b/docs/d4/da6/classshaka_1_1media_1_1PlayReadyKeySource.html index 07fa2c00bc..ffc501fb52 100644 --- a/docs/d4/da6/classshaka_1_1media_1_1PlayReadyKeySource.html +++ b/docs/d4/da6/classshaka_1_1media_1_1PlayReadyKeySource.html @@ -458,7 +458,7 @@ Static Public Member Functions diff --git a/docs/d4/da7/segmenter__test__base_8cc_source.html b/docs/d4/da7/segmenter__test__base_8cc_source.html index f1a744481b..988a0ddcb5 100644 --- a/docs/d4/da7/segmenter__test__base_8cc_source.html +++ b/docs/d4/da7/segmenter__test__base_8cc_source.html @@ -309,7 +309,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dad/structshaka_1_1media_1_1mp4_1_1SampleEncryption.html b/docs/d4/dad/structshaka_1_1media_1_1mp4_1_1SampleEncryption.html index 1d22ef75a5..0dc74cc679 100644 --- a/docs/d4/dad/structshaka_1_1media_1_1mp4_1_1SampleEncryption.html +++ b/docs/d4/dad/structshaka_1_1media_1_1mp4_1_1SampleEncryption.html @@ -250,7 +250,7 @@ Additional Inherited Members diff --git a/docs/d4/db1/structshaka_1_1media_1_1mp4_1_1CompactSampleSize-members.html b/docs/d4/db1/structshaka_1_1media_1_1mp4_1_1CompactSampleSize-members.html index 5fd1363bd8..585f39eb61 100644 --- a/docs/d4/db1/structshaka_1_1media_1_1mp4_1_1CompactSampleSize-members.html +++ b/docs/d4/db1/structshaka_1_1media_1_1mp4_1_1CompactSampleSize-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/db2/cluster__builder_8h_source.html b/docs/d4/db2/cluster__builder_8h_source.html index 7a932fd2af..612344940a 100644 --- a/docs/d4/db2/cluster__builder_8h_source.html +++ b/docs/d4/db2/cluster__builder_8h_source.html @@ -181,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/db4/classshaka_1_1MpdNotifierFactory.html b/docs/d4/db4/classshaka_1_1MpdNotifierFactory.html index 5458f87aff..3819e6d644 100644 --- a/docs/d4/db4/classshaka_1_1MpdNotifierFactory.html +++ b/docs/d4/db4/classshaka_1_1MpdNotifierFactory.html @@ -113,7 +113,7 @@ virtual std::unique_ptr
diff --git a/docs/d4/db9/structshaka_1_1media_1_1mp4_1_1MediaHeader.html b/docs/d4/db9/structshaka_1_1media_1_1mp4_1_1MediaHeader.html index b34731e3c7..34bcf96e2f 100644 --- a/docs/d4/db9/structshaka_1_1media_1_1mp4_1_1MediaHeader.html +++ b/docs/d4/db9/structshaka_1_1media_1_1mp4_1_1MediaHeader.html @@ -194,7 +194,7 @@ Additional Inherited Members diff --git a/docs/d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.png b/docs/d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.png deleted file mode 100644 index 339def0f75efa4885d463ac86eabb69a3bdfbae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1124 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y>312~w0q@1)O2au8o@CkAK|NlRb`Qpvj(*8pe zfGjXRaNq!I=N)+?3mg9V-gv)x z;*xNyPp4=9U^ut2_P8%3IWALE-t2IA-O04QQJ-q$XT~gDXdLAx zD#Lz8ajIsab!Jw^LAC4g-lpP@Uf7$TzLfK3QJwb_+ZnqT)>_Rj$mOwfms%LH?69Qu z+aUk1T{bs)w#QmOTJD*(*K~Ho|HtCTmsOvyaLSu`c7|{B`IeU6;q)DA||4?9;E7vlaDv>-zcM%~qZLf93LX zt6tg{rF{4EO?&(Fg>P10Y1Q&In>Dw;ocpTzUn<}x4tKLtoi>7 z8&zU2y-(S^s>pNJ*Zhqya}_-Ezt$gcoAhrAa>$3~sGNL#EbadHy<6V@w&Qy6{RR61 z7K4>H7$W}u5s_h7p2VC`>Kt6a(9^|xz{{2G!0Hywxtgyt~p>Edk&-^lnu z%ZwrJC?%4wr*FKuEmu4D_BP)nW(`IjGy@xb*-8a(pMA6T>ECPT)ACM!E@jxUEX{gd z=6j!cc59>b68CccRyAW-U!o$UlY7vv&90$1=l(~N;~UZ*FP^6<$NszLa{ted`bX++ zuutCoS9|lb4?nCTT+D5+C*KrM5icX1|Tb(+)$z=Ae zqvh56Rnu~sOMjP`9Sr0%m5bJy_I2jXd9Rk1Z<1WMwQQRIWiqeeLZXT*Kt1a3m6Y~NX@+s+H0H|K_q z)zd@EKGzygy`E~O_qF1Fh1ufv?C)nMo!vUmYW1@JClv2ko6g*-zQ{Z?rF31_`zt#) zKb*VCaM_gQ<*WFQ9WO}}zQ1zka)y0t-&gE^_jLB|pMP_LY#H}l*?)A|cE$tIe}Umx pABq~8rOBIfZ-?F5mMi^Lo-5s2pmX967hsXV;OXk;vd$@?2>=8+CIkQg diff --git a/docs/d4/dcb/classshaka_1_1UdpFile.html b/docs/d4/dcb/classshaka_1_1UdpFile.html index 152a63aa04..48d594b588 100644 --- a/docs/d4/dcb/classshaka_1_1UdpFile.html +++ b/docs/d4/dcb/classshaka_1_1UdpFile.html @@ -470,7 +470,7 @@ Additional Inherited Members diff --git a/docs/d4/dd3/bit__reader_8h_source.html b/docs/d4/dd3/bit__reader_8h_source.html index 6ebda8e469..860c3cf5c8 100644 --- a/docs/d4/dd3/bit__reader_8h_source.html +++ b/docs/d4/dd3/bit__reader_8h_source.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dd4/structshaka_1_1media_1_1mp4_1_1FullBox-members.html b/docs/d4/dd4/structshaka_1_1media_1_1mp4_1_1FullBox-members.html index 3e35f55b99..5d0ecbbcfa 100644 --- a/docs/d4/dd4/structshaka_1_1media_1_1mp4_1_1FullBox-members.html +++ b/docs/d4/dd4/structshaka_1_1media_1_1mp4_1_1FullBox-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dd6/raw__key__source_8cc_source.html b/docs/d4/dd6/raw__key__source_8cc_source.html index 3ab20b16e2..b9d77b98ac 100644 --- a/docs/d4/dd6/raw__key__source_8cc_source.html +++ b/docs/d4/dd6/raw__key__source_8cc_source.html @@ -263,7 +263,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dde/webvtt__util_8h_source.html b/docs/d4/dde/webvtt__util_8h_source.html index cb10574901..9510c60bfb 100644 --- a/docs/d4/dde/webvtt__util_8h_source.html +++ b/docs/d4/dde/webvtt__util_8h_source.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/de3/structshaka_1_1media_1_1mp4_1_1DataReference.html b/docs/d4/de3/structshaka_1_1media_1_1mp4_1_1DataReference.html index 23cd65e1fc..cb3182e313 100644 --- a/docs/d4/de3/structshaka_1_1media_1_1mp4_1_1DataReference.html +++ b/docs/d4/de3/structshaka_1_1media_1_1mp4_1_1DataReference.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d4/de6/classshaka_1_1media_1_1ProgressListener.html b/docs/d4/de6/classshaka_1_1media_1_1ProgressListener.html index 4ee2fdc612..270963a15a 100644 --- a/docs/d4/de6/classshaka_1_1media_1_1ProgressListener.html +++ b/docs/d4/de6/classshaka_1_1media_1_1ProgressListener.html @@ -146,7 +146,7 @@ Public Member Functions diff --git a/docs/d4/de7/classshaka_1_1media_1_1VodMediaInfoDumpMuxerListener-members.html b/docs/d4/de7/classshaka_1_1media_1_1VodMediaInfoDumpMuxerListener-members.html index c981644540..e84ccf2815 100644 --- a/docs/d4/de7/classshaka_1_1media_1_1VodMediaInfoDumpMuxerListener-members.html +++ b/docs/d4/de7/classshaka_1_1media_1_1VodMediaInfoDumpMuxerListener-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dec/hls__flags_8h_source.html b/docs/d4/dec/hls__flags_8h_source.html index 5c01d9a776..cf9e8b4d24 100644 --- a/docs/d4/dec/hls__flags_8h_source.html +++ b/docs/d4/dec/hls__flags_8h_source.html @@ -100,13 +100,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
11 
12 DECLARE_string(hls_master_playlist_output);
13 DECLARE_string(hls_base_url);
-
14 DECLARE_string(hls_playlist_type);
-
15 
-
16 #endif // PACKAGER_APP_HLS_FLAGS_H_
+
14 DECLARE_string(hls_key_uri);
+
15 DECLARE_string(hls_playlist_type);
+
16 
+
17 #endif // PACKAGER_APP_HLS_FLAGS_H_
diff --git a/docs/d4/df5/request__signer_8cc_source.html b/docs/d4/df5/request__signer_8cc_source.html index 5c2b985bc6..22ac2c4d19 100644 --- a/docs/d4/df5/request__signer_8cc_source.html +++ b/docs/d4/df5/request__signer_8cc_source.html @@ -168,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/df5/webvtt__sample__converter_8cc_source.html b/docs/d4/df5/webvtt__sample__converter_8cc_source.html index d7965843fe..3035dfdb14 100644 --- a/docs/d4/df5/webvtt__sample__converter_8cc_source.html +++ b/docs/d4/df5/webvtt__sample__converter_8cc_source.html @@ -416,7 +416,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/df9/structshaka_1_1media_1_1mp4_1_1SegmentIndex.html b/docs/d4/df9/structshaka_1_1media_1_1mp4_1_1SegmentIndex.html index 5611321069..e27a960076 100644 --- a/docs/d4/df9/structshaka_1_1media_1_1mp4_1_1SegmentIndex.html +++ b/docs/d4/df9/structshaka_1_1media_1_1mp4_1_1SegmentIndex.html @@ -194,7 +194,7 @@ Additional Inherited Members diff --git a/docs/d4/dfa/structshaka_1_1media_1_1mp4_1_1AC3Specific.html b/docs/d4/dfa/structshaka_1_1media_1_1mp4_1_1AC3Specific.html index 3b7e1ea0ca..d1a933f14b 100644 --- a/docs/d4/dfa/structshaka_1_1media_1_1mp4_1_1AC3Specific.html +++ b/docs/d4/dfa/structshaka_1_1media_1_1mp4_1_1AC3Specific.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d4/dfd/structshaka_1_1media_1_1H265Sps.html b/docs/d4/dfd/structshaka_1_1media_1_1H265Sps.html index 09898ce351..1abe1c3ee6 100644 --- a/docs/d4/dfd/structshaka_1_1media_1_1H265Sps.html +++ b/docs/d4/dfd/structshaka_1_1media_1_1H265Sps.html @@ -256,7 +256,7 @@ bool vui_parameters_presen diff --git a/docs/d4/dff/webm__media__parser_8cc_source.html b/docs/d4/dff/webm__media__parser_8cc_source.html index ff7d113758..ce53647265 100644 --- a/docs/d4/dff/webm__media__parser_8cc_source.html +++ b/docs/d4/dff/webm__media__parser_8cc_source.html @@ -367,7 +367,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d03/structshaka_1_1media_1_1mp4_1_1FileType.html b/docs/d5/d03/structshaka_1_1media_1_1mp4_1_1FileType.html index 93fb8eaf71..07d070db38 100644 --- a/docs/d5/d03/structshaka_1_1media_1_1mp4_1_1FileType.html +++ b/docs/d5/d03/structshaka_1_1media_1_1mp4_1_1FileType.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d5/d05/structshaka_1_1media_1_1mp4_1_1OriginalFormat.html b/docs/d5/d05/structshaka_1_1media_1_1mp4_1_1OriginalFormat.html index 531a8f5dce..df27d4f36b 100644 --- a/docs/d5/d05/structshaka_1_1media_1_1mp4_1_1OriginalFormat.html +++ b/docs/d5/d05/structshaka_1_1media_1_1mp4_1_1OriginalFormat.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d5/d09/structshaka_1_1media_1_1mp4_1_1CueIDBox.html b/docs/d5/d09/structshaka_1_1media_1_1mp4_1_1CueIDBox.html index ca7146a0ed..0856ed8a0b 100644 --- a/docs/d5/d09/structshaka_1_1media_1_1mp4_1_1CueIDBox.html +++ b/docs/d5/d09/structshaka_1_1media_1_1mp4_1_1CueIDBox.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d5/d0f/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes-members.html b/docs/d5/d0f/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes-members.html index 1c782a082d..aca9c905fe 100644 --- a/docs/d5/d0f/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes-members.html +++ b/docs/d5/d0f/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d11/classshaka_1_1media_1_1WebMInfoParser-members.html b/docs/d5/d11/classshaka_1_1media_1_1WebMInfoParser-members.html index 6a9a9beebe..cddcdae794 100644 --- a/docs/d5/d11/classshaka_1_1media_1_1WebMInfoParser-members.html +++ b/docs/d5/d11/classshaka_1_1media_1_1WebMInfoParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d11/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html b/docs/d5/d11/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html index 13a49af2ea..676d3fedda 100644 --- a/docs/d5/d11/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html +++ b/docs/d5/d11/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/d5/d13/classshaka_1_1media_1_1ESDescriptor.html b/docs/d5/d13/classshaka_1_1media_1_1ESDescriptor.html index 1c307e6990..ca90cd27fa 100644 --- a/docs/d5/d13/classshaka_1_1media_1_1ESDescriptor.html +++ b/docs/d5/d13/classshaka_1_1media_1_1ESDescriptor.html @@ -181,7 +181,7 @@ bool IsDTS () const diff --git a/docs/d5/d15/producer__consumer__queue_8h_source.html b/docs/d5/d15/producer__consumer__queue_8h_source.html index 628007e616..7c8a57c002 100644 --- a/docs/d5/d15/producer__consumer__queue_8h_source.html +++ b/docs/d5/d15/producer__consumer__queue_8h_source.html @@ -374,7 +374,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d1a/classshaka_1_1Packager-members.html b/docs/d5/d1a/classshaka_1_1Packager-members.html index bfd62efa77..8ad2de3673 100644 --- a/docs/d5/d1a/classshaka_1_1Packager-members.html +++ b/docs/d5/d1a/classshaka_1_1Packager-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d1a/ts__section_8h_source.html b/docs/d5/d1a/ts__section_8h_source.html index 3403a687a0..4f18fddf19 100644 --- a/docs/d5/d1a/ts__section_8h_source.html +++ b/docs/d5/d1a/ts__section_8h_source.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d26/classshaka_1_1media_1_1mp4_1_1TrackRunIterator-members.html b/docs/d5/d26/classshaka_1_1media_1_1mp4_1_1TrackRunIterator-members.html index 04dc580a26..4884639a9a 100644 --- a/docs/d5/d26/classshaka_1_1media_1_1mp4_1_1TrackRunIterator-members.html +++ b/docs/d5/d26/classshaka_1_1media_1_1mp4_1_1TrackRunIterator-members.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d27/key__fetcher_8cc_source.html b/docs/d5/d27/key__fetcher_8cc_source.html index 5406dfb546..ede0483b14 100644 --- a/docs/d5/d27/key__fetcher_8cc_source.html +++ b/docs/d5/d27/key__fetcher_8cc_source.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html b/docs/d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html index 6126273aac..cc1ba9a7a8 100644 --- a/docs/d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html +++ b/docs/d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html @@ -501,7 +501,7 @@ template<class T > diff --git a/docs/d5/d3b/structshaka_1_1media_1_1mp4_1_1Media-members.html b/docs/d5/d3b/structshaka_1_1media_1_1mp4_1_1Media-members.html index 2af48bc367..5ec8735829 100644 --- a/docs/d5/d3b/structshaka_1_1media_1_1mp4_1_1Media-members.html +++ b/docs/d5/d3b/structshaka_1_1media_1_1mp4_1_1Media-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d40/webm_2single__segment__segmenter_8h_source.html b/docs/d5/d40/webm_2single__segment__segmenter_8h_source.html index d8520ea519..788ed07d11 100644 --- a/docs/d5/d40/webm_2single__segment__segmenter_8h_source.html +++ b/docs/d5/d40/webm_2single__segment__segmenter_8h_source.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d4b/classshaka_1_1media_1_1mp2t_1_1TsSectionPsi-members.html b/docs/d5/d4b/classshaka_1_1media_1_1mp2t_1_1TsSectionPsi-members.html index 08d6eddc11..48ab3d3f09 100644 --- a/docs/d5/d4b/classshaka_1_1media_1_1mp2t_1_1TsSectionPsi-members.html +++ b/docs/d5/d4b/classshaka_1_1media_1_1mp2t_1_1TsSectionPsi-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d4d/box_8cc_source.html b/docs/d5/d4d/box_8cc_source.html index 61cad04597..9e213afe83 100644 --- a/docs/d5/d4d/box_8cc_source.html +++ b/docs/d5/d4d/box_8cc_source.html @@ -195,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d52/ts__section__pes_8h_source.html b/docs/d5/d52/ts__section__pes_8h_source.html index c046602a36..12bc183931 100644 --- a/docs/d5/d52/ts__section__pes_8h_source.html +++ b/docs/d5/d52/ts__section__pes_8h_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d53/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize-members.html b/docs/d5/d53/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize-members.html index a87cf5c63c..3b8e27da5e 100644 --- a/docs/d5/d53/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize-members.html +++ b/docs/d5/d53/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d57/classshaka_1_1RepresentationStateChangeListener-members.html b/docs/d5/d57/classshaka_1_1RepresentationStateChangeListener-members.html index 32d72cbaa9..6bf8b0e05b 100644 --- a/docs/d5/d57/classshaka_1_1RepresentationStateChangeListener-members.html +++ b/docs/d5/d57/classshaka_1_1RepresentationStateChangeListener-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d59/classshaka_1_1MockRepresentation-members.html b/docs/d5/d59/classshaka_1_1MockRepresentation-members.html index a1d693c74b..4da18021ab 100644 --- a/docs/d5/d59/classshaka_1_1MockRepresentation-members.html +++ b/docs/d5/d59/classshaka_1_1MockRepresentation-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d5a/webvtt__timestamp_8cc_source.html b/docs/d5/d5a/webvtt__timestamp_8cc_source.html index 9b7572a5d6..f48602396e 100644 --- a/docs/d5/d5a/webvtt__timestamp_8cc_source.html +++ b/docs/d5/d5a/webvtt__timestamp_8cc_source.html @@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d5c/continuity__counter_8cc_source.html b/docs/d5/d5c/continuity__counter_8cc_source.html index 7e89279400..67dcf7359f 100644 --- a/docs/d5/d5c/continuity__counter_8cc_source.html +++ b/docs/d5/d5c/continuity__counter_8cc_source.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d63/classshaka_1_1media_1_1mp2t_1_1EsParserH265.html b/docs/d5/d63/classshaka_1_1media_1_1mp2t_1_1EsParserH265.html index 89d0ae4599..2e652531a5 100644 --- a/docs/d5/d63/classshaka_1_1media_1_1mp2t_1_1EsParserH265.html +++ b/docs/d5/d63/classshaka_1_1media_1_1mp2t_1_1EsParserH265.html @@ -161,7 +161,7 @@ const
diff --git a/docs/d5/d63/network__util_8cc_source.html b/docs/d5/d63/network__util_8cc_source.html index cb7bb2aa70..1c88fc075e 100644 --- a/docs/d5/d63/network__util_8cc_source.html +++ b/docs/d5/d63/network__util_8cc_source.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d66/classshaka_1_1media_1_1NalUnitToByteStreamConverter.html b/docs/d5/d66/classshaka_1_1media_1_1NalUnitToByteStreamConverter.html index fb0dedab7e..f791343488 100644 --- a/docs/d5/d66/classshaka_1_1media_1_1NalUnitToByteStreamConverter.html +++ b/docs/d5/d66/classshaka_1_1media_1_1NalUnitToByteStreamConverter.html @@ -298,7 +298,7 @@ class NalUnitToByteStreamC diff --git a/docs/d5/d6f/vlog__flags_8cc_source.html b/docs/d5/d6f/vlog__flags_8cc_source.html index f08cca4ff0..777d0b8b08 100644 --- a/docs/d5/d6f/vlog__flags_8cc_source.html +++ b/docs/d5/d6f/vlog__flags_8cc_source.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d72/avc__decoder__configuration__record_8cc_source.html b/docs/d5/d72/avc__decoder__configuration__record_8cc_source.html index 8ec3b86387..1098fe7429 100644 --- a/docs/d5/d72/avc__decoder__configuration__record_8cc_source.html +++ b/docs/d5/d72/avc__decoder__configuration__record_8cc_source.html @@ -205,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d76/classshaka_1_1hls_1_1HlsEntry.html b/docs/d5/d76/classshaka_1_1hls_1_1HlsEntry.html index e72bdd90e7..690101aabc 100644 --- a/docs/d5/d76/classshaka_1_1hls_1_1HlsEntry.html +++ b/docs/d5/d76/classshaka_1_1hls_1_1HlsEntry.html @@ -129,7 +129,7 @@ Protected Member Functions diff --git a/docs/d5/d7b/box__definitions_8h_source.html b/docs/d5/d7b/box__definitions_8h_source.html index a797cb6239..2f720ef58c 100644 --- a/docs/d5/d7b/box__definitions_8h_source.html +++ b/docs/d5/d7b/box__definitions_8h_source.html @@ -1000,7 +1000,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d86/structshaka_1_1media_1_1mp4_1_1MediaInformation.html b/docs/d5/d86/structshaka_1_1media_1_1mp4_1_1MediaInformation.html index ac8ced29bc..273aefdc6d 100644 --- a/docs/d5/d86/structshaka_1_1media_1_1mp4_1_1MediaInformation.html +++ b/docs/d5/d86/structshaka_1_1media_1_1mp4_1_1MediaInformation.html @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/d5/d89/widevine__key__source_8cc_source.html b/docs/d5/d89/widevine__key__source_8cc_source.html index 0195915be9..86b42e1628 100644 --- a/docs/d5/d89/widevine__key__source_8cc_source.html +++ b/docs/d5/d89/widevine__key__source_8cc_source.html @@ -736,7 +736,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d8c/structshaka_1_1media_1_1mp4_1_1CompositionOffset.html b/docs/d5/d8c/structshaka_1_1media_1_1mp4_1_1CompositionOffset.html index dc7ef67d69..c3f0495a39 100644 --- a/docs/d5/d8c/structshaka_1_1media_1_1mp4_1_1CompositionOffset.html +++ b/docs/d5/d8c/structshaka_1_1media_1_1mp4_1_1CompositionOffset.html @@ -112,7 +112,7 @@ int64_t sample_offset< diff --git a/docs/d5/d8f/webm__cluster__parser_8cc_source.html b/docs/d5/d8f/webm__cluster__parser_8cc_source.html index bc21bf7f0c..9ed65d34e8 100644 --- a/docs/d5/d8f/webm__cluster__parser_8cc_source.html +++ b/docs/d5/d8f/webm__cluster__parser_8cc_source.html @@ -743,7 +743,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d95/structshaka_1_1media_1_1mp4_1_1EditListEntry-members.html b/docs/d5/d95/structshaka_1_1media_1_1mp4_1_1EditListEntry-members.html index 4f927b3c6b..a07cf810da 100644 --- a/docs/d5/d95/structshaka_1_1media_1_1mp4_1_1EditListEntry-members.html +++ b/docs/d5/d95/structshaka_1_1media_1_1mp4_1_1EditListEntry-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d98/encryptor_8cc_source.html b/docs/d5/d98/encryptor_8cc_source.html index 45293fb607..927fb15cb5 100644 --- a/docs/d5/d98/encryptor_8cc_source.html +++ b/docs/d5/d98/encryptor_8cc_source.html @@ -205,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d9b/vp__codec__configuration__record_8h_source.html b/docs/d5/d9b/vp__codec__configuration__record_8h_source.html index 503e63a8bd..e83aa41783 100644 --- a/docs/d5/d9b/vp__codec__configuration__record_8h_source.html +++ b/docs/d5/d9b/vp__codec__configuration__record_8h_source.html @@ -317,7 +317,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d9d/structshaka_1_1media_1_1H265ReferencePictureListModifications.html b/docs/d5/d9d/structshaka_1_1media_1_1H265ReferencePictureListModifications.html index bd6f3feee6..2dbb019ad4 100644 --- a/docs/d5/d9d/structshaka_1_1media_1_1H265ReferencePictureListModifications.html +++ b/docs/d5/d9d/structshaka_1_1media_1_1H265ReferencePictureListModifications.html @@ -119,7 +119,7 @@ std::vector< int > l diff --git a/docs/d5/da4/aes__encryptor_8cc_source.html b/docs/d5/da4/aes__encryptor_8cc_source.html index c73b7bab8c..4369ccd67c 100644 --- a/docs/d5/da4/aes__encryptor_8cc_source.html +++ b/docs/d5/da4/aes__encryptor_8cc_source.html @@ -297,7 +297,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dad/structshaka_1_1media_1_1H265ReferencePictureSet.html b/docs/d5/dad/structshaka_1_1media_1_1H265ReferencePictureSet.html index 85a76e9669..96cf307ba4 100644 --- a/docs/d5/dad/structshaka_1_1media_1_1H265ReferencePictureSet.html +++ b/docs/d5/dad/structshaka_1_1media_1_1H265ReferencePictureSet.html @@ -127,7 +127,7 @@ int num_delta_pocs diff --git a/docs/d5/db1/classshaka_1_1media_1_1StreamInfo.html b/docs/d5/db1/classshaka_1_1media_1_1StreamInfo.html index 24cf13645b..ca832bca6b 100644 --- a/docs/d5/db1/classshaka_1_1media_1_1StreamInfo.html +++ b/docs/d5/db1/classshaka_1_1media_1_1StreamInfo.html @@ -272,7 +272,7 @@ void set_encryption_config diff --git a/docs/d5/db9/classshaka_1_1media_1_1mp2t_1_1EsParserH264.html b/docs/d5/db9/classshaka_1_1media_1_1mp2t_1_1EsParserH264.html index a7e119c9dc..4892748174 100644 --- a/docs/d5/db9/classshaka_1_1media_1_1mp2t_1_1EsParserH264.html +++ b/docs/d5/db9/classshaka_1_1media_1_1mp2t_1_1EsParserH264.html @@ -161,7 +161,7 @@ const
diff --git a/docs/d5/dba/ts__packet_8cc_source.html b/docs/d5/dba/ts__packet_8cc_source.html index 07175304d4..73c3eea738 100644 --- a/docs/d5/dba/ts__packet_8cc_source.html +++ b/docs/d5/dba/ts__packet_8cc_source.html @@ -307,7 +307,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dc1/webm__webvtt__parser_8cc_source.html b/docs/d5/dc1/webm__webvtt__parser_8cc_source.html index 834e7cede6..2c524a1520 100644 --- a/docs/d5/dc1/webm__webvtt__parser_8cc_source.html +++ b/docs/d5/dc1/webm__webvtt__parser_8cc_source.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dc8/structshaka_1_1media_1_1mp4_1_1TrackFragment-members.html b/docs/d5/dc8/structshaka_1_1media_1_1mp4_1_1TrackFragment-members.html index 28386ae9ed..5c81ad4788 100644 --- a/docs/d5/dc8/structshaka_1_1media_1_1mp4_1_1TrackFragment-members.html +++ b/docs/d5/dc8/structshaka_1_1media_1_1mp4_1_1TrackFragment-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dca/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html b/docs/d5/dca/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html index 4d37c282f4..127c5df172 100644 --- a/docs/d5/dca/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html +++ b/docs/d5/dca/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d5/dcb/raw__key__encryption__flags_8h_source.html b/docs/d5/dcb/raw__key__encryption__flags_8h_source.html index 4c10b40448..4fbb240177 100644 --- a/docs/d5/dcb/raw__key__encryption__flags_8h_source.html +++ b/docs/d5/dcb/raw__key__encryption__flags_8h_source.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dcf/rsa__key_8h_source.html b/docs/d5/dcf/rsa__key_8h_source.html index d065a0cc80..cf911799fa 100644 --- a/docs/d5/dcf/rsa__key_8h_source.html +++ b/docs/d5/dcf/rsa__key_8h_source.html @@ -165,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dda/ts__section__psi_8h_source.html b/docs/d5/dda/ts__section__psi_8h_source.html index 61e618f08b..66aaefc54a 100644 --- a/docs/d5/dda/ts__section__psi_8h_source.html +++ b/docs/d5/dda/ts__section__psi_8h_source.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/de0/bit__reader_8cc_source.html b/docs/d5/de0/bit__reader_8cc_source.html index ed7b22b6cf..9382e9733b 100644 --- a/docs/d5/de0/bit__reader_8cc_source.html +++ b/docs/d5/de0/bit__reader_8cc_source.html @@ -197,7 +197,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html b/docs/d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html index b7de21d2fd..1f8f78712c 100644 --- a/docs/d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html +++ b/docs/d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html @@ -145,7 +145,7 @@ class PesPacketGeneratorTe

Flush the object. This may increase NumberOfReadyPesPackets().

Returns
true on success, false otherwise.
-

Definition at line 125 of file pes_packet_generator.cc.

+

Definition at line 134 of file pes_packet_generator.cc.

@@ -172,7 +172,7 @@ class PesPacketGeneratorTe

Removes the next PES packet from the stream and returns it. Must have at least one packet ready.

Returns
Next PES packet that is ready.
-

Definition at line 118 of file pes_packet_generator.cc.

+

Definition at line 127 of file pes_packet_generator.cc.

@@ -206,7 +206,7 @@ class PesPacketGeneratorTe
Returns
true on success, false otherwise.
-

Definition at line 35 of file pes_packet_generator.cc.

+

Definition at line 36 of file pes_packet_generator.cc.

@@ -232,7 +232,7 @@ class PesPacketGeneratorTe
Returns
The number of PES packets that are ready to be consumed.
-

Definition at line 114 of file pes_packet_generator.cc.

+

Definition at line 123 of file pes_packet_generator.cc.

@@ -260,7 +260,7 @@ class PesPacketGeneratorTe

Add a sample to the generator. This does not necessarily increase NumberOfReadyPesPackets(). If this returns false, the object may end up in an undefined state.

Returns
true on success, false otherwise.
-

Definition at line 68 of file pes_packet_generator.cc.

+

Definition at line 75 of file pes_packet_generator.cc.

@@ -271,7 +271,7 @@ class PesPacketGeneratorTe diff --git a/docs/d5/de3/structshaka_1_1PackagingParams.html b/docs/d5/de3/structshaka_1_1PackagingParams.html index 8ff9565f8b..ea4b1c4365 100644 --- a/docs/d5/de3/structshaka_1_1PackagingParams.html +++ b/docs/d5/de3/structshaka_1_1PackagingParams.html @@ -113,6 +113,10 @@ std::string ChunkingParams chunking_params  Chunking (segmentation) related parameters.
  + +AdCueGeneratorParams ad_cue_generator_params + Out of band cuepoint parameters.
+  bool output_media_info = false   @@ -141,7 +145,7 @@ std::string 

Detailed Description

Packaging parameters.

-

Definition at line 37 of file packager.h.

+

Definition at line 38 of file packager.h.

Member Data Documentation

@@ -164,7 +168,7 @@ std::string  diff --git a/docs/d5/de9/replicator_8cc_source.html b/docs/d5/de9/replicator_8cc_source.html index 66ea263dc6..a77cfea16a 100644 --- a/docs/d5/de9/replicator_8cc_source.html +++ b/docs/d5/de9/replicator_8cc_source.html @@ -131,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dec/classshaka_1_1media_1_1WebMParserClient.html b/docs/d5/dec/classshaka_1_1media_1_1WebMParserClient.html index 14ba6932c7..66021f4070 100644 --- a/docs/d5/dec/classshaka_1_1media_1_1WebMParserClient.html +++ b/docs/d5/dec/classshaka_1_1media_1_1WebMParserClient.html @@ -151,7 +151,7 @@ Protected Member Functions diff --git a/docs/d5/dec/decoder__configuration__record_8cc_source.html b/docs/d5/dec/decoder__configuration__record_8cc_source.html index cc61268fd7..72b2d14adf 100644 --- a/docs/d5/dec/decoder__configuration__record_8cc_source.html +++ b/docs/d5/dec/decoder__configuration__record_8cc_source.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dec/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox-members.html b/docs/d5/dec/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox-members.html index 6c5cf6d879..ba0e87178e 100644 --- a/docs/d5/dec/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox-members.html +++ b/docs/d5/dec/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/def/ts__section__pmt_8h_source.html b/docs/d5/def/ts__section__pmt_8h_source.html index e89c4eb9c4..e1ca9e7755 100644 --- a/docs/d5/def/ts__section__pmt_8h_source.html +++ b/docs/d5/def/ts__section__pmt_8h_source.html @@ -133,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/df2/media__playlist_8cc_source.html b/docs/d5/df2/media__playlist_8cc_source.html index 8f3c4e7f89..66048e1a49 100644 --- a/docs/d5/df2/media__playlist_8cc_source.html +++ b/docs/d5/df2/media__playlist_8cc_source.html @@ -523,85 +523,90 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
434  return LanguageToShortestForm(lang);
435 }
436 
- -
438  uint32_t* height) const {
-
439  DCHECK(width);
-
440  DCHECK(height);
-
441  if (media_info_.has_video_info()) {
-
442  const double pixel_aspect_ratio =
-
443  media_info_.video_info().pixel_height() > 0
-
444  ? static_cast<double>(media_info_.video_info().pixel_width()) /
-
445  media_info_.video_info().pixel_height()
-
446  : 1.0;
-
447  *width = static_cast<uint32_t>(media_info_.video_info().width() *
-
448  pixel_aspect_ratio);
-
449  *height = media_info_.video_info().height();
-
450  return true;
-
451  }
-
452  return false;
-
453 }
-
454 
-
455 void MediaPlaylist::SlideWindow() {
-
456  DCHECK(!entries_.empty());
-
457  if (time_shift_buffer_depth_ <= 0.0 ||
-
458  playlist_type_ != HlsPlaylistType::kLive) {
-
459  return;
-
460  }
-
461  DCHECK_GT(time_scale_, 0u);
-
462 
-
463  // The start time of the latest segment is considered the current_play_time,
-
464  // and this should guarantee that the latest segment will stay in the list.
-
465  const double current_play_time = LatestSegmentStartTime(entries_);
-
466  if (current_play_time <= time_shift_buffer_depth_)
-
467  return;
-
468 
-
469  const double timeshift_limit = current_play_time - time_shift_buffer_depth_;
-
470 
-
471  // Temporary list to hold the EXT-X-KEYs. For example, this allows us to
-
472  // remove <3> without removing <1> and <2> below (<1> and <2> are moved to the
-
473  // temporary list and added back later).
-
474  // #EXT-X-KEY <1>
-
475  // #EXT-X-KEY <2>
-
476  // #EXTINF <3>
-
477  // #EXTINF <4>
-
478  std::list<std::unique_ptr<HlsEntry>> ext_x_keys;
-
479  // Consecutive key entries are either fully removed or not removed at all.
-
480  // Keep track of entry types so we know if it is consecutive key entries.
-
481  HlsEntry::EntryType prev_entry_type = HlsEntry::EntryType::kExtInf;
-
482 
-
483  std::list<std::unique_ptr<HlsEntry>>::iterator last = entries_.begin();
-
484  size_t num_segments_removed = 0;
-
485  for (; last != entries_.end(); ++last) {
-
486  HlsEntry::EntryType entry_type = last->get()->type();
-
487  if (entry_type == HlsEntry::EntryType::kExtKey) {
-
488  if (prev_entry_type != HlsEntry::EntryType::kExtKey)
-
489  ext_x_keys.clear();
-
490  ext_x_keys.push_back(std::move(*last));
-
491  } else if (entry_type == HlsEntry::EntryType::kExtDiscontinuity) {
-
492  ++discontinuity_sequence_number_;
-
493  } else {
-
494  DCHECK_EQ(entry_type, HlsEntry::EntryType::kExtInf);
-
495  const SegmentInfoEntry* segment_info =
-
496  reinterpret_cast<SegmentInfoEntry*>(last->get());
-
497  const double last_segment_end_time =
-
498  segment_info->start_time() + segment_info->duration();
-
499  if (timeshift_limit < last_segment_end_time)
-
500  break;
-
501  ++num_segments_removed;
-
502  }
-
503  prev_entry_type = entry_type;
-
504  }
-
505  entries_.erase(entries_.begin(), last);
-
506  // Add key entries back.
-
507  entries_.insert(entries_.begin(), std::make_move_iterator(ext_x_keys.begin()),
-
508  std::make_move_iterator(ext_x_keys.end()));
-
509  media_sequence_number_ += num_segments_removed;
-
510 }
-
511 
-
512 } // namespace hls
-
513 } // namespace shaka
+ +
438  return media_info_.audio_info().num_channels();
+
439 }
+
440 
+ +
442  uint32_t* height) const {
+
443  DCHECK(width);
+
444  DCHECK(height);
+
445  if (media_info_.has_video_info()) {
+
446  const double pixel_aspect_ratio =
+
447  media_info_.video_info().pixel_height() > 0
+
448  ? static_cast<double>(media_info_.video_info().pixel_width()) /
+
449  media_info_.video_info().pixel_height()
+
450  : 1.0;
+
451  *width = static_cast<uint32_t>(media_info_.video_info().width() *
+
452  pixel_aspect_ratio);
+
453  *height = media_info_.video_info().height();
+
454  return true;
+
455  }
+
456  return false;
+
457 }
+
458 
+
459 void MediaPlaylist::SlideWindow() {
+
460  DCHECK(!entries_.empty());
+
461  if (time_shift_buffer_depth_ <= 0.0 ||
+
462  playlist_type_ != HlsPlaylistType::kLive) {
+
463  return;
+
464  }
+
465  DCHECK_GT(time_scale_, 0u);
+
466 
+
467  // The start time of the latest segment is considered the current_play_time,
+
468  // and this should guarantee that the latest segment will stay in the list.
+
469  const double current_play_time = LatestSegmentStartTime(entries_);
+
470  if (current_play_time <= time_shift_buffer_depth_)
+
471  return;
+
472 
+
473  const double timeshift_limit = current_play_time - time_shift_buffer_depth_;
+
474 
+
475  // Temporary list to hold the EXT-X-KEYs. For example, this allows us to
+
476  // remove <3> without removing <1> and <2> below (<1> and <2> are moved to the
+
477  // temporary list and added back later).
+
478  // #EXT-X-KEY <1>
+
479  // #EXT-X-KEY <2>
+
480  // #EXTINF <3>
+
481  // #EXTINF <4>
+
482  std::list<std::unique_ptr<HlsEntry>> ext_x_keys;
+
483  // Consecutive key entries are either fully removed or not removed at all.
+
484  // Keep track of entry types so we know if it is consecutive key entries.
+
485  HlsEntry::EntryType prev_entry_type = HlsEntry::EntryType::kExtInf;
+
486 
+
487  std::list<std::unique_ptr<HlsEntry>>::iterator last = entries_.begin();
+
488  size_t num_segments_removed = 0;
+
489  for (; last != entries_.end(); ++last) {
+
490  HlsEntry::EntryType entry_type = last->get()->type();
+
491  if (entry_type == HlsEntry::EntryType::kExtKey) {
+
492  if (prev_entry_type != HlsEntry::EntryType::kExtKey)
+
493  ext_x_keys.clear();
+
494  ext_x_keys.push_back(std::move(*last));
+
495  } else if (entry_type == HlsEntry::EntryType::kExtDiscontinuity) {
+
496  ++discontinuity_sequence_number_;
+
497  } else {
+
498  DCHECK_EQ(entry_type, HlsEntry::EntryType::kExtInf);
+
499  const SegmentInfoEntry* segment_info =
+
500  reinterpret_cast<SegmentInfoEntry*>(last->get());
+
501  const double last_segment_end_time =
+
502  segment_info->start_time() + segment_info->duration();
+
503  if (timeshift_limit < last_segment_end_time)
+
504  break;
+
505  ++num_segments_removed;
+
506  }
+
507  prev_entry_type = entry_type;
+
508  }
+
509  entries_.erase(entries_.begin(), last);
+
510  // Add key entries back.
+
511  entries_.insert(entries_.begin(), std::make_move_iterator(ext_x_keys.begin()),
+
512  std::make_move_iterator(ext_x_keys.end()));
+
513  media_sequence_number_ += num_segments_removed;
+
514 }
+
515 
+
516 } // namespace hls
+
517 } // namespace shaka
MediaPlaylist(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &file_name, const std::string &name, const std::string &group_id)
void SetStreamTypeForTesting(MediaPlaylistStreamType stream_type)
For testing only.
+
virtual int GetNumChannels() const
HlsPlaylistType
Definition: hls_params.h:16
virtual uint64_t Bitrate() const
std::string LanguageToShortestForm(const std::string &language)
@@ -611,14 +616,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
virtual double GetLongestSegmentDuration() const
virtual void AddSegment(const std::string &file_name, uint64_t start_time, uint64_t duration, uint64_t start_byte_offset, uint64_t size)
static bool WriteFileAtomically(const char *file_name, const std::string &contents)
Definition: file.cc:262
-
virtual bool GetDisplayResolution(uint32_t *width, uint32_t *height) const
+
virtual bool GetDisplayResolution(uint32_t *width, uint32_t *height) const
virtual void AddEncryptionInfo(EncryptionMethod method, const std::string &url, const std::string &key_id, const std::string &iv, const std::string &key_format, const std::string &key_format_versions)
virtual bool WriteToFile(const std::string &file_path)
void SetCodecForTesting(const std::string &codec)
For testing only.
diff --git a/docs/d5/dfa/classshaka_1_1media_1_1HlsNotifyMuxerListener.html b/docs/d5/dfa/classshaka_1_1media_1_1HlsNotifyMuxerListener.html index 72cd065b82..2edb77f168 100644 --- a/docs/d5/dfa/classshaka_1_1media_1_1HlsNotifyMuxerListener.html +++ b/docs/d5/dfa/classshaka_1_1media_1_1HlsNotifyMuxerListener.html @@ -493,7 +493,7 @@ Additional Inherited Members diff --git a/docs/d5/dfa/classshaka_1_1media_1_1MediaParser-members.html b/docs/d5/dfa/classshaka_1_1media_1_1MediaParser-members.html index 6fb1b62866..4dbbddc555 100644 --- a/docs/d5/dfa/classshaka_1_1media_1_1MediaParser-members.html +++ b/docs/d5/dfa/classshaka_1_1media_1_1MediaParser-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dfc/file_8cc_source.html b/docs/d5/dfc/file_8cc_source.html index 69b37c51f9..c2138b03e3 100644 --- a/docs/d5/dfc/file_8cc_source.html +++ b/docs/d5/dfc/file_8cc_source.html @@ -494,7 +494,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dfe/classshaka_1_1File-members.html b/docs/d5/dfe/classshaka_1_1File-members.html index ad9b918747..7b25e02ff0 100644 --- a/docs/d5/dfe/classshaka_1_1File-members.html +++ b/docs/d5/dfe/classshaka_1_1File-members.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d02/playready__key__encryption__flags_8h_source.html b/docs/d6/d02/playready__key__encryption__flags_8h_source.html index da4370bb04..7b6934bf88 100644 --- a/docs/d6/d02/playready__key__encryption__flags_8h_source.html +++ b/docs/d6/d02/playready__key__encryption__flags_8h_source.html @@ -123,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d03/classshaka_1_1media_1_1AesCbcDecryptor-members.html b/docs/d6/d03/classshaka_1_1media_1_1AesCbcDecryptor-members.html index ed9ca5bfc7..c89d89f1a9 100644 --- a/docs/d6/d03/classshaka_1_1media_1_1AesCbcDecryptor-members.html +++ b/docs/d6/d03/classshaka_1_1media_1_1AesCbcDecryptor-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d09/aes__pattern__cryptor_8h_source.html b/docs/d6/d09/aes__pattern__cryptor_8h_source.html index 96c0489e73..57fbaf00f8 100644 --- a/docs/d6/d09/aes__pattern__cryptor_8h_source.html +++ b/docs/d6/d09/aes__pattern__cryptor_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d16/text__stream__info_8cc_source.html b/docs/d6/d16/text__stream__info_8cc_source.html index d06348c527..10aca851ba 100644 --- a/docs/d6/d16/text__stream__info_8cc_source.html +++ b/docs/d6/d16/text__stream__info_8cc_source.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d17/es__parser__h264_8cc_source.html b/docs/d6/d17/es__parser__h264_8cc_source.html index 55d9716319..65d8df90c5 100644 --- a/docs/d6/d17/es__parser__h264_8cc_source.html +++ b/docs/d6/d17/es__parser__h264_8cc_source.html @@ -267,7 +267,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d1a/structshaka_1_1media_1_1mp4_1_1MovieHeader.html b/docs/d6/d1a/structshaka_1_1media_1_1mp4_1_1MovieHeader.html index 440011b07c..5291383ac8 100644 --- a/docs/d6/d1a/structshaka_1_1media_1_1mp4_1_1MovieHeader.html +++ b/docs/d6/d1a/structshaka_1_1media_1_1mp4_1_1MovieHeader.html @@ -200,7 +200,7 @@ Additional Inherited Members diff --git a/docs/d6/d1a/ts__packet__writer__util_8cc_source.html b/docs/d6/d1a/ts__packet__writer__util_8cc_source.html index 9b8d93ecb8..d4753b4573 100644 --- a/docs/d6/d1a/ts__packet__writer__util_8cc_source.html +++ b/docs/d6/d1a/ts__packet__writer__util_8cc_source.html @@ -255,7 +255,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d26/structshaka_1_1media_1_1VideoStreamInfoParameters.html b/docs/d6/d26/structshaka_1_1media_1_1VideoStreamInfoParameters.html index 53fd52d189..eb9226306d 100644 --- a/docs/d6/d26/structshaka_1_1media_1_1VideoStreamInfoParameters.html +++ b/docs/d6/d26/structshaka_1_1media_1_1VideoStreamInfoParameters.html @@ -146,7 +146,7 @@ bool is_encrypted diff --git a/docs/d6/d2c/ts__stream__type_8h_source.html b/docs/d6/d2c/ts__stream__type_8h_source.html new file mode 100644 index 0000000000..8754032ced --- /dev/null +++ b/docs/d6/d2c/ts__stream__type_8h_source.html @@ -0,0 +1,148 @@ + + + + + + +Shaka Packager SDK: packager/media/formats/mp2t/ts_stream_type.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
ts_stream_type.h
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #ifndef PACKAGER_MEDIA_FORMATS_MP2T_TS_STREAM_TYPE_H_
+
8 #define PACKAGER_MEDIA_FORMATS_MP2T_TS_STREAM_TYPE_H_
+
9 
+
10 #include <stdint.h>
+
11 
+
12 namespace shaka {
+
13 namespace media {
+
14 namespace mp2t {
+
15 
+
16 enum class TsStreamType {
+
17  // ISO-13818.1 / ITU H.222 Table 2-34 "Stream type assignments"
+
18  kMpeg1Video = 0x01, // ISO/IEC 11172-2 Video
+
19  kMpeg2Video = 0x02, // ITU-T H.262 | ISO/IEC 13818-2 Video |
+
20  // ISO/IEC 11172-2 constrained parameter video stream
+
21  kMpeg1Audio = 0x03, // ISO/IEC 11172-3 Audio
+
22  kMpeg2Audio = 0x04, // ISO/IEC 13818-3 Audio
+
23  kPesPrivateData =
+
24  0x06, // ISO/IEC 13818-1 PES packets containing private data. It is also
+
25  // used by DVB (TS 101 154 DVB specification ...) to carry AC3 in
+
26  // TS (while ATSC uses 0x81 defined below).
+
27  kAdtsAac = 0x0F,
+
28  kAvc = 0x1B,
+
29  kHevc = 0x24,
+
30  // Below are extensions defined in other specifications.
+
31  // AC3 and E-AC3 are defined in ATSC Standard A/52.
+
32  // Cannot find specification for DTS-HD and DTS. They are extracted from
+
33  // https://sno.phy.queensu.ca/~phil/exiftool/TagNames/M2TS.html.
+
34  kAc3 = 0x81,
+
35  kDtsHd = 0x86,
+
36  kEac3 = 0x87,
+
37  kDts = 0x8A,
+
38  // MPEG-2 Stream Encryption Format for HTTP Live Streaming:
+
39  // https://goo.gl/N7Tvqi.
+
40  kEncryptedAc3 = 0xC1,
+
41  kEncryptedEac3 = 0xC2,
+
42  kEncryptedAdtsAac = 0xCF,
+
43  kEncryptedAvc = 0xDB,
+
44 };
+
45 
+
46 } // namespace mp2t
+
47 } // namespace media
+
48 } // namespace shaka
+
49 
+
50 #endif // PACKAGER_MEDIA_FORMATS_MP2T_TS_STREAM_TYPE_H_
+
+ + + + diff --git a/docs/d6/d2e/mpd__notifier__util_8cc_source.html b/docs/d6/d2e/mpd__notifier__util_8cc_source.html index 2a144dbd49..ebed002050 100644 --- a/docs/d6/d2e/mpd__notifier__util_8cc_source.html +++ b/docs/d6/d2e/mpd__notifier__util_8cc_source.html @@ -152,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d32/classshaka_1_1media_1_1TextTrack-members.html b/docs/d6/d32/classshaka_1_1media_1_1TextTrack-members.html index 350aad6ee9..973526471b 100644 --- a/docs/d6/d32/classshaka_1_1media_1_1TextTrack-members.html +++ b/docs/d6/d32/classshaka_1_1media_1_1TextTrack-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d35/webm__content__encodings_8cc_source.html b/docs/d6/d35/webm__content__encodings_8cc_source.html index db6501ea63..58f62b2907 100644 --- a/docs/d6/d35/webm__content__encodings_8cc_source.html +++ b/docs/d6/d35/webm__content__encodings_8cc_source.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d37/combined__muxer__listener_8cc_source.html b/docs/d6/d37/combined__muxer__listener_8cc_source.html index 6854c2adde..48ef29d4a7 100644 --- a/docs/d6/d37/combined__muxer__listener_8cc_source.html +++ b/docs/d6/d37/combined__muxer__listener_8cc_source.html @@ -168,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d3b/chunk__info__iterator_8cc_source.html b/docs/d6/d3b/chunk__info__iterator_8cc_source.html index a2f40b23fc..3bb0558285 100644 --- a/docs/d6/d3b/chunk__info__iterator_8cc_source.html +++ b/docs/d6/d3b/chunk__info__iterator_8cc_source.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d47/hls__params_8h_source.html b/docs/d6/d47/hls__params_8h_source.html index 4546dffd71..e21810db0c 100644 --- a/docs/d6/d47/hls__params_8h_source.html +++ b/docs/d6/d47/hls__params_8h_source.html @@ -111,21 +111,23 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
30  std::string base_url;
-
34 };
-
35 
-
36 } // namespace shaka
-
37 
-
38 #endif // PACKAGER_HLS_PUBLIC_HLS_PARAMS_H_
+
37  std::string key_uri;
+
38 };
+
39 
+
40 } // namespace shaka
+
41 
+
42 #endif // PACKAGER_HLS_PUBLIC_HLS_PARAMS_H_
std::string master_playlist_output
HLS master playlist output path.
Definition: hls_params.h:27
HlsPlaylistType
Definition: hls_params.h:16
HLS related parameters.
Definition: hls_params.h:23
double time_shift_buffer_depth
Definition: hls_params.h:33
std::string base_url
Definition: hls_params.h:30
HlsPlaylistType playlist_type
HLS playlist type. See HLS specification for details.
Definition: hls_params.h:25
+
std::string key_uri
Definition: hls_params.h:37
diff --git a/docs/d6/d4c/classshaka_1_1media_1_1EncryptionHandler.html b/docs/d6/d4c/classshaka_1_1media_1_1EncryptionHandler.html index 3bad9f50f7..bd1cff8471 100644 --- a/docs/d6/d4c/classshaka_1_1media_1_1EncryptionHandler.html +++ b/docs/d6/d4c/classshaka_1_1media_1_1EncryptionHandler.html @@ -143,10 +143,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -159,14 +155,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -264,7 +264,7 @@ class EncryptionHandlerTes diff --git a/docs/d6/d4e/webm_2multi__segment__segmenter_8cc_source.html b/docs/d6/d4e/webm_2multi__segment__segmenter_8cc_source.html index 0ebf206d74..3ae9d8409d 100644 --- a/docs/d6/d4e/webm_2multi__segment__segmenter_8cc_source.html +++ b/docs/d6/d4e/webm_2multi__segment__segmenter_8cc_source.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d55/aes__cryptor_8cc_source.html b/docs/d6/d55/aes__cryptor_8cc_source.html index 6da7a44860..73acdc0d5e 100644 --- a/docs/d6/d55/aes__cryptor_8cc_source.html +++ b/docs/d6/d55/aes__cryptor_8cc_source.html @@ -227,7 +227,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html b/docs/d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html index f79c42e3b8..0aecce2a7c 100644 --- a/docs/d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html +++ b/docs/d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html @@ -251,7 +251,7 @@ void  diff --git a/docs/d6/d59/protection__system__specific__info_8h_source.html b/docs/d6/d59/protection__system__specific__info_8h_source.html index 32a1bd3941..e67d1f367a 100644 --- a/docs/d6/d59/protection__system__specific__info_8h_source.html +++ b/docs/d6/d59/protection__system__specific__info_8h_source.html @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d5b/classshaka_1_1Status-members.html b/docs/d6/d5b/classshaka_1_1Status-members.html index 6e40b52162..d9c910e6bf 100644 --- a/docs/d6/d5b/classshaka_1_1Status-members.html +++ b/docs/d6/d5b/classshaka_1_1Status-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d60/classshaka_1_1media_1_1VPCodecConfigurationRecord-members.html b/docs/d6/d60/classshaka_1_1media_1_1VPCodecConfigurationRecord-members.html index 4660d0c16b..6d50316772 100644 --- a/docs/d6/d60/classshaka_1_1media_1_1VPCodecConfigurationRecord-members.html +++ b/docs/d6/d60/classshaka_1_1media_1_1VPCodecConfigurationRecord-members.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d62/structshaka_1_1TestParams.html b/docs/d6/d62/structshaka_1_1TestParams.html index cce6de78d7..216cad9372 100644 --- a/docs/d6/d62/structshaka_1_1TestParams.html +++ b/docs/d6/d62/structshaka_1_1TestParams.html @@ -113,7 +113,7 @@ bool 

Detailed Description

Parameters used for testing.

-

Definition at line 25 of file packager.h.

+

Definition at line 26 of file packager.h.

Member Data Documentation

@@ -141,7 +141,7 @@ bool 

Inject and replace the library version string if specified, which is used to populate the version string in the manifests / media files.

-

Definition at line 33 of file packager.h.

+

Definition at line 34 of file packager.h.

@@ -151,7 +151,7 @@ bool  diff --git a/docs/d6/d66/structshaka_1_1RawKeyParams_1_1KeyInfo-members.html b/docs/d6/d66/structshaka_1_1RawKeyParams_1_1KeyInfo-members.html index f20e69d4c4..9ca21027a4 100644 --- a/docs/d6/d66/structshaka_1_1RawKeyParams_1_1KeyInfo-members.html +++ b/docs/d6/d66/structshaka_1_1RawKeyParams_1_1KeyInfo-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d6a/cue_8h_source.html b/docs/d6/d6a/cue_8h_source.html index e9ded57ad4..a03637c1bd 100644 --- a/docs/d6/d6a/cue_8h_source.html +++ b/docs/d6/d6a/cue_8h_source.html @@ -126,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d6b/classshaka_1_1media_1_1RawKeySource-members.html b/docs/d6/d6b/classshaka_1_1media_1_1RawKeySource-members.html index 2714a4fa9d..2818274934 100644 --- a/docs/d6/d6b/classshaka_1_1media_1_1RawKeySource-members.html +++ b/docs/d6/d6b/classshaka_1_1media_1_1RawKeySource-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d6c/h26x__bit__reader_8cc_source.html b/docs/d6/d6c/h26x__bit__reader_8cc_source.html index 9bd00f95f0..17e9f3bd87 100644 --- a/docs/d6/d6c/h26x__bit__reader_8cc_source.html +++ b/docs/d6/d6c/h26x__bit__reader_8cc_source.html @@ -259,7 +259,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d6e/ts__section__pes_8cc_source.html b/docs/d6/d6e/ts__section__pes_8cc_source.html index b497891d7f..5276679b55 100644 --- a/docs/d6/d6e/ts__section__pes_8cc_source.html +++ b/docs/d6/d6e/ts__section__pes_8cc_source.html @@ -287,127 +287,131 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
198  pes_packet_length = static_cast<int>(bit_reader.bits_available()) / 8;
199 
200  // Ignore the PES for unknown stream IDs.
-
201  // See ITU H.222 Table 2-22 "Stream_id assignments"
-
202  bool is_audio_stream_id = ((stream_id & 0xe0) == 0xc0);
-
203  bool is_video_stream_id = ((stream_id & 0xf0) == 0xe0);
-
204  if (!is_audio_stream_id && !is_video_stream_id)
-
205  return true;
-
206 
-
207  // Read up to "pes_header_data_length".
-
208  int dummy_2;
-
209  int PES_scrambling_control;
-
210  int PES_priority;
-
211  int data_alignment_indicator;
-
212  int copyright;
-
213  int original_or_copy;
-
214  int pts_dts_flags;
-
215  int escr_flag;
-
216  int es_rate_flag;
-
217  int dsm_trick_mode_flag;
-
218  int additional_copy_info_flag;
-
219  int pes_crc_flag;
-
220  int pes_extension_flag;
-
221  int pes_header_data_length;
-
222  RCHECK(bit_reader.ReadBits(2, &dummy_2));
-
223  RCHECK(dummy_2 == 0x2);
-
224  RCHECK(bit_reader.ReadBits(2, &PES_scrambling_control));
-
225  RCHECK(bit_reader.ReadBits(1, &PES_priority));
-
226  RCHECK(bit_reader.ReadBits(1, &data_alignment_indicator));
-
227  RCHECK(bit_reader.ReadBits(1, &copyright));
-
228  RCHECK(bit_reader.ReadBits(1, &original_or_copy));
-
229  RCHECK(bit_reader.ReadBits(2, &pts_dts_flags));
-
230  RCHECK(bit_reader.ReadBits(1, &escr_flag));
-
231  RCHECK(bit_reader.ReadBits(1, &es_rate_flag));
-
232  RCHECK(bit_reader.ReadBits(1, &dsm_trick_mode_flag));
-
233  RCHECK(bit_reader.ReadBits(1, &additional_copy_info_flag));
-
234  RCHECK(bit_reader.ReadBits(1, &pes_crc_flag));
-
235  RCHECK(bit_reader.ReadBits(1, &pes_extension_flag));
-
236  RCHECK(bit_reader.ReadBits(8, &pes_header_data_length));
-
237  int pes_header_start_size = static_cast<int>(bit_reader.bits_available()) / 8;
-
238 
-
239  // Compute the size and the offset of the ES payload.
-
240  // "6" for the 6 bytes read before and including |pes_packet_length|.
-
241  // "3" for the 3 bytes read before and including |pes_header_data_length|.
-
242  int es_size = pes_packet_length - 3 - pes_header_data_length;
-
243  int es_offset = 6 + 3 + pes_header_data_length;
-
244  RCHECK(es_size >= 0);
-
245  RCHECK(es_offset + es_size <= raw_pes_size);
-
246 
-
247  // Read the timing information section.
-
248  bool is_pts_valid = false;
-
249  bool is_dts_valid = false;
-
250  int64_t pts_section = 0;
-
251  int64_t dts_section = 0;
-
252  if (pts_dts_flags == 0x2) {
-
253  RCHECK(bit_reader.ReadBits(40, &pts_section));
-
254  RCHECK((((pts_section >> 36) & 0xf) == 0x2) &&
-
255  IsTimestampSectionValid(pts_section));
-
256  is_pts_valid = true;
-
257  }
-
258  if (pts_dts_flags == 0x3) {
-
259  RCHECK(bit_reader.ReadBits(40, &pts_section));
-
260  RCHECK(bit_reader.ReadBits(40, &dts_section));
-
261  RCHECK((((pts_section >> 36) & 0xf) == 0x3) &&
-
262  IsTimestampSectionValid(pts_section));
-
263  RCHECK((((dts_section >> 36) & 0xf) == 0x1) &&
-
264  IsTimestampSectionValid(dts_section));
-
265  is_pts_valid = true;
-
266  is_dts_valid = true;
-
267  }
-
268 
-
269  // Convert and unroll the timestamps.
-
270  int64_t media_pts(kNoTimestamp);
-
271  int64_t media_dts(kNoTimestamp);
-
272  if (is_pts_valid) {
-
273  int64_t pts = ConvertTimestampSectionToTimestamp(pts_section);
-
274  if (previous_pts_valid_)
-
275  pts = UnrollTimestamp(previous_pts_, pts);
-
276  previous_pts_ = pts;
-
277  previous_pts_valid_ = true;
-
278  media_pts = pts;
-
279  }
-
280  if (is_dts_valid) {
-
281  int64_t dts = ConvertTimestampSectionToTimestamp(dts_section);
-
282  if (previous_dts_valid_)
-
283  dts = UnrollTimestamp(previous_dts_, dts);
-
284  previous_dts_ = dts;
-
285  previous_dts_valid_ = true;
-
286  media_dts = dts;
-
287  }
-
288 
-
289  // Discard the rest of the PES packet header.
-
290  DCHECK_EQ(bit_reader.bits_available() % 8, 0u);
-
291  int pes_header_remaining_size =
-
292  pes_header_data_length -
-
293  (pes_header_start_size -
-
294  static_cast<int>(bit_reader.bits_available()) / 8);
-
295  RCHECK(pes_header_remaining_size >= 0);
-
296 
-
297  // Read the PES packet.
-
298  DVLOG(LOG_LEVEL_PES)
-
299  << "Emit a reassembled PES:"
-
300  << " size=" << es_size
-
301  << " pts=" << media_pts
-
302  << " dts=" << media_dts
-
303  << " data_alignment_indicator=" << data_alignment_indicator;
-
304  return es_parser_->Parse(&raw_pes[es_offset], es_size, media_pts, media_dts);
-
305 }
-
306 
-
307 void TsSectionPes::ResetPesState() {
-
308  pes_byte_queue_.Reset();
-
309  wait_for_pusi_ = true;
-
310 }
-
311 
-
312 } // namespace mp2t
-
313 } // namespace media
-
314 } // namespace shaka
+
201  // ATSC Standard A/52:2012 3. GENERIC IDENTIFICATION OF AN AC-3 STREAM.
+
202  // AC3/E-AC3 stream uses private stream id.
+
203  const int kPrivateStream1 = 0xBD;
+
204  // See ITU H.222 Table 2-22 "Stream_id assignments"
+
205  bool is_audio_stream_id =
+
206  ((stream_id & 0xe0) == 0xc0) || stream_id == kPrivateStream1;
+
207  bool is_video_stream_id = ((stream_id & 0xf0) == 0xe0);
+
208  if (!is_audio_stream_id && !is_video_stream_id)
+
209  return true;
+
210 
+
211  // Read up to "pes_header_data_length".
+
212  int dummy_2;
+
213  int PES_scrambling_control;
+
214  int PES_priority;
+
215  int data_alignment_indicator;
+
216  int copyright;
+
217  int original_or_copy;
+
218  int pts_dts_flags;
+
219  int escr_flag;
+
220  int es_rate_flag;
+
221  int dsm_trick_mode_flag;
+
222  int additional_copy_info_flag;
+
223  int pes_crc_flag;
+
224  int pes_extension_flag;
+
225  int pes_header_data_length;
+
226  RCHECK(bit_reader.ReadBits(2, &dummy_2));
+
227  RCHECK(dummy_2 == 0x2);
+
228  RCHECK(bit_reader.ReadBits(2, &PES_scrambling_control));
+
229  RCHECK(bit_reader.ReadBits(1, &PES_priority));
+
230  RCHECK(bit_reader.ReadBits(1, &data_alignment_indicator));
+
231  RCHECK(bit_reader.ReadBits(1, &copyright));
+
232  RCHECK(bit_reader.ReadBits(1, &original_or_copy));
+
233  RCHECK(bit_reader.ReadBits(2, &pts_dts_flags));
+
234  RCHECK(bit_reader.ReadBits(1, &escr_flag));
+
235  RCHECK(bit_reader.ReadBits(1, &es_rate_flag));
+
236  RCHECK(bit_reader.ReadBits(1, &dsm_trick_mode_flag));
+
237  RCHECK(bit_reader.ReadBits(1, &additional_copy_info_flag));
+
238  RCHECK(bit_reader.ReadBits(1, &pes_crc_flag));
+
239  RCHECK(bit_reader.ReadBits(1, &pes_extension_flag));
+
240  RCHECK(bit_reader.ReadBits(8, &pes_header_data_length));
+
241  int pes_header_start_size = static_cast<int>(bit_reader.bits_available()) / 8;
+
242 
+
243  // Compute the size and the offset of the ES payload.
+
244  // "6" for the 6 bytes read before and including |pes_packet_length|.
+
245  // "3" for the 3 bytes read before and including |pes_header_data_length|.
+
246  int es_size = pes_packet_length - 3 - pes_header_data_length;
+
247  int es_offset = 6 + 3 + pes_header_data_length;
+
248  RCHECK(es_size >= 0);
+
249  RCHECK(es_offset + es_size <= raw_pes_size);
+
250 
+
251  // Read the timing information section.
+
252  bool is_pts_valid = false;
+
253  bool is_dts_valid = false;
+
254  int64_t pts_section = 0;
+
255  int64_t dts_section = 0;
+
256  if (pts_dts_flags == 0x2) {
+
257  RCHECK(bit_reader.ReadBits(40, &pts_section));
+
258  RCHECK((((pts_section >> 36) & 0xf) == 0x2) &&
+
259  IsTimestampSectionValid(pts_section));
+
260  is_pts_valid = true;
+
261  }
+
262  if (pts_dts_flags == 0x3) {
+
263  RCHECK(bit_reader.ReadBits(40, &pts_section));
+
264  RCHECK(bit_reader.ReadBits(40, &dts_section));
+
265  RCHECK((((pts_section >> 36) & 0xf) == 0x3) &&
+
266  IsTimestampSectionValid(pts_section));
+
267  RCHECK((((dts_section >> 36) & 0xf) == 0x1) &&
+
268  IsTimestampSectionValid(dts_section));
+
269  is_pts_valid = true;
+
270  is_dts_valid = true;
+
271  }
+
272 
+
273  // Convert and unroll the timestamps.
+
274  int64_t media_pts(kNoTimestamp);
+
275  int64_t media_dts(kNoTimestamp);
+
276  if (is_pts_valid) {
+
277  int64_t pts = ConvertTimestampSectionToTimestamp(pts_section);
+
278  if (previous_pts_valid_)
+
279  pts = UnrollTimestamp(previous_pts_, pts);
+
280  previous_pts_ = pts;
+
281  previous_pts_valid_ = true;
+
282  media_pts = pts;
+
283  }
+
284  if (is_dts_valid) {
+
285  int64_t dts = ConvertTimestampSectionToTimestamp(dts_section);
+
286  if (previous_dts_valid_)
+
287  dts = UnrollTimestamp(previous_dts_, dts);
+
288  previous_dts_ = dts;
+
289  previous_dts_valid_ = true;
+
290  media_dts = dts;
+
291  }
+
292 
+
293  // Discard the rest of the PES packet header.
+
294  DCHECK_EQ(bit_reader.bits_available() % 8, 0u);
+
295  int pes_header_remaining_size =
+
296  pes_header_data_length -
+
297  (pes_header_start_size -
+
298  static_cast<int>(bit_reader.bits_available()) / 8);
+
299  RCHECK(pes_header_remaining_size >= 0);
+
300 
+
301  // Read the PES packet.
+
302  DVLOG(LOG_LEVEL_PES)
+
303  << "Emit a reassembled PES:"
+
304  << " size=" << es_size
+
305  << " pts=" << media_pts
+
306  << " dts=" << media_dts
+
307  << " data_alignment_indicator=" << data_alignment_indicator;
+
308  return es_parser_->Parse(&raw_pes[es_offset], es_size, media_pts, media_dts);
+
309 }
+
310 
+
311 void TsSectionPes::ResetPesState() {
+
312  pes_byte_queue_.Reset();
+
313  wait_for_pusi_ = true;
+
314 }
+
315 
+
316 } // namespace mp2t
+
317 } // namespace media
+
318 } // namespace shaka
void Push(const uint8_t *data, int size)
Append new bytes to the end of the queue.
Definition: byte_queue.cc:29
void Reset()
Reset the queue to the empty state.
Definition: byte_queue.cc:24
void Peek(const uint8_t **data, int *size) const
Definition: byte_queue.cc:63
diff --git a/docs/d6/d71/scoped__xml__ptr_8h_source.html b/docs/d6/d71/scoped__xml__ptr_8h_source.html index b3a8069ddd..e01b1c9758 100644 --- a/docs/d6/d71/scoped__xml__ptr_8h_source.html +++ b/docs/d6/d71/scoped__xml__ptr_8h_source.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d74/classshaka_1_1UdpOptions-members.html b/docs/d6/d74/classshaka_1_1UdpOptions-members.html index aaec5871e8..d1c19b007d 100644 --- a/docs/d6/d74/classshaka_1_1UdpOptions-members.html +++ b/docs/d6/d74/classshaka_1_1UdpOptions-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d77/dash__iop__mpd__notifier_8h_source.html b/docs/d6/d77/dash__iop__mpd__notifier_8h_source.html index bb8936bc89..4efaa6a765 100644 --- a/docs/d6/d77/dash__iop__mpd__notifier_8h_source.html +++ b/docs/d6/d77/dash__iop__mpd__notifier_8h_source.html @@ -226,7 +226,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d79/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html b/docs/d6/d79/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html index 360ebba323..dd9dbbdb54 100644 --- a/docs/d6/d79/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html +++ b/docs/d6/d79/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d6/d7b/webm__tracks__parser_8h_source.html b/docs/d6/d7b/webm__tracks__parser_8h_source.html index 47d7c894e6..5dcf779cd1 100644 --- a/docs/d6/d7b/webm__tracks__parser_8h_source.html +++ b/docs/d6/d7b/webm__tracks__parser_8h_source.html @@ -205,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d7c/structshaka_1_1media_1_1mp4_1_1AC3Specific-members.html b/docs/d6/d7c/structshaka_1_1media_1_1mp4_1_1AC3Specific-members.html index c3acca5f84..4ea915903b 100644 --- a/docs/d6/d7c/structshaka_1_1media_1_1mp4_1_1AC3Specific-members.html +++ b/docs/d6/d7c/structshaka_1_1media_1_1mp4_1_1AC3Specific-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d86/bandwidth__estimator_8cc_source.html b/docs/d6/d86/bandwidth__estimator_8cc_source.html index 56859d4978..d91289a6e9 100644 --- a/docs/d6/d86/bandwidth__estimator_8cc_source.html +++ b/docs/d6/d86/bandwidth__estimator_8cc_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d8a/classshaka_1_1media_1_1FakeMediaHandler-members.html b/docs/d6/d8a/classshaka_1_1media_1_1FakeMediaHandler-members.html index 0e6bfd9810..d9328e43f3 100644 --- a/docs/d6/d8a/classshaka_1_1media_1_1FakeMediaHandler-members.html +++ b/docs/d6/d8a/classshaka_1_1media_1_1FakeMediaHandler-members.html @@ -96,9 +96,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline clear_stream_data_vector() (defined in shaka::media::FakeMediaHandler)shaka::media::FakeMediaHandlerinline Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected - DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected + DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected - DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected + DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d8a/vp9__parser_8cc_source.html b/docs/d6/d8a/vp9__parser_8cc_source.html index 2864a1807b..647526dc0f 100644 --- a/docs/d6/d8a/vp9__parser_8cc_source.html +++ b/docs/d6/d8a/vp9__parser_8cc_source.html @@ -697,7 +697,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d8f/classshaka_1_1xml_1_1RepresentationBaseXmlNode-members.html b/docs/d6/d8f/classshaka_1_1xml_1_1RepresentationBaseXmlNode-members.html index acd34bbba9..c29c98f211 100644 --- a/docs/d6/d8f/classshaka_1_1xml_1_1RepresentationBaseXmlNode-members.html +++ b/docs/d6/d8f/classshaka_1_1xml_1_1RepresentationBaseXmlNode-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d9b/h264__parser_8h_source.html b/docs/d6/d9b/h264__parser_8h_source.html index 8dc87208a5..c0928b5be4 100644 --- a/docs/d6/d9b/h264__parser_8h_source.html +++ b/docs/d6/d9b/h264__parser_8h_source.html @@ -443,7 +443,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d9f/hls__flags_8cc_source.html b/docs/d6/d9f/hls__flags_8cc_source.html index b80ede8fd6..c8fd37187c 100644 --- a/docs/d6/d9f/hls__flags_8cc_source.html +++ b/docs/d6/d9f/hls__flags_8cc_source.html @@ -103,15 +103,20 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
14  "",
15  "The base URL for the Media Playlists and media files listed in "
16  "the playlists. This is the prefix for the files.");
-
17 DEFINE_string(hls_playlist_type,
-
18  "VOD",
-
19  "VOD, EVENT, or LIVE. This defines the EXT-X-PLAYLIST-TYPE in "
-
20  "the HLS specification. For hls_playlist_type of LIVE, "
-
21  "EXT-X-PLAYLIST-TYPE tag is omitted.");
+
17 DEFINE_string(hls_key_uri,
+
18  "",
+
19  "The key uri for 'identity' and 'com.apple.streamingkeydelivery' "
+
20  "key formats. Ignored if the playlist is not encrypted or not "
+
21  "using the above key formats.");
+
22 DEFINE_string(hls_playlist_type,
+
23  "VOD",
+
24  "VOD, EVENT, or LIVE. This defines the EXT-X-PLAYLIST-TYPE in "
+
25  "the HLS specification. For hls_playlist_type of LIVE, "
+
26  "EXT-X-PLAYLIST-TYPE tag is omitted.");
diff --git a/docs/d6/da0/ts__section__pat_8h_source.html b/docs/d6/da0/ts__section__pat_8h_source.html index 4303efe472..b20a86d418 100644 --- a/docs/d6/da0/ts__section__pat_8h_source.html +++ b/docs/d6/da0/ts__section__pat_8h_source.html @@ -135,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/da3/mpd__builder_8h_source.html b/docs/d6/da3/mpd__builder_8h_source.html index 904c12ea36..f1a07abd6f 100644 --- a/docs/d6/da3/mpd__builder_8h_source.html +++ b/docs/d6/da3/mpd__builder_8h_source.html @@ -517,7 +517,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/da4/classshaka_1_1media_1_1AVCDecoderConfigurationRecord-members.html b/docs/d6/da4/classshaka_1_1media_1_1AVCDecoderConfigurationRecord-members.html index 14efe40c88..aba33e2db2 100644 --- a/docs/d6/da4/classshaka_1_1media_1_1AVCDecoderConfigurationRecord-members.html +++ b/docs/d6/da4/classshaka_1_1media_1_1AVCDecoderConfigurationRecord-members.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/da6/structshaka_1_1media_1_1H265SliceHeader_1_1LongTermPicsInfo-members.html b/docs/d6/da6/structshaka_1_1media_1_1H265SliceHeader_1_1LongTermPicsInfo-members.html index 656386365b..9c4b0ce148 100644 --- a/docs/d6/da6/structshaka_1_1media_1_1H265SliceHeader_1_1LongTermPicsInfo-members.html +++ b/docs/d6/da6/structshaka_1_1media_1_1H265SliceHeader_1_1LongTermPicsInfo-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/da9/classshaka_1_1media_1_1BitReader.html b/docs/d6/da9/classshaka_1_1media_1_1BitReader.html index a39090f1bf..b5cc766469 100644 --- a/docs/d6/da9/classshaka_1_1media_1_1BitReader.html +++ b/docs/d6/da9/classshaka_1_1media_1_1BitReader.html @@ -365,7 +365,7 @@ template<typename T > diff --git a/docs/d6/daa/structshaka_1_1media_1_1mp4_1_1VTTCueBox.html b/docs/d6/daa/structshaka_1_1media_1_1mp4_1_1VTTCueBox.html index a6f1ef5643..bcf063c858 100644 --- a/docs/d6/daa/structshaka_1_1media_1_1mp4_1_1VTTCueBox.html +++ b/docs/d6/daa/structshaka_1_1media_1_1mp4_1_1VTTCueBox.html @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/d6/db1/classshaka_1_1media_1_1VideoStreamInfo.html b/docs/d6/db1/classshaka_1_1media_1_1VideoStreamInfo.html index 0ccea04f91..e3c5cef3bb 100644 --- a/docs/d6/db1/classshaka_1_1media_1_1VideoStreamInfo.html +++ b/docs/d6/db1/classshaka_1_1media_1_1VideoStreamInfo.html @@ -498,7 +498,7 @@ void set_encryption_config diff --git a/docs/d6/db1/structshaka_1_1media_1_1VideoStreamInfoParameters-members.html b/docs/d6/db1/structshaka_1_1media_1_1VideoStreamInfoParameters-members.html index 8f51e29553..e0963aef2e 100644 --- a/docs/d6/db1/structshaka_1_1media_1_1VideoStreamInfoParameters-members.html +++ b/docs/d6/db1/structshaka_1_1media_1_1VideoStreamInfoParameters-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dbe/mp4__output__params_8h_source.html b/docs/d6/dbe/mp4__output__params_8h_source.html index 4e72d42666..8b762edfaf 100644 --- a/docs/d6/dbe/mp4__output__params_8h_source.html +++ b/docs/d6/dbe/mp4__output__params_8h_source.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dc0/classshaka_1_1hls_1_1HlsEntry-members.html b/docs/d6/dc0/classshaka_1_1hls_1_1HlsEntry-members.html index f788e74976..b811e1fff1 100644 --- a/docs/d6/dc0/classshaka_1_1hls_1_1HlsEntry-members.html +++ b/docs/d6/dc0/classshaka_1_1hls_1_1HlsEntry-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dc6/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo-members.html b/docs/d6/dc6/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo-members.html index b225e13f9f..e8f6e888a9 100644 --- a/docs/d6/dc6/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo-members.html +++ b/docs/d6/dc6/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dc7/classshaka_1_1media_1_1mp2t_1_1EsParserH26x-members.html b/docs/d6/dc7/classshaka_1_1media_1_1mp2t_1_1EsParserH26x-members.html index 2be79f3c15..ebf4b29400 100644 --- a/docs/d6/dc7/classshaka_1_1media_1_1mp2t_1_1EsParserH26x-members.html +++ b/docs/d6/dc7/classshaka_1_1media_1_1mp2t_1_1EsParserH26x-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dc8/mkv__writer_8cc_source.html b/docs/d6/dc8/mkv__writer_8cc_source.html index 1496d67247..4571d21ba5 100644 --- a/docs/d6/dc8/mkv__writer_8cc_source.html +++ b/docs/d6/dc8/mkv__writer_8cc_source.html @@ -198,7 +198,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html b/docs/d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html index f45f15995c..6b277d210a 100644 --- a/docs/d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html +++ b/docs/d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html @@ -250,7 +250,7 @@ std::vector< diff --git a/docs/d6/dcc/classshaka_1_1media_1_1VP9Parser-members.html b/docs/d6/dcc/classshaka_1_1media_1_1VP9Parser-members.html index 641089f500..2454211875 100644 --- a/docs/d6/dcc/classshaka_1_1media_1_1VP9Parser-members.html +++ b/docs/d6/dcc/classshaka_1_1media_1_1VP9Parser-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dce/structshaka_1_1media_1_1mp4_1_1SegmentReference-members.html b/docs/d6/dce/structshaka_1_1media_1_1mp4_1_1SegmentReference-members.html index 7d7bd46735..2ddf58b9ff 100644 --- a/docs/d6/dce/structshaka_1_1media_1_1mp4_1_1SegmentReference-members.html +++ b/docs/d6/dce/structshaka_1_1media_1_1mp4_1_1SegmentReference-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.png b/docs/d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.png deleted file mode 100644 index 5e0c7339ed9b9802d5b8f66634372ddff35ebd9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^$ALJ2gBeK9+A)zINJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~o%VEb45?szJNM$c#|k_y{K6~$|37(q zNrRz4-mdE1iv)w*bUT|Z(|qD?Zp+=>cthpo>#Y_lnR2>(p0nJU`xH*<*-u)sZeF6j zTib^ACmWuBC_U~r>B~I31B#x?t{l-jRd)AX{H;*i7qKBcvFK;t{6!Jx8>X1M@*Td^ z@^Ss&?~%e;b3RwxPJNkJW*JxcefuY_N4MR+aA}0yt3BTSH1@;!+G~gA>d*P)xl7s8 zFI{Gu&e_|)7My#)TPzh;t^U>hOwm4_!?TNz z7-qP4GbaFp55K^JMNS+K*_0S+_KL9|u!)jk_`KrLhX8TG`M`jFr|u;vc78??%ZJH2 zE6)A&mSF&ev}M9|!(ArcmIpcAb#AOS*jaPjKX8rmK8~A@-4inp{kZ<`_Zm*qbCrAE zZd!8kl6T>zqEA8}D#E7dr=HyYU9-#e+r5v8I}85p)Xsi%;$}?DuE%1*=R=A_7K+7Q zUw;Z7-mBK%*NkqJzN)h?UMv17uNmL^JqVk=3~mTP5?Nr!OvxeB1HL(>nclxb60shz0Na({8uP_--%hxt#NIgS}Mz&Aca# z?Jwqr`$pKTpTzz7^P7pc!jD$IIH!Hxu&m`v4eN*7zuvrAe&4Yn{^}!!9qasy8UFCY i1M%NnF2$Dh*X6}+wRo4;2HOFXI)kUHpUXO@geCy@la9my diff --git a/docs/d6/dd0/structshaka_1_1media_1_1H264SEIMessage.html b/docs/d6/dd0/structshaka_1_1media_1_1H264SEIMessage.html index 3c01b25844..cf5625b617 100644 --- a/docs/d6/dd0/structshaka_1_1media_1_1H264SEIMessage.html +++ b/docs/d6/dd0/structshaka_1_1media_1_1H264SEIMessage.html @@ -127,7 +127,7 @@ union { diff --git a/docs/d6/dd7/structshaka_1_1Mp4OutputParams-members.html b/docs/d6/dd7/structshaka_1_1Mp4OutputParams-members.html index 8b7084b472..f4fc4e80dd 100644 --- a/docs/d6/dd7/structshaka_1_1Mp4OutputParams-members.html +++ b/docs/d6/dd7/structshaka_1_1Mp4OutputParams-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dde/structshaka_1_1media_1_1H265VuiParameters-members.html b/docs/d6/dde/structshaka_1_1media_1_1H265VuiParameters-members.html index d81b1871c1..f3f0098629 100644 --- a/docs/d6/dde/structshaka_1_1media_1_1H265VuiParameters-members.html +++ b/docs/d6/dde/structshaka_1_1media_1_1H265VuiParameters-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/de4/structshaka_1_1media_1_1mp4_1_1CueTimeBox-members.html b/docs/d6/de4/structshaka_1_1media_1_1mp4_1_1CueTimeBox-members.html index a7bb682a30..96ebc2bf8b 100644 --- a/docs/d6/de4/structshaka_1_1media_1_1mp4_1_1CueTimeBox-members.html +++ b/docs/d6/de4/structshaka_1_1media_1_1mp4_1_1CueTimeBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/de7/structshaka_1_1media_1_1VPxFrameInfo-members.html b/docs/d6/de7/structshaka_1_1media_1_1VPxFrameInfo-members.html index aac8931add..e620063eac 100644 --- a/docs/d6/de7/structshaka_1_1media_1_1VPxFrameInfo-members.html +++ b/docs/d6/de7/structshaka_1_1media_1_1VPxFrameInfo-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/de8/local__file_8cc_source.html b/docs/d6/de8/local__file_8cc_source.html index cbfbe7db66..bd4005cee1 100644 --- a/docs/d6/de8/local__file_8cc_source.html +++ b/docs/d6/de8/local__file_8cc_source.html @@ -232,7 +232,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/de8/network__util_8h_source.html b/docs/d6/de8/network__util_8h_source.html index 886805fcac..c2302dd349 100644 --- a/docs/d6/de8/network__util_8h_source.html +++ b/docs/d6/de8/network__util_8h_source.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/de9/ts__segmenter_8cc_source.html b/docs/d6/de9/ts__segmenter_8cc_source.html index 2eb7cafd52..8d3fff1cb5 100644 --- a/docs/d6/de9/ts__segmenter_8cc_source.html +++ b/docs/d6/de9/ts__segmenter_8cc_source.html @@ -97,153 +97,204 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
8 
9 #include <memory>
10 
-
11 #include "packager/media/base/muxer_util.h"
-
12 #include "packager/media/event/muxer_listener.h"
-
13 #include "packager/status.h"
-
14 
-
15 namespace shaka {
-
16 namespace media {
-
17 namespace mp2t {
+
11 #include "packager/media/base/audio_stream_info.h"
+
12 #include "packager/media/base/muxer_util.h"
+
13 #include "packager/media/base/video_stream_info.h"
+
14 #include "packager/media/event/muxer_listener.h"
+
15 #include "packager/media/formats/mp2t/pes_packet.h"
+
16 #include "packager/media/formats/mp2t/program_map_table_writer.h"
+
17 #include "packager/status.h"
18 
-
19 namespace {
-
20 const double kTsTimescale = 90000;
-
21 } // namespace
+
19 namespace shaka {
+
20 namespace media {
+
21 namespace mp2t {
22 
- -
24  : muxer_options_(options),
-
25  listener_(listener),
-
26  ts_writer_(new TsWriter()),
-
27  pes_packet_generator_(new PesPacketGenerator()) {}
-
28 TsSegmenter::~TsSegmenter() {}
+
23 namespace {
+
24 const double kTsTimescale = 90000;
+
25 
+
26 bool IsAudioCodec(Codec codec) {
+
27  return codec >= kCodecAudio && codec < kCodecAudioMaxPlusOne;
+
28 }
29 
- -
31  if (muxer_options_.segment_template.empty())
-
32  return Status(error::MUXER_FAILURE, "Segment template not specified.");
-
33  if (!ts_writer_->Initialize(stream_info))
-
34  return Status(error::MUXER_FAILURE, "Failed to initialize TsWriter.");
-
35  if (!pes_packet_generator_->Initialize(stream_info)) {
-
36  return Status(error::MUXER_FAILURE,
-
37  "Failed to initialize PesPacketGenerator.");
-
38  }
-
39 
-
40  timescale_scale_ = kTsTimescale / stream_info.time_scale();
-
41  return Status::OK;
-
42 }
-
43 
- -
45  return Status::OK;
-
46 }
-
47 
- -
49  if (sample.is_encrypted())
-
50  ts_writer_->SignalEncrypted();
-
51 
-
52  if (!ts_writer_file_opened_ && !sample.is_key_frame())
-
53  LOG(WARNING) << "A segment will start with a non key frame.";
-
54 
-
55  if (!pes_packet_generator_->PushSample(sample)) {
-
56  return Status(error::MUXER_FAILURE,
-
57  "Failed to add sample to PesPacketGenerator.");
-
58  }
-
59  return WritePesPacketsToFile();
-
60 }
+
30 bool IsVideoCodec(Codec codec) {
+
31  return codec >= kCodecVideo && codec < kCodecVideoMaxPlusOne;
+
32 }
+
33 
+
34 } // namespace
+
35 
+ +
37  : muxer_options_(options),
+
38  listener_(listener),
+
39  pes_packet_generator_(new PesPacketGenerator()) {}
+
40 TsSegmenter::~TsSegmenter() {}
+
41 
+ +
43  if (muxer_options_.segment_template.empty())
+
44  return Status(error::MUXER_FAILURE, "Segment template not specified.");
+
45  if (!pes_packet_generator_->Initialize(stream_info)) {
+
46  return Status(error::MUXER_FAILURE,
+
47  "Failed to initialize PesPacketGenerator.");
+
48  }
+
49 
+
50  const StreamType stream_type = stream_info.stream_type();
+
51  if (stream_type != StreamType::kStreamVideo &&
+
52  stream_type != StreamType::kStreamAudio) {
+
53  LOG(ERROR) << "TsWriter cannot handle stream type " << stream_type
+
54  << " yet.";
+
55  return Status(error::MUXER_FAILURE, "Unsupported stream type.");
+
56  }
+
57 
+
58  codec_ = stream_info.codec();
+
59  if (stream_type == StreamType::kStreamAudio)
+
60  audio_codec_config_ = stream_info.codec_config();
61 
-
62 void TsSegmenter::InjectTsWriterForTesting(std::unique_ptr<TsWriter> writer) {
-
63  ts_writer_ = std::move(writer);
+
62  timescale_scale_ = kTsTimescale / stream_info.time_scale();
+
63  return Status::OK;
64 }
65 
- -
67  std::unique_ptr<PesPacketGenerator> generator) {
-
68  pes_packet_generator_ = std::move(generator);
-
69 }
-
70 
- -
72  ts_writer_file_opened_ = value;
-
73 }
-
74 
-
75 Status TsSegmenter::OpenNewSegmentIfClosed(uint32_t next_pts) {
-
76  if (ts_writer_file_opened_)
-
77  return Status::OK;
-
78  const std::string segment_name =
-
79  GetSegmentName(muxer_options_.segment_template, next_pts,
-
80  segment_number_++, muxer_options_.bandwidth);
-
81  if (!ts_writer_->NewSegment(segment_name))
-
82  return Status(error::MUXER_FAILURE, "Failed to initilize TsPacketWriter.");
-
83  current_segment_path_ = segment_name;
-
84  ts_writer_file_opened_ = true;
-
85  return Status::OK;
-
86 }
-
87 
-
88 Status TsSegmenter::WritePesPacketsToFile() {
-
89  while (pes_packet_generator_->NumberOfReadyPesPackets() > 0u) {
-
90  std::unique_ptr<PesPacket> pes_packet =
-
91  pes_packet_generator_->GetNextPesPacket();
-
92 
-
93  Status status = OpenNewSegmentIfClosed(pes_packet->pts());
-
94  if (!status.ok())
-
95  return status;
-
96 
-
97  if (!ts_writer_->AddPesPacket(std::move(pes_packet)))
-
98  return Status(error::MUXER_FAILURE, "Failed to add PES packet.");
-
99  }
-
100  return Status::OK;
-
101 }
-
102 
-
103 Status TsSegmenter::FinalizeSegment(uint64_t start_timestamp,
-
104  uint64_t duration) {
-
105  if (!pes_packet_generator_->Flush()) {
-
106  return Status(error::MUXER_FAILURE,
-
107  "Failed to flush PesPacketGenerator.");
-
108  }
-
109  Status status = WritePesPacketsToFile();
-
110  if (!status.ok())
-
111  return status;
-
112 
-
113  // This method may be called from Finalize() so ts_writer_file_opened_ could
-
114  // be false.
-
115  if (ts_writer_file_opened_) {
-
116  if (!ts_writer_->FinalizeSegment()) {
-
117  return Status(error::MUXER_FAILURE, "Failed to finalize TsWriter.");
-
118  }
-
119  if (listener_) {
-
120  const int64_t file_size =
-
121  File::GetFileSize(current_segment_path_.c_str());
-
122  listener_->OnNewSegment(current_segment_path_,
-
123  start_timestamp * timescale_scale_,
-
124  duration * timescale_scale_, file_size);
-
125  }
-
126  ts_writer_file_opened_ = false;
-
127  }
-
128  current_segment_path_.clear();
-
129  return Status::OK;
-
130 }
-
131 
-
132 } // namespace mp2t
-
133 } // namespace media
-
134 } // namespace shaka
+ +
67  return Status::OK;
+
68 }
+
69 
+ +
71  if (!ts_writer_) {
+
72  std::unique_ptr<ProgramMapTableWriter> pmt_writer;
+
73  if (codec_ == kCodecAC3) {
+
74  // https://goo.gl/N7Tvqi MPEG-2 Stream Encryption Format for HTTP Live
+
75  // Streaming 2.3.2.2 AC-3 Setup: For AC-3, the setup_data in the
+
76  // audio_setup_information is the first 10 bytes of the audio data (the
+
77  // syncframe()).
+
78  // For unencrypted AC3, the setup_data is not used, so what is in there
+
79  // does not matter.
+
80  const size_t kSetupDataSize = 10u;
+
81  if (sample.data_size() < kSetupDataSize) {
+
82  LOG(ERROR) << "Sample is too small for AC3: " << sample.data_size();
+
83  return Status(error::MUXER_FAILURE, "Sample is too small for AC3.");
+
84  }
+
85  const std::vector<uint8_t> setup_data(sample.data(),
+
86  sample.data() + kSetupDataSize);
+
87  pmt_writer.reset(new AudioProgramMapTableWriter(codec_, setup_data));
+
88  } else if (IsAudioCodec(codec_)) {
+
89  pmt_writer.reset(
+
90  new AudioProgramMapTableWriter(codec_, audio_codec_config_));
+
91  } else {
+
92  DCHECK(IsVideoCodec(codec_));
+
93  pmt_writer.reset(new VideoProgramMapTableWriter(codec_));
+
94  }
+
95  ts_writer_.reset(new TsWriter(std::move(pmt_writer)));
+
96  }
+
97 
+
98  if (sample.is_encrypted())
+
99  ts_writer_->SignalEncrypted();
+
100 
+
101  if (!ts_writer_file_opened_ && !sample.is_key_frame())
+
102  LOG(WARNING) << "A segment will start with a non key frame.";
+
103 
+
104  if (!pes_packet_generator_->PushSample(sample)) {
+
105  return Status(error::MUXER_FAILURE,
+
106  "Failed to add sample to PesPacketGenerator.");
+
107  }
+
108  return WritePesPacketsToFile();
+
109 }
+
110 
+
111 void TsSegmenter::InjectTsWriterForTesting(std::unique_ptr<TsWriter> writer) {
+
112  ts_writer_ = std::move(writer);
+
113 }
+
114 
+ +
116  std::unique_ptr<PesPacketGenerator> generator) {
+
117  pes_packet_generator_ = std::move(generator);
+
118 }
+
119 
+ +
121  ts_writer_file_opened_ = value;
+
122 }
+
123 
+
124 Status TsSegmenter::OpenNewSegmentIfClosed(uint32_t next_pts) {
+
125  if (ts_writer_file_opened_)
+
126  return Status::OK;
+
127  const std::string segment_name =
+
128  GetSegmentName(muxer_options_.segment_template, next_pts,
+
129  segment_number_++, muxer_options_.bandwidth);
+
130  if (!ts_writer_->NewSegment(segment_name))
+
131  return Status(error::MUXER_FAILURE, "Failed to initilize TsPacketWriter.");
+
132  current_segment_path_ = segment_name;
+
133  ts_writer_file_opened_ = true;
+
134  return Status::OK;
+
135 }
+
136 
+
137 Status TsSegmenter::WritePesPacketsToFile() {
+
138  while (pes_packet_generator_->NumberOfReadyPesPackets() > 0u) {
+
139  std::unique_ptr<PesPacket> pes_packet =
+
140  pes_packet_generator_->GetNextPesPacket();
+
141 
+
142  Status status = OpenNewSegmentIfClosed(pes_packet->pts());
+
143  if (!status.ok())
+
144  return status;
+
145 
+
146  if (!ts_writer_->AddPesPacket(std::move(pes_packet)))
+
147  return Status(error::MUXER_FAILURE, "Failed to add PES packet.");
+
148  }
+
149  return Status::OK;
+
150 }
+
151 
+
152 Status TsSegmenter::FinalizeSegment(uint64_t start_timestamp,
+
153  uint64_t duration) {
+
154  if (!pes_packet_generator_->Flush()) {
+
155  return Status(error::MUXER_FAILURE,
+
156  "Failed to flush PesPacketGenerator.");
+
157  }
+
158  Status status = WritePesPacketsToFile();
+
159  if (!status.ok())
+
160  return status;
+
161 
+
162  // This method may be called from Finalize() so ts_writer_file_opened_ could
+
163  // be false.
+
164  if (ts_writer_file_opened_) {
+
165  if (!ts_writer_->FinalizeSegment()) {
+
166  return Status(error::MUXER_FAILURE, "Failed to finalize TsWriter.");
+
167  }
+
168  if (listener_) {
+
169  const int64_t file_size =
+
170  File::GetFileSize(current_segment_path_.c_str());
+
171  listener_->OnNewSegment(current_segment_path_,
+
172  start_timestamp * timescale_scale_,
+
173  duration * timescale_scale_, file_size);
+
174  }
+
175  ts_writer_file_opened_ = false;
+
176  }
+
177  current_segment_path_.clear();
+
178  return Status::OK;
+
179 }
+
180 
+
181 } // namespace mp2t
+
182 } // namespace media
+
183 } // namespace shaka
virtual void OnNewSegment(const std::string &segment_name, uint64_t start_time, uint64_t duration, uint64_t segment_file_size)=0
Abstract class holds stream information.
Definition: stream_info.h:58
- -
Status Initialize(const StreamInfo &stream_info)
Definition: ts_segmenter.cc:30
+
ProgramMapTableWriter for video codecs.
+ +
Status Initialize(const StreamInfo &stream_info)
Definition: ts_segmenter.cc:42
static int64_t GetFileSize(const char *file_name)
Definition: file.cc:207
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
-
Status AddSample(const MediaSample &sample)
Definition: ts_segmenter.cc:48
+
Status AddSample(const MediaSample &sample)
Definition: ts_segmenter.cc:70
-
TsSegmenter(const MuxerOptions &options, MuxerListener *listener)
Definition: ts_segmenter.cc:23
-
void InjectPesPacketGeneratorForTesting(std::unique_ptr< PesPacketGenerator > generator)
Only for testing.
Definition: ts_segmenter.cc:66
-
void SetTsWriterFileOpenedForTesting(bool value)
Only for testing.
Definition: ts_segmenter.cc:71
-
void InjectTsWriterForTesting(std::unique_ptr< TsWriter > writer)
Only for testing.
Definition: ts_segmenter.cc:62
+
ProgramMapTableWriter for video codecs.
+
TsSegmenter(const MuxerOptions &options, MuxerListener *listener)
Definition: ts_segmenter.cc:36
+
void InjectPesPacketGeneratorForTesting(std::unique_ptr< PesPacketGenerator > generator)
Only for testing.
+
void SetTsWriterFileOpenedForTesting(bool value)
Only for testing.
+
void InjectTsWriterForTesting(std::unique_ptr< TsWriter > writer)
Only for testing.
Class to hold a media sample.
Definition: media_sample.h:22
- -
Status FinalizeSegment(uint64_t start_timestamp, uint64_t duration)
+ +
Status FinalizeSegment(uint64_t start_timestamp, uint64_t duration)
diff --git a/docs/d6/ded/ts__packet_8h_source.html b/docs/d6/ded/ts__packet_8h_source.html index 07b68d4bc0..80cc536140 100644 --- a/docs/d6/ded/ts__packet_8h_source.html +++ b/docs/d6/ded/ts__packet_8h_source.html @@ -169,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/def/sync__sample__iterator_8cc_source.html b/docs/d6/def/sync__sample__iterator_8cc_source.html index 89df4f06d9..13008828cd 100644 --- a/docs/d6/def/sync__sample__iterator_8cc_source.html +++ b/docs/d6/def/sync__sample__iterator_8cc_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/df8/structshaka_1_1StreamDescriptor-members.html b/docs/d6/df8/structshaka_1_1StreamDescriptor-members.html index eeb5470795..db0139852f 100644 --- a/docs/d6/df8/structshaka_1_1StreamDescriptor-members.html +++ b/docs/d6/df8/structshaka_1_1StreamDescriptor-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dfd/classshaka_1_1media_1_1mp2t_1_1AudioHeader-members.html b/docs/d6/dfd/classshaka_1_1media_1_1mp2t_1_1AudioHeader-members.html new file mode 100644 index 0000000000..655c801d42 --- /dev/null +++ b/docs/d6/dfd/classshaka_1_1media_1_1mp2t_1_1AudioHeader-members.html @@ -0,0 +1,116 @@ + + + + + + +Shaka Packager SDK: Member List + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
shaka::media::mp2t::AudioHeader Member List
+
+
+ +

This is the complete list of members for shaka::media::mp2t::AudioHeader, including all inherited members.

+ + + + + + + + + + + + + +
AudioHeader()=default (defined in shaka::media::mp2t::AudioHeader)shaka::media::mp2t::AudioHeader
GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const =0shaka::media::mp2t::AudioHeaderpure virtual
GetFrameSize() const =0shaka::media::mp2t::AudioHeaderpure virtual
GetHeaderSize() const =0shaka::media::mp2t::AudioHeaderpure virtual
GetMinFrameSize() const =0shaka::media::mp2t::AudioHeaderpure virtual
GetNumChannels() const =0shaka::media::mp2t::AudioHeaderpure virtual
GetObjectType() const =0shaka::media::mp2t::AudioHeaderpure virtual
GetSamplesPerFrame() const =0shaka::media::mp2t::AudioHeaderpure virtual
GetSamplingFrequency() const =0shaka::media::mp2t::AudioHeaderpure virtual
IsSyncWord(const uint8_t *buf) const =0shaka::media::mp2t::AudioHeaderpure virtual
Parse(const uint8_t *audio_frame, size_t audio_frame_size)=0shaka::media::mp2t::AudioHeaderpure virtual
~AudioHeader()=default (defined in shaka::media::mp2t::AudioHeader)shaka::media::mp2t::AudioHeadervirtual
+ + + + diff --git a/docs/d6/dff/classshaka_1_1media_1_1Nalu.html b/docs/d6/dff/classshaka_1_1media_1_1Nalu.html index bb73c92eaa..0ffda55efe 100644 --- a/docs/d6/dff/classshaka_1_1media_1_1Nalu.html +++ b/docs/d6/dff/classshaka_1_1media_1_1Nalu.html @@ -247,7 +247,7 @@ bool can_start_access_unit diff --git a/docs/d7/d01/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription.html b/docs/d7/d01/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription.html index 3ec68397b6..7adcb439ce 100644 --- a/docs/d7/d01/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription.html +++ b/docs/d7/d01/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription.html @@ -194,7 +194,7 @@ Additional Inherited Members diff --git a/docs/d7/d04/classshaka_1_1media_1_1AdCueGenerator-members.html b/docs/d7/d04/classshaka_1_1media_1_1AdCueGenerator-members.html new file mode 100644 index 0000000000..db22a18089 --- /dev/null +++ b/docs/d7/d04/classshaka_1_1media_1_1AdCueGenerator-members.html @@ -0,0 +1,127 @@ + + + + + + +Shaka Packager SDK: Member List + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
shaka::media::AdCueGenerator Member List
+
+
+ +

This is the complete list of members for shaka::media::AdCueGenerator, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
AdCueGenerator(const AdCueGeneratorParams &ad_cue_generator_params) (defined in shaka::media::AdCueGenerator)shaka::media::AdCueGeneratorexplicit
AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline
Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected
DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected
DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected
DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected
DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected
DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected
DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected
FlushAllDownstreams()shaka::media::MediaHandlerprotected
FlushDownstream(size_t output_stream_index)shaka::media::MediaHandlerprotected
Initialize()shaka::media::MediaHandler
initialized() (defined in shaka::media::MediaHandler)shaka::media::MediaHandlerinlineprotected
IsConnected()shaka::media::MediaHandlerinline
MediaHandler()=default (defined in shaka::media::MediaHandler)shaka::media::MediaHandler
next_output_stream_index() const (defined in shaka::media::MediaHandler)shaka::media::MediaHandlerinlineprotected
num_input_streams() const (defined in shaka::media::MediaHandler)shaka::media::MediaHandlerinlineprotected
OnFlushRequest(size_t input_stream_index)shaka::media::MediaHandlerprotectedvirtual
output_handlers() (defined in shaka::media::MediaHandler)shaka::media::MediaHandlerinlineprotected
SetHandler(size_t output_stream_index, std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandler
ValidateOutputStreamIndex(size_t stream_index) const shaka::media::MediaHandlerprotectedvirtual
~AdCueGenerator() override (defined in shaka::media::AdCueGenerator)shaka::media::AdCueGenerator
~MediaHandler()=default (defined in shaka::media::MediaHandler)shaka::media::MediaHandlervirtual
+ + + + diff --git a/docs/d7/d07/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader.html b/docs/d7/d07/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader.html index 25652e7a7b..5e83d42bf9 100644 --- a/docs/d7/d07/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader.html +++ b/docs/d7/d07/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d7/d0b/muxer__listener__test__helper_8h_source.html b/docs/d7/d0b/muxer__listener__test__helper_8h_source.html index d393844e36..112e12db18 100644 --- a/docs/d7/d0b/muxer__listener__test__helper_8h_source.html +++ b/docs/d7/d0b/muxer__listener__test__helper_8h_source.html @@ -201,7 +201,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d12/media__parser_8h_source.html b/docs/d7/d12/media__parser_8h_source.html index 18173ec2b8..94a5663178 100644 --- a/docs/d7/d12/media__parser_8h_source.html +++ b/docs/d7/d12/media__parser_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d15/mpd__notifier_8h_source.html b/docs/d7/d15/mpd__notifier_8h_source.html index 280cd81216..6963b51a3c 100644 --- a/docs/d7/d15/mpd__notifier_8h_source.html +++ b/docs/d7/d15/mpd__notifier_8h_source.html @@ -169,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d16/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry-members.html b/docs/d7/d16/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry-members.html index 67ed6f8c5b..0041087dc0 100644 --- a/docs/d7/d16/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry-members.html +++ b/docs/d7/d16/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d22/libcrypto__threading_8h_source.html b/docs/d7/d22/libcrypto__threading_8h_source.html index 9421f54989..d2a8ab3793 100644 --- a/docs/d7/d22/libcrypto__threading_8h_source.html +++ b/docs/d7/d22/libcrypto__threading_8h_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html b/docs/d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html index ae89f19a8b..09da91482d 100644 --- a/docs/d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html +++ b/docs/d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html @@ -177,7 +177,7 @@ Public Member Functions diff --git a/docs/d7/d29/structshaka_1_1media_1_1H265Sps-members.html b/docs/d7/d29/structshaka_1_1media_1_1H265Sps-members.html index 9b6534a495..2b38d71cfb 100644 --- a/docs/d7/d29/structshaka_1_1media_1_1H265Sps-members.html +++ b/docs/d7/d29/structshaka_1_1media_1_1H265Sps-members.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d29/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample-members.html b/docs/d7/d29/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample-members.html index c22652c8d7..d70d9bd8e2 100644 --- a/docs/d7/d29/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample-members.html +++ b/docs/d7/d29/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d34/structshaka_1_1media_1_1EncryptionConfig.html b/docs/d7/d34/structshaka_1_1media_1_1EncryptionConfig.html index 77f8d298f4..7e1d9b1eae 100644 --- a/docs/d7/d34/structshaka_1_1media_1_1EncryptionConfig.html +++ b/docs/d7/d34/structshaka_1_1media_1_1EncryptionConfig.html @@ -128,7 +128,7 @@ std::vector
diff --git a/docs/d7/d36/classshaka_1_1media_1_1ContentEncoding-members.html b/docs/d7/d36/classshaka_1_1media_1_1ContentEncoding-members.html index d854967b56..5f46e755fa 100644 --- a/docs/d7/d36/classshaka_1_1media_1_1ContentEncoding-members.html +++ b/docs/d7/d36/classshaka_1_1media_1_1ContentEncoding-members.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d42/protection__system__specific__info_8cc_source.html b/docs/d7/d42/protection__system__specific__info_8cc_source.html index 227e31a80a..755f965907 100644 --- a/docs/d7/d42/protection__system__specific__info_8cc_source.html +++ b/docs/d7/d42/protection__system__specific__info_8cc_source.html @@ -219,7 +219,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d42/structshaka_1_1media_1_1mp4_1_1SampleSize.html b/docs/d7/d42/structshaka_1_1media_1_1mp4_1_1SampleSize.html index aadd72cd76..82b0d78c41 100644 --- a/docs/d7/d42/structshaka_1_1media_1_1mp4_1_1SampleSize.html +++ b/docs/d7/d42/structshaka_1_1media_1_1mp4_1_1SampleSize.html @@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/d7/d44/structshaka_1_1media_1_1mp4_1_1SampleEncryption-members.html b/docs/d7/d44/structshaka_1_1media_1_1mp4_1_1SampleEncryption-members.html index 7dd52da767..c6812fd2de 100644 --- a/docs/d7/d44/structshaka_1_1media_1_1mp4_1_1SampleEncryption-members.html +++ b/docs/d7/d44/structshaka_1_1media_1_1mp4_1_1SampleEncryption-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d46/classshaka_1_1media_1_1WebMListParser-members.html b/docs/d7/d46/classshaka_1_1media_1_1WebMListParser-members.html index 424f0588f5..d5790bbe2f 100644 --- a/docs/d7/d46/classshaka_1_1media_1_1WebMListParser-members.html +++ b/docs/d7/d46/classshaka_1_1media_1_1WebMListParser-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d54/classshaka_1_1media_1_1H26xByteToUnitStreamConverter-members.html b/docs/d7/d54/classshaka_1_1media_1_1H26xByteToUnitStreamConverter-members.html index c359f41b02..c65f210027 100644 --- a/docs/d7/d54/classshaka_1_1media_1_1H26xByteToUnitStreamConverter-members.html +++ b/docs/d7/d54/classshaka_1_1media_1_1H26xByteToUnitStreamConverter-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d59/classshaka_1_1media_1_1DecryptorSource.html b/docs/d7/d59/classshaka_1_1media_1_1DecryptorSource.html index c90001f497..188acd871b 100644 --- a/docs/d7/d59/classshaka_1_1media_1_1DecryptorSource.html +++ b/docs/d7/d59/classshaka_1_1media_1_1DecryptorSource.html @@ -203,7 +203,7 @@ Public Member Functions diff --git a/docs/d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html b/docs/d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html index 71a0a986be..e6e8ac72e2 100644 --- a/docs/d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html +++ b/docs/d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html @@ -111,8 +111,8 @@ Inheritance diagram for shaka::hls::SimpleHlsNotifier: - - + + @@ -142,7 +142,7 @@ class  diff --git a/docs/d7/d6d/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes.html b/docs/d7/d6d/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes.html index 4151a693e9..8b0c3e62d5 100644 --- a/docs/d7/d6d/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes.html +++ b/docs/d7/d6d/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes.html @@ -134,7 +134,7 @@ union
diff --git a/docs/d7/d75/callback__file_8h_source.html b/docs/d7/d75/callback__file_8h_source.html index eb1ace9ce0..2cae7a6f30 100644 --- a/docs/d7/d75/callback__file_8h_source.html +++ b/docs/d7/d75/callback__file_8h_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d75/structshaka_1_1media_1_1mp4_1_1MediaHeader-members.html b/docs/d7/d75/structshaka_1_1media_1_1mp4_1_1MediaHeader-members.html index 92baf0c329..4f711d5dce 100644 --- a/docs/d7/d75/structshaka_1_1media_1_1mp4_1_1MediaHeader-members.html +++ b/docs/d7/d75/structshaka_1_1media_1_1mp4_1_1MediaHeader-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');

Public Member Functions

 SimpleHlsNotifier (HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &prefix, const std::string &output_dir, const std::string &master_playlist_name)
 
 SimpleHlsNotifier (HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &prefix, const std::string &key_uri, const std::string &output_dir, const std::string &master_playlist_name)
 
- Public Member Functions inherited from shaka::hls::HlsNotifier
 HlsNotifier (HlsPlaylistType playlist_type)
39 of file simple_hls_notifier.h.

Constructor & Destructor Documentation

- +
@@ -164,6 +164,12 @@ class  + + + + + + @@ -189,6 +195,7 @@ class  +
const std::string &  prefix,
const std::string & key_uri,
playlist_typeis the type of the playlists.
time_shift_buffer_depthdetermines the duration of the time shifting buffer, only for live HLS.
prefixis the used as the prefix for MediaPlaylist URIs. May be empty for relative URI from the playlist.
key_uridefines the key uri for "identity" and "com.apple.streamingkeydelivery" key formats. Ignored if the playlist is not encrypted or not using the above key formats.
output_diris the output directory of the playlists. May be empty to write to current directory.
master_playlist_nameis the name of the master playlist.
@@ -225,7 +232,7 @@ class 
shaka::hls::HlsNotifier.

-

Definition at line 425 of file simple_hls_notifier.cc.

+

Definition at line 435 of file simple_hls_notifier.cc.

@@ -254,7 +261,7 @@ class 
shaka::hls::HlsNotifier.

-

Definition at line 264 of file simple_hls_notifier.cc.

+

Definition at line 266 of file simple_hls_notifier.cc.

@@ -320,7 +327,7 @@ class 
shaka::hls::HlsNotifier.

-

Definition at line 368 of file simple_hls_notifier.cc.

+

Definition at line 370 of file simple_hls_notifier.cc.

@@ -393,7 +400,7 @@ class 
shaka::hls::HlsNotifier.

-

Definition at line 319 of file simple_hls_notifier.cc.

+

Definition at line 321 of file simple_hls_notifier.cc.

@@ -460,7 +467,7 @@ class 
shaka::hls::HlsNotifier.

-

Definition at line 268 of file simple_hls_notifier.cc.

+

Definition at line 270 of file simple_hls_notifier.cc.

@@ -471,7 +478,7 @@ class 
diff --git a/docs/d7/d6c/structshaka_1_1HlsParams-members.html b/docs/d7/d6c/structshaka_1_1HlsParams-members.html index 868bf6fc27..aaf244245c 100644 --- a/docs/d7/d6c/structshaka_1_1HlsParams-members.html +++ b/docs/d7/d6c/structshaka_1_1HlsParams-members.html @@ -94,13 +94,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');

This is the complete list of members for shaka::HlsParams, including all inherited members.

- - - + + + +
base_urlshaka::HlsParams
master_playlist_outputshaka::HlsParams
playlist_typeshaka::HlsParams
time_shift_buffer_depthshaka::HlsParams
key_urishaka::HlsParams
master_playlist_outputshaka::HlsParams
playlist_typeshaka::HlsParams
time_shift_buffer_depthshaka::HlsParams
diff --git a/docs/d7/d6d/classshaka_1_1media_1_1MediaSample.html b/docs/d7/d6d/classshaka_1_1media_1_1MediaSample.html index c7e309b4bf..b15652fc4b 100644 --- a/docs/d7/d6d/classshaka_1_1media_1_1MediaSample.html +++ b/docs/d7/d6d/classshaka_1_1media_1_1MediaSample.html @@ -485,7 +485,7 @@ Protected Member Functions
diff --git a/docs/d7/d78/structshaka_1_1media_1_1H264SEIMessage-members.html b/docs/d7/d78/structshaka_1_1media_1_1H264SEIMessage-members.html index 7a57250a7f..61e6e3119a 100644 --- a/docs/d7/d78/structshaka_1_1media_1_1H264SEIMessage-members.html +++ b/docs/d7/d78/structshaka_1_1media_1_1H264SEIMessage-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d79/chunking__handler_8h_source.html b/docs/d7/d79/chunking__handler_8h_source.html index a293657bba..a07187136e 100644 --- a/docs/d7/d79/chunking__handler_8h_source.html +++ b/docs/d7/d79/chunking__handler_8h_source.html @@ -97,86 +97,106 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
8 #define PACKAGER_MEDIA_CHUNKING_CHUNKING_HANDLER_
9 
10 #include <atomic>
-
11 
-
12 #include "packager/media/base/media_handler.h"
-
13 #include "packager/media/public/chunking_params.h"
-
14 
-
15 namespace shaka {
-
16 namespace media {
-
17 
-
44 class ChunkingHandler : public MediaHandler {
-
45  public:
-
46  explicit ChunkingHandler(const ChunkingParams& chunking_params);
-
47  ~ChunkingHandler() override;
-
48 
-
49  protected:
-
52  Status InitializeInternal() override;
-
53  Status Process(std::unique_ptr<StreamData> stream_data) override;
-
54  Status OnFlushRequest(size_t input_stream_index) override;
-
56 
-
57  private:
-
58  friend class ChunkingHandlerTest;
-
59 
-
60  ChunkingHandler(const ChunkingHandler&) = delete;
-
61  ChunkingHandler& operator=(const ChunkingHandler&) = delete;
-
62 
-
63  // Processes media sample and apply chunking if needed.
-
64  Status ProcessMediaSample(const MediaSample* sample);
-
65 
-
66  // Dispatch cached non main stream samples before |timestamp_threshold|.
-
67  Status DispatchNonMainSamples(int64_t timestamp_threshold);
-
68 
-
69  // The (sub)segments are aligned and dispatched together.
-
70  Status DispatchSegmentInfoForAllStreams();
-
71  Status DispatchSubsegmentInfoForAllStreams();
-
72 
-
73  const ChunkingParams chunking_params_;
+
11 #include <queue>
+
12 
+
13 #include "packager/base/logging.h"
+
14 #include "packager/media/base/media_handler.h"
+
15 #include "packager/media/public/chunking_params.h"
+
16 
+
17 namespace shaka {
+
18 namespace media {
+
19 
+
46 class ChunkingHandler : public MediaHandler {
+
47  public:
+
48  explicit ChunkingHandler(const ChunkingParams& chunking_params);
+
49  ~ChunkingHandler() override;
+
50 
+
51  protected:
+
54  Status InitializeInternal() override;
+
55  Status Process(std::unique_ptr<StreamData> stream_data) override;
+
56  Status OnFlushRequest(size_t input_stream_index) override;
+
58 
+
59  private:
+
60  friend class ChunkingHandlerTest;
+
61 
+
62  ChunkingHandler(const ChunkingHandler&) = delete;
+
63  ChunkingHandler& operator=(const ChunkingHandler&) = delete;
+
64 
+
65  // Processes media sample and apply chunking if needed.
+
66  Status ProcessMediaSample(const MediaSample* sample);
+
67 
+
68  // Dispatch cached non main stream samples before |timestamp_threshold|.
+
69  Status DispatchNonMainSamples(int64_t timestamp_threshold);
+
70 
+
71  // The (sub)segments are aligned and dispatched together.
+
72  Status DispatchSegmentInfoForAllStreams();
+
73  Status DispatchSubsegmentInfoForAllStreams();
74 
-
75  // The inputs are expected to come from the same thread.
-
76  std::atomic<int64_t> thread_id_;
-
77 
-
78  // The video stream is the main stream; if there is only one stream, it is the
-
79  // main stream. The chunking is based on the main stream.
-
80  const size_t kInvalidStreamIndex = static_cast<size_t>(-1);
-
81  size_t main_stream_index_ = kInvalidStreamIndex;
-
82  // Segment and subsegment duration in main stream's time scale.
-
83  int64_t segment_duration_ = 0;
-
84  int64_t subsegment_duration_ = 0;
-
85 
-
86  // The streams are expected to be synchronized. Cache non main (video) stream
-
87  // samples so we can determine whether the next segment should include these
-
88  // samples. The samples will be dispatched after seeing the next main stream
-
89  // sample.
-
90  std::deque<std::unique_ptr<StreamData>> non_main_samples_;
-
91 
-
92  // Current segment index, useful to determine where to do chunking.
-
93  int64_t current_segment_index_ = -1;
-
94  // Current subsegment index, useful to determine where to do chunking.
-
95  int64_t current_subsegment_index_ = -1;
-
96 
-
97  std::vector<std::shared_ptr<SegmentInfo>> segment_info_;
-
98  std::vector<std::shared_ptr<SegmentInfo>> subsegment_info_;
-
99  std::vector<uint32_t> time_scales_;
-
100  // The end timestamp of the last dispatched sample.
-
101  std::vector<int64_t> last_sample_end_timestamps_;
-
102 };
-
103 
-
104 } // namespace media
-
105 } // namespace shaka
-
106 
-
107 #endif // PACKAGER_MEDIA_CHUNKING_CHUNKING_HANDLER_
+
75  const ChunkingParams chunking_params_;
+
76 
+
77  // The inputs are expected to come from the same thread.
+
78  std::atomic<int64_t> thread_id_;
+
79 
+
80  // The video stream is the main stream; if there is only one stream, it is the
+
81  // main stream. The chunking is based on the main stream.
+
82  const size_t kInvalidStreamIndex = static_cast<size_t>(-1);
+
83  size_t main_stream_index_ = kInvalidStreamIndex;
+
84  // Segment and subsegment duration in main stream's time scale.
+
85  int64_t segment_duration_ = 0;
+
86  int64_t subsegment_duration_ = 0;
+
87 
+
88  // The streams are expected to be synchronized. Cache non main (video) stream
+
89  // samples so we can determine whether the next segment should include these
+
90  // samples. The samples will be dispatched after seeing the next main stream
+
91  // sample.
+
92  std::deque<std::unique_ptr<StreamData>> non_main_samples_;
+
93 
+
94  // Current segment index, useful to determine where to do chunking.
+
95  int64_t current_segment_index_ = -1;
+
96  // Current subsegment index, useful to determine where to do chunking.
+
97  int64_t current_subsegment_index_ = -1;
+
98 
+
99  std::vector<std::shared_ptr<SegmentInfo>> segment_info_;
+
100  std::vector<std::shared_ptr<SegmentInfo>> subsegment_info_;
+
101  std::vector<uint32_t> time_scales_;
+
102  // The end timestamp of the last dispatched sample.
+
103  std::vector<int64_t> last_sample_end_timestamps_;
+
104 
+
105  struct Scte35EventComparator {
+
106  bool operator()(const std::shared_ptr<StreamData>& lhs,
+
107  const std::shared_ptr<StreamData>& rhs) const {
+
108  DCHECK(lhs);
+
109  DCHECK(rhs);
+
110  DCHECK(lhs->scte35_event);
+
111  return lhs->scte35_event->start_time > rhs->scte35_event->start_time;
+
112  }
+
113  };
+
114 
+
115  // Captures all incoming SCTE35 events to identify chunking points. Events
+
116  // will be removed from this queue one at a time as soon as the correct
+
117  // chunking point is identified in the incoming samples.
+
118  std::priority_queue<std::shared_ptr<StreamData>,
+
119  std::vector<std::shared_ptr<StreamData>>,
+
120  Scte35EventComparator>
+
121  scte35_events_;
+
122 };
+
123 
+
124 } // namespace media
+
125 } // namespace shaka
+
126 
+
127 #endif // PACKAGER_MEDIA_CHUNKING_CHUNKING_HANDLER_
Status Process(std::unique_ptr< StreamData > stream_data) override
Status InitializeInternal() override
- + -
Status OnFlushRequest(size_t input_stream_index) override
Event handler for flush request at the specific input stream index.
+
Status OnFlushRequest(size_t input_stream_index) override
Event handler for flush request at the specific input stream index.
Chunking (segmentation) related parameters.
Class to hold a media sample.
Definition: media_sample.h:22
- + diff --git a/docs/d7/d7c/vlog__flags_8h_source.html b/docs/d7/d7c/vlog__flags_8h_source.html index c5150589c2..4a6f3e307d 100644 --- a/docs/d7/d7c/vlog__flags_8h_source.html +++ b/docs/d7/d7c/vlog__flags_8h_source.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d87/video__stream__info_8h_source.html b/docs/d7/d87/video__stream__info_8h_source.html index 9b8cd279da..5a46dbc5ee 100644 --- a/docs/d7/d87/video__stream__info_8h_source.html +++ b/docs/d7/d87/video__stream__info_8h_source.html @@ -212,7 +212,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d9c/structshaka_1_1media_1_1H265SliceHeader_1_1LongTermPicsInfo.html b/docs/d7/d9c/structshaka_1_1media_1_1H265SliceHeader_1_1LongTermPicsInfo.html index 0b47113c96..f3bb954d58 100644 --- a/docs/d7/d9c/structshaka_1_1media_1_1H265SliceHeader_1_1LongTermPicsInfo.html +++ b/docs/d7/d9c/structshaka_1_1media_1_1H265SliceHeader_1_1LongTermPicsInfo.html @@ -112,7 +112,7 @@ int delta_poc_msb_cycle_lt diff --git a/docs/d7/d9d/progress__listener_8h_source.html b/docs/d7/d9d/progress__listener_8h_source.html index aa948d2dfc..4d8b5fd108 100644 --- a/docs/d7/d9d/progress__listener_8h_source.html +++ b/docs/d7/d9d/progress__listener_8h_source.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/da4/track__run__iterator_8h_source.html b/docs/d7/da4/track__run__iterator_8h_source.html index fc28fca3a4..e982446273 100644 --- a/docs/d7/da4/track__run__iterator_8h_source.html +++ b/docs/d7/da4/track__run__iterator_8h_source.html @@ -175,27 +175,27 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
126 
127 #endif // MEDIA_FORMATS_MP4_TRACK_RUN_ITERATOR_H_
-
const VideoSampleEntry & video_description() const
Only valid if is_video() is true.
+
const VideoSampleEntry & video_description() const
Only valid if is_video() is true.
- - + + - + -
std::unique_ptr< DecryptConfig > GetDecryptConfig()
+
std::unique_ptr< DecryptConfig > GetDecryptConfig()
-
const AudioSampleEntry & audio_description() const
Only valid if is_audio() is true.
- - +
const AudioSampleEntry & audio_description() const
Only valid if is_audio() is true.
+ + - -
bool CacheAuxInfo(const uint8_t *buf, int size)
+ +
bool CacheAuxInfo(const uint8_t *buf, int size)
diff --git a/docs/d7/dad/simple__hls__notifier_8cc_source.html b/docs/d7/dad/simple__hls__notifier_8cc_source.html index 6700e4c04e..758d4b9e53 100644 --- a/docs/d7/dad/simple__hls__notifier_8cc_source.html +++ b/docs/d7/dad/simple__hls__notifier_8cc_source.html @@ -336,215 +336,225 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
247  type, time_shift_buffer_depth, file_name, name, group_id));
248 }
249 
- +
251  double time_shift_buffer_depth,
252  const std::string& prefix,
-
253  const std::string& output_dir,
-
254  const std::string& master_playlist_name)
-
255  : HlsNotifier(playlist_type),
-
256  time_shift_buffer_depth_(time_shift_buffer_depth),
-
257  prefix_(prefix),
-
258  output_dir_(output_dir),
-
259  media_playlist_factory_(new MediaPlaylistFactory()),
-
260  master_playlist_(new MasterPlaylist(master_playlist_name)) {}
-
261 
-
262 SimpleHlsNotifier::~SimpleHlsNotifier() {}
+
253  const std::string& key_uri,
+
254  const std::string& output_dir,
+
255  const std::string& master_playlist_name)
+
256  : HlsNotifier(playlist_type),
+
257  time_shift_buffer_depth_(time_shift_buffer_depth),
+
258  prefix_(prefix),
+
259  key_uri_(key_uri),
+
260  output_dir_(output_dir),
+
261  media_playlist_factory_(new MediaPlaylistFactory()),
+
262  master_playlist_(new MasterPlaylist(master_playlist_name)) {}
263 
- -
265  return true;
-
266 }
-
267 
-
268 bool SimpleHlsNotifier::NotifyNewStream(const MediaInfo& media_info,
-
269  const std::string& playlist_name,
-
270  const std::string& name,
-
271  const std::string& group_id,
-
272  uint32_t* stream_id) {
-
273  DCHECK(stream_id);
-
274 
-
275  std::unique_ptr<MediaPlaylist> media_playlist =
-
276  media_playlist_factory_->Create(playlist_type(), time_shift_buffer_depth_,
-
277  playlist_name, name, group_id);
-
278 
-
279  // Update init_segment_name to be relative to playlist path if needed.
-
280  MediaInfo media_info_copy = media_info;
-
281  if (media_info_copy.has_init_segment_name()) {
-
282  media_info_copy.set_init_segment_name(
-
283  GenerateSegmentUrl(media_info_copy.init_segment_name(), prefix_,
-
284  output_dir_, media_playlist->file_name()));
-
285  }
-
286  if (media_info_copy.has_media_file_name()) {
-
287  media_info_copy.set_media_file_name(
-
288  GenerateSegmentUrl(media_info_copy.media_file_name(), prefix_,
-
289  output_dir_, media_playlist->file_name()));
-
290  }
-
291  if (!media_playlist->SetMediaInfo(media_info_copy)) {
-
292  LOG(ERROR) << "Failed to set media info for playlist " << playlist_name;
-
293  return false;
-
294  }
-
295 
-
296  MediaPlaylist::EncryptionMethod encryption_method =
-
297  MediaPlaylist::EncryptionMethod::kNone;
-
298  if (media_info.protected_content().has_protection_scheme()) {
-
299  const std::string& protection_scheme =
-
300  media_info.protected_content().protection_scheme();
-
301  base::Optional<MediaPlaylist::EncryptionMethod> enc_method =
-
302  StringToEncryptionMethod(protection_scheme);
-
303  if (!enc_method) {
-
304  LOG(ERROR) << "Failed to recognize protection scheme "
-
305  << protection_scheme;
-
306  return false;
-
307  }
-
308  encryption_method = enc_method.value();
-
309  }
-
310 
-
311  *stream_id = sequence_number_.GetNext();
-
312  base::AutoLock auto_lock(lock_);
-
313  master_playlist_->AddMediaPlaylist(media_playlist.get());
-
314  stream_map_[*stream_id].reset(
-
315  new StreamEntry{std::move(media_playlist), encryption_method});
-
316  return true;
-
317 }
-
318 
-
319 bool SimpleHlsNotifier::NotifyNewSegment(uint32_t stream_id,
-
320  const std::string& segment_name,
-
321  uint64_t start_time,
-
322  uint64_t duration,
-
323  uint64_t start_byte_offset,
-
324  uint64_t size) {
-
325  base::AutoLock auto_lock(lock_);
-
326  auto stream_iterator = stream_map_.find(stream_id);
-
327  if (stream_iterator == stream_map_.end()) {
-
328  LOG(ERROR) << "Cannot find stream with ID: " << stream_id;
-
329  return false;
-
330  }
-
331  auto& media_playlist = stream_iterator->second->media_playlist;
-
332  const std::string& segment_url = GenerateSegmentUrl(
-
333  segment_name, prefix_, output_dir_, media_playlist->file_name());
-
334  media_playlist->AddSegment(segment_url, start_time, duration,
-
335  start_byte_offset, size);
-
336 
-
337  // Update target duration.
-
338  uint32_t longest_segment_duration =
-
339  static_cast<uint32_t>(ceil(media_playlist->GetLongestSegmentDuration()));
-
340  bool target_duration_updated = false;
-
341  if (longest_segment_duration > target_duration_) {
-
342  target_duration_ = longest_segment_duration;
-
343  target_duration_updated = true;
-
344  }
-
345 
-
346  // Update the playlists when there is new segments in live mode.
-
347  if (playlist_type() == HlsPlaylistType::kLive ||
-
348  playlist_type() == HlsPlaylistType::kEvent) {
-
349  if (!master_playlist_->WriteMasterPlaylist(prefix_, output_dir_)) {
-
350  LOG(ERROR) << "Failed to write master playlist.";
-
351  return false;
-
352  }
-
353  // Update all playlists if target duration is updated.
-
354  if (target_duration_updated) {
-
355  for (auto& streams : stream_map_) {
-
356  MediaPlaylist* playlist = streams.second->media_playlist.get();
-
357  playlist->SetTargetDuration(target_duration_);
-
358  if (!WriteMediaPlaylist(output_dir_, playlist))
-
359  return false;
-
360  }
-
361  } else {
-
362  return WriteMediaPlaylist(output_dir_, media_playlist.get());
-
363  }
-
364  }
-
365  return true;
-
366 }
-
367 
- -
369  uint32_t stream_id,
-
370  const std::vector<uint8_t>& key_id,
-
371  const std::vector<uint8_t>& system_id,
-
372  const std::vector<uint8_t>& iv,
-
373  const std::vector<uint8_t>& protection_system_specific_data) {
-
374  base::AutoLock auto_lock(lock_);
-
375  auto stream_iterator = stream_map_.find(stream_id);
-
376  if (stream_iterator == stream_map_.end()) {
-
377  LOG(ERROR) << "Cannot find stream with ID: " << stream_id;
-
378  return false;
-
379  }
-
380 
-
381  std::unique_ptr<MediaPlaylist>& media_playlist =
-
382  stream_iterator->second->media_playlist;
-
383  const MediaPlaylist::EncryptionMethod encryption_method =
-
384  stream_iterator->second->encryption_method;
-
385  LOG_IF(WARNING, encryption_method == MediaPlaylist::EncryptionMethod::kNone)
-
386  << "Got encryption notification but the encryption method is NONE";
-
387  if (IsWidevineSystemId(system_id)) {
-
388  return HandleWidevineKeyFormats(encryption_method,
-
389  key_id, iv, protection_system_specific_data,
-
390  media_playlist.get());
-
391  }
-
392  if (IsCommonSystemId(system_id)) {
-
393  // Use key_id as the key_uri. The player needs to have custom logic to
-
394  // convert it to the actual key url.
-
395  std::string key_uri_data = VectorToString(key_id);
-
396  std::string key_uri_data_base64 =
-
397  Base64EncodeData(kUriBase64Prefix, key_uri_data);
-
398  NotifyEncryptionToMediaPlaylist(encryption_method,
-
399  key_uri_data_base64, std::vector<uint8_t>(),
-
400  iv, "identity", "", media_playlist.get());
-
401  return true;
-
402  }
-
403 
-
404  if (IsFairplaySystemId(system_id)) {
-
405  // Use key_id as the key_uri. The player needs to have custom logic to
-
406  // convert it to the actual key url.
-
407  std::string key_uri_data = VectorToString(key_id);
-
408  std::string key_uri_data_base64 =
-
409  Base64EncodeData(kUriFairplayPrefix, key_uri_data);
-
410 
-
411  // Fairplay defines IV to be carried with the key, not the playlist.
-
412  NotifyEncryptionToMediaPlaylist(encryption_method,
-
413  key_uri_data_base64, std::vector<uint8_t>(),
-
414  std::vector<uint8_t>(),
-
415  "com.apple.streamingkeydelivery", "1",
-
416  media_playlist.get());
-
417  return true;
-
418  }
-
419 
-
420  LOG(ERROR) << "Unknown system ID: "
-
421  << base::HexEncode(system_id.data(), system_id.size());
-
422  return false;
-
423 }
-
424 
- -
426  base::AutoLock auto_lock(lock_);
-
427  if (!master_playlist_->WriteMasterPlaylist(prefix_, output_dir_)) {
-
428  LOG(ERROR) << "Failed to write master playlist.";
-
429  return false;
-
430  }
-
431  for (auto& streams : stream_map_) {
-
432  MediaPlaylist* playlist = streams.second->media_playlist.get();
-
433  playlist->SetTargetDuration(target_duration_);
-
434  if (!WriteMediaPlaylist(output_dir_, playlist))
-
435  return false;
-
436  }
-
437  return true;
-
438 }
-
439 
-
440 } // namespace hls
-
441 } // namespace shaka
-
SimpleHlsNotifier(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &prefix, const std::string &output_dir, const std::string &master_playlist_name)
+
264 SimpleHlsNotifier::~SimpleHlsNotifier() {}
+
265 
+ +
267  return true;
+
268 }
+
269 
+
270 bool SimpleHlsNotifier::NotifyNewStream(const MediaInfo& media_info,
+
271  const std::string& playlist_name,
+
272  const std::string& name,
+
273  const std::string& group_id,
+
274  uint32_t* stream_id) {
+
275  DCHECK(stream_id);
+
276 
+
277  std::unique_ptr<MediaPlaylist> media_playlist =
+
278  media_playlist_factory_->Create(playlist_type(), time_shift_buffer_depth_,
+
279  playlist_name, name, group_id);
+
280 
+
281  // Update init_segment_name to be relative to playlist path if needed.
+
282  MediaInfo media_info_copy = media_info;
+
283  if (media_info_copy.has_init_segment_name()) {
+
284  media_info_copy.set_init_segment_name(
+
285  GenerateSegmentUrl(media_info_copy.init_segment_name(), prefix_,
+
286  output_dir_, media_playlist->file_name()));
+
287  }
+
288  if (media_info_copy.has_media_file_name()) {
+
289  media_info_copy.set_media_file_name(
+
290  GenerateSegmentUrl(media_info_copy.media_file_name(), prefix_,
+
291  output_dir_, media_playlist->file_name()));
+
292  }
+
293  if (!media_playlist->SetMediaInfo(media_info_copy)) {
+
294  LOG(ERROR) << "Failed to set media info for playlist " << playlist_name;
+
295  return false;
+
296  }
+
297 
+
298  MediaPlaylist::EncryptionMethod encryption_method =
+
299  MediaPlaylist::EncryptionMethod::kNone;
+
300  if (media_info.protected_content().has_protection_scheme()) {
+
301  const std::string& protection_scheme =
+
302  media_info.protected_content().protection_scheme();
+
303  base::Optional<MediaPlaylist::EncryptionMethod> enc_method =
+
304  StringToEncryptionMethod(protection_scheme);
+
305  if (!enc_method) {
+
306  LOG(ERROR) << "Failed to recognize protection scheme "
+
307  << protection_scheme;
+
308  return false;
+
309  }
+
310  encryption_method = enc_method.value();
+
311  }
+
312 
+
313  *stream_id = sequence_number_.GetNext();
+
314  base::AutoLock auto_lock(lock_);
+
315  master_playlist_->AddMediaPlaylist(media_playlist.get());
+
316  stream_map_[*stream_id].reset(
+
317  new StreamEntry{std::move(media_playlist), encryption_method});
+
318  return true;
+
319 }
+
320 
+
321 bool SimpleHlsNotifier::NotifyNewSegment(uint32_t stream_id,
+
322  const std::string& segment_name,
+
323  uint64_t start_time,
+
324  uint64_t duration,
+
325  uint64_t start_byte_offset,
+
326  uint64_t size) {
+
327  base::AutoLock auto_lock(lock_);
+
328  auto stream_iterator = stream_map_.find(stream_id);
+
329  if (stream_iterator == stream_map_.end()) {
+
330  LOG(ERROR) << "Cannot find stream with ID: " << stream_id;
+
331  return false;
+
332  }
+
333  auto& media_playlist = stream_iterator->second->media_playlist;
+
334  const std::string& segment_url = GenerateSegmentUrl(
+
335  segment_name, prefix_, output_dir_, media_playlist->file_name());
+
336  media_playlist->AddSegment(segment_url, start_time, duration,
+
337  start_byte_offset, size);
+
338 
+
339  // Update target duration.
+
340  uint32_t longest_segment_duration =
+
341  static_cast<uint32_t>(ceil(media_playlist->GetLongestSegmentDuration()));
+
342  bool target_duration_updated = false;
+
343  if (longest_segment_duration > target_duration_) {
+
344  target_duration_ = longest_segment_duration;
+
345  target_duration_updated = true;
+
346  }
+
347 
+
348  // Update the playlists when there is new segments in live mode.
+
349  if (playlist_type() == HlsPlaylistType::kLive ||
+
350  playlist_type() == HlsPlaylistType::kEvent) {
+
351  if (!master_playlist_->WriteMasterPlaylist(prefix_, output_dir_)) {
+
352  LOG(ERROR) << "Failed to write master playlist.";
+
353  return false;
+
354  }
+
355  // Update all playlists if target duration is updated.
+
356  if (target_duration_updated) {
+
357  for (auto& streams : stream_map_) {
+
358  MediaPlaylist* playlist = streams.second->media_playlist.get();
+
359  playlist->SetTargetDuration(target_duration_);
+
360  if (!WriteMediaPlaylist(output_dir_, playlist))
+
361  return false;
+
362  }
+
363  } else {
+
364  return WriteMediaPlaylist(output_dir_, media_playlist.get());
+
365  }
+
366  }
+
367  return true;
+
368 }
+
369 
+ +
371  uint32_t stream_id,
+
372  const std::vector<uint8_t>& key_id,
+
373  const std::vector<uint8_t>& system_id,
+
374  const std::vector<uint8_t>& iv,
+
375  const std::vector<uint8_t>& protection_system_specific_data) {
+
376  base::AutoLock auto_lock(lock_);
+
377  auto stream_iterator = stream_map_.find(stream_id);
+
378  if (stream_iterator == stream_map_.end()) {
+
379  LOG(ERROR) << "Cannot find stream with ID: " << stream_id;
+
380  return false;
+
381  }
+
382 
+
383  std::unique_ptr<MediaPlaylist>& media_playlist =
+
384  stream_iterator->second->media_playlist;
+
385  const MediaPlaylist::EncryptionMethod encryption_method =
+
386  stream_iterator->second->encryption_method;
+
387  LOG_IF(WARNING, encryption_method == MediaPlaylist::EncryptionMethod::kNone)
+
388  << "Got encryption notification but the encryption method is NONE";
+
389  if (IsWidevineSystemId(system_id)) {
+
390  return HandleWidevineKeyFormats(encryption_method,
+
391  key_id, iv, protection_system_specific_data,
+
392  media_playlist.get());
+
393  }
+
394 
+
395  // Key Id does not need to be specified with "identity" and "sdk".
+
396  const std::vector<uint8_t> empty_key_id;
+
397 
+
398  if (IsCommonSystemId(system_id)) {
+
399  std::string key_uri;
+
400  if (!key_uri_.empty()) {
+
401  key_uri = key_uri_;
+
402  } else {
+
403  // Use key_id as the key_uri. The player needs to have custom logic to
+
404  // convert it to the actual key uri.
+
405  std::string key_uri_data = VectorToString(key_id);
+
406  key_uri = Base64EncodeData(kUriBase64Prefix, key_uri_data);
+
407  }
+
408  NotifyEncryptionToMediaPlaylist(encryption_method, key_uri, empty_key_id,
+
409  iv, "identity", "", media_playlist.get());
+
410  return true;
+
411  } else if (IsFairplaySystemId(system_id)) {
+
412  std::string key_uri;
+
413  if (!key_uri_.empty()) {
+
414  key_uri = key_uri_;
+
415  } else {
+
416  // Use key_id as the key_uri. The player needs to have custom logic to
+
417  // convert it to the actual key uri.
+
418  std::string key_uri_data = VectorToString(key_id);
+
419  key_uri = Base64EncodeData(kUriFairplayPrefix, key_uri_data);
+
420  }
+
421 
+
422  // Fairplay defines IV to be carried with the key, not the playlist.
+
423  const std::vector<uint8_t> empty_iv;
+
424  NotifyEncryptionToMediaPlaylist(encryption_method, key_uri, empty_key_id,
+
425  empty_iv, "com.apple.streamingkeydelivery",
+
426  "1", media_playlist.get());
+
427  return true;
+
428  }
+
429 
+
430  LOG(ERROR) << "Unknown system ID: "
+
431  << base::HexEncode(system_id.data(), system_id.size());
+
432  return false;
+
433 }
+
434 
+ +
436  base::AutoLock auto_lock(lock_);
+
437  if (!master_playlist_->WriteMasterPlaylist(prefix_, output_dir_)) {
+
438  LOG(ERROR) << "Failed to write master playlist.";
+
439  return false;
+
440  }
+
441  for (auto& streams : stream_map_) {
+
442  MediaPlaylist* playlist = streams.second->media_playlist.get();
+
443  playlist->SetTargetDuration(target_duration_);
+
444  if (!WriteMediaPlaylist(output_dir_, playlist))
+
445  return false;
+
446  }
+
447  return true;
+
448 }
+
449 
+
450 } // namespace hls
+
451 } // namespace shaka
+
SimpleHlsNotifier(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &prefix, const std::string &key_uri, const std::string &output_dir, const std::string &master_playlist_name)
HlsPlaylistType
Definition: hls_params.h:16
-
bool NotifyNewSegment(uint32_t stream_id, const std::string &segment_name, uint64_t start_time, uint64_t duration, uint64_t start_byte_offset, uint64_t size) override
+
bool NotifyNewSegment(uint32_t stream_id, const std::string &segment_name, uint64_t start_time, uint64_t duration, uint64_t start_byte_offset, uint64_t size) override
virtual void SetTargetDuration(uint32_t target_duration)
- +
Methods are virtual for mocking.
HlsPlaylistType playlist_type() const
Definition: hls_notifier.h:80
-
bool NotifyNewStream(const MediaInfo &media_info, const std::string &playlist_name, const std::string &stream_name, const std::string &group_id, uint32_t *stream_id) override
- -
bool NotifyEncryptionUpdate(uint32_t stream_id, const std::vector< uint8_t > &key_id, const std::vector< uint8_t > &system_id, const std::vector< uint8_t > &iv, const std::vector< uint8_t > &protection_system_specific_data) override
+
bool NotifyNewStream(const MediaInfo &media_info, const std::string &playlist_name, const std::string &stream_name, const std::string &group_id, uint32_t *stream_id) override
+ +
bool NotifyEncryptionUpdate(uint32_t stream_id, const std::vector< uint8_t > &key_id, const std::vector< uint8_t > &system_id, const std::vector< uint8_t > &iv, const std::vector< uint8_t > &protection_system_specific_data) override
diff --git a/docs/d7/dae/structshaka_1_1media_1_1mp4_1_1MediaData.html b/docs/d7/dae/structshaka_1_1media_1_1mp4_1_1MediaData.html index e73cd1a912..7dacabb3ec 100644 --- a/docs/d7/dae/structshaka_1_1media_1_1mp4_1_1MediaData.html +++ b/docs/d7/dae/structshaka_1_1media_1_1mp4_1_1MediaData.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d7/db0/mpd__writer_8h_source.html b/docs/d7/db0/mpd__writer_8h_source.html index 4bb3a09599..1f248f9152 100644 --- a/docs/d7/db0/mpd__writer_8h_source.html +++ b/docs/d7/db0/mpd__writer_8h_source.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/db7/structshaka_1_1media_1_1mp4_1_1SampleToChunk-members.html b/docs/d7/db7/structshaka_1_1media_1_1mp4_1_1SampleToChunk-members.html index 5ff99a3577..48a820df5c 100644 --- a/docs/d7/db7/structshaka_1_1media_1_1mp4_1_1SampleToChunk-members.html +++ b/docs/d7/db7/structshaka_1_1media_1_1mp4_1_1SampleToChunk-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dbd/classshaka_1_1LocalFile.html b/docs/d7/dbd/classshaka_1_1LocalFile.html index e0b68ab36a..043f9bf309 100644 --- a/docs/d7/dbd/classshaka_1_1LocalFile.html +++ b/docs/d7/dbd/classshaka_1_1LocalFile.html @@ -510,7 +510,7 @@ bool  diff --git a/docs/d7/dc3/structshaka_1_1media_1_1mp4_1_1TextSampleEntry.html b/docs/d7/dc3/structshaka_1_1media_1_1mp4_1_1TextSampleEntry.html index 79b9f9572b..a8b3131fc8 100644 --- a/docs/d7/dc3/structshaka_1_1media_1_1mp4_1_1TextSampleEntry.html +++ b/docs/d7/dc3/structshaka_1_1media_1_1mp4_1_1TextSampleEntry.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d7/dc6/byte__queue_8h_source.html b/docs/d7/dc6/byte__queue_8h_source.html index cb2a8c3ca8..1976a13939 100644 --- a/docs/d7/dc6/byte__queue_8h_source.html +++ b/docs/d7/dc6/byte__queue_8h_source.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dd0/mpd__notifier__util_8h_source.html b/docs/d7/dd0/mpd__notifier__util_8h_source.html index 17a5b52f16..4cb7ef616a 100644 --- a/docs/d7/dd0/mpd__notifier__util_8h_source.html +++ b/docs/d7/dd0/mpd__notifier__util_8h_source.html @@ -128,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dd4/request__signer_8h_source.html b/docs/d7/dd4/request__signer_8h_source.html index e19ecb5150..fd332a98b2 100644 --- a/docs/d7/dd4/request__signer_8h_source.html +++ b/docs/d7/dd4/request__signer_8h_source.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html b/docs/d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html index 6e003fec8a..e73eabf079 100644 --- a/docs/d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html +++ b/docs/d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html @@ -286,7 +286,7 @@ std::shared_ptr< diff --git a/docs/d7/dd6/key__source_8cc_source.html b/docs/d7/dd6/key__source_8cc_source.html index 6b35748796..e8cfde3fc4 100644 --- a/docs/d7/dd6/key__source_8cc_source.html +++ b/docs/d7/dd6/key__source_8cc_source.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dda/classshaka_1_1media_1_1ByteQueue.html b/docs/d7/dda/classshaka_1_1media_1_1ByteQueue.html index 1444eccb31..7de2c25f0b 100644 --- a/docs/d7/dda/classshaka_1_1media_1_1ByteQueue.html +++ b/docs/d7/dda/classshaka_1_1media_1_1ByteQueue.html @@ -177,7 +177,7 @@ void  diff --git a/docs/d7/ddd/classshaka_1_1media_1_1RsaRequestSigner.html b/docs/d7/ddd/classshaka_1_1media_1_1RsaRequestSigner.html index 3bb4b35852..8da37d15da 100644 --- a/docs/d7/ddd/classshaka_1_1media_1_1RsaRequestSigner.html +++ b/docs/d7/ddd/classshaka_1_1media_1_1RsaRequestSigner.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html b/docs/d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html index 95b7179b6a..2f728555fd 100644 --- a/docs/d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html +++ b/docs/d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html @@ -399,7 +399,7 @@ KeyFetcher implementation overrides. diff --git a/docs/d7/de0/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry.html b/docs/d7/de0/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry.html index a2d8befdfa..060d351d5e 100644 --- a/docs/d7/de0/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry.html +++ b/docs/d7/de0/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry.html @@ -120,7 +120,7 @@ uint32_t group_description diff --git a/docs/d7/dec/h264__byte__to__unit__stream__converter_8h_source.html b/docs/d7/dec/h264__byte__to__unit__stream__converter_8h_source.html index c74520b1db..ca5b385a7b 100644 --- a/docs/d7/dec/h264__byte__to__unit__stream__converter_8h_source.html +++ b/docs/d7/dec/h264__byte__to__unit__stream__converter_8h_source.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dee/mpd__generator_8cc_source.html b/docs/d7/dee/mpd__generator_8cc_source.html index f320b3e01e..f77462d04d 100644 --- a/docs/d7/dee/mpd__generator_8cc_source.html +++ b/docs/d7/dee/mpd__generator_8cc_source.html @@ -231,7 +231,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/def/mp4__media__parser_8cc_source.html b/docs/d7/def/mp4__media__parser_8cc_source.html index 7f5fbfa5f9..1a38789a1e 100644 --- a/docs/d7/def/mp4__media__parser_8cc_source.html +++ b/docs/d7/def/mp4__media__parser_8cc_source.html @@ -346,543 +346,553 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
257  return false;
258 
259  if (reader->type() == FOURCC_mdat) {
-
260  // The code ends up here only if a MOOV box is not yet seen.
-
261  DCHECK(!moov_);
-
262 
-
263  NOTIMPLEMENTED() << " Files with MDAT before MOOV is not supported yet.";
-
264  *err = true;
-
265  return false;
-
266  }
-
267 
-
268  // Set up mdat offset for ReadMDATsUntil().
-
269  mdat_tail_ = queue_.head() + reader->size();
-
270 
-
271  if (reader->type() == FOURCC_moov) {
-
272  *err = !ParseMoov(reader.get());
-
273  } else if (reader->type() == FOURCC_moof) {
-
274  moof_head_ = queue_.head();
-
275  *err = !ParseMoof(reader.get());
-
276 
-
277  // Return early to avoid evicting 'moof' data from queue. Auxiliary info may
-
278  // be located anywhere in the file, including inside the 'moof' itself.
-
279  // (Since 'default-base-is-moof' is mandated, no data references can come
-
280  // before the head of the 'moof', so keeping this box around is sufficient.)
-
281  return !(*err);
-
282  } else {
-
283  VLOG(2) << "Skipping top-level box: " << FourCCToString(reader->type());
-
284  }
-
285 
-
286  queue_.Pop(static_cast<int>(reader->size()));
-
287  return !(*err);
-
288 }
-
289 
-
290 bool MP4MediaParser::ParseMoov(BoxReader* reader) {
-
291  if (moov_)
-
292  return true; // Already parsed the 'moov' box.
-
293 
-
294  moov_.reset(new Movie);
-
295  RCHECK(moov_->Parse(reader));
-
296  runs_.reset();
-
297 
-
298  std::vector<std::shared_ptr<StreamInfo>> streams;
+
260  if (!moov_) {
+
261  // For seekable files, we seek to the 'moov' and load the 'moov' first
+
262  // then seek back (see LoadMoov function for details); we do not support
+
263  // having 'mdat' before 'moov' for non-seekable files. The code ends up
+
264  // here only if it is a non-seekable file.
+
265  NOTIMPLEMENTED() << " Non-seekable Files with 'mdat' box before 'moov' "
+
266  "box is not supported.";
+
267  *err = true;
+
268  return false;
+
269  } else {
+
270  // This can happen if there are unused 'mdat' boxes, which is unusual
+
271  // but allowed by the spec. Ignore the 'mdat' and proceed.
+
272  LOG(INFO)
+
273  << "Ignore unused 'mdat' box - this could be as a result of extra "
+
274  "not usable 'mdat' or 'mdat' associated with unrecognized track.";
+
275  }
+
276  }
+
277 
+
278  // Set up mdat offset for ReadMDATsUntil().
+
279  mdat_tail_ = queue_.head() + reader->size();
+
280 
+
281  if (reader->type() == FOURCC_moov) {
+
282  *err = !ParseMoov(reader.get());
+
283  } else if (reader->type() == FOURCC_moof) {
+
284  moof_head_ = queue_.head();
+
285  *err = !ParseMoof(reader.get());
+
286 
+
287  // Return early to avoid evicting 'moof' data from queue. Auxiliary info may
+
288  // be located anywhere in the file, including inside the 'moof' itself.
+
289  // (Since 'default-base-is-moof' is mandated, no data references can come
+
290  // before the head of the 'moof', so keeping this box around is sufficient.)
+
291  return !(*err);
+
292  } else {
+
293  VLOG(2) << "Skipping top-level box: " << FourCCToString(reader->type());
+
294  }
+
295 
+
296  queue_.Pop(static_cast<int>(reader->size()));
+
297  return !(*err);
+
298 }
299 
-
300  for (std::vector<Track>::const_iterator track = moov_->tracks.begin();
-
301  track != moov_->tracks.end(); ++track) {
-
302  const uint32_t timescale = track->media.header.timescale;
+
300 bool MP4MediaParser::ParseMoov(BoxReader* reader) {
+
301  if (moov_)
+
302  return true; // Already parsed the 'moov' box.
303 
-
304  // Calculate duration (based on timescale).
-
305  uint64_t duration = 0;
-
306  if (track->media.header.duration > 0) {
-
307  duration = track->media.header.duration;
-
308  } else if (moov_->extends.header.fragment_duration > 0) {
-
309  DCHECK(moov_->header.timescale != 0);
-
310  duration = Rescale(moov_->extends.header.fragment_duration,
-
311  moov_->header.timescale,
-
312  timescale);
-
313  } else if (moov_->header.duration > 0 &&
-
314  moov_->header.duration != std::numeric_limits<uint64_t>::max()) {
-
315  DCHECK(moov_->header.timescale != 0);
-
316  duration =
-
317  Rescale(moov_->header.duration, moov_->header.timescale, timescale);
-
318  }
-
319 
-
320  const SampleDescription& samp_descr =
-
321  track->media.information.sample_table.description;
-
322 
-
323  size_t desc_idx = 0;
-
324 
-
325  // Read sample description index from mvex if it exists otherwise read
-
326  // from the first entry in Sample To Chunk box.
-
327  if (moov_->extends.tracks.size() > 0) {
-
328  for (size_t t = 0; t < moov_->extends.tracks.size(); t++) {
-
329  const TrackExtends& trex = moov_->extends.tracks[t];
-
330  if (trex.track_id == track->header.track_id) {
-
331  desc_idx = trex.default_sample_description_index;
-
332  break;
-
333  }
-
334  }
-
335  } else {
-
336  const std::vector<ChunkInfo>& chunk_info =
-
337  track->media.information.sample_table.sample_to_chunk.chunk_info;
-
338  RCHECK(chunk_info.size() > 0);
-
339  desc_idx = chunk_info[0].sample_description_index;
-
340  }
-
341  RCHECK(desc_idx > 0);
-
342  desc_idx -= 1; // BMFF descriptor index is one-based
-
343 
-
344  if (samp_descr.type == kAudio) {
-
345  RCHECK(!samp_descr.audio_entries.empty());
-
346 
-
347  // It is not uncommon to find otherwise-valid files with incorrect sample
-
348  // description indices, so we fail gracefully in that case.
-
349  if (desc_idx >= samp_descr.audio_entries.size())
-
350  desc_idx = 0;
-
351 
-
352  const AudioSampleEntry& entry = samp_descr.audio_entries[desc_idx];
-
353  const FourCC actual_format = entry.GetActualFormat();
-
354  Codec codec = FourCCToCodec(actual_format);
-
355  uint8_t num_channels = 0;
-
356  uint32_t sampling_frequency = 0;
-
357  uint64_t codec_delay_ns = 0;
-
358  uint8_t audio_object_type = 0;
-
359  uint32_t max_bitrate = 0;
-
360  uint32_t avg_bitrate = 0;
-
361  std::vector<uint8_t> codec_config;
-
362 
-
363  switch (actual_format) {
-
364  case FOURCC_mp4a:
-
365  // Check if it is MPEG4 AAC defined in ISO 14496 Part 3 or
-
366  // supported MPEG2 AAC variants.
-
367  if (entry.esds.es_descriptor.IsAAC()) {
-
368  codec = kCodecAAC;
-
369  const AACAudioSpecificConfig& aac_audio_specific_config =
-
370  entry.esds.aac_audio_specific_config;
-
371  num_channels = aac_audio_specific_config.GetNumChannels();
-
372  sampling_frequency =
-
373  aac_audio_specific_config.GetSamplesPerSecond();
-
374  audio_object_type = aac_audio_specific_config.GetAudioObjectType();
-
375  codec_config = entry.esds.es_descriptor.decoder_specific_info();
-
376  break;
-
377  } else if (entry.esds.es_descriptor.IsDTS()) {
-
378  ObjectType audio_type = entry.esds.es_descriptor.object_type();
-
379  switch (audio_type) {
-
380  case kDTSC:
-
381  codec = kCodecDTSC;
-
382  break;
-
383  case kDTSE:
-
384  codec = kCodecDTSE;
-
385  break;
-
386  case kDTSH:
-
387  codec = kCodecDTSH;
-
388  break;
-
389  case kDTSL:
-
390  codec = kCodecDTSL;
-
391  break;
-
392  default:
-
393  LOG(ERROR) << "Unsupported audio type " << audio_type
-
394  << " in stsd box.";
-
395  return false;
-
396  }
-
397  num_channels = entry.channelcount;
-
398  // For dts audio in esds, current supported number of channels is 6
-
399  // as the only supported channel layout is 5.1.
-
400  if (num_channels != kDtsAudioNumChannels) {
-
401  LOG(ERROR) << "Unsupported channel count " << num_channels
-
402  << " for audio type " << audio_type << ".";
-
403  return false;
-
404  }
-
405  sampling_frequency = entry.samplerate;
-
406  max_bitrate = entry.esds.es_descriptor.max_bitrate();
-
407  avg_bitrate = entry.esds.es_descriptor.avg_bitrate();
-
408  } else {
-
409  LOG(ERROR) << "Unsupported audio format 0x" << std::hex
-
410  << actual_format << " in stsd box.";
-
411  return false;
-
412  }
-
413  break;
-
414  case FOURCC_dtsc:
-
415  FALLTHROUGH_INTENDED;
-
416  case FOURCC_dtsh:
-
417  FALLTHROUGH_INTENDED;
-
418  case FOURCC_dtsl:
-
419  FALLTHROUGH_INTENDED;
-
420  case FOURCC_dtse:
-
421  FALLTHROUGH_INTENDED;
-
422  case FOURCC_dtsm:
-
423  codec_config = entry.ddts.extra_data;
-
424  max_bitrate = entry.ddts.max_bitrate;
-
425  avg_bitrate = entry.ddts.avg_bitrate;
-
426  num_channels = entry.channelcount;
-
427  sampling_frequency = entry.samplerate;
-
428  break;
-
429  case FOURCC_ac_3:
-
430  codec_config = entry.dac3.data;
-
431  num_channels = entry.channelcount;
-
432  sampling_frequency = entry.samplerate;
-
433  break;
-
434  case FOURCC_ec_3:
-
435  codec_config = entry.dec3.data;
+
304  moov_.reset(new Movie);
+
305  RCHECK(moov_->Parse(reader));
+
306  runs_.reset();
+
307 
+
308  std::vector<std::shared_ptr<StreamInfo>> streams;
+
309 
+
310  for (std::vector<Track>::const_iterator track = moov_->tracks.begin();
+
311  track != moov_->tracks.end(); ++track) {
+
312  const uint32_t timescale = track->media.header.timescale;
+
313 
+
314  // Calculate duration (based on timescale).
+
315  uint64_t duration = 0;
+
316  if (track->media.header.duration > 0) {
+
317  duration = track->media.header.duration;
+
318  } else if (moov_->extends.header.fragment_duration > 0) {
+
319  DCHECK(moov_->header.timescale != 0);
+
320  duration = Rescale(moov_->extends.header.fragment_duration,
+
321  moov_->header.timescale,
+
322  timescale);
+
323  } else if (moov_->header.duration > 0 &&
+
324  moov_->header.duration != std::numeric_limits<uint64_t>::max()) {
+
325  DCHECK(moov_->header.timescale != 0);
+
326  duration =
+
327  Rescale(moov_->header.duration, moov_->header.timescale, timescale);
+
328  }
+
329 
+
330  const SampleDescription& samp_descr =
+
331  track->media.information.sample_table.description;
+
332 
+
333  size_t desc_idx = 0;
+
334 
+
335  // Read sample description index from mvex if it exists otherwise read
+
336  // from the first entry in Sample To Chunk box.
+
337  if (moov_->extends.tracks.size() > 0) {
+
338  for (size_t t = 0; t < moov_->extends.tracks.size(); t++) {
+
339  const TrackExtends& trex = moov_->extends.tracks[t];
+
340  if (trex.track_id == track->header.track_id) {
+
341  desc_idx = trex.default_sample_description_index;
+
342  break;
+
343  }
+
344  }
+
345  } else {
+
346  const std::vector<ChunkInfo>& chunk_info =
+
347  track->media.information.sample_table.sample_to_chunk.chunk_info;
+
348  RCHECK(chunk_info.size() > 0);
+
349  desc_idx = chunk_info[0].sample_description_index;
+
350  }
+
351  RCHECK(desc_idx > 0);
+
352  desc_idx -= 1; // BMFF descriptor index is one-based
+
353 
+
354  if (samp_descr.type == kAudio) {
+
355  RCHECK(!samp_descr.audio_entries.empty());
+
356 
+
357  // It is not uncommon to find otherwise-valid files with incorrect sample
+
358  // description indices, so we fail gracefully in that case.
+
359  if (desc_idx >= samp_descr.audio_entries.size())
+
360  desc_idx = 0;
+
361 
+
362  const AudioSampleEntry& entry = samp_descr.audio_entries[desc_idx];
+
363  const FourCC actual_format = entry.GetActualFormat();
+
364  Codec codec = FourCCToCodec(actual_format);
+
365  uint8_t num_channels = 0;
+
366  uint32_t sampling_frequency = 0;
+
367  uint64_t codec_delay_ns = 0;
+
368  uint8_t audio_object_type = 0;
+
369  uint32_t max_bitrate = 0;
+
370  uint32_t avg_bitrate = 0;
+
371  std::vector<uint8_t> codec_config;
+
372 
+
373  switch (actual_format) {
+
374  case FOURCC_mp4a:
+
375  // Check if it is MPEG4 AAC defined in ISO 14496 Part 3 or
+
376  // supported MPEG2 AAC variants.
+
377  if (entry.esds.es_descriptor.IsAAC()) {
+
378  codec = kCodecAAC;
+
379  const AACAudioSpecificConfig& aac_audio_specific_config =
+
380  entry.esds.aac_audio_specific_config;
+
381  num_channels = aac_audio_specific_config.GetNumChannels();
+
382  sampling_frequency =
+
383  aac_audio_specific_config.GetSamplesPerSecond();
+
384  audio_object_type = aac_audio_specific_config.GetAudioObjectType();
+
385  codec_config = entry.esds.es_descriptor.decoder_specific_info();
+
386  break;
+
387  } else if (entry.esds.es_descriptor.IsDTS()) {
+
388  ObjectType audio_type = entry.esds.es_descriptor.object_type();
+
389  switch (audio_type) {
+
390  case kDTSC:
+
391  codec = kCodecDTSC;
+
392  break;
+
393  case kDTSE:
+
394  codec = kCodecDTSE;
+
395  break;
+
396  case kDTSH:
+
397  codec = kCodecDTSH;
+
398  break;
+
399  case kDTSL:
+
400  codec = kCodecDTSL;
+
401  break;
+
402  default:
+
403  LOG(ERROR) << "Unsupported audio type " << audio_type
+
404  << " in stsd box.";
+
405  return false;
+
406  }
+
407  num_channels = entry.channelcount;
+
408  // For dts audio in esds, current supported number of channels is 6
+
409  // as the only supported channel layout is 5.1.
+
410  if (num_channels != kDtsAudioNumChannels) {
+
411  LOG(ERROR) << "Unsupported channel count " << num_channels
+
412  << " for audio type " << audio_type << ".";
+
413  return false;
+
414  }
+
415  sampling_frequency = entry.samplerate;
+
416  max_bitrate = entry.esds.es_descriptor.max_bitrate();
+
417  avg_bitrate = entry.esds.es_descriptor.avg_bitrate();
+
418  } else {
+
419  LOG(ERROR) << "Unsupported audio format 0x" << std::hex
+
420  << actual_format << " in stsd box.";
+
421  return false;
+
422  }
+
423  break;
+
424  case FOURCC_dtsc:
+
425  FALLTHROUGH_INTENDED;
+
426  case FOURCC_dtsh:
+
427  FALLTHROUGH_INTENDED;
+
428  case FOURCC_dtsl:
+
429  FALLTHROUGH_INTENDED;
+
430  case FOURCC_dtse:
+
431  FALLTHROUGH_INTENDED;
+
432  case FOURCC_dtsm:
+
433  codec_config = entry.ddts.extra_data;
+
434  max_bitrate = entry.ddts.max_bitrate;
+
435  avg_bitrate = entry.ddts.avg_bitrate;
436  num_channels = entry.channelcount;
437  sampling_frequency = entry.samplerate;
438  break;
-
439  case FOURCC_Opus:
-
440  codec_config = entry.dops.opus_identification_header;
+
439  case FOURCC_ac_3:
+
440  codec_config = entry.dac3.data;
441  num_channels = entry.channelcount;
442  sampling_frequency = entry.samplerate;
-
443  RCHECK(sampling_frequency != 0);
-
444  codec_delay_ns =
-
445  entry.dops.preskip * kNanosecondsPerSecond / sampling_frequency;
-
446  break;
-
447  default:
-
448  LOG(ERROR) << "Unsupported audio format 0x" << std::hex
-
449  << actual_format << " in stsd box.";
-
450  return false;
-
451  }
-
452 
-
453  // Extract possible seek preroll.
-
454  uint64_t seek_preroll_ns = 0;
-
455  for (const auto& sample_group_description :
-
456  track->media.information.sample_table.sample_group_descriptions) {
-
457  if (sample_group_description.grouping_type != FOURCC_roll)
-
458  continue;
-
459  const auto& audio_roll_recovery_entries =
-
460  sample_group_description.audio_roll_recovery_entries;
-
461  if (audio_roll_recovery_entries.size() != 1) {
-
462  LOG(WARNING) << "Unexpected number of entries in "
-
463  "SampleGroupDescription table with grouping type "
-
464  "'roll'.";
-
465  break;
-
466  }
-
467  const int16_t roll_distance_in_samples =
-
468  audio_roll_recovery_entries[0].roll_distance;
-
469  if (roll_distance_in_samples < 0) {
-
470  RCHECK(sampling_frequency != 0);
-
471  seek_preroll_ns = kNanosecondsPerSecond *
-
472  (-roll_distance_in_samples) / sampling_frequency;
-
473  } else {
-
474  LOG(WARNING)
-
475  << "Roll distance is supposed to be negative, but seeing "
-
476  << roll_distance_in_samples;
-
477  }
-
478  break;
-
479  }
-
480 
-
481  // The stream will be decrypted if a |decryptor_source_| is available.
-
482  const bool is_encrypted =
-
483  decryptor_source_
-
484  ? false
-
485  : entry.sinf.info.track_encryption.default_is_protected == 1;
-
486  DVLOG(1) << "is_audio_track_encrypted_: " << is_encrypted;
-
487  streams.emplace_back(new AudioStreamInfo(
-
488  track->header.track_id, timescale, duration, codec,
-
489  AudioStreamInfo::GetCodecString(codec, audio_object_type),
-
490  codec_config.data(), codec_config.size(), entry.samplesize,
-
491  num_channels, sampling_frequency, seek_preroll_ns, codec_delay_ns,
-
492  max_bitrate, avg_bitrate, track->media.header.language.code,
-
493  is_encrypted));
-
494  }
-
495 
-
496  if (samp_descr.type == kVideo) {
-
497  RCHECK(!samp_descr.video_entries.empty());
-
498  if (desc_idx >= samp_descr.video_entries.size())
-
499  desc_idx = 0;
-
500  const VideoSampleEntry& entry = samp_descr.video_entries[desc_idx];
-
501 
-
502  uint32_t coded_width = entry.width;
-
503  uint32_t coded_height = entry.height;
-
504  uint32_t pixel_width = entry.pixel_aspect.h_spacing;
-
505  uint32_t pixel_height = entry.pixel_aspect.v_spacing;
-
506  if (pixel_width == 0 && pixel_height == 0) {
-
507  pixel_width = 1;
-
508  pixel_height = 1;
-
509  }
-
510  std::string codec_string;
-
511  uint8_t nalu_length_size = 0;
-
512 
-
513  const FourCC actual_format = entry.GetActualFormat();
-
514  const Codec video_codec = FourCCToCodec(actual_format);
-
515  switch (actual_format) {
-
516  case FOURCC_avc1:
-
517  case FOURCC_avc3: {
-
518  AVCDecoderConfigurationRecord avc_config;
-
519  if (!avc_config.Parse(entry.codec_configuration.data)) {
-
520  LOG(ERROR) << "Failed to parse avcc.";
-
521  return false;
-
522  }
-
523  codec_string = avc_config.GetCodecString(actual_format);
-
524  nalu_length_size = avc_config.nalu_length_size();
-
525 
-
526  if (coded_width != avc_config.coded_width() ||
-
527  coded_height != avc_config.coded_height()) {
-
528  LOG(WARNING) << "Resolution in VisualSampleEntry (" << coded_width
-
529  << "," << coded_height
-
530  << ") does not match with resolution in "
-
531  "AVCDecoderConfigurationRecord ("
-
532  << avc_config.coded_width() << ","
-
533  << avc_config.coded_height()
-
534  << "). Use AVCDecoderConfigurationRecord.";
-
535  coded_width = avc_config.coded_width();
-
536  coded_height = avc_config.coded_height();
-
537  }
-
538 
-
539  if (pixel_width != avc_config.pixel_width() ||
-
540  pixel_height != avc_config.pixel_height()) {
-
541  LOG_IF(WARNING, pixel_width != 1 || pixel_height != 1)
-
542  << "Pixel aspect ratio in PASP box (" << pixel_width << ","
-
543  << pixel_height
-
544  << ") does not match with SAR in AVCDecoderConfigurationRecord "
-
545  "("
-
546  << avc_config.pixel_width() << "," << avc_config.pixel_height()
-
547  << "). Use AVCDecoderConfigurationRecord.";
-
548  pixel_width = avc_config.pixel_width();
-
549  pixel_height = avc_config.pixel_height();
-
550  }
-
551  break;
-
552  }
-
553  case FOURCC_hev1:
-
554  case FOURCC_hvc1: {
-
555  HEVCDecoderConfigurationRecord hevc_config;
-
556  if (!hevc_config.Parse(entry.codec_configuration.data)) {
-
557  LOG(ERROR) << "Failed to parse hevc.";
-
558  return false;
-
559  }
-
560  codec_string = hevc_config.GetCodecString(actual_format);
-
561  nalu_length_size = hevc_config.nalu_length_size();
-
562  break;
-
563  }
-
564  case FOURCC_vp08:
-
565  case FOURCC_vp09:
-
566  case FOURCC_vp10: {
-
567  VPCodecConfigurationRecord vp_config;
-
568  if (!vp_config.ParseMP4(entry.codec_configuration.data)) {
-
569  LOG(ERROR) << "Failed to parse vpcc.";
-
570  return false;
-
571  }
-
572  codec_string = vp_config.GetCodecString(video_codec);
-
573  break;
-
574  }
-
575  default:
-
576  LOG(ERROR) << "Unsupported video format "
-
577  << FourCCToString(actual_format) << " in stsd box.";
-
578  return false;
-
579  }
-
580 
-
581  // The stream will be decrypted if a |decryptor_source_| is available.
-
582  const bool is_encrypted =
-
583  decryptor_source_
-
584  ? false
-
585  : entry.sinf.info.track_encryption.default_is_protected == 1;
-
586  DVLOG(1) << "is_video_track_encrypted_: " << is_encrypted;
-
587  std::shared_ptr<VideoStreamInfo> video_stream_info(new VideoStreamInfo(
-
588  track->header.track_id, timescale, duration, video_codec,
-
589  GetH26xStreamFormat(actual_format), codec_string,
-
590  entry.codec_configuration.data.data(),
-
591  entry.codec_configuration.data.size(), coded_width, coded_height,
-
592  pixel_width, pixel_height,
-
593  0, // trick_play_factor
-
594  nalu_length_size, track->media.header.language.code, is_encrypted));
-
595 
-
596  // Set pssh raw data if it has.
-
597  if (moov_->pssh.size() > 0) {
-
598  std::vector<uint8_t> pssh_raw_data;
-
599  for (const auto& pssh : moov_->pssh) {
-
600  pssh_raw_data.insert(pssh_raw_data.end(), pssh.raw_box.begin(),
-
601  pssh.raw_box.end());
-
602  }
-
603  video_stream_info->set_eme_init_data(pssh_raw_data.data(),
-
604  pssh_raw_data.size());
-
605  }
-
606 
-
607  streams.push_back(video_stream_info);
-
608  }
-
609  }
-
610 
-
611  init_cb_.Run(streams);
-
612  if (!FetchKeysIfNecessary(moov_->pssh))
-
613  return false;
-
614  runs_.reset(new TrackRunIterator(moov_.get()));
-
615  RCHECK(runs_->Init());
-
616  ChangeState(kEmittingSamples);
-
617  return true;
-
618 }
-
619 
-
620 bool MP4MediaParser::ParseMoof(BoxReader* reader) {
-
621  // Must already have initialization segment.
-
622  RCHECK(moov_.get());
-
623  MovieFragment moof;
-
624  RCHECK(moof.Parse(reader));
-
625  if (!runs_)
-
626  runs_.reset(new TrackRunIterator(moov_.get()));
-
627  RCHECK(runs_->Init(moof));
-
628  if (!FetchKeysIfNecessary(moof.pssh))
-
629  return false;
-
630  ChangeState(kEmittingSamples);
-
631  return true;
-
632 }
-
633 
-
634 bool MP4MediaParser::FetchKeysIfNecessary(
-
635  const std::vector<ProtectionSystemSpecificHeader>& headers) {
-
636  if (headers.empty())
-
637  return true;
-
638 
-
639  // An error will be returned later if the samples need to be decrypted.
-
640  if (!decryption_key_source_)
-
641  return true;
-
642 
-
643  std::vector<uint8_t> pssh_raw_data;
-
644  for (const auto& header : headers) {
-
645  pssh_raw_data.insert(pssh_raw_data.end(), header.raw_box.begin(),
-
646  header.raw_box.end());
-
647  }
-
648  Status status =
-
649  decryption_key_source_->FetchKeys(EmeInitDataType::CENC, pssh_raw_data);
-
650  if (!status.ok()) {
-
651  LOG(ERROR) << "Error fetching decryption keys: " << status;
-
652  return false;
-
653  }
-
654  return true;
-
655 }
-
656 
-
657 bool MP4MediaParser::EnqueueSample(bool* err) {
-
658  if (!runs_->IsRunValid()) {
-
659  // Remain in kEnqueueingSamples state, discarding data, until the end of
-
660  // the current 'mdat' box has been appended to the queue.
-
661  if (!queue_.Trim(mdat_tail_))
-
662  return false;
-
663 
-
664  ChangeState(kParsingBoxes);
-
665  return true;
-
666  }
-
667 
-
668  if (!runs_->IsSampleValid()) {
-
669  runs_->AdvanceRun();
-
670  return true;
-
671  }
-
672 
-
673  DCHECK(!(*err));
-
674 
-
675  const uint8_t* buf;
-
676  int buf_size;
-
677  queue_.Peek(&buf, &buf_size);
-
678  if (!buf_size)
-
679  return false;
-
680 
-
681  // Skip this entire track if it is not audio nor video.
-
682  if (!runs_->is_audio() && !runs_->is_video())
-
683  runs_->AdvanceRun();
+
443  break;
+
444  case FOURCC_ec_3:
+
445  codec_config = entry.dec3.data;
+
446  num_channels = entry.channelcount;
+
447  sampling_frequency = entry.samplerate;
+
448  break;
+
449  case FOURCC_Opus:
+
450  codec_config = entry.dops.opus_identification_header;
+
451  num_channels = entry.channelcount;
+
452  sampling_frequency = entry.samplerate;
+
453  RCHECK(sampling_frequency != 0);
+
454  codec_delay_ns =
+
455  entry.dops.preskip * kNanosecondsPerSecond / sampling_frequency;
+
456  break;
+
457  default:
+
458  LOG(ERROR) << "Unsupported audio format 0x" << std::hex
+
459  << actual_format << " in stsd box.";
+
460  return false;
+
461  }
+
462 
+
463  // Extract possible seek preroll.
+
464  uint64_t seek_preroll_ns = 0;
+
465  for (const auto& sample_group_description :
+
466  track->media.information.sample_table.sample_group_descriptions) {
+
467  if (sample_group_description.grouping_type != FOURCC_roll)
+
468  continue;
+
469  const auto& audio_roll_recovery_entries =
+
470  sample_group_description.audio_roll_recovery_entries;
+
471  if (audio_roll_recovery_entries.size() != 1) {
+
472  LOG(WARNING) << "Unexpected number of entries in "
+
473  "SampleGroupDescription table with grouping type "
+
474  "'roll'.";
+
475  break;
+
476  }
+
477  const int16_t roll_distance_in_samples =
+
478  audio_roll_recovery_entries[0].roll_distance;
+
479  if (roll_distance_in_samples < 0) {
+
480  RCHECK(sampling_frequency != 0);
+
481  seek_preroll_ns = kNanosecondsPerSecond *
+
482  (-roll_distance_in_samples) / sampling_frequency;
+
483  } else {
+
484  LOG(WARNING)
+
485  << "Roll distance is supposed to be negative, but seeing "
+
486  << roll_distance_in_samples;
+
487  }
+
488  break;
+
489  }
+
490 
+
491  // The stream will be decrypted if a |decryptor_source_| is available.
+
492  const bool is_encrypted =
+
493  decryptor_source_
+
494  ? false
+
495  : entry.sinf.info.track_encryption.default_is_protected == 1;
+
496  DVLOG(1) << "is_audio_track_encrypted_: " << is_encrypted;
+
497  streams.emplace_back(new AudioStreamInfo(
+
498  track->header.track_id, timescale, duration, codec,
+
499  AudioStreamInfo::GetCodecString(codec, audio_object_type),
+
500  codec_config.data(), codec_config.size(), entry.samplesize,
+
501  num_channels, sampling_frequency, seek_preroll_ns, codec_delay_ns,
+
502  max_bitrate, avg_bitrate, track->media.header.language.code,
+
503  is_encrypted));
+
504  }
+
505 
+
506  if (samp_descr.type == kVideo) {
+
507  RCHECK(!samp_descr.video_entries.empty());
+
508  if (desc_idx >= samp_descr.video_entries.size())
+
509  desc_idx = 0;
+
510  const VideoSampleEntry& entry = samp_descr.video_entries[desc_idx];
+
511 
+
512  uint32_t coded_width = entry.width;
+
513  uint32_t coded_height = entry.height;
+
514  uint32_t pixel_width = entry.pixel_aspect.h_spacing;
+
515  uint32_t pixel_height = entry.pixel_aspect.v_spacing;
+
516  if (pixel_width == 0 && pixel_height == 0) {
+
517  pixel_width = 1;
+
518  pixel_height = 1;
+
519  }
+
520  std::string codec_string;
+
521  uint8_t nalu_length_size = 0;
+
522 
+
523  const FourCC actual_format = entry.GetActualFormat();
+
524  const Codec video_codec = FourCCToCodec(actual_format);
+
525  switch (actual_format) {
+
526  case FOURCC_avc1:
+
527  case FOURCC_avc3: {
+
528  AVCDecoderConfigurationRecord avc_config;
+
529  if (!avc_config.Parse(entry.codec_configuration.data)) {
+
530  LOG(ERROR) << "Failed to parse avcc.";
+
531  return false;
+
532  }
+
533  codec_string = avc_config.GetCodecString(actual_format);
+
534  nalu_length_size = avc_config.nalu_length_size();
+
535 
+
536  if (coded_width != avc_config.coded_width() ||
+
537  coded_height != avc_config.coded_height()) {
+
538  LOG(WARNING) << "Resolution in VisualSampleEntry (" << coded_width
+
539  << "," << coded_height
+
540  << ") does not match with resolution in "
+
541  "AVCDecoderConfigurationRecord ("
+
542  << avc_config.coded_width() << ","
+
543  << avc_config.coded_height()
+
544  << "). Use AVCDecoderConfigurationRecord.";
+
545  coded_width = avc_config.coded_width();
+
546  coded_height = avc_config.coded_height();
+
547  }
+
548 
+
549  if (pixel_width != avc_config.pixel_width() ||
+
550  pixel_height != avc_config.pixel_height()) {
+
551  LOG_IF(WARNING, pixel_width != 1 || pixel_height != 1)
+
552  << "Pixel aspect ratio in PASP box (" << pixel_width << ","
+
553  << pixel_height
+
554  << ") does not match with SAR in AVCDecoderConfigurationRecord "
+
555  "("
+
556  << avc_config.pixel_width() << "," << avc_config.pixel_height()
+
557  << "). Use AVCDecoderConfigurationRecord.";
+
558  pixel_width = avc_config.pixel_width();
+
559  pixel_height = avc_config.pixel_height();
+
560  }
+
561  break;
+
562  }
+
563  case FOURCC_hev1:
+
564  case FOURCC_hvc1: {
+
565  HEVCDecoderConfigurationRecord hevc_config;
+
566  if (!hevc_config.Parse(entry.codec_configuration.data)) {
+
567  LOG(ERROR) << "Failed to parse hevc.";
+
568  return false;
+
569  }
+
570  codec_string = hevc_config.GetCodecString(actual_format);
+
571  nalu_length_size = hevc_config.nalu_length_size();
+
572  break;
+
573  }
+
574  case FOURCC_vp08:
+
575  case FOURCC_vp09:
+
576  case FOURCC_vp10: {
+
577  VPCodecConfigurationRecord vp_config;
+
578  if (!vp_config.ParseMP4(entry.codec_configuration.data)) {
+
579  LOG(ERROR) << "Failed to parse vpcc.";
+
580  return false;
+
581  }
+
582  codec_string = vp_config.GetCodecString(video_codec);
+
583  break;
+
584  }
+
585  default:
+
586  LOG(ERROR) << "Unsupported video format "
+
587  << FourCCToString(actual_format) << " in stsd box.";
+
588  return false;
+
589  }
+
590 
+
591  // The stream will be decrypted if a |decryptor_source_| is available.
+
592  const bool is_encrypted =
+
593  decryptor_source_
+
594  ? false
+
595  : entry.sinf.info.track_encryption.default_is_protected == 1;
+
596  DVLOG(1) << "is_video_track_encrypted_: " << is_encrypted;
+
597  std::shared_ptr<VideoStreamInfo> video_stream_info(new VideoStreamInfo(
+
598  track->header.track_id, timescale, duration, video_codec,
+
599  GetH26xStreamFormat(actual_format), codec_string,
+
600  entry.codec_configuration.data.data(),
+
601  entry.codec_configuration.data.size(), coded_width, coded_height,
+
602  pixel_width, pixel_height,
+
603  0, // trick_play_factor
+
604  nalu_length_size, track->media.header.language.code, is_encrypted));
+
605 
+
606  // Set pssh raw data if it has.
+
607  if (moov_->pssh.size() > 0) {
+
608  std::vector<uint8_t> pssh_raw_data;
+
609  for (const auto& pssh : moov_->pssh) {
+
610  pssh_raw_data.insert(pssh_raw_data.end(), pssh.raw_box.begin(),
+
611  pssh.raw_box.end());
+
612  }
+
613  video_stream_info->set_eme_init_data(pssh_raw_data.data(),
+
614  pssh_raw_data.size());
+
615  }
+
616 
+
617  streams.push_back(video_stream_info);
+
618  }
+
619  }
+
620 
+
621  init_cb_.Run(streams);
+
622  if (!FetchKeysIfNecessary(moov_->pssh))
+
623  return false;
+
624  runs_.reset(new TrackRunIterator(moov_.get()));
+
625  RCHECK(runs_->Init());
+
626  ChangeState(kEmittingSamples);
+
627  return true;
+
628 }
+
629 
+
630 bool MP4MediaParser::ParseMoof(BoxReader* reader) {
+
631  // Must already have initialization segment.
+
632  RCHECK(moov_.get());
+
633  MovieFragment moof;
+
634  RCHECK(moof.Parse(reader));
+
635  if (!runs_)
+
636  runs_.reset(new TrackRunIterator(moov_.get()));
+
637  RCHECK(runs_->Init(moof));
+
638  if (!FetchKeysIfNecessary(moof.pssh))
+
639  return false;
+
640  ChangeState(kEmittingSamples);
+
641  return true;
+
642 }
+
643 
+
644 bool MP4MediaParser::FetchKeysIfNecessary(
+
645  const std::vector<ProtectionSystemSpecificHeader>& headers) {
+
646  if (headers.empty())
+
647  return true;
+
648 
+
649  // An error will be returned later if the samples need to be decrypted.
+
650  if (!decryption_key_source_)
+
651  return true;
+
652 
+
653  std::vector<uint8_t> pssh_raw_data;
+
654  for (const auto& header : headers) {
+
655  pssh_raw_data.insert(pssh_raw_data.end(), header.raw_box.begin(),
+
656  header.raw_box.end());
+
657  }
+
658  Status status =
+
659  decryption_key_source_->FetchKeys(EmeInitDataType::CENC, pssh_raw_data);
+
660  if (!status.ok()) {
+
661  LOG(ERROR) << "Error fetching decryption keys: " << status;
+
662  return false;
+
663  }
+
664  return true;
+
665 }
+
666 
+
667 bool MP4MediaParser::EnqueueSample(bool* err) {
+
668  if (!runs_->IsRunValid()) {
+
669  // Remain in kEnqueueingSamples state, discarding data, until the end of
+
670  // the current 'mdat' box has been appended to the queue.
+
671  if (!queue_.Trim(mdat_tail_))
+
672  return false;
+
673 
+
674  ChangeState(kParsingBoxes);
+
675  return true;
+
676  }
+
677 
+
678  if (!runs_->IsSampleValid()) {
+
679  runs_->AdvanceRun();
+
680  return true;
+
681  }
+
682 
+
683  DCHECK(!(*err));
684 
-
685  // Attempt to cache the auxiliary information first. Aux info is usually
-
686  // placed in a contiguous block before the sample data, rather than being
-
687  // interleaved. If we didn't cache it, this would require that we retain the
-
688  // start of the segment buffer while reading samples. Aux info is typically
-
689  // quite small compared to sample data, so this pattern is useful on
-
690  // memory-constrained devices where the source buffer consumes a substantial
-
691  // portion of the total system memory.
-
692  if (runs_->AuxInfoNeedsToBeCached()) {
-
693  queue_.PeekAt(runs_->aux_info_offset() + moof_head_, &buf, &buf_size);
-
694  if (buf_size < runs_->aux_info_size())
-
695  return false;
-
696  *err = !runs_->CacheAuxInfo(buf, buf_size);
-
697  return !*err;
-
698  }
-
699 
-
700  int64_t sample_offset = runs_->sample_offset() + moof_head_;
-
701  queue_.PeekAt(sample_offset, &buf, &buf_size);
-
702  if (buf_size < runs_->sample_size()) {
-
703  if (sample_offset < queue_.head()) {
-
704  LOG(ERROR) << "Incorrect sample offset " << sample_offset
-
705  << " < " << queue_.head();
-
706  *err = true;
-
707  }
-
708  return false;
-
709  }
-
710 
-
711  const uint8_t* media_data = buf;
-
712  const size_t media_data_size = runs_->sample_size();
-
713  // Use a dummy data size of 0 to avoid copying overhead.
-
714  // Actual media data is set later.
-
715  const size_t kDummyDataSize = 0;
-
716  std::shared_ptr<MediaSample> stream_sample(
-
717  MediaSample::CopyFrom(media_data, kDummyDataSize, runs_->is_keyframe()));
-
718 
-
719  if (runs_->is_encrypted()) {
-
720  std::shared_ptr<uint8_t> decrypted_media_data(
-
721  new uint8_t[media_data_size], std::default_delete<uint8_t[]>());
-
722  std::unique_ptr<DecryptConfig> decrypt_config = runs_->GetDecryptConfig();
-
723  if (!decrypt_config) {
-
724  *err = true;
-
725  LOG(ERROR) << "Missing decrypt config.";
-
726  return false;
-
727  }
+
685  const uint8_t* buf;
+
686  int buf_size;
+
687  queue_.Peek(&buf, &buf_size);
+
688  if (!buf_size)
+
689  return false;
+
690 
+
691  // Skip this entire track if it is not audio nor video.
+
692  if (!runs_->is_audio() && !runs_->is_video())
+
693  runs_->AdvanceRun();
+
694 
+
695  // Attempt to cache the auxiliary information first. Aux info is usually
+
696  // placed in a contiguous block before the sample data, rather than being
+
697  // interleaved. If we didn't cache it, this would require that we retain the
+
698  // start of the segment buffer while reading samples. Aux info is typically
+
699  // quite small compared to sample data, so this pattern is useful on
+
700  // memory-constrained devices where the source buffer consumes a substantial
+
701  // portion of the total system memory.
+
702  if (runs_->AuxInfoNeedsToBeCached()) {
+
703  queue_.PeekAt(runs_->aux_info_offset() + moof_head_, &buf, &buf_size);
+
704  if (buf_size < runs_->aux_info_size())
+
705  return false;
+
706  *err = !runs_->CacheAuxInfo(buf, buf_size);
+
707  return !*err;
+
708  }
+
709 
+
710  int64_t sample_offset = runs_->sample_offset() + moof_head_;
+
711  queue_.PeekAt(sample_offset, &buf, &buf_size);
+
712  if (buf_size < runs_->sample_size()) {
+
713  if (sample_offset < queue_.head()) {
+
714  LOG(ERROR) << "Incorrect sample offset " << sample_offset
+
715  << " < " << queue_.head();
+
716  *err = true;
+
717  }
+
718  return false;
+
719  }
+
720 
+
721  const uint8_t* media_data = buf;
+
722  const size_t media_data_size = runs_->sample_size();
+
723  // Use a dummy data size of 0 to avoid copying overhead.
+
724  // Actual media data is set later.
+
725  const size_t kDummyDataSize = 0;
+
726  std::shared_ptr<MediaSample> stream_sample(
+
727  MediaSample::CopyFrom(media_data, kDummyDataSize, runs_->is_keyframe()));
728 
-
729  if (!decryptor_source_) {
-
730  stream_sample->SetData(media_data, media_data_size);
-
731  // If the demuxer does not have the decryptor_source_, store
-
732  // decrypt_config so that the demuxed sample can be decrypted later.
-
733  stream_sample->set_decrypt_config(std::move(decrypt_config));
-
734  stream_sample->set_is_encrypted(true);
-
735  } else {
-
736  if (!decryptor_source_->DecryptSampleBuffer(decrypt_config.get(),
-
737  media_data, media_data_size,
-
738  decrypted_media_data.get())) {
-
739  *err = true;
-
740  LOG(ERROR) << "Cannot decrypt samples.";
-
741  return false;
-
742  }
-
743  stream_sample->TransferData(std::move(decrypted_media_data),
-
744  media_data_size);
-
745  }
-
746  } else {
-
747  stream_sample->SetData(media_data, media_data_size);
-
748  }
-
749 
-
750  stream_sample->set_dts(runs_->dts());
-
751  stream_sample->set_pts(runs_->cts());
-
752  stream_sample->set_duration(runs_->duration());
-
753 
-
754  DVLOG(3) << "Pushing frame: "
-
755  << ", key=" << runs_->is_keyframe()
-
756  << ", dur=" << runs_->duration()
-
757  << ", dts=" << runs_->dts()
-
758  << ", cts=" << runs_->cts()
-
759  << ", size=" << runs_->sample_size();
-
760 
-
761  if (!new_sample_cb_.Run(runs_->track_id(), stream_sample)) {
-
762  *err = true;
-
763  LOG(ERROR) << "Failed to process the sample.";
-
764  return false;
-
765  }
-
766 
-
767  runs_->AdvanceSample();
-
768  return true;
-
769 }
+
729  if (runs_->is_encrypted()) {
+
730  std::shared_ptr<uint8_t> decrypted_media_data(
+
731  new uint8_t[media_data_size], std::default_delete<uint8_t[]>());
+
732  std::unique_ptr<DecryptConfig> decrypt_config = runs_->GetDecryptConfig();
+
733  if (!decrypt_config) {
+
734  *err = true;
+
735  LOG(ERROR) << "Missing decrypt config.";
+
736  return false;
+
737  }
+
738 
+
739  if (!decryptor_source_) {
+
740  stream_sample->SetData(media_data, media_data_size);
+
741  // If the demuxer does not have the decryptor_source_, store
+
742  // decrypt_config so that the demuxed sample can be decrypted later.
+
743  stream_sample->set_decrypt_config(std::move(decrypt_config));
+
744  stream_sample->set_is_encrypted(true);
+
745  } else {
+
746  if (!decryptor_source_->DecryptSampleBuffer(decrypt_config.get(),
+
747  media_data, media_data_size,
+
748  decrypted_media_data.get())) {
+
749  *err = true;
+
750  LOG(ERROR) << "Cannot decrypt samples.";
+
751  return false;
+
752  }
+
753  stream_sample->TransferData(std::move(decrypted_media_data),
+
754  media_data_size);
+
755  }
+
756  } else {
+
757  stream_sample->SetData(media_data, media_data_size);
+
758  }
+
759 
+
760  stream_sample->set_dts(runs_->dts());
+
761  stream_sample->set_pts(runs_->cts());
+
762  stream_sample->set_duration(runs_->duration());
+
763 
+
764  DVLOG(3) << "Pushing frame: "
+
765  << ", key=" << runs_->is_keyframe()
+
766  << ", dur=" << runs_->duration()
+
767  << ", dts=" << runs_->dts()
+
768  << ", cts=" << runs_->cts()
+
769  << ", size=" << runs_->sample_size();
770 
-
771 bool MP4MediaParser::ReadAndDiscardMDATsUntil(const int64_t offset) {
-
772  bool err = false;
-
773  while (mdat_tail_ < offset) {
-
774  const uint8_t* buf;
-
775  int size;
-
776  queue_.PeekAt(mdat_tail_, &buf, &size);
-
777 
-
778  FourCC type;
-
779  uint64_t box_sz;
-
780  if (!BoxReader::StartBox(buf, size, &type, &box_sz, &err))
-
781  break;
-
782 
-
783  mdat_tail_ += box_sz;
-
784  }
-
785  queue_.Trim(std::min(mdat_tail_, offset));
-
786  return !err;
-
787 }
-
788 
-
789 void MP4MediaParser::ChangeState(State new_state) {
-
790  DVLOG(2) << "Changing state: " << new_state;
-
791  state_ = new_state;
-
792 }
-
793 
-
794 } // namespace mp4
-
795 } // namespace media
-
796 } // namespace shaka
+
771  if (!new_sample_cb_.Run(runs_->track_id(), stream_sample)) {
+
772  *err = true;
+
773  LOG(ERROR) << "Failed to process the sample.";
+
774  return false;
+
775  }
+
776 
+
777  runs_->AdvanceSample();
+
778  return true;
+
779 }
+
780 
+
781 bool MP4MediaParser::ReadAndDiscardMDATsUntil(const int64_t offset) {
+
782  bool err = false;
+
783  while (mdat_tail_ < offset) {
+
784  const uint8_t* buf;
+
785  int size;
+
786  queue_.PeekAt(mdat_tail_, &buf, &size);
+
787 
+
788  FourCC type;
+
789  uint64_t box_sz;
+
790  if (!BoxReader::StartBox(buf, size, &type, &box_sz, &err))
+
791  break;
+
792 
+
793  mdat_tail_ += box_sz;
+
794  }
+
795  queue_.Trim(std::min(mdat_tail_, offset));
+
796  return !err;
+
797 }
+
798 
+
799 void MP4MediaParser::ChangeState(State new_state) {
+
800  DVLOG(2) << "Changing state: " << new_state;
+
801  state_ = new_state;
+
802 }
+
803 
+
804 } // namespace mp4
+
805 } // namespace media
+
806 } // namespace shaka
void PeekAt(int64_t offset, const uint8_t **buf, int *size)
bool Flush() override WARN_UNUSED_RESULT
@@ -901,7 +911,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/df9/byte__queue_8cc_source.html b/docs/d7/df9/byte__queue_8cc_source.html index 33ff9df5d0..29f4a642d0 100644 --- a/docs/d7/df9/byte__queue_8cc_source.html +++ b/docs/d7/df9/byte__queue_8cc_source.html @@ -182,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/df9/structshaka_1_1PlayreadyEncryptionParams-members.html b/docs/d7/df9/structshaka_1_1PlayreadyEncryptionParams-members.html index 8f2c205a93..390df24080 100644 --- a/docs/d7/df9/structshaka_1_1PlayreadyEncryptionParams-members.html +++ b/docs/d7/df9/structshaka_1_1PlayreadyEncryptionParams-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d08/classshaka_1_1media_1_1H264ByteToUnitStreamConverter.html b/docs/d8/d08/classshaka_1_1media_1_1H264ByteToUnitStreamConverter.html index 93d41b8b7e..06503a9af9 100644 --- a/docs/d8/d08/classshaka_1_1media_1_1H264ByteToUnitStreamConverter.html +++ b/docs/d8/d08/classshaka_1_1media_1_1H264ByteToUnitStreamConverter.html @@ -233,7 +233,7 @@ void WarnIfNotMatch (i diff --git a/docs/d8/d08/classshaka_1_1media_1_1WebMClusterParser-members.html b/docs/d8/d08/classshaka_1_1media_1_1WebMClusterParser-members.html index 016e295669..c0df42410e 100644 --- a/docs/d8/d08/classshaka_1_1media_1_1WebMClusterParser-members.html +++ b/docs/d8/d08/classshaka_1_1media_1_1WebMClusterParser-members.html @@ -97,8 +97,8 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); cluster_start_time() const (defined in shaka::media::WebMClusterParser)shaka::media::WebMClusterParserinline DISALLOW_COPY_AND_ASSIGN(WebMParserClient) (defined in shaka::media::WebMParserClient)shaka::media::WebMParserClientprotected Flush() WARN_UNUSED_RESULTshaka::media::WebMClusterParser - kDefaultAudioBufferDurationInMs enum valueshaka::media::WebMClusterParser - kDefaultVideoBufferDurationInMs enum valueshaka::media::WebMClusterParser + kDefaultAudioBufferDurationInMs enum valueshaka::media::WebMClusterParser + kDefaultVideoBufferDurationInMs enum valueshaka::media::WebMClusterParser OnFloat(int id, double val) (defined in shaka::media::WebMParserClient)shaka::media::WebMParserClientvirtual OnString(int id, const std::string &str) (defined in shaka::media::WebMParserClient)shaka::media::WebMParserClientvirtual Parse(const uint8_t *buf, int size)shaka::media::WebMClusterParser @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d08/classshaka_1_1media_1_1mp2t_1_1TsWriter-members.html b/docs/d8/d08/classshaka_1_1media_1_1mp2t_1_1TsWriter-members.html index b7a035c694..52b29f49a2 100644 --- a/docs/d8/d08/classshaka_1_1media_1_1mp2t_1_1TsWriter-members.html +++ b/docs/d8/d08/classshaka_1_1media_1_1mp2t_1_1TsWriter-members.html @@ -95,16 +95,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - - - + - +
AddPesPacket(std::unique_ptr< PesPacket > pes_packet)shaka::media::mp2t::TsWritervirtual
FinalizeSegment()shaka::media::mp2t::TsWritervirtual
Initialize(const StreamInfo &stream_info)shaka::media::mp2t::TsWritervirtual
NewSegment(const std::string &file_name)shaka::media::mp2t::TsWritervirtual
SetProgramMapTableWriterForTesting(std::unique_ptr< ProgramMapTableWriter > table_writer)shaka::media::mp2t::TsWriter
NewSegment(const std::string &file_name)shaka::media::mp2t::TsWritervirtual
SignalEncrypted()shaka::media::mp2t::TsWritervirtual
TsWriter() (defined in shaka::media::mp2t::TsWriter)shaka::media::mp2t::TsWriter
TsWriter(std::unique_ptr< ProgramMapTableWriter > pmt_writer) (defined in shaka::media::mp2t::TsWriter)shaka::media::mp2t::TsWriterexplicit
~TsWriter() (defined in shaka::media::mp2t::TsWriter)shaka::media::mp2t::TsWritervirtual
diff --git a/docs/d8/d08/structshaka_1_1media_1_1mp4_1_1MovieHeader-members.html b/docs/d8/d08/structshaka_1_1media_1_1mp4_1_1MovieHeader-members.html index 31e69ff93b..95225591fe 100644 --- a/docs/d8/d08/structshaka_1_1media_1_1mp4_1_1MovieHeader-members.html +++ b/docs/d8/d08/structshaka_1_1media_1_1mp4_1_1MovieHeader-members.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d0d/media__sample_8cc_source.html b/docs/d8/d0d/media__sample_8cc_source.html index c3dd573208..b23971f9ca 100644 --- a/docs/d8/d0d/media__sample_8cc_source.html +++ b/docs/d8/d0d/media__sample_8cc_source.html @@ -228,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d12/structshaka_1_1media_1_1mp4_1_1DecodingTime.html b/docs/d8/d12/structshaka_1_1media_1_1mp4_1_1DecodingTime.html index cc2edacd38..ecd154cf61 100644 --- a/docs/d8/d12/structshaka_1_1media_1_1mp4_1_1DecodingTime.html +++ b/docs/d8/d12/structshaka_1_1media_1_1mp4_1_1DecodingTime.html @@ -112,7 +112,7 @@ uint32_t sample_delta< diff --git a/docs/d8/d12/structshaka_1_1media_1_1mp4_1_1PrivFrame-members.html b/docs/d8/d12/structshaka_1_1media_1_1mp4_1_1PrivFrame-members.html index d85b4e3c96..b7865c1851 100644 --- a/docs/d8/d12/structshaka_1_1media_1_1mp4_1_1PrivFrame-members.html +++ b/docs/d8/d12/structshaka_1_1media_1_1mp4_1_1PrivFrame-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d13/classshaka_1_1media_1_1BitReader-members.html b/docs/d8/d13/classshaka_1_1media_1_1BitReader-members.html index 65e881b7c8..bc6e15df51 100644 --- a/docs/d8/d13/classshaka_1_1media_1_1BitReader-members.html +++ b/docs/d8/d13/classshaka_1_1media_1_1BitReader-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d14/classshaka_1_1media_1_1VP8Parser.html b/docs/d8/d14/classshaka_1_1media_1_1VP8Parser.html index 5b9f29be86..4fd4f9382c 100644 --- a/docs/d8/d14/classshaka_1_1media_1_1VP8Parser.html +++ b/docs/d8/d14/classshaka_1_1media_1_1VP8Parser.html @@ -235,7 +235,7 @@ Additional Inherited Members diff --git a/docs/d8/d16/structshaka_1_1media_1_1MuxerOptions-members.html b/docs/d8/d16/structshaka_1_1media_1_1MuxerOptions-members.html index 7e3e2f1e35..f4673646ea 100644 --- a/docs/d8/d16/structshaka_1_1media_1_1MuxerOptions-members.html +++ b/docs/d8/d16/structshaka_1_1media_1_1MuxerOptions-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d19/bandwidth__estimator_8h_source.html b/docs/d8/d19/bandwidth__estimator_8h_source.html index 2c9fbc8ecb..46f2ed1704 100644 --- a/docs/d8/d19/bandwidth__estimator_8h_source.html +++ b/docs/d8/d19/bandwidth__estimator_8h_source.html @@ -133,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d1c/crypto__flags_8cc_source.html b/docs/d8/d1c/crypto__flags_8cc_source.html index cd04be40f9..078f6a8760 100644 --- a/docs/d8/d1c/crypto__flags_8cc_source.html +++ b/docs/d8/d1c/crypto__flags_8cc_source.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d20/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html b/docs/d8/d20/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html index 62d0976ce6..81012ba77c 100644 --- a/docs/d8/d20/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html +++ b/docs/d8/d20/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d8/d23/structshaka_1_1media_1_1SubsampleEntry-members.html b/docs/d8/d23/structshaka_1_1media_1_1SubsampleEntry-members.html index 5284c5690b..062b221c1a 100644 --- a/docs/d8/d23/structshaka_1_1media_1_1SubsampleEntry-members.html +++ b/docs/d8/d23/structshaka_1_1media_1_1SubsampleEntry-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d28/es__parser__h265_8h_source.html b/docs/d8/d28/es__parser__h265_8h_source.html index e19cb25cd9..1e6a3eaf92 100644 --- a/docs/d8/d28/es__parser__h265_8h_source.html +++ b/docs/d8/d28/es__parser__h265_8h_source.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d33/webm__content__encodings__client_8h_source.html b/docs/d8/d33/webm__content__encodings__client_8h_source.html index c5cc6ec90a..343a016f50 100644 --- a/docs/d8/d33/webm__content__encodings__client_8h_source.html +++ b/docs/d8/d33/webm__content__encodings__client_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d48/structshaka_1_1WidevineDecryptionParams.html b/docs/d8/d48/structshaka_1_1WidevineDecryptionParams.html index 23dfe0fa1b..adf29546b0 100644 --- a/docs/d8/d48/structshaka_1_1WidevineDecryptionParams.html +++ b/docs/d8/d48/structshaka_1_1WidevineDecryptionParams.html @@ -120,7 +120,7 @@ std::string  diff --git a/docs/d8/d4d/aes__decryptor_8h_source.html b/docs/d8/d4d/aes__decryptor_8h_source.html index 89b38e59de..af246c4941 100644 --- a/docs/d8/d4d/aes__decryptor_8h_source.html +++ b/docs/d8/d4d/aes__decryptor_8h_source.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d4f/classshaka_1_1media_1_1TextSample-members.html b/docs/d8/d4f/classshaka_1_1media_1_1TextSample-members.html index 1e24aa015a..c53ecf85db 100644 --- a/docs/d8/d4f/classshaka_1_1media_1_1TextSample-members.html +++ b/docs/d8/d4f/classshaka_1_1media_1_1TextSample-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d53/crypto__flags_8h_source.html b/docs/d8/d53/crypto__flags_8h_source.html index 68178962f5..16e33a469d 100644 --- a/docs/d8/d53/crypto__flags_8h_source.html +++ b/docs/d8/d53/crypto__flags_8h_source.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d5b/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry.html b/docs/d8/d5b/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry.html index c8cd9a41fd..57ef20cf51 100644 --- a/docs/d8/d5b/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry.html +++ b/docs/d8/d5b/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry.html @@ -206,7 +206,7 @@ Additional Inherited Members diff --git a/docs/d8/d66/classshaka_1_1UdpFile-members.html b/docs/d8/d66/classshaka_1_1UdpFile-members.html index e590bef884..653ef649c4 100644 --- a/docs/d8/d66/classshaka_1_1UdpFile-members.html +++ b/docs/d8/d66/classshaka_1_1UdpFile-members.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d6a/classshaka_1_1media_1_1ClusterBuilder-members.html b/docs/d8/d6a/classshaka_1_1media_1_1ClusterBuilder-members.html index e4e19e902d..0780e96385 100644 --- a/docs/d8/d6a/classshaka_1_1media_1_1ClusterBuilder-members.html +++ b/docs/d8/d6a/classshaka_1_1media_1_1ClusterBuilder-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d6d/structshaka_1_1media_1_1mp4_1_1DataInformation.html b/docs/d8/d6d/structshaka_1_1media_1_1mp4_1_1DataInformation.html index baa530c3ec..14defcca95 100644 --- a/docs/d8/d6d/structshaka_1_1media_1_1mp4_1_1DataInformation.html +++ b/docs/d8/d6d/structshaka_1_1media_1_1mp4_1_1DataInformation.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d8/d6f/origin__handler_8h_source.html b/docs/d8/d6f/origin__handler_8h_source.html index 9b57810404..e648e62731 100644 --- a/docs/d8/d6f/origin__handler_8h_source.html +++ b/docs/d8/d6f/origin__handler_8h_source.html @@ -132,12 +132,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
43 
44 #endif // PACKAGER_MEDIA_ORIGIN_ORIGIN_HANDLER_H_
- + diff --git a/docs/d8/d70/structshaka_1_1media_1_1mp4_1_1Metadata-members.html b/docs/d8/d70/structshaka_1_1media_1_1mp4_1_1Metadata-members.html index 8f57142948..52635def4e 100644 --- a/docs/d8/d70/structshaka_1_1media_1_1mp4_1_1Metadata-members.html +++ b/docs/d8/d70/structshaka_1_1media_1_1mp4_1_1Metadata-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d74/classshaka_1_1media_1_1TracksBuilder.html b/docs/d8/d74/classshaka_1_1media_1_1TracksBuilder.html index 52d8b0d97a..b066a0977f 100644 --- a/docs/d8/d74/classshaka_1_1media_1_1TracksBuilder.html +++ b/docs/d8/d74/classshaka_1_1media_1_1TracksBuilder.html @@ -123,7 +123,7 @@ std::vector< uint8_t >  diff --git a/docs/d8/d81/classshaka_1_1LocalFile-members.html b/docs/d8/d81/classshaka_1_1LocalFile-members.html index d784d4d67e..d1904851c1 100644 --- a/docs/d8/d81/classshaka_1_1LocalFile-members.html +++ b/docs/d8/d81/classshaka_1_1LocalFile-members.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d86/classshaka_1_1media_1_1WebMTracksParser.html b/docs/d8/d86/classshaka_1_1media_1_1WebMTracksParser.html index 163566b4c2..c9e256f2ee 100644 --- a/docs/d8/d86/classshaka_1_1media_1_1WebMTracksParser.html +++ b/docs/d8/d86/classshaka_1_1media_1_1WebMTracksParser.html @@ -228,7 +228,7 @@ The number of bytes parsed on success. diff --git a/docs/d8/d88/structshaka_1_1media_1_1mp4_1_1MovieExtends-members.html b/docs/d8/d88/structshaka_1_1media_1_1mp4_1_1MovieExtends-members.html index ed9f1a0ec0..c4a26e5187 100644 --- a/docs/d8/d88/structshaka_1_1media_1_1mp4_1_1MovieExtends-members.html +++ b/docs/d8/d88/structshaka_1_1media_1_1mp4_1_1MovieExtends-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d8e/classshaka_1_1AdaptationSet.html b/docs/d8/d8e/classshaka_1_1AdaptationSet.html index a97a40b7a7..1d58810d20 100644 --- a/docs/d8/d8e/classshaka_1_1AdaptationSet.html +++ b/docs/d8/d8e/classshaka_1_1AdaptationSet.html @@ -603,7 +603,7 @@ template<DashProfile profile> diff --git a/docs/d8/d91/classshaka_1_1media_1_1AesCtrEncryptor-members.html b/docs/d8/d91/classshaka_1_1media_1_1AesCtrEncryptor-members.html index 2a49c949b3..f8ea4bb563 100644 --- a/docs/d8/d91/classshaka_1_1media_1_1AesCtrEncryptor-members.html +++ b/docs/d8/d91/classshaka_1_1media_1_1AesCtrEncryptor-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d92/classshaka_1_1media_1_1AesRequestSigner-members.html b/docs/d8/d92/classshaka_1_1media_1_1AesRequestSigner-members.html index 1ef52c017e..d1ec5f328e 100644 --- a/docs/d8/d92/classshaka_1_1media_1_1AesRequestSigner-members.html +++ b/docs/d8/d92/classshaka_1_1media_1_1AesRequestSigner-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d92/structshaka_1_1media_1_1H264DecRefPicMarking-members.html b/docs/d8/d92/structshaka_1_1media_1_1H264DecRefPicMarking-members.html index 343f9c464f..2e68213495 100644 --- a/docs/d8/d92/structshaka_1_1media_1_1H264DecRefPicMarking-members.html +++ b/docs/d8/d92/structshaka_1_1media_1_1H264DecRefPicMarking-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d93/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader-members.html b/docs/d8/d93/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader-members.html index 57cd3c2818..eaa11372ab 100644 --- a/docs/d8/d93/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader-members.html +++ b/docs/d8/d93/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d94/pes__packet_8h_source.html b/docs/d8/d94/pes__packet_8h_source.html index 2c051a2dd6..0f01894d0c 100644 --- a/docs/d8/d94/pes__packet_8h_source.html +++ b/docs/d8/d94/pes__packet_8h_source.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d99/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox-members.html b/docs/d8/d99/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox-members.html index 53185b5dd2..b49175fb02 100644 --- a/docs/d8/d99/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox-members.html +++ b/docs/d8/d99/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d9a/fragmenter_8cc_source.html b/docs/d8/d9a/fragmenter_8cc_source.html index db48f22b05..5535d18575 100644 --- a/docs/d8/d9a/fragmenter_8cc_source.html +++ b/docs/d8/d9a/fragmenter_8cc_source.html @@ -390,7 +390,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d9c/webm__tracks__parser_8cc_source.html b/docs/d8/d9c/webm__tracks__parser_8cc_source.html index b2c60c14b4..0732f4e7f3 100644 --- a/docs/d8/d9c/webm__tracks__parser_8cc_source.html +++ b/docs/d8/d9c/webm__tracks__parser_8cc_source.html @@ -441,7 +441,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d9f/udp__file_8h_source.html b/docs/d8/d9f/udp__file_8h_source.html index 54d655e75f..8d1ff6f29f 100644 --- a/docs/d8/d9f/udp__file_8h_source.html +++ b/docs/d8/d9f/udp__file_8h_source.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/da3/classshaka_1_1media_1_1DecryptorSource-members.html b/docs/d8/da3/classshaka_1_1media_1_1DecryptorSource-members.html index 079b21b19d..7dbaf1248c 100644 --- a/docs/d8/da3/classshaka_1_1media_1_1DecryptorSource-members.html +++ b/docs/d8/da3/classshaka_1_1media_1_1DecryptorSource-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/da5/structshaka_1_1media_1_1mp4_1_1SampleSize-members.html b/docs/d8/da5/structshaka_1_1media_1_1mp4_1_1SampleSize-members.html index 9685a0857c..38cf144bb4 100644 --- a/docs/d8/da5/structshaka_1_1media_1_1mp4_1_1SampleSize-members.html +++ b/docs/d8/da5/structshaka_1_1media_1_1mp4_1_1SampleSize-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/da6/classshaka_1_1media_1_1NaluReader-members.html b/docs/d8/da6/classshaka_1_1media_1_1NaluReader-members.html index d8682f6d51..b8e4bd5dd3 100644 --- a/docs/d8/da6/classshaka_1_1media_1_1NaluReader-members.html +++ b/docs/d8/da6/classshaka_1_1media_1_1NaluReader-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/daa/stream__info_8h_source.html b/docs/d8/daa/stream__info_8h_source.html index 6f6e176a4e..6d18451033 100644 --- a/docs/d8/daa/stream__info_8h_source.html +++ b/docs/d8/daa/stream__info_8h_source.html @@ -228,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/daf/namespaceshaka.html b/docs/d8/daf/namespaceshaka.html index 1f083e925e..92ec0cbfda 100644 --- a/docs/d8/daf/namespaceshaka.html +++ b/docs/d8/daf/namespaceshaka.html @@ -123,6 +123,11 @@ Classes struct  HlsParams  HLS related parameters. More...
  +struct  Cuepoint +  +struct  AdCueGeneratorParamsCuepoint generator related parameters. More...
+  struct  ChunkingParams  Chunking (segmentation) related parameters. More...
  @@ -849,7 +854,7 @@ template<class FlagType > diff --git a/docs/d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html b/docs/d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html index e5d9b6c8a2..e321eb692b 100644 --- a/docs/d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html +++ b/docs/d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html @@ -264,7 +264,7 @@ void set_progress_target diff --git a/docs/d8/db9/classshaka_1_1media_1_1WebMContentEncodingsClient-members.html b/docs/d8/db9/classshaka_1_1media_1_1WebMContentEncodingsClient-members.html index 972031b55b..c34a602e44 100644 --- a/docs/d8/db9/classshaka_1_1media_1_1WebMContentEncodingsClient-members.html +++ b/docs/d8/db9/classshaka_1_1media_1_1WebMContentEncodingsClient-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dc2/classshaka_1_1media_1_1Replicator-members.html b/docs/d8/dc2/classshaka_1_1media_1_1Replicator-members.html index 795b4b9fee..be2707b6ac 100644 --- a/docs/d8/dc2/classshaka_1_1media_1_1Replicator-members.html +++ b/docs/d8/dc2/classshaka_1_1media_1_1Replicator-members.html @@ -95,9 +95,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - + - + @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline
Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected
DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected
DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected
DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected
DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected
DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected
DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected
DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected
DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected
diff --git a/docs/d8/dc2/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo.html b/docs/d8/dc2/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo.html index 1634408e0f..06e0a3174e 100644 --- a/docs/d8/dc2/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo.html +++ b/docs/d8/dc2/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo.html @@ -118,7 +118,7 @@ int frame_num = 0 diff --git a/docs/d8/dc3/structshaka_1_1media_1_1mp4_1_1CueTimeBox.html b/docs/d8/dc3/structshaka_1_1media_1_1mp4_1_1CueTimeBox.html index b751a7ad4f..91a95e2f6e 100644 --- a/docs/d8/dc3/structshaka_1_1media_1_1mp4_1_1CueTimeBox.html +++ b/docs/d8/dc3/structshaka_1_1media_1_1mp4_1_1CueTimeBox.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d8/dca/ts__writer_8h_source.html b/docs/d8/dca/ts__writer_8h_source.html index 3eed19b833..05ae50e31a 100644 --- a/docs/d8/dca/ts__writer_8h_source.html +++ b/docs/d8/dca/ts__writer_8h_source.html @@ -104,67 +104,57 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
15 #include "packager/file/file.h"
16 #include "packager/file/file_closer.h"
17 #include "packager/media/formats/mp2t/continuity_counter.h"
-
18 #include "packager/media/formats/mp2t/pes_packet.h"
-
19 #include "packager/media/formats/mp2t/program_map_table_writer.h"
-
20 
-
21 namespace shaka {
-
22 namespace media {
-
23 
-
24 class StreamInfo;
+
18 
+
19 namespace shaka {
+
20 namespace media {
+
21 namespace mp2t {
+
22 
+
23 class PesPacket;
+
24 class ProgramMapTableWriter;
25 
-
26 namespace mp2t {
-
27 
-
30 class TsWriter {
-
31  public:
-
32  TsWriter();
-
33  virtual ~TsWriter();
-
34 
-
38  virtual bool Initialize(const StreamInfo& stream_info);
-
39 
-
44  virtual bool NewSegment(const std::string& file_name);
-
45 
-
47  virtual void SignalEncrypted();
-
48 
-
52  virtual bool FinalizeSegment();
-
53 
-
58  virtual bool AddPesPacket(std::unique_ptr<PesPacket> pes_packet);
+
28 class TsWriter {
+
29  public:
+
30  explicit TsWriter(std::unique_ptr<ProgramMapTableWriter> pmt_writer);
+
31  virtual ~TsWriter();
+
32 
+
37  virtual bool NewSegment(const std::string& file_name);
+
38 
+
40  virtual void SignalEncrypted();
+
41 
+
45  virtual bool FinalizeSegment();
+
46 
+
51  virtual bool AddPesPacket(std::unique_ptr<PesPacket> pes_packet);
+
52 
+
53  private:
+
54  TsWriter(const TsWriter&) = delete;
+
55  TsWriter& operator=(const TsWriter&) = delete;
+
56 
+
57  // True if further segments generated by this instance should be encrypted.
+
58  bool encrypted_ = false;
59 
- -
62  std::unique_ptr<ProgramMapTableWriter> table_writer);
-
63 
-
64  private:
-
65  // True if further segments generated by this instance should be encrypted.
-
66  bool encrypted_ = false;
+
60  ContinuityCounter pat_continuity_counter_;
+
61  ContinuityCounter elementary_stream_continuity_counter_;
+
62 
+
63  std::unique_ptr<ProgramMapTableWriter> pmt_writer_;
+
64 
+
65  std::unique_ptr<File, FileCloser> current_file_;
+
66 };
67 
-
68  ContinuityCounter pmt_continuity_counter_;
-
69  ContinuityCounter pat_continuity_counter_;
-
70  ContinuityCounter elementary_stream_continuity_counter_;
+
68 } // namespace mp2t
+
69 } // namespace media
+
70 } // namespace shaka
71 
-
72  std::unique_ptr<ProgramMapTableWriter> pmt_writer_;
-
73 
-
74  std::unique_ptr<File, FileCloser> current_file_;
-
75 
-
76  DISALLOW_COPY_AND_ASSIGN(TsWriter);
-
77 };
-
78 
-
79 } // namespace mp2t
-
80 } // namespace media
-
81 } // namespace shaka
-
82 
-
83 #endif // PACKAGER_MEDIA_FORMATS_MP2T_TS_WRITER_H_
-
Abstract class holds stream information.
Definition: stream_info.h:58
-
virtual bool NewSegment(const std::string &file_name)
Definition: ts_writer.cc:198
-
virtual bool AddPesPacket(std::unique_ptr< PesPacket > pes_packet)
Definition: ts_writer.cc:237
+
72 #endif // PACKAGER_MEDIA_FORMATS_MP2T_TS_WRITER_H_
+
virtual bool NewSegment(const std::string &file_name)
Definition: ts_writer.cc:166
+
virtual bool AddPesPacket(std::unique_ptr< PesPacket > pes_packet)
Definition: ts_writer.cc:205
-
void SetProgramMapTableWriterForTesting(std::unique_ptr< ProgramMapTableWriter > table_writer)
Only for testing.
Definition: ts_writer.cc:249
- -
virtual bool FinalizeSegment()
Definition: ts_writer.cc:233
-
virtual bool Initialize(const StreamInfo &stream_info)
Definition: ts_writer.cc:164
-
virtual void SignalEncrypted()
Signals the writer that the rest of the segments are encrypted.
Definition: ts_writer.cc:229
+ +
virtual bool FinalizeSegment()
Definition: ts_writer.cc:201
+
virtual void SignalEncrypted()
Signals the writer that the rest of the segments are encrypted.
Definition: ts_writer.cc:197
diff --git a/docs/d8/dcd/structshaka_1_1media_1_1mp4_1_1DecodingTime-members.html b/docs/d8/dcd/structshaka_1_1media_1_1mp4_1_1DecodingTime-members.html index 176e70a711..fabed9ff02 100644 --- a/docs/d8/dcd/structshaka_1_1media_1_1mp4_1_1DecodingTime-members.html +++ b/docs/d8/dcd/structshaka_1_1media_1_1mp4_1_1DecodingTime-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dcd/structshaka_1_1media_1_1mp4_1_1TrackExtends-members.html b/docs/d8/dcd/structshaka_1_1media_1_1mp4_1_1TrackExtends-members.html index ee8de8f323..376430bf17 100644 --- a/docs/d8/dcd/structshaka_1_1media_1_1mp4_1_1TrackExtends-members.html +++ b/docs/d8/dcd/structshaka_1_1media_1_1mp4_1_1TrackExtends-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dd6/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter.html b/docs/d8/dd6/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter.html index b62f893a6a..7e24afeefc 100644 --- a/docs/d8/dd6/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter.html +++ b/docs/d8/dd6/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter.html @@ -129,7 +129,7 @@ Public Member Functions diff --git a/docs/d8/dd6/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html b/docs/d8/dd6/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html index 932a55f435..1c7820ad5d 100644 --- a/docs/d8/dd6/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html +++ b/docs/d8/dd6/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html @@ -135,7 +135,7 @@ std::vector< uint8_t >  diff --git a/docs/d8/de1/classshaka_1_1SimpleMpdNotifier.html b/docs/d8/de1/classshaka_1_1SimpleMpdNotifier.html index 1840e74e30..d8d0583375 100644 --- a/docs/d8/de1/classshaka_1_1SimpleMpdNotifier.html +++ b/docs/d8/de1/classshaka_1_1SimpleMpdNotifier.html @@ -473,7 +473,7 @@ class SimpleMpdNotifierTes diff --git a/docs/d8/de6/webm__crypto__helpers_8h_source.html b/docs/d8/de6/webm__crypto__helpers_8h_source.html index b2d46d35ac..7e5815ab7d 100644 --- a/docs/d8/de6/webm__crypto__helpers_8h_source.html +++ b/docs/d8/de6/webm__crypto__helpers_8h_source.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/deb/classshaka_1_1media_1_1mp2t_1_1EsParser-members.html b/docs/d8/deb/classshaka_1_1media_1_1mp2t_1_1EsParser-members.html index fd81321545..dfe2f2c270 100644 --- a/docs/d8/deb/classshaka_1_1media_1_1mp2t_1_1EsParser-members.html +++ b/docs/d8/deb/classshaka_1_1media_1_1mp2t_1_1EsParser-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/deb/retired__flags_8cc_source.html b/docs/d8/deb/retired__flags_8cc_source.html index de034ebf32..c0dbcb15ca 100644 --- a/docs/d8/deb/retired__flags_8cc_source.html +++ b/docs/d8/deb/retired__flags_8cc_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dee/classshaka_1_1media_1_1AudioTimestampHelper-members.html b/docs/d8/dee/classshaka_1_1media_1_1AudioTimestampHelper-members.html index b2344d86bc..81f82dcfca 100644 --- a/docs/d8/dee/classshaka_1_1media_1_1AudioTimestampHelper-members.html +++ b/docs/d8/dee/classshaka_1_1media_1_1AudioTimestampHelper-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dee/classshaka_1_1media_1_1VPxParser-members.html b/docs/d8/dee/classshaka_1_1media_1_1VPxParser-members.html index ee91e02685..3c358a3c49 100644 --- a/docs/d8/dee/classshaka_1_1media_1_1VPxParser-members.html +++ b/docs/d8/dee/classshaka_1_1media_1_1VPxParser-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/df0/webm_2single__segment__segmenter_8cc_source.html b/docs/d8/df0/webm_2single__segment__segmenter_8cc_source.html index fd124bad98..23656495c6 100644 --- a/docs/d8/df0/webm_2single__segment__segmenter_8cc_source.html +++ b/docs/d8/df0/webm_2single__segment__segmenter_8cc_source.html @@ -221,7 +221,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/df7/classshaka_1_1media_1_1SegmentTestBase-members.html b/docs/d8/df7/classshaka_1_1media_1_1SegmentTestBase-members.html index 2d24746be5..1a9546af03 100644 --- a/docs/d8/df7/classshaka_1_1media_1_1SegmentTestBase-members.html +++ b/docs/d8/df7/classshaka_1_1media_1_1SegmentTestBase-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dfa/nal__unit__to__byte__stream__converter_8h_source.html b/docs/d8/dfa/nal__unit__to__byte__stream__converter_8h_source.html index 1092d8fcc7..47b49932eb 100644 --- a/docs/d8/dfa/nal__unit__to__byte__stream__converter_8h_source.html +++ b/docs/d8/dfa/nal__unit__to__byte__stream__converter_8h_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d00/structshaka_1_1media_1_1OnMediaEndParameters-members.html b/docs/d9/d00/structshaka_1_1media_1_1OnMediaEndParameters-members.html index 2eed9ad856..a77a77e3e7 100644 --- a/docs/d9/d00/structshaka_1_1media_1_1OnMediaEndParameters-members.html +++ b/docs/d9/d00/structshaka_1_1media_1_1OnMediaEndParameters-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d01/mp4_2single__segment__segmenter_8h_source.html b/docs/d9/d01/mp4_2single__segment__segmenter_8h_source.html index ea3d24838f..01716d010e 100644 --- a/docs/d9/d01/mp4_2single__segment__segmenter_8h_source.html +++ b/docs/d9/d01/mp4_2single__segment__segmenter_8h_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d08/mock__mpd__builder_8h_source.html b/docs/d9/d08/mock__mpd__builder_8h_source.html index 7c3c621e73..065ee5e83a 100644 --- a/docs/d9/d08/mock__mpd__builder_8h_source.html +++ b/docs/d9/d08/mock__mpd__builder_8h_source.html @@ -174,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d0b/classshaka_1_1media_1_1HlsNotifyMuxerListener-members.html b/docs/d9/d0b/classshaka_1_1media_1_1HlsNotifyMuxerListener-members.html index f7c9c332ba..8d9444869c 100644 --- a/docs/d9/d0b/classshaka_1_1media_1_1HlsNotifyMuxerListener-members.html +++ b/docs/d9/d0b/classshaka_1_1media_1_1HlsNotifyMuxerListener-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d0c/classshaka_1_1media_1_1RsaPublicKey.html b/docs/d9/d0c/classshaka_1_1media_1_1RsaPublicKey.html index 46afc0d9de..87f5c2e07c 100644 --- a/docs/d9/d0c/classshaka_1_1media_1_1RsaPublicKey.html +++ b/docs/d9/d0c/classshaka_1_1media_1_1RsaPublicKey.html @@ -218,7 +218,7 @@ Static Public Member Functions diff --git a/docs/d9/d12/chunking__handler_8cc_source.html b/docs/d9/d12/chunking__handler_8cc_source.html index a43337a1e6..136001c34c 100644 --- a/docs/d9/d12/chunking__handler_8cc_source.html +++ b/docs/d9/d12/chunking__handler_8cc_source.html @@ -155,209 +155,220 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
66  time_scales_[stream_data->stream_index] = time_scale;
67  break;
68  }
-
69  case StreamDataType::kSegmentInfo:
-
70  VLOG(3) << "Drop existing segment info.";
-
71  return Status::OK;
-
72  case StreamDataType::kMediaSample: {
-
73  const size_t stream_index = stream_data->stream_index;
-
74  DCHECK_NE(time_scales_[stream_index], 0u)
-
75  << "kStreamInfo should arrive before kMediaSample";
-
76  if (stream_index != main_stream_index_) {
-
77  if (!stream_data->media_sample->is_key_frame()) {
-
78  return Status(error::CHUNKING_ERROR,
-
79  "All non video samples should be key frames.");
-
80  }
-
81  // Cache non main stream samples, since we don't know yet whether these
-
82  // samples belong to the current or next segment.
-
83  non_main_samples_.push_back(std::move(stream_data));
-
84  // The streams are expected to be synchronized, so we don't expect to
-
85  // see a lot of samples before seeing video samples.
-
86  const size_t kMaxSamplesPerStreamBeforeVideoSample = 5u;
-
87  if (non_main_samples_.size() >
-
88  num_input_streams() * kMaxSamplesPerStreamBeforeVideoSample) {
+
69  case StreamDataType::kScte35Event: {
+
70  DCHECK_NE(main_stream_index_, kInvalidStreamIndex)
+
71  << "kStreamInfo should arrive before kScte35Event";
+
72  const auto stream_index = stream_data->stream_index;
+
73  if (stream_index != main_stream_index_) {
+
74  VLOG(3) << "Dropping scte35 event from non main stream.";
+
75  return Status::OK;
+
76  }
+
77  scte35_events_.push(std::move(stream_data));
+
78  return Status::OK;
+
79  }
+
80  case StreamDataType::kSegmentInfo:
+
81  VLOG(3) << "Droppping existing segment info.";
+
82  return Status::OK;
+
83  case StreamDataType::kMediaSample: {
+
84  const size_t stream_index = stream_data->stream_index;
+
85  DCHECK_NE(time_scales_[stream_index], 0u)
+
86  << "kStreamInfo should arrive before kMediaSample";
+
87  if (stream_index != main_stream_index_) {
+
88  if (!stream_data->media_sample->is_key_frame()) {
89  return Status(error::CHUNKING_ERROR,
-
90  "Too many non video samples before video sample.");
+
90  "All non video samples should be key frames.");
91  }
-
92  return Status::OK;
-
93  }
-
94 
-
95  const MediaSample* sample = stream_data->media_sample.get();
-
96  Status status = ProcessMediaSample(sample);
-
97  if (!status.ok())
-
98  return status;
-
99  // Discard samples before segment start.
-
100  if (!segment_info_[stream_index])
-
101  return Status::OK;
-
102  last_sample_end_timestamps_[stream_index] =
-
103  sample->dts() + sample->duration();
-
104  break;
-
105  }
-
106  default:
-
107  VLOG(3) << "Stream data type "
-
108  << static_cast<int>(stream_data->stream_data_type) << " ignored.";
-
109  break;
-
110  }
-
111  return Dispatch(std::move(stream_data));
-
112 }
-
113 
-
114 Status ChunkingHandler::OnFlushRequest(size_t input_stream_index) {
-
115  if (segment_info_[input_stream_index]) {
-
116  Status status;
-
117  if (input_stream_index != main_stream_index_) {
-
118  status = DispatchNonMainSamples(kTimeStampToDispatchAllSamples);
-
119  if (!status.ok())
-
120  return status;
-
121  }
-
122  auto& segment_info = segment_info_[input_stream_index];
-
123  if (segment_info->start_timestamp != -1) {
-
124  segment_info->duration = last_sample_end_timestamps_[input_stream_index] -
-
125  segment_info->start_timestamp;
-
126  status = DispatchSegmentInfo(input_stream_index, std::move(segment_info));
-
127  if (!status.ok())
-
128  return status;
-
129  }
-
130  }
-
131  const size_t output_stream_index = input_stream_index;
-
132  return FlushDownstream(output_stream_index);
-
133 }
-
134 
-
135 Status ChunkingHandler::ProcessMediaSample(const MediaSample* sample) {
-
136  const bool is_key_frame = sample->is_key_frame();
-
137  const int64_t timestamp = sample->dts();
-
138  // Check if we need to terminate the current (sub)segment.
-
139  bool new_segment = false;
-
140  bool new_subsegment = false;
-
141  if (is_key_frame || !chunking_params_.segment_sap_aligned) {
-
142  const int64_t segment_index = timestamp / segment_duration_;
-
143  if (segment_index != current_segment_index_) {
-
144  current_segment_index_ = segment_index;
-
145  // Reset subsegment index.
-
146  current_subsegment_index_ = 0;
-
147  new_segment = true;
-
148  }
-
149  }
-
150  if (!new_segment && subsegment_duration_ > 0 &&
-
151  (is_key_frame || !chunking_params_.subsegment_sap_aligned)) {
-
152  const int64_t subsegment_index =
-
153  (timestamp - segment_info_[main_stream_index_]->start_timestamp) /
-
154  subsegment_duration_;
-
155  if (subsegment_index != current_subsegment_index_) {
-
156  current_subsegment_index_ = subsegment_index;
-
157  new_subsegment = true;
-
158  }
-
159  }
-
160 
-
161  Status status;
-
162  if (new_segment || new_subsegment) {
-
163  // Dispatch the samples before |timestamp| - See the implemention on how we
-
164  // determine if a sample is before |timestamp|..
-
165  status.Update(DispatchNonMainSamples(timestamp));
-
166  }
-
167 
-
168  if (new_segment) {
-
169  status.Update(DispatchSegmentInfoForAllStreams());
-
170  segment_info_[main_stream_index_]->start_timestamp = timestamp;
-
171  }
-
172  if (subsegment_duration_ > 0 && (new_segment || new_subsegment)) {
-
173  status.Update(DispatchSubsegmentInfoForAllStreams());
-
174  subsegment_info_[main_stream_index_]->start_timestamp = timestamp;
-
175  }
-
176  if (!status.ok())
-
177  return status;
+
92  // Cache non main stream samples, since we don't know yet whether these
+
93  // samples belong to the current or next segment.
+
94  non_main_samples_.push_back(std::move(stream_data));
+
95  // The streams are expected to be synchronized, so we don't expect to
+
96  // see a lot of samples before seeing video samples.
+
97  const size_t kMaxSamplesPerStreamBeforeVideoSample = 5u;
+
98  if (non_main_samples_.size() >
+
99  num_input_streams() * kMaxSamplesPerStreamBeforeVideoSample) {
+
100  return Status(error::CHUNKING_ERROR,
+
101  "Too many non video samples before video sample.");
+
102  }
+
103  return Status::OK;
+
104  }
+
105 
+
106  const MediaSample* sample = stream_data->media_sample.get();
+
107  Status status = ProcessMediaSample(sample);
+
108  if (!status.ok())
+
109  return status;
+
110  // Discard samples before segment start.
+
111  if (!segment_info_[stream_index])
+
112  return Status::OK;
+
113  last_sample_end_timestamps_[stream_index] =
+
114  sample->dts() + sample->duration();
+
115  break;
+
116  }
+
117  default:
+
118  VLOG(3) << "Stream data type "
+
119  << static_cast<int>(stream_data->stream_data_type) << " ignored.";
+
120  break;
+
121  }
+
122  return Dispatch(std::move(stream_data));
+
123 }
+
124 
+
125 Status ChunkingHandler::OnFlushRequest(size_t input_stream_index) {
+
126  if (segment_info_[input_stream_index]) {
+
127  Status status;
+
128  if (input_stream_index != main_stream_index_) {
+
129  status = DispatchNonMainSamples(kTimeStampToDispatchAllSamples);
+
130  if (!status.ok())
+
131  return status;
+
132  }
+
133  auto& segment_info = segment_info_[input_stream_index];
+
134  if (segment_info->start_timestamp != -1) {
+
135  segment_info->duration = last_sample_end_timestamps_[input_stream_index] -
+
136  segment_info->start_timestamp;
+
137  status = DispatchSegmentInfo(input_stream_index, std::move(segment_info));
+
138  if (!status.ok())
+
139  return status;
+
140  }
+
141  }
+
142  const size_t output_stream_index = input_stream_index;
+
143  return FlushDownstream(output_stream_index);
+
144 }
+
145 
+
146 Status ChunkingHandler::ProcessMediaSample(const MediaSample* sample) {
+
147  const bool is_key_frame = sample->is_key_frame();
+
148  const int64_t timestamp = sample->dts();
+
149  // Check if we need to terminate the current (sub)segment.
+
150  bool new_segment = false;
+
151  bool new_subsegment = false;
+
152  if (is_key_frame || !chunking_params_.segment_sap_aligned) {
+
153  const int64_t segment_index = timestamp / segment_duration_;
+
154  if (segment_index != current_segment_index_) {
+
155  current_segment_index_ = segment_index;
+
156  // Reset subsegment index.
+
157  current_subsegment_index_ = 0;
+
158  new_segment = true;
+
159  }
+
160  }
+
161  if (!new_segment && subsegment_duration_ > 0 &&
+
162  (is_key_frame || !chunking_params_.subsegment_sap_aligned)) {
+
163  const int64_t subsegment_index =
+
164  (timestamp - segment_info_[main_stream_index_]->start_timestamp) /
+
165  subsegment_duration_;
+
166  if (subsegment_index != current_subsegment_index_) {
+
167  current_subsegment_index_ = subsegment_index;
+
168  new_subsegment = true;
+
169  }
+
170  }
+
171 
+
172  Status status;
+
173  if (new_segment || new_subsegment) {
+
174  // Dispatch the samples before |timestamp| - See the implemention on how we
+
175  // determine if a sample is before |timestamp|..
+
176  status.Update(DispatchNonMainSamples(timestamp));
+
177  }
178 
-
179  // Dispatch non-main samples for the next segment.
-
180  return DispatchNonMainSamples(kTimeStampToDispatchAllSamples);
-
181 }
-
182 
-
183 Status ChunkingHandler::DispatchNonMainSamples(int64_t timestamp_threshold) {
-
184  Status status;
-
185  while (status.ok() && !non_main_samples_.empty()) {
-
186  DCHECK_EQ(non_main_samples_.front()->stream_data_type,
-
187  StreamDataType::kMediaSample);
-
188  const size_t stream_index = non_main_samples_.front()->stream_index;
-
189  const MediaSample* sample = non_main_samples_.front()->media_sample.get();
-
190  // If the portion of the sample before |timestamp_threshold| is bigger than
-
191  // the other portion, we consider it part of the current segment.
-
192  const int64_t timestamp = sample->dts() + sample->duration() / 2;
-
193  const bool stop =
-
194  (timestamp_threshold != kTimeStampToDispatchAllSamples &&
-
195  (static_cast<double>(timestamp) / time_scales_[stream_index]) >
-
196  (static_cast<double>(timestamp_threshold) /
-
197  time_scales_[main_stream_index_]));
-
198  VLOG(3) << "Sample ts: " << sample->dts() << " "
-
199  << " duration: " << sample->duration()
-
200  << " scale: " << time_scales_[stream_index] << "\n"
-
201  << " threshold: " << timestamp_threshold
-
202  << " scale: " << time_scales_[main_stream_index_]
-
203  << (stop ? " stop "
-
204  : (segment_info_[stream_index] ? " dispatch "
-
205  : " discard "));
-
206  if (stop)
-
207  break;
-
208  // Only dispatch samples if the segment has started, otherwise discard
-
209  // them.
-
210  if (segment_info_[stream_index]) {
-
211  if (segment_info_[stream_index]->start_timestamp == -1)
-
212  segment_info_[stream_index]->start_timestamp = sample->dts();
-
213  if (subsegment_info_[stream_index] &&
-
214  subsegment_info_[stream_index]->start_timestamp == -1) {
-
215  subsegment_info_[stream_index]->start_timestamp = sample->dts();
-
216  }
-
217  last_sample_end_timestamps_[stream_index] =
-
218  sample->dts() + sample->duration();
-
219  status.Update(Dispatch(std::move(non_main_samples_.front())));
-
220  }
-
221  non_main_samples_.pop_front();
-
222  }
-
223  return status;
-
224 }
-
225 
-
226 Status ChunkingHandler::DispatchSegmentInfoForAllStreams() {
-
227  Status status;
-
228  for (size_t i = 0; i < segment_info_.size() && status.ok(); ++i) {
-
229  if (segment_info_[i] && segment_info_[i]->start_timestamp != -1) {
-
230  segment_info_[i]->duration =
-
231  last_sample_end_timestamps_[i] - segment_info_[i]->start_timestamp;
-
232  status.Update(DispatchSegmentInfo(i, std::move(segment_info_[i])));
-
233  }
-
234  segment_info_[i].reset(new SegmentInfo);
-
235  subsegment_info_[i].reset();
-
236  }
-
237  return status;
-
238 }
-
239 
-
240 Status ChunkingHandler::DispatchSubsegmentInfoForAllStreams() {
-
241  Status status;
-
242  for (size_t i = 0; i < subsegment_info_.size() && status.ok(); ++i) {
-
243  if (subsegment_info_[i] && subsegment_info_[i]->start_timestamp != -1) {
-
244  subsegment_info_[i]->duration =
-
245  last_sample_end_timestamps_[i] - subsegment_info_[i]->start_timestamp;
-
246  status.Update(DispatchSegmentInfo(i, std::move(subsegment_info_[i])));
-
247  }
-
248  subsegment_info_[i].reset(new SegmentInfo);
-
249  subsegment_info_[i]->is_subsegment = true;
-
250  }
-
251  return status;
-
252 }
-
253 
-
254 } // namespace media
-
255 } // namespace shaka
+
179  if (new_segment) {
+
180  status.Update(DispatchSegmentInfoForAllStreams());
+
181  segment_info_[main_stream_index_]->start_timestamp = timestamp;
+
182  }
+
183  if (subsegment_duration_ > 0 && (new_segment || new_subsegment)) {
+
184  status.Update(DispatchSubsegmentInfoForAllStreams());
+
185  subsegment_info_[main_stream_index_]->start_timestamp = timestamp;
+
186  }
+
187  if (!status.ok())
+
188  return status;
+
189 
+
190  // Dispatch non-main samples for the next segment.
+
191  return DispatchNonMainSamples(kTimeStampToDispatchAllSamples);
+
192 }
+
193 
+
194 Status ChunkingHandler::DispatchNonMainSamples(int64_t timestamp_threshold) {
+
195  Status status;
+
196  while (status.ok() && !non_main_samples_.empty()) {
+
197  DCHECK_EQ(non_main_samples_.front()->stream_data_type,
+
198  StreamDataType::kMediaSample);
+
199  const size_t stream_index = non_main_samples_.front()->stream_index;
+
200  const MediaSample* sample = non_main_samples_.front()->media_sample.get();
+
201  // If the portion of the sample before |timestamp_threshold| is bigger than
+
202  // the other portion, we consider it part of the current segment.
+
203  const int64_t timestamp = sample->dts() + sample->duration() / 2;
+
204  const bool stop =
+
205  (timestamp_threshold != kTimeStampToDispatchAllSamples &&
+
206  (static_cast<double>(timestamp) / time_scales_[stream_index]) >
+
207  (static_cast<double>(timestamp_threshold) /
+
208  time_scales_[main_stream_index_]));
+
209  VLOG(3) << "Sample ts: " << sample->dts() << " "
+
210  << " duration: " << sample->duration()
+
211  << " scale: " << time_scales_[stream_index] << "\n"
+
212  << " threshold: " << timestamp_threshold
+
213  << " scale: " << time_scales_[main_stream_index_]
+
214  << (stop ? " stop "
+
215  : (segment_info_[stream_index] ? " dispatch "
+
216  : " discard "));
+
217  if (stop)
+
218  break;
+
219  // Only dispatch samples if the segment has started, otherwise discard
+
220  // them.
+
221  if (segment_info_[stream_index]) {
+
222  if (segment_info_[stream_index]->start_timestamp == -1)
+
223  segment_info_[stream_index]->start_timestamp = sample->dts();
+
224  if (subsegment_info_[stream_index] &&
+
225  subsegment_info_[stream_index]->start_timestamp == -1) {
+
226  subsegment_info_[stream_index]->start_timestamp = sample->dts();
+
227  }
+
228  last_sample_end_timestamps_[stream_index] =
+
229  sample->dts() + sample->duration();
+
230  status.Update(Dispatch(std::move(non_main_samples_.front())));
+
231  }
+
232  non_main_samples_.pop_front();
+
233  }
+
234  return status;
+
235 }
+
236 
+
237 Status ChunkingHandler::DispatchSegmentInfoForAllStreams() {
+
238  Status status;
+
239  for (size_t i = 0; i < segment_info_.size() && status.ok(); ++i) {
+
240  if (segment_info_[i] && segment_info_[i]->start_timestamp != -1) {
+
241  segment_info_[i]->duration =
+
242  last_sample_end_timestamps_[i] - segment_info_[i]->start_timestamp;
+
243  status.Update(DispatchSegmentInfo(i, std::move(segment_info_[i])));
+
244  }
+
245  segment_info_[i].reset(new SegmentInfo);
+
246  subsegment_info_[i].reset();
+
247  }
+
248  return status;
+
249 }
+
250 
+
251 Status ChunkingHandler::DispatchSubsegmentInfoForAllStreams() {
+
252  Status status;
+
253  for (size_t i = 0; i < subsegment_info_.size() && status.ok(); ++i) {
+
254  if (subsegment_info_[i] && subsegment_info_[i]->start_timestamp != -1) {
+
255  subsegment_info_[i]->duration =
+
256  last_sample_end_timestamps_[i] - subsegment_info_[i]->start_timestamp;
+
257  status.Update(DispatchSegmentInfo(i, std::move(subsegment_info_[i])));
+
258  }
+
259  subsegment_info_[i].reset(new SegmentInfo);
+
260  subsegment_info_[i]->is_subsegment = true;
+
261  }
+
262  return status;
+
263 }
+
264 
+
265 } // namespace media
+
266 } // namespace shaka
Status Process(std::unique_ptr< StreamData > stream_data) override
Status Dispatch(std::unique_ptr< StreamData > stream_data)
Status InitializeInternal() override
-
Status OnFlushRequest(size_t input_stream_index) override
Event handler for flush request at the specific input stream index.
+
Status OnFlushRequest(size_t input_stream_index) override
Event handler for flush request at the specific input stream index.
Status FlushDownstream(size_t output_stream_index)
Flush the downstream connected at the specified output stream index.
Class to hold a media sample.
Definition: media_sample.h:22
double segment_duration_in_seconds
Segment duration in seconds.
-
Status DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
Dispatch the segment info to downstream handlers.
+
Status DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
Dispatch the segment info to downstream handlers.
double subsegment_duration_in_seconds
diff --git a/docs/d9/d13/classshaka_1_1media_1_1BufferReader.html b/docs/d9/d13/classshaka_1_1media_1_1BufferReader.html index 2530cdc8e0..fa3b3a601a 100644 --- a/docs/d9/d13/classshaka_1_1media_1_1BufferReader.html +++ b/docs/d9/d13/classshaka_1_1media_1_1BufferReader.html @@ -276,7 +276,7 @@ bool ReadNBytesInto8s diff --git a/docs/d9/d1f/structshaka_1_1media_1_1mp4_1_1MovieFragment.html b/docs/d9/d1f/structshaka_1_1media_1_1mp4_1_1MovieFragment.html index fb24d74311..1ac6480a13 100644 --- a/docs/d9/d1f/structshaka_1_1media_1_1mp4_1_1MovieFragment.html +++ b/docs/d9/d1f/structshaka_1_1media_1_1mp4_1_1MovieFragment.html @@ -180,7 +180,7 @@ Additional Inherited Members diff --git a/docs/d9/d26/classshaka_1_1media_1_1AesEncryptor-members.html b/docs/d9/d26/classshaka_1_1media_1_1AesEncryptor-members.html index 5d093d3193..46e899b234 100644 --- a/docs/d9/d26/classshaka_1_1media_1_1AesEncryptor-members.html +++ b/docs/d9/d26/classshaka_1_1media_1_1AesEncryptor-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html b/docs/d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html index 5a1dd09a23..94aa7993f6 100644 --- a/docs/d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html +++ b/docs/d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html @@ -437,7 +437,7 @@ void set_progress_target diff --git a/docs/d9/d36/classshaka_1_1media_1_1TracksBuilder-members.html b/docs/d9/d36/classshaka_1_1media_1_1TracksBuilder-members.html index c3eaa4c996..488d097470 100644 --- a/docs/d9/d36/classshaka_1_1media_1_1TracksBuilder-members.html +++ b/docs/d9/d36/classshaka_1_1media_1_1TracksBuilder-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d3b/webm__content__encodings_8h_source.html b/docs/d9/d3b/webm__content__encodings_8h_source.html index 230157bbf7..6368c77646 100644 --- a/docs/d9/d3b/webm__content__encodings_8h_source.html +++ b/docs/d9/d3b/webm__content__encodings_8h_source.html @@ -179,7 +179,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d3c/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox.html b/docs/d9/d3c/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox.html index 4eb3958e5c..4a1f0d4d02 100644 --- a/docs/d9/d3c/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox.html +++ b/docs/d9/d3c/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox.html @@ -166,7 +166,7 @@ Additional Inherited Members diff --git a/docs/d9/d3e/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox.html b/docs/d9/d3e/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox.html index 6dc636bd6e..c81ff3ca97 100644 --- a/docs/d9/d3e/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox.html +++ b/docs/d9/d3e/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html b/docs/d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html index 2661c5aa83..b189875afa 100644 --- a/docs/d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html +++ b/docs/d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html @@ -320,7 +320,7 @@ Public Member Functions diff --git a/docs/d9/d65/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges-members.html b/docs/d9/d65/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges-members.html index 03691376b5..19382c7844 100644 --- a/docs/d9/d65/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges-members.html +++ b/docs/d9/d65/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d67/structshaka_1_1media_1_1H265VuiParameters.html b/docs/d9/d67/structshaka_1_1media_1_1H265VuiParameters.html index 1854ba3fc9..8b4f40d37c 100644 --- a/docs/d9/d67/structshaka_1_1media_1_1H265VuiParameters.html +++ b/docs/d9/d67/structshaka_1_1media_1_1H265VuiParameters.html @@ -131,7 +131,7 @@ int min_spatial_segmentati diff --git a/docs/d9/d68/classshaka_1_1media_1_1CombinedMuxerListener.html b/docs/d9/d68/classshaka_1_1media_1_1CombinedMuxerListener.html index 273dee7af6..6d671f61a8 100644 --- a/docs/d9/d68/classshaka_1_1media_1_1CombinedMuxerListener.html +++ b/docs/d9/d68/classshaka_1_1media_1_1CombinedMuxerListener.html @@ -437,7 +437,7 @@ Additional Inherited Members diff --git a/docs/d9/d6a/structshaka_1_1media_1_1H264SliceHeader-members.html b/docs/d9/d6a/structshaka_1_1media_1_1H264SliceHeader-members.html index 89d991f4ce..142f144d13 100644 --- a/docs/d9/d6a/structshaka_1_1media_1_1H264SliceHeader-members.html +++ b/docs/d9/d6a/structshaka_1_1media_1_1H264SliceHeader-members.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d76/ts__muxer_8cc_source.html b/docs/d9/d76/ts__muxer_8cc_source.html index 6a35a39c3b..240d6a32bb 100644 --- a/docs/d9/d76/ts__muxer_8cc_source.html +++ b/docs/d9/d76/ts__muxer_8cc_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d81/classshaka_1_1media_1_1ClosureThread-members.html b/docs/d9/d81/classshaka_1_1media_1_1ClosureThread-members.html index dd93d94077..ab88cfb038 100644 --- a/docs/d9/d81/classshaka_1_1media_1_1ClosureThread-members.html +++ b/docs/d9/d81/classshaka_1_1media_1_1ClosureThread-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d86/limits_8h_source.html b/docs/d9/d86/limits_8h_source.html index 2f8f6d3bd7..a1af862bfb 100644 --- a/docs/d9/d86/limits_8h_source.html +++ b/docs/d9/d86/limits_8h_source.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d87/classshaka_1_1media_1_1WebMContentEncodingsClient.html b/docs/d9/d87/classshaka_1_1media_1_1WebMContentEncodingsClient.html index 989de3539b..a0714f4e0a 100644 --- a/docs/d9/d87/classshaka_1_1media_1_1WebMContentEncodingsClient.html +++ b/docs/d9/d87/classshaka_1_1media_1_1WebMContentEncodingsClient.html @@ -152,7 +152,7 @@ Additional Inherited Members diff --git a/docs/d9/d8c/classshaka_1_1media_1_1AesRequestSigner.html b/docs/d9/d8c/classshaka_1_1media_1_1AesRequestSigner.html index 7aba3c8607..40ac22751f 100644 --- a/docs/d9/d8c/classshaka_1_1media_1_1AesRequestSigner.html +++ b/docs/d9/d8c/classshaka_1_1media_1_1AesRequestSigner.html @@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/d9/d90/classshaka_1_1media_1_1ProtectionSystemSpecificInfo-members.html b/docs/d9/d90/classshaka_1_1media_1_1ProtectionSystemSpecificInfo-members.html index 57f1dcafeb..1731f58413 100644 --- a/docs/d9/d90/classshaka_1_1media_1_1ProtectionSystemSpecificInfo-members.html +++ b/docs/d9/d90/classshaka_1_1media_1_1ProtectionSystemSpecificInfo-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d90/text__track_8h_source.html b/docs/d9/d90/text__track_8h_source.html index 6ede93bcee..7557c02f67 100644 --- a/docs/d9/d90/text__track_8h_source.html +++ b/docs/d9/d90/text__track_8h_source.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d9b/classshaka_1_1hls_1_1MediaPlaylistFactory.html b/docs/d9/d9b/classshaka_1_1hls_1_1MediaPlaylistFactory.html index 79d28e82dd..9f5d1538c2 100644 --- a/docs/d9/d9b/classshaka_1_1hls_1_1MediaPlaylistFactory.html +++ b/docs/d9/d9b/classshaka_1_1hls_1_1MediaPlaylistFactory.html @@ -114,7 +114,7 @@ virtual std::unique_ptr
diff --git a/docs/d9/da4/stream__descriptor_8h_source.html b/docs/d9/da4/stream__descriptor_8h_source.html index 6ea4ab1306..c4eceeb3c3 100644 --- a/docs/d9/da4/stream__descriptor_8h_source.html +++ b/docs/d9/da4/stream__descriptor_8h_source.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/da5/classshaka_1_1media_1_1MpdNotifyMuxerListener.html b/docs/d9/da5/classshaka_1_1media_1_1MpdNotifyMuxerListener.html index 296bd071d7..1785c30652 100644 --- a/docs/d9/da5/classshaka_1_1media_1_1MpdNotifyMuxerListener.html +++ b/docs/d9/da5/classshaka_1_1media_1_1MpdNotifyMuxerListener.html @@ -471,7 +471,7 @@ Additional Inherited Members diff --git a/docs/d9/da6/structshaka_1_1media_1_1Cue-members.html b/docs/d9/da6/structshaka_1_1media_1_1Cue-members.html index 29792a1eb0..8feaf72fa9 100644 --- a/docs/d9/da6/structshaka_1_1media_1_1Cue-members.html +++ b/docs/d9/da6/structshaka_1_1media_1_1Cue-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/da7/classshaka_1_1media_1_1mp4_1_1Segmenter-members.html b/docs/d9/da7/classshaka_1_1media_1_1mp4_1_1Segmenter-members.html index 5de4189d7d..8a0709050f 100644 --- a/docs/d9/da7/classshaka_1_1media_1_1mp4_1_1Segmenter-members.html +++ b/docs/d9/da7/classshaka_1_1media_1_1mp4_1_1Segmenter-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/da8/structshaka_1_1BufferCallbackParams.html b/docs/d9/da8/structshaka_1_1BufferCallbackParams.html index eec84bb05e..71f5f88614 100644 --- a/docs/d9/da8/structshaka_1_1BufferCallbackParams.html +++ b/docs/d9/da8/structshaka_1_1BufferCallbackParams.html @@ -151,7 +151,7 @@ std::string &name, const void
diff --git a/docs/d9/db2/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator-members.html b/docs/d9/db2/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator-members.html index 6c27958e10..fa34c9ca11 100644 --- a/docs/d9/db2/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator-members.html +++ b/docs/d9/db2/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/db9/content__protection__element_8cc_source.html b/docs/d9/db9/content__protection__element_8cc_source.html index a20ac2bfbf..f8c106b332 100644 --- a/docs/d9/db9/content__protection__element_8cc_source.html +++ b/docs/d9/db9/content__protection__element_8cc_source.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/db9/muxer_8cc_source.html b/docs/d9/db9/muxer_8cc_source.html index 71b2ea2b89..b0991fb071 100644 --- a/docs/d9/db9/muxer_8cc_source.html +++ b/docs/d9/db9/muxer_8cc_source.html @@ -181,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/dc4/classshaka_1_1media_1_1BufferReader-members.html b/docs/d9/dc4/classshaka_1_1media_1_1BufferReader-members.html index 181f38d117..61ea73a180 100644 --- a/docs/d9/dc4/classshaka_1_1media_1_1BufferReader-members.html +++ b/docs/d9/dc4/classshaka_1_1media_1_1BufferReader-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/dc4/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry-members.html b/docs/d9/dc4/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry-members.html index fdd0d5a6a5..9bc0f036dc 100644 --- a/docs/d9/dc4/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry-members.html +++ b/docs/d9/dc4/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d64/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter-members.html b/docs/d9/dc7/classshaka_1_1media_1_1BitWriter-members.html similarity index 56% rename from docs/da/d64/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter-members.html rename to docs/d9/dc7/classshaka_1_1media_1_1BitWriter-members.html index 33b1f37fc9..5220a5a2b8 100644 --- a/docs/da/d64/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter-members.html +++ b/docs/d9/dc7/classshaka_1_1media_1_1BitWriter-members.html @@ -82,29 +82,27 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
shaka::media::mp2t::H264ProgramMapTableWriter Member List
+
shaka::media::BitWriter Member List
-

This is the complete list of members for shaka::media::mp2t::H264ProgramMapTableWriter, including all inherited members.

+

This is the complete list of members for shaka::media::BitWriter, including all inherited members.

- - - - - - - - + + + + + +
ClearSegmentPmt(BufferWriter *writer) overrideshaka::media::mp2t::H264ProgramMapTableWritervirtual
EncryptedSegmentPmt(BufferWriter *writer) overrideshaka::media::mp2t::H264ProgramMapTableWritervirtual
H264ProgramMapTableWriter(ContinuityCounter *continuity_counter) (defined in shaka::media::mp2t::H264ProgramMapTableWriter)shaka::media::mp2t::H264ProgramMapTableWriterexplicit
kElementaryPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
kPmtPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
ProgramMapTableWriter() (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriter
~H264ProgramMapTableWriter() override (defined in shaka::media::mp2t::H264ProgramMapTableWriter)shaka::media::mp2t::H264ProgramMapTableWriter
~ProgramMapTableWriter() (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWritervirtual
BitPos() const shaka::media::BitWriterinline
BitWriter(std::vector< uint8_t > *storage)shaka::media::BitWriterexplicit
BytePos() const shaka::media::BitWriterinline
Flush()shaka::media::BitWriter
WriteBits(uint32_t bits, size_t number_of_bits)shaka::media::BitWriter
~BitWriter()=default (defined in shaka::media::BitWriter)shaka::media::BitWriter
diff --git a/docs/d9/dc8/webm__constants_8cc_source.html b/docs/d9/dc8/webm__constants_8cc_source.html index fe9810b5ef..663f1c950e 100644 --- a/docs/d9/dc8/webm__constants_8cc_source.html +++ b/docs/d9/dc8/webm__constants_8cc_source.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/dcc/webm__video__client_8h_source.html b/docs/d9/dcc/webm__video__client_8h_source.html index ebc515b428..77b5c5be8d 100644 --- a/docs/d9/dcc/webm__video__client_8h_source.html +++ b/docs/d9/dcc/webm__video__client_8h_source.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/dd2/structshaka_1_1WidevineEncryptionParams.html b/docs/d9/dd2/structshaka_1_1WidevineEncryptionParams.html index f69ea658d2..5d2d7d021d 100644 --- a/docs/d9/dd2/structshaka_1_1WidevineEncryptionParams.html +++ b/docs/d9/dd2/structshaka_1_1WidevineEncryptionParams.html @@ -150,7 +150,7 @@ std::vector< uint8_t >  diff --git a/docs/d9/dda/ac3__header_8cc_source.html b/docs/d9/dda/ac3__header_8cc_source.html new file mode 100644 index 0000000000..6edbefb440 --- /dev/null +++ b/docs/d9/dda/ac3__header_8cc_source.html @@ -0,0 +1,257 @@ + + + + + + +Shaka Packager SDK: packager/media/formats/mp2t/ac3_header.cc Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
ac3_header.cc
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #include "packager/media/formats/mp2t/ac3_header.h"
+
8 
+
9 #include "packager/media/base/bit_reader.h"
+
10 #include "packager/media/base/bit_writer.h"
+
11 #include "packager/media/formats/mp2t/mp2t_common.h"
+
12 
+
13 namespace shaka {
+
14 namespace media {
+
15 namespace mp2t {
+
16 namespace {
+
17 
+
18 // ASTC Standard A/52:2012 Table 5.6 Sample Rate Codes.
+
19 const uint32_t kAc3SampleRateTable[] = {48000, 44100, 32000};
+
20 
+
21 // ASTC Standard A/52:2012 Table 5.8 Audio Coding Mode.
+
22 const uint8_t kAc3NumChannelsTable[] = {2, 1, 2, 3, 3, 4, 4, 5};
+
23 
+
24 // ATSC Standard A/52:2012 Table 5.18 Frame Size Code Table
+
25 // (in words = 16 bits).
+
26 const size_t kFrameSizeCodeTable[][3] = {
+
27  {96, 69, 64}, {96, 70, 64}, {120, 87, 80},
+
28  {120, 88, 80}, {144, 104, 96}, {144, 105, 96},
+
29  {168, 121, 112}, {168, 122, 112}, {192, 139, 128},
+
30  {192, 140, 128}, {240, 174, 160}, {240, 175, 160},
+
31  {288, 208, 192}, {288, 209, 192}, {336, 243, 224},
+
32  {336, 244, 224}, {384, 278, 256}, {384, 279, 256},
+
33  {480, 348, 320}, {480, 349, 320}, {576, 417, 384},
+
34  {576, 418, 384}, {672, 487, 448}, {672, 488, 448},
+
35  {768, 557, 512}, {768, 558, 512}, {960, 696, 640},
+
36  {960, 697, 640}, {1152, 835, 768}, {1152, 836, 768},
+
37  {1344, 975, 896}, {1344, 976, 896}, {1536, 1114, 1024},
+
38  {1536, 1115, 1024}, {1728, 1253, 1152}, {1728, 1254, 1152},
+
39  {1920, 1393, 1280}, {1920, 1394, 1280},
+
40 };
+
41 
+
42 } // namespace
+
43 
+
44 bool Ac3Header::IsSyncWord(const uint8_t* buf) const {
+
45  DCHECK(buf);
+
46  // ATSC Standard A/52:2012 5.4.1 syncinfo: Synchronization Information.
+
47  return buf[0] == 0x0B && buf[1] == 0x77;
+
48 }
+
49 
+ +
51  // Arbitrary. Actual frame size starts with 96 words.
+
52  const size_t kMinAc3FrameSize = 10u;
+
53  return kMinAc3FrameSize;
+
54 }
+
55 
+ +
57  // ATSC Standard A/52:2012
+
58  // Annex A: AC-3 Elementary Streams in the MPEG-2 Multiplex.
+
59  const size_t kSamplesPerAc3Frame = 1536;
+
60  return kSamplesPerAc3Frame;
+
61 }
+
62 
+
63 bool Ac3Header::Parse(const uint8_t* audio_frame, size_t audio_frame_size) {
+
64  BitReader frame(audio_frame, audio_frame_size);
+
65 
+
66  // ASTC Standard A/52:2012 5. BIT STREAM SYNTAX.
+
67  // syncinfo: synchronization information section.
+
68  uint16_t syncword;
+
69  RCHECK(frame.ReadBits(16, &syncword));
+
70  RCHECK(syncword == 0x0B77);
+
71  uint16_t crc1;
+
72  RCHECK(frame.ReadBits(16, &crc1));
+
73  RCHECK(frame.ReadBits(2, &fscod_));
+
74  RCHECK(fscod_ < arraysize(kAc3SampleRateTable));
+
75  RCHECK(frame.ReadBits(6, &frmsizecod_));
+
76  RCHECK(frmsizecod_ < arraysize(kFrameSizeCodeTable));
+
77 
+
78  // bsi: bit stream information section.
+
79  RCHECK(frame.ReadBits(5, &bsid_));
+
80  RCHECK(frame.ReadBits(3, &bsmod_));
+
81 
+
82  RCHECK(frame.ReadBits(3, &acmod_));
+
83  RCHECK(acmod_ < arraysize(kAc3NumChannelsTable));
+
84  // If 3 front channels.
+
85  if ((acmod_ & 0x01) && (acmod_ != 0x01))
+
86  RCHECK(frame.SkipBits(2)); // cmixlev.
+
87  // If a surround channel exists.
+
88  if (acmod_ & 0x04)
+
89  RCHECK(frame.SkipBits(2)); // surmixlev.
+
90  // If in 2/0 mode.
+
91  if (acmod_ == 0x02)
+
92  RCHECK(frame.SkipBits(2)); // dsurmod.
+
93 
+
94  RCHECK(frame.ReadBits(1, &lfeon_));
+
95 
+
96  return true;
+
97 }
+
98 
+
99 size_t Ac3Header::GetHeaderSize() const {
+
100  // Unlike ADTS, for AC3, the whole frame is included in the media sample, so
+
101  // return 0 header size.
+
102  return 0;
+
103 }
+
104 
+
105 size_t Ac3Header::GetFrameSize() const {
+
106  DCHECK_LT(fscod_, arraysize(kAc3SampleRateTable));
+
107  DCHECK_LT(frmsizecod_, arraysize(kFrameSizeCodeTable));
+
108  return kFrameSizeCodeTable[frmsizecod_][fscod_] * 2;
+
109 }
+
110 
+
111 void Ac3Header::GetAudioSpecificConfig(std::vector<uint8_t>* buffer) const {
+
112  DCHECK(buffer);
+
113  buffer->clear();
+
114  BitWriter config(buffer);
+
115  // Accoding to ETSI TS 102 366 V1.3.1 (2014-08) F.4 AC3SpecificBox.
+
116  config.WriteBits(fscod_, 2);
+
117  config.WriteBits(bsid_, 5);
+
118  config.WriteBits(bsmod_, 3);
+
119  config.WriteBits(acmod_, 3);
+
120  config.WriteBits(lfeon_, 1);
+
121  const uint8_t bit_rate_code = frmsizecod_ >> 1;
+
122  config.WriteBits(bit_rate_code, 5);
+
123  config.Flush();
+
124 }
+
125 
+
126 uint8_t Ac3Header::GetObjectType() const {
+
127  // Only useful for AAC. Return a dummy value instead.
+
128  return 0;
+
129 }
+
130 
+ +
132  DCHECK_LT(fscod_, arraysize(kAc3SampleRateTable));
+
133  return kAc3SampleRateTable[fscod_];
+
134 }
+
135 
+
136 uint8_t Ac3Header::GetNumChannels() const {
+
137  DCHECK_LT(acmod_, arraysize(kAc3NumChannelsTable));
+
138  return kAc3NumChannelsTable[acmod_] + (lfeon_ ? 1 : 0);
+
139 }
+
140 
+
141 } // namespace mp2t
+
142 } // namespace media
+
143 } // namespace shaka
+
bool ReadBits(size_t num_bits, T *out)
Definition: bit_reader.h:35
+
size_t GetHeaderSize() const override
Definition: ac3_header.cc:99
+
A class to read bit streams.
Definition: bit_reader.h:17
+
bool IsSyncWord(const uint8_t *buf) const override
Definition: ac3_header.cc:44
+ +
size_t GetMinFrameSize() const override
Definition: ac3_header.cc:50
+
uint32_t GetSamplingFrequency() const override
Definition: ac3_header.cc:131
+
size_t GetFrameSize() const override
Definition: ac3_header.cc:105
+
bool SkipBits(size_t num_bits)
Definition: bit_reader.cc:24
+
uint8_t GetObjectType() const override
Definition: ac3_header.cc:126
+
bool Parse(const uint8_t *adts_frame, size_t adts_frame_size) override
Definition: ac3_header.cc:63
+
void WriteBits(uint32_t bits, size_t number_of_bits)
Definition: bit_writer.cc:15
+
size_t GetSamplesPerFrame() const override
Definition: ac3_header.cc:56
+
uint8_t GetNumChannels() const override
Definition: ac3_header.cc:136
+
void GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const override
Definition: ac3_header.cc:111
+
void Flush()
Write pending bits, and align bitstream with extra zero bits.
Definition: bit_writer.cc:31
+
+ + + + diff --git a/docs/d9/de0/structshaka_1_1media_1_1Range.html b/docs/d9/de0/structshaka_1_1media_1_1Range.html index 6bed0537ce..d9d243fdce 100644 --- a/docs/d9/de0/structshaka_1_1media_1_1Range.html +++ b/docs/d9/de0/structshaka_1_1media_1_1Range.html @@ -115,7 +115,7 @@ uint64_t end diff --git a/docs/d9/de2/mock__media__playlist_8cc_source.html b/docs/d9/de2/mock__media__playlist_8cc_source.html index d40a71453f..9a3b0a5300 100644 --- a/docs/d9/de2/mock__media__playlist_8cc_source.html +++ b/docs/d9/de2/mock__media__playlist_8cc_source.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/de3/muxer__listener__internal_8cc_source.html b/docs/d9/de3/muxer__listener__internal_8cc_source.html index 1d9e3157fc..6cc0b81436 100644 --- a/docs/d9/de3/muxer__listener__internal_8cc_source.html +++ b/docs/d9/de3/muxer__listener__internal_8cc_source.html @@ -364,7 +364,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/deb/classshaka_1_1hls_1_1HlsNotifier.html b/docs/d9/deb/classshaka_1_1hls_1_1HlsNotifier.html index de1c45e814..09a4af6502 100644 --- a/docs/d9/deb/classshaka_1_1hls_1_1HlsNotifier.html +++ b/docs/d9/deb/classshaka_1_1hls_1_1HlsNotifier.html @@ -411,7 +411,7 @@ Public Member Functions diff --git a/docs/d9/ded/aac__audio__specific__config_8cc_source.html b/docs/d9/ded/aac__audio__specific__config_8cc_source.html index 214dd8fde1..e671efcd2b 100644 --- a/docs/d9/ded/aac__audio__specific__config_8cc_source.html +++ b/docs/d9/ded/aac__audio__specific__config_8cc_source.html @@ -363,7 +363,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/df8/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime-members.html b/docs/d9/df8/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime-members.html index 89decb5f61..f02b01c4eb 100644 --- a/docs/d9/df8/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime-members.html +++ b/docs/d9/df8/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/df9/classshaka_1_1media_1_1OffsetByteQueue.html b/docs/d9/df9/classshaka_1_1media_1_1OffsetByteQueue.html index 766ebf2cda..1ad4e3d69d 100644 --- a/docs/d9/df9/classshaka_1_1media_1_1OffsetByteQueue.html +++ b/docs/d9/df9/classshaka_1_1media_1_1OffsetByteQueue.html @@ -242,7 +242,7 @@ false if max_offset > diff --git a/docs/d9/dfe/classshaka_1_1UdpOptions.html b/docs/d9/dfe/classshaka_1_1UdpOptions.html index 0aaa0fc234..8ec32364ac 100644 --- a/docs/d9/dfe/classshaka_1_1UdpOptions.html +++ b/docs/d9/dfe/classshaka_1_1UdpOptions.html @@ -170,7 +170,7 @@ Static Public Member Functions diff --git a/docs/d9/dff/structshaka_1_1media_1_1H264ModificationOfPicNum.html b/docs/d9/dff/structshaka_1_1media_1_1H264ModificationOfPicNum.html index a80900a3b4..eb725c9694 100644 --- a/docs/d9/dff/structshaka_1_1media_1_1H264ModificationOfPicNum.html +++ b/docs/d9/dff/structshaka_1_1media_1_1H264ModificationOfPicNum.html @@ -119,7 +119,7 @@ union { diff --git a/docs/da/d04/audio__stream__info_8cc_source.html b/docs/da/d04/audio__stream__info_8cc_source.html index 15d9018c54..39cf27c2d8 100644 --- a/docs/da/d04/audio__stream__info_8cc_source.html +++ b/docs/da/d04/audio__stream__info_8cc_source.html @@ -228,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d05/classshaka_1_1hls_1_1MediaPlaylist-members.html b/docs/da/d05/classshaka_1_1hls_1_1MediaPlaylist-members.html index 0cc01aeda7..c5f5082cdc 100644 --- a/docs/da/d05/classshaka_1_1hls_1_1MediaPlaylist-members.html +++ b/docs/da/d05/classshaka_1_1hls_1_1MediaPlaylist-members.html @@ -102,21 +102,22 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); GetDisplayResolution(uint32_t *width, uint32_t *height) const shaka::hls::MediaPlaylistvirtual GetLanguage() const shaka::hls::MediaPlaylistvirtual GetLongestSegmentDuration() const shaka::hls::MediaPlaylistvirtual - group_id() const (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistinline - MediaPlaylist(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &file_name, const std::string &name, const std::string &group_id)shaka::hls::MediaPlaylist - MediaPlaylistStreamType enum name (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylist - name() const (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistinline - SetCodecForTesting(const std::string &codec)shaka::hls::MediaPlaylist - SetMediaInfo(const MediaInfo &media_info)shaka::hls::MediaPlaylistvirtual - SetStreamTypeForTesting(MediaPlaylistStreamType stream_type)shaka::hls::MediaPlaylist - SetTargetDuration(uint32_t target_duration)shaka::hls::MediaPlaylistvirtual - stream_type() const (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistinline - WriteToFile(const std::string &file_path)shaka::hls::MediaPlaylistvirtual - ~MediaPlaylist() (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistvirtual + GetNumChannels() const shaka::hls::MediaPlaylistvirtual + group_id() const (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistinline + MediaPlaylist(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &file_name, const std::string &name, const std::string &group_id)shaka::hls::MediaPlaylist + MediaPlaylistStreamType enum name (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylist + name() const (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistinline + SetCodecForTesting(const std::string &codec)shaka::hls::MediaPlaylist + SetMediaInfo(const MediaInfo &media_info)shaka::hls::MediaPlaylistvirtual + SetStreamTypeForTesting(MediaPlaylistStreamType stream_type)shaka::hls::MediaPlaylist + SetTargetDuration(uint32_t target_duration)shaka::hls::MediaPlaylistvirtual + stream_type() const (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistinline + WriteToFile(const std::string &file_path)shaka::hls::MediaPlaylistvirtual + ~MediaPlaylist() (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistvirtual diff --git a/docs/da/d10/classshaka_1_1media_1_1mp2t_1_1EsParser.html b/docs/da/d10/classshaka_1_1media_1_1mp2t_1_1EsParser.html index a274e9f0bc..d6d0fd6718 100644 --- a/docs/da/d10/classshaka_1_1media_1_1mp2t_1_1EsParser.html +++ b/docs/da/d10/classshaka_1_1media_1_1mp2t_1_1EsParser.html @@ -100,10 +100,10 @@ Inheritance diagram for shaka::media::mp2t::EsParser:
-shaka::media::mp2t::EsParserAdts -shaka::media::mp2t::EsParserH26x -shaka::media::mp2t::EsParserH264 -shaka::media::mp2t::EsParserH265 +shaka::media::mp2t::EsParserAudio +shaka::media::mp2t::EsParserH26x +shaka::media::mp2t::EsParserH264 +shaka::media::mp2t::EsParserH265
@@ -146,7 +146,7 @@ uint32_t  diff --git a/docs/da/d10/classshaka_1_1media_1_1mp2t_1_1EsParser.png b/docs/da/d10/classshaka_1_1media_1_1mp2t_1_1EsParser.png index cbd418264b00b2fa7b6e84088ee32764c9daf565..2dc8ce02688053e96571d440b8bdd045b1e05f3e 100644 GIT binary patch literal 1900 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 F{0{(gS9SmZ diff --git a/docs/da/d17/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter-members.html b/docs/da/d17/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter-members.html new file mode 100644 index 0000000000..9de5261732 --- /dev/null +++ b/docs/da/d17/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter-members.html @@ -0,0 +1,113 @@ + + + + + + +Shaka Packager SDK: Member List + + + + + + + + + +
+
+
pid ()
+ + + + + +
+
Shaka Packager SDK +
+
+ + + + + + + + + + +
+ +
+ + + +
+
+
shaka::media::mp2t::AudioProgramMapTableWriter Member List
+
+
+ +

This is the complete list of members for shaka::media::mp2t::AudioProgramMapTableWriter, including all inherited members.

+ + + + + + + + + + +
AudioProgramMapTableWriter(Codec codec, const std::vector< uint8_t > &audio_specific_config) (defined in shaka::media::mp2t::AudioProgramMapTableWriter)shaka::media::mp2t::AudioProgramMapTableWriter
ClearSegmentPmt(BufferWriter *writer)shaka::media::mp2t::ProgramMapTableWritervirtual
codec() const shaka::media::mp2t::ProgramMapTableWriterinlineprotected
EncryptedSegmentPmt(BufferWriter *writer)shaka::media::mp2t::ProgramMapTableWritervirtual
kElementaryPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
kPmtPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
ProgramMapTableWriter(Codec codec) (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterexplicit
~AudioProgramMapTableWriter() override=default (defined in shaka::media::mp2t::AudioProgramMapTableWriter)shaka::media::mp2t::AudioProgramMapTableWriter
~ProgramMapTableWriter()=default (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWritervirtual
+ + + + diff --git a/docs/da/d1a/structshaka_1_1media_1_1mp4_1_1Language.html b/docs/da/d1a/structshaka_1_1media_1_1mp4_1_1Language.html index 7525961827..b857ea6607 100644 --- a/docs/da/d1a/structshaka_1_1media_1_1mp4_1_1Language.html +++ b/docs/da/d1a/structshaka_1_1media_1_1mp4_1_1Language.html @@ -120,7 +120,7 @@ std::string code< diff --git a/docs/da/d1c/classshaka_1_1media_1_1mp2t_1_1TsSection.html b/docs/da/d1c/classshaka_1_1media_1_1mp2t_1_1TsSection.html index ec88a4f90c..2ef845e818 100644 --- a/docs/da/d1c/classshaka_1_1media_1_1mp2t_1_1TsSection.html +++ b/docs/da/d1c/classshaka_1_1media_1_1mp2t_1_1TsSection.html @@ -141,7 +141,7 @@ virtual void Reset ()= diff --git a/docs/da/d1d/udp__options_8cc_source.html b/docs/da/d1d/udp__options_8cc_source.html index 03dd505b85..b03bd677a2 100644 --- a/docs/da/d1d/udp__options_8cc_source.html +++ b/docs/da/d1d/udp__options_8cc_source.html @@ -223,7 +223,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d23/classshaka_1_1media_1_1mp2t_1_1EsParserH26x.html b/docs/da/d23/classshaka_1_1media_1_1mp2t_1_1EsParserH26x.html index 317d9476ea..16e29391d3 100644 --- a/docs/da/d23/classshaka_1_1media_1_1mp2t_1_1EsParserH26x.html +++ b/docs/da/d23/classshaka_1_1media_1_1mp2t_1_1EsParserH26x.html @@ -164,7 +164,7 @@ const std::shared_ptr
diff --git a/docs/da/d23/ts__muxer_8h_source.html b/docs/da/d23/ts__muxer_8h_source.html index 06b69206bb..edfb4596cd 100644 --- a/docs/da/d23/ts__muxer_8h_source.html +++ b/docs/da/d23/ts__muxer_8h_source.html @@ -131,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
44 } // namespace shaka
45 
46 #endif // PACKAGER_MEDIA_FORMATS_MP2T_TS_MUXER_H_
- +
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
Class to hold a media sample.
Definition: media_sample.h:22
@@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d24/h265__parser_8h_source.html b/docs/da/d24/h265__parser_8h_source.html index eef4e8adb2..7b1c8907c1 100644 --- a/docs/da/d24/h265__parser_8h_source.html +++ b/docs/da/d24/h265__parser_8h_source.html @@ -454,7 +454,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d2a/text__stream__info_8h_source.html b/docs/da/d2a/text__stream__info_8h_source.html index ce247e164d..52a5a4fa6d 100644 --- a/docs/da/d2a/text__stream__info_8h_source.html +++ b/docs/da/d2a/text__stream__info_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d2d/classshaka_1_1media_1_1webm_1_1WebMMuxer-members.html b/docs/da/d2d/classshaka_1_1media_1_1webm_1_1WebMMuxer-members.html index 7e23d41c2d..3a97fa13c3 100644 --- a/docs/da/d2d/classshaka_1_1media_1_1webm_1_1WebMMuxer-members.html +++ b/docs/da/d2d/classshaka_1_1media_1_1webm_1_1WebMMuxer-members.html @@ -97,9 +97,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); Cancel()shaka::media::Muxer clock() (defined in shaka::media::Muxer)shaka::media::Muxerinlineprotected Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected - DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected + DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected - DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected + DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d3e/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio-members.html b/docs/da/d3e/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio-members.html index 51abe40111..c85bea7eca 100644 --- a/docs/da/d3e/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio-members.html +++ b/docs/da/d3e/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d41/mp4_2multi__segment__segmenter_8h_source.html b/docs/da/d41/mp4_2multi__segment__segmenter_8h_source.html index ffd3f472b1..ebda84f486 100644 --- a/docs/da/d41/mp4_2multi__segment__segmenter_8h_source.html +++ b/docs/da/d41/mp4_2multi__segment__segmenter_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d43/structshaka_1_1ContentProtectionElement.html b/docs/da/d43/structshaka_1_1ContentProtectionElement.html index 628e250250..eab28aa1cc 100644 --- a/docs/da/d43/structshaka_1_1ContentProtectionElement.html +++ b/docs/da/d43/structshaka_1_1ContentProtectionElement.html @@ -123,7 +123,7 @@ std::vector< El diff --git a/docs/da/d4a/media__playlist_8h_source.html b/docs/da/d4a/media__playlist_8h_source.html index 7648b9fe14..08b7d0a577 100644 --- a/docs/da/d4a/media__playlist_8h_source.html +++ b/docs/da/d4a/media__playlist_8h_source.html @@ -186,52 +186,55 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
153 
156  virtual std::string GetLanguage() const;
157 
-
160  virtual bool GetDisplayResolution(uint32_t* width, uint32_t* height) const;
-
161 
-
162  private:
-
163  // Remove elements from |entries_| for live profile. Increments
-
164  // |sequence_number_| by the number of segments removed.
-
165  void SlideWindow();
-
166 
-
167  const HlsPlaylistType playlist_type_;
-
168  const double time_shift_buffer_depth_;
-
169  // Mainly for MasterPlaylist to use these values.
-
170  const std::string file_name_;
-
171  const std::string name_;
-
172  const std::string group_id_;
-
173  MediaInfo media_info_;
-
174  MediaPlaylistStreamType stream_type_ =
-
175  MediaPlaylistStreamType::kPlaylistUnknown;
-
176  std::string codec_;
-
177  int media_sequence_number_ = 0;
-
178  bool inserted_discontinuity_tag_ = false;
-
179  int discontinuity_sequence_number_ = 0;
-
180 
-
181  double longest_segment_duration_ = 0.0;
-
182  uint32_t time_scale_ = 0;
+
159  virtual int GetNumChannels() const;
+
160 
+
163  virtual bool GetDisplayResolution(uint32_t* width, uint32_t* height) const;
+
164 
+
165  private:
+
166  // Remove elements from |entries_| for live profile. Increments
+
167  // |sequence_number_| by the number of segments removed.
+
168  void SlideWindow();
+
169 
+
170  const HlsPlaylistType playlist_type_;
+
171  const double time_shift_buffer_depth_;
+
172  // Mainly for MasterPlaylist to use these values.
+
173  const std::string file_name_;
+
174  const std::string name_;
+
175  const std::string group_id_;
+
176  MediaInfo media_info_;
+
177  MediaPlaylistStreamType stream_type_ =
+
178  MediaPlaylistStreamType::kPlaylistUnknown;
+
179  std::string codec_;
+
180  int media_sequence_number_ = 0;
+
181  bool inserted_discontinuity_tag_ = false;
+
182  int discontinuity_sequence_number_ = 0;
183 
-
184  uint64_t max_bitrate_ = 0;
-
185 
-
186  // Cache the previous calls AddSegment() end offset. This is used to construct
-
187  // SegmentInfoEntry.
-
188  uint64_t previous_segment_end_offset_ = 0;
-
189 
-
190  // See SetTargetDuration() comments.
-
191  bool target_duration_set_ = false;
-
192  uint32_t target_duration_ = 0;
-
193 
-
194  std::list<std::unique_ptr<HlsEntry>> entries_;
-
195 
-
196  DISALLOW_COPY_AND_ASSIGN(MediaPlaylist);
-
197 };
+
184  double longest_segment_duration_ = 0.0;
+
185  uint32_t time_scale_ = 0;
+
186 
+
187  uint64_t max_bitrate_ = 0;
+
188 
+
189  // Cache the previous calls AddSegment() end offset. This is used to construct
+
190  // SegmentInfoEntry.
+
191  uint64_t previous_segment_end_offset_ = 0;
+
192 
+
193  // See SetTargetDuration() comments.
+
194  bool target_duration_set_ = false;
+
195  uint32_t target_duration_ = 0;
+
196 
+
197  std::list<std::unique_ptr<HlsEntry>> entries_;
198 
-
199 } // namespace hls
-
200 } // namespace shaka
+
199  DISALLOW_COPY_AND_ASSIGN(MediaPlaylist);
+
200 };
201 
-
202 #endif // PACKAGER_HLS_BASE_MEDIA_PLAYLIST_H_
+
202 } // namespace hls
+
203 } // namespace shaka
+
204 
+
205 #endif // PACKAGER_HLS_BASE_MEDIA_PLAYLIST_H_
MediaPlaylist(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &file_name, const std::string &name, const std::string &group_id)
void SetStreamTypeForTesting(MediaPlaylistStreamType stream_type)
For testing only.
+
virtual int GetNumChannels() const
HlsPlaylistType
Definition: hls_params.h:16
virtual uint64_t Bitrate() const
virtual void SetTargetDuration(uint32_t target_duration)
@@ -240,14 +243,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
Methods are virtual for mocking.
virtual double GetLongestSegmentDuration() const
virtual void AddSegment(const std::string &file_name, uint64_t start_time, uint64_t duration, uint64_t start_byte_offset, uint64_t size)
-
virtual bool GetDisplayResolution(uint32_t *width, uint32_t *height) const
+
virtual bool GetDisplayResolution(uint32_t *width, uint32_t *height) const
virtual void AddEncryptionInfo(EncryptionMethod method, const std::string &url, const std::string &key_id, const std::string &iv, const std::string &key_format, const std::string &key_format_versions)
virtual bool WriteToFile(const std::string &file_path)
void SetCodecForTesting(const std::string &codec)
For testing only.
diff --git a/docs/da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html b/docs/da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html index c39622cf81..fa5523574a 100644 --- a/docs/da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html +++ b/docs/da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html @@ -358,7 +358,7 @@ Static Public Member Functions diff --git a/docs/da/d50/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader.html b/docs/da/d50/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader.html index ab1232b018..3a25e7abe6 100644 --- a/docs/da/d50/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader.html +++ b/docs/da/d50/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/da/d53/es__parser__h265_8cc_source.html b/docs/da/d53/es__parser__h265_8cc_source.html index 582a9da473..d6159eb439 100644 --- a/docs/da/d53/es__parser__h265_8cc_source.html +++ b/docs/da/d53/es__parser__h265_8cc_source.html @@ -265,7 +265,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d55/simple__hls__notifier_8h_source.html b/docs/da/d55/simple__hls__notifier_8h_source.html index bac1a33d37..cb204717d4 100644 --- a/docs/da/d55/simple__hls__notifier_8h_source.html +++ b/docs/da/d55/simple__hls__notifier_8h_source.html @@ -124,79 +124,81 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
37 
40  public:
- -
52  double time_shift_buffer_depth,
-
53  const std::string& prefix,
-
54  const std::string& output_dir,
-
55  const std::string& master_playlist_name);
-
56  ~SimpleHlsNotifier() override;
-
57 
-
60  bool Init() override;
-
61  bool NotifyNewStream(const MediaInfo& media_info,
-
62  const std::string& playlist_name,
-
63  const std::string& stream_name,
-
64  const std::string& group_id,
-
65  uint32_t* stream_id) override;
-
66  bool NotifyNewSegment(uint32_t stream_id,
-
67  const std::string& segment_name,
-
68  uint64_t start_time,
-
69  uint64_t duration,
-
70  uint64_t start_byte_offset,
-
71  uint64_t size) override;
- -
73  uint32_t stream_id,
-
74  const std::vector<uint8_t>& key_id,
-
75  const std::vector<uint8_t>& system_id,
-
76  const std::vector<uint8_t>& iv,
-
77  const std::vector<uint8_t>& protection_system_specific_data) override;
-
78  bool Flush() override;
-
80 
-
81  private:
-
82  friend class SimpleHlsNotifierTest;
-
83 
-
84  struct StreamEntry {
-
85  std::unique_ptr<MediaPlaylist> media_playlist;
-
86  MediaPlaylist::EncryptionMethod encryption_method;
-
87  };
-
88 
-
89  const double time_shift_buffer_depth_ = 0;
-
90  const std::string prefix_;
-
91  const std::string output_dir_;
-
92  uint32_t target_duration_ = 0;
-
93 
-
94  std::unique_ptr<MediaPlaylistFactory> media_playlist_factory_;
-
95  std::unique_ptr<MasterPlaylist> master_playlist_;
-
96 
-
97  // Maps to unique_ptr because StreamEntry also holds unique_ptr
-
98  std::map<uint32_t, std::unique_ptr<StreamEntry>> stream_map_;
-
99 
-
100  base::AtomicSequenceNumber sequence_number_;
+ +
55  double time_shift_buffer_depth,
+
56  const std::string& prefix,
+
57  const std::string& key_uri,
+
58  const std::string& output_dir,
+
59  const std::string& master_playlist_name);
+
60  ~SimpleHlsNotifier() override;
+
61 
+
64  bool Init() override;
+
65  bool NotifyNewStream(const MediaInfo& media_info,
+
66  const std::string& playlist_name,
+
67  const std::string& stream_name,
+
68  const std::string& group_id,
+
69  uint32_t* stream_id) override;
+
70  bool NotifyNewSegment(uint32_t stream_id,
+
71  const std::string& segment_name,
+
72  uint64_t start_time,
+
73  uint64_t duration,
+
74  uint64_t start_byte_offset,
+
75  uint64_t size) override;
+ +
77  uint32_t stream_id,
+
78  const std::vector<uint8_t>& key_id,
+
79  const std::vector<uint8_t>& system_id,
+
80  const std::vector<uint8_t>& iv,
+
81  const std::vector<uint8_t>& protection_system_specific_data) override;
+
82  bool Flush() override;
+
84 
+
85  private:
+
86  friend class SimpleHlsNotifierTest;
+
87 
+
88  struct StreamEntry {
+
89  std::unique_ptr<MediaPlaylist> media_playlist;
+
90  MediaPlaylist::EncryptionMethod encryption_method;
+
91  };
+
92 
+
93  const double time_shift_buffer_depth_ = 0;
+
94  const std::string prefix_;
+
95  const std::string key_uri_;
+
96  const std::string output_dir_;
+
97  uint32_t target_duration_ = 0;
+
98 
+
99  std::unique_ptr<MediaPlaylistFactory> media_playlist_factory_;
+
100  std::unique_ptr<MasterPlaylist> master_playlist_;
101 
-
102  base::Lock lock_;
-
103 
-
104  DISALLOW_COPY_AND_ASSIGN(SimpleHlsNotifier);
-
105 };
+
102  // Maps to unique_ptr because StreamEntry also holds unique_ptr
+
103  std::map<uint32_t, std::unique_ptr<StreamEntry>> stream_map_;
+
104 
+
105  base::AtomicSequenceNumber sequence_number_;
106 
-
107 } // namespace hls
-
108 } // namespace shaka
-
109 
-
110 #endif // PACKAGER_HLS_BASE_SIMPLE_HLS_NOTIFIER_H_
-
SimpleHlsNotifier(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &prefix, const std::string &output_dir, const std::string &master_playlist_name)
+
107  base::Lock lock_;
+
108 
+
109  DISALLOW_COPY_AND_ASSIGN(SimpleHlsNotifier);
+
110 };
+
111 
+
112 } // namespace hls
+
113 } // namespace shaka
+
114 
+
115 #endif // PACKAGER_HLS_BASE_SIMPLE_HLS_NOTIFIER_H_
+
SimpleHlsNotifier(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &prefix, const std::string &key_uri, const std::string &output_dir, const std::string &master_playlist_name)
HlsPlaylistType
Definition: hls_params.h:16
-
bool NotifyNewSegment(uint32_t stream_id, const std::string &segment_name, uint64_t start_time, uint64_t duration, uint64_t start_byte_offset, uint64_t size) override
+
bool NotifyNewSegment(uint32_t stream_id, const std::string &segment_name, uint64_t start_time, uint64_t duration, uint64_t start_byte_offset, uint64_t size) override
- - + +
HlsPlaylistType playlist_type() const
Definition: hls_notifier.h:80
-
bool NotifyNewStream(const MediaInfo &media_info, const std::string &playlist_name, const std::string &stream_name, const std::string &group_id, uint32_t *stream_id) override
- -
bool NotifyEncryptionUpdate(uint32_t stream_id, const std::vector< uint8_t > &key_id, const std::vector< uint8_t > &system_id, const std::vector< uint8_t > &iv, const std::vector< uint8_t > &protection_system_specific_data) override
+
bool NotifyNewStream(const MediaInfo &media_info, const std::string &playlist_name, const std::string &stream_name, const std::string &group_id, uint32_t *stream_id) override
+ +
bool NotifyEncryptionUpdate(uint32_t stream_id, const std::vector< uint8_t > &key_id, const std::vector< uint8_t > &system_id, const std::vector< uint8_t > &iv, const std::vector< uint8_t > &protection_system_specific_data) override
diff --git a/docs/da/d59/structshaka_1_1media_1_1mp4_1_1CompactSampleSize.html b/docs/da/d59/structshaka_1_1media_1_1mp4_1_1CompactSampleSize.html index c7c2d3f1b2..00e7b9e325 100644 --- a/docs/da/d59/structshaka_1_1media_1_1mp4_1_1CompactSampleSize.html +++ b/docs/da/d59/structshaka_1_1media_1_1mp4_1_1CompactSampleSize.html @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/da/d5c/widevine__key__source_8h_source.html b/docs/da/d5c/widevine__key__source_8h_source.html index 13173afc11..c8cdd96f48 100644 --- a/docs/da/d5c/widevine__key__source_8h_source.html +++ b/docs/da/d5c/widevine__key__source_8h_source.html @@ -230,7 +230,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d5e/classshaka_1_1media_1_1H264VideoSliceHeaderParser-members.html b/docs/da/d5e/classshaka_1_1media_1_1H264VideoSliceHeaderParser-members.html index 26f17084f0..92e9345882 100644 --- a/docs/da/d5e/classshaka_1_1media_1_1H264VideoSliceHeaderParser-members.html +++ b/docs/da/d5e/classshaka_1_1media_1_1H264VideoSliceHeaderParser-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d60/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter-members.html b/docs/da/d60/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter-members.html index b5c1129090..8a6c33a694 100644 --- a/docs/da/d60/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter-members.html +++ b/docs/da/d60/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter-members.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html b/docs/da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.html similarity index 57% rename from docs/de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html rename to docs/da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.html index 2fcd0f110f..5304bef438 100644 --- a/docs/de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html +++ b/docs/da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: shaka::media::mp2t::H264ProgramMapTableWriter Class Reference +Shaka Packager SDK: shaka::media::mp2t::VideoProgramMapTableWriter Class Reference @@ -82,42 +82,49 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
shaka::media::mp2t::H264ProgramMapTableWriter Class Reference
+
shaka::media::mp2t::VideoProgramMapTableWriter Class Reference
+

ProgramMapTableWriter for video codecs. + More...

+

#include <program_map_table_writer.h>

-Inheritance diagram for shaka::media::mp2t::H264ProgramMapTableWriter:
+Inheritance diagram for shaka::media::mp2t::VideoProgramMapTableWriter:
- - -shaka::media::mp2t::ProgramMapTableWriter + + +shaka::media::mp2t::ProgramMapTableWriter
- - - - - - - - + + + + + + + + + + +

Public Member Functions

H264ProgramMapTableWriter (ContinuityCounter *continuity_counter)
 
-bool EncryptedSegmentPmt (BufferWriter *writer) override
 Writes TS packets with PMT for encrypted segments.
 
-bool ClearSegmentPmt (BufferWriter *writer) override
 Writes TS packets with PMT for clear segments.
 
VideoProgramMapTableWriter (Codec codec)
 
- Public Member Functions inherited from shaka::media::mp2t::ProgramMapTableWriter
ProgramMapTableWriter (Codec codec)
 
+virtual bool EncryptedSegmentPmt (BufferWriter *writer)
 Writes TS packets with PMT for encrypted segments.
 
+virtual bool ClearSegmentPmt (BufferWriter *writer)
 Writes TS packets with PMT for clear segments.
 
@@ -128,11 +135,14 @@ static const uint8_t  + + +

Additional Inherited Members

kPmtP
static const uint8_t kElementaryPid = 0x50
 
- Protected Member Functions inherited from shaka::media::mp2t::ProgramMapTableWriter
Codec codec () const
 

Detailed Description

-

This is not a general purpose PMT writer. This is intended to be used by TsWriter.

+

ProgramMapTableWriter for video codecs.

-

Definition at line 48 of file program_map_table_writer.h.

+

Definition at line 65 of file program_map_table_writer.h.


The documentation for this class was generated from the following files:
diff --git a/docs/da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.png b/docs/da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.png new file mode 100644 index 0000000000000000000000000000000000000000..e21996b8fa48e5c5dfecda307a87499ef67d7292 GIT binary patch literal 1151 zcmeAS@N?(olHy`uVBq!ia0y~yU{nRN12~w0WQOA8W*{XI;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z{2P0;uuoF_;&8wb&st$T&I^Wsr>K0 zFIUL=LH`6V*_U&ySKQ6Y67HGK_&@dbHr=hcx672xJiRg2a`m*%7M-WLm(Il1e`oZpT9kEr|K{I2ZRYY%4~@OD=YPu0{Vtx9 z-j%q$+WwhwnedUGHL_fqwlSr?FKyl^PbmBHyPxx2YQXmh-Tbqw4u8J*^oZsCotvDG zZSTD3TJ`Q0ZfdU$22`^ofl-doEv_fOJax->FAdF|{UcYUfn{+f9$+goB+t*6%5mi+2< zz@(pTqSrrtU3BH^@v1lNo!VziRikD99_|VH{LXRa4V$HQv#NNCy>f#lsqK1wZ!(YM zir=$l%3d&fYPayp^yLe$M1E(fsrW1S^W=F=-B<eyfd_3VJ8(ReL;k%S`@XmnL1B zuJ!KJl5fY48|;3}wz=x{7NL1EUki@=&gI?6TOK35#r&Pe$$N#9OfJSA^}MuwE04=0 zH(T@n7dEQcUguv{63sm6$(Qv(S*}W+3;%^rQF-}YQ`0kO$r2UMiIXO&xO#a_5_##G z35la^Vh8vy%QuJ|=$$0wu)w}vNcg~B5KDZ?5tf40OIQT7B^h13yci||1(yK1nwnJQ z{_33KrKuX~rD?v1VF|-DG>cwoRHpDV?mOdj`nzr7nZEYdM<4!uoW@wO446)W-)q>{ zMqXWU=J({({Vtpj{L&Samrm`jeZcIa-XR%jEfO?qeN~_p|L=(9vVZ?2U%U6V_vGz= z=hj%+$jdHUrrhytgKMqTi))*l(+W3pZl7AERCXaM^6mWZ6|oy+pSPCJ-+SZA$?ofk z2|Il5e@xSDzEku5#@>3_BRli+U$m_&urb-Zi7_upw#;m9PC<;&tS74tf9kxE{TUQB zi&ynY^PE3d@{FX)Y?stYt6q-#v*>T&EtaVHkGDLEvWlCs>sz@0SA)XVoy)G6D+$kh zZuC0A*z4@AW}}1EUVFcT(@oKvdy|W0XU)F-Z_0n8r%GP0?d%smd3`(Z)tYK1yMO<9 z{yuTY40Pw;_Wt*!2}P^9_q%R;=dHYS-($U7XV_~qJzqv1jh%Vr-w)Na@;eD(`cuOW zt((nWerN0PcYU+hnX%a4Da^ePcT!ok`gpG>`-j}x+rNwJ@5lT!4=l1|D_C7WHAq{i zAz*)}(1G{iK};P}rZ51rZ-a*?r^2P~AkC#qyfjnS{%6RYZ)@B!*~%7JS}=IJ`njxg HN@xNA-DMmb literal 0 HcmV?d00001 diff --git a/docs/da/d6e/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry.html b/docs/da/d6e/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry.html index 18de080120..d0de236ebc 100644 --- a/docs/da/d6e/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry.html +++ b/docs/da/d6e/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry.html @@ -120,7 +120,7 @@ int16_t roll_distance< diff --git a/docs/da/d85/classshaka_1_1media_1_1mp2t_1_1TsSegmenter-members.html b/docs/da/d85/classshaka_1_1media_1_1mp2t_1_1TsSegmenter-members.html index 9419fab95a..aaa28aae42 100644 --- a/docs/da/d85/classshaka_1_1media_1_1mp2t_1_1TsSegmenter-members.html +++ b/docs/da/d85/classshaka_1_1media_1_1mp2t_1_1TsSegmenter-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d88/mp4__muxer_8cc_source.html b/docs/da/d88/mp4__muxer_8cc_source.html index 23c3575c05..23a641a839 100644 --- a/docs/da/d88/mp4__muxer_8cc_source.html +++ b/docs/da/d88/mp4__muxer_8cc_source.html @@ -587,7 +587,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d8b/classshaka_1_1media_1_1WebMMediaParser-members.html b/docs/da/d8b/classshaka_1_1media_1_1WebMMediaParser-members.html index 27efbd978c..6c6c679a74 100644 --- a/docs/da/d8b/classshaka_1_1media_1_1WebMMediaParser-members.html +++ b/docs/da/d8b/classshaka_1_1media_1_1WebMMediaParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d8e/container__names_8cc_source.html b/docs/da/d8e/container__names_8cc_source.html index 59401f47b5..29f43796fe 100644 --- a/docs/da/d8e/container__names_8cc_source.html +++ b/docs/da/d8e/container__names_8cc_source.html @@ -1866,7 +1866,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d93/origin__handler_8cc_source.html b/docs/da/d93/origin__handler_8cc_source.html index 84d0cb6815..1cf01fc7cf 100644 --- a/docs/da/d93/origin__handler_8cc_source.html +++ b/docs/da/d93/origin__handler_8cc_source.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d93/structshaka_1_1media_1_1CueEvent.html b/docs/da/d93/structshaka_1_1media_1_1CueEvent.html new file mode 100644 index 0000000000..e13c74c0a8 --- /dev/null +++ b/docs/da/d93/structshaka_1_1media_1_1CueEvent.html @@ -0,0 +1,123 @@ + + + + + + +Shaka Packager SDK: shaka::media::CueEvent Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
shaka::media::CueEvent Struct Reference
+
+
+ + + + + + + + +

+Public Attributes

+int64_t timestamp = 0
 
+CueEventType type = CueEventType::kCuePoint
 
+std::string cue_data
 
+

Detailed Description

+
+

Definition at line 47 of file media_handler.h.

+

The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/da/d9b/structshaka_1_1media_1_1mp4_1_1CompositionOffset-members.html b/docs/da/d9b/structshaka_1_1media_1_1mp4_1_1CompositionOffset-members.html index 2de986f246..6b7833d4be 100644 --- a/docs/da/d9b/structshaka_1_1media_1_1mp4_1_1CompositionOffset-members.html +++ b/docs/da/d9b/structshaka_1_1media_1_1mp4_1_1CompositionOffset-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d9d/structshaka_1_1media_1_1mp4_1_1EC3Specific-members.html b/docs/da/d9d/structshaka_1_1media_1_1mp4_1_1EC3Specific-members.html index 752f1de02b..62f122ae6c 100644 --- a/docs/da/d9d/structshaka_1_1media_1_1mp4_1_1EC3Specific-members.html +++ b/docs/da/d9d/structshaka_1_1media_1_1mp4_1_1EC3Specific-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d9f/classshaka_1_1MpdNotifierFactory-members.html b/docs/da/d9f/classshaka_1_1MpdNotifierFactory-members.html index 8d37328b20..0b8330d4c6 100644 --- a/docs/da/d9f/classshaka_1_1MpdNotifierFactory-members.html +++ b/docs/da/d9f/classshaka_1_1MpdNotifierFactory-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d9f/classshaka_1_1media_1_1MockMuxerListener-members.html b/docs/da/d9f/classshaka_1_1media_1_1MockMuxerListener-members.html index 045dc96dea..c55bae9259 100644 --- a/docs/da/d9f/classshaka_1_1media_1_1MockMuxerListener-members.html +++ b/docs/da/d9f/classshaka_1_1media_1_1MockMuxerListener-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/da1/classshaka_1_1media_1_1mp2t_1_1TsPacket.html b/docs/da/da1/classshaka_1_1media_1_1mp2t_1_1TsPacket.html index c4ddee3204..e6d9c711e7 100644 --- a/docs/da/da1/classshaka_1_1media_1_1mp2t_1_1TsPacket.html +++ b/docs/da/da1/classshaka_1_1media_1_1mp2t_1_1TsPacket.html @@ -145,7 +145,7 @@ static const int kPacketSi diff --git a/docs/da/db2/classshaka_1_1Representation-members.html b/docs/da/db2/classshaka_1_1Representation-members.html index 3e0ed97cd8..59dac22a3d 100644 --- a/docs/da/db2/classshaka_1_1Representation-members.html +++ b/docs/da/db2/classshaka_1_1Representation-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dbb/structshaka_1_1media_1_1mp4_1_1HandlerReference.html b/docs/da/dbb/structshaka_1_1media_1_1mp4_1_1HandlerReference.html index 22a30f0c28..1c45a11cd1 100644 --- a/docs/da/dbb/structshaka_1_1media_1_1mp4_1_1HandlerReference.html +++ b/docs/da/dbb/structshaka_1_1media_1_1mp4_1_1HandlerReference.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/da/dc3/status_8cc_source.html b/docs/da/dc3/status_8cc_source.html index da22832f22..1f8362e7c3 100644 --- a/docs/da/dc3/status_8cc_source.html +++ b/docs/da/dc3/status_8cc_source.html @@ -174,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dc4/structshaka_1_1media_1_1mp4_1_1TrackHeader.html b/docs/da/dc4/structshaka_1_1media_1_1mp4_1_1TrackHeader.html index 24c416e46a..69069f65ca 100644 --- a/docs/da/dc4/structshaka_1_1media_1_1mp4_1_1TrackHeader.html +++ b/docs/da/dc4/structshaka_1_1media_1_1mp4_1_1TrackHeader.html @@ -215,7 +215,7 @@ Additional Inherited Members diff --git a/docs/da/dca/classshaka_1_1media_1_1OriginHandler-members.html b/docs/da/dca/classshaka_1_1media_1_1OriginHandler-members.html index 1f3a0b7293..72e98fabcc 100644 --- a/docs/da/dca/classshaka_1_1media_1_1OriginHandler-members.html +++ b/docs/da/dca/classshaka_1_1media_1_1OriginHandler-members.html @@ -96,9 +96,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline Cancel()=0 (defined in shaka::media::OriginHandler)shaka::media::OriginHandlerpure virtual Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected - DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected + DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected - DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected + DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dcb/es__descriptor_8h_source.html b/docs/da/dcb/es__descriptor_8h_source.html index b6356ff9e8..784bbc8a18 100644 --- a/docs/da/dcb/es__descriptor_8h_source.html +++ b/docs/da/dcb/es__descriptor_8h_source.html @@ -183,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dd0/playready__key__source_8cc_source.html b/docs/da/dd0/playready__key__source_8cc_source.html index 3b205105f2..86947d7781 100644 --- a/docs/da/dd0/playready__key__source_8cc_source.html +++ b/docs/da/dd0/playready__key__source_8cc_source.html @@ -441,7 +441,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dd0/structshaka_1_1media_1_1mp4_1_1Edit.html b/docs/da/dd0/structshaka_1_1media_1_1mp4_1_1Edit.html index d58f1b0c69..108262b277 100644 --- a/docs/da/dd0/structshaka_1_1media_1_1mp4_1_1Edit.html +++ b/docs/da/dd0/structshaka_1_1media_1_1mp4_1_1Edit.html @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/da/dd0/webm__info__parser_8h_source.html b/docs/da/dd0/webm__info__parser_8h_source.html index 5117f4f4fc..aaa815cf58 100644 --- a/docs/da/dd0/webm__info__parser_8h_source.html +++ b/docs/da/dd0/webm__info__parser_8h_source.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dd1/fragmenter_8h_source.html b/docs/da/dd1/fragmenter_8h_source.html index 0d67aa70e2..ad422b5fbe 100644 --- a/docs/da/dd1/fragmenter_8h_source.html +++ b/docs/da/dd1/fragmenter_8h_source.html @@ -209,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dd2/classshaka_1_1media_1_1mp2t_1_1TsPacket-members.html b/docs/da/dd2/classshaka_1_1media_1_1mp2t_1_1TsPacket-members.html index 5b2ceb6de6..a794ae0cf7 100644 --- a/docs/da/dd2/classshaka_1_1media_1_1mp2t_1_1TsPacket-members.html +++ b/docs/da/dd2/classshaka_1_1media_1_1mp2t_1_1TsPacket-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dd6/classshaka_1_1media_1_1H264ByteToUnitStreamConverter-members.html b/docs/da/dd6/classshaka_1_1media_1_1H264ByteToUnitStreamConverter-members.html index f5a7508eb7..d019d5220d 100644 --- a/docs/da/dd6/classshaka_1_1media_1_1H264ByteToUnitStreamConverter-members.html +++ b/docs/da/dd6/classshaka_1_1media_1_1H264ByteToUnitStreamConverter-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dd8/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser-members.html b/docs/da/dd8/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser-members.html index 7d04a612ad..5519cfcea8 100644 --- a/docs/da/dd8/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser-members.html +++ b/docs/da/dd8/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dda/structshaka_1_1media_1_1H264SEIRecoveryPoint-members.html b/docs/da/dda/structshaka_1_1media_1_1H264SEIRecoveryPoint-members.html index a1a7e93ccc..161ae6136e 100644 --- a/docs/da/dda/structshaka_1_1media_1_1H264SEIRecoveryPoint-members.html +++ b/docs/da/dda/structshaka_1_1media_1_1H264SEIRecoveryPoint-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/ddd/classshaka_1_1media_1_1WidevineKeySource.html b/docs/da/ddd/classshaka_1_1media_1_1WidevineKeySource.html index c3ee692093..d0c21355ec 100644 --- a/docs/da/ddd/classshaka_1_1media_1_1WidevineKeySource.html +++ b/docs/da/ddd/classshaka_1_1media_1_1WidevineKeySource.html @@ -461,7 +461,7 @@ void set_group_id (con diff --git a/docs/da/ddf/structshaka_1_1media_1_1mp4_1_1SampleDescription-members.html b/docs/da/ddf/structshaka_1_1media_1_1mp4_1_1SampleDescription-members.html index 8bd593a121..46cf7bb54e 100644 --- a/docs/da/ddf/structshaka_1_1media_1_1mp4_1_1SampleDescription-members.html +++ b/docs/da/ddf/structshaka_1_1media_1_1mp4_1_1SampleDescription-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/de2/mock__mpd__builder_8cc_source.html b/docs/da/de2/mock__mpd__builder_8cc_source.html index 862d1f6b6e..8a7d7bb077 100644 --- a/docs/da/de2/mock__mpd__builder_8cc_source.html +++ b/docs/da/de2/mock__mpd__builder_8cc_source.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/de4/classshaka_1_1media_1_1WebMClusterParser.html b/docs/da/de4/classshaka_1_1media_1_1WebMClusterParser.html index 8b6309d00a..a68baee667 100644 --- a/docs/da/de4/classshaka_1_1media_1_1WebMClusterParser.html +++ b/docs/da/de4/classshaka_1_1media_1_1WebMClusterParser.html @@ -107,10 +107,10 @@ Inheritance diagram for shaka::media::WebMClusterParser: - - +

Public Types

enum  { kDefaultAudioBufferDurationInMs = 23, -kDefaultVideoBufferDurationInMs = 63 +
enum  { kDefaultAudioBufferDurationInMs = 23, +kDefaultVideoBufferDurationInMs = 63 }
 
 
@@ -148,7 +148,7 @@ Additional Inherited Members

Definition at line 24 of file webm_cluster_parser.h.

Member Enumeration Documentation

- +

Public Member Functions

@@ -159,10 +159,10 @@ Additional Inherited Members

Numbers chosen to estimate the duration of a buffer if none is set and there is not enough information to get a better estimate.

- -
Enumerator
kDefaultAudioBufferDurationInMs  +
Enumerator
kDefaultAudioBufferDurationInMs 

Common 1k samples @44.1kHz.

kDefaultVideoBufferDurationInMs  +
kDefaultVideoBufferDurationInMs 

Chosen to represent 16fps duration, which will prevent MSE stalls in videos with frame-rates as low as 8fps.

@@ -372,7 +372,7 @@ The number of bytes parsed on success. diff --git a/docs/da/de6/structshaka_1_1media_1_1mp4_1_1SchemeType-members.html b/docs/da/de6/structshaka_1_1media_1_1mp4_1_1SchemeType-members.html index 1864be506e..9141d5c2ad 100644 --- a/docs/da/de6/structshaka_1_1media_1_1mp4_1_1SchemeType-members.html +++ b/docs/da/de6/structshaka_1_1media_1_1mp4_1_1SchemeType-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/de8/classshaka_1_1media_1_1AudioStreamInfo-members.html b/docs/da/de8/classshaka_1_1media_1_1AudioStreamInfo-members.html index d8be8b4d94..d0b9f9f9db 100644 --- a/docs/da/de8/classshaka_1_1media_1_1AudioStreamInfo-members.html +++ b/docs/da/de8/classshaka_1_1media_1_1AudioStreamInfo-members.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/de9/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html b/docs/da/de9/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html index 168624a910..34c519bbf6 100644 --- a/docs/da/de9/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html +++ b/docs/da/de9/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html @@ -179,7 +179,7 @@ Additional Inherited Members diff --git a/docs/da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html b/docs/da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html index 35a2e4e1e7..57c0991fc6 100644 --- a/docs/da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html +++ b/docs/da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html @@ -152,7 +152,7 @@ int64_t  diff --git a/docs/da/df4/aes__decryptor_8cc_source.html b/docs/da/df4/aes__decryptor_8cc_source.html index 6a95d82f86..6ea1440454 100644 --- a/docs/da/df4/aes__decryptor_8cc_source.html +++ b/docs/da/df4/aes__decryptor_8cc_source.html @@ -258,7 +258,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/df5/structshaka_1_1media_1_1mp4_1_1SampleDescription.html b/docs/da/df5/structshaka_1_1media_1_1mp4_1_1SampleDescription.html index 3d97f6dc99..c0bce2619d 100644 --- a/docs/da/df5/structshaka_1_1media_1_1mp4_1_1SampleDescription.html +++ b/docs/da/df5/structshaka_1_1media_1_1mp4_1_1SampleDescription.html @@ -191,7 +191,7 @@ Additional Inherited Members diff --git a/docs/da/df9/classshaka_1_1media_1_1AesPatternCryptor-members.html b/docs/da/df9/classshaka_1_1media_1_1AesPatternCryptor-members.html index e66fd61b6f..5e6c4476eb 100644 --- a/docs/da/df9/classshaka_1_1media_1_1AesPatternCryptor-members.html +++ b/docs/da/df9/classshaka_1_1media_1_1AesPatternCryptor-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dfd/classshaka_1_1media_1_1MediaHandler.html b/docs/da/dfd/classshaka_1_1media_1_1MediaHandler.html index 6751915443..3da9201988 100644 --- a/docs/da/dfd/classshaka_1_1media_1_1MediaHandler.html +++ b/docs/da/dfd/classshaka_1_1media_1_1MediaHandler.html @@ -102,15 +102,16 @@ Inheritance diagram for shaka::media::MediaHandler:
-shaka::media::ChunkingHandler -shaka::media::EncryptionHandler -shaka::media::FakeInputMediaHandler -shaka::media::FakeMediaHandler -shaka::media::MockOutputMediaHandler -shaka::media::Muxer -shaka::media::OriginHandler -shaka::media::Replicator -shaka::media::TrickPlayHandler +shaka::media::AdCueGenerator +shaka::media::ChunkingHandler +shaka::media::EncryptionHandler +shaka::media::FakeInputMediaHandler +shaka::media::FakeMediaHandler +shaka::media::MockOutputMediaHandler +shaka::media::Muxer +shaka::media::OriginHandler +shaka::media::Replicator +shaka::media::TrickPlayHandler
@@ -147,10 +148,6 @@ virtual bool  - - - @@ -163,14 +160,18 @@ virtual bool  - - - + + + + + + @@ -197,7 +198,7 @@ std::pair< std::shared_ptr

Detailed Description

MediaHandler is the base media processing unit. Media handlers transform the input streams and propagate the outputs to downstream media handlers. There are three different types of media handlers: 1) Single input single output This is the most basic handler. It only supports one input and one output with both index as 0. 2) Multiple inputs multiple outputs The number of outputs must be equal to the number of inputs. The output stream at a specific index comes from the input stream at the same index. Different streams usually share a common resource, although they may be independent. One example of this is encryptor handler. 3) Single input multiple outputs The input stream is splitted into multiple output streams. One example of this is trick play handler. Other types of media handlers are disallowed and not supported.

-

Definition at line 128 of file media_handler.h.

+

Definition at line 148 of file media_handler.h.

Member Function Documentation

@@ -304,7 +305,7 @@ std::pair< std::shared_ptr
diff --git a/docs/da/dfd/classshaka_1_1media_1_1MediaHandler.png b/docs/da/dfd/classshaka_1_1media_1_1MediaHandler.png index 5e81fb1fe9507544cadf9bc415f62c85d27b5c51..6b0432edb651c100122218c6f764e9d134f0bdef 100644 GIT binary patch literal 5471 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 CQ`^Y^ literal 4964 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 diff --git a/docs/db/d14/classshaka_1_1media_1_1H265Parser-members.html b/docs/db/d14/classshaka_1_1media_1_1H265Parser-members.html index 3636e075a6..42217eaca7 100644 --- a/docs/db/d14/classshaka_1_1media_1_1H265Parser-members.html +++ b/docs/db/d14/classshaka_1_1media_1_1H265Parser-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
 
Status Dispatch (std::unique_ptr< StreamData > stream_data)
 
-Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)
 Dispatch the period info to downstream handlers.
 
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
 Dispatch the stream info to downstream handlers.
Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)
 Dispatch the text sample to downsream handlers.
 
-Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event)
 Dispatch the media event to downstream handlers.
 
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
 Dispatch the segment info to downstream handlers.
 
+Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)
 Dispatch the scte35 event to downstream handlers.
 
+Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event)
 Dispatch the cue event to downstream handlers.
 
Status FlushDownstream (size_t output_stream_index)
 Flush the downstream connected at the specified output stream index.
e diff --git a/docs/db/d0b/webvtt__sample__converter_8h_source.html b/docs/db/d0b/webvtt__sample__converter_8h_source.html index da34d5a563..c33a234964 100644 --- a/docs/db/d0b/webvtt__sample__converter_8h_source.html +++ b/docs/db/d0b/webvtt__sample__converter_8h_source.html @@ -173,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d11/structshaka_1_1media_1_1mp4_1_1CodecConfiguration.html b/docs/db/d11/structshaka_1_1media_1_1mp4_1_1CodecConfiguration.html index 9f53ea734b..b4c16dcbde 100644 --- a/docs/db/d11/structshaka_1_1media_1_1mp4_1_1CodecConfiguration.html +++ b/docs/db/d11/structshaka_1_1media_1_1mp4_1_1CodecConfiguration.html @@ -176,7 +176,7 @@ Additional Inherited Members
diff --git a/docs/db/d14/structshaka_1_1media_1_1H264WeightingFactors-members.html b/docs/db/d14/structshaka_1_1media_1_1H264WeightingFactors-members.html index d01fd87ecc..3144992f8a 100644 --- a/docs/db/d14/structshaka_1_1media_1_1H264WeightingFactors-members.html +++ b/docs/db/d14/structshaka_1_1media_1_1H264WeightingFactors-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d1b/classshaka_1_1MemoryFile-members.html b/docs/db/d1b/classshaka_1_1MemoryFile-members.html index e26734aa43..548a63bc64 100644 --- a/docs/db/d1b/classshaka_1_1MemoryFile-members.html +++ b/docs/db/d1b/classshaka_1_1MemoryFile-members.html @@ -123,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d1f/classshaka_1_1media_1_1TextSample.html b/docs/db/d1f/classshaka_1_1media_1_1TextSample.html index 3b43c3b124..f45792810f 100644 --- a/docs/db/d1f/classshaka_1_1media_1_1TextSample.html +++ b/docs/db/d1f/classshaka_1_1media_1_1TextSample.html @@ -137,7 +137,7 @@ void AppendPayload (co diff --git a/docs/db/d21/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader.html b/docs/db/d21/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader.html index 649af708ea..766b4de0d4 100644 --- a/docs/db/d21/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader.html +++ b/docs/db/d21/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader.html @@ -175,7 +175,7 @@ uint32_t flags diff --git a/docs/df/d50/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter-members.html b/docs/db/d2c/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter-members.html similarity index 65% rename from docs/df/d50/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter-members.html rename to docs/db/d2c/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter-members.html index 03b2103d6c..dbc8691d0e 100644 --- a/docs/df/d50/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter-members.html +++ b/docs/db/d2c/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter-members.html @@ -82,29 +82,30 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
shaka::media::mp2t::AacProgramMapTableWriter Member List
+
shaka::media::mp2t::VideoProgramMapTableWriter Member List
-

This is the complete list of members for shaka::media::mp2t::AacProgramMapTableWriter, including all inherited members.

+

This is the complete list of members for shaka::media::mp2t::VideoProgramMapTableWriter, including all inherited members.

- - - + + + - - - + + + +
AacProgramMapTableWriter(const std::vector< uint8_t > &aac_audio_specific_config, ContinuityCounter *continuity_counter) (defined in shaka::media::mp2t::AacProgramMapTableWriter)shaka::media::mp2t::AacProgramMapTableWriter
ClearSegmentPmt(BufferWriter *writer) overrideshaka::media::mp2t::AacProgramMapTableWritervirtual
EncryptedSegmentPmt(BufferWriter *writer) overrideshaka::media::mp2t::AacProgramMapTableWritervirtual
ClearSegmentPmt(BufferWriter *writer)shaka::media::mp2t::ProgramMapTableWritervirtual
codec() const shaka::media::mp2t::ProgramMapTableWriterinlineprotected
EncryptedSegmentPmt(BufferWriter *writer)shaka::media::mp2t::ProgramMapTableWritervirtual
kElementaryPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
kPmtPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
ProgramMapTableWriter() (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriter
~AacProgramMapTableWriter() override (defined in shaka::media::mp2t::AacProgramMapTableWriter)shaka::media::mp2t::AacProgramMapTableWriter
~ProgramMapTableWriter() (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWritervirtual
ProgramMapTableWriter(Codec codec) (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterexplicit
VideoProgramMapTableWriter(Codec codec) (defined in shaka::media::mp2t::VideoProgramMapTableWriter)shaka::media::mp2t::VideoProgramMapTableWriterexplicit
~ProgramMapTableWriter()=default (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWritervirtual
~VideoProgramMapTableWriter() override=default (defined in shaka::media::mp2t::VideoProgramMapTableWriter)shaka::media::mp2t::VideoProgramMapTableWriter
diff --git a/docs/db/d30/classshaka_1_1media_1_1mp4_1_1MP4Muxer.html b/docs/db/d30/classshaka_1_1media_1_1mp4_1_1MP4Muxer.html index 7ca2934e68..f38d9135d0 100644 --- a/docs/db/d30/classshaka_1_1media_1_1mp4_1_1MP4Muxer.html +++ b/docs/db/d30/classshaka_1_1media_1_1mp4_1_1MP4Muxer.html @@ -175,10 +175,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -191,14 +187,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -233,7 +233,7 @@ std::pair< std::shared_ptr
diff --git a/docs/db/d31/h26x__byte__to__unit__stream__converter_8h_source.html b/docs/db/d31/h26x__byte__to__unit__stream__converter_8h_source.html index 1673fe80d0..bccf1999df 100644 --- a/docs/db/d31/h26x__byte__to__unit__stream__converter_8h_source.html +++ b/docs/db/d31/h26x__byte__to__unit__stream__converter_8h_source.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d31/track__run__iterator_8cc_source.html b/docs/db/d31/track__run__iterator_8cc_source.html index fbd8b1e629..f8b7daeb8e 100644 --- a/docs/db/d31/track__run__iterator_8cc_source.html +++ b/docs/db/d31/track__run__iterator_8cc_source.html @@ -280,454 +280,456 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
191 
192  // Check that total number of samples match.
193  DCHECK_EQ(num_samples, decoding_time.NumSamples());
-
194  if (has_composition_offset)
+
194  if (has_composition_offset) {
195  DCHECK_EQ(num_samples, composition_offset.NumSamples());
-
196  if (num_chunks > 0)
-
197  DCHECK_EQ(num_samples, chunk_info.NumSamples(1, num_chunks));
-
198  DCHECK_GE(num_chunks, chunk_info.LastFirstChunk());
-
199 
-
200  if (num_samples > 0) {
-
201  // Verify relevant tables are not empty.
-
202  RCHECK(decoding_time.IsValid());
-
203  RCHECK(chunk_info.IsValid());
-
204  }
-
205 
-
206  uint32_t sample_index = 0;
-
207  for (uint32_t chunk_index = 0; chunk_index < num_chunks; ++chunk_index) {
-
208  RCHECK(chunk_info.current_chunk() == chunk_index + 1);
-
209 
-
210  TrackRunInfo tri;
-
211  tri.track_id = trak->header.track_id;
-
212  tri.timescale = trak->media.header.timescale;
-
213  tri.start_dts = run_start_dts;
-
214  tri.sample_start_offset = chunk_offset_vector[chunk_index];
-
215 
-
216  uint32_t desc_idx = chunk_info.sample_description_index();
-
217  RCHECK(desc_idx > 0); // Descriptions are one-indexed in the file.
-
218  desc_idx -= 1;
-
219 
-
220  tri.track_type = stsd.type;
-
221  if (tri.track_type == kAudio) {
-
222  RCHECK(!stsd.audio_entries.empty());
-
223  if (desc_idx > stsd.audio_entries.size())
-
224  desc_idx = 0;
-
225  tri.audio_description = &stsd.audio_entries[desc_idx];
-
226  // We don't support encrypted non-fragmented mp4 for now.
-
227  RCHECK(tri.audio_description->sinf.info.track_encryption
-
228  .default_is_protected == 0);
-
229  } else if (tri.track_type == kVideo) {
-
230  RCHECK(!stsd.video_entries.empty());
-
231  if (desc_idx > stsd.video_entries.size())
-
232  desc_idx = 0;
-
233  tri.video_description = &stsd.video_entries[desc_idx];
-
234  // We don't support encrypted non-fragmented mp4 for now.
-
235  RCHECK(tri.video_description->sinf.info.track_encryption
-
236  .default_is_protected == 0);
-
237  }
-
238 
-
239  uint32_t samples_per_chunk = chunk_info.samples_per_chunk();
-
240  tri.samples.resize(samples_per_chunk);
-
241  for (uint32_t k = 0; k < samples_per_chunk; ++k) {
-
242  SampleInfo& sample = tri.samples[k];
-
243  sample.size = sample_size.sample_size != 0
-
244  ? sample_size.sample_size
-
245  : sample_size.sizes[sample_index];
-
246  sample.duration = decoding_time.sample_delta();
-
247  sample.cts_offset =
-
248  has_composition_offset ? composition_offset.sample_offset() : 0;
-
249  sample.is_keyframe = sync_sample.IsSyncSample();
-
250 
-
251  run_start_dts += sample.duration;
+
196  }
+
197  if (num_chunks > 0) {
+
198  DCHECK_EQ(num_samples, chunk_info.NumSamples(1, num_chunks));
+
199  }
+
200  DCHECK_GE(num_chunks, chunk_info.LastFirstChunk());
+
201 
+
202  if (num_samples > 0) {
+
203  // Verify relevant tables are not empty.
+
204  RCHECK(decoding_time.IsValid());
+
205  RCHECK(chunk_info.IsValid());
+
206  }
+
207 
+
208  uint32_t sample_index = 0;
+
209  for (uint32_t chunk_index = 0; chunk_index < num_chunks; ++chunk_index) {
+
210  RCHECK(chunk_info.current_chunk() == chunk_index + 1);
+
211 
+
212  TrackRunInfo tri;
+
213  tri.track_id = trak->header.track_id;
+
214  tri.timescale = trak->media.header.timescale;
+
215  tri.start_dts = run_start_dts;
+
216  tri.sample_start_offset = chunk_offset_vector[chunk_index];
+
217 
+
218  uint32_t desc_idx = chunk_info.sample_description_index();
+
219  RCHECK(desc_idx > 0); // Descriptions are one-indexed in the file.
+
220  desc_idx -= 1;
+
221 
+
222  tri.track_type = stsd.type;
+
223  if (tri.track_type == kAudio) {
+
224  RCHECK(!stsd.audio_entries.empty());
+
225  if (desc_idx > stsd.audio_entries.size())
+
226  desc_idx = 0;
+
227  tri.audio_description = &stsd.audio_entries[desc_idx];
+
228  // We don't support encrypted non-fragmented mp4 for now.
+
229  RCHECK(tri.audio_description->sinf.info.track_encryption
+
230  .default_is_protected == 0);
+
231  } else if (tri.track_type == kVideo) {
+
232  RCHECK(!stsd.video_entries.empty());
+
233  if (desc_idx > stsd.video_entries.size())
+
234  desc_idx = 0;
+
235  tri.video_description = &stsd.video_entries[desc_idx];
+
236  // We don't support encrypted non-fragmented mp4 for now.
+
237  RCHECK(tri.video_description->sinf.info.track_encryption
+
238  .default_is_protected == 0);
+
239  }
+
240 
+
241  uint32_t samples_per_chunk = chunk_info.samples_per_chunk();
+
242  tri.samples.resize(samples_per_chunk);
+
243  for (uint32_t k = 0; k < samples_per_chunk; ++k) {
+
244  SampleInfo& sample = tri.samples[k];
+
245  sample.size = sample_size.sample_size != 0
+
246  ? sample_size.sample_size
+
247  : sample_size.sizes[sample_index];
+
248  sample.duration = decoding_time.sample_delta();
+
249  sample.cts_offset =
+
250  has_composition_offset ? composition_offset.sample_offset() : 0;
+
251  sample.is_keyframe = sync_sample.IsSyncSample();
252 
-
253  // Advance to next sample. Should success except for last sample.
-
254  ++sample_index;
-
255  RCHECK(chunk_info.AdvanceSample() && sync_sample.AdvanceSample());
-
256  if (sample_index == num_samples) {
-
257  // We should hit end of tables for decoding time and composition
-
258  // offset.
-
259  RCHECK(!decoding_time.AdvanceSample());
-
260  if (has_composition_offset)
-
261  RCHECK(!composition_offset.AdvanceSample());
-
262  } else {
-
263  RCHECK(decoding_time.AdvanceSample());
-
264  if (has_composition_offset)
-
265  RCHECK(composition_offset.AdvanceSample());
-
266  }
-
267  }
-
268 
-
269  runs_.push_back(tri);
-
270  }
-
271  }
-
272 
-
273  std::sort(runs_.begin(), runs_.end(), CompareMinTrackRunDataOffset());
-
274  run_itr_ = runs_.begin();
-
275  ResetRun();
-
276  return true;
-
277 }
-
278 
- -
280  runs_.clear();
-
281 
-
282  next_fragment_start_dts_.resize(moof.tracks.size(), 0);
-
283  for (size_t i = 0; i < moof.tracks.size(); i++) {
-
284  const TrackFragment& traf = moof.tracks[i];
-
285 
-
286  const Track* trak = NULL;
-
287  for (size_t t = 0; t < moov_->tracks.size(); t++) {
-
288  if (moov_->tracks[t].header.track_id == traf.header.track_id)
-
289  trak = &moov_->tracks[t];
-
290  }
-
291  RCHECK(trak);
-
292 
-
293  const TrackExtends* trex = NULL;
-
294  for (size_t t = 0; t < moov_->extends.tracks.size(); t++) {
-
295  if (moov_->extends.tracks[t].track_id == traf.header.track_id)
-
296  trex = &moov_->extends.tracks[t];
-
297  }
-
298  RCHECK(trex);
-
299 
-
300  const SampleDescription& stsd =
-
301  trak->media.information.sample_table.description;
-
302  if (stsd.type != kAudio && stsd.type != kVideo) {
-
303  DVLOG(1) << "Skipping unhandled track type";
-
304  continue;
-
305  }
-
306  size_t desc_idx = traf.header.sample_description_index;
-
307  if (!desc_idx)
-
308  desc_idx = trex->default_sample_description_index;
-
309  RCHECK(desc_idx > 0); // Descriptions are one-indexed in the file
-
310  desc_idx -= 1;
-
311 
-
312  const AudioSampleEntry* audio_sample_entry = NULL;
-
313  const VideoSampleEntry* video_sample_entry = NULL;
-
314  switch (stsd.type) {
-
315  case kAudio:
-
316  RCHECK(!stsd.audio_entries.empty());
-
317  if (desc_idx > stsd.audio_entries.size())
-
318  desc_idx = 0;
-
319  audio_sample_entry = &stsd.audio_entries[desc_idx];
-
320  break;
-
321  case kVideo:
-
322  RCHECK(!stsd.video_entries.empty());
-
323  if (desc_idx > stsd.video_entries.size())
-
324  desc_idx = 0;
-
325  video_sample_entry = &stsd.video_entries[desc_idx];
-
326  break;
-
327  default:
-
328  NOTREACHED();
-
329  break;
-
330  }
-
331 
-
332  // SampleEncryptionEntries should not have been parsed, without having
-
333  // iv_size. Parse the box now.
-
334  DCHECK(traf.sample_encryption.sample_encryption_entries.empty());
-
335  std::vector<SampleEncryptionEntry> sample_encryption_entries;
-
336  if (!traf.sample_encryption.sample_encryption_data.empty()) {
-
337  RCHECK(audio_sample_entry || video_sample_entry);
-
338  const uint8_t default_per_sample_iv_size =
-
339  audio_sample_entry
-
340  ? audio_sample_entry->sinf.info.track_encryption
-
341  .default_per_sample_iv_size
-
342  : video_sample_entry->sinf.info.track_encryption
-
343  .default_per_sample_iv_size;
-
344  RCHECK(traf.sample_encryption.ParseFromSampleEncryptionData(
-
345  default_per_sample_iv_size, &sample_encryption_entries));
-
346  }
-
347 
-
348  int64_t run_start_dts = traf.decode_time_absent
-
349  ? next_fragment_start_dts_[i]
-
350  : traf.decode_time.decode_time;
-
351  int sample_count_sum = 0;
-
352 
-
353  for (size_t j = 0; j < traf.runs.size(); j++) {
-
354  const TrackFragmentRun& trun = traf.runs[j];
-
355  TrackRunInfo tri;
-
356  tri.track_id = traf.header.track_id;
-
357  tri.timescale = trak->media.header.timescale;
-
358  tri.start_dts = run_start_dts;
-
359  tri.sample_start_offset = trun.data_offset;
-
360 
-
361  tri.track_type = stsd.type;
-
362  tri.audio_description = audio_sample_entry;
-
363  tri.video_description = video_sample_entry;
-
364 
-
365  tri.aux_info_start_offset = -1;
-
366  tri.aux_info_total_size = 0;
-
367  // Populate sample encryption entries from SampleEncryption 'senc' box if
-
368  // it is available; otherwise initialize aux_info variables, which will
-
369  // be used to populate sample encryption entries later in CacheAuxInfo.
-
370  if (!sample_encryption_entries.empty()) {
-
371  RCHECK(sample_encryption_entries.size() >=
-
372  sample_count_sum + trun.sample_count);
-
373  for (size_t k = 0; k < trun.sample_count; ++k) {
-
374  tri.sample_encryption_entries.push_back(
-
375  sample_encryption_entries[sample_count_sum + k]);
-
376  }
-
377  } else if (traf.auxiliary_offset.offsets.size() > j) {
-
378  // Collect information from the auxiliary_offset entry with the same
-
379  // index in the 'saiz' container as the current run's index in the
-
380  // 'trun' container, if it is present.
-
381  tri.aux_info_start_offset = traf.auxiliary_offset.offsets[j];
-
382  // There should be an auxiliary info entry corresponding to each sample
-
383  // in the auxiliary offset entry's corresponding track run.
-
384  RCHECK(traf.auxiliary_size.sample_count >=
-
385  sample_count_sum + trun.sample_count);
-
386  tri.aux_info_default_size =
-
387  traf.auxiliary_size.default_sample_info_size;
-
388  if (tri.aux_info_default_size == 0) {
-
389  const std::vector<uint8_t>& sizes =
-
390  traf.auxiliary_size.sample_info_sizes;
-
391  tri.aux_info_sizes.insert(
-
392  tri.aux_info_sizes.begin(),
-
393  sizes.begin() + sample_count_sum,
-
394  sizes.begin() + sample_count_sum + trun.sample_count);
-
395  }
-
396 
-
397  // If the default info size is positive, find the total size of the aux
-
398  // info block from it, otherwise sum over the individual sizes of each
-
399  // aux info entry in the aux_offset entry.
-
400  if (tri.aux_info_default_size) {
-
401  tri.aux_info_total_size =
-
402  tri.aux_info_default_size * trun.sample_count;
-
403  } else {
-
404  tri.aux_info_total_size = 0;
-
405  for (size_t k = 0; k < trun.sample_count; k++) {
-
406  tri.aux_info_total_size += tri.aux_info_sizes[k];
-
407  }
-
408  }
-
409  }
-
410 
-
411  tri.samples.resize(trun.sample_count);
-
412  for (size_t k = 0; k < trun.sample_count; k++) {
-
413  PopulateSampleInfo(*trex, traf.header, trun, k,
-
414  &tri.samples[k]);
-
415  run_start_dts += tri.samples[k].duration;
-
416  }
-
417  runs_.push_back(tri);
-
418  sample_count_sum += trun.sample_count;
-
419  }
-
420  next_fragment_start_dts_[i] = run_start_dts;
-
421  }
-
422 
-
423  std::sort(runs_.begin(), runs_.end(), CompareMinTrackRunDataOffset());
-
424  run_itr_ = runs_.begin();
-
425  ResetRun();
-
426  return true;
-
427 }
-
428 
- -
430  ++run_itr_;
-
431  ResetRun();
-
432 }
-
433 
-
434 void TrackRunIterator::ResetRun() {
-
435  if (!IsRunValid())
-
436  return;
-
437  sample_dts_ = run_itr_->start_dts;
-
438  sample_offset_ = run_itr_->sample_start_offset;
-
439  sample_itr_ = run_itr_->samples.begin();
-
440 }
-
441 
- -
443  DCHECK(IsSampleValid());
-
444  sample_dts_ += sample_itr_->duration;
-
445  sample_offset_ += sample_itr_->size;
-
446  ++sample_itr_;
-
447 }
-
448 
-
449 // This implementation only indicates a need for caching if CENC auxiliary
-
450 // info is available in the stream.
- -
452  DCHECK(IsRunValid());
-
453  return is_encrypted() && aux_info_size() > 0 &&
-
454  run_itr_->sample_encryption_entries.size() == 0;
-
455 }
-
456 
-
457 // This implementation currently only caches CENC auxiliary info.
-
458 bool TrackRunIterator::CacheAuxInfo(const uint8_t* buf, int buf_size) {
-
459  RCHECK(AuxInfoNeedsToBeCached() && buf_size >= aux_info_size());
-
460 
-
461  std::vector<SampleEncryptionEntry>& sample_encryption_entries =
-
462  runs_[run_itr_ - runs_.begin()].sample_encryption_entries;
-
463  sample_encryption_entries.resize(run_itr_->samples.size());
-
464  int64_t pos = 0;
-
465  for (size_t i = 0; i < run_itr_->samples.size(); i++) {
-
466  int info_size = run_itr_->aux_info_default_size;
-
467  if (!info_size)
-
468  info_size = run_itr_->aux_info_sizes[i];
-
469 
-
470  BufferReader reader(buf + pos, info_size);
-
471  const bool has_subsamples =
-
472  info_size > track_encryption().default_per_sample_iv_size;
-
473  RCHECK(sample_encryption_entries[i].ParseFromBuffer(
-
474  track_encryption().default_per_sample_iv_size, has_subsamples,
-
475  &reader));
-
476  pos += info_size;
-
477  }
-
478 
-
479  return true;
-
480 }
-
481 
-
482 bool TrackRunIterator::IsRunValid() const { return run_itr_ != runs_.end(); }
+
253  run_start_dts += sample.duration;
+
254 
+
255  // Advance to next sample. Should success except for last sample.
+
256  ++sample_index;
+
257  RCHECK(chunk_info.AdvanceSample() && sync_sample.AdvanceSample());
+
258  if (sample_index == num_samples) {
+
259  // We should hit end of tables for decoding time and composition
+
260  // offset.
+
261  RCHECK(!decoding_time.AdvanceSample());
+
262  if (has_composition_offset)
+
263  RCHECK(!composition_offset.AdvanceSample());
+
264  } else {
+
265  RCHECK(decoding_time.AdvanceSample());
+
266  if (has_composition_offset)
+
267  RCHECK(composition_offset.AdvanceSample());
+
268  }
+
269  }
+
270 
+
271  runs_.push_back(tri);
+
272  }
+
273  }
+
274 
+
275  std::sort(runs_.begin(), runs_.end(), CompareMinTrackRunDataOffset());
+
276  run_itr_ = runs_.begin();
+
277  ResetRun();
+
278  return true;
+
279 }
+
280 
+ +
282  runs_.clear();
+
283 
+
284  next_fragment_start_dts_.resize(moof.tracks.size(), 0);
+
285  for (size_t i = 0; i < moof.tracks.size(); i++) {
+
286  const TrackFragment& traf = moof.tracks[i];
+
287 
+
288  const Track* trak = NULL;
+
289  for (size_t t = 0; t < moov_->tracks.size(); t++) {
+
290  if (moov_->tracks[t].header.track_id == traf.header.track_id)
+
291  trak = &moov_->tracks[t];
+
292  }
+
293  RCHECK(trak);
+
294 
+
295  const TrackExtends* trex = NULL;
+
296  for (size_t t = 0; t < moov_->extends.tracks.size(); t++) {
+
297  if (moov_->extends.tracks[t].track_id == traf.header.track_id)
+
298  trex = &moov_->extends.tracks[t];
+
299  }
+
300  RCHECK(trex);
+
301 
+
302  const SampleDescription& stsd =
+
303  trak->media.information.sample_table.description;
+
304  if (stsd.type != kAudio && stsd.type != kVideo) {
+
305  DVLOG(1) << "Skipping unhandled track type";
+
306  continue;
+
307  }
+
308  size_t desc_idx = traf.header.sample_description_index;
+
309  if (!desc_idx)
+
310  desc_idx = trex->default_sample_description_index;
+
311  RCHECK(desc_idx > 0); // Descriptions are one-indexed in the file
+
312  desc_idx -= 1;
+
313 
+
314  const AudioSampleEntry* audio_sample_entry = NULL;
+
315  const VideoSampleEntry* video_sample_entry = NULL;
+
316  switch (stsd.type) {
+
317  case kAudio:
+
318  RCHECK(!stsd.audio_entries.empty());
+
319  if (desc_idx > stsd.audio_entries.size())
+
320  desc_idx = 0;
+
321  audio_sample_entry = &stsd.audio_entries[desc_idx];
+
322  break;
+
323  case kVideo:
+
324  RCHECK(!stsd.video_entries.empty());
+
325  if (desc_idx > stsd.video_entries.size())
+
326  desc_idx = 0;
+
327  video_sample_entry = &stsd.video_entries[desc_idx];
+
328  break;
+
329  default:
+
330  NOTREACHED();
+
331  break;
+
332  }
+
333 
+
334  // SampleEncryptionEntries should not have been parsed, without having
+
335  // iv_size. Parse the box now.
+
336  DCHECK(traf.sample_encryption.sample_encryption_entries.empty());
+
337  std::vector<SampleEncryptionEntry> sample_encryption_entries;
+
338  if (!traf.sample_encryption.sample_encryption_data.empty()) {
+
339  RCHECK(audio_sample_entry || video_sample_entry);
+
340  const uint8_t default_per_sample_iv_size =
+
341  audio_sample_entry
+
342  ? audio_sample_entry->sinf.info.track_encryption
+
343  .default_per_sample_iv_size
+
344  : video_sample_entry->sinf.info.track_encryption
+
345  .default_per_sample_iv_size;
+
346  RCHECK(traf.sample_encryption.ParseFromSampleEncryptionData(
+
347  default_per_sample_iv_size, &sample_encryption_entries));
+
348  }
+
349 
+
350  int64_t run_start_dts = traf.decode_time_absent
+
351  ? next_fragment_start_dts_[i]
+
352  : traf.decode_time.decode_time;
+
353  int sample_count_sum = 0;
+
354 
+
355  for (size_t j = 0; j < traf.runs.size(); j++) {
+
356  const TrackFragmentRun& trun = traf.runs[j];
+
357  TrackRunInfo tri;
+
358  tri.track_id = traf.header.track_id;
+
359  tri.timescale = trak->media.header.timescale;
+
360  tri.start_dts = run_start_dts;
+
361  tri.sample_start_offset = trun.data_offset;
+
362 
+
363  tri.track_type = stsd.type;
+
364  tri.audio_description = audio_sample_entry;
+
365  tri.video_description = video_sample_entry;
+
366 
+
367  tri.aux_info_start_offset = -1;
+
368  tri.aux_info_total_size = 0;
+
369  // Populate sample encryption entries from SampleEncryption 'senc' box if
+
370  // it is available; otherwise initialize aux_info variables, which will
+
371  // be used to populate sample encryption entries later in CacheAuxInfo.
+
372  if (!sample_encryption_entries.empty()) {
+
373  RCHECK(sample_encryption_entries.size() >=
+
374  sample_count_sum + trun.sample_count);
+
375  for (size_t k = 0; k < trun.sample_count; ++k) {
+
376  tri.sample_encryption_entries.push_back(
+
377  sample_encryption_entries[sample_count_sum + k]);
+
378  }
+
379  } else if (traf.auxiliary_offset.offsets.size() > j) {
+
380  // Collect information from the auxiliary_offset entry with the same
+
381  // index in the 'saiz' container as the current run's index in the
+
382  // 'trun' container, if it is present.
+
383  tri.aux_info_start_offset = traf.auxiliary_offset.offsets[j];
+
384  // There should be an auxiliary info entry corresponding to each sample
+
385  // in the auxiliary offset entry's corresponding track run.
+
386  RCHECK(traf.auxiliary_size.sample_count >=
+
387  sample_count_sum + trun.sample_count);
+
388  tri.aux_info_default_size =
+
389  traf.auxiliary_size.default_sample_info_size;
+
390  if (tri.aux_info_default_size == 0) {
+
391  const std::vector<uint8_t>& sizes =
+
392  traf.auxiliary_size.sample_info_sizes;
+
393  tri.aux_info_sizes.insert(
+
394  tri.aux_info_sizes.begin(),
+
395  sizes.begin() + sample_count_sum,
+
396  sizes.begin() + sample_count_sum + trun.sample_count);
+
397  }
+
398 
+
399  // If the default info size is positive, find the total size of the aux
+
400  // info block from it, otherwise sum over the individual sizes of each
+
401  // aux info entry in the aux_offset entry.
+
402  if (tri.aux_info_default_size) {
+
403  tri.aux_info_total_size =
+
404  tri.aux_info_default_size * trun.sample_count;
+
405  } else {
+
406  tri.aux_info_total_size = 0;
+
407  for (size_t k = 0; k < trun.sample_count; k++) {
+
408  tri.aux_info_total_size += tri.aux_info_sizes[k];
+
409  }
+
410  }
+
411  }
+
412 
+
413  tri.samples.resize(trun.sample_count);
+
414  for (size_t k = 0; k < trun.sample_count; k++) {
+
415  PopulateSampleInfo(*trex, traf.header, trun, k,
+
416  &tri.samples[k]);
+
417  run_start_dts += tri.samples[k].duration;
+
418  }
+
419  runs_.push_back(tri);
+
420  sample_count_sum += trun.sample_count;
+
421  }
+
422  next_fragment_start_dts_[i] = run_start_dts;
+
423  }
+
424 
+
425  std::sort(runs_.begin(), runs_.end(), CompareMinTrackRunDataOffset());
+
426  run_itr_ = runs_.begin();
+
427  ResetRun();
+
428  return true;
+
429 }
+
430 
+ +
432  ++run_itr_;
+
433  ResetRun();
+
434 }
+
435 
+
436 void TrackRunIterator::ResetRun() {
+
437  if (!IsRunValid())
+
438  return;
+
439  sample_dts_ = run_itr_->start_dts;
+
440  sample_offset_ = run_itr_->sample_start_offset;
+
441  sample_itr_ = run_itr_->samples.begin();
+
442 }
+
443 
+ +
445  DCHECK(IsSampleValid());
+
446  sample_dts_ += sample_itr_->duration;
+
447  sample_offset_ += sample_itr_->size;
+
448  ++sample_itr_;
+
449 }
+
450 
+
451 // This implementation only indicates a need for caching if CENC auxiliary
+
452 // info is available in the stream.
+ +
454  DCHECK(IsRunValid());
+
455  return is_encrypted() && aux_info_size() > 0 &&
+
456  run_itr_->sample_encryption_entries.size() == 0;
+
457 }
+
458 
+
459 // This implementation currently only caches CENC auxiliary info.
+
460 bool TrackRunIterator::CacheAuxInfo(const uint8_t* buf, int buf_size) {
+
461  RCHECK(AuxInfoNeedsToBeCached() && buf_size >= aux_info_size());
+
462 
+
463  std::vector<SampleEncryptionEntry>& sample_encryption_entries =
+
464  runs_[run_itr_ - runs_.begin()].sample_encryption_entries;
+
465  sample_encryption_entries.resize(run_itr_->samples.size());
+
466  int64_t pos = 0;
+
467  for (size_t i = 0; i < run_itr_->samples.size(); i++) {
+
468  int info_size = run_itr_->aux_info_default_size;
+
469  if (!info_size)
+
470  info_size = run_itr_->aux_info_sizes[i];
+
471 
+
472  BufferReader reader(buf + pos, info_size);
+
473  const bool has_subsamples =
+
474  info_size > track_encryption().default_per_sample_iv_size;
+
475  RCHECK(sample_encryption_entries[i].ParseFromBuffer(
+
476  track_encryption().default_per_sample_iv_size, has_subsamples,
+
477  &reader));
+
478  pos += info_size;
+
479  }
+
480 
+
481  return true;
+
482 }
483 
- -
485  return IsRunValid() && (sample_itr_ != run_itr_->samples.end());
-
486 }
-
487 
-
488 // Because tracks are in sorted order and auxiliary information is cached when
-
489 // returning samples, it is guaranteed that no data will be required before the
-
490 // lesser of the minimum data offset of this track and the next in sequence.
-
491 // (The stronger condition - that no data is required before the minimum data
-
492 // offset of this track alone - is not guaranteed, because the BMFF spec does
-
493 // not have any inter-run ordering restrictions.)
- -
495  int64_t offset = kInvalidOffset;
-
496 
-
497  if (IsSampleValid()) {
-
498  offset = std::min(offset, sample_offset_);
- -
500  offset = std::min(offset, aux_info_offset());
-
501  }
-
502  if (run_itr_ != runs_.end()) {
-
503  std::vector<TrackRunInfo>::const_iterator next_run = run_itr_ + 1;
-
504  if (next_run != runs_.end()) {
-
505  offset = std::min(offset, next_run->sample_start_offset);
-
506  if (next_run->aux_info_total_size)
-
507  offset = std::min(offset, next_run->aux_info_start_offset);
-
508  }
-
509  }
-
510  if (offset == kInvalidOffset)
-
511  return runs_.empty() ? 0 : runs_[0].sample_start_offset;
-
512  return offset;
-
513 }
-
514 
-
515 uint32_t TrackRunIterator::track_id() const {
-
516  DCHECK(IsRunValid());
-
517  return run_itr_->track_id;
-
518 }
-
519 
-
520 bool TrackRunIterator::is_encrypted() const {
-
521  DCHECK(IsRunValid());
-
522  return track_encryption().default_is_protected == 1;
-
523 }
-
524 
-
525 int64_t TrackRunIterator::aux_info_offset() const {
-
526  return run_itr_->aux_info_start_offset;
-
527 }
-
528 
-
529 int TrackRunIterator::aux_info_size() const {
-
530  return run_itr_->aux_info_total_size;
-
531 }
-
532 
-
533 bool TrackRunIterator::is_audio() const {
-
534  DCHECK(IsRunValid());
-
535  return run_itr_->track_type == kAudio;
-
536 }
-
537 
-
538 bool TrackRunIterator::is_video() const {
-
539  DCHECK(IsRunValid());
-
540  return run_itr_->track_type == kVideo;
-
541 }
-
542 
- -
544  DCHECK(is_audio());
-
545  DCHECK(run_itr_->audio_description);
-
546  return *run_itr_->audio_description;
-
547 }
-
548 
- -
550  DCHECK(is_video());
-
551  DCHECK(run_itr_->video_description);
-
552  return *run_itr_->video_description;
-
553 }
-
554 
-
555 int64_t TrackRunIterator::sample_offset() const {
-
556  DCHECK(IsSampleValid());
-
557  return sample_offset_;
-
558 }
-
559 
-
560 int TrackRunIterator::sample_size() const {
-
561  DCHECK(IsSampleValid());
-
562  return sample_itr_->size;
-
563 }
-
564 
-
565 int64_t TrackRunIterator::dts() const {
-
566  DCHECK(IsSampleValid());
-
567  return sample_dts_;
-
568 }
-
569 
-
570 int64_t TrackRunIterator::cts() const {
-
571  DCHECK(IsSampleValid());
-
572  return sample_dts_ + sample_itr_->cts_offset;
-
573 }
-
574 
-
575 int64_t TrackRunIterator::duration() const {
-
576  DCHECK(IsSampleValid());
-
577  return sample_itr_->duration;
-
578 }
-
579 
-
580 bool TrackRunIterator::is_keyframe() const {
-
581  DCHECK(IsSampleValid());
-
582  return sample_itr_->is_keyframe;
-
583 }
-
584 
-
585 const TrackEncryption& TrackRunIterator::track_encryption() const {
-
586  if (is_audio())
-
587  return audio_description().sinf.info.track_encryption;
-
588  DCHECK(is_video());
-
589  return video_description().sinf.info.track_encryption;
-
590 }
-
591 
-
592 std::unique_ptr<DecryptConfig> TrackRunIterator::GetDecryptConfig() {
-
593  std::vector<uint8_t> iv;
-
594  std::vector<SubsampleEntry> subsamples;
-
595 
-
596  size_t sample_idx = sample_itr_ - run_itr_->samples.begin();
-
597  if (sample_idx < run_itr_->sample_encryption_entries.size()) {
-
598  const SampleEncryptionEntry& sample_encryption_entry =
-
599  run_itr_->sample_encryption_entries[sample_idx];
-
600  DCHECK(is_encrypted());
-
601  DCHECK(!AuxInfoNeedsToBeCached());
-
602 
-
603  const size_t total_size_of_subsamples =
-
604  sample_encryption_entry.GetTotalSizeOfSubsamples();
-
605  if (total_size_of_subsamples != 0 &&
-
606  total_size_of_subsamples != static_cast<size_t>(sample_size())) {
-
607  LOG(ERROR) << "Incorrect CENC subsample size.";
-
608  return std::unique_ptr<DecryptConfig>();
-
609  }
-
610 
-
611  iv = sample_encryption_entry.initialization_vector;
-
612  subsamples = sample_encryption_entry.subsamples;
-
613  }
-
614 
-
615  FourCC protection_scheme = is_audio() ? audio_description().sinf.type.type
-
616  : video_description().sinf.type.type;
-
617  if (iv.empty()) {
-
618  if (protection_scheme != FOURCC_cbcs) {
-
619  LOG(WARNING)
-
620  << "Constant IV should only be used with 'cbcs' protection scheme.";
-
621  }
-
622  iv = track_encryption().default_constant_iv;
-
623  if (iv.empty()) {
-
624  LOG(ERROR) << "IV cannot be empty.";
-
625  return std::unique_ptr<DecryptConfig>();
-
626  }
-
627  }
-
628  return std::unique_ptr<DecryptConfig>(new DecryptConfig(
-
629  track_encryption().default_kid, iv, subsamples, protection_scheme,
-
630  track_encryption().default_crypt_byte_block,
-
631  track_encryption().default_skip_byte_block));
-
632 }
-
633 
-
634 } // namespace mp4
-
635 } // namespace media
-
636 } // namespace shaka
+
484 bool TrackRunIterator::IsRunValid() const { return run_itr_ != runs_.end(); }
+
485 
+ +
487  return IsRunValid() && (sample_itr_ != run_itr_->samples.end());
+
488 }
+
489 
+
490 // Because tracks are in sorted order and auxiliary information is cached when
+
491 // returning samples, it is guaranteed that no data will be required before the
+
492 // lesser of the minimum data offset of this track and the next in sequence.
+
493 // (The stronger condition - that no data is required before the minimum data
+
494 // offset of this track alone - is not guaranteed, because the BMFF spec does
+
495 // not have any inter-run ordering restrictions.)
+ +
497  int64_t offset = kInvalidOffset;
+
498 
+
499  if (IsSampleValid()) {
+
500  offset = std::min(offset, sample_offset_);
+ +
502  offset = std::min(offset, aux_info_offset());
+
503  }
+
504  if (run_itr_ != runs_.end()) {
+
505  std::vector<TrackRunInfo>::const_iterator next_run = run_itr_ + 1;
+
506  if (next_run != runs_.end()) {
+
507  offset = std::min(offset, next_run->sample_start_offset);
+
508  if (next_run->aux_info_total_size)
+
509  offset = std::min(offset, next_run->aux_info_start_offset);
+
510  }
+
511  }
+
512  if (offset == kInvalidOffset)
+
513  return runs_.empty() ? 0 : runs_[0].sample_start_offset;
+
514  return offset;
+
515 }
+
516 
+
517 uint32_t TrackRunIterator::track_id() const {
+
518  DCHECK(IsRunValid());
+
519  return run_itr_->track_id;
+
520 }
+
521 
+
522 bool TrackRunIterator::is_encrypted() const {
+
523  DCHECK(IsRunValid());
+
524  return track_encryption().default_is_protected == 1;
+
525 }
+
526 
+
527 int64_t TrackRunIterator::aux_info_offset() const {
+
528  return run_itr_->aux_info_start_offset;
+
529 }
+
530 
+
531 int TrackRunIterator::aux_info_size() const {
+
532  return run_itr_->aux_info_total_size;
+
533 }
+
534 
+
535 bool TrackRunIterator::is_audio() const {
+
536  DCHECK(IsRunValid());
+
537  return run_itr_->track_type == kAudio;
+
538 }
+
539 
+
540 bool TrackRunIterator::is_video() const {
+
541  DCHECK(IsRunValid());
+
542  return run_itr_->track_type == kVideo;
+
543 }
+
544 
+ +
546  DCHECK(is_audio());
+
547  DCHECK(run_itr_->audio_description);
+
548  return *run_itr_->audio_description;
+
549 }
+
550 
+ +
552  DCHECK(is_video());
+
553  DCHECK(run_itr_->video_description);
+
554  return *run_itr_->video_description;
+
555 }
+
556 
+
557 int64_t TrackRunIterator::sample_offset() const {
+
558  DCHECK(IsSampleValid());
+
559  return sample_offset_;
+
560 }
+
561 
+
562 int TrackRunIterator::sample_size() const {
+
563  DCHECK(IsSampleValid());
+
564  return sample_itr_->size;
+
565 }
+
566 
+
567 int64_t TrackRunIterator::dts() const {
+
568  DCHECK(IsSampleValid());
+
569  return sample_dts_;
+
570 }
+
571 
+
572 int64_t TrackRunIterator::cts() const {
+
573  DCHECK(IsSampleValid());
+
574  return sample_dts_ + sample_itr_->cts_offset;
+
575 }
+
576 
+
577 int64_t TrackRunIterator::duration() const {
+
578  DCHECK(IsSampleValid());
+
579  return sample_itr_->duration;
+
580 }
+
581 
+
582 bool TrackRunIterator::is_keyframe() const {
+
583  DCHECK(IsSampleValid());
+
584  return sample_itr_->is_keyframe;
+
585 }
+
586 
+
587 const TrackEncryption& TrackRunIterator::track_encryption() const {
+
588  if (is_audio())
+
589  return audio_description().sinf.info.track_encryption;
+
590  DCHECK(is_video());
+
591  return video_description().sinf.info.track_encryption;
+
592 }
+
593 
+
594 std::unique_ptr<DecryptConfig> TrackRunIterator::GetDecryptConfig() {
+
595  std::vector<uint8_t> iv;
+
596  std::vector<SubsampleEntry> subsamples;
+
597 
+
598  size_t sample_idx = sample_itr_ - run_itr_->samples.begin();
+
599  if (sample_idx < run_itr_->sample_encryption_entries.size()) {
+
600  const SampleEncryptionEntry& sample_encryption_entry =
+
601  run_itr_->sample_encryption_entries[sample_idx];
+
602  DCHECK(is_encrypted());
+
603  DCHECK(!AuxInfoNeedsToBeCached());
+
604 
+
605  const size_t total_size_of_subsamples =
+
606  sample_encryption_entry.GetTotalSizeOfSubsamples();
+
607  if (total_size_of_subsamples != 0 &&
+
608  total_size_of_subsamples != static_cast<size_t>(sample_size())) {
+
609  LOG(ERROR) << "Incorrect CENC subsample size.";
+
610  return std::unique_ptr<DecryptConfig>();
+
611  }
+
612 
+
613  iv = sample_encryption_entry.initialization_vector;
+
614  subsamples = sample_encryption_entry.subsamples;
+
615  }
+
616 
+
617  FourCC protection_scheme = is_audio() ? audio_description().sinf.type.type
+
618  : video_description().sinf.type.type;
+
619  if (iv.empty()) {
+
620  if (protection_scheme != FOURCC_cbcs) {
+
621  LOG(WARNING)
+
622  << "Constant IV should only be used with 'cbcs' protection scheme.";
+
623  }
+
624  iv = track_encryption().default_constant_iv;
+
625  if (iv.empty()) {
+
626  LOG(ERROR) << "IV cannot be empty.";
+
627  return std::unique_ptr<DecryptConfig>();
+
628  }
+
629  }
+
630  return std::unique_ptr<DecryptConfig>(new DecryptConfig(
+
631  track_encryption().default_kid, iv, subsamples, protection_scheme,
+
632  track_encryption().default_crypt_byte_block,
+
633  track_encryption().default_skip_byte_block));
+
634 }
+
635 
+
636 } // namespace mp4
+
637 } // namespace media
+
638 } // namespace shaka
-
const VideoSampleEntry & video_description() const
Only valid if is_video() is true.
+
const VideoSampleEntry & video_description() const
Only valid if is_video() is true.
@@ -735,8 +737,8 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - - + + @@ -748,34 +750,34 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - +
std::vector< uint8_t > sample_encryption_data
bool ParseFromSampleEncryptionData(uint8_t iv_size, std::vector< SampleEncryptionEntry > *sample_encryption_entries) const
-
std::unique_ptr< DecryptConfig > GetDecryptConfig()
+
std::unique_ptr< DecryptConfig > GetDecryptConfig()
-
const AudioSampleEntry & audio_description() const
Only valid if is_audio() is true.
+
const AudioSampleEntry & audio_description() const
Only valid if is_audio() is true.
- + - + - -
bool CacheAuxInfo(const uint8_t *buf, int size)
+ +
bool CacheAuxInfo(const uint8_t *buf, int size)
diff --git a/docs/db/d38/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator-members.html b/docs/db/d38/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator-members.html index d8be6fe73c..be264ce34a 100644 --- a/docs/db/d38/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator-members.html +++ b/docs/db/d38/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d3b/classshaka_1_1media_1_1VideoSliceHeaderParser-members.html b/docs/db/d3b/classshaka_1_1media_1_1VideoSliceHeaderParser-members.html index 8ffe0449a5..d3182a43ed 100644 --- a/docs/db/d3b/classshaka_1_1media_1_1VideoSliceHeaderParser-members.html +++ b/docs/db/d3b/classshaka_1_1media_1_1VideoSliceHeaderParser-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d45/mpd__notify__muxer__listener_8h_source.html b/docs/db/d45/mpd__notify__muxer__listener_8h_source.html index 9b00f135f9..6fec3ae71e 100644 --- a/docs/db/d45/mpd__notify__muxer__listener_8h_source.html +++ b/docs/db/d45/mpd__notify__muxer__listener_8h_source.html @@ -184,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d4b/classshaka_1_1MockAdaptationSet.html b/docs/db/d4b/classshaka_1_1MockAdaptationSet.html index 4b7c749ac3..e4e4763894 100644 --- a/docs/db/d4b/classshaka_1_1MockAdaptationSet.html +++ b/docs/db/d4b/classshaka_1_1MockAdaptationSet.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html b/docs/db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html index c9f5399511..ec3c1fa014 100644 --- a/docs/db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html +++ b/docs/db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html @@ -225,7 +225,7 @@ Public Member Functions diff --git a/docs/db/d51/mp2t__media__parser_8h_source.html b/docs/db/d51/mp2t__media__parser_8h_source.html index b53182a97b..7680be6593 100644 --- a/docs/db/d51/mp2t__media__parser_8h_source.html +++ b/docs/db/d51/mp2t__media__parser_8h_source.html @@ -171,27 +171,31 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
87  // Whether |init_cb_| has been invoked.
88  bool is_initialized_;
89 
-
90  DISALLOW_COPY_AND_ASSIGN(Mp2tMediaParser);
-
91 };
-
92 
-
93 } // namespace mp2t
-
94 } // namespace media
-
95 } // namespace shaka
+
90  // A map used to track unsupported stream types and make sure the error is
+
91  // only logged once.
+
92  std::map<uint8_t, bool> stream_type_logged_once_;
+
93 
+
94  DISALLOW_COPY_AND_ASSIGN(Mp2tMediaParser);
+
95 };
96 
-
97 #endif
+
97 } // namespace mp2t
+
98 } // namespace media
+
99 } // namespace shaka
+
100 
+
101 #endif
-
void Init(const InitCB &init_cb, const NewSampleCB &new_sample_cb, KeySource *decryption_key_source) override
+
void Init(const InitCB &init_cb, const NewSampleCB &new_sample_cb, KeySource *decryption_key_source) override
base::Callback< void(const std::vector< std::shared_ptr< StreamInfo > > &stream_info)> InitCB
Definition: media_parser.h:34
-
bool Flush() override WARN_UNUSED_RESULT
+
bool Flush() override WARN_UNUSED_RESULT
base::Callback< bool(uint32_t track_id, const std::shared_ptr< MediaSample > &media_sample)> NewSampleCB
Definition: media_parser.h:43
KeySource is responsible for encryption key acquisition.
Definition: key_source.h:45
-
bool Parse(const uint8_t *buf, int size) override WARN_UNUSED_RESULT
+
bool Parse(const uint8_t *buf, int size) override WARN_UNUSED_RESULT
diff --git a/docs/db/d51/two__pass__single__segment__segmenter_8h_source.html b/docs/db/d51/two__pass__single__segment__segmenter_8h_source.html index 7ca3016d02..559f154da9 100644 --- a/docs/db/d51/two__pass__single__segment__segmenter_8h_source.html +++ b/docs/db/d51/two__pass__single__segment__segmenter_8h_source.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d59/media__handler__test__base_8h_source.html b/docs/db/d59/media__handler__test__base_8h_source.html index ac7312831f..e716cd85b5 100644 --- a/docs/db/d59/media__handler__test__base_8h_source.html +++ b/docs/db/d59/media__handler__test__base_8h_source.html @@ -315,9 +315,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
231 } // namespace shaka
Status Dispatch(std::unique_ptr< StreamData > stream_data)
- + - +
std::shared_ptr< FakeMediaHandler > next_handler()
void ClearOutputStreamDataVector()
Clear the output stream data vector.
@@ -336,7 +336,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d5a/classshaka_1_1media_1_1VP9Parser.html b/docs/db/d5a/classshaka_1_1media_1_1VP9Parser.html index a42fa26656..03683efc3c 100644 --- a/docs/db/d5a/classshaka_1_1media_1_1VP9Parser.html +++ b/docs/db/d5a/classshaka_1_1media_1_1VP9Parser.html @@ -238,7 +238,7 @@ Additional Inherited Members diff --git a/docs/db/d60/mpd__options_8h_source.html b/docs/db/d60/mpd__options_8h_source.html index 57ef869c62..09888aebec 100644 --- a/docs/db/d60/mpd__options_8h_source.html +++ b/docs/db/d60/mpd__options_8h_source.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d64/webvtt__media__parser_8h_source.html b/docs/db/d64/webvtt__media__parser_8h_source.html index 1f0e058bd6..7a190372ee 100644 --- a/docs/db/d64/webvtt__media__parser_8h_source.html +++ b/docs/db/d64/webvtt__media__parser_8h_source.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d66/structshaka_1_1media_1_1mp4_1_1SegmentType-members.html b/docs/db/d66/structshaka_1_1media_1_1mp4_1_1SegmentType-members.html index 3ff87512b1..e98804bc19 100644 --- a/docs/db/d66/structshaka_1_1media_1_1mp4_1_1SegmentType-members.html +++ b/docs/db/d66/structshaka_1_1media_1_1mp4_1_1SegmentType-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d66/udp__file_8cc_source.html b/docs/db/d66/udp__file_8cc_source.html index 482f2a6e63..9ee9262f74 100644 --- a/docs/db/d66/udp__file_8cc_source.html +++ b/docs/db/d66/udp__file_8cc_source.html @@ -296,57 +296,51 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
207  struct ip_mreq multicast_group;
208  multicast_group.imr_multiaddr = local_in_addr;
209 
-
210  if (options->interface_address().empty()) {
-
211  LOG(ERROR) << "Interface address is required for multicast, which can be "
-
212  "specified in udp url, e.g. "
-
213  "udp://ip:port?interface=interface_ip.";
+
210  if (inet_pton(AF_INET, options->interface_address().c_str(),
+
211  &multicast_group.imr_interface) != 1) {
+
212  LOG(ERROR) << "Malformed IPv4 interface address "
+
213  << options->interface_address();
214  return false;
215  }
-
216  if (inet_pton(AF_INET, options->interface_address().c_str(),
-
217  &multicast_group.imr_interface) != 1) {
-
218  LOG(ERROR) << "Malformed IPv4 interface address "
-
219  << options->interface_address();
-
220  return false;
-
221  }
-
222 
-
223  if (setsockopt(new_socket.get(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
-
224  reinterpret_cast<const char*>(&multicast_group),
-
225  sizeof(multicast_group)) < 0) {
-
226  LOG(ERROR) << "Failed to join multicast group.";
-
227  return false;
-
228  }
-
229 
-
230 #if defined(__linux__)
-
231  // Disable IP_MULTICAST_ALL to avoid interference caused when two sockets
-
232  // are bound to the same port but joined to different multicast groups.
-
233  const int optval_zero = 0;
-
234  if (setsockopt(new_socket.get(), IPPROTO_IP, IP_MULTICAST_ALL,
-
235  reinterpret_cast<const char*>(&optval_zero),
-
236  sizeof(optval_zero)) < 0 &&
-
237  errno != ENOPROTOOPT) {
-
238  LOG(ERROR) << "Failed to disable IP_MULTICAST_ALL option.";
-
239  return false;
-
240  }
-
241 #endif // #if defined(__linux__)
-
242  }
-
243 
-
244  // Set timeout if needed.
-
245  if (options->timeout_us() != 0) {
-
246  struct timeval tv;
-
247  tv.tv_sec = options->timeout_us() / 1000000;
-
248  tv.tv_usec = options->timeout_us() % 1000000;
-
249  if (setsockopt(new_socket.get(), SOL_SOCKET, SO_RCVTIMEO,
-
250  reinterpret_cast<char*>(&tv), sizeof(tv)) < 0) {
-
251  LOG(ERROR) << "Failed to set socket timeout.";
-
252  return false;
-
253  }
-
254  }
-
255 
-
256  socket_ = new_socket.release();
-
257  return true;
-
258 }
-
259 
-
260 } // namespace shaka
+
216 
+
217  if (setsockopt(new_socket.get(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
+
218  reinterpret_cast<const char*>(&multicast_group),
+
219  sizeof(multicast_group)) < 0) {
+
220  LOG(ERROR) << "Failed to join multicast group.";
+
221  return false;
+
222  }
+
223 
+
224 #if defined(__linux__)
+
225  // Disable IP_MULTICAST_ALL to avoid interference caused when two sockets
+
226  // are bound to the same port but joined to different multicast groups.
+
227  const int optval_zero = 0;
+
228  if (setsockopt(new_socket.get(), IPPROTO_IP, IP_MULTICAST_ALL,
+
229  reinterpret_cast<const char*>(&optval_zero),
+
230  sizeof(optval_zero)) < 0 &&
+
231  errno != ENOPROTOOPT) {
+
232  LOG(ERROR) << "Failed to disable IP_MULTICAST_ALL option.";
+
233  return false;
+
234  }
+
235 #endif // #if defined(__linux__)
+
236  }
+
237 
+
238  // Set timeout if needed.
+
239  if (options->timeout_us() != 0) {
+
240  struct timeval tv;
+
241  tv.tv_sec = options->timeout_us() / 1000000;
+
242  tv.tv_usec = options->timeout_us() % 1000000;
+
243  if (setsockopt(new_socket.get(), SOL_SOCKET, SO_RCVTIMEO,
+
244  reinterpret_cast<char*>(&tv), sizeof(tv)) < 0) {
+
245  LOG(ERROR) << "Failed to set socket timeout.";
+
246  return false;
+
247  }
+
248  }
+
249 
+
250  socket_ = new_socket.release();
+
251  return true;
+
252 }
+
253 
+
254 } // namespace shaka
int64_t Read(void *buffer, uint64_t length) override
Definition: udp_file.cc:61
const std::string & file_name() const
Definition: file.h:94
bool Tell(uint64_t *position) override
Definition: udp_file.cc:100
@@ -362,7 +356,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d6b/structshaka_1_1MpdParams-members.html b/docs/db/d6b/structshaka_1_1MpdParams-members.html index e43049415a..1a136dfc98 100644 --- a/docs/db/d6b/structshaka_1_1MpdParams-members.html +++ b/docs/db/d6b/structshaka_1_1MpdParams-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d71/http__key__fetcher_8h_source.html b/docs/db/d71/http__key__fetcher_8h_source.html index ed896fe299..99dd5acdf0 100644 --- a/docs/db/d71/http__key__fetcher_8h_source.html +++ b/docs/db/d71/http__key__fetcher_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d74/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord-members.html b/docs/db/d74/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord-members.html index 7bae56e9df..a458b5e609 100644 --- a/docs/db/d74/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord-members.html +++ b/docs/db/d74/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d75/classshaka_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter-members.html b/docs/db/d75/classshaka_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter-members.html index 4e0ec8ecd4..cad0727f00 100644 --- a/docs/db/d75/classshaka_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter-members.html +++ b/docs/db/d75/classshaka_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter-members.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d78/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter-members.html b/docs/db/d78/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter-members.html index 44d11501f8..fdd17c1edb 100644 --- a/docs/db/d78/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter-members.html +++ b/docs/db/d78/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d79/chunking__params_8h_source.html b/docs/db/d79/chunking__params_8h_source.html index 5fb4b05ce1..8d48cba487 100644 --- a/docs/db/d79/chunking__params_8h_source.html +++ b/docs/db/d79/chunking__params_8h_source.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d7e/muxer__options_8cc_source.html b/docs/db/d7e/muxer__options_8cc_source.html index c541a68a0b..363e8723e7 100644 --- a/docs/db/d7e/muxer__options_8cc_source.html +++ b/docs/db/d7e/muxer__options_8cc_source.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d84/classshaka_1_1media_1_1AACAudioSpecificConfig-members.html b/docs/db/d84/classshaka_1_1media_1_1AACAudioSpecificConfig-members.html index c2622b374e..79c8d6633d 100644 --- a/docs/db/d84/classshaka_1_1media_1_1AACAudioSpecificConfig-members.html +++ b/docs/db/d84/classshaka_1_1media_1_1AACAudioSpecificConfig-members.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d86/classshaka_1_1media_1_1NaluReader.html b/docs/db/d86/classshaka_1_1media_1_1NaluReader.html index 9f33ee82cf..fd00b9c2c7 100644 --- a/docs/db/d86/classshaka_1_1media_1_1NaluReader.html +++ b/docs/db/d86/classshaka_1_1media_1_1NaluReader.html @@ -350,7 +350,7 @@ static bool FindStartCode< diff --git a/docs/db/d8f/mp4__muxer_8h_source.html b/docs/db/d8f/mp4__muxer_8h_source.html index e79c0c780d..ebfdd80ebc 100644 --- a/docs/db/d8f/mp4__muxer_8h_source.html +++ b/docs/db/d8f/mp4__muxer_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
81 
82 #endif // MEDIA_FORMATS_MP4_MP4_MUXER_H_
Abstract class holds stream information.
Definition: stream_info.h:58
- +
MP4Muxer(const MuxerOptions &options)
Create a MP4Muxer object from MuxerOptions.
Definition: mp4_muxer.cc:108
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
@@ -181,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d94/classshaka_1_1media_1_1ClusterBuilder.html b/docs/db/d94/classshaka_1_1media_1_1ClusterBuilder.html index a8e98745fc..a4d2f6e089 100644 --- a/docs/db/d94/classshaka_1_1media_1_1ClusterBuilder.html +++ b/docs/db/d94/classshaka_1_1media_1_1ClusterBuilder.html @@ -125,7 +125,7 @@ std::unique_ptr< diff --git a/docs/db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html b/docs/db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html index 920c9d43f3..3bdc2cd4d5 100644 --- a/docs/db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html +++ b/docs/db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html @@ -312,7 +312,7 @@ template<typename T > diff --git a/docs/db/d95/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset.html b/docs/db/d95/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset.html index 3c09a524f4..56332c08ff 100644 --- a/docs/db/d95/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset.html +++ b/docs/db/d95/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset.html @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/db/d96/wvm__media__parser_8h_source.html b/docs/db/d96/wvm__media__parser_8h_source.html index 7f484a5178..c0d1b77a24 100644 --- a/docs/db/d96/wvm__media__parser_8h_source.html +++ b/docs/db/d96/wvm__media__parser_8h_source.html @@ -350,19 +350,19 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); -
void Init(const InitCB &init_cb, const NewSampleCB &new_sample_cb, KeySource *decryption_key_source) override
+
void Init(const InitCB &init_cb, const NewSampleCB &new_sample_cb, KeySource *decryption_key_source) override
-
bool Flush() override WARN_UNUSED_RESULT
+
bool Flush() override WARN_UNUSED_RESULT
base::Callback< void(const std::vector< std::shared_ptr< StreamInfo > > &stream_info)> InitCB
Definition: media_parser.h:34
base::Callback< bool(uint32_t track_id, const std::shared_ptr< MediaSample > &media_sample)> NewSampleCB
Definition: media_parser.h:43
-
bool Parse(const uint8_t *buf, int size) override WARN_UNUSED_RESULT
+
bool Parse(const uint8_t *buf, int size) override WARN_UNUSED_RESULT
KeySource is responsible for encryption key acquisition.
Definition: key_source.h:45
diff --git a/docs/db/da4/classBandwidthEstimator-members.html b/docs/db/da4/classBandwidthEstimator-members.html index 10d6a0c805..176f147b1f 100644 --- a/docs/db/da4/classBandwidthEstimator-members.html +++ b/docs/db/da4/classBandwidthEstimator-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/da6/memory__file_8h_source.html b/docs/db/da6/memory__file_8h_source.html index 40b35996d4..390e4fdae4 100644 --- a/docs/db/da6/memory__file_8h_source.html +++ b/docs/db/da6/memory__file_8h_source.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/da9/classshaka_1_1media_1_1WebVttSampleConverter-members.html b/docs/db/da9/classshaka_1_1media_1_1WebVttSampleConverter-members.html index ab2cbe2891..cd903b7c84 100644 --- a/docs/db/da9/classshaka_1_1media_1_1WebVttSampleConverter-members.html +++ b/docs/db/da9/classshaka_1_1media_1_1WebVttSampleConverter-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dab/classshaka_1_1media_1_1TextStreamInfo.html b/docs/db/dab/classshaka_1_1media_1_1TextStreamInfo.html index 6d015b0c62..0bb1fbaf16 100644 --- a/docs/db/dab/classshaka_1_1media_1_1TextStreamInfo.html +++ b/docs/db/dab/classshaka_1_1media_1_1TextStreamInfo.html @@ -334,7 +334,7 @@ void set_encryption_config diff --git a/docs/db/dae/classshaka_1_1media_1_1WebMInfoParser.html b/docs/db/dae/classshaka_1_1media_1_1WebMInfoParser.html index 04ff0d2432..7643838f74 100644 --- a/docs/db/dae/classshaka_1_1media_1_1WebMInfoParser.html +++ b/docs/db/dae/classshaka_1_1media_1_1WebMInfoParser.html @@ -175,7 +175,7 @@ The number of bytes parsed on success. diff --git a/docs/db/dae/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader-members.html b/docs/db/dae/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader-members.html index 8052e168ef..14496aba5e 100644 --- a/docs/db/dae/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader-members.html +++ b/docs/db/dae/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/db1/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry-members.html b/docs/db/db1/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry-members.html index 5d1d16e898..4da2ed4aa9 100644 --- a/docs/db/db1/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry-members.html +++ b/docs/db/db1/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/db8/structshaka_1_1media_1_1OnMediaEndParameters.html b/docs/db/db8/structshaka_1_1media_1_1OnMediaEndParameters.html index 05b63a96dd..42c34bb823 100644 --- a/docs/db/db8/structshaka_1_1media_1_1OnMediaEndParameters.html +++ b/docs/db/db8/structshaka_1_1media_1_1OnMediaEndParameters.html @@ -112,7 +112,7 @@ float duration_seconds diff --git a/docs/db/db8/structshaka_1_1media_1_1mp4_1_1TrackEncryption.html b/docs/db/db8/structshaka_1_1media_1_1mp4_1_1TrackEncryption.html index 17abf0b82a..b49d3085d9 100644 --- a/docs/db/db8/structshaka_1_1media_1_1mp4_1_1TrackEncryption.html +++ b/docs/db/db8/structshaka_1_1media_1_1mp4_1_1TrackEncryption.html @@ -197,7 +197,7 @@ Additional Inherited Members diff --git a/docs/db/dcb/classshaka_1_1media_1_1VPxParser.html b/docs/db/dcb/classshaka_1_1media_1_1VPxParser.html index 2f703968ab..451d7e69f2 100644 --- a/docs/db/dcb/classshaka_1_1media_1_1VPxParser.html +++ b/docs/db/dcb/classshaka_1_1media_1_1VPxParser.html @@ -205,7 +205,7 @@ Protected Member Functions diff --git a/docs/db/dcd/classshaka_1_1MpdWriter.html b/docs/db/dcd/classshaka_1_1MpdWriter.html index 8577973295..0bc5e849fd 100644 --- a/docs/db/dcd/classshaka_1_1MpdWriter.html +++ b/docs/db/dcd/classshaka_1_1MpdWriter.html @@ -123,7 +123,7 @@ class MpdWriterTest diff --git a/docs/db/dcd/structshaka_1_1media_1_1mp4_1_1DTSSpecific-members.html b/docs/db/dcd/structshaka_1_1media_1_1mp4_1_1DTSSpecific-members.html index 99936dd4aa..aa2dfc7450 100644 --- a/docs/db/dcd/structshaka_1_1media_1_1mp4_1_1DTSSpecific-members.html +++ b/docs/db/dcd/structshaka_1_1media_1_1mp4_1_1DTSSpecific-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dd0/classshaka_1_1Packager.html b/docs/db/dd0/classshaka_1_1Packager.html index bc5bef7370..2b7057091a 100644 --- a/docs/db/dd0/classshaka_1_1Packager.html +++ b/docs/db/dd0/classshaka_1_1Packager.html @@ -115,7 +115,7 @@ Static Public Member Functions

Detailed Description

-

Definition at line 113 of file packager.h.

+

Definition at line 117 of file packager.h.

Member Function Documentation

@@ -172,7 +172,7 @@ Static Public Member Functions
Returns
the stream label associated with stream_info. Can be "AUDIO", "SD", "HD", "UHD1" or "UHD2".
-

Definition at line 893 of file packager.cc.

+

Definition at line 892 of file packager.cc.

@@ -198,7 +198,7 @@ Static Public Member Functions
Returns
The version of the library.
-

Definition at line 889 of file packager.cc.

+

Definition at line 888 of file packager.cc.

@@ -235,7 +235,7 @@ Static Public Member Functions
Returns
OK on success, an appropriate error code on failure.
-

Definition at line 743 of file packager.cc.

+

Definition at line 742 of file packager.cc.

@@ -254,7 +254,7 @@ Static Public Member Functions

Run the pipeline to completion (or failed / been cancelled). Note that it blocks until completion.

Returns
OK on success, an appropriate error code on failure.
-

Definition at line 862 of file packager.cc.

+

Definition at line 861 of file packager.cc.

@@ -265,7 +265,7 @@ Static Public Member Functions diff --git a/docs/db/dd0/classshaka_1_1media_1_1RawKeySource.html b/docs/db/dd0/classshaka_1_1media_1_1RawKeySource.html index e71d486bbe..c7a229df85 100644 --- a/docs/db/dd0/classshaka_1_1media_1_1RawKeySource.html +++ b/docs/db/dd0/classshaka_1_1media_1_1RawKeySource.html @@ -366,7 +366,7 @@ Static Public Member Functions diff --git a/docs/db/dd0/classshaka_1_1media_1_1VodMediaInfoDumpMuxerListener.html b/docs/db/dd0/classshaka_1_1media_1_1VodMediaInfoDumpMuxerListener.html index 3f5e58c551..0973b675ba 100644 --- a/docs/db/dd0/classshaka_1_1media_1_1VodMediaInfoDumpMuxerListener.html +++ b/docs/db/dd0/classshaka_1_1media_1_1VodMediaInfoDumpMuxerListener.html @@ -489,7 +489,7 @@ Additional Inherited Members diff --git a/docs/db/dd2/chunk__info__iterator_8h_source.html b/docs/db/dd2/chunk__info__iterator_8h_source.html index 7380346524..32503050ee 100644 --- a/docs/db/dd2/chunk__info__iterator_8h_source.html +++ b/docs/db/dd2/chunk__info__iterator_8h_source.html @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dd9/sync__sample__iterator_8h_source.html b/docs/db/dd9/sync__sample__iterator_8h_source.html index d07d54386f..b69ead31f2 100644 --- a/docs/db/dd9/sync__sample__iterator_8h_source.html +++ b/docs/db/dd9/sync__sample__iterator_8h_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dde/h265__parser_8cc_source.html b/docs/db/dde/h265__parser_8cc_source.html index 35cde53423..c7e0937411 100644 --- a/docs/db/dde/h265__parser_8cc_source.html +++ b/docs/db/dde/h265__parser_8cc_source.html @@ -1213,7 +1213,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dea/classshaka_1_1media_1_1TrickPlayHandler.html b/docs/db/dea/classshaka_1_1media_1_1TrickPlayHandler.html index dfe59d1dc4..87c6182588 100644 --- a/docs/db/dea/classshaka_1_1media_1_1TrickPlayHandler.html +++ b/docs/db/dea/classshaka_1_1media_1_1TrickPlayHandler.html @@ -135,10 +135,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -151,14 +147,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -193,7 +193,7 @@ std::pair< std::shared_ptr
diff --git a/docs/db/dec/audio__timestamp__helper_8cc_source.html b/docs/db/dec/audio__timestamp__helper_8cc_source.html index 36212ee3f1..65ff33c4e4 100644 --- a/docs/db/dec/audio__timestamp__helper_8cc_source.html +++ b/docs/db/dec/audio__timestamp__helper_8cc_source.html @@ -165,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dee/pes__packet_8cc_source.html b/docs/db/dee/pes__packet_8cc_source.html index c5ff638b05..6ed281cb05 100644 --- a/docs/db/dee/pes__packet_8cc_source.html +++ b/docs/db/dee/pes__packet_8cc_source.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/df2/structshaka_1_1media_1_1H265SliceHeader-members.html b/docs/db/df2/structshaka_1_1media_1_1H265SliceHeader-members.html index 574fd22339..618139112a 100644 --- a/docs/db/df2/structshaka_1_1media_1_1H265SliceHeader-members.html +++ b/docs/db/df2/structshaka_1_1media_1_1H265SliceHeader-members.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/df6/classshaka_1_1media_1_1Cluster-members.html b/docs/db/df6/classshaka_1_1media_1_1Cluster-members.html index 05e46b36e4..fc9042584e 100644 --- a/docs/db/df6/classshaka_1_1media_1_1Cluster-members.html +++ b/docs/db/df6/classshaka_1_1media_1_1Cluster-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/df6/muxer_8h_source.html b/docs/db/df6/muxer_8h_source.html index 8b227a3cb3..6b9b474eac 100644 --- a/docs/db/df6/muxer_8h_source.html +++ b/docs/db/df6/muxer_8h_source.html @@ -179,7 +179,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
108 #endif // MEDIA_BASE_MUXER_H_
Status OnFlushRequest(size_t input_stream_index) override
Event handler for flush request at the specific input stream index.
Definition: muxer.h:66
- +
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
void SetProgressListener(std::unique_ptr< ProgressListener > progress_listener)
Definition: muxer.cc:32
@@ -191,7 +191,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html b/docs/db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html index 9432239dcb..56c0e99879 100644 --- a/docs/db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html +++ b/docs/db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html @@ -233,7 +233,7 @@ void WarnIfNotMatch (i diff --git a/docs/db/dfb/mpd__utils_8cc_source.html b/docs/db/dfb/mpd__utils_8cc_source.html index 535ce076af..c88e191fbc 100644 --- a/docs/db/dfb/mpd__utils_8cc_source.html +++ b/docs/db/dfb/mpd__utils_8cc_source.html @@ -469,7 +469,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dfc/mpd__notify__muxer__listener_8cc_source.html b/docs/db/dfc/mpd__notify__muxer__listener_8cc_source.html index bc4553c917..6be0cfad69 100644 --- a/docs/db/dfc/mpd__notify__muxer__listener_8cc_source.html +++ b/docs/db/dfc/mpd__notify__muxer__listener_8cc_source.html @@ -270,7 +270,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dff/structshaka_1_1media_1_1mp4_1_1ChunkInfo-members.html b/docs/db/dff/structshaka_1_1media_1_1mp4_1_1ChunkInfo-members.html index f2f6769441..f931034a00 100644 --- a/docs/db/dff/structshaka_1_1media_1_1mp4_1_1ChunkInfo-members.html +++ b/docs/db/dff/structshaka_1_1media_1_1mp4_1_1ChunkInfo-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html b/docs/dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html index 4b246ea886..a3c4025ed3 100644 --- a/docs/dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html +++ b/docs/dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html @@ -89,12 +89,16 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
shaka::media::mp2t::ProgramMapTableWriter Class Referenceabstract
+

Puts PMT into TS packets and writes them to buffer. + More...

+

#include <program_map_table_writer.h>

Inheritance diagram for shaka::media::mp2t::ProgramMapTableWriter:
@@ -102,21 +106,24 @@ Inheritance diagram for shaka::media::mp2t::ProgramMapTableWriter:
-shaka::media::mp2t::AacProgramMapTableWriter -shaka::media::mp2t::H264ProgramMapTableWriter +shaka::media::mp2t::AudioProgramMapTableWriter +shaka::media::mp2t::VideoProgramMapTableWriter
- - - - - - + + + + + + + +

Public Member Functions

-virtual bool EncryptedSegmentPmt (BufferWriter *writer)=0
 Writes TS packets with PMT for encrypted segments.
 
-virtual bool ClearSegmentPmt (BufferWriter *writer)=0
 Writes TS packets with PMT for clear segments.
 
ProgramMapTableWriter (Codec codec)
 
+virtual bool EncryptedSegmentPmt (BufferWriter *writer)
 Writes TS packets with PMT for encrypted segments.
 
+virtual bool ClearSegmentPmt (BufferWriter *writer)
 Writes TS packets with PMT for clear segments.
 
@@ -126,19 +133,51 @@ static const uint8_t  +

Static Public Attributes

kPmtP
static const uint8_t kElementaryPid = 0x50
 
+ + +

+Protected Member Functions

Codec codec () const
 

Detailed Description

-

Puts PMT into TS packets and writes them to buffer. Note that this does not currently allow encryption without clear lead.

+

Puts PMT into TS packets and writes them to buffer.

Definition at line 27 of file program_map_table_writer.h.

-

The documentation for this class was generated from the following files:
    +

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
Codec shaka::media::mp2t::ProgramMapTableWriter::codec () const
+
+inlineprotected
+
+
Returns
the underlying codec.
+ +

Definition at line 49 of file program_map_table_writer.h.

+ +
+
+
The documentation for this class was generated from the following files: diff --git a/docs/dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.png b/docs/dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.png index 427b55b6e2e1af000f7116e02354e85882cbe3a8..92b25c9bd0a7039a2347e92d30a7087e3a1e3c0d 100644 GIT binary patch literal 1587 zcmb7EYfw{16ut?KMR^HGc?njD25u2i5FZ5}lvlt|n%n>a4MBYI)(})cC1MPsAQC2M z4UlOGkq`($35uu*prEl93j`vss2G(1GMGk%DCvc1r$73m)1BFKzHj$@=gjP$-Tbi7 zK$9hQO8@{c!3O!^0RRcXILy!hwr_&$(Xg`#+XeaS_4@gh32jDE+eH{HOsQ0g${$(* zQ$s2~lmNg%^FuC!HUI#s4ePfPI)<1mA7s*){B}2`q_UfLU*j=200Eef<^;s@hU1Fa zan48T`LwJ6*E|OA%8;Cg+}v704sn?|enTv}t+!IXv%TnAyvnS-JNHov@o?$PemQtGQ~Xjt52)vwJ+`x3VS$t8NTHDP9l7 zCkS;VfI~7!vz##M<8Nns{J2RpGOb*D@W3wlds!QVqb6P6dZ+JqEfj&p378Rv=e_<9n0)h*?JWiKexg&QXKiEnH>_&MeaW@ zfiOW3>D{t957RYUZpk>E@565 zBjB5wzN~v046Z#edc7+PKcYW(M@e$_B~1s$CA6xV@|~|Gm%6Np9aWK3VbjpGgex0yUfq|%D`{hE zOJXIaH4MsD@xlAQRb^_{us4l|y2WNB)hJ5@XK&TV?5?`iSXHLB>vw~!)x#p(sS!|K z%Z}1{RVTa|iz0$qC+;Mqai}BjC8I+ANvv>A!hR_4)rb}QSopS#{UJfb_aBI0NK%yM z38bS4C(%J#;_B||ULM=>4IkQjbZG7_I-+<_N+nyyg4B+u`%W*BMJR0Y z=@r4B19}Jvin+Va5wQ*SkHisOn%3x?-e_0cZP&^{(d!*x0|y-<-{x^&ayvCel34Ez zO*LV+i7TNl4Y@ccuu8@15=&OF1flC)!h_N`HB)>paRn}BZ1m^oSN$!N*QvS^u3)DA zf%Yg=bAgL?cqiE;Pm^i$E|9=hrsqAD+FCWcn}r^m(rkn;RM`o4kU88qxOkWuvV)nt oe>YeK@7($T%lHD_vcJJ6gB_(=GGGw74F2H(tbeGV(3hP1CpDhxbN~PV literal 1590 zcmb7EdpOit7(O!@F&N6y#H6jJY;K8eF3F!t9FDx{h0^DJ450 z#-$-K%;WN`)T(3}8nw!$#Y{ws0D$U&oPH$H5faw(vtveDPPwH<3WebbXWcM+m4fWra#DOxs4!zqRw-pt zXEej)al@4mpJGd(&R6nOBQsFQD?Jei^*Vdd=xxeC=&F!)t5N2BB;v_QE>QOVp5b#S zLJ(W<(5~yvA+yI`hgFl7{Z|7@Z@t8F##-(oD%o!ot#>1}qeh}+{#X%Y$XFxFfBAkn zJ6ME!(MZOfqp~XlA`KZnguz#Rzs+>J?DSEnvA?SKQhM{d>e@zS+$syv`9=~BO}&V# zKH4m-R1PMcT9WHM)t7PWSb#EBJ#XFYF+)7s8B@q0mwm8|_pXHI&#$*K@z9X83O=CK zR)=PgFqsL4t`)!>M6VCW>N(oIUbredJZ(nPd)d?+n%IlF9Z;oYs%6(hkds;|)G{Iy zlM>}uCQ+K*k##K~T&I;a_gom-mQLFLX@pR}lY8PE&8S+KgKiPfA{rm1NJN!Kk+>B# zRvy*vv6wFpqP%#T^cce&>(lkWzK z^ZcTET81TQn|L{_ro9a;kkaogSeT@IeybSs8zO+l5dk4hw(1$#1~I}Ad9p`tf;T5& z4F2_Y_jLI{P09Qh0TN682~g^N!739iKI{P#icj%`I#@NkE)ihiWO>>Ujb;p^bx(({bwtVhA{U80nF%KAJb|Oh8b0nNntW+1@=BL4 zLcQJz#CjVuHWjOoF;tX!_gci0pc;_zzZd7o!;9Qpn&0KSxg>P@Rum54@Q?*_(C`(+ z%)-ytv+&`UBzP!xh``*{O=I4%I&BE)owR`la7_hxjTJhloTUrN*~?p@fEz*4TS_L3 z@fq_5iHB-pn7bTvB5(Q#hrM34i;r8C%q~7^3Z*R+5;;3&p3NlpQ6q!*4$N4?n_V(3 z(Q1(zB&lwLVo#%`c*(vm{x?1caNskt!_tjtXzgn?QEaaewrK}__1T3Wxd8R4)K;+} zeFD|YIp&l!b=j8lehd@y!|C;IoWL^QWc{q;`STyCw$a%8(?e6`4m~BAc8^O(AWj%t zm_a2zKnJnbYQ;_2xnI;#t@^8&zWsBO(1zrgw3h1|)KM1KJ3DLl`q7!sIkbg)M1ha9 z{$AR{w7_iE^yT6gRY&|VJC`hay!X8+C2uCKK*mALW5CDyC+VQft_ z*QkLyU@%!Do!;HL|0z-5xMfa*o=&P*_OGZ4^KvK*DNUH}bH7bZcj)8VMlusc?Y1Fj zPqCk(1*Hkijzv?Z(kk&F&xO|(tn-0BFO8yk=sigo50~5Lu`{Di@cI|%_AztWtQ6O~ z&t|Lq=-Rweim>{LHm5`0v5xjkI!JgwH#l$a+sO{Nb^q(v>80Xy$-J@qE+oIc!)q=Y%^Tk1*?iT%^2-LtK}}%^`@nY_YMi0KXLT9}i(f5Hn-NVi#erIl^@5SU9`T&0>2+oI{p=ebZ!p#C6#xJL diff --git a/docs/dc/d06/classshaka_1_1media_1_1StreamInfo-members.html b/docs/dc/d06/classshaka_1_1media_1_1StreamInfo-members.html index 7bdd664d98..b1a81f0071 100644 --- a/docs/dc/d06/classshaka_1_1media_1_1StreamInfo-members.html +++ b/docs/dc/d06/classshaka_1_1media_1_1StreamInfo-members.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d08/raw__key__encryption__flags_8cc_source.html b/docs/dc/d08/raw__key__encryption__flags_8cc_source.html index 958583aeea..43a023f020 100644 --- a/docs/dc/d08/raw__key__encryption__flags_8cc_source.html +++ b/docs/dc/d08/raw__key__encryption__flags_8cc_source.html @@ -205,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d0b/classshaka_1_1media_1_1ESDescriptor-members.html b/docs/dc/d0b/classshaka_1_1media_1_1ESDescriptor-members.html index c69470bd76..90cb9ceb5a 100644 --- a/docs/dc/d0b/classshaka_1_1media_1_1ESDescriptor-members.html +++ b/docs/dc/d0b/classshaka_1_1media_1_1ESDescriptor-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d16/classshaka_1_1media_1_1SeekHead.html b/docs/dc/d16/classshaka_1_1media_1_1SeekHead.html index ee430f91ee..7db15270de 100644 --- a/docs/dc/d16/classshaka_1_1media_1_1SeekHead.html +++ b/docs/dc/d16/classshaka_1_1media_1_1SeekHead.html @@ -149,7 +149,7 @@ void set_tracks_pos (u diff --git a/docs/dc/d17/status__test__util_8h_source.html b/docs/dc/d17/status__test__util_8h_source.html index c05601511f..6338d597c7 100644 --- a/docs/dc/d17/status__test__util_8h_source.html +++ b/docs/dc/d17/status__test__util_8h_source.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html b/docs/dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html index c1a06d0917..edb7671d6e 100644 --- a/docs/dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html +++ b/docs/dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html @@ -154,7 +154,7 @@ std::shared_ptr< shaka::media::MediaParser.

-

Definition at line 519 of file wvm_media_parser.cc.

+

Definition at line 518 of file wvm_media_parser.cc.

@@ -206,7 +206,7 @@ std::shared_ptr< shaka::media::MediaParser.

-

Definition at line 115 of file wvm_media_parser.cc.

+

Definition at line 114 of file wvm_media_parser.cc.

@@ -246,7 +246,7 @@ std::shared_ptr< shaka::media::MediaParser.

-

Definition at line 126 of file wvm_media_parser.cc.

+

Definition at line 125 of file wvm_media_parser.cc.

@@ -257,7 +257,7 @@ std::shared_ptr< diff --git a/docs/dc/d18/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo-members.html b/docs/dc/d18/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo-members.html index 9589dc0571..ddb349bcaf 100644 --- a/docs/dc/d18/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo-members.html +++ b/docs/dc/d18/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d19/box_8h_source.html b/docs/dc/d19/box_8h_source.html index 4d34656099..379e720db1 100644 --- a/docs/dc/d19/box_8h_source.html +++ b/docs/dc/d19/box_8h_source.html @@ -184,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html b/docs/dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.html similarity index 57% rename from docs/d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html rename to docs/dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.html index 859eb71777..e42f5cdd06 100644 --- a/docs/d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html +++ b/docs/dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: shaka::media::mp2t::AacProgramMapTableWriter Class Reference +Shaka Packager SDK: shaka::media::mp2t::AudioProgramMapTableWriter Class Reference @@ -82,42 +82,49 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
shaka::media::mp2t::AacProgramMapTableWriter Class Reference
+
shaka::media::mp2t::AudioProgramMapTableWriter Class Reference
+

ProgramMapTableWriter for video codecs. + More...

+

#include <program_map_table_writer.h>

-Inheritance diagram for shaka::media::mp2t::AacProgramMapTableWriter:
+Inheritance diagram for shaka::media::mp2t::AudioProgramMapTableWriter:
- - -shaka::media::mp2t::ProgramMapTableWriter + + +shaka::media::mp2t::ProgramMapTableWriter
- - - - - - - - + + + + + + + + + + +

Public Member Functions

AacProgramMapTableWriter (const std::vector< uint8_t > &aac_audio_specific_config, ContinuityCounter *continuity_counter)
 
-bool EncryptedSegmentPmt (BufferWriter *writer) override
 Writes TS packets with PMT for encrypted segments.
 
-bool ClearSegmentPmt (BufferWriter *writer) override
 Writes TS packets with PMT for clear segments.
 
AudioProgramMapTableWriter (Codec codec, const std::vector< uint8_t > &audio_specific_config)
 
- Public Member Functions inherited from shaka::media::mp2t::ProgramMapTableWriter
ProgramMapTableWriter (Codec codec)
 
+virtual bool EncryptedSegmentPmt (BufferWriter *writer)
 Writes TS packets with PMT for encrypted segments.
 
+virtual bool ClearSegmentPmt (BufferWriter *writer)
 Writes TS packets with PMT for clear segments.
 
@@ -128,11 +135,14 @@ static const uint8_t  + + +

Additional Inherited Members

kPmtP
static const uint8_t kElementaryPid = 0x50
 
- Protected Member Functions inherited from shaka::media::mp2t::ProgramMapTableWriter
Codec codec () const
 

Detailed Description

-

This is not a general purpose PMT writer. This is intended to be used by TsWriter.

+

ProgramMapTableWriter for video codecs.

-

Definition at line 69 of file program_map_table_writer.h.

+

Definition at line 79 of file program_map_table_writer.h.


The documentation for this class was generated from the following files:
diff --git a/docs/dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.png b/docs/dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2a45ea6061f0c3d7c91b32d0e924c05343a961 GIT binary patch literal 1141 zcmeAS@N?(olHy`uVBq!ia0y~yU{nRN12~w0WQOA8W*{XI;1lBd|Nnm=^TnI5rTvE{ z09jys;J^Xa&O7ozE=Ng_UoZnu5eQs86=KA|z{29`;uuoF_;&8wzQ+nYuKebg_WW1Q zpUsx^S#Wt!_^fwPmse*VyzwmIaQwF1+d;Rt<%%awUNS{Rcj^=s&7h!3OFTS1Cn>3_ zdUlBfXiYlT|6kQJ*!GOm>7aRPXWx7*mY=Z1deyeSv+kaM`SM3m)YS!Pf9Gzf@0_F( z`|`w<{O7zr>>ZMk)*?Z>Bujl?TD%EYdi&ygz1q%p$Ggc}_n55a>tDZ4t?%c#sj^1< zeEak+CtuII5Ec2h{`^O&g4P_*ms8KZJ0!EW^AZow^p{fk*R)QY-#+o+RB5Zll^Mr2 zGUf$I3eERh_v%&Gr1j@!ZPCAMHz|MV(#ZSCZ_PgLo_R;{>t&6Zua|zlS!~E^A`^VS zebO2AH#@@Ct1o?5x90diqr%>u%TjhP{%^GS%AV=~HFN)!=a*69n+^x zvAa^3uDVs;uKlL8`HZXK%eQ`bvZCEQ?^Vu;+=|Dy7StBHdwuJj3^d)!Z<5{GRHaEK zulD_%-KY9;U!CF7({dA3mj9m`lr7}R_0>Oc(vtVV$iY7a7$29KFKx?>&H_e~ZbSSs z`38{#t&@Zt7R;Z2gr#8Z5*C3MjGBgwFUKvp3wMcsY#GL!x)wQ8Af+J4r*{?6~*ds}+)^1o9fODk&L>iA5X zD{cH!X8XoB6CzX19&Rhjxxo9&V)?iI&ntK%#HIKAesgk}-@H9>Y-!GyP4BGoDhed(PGjb-`Ix@=os$R=54HaDjrMsU`n)s{cC-pKw8i<-r&YZCP8&$ZhrCa>O2 z_?0>3%-2WF=N?^Qikkm;%i}1^c~f@1UO(^E=_97kW=+zqtG3qH^ewQ8*WJUOI_dkA zUnS>R(x&*7{Z+MEIpJYZ@$LDa;-|%!+w)gUpY%T8edXqNoIn2jHvTf1d8w=X-5dM% z2eeJ%)(o9&J>{2ldEwbTh5EXhcVF+=Jn0s{eA2gLylGzpGj(%T&h5Ybr`P)XjlG4J zGn_vimcGvRcCt;-ru;iM3K`~KTfX=H_wOf9+;=&7RpP+Xf8kzhJsF&8g;g8ghX*lr vOqs#}%&iR`o}3Donu9c#F7eV#U29*VX=}R2bx9Ynj9~C|^>bP0l+XkKX-ODU literal 0 HcmV?d00001 diff --git a/docs/dc/d1c/replicator_8h_source.html b/docs/dc/d1c/replicator_8h_source.html index 4479f557e3..b4e231b4a1 100644 --- a/docs/dc/d1c/replicator_8h_source.html +++ b/docs/dc/d1c/replicator_8h_source.html @@ -113,13 +113,13 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
28 } // namespace shaka
29 
30 #endif // PACKAGER_MEDIA_REPLICATOR_HANDLER_H_
- + diff --git a/docs/dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html b/docs/dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html new file mode 100644 index 0000000000..ce76a94dd2 --- /dev/null +++ b/docs/dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html @@ -0,0 +1,468 @@ + + + + + + +Shaka Packager SDK: shaka::media::mp2t::Ac3Header Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
shaka::media::mp2t::Ac3Header Class Reference
+
+
+ +

#include <ac3_header.h>

+
+Inheritance diagram for shaka::media::mp2t::Ac3Header:
+
+
+ + +shaka::media::mp2t::AudioHeader + +
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

AudioHeader implementation overrides.
bool IsSyncWord (const uint8_t *buf) const override
 
size_t GetMinFrameSize () const override
 
size_t GetSamplesPerFrame () const override
 
bool Parse (const uint8_t *adts_frame, size_t adts_frame_size) override
 
size_t GetHeaderSize () const override
 
size_t GetFrameSize () const override
 
void GetAudioSpecificConfig (std::vector< uint8_t > *buffer) const override
 
uint8_t GetObjectType () const override
 
uint32_t GetSamplingFrequency () const override
 
uint8_t GetNumChannels () const override
 
+

Detailed Description

+

Class which parses AC3 frame (header / metadata) and synthesizes AudioSpecificConfig from audio frame content.

+ +

Definition at line 22 of file ac3_header.h.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
void shaka::media::mp2t::Ac3Header::GetAudioSpecificConfig (std::vector< uint8_t > * buffer) const
+
+overridevirtual
+
+

Synthesize an AudioSpecificConfig record from the fields within the audio header. Should only be called after a successful Parse.

+
Parameters
+ + +
[out]bufferis a pointer to a vector to contain the AudioSpecificConfig.
+
+
+
Returns
true if successful, false otherwise.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 111 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t shaka::media::mp2t::Ac3Header::GetFrameSize () const
+
+overridevirtual
+
+

Should only be called after a successful Parse.

+
Returns
the size of frame (header + payload).
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 105 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t shaka::media::mp2t::Ac3Header::GetHeaderSize () const
+
+overridevirtual
+
+

Should only be called after a successful Parse.

+
Returns
The size of audio header.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 99 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t shaka::media::mp2t::Ac3Header::GetMinFrameSize () const
+
+overridevirtual
+
+
Returns
The minium frame size.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 50 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t shaka::media::mp2t::Ac3Header::GetNumChannels () const
+
+overridevirtual
+
+

Should only be called after a successful Parse.

+
Returns
Number of channels for this frame.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 136 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint8_t shaka::media::mp2t::Ac3Header::GetObjectType () const
+
+overridevirtual
+
+

Should only be called after a successful Parse.

+
Returns
The audio profile for this frame. Only meaningful for AAC.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 126 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t shaka::media::mp2t::Ac3Header::GetSamplesPerFrame () const
+
+overridevirtual
+
+
Returns
Number of audio samples per frame.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 56 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
uint32_t shaka::media::mp2t::Ac3Header::GetSamplingFrequency () const
+
+overridevirtual
+
+

Should only be called after a successful Parse.

+
Returns
The sampling frequency for this frame.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 131 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool shaka::media::mp2t::Ac3Header::IsSyncWord (const uint8_t * buf) const
+
+overridevirtual
+
+

Check if the leading word (2 bytes) is sync signal.

+
Parameters
+ + +
bufpoints to the buffer to be checked. Must be at least 2 bytes.
+
+
+
Returns
true if corresponds to a syncword.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 44 of file ac3_header.cc.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool shaka::media::mp2t::Ac3Header::Parse (const uint8_t * audio_frame,
size_t audio_frame_size 
)
+
+overridevirtual
+
+

Parse a partial audio frame, extracting the fields within. Only audio frame header / metadata is parsed. The audio_frame_size must contain the full header / metadata.

+
Parameters
+ + + +
audio_frameis an input parameter pointing to an audio frame.
audio_frame_sizeis the size, in bytes of the input data. It can be smaller than the actual frame size, but it should not be smaller than the header size.
+
+
+
Returns
true if successful, false otherwise.
+ +

Implements shaka::media::mp2t::AudioHeader.

+ +

Definition at line 63 of file ac3_header.cc.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.png b/docs/dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.png new file mode 100644 index 0000000000000000000000000000000000000000..22f6371d7584297cf1e5e4fec9bc8794ed436ff8 GIT binary patch literal 789 zcmeAS@N?(olHy`uVBq!ia0vp^M}atigBeK9^K~==QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;TYV2Tb*$Gpz3EPzj*^o3^x%$;Gm6Uv1ZO&nx(ZDEwAo)tDRyt} z@^b=V-P=r^eP;Y!C%x_R4{s4ACHF3lQRvfpd^{6+e~Zw#-Un`1wV>wI1S=kDY+y6+oauD{B?c-qFt-fwtYxnzz% zS$f&rcUzE_^Xz}=LR%;MtlYjo&F$Hw$EKoFw{Hx1!~gY*&m^NXhrsKVGIq-}v?Y7h z=1RrxzdKiS-9lB5pI=|6>_`p$zaqg(^y*^MkFUNj68@4?wQa#{UF)SD)BNvsU+&Vf zo+z*5^u8x6=VOo8*X6&?J}i0Lb4u`(;KcW*fy`$U zK!LH){OBf~(|1`vr0!+NTkjsQC(i#s1QKvTJWzyQwsaQ4ftQlmSY zR_%XjAmY2(N}5lDt+Xhy>f7FoZExl*n)m!=^+$Qp&@v_ah?aYjS8qI$ochZD>vz7z zdBt+!=T_|hS5|M^8q5%L$ykG7pB5}&uJH$PDBg+r&*1k^(>=2NOcXE;GkCiCxvX diff --git a/docs/dc/d35/structshaka_1_1EncryptionParams-members.html b/docs/dc/d35/structshaka_1_1EncryptionParams-members.html index 54be87bde2..3265ab9c0e 100644 --- a/docs/dc/d35/structshaka_1_1EncryptionParams-members.html +++ b/docs/dc/d35/structshaka_1_1EncryptionParams-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d3c/webm__cluster__parser_8h_source.html b/docs/dc/d3c/webm__cluster__parser_8h_source.html index c5c888ce00..fb5750802c 100644 --- a/docs/dc/d3c/webm__cluster__parser_8h_source.html +++ b/docs/dc/d3c/webm__cluster__parser_8h_source.html @@ -113,9 +113,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
25  public:
28  enum {
- +
31 
- +
35  };
36 
37  private:
@@ -290,21 +290,21 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
239 #endif // MEDIA_FORMATS_WEBM_WEBM_CLUSTER_PARSER_H_
Class for parsing or writing VP codec configuration record.
-
WebMClusterParser(int64_t timecode_scale, std::shared_ptr< AudioStreamInfo > audio_stream_info, std::shared_ptr< VideoStreamInfo > video_stream_info, const VPCodecConfigurationRecord &vp_config, int64_t audio_default_duration, int64_t video_default_duration, const WebMTracksParser::TextTracks &text_tracks, const std::set< int64_t > &ignored_tracks, const std::string &audio_encryption_key_id, const std::string &video_encryption_key_id, const MediaParser::NewSampleCB &new_sample_cb, const MediaParser::InitCB &init_cb, KeySource *decryption_key_source)
int Parse(const uint8_t *buf, int size)
base::Callback< void(const std::vector< std::shared_ptr< StreamInfo > > &stream_info)> InitCB
Definition: media_parser.h:34
+
base::Callback< bool(uint32_t track_id, const std::shared_ptr< MediaSample > &media_sample)> NewSampleCB
Definition: media_parser.h:43
bool Flush() WARN_UNUSED_RESULT
+ -
void Reset()
Resets the parser state so it can accept a new cluster.
diff --git a/docs/dc/d3f/key__source_8h_source.html b/docs/dc/d3f/key__source_8h_source.html index 7e7021749c..a765c5c06b 100644 --- a/docs/dc/d3f/key__source_8h_source.html +++ b/docs/dc/d3f/key__source_8h_source.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d40/classshaka_1_1hls_1_1HlsNotifier-members.html b/docs/dc/d40/classshaka_1_1hls_1_1HlsNotifier-members.html index ff038ed757..470406f49c 100644 --- a/docs/dc/d40/classshaka_1_1hls_1_1HlsNotifier-members.html +++ b/docs/dc/d40/classshaka_1_1hls_1_1HlsNotifier-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d40/classshaka_1_1xml_1_1XmlNode-members.html b/docs/dc/d40/classshaka_1_1xml_1_1XmlNode-members.html index 1b58f38170..c968e83884 100644 --- a/docs/dc/d40/classshaka_1_1xml_1_1XmlNode-members.html +++ b/docs/dc/d40/classshaka_1_1xml_1_1XmlNode-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d41/classshaka_1_1media_1_1BufferWriter.html b/docs/dc/d41/classshaka_1_1media_1_1BufferWriter.html index 1786243a0f..7ad84642cf 100644 --- a/docs/dc/d41/classshaka_1_1media_1_1BufferWriter.html +++ b/docs/dc/d41/classshaka_1_1media_1_1BufferWriter.html @@ -301,7 +301,7 @@ void AppendInt (int64_ diff --git a/docs/dc/d4a/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader-members.html b/docs/dc/d4a/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader-members.html index 907c47d884..dd7953b78c 100644 --- a/docs/dc/d4a/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader-members.html +++ b/docs/dc/d4a/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d4f/structshaka_1_1media_1_1mp4_1_1TrackHeader-members.html b/docs/dc/d4f/structshaka_1_1media_1_1mp4_1_1TrackHeader-members.html index 7a6f452f1e..2ec8b91be4 100644 --- a/docs/dc/d4f/structshaka_1_1media_1_1mp4_1_1TrackHeader-members.html +++ b/docs/dc/d4f/structshaka_1_1media_1_1mp4_1_1TrackHeader-members.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d51/h265__byte__to__unit__stream__converter_8cc_source.html b/docs/dc/d51/h265__byte__to__unit__stream__converter_8cc_source.html index 97b2b7acb9..531d982e1d 100644 --- a/docs/dc/d51/h265__byte__to__unit__stream__converter_8cc_source.html +++ b/docs/dc/d51/h265__byte__to__unit__stream__converter_8cc_source.html @@ -162,24 +162,24 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
73  buffer.AppendInt(static_cast<uint8_t>(kUnitStreamNaluLengthSize - 1));
74  buffer.AppendInt(static_cast<uint8_t>(3) /* numOfArrays */);
75 
-
76  // SPS
+
76  // VPS
77  const uint8_t kArrayCompleteness = 0x80;
-
78  buffer.AppendInt(static_cast<uint8_t>(kArrayCompleteness | Nalu::H265_SPS));
+
78  buffer.AppendInt(static_cast<uint8_t>(kArrayCompleteness | Nalu::H265_VPS));
79  buffer.AppendInt(static_cast<uint16_t>(1) /* numNalus */);
-
80  buffer.AppendInt(static_cast<uint16_t>(last_sps_.size()));
-
81  buffer.AppendVector(last_sps_);
+
80  buffer.AppendInt(static_cast<uint16_t>(last_vps_.size()));
+
81  buffer.AppendVector(last_vps_);
82 
-
83  // PPS
-
84  buffer.AppendInt(static_cast<uint8_t>(kArrayCompleteness | Nalu::H265_PPS));
+
83  // SPS
+
84  buffer.AppendInt(static_cast<uint8_t>(kArrayCompleteness | Nalu::H265_SPS));
85  buffer.AppendInt(static_cast<uint16_t>(1) /* numNalus */);
-
86  buffer.AppendInt(static_cast<uint16_t>(last_pps_.size()));
-
87  buffer.AppendVector(last_pps_);
+
86  buffer.AppendInt(static_cast<uint16_t>(last_sps_.size()));
+
87  buffer.AppendVector(last_sps_);
88 
-
89  // VPS
-
90  buffer.AppendInt(static_cast<uint8_t>(kArrayCompleteness | Nalu::H265_VPS));
+
89  // PPS
+
90  buffer.AppendInt(static_cast<uint8_t>(kArrayCompleteness | Nalu::H265_PPS));
91  buffer.AppendInt(static_cast<uint16_t>(1) /* numNalus */);
-
92  buffer.AppendInt(static_cast<uint16_t>(last_vps_.size()));
-
93  buffer.AppendVector(last_vps_);
+
92  buffer.AppendInt(static_cast<uint16_t>(last_pps_.size()));
+
93  buffer.AppendVector(last_pps_);
94 
95  buffer.SwapBuffer(decoder_config);
96  return true;
@@ -239,7 +239,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d52/decoding__time__iterator_8h_source.html b/docs/dc/d52/decoding__time__iterator_8h_source.html index 2c101d372a..0ab85168a9 100644 --- a/docs/dc/d52/decoding__time__iterator_8h_source.html +++ b/docs/dc/d52/decoding__time__iterator_8h_source.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d53/webm_2segmenter_8cc_source.html b/docs/dc/d53/webm_2segmenter_8cc_source.html index e0d23ce115..0263e26932 100644 --- a/docs/dc/d53/webm_2segmenter_8cc_source.html +++ b/docs/dc/d53/webm_2segmenter_8cc_source.html @@ -549,7 +549,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d54/structshaka_1_1media_1_1H264DecRefPicMarking.html b/docs/dc/d54/structshaka_1_1media_1_1H264DecRefPicMarking.html index 80958077ab..391fcdb4e6 100644 --- a/docs/dc/d54/structshaka_1_1media_1_1H264DecRefPicMarking.html +++ b/docs/dc/d54/structshaka_1_1media_1_1H264DecRefPicMarking.html @@ -121,7 +121,7 @@ int max_long_term_frame_id diff --git a/docs/dc/d56/audio__header_8h_source.html b/docs/dc/d56/audio__header_8h_source.html new file mode 100644 index 0000000000..4c66043603 --- /dev/null +++ b/docs/dc/d56/audio__header_8h_source.html @@ -0,0 +1,162 @@ + + + + + + +Shaka Packager SDK: packager/media/formats/mp2t/audio_header.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
audio_header.h
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #ifndef PACKAGER_MEDIA_FORMATS_MP2T_AUDIO_HEADER_H_
+
8 #define PACKAGER_MEDIA_FORMATS_MP2T_AUDIO_HEADER_H_
+
9 
+
10 #include <stddef.h>
+
11 #include <stdint.h>
+
12 
+
13 #include <vector>
+
14 
+
15 namespace shaka {
+
16 namespace media {
+
17 namespace mp2t {
+
18 
+
19 class AudioHeader {
+
20  public:
+
21  AudioHeader() = default;
+
22  virtual ~AudioHeader() = default;
+
23 
+
27  virtual bool IsSyncWord(const uint8_t* buf) const = 0;
+
28 
+
30  virtual size_t GetMinFrameSize() const = 0;
+
31 
+
33  virtual size_t GetSamplesPerFrame() const = 0;
+
34 
+
43  virtual bool Parse(const uint8_t* audio_frame, size_t audio_frame_size) = 0;
+
44 
+
47  virtual size_t GetHeaderSize() const = 0;
+
48 
+
51  virtual size_t GetFrameSize() const = 0;
+
52 
+
59  virtual void GetAudioSpecificConfig(std::vector<uint8_t>* buffer) const = 0;
+
60 
+
63  virtual uint8_t GetObjectType() const = 0;
+
64 
+
67  virtual uint32_t GetSamplingFrequency() const = 0;
+
68 
+
71  virtual uint8_t GetNumChannels() const = 0;
+
72 
+
73  private:
+
74  AudioHeader(const AudioHeader&) = delete;
+
75  AudioHeader& operator=(const AudioHeader&) = delete;
+
76 };
+
77 
+
78 } // namespace mp2t
+
79 } // namespace media
+
80 } // namespace shaka
+
81 
+
82 #endif // PACKAGER_MEDIA_FORMATS_MP2T_AUDIO_HEADER_H_
+
virtual void GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const =0
+
virtual bool Parse(const uint8_t *audio_frame, size_t audio_frame_size)=0
+
virtual uint32_t GetSamplingFrequency() const =0
+
virtual size_t GetHeaderSize() const =0
+
virtual uint8_t GetObjectType() const =0
+
virtual uint8_t GetNumChannels() const =0
+ +
virtual bool IsSyncWord(const uint8_t *buf) const =0
+
virtual size_t GetSamplesPerFrame() const =0
+
virtual size_t GetFrameSize() const =0
+
virtual size_t GetMinFrameSize() const =0
+
+ + + + diff --git a/docs/dc/d58/webm__media__parser_8h_source.html b/docs/dc/d58/webm__media__parser_8h_source.html index 43dac46b34..e210d3f305 100644 --- a/docs/dc/d58/webm__media__parser_8h_source.html +++ b/docs/dc/d58/webm__media__parser_8h_source.html @@ -178,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d5c/classshaka_1_1MockMpdNotifier.html b/docs/dc/d5c/classshaka_1_1MockMpdNotifier.html index d8861738b4..37c7715a63 100644 --- a/docs/dc/d5c/classshaka_1_1MockMpdNotifier.html +++ b/docs/dc/d5c/classshaka_1_1MockMpdNotifier.html @@ -162,7 +162,7 @@ Public Member Functions diff --git a/docs/dc/d69/structshaka_1_1media_1_1mp4_1_1CueSettingsBox-members.html b/docs/dc/d69/structshaka_1_1media_1_1mp4_1_1CueSettingsBox-members.html index e4fff71e6b..27bacd5d66 100644 --- a/docs/dc/d69/structshaka_1_1media_1_1mp4_1_1CueSettingsBox-members.html +++ b/docs/dc/d69/structshaka_1_1media_1_1mp4_1_1CueSettingsBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d6f/classshaka_1_1media_1_1webm_1_1Segmenter-members.html b/docs/dc/d6f/classshaka_1_1media_1_1webm_1_1Segmenter-members.html index cf68e495a0..7028408048 100644 --- a/docs/dc/d6f/classshaka_1_1media_1_1webm_1_1Segmenter-members.html +++ b/docs/dc/d6f/classshaka_1_1media_1_1webm_1_1Segmenter-members.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d71/classshaka_1_1media_1_1mp2t_1_1TsSection-members.html b/docs/dc/d71/classshaka_1_1media_1_1mp2t_1_1TsSection-members.html index 571f47202c..8a70a04896 100644 --- a/docs/dc/d71/classshaka_1_1media_1_1mp2t_1_1TsSection-members.html +++ b/docs/dc/d71/classshaka_1_1media_1_1mp2t_1_1TsSection-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d73/classshaka_1_1media_1_1MockMuxerListener.html b/docs/dc/d73/classshaka_1_1media_1_1MockMuxerListener.html index 5199663cf1..ffadf23780 100644 --- a/docs/dc/d73/classshaka_1_1media_1_1MockMuxerListener.html +++ b/docs/dc/d73/classshaka_1_1media_1_1MockMuxerListener.html @@ -204,7 +204,7 @@ Additional Inherited Members diff --git a/docs/dc/d76/classshaka_1_1media_1_1BitWriter.html b/docs/dc/d76/classshaka_1_1media_1_1BitWriter.html new file mode 100644 index 0000000000..4b32c027b0 --- /dev/null +++ b/docs/dc/d76/classshaka_1_1media_1_1BitWriter.html @@ -0,0 +1,250 @@ + + + + + + +Shaka Packager SDK: shaka::media::BitWriter Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
shaka::media::BitWriter Class Reference
+
+
+ + + + + + + + + + + + + +

+Public Member Functions

 BitWriter (std::vector< uint8_t > *storage)
 
void WriteBits (uint32_t bits, size_t number_of_bits)
 
+void Flush ()
 Write pending bits, and align bitstream with extra zero bits.
 
size_t BitPos () const
 
size_t BytePos () const
 
+

Detailed Description

+
+

Definition at line 19 of file bit_writer.h.

+

Constructor & Destructor Documentation

+ +
+
+ + + + + +
+ + + + + + + + +
shaka::media::BitWriter::BitWriter (std::vector< uint8_t > * storage)
+
+explicit
+
+

Constructor a BitWriter instance which writes to the provided storage.

+
Parameters
+ + +
storagepoints to vector this BitWriter writes to. Cannot be nullptr.
+
+
+ +

Definition at line 12 of file bit_writer.cc.

+ +
+
+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
size_t shaka::media::BitWriter::BitPos () const
+
+inline
+
+
Returns
last written position, in bits.
+ +

Definition at line 39 of file bit_writer.h.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
size_t shaka::media::BitWriter::BytePos () const
+
+inline
+
+
Returns
last written position, in bytes.
+ +

Definition at line 42 of file bit_writer.h.

+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
void shaka::media::BitWriter::WriteBits (uint32_t bits,
size_t number_of_bits 
)
+
+

Appends the sequence 'bits' of length 'number_of_bits' <= 32. Note that 'bits' should contain at most 'number_of_bits' bits, i.e. bits should be less than 1 << number_of_bits.

+
Parameters
+ + + +
bitsis the data to write.
number_of_bitsis the number of LSB to write, capped at 32. Cannot be zero.
+
+
+ +

Definition at line 15 of file bit_writer.cc.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/dc/d7b/closure__thread_8cc_source.html b/docs/dc/d7b/closure__thread_8cc_source.html index 4def24a012..c0db1bcbab 100644 --- a/docs/dc/d7b/closure__thread_8cc_source.html +++ b/docs/dc/d7b/closure__thread_8cc_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d7b/h264__parser_8cc_source.html b/docs/dc/d7b/h264__parser_8cc_source.html index cd9779ef6e..b666328b7d 100644 --- a/docs/dc/d7b/h264__parser_8cc_source.html +++ b/docs/dc/d7b/h264__parser_8cc_source.html @@ -1256,7 +1256,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d86/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor-members.html b/docs/dc/d86/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor-members.html index 616ea5ea0a..58ca0ef50d 100644 --- a/docs/dc/d86/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor-members.html +++ b/docs/dc/d86/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.html b/docs/dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.html similarity index 83% rename from docs/d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.html rename to docs/dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.html index b36d5673a9..8cf83e4b02 100644 --- a/docs/d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.html +++ b/docs/dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: shaka::media::mp2t::EsParserAdts Class Reference +Shaka Packager SDK: shaka::media::mp2t::EsParserAudio Class Reference @@ -82,41 +82,41 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
shaka::media::mp2t::EsParserAdts Class Reference
+
shaka::media::mp2t::EsParserAudio Class Reference
-Inheritance diagram for shaka::media::mp2t::EsParserAdts:
+Inheritance diagram for shaka::media::mp2t::EsParserAudio:
- - -shaka::media::mp2t::EsParser + + +shaka::media::mp2t::EsParser
- - - + + - - + - - + - + @@ -140,15 +140,15 @@ const std::shared_ptr

Public Member Functions

EsParserAdts (uint32_t pid, const NewStreamInfoCB &new_stream_info_cb, const EmitSampleCB &emit_sample_cb, bool sbr_in_mimetype)
 
+
EsParserAudio (uint32_t pid, TsStreamType stream_type, const NewStreamInfoCB &new_stream_info_cb, const EmitSampleCB &emit_sample_cb, bool sbr_in_mimetype)
 
bool Parse (const uint8_t *buf, int size, int64_t pts, int64_t dts) override
 
+
 
void Flush () override
 
+
 
void Reset () override
 
 
- Public Member Functions inherited from shaka::media::mp2t::EsParser
 EsParser (uint32_t pid)

Detailed Description

-

Definition at line 25 of file es_parser_adts.h.

+

Definition at line 28 of file es_parser_audio.h.


The documentation for this class was generated from the following files: diff --git a/docs/dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.png b/docs/dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f8abac40450c9efbd1799c85ab2c2fd5a08514 GIT binary patch literal 828 zcmeAS@N?(olHy`uVBq!ia0vp^=YcqYgBeJ6=3o2`q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0PJ6mIhEy=Vo%^=$wE~X|zi{UL{}b~k ze@JBZtXln+OL0kGR8w>98HfLya&MbWyrGgQr7Pzt72fSW>DX0f{|O;>bt;~*dk@Je zJKu0Fx{+OBr>X4utG>3=ebPITM6SjqpDf+xGsb>C!Zxq>)LWZ#f6u!ZlOU8x&vcdwlrQx*wJEukQGEWRvmBP8HK# zk2O6n|5|JR%IBWP^u(>pFa7L{Jp0p7HpgvJ$jgiQm5;gmt#_re7dalyzizX1kM{nV zJ||DKeqo-McYXH1D}9A}yY3&;^MAYVmZE?7xywISZoH>)W&Zp$>HNxBm#@sbasN~F z&AB!o4EFwB%h~-sx+s0#dAC)6)86@)@AnLH=l^d%>C5V0AM%4H-MjQ?;*#^G()}v6 z!Qfy3atpscy16ZPwmU=pLivVH6Up=E&&N1S{0|oOx0}_T?0EKZ z+v!PS#%EtHJ7@F!%s-p(N#Q3qKbKl|Q00!iq^*1XR{sncj lC&Ylm=KuXxfkP(0*v%ZY_gc?CRSrz*44$rjF6*2UngD|>mZksz literal 0 HcmV?d00001 diff --git a/docs/dc/d8f/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader.html b/docs/dc/d8f/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader.html index d7cc981ee8..15ce71536f 100644 --- a/docs/dc/d8f/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader.html +++ b/docs/dc/d8f/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/dc/d9a/structshaka_1_1media_1_1Range-members.html b/docs/dc/d9a/structshaka_1_1media_1_1Range-members.html index 458d77d8cf..198d310653 100644 --- a/docs/dc/d9a/structshaka_1_1media_1_1Range-members.html +++ b/docs/dc/d9a/structshaka_1_1media_1_1Range-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/da0/structshaka_1_1EncryptionParams.html b/docs/dc/da0/structshaka_1_1EncryptionParams.html index 0ede2f92b5..1d5e221718 100644 --- a/docs/dc/da0/structshaka_1_1EncryptionParams.html +++ b/docs/dc/da0/structshaka_1_1EncryptionParams.html @@ -221,7 +221,7 @@ static constexpr uint32_t  diff --git a/docs/dc/da0/structshaka_1_1media_1_1mp4_1_1DTSSpecific.html b/docs/dc/da0/structshaka_1_1media_1_1mp4_1_1DTSSpecific.html index 7c9a203306..fc236fd338 100644 --- a/docs/dc/da0/structshaka_1_1media_1_1mp4_1_1DTSSpecific.html +++ b/docs/dc/da0/structshaka_1_1media_1_1mp4_1_1DTSSpecific.html @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/dc/da1/classshaka_1_1MpdBuilder.html b/docs/dc/da1/classshaka_1_1MpdBuilder.html index 0bfe0acd8c..32f9dd88f6 100644 --- a/docs/dc/da1/classshaka_1_1MpdBuilder.html +++ b/docs/dc/da1/classshaka_1_1MpdBuilder.html @@ -323,7 +323,7 @@ template<DashProfile profile> diff --git a/docs/dc/da3/buffer__callback__params_8h_source.html b/docs/dc/da3/buffer__callback__params_8h_source.html index 91e7d8a381..382360a635 100644 --- a/docs/dc/da3/buffer__callback__params_8h_source.html +++ b/docs/dc/da3/buffer__callback__params_8h_source.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d18/es__parser__adts_8h_source.html b/docs/dc/da3/es__parser__audio_8h_source.html similarity index 66% rename from docs/dd/d18/es__parser__adts_8h_source.html rename to docs/dc/da3/es__parser__audio_8h_source.html index 488bfe6173..ade4636d4f 100644 --- a/docs/dd/d18/es__parser__adts_8h_source.html +++ b/docs/dc/da3/es__parser__audio_8h_source.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: packager/media/formats/mp2t/es_parser_adts.h Source File +Shaka Packager SDK: packager/media/formats/mp2t/es_parser_audio.h Source File @@ -84,15 +84,15 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
es_parser_adts.h
+
es_parser_audio.h
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
-
5 #ifndef MEDIA_FORMATS_MP2T_ES_PARSER_ADTS_H_
-
6 #define MEDIA_FORMATS_MP2T_ES_PARSER_ADTS_H_
+
5 #ifndef PACKAGER_MEDIA_FORMATS_MP2T_ES_PARSER_AUDIO_H_
+
6 #define PACKAGER_MEDIA_FORMATS_MP2T_ES_PARSER_AUDIO_H_
7 
8 #include <list>
9 #include <memory>
@@ -103,76 +103,84 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
14 #include "packager/media/base/audio_stream_info.h"
15 #include "packager/media/base/byte_queue.h"
16 #include "packager/media/formats/mp2t/es_parser.h"
-
17 
-
18 namespace shaka {
-
19 namespace media {
-
20 class AudioTimestampHelper;
-
21 class BitReader;
-
22 
-
23 namespace mp2t {
-
24 
-
25 class EsParserAdts : public EsParser {
-
26  public:
-
27  EsParserAdts(uint32_t pid,
-
28  const NewStreamInfoCB& new_stream_info_cb,
-
29  const EmitSampleCB& emit_sample_cb,
-
30  bool sbr_in_mimetype);
-
31  ~EsParserAdts() override;
-
32 
-
33  // EsParser implementation.
-
34  bool Parse(const uint8_t* buf, int size, int64_t pts, int64_t dts) override;
-
35  void Flush() override;
-
36  void Reset() override;
-
37 
-
38  private:
-
39  // Used to link a PTS with a byte position in the ES stream.
-
40  typedef std::pair<int, int64_t> EsPts;
-
41  typedef std::list<EsPts> EsPtsList;
-
42 
-
43  // Signal any audio configuration change (if any).
-
44  // Return false if the current audio config is not
-
45  // a supported ADTS audio config.
-
46  bool UpdateAudioConfiguration(const uint8_t* adts_frame, size_t frame_size);
-
47 
-
48  // Discard some bytes from the ES stream.
-
49  void DiscardEs(int nbytes);
-
50 
-
51  // Callbacks:
-
52  // - to signal a new audio configuration,
-
53  // - to send ES buffers.
-
54  NewStreamInfoCB new_stream_info_cb_;
-
55  EmitSampleCB emit_sample_cb_;
+
17 #include "packager/media/formats/mp2t/ts_stream_type.h"
+
18 
+
19 namespace shaka {
+
20 namespace media {
+
21 class AudioTimestampHelper;
+
22 class BitReader;
+
23 
+
24 namespace mp2t {
+
25 
+
26 class AudioHeader;
+
27 
+
28 class EsParserAudio : public EsParser {
+
29  public:
+
30  EsParserAudio(uint32_t pid,
+
31  TsStreamType stream_type,
+
32  const NewStreamInfoCB& new_stream_info_cb,
+
33  const EmitSampleCB& emit_sample_cb,
+
34  bool sbr_in_mimetype);
+
35  ~EsParserAudio() override;
+
36 
+
37  // EsParser implementation.
+
38  bool Parse(const uint8_t* buf, int size, int64_t pts, int64_t dts) override;
+
39  void Flush() override;
+
40  void Reset() override;
+
41 
+
42  private:
+
43  EsParserAudio(const EsParserAudio&) = delete;
+
44  EsParserAudio& operator=(const EsParserAudio&) = delete;
+
45 
+
46  // Used to link a PTS with a byte position in the ES stream.
+
47  typedef std::pair<int, int64_t> EsPts;
+
48  typedef std::list<EsPts> EsPtsList;
+
49 
+
50  // Signal any audio configuration change (if any).
+
51  // Return false if the current audio config is not a supported audio config.
+
52  bool UpdateAudioConfiguration(const AudioHeader& audio_header);
+
53 
+
54  // Discard some bytes from the ES stream.
+
55  void DiscardEs(int nbytes);
56 
-
57  // True when AAC SBR extension is signalled in the mimetype
-
58  // (mp4a.40.5 in the codecs parameter).
-
59  bool sbr_in_mimetype_;
-
60 
-
61  // Bytes of the ES stream that have not been emitted yet.
-
62  ByteQueue es_byte_queue_;
-
63 
-
64  // List of PTS associated with a position in the ES stream.
-
65  EsPtsList pts_list_;
-
66 
-
67  // Interpolated PTS for frames that don't have one.
-
68  std::unique_ptr<AudioTimestampHelper> audio_timestamp_helper_;
+
57  const TsStreamType stream_type_;
+
58  std::unique_ptr<AudioHeader> audio_header_;
+
59 
+
60  // Callbacks:
+
61  // - to signal a new audio configuration,
+
62  // - to send ES buffers.
+
63  NewStreamInfoCB new_stream_info_cb_;
+
64  EmitSampleCB emit_sample_cb_;
+
65 
+
66  // True when AAC SBR extension is signalled in the mimetype
+
67  // (mp4a.40.5 in the codecs parameter).
+
68  bool sbr_in_mimetype_;
69 
-
70  std::shared_ptr<StreamInfo> last_audio_decoder_config_;
-
71 
-
72  DISALLOW_COPY_AND_ASSIGN(EsParserAdts);
-
73 };
-
74 
-
75 } // namespace mp2t
-
76 } // namespace media
-
77 } // namespace shaka
+
70  // Bytes of the ES stream that have not been emitted yet.
+
71  ByteQueue es_byte_queue_;
+
72 
+
73  // List of PTS associated with a position in the ES stream.
+
74  EsPtsList pts_list_;
+
75 
+
76  // Interpolated PTS for frames that don't have one.
+
77  std::unique_ptr<AudioTimestampHelper> audio_timestamp_helper_;
78 
-
79 #endif
- +
79  std::shared_ptr<StreamInfo> last_audio_decoder_config_;
+
80 };
+
81 
+
82 } // namespace mp2t
+
83 } // namespace media
+
84 } // namespace shaka
+
85 
+
86 #endif // PACKAGER_MEDIA_FORMATS_MP2T_ES_PARSER_AUDIO_H_
+ +
diff --git a/docs/dc/da6/classshaka_1_1media_1_1ContentEncoding.html b/docs/dc/da6/classshaka_1_1media_1_1ContentEncoding.html index 6453ee8420..57ceaceee0 100644 --- a/docs/dc/da6/classshaka_1_1media_1_1ContentEncoding.html +++ b/docs/dc/da6/classshaka_1_1media_1_1ContentEncoding.html @@ -208,7 +208,7 @@ Static Public Attributes diff --git a/docs/dc/dbf/box__buffer_8h_source.html b/docs/dc/dbf/box__buffer_8h_source.html index 0d90e77d25..2fa33bc591 100644 --- a/docs/dc/dbf/box__buffer_8h_source.html +++ b/docs/dc/dbf/box__buffer_8h_source.html @@ -294,7 +294,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/dc1/classshaka_1_1xml_1_1RepresentationXmlNode-members.html b/docs/dc/dc1/classshaka_1_1xml_1_1RepresentationXmlNode-members.html index 440eb05ff1..0b45377fc1 100644 --- a/docs/dc/dc1/classshaka_1_1xml_1_1RepresentationXmlNode-members.html +++ b/docs/dc/dc1/classshaka_1_1xml_1_1RepresentationXmlNode-members.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d66/classshaka_1_1media_1_1mp2t_1_1EsParserAdts-members.html b/docs/dc/dc2/classshaka_1_1media_1_1mp2t_1_1EsParserAudio-members.html similarity index 77% rename from docs/d9/d66/classshaka_1_1media_1_1mp2t_1_1EsParserAdts-members.html rename to docs/dc/dc2/classshaka_1_1media_1_1mp2t_1_1EsParserAudio-members.html index fd595ebe65..33605f7d4a 100644 --- a/docs/d9/d66/classshaka_1_1media_1_1mp2t_1_1EsParserAdts-members.html +++ b/docs/dc/dc2/classshaka_1_1media_1_1mp2t_1_1EsParserAudio-members.html @@ -82,31 +82,31 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
shaka::media::mp2t::EsParserAdts Member List
+
shaka::media::mp2t::EsParserAudio Member List
-

This is the complete list of members for shaka::media::mp2t::EsParserAdts, including all inherited members.

+

This is the complete list of members for shaka::media::mp2t::EsParserAudio, including all inherited members.

- - + + - + - + - +
EmitSampleCB typedef (defined in shaka::media::mp2t::EsParser)shaka::media::mp2t::EsParser
EsParser(uint32_t pid) (defined in shaka::media::mp2t::EsParser)shaka::media::mp2t::EsParserinline
EsParserAdts(uint32_t pid, const NewStreamInfoCB &new_stream_info_cb, const EmitSampleCB &emit_sample_cb, bool sbr_in_mimetype) (defined in shaka::media::mp2t::EsParserAdts)shaka::media::mp2t::EsParserAdts
Flush() override (defined in shaka::media::mp2t::EsParserAdts)shaka::media::mp2t::EsParserAdtsvirtual
EsParserAudio(uint32_t pid, TsStreamType stream_type, const NewStreamInfoCB &new_stream_info_cb, const EmitSampleCB &emit_sample_cb, bool sbr_in_mimetype) (defined in shaka::media::mp2t::EsParserAudio)shaka::media::mp2t::EsParserAudio
Flush() override (defined in shaka::media::mp2t::EsParserAudio)shaka::media::mp2t::EsParserAudiovirtual
NewStreamInfoCB typedef (defined in shaka::media::mp2t::EsParser)shaka::media::mp2t::EsParser
Parse(const uint8_t *buf, int size, int64_t pts, int64_t dts) override (defined in shaka::media::mp2t::EsParserAdts)shaka::media::mp2t::EsParserAdtsvirtual
Parse(const uint8_t *buf, int size, int64_t pts, int64_t dts) override (defined in shaka::media::mp2t::EsParserAudio)shaka::media::mp2t::EsParserAudiovirtual
pid() (defined in shaka::media::mp2t::EsParser)shaka::media::mp2t::EsParserinline
Reset() override (defined in shaka::media::mp2t::EsParserAdts)shaka::media::mp2t::EsParserAdtsvirtual
Reset() override (defined in shaka::media::mp2t::EsParserAudio)shaka::media::mp2t::EsParserAudiovirtual
~EsParser() (defined in shaka::media::mp2t::EsParser)shaka::media::mp2t::EsParserinlinevirtual
~EsParserAdts() override (defined in shaka::media::mp2t::EsParserAdts)shaka::media::mp2t::EsParserAdts
~EsParserAudio() override (defined in shaka::media::mp2t::EsParserAudio)shaka::media::mp2t::EsParserAudio
diff --git a/docs/dc/dca/classshaka_1_1media_1_1WebMListParser.html b/docs/dc/dca/classshaka_1_1media_1_1WebMListParser.html index 7bafcf649a..68f2d2b405 100644 --- a/docs/dc/dca/classshaka_1_1media_1_1WebMListParser.html +++ b/docs/dc/dca/classshaka_1_1media_1_1WebMListParser.html @@ -210,7 +210,7 @@ void  diff --git a/docs/dc/dd8/structshaka_1_1media_1_1CueEvent-members.html b/docs/dc/dd8/structshaka_1_1media_1_1CueEvent-members.html new file mode 100644 index 0000000000..0bb9e937e2 --- /dev/null +++ b/docs/dc/dd8/structshaka_1_1media_1_1CueEvent-members.html @@ -0,0 +1,107 @@ + + + + + + +Shaka Packager SDK: Member List + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
shaka::media::CueEvent Member List
+
+
+ +

This is the complete list of members for shaka::media::CueEvent, including all inherited members.

+ + + + +
cue_data (defined in shaka::media::CueEvent)shaka::media::CueEvent
timestamp (defined in shaka::media::CueEvent)shaka::media::CueEvent
type (defined in shaka::media::CueEvent)shaka::media::CueEvent
+ + + + diff --git a/docs/dc/dd9/rsa__key_8cc_source.html b/docs/dc/dd9/rsa__key_8cc_source.html index 0db25faf2d..06056894c5 100644 --- a/docs/dc/dd9/rsa__key_8cc_source.html +++ b/docs/dc/dd9/rsa__key_8cc_source.html @@ -340,7 +340,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/ddf/structshaka_1_1media_1_1mp4_1_1Media.html b/docs/dc/ddf/structshaka_1_1media_1_1mp4_1_1Media.html index 6b569fc041..194c1ea7d0 100644 --- a/docs/dc/ddf/structshaka_1_1media_1_1mp4_1_1Media.html +++ b/docs/dc/ddf/structshaka_1_1media_1_1mp4_1_1Media.html @@ -179,7 +179,7 @@ Additional Inherited Members diff --git a/docs/dc/de1/structshaka_1_1SegmentInfo.html b/docs/dc/de1/structshaka_1_1SegmentInfo.html index d6b677a165..ee76124d8d 100644 --- a/docs/dc/de1/structshaka_1_1SegmentInfo.html +++ b/docs/dc/de1/structshaka_1_1SegmentInfo.html @@ -118,7 +118,7 @@ uint64_t repeat diff --git a/docs/dc/deb/classshaka_1_1media_1_1mp4_1_1Fragmenter-members.html b/docs/dc/deb/classshaka_1_1media_1_1mp4_1_1Fragmenter-members.html index b10a17a394..5448e13118 100644 --- a/docs/dc/deb/classshaka_1_1media_1_1mp4_1_1Fragmenter-members.html +++ b/docs/dc/deb/classshaka_1_1media_1_1mp4_1_1Fragmenter-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/deb/h265__byte__to__unit__stream__converter_8h_source.html b/docs/dc/deb/h265__byte__to__unit__stream__converter_8h_source.html index 1eafb6db32..ccdc0f6afb 100644 --- a/docs/dc/deb/h265__byte__to__unit__stream__converter_8h_source.html +++ b/docs/dc/deb/h265__byte__to__unit__stream__converter_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/dec/ts__section__pmt_8cc_source.html b/docs/dc/dec/ts__section__pmt_8cc_source.html index d69153b14c..490b742ea3 100644 --- a/docs/dc/dec/ts__section__pmt_8cc_source.html +++ b/docs/dc/dec/ts__section__pmt_8cc_source.html @@ -208,7 +208,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/df0/classshaka_1_1media_1_1ClosureThread.html b/docs/dc/df0/classshaka_1_1media_1_1ClosureThread.html index 95f9b893fa..66f86939aa 100644 --- a/docs/dc/df0/classshaka_1_1media_1_1ClosureThread.html +++ b/docs/dc/df0/classshaka_1_1media_1_1ClosureThread.html @@ -179,7 +179,7 @@ void  diff --git a/docs/dc/df0/structshaka_1_1TestParams-members.html b/docs/dc/df0/structshaka_1_1TestParams-members.html index e190bd7ca7..30a8eea2de 100644 --- a/docs/dc/df0/structshaka_1_1TestParams-members.html +++ b/docs/dc/df0/structshaka_1_1TestParams-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html b/docs/dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html index 7591a6cbb8..d08af0fb8b 100644 --- a/docs/dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html +++ b/docs/dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html @@ -261,7 +261,7 @@ std::shared_ptr< diff --git a/docs/dc/df4/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter-members.html b/docs/dc/df4/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter-members.html index d18baf1aed..5fc2deccd6 100644 --- a/docs/dc/df4/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter-members.html +++ b/docs/dc/df4/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter-members.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/df7/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun-members.html b/docs/dc/df7/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun-members.html index 7e467c7418..7f6cadf7bb 100644 --- a/docs/dc/df7/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun-members.html +++ b/docs/dc/df7/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun-members.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/df8/closure__thread_8h_source.html b/docs/dc/df8/closure__thread_8h_source.html index 653372574f..d5ce48d291 100644 --- a/docs/dc/df8/closure__thread_8h_source.html +++ b/docs/dc/df8/closure__thread_8h_source.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d05/encryption__config_8h_source.html b/docs/dd/d05/encryption__config_8h_source.html index ec2e4593da..098b9ba7ec 100644 --- a/docs/dd/d05/encryption__config_8h_source.html +++ b/docs/dd/d05/encryption__config_8h_source.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d06/structshaka_1_1media_1_1mp4_1_1ChunkOffset.html b/docs/dd/d06/structshaka_1_1media_1_1mp4_1_1ChunkOffset.html index b5af69623a..b1992e0517 100644 --- a/docs/dd/d06/structshaka_1_1media_1_1mp4_1_1ChunkOffset.html +++ b/docs/dd/d06/structshaka_1_1media_1_1mp4_1_1ChunkOffset.html @@ -180,7 +180,7 @@ uint32_t flags diff --git a/docs/dd/d0c/classshaka_1_1ThreadedIoFile.html b/docs/dd/d0c/classshaka_1_1ThreadedIoFile.html index 57044a29e7..adcc0bf16c 100644 --- a/docs/dd/d0c/classshaka_1_1ThreadedIoFile.html +++ b/docs/dd/d0c/classshaka_1_1ThreadedIoFile.html @@ -446,7 +446,7 @@ Additional Inherited Members diff --git a/docs/dd/d11/mpd__builder_8cc_source.html b/docs/dd/d11/mpd__builder_8cc_source.html index 089484cae2..d9b6419298 100644 --- a/docs/dd/d11/mpd__builder_8cc_source.html +++ b/docs/dd/d11/mpd__builder_8cc_source.html @@ -1522,7 +1522,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d12/mpd__writer_8cc_source.html b/docs/dd/d12/mpd__writer_8cc_source.html index f0fc4e1727..1680809100 100644 --- a/docs/dd/d12/mpd__writer_8cc_source.html +++ b/docs/dd/d12/mpd__writer_8cc_source.html @@ -215,7 +215,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d13/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html b/docs/dd/d13/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html index 5d5fefaf8f..0a120547a0 100644 --- a/docs/dd/d13/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html +++ b/docs/dd/d13/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html @@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/dd/d17/classshaka_1_1media_1_1Demuxer.html b/docs/dd/d17/classshaka_1_1media_1_1Demuxer.html index a434f17238..6040036117 100644 --- a/docs/dd/d17/classshaka_1_1media_1_1Demuxer.html +++ b/docs/dd/d17/classshaka_1_1media_1_1Demuxer.html @@ -160,10 +160,6 @@ virtual Status&#   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -176,14 +172,18 @@ virtual Status&# Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -488,7 +488,7 @@ std::pair< std::shared_ptr
diff --git a/docs/dd/d19/video__stream__info_8cc_source.html b/docs/dd/d19/video__stream__info_8cc_source.html index baf4cb9c1b..a23fd16543 100644 --- a/docs/dd/d19/video__stream__info_8cc_source.html +++ b/docs/dd/d19/video__stream__info_8cc_source.html @@ -192,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html b/docs/dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html index 6f121567ff..492327ce22 100644 --- a/docs/dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html +++ b/docs/dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html @@ -167,6 +167,8 @@ void   virtual std::string GetLanguage () const   +virtual int GetNumChannels () const +  virtual bool GetDisplayResolution (uint32_t *width, uint32_t *height) const   @@ -428,7 +430,7 @@ void 
Returns
true if |width| and |height| have been set with a valid resolution values.
-

Definition at line 437 of file media_playlist.cc.

+

Definition at line 441 of file media_playlist.cc.

@@ -482,6 +484,32 @@ void 407 of file media_playlist.cc.

+ + + +
+
+ + + + + +
+ + + + + + + +
int shaka::hls::MediaPlaylist::GetNumChannels () const
+
+virtual
+
+
Returns
number of channels for audio. 0 is returned for video.
+ +

Definition at line 437 of file media_playlist.cc.

+
@@ -592,7 +620,7 @@ void  diff --git a/docs/dd/d30/wvm__media__parser_8cc_source.html b/docs/dd/d30/wvm__media__parser_8cc_source.html index 3d0fbd4487..e96a03f2e5 100644 --- a/docs/dd/d30/wvm__media__parser_8cc_source.html +++ b/docs/dd/d30/wvm__media__parser_8cc_source.html @@ -137,1141 +137,1134 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
48 const uint32_t kPesStreamIdAudioMask = 0xE0;
49 const uint32_t kPesStreamIdAudio = 0xC0;
50 const uint32_t kVersion4 = 4;
-
51 const size_t kAdtsHeaderMinSize = 7;
-
52 const uint8_t kAacSampleSizeBits = 16;
-
53 // Applies to all video streams.
-
54 const uint8_t kNaluLengthSize = 4; // unit is bytes.
-
55 // Placeholder sampling frequency for all audio streams, which
-
56 // will be overwritten after filter parsing.
-
57 const uint32_t kDefaultSamplingFrequency = 100;
-
58 const uint16_t kEcmSizeBytes = 80;
-
59 const uint32_t kInitializationVectorSizeBytes = 16;
-
60 // ECM fields for processing.
-
61 const uint32_t kEcmContentKeySizeBytes = 16;
-
62 const uint32_t kEcmDCPFlagsSizeBytes = 3;
-
63 const uint32_t kEcmCCIFlagsSizeBytes = 1;
-
64 const uint32_t kEcmFlagsSizeBytes =
-
65  kEcmCCIFlagsSizeBytes + kEcmDCPFlagsSizeBytes;
-
66 const uint32_t kEcmPaddingSizeBytes = 12;
-
67 const uint32_t kAssetKeySizeBytes = 16;
-
68 // Default audio and video PES stream IDs.
-
69 const uint8_t kDefaultAudioStreamId = kPesStreamIdAudio;
-
70 const uint8_t kDefaultVideoStreamId = kPesStreamIdVideo;
-
71 
-
72 enum Type {
-
73  Type_void = 0,
-
74  Type_uint8 = 1,
-
75  Type_int8 = 2,
-
76  Type_uint16 = 3,
-
77  Type_int16 = 4,
-
78  Type_uint32 = 5,
-
79  Type_int32 = 6,
-
80  Type_uint64 = 7,
-
81  Type_int64 = 8,
-
82  Type_string = 9,
-
83  Type_BinaryData = 10
-
84 };
-
85 } // namespace
-
86 
-
87 namespace shaka {
-
88 namespace media {
-
89 namespace wvm {
-
90 
-
91 WvmMediaParser::WvmMediaParser()
-
92  : is_initialized_(false),
-
93  parse_state_(StartCode1),
-
94  skip_bytes_(0),
-
95  metadata_is_complete_(false),
-
96  current_program_id_(0),
-
97  pes_stream_id_(0),
-
98  prev_pes_stream_id_(0),
-
99  pes_packet_bytes_(0),
-
100  pes_flags_1_(0),
-
101  pes_flags_2_(0),
-
102  prev_pes_flags_1_(0),
-
103  pes_header_data_bytes_(0),
-
104  timestamp_(0),
-
105  pts_(0),
-
106  dts_(0),
-
107  index_program_id_(0),
-
108  media_sample_(NULL),
-
109  crypto_unit_start_pos_(0),
-
110  stream_id_count_(0),
-
111  decryption_key_source_(NULL) {}
-
112 
-
113 WvmMediaParser::~WvmMediaParser() {}
-
114 
-
115 void WvmMediaParser::Init(const InitCB& init_cb,
-
116  const NewSampleCB& new_sample_cb,
-
117  KeySource* decryption_key_source) {
-
118  DCHECK(!is_initialized_);
-
119  DCHECK(!init_cb.is_null());
-
120  DCHECK(!new_sample_cb.is_null());
-
121  decryption_key_source_ = decryption_key_source;
-
122  init_cb_ = init_cb;
-
123  new_sample_cb_ = new_sample_cb;
-
124 }
-
125 
-
126 bool WvmMediaParser::Parse(const uint8_t* buf, int size) {
-
127  size_t num_bytes = 0;
-
128  size_t prev_size = 0;
-
129  const uint8_t* read_ptr = buf;
-
130  const uint8_t* end = read_ptr + size;
-
131 
-
132  while (read_ptr < end) {
-
133  switch (parse_state_) {
-
134  case StartCode1:
-
135  if (*read_ptr == kStartCode1) {
-
136  parse_state_ = StartCode2;
-
137  }
-
138  break;
-
139  case StartCode2:
-
140  if (*read_ptr == kStartCode2) {
-
141  parse_state_ = StartCode3;
-
142  } else {
-
143  parse_state_ = StartCode1;
-
144  }
-
145  break;
-
146  case StartCode3:
-
147  if (*read_ptr == kStartCode3) {
-
148  parse_state_ = StartCode4;
-
149  } else {
-
150  parse_state_ = StartCode1;
-
151  }
-
152  break;
-
153  case StartCode4:
-
154  switch (*read_ptr) {
-
155  case kStartCode4Pack:
-
156  parse_state_ = PackHeader1;
-
157  break;
-
158  case kStartCode4System:
-
159  parse_state_ = SystemHeader1;
-
160  break;
-
161  case kStartCode4ProgramEnd:
-
162  parse_state_ = ProgramEnd;
-
163  continue;
-
164  default:
-
165  parse_state_ = PesStreamId;
-
166  continue;
-
167  }
-
168  break;
-
169  case PackHeader1:
-
170  parse_state_ = PackHeader2;
-
171  break;
-
172  case PackHeader2:
-
173  parse_state_ = PackHeader3;
-
174  break;
-
175  case PackHeader3:
-
176  parse_state_ = PackHeader4;
-
177  break;
-
178  case PackHeader4:
-
179  parse_state_ = PackHeader5;
-
180  break;
-
181  case PackHeader5:
-
182  parse_state_ = PackHeader6;
-
183  break;
-
184  case PackHeader6:
-
185  parse_state_ = PackHeader7;
-
186  break;
-
187  case PackHeader7:
-
188  parse_state_ = PackHeader8;
-
189  break;
-
190  case PackHeader8:
-
191  parse_state_ = PackHeader9;
-
192  break;
-
193  case PackHeader9:
-
194  parse_state_ = PackHeader10;
-
195  break;
-
196  case PackHeader10:
-
197  skip_bytes_ = *read_ptr & 0x07;
-
198  parse_state_ = PackHeaderStuffingSkip;
-
199  break;
-
200  case SystemHeader1:
-
201  skip_bytes_ = *read_ptr;
-
202  skip_bytes_ <<= 8;
-
203  parse_state_ = SystemHeader2;
-
204  break;
-
205  case SystemHeader2:
-
206  skip_bytes_ |= *read_ptr;
-
207  parse_state_ = SystemHeaderSkip;
-
208  break;
-
209  case PackHeaderStuffingSkip:
-
210  if (end >= skip_bytes_ + read_ptr) {
-
211  read_ptr += skip_bytes_;
-
212  skip_bytes_ = 0;
-
213  parse_state_ = StartCode1;
-
214  } else {
-
215  skip_bytes_ -= (end - read_ptr);
-
216  read_ptr = end;
-
217  }
-
218  continue;
-
219  case SystemHeaderSkip:
-
220  if (end >= skip_bytes_ + read_ptr) {
-
221  read_ptr += skip_bytes_;
-
222  skip_bytes_ = 0;
-
223  parse_state_ = StartCode1;
-
224  } else {
-
225  uint32_t remaining_size = end - read_ptr;
-
226  skip_bytes_ -= remaining_size;
-
227  read_ptr = end;
-
228  }
-
229  continue;
-
230  case PesStreamId:
-
231  pes_stream_id_ = *read_ptr;
-
232  if (!metadata_is_complete_ &&
-
233  (pes_stream_id_ != kPsmStreamId) &&
-
234  (pes_stream_id_ != kIndexStreamId) &&
-
235  (pes_stream_id_ != kEcmStreamId) &&
-
236  (pes_stream_id_ != kV2MetadataStreamId) &&
-
237  (pes_stream_id_ != kPaddingStreamId)) {
-
238  metadata_is_complete_ = true;
-
239  }
-
240  parse_state_ = PesPacketLength1;
-
241  break;
-
242  case PesPacketLength1:
-
243  pes_packet_bytes_ = *read_ptr;
-
244  pes_packet_bytes_ <<= 8;
-
245  parse_state_ = PesPacketLength2;
-
246  break;
-
247  case PesPacketLength2:
-
248  pes_packet_bytes_ |= *read_ptr;
-
249  if (HAS_HEADER_EXTENSION(pes_stream_id_)) {
-
250  parse_state_ = PesExtension1;
-
251  } else {
-
252  prev_pes_flags_1_ = pes_flags_1_;
-
253  pes_flags_1_ = pes_flags_2_ = 0;
-
254  pes_header_data_bytes_ = 0;
-
255  parse_state_ = PesPayload;
-
256  }
-
257  break;
-
258  case PesExtension1:
-
259  prev_pes_flags_1_ = pes_flags_1_;
-
260  pes_flags_1_ = *read_ptr;
-
261  --pes_packet_bytes_;
-
262  parse_state_ = PesExtension2;
-
263  break;
-
264  case PesExtension2:
-
265  pes_flags_2_ = *read_ptr;
-
266  --pes_packet_bytes_;
-
267  parse_state_ = PesExtension3;
-
268  break;
-
269  case PesExtension3:
-
270  pes_header_data_bytes_ = *read_ptr;
-
271  --pes_packet_bytes_;
-
272  if (pes_flags_2_ & kPesOptPts) {
-
273  parse_state_ = Pts1;
-
274  } else {
-
275  parse_state_ = PesHeaderData;
-
276  }
-
277  break;
-
278  case Pts1:
-
279  timestamp_ = (*read_ptr & 0x0E);
-
280  --pes_header_data_bytes_;
-
281  --pes_packet_bytes_;
-
282  parse_state_ = Pts2;
-
283  break;
-
284  case Pts2:
-
285  timestamp_ <<= 7;
-
286  timestamp_ |= *read_ptr;
-
287  --pes_header_data_bytes_;
-
288  --pes_packet_bytes_;
-
289  parse_state_ = Pts3;
-
290  break;
-
291  case Pts3:
-
292  timestamp_ <<= 7;
-
293  timestamp_ |= *read_ptr >> 1;
-
294  --pes_header_data_bytes_;
-
295  --pes_packet_bytes_;
-
296  parse_state_ = Pts4;
-
297  break;
-
298  case Pts4:
-
299  timestamp_ <<= 8;
-
300  timestamp_ |= *read_ptr;
-
301  --pes_header_data_bytes_;
-
302  --pes_packet_bytes_;
-
303  parse_state_ = Pts5;
-
304  break;
-
305  case Pts5:
-
306  timestamp_ <<= 7;
-
307  timestamp_ |= *read_ptr >> 1;
-
308  pts_ = timestamp_;
-
309  --pes_header_data_bytes_;
-
310  --pes_packet_bytes_;
-
311  if (pes_flags_2_ & kPesOptDts) {
-
312  parse_state_ = Dts1;
-
313  } else {
-
314  dts_ = pts_;
-
315  parse_state_ = PesHeaderData;
-
316  }
-
317  break;
-
318  case Dts1:
-
319  timestamp_ = (*read_ptr & 0x0E);
-
320  --pes_header_data_bytes_;
-
321  --pes_packet_bytes_;
-
322  parse_state_ = Dts2;
-
323  break;
-
324  case Dts2:
-
325  timestamp_ <<= 7;
-
326  timestamp_ |= *read_ptr;
-
327  --pes_header_data_bytes_;
-
328  --pes_packet_bytes_;
-
329  parse_state_ = Dts3;
-
330  break;
-
331  case Dts3:
-
332  timestamp_ <<= 7;
-
333  timestamp_ |= *read_ptr >> 1;
-
334  --pes_header_data_bytes_;
-
335  --pes_packet_bytes_;
-
336  parse_state_ = Dts4;
-
337  break;
-
338  case Dts4:
-
339  timestamp_ <<= 8;
-
340  timestamp_ |= *read_ptr;
-
341  --pes_header_data_bytes_;
-
342  --pes_packet_bytes_;
-
343  parse_state_ = Dts5;
-
344  break;
-
345  case Dts5:
-
346  timestamp_ <<= 7;
-
347  timestamp_ |= *read_ptr >> 1;
-
348  dts_ = timestamp_;
-
349  --pes_header_data_bytes_;
-
350  --pes_packet_bytes_;
-
351  parse_state_ = PesHeaderData;
-
352  break;
-
353  case PesHeaderData:
-
354  num_bytes = end - read_ptr;
-
355  if (num_bytes >= pes_header_data_bytes_) {
-
356  num_bytes = pes_header_data_bytes_;
-
357  parse_state_ = PesPayload;
-
358  }
-
359  pes_header_data_bytes_ -= num_bytes;
-
360  pes_packet_bytes_ -= num_bytes;
-
361  read_ptr += num_bytes;
-
362  continue;
-
363  case PesPayload:
-
364  switch (pes_stream_id_) {
-
365  case kPsmStreamId:
-
366  psm_data_.clear();
-
367  parse_state_ = PsmPayload;
-
368  continue;
-
369  case kPaddingStreamId:
-
370  parse_state_ = Padding;
-
371  continue;
-
372  case kEcmStreamId:
-
373  ecm_.clear();
-
374  parse_state_ = EcmPayload;
-
375  continue;
-
376  case kIndexStreamId:
-
377  parse_state_ = IndexPayload;
-
378  continue;
-
379  default:
-
380  if (!DemuxNextPes(false)) {
-
381  return false;
-
382  }
-
383  parse_state_ = EsPayload;
-
384  }
-
385  continue;
-
386  case PsmPayload:
-
387  num_bytes = end - read_ptr;
-
388  if (num_bytes >= pes_packet_bytes_) {
-
389  num_bytes = pes_packet_bytes_;
-
390  parse_state_ = StartCode1;
-
391  }
-
392  if (num_bytes > 0) {
-
393  pes_packet_bytes_ -= num_bytes;
-
394  prev_size = psm_data_.size();
-
395  psm_data_.resize(prev_size + num_bytes);
-
396  memcpy(&psm_data_[prev_size], read_ptr, num_bytes);
-
397  }
-
398  read_ptr += num_bytes;
-
399  continue;
-
400  case EcmPayload:
-
401  num_bytes = end - read_ptr;
-
402  if (num_bytes >= pes_packet_bytes_) {
-
403  num_bytes = pes_packet_bytes_;
-
404  parse_state_ = StartCode1;
-
405  }
-
406  if (num_bytes > 0) {
-
407  pes_packet_bytes_ -= num_bytes;
-
408  prev_size = ecm_.size();
-
409  ecm_.resize(prev_size + num_bytes);
-
410  memcpy(&ecm_[prev_size], read_ptr, num_bytes);
-
411  }
-
412  if ((pes_packet_bytes_ == 0) && !ecm_.empty()) {
-
413  if (!ProcessEcm()) {
-
414  return(false);
-
415  }
-
416  }
-
417  read_ptr += num_bytes;
-
418  continue;
-
419  case IndexPayload:
-
420  num_bytes = end - read_ptr;
-
421  if (num_bytes >= pes_packet_bytes_) {
-
422  num_bytes = pes_packet_bytes_;
-
423  parse_state_ = StartCode1;
-
424  }
-
425  if (num_bytes > 0) {
-
426  pes_packet_bytes_ -= num_bytes;
-
427  prev_size = index_data_.size();
-
428  index_data_.resize(prev_size + num_bytes);
-
429  memcpy(&index_data_[prev_size], read_ptr, num_bytes);
-
430  }
-
431  if (pes_packet_bytes_ == 0 && !index_data_.empty()) {
-
432  if (!metadata_is_complete_) {
-
433  if (!ParseIndexEntry()) {
-
434  return false;
-
435  }
-
436  }
-
437  }
-
438  read_ptr += num_bytes;
-
439  continue;
-
440  case EsPayload:
-
441  num_bytes = end - read_ptr;
-
442  if (num_bytes >= pes_packet_bytes_) {
-
443  num_bytes = pes_packet_bytes_;
-
444  parse_state_ = StartCode1;
-
445  }
-
446  pes_packet_bytes_ -= num_bytes;
-
447  if (pes_stream_id_ != kV2MetadataStreamId) {
-
448  sample_data_.resize(sample_data_.size() + num_bytes);
-
449  memcpy(&sample_data_[sample_data_.size() - num_bytes], read_ptr,
-
450  num_bytes);
-
451  }
-
452  prev_pes_stream_id_ = pes_stream_id_;
-
453  read_ptr += num_bytes;
-
454  continue;
-
455  case Padding:
-
456  num_bytes = end - read_ptr;
-
457  if (num_bytes >= pes_packet_bytes_) {
-
458  num_bytes = pes_packet_bytes_;
-
459  parse_state_ = StartCode1;
-
460  }
-
461  pes_packet_bytes_ -= num_bytes;
-
462  read_ptr += num_bytes;
-
463  continue;
-
464  case ProgramEnd:
-
465  parse_state_ = StartCode1;
-
466  metadata_is_complete_ = true;
-
467  if (!DemuxNextPes(true)) {
-
468  return false;
-
469  }
-
470  if (!Flush()) {
-
471  return false;
-
472  }
-
473  // Reset.
-
474  dts_ = pts_ = 0;
-
475  parse_state_ = StartCode1;
-
476  prev_media_sample_data_.Reset();
-
477  current_program_id_++;
-
478  ecm_.clear();
-
479  index_data_.clear();
-
480  psm_data_.clear();
-
481  break;
-
482  default:
-
483  break;
-
484  }
-
485  ++read_ptr;
-
486  }
-
487  return true;
-
488 }
-
489 
-
490 bool WvmMediaParser::EmitLastSample(
-
491  uint32_t stream_id,
-
492  const std::shared_ptr<MediaSample>& new_sample) {
-
493  std::string key = base::UintToString(current_program_id_)
-
494  .append(":")
-
495  .append(base::UintToString(stream_id));
-
496  std::map<std::string, uint32_t>::iterator it =
-
497  program_demux_stream_map_.find(key);
-
498  if (it == program_demux_stream_map_.end())
-
499  return false;
-
500  return EmitSample(stream_id, (*it).second, new_sample, true);
-
501 }
-
502 
-
503 bool WvmMediaParser::EmitPendingSamples() {
-
504  // Emit queued samples which were built when not initialized.
-
505  while (!media_sample_queue_.empty()) {
-
506  DemuxStreamIdMediaSample& demux_stream_media_sample =
-
507  media_sample_queue_.front();
-
508  if (!EmitSample(demux_stream_media_sample.parsed_audio_or_video_stream_id,
-
509  demux_stream_media_sample.demux_stream_id,
-
510  demux_stream_media_sample.media_sample,
-
511  false)) {
-
512  return false;
-
513  }
-
514  media_sample_queue_.pop_front();
-
515  }
-
516  return true;
-
517 }
-
518 
-
519 bool WvmMediaParser::Flush() {
-
520  // Flush the last audio and video sample for current program.
-
521  // Reset the streamID when successfully emitted.
-
522  if (prev_media_sample_data_.audio_sample != NULL) {
-
523  if (!EmitLastSample(prev_pes_stream_id_,
-
524  prev_media_sample_data_.audio_sample)) {
-
525  LOG(ERROR) << "Did not emit last sample for audio stream with ID = "
-
526  << prev_pes_stream_id_;
-
527  return false;
-
528  }
-
529  }
-
530  if (prev_media_sample_data_.video_sample != NULL) {
-
531  if (!EmitLastSample(prev_pes_stream_id_,
-
532  prev_media_sample_data_.video_sample)) {
-
533  LOG(ERROR) << "Did not emit last sample for video stream with ID = "
-
534  << prev_pes_stream_id_;
-
535  return false;
-
536  }
-
537  }
-
538  return true;
-
539 }
-
540 
-
541 bool WvmMediaParser::ParseIndexEntry() {
-
542  // Do not parse index entry at the beginning of any track *after* the first
-
543  // track.
-
544  if (current_program_id_ > 0) {
-
545  return true;
-
546  }
-
547  uint32_t index_size = 0;
-
548  if (index_data_.size() < kIndexVersion4HeaderSize) {
-
549  return false;
-
550  }
-
551 
-
552  const uint8_t* read_ptr = index_data_.data();
-
553  if (ntohlFromBuffer(read_ptr) != kIndexMagic) {
-
554  index_data_.clear();
-
555  return false;
-
556  }
-
557  read_ptr += 4;
-
558 
-
559  uint32_t version = ntohlFromBuffer(read_ptr);
-
560  read_ptr += 4;
-
561  if (version == kVersion4) {
-
562  index_size = kIndexVersion4HeaderSize + ntohlFromBuffer(read_ptr);
-
563  if (index_data_.size() < index_size) {
-
564  // We do not yet have the full index. Keep accumulating index data.
-
565  return true;
-
566  }
-
567  read_ptr += sizeof(uint32_t);
-
568 
-
569  // Index metadata
-
570  uint32_t index_metadata_max_size = index_size - kIndexVersion4HeaderSize;
-
571  if (index_metadata_max_size < sizeof(uint8_t)) {
-
572  index_data_.clear();
-
573  return false;
-
574  }
-
575 
-
576  uint64_t track_duration = 0;
-
577  uint32_t trick_play_factor = 0;
-
578  uint32_t sampling_frequency = kDefaultSamplingFrequency;
-
579  uint32_t time_scale = kMpeg2ClockRate;
-
580  uint16_t video_width = 0;
-
581  uint16_t video_height = 0;
-
582  uint32_t pixel_width = 0;
-
583  uint32_t pixel_height = 0;
-
584  uint8_t nalu_length_size = kNaluLengthSize;
-
585  uint8_t num_channels = 0;
-
586  int audio_pes_stream_id = 0;
-
587  int video_pes_stream_id = 0;
-
588  bool has_video = false;
-
589  bool has_audio = false;
-
590  std::vector<uint8_t> audio_codec_config;
-
591  std::vector<uint8_t> video_codec_config;
-
592  uint8_t num_index_entries = *read_ptr;
-
593  ++read_ptr;
-
594  --index_metadata_max_size;
-
595 
-
596  for (uint8_t idx = 0; idx < num_index_entries; ++idx) {
-
597  if (index_metadata_max_size < (2 * sizeof(uint8_t)) + sizeof(uint32_t)) {
-
598  return false;
-
599  }
-
600  uint8_t tag = *read_ptr;
-
601  ++read_ptr;
-
602  uint8_t type = *read_ptr;
-
603  ++read_ptr;
-
604  uint32_t length = ntohlFromBuffer(read_ptr);
-
605  read_ptr += sizeof(uint32_t);
-
606  index_metadata_max_size -= (2 * sizeof(uint8_t)) + sizeof(uint32_t);
-
607  if (index_metadata_max_size < length) {
-
608  return false;
-
609  }
-
610  int64_t value = 0;
-
611  Tag tagtype = Unset;
-
612  std::vector<uint8_t> binary_data;
-
613  switch (Type(type)) {
-
614  case Type_uint8:
-
615  if (length == sizeof(uint8_t)) {
-
616  tagtype = GetTag(tag, length, read_ptr, &value);
-
617  } else {
-
618  return false;
-
619  }
-
620  break;
-
621  case Type_int8:
-
622  if (length == sizeof(int8_t)) {
-
623  tagtype = GetTag(tag, length, read_ptr, &value);
-
624  } else {
-
625  return false;
-
626  }
-
627  break;
-
628  case Type_uint16:
-
629  if (length == sizeof(uint16_t)) {
-
630  tagtype = GetTag(tag, length, read_ptr, &value);
-
631  } else {
-
632  return false;
-
633  }
-
634  break;
-
635  case Type_int16:
-
636  if (length == sizeof(int16_t)) {
-
637  tagtype = GetTag(tag, length, read_ptr, &value);
-
638  } else {
-
639  return false;
-
640  }
-
641  break;
-
642  case Type_uint32:
-
643  if (length == sizeof(uint32_t)) {
-
644  tagtype = GetTag(tag, length, read_ptr, &value);
-
645  } else {
-
646  return false;
-
647  }
-
648  break;
-
649  case Type_int32:
-
650  if (length == sizeof(int32_t)) {
-
651  tagtype = GetTag(tag, length, read_ptr, &value);
-
652  } else {
-
653  return false;
-
654  }
-
655  break;
-
656  case Type_uint64:
-
657  if (length == sizeof(uint64_t)) {
-
658  tagtype = GetTag(tag, length, read_ptr, &value);
-
659  } else {
-
660  return false;
-
661  }
-
662  break;
-
663  case Type_int64:
-
664  if (length == sizeof(int64_t)) {
-
665  tagtype = GetTag(tag, length, read_ptr, &value);
-
666  } else {
-
667  return false;
-
668  }
-
669  break;
-
670  case Type_string:
-
671  case Type_BinaryData:
-
672  binary_data.assign(read_ptr, read_ptr + length);
-
673  tagtype = Tag(tag);
-
674  break;
-
675  default:
-
676  break;
-
677  }
-
678 
-
679  switch (tagtype) {
-
680  case TrackDuration:
-
681  track_duration = value;
-
682  break;
-
683  case TrackTrickPlayFactor:
-
684  trick_play_factor = value;
-
685  break;
-
686  case VideoStreamId:
-
687  video_pes_stream_id = value;
-
688  break;
-
689  case AudioStreamId:
-
690  audio_pes_stream_id = value;
-
691  break;
-
692  case VideoWidth:
-
693  video_width = (uint16_t)value;
-
694  break;
-
695  case VideoHeight:
-
696  video_height = (uint16_t)value;
-
697  break;
-
698  case AudioNumChannels:
-
699  num_channels = (uint8_t)value;
-
700  break;
-
701  case VideoType:
-
702  has_video = true;
-
703  break;
-
704  case AudioType:
-
705  has_audio = true;
-
706  break;
-
707  case VideoPixelWidth:
-
708  pixel_width = static_cast<uint32_t>(value);
-
709  break;
-
710  case VideoPixelHeight:
-
711  pixel_height = static_cast<uint32_t>(value);
-
712  break;
-
713  case Audio_EsDescriptor: {
-
714  ESDescriptor descriptor;
-
715  if (!descriptor.Parse(binary_data)) {
-
716  LOG(ERROR) <<
-
717  "Could not extract AudioSpecificConfig from ES_Descriptor";
-
718  return false;
-
719  }
-
720  audio_codec_config = descriptor.decoder_specific_info();
-
721  break;
-
722  }
-
723  case Audio_EC3SpecificData:
-
724  case Audio_DtsSpecificData:
-
725  case Audio_AC3SpecificData:
-
726  LOG(ERROR) << "Audio type not supported.";
-
727  return false;
-
728  case Video_AVCDecoderConfigurationRecord:
-
729  video_codec_config = binary_data;
-
730  break;
-
731  default:
-
732  break;
-
733  }
-
734 
-
735  read_ptr += length;
-
736  index_metadata_max_size -= length;
-
737  }
-
738  // End Index metadata
-
739  index_size = read_ptr - index_data_.data();
-
740 
-
741  if (has_video) {
-
742  stream_infos_.emplace_back(new VideoStreamInfo(
-
743  stream_id_count_, time_scale, track_duration, kCodecH264,
-
744  byte_to_unit_stream_converter_.stream_format(), std::string(),
-
745  video_codec_config.data(), video_codec_config.size(), video_width,
-
746  video_height, pixel_width, pixel_height, trick_play_factor,
-
747  nalu_length_size, std::string(),
-
748  decryption_key_source_ ? false : true));
-
749  program_demux_stream_map_[base::UintToString(index_program_id_) + ":" +
-
750  base::UintToString(
-
751  video_pes_stream_id
-
752  ? video_pes_stream_id
-
753  : kDefaultVideoStreamId)] =
-
754  stream_id_count_++;
-
755  }
-
756  if (has_audio) {
-
757  const Codec audio_codec = kCodecAAC;
-
758  // TODO(beil): Pass in max and average bitrate in wvm container.
-
759  stream_infos_.emplace_back(new AudioStreamInfo(
-
760  stream_id_count_, time_scale, track_duration, audio_codec,
-
761  std::string(), audio_codec_config.data(), audio_codec_config.size(),
-
762  kAacSampleSizeBits, num_channels, sampling_frequency,
-
763  0 /* seek preroll */, 0 /* codec delay */, 0 /* max bitrate */,
-
764  0 /* avg bitrate */, std::string(),
-
765  decryption_key_source_ ? false : true));
-
766  program_demux_stream_map_[base::UintToString(index_program_id_) + ":" +
-
767  base::UintToString(
-
768  audio_pes_stream_id
-
769  ? audio_pes_stream_id
-
770  : kDefaultAudioStreamId)] =
-
771  stream_id_count_++;
-
772  }
-
773  }
-
774 
-
775  index_program_id_++;
-
776  index_data_.clear();
-
777  return true;
-
778 }
-
779 
-
780 bool WvmMediaParser::DemuxNextPes(bool is_program_end) {
-
781  bool output_encrypted_sample = false;
-
782  if (!sample_data_.empty() && (prev_pes_flags_1_ & kScramblingBitsMask)) {
-
783  // Decrypt crypto unit.
-
784  if (!content_decryptor_) {
-
785  output_encrypted_sample = true;
-
786  } else {
-
787  content_decryptor_->Crypt(&sample_data_[crypto_unit_start_pos_],
-
788  sample_data_.size() - crypto_unit_start_pos_,
-
789  &sample_data_[crypto_unit_start_pos_]);
-
790  }
-
791  }
-
792  // Demux media sample if we are at program end or if we are not at a
-
793  // continuation PES.
-
794  if ((pes_flags_2_ & kPesOptPts) || is_program_end) {
-
795  if (!sample_data_.empty()) {
-
796  if (!Output(output_encrypted_sample)) {
-
797  return false;
-
798  }
-
799  }
-
800  StartMediaSampleDemux();
-
801  }
-
802 
-
803  crypto_unit_start_pos_ = sample_data_.size();
-
804  return true;
-
805 }
-
806 
-
807 void WvmMediaParser::StartMediaSampleDemux() {
-
808  bool is_key_frame = ((pes_flags_1_ & kPesOptAlign) != 0);
-
809  media_sample_ = MediaSample::CreateEmptyMediaSample();
-
810  media_sample_->set_dts(dts_);
-
811  media_sample_->set_pts(pts_);
-
812  media_sample_->set_is_key_frame(is_key_frame);
-
813 
-
814  sample_data_.clear();
-
815 }
-
816 
-
817 bool WvmMediaParser::Output(bool output_encrypted_sample) {
-
818  if (output_encrypted_sample) {
-
819  media_sample_->SetData(sample_data_.data(), sample_data_.size());
-
820  media_sample_->set_is_encrypted(true);
-
821  } else {
-
822  if ((prev_pes_stream_id_ & kPesStreamIdVideoMask) == kPesStreamIdVideo) {
-
823  // Convert video stream to unit stream and get config.
-
824  std::vector<uint8_t> nal_unit_stream;
-
825  if (!byte_to_unit_stream_converter_.ConvertByteStreamToNalUnitStream(
-
826  sample_data_.data(), sample_data_.size(), &nal_unit_stream)) {
-
827  LOG(ERROR) << "Could not convert h.264 byte stream sample";
-
828  return false;
-
829  }
-
830  media_sample_->SetData(nal_unit_stream.data(), nal_unit_stream.size());
-
831  if (!is_initialized_) {
-
832  // Set extra data for video stream from AVC Decoder Config Record.
-
833  // Also, set codec string from the AVC Decoder Config Record.
-
834  std::vector<uint8_t> decoder_config_record;
-
835  byte_to_unit_stream_converter_.GetDecoderConfigurationRecord(
-
836  &decoder_config_record);
-
837  for (uint32_t i = 0; i < stream_infos_.size(); i++) {
-
838  if (stream_infos_[i]->stream_type() == kStreamVideo &&
-
839  stream_infos_[i]->codec_string().empty()) {
-
840  const std::vector<uint8_t>* stream_config;
-
841  if (stream_infos_[i]->codec_config().empty()) {
-
842  // Decoder config record not available for stream. Use the one
-
843  // computed from the first video stream.
-
844  stream_infos_[i]->set_codec_config(decoder_config_record);
-
845  stream_config = &decoder_config_record;
-
846  } else {
-
847  // Use stream-specific config record.
-
848  stream_config = &stream_infos_[i]->codec_config();
-
849  }
-
850  DCHECK(stream_config);
-
851 
-
852  VideoStreamInfo* video_stream_info =
-
853  reinterpret_cast<VideoStreamInfo*>(stream_infos_[i].get());
-
854  AVCDecoderConfigurationRecord avc_config;
-
855  if (!avc_config.Parse(*stream_config)) {
-
856  LOG(WARNING) << "Failed to parse AVCDecoderConfigurationRecord. "
-
857  "Using computed configuration record instead.";
-
858  video_stream_info->set_codec_config(decoder_config_record);
-
859  if (!avc_config.Parse(decoder_config_record)) {
-
860  LOG(ERROR) << "Failed to parse AVCDecoderConfigurationRecord.";
-
861  return false;
-
862  }
-
863  }
-
864  const FourCC codec_fourcc =
-
865  byte_to_unit_stream_converter_.stream_format() ==
-
866  H26xStreamFormat::kNalUnitStreamWithParameterSetNalus
-
867  ? FOURCC_avc3
-
868  : FOURCC_avc1;
-
869  video_stream_info->set_codec_string(
-
870  avc_config.GetCodecString(codec_fourcc));
-
871 
-
872  if (avc_config.pixel_width() != video_stream_info->pixel_width() ||
-
873  avc_config.pixel_height() !=
-
874  video_stream_info->pixel_height()) {
-
875  LOG_IF(WARNING, video_stream_info->pixel_width() != 0 ||
-
876  video_stream_info->pixel_height() != 0)
-
877  << "Pixel aspect ratio in WVM metadata ("
-
878  << video_stream_info->pixel_width() << ","
-
879  << video_stream_info->pixel_height()
-
880  << ") does not match with SAR in "
-
881  "AVCDecoderConfigurationRecord ("
-
882  << avc_config.pixel_width() << ","
-
883  << avc_config.pixel_height()
-
884  << "). Use AVCDecoderConfigurationRecord.";
-
885  video_stream_info->set_pixel_width(avc_config.pixel_width());
-
886  video_stream_info->set_pixel_height(avc_config.pixel_height());
-
887  }
-
888  if (avc_config.coded_width() != video_stream_info->width() ||
-
889  avc_config.coded_height() != video_stream_info->height()) {
-
890  LOG(WARNING) << "Resolution in WVM metadata ("
-
891  << video_stream_info->width() << ","
-
892  << video_stream_info->height()
-
893  << ") does not match with resolution in "
-
894  "AVCDecoderConfigurationRecord ("
-
895  << avc_config.coded_width() << ","
-
896  << avc_config.coded_height()
-
897  << "). Use AVCDecoderConfigurationRecord.";
-
898  video_stream_info->set_width(avc_config.coded_width());
-
899  video_stream_info->set_height(avc_config.coded_height());
-
900  }
-
901  }
-
902  }
-
903  }
-
904  } else if ((prev_pes_stream_id_ & kPesStreamIdAudioMask) ==
-
905  kPesStreamIdAudio) {
-
906  // Set data on the audio stream.
-
907  int frame_size = static_cast<int>(mp2t::AdtsHeader::GetAdtsFrameSize(
-
908  sample_data_.data(), kAdtsHeaderMinSize));
-
909  mp2t::AdtsHeader adts_header;
-
910  const uint8_t* frame_ptr = sample_data_.data();
-
911  if (!adts_header.Parse(frame_ptr, frame_size)) {
-
912  LOG(ERROR) << "Could not parse ADTS header";
-
913  return false;
-
914  }
-
915  size_t header_size = adts_header.GetAdtsHeaderSize(frame_ptr,
-
916  frame_size);
-
917  media_sample_->SetData(frame_ptr + header_size, frame_size - header_size);
-
918  if (!is_initialized_) {
-
919  for (uint32_t i = 0; i < stream_infos_.size(); i++) {
-
920  if (stream_infos_[i]->stream_type() == kStreamAudio &&
-
921  stream_infos_[i]->codec_string().empty()) {
-
922  AudioStreamInfo* audio_stream_info =
-
923  reinterpret_cast<AudioStreamInfo*>(stream_infos_[i].get());
-
924  if (audio_stream_info->codec_config().empty()) {
-
925  // Set AudioStreamInfo fields using information from the ADTS
-
926  // header.
-
927  audio_stream_info->set_sampling_frequency(
-
928  adts_header.GetSamplingFrequency());
-
929  std::vector<uint8_t> audio_specific_config;
-
930  if (!adts_header.GetAudioSpecificConfig(&audio_specific_config)) {
-
931  LOG(ERROR) << "Could not compute AACAudiospecificconfig";
-
932  return false;
-
933  }
-
934  audio_stream_info->set_codec_config(audio_specific_config);
-
935  audio_stream_info->set_codec_string(
- -
937  kCodecAAC, adts_header.GetObjectType()));
-
938  } else {
-
939  // Set AudioStreamInfo fields using information from the
-
940  // AACAudioSpecificConfig record.
-
941  AACAudioSpecificConfig aac_config;
-
942  if (!aac_config.Parse(stream_infos_[i]->codec_config())) {
-
943  LOG(ERROR) << "Could not parse AACAudioSpecificconfig";
-
944  return false;
-
945  }
-
946  audio_stream_info->set_sampling_frequency(
-
947  aac_config.GetSamplesPerSecond());
-
948  audio_stream_info->set_codec_string(
- -
950  kCodecAAC, aac_config.GetAudioObjectType()));
-
951  }
-
952  }
-
953  }
-
954  }
-
955  }
-
956  }
-
957 
-
958  if (!is_initialized_) {
-
959  bool all_streams_have_config = true;
-
960  // Check if all collected stream infos have codec_config set.
-
961  for (uint32_t i = 0; i < stream_infos_.size(); i++) {
-
962  if (stream_infos_[i]->codec_string().empty()) {
-
963  all_streams_have_config = false;
-
964  break;
-
965  }
-
966  }
-
967  if (all_streams_have_config) {
-
968  init_cb_.Run(stream_infos_);
-
969  is_initialized_ = true;
-
970  }
-
971  }
-
972 
-
973  DCHECK_GT(media_sample_->data_size(), 0UL);
-
974  std::string key = base::UintToString(current_program_id_).append(":")
-
975  .append(base::UintToString(prev_pes_stream_id_));
-
976  std::map<std::string, uint32_t>::iterator it =
-
977  program_demux_stream_map_.find(key);
-
978  if (it == program_demux_stream_map_.end()) {
-
979  // TODO(ramjic): Log error message here and in other error cases through
-
980  // this method.
-
981  return false;
-
982  }
-
983  DemuxStreamIdMediaSample demux_stream_media_sample;
-
984  demux_stream_media_sample.parsed_audio_or_video_stream_id =
-
985  prev_pes_stream_id_;
-
986  demux_stream_media_sample.demux_stream_id = (*it).second;
-
987  demux_stream_media_sample.media_sample = media_sample_;
-
988  // Check if sample can be emitted.
-
989  if (!is_initialized_) {
-
990  media_sample_queue_.push_back(demux_stream_media_sample);
-
991  } else {
-
992  // flush the sample queue and emit all queued samples.
-
993  while (!media_sample_queue_.empty()) {
-
994  if (!EmitPendingSamples())
-
995  return false;
-
996  }
-
997  // Emit current sample.
-
998  if (!EmitSample(prev_pes_stream_id_, (*it).second, media_sample_, false))
-
999  return false;
-
1000  }
-
1001  return true;
-
1002 }
-
1003 
-
1004 bool WvmMediaParser::EmitSample(uint32_t parsed_audio_or_video_stream_id,
-
1005  uint32_t stream_id,
-
1006  const std::shared_ptr<MediaSample>& new_sample,
-
1007  bool isLastSample) {
-
1008  DCHECK(new_sample);
-
1009  if (isLastSample) {
-
1010  if ((parsed_audio_or_video_stream_id & kPesStreamIdVideoMask) ==
-
1011  kPesStreamIdVideo) {
-
1012  new_sample->set_duration(prev_media_sample_data_.video_sample_duration);
-
1013  } else if ((parsed_audio_or_video_stream_id & kPesStreamIdAudioMask) ==
-
1014  kPesStreamIdAudio) {
-
1015  new_sample->set_duration(prev_media_sample_data_.audio_sample_duration);
-
1016  }
-
1017  if (!new_sample_cb_.Run(stream_id, new_sample)) {
-
1018  LOG(ERROR) << "Failed to process the last sample.";
-
1019  return false;
-
1020  }
-
1021  return true;
-
1022  }
-
1023 
-
1024  // Cannot emit current sample. Compute duration first and then,
-
1025  // emit previous sample.
-
1026  if ((parsed_audio_or_video_stream_id & kPesStreamIdVideoMask) ==
-
1027  kPesStreamIdVideo) {
-
1028  if (prev_media_sample_data_.video_sample == NULL) {
-
1029  prev_media_sample_data_.video_sample = new_sample;
-
1030  prev_media_sample_data_.video_stream_id = stream_id;
-
1031  return true;
-
1032  }
-
1033  prev_media_sample_data_.video_sample->set_duration(
-
1034  new_sample->dts() - prev_media_sample_data_.video_sample->dts());
-
1035  prev_media_sample_data_.video_sample_duration =
-
1036  prev_media_sample_data_.video_sample->duration();
-
1037  if (!new_sample_cb_.Run(prev_media_sample_data_.video_stream_id,
-
1038  prev_media_sample_data_.video_sample)) {
-
1039  LOG(ERROR) << "Failed to process the video sample.";
-
1040  return false;
-
1041  }
-
1042  prev_media_sample_data_.video_sample = new_sample;
-
1043  prev_media_sample_data_.video_stream_id = stream_id;
-
1044  } else if ((parsed_audio_or_video_stream_id & kPesStreamIdAudioMask) ==
-
1045  kPesStreamIdAudio) {
-
1046  if (prev_media_sample_data_.audio_sample == NULL) {
-
1047  prev_media_sample_data_.audio_sample = new_sample;
-
1048  prev_media_sample_data_.audio_stream_id = stream_id;
-
1049  return true;
-
1050  }
-
1051  prev_media_sample_data_.audio_sample->set_duration(
-
1052  new_sample->dts() - prev_media_sample_data_.audio_sample->dts());
-
1053  prev_media_sample_data_.audio_sample_duration =
-
1054  prev_media_sample_data_.audio_sample->duration();
-
1055  if (!new_sample_cb_.Run(prev_media_sample_data_.audio_stream_id,
-
1056  prev_media_sample_data_.audio_sample)) {
-
1057  LOG(ERROR) << "Failed to process the audio sample.";
-
1058  return false;
-
1059  }
-
1060  prev_media_sample_data_.audio_sample = new_sample;
-
1061  prev_media_sample_data_.audio_stream_id = stream_id;
-
1062  }
-
1063  return true;
-
1064 }
-
1065 
-
1066 bool WvmMediaParser::GetAssetKey(const uint8_t* asset_id,
-
1067  EncryptionKey* encryption_key) {
-
1068  DCHECK(decryption_key_source_);
-
1069  Status status = decryption_key_source_->FetchKeys(
-
1070  EmeInitDataType::WIDEVINE_CLASSIC,
-
1071  std::vector<uint8_t>(asset_id, asset_id + sizeof(uint32_t)));
-
1072  if (!status.ok()) {
-
1073  LOG(ERROR) << "Fetch Key(s) failed for AssetID = "
-
1074  << ntohlFromBuffer(asset_id) << ", error = " << status;
-
1075  return false;
-
1076  }
-
1077 
-
1078  const char kHdStreamLabel[] = "HD";
-
1079  status = decryption_key_source_->GetKey(kHdStreamLabel, encryption_key);
-
1080  if (!status.ok()) {
-
1081  LOG(ERROR) << "Fetch Key(s) failed for AssetID = "
-
1082  << ntohlFromBuffer(asset_id) << ", error = " << status;
-
1083  return false;
-
1084  }
-
1085 
-
1086  return true;
-
1087 }
-
1088 
-
1089 bool WvmMediaParser::ProcessEcm() {
-
1090  // An error will be returned later if the samples need to be decrypted.
-
1091  if (!decryption_key_source_)
-
1092  return true;
-
1093 
-
1094  if (current_program_id_ > 0) {
-
1095  return true;
-
1096  }
-
1097  if (ecm_.size() != kEcmSizeBytes) {
-
1098  LOG(ERROR) << "Unexpected ECM size = " << ecm_.size()
-
1099  << ", expected size = " << kEcmSizeBytes;
-
1100  return false;
-
1101  }
-
1102  const uint8_t* ecm_data = ecm_.data();
-
1103  DCHECK(ecm_data);
-
1104  ecm_data += sizeof(uint32_t); // old version field - skip.
-
1105  ecm_data += sizeof(uint32_t); // clear lead - skip.
-
1106  ecm_data += sizeof(uint32_t); // system id(includes ECM version) - skip.
-
1107  EncryptionKey encryption_key;
-
1108  if (!GetAssetKey(ecm_data, &encryption_key)) {
+
51 const uint8_t kAacSampleSizeBits = 16;
+
52 // Applies to all video streams.
+
53 const uint8_t kNaluLengthSize = 4; // unit is bytes.
+
54 // Placeholder sampling frequency for all audio streams, which
+
55 // will be overwritten after filter parsing.
+
56 const uint32_t kDefaultSamplingFrequency = 100;
+
57 const uint16_t kEcmSizeBytes = 80;
+
58 const uint32_t kInitializationVectorSizeBytes = 16;
+
59 // ECM fields for processing.
+
60 const uint32_t kEcmContentKeySizeBytes = 16;
+
61 const uint32_t kEcmDCPFlagsSizeBytes = 3;
+
62 const uint32_t kEcmCCIFlagsSizeBytes = 1;
+
63 const uint32_t kEcmFlagsSizeBytes =
+
64  kEcmCCIFlagsSizeBytes + kEcmDCPFlagsSizeBytes;
+
65 const uint32_t kEcmPaddingSizeBytes = 12;
+
66 const uint32_t kAssetKeySizeBytes = 16;
+
67 // Default audio and video PES stream IDs.
+
68 const uint8_t kDefaultAudioStreamId = kPesStreamIdAudio;
+
69 const uint8_t kDefaultVideoStreamId = kPesStreamIdVideo;
+
70 
+
71 enum Type {
+
72  Type_void = 0,
+
73  Type_uint8 = 1,
+
74  Type_int8 = 2,
+
75  Type_uint16 = 3,
+
76  Type_int16 = 4,
+
77  Type_uint32 = 5,
+
78  Type_int32 = 6,
+
79  Type_uint64 = 7,
+
80  Type_int64 = 8,
+
81  Type_string = 9,
+
82  Type_BinaryData = 10
+
83 };
+
84 } // namespace
+
85 
+
86 namespace shaka {
+
87 namespace media {
+
88 namespace wvm {
+
89 
+
90 WvmMediaParser::WvmMediaParser()
+
91  : is_initialized_(false),
+
92  parse_state_(StartCode1),
+
93  skip_bytes_(0),
+
94  metadata_is_complete_(false),
+
95  current_program_id_(0),
+
96  pes_stream_id_(0),
+
97  prev_pes_stream_id_(0),
+
98  pes_packet_bytes_(0),
+
99  pes_flags_1_(0),
+
100  pes_flags_2_(0),
+
101  prev_pes_flags_1_(0),
+
102  pes_header_data_bytes_(0),
+
103  timestamp_(0),
+
104  pts_(0),
+
105  dts_(0),
+
106  index_program_id_(0),
+
107  media_sample_(NULL),
+
108  crypto_unit_start_pos_(0),
+
109  stream_id_count_(0),
+
110  decryption_key_source_(NULL) {}
+
111 
+
112 WvmMediaParser::~WvmMediaParser() {}
+
113 
+
114 void WvmMediaParser::Init(const InitCB& init_cb,
+
115  const NewSampleCB& new_sample_cb,
+
116  KeySource* decryption_key_source) {
+
117  DCHECK(!is_initialized_);
+
118  DCHECK(!init_cb.is_null());
+
119  DCHECK(!new_sample_cb.is_null());
+
120  decryption_key_source_ = decryption_key_source;
+
121  init_cb_ = init_cb;
+
122  new_sample_cb_ = new_sample_cb;
+
123 }
+
124 
+
125 bool WvmMediaParser::Parse(const uint8_t* buf, int size) {
+
126  size_t num_bytes = 0;
+
127  size_t prev_size = 0;
+
128  const uint8_t* read_ptr = buf;
+
129  const uint8_t* end = read_ptr + size;
+
130 
+
131  while (read_ptr < end) {
+
132  switch (parse_state_) {
+
133  case StartCode1:
+
134  if (*read_ptr == kStartCode1) {
+
135  parse_state_ = StartCode2;
+
136  }
+
137  break;
+
138  case StartCode2:
+
139  if (*read_ptr == kStartCode2) {
+
140  parse_state_ = StartCode3;
+
141  } else {
+
142  parse_state_ = StartCode1;
+
143  }
+
144  break;
+
145  case StartCode3:
+
146  if (*read_ptr == kStartCode3) {
+
147  parse_state_ = StartCode4;
+
148  } else {
+
149  parse_state_ = StartCode1;
+
150  }
+
151  break;
+
152  case StartCode4:
+
153  switch (*read_ptr) {
+
154  case kStartCode4Pack:
+
155  parse_state_ = PackHeader1;
+
156  break;
+
157  case kStartCode4System:
+
158  parse_state_ = SystemHeader1;
+
159  break;
+
160  case kStartCode4ProgramEnd:
+
161  parse_state_ = ProgramEnd;
+
162  continue;
+
163  default:
+
164  parse_state_ = PesStreamId;
+
165  continue;
+
166  }
+
167  break;
+
168  case PackHeader1:
+
169  parse_state_ = PackHeader2;
+
170  break;
+
171  case PackHeader2:
+
172  parse_state_ = PackHeader3;
+
173  break;
+
174  case PackHeader3:
+
175  parse_state_ = PackHeader4;
+
176  break;
+
177  case PackHeader4:
+
178  parse_state_ = PackHeader5;
+
179  break;
+
180  case PackHeader5:
+
181  parse_state_ = PackHeader6;
+
182  break;
+
183  case PackHeader6:
+
184  parse_state_ = PackHeader7;
+
185  break;
+
186  case PackHeader7:
+
187  parse_state_ = PackHeader8;
+
188  break;
+
189  case PackHeader8:
+
190  parse_state_ = PackHeader9;
+
191  break;
+
192  case PackHeader9:
+
193  parse_state_ = PackHeader10;
+
194  break;
+
195  case PackHeader10:
+
196  skip_bytes_ = *read_ptr & 0x07;
+
197  parse_state_ = PackHeaderStuffingSkip;
+
198  break;
+
199  case SystemHeader1:
+
200  skip_bytes_ = *read_ptr;
+
201  skip_bytes_ <<= 8;
+
202  parse_state_ = SystemHeader2;
+
203  break;
+
204  case SystemHeader2:
+
205  skip_bytes_ |= *read_ptr;
+
206  parse_state_ = SystemHeaderSkip;
+
207  break;
+
208  case PackHeaderStuffingSkip:
+
209  if (end >= skip_bytes_ + read_ptr) {
+
210  read_ptr += skip_bytes_;
+
211  skip_bytes_ = 0;
+
212  parse_state_ = StartCode1;
+
213  } else {
+
214  skip_bytes_ -= (end - read_ptr);
+
215  read_ptr = end;
+
216  }
+
217  continue;
+
218  case SystemHeaderSkip:
+
219  if (end >= skip_bytes_ + read_ptr) {
+
220  read_ptr += skip_bytes_;
+
221  skip_bytes_ = 0;
+
222  parse_state_ = StartCode1;
+
223  } else {
+
224  uint32_t remaining_size = end - read_ptr;
+
225  skip_bytes_ -= remaining_size;
+
226  read_ptr = end;
+
227  }
+
228  continue;
+
229  case PesStreamId:
+
230  pes_stream_id_ = *read_ptr;
+
231  if (!metadata_is_complete_ &&
+
232  (pes_stream_id_ != kPsmStreamId) &&
+
233  (pes_stream_id_ != kIndexStreamId) &&
+
234  (pes_stream_id_ != kEcmStreamId) &&
+
235  (pes_stream_id_ != kV2MetadataStreamId) &&
+
236  (pes_stream_id_ != kPaddingStreamId)) {
+
237  metadata_is_complete_ = true;
+
238  }
+
239  parse_state_ = PesPacketLength1;
+
240  break;
+
241  case PesPacketLength1:
+
242  pes_packet_bytes_ = *read_ptr;
+
243  pes_packet_bytes_ <<= 8;
+
244  parse_state_ = PesPacketLength2;
+
245  break;
+
246  case PesPacketLength2:
+
247  pes_packet_bytes_ |= *read_ptr;
+
248  if (HAS_HEADER_EXTENSION(pes_stream_id_)) {
+
249  parse_state_ = PesExtension1;
+
250  } else {
+
251  prev_pes_flags_1_ = pes_flags_1_;
+
252  pes_flags_1_ = pes_flags_2_ = 0;
+
253  pes_header_data_bytes_ = 0;
+
254  parse_state_ = PesPayload;
+
255  }
+
256  break;
+
257  case PesExtension1:
+
258  prev_pes_flags_1_ = pes_flags_1_;
+
259  pes_flags_1_ = *read_ptr;
+
260  --pes_packet_bytes_;
+
261  parse_state_ = PesExtension2;
+
262  break;
+
263  case PesExtension2:
+
264  pes_flags_2_ = *read_ptr;
+
265  --pes_packet_bytes_;
+
266  parse_state_ = PesExtension3;
+
267  break;
+
268  case PesExtension3:
+
269  pes_header_data_bytes_ = *read_ptr;
+
270  --pes_packet_bytes_;
+
271  if (pes_flags_2_ & kPesOptPts) {
+
272  parse_state_ = Pts1;
+
273  } else {
+
274  parse_state_ = PesHeaderData;
+
275  }
+
276  break;
+
277  case Pts1:
+
278  timestamp_ = (*read_ptr & 0x0E);
+
279  --pes_header_data_bytes_;
+
280  --pes_packet_bytes_;
+
281  parse_state_ = Pts2;
+
282  break;
+
283  case Pts2:
+
284  timestamp_ <<= 7;
+
285  timestamp_ |= *read_ptr;
+
286  --pes_header_data_bytes_;
+
287  --pes_packet_bytes_;
+
288  parse_state_ = Pts3;
+
289  break;
+
290  case Pts3:
+
291  timestamp_ <<= 7;
+
292  timestamp_ |= *read_ptr >> 1;
+
293  --pes_header_data_bytes_;
+
294  --pes_packet_bytes_;
+
295  parse_state_ = Pts4;
+
296  break;
+
297  case Pts4:
+
298  timestamp_ <<= 8;
+
299  timestamp_ |= *read_ptr;
+
300  --pes_header_data_bytes_;
+
301  --pes_packet_bytes_;
+
302  parse_state_ = Pts5;
+
303  break;
+
304  case Pts5:
+
305  timestamp_ <<= 7;
+
306  timestamp_ |= *read_ptr >> 1;
+
307  pts_ = timestamp_;
+
308  --pes_header_data_bytes_;
+
309  --pes_packet_bytes_;
+
310  if (pes_flags_2_ & kPesOptDts) {
+
311  parse_state_ = Dts1;
+
312  } else {
+
313  dts_ = pts_;
+
314  parse_state_ = PesHeaderData;
+
315  }
+
316  break;
+
317  case Dts1:
+
318  timestamp_ = (*read_ptr & 0x0E);
+
319  --pes_header_data_bytes_;
+
320  --pes_packet_bytes_;
+
321  parse_state_ = Dts2;
+
322  break;
+
323  case Dts2:
+
324  timestamp_ <<= 7;
+
325  timestamp_ |= *read_ptr;
+
326  --pes_header_data_bytes_;
+
327  --pes_packet_bytes_;
+
328  parse_state_ = Dts3;
+
329  break;
+
330  case Dts3:
+
331  timestamp_ <<= 7;
+
332  timestamp_ |= *read_ptr >> 1;
+
333  --pes_header_data_bytes_;
+
334  --pes_packet_bytes_;
+
335  parse_state_ = Dts4;
+
336  break;
+
337  case Dts4:
+
338  timestamp_ <<= 8;
+
339  timestamp_ |= *read_ptr;
+
340  --pes_header_data_bytes_;
+
341  --pes_packet_bytes_;
+
342  parse_state_ = Dts5;
+
343  break;
+
344  case Dts5:
+
345  timestamp_ <<= 7;
+
346  timestamp_ |= *read_ptr >> 1;
+
347  dts_ = timestamp_;
+
348  --pes_header_data_bytes_;
+
349  --pes_packet_bytes_;
+
350  parse_state_ = PesHeaderData;
+
351  break;
+
352  case PesHeaderData:
+
353  num_bytes = end - read_ptr;
+
354  if (num_bytes >= pes_header_data_bytes_) {
+
355  num_bytes = pes_header_data_bytes_;
+
356  parse_state_ = PesPayload;
+
357  }
+
358  pes_header_data_bytes_ -= num_bytes;
+
359  pes_packet_bytes_ -= num_bytes;
+
360  read_ptr += num_bytes;
+
361  continue;
+
362  case PesPayload:
+
363  switch (pes_stream_id_) {
+
364  case kPsmStreamId:
+
365  psm_data_.clear();
+
366  parse_state_ = PsmPayload;
+
367  continue;
+
368  case kPaddingStreamId:
+
369  parse_state_ = Padding;
+
370  continue;
+
371  case kEcmStreamId:
+
372  ecm_.clear();
+
373  parse_state_ = EcmPayload;
+
374  continue;
+
375  case kIndexStreamId:
+
376  parse_state_ = IndexPayload;
+
377  continue;
+
378  default:
+
379  if (!DemuxNextPes(false)) {
+
380  return false;
+
381  }
+
382  parse_state_ = EsPayload;
+
383  }
+
384  continue;
+
385  case PsmPayload:
+
386  num_bytes = end - read_ptr;
+
387  if (num_bytes >= pes_packet_bytes_) {
+
388  num_bytes = pes_packet_bytes_;
+
389  parse_state_ = StartCode1;
+
390  }
+
391  if (num_bytes > 0) {
+
392  pes_packet_bytes_ -= num_bytes;
+
393  prev_size = psm_data_.size();
+
394  psm_data_.resize(prev_size + num_bytes);
+
395  memcpy(&psm_data_[prev_size], read_ptr, num_bytes);
+
396  }
+
397  read_ptr += num_bytes;
+
398  continue;
+
399  case EcmPayload:
+
400  num_bytes = end - read_ptr;
+
401  if (num_bytes >= pes_packet_bytes_) {
+
402  num_bytes = pes_packet_bytes_;
+
403  parse_state_ = StartCode1;
+
404  }
+
405  if (num_bytes > 0) {
+
406  pes_packet_bytes_ -= num_bytes;
+
407  prev_size = ecm_.size();
+
408  ecm_.resize(prev_size + num_bytes);
+
409  memcpy(&ecm_[prev_size], read_ptr, num_bytes);
+
410  }
+
411  if ((pes_packet_bytes_ == 0) && !ecm_.empty()) {
+
412  if (!ProcessEcm()) {
+
413  return(false);
+
414  }
+
415  }
+
416  read_ptr += num_bytes;
+
417  continue;
+
418  case IndexPayload:
+
419  num_bytes = end - read_ptr;
+
420  if (num_bytes >= pes_packet_bytes_) {
+
421  num_bytes = pes_packet_bytes_;
+
422  parse_state_ = StartCode1;
+
423  }
+
424  if (num_bytes > 0) {
+
425  pes_packet_bytes_ -= num_bytes;
+
426  prev_size = index_data_.size();
+
427  index_data_.resize(prev_size + num_bytes);
+
428  memcpy(&index_data_[prev_size], read_ptr, num_bytes);
+
429  }
+
430  if (pes_packet_bytes_ == 0 && !index_data_.empty()) {
+
431  if (!metadata_is_complete_) {
+
432  if (!ParseIndexEntry()) {
+
433  return false;
+
434  }
+
435  }
+
436  }
+
437  read_ptr += num_bytes;
+
438  continue;
+
439  case EsPayload:
+
440  num_bytes = end - read_ptr;
+
441  if (num_bytes >= pes_packet_bytes_) {
+
442  num_bytes = pes_packet_bytes_;
+
443  parse_state_ = StartCode1;
+
444  }
+
445  pes_packet_bytes_ -= num_bytes;
+
446  if (pes_stream_id_ != kV2MetadataStreamId) {
+
447  sample_data_.resize(sample_data_.size() + num_bytes);
+
448  memcpy(&sample_data_[sample_data_.size() - num_bytes], read_ptr,
+
449  num_bytes);
+
450  }
+
451  prev_pes_stream_id_ = pes_stream_id_;
+
452  read_ptr += num_bytes;
+
453  continue;
+
454  case Padding:
+
455  num_bytes = end - read_ptr;
+
456  if (num_bytes >= pes_packet_bytes_) {
+
457  num_bytes = pes_packet_bytes_;
+
458  parse_state_ = StartCode1;
+
459  }
+
460  pes_packet_bytes_ -= num_bytes;
+
461  read_ptr += num_bytes;
+
462  continue;
+
463  case ProgramEnd:
+
464  parse_state_ = StartCode1;
+
465  metadata_is_complete_ = true;
+
466  if (!DemuxNextPes(true)) {
+
467  return false;
+
468  }
+
469  if (!Flush()) {
+
470  return false;
+
471  }
+
472  // Reset.
+
473  dts_ = pts_ = 0;
+
474  parse_state_ = StartCode1;
+
475  prev_media_sample_data_.Reset();
+
476  current_program_id_++;
+
477  ecm_.clear();
+
478  index_data_.clear();
+
479  psm_data_.clear();
+
480  break;
+
481  default:
+
482  break;
+
483  }
+
484  ++read_ptr;
+
485  }
+
486  return true;
+
487 }
+
488 
+
489 bool WvmMediaParser::EmitLastSample(
+
490  uint32_t stream_id,
+
491  const std::shared_ptr<MediaSample>& new_sample) {
+
492  std::string key = base::UintToString(current_program_id_)
+
493  .append(":")
+
494  .append(base::UintToString(stream_id));
+
495  std::map<std::string, uint32_t>::iterator it =
+
496  program_demux_stream_map_.find(key);
+
497  if (it == program_demux_stream_map_.end())
+
498  return false;
+
499  return EmitSample(stream_id, (*it).second, new_sample, true);
+
500 }
+
501 
+
502 bool WvmMediaParser::EmitPendingSamples() {
+
503  // Emit queued samples which were built when not initialized.
+
504  while (!media_sample_queue_.empty()) {
+
505  DemuxStreamIdMediaSample& demux_stream_media_sample =
+
506  media_sample_queue_.front();
+
507  if (!EmitSample(demux_stream_media_sample.parsed_audio_or_video_stream_id,
+
508  demux_stream_media_sample.demux_stream_id,
+
509  demux_stream_media_sample.media_sample,
+
510  false)) {
+
511  return false;
+
512  }
+
513  media_sample_queue_.pop_front();
+
514  }
+
515  return true;
+
516 }
+
517 
+
518 bool WvmMediaParser::Flush() {
+
519  // Flush the last audio and video sample for current program.
+
520  // Reset the streamID when successfully emitted.
+
521  if (prev_media_sample_data_.audio_sample != NULL) {
+
522  if (!EmitLastSample(prev_pes_stream_id_,
+
523  prev_media_sample_data_.audio_sample)) {
+
524  LOG(ERROR) << "Did not emit last sample for audio stream with ID = "
+
525  << prev_pes_stream_id_;
+
526  return false;
+
527  }
+
528  }
+
529  if (prev_media_sample_data_.video_sample != NULL) {
+
530  if (!EmitLastSample(prev_pes_stream_id_,
+
531  prev_media_sample_data_.video_sample)) {
+
532  LOG(ERROR) << "Did not emit last sample for video stream with ID = "
+
533  << prev_pes_stream_id_;
+
534  return false;
+
535  }
+
536  }
+
537  return true;
+
538 }
+
539 
+
540 bool WvmMediaParser::ParseIndexEntry() {
+
541  // Do not parse index entry at the beginning of any track *after* the first
+
542  // track.
+
543  if (current_program_id_ > 0) {
+
544  return true;
+
545  }
+
546  uint32_t index_size = 0;
+
547  if (index_data_.size() < kIndexVersion4HeaderSize) {
+
548  return false;
+
549  }
+
550 
+
551  const uint8_t* read_ptr = index_data_.data();
+
552  if (ntohlFromBuffer(read_ptr) != kIndexMagic) {
+
553  index_data_.clear();
+
554  return false;
+
555  }
+
556  read_ptr += 4;
+
557 
+
558  uint32_t version = ntohlFromBuffer(read_ptr);
+
559  read_ptr += 4;
+
560  if (version == kVersion4) {
+
561  index_size = kIndexVersion4HeaderSize + ntohlFromBuffer(read_ptr);
+
562  if (index_data_.size() < index_size) {
+
563  // We do not yet have the full index. Keep accumulating index data.
+
564  return true;
+
565  }
+
566  read_ptr += sizeof(uint32_t);
+
567 
+
568  // Index metadata
+
569  uint32_t index_metadata_max_size = index_size - kIndexVersion4HeaderSize;
+
570  if (index_metadata_max_size < sizeof(uint8_t)) {
+
571  index_data_.clear();
+
572  return false;
+
573  }
+
574 
+
575  uint64_t track_duration = 0;
+
576  uint32_t trick_play_factor = 0;
+
577  uint32_t sampling_frequency = kDefaultSamplingFrequency;
+
578  uint32_t time_scale = kMpeg2ClockRate;
+
579  uint16_t video_width = 0;
+
580  uint16_t video_height = 0;
+
581  uint32_t pixel_width = 0;
+
582  uint32_t pixel_height = 0;
+
583  uint8_t nalu_length_size = kNaluLengthSize;
+
584  uint8_t num_channels = 0;
+
585  int audio_pes_stream_id = 0;
+
586  int video_pes_stream_id = 0;
+
587  bool has_video = false;
+
588  bool has_audio = false;
+
589  std::vector<uint8_t> audio_codec_config;
+
590  std::vector<uint8_t> video_codec_config;
+
591  uint8_t num_index_entries = *read_ptr;
+
592  ++read_ptr;
+
593  --index_metadata_max_size;
+
594 
+
595  for (uint8_t idx = 0; idx < num_index_entries; ++idx) {
+
596  if (index_metadata_max_size < (2 * sizeof(uint8_t)) + sizeof(uint32_t)) {
+
597  return false;
+
598  }
+
599  uint8_t tag = *read_ptr;
+
600  ++read_ptr;
+
601  uint8_t type = *read_ptr;
+
602  ++read_ptr;
+
603  uint32_t length = ntohlFromBuffer(read_ptr);
+
604  read_ptr += sizeof(uint32_t);
+
605  index_metadata_max_size -= (2 * sizeof(uint8_t)) + sizeof(uint32_t);
+
606  if (index_metadata_max_size < length) {
+
607  return false;
+
608  }
+
609  int64_t value = 0;
+
610  Tag tagtype = Unset;
+
611  std::vector<uint8_t> binary_data;
+
612  switch (Type(type)) {
+
613  case Type_uint8:
+
614  if (length == sizeof(uint8_t)) {
+
615  tagtype = GetTag(tag, length, read_ptr, &value);
+
616  } else {
+
617  return false;
+
618  }
+
619  break;
+
620  case Type_int8:
+
621  if (length == sizeof(int8_t)) {
+
622  tagtype = GetTag(tag, length, read_ptr, &value);
+
623  } else {
+
624  return false;
+
625  }
+
626  break;
+
627  case Type_uint16:
+
628  if (length == sizeof(uint16_t)) {
+
629  tagtype = GetTag(tag, length, read_ptr, &value);
+
630  } else {
+
631  return false;
+
632  }
+
633  break;
+
634  case Type_int16:
+
635  if (length == sizeof(int16_t)) {
+
636  tagtype = GetTag(tag, length, read_ptr, &value);
+
637  } else {
+
638  return false;
+
639  }
+
640  break;
+
641  case Type_uint32:
+
642  if (length == sizeof(uint32_t)) {
+
643  tagtype = GetTag(tag, length, read_ptr, &value);
+
644  } else {
+
645  return false;
+
646  }
+
647  break;
+
648  case Type_int32:
+
649  if (length == sizeof(int32_t)) {
+
650  tagtype = GetTag(tag, length, read_ptr, &value);
+
651  } else {
+
652  return false;
+
653  }
+
654  break;
+
655  case Type_uint64:
+
656  if (length == sizeof(uint64_t)) {
+
657  tagtype = GetTag(tag, length, read_ptr, &value);
+
658  } else {
+
659  return false;
+
660  }
+
661  break;
+
662  case Type_int64:
+
663  if (length == sizeof(int64_t)) {
+
664  tagtype = GetTag(tag, length, read_ptr, &value);
+
665  } else {
+
666  return false;
+
667  }
+
668  break;
+
669  case Type_string:
+
670  case Type_BinaryData:
+
671  binary_data.assign(read_ptr, read_ptr + length);
+
672  tagtype = Tag(tag);
+
673  break;
+
674  default:
+
675  break;
+
676  }
+
677 
+
678  switch (tagtype) {
+
679  case TrackDuration:
+
680  track_duration = value;
+
681  break;
+
682  case TrackTrickPlayFactor:
+
683  trick_play_factor = value;
+
684  break;
+
685  case VideoStreamId:
+
686  video_pes_stream_id = value;
+
687  break;
+
688  case AudioStreamId:
+
689  audio_pes_stream_id = value;
+
690  break;
+
691  case VideoWidth:
+
692  video_width = (uint16_t)value;
+
693  break;
+
694  case VideoHeight:
+
695  video_height = (uint16_t)value;
+
696  break;
+
697  case AudioNumChannels:
+
698  num_channels = (uint8_t)value;
+
699  break;
+
700  case VideoType:
+
701  has_video = true;
+
702  break;
+
703  case AudioType:
+
704  has_audio = true;
+
705  break;
+
706  case VideoPixelWidth:
+
707  pixel_width = static_cast<uint32_t>(value);
+
708  break;
+
709  case VideoPixelHeight:
+
710  pixel_height = static_cast<uint32_t>(value);
+
711  break;
+
712  case Audio_EsDescriptor: {
+
713  ESDescriptor descriptor;
+
714  if (!descriptor.Parse(binary_data)) {
+
715  LOG(ERROR) <<
+
716  "Could not extract AudioSpecificConfig from ES_Descriptor";
+
717  return false;
+
718  }
+
719  audio_codec_config = descriptor.decoder_specific_info();
+
720  break;
+
721  }
+
722  case Audio_EC3SpecificData:
+
723  case Audio_DtsSpecificData:
+
724  case Audio_AC3SpecificData:
+
725  LOG(ERROR) << "Audio type not supported.";
+
726  return false;
+
727  case Video_AVCDecoderConfigurationRecord:
+
728  video_codec_config = binary_data;
+
729  break;
+
730  default:
+
731  break;
+
732  }
+
733 
+
734  read_ptr += length;
+
735  index_metadata_max_size -= length;
+
736  }
+
737  // End Index metadata
+
738  index_size = read_ptr - index_data_.data();
+
739 
+
740  if (has_video) {
+
741  stream_infos_.emplace_back(new VideoStreamInfo(
+
742  stream_id_count_, time_scale, track_duration, kCodecH264,
+
743  byte_to_unit_stream_converter_.stream_format(), std::string(),
+
744  video_codec_config.data(), video_codec_config.size(), video_width,
+
745  video_height, pixel_width, pixel_height, trick_play_factor,
+
746  nalu_length_size, std::string(),
+
747  decryption_key_source_ ? false : true));
+
748  program_demux_stream_map_[base::UintToString(index_program_id_) + ":" +
+
749  base::UintToString(
+
750  video_pes_stream_id
+
751  ? video_pes_stream_id
+
752  : kDefaultVideoStreamId)] =
+
753  stream_id_count_++;
+
754  }
+
755  if (has_audio) {
+
756  const Codec audio_codec = kCodecAAC;
+
757  // TODO(beil): Pass in max and average bitrate in wvm container.
+
758  stream_infos_.emplace_back(new AudioStreamInfo(
+
759  stream_id_count_, time_scale, track_duration, audio_codec,
+
760  std::string(), audio_codec_config.data(), audio_codec_config.size(),
+
761  kAacSampleSizeBits, num_channels, sampling_frequency,
+
762  0 /* seek preroll */, 0 /* codec delay */, 0 /* max bitrate */,
+
763  0 /* avg bitrate */, std::string(),
+
764  decryption_key_source_ ? false : true));
+
765  program_demux_stream_map_[base::UintToString(index_program_id_) + ":" +
+
766  base::UintToString(
+
767  audio_pes_stream_id
+
768  ? audio_pes_stream_id
+
769  : kDefaultAudioStreamId)] =
+
770  stream_id_count_++;
+
771  }
+
772  }
+
773 
+
774  index_program_id_++;
+
775  index_data_.clear();
+
776  return true;
+
777 }
+
778 
+
779 bool WvmMediaParser::DemuxNextPes(bool is_program_end) {
+
780  bool output_encrypted_sample = false;
+
781  if (!sample_data_.empty() && (prev_pes_flags_1_ & kScramblingBitsMask)) {
+
782  // Decrypt crypto unit.
+
783  if (!content_decryptor_) {
+
784  output_encrypted_sample = true;
+
785  } else {
+
786  content_decryptor_->Crypt(&sample_data_[crypto_unit_start_pos_],
+
787  sample_data_.size() - crypto_unit_start_pos_,
+
788  &sample_data_[crypto_unit_start_pos_]);
+
789  }
+
790  }
+
791  // Demux media sample if we are at program end or if we are not at a
+
792  // continuation PES.
+
793  if ((pes_flags_2_ & kPesOptPts) || is_program_end) {
+
794  if (!sample_data_.empty()) {
+
795  if (!Output(output_encrypted_sample)) {
+
796  return false;
+
797  }
+
798  }
+
799  StartMediaSampleDemux();
+
800  }
+
801 
+
802  crypto_unit_start_pos_ = sample_data_.size();
+
803  return true;
+
804 }
+
805 
+
806 void WvmMediaParser::StartMediaSampleDemux() {
+
807  bool is_key_frame = ((pes_flags_1_ & kPesOptAlign) != 0);
+
808  media_sample_ = MediaSample::CreateEmptyMediaSample();
+
809  media_sample_->set_dts(dts_);
+
810  media_sample_->set_pts(pts_);
+
811  media_sample_->set_is_key_frame(is_key_frame);
+
812 
+
813  sample_data_.clear();
+
814 }
+
815 
+
816 bool WvmMediaParser::Output(bool output_encrypted_sample) {
+
817  if (output_encrypted_sample) {
+
818  media_sample_->SetData(sample_data_.data(), sample_data_.size());
+
819  media_sample_->set_is_encrypted(true);
+
820  } else {
+
821  if ((prev_pes_stream_id_ & kPesStreamIdVideoMask) == kPesStreamIdVideo) {
+
822  // Convert video stream to unit stream and get config.
+
823  std::vector<uint8_t> nal_unit_stream;
+
824  if (!byte_to_unit_stream_converter_.ConvertByteStreamToNalUnitStream(
+
825  sample_data_.data(), sample_data_.size(), &nal_unit_stream)) {
+
826  LOG(ERROR) << "Could not convert h.264 byte stream sample";
+
827  return false;
+
828  }
+
829  media_sample_->SetData(nal_unit_stream.data(), nal_unit_stream.size());
+
830  if (!is_initialized_) {
+
831  // Set extra data for video stream from AVC Decoder Config Record.
+
832  // Also, set codec string from the AVC Decoder Config Record.
+
833  std::vector<uint8_t> decoder_config_record;
+
834  byte_to_unit_stream_converter_.GetDecoderConfigurationRecord(
+
835  &decoder_config_record);
+
836  for (uint32_t i = 0; i < stream_infos_.size(); i++) {
+
837  if (stream_infos_[i]->stream_type() == kStreamVideo &&
+
838  stream_infos_[i]->codec_string().empty()) {
+
839  const std::vector<uint8_t>* stream_config;
+
840  if (stream_infos_[i]->codec_config().empty()) {
+
841  // Decoder config record not available for stream. Use the one
+
842  // computed from the first video stream.
+
843  stream_infos_[i]->set_codec_config(decoder_config_record);
+
844  stream_config = &decoder_config_record;
+
845  } else {
+
846  // Use stream-specific config record.
+
847  stream_config = &stream_infos_[i]->codec_config();
+
848  }
+
849  DCHECK(stream_config);
+
850 
+
851  VideoStreamInfo* video_stream_info =
+
852  reinterpret_cast<VideoStreamInfo*>(stream_infos_[i].get());
+
853  AVCDecoderConfigurationRecord avc_config;
+
854  if (!avc_config.Parse(*stream_config)) {
+
855  LOG(WARNING) << "Failed to parse AVCDecoderConfigurationRecord. "
+
856  "Using computed configuration record instead.";
+
857  video_stream_info->set_codec_config(decoder_config_record);
+
858  if (!avc_config.Parse(decoder_config_record)) {
+
859  LOG(ERROR) << "Failed to parse AVCDecoderConfigurationRecord.";
+
860  return false;
+
861  }
+
862  }
+
863  const FourCC codec_fourcc =
+
864  byte_to_unit_stream_converter_.stream_format() ==
+
865  H26xStreamFormat::kNalUnitStreamWithParameterSetNalus
+
866  ? FOURCC_avc3
+
867  : FOURCC_avc1;
+
868  video_stream_info->set_codec_string(
+
869  avc_config.GetCodecString(codec_fourcc));
+
870 
+
871  if (avc_config.pixel_width() != video_stream_info->pixel_width() ||
+
872  avc_config.pixel_height() !=
+
873  video_stream_info->pixel_height()) {
+
874  LOG_IF(WARNING, video_stream_info->pixel_width() != 0 ||
+
875  video_stream_info->pixel_height() != 0)
+
876  << "Pixel aspect ratio in WVM metadata ("
+
877  << video_stream_info->pixel_width() << ","
+
878  << video_stream_info->pixel_height()
+
879  << ") does not match with SAR in "
+
880  "AVCDecoderConfigurationRecord ("
+
881  << avc_config.pixel_width() << ","
+
882  << avc_config.pixel_height()
+
883  << "). Use AVCDecoderConfigurationRecord.";
+
884  video_stream_info->set_pixel_width(avc_config.pixel_width());
+
885  video_stream_info->set_pixel_height(avc_config.pixel_height());
+
886  }
+
887  if (avc_config.coded_width() != video_stream_info->width() ||
+
888  avc_config.coded_height() != video_stream_info->height()) {
+
889  LOG(WARNING) << "Resolution in WVM metadata ("
+
890  << video_stream_info->width() << ","
+
891  << video_stream_info->height()
+
892  << ") does not match with resolution in "
+
893  "AVCDecoderConfigurationRecord ("
+
894  << avc_config.coded_width() << ","
+
895  << avc_config.coded_height()
+
896  << "). Use AVCDecoderConfigurationRecord.";
+
897  video_stream_info->set_width(avc_config.coded_width());
+
898  video_stream_info->set_height(avc_config.coded_height());
+
899  }
+
900  }
+
901  }
+
902  }
+
903  } else if ((prev_pes_stream_id_ & kPesStreamIdAudioMask) ==
+
904  kPesStreamIdAudio) {
+
905  // Set data on the audio stream.
+
906  mp2t::AdtsHeader adts_header;
+
907  const uint8_t* frame_ptr = sample_data_.data();
+
908  if (!adts_header.Parse(frame_ptr, sample_data_.size())) {
+
909  LOG(ERROR) << "Could not parse ADTS header";
+
910  return false;
+
911  }
+
912  media_sample_->SetData(
+
913  frame_ptr + adts_header.GetHeaderSize(),
+
914  adts_header.GetFrameSize() - adts_header.GetHeaderSize());
+
915  if (!is_initialized_) {
+
916  for (uint32_t i = 0; i < stream_infos_.size(); i++) {
+
917  if (stream_infos_[i]->stream_type() == kStreamAudio &&
+
918  stream_infos_[i]->codec_string().empty()) {
+
919  AudioStreamInfo* audio_stream_info =
+
920  reinterpret_cast<AudioStreamInfo*>(stream_infos_[i].get());
+
921  if (audio_stream_info->codec_config().empty()) {
+
922  // Set AudioStreamInfo fields using information from the ADTS
+
923  // header.
+
924  audio_stream_info->set_sampling_frequency(
+
925  adts_header.GetSamplingFrequency());
+
926  std::vector<uint8_t> audio_specific_config;
+
927  adts_header.GetAudioSpecificConfig(&audio_specific_config);
+
928  audio_stream_info->set_codec_config(audio_specific_config);
+
929  audio_stream_info->set_codec_string(
+ +
931  kCodecAAC, adts_header.GetObjectType()));
+
932  } else {
+
933  // Set AudioStreamInfo fields using information from the
+
934  // AACAudioSpecificConfig record.
+
935  AACAudioSpecificConfig aac_config;
+
936  if (!aac_config.Parse(stream_infos_[i]->codec_config())) {
+
937  LOG(ERROR) << "Could not parse AACAudioSpecificconfig";
+
938  return false;
+
939  }
+
940  audio_stream_info->set_sampling_frequency(
+
941  aac_config.GetSamplesPerSecond());
+
942  audio_stream_info->set_codec_string(
+ +
944  kCodecAAC, aac_config.GetAudioObjectType()));
+
945  }
+
946  }
+
947  }
+
948  }
+
949  }
+
950  }
+
951 
+
952  if (!is_initialized_) {
+
953  bool all_streams_have_config = true;
+
954  // Check if all collected stream infos have codec_config set.
+
955  for (uint32_t i = 0; i < stream_infos_.size(); i++) {
+
956  if (stream_infos_[i]->codec_string().empty()) {
+
957  all_streams_have_config = false;
+
958  break;
+
959  }
+
960  }
+
961  if (all_streams_have_config) {
+
962  init_cb_.Run(stream_infos_);
+
963  is_initialized_ = true;
+
964  }
+
965  }
+
966 
+
967  DCHECK_GT(media_sample_->data_size(), 0UL);
+
968  std::string key = base::UintToString(current_program_id_).append(":")
+
969  .append(base::UintToString(prev_pes_stream_id_));
+
970  std::map<std::string, uint32_t>::iterator it =
+
971  program_demux_stream_map_.find(key);
+
972  if (it == program_demux_stream_map_.end()) {
+
973  // TODO(ramjic): Log error message here and in other error cases through
+
974  // this method.
+
975  return false;
+
976  }
+
977  DemuxStreamIdMediaSample demux_stream_media_sample;
+
978  demux_stream_media_sample.parsed_audio_or_video_stream_id =
+
979  prev_pes_stream_id_;
+
980  demux_stream_media_sample.demux_stream_id = (*it).second;
+
981  demux_stream_media_sample.media_sample = media_sample_;
+
982  // Check if sample can be emitted.
+
983  if (!is_initialized_) {
+
984  media_sample_queue_.push_back(demux_stream_media_sample);
+
985  } else {
+
986  // flush the sample queue and emit all queued samples.
+
987  while (!media_sample_queue_.empty()) {
+
988  if (!EmitPendingSamples())
+
989  return false;
+
990  }
+
991  // Emit current sample.
+
992  if (!EmitSample(prev_pes_stream_id_, (*it).second, media_sample_, false))
+
993  return false;
+
994  }
+
995  return true;
+
996 }
+
997 
+
998 bool WvmMediaParser::EmitSample(uint32_t parsed_audio_or_video_stream_id,
+
999  uint32_t stream_id,
+
1000  const std::shared_ptr<MediaSample>& new_sample,
+
1001  bool isLastSample) {
+
1002  DCHECK(new_sample);
+
1003  if (isLastSample) {
+
1004  if ((parsed_audio_or_video_stream_id & kPesStreamIdVideoMask) ==
+
1005  kPesStreamIdVideo) {
+
1006  new_sample->set_duration(prev_media_sample_data_.video_sample_duration);
+
1007  } else if ((parsed_audio_or_video_stream_id & kPesStreamIdAudioMask) ==
+
1008  kPesStreamIdAudio) {
+
1009  new_sample->set_duration(prev_media_sample_data_.audio_sample_duration);
+
1010  }
+
1011  if (!new_sample_cb_.Run(stream_id, new_sample)) {
+
1012  LOG(ERROR) << "Failed to process the last sample.";
+
1013  return false;
+
1014  }
+
1015  return true;
+
1016  }
+
1017 
+
1018  // Cannot emit current sample. Compute duration first and then,
+
1019  // emit previous sample.
+
1020  if ((parsed_audio_or_video_stream_id & kPesStreamIdVideoMask) ==
+
1021  kPesStreamIdVideo) {
+
1022  if (prev_media_sample_data_.video_sample == NULL) {
+
1023  prev_media_sample_data_.video_sample = new_sample;
+
1024  prev_media_sample_data_.video_stream_id = stream_id;
+
1025  return true;
+
1026  }
+
1027  prev_media_sample_data_.video_sample->set_duration(
+
1028  new_sample->dts() - prev_media_sample_data_.video_sample->dts());
+
1029  prev_media_sample_data_.video_sample_duration =
+
1030  prev_media_sample_data_.video_sample->duration();
+
1031  if (!new_sample_cb_.Run(prev_media_sample_data_.video_stream_id,
+
1032  prev_media_sample_data_.video_sample)) {
+
1033  LOG(ERROR) << "Failed to process the video sample.";
+
1034  return false;
+
1035  }
+
1036  prev_media_sample_data_.video_sample = new_sample;
+
1037  prev_media_sample_data_.video_stream_id = stream_id;
+
1038  } else if ((parsed_audio_or_video_stream_id & kPesStreamIdAudioMask) ==
+
1039  kPesStreamIdAudio) {
+
1040  if (prev_media_sample_data_.audio_sample == NULL) {
+
1041  prev_media_sample_data_.audio_sample = new_sample;
+
1042  prev_media_sample_data_.audio_stream_id = stream_id;
+
1043  return true;
+
1044  }
+
1045  prev_media_sample_data_.audio_sample->set_duration(
+
1046  new_sample->dts() - prev_media_sample_data_.audio_sample->dts());
+
1047  prev_media_sample_data_.audio_sample_duration =
+
1048  prev_media_sample_data_.audio_sample->duration();
+
1049  if (!new_sample_cb_.Run(prev_media_sample_data_.audio_stream_id,
+
1050  prev_media_sample_data_.audio_sample)) {
+
1051  LOG(ERROR) << "Failed to process the audio sample.";
+
1052  return false;
+
1053  }
+
1054  prev_media_sample_data_.audio_sample = new_sample;
+
1055  prev_media_sample_data_.audio_stream_id = stream_id;
+
1056  }
+
1057  return true;
+
1058 }
+
1059 
+
1060 bool WvmMediaParser::GetAssetKey(const uint8_t* asset_id,
+
1061  EncryptionKey* encryption_key) {
+
1062  DCHECK(decryption_key_source_);
+
1063  Status status = decryption_key_source_->FetchKeys(
+
1064  EmeInitDataType::WIDEVINE_CLASSIC,
+
1065  std::vector<uint8_t>(asset_id, asset_id + sizeof(uint32_t)));
+
1066  if (!status.ok()) {
+
1067  LOG(ERROR) << "Fetch Key(s) failed for AssetID = "
+
1068  << ntohlFromBuffer(asset_id) << ", error = " << status;
+
1069  return false;
+
1070  }
+
1071 
+
1072  const char kHdStreamLabel[] = "HD";
+
1073  status = decryption_key_source_->GetKey(kHdStreamLabel, encryption_key);
+
1074  if (!status.ok()) {
+
1075  LOG(ERROR) << "Fetch Key(s) failed for AssetID = "
+
1076  << ntohlFromBuffer(asset_id) << ", error = " << status;
+
1077  return false;
+
1078  }
+
1079 
+
1080  return true;
+
1081 }
+
1082 
+
1083 bool WvmMediaParser::ProcessEcm() {
+
1084  // An error will be returned later if the samples need to be decrypted.
+
1085  if (!decryption_key_source_)
+
1086  return true;
+
1087 
+
1088  if (current_program_id_ > 0) {
+
1089  return true;
+
1090  }
+
1091  if (ecm_.size() != kEcmSizeBytes) {
+
1092  LOG(ERROR) << "Unexpected ECM size = " << ecm_.size()
+
1093  << ", expected size = " << kEcmSizeBytes;
+
1094  return false;
+
1095  }
+
1096  const uint8_t* ecm_data = ecm_.data();
+
1097  DCHECK(ecm_data);
+
1098  ecm_data += sizeof(uint32_t); // old version field - skip.
+
1099  ecm_data += sizeof(uint32_t); // clear lead - skip.
+
1100  ecm_data += sizeof(uint32_t); // system id(includes ECM version) - skip.
+
1101  EncryptionKey encryption_key;
+
1102  if (!GetAssetKey(ecm_data, &encryption_key)) {
+
1103  return false;
+
1104  }
+
1105  if (encryption_key.key.size() < kAssetKeySizeBytes) {
+
1106  LOG(ERROR) << "Asset Key size of " << encryption_key.key.size()
+
1107  << " for AssetID = " << ntohlFromBuffer(ecm_data)
+
1108  << " is less than minimum asset key size.";
1109  return false;
1110  }
-
1111  if (encryption_key.key.size() < kAssetKeySizeBytes) {
-
1112  LOG(ERROR) << "Asset Key size of " << encryption_key.key.size()
-
1113  << " for AssetID = " << ntohlFromBuffer(ecm_data)
-
1114  << " is less than minimum asset key size.";
-
1115  return false;
-
1116  }
-
1117  ecm_data += sizeof(uint32_t); // asset_id.
-
1118  // Legacy WVM content may have asset keys > 16 bytes.
-
1119  // Use only the first 16 bytes of the asset key to get
-
1120  // the content key.
-
1121  std::vector<uint8_t> asset_key(
-
1122  encryption_key.key.begin(),
-
1123  encryption_key.key.begin() + kAssetKeySizeBytes);
-
1124  // WVM format always uses all zero IV.
-
1125  std::vector<uint8_t> zero_iv(kInitializationVectorSizeBytes, 0);
-
1126  AesCbcDecryptor asset_decryptor(kCtsPadding, AesCryptor::kUseConstantIv);
-
1127  if (!asset_decryptor.InitializeWithIv(asset_key, zero_iv)) {
-
1128  LOG(ERROR) << "Failed to initialize asset_decryptor.";
-
1129  return false;
-
1130  }
-
1131 
-
1132  const size_t content_key_buffer_size =
-
1133  kEcmFlagsSizeBytes + kEcmContentKeySizeBytes +
-
1134  kEcmPaddingSizeBytes; // flags + contentKey + padding.
-
1135  std::vector<uint8_t> content_key_buffer(content_key_buffer_size);
-
1136  CHECK(asset_decryptor.Crypt(ecm_data, content_key_buffer_size,
-
1137  content_key_buffer.data()));
-
1138 
-
1139  std::vector<uint8_t> decrypted_content_key_vec(
-
1140  content_key_buffer.begin() + 4,
-
1141  content_key_buffer.begin() + 20);
-
1142  std::unique_ptr<AesCbcDecryptor> content_decryptor(
-
1143  new AesCbcDecryptor(kCtsPadding, AesCryptor::kUseConstantIv));
-
1144  if (!content_decryptor->InitializeWithIv(decrypted_content_key_vec,
-
1145  zero_iv)) {
-
1146  LOG(ERROR) << "Failed to initialize content decryptor.";
-
1147  return false;
-
1148  }
-
1149 
-
1150  content_decryptor_ = std::move(content_decryptor);
-
1151  return true;
-
1152 }
+
1111  ecm_data += sizeof(uint32_t); // asset_id.
+
1112  // Legacy WVM content may have asset keys > 16 bytes.
+
1113  // Use only the first 16 bytes of the asset key to get
+
1114  // the content key.
+
1115  std::vector<uint8_t> asset_key(
+
1116  encryption_key.key.begin(),
+
1117  encryption_key.key.begin() + kAssetKeySizeBytes);
+
1118  // WVM format always uses all zero IV.
+
1119  std::vector<uint8_t> zero_iv(kInitializationVectorSizeBytes, 0);
+
1120  AesCbcDecryptor asset_decryptor(kCtsPadding, AesCryptor::kUseConstantIv);
+
1121  if (!asset_decryptor.InitializeWithIv(asset_key, zero_iv)) {
+
1122  LOG(ERROR) << "Failed to initialize asset_decryptor.";
+
1123  return false;
+
1124  }
+
1125 
+
1126  const size_t content_key_buffer_size =
+
1127  kEcmFlagsSizeBytes + kEcmContentKeySizeBytes +
+
1128  kEcmPaddingSizeBytes; // flags + contentKey + padding.
+
1129  std::vector<uint8_t> content_key_buffer(content_key_buffer_size);
+
1130  CHECK(asset_decryptor.Crypt(ecm_data, content_key_buffer_size,
+
1131  content_key_buffer.data()));
+
1132 
+
1133  std::vector<uint8_t> decrypted_content_key_vec(
+
1134  content_key_buffer.begin() + 4,
+
1135  content_key_buffer.begin() + 20);
+
1136  std::unique_ptr<AesCbcDecryptor> content_decryptor(
+
1137  new AesCbcDecryptor(kCtsPadding, AesCryptor::kUseConstantIv));
+
1138  if (!content_decryptor->InitializeWithIv(decrypted_content_key_vec,
+
1139  zero_iv)) {
+
1140  LOG(ERROR) << "Failed to initialize content decryptor.";
+
1141  return false;
+
1142  }
+
1143 
+
1144  content_decryptor_ = std::move(content_decryptor);
+
1145  return true;
+
1146 }
+
1147 
+
1148 DemuxStreamIdMediaSample::DemuxStreamIdMediaSample() :
+
1149  demux_stream_id(0),
+
1150  parsed_audio_or_video_stream_id(0) {}
+
1151 
+
1152 DemuxStreamIdMediaSample::~DemuxStreamIdMediaSample() {}
1153 
-
1154 DemuxStreamIdMediaSample::DemuxStreamIdMediaSample() :
-
1155  demux_stream_id(0),
-
1156  parsed_audio_or_video_stream_id(0) {}
+
1154 PrevSampleData::PrevSampleData() {
+
1155  Reset();
+
1156 }
1157 
-
1158 DemuxStreamIdMediaSample::~DemuxStreamIdMediaSample() {}
+
1158 PrevSampleData::~PrevSampleData() {}
1159 
-
1160 PrevSampleData::PrevSampleData() {
-
1161  Reset();
-
1162 }
-
1163 
-
1164 PrevSampleData::~PrevSampleData() {}
-
1165 
-
1166 void PrevSampleData::Reset() {
-
1167  audio_sample = NULL;
-
1168  video_sample = NULL;
-
1169  audio_stream_id = 0;
-
1170  video_stream_id = 0;
-
1171  audio_sample_duration = 0;
-
1172  video_sample_duration = 0;
-
1173 }
-
1174 
-
1175 } // namespace wvm
-
1176 } // namespace media
-
1177 } // namespace shaka
+
1160 void PrevSampleData::Reset() {
+
1161  audio_sample = NULL;
+
1162  video_sample = NULL;
+
1163  audio_stream_id = 0;
+
1164  video_stream_id = 0;
+
1165  audio_sample_duration = 0;
+
1166  video_sample_duration = 0;
+
1167 }
+
1168 
+
1169 } // namespace wvm
+
1170 } // namespace media
+
1171 } // namespace shaka
static std::shared_ptr< MediaSample > CreateEmptyMediaSample()
Create a MediaSample object with default members.
Definition: media_sample.cc:71
-
static size_t GetAdtsFrameSize(const uint8_t *data, size_t num_bytes)
Definition: adts_header.cc:23
static std::string GetCodecString(Codec codec, uint8_t audio_object_type)
KeySource is responsible for encryption key acquisition.
Definition: key_source.h:45
diff --git a/docs/dd/d3a/gflags__hex__bytes_8h_source.html b/docs/dd/d3a/gflags__hex__bytes_8h_source.html index 2ff96b67d1..2e7f15a564 100644 --- a/docs/dd/d3a/gflags__hex__bytes_8h_source.html +++ b/docs/dd/d3a/gflags__hex__bytes_8h_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d3b/mp4_2segmenter_8h_source.html b/docs/dd/d3b/mp4_2segmenter_8h_source.html index 2c4fd71d0b..7223f24f30 100644 --- a/docs/dd/d3b/mp4_2segmenter_8h_source.html +++ b/docs/dd/d3b/mp4_2segmenter_8h_source.html @@ -211,7 +211,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
Status Initialize(const std::vector< std::shared_ptr< const StreamInfo >> &streams, MuxerListener *muxer_listener, ProgressListener *progress_listener)
Definition: segmenter.cc:49
void UpdateProgress(uint64_t progress)
Update segmentation progress using ProgressListener.
Definition: segmenter.cc:224
void SetComplete()
Set progress to 100%.
Definition: segmenter.cc:240
- +
virtual bool GetInitRange(size_t *offset, size_t *size)=0
Status AddSample(size_t stream_id, const MediaSample &sample)
Definition: segmenter.cc:115
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
@@ -228,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d3e/callback__file_8cc_source.html b/docs/dd/d3e/callback__file_8cc_source.html index 941d40a9e5..dbc670c750 100644 --- a/docs/dd/d3e/callback__file_8cc_source.html +++ b/docs/dd/d3e/callback__file_8cc_source.html @@ -172,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d3f/structshaka_1_1media_1_1mp4_1_1SyncSample.html b/docs/dd/d3f/structshaka_1_1media_1_1mp4_1_1SyncSample.html index ac0dd31044..7ee4959e6e 100644 --- a/docs/dd/d3f/structshaka_1_1media_1_1mp4_1_1SyncSample.html +++ b/docs/dd/d3f/structshaka_1_1media_1_1mp4_1_1SyncSample.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/dd/d40/classshaka_1_1CallbackFile.html b/docs/dd/d40/classshaka_1_1CallbackFile.html index 7505e20add..e4ecfdb016 100644 --- a/docs/dd/d40/classshaka_1_1CallbackFile.html +++ b/docs/dd/d40/classshaka_1_1CallbackFile.html @@ -470,7 +470,7 @@ Additional Inherited Members diff --git a/docs/dd/d42/encryptor_8h_source.html b/docs/dd/d42/encryptor_8h_source.html index 447ed01dd0..f3d51410a5 100644 --- a/docs/dd/d42/encryptor_8h_source.html +++ b/docs/dd/d42/encryptor_8h_source.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d46/webm__parser_8h_source.html b/docs/dd/d46/webm__parser_8h_source.html index 9e267109d9..b726d4c737 100644 --- a/docs/dd/d46/webm__parser_8h_source.html +++ b/docs/dd/d46/webm__parser_8h_source.html @@ -227,7 +227,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d4d/structshaka_1_1media_1_1mp4_1_1MovieFragment-members.html b/docs/dd/d4d/structshaka_1_1media_1_1mp4_1_1MovieFragment-members.html index 30667014e2..c2487219d8 100644 --- a/docs/dd/d4d/structshaka_1_1media_1_1mp4_1_1MovieFragment-members.html +++ b/docs/dd/d4d/structshaka_1_1media_1_1mp4_1_1MovieFragment-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d4f/classshaka_1_1hls_1_1SimpleHlsNotifier-members.html b/docs/dd/d4f/classshaka_1_1hls_1_1SimpleHlsNotifier-members.html index d639f3bd0d..7c49d14ed0 100644 --- a/docs/dd/d4f/classshaka_1_1hls_1_1SimpleHlsNotifier-members.html +++ b/docs/dd/d4f/classshaka_1_1hls_1_1SimpleHlsNotifier-members.html @@ -100,14 +100,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); NotifyNewSegment(uint32_t stream_id, const std::string &segment_name, uint64_t start_time, uint64_t duration, uint64_t start_byte_offset, uint64_t size) overrideshaka::hls::SimpleHlsNotifiervirtual NotifyNewStream(const MediaInfo &media_info, const std::string &playlist_name, const std::string &stream_name, const std::string &group_id, uint32_t *stream_id) overrideshaka::hls::SimpleHlsNotifiervirtual playlist_type() const shaka::hls::HlsNotifierinline - SimpleHlsNotifier(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &prefix, const std::string &output_dir, const std::string &master_playlist_name)shaka::hls::SimpleHlsNotifier + SimpleHlsNotifier(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &prefix, const std::string &key_uri, const std::string &output_dir, const std::string &master_playlist_name)shaka::hls::SimpleHlsNotifier SimpleHlsNotifierTest classshaka::hls::SimpleHlsNotifierfriend ~HlsNotifier() (defined in shaka::hls::HlsNotifier)shaka::hls::HlsNotifierinlinevirtual ~SimpleHlsNotifier() override (defined in shaka::hls::SimpleHlsNotifier)shaka::hls::SimpleHlsNotifier diff --git a/docs/dd/d53/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample-members.html b/docs/dd/d53/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample-members.html index d81363c2b0..911c66fa50 100644 --- a/docs/dd/d53/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample-members.html +++ b/docs/dd/d53/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d54/widevine__encryption__flags_8h_source.html b/docs/dd/d54/widevine__encryption__flags_8h_source.html index 0727439a8f..140e1e0835 100644 --- a/docs/dd/d54/widevine__encryption__flags_8h_source.html +++ b/docs/dd/d54/widevine__encryption__flags_8h_source.html @@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d58/bit__writer_8cc_source.html b/docs/dd/d58/bit__writer_8cc_source.html new file mode 100644 index 0000000000..6d4c0bc613 --- /dev/null +++ b/docs/dd/d58/bit__writer_8cc_source.html @@ -0,0 +1,143 @@ + + + + + + +Shaka Packager SDK: packager/media/base/bit_writer.cc Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
bit_writer.cc
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #include "packager/media/base/bit_writer.h"
+
8 
+
9 namespace shaka {
+
10 namespace media {
+
11 
+
12 BitWriter::BitWriter(std::vector<uint8_t>* storage)
+
13  : storage_(storage), initial_storage_size_(storage_->size()) {}
+
14 
+
15 void BitWriter::WriteBits(uint32_t bits, size_t number_of_bits) {
+
16  DCHECK_NE(number_of_bits, 0u);
+
17  DCHECK_LE(number_of_bits, 32u);
+
18  DCHECK_LT(bits, 1ULL << number_of_bits);
+
19 
+
20  num_bits_ += number_of_bits;
+
21  DCHECK_LE(num_bits_, 64);
+
22  bits_ |= static_cast<uint64_t>(bits) << (64 - num_bits_);
+
23 
+
24  while (num_bits_ >= 8) {
+
25  storage_->push_back(bits_ >> 56);
+
26  bits_ <<= 8;
+
27  num_bits_ -= 8;
+
28  }
+
29 }
+
30 
+ +
32  while (num_bits_ > 0) {
+
33  storage_->push_back(bits_ >> 56);
+
34  bits_ <<= 8;
+
35  num_bits_ -= 8;
+
36  }
+
37  bits_ = 0;
+
38  num_bits_ = 0;
+
39 }
+
40 
+
41 } // namespace media
+
42 } // namespace shaka
+
void WriteBits(uint32_t bits, size_t number_of_bits)
Definition: bit_writer.cc:15
+
BitWriter(std::vector< uint8_t > *storage)
Definition: bit_writer.cc:12
+
void Flush()
Write pending bits, and align bitstream with extra zero bits.
Definition: bit_writer.cc:31
+
+ + + + diff --git a/docs/dd/d58/crypto__params_8h_source.html b/docs/dd/d58/crypto__params_8h_source.html index 57863b3cc3..404e826e28 100644 --- a/docs/dd/d58/crypto__params_8h_source.html +++ b/docs/dd/d58/crypto__params_8h_source.html @@ -268,7 +268,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d59/classshaka_1_1media_1_1mp2t_1_1EsParserH265-members.html b/docs/dd/d59/classshaka_1_1media_1_1mp2t_1_1EsParserH265-members.html index 621d0b521d..2deb904511 100644 --- a/docs/dd/d59/classshaka_1_1media_1_1mp2t_1_1EsParserH265-members.html +++ b/docs/dd/d59/classshaka_1_1media_1_1mp2t_1_1EsParserH265-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d59/structshaka_1_1media_1_1mp4_1_1SchemeInfo-members.html b/docs/dd/d59/structshaka_1_1media_1_1mp4_1_1SchemeInfo-members.html index e755010833..a0337438a7 100644 --- a/docs/dd/d59/structshaka_1_1media_1_1mp4_1_1SchemeInfo-members.html +++ b/docs/dd/d59/structshaka_1_1media_1_1mp4_1_1SchemeInfo-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d60/raw__key__source_8h_source.html b/docs/dd/d60/raw__key__source_8h_source.html index 65a7a59790..7c508a4a31 100644 --- a/docs/dd/d60/raw__key__source_8h_source.html +++ b/docs/dd/d60/raw__key__source_8h_source.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d64/structshaka_1_1media_1_1mp4_1_1SyncSample-members.html b/docs/dd/d64/structshaka_1_1media_1_1mp4_1_1SyncSample-members.html index 103559b55f..5d337300ac 100644 --- a/docs/dd/d64/structshaka_1_1media_1_1mp4_1_1SyncSample-members.html +++ b/docs/dd/d64/structshaka_1_1media_1_1mp4_1_1SyncSample-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d65/vp8__parser_8h_source.html b/docs/dd/d65/vp8__parser_8h_source.html index 642067c018..5997ed158a 100644 --- a/docs/dd/d65/vp8__parser_8h_source.html +++ b/docs/dd/d65/vp8__parser_8h_source.html @@ -136,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d67/h264__byte__to__unit__stream__converter_8cc_source.html b/docs/dd/d67/h264__byte__to__unit__stream__converter_8cc_source.html index 58206c6b03..3766fb3863 100644 --- a/docs/dd/d67/h264__byte__to__unit__stream__converter_8cc_source.html +++ b/docs/dd/d67/h264__byte__to__unit__stream__converter_8cc_source.html @@ -188,7 +188,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d6e/classshaka_1_1media_1_1H265VideoSliceHeaderParser-members.html b/docs/dd/d6e/classshaka_1_1media_1_1H265VideoSliceHeaderParser-members.html index 7260a98c75..2d7ae38c1d 100644 --- a/docs/dd/d6e/classshaka_1_1media_1_1H265VideoSliceHeaderParser-members.html +++ b/docs/dd/d6e/classshaka_1_1media_1_1H265VideoSliceHeaderParser-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d71/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio.html b/docs/dd/d71/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio.html index d4e042513b..ce618f1508 100644 --- a/docs/dd/d71/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio.html +++ b/docs/dd/d71/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio.html @@ -176,7 +176,7 @@ Additional Inherited Members diff --git a/docs/dd/d74/classshaka_1_1media_1_1MediaHandlerGraphTestBase-members.html b/docs/dd/d74/classshaka_1_1media_1_1MediaHandlerGraphTestBase-members.html index 64dfeb4485..2df8bbab54 100644 --- a/docs/dd/d74/classshaka_1_1media_1_1MediaHandlerGraphTestBase-members.html +++ b/docs/dd/d74/classshaka_1_1media_1_1MediaHandlerGraphTestBase-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d7a/classshaka_1_1media_1_1MuxerListener.html b/docs/dd/d7a/classshaka_1_1media_1_1MuxerListener.html index 96fa341b0a..f38fcede01 100644 --- a/docs/dd/d7a/classshaka_1_1media_1_1MuxerListener.html +++ b/docs/dd/d7a/classshaka_1_1media_1_1MuxerListener.html @@ -434,7 +434,7 @@ Public Member Functions diff --git a/docs/dd/d80/media__sample_8h_source.html b/docs/dd/d80/media__sample_8h_source.html index 12c9b37836..004f46b0ab 100644 --- a/docs/dd/d80/media__sample_8h_source.html +++ b/docs/dd/d80/media__sample_8h_source.html @@ -264,7 +264,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d87/memory__file_8cc_source.html b/docs/dd/d87/memory__file_8cc_source.html index 6df73a6952..5895c2b2a4 100644 --- a/docs/dd/d87/memory__file_8cc_source.html +++ b/docs/dd/d87/memory__file_8cc_source.html @@ -239,7 +239,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d88/pes__packet__generator_8h_source.html b/docs/dd/d88/pes__packet__generator_8h_source.html index ed5310d62d..72d7d26ddd 100644 --- a/docs/dd/d88/pes__packet__generator_8h_source.html +++ b/docs/dd/d88/pes__packet__generator_8h_source.html @@ -144,28 +144,30 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
73  // This can be used to create a PES from multiple audio samples.
74  std::unique_ptr<PesPacket> current_processing_pes_;
75 
-
76  std::list<std::unique_ptr<PesPacket>> pes_packets_;
-
77 
-
78  DISALLOW_COPY_AND_ASSIGN(PesPacketGenerator);
-
79 };
-
80 
-
81 } // namespace mp2t
-
82 } // namespace media
-
83 } // namespace shaka
-
84 
-
85 #endif // PACKAGER_MEDIA_FORMATS_MP2T_PES_PACKET_GENERATOR_H_
+
76  // Audio stream id PES packet is codec dependent.
+
77  uint8_t audio_stream_id_ = 0;
+
78  std::list<std::unique_ptr<PesPacket>> pes_packets_;
+
79 
+
80  DISALLOW_COPY_AND_ASSIGN(PesPacketGenerator);
+
81 };
+
82 
+
83 } // namespace mp2t
+
84 } // namespace media
+
85 } // namespace shaka
+
86 
+
87 #endif // PACKAGER_MEDIA_FORMATS_MP2T_PES_PACKET_GENERATOR_H_
Abstract class holds stream information.
Definition: stream_info.h:58
-
virtual bool PushSample(const MediaSample &sample)
-
virtual std::unique_ptr< PesPacket > GetNextPesPacket()
- - -
virtual bool Initialize(const StreamInfo &stream)
+
virtual bool PushSample(const MediaSample &sample)
+
virtual std::unique_ptr< PesPacket > GetNextPesPacket()
+ + +
virtual bool Initialize(const StreamInfo &stream)
Class to hold a media sample.
Definition: media_sample.h:22
diff --git a/docs/dd/d8c/file__test__util_8h_source.html b/docs/dd/d8c/file__test__util_8h_source.html index dadffe1897..098d4ebebf 100644 --- a/docs/dd/d8c/file__test__util_8h_source.html +++ b/docs/dd/d8c/file__test__util_8h_source.html @@ -135,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d8d/structshaka_1_1media_1_1mp4_1_1SegmentIndex-members.html b/docs/dd/d8d/structshaka_1_1media_1_1mp4_1_1SegmentIndex-members.html index c8b4675688..98d58960b6 100644 --- a/docs/dd/d8d/structshaka_1_1media_1_1mp4_1_1SegmentIndex-members.html +++ b/docs/dd/d8d/structshaka_1_1media_1_1mp4_1_1SegmentIndex-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d95/classshaka_1_1ThreadedIoFile-members.html b/docs/dd/d95/classshaka_1_1ThreadedIoFile-members.html index b19af14580..3b2fc7e8e1 100644 --- a/docs/dd/d95/classshaka_1_1ThreadedIoFile-members.html +++ b/docs/dd/d95/classshaka_1_1ThreadedIoFile-members.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d98/ts__packet__writer__util_8h_source.html b/docs/dd/d98/ts__packet__writer__util_8h_source.html index ba1415924e..d2a0db368f 100644 --- a/docs/dd/d98/ts__packet__writer__util_8h_source.html +++ b/docs/dd/d98/ts__packet__writer__util_8h_source.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d9a/audio__timestamp__helper_8h_source.html b/docs/dd/d9a/audio__timestamp__helper_8h_source.html index a677ea1a7a..cff58c4daa 100644 --- a/docs/dd/d9a/audio__timestamp__helper_8h_source.html +++ b/docs/dd/d9a/audio__timestamp__helper_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d9b/structshaka_1_1media_1_1mp4_1_1SegmentReference.html b/docs/dd/d9b/structshaka_1_1media_1_1mp4_1_1SegmentReference.html index 495a3b1ce4..9643611de6 100644 --- a/docs/dd/d9b/structshaka_1_1media_1_1mp4_1_1SegmentReference.html +++ b/docs/dd/d9b/structshaka_1_1media_1_1mp4_1_1SegmentReference.html @@ -143,7 +143,7 @@ uint64_t earliest_presenta diff --git a/docs/dd/d9d/classshaka_1_1MpdNotifier-members.html b/docs/dd/d9d/classshaka_1_1MpdNotifier-members.html index 683e7d3953..1bef45b369 100644 --- a/docs/dd/d9d/classshaka_1_1MpdNotifier-members.html +++ b/docs/dd/d9d/classshaka_1_1MpdNotifier-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/da4/structshaka_1_1xml_1_1XmlDeleter.html b/docs/dd/da4/structshaka_1_1xml_1_1XmlDeleter.html index ae0681291b..d85b88d369 100644 --- a/docs/dd/da4/structshaka_1_1xml_1_1XmlDeleter.html +++ b/docs/dd/da4/structshaka_1_1xml_1_1XmlDeleter.html @@ -127,7 +127,7 @@ void operator() (xmlCh diff --git a/docs/dd/da5/classshaka_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter.html b/docs/dd/da5/classshaka_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter.html index c451c36942..d257e16386 100644 --- a/docs/dd/da5/classshaka_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter.html +++ b/docs/dd/da5/classshaka_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter.html @@ -226,7 +226,7 @@ uint64_t duration () c diff --git a/docs/dd/daa/vod__media__info__dump__muxer__listener_8h_source.html b/docs/dd/daa/vod__media__info__dump__muxer__listener_8h_source.html index 186fb27ad2..0dfd619726 100644 --- a/docs/dd/daa/vod__media__info__dump__muxer__listener_8h_source.html +++ b/docs/dd/daa/vod__media__info__dump__muxer__listener_8h_source.html @@ -175,7 +175,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dab/webm__muxer_8h_source.html b/docs/dd/dab/webm__muxer_8h_source.html index 92df08213d..08c6ea049e 100644 --- a/docs/dd/dab/webm__muxer_8h_source.html +++ b/docs/dd/dab/webm__muxer_8h_source.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
43 } // namespace shaka
44 
45 #endif // MEDIA_FORMATS_WEBM_WEBM_MUXER_H_
- +
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
Implements WebM Muxer.
Definition: webm_muxer.h:19
@@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dae/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox-members.html b/docs/dd/dae/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox-members.html index 875af87d57..578121168d 100644 --- a/docs/dd/dae/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox-members.html +++ b/docs/dd/dae/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/db0/classshaka_1_1media_1_1WebMAudioClient-members.html b/docs/dd/db0/classshaka_1_1media_1_1WebMAudioClient-members.html index ebc573f6fb..bce1224d8e 100644 --- a/docs/dd/db0/classshaka_1_1media_1_1WebMAudioClient-members.html +++ b/docs/dd/db0/classshaka_1_1media_1_1WebMAudioClient-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/db3/structshaka_1_1media_1_1mp4_1_1SampleTable-members.html b/docs/dd/db3/structshaka_1_1media_1_1mp4_1_1SampleTable-members.html index fb3da8bfff..8f0ffb9e29 100644 --- a/docs/dd/db3/structshaka_1_1media_1_1mp4_1_1SampleTable-members.html +++ b/docs/dd/db3/structshaka_1_1media_1_1mp4_1_1SampleTable-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/db5/packager_8h_source.html b/docs/dd/db5/packager_8h_source.html index 0883d4f966..c6e9f10cfd 100644 --- a/docs/dd/db5/packager_8h_source.html +++ b/docs/dd/db5/packager_8h_source.html @@ -100,132 +100,137 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
11 #include <string>
12 #include <vector>
13 
-
14 #include "packager/hls/public/hls_params.h"
-
15 #include "packager/file/public/buffer_callback_params.h"
-
16 #include "packager/media/public/chunking_params.h"
-
17 #include "packager/media/public/crypto_params.h"
-
18 #include "packager/media/public/mp4_output_params.h"
-
19 #include "packager/mpd/public/mpd_params.h"
-
20 #include "packager/status.h"
-
21 
-
22 namespace shaka {
-
23 
-
25 struct TestParams {
-
27  bool dump_stream_info = false;
-
30  bool inject_fake_clock = false;
- -
34 };
-
35 
- -
39  std::string temp_dir;
- - -
44 
-
47  bool output_media_info = false;
- - -
52 
- -
55  DecryptionParams decryption_params;
+
14 #include "packager/file/public/buffer_callback_params.h"
+
15 #include "packager/hls/public/hls_params.h"
+
16 #include "packager/media/public/ad_cue_generator_params.h"
+
17 #include "packager/media/public/chunking_params.h"
+
18 #include "packager/media/public/crypto_params.h"
+
19 #include "packager/media/public/mp4_output_params.h"
+
20 #include "packager/mpd/public/mpd_params.h"
+
21 #include "packager/status.h"
+
22 
+
23 namespace shaka {
+
24 
+
26 struct TestParams {
+
28  bool dump_stream_info = false;
+
31  bool inject_fake_clock = false;
+ +
35 };
+
36 
+ +
40  std::string temp_dir;
+ + +
45 
+ +
48 
+
51  bool output_media_info = false;
+ +
56 
- -
59 
-
60  // Parameters for testing. Do not use in production.
-
61  TestParams test_params;
-
62 };
+ +
59  DecryptionParams decryption_params;
+
60 
+
63 
- -
67  std::string input;
-
68 
-
71  std::string stream_selector;
+
64  // Parameters for testing. Do not use in production.
+
65  TestParams test_params;
+
66 };
+
67 
+ +
71  std::string input;
72 
-
75  std::string output;
-
77  std::string segment_template;
-
78 
-
81  std::string output_format;
-
84  bool skip_encryption = false;
-
89  std::string drm_label;
-
93  uint32_t trick_play_factor = 0;
-
97  uint32_t bandwidth = 0;
-
100  std::string language;
-
104  std::string hls_name;
-
107  std::string hls_group_id;
-
110  std::string hls_playlist_name;
-
111 };
-
112 
-
113 class SHAKA_EXPORT Packager {
-
114  public:
-
115  Packager();
-
116  ~Packager();
-
117 
-
122  Status Initialize(
-
123  const PackagingParams& packaging_params,
-
124  const std::vector<StreamDescriptor>& stream_descriptors);
-
125 
-
129  Status Run();
-
130 
-
132  void Cancel();
-
133 
-
135  static std::string GetLibraryVersion();
-
136 
-
156  static std::string DefaultStreamLabelFunction(
-
157  int max_sd_pixels,
-
158  int max_hd_pixels,
-
159  int max_uhd1_pixels,
-
160  const EncryptionParams::EncryptedStreamAttributes& stream_attributes);
-
161 
-
162  private:
-
163  Packager(const Packager&) = delete;
-
164  Packager& operator=(const Packager&) = delete;
+
75  std::string stream_selector;
+
76 
+
79  std::string output;
+
81  std::string segment_template;
+
82 
+
85  std::string output_format;
+
88  bool skip_encryption = false;
+
93  std::string drm_label;
+
97  uint32_t trick_play_factor = 0;
+
101  uint32_t bandwidth = 0;
+
104  std::string language;
+
108  std::string hls_name;
+
111  std::string hls_group_id;
+
114  std::string hls_playlist_name;
+
115 };
+
116 
+
117 class SHAKA_EXPORT Packager {
+
118  public:
+
119  Packager();
+
120  ~Packager();
+
121 
+
126  Status Initialize(
+
127  const PackagingParams& packaging_params,
+
128  const std::vector<StreamDescriptor>& stream_descriptors);
+
129 
+
133  Status Run();
+
134 
+
136  void Cancel();
+
137 
+
139  static std::string GetLibraryVersion();
+
140 
+
160  static std::string DefaultStreamLabelFunction(
+
161  int max_sd_pixels,
+
162  int max_hd_pixels,
+
163  int max_uhd1_pixels,
+
164  const EncryptionParams::EncryptedStreamAttributes& stream_attributes);
165 
-
166  struct PackagerInternal;
-
167  std::unique_ptr<PackagerInternal> internal_;
-
168 };
+
166  private:
+
167  Packager(const Packager&) = delete;
+
168  Packager& operator=(const Packager&) = delete;
169 
-
170 } // namespace shaka
-
171 
-
172 #endif // PACKAGER_PACKAGER_H_
-
std::string stream_selector
Definition: packager.h:71
-
BufferCallbackParams buffer_callback_params
Buffer callback params.
Definition: packager.h:58
+
170  struct PackagerInternal;
+
171  std::unique_ptr<PackagerInternal> internal_;
+
172 };
+
173 
+
174 } // namespace shaka
+
175 
+
176 #endif // PACKAGER_PACKAGER_H_
+
std::string stream_selector
Definition: packager.h:75
+
BufferCallbackParams buffer_callback_params
Buffer callback params.
Definition: packager.h:62
DASH MPD related parameters.
Definition: mpd_params.h:16
-
Defines a single input/output stream.
Definition: packager.h:65
-
std::string input
Input/source media file path or network stream URL. Required.
Definition: packager.h:67
-
HlsParams hls_params
HLS related parameters.
Definition: packager.h:51
-
ChunkingParams chunking_params
Chunking (segmentation) related parameters.
Definition: packager.h:43
-
std::string hls_playlist_name
Definition: packager.h:110
+
Defines a single input/output stream.
Definition: packager.h:69
+
std::string input
Input/source media file path or network stream URL. Required.
Definition: packager.h:71
+
HlsParams hls_params
HLS related parameters.
Definition: packager.h:55
+
ChunkingParams chunking_params
Chunking (segmentation) related parameters.
Definition: packager.h:44
+
std::string hls_playlist_name
Definition: packager.h:114
HLS related parameters.
Definition: hls_params.h:23
-
std::string hls_name
Definition: packager.h:104
-
std::string segment_template
Specifies segment template. Can be empty.
Definition: packager.h:77
-
bool inject_fake_clock
Definition: packager.h:30
-
Parameters used for testing.
Definition: packager.h:25
-
std::string output_format
Definition: packager.h:81
-
bool dump_stream_info
Whether to dump input stream info.
Definition: packager.h:27
+
std::string hls_name
Definition: packager.h:108
+
std::string segment_template
Specifies segment template. Can be empty.
Definition: packager.h:81
+
bool inject_fake_clock
Definition: packager.h:31
+
Parameters used for testing.
Definition: packager.h:26
+
std::string output_format
Definition: packager.h:85
+
bool dump_stream_info
Whether to dump input stream info.
Definition: packager.h:28
-
std::string injected_library_version
Definition: packager.h:33
-
MpdParams mpd_params
DASH MPD related parameters.
Definition: packager.h:49
-
std::string drm_label
Definition: packager.h:89
+
std::string injected_library_version
Definition: packager.h:34
+
MpdParams mpd_params
DASH MPD related parameters.
Definition: packager.h:53
+
std::string drm_label
Definition: packager.h:93
MP4 (ISO-BMFF) output related parameters.
- -
std::string temp_dir
Specify temporary directory for intermediate temporary files.
Definition: packager.h:39
-
Mp4OutputParams mp4_output_params
MP4 (ISO-BMFF) output related parameters.
Definition: packager.h:41
-
EncryptionParams encryption_params
Encryption and Decryption Parameters.
Definition: packager.h:54
-
uint32_t trick_play_factor
Definition: packager.h:93
+ +
AdCueGeneratorParams ad_cue_generator_params
Out of band cuepoint parameters.
Definition: packager.h:47
+
std::string temp_dir
Specify temporary directory for intermediate temporary files.
Definition: packager.h:40
+
Cuepoint generator related parameters.
+
Mp4OutputParams mp4_output_params
MP4 (ISO-BMFF) output related parameters.
Definition: packager.h:42
+
EncryptionParams encryption_params
Encryption and Decryption Parameters.
Definition: packager.h:58
+
uint32_t trick_play_factor
Definition: packager.h:97
Chunking (segmentation) related parameters.
-
std::string output
Definition: packager.h:75
+
std::string output
Definition: packager.h:79
Decryption parameters.
- +
Encryption parameters.
Encrypted stream information that is used to determine stream label.
- -
Packaging parameters.
Definition: packager.h:37
+ +
Packaging parameters.
Definition: packager.h:38
Buffer callback params.
- -
std::string language
Definition: packager.h:100
-
std::string hls_group_id
Definition: packager.h:107
+ +
std::string language
Definition: packager.h:104
+
std::string hls_group_id
Definition: packager.h:111
diff --git a/docs/dd/db9/classshaka_1_1xml_1_1RepresentationBaseXmlNode.html b/docs/dd/db9/classshaka_1_1xml_1_1RepresentationBaseXmlNode.html index df9fbaffc9..63b6178b87 100644 --- a/docs/dd/db9/classshaka_1_1xml_1_1RepresentationBaseXmlNode.html +++ b/docs/dd/db9/classshaka_1_1xml_1_1RepresentationBaseXmlNode.html @@ -231,7 +231,7 @@ Protected Member Functions diff --git a/docs/dd/dbc/buffer__reader_8cc_source.html b/docs/dd/dbc/buffer__reader_8cc_source.html index 2de0e6ce38..c09983b89d 100644 --- a/docs/dd/dbc/buffer__reader_8cc_source.html +++ b/docs/dd/dbc/buffer__reader_8cc_source.html @@ -196,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dbc/encryption__handler_8h_source.html b/docs/dd/dbc/encryption__handler_8h_source.html index 4eaf9398f9..7932930d2c 100644 --- a/docs/dd/dbc/encryption__handler_8h_source.html +++ b/docs/dd/dbc/encryption__handler_8h_source.html @@ -146,56 +146,70 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
60  size_t source_size,
61  uint8_t* dest,
62  DecryptConfig* decrypt_config);
-
63  // Encrypt an array with size |source_size|. |dest| should have at
-
64  // least |source_size| bytes.
-
65  void EncryptBytes(const uint8_t* source, size_t source_size, uint8_t* dest);
-
66 
-
67  // Testing injections.
-
68  void InjectVpxParserForTesting(std::unique_ptr<VPxParser> vpx_parser);
-
69  void InjectVideoSliceHeaderParserForTesting(
-
70  std::unique_ptr<VideoSliceHeaderParser> header_parser);
+
63  // Encrypt an E-AC3 frame with size |source_size| according to SAMPLE-AES
+
64  // specification. |dest| should have at least |source_size| bytes.
+
65  bool SampleAesEncryptEac3Frame(const uint8_t* source,
+
66  size_t source_size,
+
67  uint8_t* dest);
+
68  // Encrypt an array with size |source_size|. |dest| should have at
+
69  // least |source_size| bytes.
+
70  void EncryptBytes(const uint8_t* source, size_t source_size, uint8_t* dest);
71 
-
72  const EncryptionParams encryption_params_;
-
73  const FourCC protection_scheme_ = FOURCC_NULL;
-
74  KeySource* key_source_ = nullptr;
-
75  std::string stream_label_;
-
76  // Current encryption config and encryptor.
-
77  std::shared_ptr<EncryptionConfig> encryption_config_;
-
78  std::unique_ptr<AesCryptor> encryptor_;
-
79  Codec codec_ = kUnknownCodec;
-
80  // Specifies the size of NAL unit length in bytes. Can be 1, 2 or 4 bytes. 0
-
81  // if it is not a NAL structured video.
-
82  uint8_t nalu_length_size_ = 0;
-
83  // For Sample AES, 32 bytes for Video and 16 bytes for audio.
-
84  size_t leading_clear_bytes_size_ = 0;
-
85  // For Sample AES, 48+1 bytes for video NAL and 16+1 bytes for audio.
-
86  size_t min_protected_data_size_ = 0;
-
87  // Remaining clear lead in the stream's time scale.
-
88  int64_t remaining_clear_lead_ = 0;
-
89  // Crypto period duration in the stream's time scale.
-
90  uint64_t crypto_period_duration_ = 0;
-
91  // Previous crypto period index if key rotation is enabled.
-
92  int64_t prev_crypto_period_index_ = -1;
-
93  bool check_new_crypto_period_ = false;
-
94 
-
95  // Number of encrypted blocks (16-byte-block) in pattern based encryption.
-
96  uint8_t crypt_byte_block_ = 0;
-
98  uint8_t skip_byte_block_ = 0;
-
99 
-
100  // VPx parser for VPx streams.
-
101  std::unique_ptr<VPxParser> vpx_parser_;
-
102  // Video slice header parser for NAL strucutred streams.
-
103  std::unique_ptr<VideoSliceHeaderParser> header_parser_;
-
104 };
-
105 
-
106 } // namespace media
-
107 } // namespace shaka
+
72  // An E-AC3 frame comprises of one or more syncframes. This function extracts
+
73  // the syncframe sizes from the source bytes.
+
74  // Returns false if the frame is not well formed.
+
75  bool ExtractEac3SyncframeSizes(const uint8_t* source,
+
76  size_t source_size,
+
77  std::vector<size_t>* syncframe_sizes);
+
78 
+
79  // Testing injections.
+
80  void InjectVpxParserForTesting(std::unique_ptr<VPxParser> vpx_parser);
+
81  void InjectVideoSliceHeaderParserForTesting(
+
82  std::unique_ptr<VideoSliceHeaderParser> header_parser);
+
83 
+
84  const EncryptionParams encryption_params_;
+
85  const FourCC protection_scheme_ = FOURCC_NULL;
+
86  KeySource* key_source_ = nullptr;
+
87  std::string stream_label_;
+
88  // Current encryption config and encryptor.
+
89  std::shared_ptr<EncryptionConfig> encryption_config_;
+
90  std::unique_ptr<AesCryptor> encryptor_;
+
91  Codec codec_ = kUnknownCodec;
+
92  // Specifies the size of NAL unit length in bytes. Can be 1, 2 or 4 bytes. 0
+
93  // if it is not a NAL structured video.
+
94  uint8_t nalu_length_size_ = 0;
+
95  // For Sample AES, 32 bytes for Video and 16 bytes for audio.
+
96  size_t leading_clear_bytes_size_ = 0;
+
97  // For Sample AES, if the data size is less than this value, none of the bytes
+
98  // are encrypted. The size is 48+1 bytes for video NAL and 16+15 bytes for
+
99  // audio according to MPEG-2 Stream Encryption Format for HTTP Live Streaming.
+
100  size_t min_protected_data_size_ = 0;
+
101  // Remaining clear lead in the stream's time scale.
+
102  int64_t remaining_clear_lead_ = 0;
+
103  // Crypto period duration in the stream's time scale.
+
104  uint64_t crypto_period_duration_ = 0;
+
105  // Previous crypto period index if key rotation is enabled.
+
106  int64_t prev_crypto_period_index_ = -1;
+
107  bool check_new_crypto_period_ = false;
108 
-
109 #endif // PACKAGER_MEDIA_CRYPTO_ENCRYPTION_HANDLER_H_
+
109  // Number of encrypted blocks (16-byte-block) in pattern based encryption.
+
110  uint8_t crypt_byte_block_ = 0;
+
112  uint8_t skip_byte_block_ = 0;
+
113 
+
114  // VPx parser for VPx streams.
+
115  std::unique_ptr<VPxParser> vpx_parser_;
+
116  // Video slice header parser for NAL strucutred streams.
+
117  std::unique_ptr<VideoSliceHeaderParser> header_parser_;
+
118 };
+
119 
+
120 } // namespace media
+
121 } // namespace shaka
+
122 
+
123 #endif // PACKAGER_MEDIA_CRYPTO_ENCRYPTION_HANDLER_H_
Abstract class holds stream information.
Definition: stream_info.h:58
- +
Status Process(std::unique_ptr< StreamData > stream_data) override
@@ -205,7 +219,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dbd/structshaka_1_1media_1_1EncryptionKey.html b/docs/dd/dbd/structshaka_1_1media_1_1EncryptionKey.html index 08070e5b7c..609a9a333f 100644 --- a/docs/dd/dbd/structshaka_1_1media_1_1EncryptionKey.html +++ b/docs/dd/dbd/structshaka_1_1media_1_1EncryptionKey.html @@ -120,7 +120,7 @@ std::vector< uint8_t >  diff --git a/docs/dd/dbd/structshaka_1_1media_1_1mp4_1_1TrackEncryption-members.html b/docs/dd/dbd/structshaka_1_1media_1_1mp4_1_1TrackEncryption-members.html index 056505f03c..5dcaccdd9b 100644 --- a/docs/dd/dbd/structshaka_1_1media_1_1mp4_1_1TrackEncryption-members.html +++ b/docs/dd/dbd/structshaka_1_1media_1_1mp4_1_1TrackEncryption-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dbf/webm__webvtt__parser_8h_source.html b/docs/dd/dbf/webm__webvtt__parser_8h_source.html index 69ce3fc9e0..6397697b22 100644 --- a/docs/dd/dbf/webm__webvtt__parser_8h_source.html +++ b/docs/dd/dbf/webm__webvtt__parser_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dc1/structshaka_1_1media_1_1mp4_1_1FullBox.html b/docs/dd/dc1/structshaka_1_1media_1_1mp4_1_1FullBox.html index 912ad4001e..59326794ff 100644 --- a/docs/dd/dc1/structshaka_1_1media_1_1mp4_1_1FullBox.html +++ b/docs/dd/dc1/structshaka_1_1media_1_1mp4_1_1FullBox.html @@ -245,7 +245,7 @@ Protected Member Functions diff --git a/docs/dd/dc4/classshaka_1_1media_1_1ProducerConsumerQueue-members.html b/docs/dd/dc4/classshaka_1_1media_1_1ProducerConsumerQueue-members.html index f22402dc29..77a29bfdd1 100644 --- a/docs/dd/dc4/classshaka_1_1media_1_1ProducerConsumerQueue-members.html +++ b/docs/dd/dc4/classshaka_1_1media_1_1ProducerConsumerQueue-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html b/docs/dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html index 014d4bdf89..fa80330912 100644 --- a/docs/dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html +++ b/docs/dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html @@ -378,7 +378,7 @@ virtual Status&# diff --git a/docs/dd/dca/structshaka_1_1media_1_1mp4_1_1OriginalFormat-members.html b/docs/dd/dca/structshaka_1_1media_1_1mp4_1_1OriginalFormat-members.html index c79b3a2881..c6ee03e660 100644 --- a/docs/dd/dca/structshaka_1_1media_1_1mp4_1_1OriginalFormat-members.html +++ b/docs/dd/dca/structshaka_1_1media_1_1mp4_1_1OriginalFormat-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dce/structshaka_1_1media_1_1Cue.html b/docs/dd/dce/structshaka_1_1media_1_1Cue.html index 3951825f24..589b8f7fff 100644 --- a/docs/dd/dce/structshaka_1_1media_1_1Cue.html +++ b/docs/dd/dce/structshaka_1_1media_1_1Cue.html @@ -125,7 +125,7 @@ std::string comment diff --git a/docs/dd/dd2/buffer__writer_8h_source.html b/docs/dd/dd2/buffer__writer_8h_source.html index d262eee91d..fb569adbfb 100644 --- a/docs/dd/dd2/buffer__writer_8h_source.html +++ b/docs/dd/dd2/buffer__writer_8h_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dd3/buffer__writer_8cc_source.html b/docs/dd/dd3/buffer__writer_8cc_source.html index 0f3e7d7369..b73e81286f 100644 --- a/docs/dd/dd3/buffer__writer_8cc_source.html +++ b/docs/dd/dd3/buffer__writer_8cc_source.html @@ -187,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dd6/classshaka_1_1media_1_1WebMVideoClient-members.html b/docs/dd/dd6/classshaka_1_1media_1_1WebMVideoClient-members.html index b1b2799b08..81e155293f 100644 --- a/docs/dd/dd6/classshaka_1_1media_1_1WebMVideoClient-members.html +++ b/docs/dd/dd6/classshaka_1_1media_1_1WebMVideoClient-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dd8/mock__muxer__listener_8cc_source.html b/docs/dd/dd8/mock__muxer__listener_8cc_source.html index f12f0cd124..1aee5be5d5 100644 --- a/docs/dd/dd8/mock__muxer__listener_8cc_source.html +++ b/docs/dd/dd8/mock__muxer__listener_8cc_source.html @@ -131,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dd9/structshaka_1_1media_1_1mp4_1_1Box-members.html b/docs/dd/dd9/structshaka_1_1media_1_1mp4_1_1Box-members.html index de4bcbf3af..2db6830207 100644 --- a/docs/dd/dd9/structshaka_1_1media_1_1mp4_1_1Box-members.html +++ b/docs/dd/dd9/structshaka_1_1media_1_1mp4_1_1Box-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/ddc/trick__play__handler_8h_source.html b/docs/dd/ddc/trick__play__handler_8h_source.html index fcb9e1999c..c0af1074c5 100644 --- a/docs/dd/ddc/trick__play__handler_8h_source.html +++ b/docs/dd/ddc/trick__play__handler_8h_source.html @@ -160,13 +160,13 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
74 #endif // PACKAGER_MEDIA_BASE_TRICK_PLAY_HANDLER_H_
Abstract class holds stream information.
Definition: stream_info.h:58
- +
Class to hold a media sample.
Definition: media_sample.h:22
diff --git a/docs/dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html b/docs/dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html index 0eab7f7183..116e6864df 100644 --- a/docs/dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html +++ b/docs/dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html @@ -150,7 +150,7 @@ virtual int64_t  diff --git a/docs/dd/de7/structshaka_1_1media_1_1H265Pps-members.html b/docs/dd/de7/structshaka_1_1media_1_1H265Pps-members.html index 747a166252..b52de3c9f4 100644 --- a/docs/dd/de7/structshaka_1_1media_1_1H265Pps-members.html +++ b/docs/dd/de7/structshaka_1_1media_1_1H265Pps-members.html @@ -137,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/de7/xml__node_8h_source.html b/docs/dd/de7/xml__node_8h_source.html index dd2aa8fd21..2b747bfe8e 100644 --- a/docs/dd/de7/xml__node_8h_source.html +++ b/docs/dd/de7/xml__node_8h_source.html @@ -239,7 +239,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/de9/classshaka_1_1media_1_1MediaHandler-members.html b/docs/dd/de9/classshaka_1_1media_1_1MediaHandler-members.html index fc06b366c3..a7171920f6 100644 --- a/docs/dd/de9/classshaka_1_1media_1_1MediaHandler-members.html +++ b/docs/dd/de9/classshaka_1_1media_1_1MediaHandler-members.html @@ -95,9 +95,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - + - + @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline
Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected
DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected
DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected
DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected
DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected
DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected
DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected
DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected
DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected
diff --git a/docs/dd/de9/structshaka_1_1ChunkingParams-members.html b/docs/dd/de9/structshaka_1_1ChunkingParams-members.html index b5d00bfad1..6c51708e9e 100644 --- a/docs/dd/de9/structshaka_1_1ChunkingParams-members.html +++ b/docs/dd/de9/structshaka_1_1ChunkingParams-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dee/box__definitions_8cc_source.html b/docs/dd/dee/box__definitions_8cc_source.html index 3debb471ae..e332658139 100644 --- a/docs/dd/dee/box__definitions_8cc_source.html +++ b/docs/dd/dee/box__definitions_8cc_source.html @@ -2968,7 +2968,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/df2/webm_2multi__segment__segmenter_8h_source.html b/docs/dd/df2/webm_2multi__segment__segmenter_8h_source.html index 3a72154954..f4782a3813 100644 --- a/docs/dd/df2/webm_2multi__segment__segmenter_8h_source.html +++ b/docs/dd/df2/webm_2multi__segment__segmenter_8h_source.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/df5/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun.html b/docs/dd/df5/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun.html index 65d9b83825..3e07692b92 100644 --- a/docs/dd/df5/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun.html +++ b/docs/dd/df5/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun.html @@ -212,7 +212,7 @@ Additional Inherited Members diff --git a/docs/dd/df6/structshaka_1_1media_1_1mp4_1_1Metadata.html b/docs/dd/df6/structshaka_1_1media_1_1mp4_1_1Metadata.html index 16da29dc24..50c92ce069 100644 --- a/docs/dd/df6/structshaka_1_1media_1_1mp4_1_1Metadata.html +++ b/docs/dd/df6/structshaka_1_1media_1_1mp4_1_1Metadata.html @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/dd/dfd/structshaka_1_1AdCueGeneratorParams.html b/docs/dd/dfd/structshaka_1_1AdCueGeneratorParams.html new file mode 100644 index 0000000000..ce478dea9a --- /dev/null +++ b/docs/dd/dfd/structshaka_1_1AdCueGeneratorParams.html @@ -0,0 +1,124 @@ + + + + + + +Shaka Packager SDK: shaka::AdCueGeneratorParams Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
shaka::AdCueGeneratorParams Struct Reference
+
+
+ +

Cuepoint generator related parameters. + More...

+ +

#include <ad_cue_generator_params.h>

+ + + + + +

+Public Attributes

+std::vector< Cuepointcue_points
 List of cuepoints.
 
+

Detailed Description

+

Cuepoint generator related parameters.

+ +

Definition at line 23 of file ad_cue_generator_params.h.

+

The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/de/d00/ac3__header_8h_source.html b/docs/de/d00/ac3__header_8h_source.html new file mode 100644 index 0000000000..27c10b992d --- /dev/null +++ b/docs/de/d00/ac3__header_8h_source.html @@ -0,0 +1,162 @@ + + + + + + +Shaka Packager SDK: packager/media/formats/mp2t/ac3_header.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
ac3_header.h
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #ifndef PACKAGER_MEDIA_FORMATS_MP2T_AC3_HEADER_H_
+
8 #define PACKAGER_MEDIA_FORMATS_MP2T_AC3_HEADER_H_
+
9 
+
10 #include <stdint.h>
+
11 
+
12 #include <vector>
+
13 
+
14 #include "packager/media/formats/mp2t/audio_header.h"
+
15 
+
16 namespace shaka {
+
17 namespace media {
+
18 namespace mp2t {
+
19 
+
22 class Ac3Header : public AudioHeader {
+
23  public:
+
24  Ac3Header() = default;
+
25  ~Ac3Header() override = default;
+
26 
+
29  bool IsSyncWord(const uint8_t* buf) const override;
+
30  size_t GetMinFrameSize() const override;
+
31  size_t GetSamplesPerFrame() const override;
+
32  bool Parse(const uint8_t* adts_frame, size_t adts_frame_size) override;
+
33  size_t GetHeaderSize() const override;
+
34  size_t GetFrameSize() const override;
+
35  void GetAudioSpecificConfig(std::vector<uint8_t>* buffer) const override;
+
36  uint8_t GetObjectType() const override;
+
37  uint32_t GetSamplingFrequency() const override;
+
38  uint8_t GetNumChannels() const override;
+
40 
+
41  private:
+
42  Ac3Header(const Ac3Header&) = delete;
+
43  Ac3Header& operator=(const Ac3Header&) = delete;
+
44 
+
45  uint8_t fscod_ = 0; // Sample rate code
+
46  uint8_t frmsizecod_ = 0; // Frame size code
+
47  uint8_t bsid_ = 0; // Bit stream identification
+
48  uint8_t bsmod_ = 0; // Bit stream mode
+
49  uint8_t acmod_ = 0; // Audio coding mode
+
50  uint8_t lfeon_ = 0; // Low frequency effects channel on
+
51 };
+
52 
+
53 } // namespace mp2t
+
54 } // namespace media
+
55 } // namespace shaka
+
56 
+
57 #endif // PACKAGER_MEDIA_FORMATS_MP2T_AC3_HEADER_H_
+
size_t GetHeaderSize() const override
Definition: ac3_header.cc:99
+
bool IsSyncWord(const uint8_t *buf) const override
Definition: ac3_header.cc:44
+ +
size_t GetMinFrameSize() const override
Definition: ac3_header.cc:50
+
uint32_t GetSamplingFrequency() const override
Definition: ac3_header.cc:131
+
size_t GetFrameSize() const override
Definition: ac3_header.cc:105
+
uint8_t GetObjectType() const override
Definition: ac3_header.cc:126
+
bool Parse(const uint8_t *adts_frame, size_t adts_frame_size) override
Definition: ac3_header.cc:63
+ +
size_t GetSamplesPerFrame() const override
Definition: ac3_header.cc:56
+
uint8_t GetNumChannels() const override
Definition: ac3_header.cc:136
+
void GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const override
Definition: ac3_header.cc:111
+
+ + + + diff --git a/docs/de/d0f/local__file_8h_source.html b/docs/de/d0f/local__file_8h_source.html index 417e0792e1..b1c31f397d 100644 --- a/docs/de/d0f/local__file_8h_source.html +++ b/docs/de/d0f/local__file_8h_source.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d12/container__names_8h_source.html b/docs/de/d12/container__names_8h_source.html index 51f5f941b8..94cd64e8e7 100644 --- a/docs/de/d12/container__names_8h_source.html +++ b/docs/de/d12/container__names_8h_source.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d13/ts__writer_8cc_source.html b/docs/de/d13/ts__writer_8cc_source.html index 1b93e2140f..6e8f27a580 100644 --- a/docs/de/d13/ts__writer_8cc_source.html +++ b/docs/de/d13/ts__writer_8cc_source.html @@ -98,10 +98,10 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
9 #include <algorithm>
10 
11 #include "packager/base/logging.h"
-
12 #include "packager/media/base/audio_stream_info.h"
-
13 #include "packager/media/base/buffer_writer.h"
-
14 #include "packager/media/base/stream_info.h"
-
15 #include "packager/media/base/video_stream_info.h"
+
12 #include "packager/media/base/buffer_writer.h"
+
13 #include "packager/media/base/media_sample.h"
+
14 #include "packager/media/formats/mp2t/pes_packet.h"
+
15 #include "packager/media/formats/mp2t/program_map_table_writer.h"
16 #include "packager/media/formats/mp2t/ts_packet_writer_util.h"
17 
18 namespace shaka {
@@ -247,120 +247,76 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
158 
159 } // namespace
160 
-
161 TsWriter::TsWriter() {}
-
162 TsWriter::~TsWriter() {}
+
161 TsWriter::TsWriter(std::unique_ptr<ProgramMapTableWriter> pmt_writer)
+
162  : pmt_writer_(std::move(pmt_writer)) {}
163 
-
164 bool TsWriter::Initialize(const StreamInfo& stream_info) {
-
165  const StreamType stream_type = stream_info.stream_type();
-
166  if (stream_type != StreamType::kStreamVideo &&
-
167  stream_type != StreamType::kStreamAudio) {
-
168  LOG(ERROR) << "TsWriter cannot handle stream type " << stream_type
-
169  << " yet.";
-
170  return false;
-
171  }
-
172 
-
173  if (stream_info.stream_type() == StreamType::kStreamVideo) {
-
174  const VideoStreamInfo& video_stream_info =
-
175  static_cast<const VideoStreamInfo&>(stream_info);
-
176  if (video_stream_info.codec() != Codec::kCodecH264) {
-
177  LOG(ERROR) << "TsWriter cannot handle video codec "
-
178  << video_stream_info.codec() << " yet.";
-
179  return false;
-
180  }
-
181  pmt_writer_.reset(new H264ProgramMapTableWriter(&pmt_continuity_counter_));
-
182  } else {
-
183  DCHECK_EQ(stream_type, StreamType::kStreamAudio);
-
184  const AudioStreamInfo& audio_stream_info =
-
185  static_cast<const AudioStreamInfo&>(stream_info);
-
186  if (audio_stream_info.codec() != Codec::kCodecAAC) {
-
187  LOG(ERROR) << "TsWriter cannot handle audio codec "
-
188  << audio_stream_info.codec() << " yet.";
-
189  return false;
-
190  }
-
191  pmt_writer_.reset(new AacProgramMapTableWriter(
-
192  audio_stream_info.codec_config(), &pmt_continuity_counter_));
-
193  }
-
194 
-
195  return true;
-
196 }
-
197 
-
198 bool TsWriter::NewSegment(const std::string& file_name) {
-
199  if (current_file_) {
-
200  LOG(ERROR) << "File " << current_file_->file_name() << " still open.";
-
201  return false;
-
202  }
-
203  current_file_.reset(File::Open(file_name.c_str(), "w"));
-
204  if (!current_file_) {
-
205  LOG(ERROR) << "Failed to open file " << file_name;
-
206  return false;
-
207  }
-
208 
-
209  BufferWriter psi;
-
210  WritePatToBuffer(kPat, arraysize(kPat), &pat_continuity_counter_, &psi);
-
211  if (encrypted_) {
-
212  if (!pmt_writer_->EncryptedSegmentPmt(&psi)) {
-
213  return false;
-
214  }
-
215  } else {
-
216  if (!pmt_writer_->ClearSegmentPmt(&psi)) {
-
217  return false;
-
218  }
-
219  }
-
220 
-
221  if (!psi.WriteToFile(current_file_.get()).ok()) {
-
222  LOG(ERROR) << "Failed to write PSI to file.";
-
223  return false;
-
224  }
-
225 
-
226  return true;
-
227 }
-
228 
- -
230  encrypted_ = true;
-
231 }
-
232 
- -
234  return current_file_.release()->Close();
-
235 }
-
236 
-
237 bool TsWriter::AddPesPacket(std::unique_ptr<PesPacket> pes_packet) {
-
238  DCHECK(current_file_);
-
239  if (!WritePesToFile(*pes_packet, &elementary_stream_continuity_counter_,
-
240  current_file_.get())) {
-
241  LOG(ERROR) << "Failed to write pes to file.";
-
242  return false;
-
243  }
-
244 
-
245  // No need to keep pes_packet around so not passing it anywhere.
-
246  return true;
-
247 }
-
248 
- -
250  std::unique_ptr<ProgramMapTableWriter> table_writer) {
-
251  pmt_writer_ = std::move(table_writer);
-
252 }
-
253 
-
254 } // namespace mp2t
-
255 } // namespace media
-
256 } // namespace shaka
-
Abstract class holds stream information.
Definition: stream_info.h:58
- -
virtual bool NewSegment(const std::string &file_name)
Definition: ts_writer.cc:198
-
virtual bool AddPesPacket(std::unique_ptr< PesPacket > pes_packet)
Definition: ts_writer.cc:237
+
164 TsWriter::~TsWriter() {}
+
165 
+
166 bool TsWriter::NewSegment(const std::string& file_name) {
+
167  if (current_file_) {
+
168  LOG(ERROR) << "File " << current_file_->file_name() << " still open.";
+
169  return false;
+
170  }
+
171  current_file_.reset(File::Open(file_name.c_str(), "w"));
+
172  if (!current_file_) {
+
173  LOG(ERROR) << "Failed to open file " << file_name;
+
174  return false;
+
175  }
+
176 
+
177  BufferWriter psi;
+
178  WritePatToBuffer(kPat, arraysize(kPat), &pat_continuity_counter_, &psi);
+
179  if (encrypted_) {
+
180  if (!pmt_writer_->EncryptedSegmentPmt(&psi)) {
+
181  return false;
+
182  }
+
183  } else {
+
184  if (!pmt_writer_->ClearSegmentPmt(&psi)) {
+
185  return false;
+
186  }
+
187  }
+
188 
+
189  if (!psi.WriteToFile(current_file_.get()).ok()) {
+
190  LOG(ERROR) << "Failed to write PSI to file.";
+
191  return false;
+
192  }
+
193 
+
194  return true;
+
195 }
+
196 
+ +
198  encrypted_ = true;
+
199 }
+
200 
+ +
202  return current_file_.release()->Close();
+
203 }
+
204 
+
205 bool TsWriter::AddPesPacket(std::unique_ptr<PesPacket> pes_packet) {
+
206  DCHECK(current_file_);
+
207  if (!WritePesToFile(*pes_packet, &elementary_stream_continuity_counter_,
+
208  current_file_.get())) {
+
209  LOG(ERROR) << "Failed to write pes to file.";
+
210  return false;
+
211  }
+
212 
+
213  // No need to keep pes_packet around so not passing it anywhere.
+
214  return true;
+
215 }
+
216 
+
217 } // namespace mp2t
+
218 } // namespace media
+
219 } // namespace shaka
+
virtual bool NewSegment(const std::string &file_name)
Definition: ts_writer.cc:166
+
virtual bool AddPesPacket(std::unique_ptr< PesPacket > pes_packet)
Definition: ts_writer.cc:205
- -
void SetProgramMapTableWriterForTesting(std::unique_ptr< ProgramMapTableWriter > table_writer)
Only for testing.
Definition: ts_writer.cc:249
-
virtual bool FinalizeSegment()
Definition: ts_writer.cc:233
+
virtual bool FinalizeSegment()
Definition: ts_writer.cc:201
virtual bool Open()=0
Internal open. Should not be used directly.
-
virtual bool Initialize(const StreamInfo &stream_info)
Definition: ts_writer.cc:164
-
Holds video stream information.
-
Holds audio stream information.
Status WriteToFile(File *file)
-
virtual void SignalEncrypted()
Signals the writer that the rest of the segments are encrypted.
Definition: ts_writer.cc:229
+
virtual void SignalEncrypted()
Signals the writer that the rest of the segments are encrypted.
Definition: ts_writer.cc:197
diff --git a/docs/de/d16/classshaka_1_1media_1_1TextTrackConfig-members.html b/docs/de/d16/classshaka_1_1media_1_1TextTrackConfig-members.html index 6b08f91e12..2376b2285c 100644 --- a/docs/de/d16/classshaka_1_1media_1_1TextTrackConfig-members.html +++ b/docs/de/d16/classshaka_1_1media_1_1TextTrackConfig-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d17/cluster__builder_8cc_source.html b/docs/de/d17/cluster__builder_8cc_source.html index e1c5bc10de..6bce6c3211 100644 --- a/docs/de/d17/cluster__builder_8cc_source.html +++ b/docs/de/d17/cluster__builder_8cc_source.html @@ -346,7 +346,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d1a/classshaka_1_1media_1_1wvm_1_1WvmMediaParser-members.html b/docs/de/d1a/classshaka_1_1media_1_1wvm_1_1WvmMediaParser-members.html index 583a5a6418..fbdd01486f 100644 --- a/docs/de/d1a/classshaka_1_1media_1_1wvm_1_1WvmMediaParser-members.html +++ b/docs/de/d1a/classshaka_1_1media_1_1wvm_1_1WvmMediaParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d1e/mp4_2single__segment__segmenter_8cc_source.html b/docs/de/d1e/mp4_2single__segment__segmenter_8cc_source.html index a708a754c4..9525f8c69e 100644 --- a/docs/de/d1e/mp4_2single__segment__segmenter_8cc_source.html +++ b/docs/de/d1e/mp4_2single__segment__segmenter_8cc_source.html @@ -337,7 +337,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d22/aes__pattern__cryptor_8cc_source.html b/docs/de/d22/aes__pattern__cryptor_8cc_source.html index e8a4d28404..1abfa33290 100644 --- a/docs/de/d22/aes__pattern__cryptor_8cc_source.html +++ b/docs/de/d22/aes__pattern__cryptor_8cc_source.html @@ -185,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.png b/docs/de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.png deleted file mode 100644 index 2c0fe3cc902ba842d0c26c16de622f82e2bff16e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1147 zcmeAS@N?(olHy`uVBq!ia0y~yU{nIK12~w0WY^!0UqDJCz$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opJBvRQ`9r zXVxqGf!%ZII+MGuZ|8dECVen`us`Sawx!#0Z-*sKUNS}H?9>hw%@CzYO9DDQCON4p zd2)#=YfU=0{=cecuF#k1W@-%NUn>~{k9WZrsSQK>++oYu;g5-rX3gu^)fU13C-u>*!rl{NuKx|3uY`S{;*%p6DDP|AY`Mrx)3dp$%=Tn&<97Y2 zH!tc;ekHCDED1Thq= zDm4TEZ4Xgm;+WdO;8faSvwrp$xwPri&UYW2u~+Wf!rDduvXj56A6U97_rKrXiGRLi zhB_O)_rFueA?UC~d4k}?nHB+C)f=jw%XKu?Nru(o8zkwi!JRg-fobdEtbi~cIu04 z{Sqn9naCc0=}8tjWkMXHOcTg#pW{Jv=3^U+QE%q!hXTHCX)>#jck z?8f9b`CC@5R{ZqPExY;J-HsFYGLjcE) -Shaka Packager SDK: packager/media/formats/mp2t/es_parser_adts.cc Source File +Shaka Packager SDK: packager/media/formats/mp2t/es_parser_audio.cc Source File @@ -84,14 +84,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
-
es_parser_adts.cc
+
es_parser_audio.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
-
5 #include "packager/media/formats/mp2t/es_parser_adts.h"
+
5 #include "packager/media/formats/mp2t/es_parser_audio.h"
6 
7 #include <stdint.h>
8 
@@ -104,267 +104,254 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
15 #include "packager/media/base/bit_reader.h"
16 #include "packager/media/base/media_sample.h"
17 #include "packager/media/base/timestamp.h"
-
18 #include "packager/media/formats/mp2t/adts_header.h"
-
19 #include "packager/media/formats/mp2t/mp2t_common.h"
-
20 #include "packager/media/formats/mpeg/adts_constants.h"
-
21 
-
22 namespace shaka {
-
23 namespace media {
-
24 
-
25 // Return true if buf corresponds to an ADTS syncword.
-
26 // |buf| size must be at least 2.
-
27 static bool isAdtsSyncWord(const uint8_t* buf) {
-
28  return (buf[0] == 0xff) && ((buf[1] & 0xf6) == 0xf0);
-
29 }
-
30 
-
31 // Look for an ADTS syncword.
-
32 // |new_pos| returns
-
33 // - either the byte position of the ADTS frame (if found)
-
34 // - or the byte position of 1st byte that was not processed (if not found).
-
35 // In every case, the returned value in |new_pos| is such that new_pos >= pos
-
36 // |frame_sz| returns the size of the ADTS frame (if found).
-
37 // Return whether a syncword was found.
-
38 static bool LookForSyncWord(const uint8_t* raw_es,
-
39  int raw_es_size,
-
40  int pos,
-
41  int* new_pos,
-
42  int* frame_sz) {
-
43  DCHECK_GE(pos, 0);
-
44  DCHECK_LE(pos, raw_es_size);
-
45 
-
46  int max_offset = raw_es_size - kAdtsHeaderMinSize;
-
47  if (pos >= max_offset) {
-
48  // Do not change the position if:
-
49  // - max_offset < 0: not enough bytes to get a full header
-
50  // Since pos >= 0, this is a subcase of the next condition.
-
51  // - pos >= max_offset: might be the case after reading one full frame,
-
52  // |pos| is then incremented by the frame size and might then point
-
53  // to the end of the buffer.
-
54  *new_pos = pos;
-
55  return false;
-
56  }
-
57 
-
58  for (int offset = pos; offset < max_offset; offset++) {
-
59  const uint8_t* cur_buf = &raw_es[offset];
-
60 
-
61  if (!isAdtsSyncWord(cur_buf))
-
62  // The first 12 bits must be 1.
-
63  // The layer field (2 bits) must be set to 0.
-
64  continue;
-
65 
-
66  int frame_size = static_cast<int>(
-
67  mp2t::AdtsHeader::GetAdtsFrameSize(cur_buf, kAdtsHeaderMinSize));
-
68  if (frame_size < kAdtsHeaderMinSize) {
-
69  // Too short to be an ADTS frame.
+
18 #include "packager/media/formats/mp2t/ac3_header.h"
+
19 #include "packager/media/formats/mp2t/adts_header.h"
+
20 #include "packager/media/formats/mp2t/mp2t_common.h"
+
21 #include "packager/media/formats/mp2t/ts_stream_type.h"
+
22 
+
23 namespace shaka {
+
24 namespace media {
+
25 namespace mp2t {
+
26 
+
27 // Look for a syncword.
+
28 // |new_pos| returns
+
29 // - either the byte position of the frame (if found)
+
30 // - or the byte position of 1st byte that was not processed (if not found).
+
31 // In every case, the returned value in |new_pos| is such that new_pos >= pos
+
32 // |audio_header| is updated with the new audio frame info if a syncword is
+
33 // found.
+
34 // Return whether a syncword was found.
+
35 static bool LookForSyncWord(const uint8_t* raw_es,
+
36  int raw_es_size,
+
37  int pos,
+
38  int* new_pos,
+
39  AudioHeader* audio_header) {
+
40  DCHECK_GE(pos, 0);
+
41  DCHECK_LE(pos, raw_es_size);
+
42 
+
43  const int max_offset =
+
44  raw_es_size - static_cast<int>(audio_header->GetMinFrameSize());
+
45  if (pos >= max_offset) {
+
46  // Do not change the position if:
+
47  // - max_offset < 0: not enough bytes to get a full header
+
48  // Since pos >= 0, this is a subcase of the next condition.
+
49  // - pos >= max_offset: might be the case after reading one full frame,
+
50  // |pos| is then incremented by the frame size and might then point
+
51  // to the end of the buffer.
+
52  *new_pos = pos;
+
53  return false;
+
54  }
+
55 
+
56  for (int offset = pos; offset < max_offset; offset++) {
+
57  const uint8_t* cur_buf = &raw_es[offset];
+
58 
+
59  if (!audio_header->IsSyncWord(cur_buf))
+
60  continue;
+
61 
+
62  if (!audio_header->Parse(cur_buf, raw_es_size - offset))
+
63  continue;
+
64 
+
65  // Check whether there is another frame |size| apart from the current one.
+
66  const size_t remaining_size = static_cast<size_t>(raw_es_size - offset);
+
67  const int kSyncWordSize = 2;
+
68  if (remaining_size >= audio_header->GetFrameSize() + kSyncWordSize &&
+
69  !audio_header->IsSyncWord(&cur_buf[audio_header->GetFrameSize()])) {
70  continue;
71  }
72 
-
73  // Check whether there is another frame
-
74  // |size| apart from the current one.
-
75  int remaining_size = raw_es_size - offset;
-
76  if (remaining_size >= frame_size + 2 &&
-
77  !isAdtsSyncWord(&cur_buf[frame_size])) {
-
78  continue;
-
79  }
+
73  *new_pos = offset;
+
74  return true;
+
75  }
+
76 
+
77  *new_pos = max_offset;
+
78  return false;
+
79 }
80 
-
81  *new_pos = offset;
-
82  *frame_sz = frame_size;
-
83  return true;
-
84  }
-
85 
-
86  *new_pos = max_offset;
-
87  return false;
-
88 }
-
89 
-
90 namespace mp2t {
-
91 
-
92 EsParserAdts::EsParserAdts(uint32_t pid,
-
93  const NewStreamInfoCB& new_stream_info_cb,
-
94  const EmitSampleCB& emit_sample_cb,
-
95  bool sbr_in_mimetype)
-
96  : EsParser(pid),
-
97  new_stream_info_cb_(new_stream_info_cb),
-
98  emit_sample_cb_(emit_sample_cb),
-
99  sbr_in_mimetype_(sbr_in_mimetype) {
-
100 }
-
101 
-
102 EsParserAdts::~EsParserAdts() {
-
103 }
-
104 
-
105 bool EsParserAdts::Parse(const uint8_t* buf,
-
106  int size,
-
107  int64_t pts,
-
108  int64_t dts) {
-
109  int raw_es_size;
-
110  const uint8_t* raw_es;
-
111 
-
112  // The incoming PTS applies to the access unit that comes just after
-
113  // the beginning of |buf|.
-
114  if (pts != kNoTimestamp) {
-
115  es_byte_queue_.Peek(&raw_es, &raw_es_size);
-
116  pts_list_.push_back(EsPts(raw_es_size, pts));
-
117  }
+
81 EsParserAudio::EsParserAudio(uint32_t pid,
+
82  TsStreamType stream_type,
+
83  const NewStreamInfoCB& new_stream_info_cb,
+
84  const EmitSampleCB& emit_sample_cb,
+
85  bool sbr_in_mimetype)
+
86  : EsParser(pid),
+
87  stream_type_(stream_type),
+
88  new_stream_info_cb_(new_stream_info_cb),
+
89  emit_sample_cb_(emit_sample_cb),
+
90  sbr_in_mimetype_(sbr_in_mimetype) {
+
91  if (stream_type == TsStreamType::kAc3) {
+
92  audio_header_.reset(new Ac3Header);
+
93  } else {
+
94  DCHECK_EQ(stream_type, TsStreamType::kAdtsAac);
+
95  audio_header_.reset(new AdtsHeader);
+
96  }
+
97 }
+
98 
+
99 EsParserAudio::~EsParserAudio() {}
+
100 
+
101 bool EsParserAudio::Parse(const uint8_t* buf,
+
102  int size,
+
103  int64_t pts,
+
104  int64_t dts) {
+
105  int raw_es_size;
+
106  const uint8_t* raw_es;
+
107 
+
108  // The incoming PTS applies to the access unit that comes just after
+
109  // the beginning of |buf|.
+
110  if (pts != kNoTimestamp) {
+
111  es_byte_queue_.Peek(&raw_es, &raw_es_size);
+
112  pts_list_.push_back(EsPts(raw_es_size, pts));
+
113  }
+
114 
+
115  // Copy the input data to the ES buffer.
+
116  es_byte_queue_.Push(buf, static_cast<int>(size));
+
117  es_byte_queue_.Peek(&raw_es, &raw_es_size);
118 
-
119  // Copy the input data to the ES buffer.
-
120  es_byte_queue_.Push(buf, static_cast<int>(size));
-
121  es_byte_queue_.Peek(&raw_es, &raw_es_size);
-
122 
-
123  // Look for every ADTS frame in the ES buffer starting at offset = 0
-
124  int es_position = 0;
-
125  int frame_size;
-
126  while (LookForSyncWord(raw_es, raw_es_size, es_position,
-
127  &es_position, &frame_size)) {
-
128  const uint8_t* frame_ptr = raw_es + es_position;
-
129  DVLOG(LOG_LEVEL_ES)
-
130  << "ADTS syncword @ pos=" << es_position
-
131  << " frame_size=" << frame_size;
-
132  DVLOG(LOG_LEVEL_ES)
-
133  << "ADTS header: "
-
134  << base::HexEncode(frame_ptr, kAdtsHeaderMinSize);
-
135 
-
136  // Do not process the frame if this one is a partial frame.
-
137  int remaining_size = raw_es_size - es_position;
-
138  if (frame_size > remaining_size)
-
139  break;
-
140 
-
141  size_t header_size = AdtsHeader::GetAdtsHeaderSize(frame_ptr, frame_size);
-
142 
-
143  // Update the audio configuration if needed.
-
144  DCHECK_GE(frame_size, kAdtsHeaderMinSize);
-
145  if (!UpdateAudioConfiguration(frame_ptr, frame_size))
-
146  return false;
-
147 
-
148  // Get the PTS & the duration of this access unit.
-
149  while (!pts_list_.empty() &&
-
150  pts_list_.front().first <= es_position) {
-
151  audio_timestamp_helper_->SetBaseTimestamp(pts_list_.front().second);
-
152  pts_list_.pop_front();
-
153  }
-
154 
-
155  int64_t current_pts = audio_timestamp_helper_->GetTimestamp();
-
156  int64_t frame_duration =
-
157  audio_timestamp_helper_->GetFrameDuration(kSamplesPerAACFrame);
-
158 
-
159  // Emit an audio frame.
-
160  bool is_key_frame = true;
-
161 
-
162  std::shared_ptr<MediaSample> sample = MediaSample::CopyFrom(
-
163  frame_ptr + header_size, frame_size - header_size, is_key_frame);
-
164  sample->set_pts(current_pts);
-
165  sample->set_dts(current_pts);
-
166  sample->set_duration(frame_duration);
-
167  emit_sample_cb_.Run(pid(), sample);
-
168 
-
169  // Update the PTS of the next frame.
-
170  audio_timestamp_helper_->AddFrames(kSamplesPerAACFrame);
-
171 
-
172  // Skip the current frame.
-
173  es_position += frame_size;
-
174  }
+
119  // Look for every frame in the ES buffer starting at offset = 0
+
120  int es_position = 0;
+
121  while (LookForSyncWord(raw_es, raw_es_size, es_position, &es_position,
+
122  audio_header_.get())) {
+
123  const uint8_t* frame_ptr = raw_es + es_position;
+
124  DVLOG(LOG_LEVEL_ES) << "syncword @ pos=" << es_position
+
125  << " frame_size=" << audio_header_->GetFrameSize();
+
126  DVLOG(LOG_LEVEL_ES) << "header: "
+
127  << base::HexEncode(frame_ptr,
+
128  audio_header_->GetHeaderSize());
+
129 
+
130  // Do not process the frame if this one is a partial frame.
+
131  int remaining_size = raw_es_size - es_position;
+
132  if (static_cast<int>(audio_header_->GetFrameSize()) > remaining_size)
+
133  break;
+
134 
+
135  // Update the audio configuration if needed.
+
136  if (!UpdateAudioConfiguration(*audio_header_))
+
137  return false;
+
138 
+
139  // Get the PTS & the duration of this access unit.
+
140  while (!pts_list_.empty() && pts_list_.front().first <= es_position) {
+
141  audio_timestamp_helper_->SetBaseTimestamp(pts_list_.front().second);
+
142  pts_list_.pop_front();
+
143  }
+
144 
+
145  int64_t current_pts = audio_timestamp_helper_->GetTimestamp();
+
146  int64_t frame_duration = audio_timestamp_helper_->GetFrameDuration(
+
147  audio_header_->GetSamplesPerFrame());
+
148 
+
149  // Emit an audio frame.
+
150  bool is_key_frame = true;
+
151 
+
152  std::shared_ptr<MediaSample> sample = MediaSample::CopyFrom(
+
153  frame_ptr + audio_header_->GetHeaderSize(),
+
154  audio_header_->GetFrameSize() - audio_header_->GetHeaderSize(),
+
155  is_key_frame);
+
156  sample->set_pts(current_pts);
+
157  sample->set_dts(current_pts);
+
158  sample->set_duration(frame_duration);
+
159  emit_sample_cb_.Run(pid(), sample);
+
160 
+
161  // Update the PTS of the next frame.
+
162  audio_timestamp_helper_->AddFrames(audio_header_->GetSamplesPerFrame());
+
163 
+
164  // Skip the current frame.
+
165  es_position += static_cast<int>(audio_header_->GetFrameSize());
+
166  }
+
167 
+
168  // Discard all the bytes that have been processed.
+
169  DiscardEs(es_position);
+
170 
+
171  return true;
+
172 }
+
173 
+
174 void EsParserAudio::Flush() {}
175 
-
176  // Discard all the bytes that have been processed.
-
177  DiscardEs(es_position);
-
178 
-
179  return true;
+
176 void EsParserAudio::Reset() {
+
177  es_byte_queue_.Reset();
+
178  pts_list_.clear();
+
179  last_audio_decoder_config_ = std::shared_ptr<AudioStreamInfo>();
180 }
181 
-
182 void EsParserAdts::Flush() {
-
183 }
+
182 bool EsParserAudio::UpdateAudioConfiguration(const AudioHeader& audio_header) {
+
183  const uint8_t kAacSampleSizeBits(16);
184 
-
185 void EsParserAdts::Reset() {
-
186  es_byte_queue_.Reset();
-
187  pts_list_.clear();
-
188  last_audio_decoder_config_ = std::shared_ptr<AudioStreamInfo>();
-
189 }
-
190 
-
191 bool EsParserAdts::UpdateAudioConfiguration(const uint8_t* adts_frame,
-
192  size_t adts_frame_size) {
-
193  const uint8_t kAacSampleSizeBits(16);
-
194 
-
195  AdtsHeader adts_header;
-
196  if (!adts_header.Parse(adts_frame, adts_frame_size)) {
-
197  LOG(ERROR) << "Error parsing ADTS frame header.";
-
198  return false;
-
199  }
-
200  std::vector<uint8_t> audio_specific_config;
-
201  if (!adts_header.GetAudioSpecificConfig(&audio_specific_config))
-
202  return false;
-
203 
-
204  if (last_audio_decoder_config_) {
-
205  // Verify that the audio decoder config has not changed.
-
206  if (last_audio_decoder_config_->codec_config() == audio_specific_config) {
-
207  // Audio configuration has not changed.
-
208  return true;
-
209  }
-
210  NOTIMPLEMENTED() << "Varying audio configurations are not supported.";
-
211  return false;
-
212  }
-
213 
-
214  // The following code is written according to ISO 14496 Part 3 Table 1.11 and
-
215  // Table 1.22. (Table 1.11 refers to the capping to 48000, Table 1.22 refers
-
216  // to SBR doubling the AAC sample rate.)
-
217  int samples_per_second = adts_header.GetSamplingFrequency();
-
218  int extended_samples_per_second = sbr_in_mimetype_
-
219  ? std::min(2 * samples_per_second, 48000)
-
220  : samples_per_second;
-
221 
-
222  last_audio_decoder_config_ = std::make_shared<AudioStreamInfo>(
-
223  pid(), kMpeg2Timescale, kInfiniteDuration, kCodecAAC,
-
224  AudioStreamInfo::GetCodecString(kCodecAAC, adts_header.GetObjectType()),
-
225  audio_specific_config.data(), audio_specific_config.size(),
-
226  kAacSampleSizeBits, adts_header.GetNumChannels(),
-
227  extended_samples_per_second, 0 /* seek preroll */, 0 /* codec delay */,
-
228  0 /* max bitrate */, 0 /* avg bitrate */, std::string(), false);
-
229 
-
230  DVLOG(1) << "Sampling frequency: " << samples_per_second;
-
231  DVLOG(1) << "Extended sampling frequency: " << extended_samples_per_second;
-
232  DVLOG(1) << "Channel config: " << adts_header.GetNumChannels();
-
233  DVLOG(1) << "Object type: " << adts_header.GetObjectType();
-
234  // Reset the timestamp helper to use a new sampling frequency.
-
235  if (audio_timestamp_helper_) {
-
236  int64_t base_timestamp = audio_timestamp_helper_->GetTimestamp();
-
237  audio_timestamp_helper_.reset(
-
238  new AudioTimestampHelper(kMpeg2Timescale, samples_per_second));
-
239  audio_timestamp_helper_->SetBaseTimestamp(base_timestamp);
-
240  } else {
-
241  audio_timestamp_helper_.reset(
-
242  new AudioTimestampHelper(kMpeg2Timescale, extended_samples_per_second));
-
243  }
+
185  std::vector<uint8_t> audio_specific_config;
+
186  audio_header.GetAudioSpecificConfig(&audio_specific_config);
+
187 
+
188  if (last_audio_decoder_config_) {
+
189  // Verify that the audio decoder config has not changed.
+
190  if (last_audio_decoder_config_->codec_config() == audio_specific_config) {
+
191  // Audio configuration has not changed.
+
192  return true;
+
193  }
+
194  NOTIMPLEMENTED() << "Varying audio configurations are not supported.";
+
195  return false;
+
196  }
+
197 
+
198  // The following code is written according to ISO 14496 Part 3 Table 1.11 and
+
199  // Table 1.22. (Table 1.11 refers to the capping to 48000, Table 1.22 refers
+
200  // to SBR doubling the AAC sample rate.)
+
201  int samples_per_second = audio_header.GetSamplingFrequency();
+
202  // TODO(kqyang): Review if it makes sense to have |sbr_in_mimetype_| in
+
203  // es_parser.
+
204  int extended_samples_per_second =
+
205  sbr_in_mimetype_ ? std::min(2 * samples_per_second, 48000)
+
206  : samples_per_second;
+
207 
+
208  const Codec codec =
+
209  stream_type_ == TsStreamType::kAc3 ? kCodecAC3 : kCodecAAC;
+
210  last_audio_decoder_config_ = std::make_shared<AudioStreamInfo>(
+
211  pid(), kMpeg2Timescale, kInfiniteDuration, codec,
+
212  AudioStreamInfo::GetCodecString(codec, audio_header.GetObjectType()),
+
213  audio_specific_config.data(), audio_specific_config.size(),
+
214  kAacSampleSizeBits, audio_header.GetNumChannels(),
+
215  extended_samples_per_second, 0 /* seek preroll */, 0 /* codec delay */,
+
216  0 /* max bitrate */, 0 /* avg bitrate */, std::string(), false);
+
217 
+
218  DVLOG(1) << "Sampling frequency: " << samples_per_second;
+
219  DVLOG(1) << "Extended sampling frequency: " << extended_samples_per_second;
+
220  DVLOG(1) << "Channel config: "
+
221  << static_cast<int>(audio_header.GetNumChannels());
+
222  DVLOG(1) << "Object type: " << static_cast<int>(audio_header.GetObjectType());
+
223  // Reset the timestamp helper to use a new sampling frequency.
+
224  if (audio_timestamp_helper_) {
+
225  int64_t base_timestamp = audio_timestamp_helper_->GetTimestamp();
+
226  audio_timestamp_helper_.reset(
+
227  new AudioTimestampHelper(kMpeg2Timescale, samples_per_second));
+
228  audio_timestamp_helper_->SetBaseTimestamp(base_timestamp);
+
229  } else {
+
230  audio_timestamp_helper_.reset(
+
231  new AudioTimestampHelper(kMpeg2Timescale, extended_samples_per_second));
+
232  }
+
233 
+
234  // Audio config notification.
+
235  new_stream_info_cb_.Run(last_audio_decoder_config_);
+
236 
+
237  return true;
+
238 }
+
239 
+
240 void EsParserAudio::DiscardEs(int nbytes) {
+
241  DCHECK_GE(nbytes, 0);
+
242  if (nbytes <= 0)
+
243  return;
244 
-
245  // Audio config notification.
-
246  new_stream_info_cb_.Run(last_audio_decoder_config_);
-
247 
-
248  return true;
-
249 }
-
250 
-
251 void EsParserAdts::DiscardEs(int nbytes) {
-
252  DCHECK_GE(nbytes, 0);
-
253  if (nbytes <= 0)
-
254  return;
-
255 
-
256  // Adjust the ES position of each PTS.
-
257  for (EsPtsList::iterator it = pts_list_.begin(); it != pts_list_.end(); ++it)
-
258  it->first -= nbytes;
-
259 
-
260  // Discard |nbytes| of ES.
-
261  es_byte_queue_.Pop(nbytes);
-
262 }
-
263 
-
264 } // namespace mp2t
-
265 } // namespace media
-
266 } // namespace shaka
+
245  // Adjust the ES position of each PTS.
+
246  for (EsPtsList::iterator it = pts_list_.begin(); it != pts_list_.end(); ++it)
+
247  it->first -= nbytes;
+
248 
+
249  // Discard |nbytes| of ES.
+
250  es_byte_queue_.Pop(nbytes);
+
251 }
+
252 
+
253 } // namespace mp2t
+
254 } // namespace media
+
255 } // namespace shaka
void Push(const uint8_t *data, int size)
Append new bytes to the end of the queue.
Definition: byte_queue.cc:29
void Pop(int count)
Definition: byte_queue.cc:70
-
static size_t GetAdtsFrameSize(const uint8_t *data, size_t num_bytes)
Definition: adts_header.cc:23
void Reset()
Reset the queue to the empty state.
Definition: byte_queue.cc:24
void Peek(const uint8_t **data, int *size) const
Definition: byte_queue.cc:63
static std::string GetCodecString(Codec codec, uint8_t audio_object_type)
static std::shared_ptr< MediaSample > CopyFrom(const uint8_t *data, size_t size, bool is_key_frame)
Definition: media_sample.cc:42
-
static size_t GetAdtsHeaderSize(const uint8_t *data, size_t num_bytes)
Definition: adts_header.cc:31
diff --git a/docs/de/d29/structshaka_1_1media_1_1mp4_1_1TrackExtends.html b/docs/de/d29/structshaka_1_1media_1_1mp4_1_1TrackExtends.html index 383789f029..a7c28b02be 100644 --- a/docs/de/d29/structshaka_1_1media_1_1mp4_1_1TrackExtends.html +++ b/docs/de/d29/structshaka_1_1media_1_1mp4_1_1TrackExtends.html @@ -194,7 +194,7 @@ Additional Inherited Members diff --git a/docs/de/d33/classshaka_1_1media_1_1WebMTracksParser-members.html b/docs/de/d33/classshaka_1_1media_1_1WebMTracksParser-members.html index 2d2ba5cfba..ffe7ebfce4 100644 --- a/docs/de/d33/classshaka_1_1media_1_1WebMTracksParser-members.html +++ b/docs/de/d33/classshaka_1_1media_1_1WebMTracksParser-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d33/structshaka_1_1media_1_1H265Pps.html b/docs/de/d33/structshaka_1_1media_1_1H265Pps.html index a68966488c..08b286226c 100644 --- a/docs/de/d33/structshaka_1_1media_1_1H265Pps.html +++ b/docs/de/d33/structshaka_1_1media_1_1H265Pps.html @@ -224,7 +224,7 @@ bool chroma_qp_offset_list diff --git a/docs/de/d34/offset__byte__queue_8h_source.html b/docs/de/d34/offset__byte__queue_8h_source.html index 42fbd004e2..8c14aa5da7 100644 --- a/docs/de/d34/offset__byte__queue_8h_source.html +++ b/docs/de/d34/offset__byte__queue_8h_source.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d3c/h26x__byte__to__unit__stream__converter_8cc_source.html b/docs/de/d3c/h26x__byte__to__unit__stream__converter_8cc_source.html index ffd86d4e97..6a9144012e 100644 --- a/docs/de/d3c/h26x__byte__to__unit__stream__converter_8cc_source.html +++ b/docs/de/d3c/h26x__byte__to__unit__stream__converter_8cc_source.html @@ -201,7 +201,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d3c/macros_8h_source.html b/docs/de/d3c/macros_8h_source.html index 2d8fd4af9a..532b2fd3b0 100644 --- a/docs/de/d3c/macros_8h_source.html +++ b/docs/de/d3c/macros_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d3e/buffer__reader_8h_source.html b/docs/de/d3e/buffer__reader_8h_source.html index e1866aeb46..17e63fadaa 100644 --- a/docs/de/d3e/buffer__reader_8h_source.html +++ b/docs/de/d3e/buffer__reader_8h_source.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d3e/classshaka_1_1media_1_1H264Parser-members.html b/docs/de/d3e/classshaka_1_1media_1_1H264Parser-members.html index 6c4b0c198c..bf40c670fd 100644 --- a/docs/de/d3e/classshaka_1_1media_1_1H264Parser-members.html +++ b/docs/de/d3e/classshaka_1_1media_1_1H264Parser-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d43/classshaka_1_1media_1_1mp2t_1_1PesPacket-members.html b/docs/de/d43/classshaka_1_1media_1_1mp2t_1_1PesPacket-members.html index 3701740302..1975be5692 100644 --- a/docs/de/d43/classshaka_1_1media_1_1mp2t_1_1PesPacket-members.html +++ b/docs/de/d43/classshaka_1_1media_1_1mp2t_1_1PesPacket-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d49/classshaka_1_1media_1_1DecryptConfig.html b/docs/de/d49/classshaka_1_1media_1_1DecryptConfig.html index 30d9722217..569ed3bb8b 100644 --- a/docs/de/d49/classshaka_1_1media_1_1DecryptConfig.html +++ b/docs/de/d49/classshaka_1_1media_1_1DecryptConfig.html @@ -315,7 +315,7 @@ static const size_t  diff --git a/docs/de/d4a/muxer__listener__internal_8h_source.html b/docs/de/d4a/muxer__listener__internal_8h_source.html index 553df98c5e..b3da178386 100644 --- a/docs/de/d4a/muxer__listener__internal_8h_source.html +++ b/docs/de/d4a/muxer__listener__internal_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d52/classshaka_1_1Representation.html b/docs/de/d52/classshaka_1_1Representation.html index 6662d24bc9..d9b3ea94d7 100644 --- a/docs/de/d52/classshaka_1_1Representation.html +++ b/docs/de/d52/classshaka_1_1Representation.html @@ -456,7 +456,7 @@ template<DashProfile profile> diff --git a/docs/de/d53/classshaka_1_1media_1_1FakeInputMediaHandler-members.html b/docs/de/d53/classshaka_1_1media_1_1FakeInputMediaHandler-members.html index 111a7ecf60..d6284d64be 100644 --- a/docs/de/d53/classshaka_1_1media_1_1FakeInputMediaHandler-members.html +++ b/docs/de/d53/classshaka_1_1media_1_1FakeInputMediaHandler-members.html @@ -95,9 +95,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - + - + @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline
Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected
DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected
DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected
DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected
DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected
DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected
DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected
DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected
DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected
diff --git a/docs/de/d55/structshaka_1_1media_1_1mp4_1_1Language-members.html b/docs/de/d55/structshaka_1_1media_1_1mp4_1_1Language-members.html index f5eac5dd34..1998309d3b 100644 --- a/docs/de/d55/structshaka_1_1media_1_1mp4_1_1Language-members.html +++ b/docs/de/d55/structshaka_1_1media_1_1mp4_1_1Language-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d5b/adts__header_8cc_source.html b/docs/de/d5b/adts__header_8cc_source.html index 345cdbaa87..bf6a8c42d5 100644 --- a/docs/de/d5b/adts__header_8cc_source.html +++ b/docs/de/d5b/adts__header_8cc_source.html @@ -96,67 +96,67 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
7 #include "packager/media/formats/mp2t/adts_header.h"
8 
9 #include "packager/media/base/bit_reader.h"
-
10 #include "packager/media/formats/mp2t/mp2t_common.h"
-
11 #include "packager/media/formats/mpeg/adts_constants.h"
+
10 #include "packager/media/base/bit_writer.h"
+
11 #include "packager/media/formats/mp2t/mp2t_common.h"
12 
-
13 namespace shaka {
-
14 namespace media {
-
15 namespace mp2t {
-
16 
-
17 AdtsHeader::AdtsHeader()
-
18  : valid_config_(false),
-
19  profile_(0),
-
20  sampling_frequency_index_(0),
-
21  channel_configuration_(0) {}
+
13 namespace {
+
14 const size_t kAdtsHeaderMinSize = 7;
+
15 
+
16 // The following conversion table is extracted from ISO 14496 Part 3 -
+
17 // Table 1.16 - Sampling Frequency Index.
+
18 const int kAdtsFrequencyTable[] = {96000, 88200, 64000, 48000, 44100,
+
19  32000, 24000, 22050, 16000, 12000,
+
20  11025, 8000, 7350};
+
21 const size_t kAdtsFrequencyTableSize = arraysize(kAdtsFrequencyTable);
22 
-
23 size_t AdtsHeader::GetAdtsFrameSize(const uint8_t* data, size_t num_bytes) {
-
24  if (num_bytes < 6)
-
25  return 0;
-
26  return ((static_cast<int>(data[5]) >> 5) |
-
27  (static_cast<int>(data[4]) << 3) |
-
28  ((static_cast<int>(data[3]) & 0x3) << 11));
-
29 }
-
30 
-
31 size_t AdtsHeader::GetAdtsHeaderSize(const uint8_t* data, size_t num_bytes) {
-
32  if (num_bytes < 2)
-
33  return 0;
-
34  if (data[1] & 0x01)
-
35  return kAdtsHeaderMinSize;
-
36  return kAdtsHeaderMinSize + sizeof(uint16_t); // Header + CRC.
-
37 }
-
38 
-
39 bool AdtsHeader::Parse(const uint8_t* adts_frame, size_t adts_frame_size) {
-
40  CHECK(adts_frame);
-
41 
-
42  valid_config_ = false;
-
43 
-
44  BitReader frame(adts_frame, adts_frame_size);
-
45  // Verify frame starts with sync bits (0xfff).
-
46  uint32_t sync;
-
47  RCHECK(frame.ReadBits(12, &sync));
-
48  RCHECK(sync == 0xfff);
-
49  // Skip MPEG version and layer.
-
50  RCHECK(frame.SkipBits(3));
-
51  // Get "protection absent" flag.
-
52  uint8_t protection_absent;
-
53  RCHECK(frame.ReadBits(1, &protection_absent));
-
54  // Get profile.
-
55  RCHECK(frame.ReadBits(2, &profile_));
-
56  // Get sampling frequency.
-
57  RCHECK(frame.ReadBits(4, &sampling_frequency_index_));
-
58  RCHECK(sampling_frequency_index_ < kAdtsFrequencyTableSize);
-
59  // Skip private stream bit.
-
60  RCHECK(frame.SkipBits(1));
-
61  // Get number of audio channels.
-
62  RCHECK(frame.ReadBits(3, &channel_configuration_));
-
63  RCHECK((channel_configuration_ > 0) &&
-
64  (channel_configuration_ < kAdtsNumChannelsTableSize));
-
65  // Skip originality, home and copyright info.
-
66  RCHECK(frame.SkipBits(4));
-
67  // Verify that the frame size matches input parameters.
-
68  uint16_t frame_size;
-
69  RCHECK(frame.ReadBits(13, &frame_size));
-
70  RCHECK(frame_size == adts_frame_size);
+
23 // The following conversion table is extracted from ISO 14496 Part 3 -
+
24 // Table 1.17 - Channel Configuration.
+
25 const int kAdtsNumChannelsTable[] = {0, 1, 2, 3, 4, 5, 6, 8};
+
26 const size_t kAdtsNumChannelsTableSize = arraysize(kAdtsNumChannelsTable);
+
27 } // namespace
+
28 
+
29 namespace shaka {
+
30 namespace media {
+
31 namespace mp2t {
+
32 
+
33 bool AdtsHeader::IsSyncWord(const uint8_t* buf) const {
+
34  return (buf[0] == 0xff) && ((buf[1] & 0xf6) == 0xf0);
+
35 }
+
36 
+ +
38  return kAdtsHeaderMinSize + 1;
+
39 }
+
40 
+ +
42  const size_t kSamplesPerAacFrame = 1024;
+
43  return kSamplesPerAacFrame;
+
44 }
+
45 
+
46 bool AdtsHeader::Parse(const uint8_t* adts_frame, size_t adts_frame_size) {
+
47  CHECK(adts_frame);
+
48 
+
49  if (adts_frame_size < kAdtsHeaderMinSize)
+
50  return false;
+
51 
+
52  BitReader frame(adts_frame, adts_frame_size);
+
53  // Verify frame starts with sync bits (0xfff).
+
54  uint32_t sync;
+
55  RCHECK(frame.ReadBits(12, &sync));
+
56  RCHECK(sync == 0xfff);
+
57  // Skip MPEG version and layer.
+
58  RCHECK(frame.SkipBits(3));
+
59  RCHECK(frame.ReadBits(1, &protection_absent_));
+
60  RCHECK(frame.ReadBits(2, &profile_));
+
61  RCHECK(frame.ReadBits(4, &sampling_frequency_index_));
+
62  RCHECK(sampling_frequency_index_ < kAdtsFrequencyTableSize);
+
63  // Skip private stream bit.
+
64  RCHECK(frame.SkipBits(1));
+
65  RCHECK(frame.ReadBits(3, &channel_configuration_));
+
66  RCHECK((channel_configuration_ > 0) &&
+
67  (channel_configuration_ < kAdtsNumChannelsTableSize));
+
68  // Skip originality, home and copyright info.
+
69  RCHECK(frame.SkipBits(4));
+
70  RCHECK(frame.ReadBits(13, &frame_size_));
71  // Skip buffer fullness indicator.
72  RCHECK(frame.SkipBits(11));
73  uint8_t num_blocks_minus_1;
@@ -166,48 +166,66 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
77  "not supported.";
78  return false;
79  }
-
80 
-
81  valid_config_ = true;
-
82  return true;
-
83 }
-
84 
-
85 bool AdtsHeader::GetAudioSpecificConfig(std::vector<uint8_t>* buffer) const {
-
86  DCHECK(buffer);
-
87  if (!valid_config_)
-
88  return false;
-
89 
-
90  buffer->resize(2);
-
91  (*buffer)[0] = ((profile_ + 1) << 3) | (sampling_frequency_index_ >> 1);
-
92  (*buffer)[1] = ((sampling_frequency_index_ & 1) << 7) |
-
93  (channel_configuration_ << 3);
-
94  return true;
-
95 }
-
96 
-
97 uint8_t AdtsHeader::GetObjectType() const {
-
98  return profile_ + 1;
-
99 }
-
100 
-
101 uint32_t AdtsHeader::GetSamplingFrequency() const {
-
102  DCHECK_LT(sampling_frequency_index_, kAdtsFrequencyTableSize);
-
103  return kAdtsFrequencyTable[sampling_frequency_index_];
+
80  return true;
+
81 }
+
82 
+
83 size_t AdtsHeader::GetHeaderSize() const {
+
84  const size_t kCrcSize = sizeof(uint16_t);
+
85  return kAdtsHeaderMinSize + (protection_absent_ ? 0 : kCrcSize);
+
86 }
+
87 
+
88 size_t AdtsHeader::GetFrameSize() const {
+
89  return frame_size_;
+
90 }
+
91 
+
92 void AdtsHeader::GetAudioSpecificConfig(std::vector<uint8_t>* buffer) const {
+
93  DCHECK(buffer);
+
94  buffer->clear();
+
95  BitWriter config(buffer);
+
96  config.WriteBits(GetObjectType(), 5);
+
97  config.WriteBits(sampling_frequency_index_, 4);
+
98  config.WriteBits(channel_configuration_, 4);
+
99  config.Flush();
+
100 }
+
101 
+
102 uint8_t AdtsHeader::GetObjectType() const {
+
103  return profile_ + 1;
104 }
105 
-
106 uint8_t AdtsHeader::GetNumChannels() const {
-
107  DCHECK_GT(channel_configuration_, 0);
-
108  DCHECK_LT(channel_configuration_, kAdtsNumChannelsTableSize);
-
109  return kAdtsNumChannelsTable[channel_configuration_];
-
110 }
-
111 
-
112 } // namespace mp2t
-
113 } // namespace media
-
114 } // namespace shaka
+ +
107  DCHECK_LT(sampling_frequency_index_, kAdtsFrequencyTableSize);
+
108  return kAdtsFrequencyTable[sampling_frequency_index_];
+
109 }
+
110 
+
111 uint8_t AdtsHeader::GetNumChannels() const {
+
112  DCHECK_GT(channel_configuration_, 0);
+
113  DCHECK_LT(channel_configuration_, kAdtsNumChannelsTableSize);
+
114  return kAdtsNumChannelsTable[channel_configuration_];
+
115 }
+
116 
+
117 } // namespace mp2t
+
118 } // namespace media
+
119 } // namespace shaka
bool ReadBits(size_t num_bits, T *out)
Definition: bit_reader.h:35
A class to read bit streams.
Definition: bit_reader.h:17
+
size_t GetHeaderSize() const override
Definition: adts_header.cc:83
+
uint8_t GetObjectType() const override
Definition: adts_header.cc:102
+ +
size_t GetSamplesPerFrame() const override
Definition: adts_header.cc:41
+
size_t GetMinFrameSize() const override
Definition: adts_header.cc:37
bool SkipBits(size_t num_bits)
Definition: bit_reader.cc:24
+
bool IsSyncWord(const uint8_t *buf) const override
Definition: adts_header.cc:33
+
uint8_t GetNumChannels() const override
Definition: adts_header.cc:111
+
uint32_t GetSamplingFrequency() const override
Definition: adts_header.cc:106
+
void GetAudioSpecificConfig(std::vector< uint8_t > *buffer) const override
Definition: adts_header.cc:92
+
void WriteBits(uint32_t bits, size_t number_of_bits)
Definition: bit_writer.cc:15
+
bool Parse(const uint8_t *adts_frame, size_t adts_frame_size) override
Definition: adts_header.cc:46
+
void Flush()
Write pending bits, and align bitstream with extra zero bits.
Definition: bit_writer.cc:31
+
size_t GetFrameSize() const override
Definition: adts_header.cc:88
diff --git a/docs/de/d5c/mpd__flags_8h_source.html b/docs/de/d5c/mpd__flags_8h_source.html index 266e286b98..3d608146a8 100644 --- a/docs/de/d5c/mpd__flags_8h_source.html +++ b/docs/de/d5c/mpd__flags_8h_source.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d60/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter-members.html b/docs/de/d60/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter-members.html index 1e0f575637..1236368eb1 100644 --- a/docs/de/d60/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter-members.html +++ b/docs/de/d60/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter-members.html @@ -93,16 +93,17 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');

This is the complete list of members for shaka::media::mp2t::ProgramMapTableWriter, including all inherited members.

- - - - - - + + + + + + +
ClearSegmentPmt(BufferWriter *writer)=0shaka::media::mp2t::ProgramMapTableWriterpure virtual
EncryptedSegmentPmt(BufferWriter *writer)=0shaka::media::mp2t::ProgramMapTableWriterpure virtual
kElementaryPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
kPmtPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
ProgramMapTableWriter() (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriter
~ProgramMapTableWriter() (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWritervirtual
ClearSegmentPmt(BufferWriter *writer)shaka::media::mp2t::ProgramMapTableWritervirtual
codec() const shaka::media::mp2t::ProgramMapTableWriterinlineprotected
EncryptedSegmentPmt(BufferWriter *writer)shaka::media::mp2t::ProgramMapTableWritervirtual
kElementaryPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
kPmtPid (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterstatic
ProgramMapTableWriter(Codec codec) (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWriterexplicit
~ProgramMapTableWriter()=default (defined in shaka::media::mp2t::ProgramMapTableWriter)shaka::media::mp2t::ProgramMapTableWritervirtual
diff --git a/docs/de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html b/docs/de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html index 4a2a6cf8ad..87a8c5e65a 100644 --- a/docs/de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html +++ b/docs/de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html @@ -98,8 +98,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - - + + - - -

Public Member Functions

virtual bool Initialize (const StreamInfo &stream_info)
 
TsWriter (std::unique_ptr< ProgramMapTableWriter > pmt_writer)
 
virtual bool NewSegment (const std::string &file_name)
 
@@ -110,15 +111,11 @@ virtual void  
virtual bool AddPesPacket (std::unique_ptr< PesPacket > pes_packet)
 
-void SetProgramMapTableWriterForTesting (std::unique_ptr< ProgramMapTableWriter > table_writer)
 Only for testing.
 

Detailed Description

This class takes PesPackets, encapsulates them into TS packets, and write the data to file. This also creates PSI from StreamInfo.

-

Definition at line 30 of file ts_writer.h.

+

Definition at line 28 of file ts_writer.h.

Member Function Documentation

@@ -150,7 +147,7 @@ void 
Returns
true on success, false otherwise.
-

Definition at line 237 of file ts_writer.cc.

+

Definition at line 205 of file ts_writer.cc.

@@ -177,41 +174,7 @@ void 
Returns
true on success, false otherwise.
-

Definition at line 233 of file ts_writer.cc.

- - - - -
-
- - - - - -
- - - - - - - - -
bool shaka::media::mp2t::TsWriter::Initialize (const StreamInfostream_info)
-
-virtual
-
-

This must be called before calling other methods.

-
Parameters
- - -
stream_infois the information about this stream.
-
-
-
Returns
true on success, false otherwise.
- -

Definition at line 164 of file ts_writer.cc.

+

Definition at line 201 of file ts_writer.cc.

@@ -246,7 +209,7 @@ void 
Returns
true on success, false otherwise.
-

Definition at line 198 of file ts_writer.cc.

+

Definition at line 166 of file ts_writer.cc.

@@ -257,7 +220,7 @@ void  diff --git a/docs/de/d6c/mock__media__playlist_8h_source.html b/docs/de/d6c/mock__media__playlist_8h_source.html index 72b87e5393..c1659c8db8 100644 --- a/docs/de/d6c/mock__media__playlist_8h_source.html +++ b/docs/de/d6c/mock__media__playlist_8h_source.html @@ -132,14 +132,16 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
43  MOCK_CONST_METHOD0(GetLongestSegmentDuration, double());
44  MOCK_METHOD1(SetTargetDuration, void(uint32_t target_duration));
45  MOCK_CONST_METHOD0(GetLanguage, std::string());
-
46  MOCK_CONST_METHOD2(GetDisplayResolution,
-
47  bool(uint32_t* width, uint32_t* height));
-
48 };
-
49 
-
50 } // namespace hls
-
51 } // namespace shaka
-
52 
-
53 #endif // PACKAGER_HLS_BASE_MOCK_MEDIA_PLAYLIST_H_
+
46  MOCK_CONST_METHOD0(GetNumChannels, int());
+
47  MOCK_CONST_METHOD2(GetDisplayResolution,
+
48  bool(uint32_t* width, uint32_t* height));
+
49 };
+
50 
+
51 } // namespace hls
+
52 } // namespace shaka
+
53 
+
54 #endif // PACKAGER_HLS_BASE_MOCK_MEDIA_PLAYLIST_H_
+
virtual int GetNumChannels() const
HlsPlaylistType
Definition: hls_params.h:16
virtual uint64_t Bitrate() const
@@ -149,13 +151,13 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
Methods are virtual for mocking.
virtual double GetLongestSegmentDuration() const
virtual void AddSegment(const std::string &file_name, uint64_t start_time, uint64_t duration, uint64_t start_byte_offset, uint64_t size)
-
virtual bool GetDisplayResolution(uint32_t *width, uint32_t *height) const
+
virtual bool GetDisplayResolution(uint32_t *width, uint32_t *height) const
virtual void AddEncryptionInfo(EncryptionMethod method, const std::string &url, const std::string &key_id, const std::string &iv, const std::string &key_format, const std::string &key_format_versions)
virtual bool WriteToFile(const std::string &file_path)
diff --git a/docs/de/d6c/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry-members.html b/docs/de/d6c/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry-members.html index 8f53a32746..acbbdf1423 100644 --- a/docs/de/d6c/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry-members.html +++ b/docs/de/d6c/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d6e/classshaka_1_1media_1_1MockOutputMediaHandler-members.html b/docs/de/d6e/classshaka_1_1media_1_1MockOutputMediaHandler-members.html index 3b7c86d4ef..f07df677bd 100644 --- a/docs/de/d6e/classshaka_1_1media_1_1MockOutputMediaHandler-members.html +++ b/docs/de/d6e/classshaka_1_1media_1_1MockOutputMediaHandler-members.html @@ -95,9 +95,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - + - + @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
AddHandler(std::shared_ptr< MediaHandler > handler)shaka::media::MediaHandlerinline
Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected
DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected
DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected
DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected
DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected
DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected
DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected
DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected
DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected
diff --git a/docs/de/d6e/language__utils_8h_source.html b/docs/de/d6e/language__utils_8h_source.html index 98671a3e83..e342e4ec95 100644 --- a/docs/de/d6e/language__utils_8h_source.html +++ b/docs/de/d6e/language__utils_8h_source.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d70/http__key__fetcher_8cc_source.html b/docs/de/d70/http__key__fetcher_8cc_source.html index b9b76e04fc..d44b2867d1 100644 --- a/docs/de/d70/http__key__fetcher_8cc_source.html +++ b/docs/de/d70/http__key__fetcher_8cc_source.html @@ -266,7 +266,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d77/webm__content__encodings__client_8cc_source.html b/docs/de/d77/webm__content__encodings__client_8cc_source.html index 9062553005..adfd5392d0 100644 --- a/docs/de/d77/webm__content__encodings__client_8cc_source.html +++ b/docs/de/d77/webm__content__encodings__client_8cc_source.html @@ -358,7 +358,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d7b/mp4__media__parser_8h_source.html b/docs/de/d7b/mp4__media__parser_8h_source.html index d413c285e5..af63831e0f 100644 --- a/docs/de/d7b/mp4__media__parser_8h_source.html +++ b/docs/de/d7b/mp4__media__parser_8h_source.html @@ -203,7 +203,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d7e/classshaka_1_1media_1_1mp2t_1_1TsSectionPsi.html b/docs/de/d7e/classshaka_1_1media_1_1mp2t_1_1TsSectionPsi.html index c63d0d46f1..3d599dba2a 100644 --- a/docs/de/d7e/classshaka_1_1media_1_1mp2t_1_1TsSectionPsi.html +++ b/docs/de/d7e/classshaka_1_1media_1_1mp2t_1_1TsSectionPsi.html @@ -147,7 +147,7 @@ Additional Inherited Members diff --git a/docs/de/d7f/unionshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes_1_1OneOf-members.html b/docs/de/d7f/unionshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes_1_1OneOf-members.html index 6629c810bb..5831815ad1 100644 --- a/docs/de/d7f/unionshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes_1_1OneOf-members.html +++ b/docs/de/d7f/unionshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes_1_1OneOf-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d83/box__definitions__comparison_8h_source.html b/docs/de/d83/box__definitions__comparison_8h_source.html index 6843f9d884..7e92616564 100644 --- a/docs/de/d83/box__definitions__comparison_8h_source.html +++ b/docs/de/d83/box__definitions__comparison_8h_source.html @@ -592,7 +592,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d85/classshaka_1_1media_1_1OriginHandler.html b/docs/de/d85/classshaka_1_1media_1_1OriginHandler.html index d14724479d..e123cd1376 100644 --- a/docs/de/d85/classshaka_1_1media_1_1OriginHandler.html +++ b/docs/de/d85/classshaka_1_1media_1_1OriginHandler.html @@ -143,10 +143,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -159,14 +155,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -200,7 +200,7 @@ std::pair< std::shared_ptr
diff --git a/docs/de/d87/structshaka_1_1media_1_1wvm_1_1PrevSampleData-members.html b/docs/de/d87/structshaka_1_1media_1_1wvm_1_1PrevSampleData-members.html index 5b8cec6571..33e755002c 100644 --- a/docs/de/d87/structshaka_1_1media_1_1wvm_1_1PrevSampleData-members.html +++ b/docs/de/d87/structshaka_1_1media_1_1wvm_1_1PrevSampleData-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d8d/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader-members.html b/docs/de/d8d/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader-members.html index e017161bbf..5e6e73d437 100644 --- a/docs/de/d8d/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader-members.html +++ b/docs/de/d8d/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d93/classshaka_1_1media_1_1VP8Parser-members.html b/docs/de/d93/classshaka_1_1media_1_1VP8Parser-members.html index bb44013592..5aff5514c0 100644 --- a/docs/de/d93/classshaka_1_1media_1_1VP8Parser-members.html +++ b/docs/de/d93/classshaka_1_1media_1_1VP8Parser-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/da9/structshaka_1_1Element.html b/docs/de/da9/structshaka_1_1Element.html index 3b0ddbc4af..2ead5b9161 100644 --- a/docs/de/da9/structshaka_1_1Element.html +++ b/docs/de/da9/structshaka_1_1Element.html @@ -120,7 +120,7 @@ std::vector< El diff --git a/docs/de/dab/es__parser__h26x_8cc_source.html b/docs/de/dab/es__parser__h26x_8cc_source.html index 0f0f44b90a..5721329c2a 100644 --- a/docs/de/dab/es__parser__h26x_8cc_source.html +++ b/docs/de/dab/es__parser__h26x_8cc_source.html @@ -410,7 +410,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dad/classshaka_1_1MemoryFile.html b/docs/de/dad/classshaka_1_1MemoryFile.html index eb01f3f3f5..758fa99db6 100644 --- a/docs/de/dad/classshaka_1_1MemoryFile.html +++ b/docs/de/dad/classshaka_1_1MemoryFile.html @@ -493,7 +493,7 @@ bool  diff --git a/docs/de/dad/validate__flag_8cc_source.html b/docs/de/dad/validate__flag_8cc_source.html index f0edd6c3d3..f4c477e90b 100644 --- a/docs/de/dad/validate__flag_8cc_source.html +++ b/docs/de/dad/validate__flag_8cc_source.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/db2/classshaka_1_1media_1_1MockOutputMediaHandler.html b/docs/de/db2/classshaka_1_1media_1_1MockOutputMediaHandler.html index 75fc2516b2..c08b9cf7a5 100644 --- a/docs/de/db2/classshaka_1_1media_1_1MockOutputMediaHandler.html +++ b/docs/de/db2/classshaka_1_1media_1_1MockOutputMediaHandler.html @@ -136,10 +136,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -152,14 +148,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -193,7 +193,7 @@ std::pair< std::shared_ptr
diff --git a/docs/de/db3/classshaka_1_1media_1_1TextTrackConfig.html b/docs/de/db3/classshaka_1_1media_1_1TextTrackConfig.html index 5b53ae7f99..3c47f6f844 100644 --- a/docs/de/db3/classshaka_1_1media_1_1TextTrackConfig.html +++ b/docs/de/db3/classshaka_1_1media_1_1TextTrackConfig.html @@ -125,7 +125,7 @@ const std::string & id diff --git a/docs/de/db4/classshaka_1_1media_1_1H26xBitReader.html b/docs/de/db4/classshaka_1_1media_1_1H26xBitReader.html index 9e3bb10cd3..2a74818d46 100644 --- a/docs/de/db4/classshaka_1_1media_1_1H26xBitReader.html +++ b/docs/de/db4/classshaka_1_1media_1_1H26xBitReader.html @@ -134,7 +134,7 @@ size_t NumEmulationPrevent diff --git a/docs/de/dbf/udp__options_8h_source.html b/docs/de/dbf/udp__options_8h_source.html index 562c24b553..dbe358097d 100644 --- a/docs/de/dbf/udp__options_8h_source.html +++ b/docs/de/dbf/udp__options_8h_source.html @@ -115,11 +115,11 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
30  private:
31  UdpOptions() = default;
32 
-
34  std::string address_;
+
34  std::string address_ = "0.0.0.0";
35  uint16_t port_ = 0;
37  bool reuse_ = false;
38  // Address of the interface over which to receive UDP multicast streams.
-
39  std::string interface_address_;
+
39  std::string interface_address_ = "0.0.0.0";
41  unsigned timeout_us_ = 0;
42 };
43 
@@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dc1/demuxer_8h_source.html b/docs/de/dc1/demuxer_8h_source.html index 270a95b531..180204185c 100644 --- a/docs/de/dc1/demuxer_8h_source.html +++ b/docs/de/dc1/demuxer_8h_source.html @@ -228,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dc2/classshaka_1_1media_1_1H265Parser.html b/docs/de/dc2/classshaka_1_1media_1_1H265Parser.html index 34ca8fc663..588171bf8f 100644 --- a/docs/de/dc2/classshaka_1_1media_1_1H265Parser.html +++ b/docs/de/dc2/classshaka_1_1media_1_1H265Parser.html @@ -256,7 +256,7 @@ Public Member Functions diff --git a/docs/de/dc9/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample-members.html b/docs/de/dc9/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample-members.html index fb86a19956..007a9d055a 100644 --- a/docs/de/dc9/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample-members.html +++ b/docs/de/dc9/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dcb/ts__segmenter_8h_source.html b/docs/de/dcb/ts__segmenter_8h_source.html index 06ccf2222b..c69776cd39 100644 --- a/docs/de/dcb/ts__segmenter_8h_source.html +++ b/docs/de/dcb/ts__segmenter_8h_source.html @@ -148,49 +148,53 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
80  const MuxerOptions& muxer_options_;
81  MuxerListener* const listener_;
82 
-
83  // Scale used to scale the input stream to TS's timesccale (which is 90000).
-
84  // Used for calculating the duration in seconds fo the current segment.
-
85  double timescale_scale_ = 1.0;
+
83  // Codec for the stream.
+
84  Codec codec_ = kUnknownCodec;
+
85  std::vector<uint8_t> audio_codec_config_;
86 
-
87  // Used for segment template.
-
88  uint64_t segment_number_ = 0;
-
89 
-
90  std::unique_ptr<TsWriter> ts_writer_;
-
91  // Set to true if TsWriter::NewFile() succeeds, set to false after
-
92  // TsWriter::FinalizeFile() succeeds.
-
93  bool ts_writer_file_opened_ = false;
-
94  std::unique_ptr<PesPacketGenerator> pes_packet_generator_;
-
95 
-
96  // For OnNewSegment().
-
97  // Path of the current segment so that File::GetFileSize() can be used after
-
98  // the segment has been finalized.
-
99  std::string current_segment_path_;
-
100 
-
101  DISALLOW_COPY_AND_ASSIGN(TsSegmenter);
-
102 };
-
103 
-
104 } // namespace mp2t
-
105 } // namespace media
-
106 } // namespace shaka
-
107 #endif // PACKAGER_MEDIA_FORMATS_MP2T_TS_SEGMENTER_H_
+
87  // Scale used to scale the input stream to TS's timesccale (which is 90000).
+
88  // Used for calculating the duration in seconds fo the current segment.
+
89  double timescale_scale_ = 1.0;
+
90 
+
91  // Used for segment template.
+
92  uint64_t segment_number_ = 0;
+
93 
+
94  std::unique_ptr<TsWriter> ts_writer_;
+
95  // Set to true if TsWriter::NewFile() succeeds, set to false after
+
96  // TsWriter::FinalizeFile() succeeds.
+
97  bool ts_writer_file_opened_ = false;
+
98  std::unique_ptr<PesPacketGenerator> pes_packet_generator_;
+
99 
+
100  // For OnNewSegment().
+
101  // Path of the current segment so that File::GetFileSize() can be used after
+
102  // the segment has been finalized.
+
103  std::string current_segment_path_;
+
104 
+
105  DISALLOW_COPY_AND_ASSIGN(TsSegmenter);
+
106 };
+
107 
+
108 } // namespace mp2t
+
109 } // namespace media
+
110 } // namespace shaka
+
111 #endif // PACKAGER_MEDIA_FORMATS_MP2T_TS_SEGMENTER_H_
Abstract class holds stream information.
Definition: stream_info.h:58
- -
Status Initialize(const StreamInfo &stream_info)
Definition: ts_segmenter.cc:30
+ +
Status Initialize(const StreamInfo &stream_info)
Definition: ts_segmenter.cc:42
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:20
-
Status AddSample(const MediaSample &sample)
Definition: ts_segmenter.cc:48
+
Status AddSample(const MediaSample &sample)
Definition: ts_segmenter.cc:70
-
TsSegmenter(const MuxerOptions &options, MuxerListener *listener)
Definition: ts_segmenter.cc:23
+
TsSegmenter(const MuxerOptions &options, MuxerListener *listener)
Definition: ts_segmenter.cc:36
-
void InjectPesPacketGeneratorForTesting(std::unique_ptr< PesPacketGenerator > generator)
Only for testing.
Definition: ts_segmenter.cc:66
-
void SetTsWriterFileOpenedForTesting(bool value)
Only for testing.
Definition: ts_segmenter.cc:71
-
void InjectTsWriterForTesting(std::unique_ptr< TsWriter > writer)
Only for testing.
Definition: ts_segmenter.cc:62
+
void InjectPesPacketGeneratorForTesting(std::unique_ptr< PesPacketGenerator > generator)
Only for testing.
+
void SetTsWriterFileOpenedForTesting(bool value)
Only for testing.
+
void InjectTsWriterForTesting(std::unique_ptr< TsWriter > writer)
Only for testing.
Class to hold a media sample.
Definition: media_sample.h:22
-
Status FinalizeSegment(uint64_t start_timestamp, uint64_t duration)
+
Status FinalizeSegment(uint64_t start_timestamp, uint64_t duration)
diff --git a/docs/de/dcc/mock__mpd__notifier_8cc_source.html b/docs/de/dcc/mock__mpd__notifier_8cc_source.html index 2961741ab5..e2d42ff58e 100644 --- a/docs/de/dcc/mock__mpd__notifier_8cc_source.html +++ b/docs/de/dcc/mock__mpd__notifier_8cc_source.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dcf/file__closer_8h_source.html b/docs/de/dcf/file__closer_8h_source.html index d90f9daab7..cccbc50942 100644 --- a/docs/de/dcf/file__closer_8h_source.html +++ b/docs/de/dcf/file__closer_8h_source.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dd6/content__protection__element_8h_source.html b/docs/de/dd6/content__protection__element_8h_source.html index 22c5db479f..e461bf3c31 100644 --- a/docs/de/dd6/content__protection__element_8h_source.html +++ b/docs/de/dd6/content__protection__element_8h_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dd6/muxer__listener__test__helper_8cc_source.html b/docs/de/dd6/muxer__listener__test__helper_8cc_source.html index 1574f734d9..1d3f740b64 100644 --- a/docs/de/dd6/muxer__listener__test__helper_8cc_source.html +++ b/docs/de/dd6/muxer__listener__test__helper_8cc_source.html @@ -218,7 +218,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/ddd/classshaka_1_1media_1_1Muxer-members.html b/docs/de/ddd/classshaka_1_1media_1_1Muxer-members.html index 090fb80d37..1a127ea929 100644 --- a/docs/de/ddd/classshaka_1_1media_1_1Muxer-members.html +++ b/docs/de/ddd/classshaka_1_1media_1_1Muxer-members.html @@ -97,9 +97,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); Cancel()shaka::media::Muxer clock() (defined in shaka::media::Muxer)shaka::media::Muxerinlineprotected Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected - DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected + DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected - DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected + DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html b/docs/de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html index be4ddc90d8..b24cfc1569 100644 --- a/docs/de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html +++ b/docs/de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html @@ -257,7 +257,7 @@ Public Member Functions diff --git a/docs/de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html b/docs/de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html index 79dda3bb1b..62771dbc0c 100644 --- a/docs/de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html +++ b/docs/de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html @@ -154,7 +154,7 @@ void 23 of file ts_segmenter.cc.

+

Definition at line 36 of file ts_segmenter.cc.

@@ -180,7 +180,7 @@ void 
Returns
OK on success.
-

Definition at line 48 of file ts_segmenter.cc.

+

Definition at line 70 of file ts_segmenter.cc.

@@ -199,7 +199,7 @@ void 
Returns
OK on success.
-

Definition at line 44 of file ts_segmenter.cc.

+

Definition at line 66 of file ts_segmenter.cc.

@@ -235,7 +235,7 @@ void 103 of file ts_segmenter.cc.

+

Definition at line 152 of file ts_segmenter.cc.

@@ -261,7 +261,7 @@ void 
Returns
OK on success.
-

Definition at line 30 of file ts_segmenter.cc.

+

Definition at line 42 of file ts_segmenter.cc.

@@ -272,7 +272,7 @@ void  diff --git a/docs/de/ddf/structshaka_1_1media_1_1mp4_1_1MediaData-members.html b/docs/de/ddf/structshaka_1_1media_1_1mp4_1_1MediaData-members.html index f5dcf842af..20e01cc9ba 100644 --- a/docs/de/ddf/structshaka_1_1media_1_1mp4_1_1MediaData-members.html +++ b/docs/de/ddf/structshaka_1_1media_1_1mp4_1_1MediaData-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html b/docs/de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html index 3fd9b5e05e..1dacba60b4 100644 --- a/docs/de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html +++ b/docs/de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html @@ -333,7 +333,7 @@ void  diff --git a/docs/de/de0/classshaka_1_1media_1_1mp4_1_1MP4Muxer-members.html b/docs/de/de0/classshaka_1_1media_1_1mp4_1_1MP4Muxer-members.html index c276e41ef3..dad0a00e09 100644 --- a/docs/de/de0/classshaka_1_1media_1_1mp4_1_1MP4Muxer-members.html +++ b/docs/de/de0/classshaka_1_1media_1_1mp4_1_1MP4Muxer-members.html @@ -97,9 +97,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); Cancel()shaka::media::Muxer clock() (defined in shaka::media::Muxer)shaka::media::Muxerinlineprotected Dispatch(std::unique_ptr< StreamData > stream_data)shaka::media::MediaHandlerprotected - DispatchMediaEvent(size_t stream_index, std::shared_ptr< const MediaEvent > media_event)shaka::media::MediaHandlerinlineprotected + DispatchCueEvent(size_t stream_index, std::shared_ptr< const CueEvent > cue_event)shaka::media::MediaHandlerinlineprotected DispatchMediaSample(size_t stream_index, std::shared_ptr< const MediaSample > media_sample)shaka::media::MediaHandlerinlineprotected - DispatchPeriodInfo(size_t stream_index, std::shared_ptr< const PeriodInfo > period_info)shaka::media::MediaHandlerinlineprotected + DispatchScte35Event(size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)shaka::media::MediaHandlerinlineprotected DispatchSegmentInfo(size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)shaka::media::MediaHandlerinlineprotected DispatchStreamInfo(size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)shaka::media::MediaHandlerinlineprotected DispatchTextSample(size_t stream_index, std::shared_ptr< const TextSample > text_sample)shaka::media::MediaHandlerinlineprotected @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/de4/classshaka_1_1media_1_1AdCueGenerator.html b/docs/de/de4/classshaka_1_1media_1_1AdCueGenerator.html new file mode 100644 index 0000000000..af4f73022c --- /dev/null +++ b/docs/de/de4/classshaka_1_1media_1_1AdCueGenerator.html @@ -0,0 +1,208 @@ + + + + + + +Shaka Packager SDK: shaka::media::AdCueGenerator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
shaka::media::AdCueGenerator Class Reference
+
+
+ +

AdCueGenerator converts out of band cuepoint markers into SCTE-35 events. + More...

+ +

#include <ad_cue_generator.h>

+
+Inheritance diagram for shaka::media::AdCueGenerator:
+
+
+ + +shaka::media::MediaHandler + +
+ + + + + + + + + + + + + + + + +

+Public Member Functions

AdCueGenerator (const AdCueGeneratorParams &ad_cue_generator_params)
 
- Public Member Functions inherited from shaka::media::MediaHandler
+Status SetHandler (size_t output_stream_index, std::shared_ptr< MediaHandler > handler)
 Connect downstream handler at the specified output stream index.
 
+Status AddHandler (std::shared_ptr< MediaHandler > handler)
 Connect downstream handler to the next availble output stream index.
 
Status Initialize ()
 
+bool IsConnected ()
 Validate if the handler is connected to its upstream handler.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from shaka::media::MediaHandler
+virtual Status OnFlushRequest (size_t input_stream_index)
 Event handler for flush request at the specific input stream index.
 
+virtual bool ValidateOutputStreamIndex (size_t stream_index) const
 Validate if the stream at the specified index actually exists.
 
Status Dispatch (std::unique_ptr< StreamData > stream_data)
 
+Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)
 Dispatch the stream info to downstream handlers.
 
+Status DispatchMediaSample (size_t stream_index, std::shared_ptr< const MediaSample > media_sample)
 Dispatch the media sample to downstream handlers.
 
+Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)
 Dispatch the text sample to downsream handlers.
 
+Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)
 Dispatch the segment info to downstream handlers.
 
+Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event)
 Dispatch the scte35 event to downstream handlers.
 
+Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event)
 Dispatch the cue event to downstream handlers.
 
+Status FlushDownstream (size_t output_stream_index)
 Flush the downstream connected at the specified output stream index.
 
+Status FlushAllDownstreams ()
 Flush all connected downstreams.
 
+bool initialized ()
 
+size_t num_input_streams () const
 
+size_t next_output_stream_index () const
 
+const std::map< size_t,
+std::pair< std::shared_ptr
+< MediaHandler >, size_t > > & 
output_handlers ()
 
+

Detailed Description

+

AdCueGenerator converts out of band cuepoint markers into SCTE-35 events.

+ +

Definition at line 17 of file ad_cue_generator.h.

+

The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/de/de4/classshaka_1_1media_1_1AdCueGenerator.png b/docs/de/de4/classshaka_1_1media_1_1AdCueGenerator.png new file mode 100644 index 0000000000000000000000000000000000000000..45a6d787b64d3e0bf0137c1dc94d89ec941b4716 GIT binary patch literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^yMQ==gBeK9= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0$~;{hLn;{G&VAeW+JJ-gxXY{G_Mgt0 z3rsH2e!J*(SE!$P8DE9Zir>>SXDu^4s-k4Hh%44bCAw8lY0_HhFKS9vKPPs0thiZL zD)(4#zF$uHLm|gQ`<=xF%eTtDQM|9eX#MFewOhCKUlY0g;6&AvyXnu*pGdoq-_ups zlP|RHvHF*@`)2eXQ1&q2DCzUg;Fz18v~TH~;P<=t?GlJJ>|c^TVedj}&aXDx)y8@8d&~Qahu4-{mxt~zyL|Lp&KoJU zRaIYn_r3nA@K4S*$M<^0{4c*^51p5G%dX?IDKAmD5p+9dqhXYeRiew0nET(ewUj>X zUwy&VWmD)2C8e8MC4v)k&c3*8;_J-y;QbdSiQvbJ_QxIG)ZcA4x&M@%LDgIXhM!s` z4LPD#4%@h76{1`DCaiU0KM}T&Ic4<)MxY@KKr@h~1y*dmc1(mf!3Cy6ykvjB{JX4e ztbTK&-d|H@Jn%YA>VRglFHdJFyfr!E z;@jP}#k literal 0 HcmV?d00001 diff --git a/docs/de/de4/structshaka_1_1media_1_1H264Pps.html b/docs/de/de4/structshaka_1_1media_1_1H264Pps.html index f9c4ebd535..621fc21347 100644 --- a/docs/de/de4/structshaka_1_1media_1_1H264Pps.html +++ b/docs/de/de4/structshaka_1_1media_1_1H264Pps.html @@ -167,7 +167,7 @@ int second_chroma_qp_index diff --git a/docs/de/dea/classshaka_1_1media_1_1H26xByteToUnitStreamConverter.html b/docs/de/dea/classshaka_1_1media_1_1H26xByteToUnitStreamConverter.html index c4d959bb73..dad4fc6be1 100644 --- a/docs/de/dea/classshaka_1_1media_1_1H26xByteToUnitStreamConverter.html +++ b/docs/de/dea/classshaka_1_1media_1_1H26xByteToUnitStreamConverter.html @@ -287,7 +287,7 @@ void WarnIfNotMatch (i diff --git a/docs/de/deb/structshaka_1_1Cuepoint.html b/docs/de/deb/structshaka_1_1Cuepoint.html new file mode 100644 index 0000000000..38af95af54 --- /dev/null +++ b/docs/de/deb/structshaka_1_1Cuepoint.html @@ -0,0 +1,122 @@ + + + + + + +Shaka Packager SDK: shaka::Cuepoint Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
shaka::Cuepoint Struct Reference
+
+
+ + + + + + + + +

+Public Attributes

+double start_time_in_seconds = 0
 Start time of the cuepoint relative to start of the stream.
 
+double duration_in_seconds = 0
 Duration of the ad.
 
+

Detailed Description

+
+

Definition at line 14 of file ad_cue_generator_params.h.

+

The documentation for this struct was generated from the following file: +
+ + + + diff --git a/docs/de/def/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample.html b/docs/de/def/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample.html index f938ac039d..ea3f46177c 100644 --- a/docs/de/def/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample.html +++ b/docs/de/def/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/de/df2/combined__muxer__listener_8h_source.html b/docs/de/df2/combined__muxer__listener_8h_source.html index f4ffe029b3..00dcc3a12e 100644 --- a/docs/de/df2/combined__muxer__listener_8h_source.html +++ b/docs/de/df2/combined__muxer__listener_8h_source.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html b/docs/de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html index cba39f1805..5d0cd3abaf 100644 --- a/docs/de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html +++ b/docs/de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html @@ -217,7 +217,7 @@ bool is_keyframe () co

Advance iterator to the next run. Require that the iterator point to a valid run.

-

Definition at line 429 of file track_run_iterator.cc.

+

Definition at line 431 of file track_run_iterator.cc.

@@ -235,7 +235,7 @@ bool is_keyframe () co

Advance iterator to the next sample. Require that the iterator point to a valid sample.

-

Definition at line 442 of file track_run_iterator.cc.

+

Definition at line 444 of file track_run_iterator.cc.

@@ -253,7 +253,7 @@ bool is_keyframe () co
Returns
true if this track run has auxiliary information and has not yet been cached. Only valid if IsRunValid().
-

Definition at line 451 of file track_run_iterator.cc.

+

Definition at line 453 of file track_run_iterator.cc.

@@ -290,7 +290,7 @@ bool is_keyframe () co
Returns
true on success, false on error.
-

Definition at line 458 of file track_run_iterator.cc.

+

Definition at line 460 of file track_run_iterator.cc.

@@ -308,7 +308,7 @@ bool is_keyframe () co

Only call when is_encrypted() is true and AuxInfoNeedsToBeCached() is false. Result is owned by caller.

-

Definition at line 592 of file track_run_iterator.cc.

+

Definition at line 594 of file track_run_iterator.cc.

@@ -326,7 +326,7 @@ bool is_keyframe () co
Returns
the maximum buffer location at which no data earlier in the stream will be required in order to read the current or any subsequent sample. You may clear all data up to this offset before reading the current sample safely. Result is in the same units as offset() (for Media Source this is in bytes past the head of the MOOF box).
-

Definition at line 494 of file track_run_iterator.cc.

+

Definition at line 496 of file track_run_iterator.cc.

@@ -365,7 +365,7 @@ bool is_keyframe () co

Set up the iterator to handle all the runs from the current fragment.

Returns
true on success, false otherwise.
-

Definition at line 279 of file track_run_iterator.cc.

+

Definition at line 281 of file track_run_iterator.cc.

@@ -383,7 +383,7 @@ bool is_keyframe () co
Returns
true if the iterator points to a valid run, false if past the last run.
-

Definition at line 482 of file track_run_iterator.cc.

+

Definition at line 484 of file track_run_iterator.cc.

@@ -401,7 +401,7 @@ bool is_keyframe () co
Returns
true if the iterator points to a valid sample, false if past the last sample.
-

Definition at line 484 of file track_run_iterator.cc.

+

Definition at line 486 of file track_run_iterator.cc.

@@ -412,7 +412,7 @@ bool is_keyframe () co diff --git a/docs/de/dfa/muxer__listener_8h_source.html b/docs/de/dfa/muxer__listener_8h_source.html index a3e834a7da..b79c1ea6f7 100644 --- a/docs/de/dfa/muxer__listener_8h_source.html +++ b/docs/de/dfa/muxer__listener_8h_source.html @@ -179,7 +179,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dfa/structshaka_1_1media_1_1mp4_1_1OpusSpecific.html b/docs/de/dfa/structshaka_1_1media_1_1mp4_1_1OpusSpecific.html index cbb8e53a96..0b3db3c7d9 100644 --- a/docs/de/dfa/structshaka_1_1media_1_1mp4_1_1OpusSpecific.html +++ b/docs/de/dfa/structshaka_1_1media_1_1mp4_1_1OpusSpecific.html @@ -176,7 +176,7 @@ Additional Inherited Members diff --git a/docs/de/dfd/stream__info_8cc_source.html b/docs/de/dfd/stream__info_8cc_source.html index 4763243c1f..918eec1c82 100644 --- a/docs/de/dfd/stream__info_8cc_source.html +++ b/docs/de/dfd/stream__info_8cc_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d00/playready__key__source_8h_source.html b/docs/df/d00/playready__key__source_8h_source.html index 38a7b960df..6489cac784 100644 --- a/docs/df/d00/playready__key__source_8h_source.html +++ b/docs/df/d00/playready__key__source_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d05/vp__codec__configuration__record_8cc_source.html b/docs/df/d05/vp__codec__configuration__record_8cc_source.html index 68c4a0c14b..b00cf96c4b 100644 --- a/docs/df/d05/vp__codec__configuration__record_8cc_source.html +++ b/docs/df/d05/vp__codec__configuration__record_8cc_source.html @@ -418,7 +418,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d1a/offset__byte__queue_8cc_source.html b/docs/df/d1a/offset__byte__queue_8cc_source.html index cfe36d7a4d..3b7d9d90fa 100644 --- a/docs/df/d1a/offset__byte__queue_8cc_source.html +++ b/docs/df/d1a/offset__byte__queue_8cc_source.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d1c/classshaka_1_1media_1_1MediaSample-members.html b/docs/df/d1c/classshaka_1_1media_1_1MediaSample-members.html index 8184d2d531..5137ec1014 100644 --- a/docs/df/d1c/classshaka_1_1media_1_1MediaSample-members.html +++ b/docs/df/d1c/classshaka_1_1media_1_1MediaSample-members.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d1c/composition__offset__iterator_8h_source.html b/docs/df/d1c/composition__offset__iterator_8h_source.html index acfad14a80..bde92415a4 100644 --- a/docs/df/d1c/composition__offset__iterator_8h_source.html +++ b/docs/df/d1c/composition__offset__iterator_8h_source.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d21/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser-members.html b/docs/df/d21/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser-members.html index d90be191bb..518cff7141 100644 --- a/docs/df/d21/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser-members.html +++ b/docs/df/d21/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d22/structshaka_1_1WidevineSigner.html b/docs/df/d22/structshaka_1_1WidevineSigner.html index 307d4755cd..f6617a2580 100644 --- a/docs/df/d22/structshaka_1_1WidevineSigner.html +++ b/docs/df/d22/structshaka_1_1WidevineSigner.html @@ -116,26 +116,26 @@ std::string   SigningKeyType signing_key_type = SigningKeyType::kNone   - + struct { - +    std::vector< uint8_t >   key - AES signing key.
-  - + AES signing key.
+  +    std::vector< uint8_t >   iv - AES signing IV.
-  -} aes -  - + AES signing IV.
+  +} aes +  + struct { - +    std::string   key - RSA signing private key.
-  -} rsa -  + RSA signing private key.
+  +} rsa

Detailed Description

Signer credential for Widevine license server.

@@ -163,7 +163,7 @@ struct {
diff --git a/docs/df/d22/validate__flag_8h_source.html b/docs/df/d22/validate__flag_8h_source.html index 2d064ee3ea..adcd7fa81e 100644 --- a/docs/df/d22/validate__flag_8h_source.html +++ b/docs/df/d22/validate__flag_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d2a/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator-members.html b/docs/df/d2a/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator-members.html index da21e17c00..70b3ae9310 100644 --- a/docs/df/d2a/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator-members.html +++ b/docs/df/d2a/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html b/docs/df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html index 132961b313..a5324de589 100644 --- a/docs/df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html +++ b/docs/df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html @@ -279,7 +279,7 @@ AES_KEY * mutable_aes_key< diff --git a/docs/df/d31/muxer__util_8cc_source.html b/docs/df/d31/muxer__util_8cc_source.html index cf240db6a8..9a9376beff 100644 --- a/docs/df/d31/muxer__util_8cc_source.html +++ b/docs/df/d31/muxer__util_8cc_source.html @@ -257,7 +257,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d32/audio__stream__info_8h_source.html b/docs/df/d32/audio__stream__info_8h_source.html index 00b7fd86fe..dec5dd1932 100644 --- a/docs/df/d32/audio__stream__info_8h_source.html +++ b/docs/df/d32/audio__stream__info_8h_source.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d33/classshaka_1_1AdaptationSet-members.html b/docs/df/d33/classshaka_1_1AdaptationSet-members.html index e746a3e545..b52d7da01e 100644 --- a/docs/df/d33/classshaka_1_1AdaptationSet-members.html +++ b/docs/df/d33/classshaka_1_1AdaptationSet-members.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d38/structshaka_1_1media_1_1mp4_1_1ChunkInfo.html b/docs/df/d38/structshaka_1_1media_1_1mp4_1_1ChunkInfo.html index 1f02f26123..1ccbd614f5 100644 --- a/docs/df/d38/structshaka_1_1media_1_1mp4_1_1ChunkInfo.html +++ b/docs/df/d38/structshaka_1_1media_1_1mp4_1_1ChunkInfo.html @@ -115,7 +115,7 @@ uint32_t sample_descriptio diff --git a/docs/df/d38/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader-members.html b/docs/df/d38/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader-members.html index bb106326fc..077781abbb 100644 --- a/docs/df/d38/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader-members.html +++ b/docs/df/d38/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d3c/classshaka_1_1media_1_1RequestSigner.html b/docs/df/d3c/classshaka_1_1media_1_1RequestSigner.html index 5adda1743a..cd94beb2d6 100644 --- a/docs/df/d3c/classshaka_1_1media_1_1RequestSigner.html +++ b/docs/df/d3c/classshaka_1_1media_1_1RequestSigner.html @@ -180,7 +180,7 @@ Protected Member Functions diff --git a/docs/df/d46/classshaka_1_1media_1_1Muxer.html b/docs/df/d46/classshaka_1_1media_1_1Muxer.html index 5658bf7ed5..6e4bc1b6b7 100644 --- a/docs/df/d46/classshaka_1_1media_1_1Muxer.html +++ b/docs/df/d46/classshaka_1_1media_1_1Muxer.html @@ -173,10 +173,6 @@ virtual bool   Status Dispatch (std::unique_ptr< StreamData > stream_data)   - -Status DispatchPeriodInfo (size_t stream_index, std::shared_ptr< const PeriodInfo > period_info) - Dispatch the period info to downstream handlers.
Status DispatchStreamInfo (size_t stream_index, std::shared_ptr< const StreamInfo > stream_info)  Dispatch the stream info to downstream handlers.
@@ -189,14 +185,18 @@ virtual bool Status DispatchTextSample (size_t stream_index, std::shared_ptr< const TextSample > text_sample)  Dispatch the text sample to downsream handlers.
  - -Status DispatchMediaEvent (size_t stream_index, std::shared_ptr< const MediaEvent > media_event) - Dispatch the media event to downstream handlers.
Status DispatchSegmentInfo (size_t stream_index, std::shared_ptr< const SegmentInfo > segment_info)  Dispatch the segment info to downstream handlers.
  + +Status DispatchScte35Event (size_t stream_index, std::shared_ptr< const Scte35Event > scte35_event) + Dispatch the scte35 event to downstream handlers.
+  + +Status DispatchCueEvent (size_t stream_index, std::shared_ptr< const CueEvent > cue_event) + Dispatch the cue event to downstream handlers.
Status FlushDownstream (size_t output_stream_index)  Flush the downstream connected at the specified output stream index.
@@ -390,7 +390,7 @@ std::pair< std::shared_ptr
diff --git a/docs/df/d4e/classshaka_1_1IoCache.html b/docs/df/d4e/classshaka_1_1IoCache.html index 62adefb1bd..642b26a5b4 100644 --- a/docs/df/d4e/classshaka_1_1IoCache.html +++ b/docs/df/d4e/classshaka_1_1IoCache.html @@ -297,7 +297,7 @@ void  diff --git a/docs/df/d51/classshaka_1_1media_1_1RsaPrivateKey-members.html b/docs/df/d51/classshaka_1_1media_1_1RsaPrivateKey-members.html index 03fbc5fdf1..4a88c89284 100644 --- a/docs/df/d51/classshaka_1_1media_1_1RsaPrivateKey-members.html +++ b/docs/df/d51/classshaka_1_1media_1_1RsaPrivateKey-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d5b/classshaka_1_1CallbackFile-members.html b/docs/df/d5b/classshaka_1_1CallbackFile-members.html index fc32211647..5449d5c4e6 100644 --- a/docs/df/d5b/classshaka_1_1CallbackFile-members.html +++ b/docs/df/d5b/classshaka_1_1CallbackFile-members.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d60/classshaka_1_1MockMpdBuilder.html b/docs/df/d60/classshaka_1_1MockMpdBuilder.html index 00859c7f2a..f7acfd1bc1 100644 --- a/docs/df/d60/classshaka_1_1MockMpdBuilder.html +++ b/docs/df/d60/classshaka_1_1MockMpdBuilder.html @@ -141,7 +141,7 @@ Additional Inherited Members diff --git a/docs/df/d62/ad__cue__generator_8cc_source.html b/docs/df/d62/ad__cue__generator_8cc_source.html new file mode 100644 index 0000000000..efab24eb6e --- /dev/null +++ b/docs/df/d62/ad__cue__generator_8cc_source.html @@ -0,0 +1,162 @@ + + + + + + +Shaka Packager SDK: packager/media/ad_cue_generator/ad_cue_generator.cc Source File + + + + + + + + + +
+
+ + + + + + +
+
Shaka Packager SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
ad_cue_generator.cc
+
+
+
1 // Copyright 2017 Google Inc. All rights reserved.
+
2 //
+
3 // Use of this source code is governed by a BSD-style
+
4 // license that can be found in the LICENSE file or at
+
5 // https://developers.google.com/open-source/licenses/bsd
+
6 
+
7 #include "packager/media/ad_cue_generator/ad_cue_generator.h"
+
8 
+
9 namespace shaka {
+
10 namespace media {
+
11 
+
12 namespace {
+
13 
+
14 // The AdCuGenerator only supports single input and single output.
+
15 const size_t kStreamIndex = 0;
+
16 
+
17 } // namespace
+
18 
+
19 AdCueGenerator::AdCueGenerator(
+
20  const AdCueGeneratorParams& ad_cue_generator_params)
+
21  : ad_cue_generator_params_(ad_cue_generator_params) {}
+
22 
+
23 AdCueGenerator::~AdCueGenerator() {}
+
24 
+
25 Status AdCueGenerator::InitializeInternal() {
+
26  if (num_input_streams() != 1 || next_output_stream_index() != 1) {
+
27  return Status(error::INVALID_ARGUMENT,
+
28  "Expects exactly one input and one output.");
+
29  }
+
30  return Status::OK;
+
31 }
+
32 
+
33 Status AdCueGenerator::Process(std::unique_ptr<StreamData> stream_data) {
+
34  switch (stream_data->stream_data_type) {
+
35  case StreamDataType::kStreamInfo: {
+
36  const uint32_t time_scale = stream_data->stream_info->time_scale();
+
37  Status status = Dispatch(std::move(stream_data));
+
38  if (!status.ok()) {
+
39  return status;
+
40  }
+
41  return DispatchScte35Events(kStreamIndex, time_scale);
+
42  }
+
43  default:
+
44  return Dispatch(std::move(stream_data));
+
45  }
+
46 }
+
47 
+
48 Status AdCueGenerator::DispatchScte35Events(size_t stream_index,
+
49  uint32_t time_scale) {
+
50  Status status;
+
51  for (const auto& cue_point : ad_cue_generator_params_.cue_points) {
+
52  std::shared_ptr<Scte35Event> scte35_event = std::make_shared<Scte35Event>();
+
53  scte35_event->start_time = cue_point.start_time_in_seconds * time_scale;
+
54  scte35_event->duration = cue_point.duration_in_seconds * time_scale;
+
55  status.Update(DispatchScte35Event(stream_index, std::move(scte35_event)));
+
56  if (!status.ok()) {
+
57  return status;
+
58  }
+
59  }
+
60  return Status::OK;
+
61 }
+
62 
+
63 } // namespace media
+
64 } // namespace shaka
+
+ + + + diff --git a/docs/df/d63/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry-members.html b/docs/df/d63/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry-members.html index de5b291a68..fcdf641572 100644 --- a/docs/df/d63/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry-members.html +++ b/docs/df/d63/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d66/classshaka_1_1media_1_1KeyFetcher.html b/docs/df/d66/classshaka_1_1media_1_1KeyFetcher.html index c5c3f93b22..569a2ef8a4 100644 --- a/docs/df/d66/classshaka_1_1media_1_1KeyFetcher.html +++ b/docs/df/d66/classshaka_1_1media_1_1KeyFetcher.html @@ -177,7 +177,7 @@ Public Member Functions diff --git a/docs/df/d6a/classshaka_1_1MockMpdBuilder-members.html b/docs/df/d6a/classshaka_1_1MockMpdBuilder-members.html index 4b36f4bfe1..23ff488d64 100644 --- a/docs/df/d6a/classshaka_1_1MockMpdBuilder-members.html +++ b/docs/df/d6a/classshaka_1_1MockMpdBuilder-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d6a/structshaka_1_1media_1_1mp4_1_1OpusSpecific-members.html b/docs/df/d6a/structshaka_1_1media_1_1mp4_1_1OpusSpecific-members.html index 7494bef68b..381ce27c79 100644 --- a/docs/df/d6a/structshaka_1_1media_1_1mp4_1_1OpusSpecific-members.html +++ b/docs/df/d6a/structshaka_1_1media_1_1mp4_1_1OpusSpecific-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d7b/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample.html b/docs/df/d7b/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample.html index 77bd0933fc..b5702b336e 100644 --- a/docs/df/d7b/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample.html +++ b/docs/df/d7b/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/df/d7b/structshaka_1_1media_1_1mp4_1_1TrackFragment.html b/docs/df/d7b/structshaka_1_1media_1_1mp4_1_1TrackFragment.html index 9b0683fff1..98fb0f73b6 100644 --- a/docs/df/d7b/structshaka_1_1media_1_1mp4_1_1TrackFragment.html +++ b/docs/df/d7b/structshaka_1_1media_1_1mp4_1_1TrackFragment.html @@ -198,7 +198,7 @@ Additional Inherited Members diff --git a/docs/df/d7d/webm__info__parser_8cc_source.html b/docs/df/d7d/webm__info__parser_8cc_source.html index 25a01aad32..ee0cdb658e 100644 --- a/docs/df/d7d/webm__info__parser_8cc_source.html +++ b/docs/df/d7d/webm__info__parser_8cc_source.html @@ -200,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d82/classshaka_1_1media_1_1DecoderConfigurationRecord-members.html b/docs/df/d82/classshaka_1_1media_1_1DecoderConfigurationRecord-members.html index 4c73e29025..23885069c8 100644 --- a/docs/df/d82/classshaka_1_1media_1_1DecoderConfigurationRecord-members.html +++ b/docs/df/d82/classshaka_1_1media_1_1DecoderConfigurationRecord-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d87/classshaka_1_1media_1_1AesCryptor.html b/docs/df/d87/classshaka_1_1media_1_1AesCryptor.html index 1736d6de1f..fa05444c04 100644 --- a/docs/df/d87/classshaka_1_1media_1_1AesCryptor.html +++ b/docs/df/d87/classshaka_1_1media_1_1AesCryptor.html @@ -424,7 +424,7 @@ AES_KEY * mutable_aes_key< diff --git a/docs/df/d8a/structshaka_1_1media_1_1mp4_1_1DataEntryUrl.html b/docs/df/d8a/structshaka_1_1media_1_1mp4_1_1DataEntryUrl.html index 295bc67b58..0a103d936d 100644 --- a/docs/df/d8a/structshaka_1_1media_1_1mp4_1_1DataEntryUrl.html +++ b/docs/df/d8a/structshaka_1_1media_1_1mp4_1_1DataEntryUrl.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/df/d8a/vp9__parser_8h_source.html b/docs/df/d8a/vp9__parser_8h_source.html index dc056ec007..c3c8de596f 100644 --- a/docs/df/d8a/vp9__parser_8h_source.html +++ b/docs/df/d8a/vp9__parser_8h_source.html @@ -136,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d8a/vpx__parser_8h_source.html b/docs/df/d8a/vpx__parser_8h_source.html index c9828e572d..7aa8a0701f 100644 --- a/docs/df/d8a/vpx__parser_8h_source.html +++ b/docs/df/d8a/vpx__parser_8h_source.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d8c/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter-members.html b/docs/df/d8c/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter-members.html index e6f7c949ea..53ea32060e 100644 --- a/docs/df/d8c/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter-members.html +++ b/docs/df/d8c/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter-members.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d8d/es__parser__h26x_8h_source.html b/docs/df/d8d/es__parser__h26x_8h_source.html index 0e281791a0..bc81c674c6 100644 --- a/docs/df/d8d/es__parser__h26x_8h_source.html +++ b/docs/df/d8d/es__parser__h26x_8h_source.html @@ -235,7 +235,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d94/classshaka_1_1RepresentationStateChangeListener.html b/docs/df/d94/classshaka_1_1RepresentationStateChangeListener.html index ba3e8f98c4..454f6aa89e 100644 --- a/docs/df/d94/classshaka_1_1RepresentationStateChangeListener.html +++ b/docs/df/d94/classshaka_1_1RepresentationStateChangeListener.html @@ -195,7 +195,7 @@ Public Member Functions diff --git a/docs/df/d96/xml__node_8cc_source.html b/docs/df/d96/xml__node_8cc_source.html index 614ae00c85..c43e04761b 100644 --- a/docs/df/d96/xml__node_8cc_source.html +++ b/docs/df/d96/xml__node_8cc_source.html @@ -513,7 +513,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d9a/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html b/docs/df/d9a/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html index 52fe809604..6ff51df90a 100644 --- a/docs/df/d9a/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html +++ b/docs/df/d9a/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/df/d9e/classshaka_1_1xml_1_1RepresentationXmlNode.html b/docs/df/d9e/classshaka_1_1xml_1_1RepresentationXmlNode.html index b00f00cd0b..da2fa1dc18 100644 --- a/docs/df/d9e/classshaka_1_1xml_1_1RepresentationXmlNode.html +++ b/docs/df/d9e/classshaka_1_1xml_1_1RepresentationXmlNode.html @@ -315,7 +315,7 @@ Additional Inherited Members diff --git a/docs/df/da0/structshaka_1_1media_1_1mp4_1_1ChunkOffset-members.html b/docs/df/da0/structshaka_1_1media_1_1mp4_1_1ChunkOffset-members.html index f96f992fe4..014ea8052e 100644 --- a/docs/df/da0/structshaka_1_1media_1_1mp4_1_1ChunkOffset-members.html +++ b/docs/df/da0/structshaka_1_1media_1_1mp4_1_1ChunkOffset-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/da5/structshaka_1_1media_1_1mp4_1_1CueIDBox-members.html b/docs/df/da5/structshaka_1_1media_1_1mp4_1_1CueIDBox-members.html index 4c202ab7f2..1259f41390 100644 --- a/docs/df/da5/structshaka_1_1media_1_1mp4_1_1CueIDBox-members.html +++ b/docs/df/da5/structshaka_1_1media_1_1mp4_1_1CueIDBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dad/decrypt__config_8h_source.html b/docs/df/dad/decrypt__config_8h_source.html index 86d85f0336..8d81b55416 100644 --- a/docs/df/dad/decrypt__config_8h_source.html +++ b/docs/df/dad/decrypt__config_8h_source.html @@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dc7/avc__decoder__configuration__record_8h_source.html b/docs/df/dc7/avc__decoder__configuration__record_8h_source.html index 4f139d29d0..3798ee8156 100644 --- a/docs/df/dc7/avc__decoder__configuration__record_8h_source.html +++ b/docs/df/dc7/avc__decoder__configuration__record_8h_source.html @@ -155,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dce/classshaka_1_1hls_1_1MockMediaPlaylist-members.html b/docs/df/dce/classshaka_1_1hls_1_1MockMediaPlaylist-members.html index 654f1e6a1f..f325db0323 100644 --- a/docs/df/dce/classshaka_1_1hls_1_1MockMediaPlaylist-members.html +++ b/docs/df/dce/classshaka_1_1hls_1_1MockMediaPlaylist-members.html @@ -102,12 +102,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); GetDisplayResolution(uint32_t *width, uint32_t *height) const shaka::hls::MediaPlaylistvirtual GetLanguage() const shaka::hls::MediaPlaylistvirtual GetLongestSegmentDuration() const shaka::hls::MediaPlaylistvirtual - group_id() const (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistinline - MediaPlaylist(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &file_name, const std::string &name, const std::string &group_id)shaka::hls::MediaPlaylist - MediaPlaylistStreamType enum name (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylist - MOCK_CONST_METHOD0(Bitrate, uint64_t()) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist - MOCK_CONST_METHOD0(GetLongestSegmentDuration, double()) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist - MOCK_CONST_METHOD0(GetLanguage, std::string()) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist + GetNumChannels() const shaka::hls::MediaPlaylistvirtual + group_id() const (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylistinline + MediaPlaylist(HlsPlaylistType playlist_type, double time_shift_buffer_depth, const std::string &file_name, const std::string &name, const std::string &group_id)shaka::hls::MediaPlaylist + MediaPlaylistStreamType enum name (defined in shaka::hls::MediaPlaylist)shaka::hls::MediaPlaylist + MOCK_CONST_METHOD0(Bitrate, uint64_t()) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist + MOCK_CONST_METHOD0(GetLongestSegmentDuration, double()) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist + MOCK_CONST_METHOD0(GetLanguage, std::string()) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist + MOCK_CONST_METHOD0(GetNumChannels, int()) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist MOCK_CONST_METHOD2(GetDisplayResolution, bool(uint32_t *width, uint32_t *height)) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist MOCK_METHOD1(SetMediaInfo, bool(const MediaInfo &media_info)) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist MOCK_METHOD1(WriteToFile, bool(const std::string &file_path)) (defined in shaka::hls::MockMediaPlaylist)shaka::hls::MockMediaPlaylist @@ -127,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dd2/mpd__utils_8h_source.html b/docs/df/dd2/mpd__utils_8h_source.html index b722e6cc46..b8cbef8120 100644 --- a/docs/df/dd2/mpd__utils_8h_source.html +++ b/docs/df/dd2/mpd__utils_8h_source.html @@ -177,7 +177,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dd2/structshaka_1_1media_1_1H264Pps-members.html b/docs/df/dd2/structshaka_1_1media_1_1H264Pps-members.html index c0b1f28698..3f25736f48 100644 --- a/docs/df/dd2/structshaka_1_1media_1_1H264Pps-members.html +++ b/docs/df/dd2/structshaka_1_1media_1_1H264Pps-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/ddc/structshaka_1_1MpdParams.html b/docs/df/ddc/structshaka_1_1MpdParams.html index 87c2bd405c..42c5e6e9ab 100644 --- a/docs/df/ddc/structshaka_1_1MpdParams.html +++ b/docs/df/ddc/structshaka_1_1MpdParams.html @@ -255,7 +255,7 @@ Static Public Attributes diff --git a/docs/df/ddc/webm_2segmenter_8h_source.html b/docs/df/ddc/webm_2segmenter_8h_source.html index 8aaac284d0..6aa642198d 100644 --- a/docs/df/ddc/webm_2segmenter_8h_source.html +++ b/docs/df/ddc/webm_2segmenter_8h_source.html @@ -257,7 +257,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dde/ts__section__psi_8cc_source.html b/docs/df/dde/ts__section__psi_8cc_source.html index fd8827da8a..e4655569f1 100644 --- a/docs/df/dde/ts__section__psi_8cc_source.html +++ b/docs/df/dde/ts__section__psi_8cc_source.html @@ -230,7 +230,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/de2/structshaka_1_1media_1_1H264SEIRecoveryPoint.html b/docs/df/de2/structshaka_1_1media_1_1H264SEIRecoveryPoint.html index ee909906df..425860bab2 100644 --- a/docs/df/de2/structshaka_1_1media_1_1H264SEIRecoveryPoint.html +++ b/docs/df/de2/structshaka_1_1media_1_1H264SEIRecoveryPoint.html @@ -118,7 +118,7 @@ int changing_slice_group_i diff --git a/docs/df/de3/text__track__config_8cc_source.html b/docs/df/de3/text__track__config_8cc_source.html index bd6240b5cd..bf3db3eefd 100644 --- a/docs/df/de3/text__track__config_8cc_source.html +++ b/docs/df/de3/text__track__config_8cc_source.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/de9/segment__info_8h_source.html b/docs/df/de9/segment__info_8h_source.html index 25e319199d..a369cbcc8f 100644 --- a/docs/df/de9/segment__info_8h_source.html +++ b/docs/df/de9/segment__info_8h_source.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/df1/structshaka_1_1ContentProtectionElement-members.html b/docs/df/df1/structshaka_1_1ContentProtectionElement-members.html index fac702433c..b51bf76402 100644 --- a/docs/df/df1/structshaka_1_1ContentProtectionElement-members.html +++ b/docs/df/df1/structshaka_1_1ContentProtectionElement-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dfc/playready__key__encryption__flags_8cc_source.html b/docs/df/dfc/playready__key__encryption__flags_8cc_source.html index 6a236e5fc5..2b6b8a6b9a 100644 --- a/docs/df/dfc/playready__key__encryption__flags_8cc_source.html +++ b/docs/df/dfc/playready__key__encryption__flags_8cc_source.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dir_1338cd99faf71b6cb1609e99e3340e45.html b/docs/dir_1338cd99faf71b6cb1609e99e3340e45.html index c29feb3fef..41501ec44f 100644 --- a/docs/dir_1338cd99faf71b6cb1609e99e3340e45.html +++ b/docs/dir_1338cd99faf71b6cb1609e99e3340e45.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_35c1fdffcdd4ade6d7f948073ab165de.html b/docs/dir_35c1fdffcdd4ade6d7f948073ab165de.html index c2994f77a8..8ed7a68823 100644 --- a/docs/dir_35c1fdffcdd4ade6d7f948073ab165de.html +++ b/docs/dir_35c1fdffcdd4ade6d7f948073ab165de.html @@ -85,19 +85,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); + + + + + + - + - + @@ -163,6 +169,8 @@ Files + + @@ -171,7 +179,7 @@ Files diff --git a/docs/dir_375ba2cfd8fd5b05c50b92d996b9d386.html b/docs/dir_375ba2cfd8fd5b05c50b92d996b9d386.html index 94a43ed439..10c5c4f1e0 100644 --- a/docs/dir_375ba2cfd8fd5b05c50b92d996b9d386.html +++ b/docs/dir_375ba2cfd8fd5b05c50b92d996b9d386.html @@ -89,8 +89,6 @@ Directories - - @@ -101,7 +99,7 @@ Directories diff --git a/docs/dir_3f8eec2fc361645de4b1ec14c19fffc7.html b/docs/dir_3f8eec2fc361645de4b1ec14c19fffc7.html index 48bd184762..c90c606a39 100644 --- a/docs/dir_3f8eec2fc361645de4b1ec14c19fffc7.html +++ b/docs/dir_3f8eec2fc361645de4b1ec14c19fffc7.html @@ -112,7 +112,7 @@ Files diff --git a/docs/dir_48fdaa95ed78e499807eaa909d50b2cd.html b/docs/dir_48fdaa95ed78e499807eaa909d50b2cd.html index c20fa455a2..80d32ef82e 100644 --- a/docs/dir_48fdaa95ed78e499807eaa909d50b2cd.html +++ b/docs/dir_48fdaa95ed78e499807eaa909d50b2cd.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_51897ee7df8868b4f901d3ff10922ac3.html b/docs/dir_51897ee7df8868b4f901d3ff10922ac3.html index 916a35c761..b298aa0e12 100644 --- a/docs/dir_51897ee7df8868b4f901d3ff10922ac3.html +++ b/docs/dir_51897ee7df8868b4f901d3ff10922ac3.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_588b87f799233a7c3afc1168633bb252.html b/docs/dir_588b87f799233a7c3afc1168633bb252.html index 732b930cbc..d00c1dd40f 100644 --- a/docs/dir_588b87f799233a7c3afc1168633bb252.html +++ b/docs/dir_588b87f799233a7c3afc1168633bb252.html @@ -85,6 +85,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

Files

file  ac3_header.cc [code]
 
file  ac3_header.h [code]
 
file  adts_header.cc [code]
 
file  adts_header.h [code]
 
file  audio_header.h [code]
 
file  continuity_counter.cc [code]
 
file  continuity_counter.h [code]
 
file  es_parser.h [code]
 
file  es_parser_adts.cc [code]
file  es_parser_audio.cc [code]
 
file  es_parser_adts.h [code]
file  es_parser_audio.h [code]
 
file  es_parser_h264.cc [code]
 
 
file  ts_segmenter.h [code]
 
file  ts_stream_type.h [code]
 
file  ts_writer.cc [code]
 
file  ts_writer.h [code]
 
directory  mp4
 
directory  mpeg
 
directory  webm
 
directory  webvtt
+ + @@ -95,7 +97,7 @@ Files diff --git a/docs/dir_64597db6ac7a9160e951a4226a03f10e.html b/docs/dir_64597db6ac7a9160e951a4226a03f10e.html index e85540e269..5ca27a9fd6 100644 --- a/docs/dir_64597db6ac7a9160e951a4226a03f10e.html +++ b/docs/dir_64597db6ac7a9160e951a4226a03f10e.html @@ -165,7 +165,7 @@ Files diff --git a/docs/dir_65bafb41b3669ba481c8da543a696a08.html b/docs/dir_65bafb41b3669ba481c8da543a696a08.html index 1abfcc334e..ccef67ed57 100644 --- a/docs/dir_65bafb41b3669ba481c8da543a696a08.html +++ b/docs/dir_65bafb41b3669ba481c8da543a696a08.html @@ -107,7 +107,7 @@ Files diff --git a/docs/dir_6fe4b0529cd3ec97045d3314254a0cce.html b/docs/dir_6fe4b0529cd3ec97045d3314254a0cce.html index 7a8a478e28..65080b729d 100644 --- a/docs/dir_6fe4b0529cd3ec97045d3314254a0cce.html +++ b/docs/dir_6fe4b0529cd3ec97045d3314254a0cce.html @@ -136,7 +136,7 @@ Files diff --git a/docs/dir_7053349436b45d276056de3c928a6fc6.html b/docs/dir_7053349436b45d276056de3c928a6fc6.html index 06a0070a64..812dca23e3 100644 --- a/docs/dir_7053349436b45d276056de3c928a6fc6.html +++ b/docs/dir_7053349436b45d276056de3c928a6fc6.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_7fa7c3de4a91b9652697b9f1c2d38e70.html b/docs/dir_7fa7c3de4a91b9652697b9f1c2d38e70.html index ae45d22d27..be7f15aa7b 100644 --- a/docs/dir_7fa7c3de4a91b9652697b9f1c2d38e70.html +++ b/docs/dir_7fa7c3de4a91b9652697b9f1c2d38e70.html @@ -105,7 +105,7 @@ Files diff --git a/docs/dir_83c56f445d5c796bd14e4ebf939c29ad.html b/docs/dir_83c56f445d5c796bd14e4ebf939c29ad.html index 09468aee34..8bb1d1e7ea 100644 --- a/docs/dir_83c56f445d5c796bd14e4ebf939c29ad.html +++ b/docs/dir_83c56f445d5c796bd14e4ebf939c29ad.html @@ -95,7 +95,7 @@ Files diff --git a/docs/dir_880f0837661bea0e588ff6a42c226fba.html b/docs/dir_880f0837661bea0e588ff6a42c226fba.html index 6c0f5ffb69..7fadad3916 100644 --- a/docs/dir_880f0837661bea0e588ff6a42c226fba.html +++ b/docs/dir_880f0837661bea0e588ff6a42c226fba.html @@ -91,7 +91,7 @@ Files diff --git a/docs/dir_0ff8490546c67558c1586a7b16b2189f.html b/docs/dir_89aadd87adc268d697d42604fc1bbfe1.html similarity index 84% rename from docs/dir_0ff8490546c67558c1586a7b16b2189f.html rename to docs/dir_89aadd87adc268d697d42604fc1bbfe1.html index 22dd219a67..cef1842493 100644 --- a/docs/dir_0ff8490546c67558c1586a7b16b2189f.html +++ b/docs/dir_89aadd87adc268d697d42604fc1bbfe1.html @@ -4,7 +4,7 @@ -Shaka Packager SDK: packager/media/formats/mpeg Directory Reference +Shaka Packager SDK: packager/media/ad_cue_generator Directory Reference @@ -74,26 +74,26 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
mpeg Directory Reference
+
ad_cue_generator Directory Reference

Files

file  ad_cue_generator_params.h [code]
 
file  chunking_params.h [code]
 
file  crypto_params.h [code]
- + - +

Files

file  adts_constants.cc [code]
file  ad_cue_generator.cc [code]
 
file  adts_constants.h [code]
file  ad_cue_generator.h [code]
 
diff --git a/docs/dir_933242dc2ed3ec7a82c146e98110781e.html b/docs/dir_933242dc2ed3ec7a82c146e98110781e.html index 2165eccb55..88fcf14e94 100644 --- a/docs/dir_933242dc2ed3ec7a82c146e98110781e.html +++ b/docs/dir_933242dc2ed3ec7a82c146e98110781e.html @@ -91,7 +91,7 @@ Files diff --git a/docs/dir_aa847bee70cdde822696c7e33a504139.html b/docs/dir_aa847bee70cdde822696c7e33a504139.html index 865b7ff321..95ba010872 100644 --- a/docs/dir_aa847bee70cdde822696c7e33a504139.html +++ b/docs/dir_aa847bee70cdde822696c7e33a504139.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_ae142483ff91a68c468a97c037f98d4d.html b/docs/dir_ae142483ff91a68c468a97c037f98d4d.html index 9bc081fac3..c9d6c255a0 100644 --- a/docs/dir_ae142483ff91a68c468a97c037f98d4d.html +++ b/docs/dir_ae142483ff91a68c468a97c037f98d4d.html @@ -149,7 +149,7 @@ Files diff --git a/docs/dir_b23f8e22c8c095d1c8c0cb8f88104a00.html b/docs/dir_b23f8e22c8c095d1c8c0cb8f88104a00.html index 4575f70774..b5a184c225 100644 --- a/docs/dir_b23f8e22c8c095d1c8c0cb8f88104a00.html +++ b/docs/dir_b23f8e22c8c095d1c8c0cb8f88104a00.html @@ -181,7 +181,7 @@ Files diff --git a/docs/dir_b7f276137d53b05d7f6b34219adc0a31.html b/docs/dir_b7f276137d53b05d7f6b34219adc0a31.html index 11afee8c54..02f2553bf1 100644 --- a/docs/dir_b7f276137d53b05d7f6b34219adc0a31.html +++ b/docs/dir_b7f276137d53b05d7f6b34219adc0a31.html @@ -93,7 +93,7 @@ Directories diff --git a/docs/dir_b885194e7131202a9b4650a8967e838c.html b/docs/dir_b885194e7131202a9b4650a8967e838c.html index a97ae3b6d7..fc48eb9bea 100644 --- a/docs/dir_b885194e7131202a9b4650a8967e838c.html +++ b/docs/dir_b885194e7131202a9b4650a8967e838c.html @@ -95,7 +95,7 @@ Directories diff --git a/docs/dir_b8a35a7f00287a46b0da66a108ec1239.html b/docs/dir_b8a35a7f00287a46b0da66a108ec1239.html index d7a4b1293d..76e99e008f 100644 --- a/docs/dir_b8a35a7f00287a46b0da66a108ec1239.html +++ b/docs/dir_b8a35a7f00287a46b0da66a108ec1239.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_bf7f1d16febc509cca62cff27fb88644.html b/docs/dir_bf7f1d16febc509cca62cff27fb88644.html index 78060acc36..e0e498c9b6 100644 --- a/docs/dir_bf7f1d16febc509cca62cff27fb88644.html +++ b/docs/dir_bf7f1d16febc509cca62cff27fb88644.html @@ -85,6 +85,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); + + + + @@ -151,7 +155,7 @@ Files diff --git a/docs/dir_c41da90e13af52a77978e497cf9cac63.html b/docs/dir_c41da90e13af52a77978e497cf9cac63.html index f657d82de0..e2c26196f0 100644 --- a/docs/dir_c41da90e13af52a77978e497cf9cac63.html +++ b/docs/dir_c41da90e13af52a77978e497cf9cac63.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_d258fb6e36cbaad69b44b6c9489b2bbb.html b/docs/dir_d258fb6e36cbaad69b44b6c9489b2bbb.html index 197d43a1bb..71a13cd2b8 100644 --- a/docs/dir_d258fb6e36cbaad69b44b6c9489b2bbb.html +++ b/docs/dir_d258fb6e36cbaad69b44b6c9489b2bbb.html @@ -134,7 +134,7 @@ Files diff --git a/docs/dir_e329e4913ca1adf6e112c00fbb0d634f.html b/docs/dir_e329e4913ca1adf6e112c00fbb0d634f.html index 20728c55dd..fafc41fc0d 100644 --- a/docs/dir_e329e4913ca1adf6e112c00fbb0d634f.html +++ b/docs/dir_e329e4913ca1adf6e112c00fbb0d634f.html @@ -121,7 +121,7 @@ Files diff --git a/docs/dir_e3bda0bde998a4d5063328245b9909be.html b/docs/dir_e3bda0bde998a4d5063328245b9909be.html index 5b003b886f..56af738fd8 100644 --- a/docs/dir_e3bda0bde998a4d5063328245b9909be.html +++ b/docs/dir_e3bda0bde998a4d5063328245b9909be.html @@ -113,6 +113,10 @@ Files + + + + @@ -257,7 +261,7 @@ Files diff --git a/docs/dir_f74090996960c752a82246b98a23aa62.html b/docs/dir_f74090996960c752a82246b98a23aa62.html index 8f40cac920..8ff75739c9 100644 --- a/docs/dir_f74090996960c752a82246b98a23aa62.html +++ b/docs/dir_f74090996960c752a82246b98a23aa62.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_f99dae54fe7170f791f339b952d5067a.html b/docs/dir_f99dae54fe7170f791f339b952d5067a.html index e8a3fd4e1a..4bcdda4791 100644 --- a/docs/dir_f99dae54fe7170f791f339b952d5067a.html +++ b/docs/dir_f99dae54fe7170f791f339b952d5067a.html @@ -85,6 +85,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

Files

file  ad_cue_generator_flags.cc [code]
 
file  ad_cue_generator_flags.h [code]
 
file  crypto_flags.cc [code]
 
file  crypto_flags.h [code]
 
file  bit_reader.h [code]
 
file  bit_writer.cc [code]
 
file  bit_writer.h [code]
 
file  buffer_reader.cc [code]
 
file  buffer_reader.h [code]
+ + @@ -111,7 +113,7 @@ Directories diff --git a/docs/dir_ffb529e2a1792bf603304ea6ff9bf092.html b/docs/dir_ffb529e2a1792bf603304ea6ff9bf092.html index f814f24590..9e2c873117 100644 --- a/docs/dir_ffb529e2a1792bf603304ea6ff9bf092.html +++ b/docs/dir_ffb529e2a1792bf603304ea6ff9bf092.html @@ -91,7 +91,7 @@ Files diff --git a/docs/files.html b/docs/files.html index 661377c438..a3d362b4e5 100644 --- a/docs/files.html +++ b/docs/files.html @@ -87,37 +87,39 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
[detail level 12345]

Directories

directory  ad_cue_generator
 
directory  base
 
directory  chunking
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -155,348 +157,355 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\-packager
 o-app
 |o*crypto_flags.cc
 |o*crypto_flags.h
 |o*gflags_hex_bytes.cc
 |o*gflags_hex_bytes.h
 |o*hls_flags.cc
 |o*hls_flags.h
 |o*libcrypto_threading.cc
 |o*libcrypto_threading.h
 |o*mpd_flags.cc
 |o*mpd_flags.h
 |o*mpd_generator.cc
 |o*mpd_generator_flags.h
 |o*muxer_flags.cc
 |o*muxer_flags.h
 |o*packager_main.cc
 |o*packager_util.cc
 |o*packager_util.h
 |o*playready_key_encryption_flags.cc
 |o*playready_key_encryption_flags.h
 |o*raw_key_encryption_flags.cc
 |o*raw_key_encryption_flags.h
 |o*retired_flags.cc
 |o*retired_flags.h
 |o*stream_descriptor.cc
 |o*stream_descriptor.h
 |o*validate_flag.cc
 |o*validate_flag.h
 |o*vlog_flags.cc
 |o*vlog_flags.h
 |o*widevine_encryption_flags.cc
 |\*widevine_encryption_flags.h
 |o*ad_cue_generator_flags.cc
 |o*ad_cue_generator_flags.h
 |o*crypto_flags.cc
 |o*crypto_flags.h
 |o*gflags_hex_bytes.cc
 |o*gflags_hex_bytes.h
 |o*hls_flags.cc
 |o*hls_flags.h
 |o*libcrypto_threading.cc
 |o*libcrypto_threading.h
 |o*mpd_flags.cc
 |o*mpd_flags.h
 |o*mpd_generator.cc
 |o*mpd_generator_flags.h
 |o*muxer_flags.cc
 |o*muxer_flags.h
 |o*packager_main.cc
 |o*packager_util.cc
 |o*packager_util.h
 |o*playready_key_encryption_flags.cc
 |o*playready_key_encryption_flags.h
 |o*raw_key_encryption_flags.cc
 |o*raw_key_encryption_flags.h
 |o*retired_flags.cc
 |o*retired_flags.h
 |o*stream_descriptor.cc
 |o*stream_descriptor.h
 |o*validate_flag.cc
 |o*validate_flag.h
 |o*vlog_flags.cc
 |o*vlog_flags.h
 |o*widevine_encryption_flags.cc
 |\*widevine_encryption_flags.h
 o-file
 |o+public
 |\+public
 o-media
 |o+base
 |o+chunking
 |o+codecs
 |o+crypto
 |o+demuxer
 |o+event
 |o+formats
 |o+origin
 |o+public
 |o+replicator
 |\+trick_play
 o-mpd
 |o+base
 |o+public
 |\+util
 o*packager.cc
 o*packager.h
 o*status.cc
 o*status.h
 \*status_test_util.h
 |o+ad_cue_generator
 |o+base
 |o+chunking
 |o+codecs
 |o+crypto
 |o+demuxer
 |o+event
 |o+formats
 |o+origin
 |o+public
 |o+replicator
 |\+trick_play
 o-mpd
 |o+base
 |o+public
 |\+util
 o*packager.cc
 o*packager.h
 o*status.cc
 o*status.h
 \*status_test_util.h
diff --git a/docs/functions.html b/docs/functions.html index cb62e82567..942a59e5c5 100644 --- a/docs/functions.html +++ b/docs/functions.html @@ -123,6 +123,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Here is a list of all documented class members with links to the class documentation for each member:

- a -

diff --git a/docs/functions_e.html b/docs/functions_e.html index 0907e2c2bb..6d4d586398 100644 --- a/docs/functions_e.html +++ b/docs/functions_e.html @@ -133,9 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::RsaPublicKey
  • EncryptedSegmentPmt() -: shaka::media::mp2t::AacProgramMapTableWriter -, shaka::media::mp2t::H264ProgramMapTableWriter -, shaka::media::mp2t::ProgramMapTableWriter +: shaka::media::mp2t::ProgramMapTableWriter
  • encryption_params : shaka::PackagingParams @@ -144,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_enum.html b/docs/functions_enum.html index d0d6530cec..7c07b4e265 100644 --- a/docs/functions_enum.html +++ b/docs/functions_enum.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_eval.html b/docs/functions_eval.html index fabab6d8db..8e43d72866 100644 --- a/docs/functions_eval.html +++ b/docs/functions_eval.html @@ -95,10 +95,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
     
    diff --git a/docs/functions_f.html b/docs/functions_f.html index 0d67b4dffe..a3d368baf8 100644 --- a/docs/functions_f.html +++ b/docs/functions_f.html @@ -160,6 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::hls::HlsNotifier , shaka::hls::SimpleHlsNotifier , shaka::LocalFile +, shaka::media::BitWriter , shaka::media::MediaParser , shaka::media::mp2t::Mp2tMediaParser , shaka::media::mp2t::PesPacketGenerator @@ -200,7 +201,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func.html b/docs/functions_func.html index 0f80f69ca6..cfaf81f934 100644 --- a/docs/functions_func.html +++ b/docs/functions_func.html @@ -260,7 +260,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_b.html b/docs/functions_func_b.html index 4fba2bdc9f..fea87912b3 100644 --- a/docs/functions_func_b.html +++ b/docs/functions_func_b.html @@ -128,6 +128,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • bit_position() : shaka::media::BitReader
  • +
  • BitPos() +: shaka::media::BitWriter +
  • Bitrate() : shaka::hls::MediaPlaylist
  • @@ -137,11 +140,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • bits_available() : shaka::media::BitReader
  • +
  • BitWriter() +: shaka::media::BitWriter +
  • box_size() : shaka::media::mp4::Box
  • BoxBuffer() -: shaka::media::mp4::BoxBuffer +: shaka::media::mp4::BoxBuffer
  • BoxType() : shaka::media::mp4::AC3Specific @@ -227,6 +233,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • BufferWriter() : shaka::media::BufferWriter
  • +
  • BytePos() +: shaka::media::BitWriter +
  • BytesCached() : shaka::IoCache
  • @@ -240,7 +249,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_c.html b/docs/functions_func_c.html index 996eb3f368..418f1bfc8b 100644 --- a/docs/functions_func_c.html +++ b/docs/functions_func_c.html @@ -147,9 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::MediaHandlerGraphTestBase
  • ClearSegmentPmt() -: shaka::media::mp2t::AacProgramMapTableWriter -, shaka::media::mp2t::H264ProgramMapTableWriter -, shaka::media::mp2t::ProgramMapTableWriter +: shaka::media::mp2t::ProgramMapTableWriter
  • Clone() : shaka::media::AudioStreamInfo @@ -177,6 +175,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • cluster_ended() : shaka::media::WebMClusterParser
  • +
  • codec() +: shaka::media::mp2t::ProgramMapTableWriter +
  • codec_config() : shaka::media::VPxParser
  • @@ -254,7 +255,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_d.html b/docs/functions_func_d.html index 4f96d596ee..69bd70134c 100644 --- a/docs/functions_func_d.html +++ b/docs/functions_func_d.html @@ -164,14 +164,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Dispatch() : shaka::media::MediaHandler
  • -
  • DispatchMediaEvent() -: shaka::media::MediaHandler +
  • DispatchCueEvent() +: shaka::media::MediaHandler
  • DispatchMediaSample() : shaka::media::MediaHandler
  • -
  • DispatchPeriodInfo() -: shaka::media::MediaHandler +
  • DispatchScte35Event() +: shaka::media::MediaHandler
  • DispatchSegmentInfo() : shaka::media::MediaHandler @@ -192,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_e.html b/docs/functions_func_e.html index 7a510d984b..8733d0ffd8 100644 --- a/docs/functions_func_e.html +++ b/docs/functions_func_e.html @@ -132,15 +132,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::RsaPublicKey
  • EncryptedSegmentPmt() -: shaka::media::mp2t::AacProgramMapTableWriter -, shaka::media::mp2t::H264ProgramMapTableWriter -, shaka::media::mp2t::ProgramMapTableWriter +: shaka::media::mp2t::ProgramMapTableWriter
  • diff --git a/docs/functions_func_f.html b/docs/functions_func_f.html index 25217b4999..ffde61a65a 100644 --- a/docs/functions_func_f.html +++ b/docs/functions_func_f.html @@ -159,6 +159,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::hls::HlsNotifier , shaka::hls::SimpleHlsNotifier , shaka::LocalFile +, shaka::media::BitWriter , shaka::media::MediaParser , shaka::media::mp2t::Mp2tMediaParser , shaka::media::mp2t::PesPacketGenerator @@ -199,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_g.html b/docs/functions_func_g.html index 43e90199ae..235406b38b 100644 --- a/docs/functions_func_g.html +++ b/docs/functions_func_g.html @@ -137,12 +137,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Get() : shaka::media::HttpKeyFetcher
  • -
  • GetAdtsFrameSize() -: shaka::media::mp2t::AdtsHeader -
  • -
  • GetAdtsHeaderSize() -: shaka::media::mp2t::AdtsHeader -
  • GetAudioDefaultDuration() : shaka::media::WebMTracksParser
  • @@ -150,7 +144,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::AACAudioSpecificConfig
  • GetAudioSpecificConfig() -: shaka::media::mp2t::AdtsHeader +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • GetAudioStreamInfo() : shaka::media::WebMAudioClient @@ -187,9 +183,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • GetFileSize() : shaka::File
  • +
  • GetFrameSize() +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader +
  • GetHeaderSize() : shaka::media::H264VideoSliceHeaderParser , shaka::media::H265VideoSliceHeaderParser +, shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader , shaka::media::VideoSliceHeaderParser
  • GetIndexRange() @@ -214,7 +218,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • GetKey() : shaka::media::KeySource -, shaka::media::PlayReadyKeySource +, shaka::media::PlayReadyKeySource , shaka::media::RawKeySource , shaka::media::WidevineKeySource
  • @@ -230,6 +234,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • GetMaxClearOffset() : shaka::media::mp4::TrackRunIterator
  • +
  • GetMinFrameSize() +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader +
  • GetNext() : shaka::media::mp2t::ContinuityCounter
  • @@ -237,11 +246,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::mp2t::PesPacketGenerator
  • GetNumChannels() -: shaka::media::AACAudioSpecificConfig -, shaka::media::mp2t::AdtsHeader +: shaka::hls::MediaPlaylist +, shaka::media::AACAudioSpecificConfig +, shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • GetObjectType() -: shaka::media::mp2t::AdtsHeader +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • GetOutputStreamDataVector() : shaka::media::MediaHandlerGraphTestBase @@ -252,11 +266,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • GetRawPtr() : shaka::xml::XmlNode
  • +
  • GetSamplesPerFrame() +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader +
  • GetSamplesPerSecond() : shaka::media::AACAudioSpecificConfig
  • GetSamplingFrequency() -: shaka::media::mp2t::AdtsHeader +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • GetSps() : shaka::media::H265Parser @@ -279,7 +300,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_h.html b/docs/functions_func_h.html index 86a57731dd..3f45360611 100644 --- a/docs/functions_func_h.html +++ b/docs/functions_func_h.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_i.html b/docs/functions_func_i.html index 72d895880e..2e826e4277 100644 --- a/docs/functions_func_i.html +++ b/docs/functions_func_i.html @@ -149,7 +149,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::media::MediaHandler , shaka::media::mp2t::PesPacketGenerator , shaka::media::mp2t::TsSegmenter -, shaka::media::mp2t::TsWriter , shaka::media::mp4::Segmenter , shaka::media::NalUnitToByteStreamConverter , shaka::media::VideoSliceHeaderParser @@ -205,7 +204,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::mp4::TrackRunIterator
  • IsSyncSample() -: shaka::media::mp4::SyncSampleIterator +: shaka::media::mp4::SyncSampleIterator +
  • +
  • IsSyncWord() +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • IsValid() : shaka::media::mp4::ChunkInfoIterator @@ -225,7 +229,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_l.html b/docs/functions_func_l.html index a872492b05..b5384f3cf8 100644 --- a/docs/functions_func_l.html +++ b/docs/functions_func_l.html @@ -135,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_m.html b/docs/functions_func_m.html index 6a80af6be4..b0d6e6710d 100644 --- a/docs/functions_func_m.html +++ b/docs/functions_func_m.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_n.html b/docs/functions_func_n.html index 7ee6d2564f..755a38d9da 100644 --- a/docs/functions_func_n.html +++ b/docs/functions_func_n.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_o.html b/docs/functions_func_o.html index 1caab80b22..7e1394a171 100644 --- a/docs/functions_func_o.html +++ b/docs/functions_func_o.html @@ -207,7 +207,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_p.html b/docs/functions_func_p.html index 9e0f69dbae..324d5d6f1f 100644 --- a/docs/functions_func_p.html +++ b/docs/functions_func_p.html @@ -126,7 +126,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::AACAudioSpecificConfig , shaka::media::DecoderConfigurationRecord , shaka::media::MediaParser -, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader , shaka::media::mp2t::Mp2tMediaParser , shaka::media::mp4::Box , shaka::media::mp4::MP4MediaParser @@ -196,7 +198,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::hls::HlsNotifier
  • PlayReadyKeySource() -: shaka::media::PlayReadyKeySource +: shaka::media::PlayReadyKeySource
  • Pop() : shaka::media::ByteQueue @@ -226,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::media::Muxer
  • ProducerConsumerQueue() -: shaka::media::ProducerConsumerQueue< T > +: shaka::media::ProducerConsumerQueue< T >
  • pts() : shaka::media::mp2t::PesPacket @@ -245,7 +247,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_r.html b/docs/functions_func_r.html index 532ee56701..cf24674433 100644 --- a/docs/functions_func_r.html +++ b/docs/functions_func_r.html @@ -205,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_s.html b/docs/functions_func_s.html index 46295ac93e..7decacebb9 100644 --- a/docs/functions_func_s.html +++ b/docs/functions_func_s.html @@ -240,9 +240,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • SetMuxerListener() : shaka::media::Muxer
  • -
  • SetProgramMapTableWriterForTesting() -: shaka::media::mp2t::TsWriter -
  • SetProgressListener() : shaka::media::Muxer
  • @@ -268,7 +265,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::mp2t::TsWriter
  • SimpleHlsNotifier() -: shaka::hls::SimpleHlsNotifier +: shaka::hls::SimpleHlsNotifier
  • Size() : shaka::CallbackFile @@ -321,7 +318,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_t.html b/docs/functions_func_t.html index 04f43a704c..c9e2ac97e9 100644 --- a/docs/functions_func_t.html +++ b/docs/functions_func_t.html @@ -178,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_u.html b/docs/functions_func_u.html index eca78b0d8a..66f072dded 100644 --- a/docs/functions_func_u.html +++ b/docs/functions_func_u.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_v.html b/docs/functions_func_v.html index bbe8a4f25e..d302432c85 100644 --- a/docs/functions_func_v.html +++ b/docs/functions_func_v.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_w.html b/docs/functions_func_w.html index 329c04e3ae..58ef336d3c 100644 --- a/docs/functions_func_w.html +++ b/docs/functions_func_w.html @@ -149,6 +149,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::ThreadedIoFile , shaka::UdpFile
  • +
  • WriteBits() +: shaka::media::BitWriter +
  • WriteFileAtomically() : shaka::File
  • @@ -190,7 +193,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_x.html b/docs/functions_func_x.html index cbac7d86d9..ae951c7b36 100644 --- a/docs/functions_func_x.html +++ b/docs/functions_func_x.html @@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_~.html b/docs/functions_func_~.html index eaeef94c89..3efb87151a 100644 --- a/docs/functions_func_~.html +++ b/docs/functions_func_~.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_g.html b/docs/functions_g.html index 26900d7797..65bcf3df26 100644 --- a/docs/functions_g.html +++ b/docs/functions_g.html @@ -144,12 +144,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Get() : shaka::media::HttpKeyFetcher
  • -
  • GetAdtsFrameSize() -: shaka::media::mp2t::AdtsHeader -
  • -
  • GetAdtsHeaderSize() -: shaka::media::mp2t::AdtsHeader -
  • GetAudioDefaultDuration() : shaka::media::WebMTracksParser
  • @@ -157,7 +151,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::AACAudioSpecificConfig
  • GetAudioSpecificConfig() -: shaka::media::mp2t::AdtsHeader +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • GetAudioStreamInfo() : shaka::media::WebMAudioClient @@ -194,9 +190,17 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • GetFileSize() : shaka::File
  • +
  • GetFrameSize() +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader +
  • GetHeaderSize() : shaka::media::H264VideoSliceHeaderParser , shaka::media::H265VideoSliceHeaderParser +, shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader , shaka::media::VideoSliceHeaderParser
  • GetIndexRange() @@ -220,9 +224,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::media::webm::SingleSegmentSegmenter
  • GetKey() -: shaka::media::KeySource +: shaka::media::KeySource , shaka::media::PlayReadyKeySource -, shaka::media::RawKeySource +, shaka::media::RawKeySource , shaka::media::WidevineKeySource
  • GetLanguage() @@ -237,6 +241,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • GetMaxClearOffset() : shaka::media::mp4::TrackRunIterator
  • +
  • GetMinFrameSize() +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader +
  • GetNext() : shaka::media::mp2t::ContinuityCounter
  • @@ -244,11 +253,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::mp2t::PesPacketGenerator
  • GetNumChannels() -: shaka::media::AACAudioSpecificConfig -, shaka::media::mp2t::AdtsHeader +: shaka::hls::MediaPlaylist +, shaka::media::AACAudioSpecificConfig +, shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • GetObjectType() -: shaka::media::mp2t::AdtsHeader +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • GetOutputStreamDataVector() : shaka::media::MediaHandlerGraphTestBase @@ -259,11 +273,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • GetRawPtr() : shaka::xml::XmlNode
  • +
  • GetSamplesPerFrame() +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader +
  • GetSamplesPerSecond() : shaka::media::AACAudioSpecificConfig
  • GetSamplingFrequency() -: shaka::media::mp2t::AdtsHeader +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader
  • GetSps() : shaka::media::H265Parser @@ -289,7 +310,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_h.html b/docs/functions_h.html index 5c771ca422..ce28748256 100644 --- a/docs/functions_h.html +++ b/docs/functions_h.html @@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_i.html b/docs/functions_i.html index b02632f4b8..3f3ba56eec 100644 --- a/docs/functions_i.html +++ b/docs/functions_i.html @@ -162,7 +162,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::media::MediaHandler , shaka::media::mp2t::PesPacketGenerator , shaka::media::mp2t::TsSegmenter -, shaka::media::mp2t::TsWriter , shaka::media::mp4::Segmenter , shaka::media::NalUnitToByteStreamConverter , shaka::media::VideoSliceHeaderParser @@ -229,6 +228,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • IsSyncSample() : shaka::media::mp4::SyncSampleIterator
  • +
  • IsSyncWord() +: shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader +
  • IsValid() : shaka::media::mp4::ChunkInfoIterator , shaka::media::mp4::CompositionOffsetIterator @@ -249,7 +253,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_k.html b/docs/functions_k.html index 1ea9631075..b9058212df 100644 --- a/docs/functions_k.html +++ b/docs/functions_k.html @@ -130,10 +130,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::DecryptConfig
  • kDefaultAudioBufferDurationInMs -: shaka::media::WebMClusterParser +: shaka::media::WebMClusterParser
  • kDefaultVideoBufferDurationInMs -: shaka::media::WebMClusterParser +: shaka::media::WebMClusterParser
  • kEncryptIfCryptByteBlockRemaining : shaka::media::AesPatternCryptor @@ -157,6 +157,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::WidevineDecryptionParams , shaka::WidevineEncryptionParams
  • +
  • key_uri +: shaka::HlsParams +
  • kNoKeyRotation : shaka::EncryptionParams
  • @@ -179,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_l.html b/docs/functions_l.html index 3ae2f5a31c..a174227292 100644 --- a/docs/functions_l.html +++ b/docs/functions_l.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_m.html b/docs/functions_m.html index e4074cd236..44e4265965 100644 --- a/docs/functions_m.html +++ b/docs/functions_m.html @@ -181,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_n.html b/docs/functions_n.html index a1c367df36..edcb61aaf4 100644 --- a/docs/functions_n.html +++ b/docs/functions_n.html @@ -184,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_o.html b/docs/functions_o.html index 5b02d11332..2a7c3814ca 100644 --- a/docs/functions_o.html +++ b/docs/functions_o.html @@ -220,7 +220,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_p.html b/docs/functions_p.html index cfe1efde61..df48cf773d 100644 --- a/docs/functions_p.html +++ b/docs/functions_p.html @@ -127,7 +127,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::AACAudioSpecificConfig , shaka::media::DecoderConfigurationRecord , shaka::media::MediaParser -, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::Ac3Header +, shaka::media::mp2t::AdtsHeader +, shaka::media::mp2t::AudioHeader , shaka::media::mp2t::Mp2tMediaParser , shaka::media::mp4::Box , shaka::media::mp4::MP4MediaParser @@ -237,7 +239,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , shaka::media::Muxer
  • ProducerConsumerQueue() -: shaka::media::ProducerConsumerQueue< T > +: shaka::media::ProducerConsumerQueue< T >
  • program_identifier : shaka::PlayreadyEncryptionParams @@ -262,7 +264,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_r.html b/docs/functions_r.html index fa6a0951fa..9149870a32 100644 --- a/docs/functions_r.html +++ b/docs/functions_r.html @@ -209,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_rela.html b/docs/functions_rela.html index a9d1501869..1b0aa96409 100644 --- a/docs/functions_rela.html +++ b/docs/functions_rela.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_s.html b/docs/functions_s.html index 331570c0b5..5423cfbc7d 100644 --- a/docs/functions_s.html +++ b/docs/functions_s.html @@ -254,9 +254,6 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • SetMuxerListener() : shaka::media::Muxer
  • -
  • SetProgramMapTableWriterForTesting() -: shaka::media::mp2t::TsWriter -
  • SetProgressListener() : shaka::media::Muxer
  • @@ -292,7 +289,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::WidevineSigner
  • SimpleHlsNotifier() -: shaka::hls::SimpleHlsNotifier +: shaka::hls::SimpleHlsNotifier
  • SimpleHlsNotifierTest : shaka::hls::SimpleHlsNotifier @@ -323,6 +320,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • some_handler() : shaka::media::MediaHandlerGraphTestBase
  • +
  • start_time_in_seconds +: shaka::Cuepoint +
  • StartBox() : shaka::media::mp4::BoxReader
  • @@ -330,7 +330,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : shaka::media::NaluReader
  • Status() -: shaka::Status +: shaka::Status
  • Stop() : shaka::media::ProducerConsumerQueue< T > @@ -366,7 +366,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_t.html b/docs/functions_t.html index d7d08c20c2..816d70e32a 100644 --- a/docs/functions_t.html +++ b/docs/functions_t.html @@ -190,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_type.html b/docs/functions_type.html index 756d9f8619..cb7c6a2b4f 100644 --- a/docs/functions_type.html +++ b/docs/functions_type.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_u.html b/docs/functions_u.html index a8e1992e6a..49c80214dd 100644 --- a/docs/functions_u.html +++ b/docs/functions_u.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_v.html b/docs/functions_v.html index 87d7bd65c4..02b6d2ff02 100644 --- a/docs/functions_v.html +++ b/docs/functions_v.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_vars.html b/docs/functions_vars.html index c85eefb47f..76f7bb1292 100644 --- a/docs/functions_vars.html +++ b/docs/functions_vars.html @@ -79,6 +79,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • +
  • key_uri +: shaka::HlsParams +
  • kNoKeyRotation : shaka::EncryptionParams
  • @@ -379,6 +396,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • skip_encryption : shaka::StreamDescriptor
  • +
  • start_time_in_seconds +: shaka::Cuepoint +
  • stream_label_func : shaka::EncryptionParams
  • @@ -434,7 +454,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_w.html b/docs/functions_w.html index b3ce0a85d4..de398d8c48 100644 --- a/docs/functions_w.html +++ b/docs/functions_w.html @@ -153,6 +153,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • write_func : shaka::BufferCallbackParams
  • +
  • WriteBits() +: shaka::media::BitWriter +
  • WriteFileAtomically() : shaka::File
  • @@ -194,7 +197,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_x.html b/docs/functions_x.html index 90115a3eeb..42ff0bb182 100644 --- a/docs/functions_x.html +++ b/docs/functions_x.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_~.html b/docs/functions_~.html index b031c4d0b7..41e933f18b 100644 --- a/docs/functions_~.html +++ b/docs/functions_~.html @@ -133,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/hierarchy.html b/docs/hierarchy.html index 9e0137f6e7..816914e5cf 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -91,328 +91,334 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); oCshaka::media::AACAudioSpecificConfig oCshaka::AdaptationSet |\Cshaka::MockAdaptationSet -oCshaka::media::mp2t::AdtsHeader +oCshaka::AdCueGeneratorParamsCuepoint generator related parameters oCshaka::media::AesCryptor |oCshaka::media::AesCbcDecryptorClass which implements AES-CBC (Cipher block chaining) decryption |oCshaka::media::AesEncryptor ||oCshaka::media::AesCbcEncryptor ||\Cshaka::media::AesCtrEncryptor |\Cshaka::media::AesPatternCryptorImplements pattern-based encryption/decryption -oCshaka::media::mp4::AudioRollRecoveryEntry -oCshaka::media::AudioTimestampHelper -oCBandwidthEstimator -oCshaka::media::BitReaderA class to read bit streams -oCshaka::media::mp4::Box -|oCshaka::media::mp4::AC3Specific -|oCshaka::media::mp4::AudioSampleEntry -|oCshaka::media::mp4::CodecConfiguration -|oCshaka::media::mp4::CueIDBox -|oCshaka::media::mp4::CuePayloadBox -|oCshaka::media::mp4::CueSettingsBox -|oCshaka::media::mp4::CueSourceIDBox -|oCshaka::media::mp4::CueTimeBox -|oCshaka::media::mp4::DataInformation -|oCshaka::media::mp4::DTSSpecific -|oCshaka::media::mp4::EC3Specific -|oCshaka::media::mp4::Edit -|oCshaka::media::mp4::FileType -||\Cshaka::media::mp4::SegmentType -|oCshaka::media::mp4::FullBox -||oCshaka::media::mp4::ChunkLargeOffset -|||\Cshaka::media::mp4::ChunkOffset -||oCshaka::media::mp4::CompactSampleSize -||oCshaka::media::mp4::CompositionTimeToSample -||oCshaka::media::mp4::DataEntryUrl -||oCshaka::media::mp4::DataReference -||oCshaka::media::mp4::DecodingTimeToSample -||oCshaka::media::mp4::EditList -||oCshaka::media::mp4::ElementaryStreamDescriptor -||oCshaka::media::mp4::HandlerReference -||oCshaka::media::mp4::ID3v2 -||oCshaka::media::mp4::MediaHeader -||oCshaka::media::mp4::Metadata -||oCshaka::media::mp4::MovieExtendsHeader -||oCshaka::media::mp4::MovieFragmentHeader -||oCshaka::media::mp4::MovieHeader -||oCshaka::media::mp4::ProtectionSystemSpecificHeader -||oCshaka::media::mp4::SampleAuxiliaryInformationOffset -||oCshaka::media::mp4::SampleAuxiliaryInformationSize -||oCshaka::media::mp4::SampleDescription -||oCshaka::media::mp4::SampleEncryption -||oCshaka::media::mp4::SampleGroupDescription -||oCshaka::media::mp4::SampleSize -||oCshaka::media::mp4::SampleToChunk -||oCshaka::media::mp4::SampleToGroup -||oCshaka::media::mp4::SchemeType -||oCshaka::media::mp4::SegmentIndex -||oCshaka::media::mp4::SoundMediaHeader -||oCshaka::media::mp4::SubtitleMediaHeader -||oCshaka::media::mp4::SyncSample -||oCshaka::media::mp4::TrackEncryption -||oCshaka::media::mp4::TrackExtends -||oCshaka::media::mp4::TrackFragmentDecodeTime -||oCshaka::media::mp4::TrackFragmentHeader -||oCshaka::media::mp4::TrackFragmentRun -||oCshaka::media::mp4::TrackHeader -||\Cshaka::media::mp4::VideoMediaHeader -|oCshaka::media::mp4::Media -|oCshaka::media::mp4::MediaData -|oCshaka::media::mp4::MediaInformation -|oCshaka::media::mp4::Movie -|oCshaka::media::mp4::MovieExtends -|oCshaka::media::mp4::MovieFragment -|oCshaka::media::mp4::OpusSpecific -|oCshaka::media::mp4::OriginalFormat -|oCshaka::media::mp4::PixelAspectRatio -|oCshaka::media::mp4::ProtectionSchemeInfo -|oCshaka::media::mp4::SampleTable -|oCshaka::media::mp4::SchemeInfo -|oCshaka::media::mp4::TextSampleEntry -|oCshaka::media::mp4::Track -|oCshaka::media::mp4::TrackFragment -|oCshaka::media::mp4::VideoSampleEntry -|oCshaka::media::mp4::VTTAdditionalTextBox -|oCshaka::media::mp4::VTTCueBox -|oCshaka::media::mp4::VTTEmptyCueBox -|oCshaka::media::mp4::WebVTTConfigurationBox -|\Cshaka::media::mp4::WebVTTSourceLabelBox -oCshaka::media::mp4::BoxBuffer -oCshaka::BufferCallbackParamsBuffer callback params -oCshaka::media::BufferReader -|\Cshaka::media::mp4::BoxReaderClass for reading MP4 boxes -oCshaka::media::BufferWriter -oCshaka::media::ByteQueue -oCshaka::media::mp4::CencSampleEncryptionInfoEntry -oCshaka::media::mp4::ChunkInfo -oCshaka::media::mp4::ChunkInfoIterator -oCshaka::ChunkingParamsChunking (segmentation) related parameters -oCshaka::media::Cluster -oCshaka::media::ClusterBuilder -oCshaka::media::mp4::CompositionOffset -oCshaka::media::mp4::CompositionOffsetIterator -oCshaka::media::ContentEncoding -oCshaka::ContentProtectionElement -oCshaka::media::mp2t::ContinuityCounter -oCshaka::media::Cue -oCshaka::media::DecoderConfigurationRecord -|oCshaka::media::AVCDecoderConfigurationRecordClass for parsing AVC decoder configuration record -|\Cshaka::media::HEVCDecoderConfigurationRecordClass for parsing HEVC decoder configuration record -oCshaka::media::mp4::DecodingTime -oCshaka::media::mp4::DecodingTimeIterator -oCshaka::media::DecryptConfig -oCshaka::DecryptionParamsDecryption parameters -oCshaka::media::DecryptorSourceDecryptorSource wraps KeySource and is responsible for decryptor management -oCshaka::media::wvm::DemuxStreamIdMediaSample -oCshaka::media::mp4::EditListEntry -oCshaka::Element -oCshaka::EncryptionParams::EncryptedStreamAttributesEncrypted stream information that is used to determine stream label -oCshaka::media::EncryptionConfig -oCshaka::media::EncryptionKey -oCshaka::EncryptionParamsEncryption parameters -oCshaka::media::ESDescriptor -oCshaka::media::mp2t::EsParser -|oCshaka::media::mp2t::EsParserAdts -|\Cshaka::media::mp2t::EsParserH26x -| oCshaka::media::mp2t::EsParserH264 -| \Cshaka::media::mp2t::EsParserH265 -oCshaka::FileDefine an abstract file interface -|oCshaka::CallbackFile -|oCshaka::LocalFileImplement LocalFile which deals with local storage -|oCshaka::MemoryFile -|oCshaka::ThreadedIoFileDeclaration of class which implements a thread-safe circular buffer -|\Cshaka::UdpFileImplements UdpFile, which receives UDP unicast and multicast streams -oCshaka::FileCloser -oCshaka::media::mp4::Fragmenter -oCshaka::media::H264DecRefPicMarking -oCshaka::media::H264ModificationOfPicNum -oCshaka::media::H264Parser -oCshaka::media::H264Pps -oCshaka::media::H264SEIMessage -oCshaka::media::H264SEIRecoveryPoint -oCshaka::media::H264SliceHeader -oCshaka::media::H264Sps -oCshaka::media::H264WeightingFactors -oCshaka::media::H265Parser -oCshaka::media::H265Pps -oCshaka::media::H265ReferencePictureListModifications -oCshaka::media::H265ReferencePictureSet -oCshaka::media::H265SliceHeader -oCshaka::media::H265Sps -oCshaka::media::H265VuiParameters -oCshaka::media::H26xBitReader -oCshaka::media::H26xByteToUnitStreamConverterA base class that is used to convert H.26x byte streams to NAL unit streams -|oCshaka::media::H264ByteToUnitStreamConverter -|\Cshaka::media::H265ByteToUnitStreamConverter -oCshaka::hls::HlsEntry -oCshaka::hls::HlsNotifier -|\Cshaka::hls::SimpleHlsNotifierThis is thread safe -oCshaka::HlsParamsHLS related parameters -oCIMkvWriter -|\Cshaka::media::MkvWriterAn implementation of IMkvWriter using our File type -oCshaka::IoCacheDeclaration of class which implements a thread-safe circular buffer -oCshaka::media::KeyFetcherBase class for fetching keys from the license service -|\Cshaka::media::HttpKeyFetcher -oCshaka::RawKeyParams::KeyInfo -oCshaka::media::KeySourceKeySource is responsible for encryption key acquisition -|oCshaka::media::PlayReadyKeySourceA key source that uses playready for encryption -|oCshaka::media::RawKeySourceA key source that uses raw keys for encryption -|\Cshaka::media::WidevineKeySource -oCshaka::media::mp4::Language -oCshaka::media::LibcryptoThreadingConvenience class which initializes and terminates libcrypto threading -oCshaka::media::H265SliceHeader::LongTermPicsInfo -oCshaka::hls::MasterPlaylist -oCshaka::media::MediaEvent -oCshaka::media::MediaHandler -|oCshaka::media::ChunkingHandler -|oCshaka::media::EncryptionHandler -|oCshaka::media::FakeInputMediaHandler -|oCshaka::media::FakeMediaHandler -|oCshaka::media::MockOutputMediaHandler -|oCshaka::media::Muxer -||oCshaka::media::mp2t::TsMuxer -||oCshaka::media::mp4::MP4Muxer -||\Cshaka::media::webm::WebMMuxerImplements WebM Muxer -|oCshaka::media::OriginHandler -||\Cshaka::media::Demuxer -|oCshaka::media::Replicator -|\Cshaka::media::TrickPlayHandler -oCshaka::media::MediaParser -|oCshaka::media::mp2t::Mp2tMediaParser -|oCshaka::media::mp4::MP4MediaParser -|oCshaka::media::WebMMediaParser -|oCshaka::media::WebVttMediaParser -|\Cshaka::media::wvm::WvmMediaParser -oCshaka::hls::MediaPlaylistMethods are virtual for mocking -|\Cshaka::hls::MockMediaPlaylist -oCshaka::hls::MediaPlaylistFactory -oCshaka::media::MuxerListener::MediaRanges -oCshaka::media::MediaSampleClass to hold a media sample -oCshaka::Mp4OutputParamsMP4 (ISO-BMFF) output related parameters -oCshaka::MpdBuilderThis class generates DASH MPDs (Media Presentation Descriptions) -|\Cshaka::MockMpdBuilder -oCshaka::MpdNotifier -|oCshaka::DashIopMpdNotifier -|oCshaka::MockMpdNotifier -|\Cshaka::SimpleMpdNotifier -oCshaka::MpdNotifierFactory -oCshaka::MpdOptionsDefines Mpd Options -oCshaka::MpdParamsDASH MPD related parameters -oCshaka::MpdWriter -oCshaka::media::MuxerListener -|oCshaka::media::CombinedMuxerListener -|oCshaka::media::HlsNotifyMuxerListenerMuxerListener that uses HlsNotifier -|oCshaka::media::MockMuxerListener -|oCshaka::media::MpdNotifyMuxerListener -|\Cshaka::media::VodMediaInfoDumpMuxerListener -oCshaka::media::MuxerOptionsThis structure contains the list of configuration options for Muxer -oCshaka::media::Nalu -oCshaka::media::NalUnitToByteStreamConverter -oCshaka::media::NaluReader -oCshaka::media::OffsetByteQueue -oCshaka::EncryptionParams::EncryptedStreamAttributes::OneOf -oCshaka::media::OnMediaEndParameters -oCshaka::Packager -oCshaka::PackagingParamsPackaging parameters -oCshaka::media::PeriodInfo -oCshaka::media::mp2t::PesPacketClass that carries PES packet information -oCshaka::media::mp2t::PesPacketGenerator -oCshaka::PlayreadyEncryptionParams -oCshaka::media::wvm::PrevSampleData -oCshaka::media::mp4::PrivFrameImplemented per http://id3.org/id3v2.4.0-frames -oCshaka::media::ProducerConsumerQueue< T > -oCshaka::media::mp2t::ProgramMapTableWriter -|oCshaka::media::mp2t::AacProgramMapTableWriter -|\Cshaka::media::mp2t::H264ProgramMapTableWriter -oCshaka::media::ProgressListenerThis class listens to progress updates events -oCshaka::media::ProtectionSystemSpecificInfo -oCshaka::media::Range -oCshaka::RawKeyParamsRaw key encryption/decryption parameters, i.e. with key parameters provided -oCshaka::Representation -|\Cshaka::MockRepresentation -oCshaka::RepresentationStateChangeListener -oCshaka::media::RequestSignerAbstract class used for signature generation -|oCshaka::media::AesRequestSignerAesRequestSigner uses AES-CBC signing -|\Cshaka::media::RsaRequestSignerRsaRequestSigner uses RSA-PSS signing -oCshaka::media::RsaPrivateKeyRsa private key, used for message signing and decryption -oCshaka::media::RsaPublicKeyRsa public key, used for signature verification and encryption -oCshaka::media::mp4::SampleEncryptionEntry -oCshaka::media::mp4::SampleToGroupEntry -oCshaka::media::SeekHead -oCshaka::media::mp4::Segmenter -|oCshaka::media::mp4::MultiSegmentSegmenter -|\Cshaka::media::mp4::SingleSegmentSegmenter -oCshaka::media::webm::Segmenter -|oCshaka::media::webm::MultiSegmentSegmenter -|\Cshaka::media::webm::SingleSegmentSegmenter -| \Cshaka::media::webm::TwoPassSingleSegmentSegmenter -oCshaka::media::SegmentInfo -oCshaka::SegmentInfo -oCshaka::media::mp4::SegmentReference -oCSimpleThread -|\Cshaka::media::ClosureThread -oCshaka::Status -oCshaka::media::StreamData -oCshaka::StreamDescriptorDefines a single input/output stream -oCshaka::media::StreamInfoAbstract class holds stream information -|oCshaka::media::AudioStreamInfoHolds audio stream information -|oCshaka::media::TextStreamInfo -|\Cshaka::media::VideoStreamInfoHolds video stream information -oCshaka::media::SubsampleEntry -oCshaka::media::mp4::SyncSampleIterator -oCTest -|oCshaka::media::MediaHandlerTestBase -||\Cshaka::media::MediaHandlerGraphTestBase -|\Cshaka::media::SegmentTestBase -oCshaka::TestParamsParameters used for testing -oCshaka::media::TextSample -oCshaka::media::TextTrack -oCshaka::media::TextTrackConfig -oCshaka::media::mp4::TrackRunIterator -oCshaka::media::TracksBuilder -oCshaka::media::mp2t::TsPacket -oCshaka::media::mp2t::TsSection -|oCshaka::media::mp2t::TsSectionPes -|\Cshaka::media::mp2t::TsSectionPsi -| oCshaka::media::mp2t::TsSectionPat -| \Cshaka::media::mp2t::TsSectionPmt -oCshaka::media::mp2t::TsSegmenter -oCshaka::media::mp2t::TsWriter -oCshaka::UdpOptionsOptions parsed from UDP url string of the form: udp://ip:port[?options] -oCshaka::media::VideoSliceHeaderParser -|oCshaka::media::H264VideoSliceHeaderParser -|\Cshaka::media::H265VideoSliceHeaderParser -oCshaka::media::mp2t::EsParserH26x::VideoSliceInfo -oCshaka::media::VideoStreamInfoParameters -oCshaka::media::VPCodecConfigurationRecordClass for parsing or writing VP codec configuration record -oCshaka::media::VPxFrameInfo -oCshaka::media::VPxParser -|oCshaka::media::VP8Parser -|\Cshaka::media::VP9ParserClass to parse a vp9 bit stream -oCshaka::media::WebMListParser -oCshaka::media::WebMParserClient -|oCshaka::media::SegmentTestBase::ClusterParser -|oCshaka::media::WebMAudioClientHelper class used to parse an Audio element inside a TrackEntry element -|oCshaka::media::WebMClusterParser -|oCshaka::media::WebMContentEncodingsClientParser for WebM ContentEncodings element -|oCshaka::media::WebMInfoParserParser for WebM Info element -|oCshaka::media::WebMTracksParserParser for WebM Tracks element -|\Cshaka::media::WebMVideoClientHelper class used to parse a Video element inside a TrackEntry element -oCshaka::media::WebMWebVTTParser -oCshaka::media::WebVttSampleConverter -oCshaka::WidevineDecryptionParamsWidevine decryption parameters -oCshaka::WidevineEncryptionParamsWidevine encryption parameters -oCshaka::WidevineSignerSigner credential for Widevine license server -oCshaka::xml::XmlDeleter -\Cshaka::xml::XmlNode - \Cshaka::xml::RepresentationBaseXmlNode -  oCshaka::xml::AdaptationSetXmlNodeAdaptationSetType specified in MPD -  \Cshaka::xml::RepresentationXmlNodeRepresentationType in MPD +oCshaka::media::mp2t::AudioHeader +|oCshaka::media::mp2t::Ac3Header +|\Cshaka::media::mp2t::AdtsHeader +oCshaka::media::mp4::AudioRollRecoveryEntry +oCshaka::media::AudioTimestampHelper +oCBandwidthEstimator +oCshaka::media::BitReaderA class to read bit streams +oCshaka::media::BitWriter +oCshaka::media::mp4::Box +|oCshaka::media::mp4::AC3Specific +|oCshaka::media::mp4::AudioSampleEntry +|oCshaka::media::mp4::CodecConfiguration +|oCshaka::media::mp4::CueIDBox +|oCshaka::media::mp4::CuePayloadBox +|oCshaka::media::mp4::CueSettingsBox +|oCshaka::media::mp4::CueSourceIDBox +|oCshaka::media::mp4::CueTimeBox +|oCshaka::media::mp4::DataInformation +|oCshaka::media::mp4::DTSSpecific +|oCshaka::media::mp4::EC3Specific +|oCshaka::media::mp4::Edit +|oCshaka::media::mp4::FileType +||\Cshaka::media::mp4::SegmentType +|oCshaka::media::mp4::FullBox +||oCshaka::media::mp4::ChunkLargeOffset +|||\Cshaka::media::mp4::ChunkOffset +||oCshaka::media::mp4::CompactSampleSize +||oCshaka::media::mp4::CompositionTimeToSample +||oCshaka::media::mp4::DataEntryUrl +||oCshaka::media::mp4::DataReference +||oCshaka::media::mp4::DecodingTimeToSample +||oCshaka::media::mp4::EditList +||oCshaka::media::mp4::ElementaryStreamDescriptor +||oCshaka::media::mp4::HandlerReference +||oCshaka::media::mp4::ID3v2 +||oCshaka::media::mp4::MediaHeader +||oCshaka::media::mp4::Metadata +||oCshaka::media::mp4::MovieExtendsHeader +||oCshaka::media::mp4::MovieFragmentHeader +||oCshaka::media::mp4::MovieHeader +||oCshaka::media::mp4::ProtectionSystemSpecificHeader +||oCshaka::media::mp4::SampleAuxiliaryInformationOffset +||oCshaka::media::mp4::SampleAuxiliaryInformationSize +||oCshaka::media::mp4::SampleDescription +||oCshaka::media::mp4::SampleEncryption +||oCshaka::media::mp4::SampleGroupDescription +||oCshaka::media::mp4::SampleSize +||oCshaka::media::mp4::SampleToChunk +||oCshaka::media::mp4::SampleToGroup +||oCshaka::media::mp4::SchemeType +||oCshaka::media::mp4::SegmentIndex +||oCshaka::media::mp4::SoundMediaHeader +||oCshaka::media::mp4::SubtitleMediaHeader +||oCshaka::media::mp4::SyncSample +||oCshaka::media::mp4::TrackEncryption +||oCshaka::media::mp4::TrackExtends +||oCshaka::media::mp4::TrackFragmentDecodeTime +||oCshaka::media::mp4::TrackFragmentHeader +||oCshaka::media::mp4::TrackFragmentRun +||oCshaka::media::mp4::TrackHeader +||\Cshaka::media::mp4::VideoMediaHeader +|oCshaka::media::mp4::Media +|oCshaka::media::mp4::MediaData +|oCshaka::media::mp4::MediaInformation +|oCshaka::media::mp4::Movie +|oCshaka::media::mp4::MovieExtends +|oCshaka::media::mp4::MovieFragment +|oCshaka::media::mp4::OpusSpecific +|oCshaka::media::mp4::OriginalFormat +|oCshaka::media::mp4::PixelAspectRatio +|oCshaka::media::mp4::ProtectionSchemeInfo +|oCshaka::media::mp4::SampleTable +|oCshaka::media::mp4::SchemeInfo +|oCshaka::media::mp4::TextSampleEntry +|oCshaka::media::mp4::Track +|oCshaka::media::mp4::TrackFragment +|oCshaka::media::mp4::VideoSampleEntry +|oCshaka::media::mp4::VTTAdditionalTextBox +|oCshaka::media::mp4::VTTCueBox +|oCshaka::media::mp4::VTTEmptyCueBox +|oCshaka::media::mp4::WebVTTConfigurationBox +|\Cshaka::media::mp4::WebVTTSourceLabelBox +oCshaka::media::mp4::BoxBuffer +oCshaka::BufferCallbackParamsBuffer callback params +oCshaka::media::BufferReader +|\Cshaka::media::mp4::BoxReaderClass for reading MP4 boxes +oCshaka::media::BufferWriter +oCshaka::media::ByteQueue +oCshaka::media::mp4::CencSampleEncryptionInfoEntry +oCshaka::media::mp4::ChunkInfo +oCshaka::media::mp4::ChunkInfoIterator +oCshaka::ChunkingParamsChunking (segmentation) related parameters +oCshaka::media::Cluster +oCshaka::media::ClusterBuilder +oCshaka::media::mp4::CompositionOffset +oCshaka::media::mp4::CompositionOffsetIterator +oCshaka::media::ContentEncoding +oCshaka::ContentProtectionElement +oCshaka::media::mp2t::ContinuityCounter +oCshaka::media::Cue +oCshaka::media::CueEvent +oCshaka::Cuepoint +oCshaka::media::DecoderConfigurationRecord +|oCshaka::media::AVCDecoderConfigurationRecordClass for parsing AVC decoder configuration record +|\Cshaka::media::HEVCDecoderConfigurationRecordClass for parsing HEVC decoder configuration record +oCshaka::media::mp4::DecodingTime +oCshaka::media::mp4::DecodingTimeIterator +oCshaka::media::DecryptConfig +oCshaka::DecryptionParamsDecryption parameters +oCshaka::media::DecryptorSourceDecryptorSource wraps KeySource and is responsible for decryptor management +oCshaka::media::wvm::DemuxStreamIdMediaSample +oCshaka::media::mp4::EditListEntry +oCshaka::Element +oCshaka::EncryptionParams::EncryptedStreamAttributesEncrypted stream information that is used to determine stream label +oCshaka::media::EncryptionConfig +oCshaka::media::EncryptionKey +oCshaka::EncryptionParamsEncryption parameters +oCshaka::media::ESDescriptor +oCshaka::media::mp2t::EsParser +|oCshaka::media::mp2t::EsParserAudio +|\Cshaka::media::mp2t::EsParserH26x +| oCshaka::media::mp2t::EsParserH264 +| \Cshaka::media::mp2t::EsParserH265 +oCshaka::FileDefine an abstract file interface +|oCshaka::CallbackFile +|oCshaka::LocalFileImplement LocalFile which deals with local storage +|oCshaka::MemoryFile +|oCshaka::ThreadedIoFileDeclaration of class which implements a thread-safe circular buffer +|\Cshaka::UdpFileImplements UdpFile, which receives UDP unicast and multicast streams +oCshaka::FileCloser +oCshaka::media::mp4::Fragmenter +oCshaka::media::H264DecRefPicMarking +oCshaka::media::H264ModificationOfPicNum +oCshaka::media::H264Parser +oCshaka::media::H264Pps +oCshaka::media::H264SEIMessage +oCshaka::media::H264SEIRecoveryPoint +oCshaka::media::H264SliceHeader +oCshaka::media::H264Sps +oCshaka::media::H264WeightingFactors +oCshaka::media::H265Parser +oCshaka::media::H265Pps +oCshaka::media::H265ReferencePictureListModifications +oCshaka::media::H265ReferencePictureSet +oCshaka::media::H265SliceHeader +oCshaka::media::H265Sps +oCshaka::media::H265VuiParameters +oCshaka::media::H26xBitReader +oCshaka::media::H26xByteToUnitStreamConverterA base class that is used to convert H.26x byte streams to NAL unit streams +|oCshaka::media::H264ByteToUnitStreamConverter +|\Cshaka::media::H265ByteToUnitStreamConverter +oCshaka::hls::HlsEntry +oCshaka::hls::HlsNotifier +|\Cshaka::hls::SimpleHlsNotifierThis is thread safe +oCshaka::HlsParamsHLS related parameters +oCIMkvWriter +|\Cshaka::media::MkvWriterAn implementation of IMkvWriter using our File type +oCshaka::IoCacheDeclaration of class which implements a thread-safe circular buffer +oCshaka::media::KeyFetcherBase class for fetching keys from the license service +|\Cshaka::media::HttpKeyFetcher +oCshaka::RawKeyParams::KeyInfo +oCshaka::media::KeySourceKeySource is responsible for encryption key acquisition +|oCshaka::media::PlayReadyKeySourceA key source that uses playready for encryption +|oCshaka::media::RawKeySourceA key source that uses raw keys for encryption +|\Cshaka::media::WidevineKeySource +oCshaka::media::mp4::Language +oCshaka::media::LibcryptoThreadingConvenience class which initializes and terminates libcrypto threading +oCshaka::media::H265SliceHeader::LongTermPicsInfo +oCshaka::hls::MasterPlaylist +oCshaka::media::MediaHandler +|oCshaka::media::AdCueGeneratorAdCueGenerator converts out of band cuepoint markers into SCTE-35 events +|oCshaka::media::ChunkingHandler +|oCshaka::media::EncryptionHandler +|oCshaka::media::FakeInputMediaHandler +|oCshaka::media::FakeMediaHandler +|oCshaka::media::MockOutputMediaHandler +|oCshaka::media::Muxer +||oCshaka::media::mp2t::TsMuxer +||oCshaka::media::mp4::MP4Muxer +||\Cshaka::media::webm::WebMMuxerImplements WebM Muxer +|oCshaka::media::OriginHandler +||\Cshaka::media::Demuxer +|oCshaka::media::Replicator +|\Cshaka::media::TrickPlayHandler +oCshaka::media::MediaParser +|oCshaka::media::mp2t::Mp2tMediaParser +|oCshaka::media::mp4::MP4MediaParser +|oCshaka::media::WebMMediaParser +|oCshaka::media::WebVttMediaParser +|\Cshaka::media::wvm::WvmMediaParser +oCshaka::hls::MediaPlaylistMethods are virtual for mocking +|\Cshaka::hls::MockMediaPlaylist +oCshaka::hls::MediaPlaylistFactory +oCshaka::media::MuxerListener::MediaRanges +oCshaka::media::MediaSampleClass to hold a media sample +oCshaka::Mp4OutputParamsMP4 (ISO-BMFF) output related parameters +oCshaka::MpdBuilderThis class generates DASH MPDs (Media Presentation Descriptions) +|\Cshaka::MockMpdBuilder +oCshaka::MpdNotifier +|oCshaka::DashIopMpdNotifier +|oCshaka::MockMpdNotifier +|\Cshaka::SimpleMpdNotifier +oCshaka::MpdNotifierFactory +oCshaka::MpdOptionsDefines Mpd Options +oCshaka::MpdParamsDASH MPD related parameters +oCshaka::MpdWriter +oCshaka::media::MuxerListener +|oCshaka::media::CombinedMuxerListener +|oCshaka::media::HlsNotifyMuxerListenerMuxerListener that uses HlsNotifier +|oCshaka::media::MockMuxerListener +|oCshaka::media::MpdNotifyMuxerListener +|\Cshaka::media::VodMediaInfoDumpMuxerListener +oCshaka::media::MuxerOptionsThis structure contains the list of configuration options for Muxer +oCshaka::media::Nalu +oCshaka::media::NalUnitToByteStreamConverter +oCshaka::media::NaluReader +oCshaka::media::OffsetByteQueue +oCshaka::EncryptionParams::EncryptedStreamAttributes::OneOf +oCshaka::media::OnMediaEndParameters +oCshaka::Packager +oCshaka::PackagingParamsPackaging parameters +oCshaka::media::mp2t::PesPacketClass that carries PES packet information +oCshaka::media::mp2t::PesPacketGenerator +oCshaka::PlayreadyEncryptionParams +oCshaka::media::wvm::PrevSampleData +oCshaka::media::mp4::PrivFrameImplemented per http://id3.org/id3v2.4.0-frames +oCshaka::media::ProducerConsumerQueue< T > +oCshaka::media::mp2t::ProgramMapTableWriterPuts PMT into TS packets and writes them to buffer +|oCshaka::media::mp2t::AudioProgramMapTableWriterProgramMapTableWriter for video codecs +|\Cshaka::media::mp2t::VideoProgramMapTableWriterProgramMapTableWriter for video codecs +oCshaka::media::ProgressListenerThis class listens to progress updates events +oCshaka::media::ProtectionSystemSpecificInfo +oCshaka::media::Range +oCshaka::RawKeyParamsRaw key encryption/decryption parameters, i.e. with key parameters provided +oCshaka::Representation +|\Cshaka::MockRepresentation +oCshaka::RepresentationStateChangeListener +oCshaka::media::RequestSignerAbstract class used for signature generation +|oCshaka::media::AesRequestSignerAesRequestSigner uses AES-CBC signing +|\Cshaka::media::RsaRequestSignerRsaRequestSigner uses RSA-PSS signing +oCshaka::media::RsaPrivateKeyRsa private key, used for message signing and decryption +oCshaka::media::RsaPublicKeyRsa public key, used for signature verification and encryption +oCshaka::media::mp4::SampleEncryptionEntry +oCshaka::media::mp4::SampleToGroupEntry +oCshaka::media::Scte35Event +oCshaka::media::SeekHead +oCshaka::media::webm::Segmenter +|oCshaka::media::webm::MultiSegmentSegmenter +|\Cshaka::media::webm::SingleSegmentSegmenter +| \Cshaka::media::webm::TwoPassSingleSegmentSegmenter +oCshaka::media::mp4::Segmenter +|oCshaka::media::mp4::MultiSegmentSegmenter +|\Cshaka::media::mp4::SingleSegmentSegmenter +oCshaka::SegmentInfo +oCshaka::media::SegmentInfo +oCshaka::media::mp4::SegmentReference +oCSimpleThread +|\Cshaka::media::ClosureThread +oCshaka::Status +oCshaka::media::StreamData +oCshaka::StreamDescriptorDefines a single input/output stream +oCshaka::media::StreamInfoAbstract class holds stream information +|oCshaka::media::AudioStreamInfoHolds audio stream information +|oCshaka::media::TextStreamInfo +|\Cshaka::media::VideoStreamInfoHolds video stream information +oCshaka::media::SubsampleEntry +oCshaka::media::mp4::SyncSampleIterator +oCTest +|oCshaka::media::MediaHandlerTestBase +||\Cshaka::media::MediaHandlerGraphTestBase +|\Cshaka::media::SegmentTestBase +oCshaka::TestParamsParameters used for testing +oCshaka::media::TextSample +oCshaka::media::TextTrack +oCshaka::media::TextTrackConfig +oCshaka::media::mp4::TrackRunIterator +oCshaka::media::TracksBuilder +oCshaka::media::mp2t::TsPacket +oCshaka::media::mp2t::TsSection +|oCshaka::media::mp2t::TsSectionPes +|\Cshaka::media::mp2t::TsSectionPsi +| oCshaka::media::mp2t::TsSectionPat +| \Cshaka::media::mp2t::TsSectionPmt +oCshaka::media::mp2t::TsSegmenter +oCshaka::media::mp2t::TsWriter +oCshaka::UdpOptionsOptions parsed from UDP url string of the form: udp://ip:port[?options] +oCshaka::media::VideoSliceHeaderParser +|oCshaka::media::H264VideoSliceHeaderParser +|\Cshaka::media::H265VideoSliceHeaderParser +oCshaka::media::mp2t::EsParserH26x::VideoSliceInfo +oCshaka::media::VideoStreamInfoParameters +oCshaka::media::VPCodecConfigurationRecordClass for parsing or writing VP codec configuration record +oCshaka::media::VPxFrameInfo +oCshaka::media::VPxParser +|oCshaka::media::VP8Parser +|\Cshaka::media::VP9ParserClass to parse a vp9 bit stream +oCshaka::media::WebMListParser +oCshaka::media::WebMParserClient +|oCshaka::media::SegmentTestBase::ClusterParser +|oCshaka::media::WebMAudioClientHelper class used to parse an Audio element inside a TrackEntry element +|oCshaka::media::WebMClusterParser +|oCshaka::media::WebMContentEncodingsClientParser for WebM ContentEncodings element +|oCshaka::media::WebMInfoParserParser for WebM Info element +|oCshaka::media::WebMTracksParserParser for WebM Tracks element +|\Cshaka::media::WebMVideoClientHelper class used to parse a Video element inside a TrackEntry element +oCshaka::media::WebMWebVTTParser +oCshaka::media::WebVttSampleConverter +oCshaka::WidevineDecryptionParamsWidevine decryption parameters +oCshaka::WidevineEncryptionParamsWidevine encryption parameters +oCshaka::WidevineSignerSigner credential for Widevine license server +oCshaka::xml::XmlDeleter +\Cshaka::xml::XmlNode + \Cshaka::xml::RepresentationBaseXmlNode +  oCshaka::xml::AdaptationSetXmlNodeAdaptationSetType specified in MPD +  \Cshaka::xml::RepresentationXmlNodeRepresentationType in MPD diff --git a/docs/index.html b/docs/index.html index 4bc42c3c65..3991d773de 100644 --- a/docs/index.html +++ b/docs/index.html @@ -81,7 +81,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/namespacemembers.html b/docs/namespacemembers.html index 16f2db3265..8c1e58ed6e 100644 --- a/docs/namespacemembers.html +++ b/docs/namespacemembers.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/namespacemembers_enum.html b/docs/namespacemembers_enum.html index 3cfee77a2a..56456e30f4 100644 --- a/docs/namespacemembers_enum.html +++ b/docs/namespacemembers_enum.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/namespacemembers_func.html b/docs/namespacemembers_func.html index 3684661c76..9ba0e0d4bf 100644 --- a/docs/namespacemembers_func.html +++ b/docs/namespacemembers_func.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/namespaces.html b/docs/namespaces.html index 1d59cf7807..8e7b971476 100644 --- a/docs/namespaces.html +++ b/docs/namespaces.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/search/all_0.js b/docs/search/all_0.js index 11892ef9d6..8fd04cd7b0 100644 --- a/docs/search/all_0.js +++ b/docs/search/all_0.js @@ -1,12 +1,15 @@ var searchData= [ ['aacaudiospecificconfig',['AACAudioSpecificConfig',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html',1,'shaka::media']]], - ['aacprogrammaptablewriter',['AacProgramMapTableWriter',['../d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html',1,'shaka::media::mp2t']]], + ['ac3header',['Ac3Header',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html',1,'shaka::media::mp2t']]], ['ac3specific',['AC3Specific',['../d4/dfa/structshaka_1_1media_1_1mp4_1_1AC3Specific.html',1,'shaka::media::mp4']]], + ['ad_5fcue_5fgenerator_5fparams',['ad_cue_generator_params',['../d5/de3/structshaka_1_1PackagingParams.html#aa52d546c86b3b36234bcfc0cd50ef083',1,'shaka::PackagingParams']]], ['adaptation_5fset_5fswitching_5fids',['adaptation_set_switching_ids',['../d8/d8e/classshaka_1_1AdaptationSet.html#a8674f458c599af4d5ebc104a2f7bd8ae',1,'shaka::AdaptationSet']]], ['adaptationset',['AdaptationSet',['../d8/d8e/classshaka_1_1AdaptationSet.html',1,'shaka']]], ['adaptationset',['AdaptationSet',['../d8/d8e/classshaka_1_1AdaptationSet.html#a78925e61038e8bbd776652a539edb129',1,'shaka::AdaptationSet']]], ['adaptationsetxmlnode',['AdaptationSetXmlNode',['../d1/de7/classshaka_1_1xml_1_1AdaptationSetXmlNode.html',1,'shaka::xml']]], + ['adcuegenerator',['AdCueGenerator',['../de/de4/classshaka_1_1media_1_1AdCueGenerator.html',1,'shaka::media']]], + ['adcuegeneratorparams',['AdCueGeneratorParams',['../dd/dfd/structshaka_1_1AdCueGeneratorParams.html',1,'shaka']]], ['addadaptationset',['AddAdaptationSet',['../dc/da1/classshaka_1_1MpdBuilder.html#ad32d4f20e6325b20267a2e905e1ec243',1,'shaka::MpdBuilder']]], ['addadaptationsetswitching',['AddAdaptationSetSwitching',['../d8/d8e/classshaka_1_1AdaptationSet.html#af934da43aef6260e7e7a469d9f796661',1,'shaka::AdaptationSet']]], ['addaudioinfo',['AddAudioInfo',['../df/d9e/classshaka_1_1xml_1_1RepresentationXmlNode.html#a49050cf0e7883bfa6e8e2fb0174b2a7a',1,'shaka::xml::RepresentationXmlNode']]], @@ -38,8 +41,8 @@ var searchData= ['advancechunk',['AdvanceChunk',['../d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html#aacde1d08a3ce21cf187a1dff4fe031b4',1,'shaka::media::mp4::ChunkInfoIterator']]], ['advancerun',['AdvanceRun',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#ada6e03ef97d03b7c11ef7ac873461364',1,'shaka::media::mp4::TrackRunIterator']]], ['advancesample',['AdvanceSample',['../d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html#abed93049cf801c0c3795801da9d5ff7c',1,'shaka::media::mp4::ChunkInfoIterator::AdvanceSample()'],['../db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html#afa13feae7d7b96708264877e3198f939',1,'shaka::media::mp4::CompositionOffsetIterator::AdvanceSample()'],['../d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html#aec68fe0d0dcccedfe2d898320fd534d5',1,'shaka::media::mp4::DecodingTimeIterator::AdvanceSample()'],['../d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html#a2f3f28acc6ecd10f8b30bab65334609d',1,'shaka::media::mp4::SyncSampleIterator::AdvanceSample()'],['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#a6ff6e2ce67a54051c5a7e39dfadcb48d',1,'shaka::media::mp4::TrackRunIterator::AdvanceSample()']]], - ['aescbcdecryptor',['AesCbcDecryptor',['../df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html#a855ab9fa2f350879a7716ec90033f825',1,'shaka::media::AesCbcDecryptor::AesCbcDecryptor(CbcPaddingScheme padding_scheme)'],['../df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html#a350d11c34c42ee4d4e62cdd7aebc5fbb',1,'shaka::media::AesCbcDecryptor::AesCbcDecryptor(CbcPaddingScheme padding_scheme, ConstantIvFlag constant_iv_flag)']]], ['aescbcdecryptor',['AesCbcDecryptor',['../df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html',1,'shaka::media']]], + ['aescbcdecryptor',['AesCbcDecryptor',['../df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html#a855ab9fa2f350879a7716ec90033f825',1,'shaka::media::AesCbcDecryptor::AesCbcDecryptor(CbcPaddingScheme padding_scheme)'],['../df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html#a350d11c34c42ee4d4e62cdd7aebc5fbb',1,'shaka::media::AesCbcDecryptor::AesCbcDecryptor(CbcPaddingScheme padding_scheme, ConstantIvFlag constant_iv_flag)']]], ['aescbcencryptor',['AesCbcEncryptor',['../d4/d20/classshaka_1_1media_1_1AesCbcEncryptor.html',1,'shaka::media']]], ['aescbcencryptor',['AesCbcEncryptor',['../d4/d20/classshaka_1_1media_1_1AesCbcEncryptor.html#a2cc8f20b92d884d959b3a586b527fece',1,'shaka::media::AesCbcEncryptor::AesCbcEncryptor(CbcPaddingScheme padding_scheme)'],['../d4/d20/classshaka_1_1media_1_1AesCbcEncryptor.html#adbe4df9a37be949487a806301d143230',1,'shaka::media::AesCbcEncryptor::AesCbcEncryptor(CbcPaddingScheme padding_scheme, ConstantIvFlag constant_iv_flag)']]], ['aescryptor',['AesCryptor',['../df/d87/classshaka_1_1media_1_1AesCryptor.html',1,'shaka::media']]], @@ -47,16 +50,18 @@ var searchData= ['aesctrencryptor',['AesCtrEncryptor',['../d0/dd8/classshaka_1_1media_1_1AesCtrEncryptor.html',1,'shaka::media']]], ['aesencryptor',['AesEncryptor',['../d3/d75/classshaka_1_1media_1_1AesEncryptor.html#a873b0794baca91b36dbc484fc9c37e58',1,'shaka::media::AesEncryptor']]], ['aesencryptor',['AesEncryptor',['../d3/d75/classshaka_1_1media_1_1AesEncryptor.html',1,'shaka::media']]], - ['aespatterncryptor',['AesPatternCryptor',['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html#abb94f2d6a527b12854e81839fd10e1d5',1,'shaka::media::AesPatternCryptor']]], ['aespatterncryptor',['AesPatternCryptor',['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html',1,'shaka::media']]], + ['aespatterncryptor',['AesPatternCryptor',['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html#abb94f2d6a527b12854e81839fd10e1d5',1,'shaka::media::AesPatternCryptor']]], ['aesrequestsigner',['AesRequestSigner',['../d9/d8c/classshaka_1_1media_1_1AesRequestSigner.html',1,'shaka::media']]], ['appendint',['AppendInt',['../dc/d41/classshaka_1_1media_1_1BufferWriter.html#abd8854feedd8b45146eb04dacf7d5b2f',1,'shaka::media::BufferWriter']]], ['appendnbytes',['AppendNBytes',['../dc/d41/classshaka_1_1media_1_1BufferWriter.html#ae44b09c03c9b8f0fbf58deb80355f299',1,'shaka::media::BufferWriter']]], ['audio_5fdescription',['audio_description',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#adb40e673e8025ca51740a50eb20d89b2',1,'shaka::media::mp4::TrackRunIterator']]], + ['audioheader',['AudioHeader',['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html',1,'shaka::media::mp2t']]], + ['audioprogrammaptablewriter',['AudioProgramMapTableWriter',['../dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.html',1,'shaka::media::mp2t']]], ['audiorollrecoveryentry',['AudioRollRecoveryEntry',['../da/d6e/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry.html',1,'shaka::media::mp4']]], ['audiosampleentry',['AudioSampleEntry',['../d8/d5b/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry.html',1,'shaka::media::mp4']]], - ['audiostreaminfo',['AudioStreamInfo',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html',1,'shaka::media']]], ['audiostreaminfo',['AudioStreamInfo',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html#a1333ea7b15790da37addb60ba49131b4',1,'shaka::media::AudioStreamInfo']]], + ['audiostreaminfo',['AudioStreamInfo',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html',1,'shaka::media']]], ['audiotimestamphelper',['AudioTimestampHelper',['../d0/d4d/classshaka_1_1media_1_1AudioTimestampHelper.html',1,'shaka::media']]], ['auxinfoneedstobecached',['AuxInfoNeedsToBeCached',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#a8d4fb433e66fec693035cac796ca6851',1,'shaka::media::mp4::TrackRunIterator']]], ['avcdecoderconfigurationrecord',['AVCDecoderConfigurationRecord',['../d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html',1,'shaka::media']]] diff --git a/docs/search/all_1.js b/docs/search/all_1.js index 12e6c9f203..9880683b6b 100644 --- a/docs/search/all_1.js +++ b/docs/search/all_1.js @@ -5,23 +5,27 @@ var searchData= ['base_5furl',['base_url',['../d0/da8/structshaka_1_1HlsParams.html#a546dcdf68c8a0a5e188f84b5c9fca9dd',1,'shaka::HlsParams']]], ['base_5furls',['base_urls',['../df/ddc/structshaka_1_1MpdParams.html#a9fe508f9c56a6424fd857d43a4a69e7c',1,'shaka::MpdParams']]], ['bit_5fposition',['bit_position',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a6b7456b84d6b463767127b57cd0dc898',1,'shaka::media::BitReader']]], + ['bitpos',['BitPos',['../dc/d76/classshaka_1_1media_1_1BitWriter.html#afae1e44d677e793d883ba069970b17f8',1,'shaka::media::BitWriter']]], ['bitrate',['Bitrate',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#ab518406ca3fb7785e103ab0bdb06ade9',1,'shaka::hls::MediaPlaylist']]], - ['bitreader',['BitReader',['../d6/da9/classshaka_1_1media_1_1BitReader.html',1,'shaka::media']]], ['bitreader',['BitReader',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a264dbe3e94ba76214c1af75ab3877945',1,'shaka::media::BitReader']]], + ['bitreader',['BitReader',['../d6/da9/classshaka_1_1media_1_1BitReader.html',1,'shaka::media']]], ['bits_5favailable',['bits_available',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a1c1e1225c2780383e72996137bb7f86a',1,'shaka::media::BitReader']]], + ['bitwriter',['BitWriter',['../dc/d76/classshaka_1_1media_1_1BitWriter.html#a09495a53bd1f1885dcc328b1621041f4',1,'shaka::media::BitWriter']]], + ['bitwriter',['BitWriter',['../dc/d76/classshaka_1_1media_1_1BitWriter.html',1,'shaka::media']]], ['box',['Box',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html',1,'shaka::media::mp4']]], ['box_5fsize',['box_size',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#ad0186e0f9301bd07c52a55a8b1db0419',1,'shaka::media::mp4::Box']]], - ['boxbuffer',['BoxBuffer',['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html',1,'shaka::media::mp4']]], ['boxbuffer',['BoxBuffer',['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html#a787a6a6404dfc1fed10dfd903b4e4d22',1,'shaka::media::mp4::BoxBuffer::BoxBuffer(BoxReader *reader)'],['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html#a021513a50af89992b15691dfc79ed447',1,'shaka::media::mp4::BoxBuffer::BoxBuffer(BufferWriter *writer)']]], + ['boxbuffer',['BoxBuffer',['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html',1,'shaka::media::mp4']]], ['boxreader',['BoxReader',['../d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html',1,'shaka::media::mp4']]], ['boxtype',['BoxType',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#ac7c07671ab4c56d19e085570862015ca',1,'shaka::media::mp4::Box::BoxType()'],['../d5/d03/structshaka_1_1media_1_1mp4_1_1FileType.html#a038c8454ffed2e8bf32c858ddae320e1',1,'shaka::media::mp4::FileType::BoxType()'],['../d3/dd0/structshaka_1_1media_1_1mp4_1_1SegmentType.html#ab3c10a2cd4a8162a91265b0cfd53de09',1,'shaka::media::mp4::SegmentType::BoxType()'],['../d0/d3c/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html#aae81fc1f70a0cdb8161dbafdbe80b099',1,'shaka::media::mp4::ProtectionSystemSpecificHeader::BoxType()'],['../d5/dca/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html#a63843ee864061fef2d6f788ad240aa44',1,'shaka::media::mp4::SampleAuxiliaryInformationOffset::BoxType()'],['../dd/d13/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html#a909bcffee3acdc7754539a22546d1c76',1,'shaka::media::mp4::SampleAuxiliaryInformationSize::BoxType()'],['../d4/dad/structshaka_1_1media_1_1mp4_1_1SampleEncryption.html#a62cd7e5cc8c102db09cbd3d7947604dd',1,'shaka::media::mp4::SampleEncryption::BoxType()'],['../d5/d05/structshaka_1_1media_1_1mp4_1_1OriginalFormat.html#a4901c12c42b47485da0a95e8671de686',1,'shaka::media::mp4::OriginalFormat::BoxType()'],['../d3/da2/structshaka_1_1media_1_1mp4_1_1SchemeType.html#a76da5fef2de39a070fe61055e013b7c1',1,'shaka::media::mp4::SchemeType::BoxType()'],['../db/db8/structshaka_1_1media_1_1mp4_1_1TrackEncryption.html#a702b5c406fdac82ea3e3cb4de88d1c55',1,'shaka::media::mp4::TrackEncryption::BoxType()'],['../d2/d70/structshaka_1_1media_1_1mp4_1_1SchemeInfo.html#a5a50e58f6dcd3969bdeb07fb66a9d4dc',1,'shaka::media::mp4::SchemeInfo::BoxType()'],['../da/de9/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html#a09f2c7d00252d23003506285b30d9267',1,'shaka::media::mp4::ProtectionSchemeInfo::BoxType()'],['../d6/d1a/structshaka_1_1media_1_1mp4_1_1MovieHeader.html#a0bbd09e7f0bc8effc1c1ba7f5b8d49d6',1,'shaka::media::mp4::MovieHeader::BoxType()'],['../da/dc4/structshaka_1_1media_1_1mp4_1_1TrackHeader.html#a7880b5742f038be62ca83693883814d3',1,'shaka::media::mp4::TrackHeader::BoxType()'],['../d3/dbe/structshaka_1_1media_1_1mp4_1_1EditList.html#af8ba6778f3fa9b239126ae635d8e9703',1,'shaka::media::mp4::EditList::BoxType()'],['../da/dd0/structshaka_1_1media_1_1mp4_1_1Edit.html#a44e5523c2fa791cae8dd3e36feee81ac',1,'shaka::media::mp4::Edit::BoxType()'],['../da/dbb/structshaka_1_1media_1_1mp4_1_1HandlerReference.html#a71203a734c203f04967eaf1676440ad9',1,'shaka::media::mp4::HandlerReference::BoxType()'],['../d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html#acb41577286eeba57541fed6cd0cabbf2',1,'shaka::media::mp4::ID3v2::BoxType()'],['../dd/df6/structshaka_1_1media_1_1mp4_1_1Metadata.html#aca63db6a124f0d0a62b6a355a89d9f1d',1,'shaka::media::mp4::Metadata::BoxType()'],['../db/d11/structshaka_1_1media_1_1mp4_1_1CodecConfiguration.html#a1e9cb483b993bff202ec6143f892972e',1,'shaka::media::mp4::CodecConfiguration::BoxType()'],['../dd/d71/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio.html#ae12482d2916a9e6b7ecdee1c944c3c91',1,'shaka::media::mp4::PixelAspectRatio::BoxType()'],['../d0/d73/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry.html#a56ed4864ffdb37094b5f3352f53bc755',1,'shaka::media::mp4::VideoSampleEntry::BoxType()'],['../d5/d11/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html#a579ea111ae1e304e27cb0b8d9f52c99c',1,'shaka::media::mp4::ElementaryStreamDescriptor::BoxType()'],['../dc/da0/structshaka_1_1media_1_1mp4_1_1DTSSpecific.html#aa84cd76627aaaf58e2137935b6116346',1,'shaka::media::mp4::DTSSpecific::BoxType()'],['../d4/dfa/structshaka_1_1media_1_1mp4_1_1AC3Specific.html#aa3d0fa9297d15d210f1529eeff8e3d09',1,'shaka::media::mp4::AC3Specific::BoxType()'],['../d4/d8d/structshaka_1_1media_1_1mp4_1_1EC3Specific.html#a926ae9221e26938071abb3ec5988eaf5',1,'shaka::media::mp4::EC3Specific::BoxType()'],['../de/dfa/structshaka_1_1media_1_1mp4_1_1OpusSpecific.html#a6d71265a8782db78c4ed3c2331179418',1,'shaka::media::mp4::OpusSpecific::BoxType()'],['../d8/d5b/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry.html#ab10582a2954863ffcc26ec7373d42d56',1,'shaka::media::mp4::AudioSampleEntry::BoxType()'],['../d8/d20/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html#a90c78b82d88afcce6bcb4f5c96fa08b9',1,'shaka::media::mp4::WebVTTConfigurationBox::BoxType()'],['../d4/d33/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html#a90a955dc811f20242aa03eea0758ae55',1,'shaka::media::mp4::WebVTTSourceLabelBox::BoxType()'],['../d7/dc3/structshaka_1_1media_1_1mp4_1_1TextSampleEntry.html#aa3471e1884adc4351293a18fb2ee33fb',1,'shaka::media::mp4::TextSampleEntry::BoxType()'],['../da/df5/structshaka_1_1media_1_1mp4_1_1SampleDescription.html#a55c299ae4b388109dccc7b84feb45089',1,'shaka::media::mp4::SampleDescription::BoxType()'],['../de/def/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample.html#a16599ced0758987dec6d8678faa7a7b9',1,'shaka::media::mp4::DecodingTimeToSample::BoxType()'],['../df/d7b/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample.html#a53a999ce269642a6f6cb5b9301ca0740',1,'shaka::media::mp4::CompositionTimeToSample::BoxType()'],['../d3/d87/structshaka_1_1media_1_1mp4_1_1SampleToChunk.html#a610c358480034e85cbea93b0b3406655',1,'shaka::media::mp4::SampleToChunk::BoxType()'],['../d7/d42/structshaka_1_1media_1_1mp4_1_1SampleSize.html#a18b9c0277deec16ff5ffef98c2dbadf3',1,'shaka::media::mp4::SampleSize::BoxType()'],['../da/d59/structshaka_1_1media_1_1mp4_1_1CompactSampleSize.html#affe88ea3f7899a791b616dfa12f794ee',1,'shaka::media::mp4::CompactSampleSize::BoxType()'],['../db/d95/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset.html#a8215c57361432ca6459cb0333034614d',1,'shaka::media::mp4::ChunkLargeOffset::BoxType()'],['../dd/d06/structshaka_1_1media_1_1mp4_1_1ChunkOffset.html#af4dd3a3ea67a2efb95ac3761b33a8fa0',1,'shaka::media::mp4::ChunkOffset::BoxType()'],['../dd/d3f/structshaka_1_1media_1_1mp4_1_1SyncSample.html#a9d03c709f7d1e51f8809322794756b3b',1,'shaka::media::mp4::SyncSample::BoxType()'],['../d7/d01/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription.html#ad5d87ea02a51983fdb555f2e3638bfed',1,'shaka::media::mp4::SampleGroupDescription::BoxType()'],['../d0/d7c/structshaka_1_1media_1_1mp4_1_1SampleToGroup.html#a4bbaf4bfb39fb569eaeb78f1e9169794',1,'shaka::media::mp4::SampleToGroup::BoxType()'],['../d1/dee/structshaka_1_1media_1_1mp4_1_1SampleTable.html#a2771a6a7d82c1f544bafaf0709043fc1',1,'shaka::media::mp4::SampleTable::BoxType()'],['../d4/db9/structshaka_1_1media_1_1mp4_1_1MediaHeader.html#ad8edc72b3035e93b38ca51505ae01412',1,'shaka::media::mp4::MediaHeader::BoxType()'],['../d1/db0/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader.html#afcca5343a3de868510a53de508730813',1,'shaka::media::mp4::VideoMediaHeader::BoxType()'],['../d7/d07/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader.html#a0a546689f087197c1f9fa7db68887e76',1,'shaka::media::mp4::SoundMediaHeader::BoxType()'],['../db/d21/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader.html#a66a134f3ab023831f569873177d4e727',1,'shaka::media::mp4::SubtitleMediaHeader::BoxType()'],['../df/d8a/structshaka_1_1media_1_1mp4_1_1DataEntryUrl.html#a8d46c2ad8b3dd9ae07bc3a73bb45da06',1,'shaka::media::mp4::DataEntryUrl::BoxType()'],['../d4/de3/structshaka_1_1media_1_1mp4_1_1DataReference.html#ad4241f10042e77cb12b30c654746253b',1,'shaka::media::mp4::DataReference::BoxType()'],['../d8/d6d/structshaka_1_1media_1_1mp4_1_1DataInformation.html#ad590eaa2b74fc18d22044abdeafe04c8',1,'shaka::media::mp4::DataInformation::BoxType()'],['../d5/d86/structshaka_1_1media_1_1mp4_1_1MediaInformation.html#a5536ed5769a974f5094c4120c66667fe',1,'shaka::media::mp4::MediaInformation::BoxType()'],['../dc/ddf/structshaka_1_1media_1_1mp4_1_1Media.html#a3a083251ea157e44befabf84b66b0c9e',1,'shaka::media::mp4::Media::BoxType()'],['../d3/db5/structshaka_1_1media_1_1mp4_1_1Track.html#a9ab0be777c96c884b73d2bb85cbb482c',1,'shaka::media::mp4::Track::BoxType()'],['../da/d50/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader.html#ab2afa24c2f0b694a141ebe58b06635aa',1,'shaka::media::mp4::MovieExtendsHeader::BoxType()'],['../de/d29/structshaka_1_1media_1_1mp4_1_1TrackExtends.html#adb2087c3c85693054596a26d6f31d4dd',1,'shaka::media::mp4::TrackExtends::BoxType()'],['../d1/d3e/structshaka_1_1media_1_1mp4_1_1MovieExtends.html#a3a24ad79e39a6dd24268a90fa5e3d47f',1,'shaka::media::mp4::MovieExtends::BoxType()'],['../d0/d9a/structshaka_1_1media_1_1mp4_1_1Movie.html#a623b673fb897f68e9c4e55682d6114dc',1,'shaka::media::mp4::Movie::BoxType()'],['../df/d9a/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html#a036a76de5bb9287116a9ad94f8895e84',1,'shaka::media::mp4::TrackFragmentDecodeTime::BoxType()'],['../dc/d8f/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader.html#a68efde9cb48af4236d106dbfa46e96b0',1,'shaka::media::mp4::MovieFragmentHeader::BoxType()'],['../d1/d6e/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader.html#a227b3fd6cf16ac250ee08f1e41e27ef9',1,'shaka::media::mp4::TrackFragmentHeader::BoxType()'],['../dd/df5/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun.html#a4484ad0299e15e642960702764427f2f',1,'shaka::media::mp4::TrackFragmentRun::BoxType()'],['../df/d7b/structshaka_1_1media_1_1mp4_1_1TrackFragment.html#a5776ac8e8cfd7fe2033432a4581e19ea',1,'shaka::media::mp4::TrackFragment::BoxType()'],['../d9/d1f/structshaka_1_1media_1_1mp4_1_1MovieFragment.html#ac6fab326de1329f291c8e427e99ce971',1,'shaka::media::mp4::MovieFragment::BoxType()'],['../d4/df9/structshaka_1_1media_1_1mp4_1_1SegmentIndex.html#ac95186c204fe8aeffc6c41ca8181af35',1,'shaka::media::mp4::SegmentIndex::BoxType()'],['../d7/dae/structshaka_1_1media_1_1mp4_1_1MediaData.html#a6b0601ae1defd84cda96d27e4659058a',1,'shaka::media::mp4::MediaData::BoxType()'],['../d9/d3e/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox.html#a5a9cf523bd1f53f5d2abeaa5cfa20e4c',1,'shaka::media::mp4::CueSourceIDBox::BoxType()'],['../d8/dc3/structshaka_1_1media_1_1mp4_1_1CueTimeBox.html#ae027ee1285bc5d397c450df88d653ae1',1,'shaka::media::mp4::CueTimeBox::BoxType()'],['../d5/d09/structshaka_1_1media_1_1mp4_1_1CueIDBox.html#a29fe876a3059aa2f7a936ff1bf49b0ff',1,'shaka::media::mp4::CueIDBox::BoxType()'],['../d0/dd0/structshaka_1_1media_1_1mp4_1_1CueSettingsBox.html#ab3ab5a5e7b1702bd713433046b380c8d',1,'shaka::media::mp4::CueSettingsBox::BoxType()'],['../d2/d7f/structshaka_1_1media_1_1mp4_1_1CuePayloadBox.html#aefca706b24f701502a071d6c3bd51c2a',1,'shaka::media::mp4::CuePayloadBox::BoxType()'],['../d9/d3c/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox.html#a0e463ad10c04f13125f146c5ef908f69',1,'shaka::media::mp4::VTTEmptyCueBox::BoxType()'],['../d6/d79/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html#ab22709c67041094daaaa6f0b42eca51d',1,'shaka::media::mp4::VTTAdditionalTextBox::BoxType()'],['../d6/daa/structshaka_1_1media_1_1mp4_1_1VTTCueBox.html#ae19e44ca727ff4ae010a8c62fc566f41',1,'shaka::media::mp4::VTTCueBox::BoxType()']]], ['buffer',['Buffer',['../dc/d41/classshaka_1_1media_1_1BufferWriter.html#ab3054a98a4ec27764c65511dc17a916d',1,'shaka::media::BufferWriter']]], ['buffer_5fcallback_5fparams',['buffer_callback_params',['../d5/de3/structshaka_1_1PackagingParams.html#aaaf233248e46b6ff3285bbac87857f81',1,'shaka::PackagingParams']]], ['buffercallbackparams',['BufferCallbackParams',['../d9/da8/structshaka_1_1BufferCallbackParams.html',1,'shaka']]], - ['bufferreader',['BufferReader',['../d9/d13/classshaka_1_1media_1_1BufferReader.html#a94771befc54d444630ade726689b7bf7',1,'shaka::media::BufferReader']]], ['bufferreader',['BufferReader',['../d9/d13/classshaka_1_1media_1_1BufferReader.html',1,'shaka::media']]], + ['bufferreader',['BufferReader',['../d9/d13/classshaka_1_1media_1_1BufferReader.html#a94771befc54d444630ade726689b7bf7',1,'shaka::media::BufferReader']]], ['bufferwriter',['BufferWriter',['../dc/d41/classshaka_1_1media_1_1BufferWriter.html',1,'shaka::media']]], ['bufferwriter',['BufferWriter',['../dc/d41/classshaka_1_1media_1_1BufferWriter.html#a01d91524fd5c5491bafcc1cff16db916',1,'shaka::media::BufferWriter']]], + ['bytepos',['BytePos',['../dc/d76/classshaka_1_1media_1_1BitWriter.html#ab84837bdf53d55332e5d78289352ae93',1,'shaka::media::BitWriter']]], ['bytequeue',['ByteQueue',['../d7/dda/classshaka_1_1media_1_1ByteQueue.html',1,'shaka::media']]], ['bytescached',['BytesCached',['../df/d4e/classshaka_1_1IoCache.html#a8033da711e62112877be7a6ac2186622',1,'shaka::IoCache']]], ['bytesfree',['BytesFree',['../df/d4e/classshaka_1_1IoCache.html#a744559cbb0a3878027ca6fc2a12555c1',1,'shaka::IoCache']]], diff --git a/docs/search/all_10.js b/docs/search/all_10.js index 45c2e7ba14..94929587e0 100644 --- a/docs/search/all_10.js +++ b/docs/search/all_10.js @@ -22,6 +22,7 @@ var searchData= ['scanchildren',['ScanChildren',['../d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html#acc5a55985f95b73ac64c9eab7bd09242',1,'shaka::media::mp4::BoxReader']]], ['schemeinfo',['SchemeInfo',['../d2/d70/structshaka_1_1media_1_1mp4_1_1SchemeInfo.html',1,'shaka::media::mp4']]], ['schemetype',['SchemeType',['../d3/da2/structshaka_1_1media_1_1mp4_1_1SchemeType.html',1,'shaka::media::mp4']]], + ['scte35event',['Scte35Event',['../d1/d41/structshaka_1_1media_1_1Scte35Event.html',1,'shaka::media']]], ['seek',['Seek',['../dd/d40/classshaka_1_1CallbackFile.html#a7c9039e25fcc468a7ec2cdfa8394ffc2',1,'shaka::CallbackFile::Seek()'],['../d3/d73/classshaka_1_1File.html#a486bda715b58b1a1863fbfc8d48da62a',1,'shaka::File::Seek()'],['../d7/dbd/classshaka_1_1LocalFile.html#a082cd6d64c8f04acff251cdafb66b203',1,'shaka::LocalFile::Seek()'],['../de/dad/classshaka_1_1MemoryFile.html#a0e3bffa9859fdcb7c28c20a15e2d3e98',1,'shaka::MemoryFile::Seek()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#a9b95550cf6342f970645c086a2ed58c2',1,'shaka::ThreadedIoFile::Seek()'],['../d4/dcb/classshaka_1_1UdpFile.html#a33d10d2f1558a35aaba192f7746bb23f',1,'shaka::UdpFile::Seek()']]], ['seekable',['Seekable',['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#a8d0429e7922752db3f01d43e6340465a',1,'shaka::media::MkvWriter']]], ['seekhead',['SeekHead',['../dc/d16/classshaka_1_1media_1_1SeekHead.html',1,'shaka::media']]], @@ -31,8 +32,8 @@ var searchData= ['segmenter',['Segmenter',['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html',1,'shaka::media::webm']]], ['segmenter',['Segmenter',['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html',1,'shaka::media::mp4']]], ['segmentindex',['SegmentIndex',['../d4/df9/structshaka_1_1media_1_1mp4_1_1SegmentIndex.html',1,'shaka::media::mp4']]], - ['segmentinfo',['SegmentInfo',['../d0/dc0/structshaka_1_1media_1_1SegmentInfo.html',1,'shaka::media']]], ['segmentinfo',['SegmentInfo',['../dc/de1/structshaka_1_1SegmentInfo.html',1,'shaka']]], + ['segmentinfo',['SegmentInfo',['../d0/dc0/structshaka_1_1media_1_1SegmentInfo.html',1,'shaka::media']]], ['segmentreference',['SegmentReference',['../dd/d9b/structshaka_1_1media_1_1mp4_1_1SegmentReference.html',1,'shaka::media::mp4']]], ['segmenttestbase',['SegmentTestBase',['../d2/dba/classshaka_1_1media_1_1SegmentTestBase.html',1,'shaka::media']]], ['segmenttype',['SegmentType',['../d3/dd0/structshaka_1_1media_1_1mp4_1_1SegmentType.html',1,'shaka::media::mp4']]], @@ -63,7 +64,6 @@ var searchData= ['setlanguageoverride',['SetLanguageOverride',['../dd/d17/classshaka_1_1media_1_1Demuxer.html#aa3fe0a64a2745fa6f462c3d179809c3b',1,'shaka::media::Demuxer']]], ['setmediainfo',['SetMediaInfo',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#acacd79e086a620c82101f1a0f3ba8df9',1,'shaka::hls::MediaPlaylist']]], ['setmuxerlistener',['SetMuxerListener',['../df/d46/classshaka_1_1media_1_1Muxer.html#a0e76dd0a5c07dd538221459365ae824a',1,'shaka::media::Muxer']]], - ['setprogrammaptablewriterfortesting',['SetProgramMapTableWriterForTesting',['../de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html#a6eeeadf8e60dc09378b5df7c62eb2bf0',1,'shaka::media::mp2t::TsWriter']]], ['setprogresslistener',['SetProgressListener',['../df/d46/classshaka_1_1media_1_1Muxer.html#a25a146d553c385aad70dbff6b3e87eec',1,'shaka::media::Muxer']]], ['setsampleduration',['SetSampleDuration',['../de/d52/classshaka_1_1Representation.html#a11b32833166b9c4bea78cca2c6069d98',1,'shaka::Representation']]], ['setstreamtypefortesting',['SetStreamTypeForTesting',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#a2ab66ed311668017fd62d04db0476e79',1,'shaka::hls::MediaPlaylist']]], @@ -76,12 +76,12 @@ var searchData= ['signer',['signer',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a233141ad4baf2f2afce30f96adf340ae',1,'shaka::WidevineEncryptionParams::signer()'],['../d8/d48/structshaka_1_1WidevineDecryptionParams.html#acf84772bb9787f61110e388490412939',1,'shaka::WidevineDecryptionParams::signer()']]], ['signer_5fname',['signer_name',['../df/d22/structshaka_1_1WidevineSigner.html#a6768d5addb3c90f33ce5f241705c827e',1,'shaka::WidevineSigner']]], ['signing_5fkey_5ftype',['signing_key_type',['../df/d22/structshaka_1_1WidevineSigner.html#a656fbc14799c96fa8b822e3917070cf6',1,'shaka::WidevineSigner']]], - ['simplehlsnotifier',['SimpleHlsNotifier',['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a8550250a5d368ae2d9ded8999b878449',1,'shaka::hls::SimpleHlsNotifier']]], + ['simplehlsnotifier',['SimpleHlsNotifier',['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#ad0d43e4492e7ea0aa601ccf6602b6937',1,'shaka::hls::SimpleHlsNotifier']]], ['simplehlsnotifier',['SimpleHlsNotifier',['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html',1,'shaka::hls']]], ['simplehlsnotifiertest',['SimpleHlsNotifierTest',['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a8abffabc108b3ccbbf1725a83da70827',1,'shaka::hls::SimpleHlsNotifier']]], ['simplempdnotifier',['SimpleMpdNotifier',['../d8/de1/classshaka_1_1SimpleMpdNotifier.html',1,'shaka']]], - ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html',1,'shaka::media::webm']]], ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html',1,'shaka::media::mp4']]], + ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html',1,'shaka::media::webm']]], ['size',['Size',['../dd/d40/classshaka_1_1CallbackFile.html#ab6bcbc6773b29fee1664507558e8759f',1,'shaka::CallbackFile::Size()'],['../d3/d73/classshaka_1_1File.html#aeb98b64a05f141140e110170bef1bc55',1,'shaka::File::Size()'],['../d7/dbd/classshaka_1_1LocalFile.html#ad20649d0ee575b81830a5abf88e2bde1',1,'shaka::LocalFile::Size()'],['../de/dad/classshaka_1_1MemoryFile.html#a151634866be009cf0eb10e783432d5cb',1,'shaka::MemoryFile::Size()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#af23f2da404e1602c240bb59d2601f1b9',1,'shaka::ThreadedIoFile::Size()'],['../d4/dcb/classshaka_1_1UdpFile.html#a0a1c8d7af211bba4da62eb44504d745d',1,'shaka::UdpFile::Size()'],['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#a4f2483c665f2693f583e7b467101d844',1,'shaka::media::ProducerConsumerQueue::Size()'],['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html#a90fe62338ba20817d27cf4e34949000e',1,'shaka::media::mp4::BoxBuffer::Size()']]], ['skip_5fencryption',['skip_encryption',['../d2/d7b/structshaka_1_1StreamDescriptor.html#abbaf07b1faa84803478f89bc6dd8cb4a',1,'shaka::StreamDescriptor']]], ['skipbits',['SkipBits',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a4ab20ef220c76072eaecb982aba0541d',1,'shaka::media::BitReader']]], @@ -89,6 +89,7 @@ var searchData= ['skipbytes',['SkipBytes',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a7d349253d5cc8f9aa33f1ca2ea94677c',1,'shaka::media::BitReader::SkipBytes()'],['../d9/d13/classshaka_1_1media_1_1BufferReader.html#a2b15dfcd6ff891a9cb7b76f48d91d15d',1,'shaka::media::BufferReader::SkipBytes()']]], ['some_5fhandler',['some_handler',['../d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html#a02f13711d72781e74f0ce794cbd7044a',1,'shaka::media::MediaHandlerGraphTestBase']]], ['soundmediaheader',['SoundMediaHeader',['../d7/d07/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader.html',1,'shaka::media::mp4']]], + ['start_5ftime_5fin_5fseconds',['start_time_in_seconds',['../de/deb/structshaka_1_1Cuepoint.html#a18272c3d7ac008355717b75816fba4b8',1,'shaka::Cuepoint']]], ['startbox',['StartBox',['../d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html#a6bafd9cd95a97c4c1475d1806d602ae2',1,'shaka::media::mp4::BoxReader']]], ['startswithstartcode',['StartsWithStartCode',['../db/d86/classshaka_1_1media_1_1NaluReader.html#a9ed9d56a06f43717cdb7035f86075975',1,'shaka::media::NaluReader']]], ['status',['Status',['../d2/d20/classshaka_1_1Status.html#a12c04257e2480e0ce87cd16b944921d0',1,'shaka::Status::Status()'],['../d2/d20/classshaka_1_1Status.html#a2fa2116c9e12215a4e3430b362ba622b',1,'shaka::Status::Status(error::Code error_code, const std::string &error_message)']]], diff --git a/docs/search/all_13.js b/docs/search/all_13.js index e7c96bdb11..71b7c2d63c 100644 --- a/docs/search/all_13.js +++ b/docs/search/all_13.js @@ -8,6 +8,7 @@ var searchData= ['verifysignature',['VerifySignature',['../d9/d0c/classshaka_1_1media_1_1RsaPublicKey.html#a146cc97c8fcacadde1b08c373b766fe4',1,'shaka::media::RsaPublicKey']]], ['video_5fdescription',['video_description',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#aee813f01267e89ff00fdb836bb3a159d',1,'shaka::media::mp4::TrackRunIterator']]], ['videomediaheader',['VideoMediaHeader',['../d1/db0/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader.html',1,'shaka::media::mp4']]], + ['videoprogrammaptablewriter',['VideoProgramMapTableWriter',['../da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.html',1,'shaka::media::mp2t']]], ['videosampleentry',['VideoSampleEntry',['../d0/d73/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry.html',1,'shaka::media::mp4']]], ['videosliceheaderparser',['VideoSliceHeaderParser',['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html',1,'shaka::media']]], ['videosliceinfo',['VideoSliceInfo',['../d8/dc2/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo.html',1,'shaka::media::mp2t::EsParserH26x']]], diff --git a/docs/search/all_14.js b/docs/search/all_14.js index 318dc1f9e4..f1a065574e 100644 --- a/docs/search/all_14.js +++ b/docs/search/all_14.js @@ -26,6 +26,7 @@ var searchData= ['widevinesigner',['WidevineSigner',['../df/d22/structshaka_1_1WidevineSigner.html',1,'shaka']]], ['write',['Write',['../dd/d40/classshaka_1_1CallbackFile.html#aa758dfb05daff81afa1ddfaf0bb0a105',1,'shaka::CallbackFile::Write()'],['../d3/d73/classshaka_1_1File.html#a8c498531ecbd205fceb0be3478361801',1,'shaka::File::Write()'],['../df/d4e/classshaka_1_1IoCache.html#a483277a6c68dd58cebb8dafb5c1dcd21',1,'shaka::IoCache::Write()'],['../d7/dbd/classshaka_1_1LocalFile.html#aee10b7f2898c5047eb8505f16c49311c',1,'shaka::LocalFile::Write()'],['../de/dad/classshaka_1_1MemoryFile.html#aa3d9455b7bc9d1c44d58ab39bd8bd27c',1,'shaka::MemoryFile::Write()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#ab8acfe4af14c1120ae6d2baa44a10583',1,'shaka::ThreadedIoFile::Write()'],['../d4/dcb/classshaka_1_1UdpFile.html#a36722f3c436c88e451093ee21c0db754',1,'shaka::UdpFile::Write()'],['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#a15bd0622fdb129d921287e690f117bde',1,'shaka::media::mp4::Box::Write()'],['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#a2468514d1d9efdb15a9e4df2e44b75d8',1,'shaka::media::MkvWriter::Write()'],['../dc/d16/classshaka_1_1media_1_1SeekHead.html#a46313134eebf68a7c34187705726b982',1,'shaka::media::SeekHead::Write()']]], ['write_5ffunc',['write_func',['../d9/da8/structshaka_1_1BufferCallbackParams.html#ad966040c5a75389ac6376c6378a0f307',1,'shaka::BufferCallbackParams']]], + ['writebits',['WriteBits',['../dc/d76/classshaka_1_1media_1_1BitWriter.html#aee5f905e55f262e38f5df506611663f1',1,'shaka::media::BitWriter']]], ['writefileatomically',['WriteFileAtomically',['../d3/d73/classshaka_1_1File.html#a4b5280fe058359b5991037f90dde2b77',1,'shaka::File']]], ['writefromfile',['WriteFromFile',['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#ab331684a758a93bf0c77fa224fe429ea',1,'shaka::media::MkvWriter::WriteFromFile(File *source)'],['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#a2dfac99ec5531ca2e102e5b145bb29ed',1,'shaka::media::MkvWriter::WriteFromFile(File *source, int64_t max_copy)']]], ['writeheader',['WriteHeader',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#a57b8837c93d51f5cf03d3862069d509a',1,'shaka::media::mp4::Box']]], diff --git a/docs/search/all_2.js b/docs/search/all_2.js index 7d843fd29a..ba1f126db6 100644 --- a/docs/search/all_2.js +++ b/docs/search/all_2.js @@ -2,8 +2,8 @@ var searchData= [ ['ca_5ffile',['ca_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a745d002043a10ae7c01983fe5fe93846',1,'shaka::PlayreadyEncryptionParams']]], ['cacheauxinfo',['CacheAuxInfo',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#ab7a8d3f44a663d63ef2415542239c540',1,'shaka::media::mp4::TrackRunIterator']]], - ['callbackfile',['CallbackFile',['../dd/d40/classshaka_1_1CallbackFile.html',1,'shaka']]], ['callbackfile',['CallbackFile',['../dd/d40/classshaka_1_1CallbackFile.html#a0e1e50e81d926b17938b0dad89d1c05f',1,'shaka::CallbackFile']]], + ['callbackfile',['CallbackFile',['../dd/d40/classshaka_1_1CallbackFile.html',1,'shaka']]], ['cancel',['Cancel',['../df/d46/classshaka_1_1media_1_1Muxer.html#a9204fe352d13cea8a367ae9c14e9639e',1,'shaka::media::Muxer::Cancel()'],['../dd/d17/classshaka_1_1media_1_1Demuxer.html#a683de4ad66155311d90d92635546dc8d',1,'shaka::media::Demuxer::Cancel()'],['../db/dd0/classshaka_1_1Packager.html#a5323e6dc242b1cdd6208cd6ea77dd0c7',1,'shaka::Packager::Cancel()']]], ['cencsampleencryptioninfoentry',['CencSampleEncryptionInfoEntry',['../d8/dd6/structshaka_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html',1,'shaka::media::mp4']]], ['childexist',['ChildExist',['../d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html#aa65236a6b94ac59d5da409412992211c',1,'shaka::media::mp4::BoxReader']]], @@ -18,7 +18,7 @@ var searchData= ['clear',['Clear',['../df/d4e/classshaka_1_1IoCache.html#a10c8e56478fe7bc4c30ea0087eb22804',1,'shaka::IoCache::Clear()'],['../d2/d20/classshaka_1_1Status.html#a022f6fc5d4756ce2cb2b586d8c40f145',1,'shaka::Status::Clear()']]], ['clear_5flead_5fin_5fseconds',['clear_lead_in_seconds',['../dc/da0/structshaka_1_1EncryptionParams.html#a1ad46963dc926aa4b72813dccb3f6a45',1,'shaka::EncryptionParams']]], ['clearoutputstreamdatavector',['ClearOutputStreamDataVector',['../d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html#a051758e3cfa419622565e65a08fd8a00',1,'shaka::media::MediaHandlerGraphTestBase']]], - ['clearsegmentpmt',['ClearSegmentPmt',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#abaf3df0bbb1b6ff5655d04b828d2889b',1,'shaka::media::mp2t::ProgramMapTableWriter::ClearSegmentPmt()'],['../de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html#a8f439af49b3144f892102c235fb51169',1,'shaka::media::mp2t::H264ProgramMapTableWriter::ClearSegmentPmt()'],['../d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html#aa6d50f3f1249bbf7c1d27608bfb9334f',1,'shaka::media::mp2t::AacProgramMapTableWriter::ClearSegmentPmt()']]], + ['clearsegmentpmt',['ClearSegmentPmt',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#abeab8da6e10fb156bd38dd9e47669c0f',1,'shaka::media::mp2t::ProgramMapTableWriter']]], ['client_5fcert_5ffile',['client_cert_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#afdc9477270b8a626163940cddff4fa8c',1,'shaka::PlayreadyEncryptionParams']]], ['client_5fcert_5fprivate_5fkey_5ffile',['client_cert_private_key_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#af6f3b909425a27e17a7d6e473d7eb8ac',1,'shaka::PlayreadyEncryptionParams']]], ['client_5fcert_5fprivate_5fkey_5fpassword',['client_cert_private_key_password',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a2d492f0c28b5d291ef512aa0248dc8ba',1,'shaka::PlayreadyEncryptionParams']]], @@ -31,13 +31,14 @@ var searchData= ['cluster_5fended',['cluster_ended',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#a66f87fef54ed47bd36d740254d52b9c7',1,'shaka::media::WebMClusterParser']]], ['clusterbuilder',['ClusterBuilder',['../db/d94/classshaka_1_1media_1_1ClusterBuilder.html',1,'shaka::media']]], ['clusterparser',['ClusterParser',['../d2/df8/classshaka_1_1media_1_1SegmentTestBase_1_1ClusterParser.html',1,'shaka::media::SegmentTestBase']]], + ['codec',['codec',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#a5229f5ea763f4511b22aea0948b96690',1,'shaka::media::mp2t::ProgramMapTableWriter']]], ['codec_5fconfig',['codec_config',['../db/dcb/classshaka_1_1media_1_1VPxParser.html#a79057bf3418757cc7d47c3979479220d',1,'shaka::media::VPxParser']]], ['codecconfiguration',['CodecConfiguration',['../db/d11/structshaka_1_1media_1_1mp4_1_1CodecConfiguration.html',1,'shaka::media::mp4']]], ['combinedmuxerlistener',['CombinedMuxerListener',['../d9/d68/classshaka_1_1media_1_1CombinedMuxerListener.html',1,'shaka::media']]], ['compactsamplesize',['CompactSampleSize',['../da/d59/structshaka_1_1media_1_1mp4_1_1CompactSampleSize.html',1,'shaka::media::mp4']]], ['compositionoffset',['CompositionOffset',['../d5/d8c/structshaka_1_1media_1_1mp4_1_1CompositionOffset.html',1,'shaka::media::mp4']]], - ['compositionoffsetiterator',['CompositionOffsetIterator',['../db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html',1,'shaka::media::mp4']]], ['compositionoffsetiterator',['CompositionOffsetIterator',['../db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html#a70511a15ee2f03d447b18668de57ca93',1,'shaka::media::mp4::CompositionOffsetIterator']]], + ['compositionoffsetiterator',['CompositionOffsetIterator',['../db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html',1,'shaka::media::mp4']]], ['compositiontimetosample',['CompositionTimeToSample',['../df/d7b/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample.html',1,'shaka::media::mp4']]], ['computesize',['ComputeSize',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#aa4e47d0ba81e234707c76ca36e32c1d5',1,'shaka::media::mp4::Box::ComputeSize()'],['../d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html#a253fbc00315441efac7ea917a5952e2c',1,'shaka::media::mp4::SampleEncryptionEntry::ComputeSize()']]], ['container_5fname',['container_name',['../dd/d17/classshaka_1_1media_1_1Demuxer.html#a385c93fd8d589b7d3bccd35e14c58290',1,'shaka::media::Demuxer']]], @@ -64,8 +65,11 @@ var searchData= ['createvideostreaminfo',['CreateVideoStreamInfo',['../d2/dba/classshaka_1_1media_1_1SegmentTestBase.html#ae621089e670346f27f2b93d9b55bb30b',1,'shaka::media::SegmentTestBase']]], ['crypt',['Crypt',['../df/d87/classshaka_1_1media_1_1AesCryptor.html#ac5fc6e563807e6fce36c2dd43c928b3e',1,'shaka::media::AesCryptor']]], ['cue',['Cue',['../dd/dce/structshaka_1_1media_1_1Cue.html',1,'shaka::media']]], + ['cue_5fpoints',['cue_points',['../dd/dfd/structshaka_1_1AdCueGeneratorParams.html#aad54b86efce820dc46959aafd9faab7c',1,'shaka::AdCueGeneratorParams']]], + ['cueevent',['CueEvent',['../da/d93/structshaka_1_1media_1_1CueEvent.html',1,'shaka::media']]], ['cueidbox',['CueIDBox',['../d5/d09/structshaka_1_1media_1_1mp4_1_1CueIDBox.html',1,'shaka::media::mp4']]], ['cuepayloadbox',['CuePayloadBox',['../d2/d7f/structshaka_1_1media_1_1mp4_1_1CuePayloadBox.html',1,'shaka::media::mp4']]], + ['cuepoint',['Cuepoint',['../de/deb/structshaka_1_1Cuepoint.html',1,'shaka']]], ['cuesettingsbox',['CueSettingsBox',['../d0/dd0/structshaka_1_1media_1_1mp4_1_1CueSettingsBox.html',1,'shaka::media::mp4']]], ['cuesourceidbox',['CueSourceIDBox',['../d9/d3e/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox.html',1,'shaka::media::mp4']]], ['cuetimebox',['CueTimeBox',['../d8/dc3/structshaka_1_1media_1_1mp4_1_1CueTimeBox.html',1,'shaka::media::mp4']]], diff --git a/docs/search/all_3.js b/docs/search/all_3.js index f6c1e7f901..2dd02e65ef 100644 --- a/docs/search/all_3.js +++ b/docs/search/all_3.js @@ -27,9 +27,9 @@ var searchData= ['demuxer',['Demuxer',['../dd/d17/classshaka_1_1media_1_1Demuxer.html',1,'shaka::media']]], ['demuxstreamidmediasample',['DemuxStreamIdMediaSample',['../d1/da1/structshaka_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html',1,'shaka::media::wvm']]], ['dispatch',['Dispatch',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#accd62dd4def920571f95f4e1a98ab7ca',1,'shaka::media::MediaHandler']]], - ['dispatchmediaevent',['DispatchMediaEvent',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a1c4c8b216cb4f902e522f0abd4571b86',1,'shaka::media::MediaHandler']]], + ['dispatchcueevent',['DispatchCueEvent',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a6aa5cdf6732f0a0fc19559ec408a9318',1,'shaka::media::MediaHandler']]], ['dispatchmediasample',['DispatchMediaSample',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a96d8a53afdeeb838218b981e7b2d71eb',1,'shaka::media::MediaHandler']]], - ['dispatchperiodinfo',['DispatchPeriodInfo',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#aadccc177c1ca19a3d112484d78d4ee28',1,'shaka::media::MediaHandler']]], + ['dispatchscte35event',['DispatchScte35Event',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#aac0bb4f2b49054ae6cc706517efc71b9',1,'shaka::media::MediaHandler']]], ['dispatchsegmentinfo',['DispatchSegmentInfo',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#ab0ed6c81bd68250d84f6b04453472c00',1,'shaka::media::MediaHandler']]], ['dispatchstreaminfo',['DispatchStreamInfo',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#af0c7b537e9745a0eb49b4561dbc89f55',1,'shaka::media::MediaHandler']]], ['dispatchtextsample',['DispatchTextSample',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a65d965532a6488eab28551aca51a1a2a',1,'shaka::media::MediaHandler']]], @@ -38,5 +38,6 @@ var searchData= ['dts',['dts',['../d2/d93/classshaka_1_1media_1_1mp2t_1_1PesPacket.html#a88111c4190e74c24c10f0a694e723cb8',1,'shaka::media::mp2t::PesPacket']]], ['dtsspecific',['DTSSpecific',['../dc/da0/structshaka_1_1media_1_1mp4_1_1DTSSpecific.html',1,'shaka::media::mp4']]], ['dump_5fstream_5finfo',['dump_stream_info',['../d6/d62/structshaka_1_1TestParams.html#a7a22e04cdfc14d73266397bf673fae6e',1,'shaka::TestParams']]], - ['duration',['Duration',['../d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html#a9527abde0a2131605d06fdfa2859dc47',1,'shaka::media::mp4::DecodingTimeIterator']]] + ['duration',['Duration',['../d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html#a9527abde0a2131605d06fdfa2859dc47',1,'shaka::media::mp4::DecodingTimeIterator']]], + ['duration_5fin_5fseconds',['duration_in_seconds',['../de/deb/structshaka_1_1Cuepoint.html#a31f0ed2c50901473e6b8ce3180c63793',1,'shaka::Cuepoint']]] ]; diff --git a/docs/search/all_4.js b/docs/search/all_4.js index 43f31a1d40..73191f0535 100644 --- a/docs/search/all_4.js +++ b/docs/search/all_4.js @@ -9,7 +9,7 @@ var searchData= ['elementstartnotify',['ElementStartNotify',['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#a6603ba573e802e660921f329192738f3',1,'shaka::media::MkvWriter']]], ['empty',['Empty',['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#ad20705b713d6b5ded3312d800740b7ff',1,'shaka::media::ProducerConsumerQueue']]], ['encrypt',['Encrypt',['../d9/d0c/classshaka_1_1media_1_1RsaPublicKey.html#ab9dcf591f3235b8f4eaa02886f9845e3',1,'shaka::media::RsaPublicKey']]], - ['encryptedsegmentpmt',['EncryptedSegmentPmt',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#a7f40bf474758b80e57fede27c2610756',1,'shaka::media::mp2t::ProgramMapTableWriter::EncryptedSegmentPmt()'],['../de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html#a14d7933ee669e7c5daeb8d03f2f0b1d0',1,'shaka::media::mp2t::H264ProgramMapTableWriter::EncryptedSegmentPmt()'],['../d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html#a37616e314cb20775644b9c5e3417f8e5',1,'shaka::media::mp2t::AacProgramMapTableWriter::EncryptedSegmentPmt()']]], + ['encryptedsegmentpmt',['EncryptedSegmentPmt',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#a258bff0465507799b591006138698150',1,'shaka::media::mp2t::ProgramMapTableWriter']]], ['encryptedstreamattributes',['EncryptedStreamAttributes',['../d7/d6d/structshaka_1_1EncryptionParams_1_1EncryptedStreamAttributes.html',1,'shaka::EncryptionParams']]], ['encryption_5fparams',['encryption_params',['../d5/de3/structshaka_1_1PackagingParams.html#a7792bf4a71a35d2a3f99d8b4806a3913',1,'shaka::PackagingParams']]], ['encryptionconfig',['EncryptionConfig',['../d7/d34/structshaka_1_1media_1_1EncryptionConfig.html',1,'shaka::media']]], @@ -18,7 +18,7 @@ var searchData= ['encryptionparams',['EncryptionParams',['../dc/da0/structshaka_1_1EncryptionParams.html',1,'shaka']]], ['esdescriptor',['ESDescriptor',['../d5/d13/classshaka_1_1media_1_1ESDescriptor.html',1,'shaka::media']]], ['esparser',['EsParser',['../da/d10/classshaka_1_1media_1_1mp2t_1_1EsParser.html',1,'shaka::media::mp2t']]], - ['esparseradts',['EsParserAdts',['../d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.html',1,'shaka::media::mp2t']]], + ['esparseraudio',['EsParserAudio',['../dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.html',1,'shaka::media::mp2t']]], ['esparserh264',['EsParserH264',['../d5/db9/classshaka_1_1media_1_1mp2t_1_1EsParserH264.html',1,'shaka::media::mp2t']]], ['esparserh265',['EsParserH265',['../d5/d63/classshaka_1_1media_1_1mp2t_1_1EsParserH265.html',1,'shaka::media::mp2t']]], ['esparserh26x',['EsParserH26x',['../da/d23/classshaka_1_1media_1_1mp2t_1_1EsParserH26x.html',1,'shaka::media::mp2t']]] diff --git a/docs/search/all_5.js b/docs/search/all_5.js index d97f532ac3..09be475839 100644 --- a/docs/search/all_5.js +++ b/docs/search/all_5.js @@ -11,7 +11,7 @@ var searchData= ['finalizefragment',['FinalizeFragment',['../db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html#ae943e13eb86d54cffb7174d4513e4541',1,'shaka::media::mp4::Fragmenter']]], ['finalizesegment',['FinalizeSegment',['../de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html#ac0c76888b5c3b3a25600a3f126dc92f8',1,'shaka::media::mp2t::TsSegmenter::FinalizeSegment()'],['../de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html#ae9979f940d7a07127709576aa1f766a1',1,'shaka::media::mp2t::TsWriter::FinalizeSegment()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#adfe43b76600564a2836ed78070549656',1,'shaka::media::mp4::Segmenter::FinalizeSegment()'],['../d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html#acadda71dd534ab0f6889ab653fbffe42',1,'shaka::media::webm::MultiSegmentSegmenter::FinalizeSegment()'],['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a3c7123d6d9321c72d8bd737f1f9d3c01',1,'shaka::media::webm::Segmenter::FinalizeSegment()'],['../d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html#a7c34c5c8dacbe1a18444cdb6abce0a30',1,'shaka::media::webm::SingleSegmentSegmenter::FinalizeSegment()']]], ['findstartcodeinclearrange',['FindStartCodeInClearRange',['../db/d86/classshaka_1_1media_1_1NaluReader.html#aa14b3cd5da5657d8a3d0ecfdf301a184',1,'shaka::media::NaluReader']]], - ['flush',['Flush',['../dd/d40/classshaka_1_1CallbackFile.html#aef34f60f2e94f862e495c254edc58bd9',1,'shaka::CallbackFile::Flush()'],['../d3/d73/classshaka_1_1File.html#a5fa625751e03b9e7652ba1bfa98b8ca4',1,'shaka::File::Flush()'],['../d7/dbd/classshaka_1_1LocalFile.html#a04b4523a7352572b2c6d72f1d6f3a077',1,'shaka::LocalFile::Flush()'],['../de/dad/classshaka_1_1MemoryFile.html#aecf76d1658ea5f088ef1e42f04b9b64d',1,'shaka::MemoryFile::Flush()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#a2b53b72d99aad4439781e3887492452c',1,'shaka::ThreadedIoFile::Flush()'],['../d4/dcb/classshaka_1_1UdpFile.html#a4b5430ec1d24434f5f6d9b20692efbc2',1,'shaka::UdpFile::Flush()'],['../d9/deb/classshaka_1_1hls_1_1HlsNotifier.html#a5d788d47d01aee4f75c7b55251d69edf',1,'shaka::hls::HlsNotifier::Flush()'],['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a153fe931c8e6fe3e585ebd925d75d229',1,'shaka::hls::SimpleHlsNotifier::Flush()'],['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#a26752164d7e8ae6a9a894512291ad9cd',1,'shaka::media::MediaParser::Flush()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#afdb1a88116e3347e67afeb7715847135',1,'shaka::media::mp2t::Mp2tMediaParser::Flush()'],['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#a71ea0819224b94ba9df5c951424bc6b1',1,'shaka::media::mp2t::PesPacketGenerator::Flush()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#a6f26e0d76aeda601fa87190901de27ea',1,'shaka::media::mp4::MP4MediaParser::Flush()'],['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#ac3d4be1a12667ed722915be727747eee',1,'shaka::media::WebMClusterParser::Flush()'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a6c2d4b5b36304831e637f7ae1b9e54a2',1,'shaka::media::WebMMediaParser::Flush()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#aa666cb1b9ee2ff940d9fc7efda4b50d7',1,'shaka::media::WebVttMediaParser::Flush()'],['../de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html#aa02d5ce7d9609b3841835fbab74b8c81',1,'shaka::media::WebVttSampleConverter::Flush()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#ac5680e3bd6cdb07fd65af3f39fce999a',1,'shaka::media::wvm::WvmMediaParser::Flush()'],['../d4/d70/classshaka_1_1DashIopMpdNotifier.html#ab3411eb75eedce9a26f0767210280e71',1,'shaka::DashIopMpdNotifier::Flush()'],['../d3/dd0/classshaka_1_1MpdNotifier.html#af8149126f4793506bef385d067561dbf',1,'shaka::MpdNotifier::Flush()'],['../d8/de1/classshaka_1_1SimpleMpdNotifier.html#a8ea622a21a5807775bb2d998fa04658f',1,'shaka::SimpleMpdNotifier::Flush()']]], + ['flush',['Flush',['../dd/d40/classshaka_1_1CallbackFile.html#aef34f60f2e94f862e495c254edc58bd9',1,'shaka::CallbackFile::Flush()'],['../d3/d73/classshaka_1_1File.html#a5fa625751e03b9e7652ba1bfa98b8ca4',1,'shaka::File::Flush()'],['../d7/dbd/classshaka_1_1LocalFile.html#a04b4523a7352572b2c6d72f1d6f3a077',1,'shaka::LocalFile::Flush()'],['../de/dad/classshaka_1_1MemoryFile.html#aecf76d1658ea5f088ef1e42f04b9b64d',1,'shaka::MemoryFile::Flush()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#a2b53b72d99aad4439781e3887492452c',1,'shaka::ThreadedIoFile::Flush()'],['../d4/dcb/classshaka_1_1UdpFile.html#a4b5430ec1d24434f5f6d9b20692efbc2',1,'shaka::UdpFile::Flush()'],['../d9/deb/classshaka_1_1hls_1_1HlsNotifier.html#a5d788d47d01aee4f75c7b55251d69edf',1,'shaka::hls::HlsNotifier::Flush()'],['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a153fe931c8e6fe3e585ebd925d75d229',1,'shaka::hls::SimpleHlsNotifier::Flush()'],['../dc/d76/classshaka_1_1media_1_1BitWriter.html#a1c14f04a0bb3090edb3ac0fffa346bc1',1,'shaka::media::BitWriter::Flush()'],['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#a26752164d7e8ae6a9a894512291ad9cd',1,'shaka::media::MediaParser::Flush()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#afdb1a88116e3347e67afeb7715847135',1,'shaka::media::mp2t::Mp2tMediaParser::Flush()'],['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#a71ea0819224b94ba9df5c951424bc6b1',1,'shaka::media::mp2t::PesPacketGenerator::Flush()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#a6f26e0d76aeda601fa87190901de27ea',1,'shaka::media::mp4::MP4MediaParser::Flush()'],['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#ac3d4be1a12667ed722915be727747eee',1,'shaka::media::WebMClusterParser::Flush()'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a6c2d4b5b36304831e637f7ae1b9e54a2',1,'shaka::media::WebMMediaParser::Flush()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#aa666cb1b9ee2ff940d9fc7efda4b50d7',1,'shaka::media::WebVttMediaParser::Flush()'],['../de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html#aa02d5ce7d9609b3841835fbab74b8c81',1,'shaka::media::WebVttSampleConverter::Flush()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#ac5680e3bd6cdb07fd65af3f39fce999a',1,'shaka::media::wvm::WvmMediaParser::Flush()'],['../d4/d70/classshaka_1_1DashIopMpdNotifier.html#ab3411eb75eedce9a26f0767210280e71',1,'shaka::DashIopMpdNotifier::Flush()'],['../d3/dd0/classshaka_1_1MpdNotifier.html#af8149126f4793506bef385d067561dbf',1,'shaka::MpdNotifier::Flush()'],['../d8/de1/classshaka_1_1SimpleMpdNotifier.html#a8ea622a21a5807775bb2d998fa04658f',1,'shaka::SimpleMpdNotifier::Flush()']]], ['flushalldownstreams',['FlushAllDownstreams',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#ab644ca7b0a0dbcbc42936f2dfb979ca5',1,'shaka::media::MediaHandler']]], ['flushdownstream',['FlushDownstream',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#ad5001bf12073101a949b062943769f5b',1,'shaka::media::MediaHandler']]], ['forcesetsegmentalignment',['ForceSetSegmentAlignment',['../d8/d8e/classshaka_1_1AdaptationSet.html#a40532ecbed5f71de85bde0cb7eb1ef9d',1,'shaka::AdaptationSet']]], diff --git a/docs/search/all_6.js b/docs/search/all_6.js index b753685899..36f43015c9 100644 --- a/docs/search/all_6.js +++ b/docs/search/all_6.js @@ -6,11 +6,9 @@ var searchData= ['generatesegmentreference',['GenerateSegmentReference',['../db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html#af1f1d56215c1e9543bfb516136862fa6',1,'shaka::media::mp4::Fragmenter']]], ['generatesignature',['GenerateSignature',['../df/d3c/classshaka_1_1media_1_1RequestSigner.html#a1c77d503f9ffc3462c1bf45b4f35bf32',1,'shaka::media::RequestSigner::GenerateSignature()'],['../d9/d8c/classshaka_1_1media_1_1AesRequestSigner.html#a3010ad8c4c1588358a8d31a97afd6428',1,'shaka::media::AesRequestSigner::GenerateSignature()'],['../d7/ddd/classshaka_1_1media_1_1RsaRequestSigner.html#ac83306b0555581b8ac9591b6e3d3bdbc',1,'shaka::media::RsaRequestSigner::GenerateSignature()'],['../d0/dce/classshaka_1_1media_1_1RsaPrivateKey.html#ad05d8951dfe3a8af754490022e95e5f2',1,'shaka::media::RsaPrivateKey::GenerateSignature()']]], ['get',['Get',['../d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html#a6b5b2c193d6055ca49d2d6af2b2ac4cc',1,'shaka::media::HttpKeyFetcher']]], - ['getadtsframesize',['GetAdtsFrameSize',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a149fb9c7fa2718d719008af2dce8157f',1,'shaka::media::mp2t::AdtsHeader']]], - ['getadtsheadersize',['GetAdtsHeaderSize',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a107e1269d5f826583c1940fb50c8cf92',1,'shaka::media::mp2t::AdtsHeader']]], ['getaudiodefaultduration',['GetAudioDefaultDuration',['../d8/d86/classshaka_1_1media_1_1WebMTracksParser.html#a554135ee3a8ad995beeab868c67aba36',1,'shaka::media::WebMTracksParser']]], ['getaudioobjecttype',['GetAudioObjectType',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a6db422543c33402a51da27d2350b009b',1,'shaka::media::AACAudioSpecificConfig']]], - ['getaudiospecificconfig',['GetAudioSpecificConfig',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a5ca14cc4eb4a28906fe832ab263ba5a2',1,'shaka::media::mp2t::AdtsHeader']]], + ['getaudiospecificconfig',['GetAudioSpecificConfig',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a9a3da0ed02d1790ec176a75bbbdef146',1,'shaka::media::mp2t::Ac3Header::GetAudioSpecificConfig()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a97a2aae441248e718e056ac3559ecfd9',1,'shaka::media::mp2t::AdtsHeader::GetAudioSpecificConfig()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a80da92426102c52da09690a7587d4272',1,'shaka::media::mp2t::AudioHeader::GetAudioSpecificConfig()']]], ['getaudiostreaminfo',['GetAudioStreamInfo',['../d3/d7c/classshaka_1_1media_1_1WebMAudioClient.html#a0fcbddd20199044f860331b3bd9ef3b8',1,'shaka::media::WebMAudioClient']]], ['getcodecstring',['GetCodecString',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html#aee79e7aa61b741bb96f451c6de1c9d42',1,'shaka::media::AudioStreamInfo::GetCodecString()'],['../d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html#a66b23ef2de8b851482628fefafafce17',1,'shaka::media::AVCDecoderConfigurationRecord::GetCodecString(FourCC codec_fourcc) const '],['../d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html#a30a6df8df89c670fd4c8894b8bacffa9',1,'shaka::media::AVCDecoderConfigurationRecord::GetCodecString(FourCC codec_fourcc, uint8_t profile_indication, uint8_t profile_compatibility, uint8_t avc_level)'],['../d4/d8a/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord.html#aa612802ce249bdff2cd4a8b50a05268c',1,'shaka::media::HEVCDecoderConfigurationRecord::GetCodecString()'],['../d1/da5/classshaka_1_1media_1_1VPCodecConfigurationRecord.html#a86b48fb506b476538a7440d9ccf9a533',1,'shaka::media::VPCodecConfigurationRecord::GetCodecString()']]], ['getcontenttype',['GetContentType',['../d8/daf/namespaceshaka.html#a5ea880937da26d677ff6a48c0219d090',1,'shaka']]], @@ -21,7 +19,8 @@ var searchData= ['getduration',['GetDuration',['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#a7283c64cb63a94264ff8fe405b8ce5c2',1,'shaka::media::mp4::Segmenter']]], ['getdurationinseconds',['GetDurationInSeconds',['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a6a2b5d9e2218abcace63e7aeee3da34f',1,'shaka::media::webm::Segmenter']]], ['getfilesize',['GetFileSize',['../d3/d73/classshaka_1_1File.html#ac978d5c0585850d4d9948fdf39b33292',1,'shaka::File']]], - ['getheadersize',['GetHeaderSize',['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html#a3346c5afaf83a18cfcf688c36049d586',1,'shaka::media::VideoSliceHeaderParser::GetHeaderSize()'],['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html#a5957ea62985810662158c02a163aac60',1,'shaka::media::H264VideoSliceHeaderParser::GetHeaderSize()'],['../d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html#a54459b6748f64be2bd328c5af79798f3',1,'shaka::media::H265VideoSliceHeaderParser::GetHeaderSize()']]], + ['getframesize',['GetFrameSize',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a8065975e78028683180cd3ae65925c37',1,'shaka::media::mp2t::Ac3Header::GetFrameSize()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ae12d18e7fcbff02121886ca4b459340d',1,'shaka::media::mp2t::AdtsHeader::GetFrameSize()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#af8acf05003d2c0dbd062a9f12a2140b3',1,'shaka::media::mp2t::AudioHeader::GetFrameSize()']]], + ['getheadersize',['GetHeaderSize',['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html#a3346c5afaf83a18cfcf688c36049d586',1,'shaka::media::VideoSliceHeaderParser::GetHeaderSize()'],['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html#a5957ea62985810662158c02a163aac60',1,'shaka::media::H264VideoSliceHeaderParser::GetHeaderSize()'],['../d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html#a54459b6748f64be2bd328c5af79798f3',1,'shaka::media::H265VideoSliceHeaderParser::GetHeaderSize()'],['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a58d93e453c2fed3d500badb40a349eed',1,'shaka::media::mp2t::Ac3Header::GetHeaderSize()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#aadfb99a9a34a9684040e9b9aa000a402',1,'shaka::media::mp2t::AdtsHeader::GetHeaderSize()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a60fce7a6810efa2fc0f40a8038805116',1,'shaka::media::mp2t::AudioHeader::GetHeaderSize()']]], ['getindexrange',['GetIndexRange',['../d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html#acd917150490f8e5721fad28904422eca',1,'shaka::media::mp4::MultiSegmentSegmenter::GetIndexRange()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#a7ab68d898343b322dc32c08ad42e859c',1,'shaka::media::mp4::Segmenter::GetIndexRange()'],['../d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html#a5877fd31ed73a048529385b36437364a',1,'shaka::media::mp4::SingleSegmentSegmenter::GetIndexRange()']]], ['getindexrangestartandend',['GetIndexRangeStartAndEnd',['../d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html#a75b572a055a0de68bf2809f61b319526',1,'shaka::media::webm::MultiSegmentSegmenter::GetIndexRangeStartAndEnd()'],['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a3a6c1932e6c4894a61eb7230022bceb5',1,'shaka::media::webm::Segmenter::GetIndexRangeStartAndEnd()'],['../d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html#a1708739c73c4565d5dfda6bedffd89a8',1,'shaka::media::webm::SingleSegmentSegmenter::GetIndexRangeStartAndEnd()']]], ['getinitrange',['GetInitRange',['../d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html#a15f78aada048b15472d485b80875e838',1,'shaka::media::mp4::MultiSegmentSegmenter::GetInitRange()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#a3a1c6721aa53a124af8be50bb3f7599c',1,'shaka::media::mp4::Segmenter::GetInitRange()'],['../d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html#a61e71cfc720342ecb16b830e6fca0fe4',1,'shaka::media::mp4::SingleSegmentSegmenter::GetInitRange()']]], @@ -31,15 +30,17 @@ var searchData= ['getlibraryversion',['GetLibraryVersion',['../db/dd0/classshaka_1_1Packager.html#a7bae5b5c202a716f5d890e70afae51b2',1,'shaka::Packager']]], ['getlongestsegmentduration',['GetLongestSegmentDuration',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#ad69a0d67cfe55584efeaaf18f82b0bdc',1,'shaka::hls::MediaPlaylist']]], ['getmaxclearoffset',['GetMaxClearOffset',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#ae7a223474c46dd542e7390030893cca4',1,'shaka::media::mp4::TrackRunIterator']]], + ['getminframesize',['GetMinFrameSize',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a3c589cda189b06d9ca3b90a56db24829',1,'shaka::media::mp2t::Ac3Header::GetMinFrameSize()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ad35ff50f5159e663103613901eccb7a9',1,'shaka::media::mp2t::AdtsHeader::GetMinFrameSize()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a95018a4488867e584338126922bf128a',1,'shaka::media::mp2t::AudioHeader::GetMinFrameSize()']]], ['getnext',['GetNext',['../d8/dd6/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter.html#a63950483c11df9c44e3cb8d559f629d9',1,'shaka::media::mp2t::ContinuityCounter']]], ['getnextpespacket',['GetNextPesPacket',['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#acf11010f62ab9d2b46308f2cce8b3650',1,'shaka::media::mp2t::PesPacketGenerator']]], - ['getnumchannels',['GetNumChannels',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#abbe5493d7ea61fc5306de10378e8539a',1,'shaka::media::AACAudioSpecificConfig::GetNumChannels()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#aaa01e3eb1ce9d4400aedd202b04f7160',1,'shaka::media::mp2t::AdtsHeader::GetNumChannels()']]], - ['getobjecttype',['GetObjectType',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a156a3288ab974557e95dfaba72e6b479',1,'shaka::media::mp2t::AdtsHeader']]], + ['getnumchannels',['GetNumChannels',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#a971834b98828cab3093e094e97c73b16',1,'shaka::hls::MediaPlaylist::GetNumChannels()'],['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#abbe5493d7ea61fc5306de10378e8539a',1,'shaka::media::AACAudioSpecificConfig::GetNumChannels()'],['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#abab9685652b78baf25b7399477401bd7',1,'shaka::media::mp2t::Ac3Header::GetNumChannels()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a6093f6f4a01414cef59347be4c2df5c6',1,'shaka::media::mp2t::AdtsHeader::GetNumChannels()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a47b7cff7bfced3a5e5d02a848627a0c8',1,'shaka::media::mp2t::AudioHeader::GetNumChannels()']]], + ['getobjecttype',['GetObjectType',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a56de14f98afd205f03bda6b110835aae',1,'shaka::media::mp2t::Ac3Header::GetObjectType()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ad8d15d73650add3af331f847719efab6',1,'shaka::media::mp2t::AdtsHeader::GetObjectType()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a9959124b369045fce424f845c50b9c02',1,'shaka::media::mp2t::AudioHeader::GetObjectType()']]], ['getoutputstreamdatavector',['GetOutputStreamDataVector',['../d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html#a1e8a80eb0e887af717527a0880d61417',1,'shaka::media::MediaHandlerGraphTestBase']]], ['getpps',['GetPps',['../de/dc2/classshaka_1_1media_1_1H265Parser.html#af4a103a131c849bf54018b747dbdd80c',1,'shaka::media::H265Parser']]], ['getrawptr',['GetRawPtr',['../d1/d31/classshaka_1_1xml_1_1XmlNode.html#aac9765712087dcc47a0afef4bf7849ff',1,'shaka::xml::XmlNode']]], + ['getsamplesperframe',['GetSamplesPerFrame',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#ac5d9c726fd88989e36e490d2aeb1011f',1,'shaka::media::mp2t::Ac3Header::GetSamplesPerFrame()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a606154feab4b731e1d51a56d21cb23e8',1,'shaka::media::mp2t::AdtsHeader::GetSamplesPerFrame()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#abe0df0b59f89036c9c39a2070875a6a7',1,'shaka::media::mp2t::AudioHeader::GetSamplesPerFrame()']]], ['getsamplespersecond',['GetSamplesPerSecond',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a6bc219a717c8e2362fc1b24be3cf98a3',1,'shaka::media::AACAudioSpecificConfig']]], - ['getsamplingfrequency',['GetSamplingFrequency',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#afda9a7656576556af8ddec599d5d8d3b',1,'shaka::media::mp2t::AdtsHeader']]], + ['getsamplingfrequency',['GetSamplingFrequency',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#aa238ec0832e097f2f5791e915bf30127',1,'shaka::media::mp2t::Ac3Header::GetSamplingFrequency()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#af4b6c9af726bf95d296e478d350055f0',1,'shaka::media::mp2t::AdtsHeader::GetSamplingFrequency()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#aeb3121ddde96b3e6ca456586c8efdd8c',1,'shaka::media::mp2t::AudioHeader::GetSamplingFrequency()']]], ['getsps',['GetSps',['../de/dc2/classshaka_1_1media_1_1H265Parser.html#ab917855df00b9003c6be4612e2fe0211',1,'shaka::media::H265Parser']]], ['gettotalsizeofsubsamples',['GetTotalSizeOfSubsamples',['../de/d49/classshaka_1_1media_1_1DecryptConfig.html#a338024925bc46a2f65a058906cdcb4a3',1,'shaka::media::DecryptConfig::GetTotalSizeOfSubsamples()'],['../d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html#a870ef304f376ec0822686e1d78765bf2',1,'shaka::media::mp4::SampleEncryptionEntry::GetTotalSizeOfSubsamples()']]], ['getvideostreaminfo',['GetVideoStreamInfo',['../d3/d67/classshaka_1_1media_1_1WebMVideoClient.html#a305b6679d9cd2457a3a3ba72319a3249',1,'shaka::media::WebMVideoClient']]], diff --git a/docs/search/all_7.js b/docs/search/all_7.js index 3f31f993d6..526cdef51a 100644 --- a/docs/search/all_7.js +++ b/docs/search/all_7.js @@ -6,15 +6,14 @@ var searchData= ['h264modificationofpicnum',['H264ModificationOfPicNum',['../d9/dff/structshaka_1_1media_1_1H264ModificationOfPicNum.html',1,'shaka::media']]], ['h264parser',['H264Parser',['../d3/d91/classshaka_1_1media_1_1H264Parser.html',1,'shaka::media']]], ['h264pps',['H264Pps',['../de/de4/structshaka_1_1media_1_1H264Pps.html',1,'shaka::media']]], - ['h264programmaptablewriter',['H264ProgramMapTableWriter',['../de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html',1,'shaka::media::mp2t']]], ['h264seimessage',['H264SEIMessage',['../d6/dd0/structshaka_1_1media_1_1H264SEIMessage.html',1,'shaka::media']]], ['h264seirecoverypoint',['H264SEIRecoveryPoint',['../df/de2/structshaka_1_1media_1_1H264SEIRecoveryPoint.html',1,'shaka::media']]], ['h264sliceheader',['H264SliceHeader',['../d2/d59/structshaka_1_1media_1_1H264SliceHeader.html',1,'shaka::media']]], ['h264sps',['H264Sps',['../d1/d0a/structshaka_1_1media_1_1H264Sps.html',1,'shaka::media']]], ['h264videosliceheaderparser',['H264VideoSliceHeaderParser',['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html',1,'shaka::media']]], ['h264weightingfactors',['H264WeightingFactors',['../d4/d4c/structshaka_1_1media_1_1H264WeightingFactors.html',1,'shaka::media']]], - ['h265bytetounitstreamconverter',['H265ByteToUnitStreamConverter',['../db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html#a2ec8824525ceca4e1320e1c11a5be24b',1,'shaka::media::H265ByteToUnitStreamConverter::H265ByteToUnitStreamConverter()'],['../db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html#a49f20c495bb0bff62214ba4f25620d19',1,'shaka::media::H265ByteToUnitStreamConverter::H265ByteToUnitStreamConverter(H26xStreamFormat stream_format)']]], ['h265bytetounitstreamconverter',['H265ByteToUnitStreamConverter',['../db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html',1,'shaka::media']]], + ['h265bytetounitstreamconverter',['H265ByteToUnitStreamConverter',['../db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html#a2ec8824525ceca4e1320e1c11a5be24b',1,'shaka::media::H265ByteToUnitStreamConverter::H265ByteToUnitStreamConverter()'],['../db/df8/classshaka_1_1media_1_1H265ByteToUnitStreamConverter.html#a49f20c495bb0bff62214ba4f25620d19',1,'shaka::media::H265ByteToUnitStreamConverter::H265ByteToUnitStreamConverter(H26xStreamFormat stream_format)']]], ['h265parser',['H265Parser',['../de/dc2/classshaka_1_1media_1_1H265Parser.html',1,'shaka::media']]], ['h265pps',['H265Pps',['../de/d33/structshaka_1_1media_1_1H265Pps.html',1,'shaka::media']]], ['h265referencepicturelistmodifications',['H265ReferencePictureListModifications',['../d5/d9d/structshaka_1_1media_1_1H265ReferencePictureListModifications.html',1,'shaka::media']]], @@ -46,6 +45,6 @@ var searchData= ['hlsnotifymuxerlistener',['HlsNotifyMuxerListener',['../d5/dfa/classshaka_1_1media_1_1HlsNotifyMuxerListener.html',1,'shaka::media']]], ['hlsparams',['HlsParams',['../d0/da8/structshaka_1_1HlsParams.html',1,'shaka']]], ['hlsplaylisttype',['HlsPlaylistType',['../d8/daf/namespaceshaka.html#ab63a3c00cdbf61cfb6dd7a2497b26f8d',1,'shaka']]], - ['httpkeyfetcher',['HttpKeyFetcher',['../d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html#a02561dcbbaf66152dce3ebd466810f15',1,'shaka::media::HttpKeyFetcher::HttpKeyFetcher()'],['../d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html#a11829a5c6e3507998c4d93c83c3069a4',1,'shaka::media::HttpKeyFetcher::HttpKeyFetcher(uint32_t timeout_in_seconds)']]], - ['httpkeyfetcher',['HttpKeyFetcher',['../d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html',1,'shaka::media']]] + ['httpkeyfetcher',['HttpKeyFetcher',['../d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html',1,'shaka::media']]], + ['httpkeyfetcher',['HttpKeyFetcher',['../d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html#a02561dcbbaf66152dce3ebd466810f15',1,'shaka::media::HttpKeyFetcher::HttpKeyFetcher()'],['../d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html#a11829a5c6e3507998c4d93c83c3069a4',1,'shaka::media::HttpKeyFetcher::HttpKeyFetcher(uint32_t timeout_in_seconds)']]] ]; diff --git a/docs/search/all_8.js b/docs/search/all_8.js index 6da38678fa..09745f5596 100644 --- a/docs/search/all_8.js +++ b/docs/search/all_8.js @@ -8,7 +8,7 @@ var searchData= ['init',['Init',['../d9/deb/classshaka_1_1hls_1_1HlsNotifier.html#a8bd9273a1893899036e640c1e35fbaff',1,'shaka::hls::HlsNotifier::Init()'],['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a40850c462766a0ce4e9c92014ed77a91',1,'shaka::hls::SimpleHlsNotifier::Init()'],['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#adc7c91bebe75879abba91a56dae52153',1,'shaka::media::MediaParser::Init()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#aa2aff12312827aacf2b7db6e2f792c52',1,'shaka::media::mp2t::Mp2tMediaParser::Init()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#acc87b9752a7f6e8c739109acbc02b69d',1,'shaka::media::mp4::MP4MediaParser::Init()'],['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#ae9f02c32b4e2be8fc41a20f3f00f3494',1,'shaka::media::mp4::TrackRunIterator::Init()'],['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#a4d39eaf8568da29b597411c56f50d86f',1,'shaka::media::mp4::TrackRunIterator::Init(const MovieFragment &moof)'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a5cd5c298938e2c58c45f962b21e43b2e',1,'shaka::media::WebMMediaParser::Init()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#af6c0fb7de806cccd0e1f9dd92b5310f3',1,'shaka::media::WebVttMediaParser::Init()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#a6f931f1702724a9b19c3078a7832bc77',1,'shaka::media::wvm::WvmMediaParser::Init()'],['../d4/d70/classshaka_1_1DashIopMpdNotifier.html#a9dd9d655a538ff2618634ca1f9809478',1,'shaka::DashIopMpdNotifier::Init()'],['../de/d52/classshaka_1_1Representation.html#ae998409ae94f3ba12909a96e8f3f4f7e',1,'shaka::Representation::Init()'],['../d3/dd0/classshaka_1_1MpdNotifier.html#ad6171481d6fb437767b1f5b9e0dac1a3',1,'shaka::MpdNotifier::Init()'],['../d8/de1/classshaka_1_1SimpleMpdNotifier.html#a59bcb401b5ca8d5b893ec7da9461569f',1,'shaka::SimpleMpdNotifier::Init()']]], ['init_5frange',['init_range',['../d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html#a6070da9ce7fab251c82b25a4020373c0',1,'shaka::media::MuxerListener::MediaRanges']]], ['initcb',['InitCB',['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#aef5795d2b3df2526c6e8afe1e4d072bf',1,'shaka::media::MediaParser']]], - ['initialize',['Initialize',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#aed0da512bbd998ec9d0a5c019ad17acb',1,'shaka::media::MediaHandler::Initialize()'],['../d5/d66/classshaka_1_1media_1_1NalUnitToByteStreamConverter.html#a27986db8a2e62669fe1983a39383c546',1,'shaka::media::NalUnitToByteStreamConverter::Initialize()'],['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html#a862422cdf78f370069055037338fa53d',1,'shaka::media::VideoSliceHeaderParser::Initialize()'],['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html#a551bd1e2a852d1a3b23b77df8505b7f7',1,'shaka::media::H264VideoSliceHeaderParser::Initialize()'],['../d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html#a83a25520f713f4818a765ea3324a1438',1,'shaka::media::H265VideoSliceHeaderParser::Initialize()'],['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#aa0346189f99b2f0fc2c71da1543155fa',1,'shaka::media::mp2t::PesPacketGenerator::Initialize()'],['../de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html#aac6e3950224709b78b9f1e054a8ca194',1,'shaka::media::mp2t::TsSegmenter::Initialize()'],['../de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html#a6bee605be771538f78633e2ecfc979c6',1,'shaka::media::mp2t::TsWriter::Initialize()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#acc2d4e58b3fa4b41a0637f52288d81d9',1,'shaka::media::mp4::Segmenter::Initialize()'],['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a32c8a682b36241529d0c302a023140d2',1,'shaka::media::webm::Segmenter::Initialize()'],['../db/dd0/classshaka_1_1Packager.html#ae40969a98da3a27a0b1633927afb3ce2',1,'shaka::Packager::Initialize()']]], + ['initialize',['Initialize',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#aed0da512bbd998ec9d0a5c019ad17acb',1,'shaka::media::MediaHandler::Initialize()'],['../d5/d66/classshaka_1_1media_1_1NalUnitToByteStreamConverter.html#a27986db8a2e62669fe1983a39383c546',1,'shaka::media::NalUnitToByteStreamConverter::Initialize()'],['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html#a862422cdf78f370069055037338fa53d',1,'shaka::media::VideoSliceHeaderParser::Initialize()'],['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html#a551bd1e2a852d1a3b23b77df8505b7f7',1,'shaka::media::H264VideoSliceHeaderParser::Initialize()'],['../d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html#a83a25520f713f4818a765ea3324a1438',1,'shaka::media::H265VideoSliceHeaderParser::Initialize()'],['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#aa0346189f99b2f0fc2c71da1543155fa',1,'shaka::media::mp2t::PesPacketGenerator::Initialize()'],['../de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html#aac6e3950224709b78b9f1e054a8ca194',1,'shaka::media::mp2t::TsSegmenter::Initialize()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#acc2d4e58b3fa4b41a0637f52288d81d9',1,'shaka::media::mp4::Segmenter::Initialize()'],['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a32c8a682b36241529d0c302a023140d2',1,'shaka::media::webm::Segmenter::Initialize()'],['../db/dd0/classshaka_1_1Packager.html#ae40969a98da3a27a0b1633927afb3ce2',1,'shaka::Packager::Initialize()']]], ['initializefragment',['InitializeFragment',['../db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html#aa702c2af5ea5096d94f2943076a21e4a',1,'shaka::media::mp4::Fragmenter']]], ['initializeinternal',['InitializeInternal',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a0e05325d62bfb66318301c1ed790a46e',1,'shaka::media::MediaHandler::InitializeInternal()'],['../d1/d36/classshaka_1_1media_1_1FakeMediaHandler.html#af43db7170cd6b53aa937e0b68e210e25',1,'shaka::media::FakeMediaHandler::InitializeInternal()'],['../df/d46/classshaka_1_1media_1_1Muxer.html#a36882e12df5c5bfd48a7b94d1dfad857',1,'shaka::media::Muxer::InitializeInternal()'],['../d4/d43/classshaka_1_1media_1_1ChunkingHandler.html#a76a5f4b74da3876cc72f44301c389ebd',1,'shaka::media::ChunkingHandler::InitializeInternal()'],['../d6/d4c/classshaka_1_1media_1_1EncryptionHandler.html#a3f1808a4386081e5e1c9a798a1a69dd0',1,'shaka::media::EncryptionHandler::InitializeInternal()'],['../dd/d17/classshaka_1_1media_1_1Demuxer.html#a7488d8ea312be5822c67f5b69a8dbd9f',1,'shaka::media::Demuxer::InitializeInternal()']]], ['initializewithiv',['InitializeWithIv',['../df/d87/classshaka_1_1media_1_1AesCryptor.html#a41954df34b76b04d561892732dd0ec2f',1,'shaka::media::AesCryptor::InitializeWithIv()'],['../df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html#a71ff0b9654de96f9990b29c35fa9b7bf',1,'shaka::media::AesCbcDecryptor::InitializeWithIv()'],['../d3/d75/classshaka_1_1media_1_1AesEncryptor.html#a0695df5615cadf6977fdbac978daeffa',1,'shaka::media::AesEncryptor::InitializeWithIv()'],['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html#af878688f0f277f3f6757e85654439c34',1,'shaka::media::AesPatternCryptor::InitializeWithIv()']]], @@ -27,6 +27,7 @@ var searchData= ['isrunvalid',['IsRunValid',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#afa91b1bb4a5a587734d1892f560d3f16',1,'shaka::media::mp4::TrackRunIterator']]], ['issamplevalid',['IsSampleValid',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#a213a839157f1cdf5ed0585bea274a9ea',1,'shaka::media::mp4::TrackRunIterator']]], ['issyncsample',['IsSyncSample',['../d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html#a63e36297541bfc5f1568f74abf5512b1',1,'shaka::media::mp4::SyncSampleIterator::IsSyncSample() const '],['../d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html#a0b6070fb8ab19e106595ecca86917715',1,'shaka::media::mp4::SyncSampleIterator::IsSyncSample(uint32_t sample) const ']]], + ['issyncword',['IsSyncWord',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a44c8ac7a2dd57a1b099722632e7e39f0',1,'shaka::media::mp2t::Ac3Header::IsSyncWord()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ab7385cf2dfd15688dbd87f97706e3690',1,'shaka::media::mp2t::AdtsHeader::IsSyncWord()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a1e5c41162d4a4ff75dc9760a4d12e496',1,'shaka::media::mp2t::AudioHeader::IsSyncWord()']]], ['isvalid',['IsValid',['../d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html#a231ba71e0511c3efa3142acb43d7e8aa',1,'shaka::media::mp4::ChunkInfoIterator::IsValid()'],['../db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html#ae3bf00a0597ca56dbef692f6eaebf2aa',1,'shaka::media::mp4::CompositionOffsetIterator::IsValid()'],['../d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html#ae7becbbfd8328a0cd243cf9a8fc862df',1,'shaka::media::mp4::DecodingTimeIterator::IsValid()']]], ['isvalidconfig',['IsValidConfig',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html#a3c50d026e8deadac46741143d4b5ddb9',1,'shaka::media::AudioStreamInfo::IsValidConfig()'],['../d5/db1/classshaka_1_1media_1_1StreamInfo.html#a6e5c5ade77b7bcf0b7822de568695dc8',1,'shaka::media::StreamInfo::IsValidConfig()'],['../db/dab/classshaka_1_1media_1_1TextStreamInfo.html#ab40aed17c046e639efde04a2075e25a8',1,'shaka::media::TextStreamInfo::IsValidConfig()'],['../d6/db1/classshaka_1_1media_1_1VideoStreamInfo.html#a8978ca2bc2dd63c2e25e77cdcf676162',1,'shaka::media::VideoStreamInfo::IsValidConfig()']]], ['iv',['iv',['../df/d22/structshaka_1_1WidevineSigner.html#a6db96d4c3f1189bbd09515732bec94d9',1,'shaka::WidevineSigner::iv()'],['../d0/db4/structshaka_1_1RawKeyParams.html#aab733ab6920dd8fbed523810e64ea3f1',1,'shaka::RawKeyParams::iv()'],['../df/d87/classshaka_1_1media_1_1AesCryptor.html#a96dde16f12a82a563c77f6d5522571f3',1,'shaka::media::AesCryptor::iv()']]] diff --git a/docs/search/all_9.js b/docs/search/all_9.js index 39843f97c0..2ad6b2eec4 100644 --- a/docs/search/all_9.js +++ b/docs/search/all_9.js @@ -2,14 +2,15 @@ var searchData= [ ['kadtsheadersize',['kADTSHeaderSize',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a233ffcb063079b9ca34863c48d4a19e1',1,'shaka::media::AACAudioSpecificConfig']]], ['kdecryptionkeysize',['kDecryptionKeySize',['../de/d49/classshaka_1_1media_1_1DecryptConfig.html#afa140203b87d3e46d5fd94b231734f53',1,'shaka::media::DecryptConfig']]], - ['kdefaultaudiobufferdurationinms',['kDefaultAudioBufferDurationInMs',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#abe19fd2154084026a514541e152600e0a696e4587c758dc7908ad6bbb376ae06d',1,'shaka::media::WebMClusterParser']]], - ['kdefaultvideobufferdurationinms',['kDefaultVideoBufferDurationInMs',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#abe19fd2154084026a514541e152600e0ae4ed667d0b90505a42a7983b0aa4d57f',1,'shaka::media::WebMClusterParser']]], + ['kdefaultaudiobufferdurationinms',['kDefaultAudioBufferDurationInMs',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#aba8ed8dff0aa6421a896bfbfa6a67d2aa696e4587c758dc7908ad6bbb376ae06d',1,'shaka::media::WebMClusterParser']]], + ['kdefaultvideobufferdurationinms',['kDefaultVideoBufferDurationInMs',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#aba8ed8dff0aa6421a896bfbfa6a67d2aae4ed667d0b90505a42a7983b0aa4d57f',1,'shaka::media::WebMClusterParser']]], ['kencryptifcryptbyteblockremaining',['kEncryptIfCryptByteBlockRemaining',['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html#a54fd35d7782d3b4948c7eb68387711f0a76b19d202e22b2b0f661f933b47b3b16',1,'shaka::media::AesPatternCryptor']]], ['key',['key',['../df/d22/structshaka_1_1WidevineSigner.html#ad5c378d29df509280d8697f986163324',1,'shaka::WidevineSigner::key()'],['../df/d22/structshaka_1_1WidevineSigner.html#a25bb558aa06563d24c3d7f9733ff8898',1,'shaka::WidevineSigner::key()'],['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a2ba545b465d64da1ac9458ba45338f76',1,'shaka::PlayreadyEncryptionParams::key()']]], ['key_5fid',['key_id',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a872107e40137be5a6c1f932db67c2a9d',1,'shaka::PlayreadyEncryptionParams']]], ['key_5fmap',['key_map',['../d0/db4/structshaka_1_1RawKeyParams.html#a14e44fed95583d0bb319c082fb1ddb84',1,'shaka::RawKeyParams']]], ['key_5fprovider',['key_provider',['../dc/da0/structshaka_1_1EncryptionParams.html#adcf61ebf8d129a5bcf3f159b9b076eed',1,'shaka::EncryptionParams::key_provider()'],['../d1/d4f/structshaka_1_1DecryptionParams.html#ad93d153f9e777cccb6404611d5b4d339',1,'shaka::DecryptionParams::key_provider()']]], ['key_5fserver_5furl',['key_server_url',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#ac222c5bd0620e5a6f9bf5e9fec534fb9',1,'shaka::WidevineEncryptionParams::key_server_url()'],['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a3a31b3002f86834b1799279bf5b5fc11',1,'shaka::PlayreadyEncryptionParams::key_server_url()'],['../d8/d48/structshaka_1_1WidevineDecryptionParams.html#adb765979bcc7f63ce46c9ed6ead1ee5b',1,'shaka::WidevineDecryptionParams::key_server_url()']]], + ['key_5furi',['key_uri',['../d0/da8/structshaka_1_1HlsParams.html#a68414aff0f65059c2d05c8d168aadf5f',1,'shaka::HlsParams']]], ['keyfetcher',['KeyFetcher',['../df/d66/classshaka_1_1media_1_1KeyFetcher.html',1,'shaka::media']]], ['keyinfo',['KeyInfo',['../d0/dbe/structshaka_1_1RawKeyParams_1_1KeyInfo.html',1,'shaka::RawKeyParams']]], ['keyprovider',['KeyProvider',['../d8/daf/namespaceshaka.html#a539b99ce5c34193e294bc544437e9185',1,'shaka']]], diff --git a/docs/search/all_b.js b/docs/search/all_b.js index f9ced53374..c7e49f8b58 100644 --- a/docs/search/all_b.js +++ b/docs/search/all_b.js @@ -8,7 +8,6 @@ var searchData= ['matches',['Matches',['../d2/d20/classshaka_1_1Status.html#a8a87de3b647b2eb6fb5dcd61efbca5cd',1,'shaka::Status']]], ['media',['Media',['../dc/ddf/structshaka_1_1media_1_1mp4_1_1Media.html',1,'shaka::media::mp4']]], ['mediadata',['MediaData',['../d7/dae/structshaka_1_1media_1_1mp4_1_1MediaData.html',1,'shaka::media::mp4']]], - ['mediaevent',['MediaEvent',['../df/dd3/structshaka_1_1media_1_1MediaEvent.html',1,'shaka::media']]], ['mediahandler',['MediaHandler',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html',1,'shaka::media']]], ['mediahandlergraphtestbase',['MediaHandlerGraphTestBase',['../d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html',1,'shaka::media']]], ['mediahandlertestbase',['MediaHandlerTestBase',['../d4/d9b/classshaka_1_1media_1_1MediaHandlerTestBase.html',1,'shaka::media']]], @@ -49,8 +48,8 @@ var searchData= ['mpd_5foutput',['mpd_output',['../df/ddc/structshaka_1_1MpdParams.html#aa6ca18997bb307d3b5fe1c9ced161ff6',1,'shaka::MpdParams']]], ['mpd_5fparams',['mpd_params',['../d5/de3/structshaka_1_1PackagingParams.html#acfa10a8e9c877a3c2baf83525837a254',1,'shaka::PackagingParams']]], ['mpd_5ftype',['mpd_type',['../d3/dd0/classshaka_1_1MpdNotifier.html#adfb5bc1586cdb7860dd349b3caf25faa',1,'shaka::MpdNotifier']]], - ['mpdbuilder',['MpdBuilder',['../dc/da1/classshaka_1_1MpdBuilder.html',1,'shaka']]], ['mpdbuilder',['MpdBuilder',['../dc/da1/classshaka_1_1MpdBuilder.html#ab364102e01afedd8a4dcc9be4fdcc0ab',1,'shaka::MpdBuilder']]], + ['mpdbuilder',['MpdBuilder',['../dc/da1/classshaka_1_1MpdBuilder.html',1,'shaka']]], ['mpdnotifier',['MpdNotifier',['../d3/dd0/classshaka_1_1MpdNotifier.html',1,'shaka']]], ['mpdnotifierfactory',['MpdNotifierFactory',['../d4/db4/classshaka_1_1MpdNotifierFactory.html',1,'shaka']]], ['mpdnotifymuxerlistener',['MpdNotifyMuxerListener',['../d9/da5/classshaka_1_1media_1_1MpdNotifyMuxerListener.html#a6912e6cfc341c1a768d214ce08bb0f82',1,'shaka::media::MpdNotifyMuxerListener']]], diff --git a/docs/search/all_e.js b/docs/search/all_e.js index cd1fe84504..de071ae670 100644 --- a/docs/search/all_e.js +++ b/docs/search/all_e.js @@ -2,7 +2,7 @@ var searchData= [ ['packager',['Packager',['../db/dd0/classshaka_1_1Packager.html',1,'shaka']]], ['packagingparams',['PackagingParams',['../d5/de3/structshaka_1_1PackagingParams.html',1,'shaka']]], - ['parse',['Parse',['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#a0c85f3cb0591f67c036276be82a1ba9d',1,'shaka::media::MediaParser::Parse()'],['../d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html#a13b0f93b68efff614c5356df081f2560',1,'shaka::media::ProtectionSystemSpecificInfo::Parse()'],['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a6b3deca725a42113bf7303387ab74f0f',1,'shaka::media::AACAudioSpecificConfig::Parse()'],['../de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html#ab05a1971c60e510b7bc0b5b578dfb04b',1,'shaka::media::DecoderConfigurationRecord::Parse(const std::vector< uint8_t > &data)'],['../de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html#a07b7d0dbae45971d4fd4a24652980f65',1,'shaka::media::DecoderConfigurationRecord::Parse(const uint8_t *data, size_t data_size)'],['../d8/d14/classshaka_1_1media_1_1VP8Parser.html#a8baec0e4c74b0b220b777426d0c463e1',1,'shaka::media::VP8Parser::Parse()'],['../db/d5a/classshaka_1_1media_1_1VP9Parser.html#ae915c36aa472d70b55e3d65b24612e57',1,'shaka::media::VP9Parser::Parse()'],['../db/dcb/classshaka_1_1media_1_1VPxParser.html#abb83c8c74d304e83efb8fa60bd7bb722',1,'shaka::media::VPxParser::Parse()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a2e154d7423498baf8cd8888c70dcfca9',1,'shaka::media::mp2t::AdtsHeader::Parse()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#af1a8a33b4ce61777c876717b005d0026',1,'shaka::media::mp2t::Mp2tMediaParser::Parse()'],['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#a209382fcd42e82a896c29e856627ca52',1,'shaka::media::mp4::Box::Parse()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#a4105cdbe5ece03071a17c06fb27699b0',1,'shaka::media::mp4::MP4MediaParser::Parse()'],['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#aba1bae97c2d96181027e43b0a1993e67',1,'shaka::media::WebMClusterParser::Parse()'],['../db/dae/classshaka_1_1media_1_1WebMInfoParser.html#ae0b4d37e02d43627b1bc9c64f43ee3f7',1,'shaka::media::WebMInfoParser::Parse()'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a40940ec01d965e3a78213861a93f7cfc',1,'shaka::media::WebMMediaParser::Parse()'],['../dc/dca/classshaka_1_1media_1_1WebMListParser.html#acd805b7eb25afcd9a3be2d8d88e3c6af',1,'shaka::media::WebMListParser::Parse()'],['../d8/d86/classshaka_1_1media_1_1WebMTracksParser.html#aa4b6d4ac9fa57b47cbc17ee7c1bd3639',1,'shaka::media::WebMTracksParser::Parse()'],['../d4/d59/classshaka_1_1media_1_1WebMWebVTTParser.html#a4e6f754e4fba24f7ea77fd0db959908b',1,'shaka::media::WebMWebVTTParser::Parse()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#a5295c061b251726d1525cefc091101a2',1,'shaka::media::WebVttMediaParser::Parse()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#a246702aa75891cbe396ca7cc11e13eeb',1,'shaka::media::wvm::WvmMediaParser::Parse()']]], + ['parse',['Parse',['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#a0c85f3cb0591f67c036276be82a1ba9d',1,'shaka::media::MediaParser::Parse()'],['../d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html#a13b0f93b68efff614c5356df081f2560',1,'shaka::media::ProtectionSystemSpecificInfo::Parse()'],['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a6b3deca725a42113bf7303387ab74f0f',1,'shaka::media::AACAudioSpecificConfig::Parse()'],['../de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html#ab05a1971c60e510b7bc0b5b578dfb04b',1,'shaka::media::DecoderConfigurationRecord::Parse(const std::vector< uint8_t > &data)'],['../de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html#a07b7d0dbae45971d4fd4a24652980f65',1,'shaka::media::DecoderConfigurationRecord::Parse(const uint8_t *data, size_t data_size)'],['../d8/d14/classshaka_1_1media_1_1VP8Parser.html#a8baec0e4c74b0b220b777426d0c463e1',1,'shaka::media::VP8Parser::Parse()'],['../db/d5a/classshaka_1_1media_1_1VP9Parser.html#ae915c36aa472d70b55e3d65b24612e57',1,'shaka::media::VP9Parser::Parse()'],['../db/dcb/classshaka_1_1media_1_1VPxParser.html#abb83c8c74d304e83efb8fa60bd7bb722',1,'shaka::media::VPxParser::Parse()'],['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a04733336c57460238d0279decaa3939c',1,'shaka::media::mp2t::Ac3Header::Parse()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ac1cdf6cf0f3d4a7438ae4c4cc8fb0762',1,'shaka::media::mp2t::AdtsHeader::Parse()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a334c1ceea413b309a5950cc06619853f',1,'shaka::media::mp2t::AudioHeader::Parse()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#af1a8a33b4ce61777c876717b005d0026',1,'shaka::media::mp2t::Mp2tMediaParser::Parse()'],['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#a209382fcd42e82a896c29e856627ca52',1,'shaka::media::mp4::Box::Parse()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#a4105cdbe5ece03071a17c06fb27699b0',1,'shaka::media::mp4::MP4MediaParser::Parse()'],['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#aba1bae97c2d96181027e43b0a1993e67',1,'shaka::media::WebMClusterParser::Parse()'],['../db/dae/classshaka_1_1media_1_1WebMInfoParser.html#ae0b4d37e02d43627b1bc9c64f43ee3f7',1,'shaka::media::WebMInfoParser::Parse()'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a40940ec01d965e3a78213861a93f7cfc',1,'shaka::media::WebMMediaParser::Parse()'],['../dc/dca/classshaka_1_1media_1_1WebMListParser.html#acd805b7eb25afcd9a3be2d8d88e3c6af',1,'shaka::media::WebMListParser::Parse()'],['../d8/d86/classshaka_1_1media_1_1WebMTracksParser.html#aa4b6d4ac9fa57b47cbc17ee7c1bd3639',1,'shaka::media::WebMTracksParser::Parse()'],['../d4/d59/classshaka_1_1media_1_1WebMWebVTTParser.html#a4e6f754e4fba24f7ea77fd0db959908b',1,'shaka::media::WebMWebVTTParser::Parse()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#a5295c061b251726d1525cefc091101a2',1,'shaka::media::WebVttMediaParser::Parse()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#a246702aa75891cbe396ca7cc11e13eeb',1,'shaka::media::wvm::WvmMediaParser::Parse()']]], ['parseboxes',['ParseBoxes',['../d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html#aa984e27d2655a451ea87ff0a4ddd8b79',1,'shaka::media::ProtectionSystemSpecificInfo']]], ['parsecallbackfilename',['ParseCallbackFileName',['../d3/d73/classshaka_1_1File.html#ae87642f9661588e47479721cd101bf7d',1,'shaka::File']]], ['parsefrombuffer',['ParseFromBuffer',['../d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html#a247ca9987470a6c724f1e099a78d3460',1,'shaka::media::mp4::SampleEncryptionEntry']]], @@ -19,7 +19,6 @@ var searchData= ['payload_5fsize',['payload_size',['../d6/dff/classshaka_1_1media_1_1Nalu.html#a6bcba03125313ea515a61a67c9d2a821',1,'shaka::media::Nalu']]], ['peek',['Peek',['../d7/dda/classshaka_1_1media_1_1ByteQueue.html#a838fe5642e533477a5e229981e5f06e7',1,'shaka::media::ByteQueue::Peek()'],['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#a92d6cca0ecfb54f6edf9a0408305e9cd',1,'shaka::media::ProducerConsumerQueue::Peek()']]], ['peekat',['PeekAt',['../d9/df9/classshaka_1_1media_1_1OffsetByteQueue.html#a68832e85b25a9b543e54033bb70c4df6',1,'shaka::media::OffsetByteQueue']]], - ['periodinfo',['PeriodInfo',['../d7/d58/structshaka_1_1media_1_1PeriodInfo.html',1,'shaka::media']]], ['pespacket',['PesPacket',['../d2/d93/classshaka_1_1media_1_1mp2t_1_1PesPacket.html',1,'shaka::media::mp2t']]], ['pespacketgenerator',['PesPacketGenerator',['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html',1,'shaka::media::mp2t']]], ['pixel_5fheight',['pixel_height',['../d6/db1/classshaka_1_1media_1_1VideoStreamInfo.html#ae420a97a606ef54be16beb49e42cd135',1,'shaka::media::VideoStreamInfo']]], @@ -27,8 +26,8 @@ var searchData= ['pixelaspectratio',['PixelAspectRatio',['../dd/d71/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio.html',1,'shaka::media::mp4']]], ['playlist_5ftype',['playlist_type',['../d0/da8/structshaka_1_1HlsParams.html#a9bfeae8a0c112ca82830dd3f228438e6',1,'shaka::HlsParams::playlist_type()'],['../d9/deb/classshaka_1_1hls_1_1HlsNotifier.html#ab758817024e2d9ba012e93d02d115d94',1,'shaka::hls::HlsNotifier::playlist_type()']]], ['playreadyencryptionparams',['PlayreadyEncryptionParams',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html',1,'shaka']]], - ['playreadykeysource',['PlayReadyKeySource',['../d4/da6/classshaka_1_1media_1_1PlayReadyKeySource.html',1,'shaka::media']]], ['playreadykeysource',['PlayReadyKeySource',['../d4/da6/classshaka_1_1media_1_1PlayReadyKeySource.html#a2d85b64ad09aec73b84a26071a9c059e',1,'shaka::media::PlayReadyKeySource::PlayReadyKeySource(const std::string &server_url)'],['../d4/da6/classshaka_1_1media_1_1PlayReadyKeySource.html#a11f5940080bf569c4c3dca1fe4bd9ce1',1,'shaka::media::PlayReadyKeySource::PlayReadyKeySource(const std::string &server_url, const std::string &client_cert_file, const std::string &client_cert_private_key_file, const std::string &client_cert_private_key_password)']]], + ['playreadykeysource',['PlayReadyKeySource',['../d4/da6/classshaka_1_1media_1_1PlayReadyKeySource.html',1,'shaka::media']]], ['policy',['policy',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a469f3db91b42af20f270a280c4d42b4f',1,'shaka::WidevineEncryptionParams']]], ['pop',['Pop',['../d7/dda/classshaka_1_1media_1_1ByteQueue.html#a31b30d39d14fca3ce722b4233de95c79',1,'shaka::media::ByteQueue::Pop()'],['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#a935e9ddee232be82d224c9b81b3b4f88',1,'shaka::media::ProducerConsumerQueue::Pop()']]], ['popsample',['PopSample',['../de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html#a43fa59b53f847b638cf32c6f03f87dcd',1,'shaka::media::WebVttSampleConverter']]], @@ -42,8 +41,8 @@ var searchData= ['private_5fframe',['private_frame',['../d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html#a33c145fa8ed1417799dce66a94f8e95c',1,'shaka::media::mp4::ID3v2']]], ['privframe',['PrivFrame',['../d3/d47/structshaka_1_1media_1_1mp4_1_1PrivFrame.html',1,'shaka::media::mp4']]], ['process',['Process',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#acb614e9f43e1eb6f837801b15b78c0b4',1,'shaka::media::MediaHandler::Process()'],['../d1/d36/classshaka_1_1media_1_1FakeMediaHandler.html#af9fa42669591a52b8fa1a62d27ed93d6',1,'shaka::media::FakeMediaHandler::Process()'],['../df/d46/classshaka_1_1media_1_1Muxer.html#aec730b070245231a0887787005c06eee',1,'shaka::media::Muxer::Process()'],['../d4/d43/classshaka_1_1media_1_1ChunkingHandler.html#a44c30ffd7c283be2ba4347bda7848633',1,'shaka::media::ChunkingHandler::Process()'],['../d6/d4c/classshaka_1_1media_1_1EncryptionHandler.html#a7887e6060eb572036674ecb9a7e045c4',1,'shaka::media::EncryptionHandler::Process()'],['../dd/d17/classshaka_1_1media_1_1Demuxer.html#a869b21d13f02d4d5c0519f9eb35117cd',1,'shaka::media::Demuxer::Process()']]], - ['producerconsumerqueue',['ProducerConsumerQueue',['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#ad7ccb149baa88e5f8356be18344d2baf',1,'shaka::media::ProducerConsumerQueue::ProducerConsumerQueue(size_t capacity)'],['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#a80ff75afdbbf7f567dcb57a755542ffc',1,'shaka::media::ProducerConsumerQueue::ProducerConsumerQueue(size_t capacity, size_t starting_pos)']]], ['producerconsumerqueue',['ProducerConsumerQueue',['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html',1,'shaka::media']]], + ['producerconsumerqueue',['ProducerConsumerQueue',['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#ad7ccb149baa88e5f8356be18344d2baf',1,'shaka::media::ProducerConsumerQueue::ProducerConsumerQueue(size_t capacity)'],['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#a80ff75afdbbf7f567dcb57a755542ffc',1,'shaka::media::ProducerConsumerQueue::ProducerConsumerQueue(size_t capacity, size_t starting_pos)']]], ['program_5fidentifier',['program_identifier',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a74199b0293ca77eaac30aea53a9ec2aa',1,'shaka::PlayreadyEncryptionParams']]], ['programmaptablewriter',['ProgramMapTableWriter',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html',1,'shaka::media::mp2t']]], ['progresslistener',['ProgressListener',['../d4/de6/classshaka_1_1media_1_1ProgressListener.html',1,'shaka::media']]], diff --git a/docs/search/classes_0.js b/docs/search/classes_0.js index c655288c49..87c425485e 100644 --- a/docs/search/classes_0.js +++ b/docs/search/classes_0.js @@ -1,10 +1,12 @@ var searchData= [ ['aacaudiospecificconfig',['AACAudioSpecificConfig',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html',1,'shaka::media']]], - ['aacprogrammaptablewriter',['AacProgramMapTableWriter',['../d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html',1,'shaka::media::mp2t']]], + ['ac3header',['Ac3Header',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html',1,'shaka::media::mp2t']]], ['ac3specific',['AC3Specific',['../d4/dfa/structshaka_1_1media_1_1mp4_1_1AC3Specific.html',1,'shaka::media::mp4']]], ['adaptationset',['AdaptationSet',['../d8/d8e/classshaka_1_1AdaptationSet.html',1,'shaka']]], ['adaptationsetxmlnode',['AdaptationSetXmlNode',['../d1/de7/classshaka_1_1xml_1_1AdaptationSetXmlNode.html',1,'shaka::xml']]], + ['adcuegenerator',['AdCueGenerator',['../de/de4/classshaka_1_1media_1_1AdCueGenerator.html',1,'shaka::media']]], + ['adcuegeneratorparams',['AdCueGeneratorParams',['../dd/dfd/structshaka_1_1AdCueGeneratorParams.html',1,'shaka']]], ['adtsheader',['AdtsHeader',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html',1,'shaka::media::mp2t']]], ['aescbcdecryptor',['AesCbcDecryptor',['../df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html',1,'shaka::media']]], ['aescbcencryptor',['AesCbcEncryptor',['../d4/d20/classshaka_1_1media_1_1AesCbcEncryptor.html',1,'shaka::media']]], @@ -13,6 +15,8 @@ var searchData= ['aesencryptor',['AesEncryptor',['../d3/d75/classshaka_1_1media_1_1AesEncryptor.html',1,'shaka::media']]], ['aespatterncryptor',['AesPatternCryptor',['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html',1,'shaka::media']]], ['aesrequestsigner',['AesRequestSigner',['../d9/d8c/classshaka_1_1media_1_1AesRequestSigner.html',1,'shaka::media']]], + ['audioheader',['AudioHeader',['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html',1,'shaka::media::mp2t']]], + ['audioprogrammaptablewriter',['AudioProgramMapTableWriter',['../dc/d1c/classshaka_1_1media_1_1mp2t_1_1AudioProgramMapTableWriter.html',1,'shaka::media::mp2t']]], ['audiorollrecoveryentry',['AudioRollRecoveryEntry',['../da/d6e/structshaka_1_1media_1_1mp4_1_1AudioRollRecoveryEntry.html',1,'shaka::media::mp4']]], ['audiosampleentry',['AudioSampleEntry',['../d8/d5b/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry.html',1,'shaka::media::mp4']]], ['audiostreaminfo',['AudioStreamInfo',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html',1,'shaka::media']]], diff --git a/docs/search/classes_1.js b/docs/search/classes_1.js index 7891fedd85..c395c72357 100644 --- a/docs/search/classes_1.js +++ b/docs/search/classes_1.js @@ -2,6 +2,7 @@ var searchData= [ ['bandwidthestimator',['BandwidthEstimator',['../d2/d6f/classBandwidthEstimator.html',1,'']]], ['bitreader',['BitReader',['../d6/da9/classshaka_1_1media_1_1BitReader.html',1,'shaka::media']]], + ['bitwriter',['BitWriter',['../dc/d76/classshaka_1_1media_1_1BitWriter.html',1,'shaka::media']]], ['box',['Box',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html',1,'shaka::media::mp4']]], ['boxbuffer',['BoxBuffer',['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html',1,'shaka::media::mp4']]], ['boxreader',['BoxReader',['../d1/dee/classshaka_1_1media_1_1mp4_1_1BoxReader.html',1,'shaka::media::mp4']]], diff --git a/docs/search/classes_12.js b/docs/search/classes_12.js index c72af7b1e4..d2e45a2a5b 100644 --- a/docs/search/classes_12.js +++ b/docs/search/classes_12.js @@ -1,6 +1,7 @@ var searchData= [ ['videomediaheader',['VideoMediaHeader',['../d1/db0/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader.html',1,'shaka::media::mp4']]], + ['videoprogrammaptablewriter',['VideoProgramMapTableWriter',['../da/d6a/classshaka_1_1media_1_1mp2t_1_1VideoProgramMapTableWriter.html',1,'shaka::media::mp2t']]], ['videosampleentry',['VideoSampleEntry',['../d0/d73/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry.html',1,'shaka::media::mp4']]], ['videosliceheaderparser',['VideoSliceHeaderParser',['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html',1,'shaka::media']]], ['videosliceinfo',['VideoSliceInfo',['../d8/dc2/structshaka_1_1media_1_1mp2t_1_1EsParserH26x_1_1VideoSliceInfo.html',1,'shaka::media::mp2t::EsParserH26x']]], diff --git a/docs/search/classes_2.js b/docs/search/classes_2.js index 80022b9a55..5c153d6797 100644 --- a/docs/search/classes_2.js +++ b/docs/search/classes_2.js @@ -22,8 +22,10 @@ var searchData= ['contentprotectionelement',['ContentProtectionElement',['../da/d43/structshaka_1_1ContentProtectionElement.html',1,'shaka']]], ['continuitycounter',['ContinuityCounter',['../d8/dd6/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter.html',1,'shaka::media::mp2t']]], ['cue',['Cue',['../dd/dce/structshaka_1_1media_1_1Cue.html',1,'shaka::media']]], + ['cueevent',['CueEvent',['../da/d93/structshaka_1_1media_1_1CueEvent.html',1,'shaka::media']]], ['cueidbox',['CueIDBox',['../d5/d09/structshaka_1_1media_1_1mp4_1_1CueIDBox.html',1,'shaka::media::mp4']]], ['cuepayloadbox',['CuePayloadBox',['../d2/d7f/structshaka_1_1media_1_1mp4_1_1CuePayloadBox.html',1,'shaka::media::mp4']]], + ['cuepoint',['Cuepoint',['../de/deb/structshaka_1_1Cuepoint.html',1,'shaka']]], ['cuesettingsbox',['CueSettingsBox',['../d0/dd0/structshaka_1_1media_1_1mp4_1_1CueSettingsBox.html',1,'shaka::media::mp4']]], ['cuesourceidbox',['CueSourceIDBox',['../d9/d3e/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox.html',1,'shaka::media::mp4']]], ['cuetimebox',['CueTimeBox',['../d8/dc3/structshaka_1_1media_1_1mp4_1_1CueTimeBox.html',1,'shaka::media::mp4']]] diff --git a/docs/search/classes_4.js b/docs/search/classes_4.js index 15528f6dce..4976aba12b 100644 --- a/docs/search/classes_4.js +++ b/docs/search/classes_4.js @@ -13,7 +13,7 @@ var searchData= ['encryptionparams',['EncryptionParams',['../dc/da0/structshaka_1_1EncryptionParams.html',1,'shaka']]], ['esdescriptor',['ESDescriptor',['../d5/d13/classshaka_1_1media_1_1ESDescriptor.html',1,'shaka::media']]], ['esparser',['EsParser',['../da/d10/classshaka_1_1media_1_1mp2t_1_1EsParser.html',1,'shaka::media::mp2t']]], - ['esparseradts',['EsParserAdts',['../d6/dcf/classshaka_1_1media_1_1mp2t_1_1EsParserAdts.html',1,'shaka::media::mp2t']]], + ['esparseraudio',['EsParserAudio',['../dc/d8a/classshaka_1_1media_1_1mp2t_1_1EsParserAudio.html',1,'shaka::media::mp2t']]], ['esparserh264',['EsParserH264',['../d5/db9/classshaka_1_1media_1_1mp2t_1_1EsParserH264.html',1,'shaka::media::mp2t']]], ['esparserh265',['EsParserH265',['../d5/d63/classshaka_1_1media_1_1mp2t_1_1EsParserH265.html',1,'shaka::media::mp2t']]], ['esparserh26x',['EsParserH26x',['../da/d23/classshaka_1_1media_1_1mp2t_1_1EsParserH26x.html',1,'shaka::media::mp2t']]] diff --git a/docs/search/classes_6.js b/docs/search/classes_6.js index 1817be7c07..315ab07230 100644 --- a/docs/search/classes_6.js +++ b/docs/search/classes_6.js @@ -5,7 +5,6 @@ var searchData= ['h264modificationofpicnum',['H264ModificationOfPicNum',['../d9/dff/structshaka_1_1media_1_1H264ModificationOfPicNum.html',1,'shaka::media']]], ['h264parser',['H264Parser',['../d3/d91/classshaka_1_1media_1_1H264Parser.html',1,'shaka::media']]], ['h264pps',['H264Pps',['../de/de4/structshaka_1_1media_1_1H264Pps.html',1,'shaka::media']]], - ['h264programmaptablewriter',['H264ProgramMapTableWriter',['../de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html',1,'shaka::media::mp2t']]], ['h264seimessage',['H264SEIMessage',['../d6/dd0/structshaka_1_1media_1_1H264SEIMessage.html',1,'shaka::media']]], ['h264seirecoverypoint',['H264SEIRecoveryPoint',['../df/de2/structshaka_1_1media_1_1H264SEIRecoveryPoint.html',1,'shaka::media']]], ['h264sliceheader',['H264SliceHeader',['../d2/d59/structshaka_1_1media_1_1H264SliceHeader.html',1,'shaka::media']]], diff --git a/docs/search/classes_a.js b/docs/search/classes_a.js index 8e49ea8158..b8464fa56d 100644 --- a/docs/search/classes_a.js +++ b/docs/search/classes_a.js @@ -3,7 +3,6 @@ var searchData= ['masterplaylist',['MasterPlaylist',['../d1/d87/classshaka_1_1hls_1_1MasterPlaylist.html',1,'shaka::hls']]], ['media',['Media',['../dc/ddf/structshaka_1_1media_1_1mp4_1_1Media.html',1,'shaka::media::mp4']]], ['mediadata',['MediaData',['../d7/dae/structshaka_1_1media_1_1mp4_1_1MediaData.html',1,'shaka::media::mp4']]], - ['mediaevent',['MediaEvent',['../df/dd3/structshaka_1_1media_1_1MediaEvent.html',1,'shaka::media']]], ['mediahandler',['MediaHandler',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html',1,'shaka::media']]], ['mediahandlergraphtestbase',['MediaHandlerGraphTestBase',['../d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html',1,'shaka::media']]], ['mediahandlertestbase',['MediaHandlerTestBase',['../d4/d9b/classshaka_1_1media_1_1MediaHandlerTestBase.html',1,'shaka::media']]], @@ -41,8 +40,8 @@ var searchData= ['mpdoptions',['MpdOptions',['../d1/df3/structshaka_1_1MpdOptions.html',1,'shaka']]], ['mpdparams',['MpdParams',['../df/ddc/structshaka_1_1MpdParams.html',1,'shaka']]], ['mpdwriter',['MpdWriter',['../db/dcd/classshaka_1_1MpdWriter.html',1,'shaka']]], - ['multisegmentsegmenter',['MultiSegmentSegmenter',['../d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html',1,'shaka::media::webm']]], ['multisegmentsegmenter',['MultiSegmentSegmenter',['../d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html',1,'shaka::media::mp4']]], + ['multisegmentsegmenter',['MultiSegmentSegmenter',['../d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html',1,'shaka::media::webm']]], ['muxer',['Muxer',['../df/d46/classshaka_1_1media_1_1Muxer.html',1,'shaka::media']]], ['muxerlistener',['MuxerListener',['../dd/d7a/classshaka_1_1media_1_1MuxerListener.html',1,'shaka::media']]], ['muxeroptions',['MuxerOptions',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html',1,'shaka::media']]] diff --git a/docs/search/classes_d.js b/docs/search/classes_d.js index 9dcaf1c462..78fcd7640b 100644 --- a/docs/search/classes_d.js +++ b/docs/search/classes_d.js @@ -2,7 +2,6 @@ var searchData= [ ['packager',['Packager',['../db/dd0/classshaka_1_1Packager.html',1,'shaka']]], ['packagingparams',['PackagingParams',['../d5/de3/structshaka_1_1PackagingParams.html',1,'shaka']]], - ['periodinfo',['PeriodInfo',['../d7/d58/structshaka_1_1media_1_1PeriodInfo.html',1,'shaka::media']]], ['pespacket',['PesPacket',['../d2/d93/classshaka_1_1media_1_1mp2t_1_1PesPacket.html',1,'shaka::media::mp2t']]], ['pespacketgenerator',['PesPacketGenerator',['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html',1,'shaka::media::mp2t']]], ['pixelaspectratio',['PixelAspectRatio',['../dd/d71/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio.html',1,'shaka::media::mp4']]], diff --git a/docs/search/classes_f.js b/docs/search/classes_f.js index 6d7857088e..f9bd3a63a4 100644 --- a/docs/search/classes_f.js +++ b/docs/search/classes_f.js @@ -13,19 +13,20 @@ var searchData= ['sampletogroupentry',['SampleToGroupEntry',['../d7/de0/structshaka_1_1media_1_1mp4_1_1SampleToGroupEntry.html',1,'shaka::media::mp4']]], ['schemeinfo',['SchemeInfo',['../d2/d70/structshaka_1_1media_1_1mp4_1_1SchemeInfo.html',1,'shaka::media::mp4']]], ['schemetype',['SchemeType',['../d3/da2/structshaka_1_1media_1_1mp4_1_1SchemeType.html',1,'shaka::media::mp4']]], + ['scte35event',['Scte35Event',['../d1/d41/structshaka_1_1media_1_1Scte35Event.html',1,'shaka::media']]], ['seekhead',['SeekHead',['../dc/d16/classshaka_1_1media_1_1SeekHead.html',1,'shaka::media']]], ['segmenter',['Segmenter',['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html',1,'shaka::media::webm']]], ['segmenter',['Segmenter',['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html',1,'shaka::media::mp4']]], ['segmentindex',['SegmentIndex',['../d4/df9/structshaka_1_1media_1_1mp4_1_1SegmentIndex.html',1,'shaka::media::mp4']]], - ['segmentinfo',['SegmentInfo',['../d0/dc0/structshaka_1_1media_1_1SegmentInfo.html',1,'shaka::media']]], ['segmentinfo',['SegmentInfo',['../dc/de1/structshaka_1_1SegmentInfo.html',1,'shaka']]], + ['segmentinfo',['SegmentInfo',['../d0/dc0/structshaka_1_1media_1_1SegmentInfo.html',1,'shaka::media']]], ['segmentreference',['SegmentReference',['../dd/d9b/structshaka_1_1media_1_1mp4_1_1SegmentReference.html',1,'shaka::media::mp4']]], ['segmenttestbase',['SegmentTestBase',['../d2/dba/classshaka_1_1media_1_1SegmentTestBase.html',1,'shaka::media']]], ['segmenttype',['SegmentType',['../d3/dd0/structshaka_1_1media_1_1mp4_1_1SegmentType.html',1,'shaka::media::mp4']]], ['simplehlsnotifier',['SimpleHlsNotifier',['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html',1,'shaka::hls']]], ['simplempdnotifier',['SimpleMpdNotifier',['../d8/de1/classshaka_1_1SimpleMpdNotifier.html',1,'shaka']]], - ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html',1,'shaka::media::mp4']]], ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html',1,'shaka::media::webm']]], + ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html',1,'shaka::media::mp4']]], ['soundmediaheader',['SoundMediaHeader',['../d7/d07/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader.html',1,'shaka::media::mp4']]], ['status',['Status',['../d2/d20/classshaka_1_1Status.html',1,'shaka']]], ['streamdata',['StreamData',['../d0/d4c/structshaka_1_1media_1_1StreamData.html',1,'shaka::media']]], diff --git a/docs/search/enumvalues_0.js b/docs/search/enumvalues_0.js index 5d23fd2a9c..9665e0687e 100644 --- a/docs/search/enumvalues_0.js +++ b/docs/search/enumvalues_0.js @@ -1,7 +1,7 @@ var searchData= [ - ['kdefaultaudiobufferdurationinms',['kDefaultAudioBufferDurationInMs',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#abe19fd2154084026a514541e152600e0a696e4587c758dc7908ad6bbb376ae06d',1,'shaka::media::WebMClusterParser']]], - ['kdefaultvideobufferdurationinms',['kDefaultVideoBufferDurationInMs',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#abe19fd2154084026a514541e152600e0ae4ed667d0b90505a42a7983b0aa4d57f',1,'shaka::media::WebMClusterParser']]], + ['kdefaultaudiobufferdurationinms',['kDefaultAudioBufferDurationInMs',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#aba8ed8dff0aa6421a896bfbfa6a67d2aa696e4587c758dc7908ad6bbb376ae06d',1,'shaka::media::WebMClusterParser']]], + ['kdefaultvideobufferdurationinms',['kDefaultVideoBufferDurationInMs',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#aba8ed8dff0aa6421a896bfbfa6a67d2aae4ed667d0b90505a42a7983b0aa4d57f',1,'shaka::media::WebMClusterParser']]], ['kencryptifcryptbyteblockremaining',['kEncryptIfCryptByteBlockRemaining',['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html#a54fd35d7782d3b4948c7eb68387711f0a76b19d202e22b2b0f661f933b47b3b16',1,'shaka::media::AesPatternCryptor']]], ['kskipifcryptbyteblockremaining',['kSkipIfCryptByteBlockRemaining',['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html#a54fd35d7782d3b4948c7eb68387711f0a09674e418b61763fdc5cf22c248efd4f',1,'shaka::media::AesPatternCryptor']]] ]; diff --git a/docs/search/functions_1.js b/docs/search/functions_1.js index 6694ded844..fbfee690c7 100644 --- a/docs/search/functions_1.js +++ b/docs/search/functions_1.js @@ -2,15 +2,18 @@ var searchData= [ ['bandwidthestimator',['BandwidthEstimator',['../d2/d6f/classBandwidthEstimator.html#aaae9573785ee9d62e0927f806537ea97',1,'BandwidthEstimator']]], ['bit_5fposition',['bit_position',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a6b7456b84d6b463767127b57cd0dc898',1,'shaka::media::BitReader']]], + ['bitpos',['BitPos',['../dc/d76/classshaka_1_1media_1_1BitWriter.html#afae1e44d677e793d883ba069970b17f8',1,'shaka::media::BitWriter']]], ['bitrate',['Bitrate',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#ab518406ca3fb7785e103ab0bdb06ade9',1,'shaka::hls::MediaPlaylist']]], ['bitreader',['BitReader',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a264dbe3e94ba76214c1af75ab3877945',1,'shaka::media::BitReader']]], ['bits_5favailable',['bits_available',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a1c1e1225c2780383e72996137bb7f86a',1,'shaka::media::BitReader']]], + ['bitwriter',['BitWriter',['../dc/d76/classshaka_1_1media_1_1BitWriter.html#a09495a53bd1f1885dcc328b1621041f4',1,'shaka::media::BitWriter']]], ['box_5fsize',['box_size',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#ad0186e0f9301bd07c52a55a8b1db0419',1,'shaka::media::mp4::Box']]], ['boxbuffer',['BoxBuffer',['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html#a787a6a6404dfc1fed10dfd903b4e4d22',1,'shaka::media::mp4::BoxBuffer::BoxBuffer(BoxReader *reader)'],['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html#a021513a50af89992b15691dfc79ed447',1,'shaka::media::mp4::BoxBuffer::BoxBuffer(BufferWriter *writer)']]], ['boxtype',['BoxType',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#ac7c07671ab4c56d19e085570862015ca',1,'shaka::media::mp4::Box::BoxType()'],['../d5/d03/structshaka_1_1media_1_1mp4_1_1FileType.html#a038c8454ffed2e8bf32c858ddae320e1',1,'shaka::media::mp4::FileType::BoxType()'],['../d3/dd0/structshaka_1_1media_1_1mp4_1_1SegmentType.html#ab3c10a2cd4a8162a91265b0cfd53de09',1,'shaka::media::mp4::SegmentType::BoxType()'],['../d0/d3c/structshaka_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html#aae81fc1f70a0cdb8161dbafdbe80b099',1,'shaka::media::mp4::ProtectionSystemSpecificHeader::BoxType()'],['../d5/dca/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html#a63843ee864061fef2d6f788ad240aa44',1,'shaka::media::mp4::SampleAuxiliaryInformationOffset::BoxType()'],['../dd/d13/structshaka_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html#a909bcffee3acdc7754539a22546d1c76',1,'shaka::media::mp4::SampleAuxiliaryInformationSize::BoxType()'],['../d4/dad/structshaka_1_1media_1_1mp4_1_1SampleEncryption.html#a62cd7e5cc8c102db09cbd3d7947604dd',1,'shaka::media::mp4::SampleEncryption::BoxType()'],['../d5/d05/structshaka_1_1media_1_1mp4_1_1OriginalFormat.html#a4901c12c42b47485da0a95e8671de686',1,'shaka::media::mp4::OriginalFormat::BoxType()'],['../d3/da2/structshaka_1_1media_1_1mp4_1_1SchemeType.html#a76da5fef2de39a070fe61055e013b7c1',1,'shaka::media::mp4::SchemeType::BoxType()'],['../db/db8/structshaka_1_1media_1_1mp4_1_1TrackEncryption.html#a702b5c406fdac82ea3e3cb4de88d1c55',1,'shaka::media::mp4::TrackEncryption::BoxType()'],['../d2/d70/structshaka_1_1media_1_1mp4_1_1SchemeInfo.html#a5a50e58f6dcd3969bdeb07fb66a9d4dc',1,'shaka::media::mp4::SchemeInfo::BoxType()'],['../da/de9/structshaka_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html#a09f2c7d00252d23003506285b30d9267',1,'shaka::media::mp4::ProtectionSchemeInfo::BoxType()'],['../d6/d1a/structshaka_1_1media_1_1mp4_1_1MovieHeader.html#a0bbd09e7f0bc8effc1c1ba7f5b8d49d6',1,'shaka::media::mp4::MovieHeader::BoxType()'],['../da/dc4/structshaka_1_1media_1_1mp4_1_1TrackHeader.html#a7880b5742f038be62ca83693883814d3',1,'shaka::media::mp4::TrackHeader::BoxType()'],['../d3/dbe/structshaka_1_1media_1_1mp4_1_1EditList.html#af8ba6778f3fa9b239126ae635d8e9703',1,'shaka::media::mp4::EditList::BoxType()'],['../da/dd0/structshaka_1_1media_1_1mp4_1_1Edit.html#a44e5523c2fa791cae8dd3e36feee81ac',1,'shaka::media::mp4::Edit::BoxType()'],['../da/dbb/structshaka_1_1media_1_1mp4_1_1HandlerReference.html#a71203a734c203f04967eaf1676440ad9',1,'shaka::media::mp4::HandlerReference::BoxType()'],['../d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html#acb41577286eeba57541fed6cd0cabbf2',1,'shaka::media::mp4::ID3v2::BoxType()'],['../dd/df6/structshaka_1_1media_1_1mp4_1_1Metadata.html#aca63db6a124f0d0a62b6a355a89d9f1d',1,'shaka::media::mp4::Metadata::BoxType()'],['../db/d11/structshaka_1_1media_1_1mp4_1_1CodecConfiguration.html#a1e9cb483b993bff202ec6143f892972e',1,'shaka::media::mp4::CodecConfiguration::BoxType()'],['../dd/d71/structshaka_1_1media_1_1mp4_1_1PixelAspectRatio.html#ae12482d2916a9e6b7ecdee1c944c3c91',1,'shaka::media::mp4::PixelAspectRatio::BoxType()'],['../d0/d73/structshaka_1_1media_1_1mp4_1_1VideoSampleEntry.html#a56ed4864ffdb37094b5f3352f53bc755',1,'shaka::media::mp4::VideoSampleEntry::BoxType()'],['../d5/d11/structshaka_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html#a579ea111ae1e304e27cb0b8d9f52c99c',1,'shaka::media::mp4::ElementaryStreamDescriptor::BoxType()'],['../dc/da0/structshaka_1_1media_1_1mp4_1_1DTSSpecific.html#aa84cd76627aaaf58e2137935b6116346',1,'shaka::media::mp4::DTSSpecific::BoxType()'],['../d4/dfa/structshaka_1_1media_1_1mp4_1_1AC3Specific.html#aa3d0fa9297d15d210f1529eeff8e3d09',1,'shaka::media::mp4::AC3Specific::BoxType()'],['../d4/d8d/structshaka_1_1media_1_1mp4_1_1EC3Specific.html#a926ae9221e26938071abb3ec5988eaf5',1,'shaka::media::mp4::EC3Specific::BoxType()'],['../de/dfa/structshaka_1_1media_1_1mp4_1_1OpusSpecific.html#a6d71265a8782db78c4ed3c2331179418',1,'shaka::media::mp4::OpusSpecific::BoxType()'],['../d8/d5b/structshaka_1_1media_1_1mp4_1_1AudioSampleEntry.html#ab10582a2954863ffcc26ec7373d42d56',1,'shaka::media::mp4::AudioSampleEntry::BoxType()'],['../d8/d20/structshaka_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html#a90c78b82d88afcce6bcb4f5c96fa08b9',1,'shaka::media::mp4::WebVTTConfigurationBox::BoxType()'],['../d4/d33/structshaka_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html#a90a955dc811f20242aa03eea0758ae55',1,'shaka::media::mp4::WebVTTSourceLabelBox::BoxType()'],['../d7/dc3/structshaka_1_1media_1_1mp4_1_1TextSampleEntry.html#aa3471e1884adc4351293a18fb2ee33fb',1,'shaka::media::mp4::TextSampleEntry::BoxType()'],['../da/df5/structshaka_1_1media_1_1mp4_1_1SampleDescription.html#a55c299ae4b388109dccc7b84feb45089',1,'shaka::media::mp4::SampleDescription::BoxType()'],['../de/def/structshaka_1_1media_1_1mp4_1_1DecodingTimeToSample.html#a16599ced0758987dec6d8678faa7a7b9',1,'shaka::media::mp4::DecodingTimeToSample::BoxType()'],['../df/d7b/structshaka_1_1media_1_1mp4_1_1CompositionTimeToSample.html#a53a999ce269642a6f6cb5b9301ca0740',1,'shaka::media::mp4::CompositionTimeToSample::BoxType()'],['../d3/d87/structshaka_1_1media_1_1mp4_1_1SampleToChunk.html#a610c358480034e85cbea93b0b3406655',1,'shaka::media::mp4::SampleToChunk::BoxType()'],['../d7/d42/structshaka_1_1media_1_1mp4_1_1SampleSize.html#a18b9c0277deec16ff5ffef98c2dbadf3',1,'shaka::media::mp4::SampleSize::BoxType()'],['../da/d59/structshaka_1_1media_1_1mp4_1_1CompactSampleSize.html#affe88ea3f7899a791b616dfa12f794ee',1,'shaka::media::mp4::CompactSampleSize::BoxType()'],['../db/d95/structshaka_1_1media_1_1mp4_1_1ChunkLargeOffset.html#a8215c57361432ca6459cb0333034614d',1,'shaka::media::mp4::ChunkLargeOffset::BoxType()'],['../dd/d06/structshaka_1_1media_1_1mp4_1_1ChunkOffset.html#af4dd3a3ea67a2efb95ac3761b33a8fa0',1,'shaka::media::mp4::ChunkOffset::BoxType()'],['../dd/d3f/structshaka_1_1media_1_1mp4_1_1SyncSample.html#a9d03c709f7d1e51f8809322794756b3b',1,'shaka::media::mp4::SyncSample::BoxType()'],['../d7/d01/structshaka_1_1media_1_1mp4_1_1SampleGroupDescription.html#ad5d87ea02a51983fdb555f2e3638bfed',1,'shaka::media::mp4::SampleGroupDescription::BoxType()'],['../d0/d7c/structshaka_1_1media_1_1mp4_1_1SampleToGroup.html#a4bbaf4bfb39fb569eaeb78f1e9169794',1,'shaka::media::mp4::SampleToGroup::BoxType()'],['../d1/dee/structshaka_1_1media_1_1mp4_1_1SampleTable.html#a2771a6a7d82c1f544bafaf0709043fc1',1,'shaka::media::mp4::SampleTable::BoxType()'],['../d4/db9/structshaka_1_1media_1_1mp4_1_1MediaHeader.html#ad8edc72b3035e93b38ca51505ae01412',1,'shaka::media::mp4::MediaHeader::BoxType()'],['../d1/db0/structshaka_1_1media_1_1mp4_1_1VideoMediaHeader.html#afcca5343a3de868510a53de508730813',1,'shaka::media::mp4::VideoMediaHeader::BoxType()'],['../d7/d07/structshaka_1_1media_1_1mp4_1_1SoundMediaHeader.html#a0a546689f087197c1f9fa7db68887e76',1,'shaka::media::mp4::SoundMediaHeader::BoxType()'],['../db/d21/structshaka_1_1media_1_1mp4_1_1SubtitleMediaHeader.html#a66a134f3ab023831f569873177d4e727',1,'shaka::media::mp4::SubtitleMediaHeader::BoxType()'],['../df/d8a/structshaka_1_1media_1_1mp4_1_1DataEntryUrl.html#a8d46c2ad8b3dd9ae07bc3a73bb45da06',1,'shaka::media::mp4::DataEntryUrl::BoxType()'],['../d4/de3/structshaka_1_1media_1_1mp4_1_1DataReference.html#ad4241f10042e77cb12b30c654746253b',1,'shaka::media::mp4::DataReference::BoxType()'],['../d8/d6d/structshaka_1_1media_1_1mp4_1_1DataInformation.html#ad590eaa2b74fc18d22044abdeafe04c8',1,'shaka::media::mp4::DataInformation::BoxType()'],['../d5/d86/structshaka_1_1media_1_1mp4_1_1MediaInformation.html#a5536ed5769a974f5094c4120c66667fe',1,'shaka::media::mp4::MediaInformation::BoxType()'],['../dc/ddf/structshaka_1_1media_1_1mp4_1_1Media.html#a3a083251ea157e44befabf84b66b0c9e',1,'shaka::media::mp4::Media::BoxType()'],['../d3/db5/structshaka_1_1media_1_1mp4_1_1Track.html#a9ab0be777c96c884b73d2bb85cbb482c',1,'shaka::media::mp4::Track::BoxType()'],['../da/d50/structshaka_1_1media_1_1mp4_1_1MovieExtendsHeader.html#ab2afa24c2f0b694a141ebe58b06635aa',1,'shaka::media::mp4::MovieExtendsHeader::BoxType()'],['../de/d29/structshaka_1_1media_1_1mp4_1_1TrackExtends.html#adb2087c3c85693054596a26d6f31d4dd',1,'shaka::media::mp4::TrackExtends::BoxType()'],['../d1/d3e/structshaka_1_1media_1_1mp4_1_1MovieExtends.html#a3a24ad79e39a6dd24268a90fa5e3d47f',1,'shaka::media::mp4::MovieExtends::BoxType()'],['../d0/d9a/structshaka_1_1media_1_1mp4_1_1Movie.html#a623b673fb897f68e9c4e55682d6114dc',1,'shaka::media::mp4::Movie::BoxType()'],['../df/d9a/structshaka_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html#a036a76de5bb9287116a9ad94f8895e84',1,'shaka::media::mp4::TrackFragmentDecodeTime::BoxType()'],['../dc/d8f/structshaka_1_1media_1_1mp4_1_1MovieFragmentHeader.html#a68efde9cb48af4236d106dbfa46e96b0',1,'shaka::media::mp4::MovieFragmentHeader::BoxType()'],['../d1/d6e/structshaka_1_1media_1_1mp4_1_1TrackFragmentHeader.html#a227b3fd6cf16ac250ee08f1e41e27ef9',1,'shaka::media::mp4::TrackFragmentHeader::BoxType()'],['../dd/df5/structshaka_1_1media_1_1mp4_1_1TrackFragmentRun.html#a4484ad0299e15e642960702764427f2f',1,'shaka::media::mp4::TrackFragmentRun::BoxType()'],['../df/d7b/structshaka_1_1media_1_1mp4_1_1TrackFragment.html#a5776ac8e8cfd7fe2033432a4581e19ea',1,'shaka::media::mp4::TrackFragment::BoxType()'],['../d9/d1f/structshaka_1_1media_1_1mp4_1_1MovieFragment.html#ac6fab326de1329f291c8e427e99ce971',1,'shaka::media::mp4::MovieFragment::BoxType()'],['../d4/df9/structshaka_1_1media_1_1mp4_1_1SegmentIndex.html#ac95186c204fe8aeffc6c41ca8181af35',1,'shaka::media::mp4::SegmentIndex::BoxType()'],['../d7/dae/structshaka_1_1media_1_1mp4_1_1MediaData.html#a6b0601ae1defd84cda96d27e4659058a',1,'shaka::media::mp4::MediaData::BoxType()'],['../d9/d3e/structshaka_1_1media_1_1mp4_1_1CueSourceIDBox.html#a5a9cf523bd1f53f5d2abeaa5cfa20e4c',1,'shaka::media::mp4::CueSourceIDBox::BoxType()'],['../d8/dc3/structshaka_1_1media_1_1mp4_1_1CueTimeBox.html#ae027ee1285bc5d397c450df88d653ae1',1,'shaka::media::mp4::CueTimeBox::BoxType()'],['../d5/d09/structshaka_1_1media_1_1mp4_1_1CueIDBox.html#a29fe876a3059aa2f7a936ff1bf49b0ff',1,'shaka::media::mp4::CueIDBox::BoxType()'],['../d0/dd0/structshaka_1_1media_1_1mp4_1_1CueSettingsBox.html#ab3ab5a5e7b1702bd713433046b380c8d',1,'shaka::media::mp4::CueSettingsBox::BoxType()'],['../d2/d7f/structshaka_1_1media_1_1mp4_1_1CuePayloadBox.html#aefca706b24f701502a071d6c3bd51c2a',1,'shaka::media::mp4::CuePayloadBox::BoxType()'],['../d9/d3c/structshaka_1_1media_1_1mp4_1_1VTTEmptyCueBox.html#a0e463ad10c04f13125f146c5ef908f69',1,'shaka::media::mp4::VTTEmptyCueBox::BoxType()'],['../d6/d79/structshaka_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html#ab22709c67041094daaaa6f0b42eca51d',1,'shaka::media::mp4::VTTAdditionalTextBox::BoxType()'],['../d6/daa/structshaka_1_1media_1_1mp4_1_1VTTCueBox.html#ae19e44ca727ff4ae010a8c62fc566f41',1,'shaka::media::mp4::VTTCueBox::BoxType()']]], ['buffer',['Buffer',['../dc/d41/classshaka_1_1media_1_1BufferWriter.html#ab3054a98a4ec27764c65511dc17a916d',1,'shaka::media::BufferWriter']]], ['bufferreader',['BufferReader',['../d9/d13/classshaka_1_1media_1_1BufferReader.html#a94771befc54d444630ade726689b7bf7',1,'shaka::media::BufferReader']]], ['bufferwriter',['BufferWriter',['../dc/d41/classshaka_1_1media_1_1BufferWriter.html#a01d91524fd5c5491bafcc1cff16db916',1,'shaka::media::BufferWriter']]], + ['bytepos',['BytePos',['../dc/d76/classshaka_1_1media_1_1BitWriter.html#ab84837bdf53d55332e5d78289352ae93',1,'shaka::media::BitWriter']]], ['bytescached',['BytesCached',['../df/d4e/classshaka_1_1IoCache.html#a8033da711e62112877be7a6ac2186622',1,'shaka::IoCache']]], ['bytesfree',['BytesFree',['../df/d4e/classshaka_1_1IoCache.html#a744559cbb0a3878027ca6fc2a12555c1',1,'shaka::IoCache']]], ['bytesleft',['BytesLeft',['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html#acf36e70bcb8c4ee7939835126ae9b98b',1,'shaka::media::mp4::BoxBuffer']]] diff --git a/docs/search/functions_13.js b/docs/search/functions_13.js index fd2e6954e5..e404cd16c6 100644 --- a/docs/search/functions_13.js +++ b/docs/search/functions_13.js @@ -6,6 +6,7 @@ var searchData= ['webmmuxer',['WebMMuxer',['../d3/d73/classshaka_1_1media_1_1webm_1_1WebMMuxer.html#a17b47db217334b2ec328bdbf1a9c7e29',1,'shaka::media::webm::WebMMuxer']]], ['widevinekeysource',['WidevineKeySource',['../da/ddd/classshaka_1_1media_1_1WidevineKeySource.html#a93480a98e423d0456482844ac629bd2e',1,'shaka::media::WidevineKeySource']]], ['write',['Write',['../dd/d40/classshaka_1_1CallbackFile.html#aa758dfb05daff81afa1ddfaf0bb0a105',1,'shaka::CallbackFile::Write()'],['../d3/d73/classshaka_1_1File.html#a8c498531ecbd205fceb0be3478361801',1,'shaka::File::Write()'],['../df/d4e/classshaka_1_1IoCache.html#a483277a6c68dd58cebb8dafb5c1dcd21',1,'shaka::IoCache::Write()'],['../d7/dbd/classshaka_1_1LocalFile.html#aee10b7f2898c5047eb8505f16c49311c',1,'shaka::LocalFile::Write()'],['../de/dad/classshaka_1_1MemoryFile.html#aa3d9455b7bc9d1c44d58ab39bd8bd27c',1,'shaka::MemoryFile::Write()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#ab8acfe4af14c1120ae6d2baa44a10583',1,'shaka::ThreadedIoFile::Write()'],['../d4/dcb/classshaka_1_1UdpFile.html#a36722f3c436c88e451093ee21c0db754',1,'shaka::UdpFile::Write()'],['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#a15bd0622fdb129d921287e690f117bde',1,'shaka::media::mp4::Box::Write()'],['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#a2468514d1d9efdb15a9e4df2e44b75d8',1,'shaka::media::MkvWriter::Write()'],['../dc/d16/classshaka_1_1media_1_1SeekHead.html#a46313134eebf68a7c34187705726b982',1,'shaka::media::SeekHead::Write()']]], + ['writebits',['WriteBits',['../dc/d76/classshaka_1_1media_1_1BitWriter.html#aee5f905e55f262e38f5df506611663f1',1,'shaka::media::BitWriter']]], ['writefileatomically',['WriteFileAtomically',['../d3/d73/classshaka_1_1File.html#a4b5280fe058359b5991037f90dde2b77',1,'shaka::File']]], ['writefromfile',['WriteFromFile',['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#ab331684a758a93bf0c77fa224fe429ea',1,'shaka::media::MkvWriter::WriteFromFile(File *source)'],['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#a2dfac99ec5531ca2e102e5b145bb29ed',1,'shaka::media::MkvWriter::WriteFromFile(File *source, int64_t max_copy)']]], ['writeheader',['WriteHeader',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#a57b8837c93d51f5cf03d3862069d509a',1,'shaka::media::mp4::Box']]], diff --git a/docs/search/functions_2.js b/docs/search/functions_2.js index b5061b24e2..5db7efce8f 100644 --- a/docs/search/functions_2.js +++ b/docs/search/functions_2.js @@ -7,12 +7,13 @@ var searchData= ['chunkinfoiterator',['ChunkInfoIterator',['../d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html#adae19e8f34f3f962e9858c67f984445d',1,'shaka::media::mp4::ChunkInfoIterator']]], ['clear',['Clear',['../df/d4e/classshaka_1_1IoCache.html#a10c8e56478fe7bc4c30ea0087eb22804',1,'shaka::IoCache::Clear()'],['../d2/d20/classshaka_1_1Status.html#a022f6fc5d4756ce2cb2b586d8c40f145',1,'shaka::Status::Clear()']]], ['clearoutputstreamdatavector',['ClearOutputStreamDataVector',['../d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html#a051758e3cfa419622565e65a08fd8a00',1,'shaka::media::MediaHandlerGraphTestBase']]], - ['clearsegmentpmt',['ClearSegmentPmt',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#abaf3df0bbb1b6ff5655d04b828d2889b',1,'shaka::media::mp2t::ProgramMapTableWriter::ClearSegmentPmt()'],['../de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html#a8f439af49b3144f892102c235fb51169',1,'shaka::media::mp2t::H264ProgramMapTableWriter::ClearSegmentPmt()'],['../d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html#aa6d50f3f1249bbf7c1d27608bfb9334f',1,'shaka::media::mp2t::AacProgramMapTableWriter::ClearSegmentPmt()']]], + ['clearsegmentpmt',['ClearSegmentPmt',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#abeab8da6e10fb156bd38dd9e47669c0f',1,'shaka::media::mp2t::ProgramMapTableWriter']]], ['clone',['Clone',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html#a306c5ebb4a42eced7d1a3deaad23c17b',1,'shaka::media::AudioStreamInfo::Clone()'],['../d7/d6d/classshaka_1_1media_1_1MediaSample.html#a6b055c68dd0b2425ec5ba524b8a05b73',1,'shaka::media::MediaSample::Clone()'],['../d5/db1/classshaka_1_1media_1_1StreamInfo.html#afdd9b2df8ae1c11bb033c44eaba5e38d',1,'shaka::media::StreamInfo::Clone()'],['../db/dab/classshaka_1_1media_1_1TextStreamInfo.html#aa8cfad62fa0186a4f82a8dc43ee1c96d',1,'shaka::media::TextStreamInfo::Clone()'],['../d6/db1/classshaka_1_1media_1_1VideoStreamInfo.html#a0d62499eaf37fe6df75f35beaebf71f1',1,'shaka::media::VideoStreamInfo::Clone()']]], ['close',['Close',['../dd/d40/classshaka_1_1CallbackFile.html#aac23ef04e5bafef7d5b4c5d7a3fcfbb5',1,'shaka::CallbackFile::Close()'],['../d3/d73/classshaka_1_1File.html#a932666ed1d6a565bf387a9d8b39a8948',1,'shaka::File::Close()'],['../df/d4e/classshaka_1_1IoCache.html#a1c54ca1d747cf0b0b9ab681babff73e6',1,'shaka::IoCache::Close()'],['../d7/dbd/classshaka_1_1LocalFile.html#a3d881c251c19a36eaf50483971095370',1,'shaka::LocalFile::Close()'],['../de/dad/classshaka_1_1MemoryFile.html#a4cfe38684f4fdde650a2ed7fdc780f05',1,'shaka::MemoryFile::Close()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#a79292b93c39f609b5348787a39fc77b2',1,'shaka::ThreadedIoFile::Close()'],['../d4/dcb/classshaka_1_1UdpFile.html#a61cdb937b3a996bb8b054679d98df812',1,'shaka::UdpFile::Close()'],['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#af560b12e0298ca3dcd8f88fddff1443b',1,'shaka::media::MkvWriter::Close()']]], ['closed',['closed',['../df/d4e/classshaka_1_1IoCache.html#a69c0074123339c9c60dec6a27a5c085c',1,'shaka::IoCache']]], ['closurethread',['ClosureThread',['../dc/df0/classshaka_1_1media_1_1ClosureThread.html#a480ff10ca3ff9de7f9ed9582d305281f',1,'shaka::media::ClosureThread']]], ['cluster_5fended',['cluster_ended',['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#a66f87fef54ed47bd36d740254d52b9c7',1,'shaka::media::WebMClusterParser']]], + ['codec',['codec',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#a5229f5ea763f4511b22aea0948b96690',1,'shaka::media::mp2t::ProgramMapTableWriter']]], ['codec_5fconfig',['codec_config',['../db/dcb/classshaka_1_1media_1_1VPxParser.html#a79057bf3418757cc7d47c3979479220d',1,'shaka::media::VPxParser']]], ['compositionoffsetiterator',['CompositionOffsetIterator',['../db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html#a70511a15ee2f03d447b18668de57ca93',1,'shaka::media::mp4::CompositionOffsetIterator']]], ['computesize',['ComputeSize',['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#aa4e47d0ba81e234707c76ca36e32c1d5',1,'shaka::media::mp4::Box::ComputeSize()'],['../d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html#a253fbc00315441efac7ea917a5952e2c',1,'shaka::media::mp4::SampleEncryptionEntry::ComputeSize()']]], diff --git a/docs/search/functions_3.js b/docs/search/functions_3.js index a8b7fcd0ff..6efa70d567 100644 --- a/docs/search/functions_3.js +++ b/docs/search/functions_3.js @@ -13,9 +13,9 @@ var searchData= ['deleteall',['DeleteAll',['../de/dad/classshaka_1_1MemoryFile.html#acd947572c2bbe3595b403a483c82e899',1,'shaka::MemoryFile']]], ['demuxer',['Demuxer',['../dd/d17/classshaka_1_1media_1_1Demuxer.html#ae2fee69f99e5815de4f686b24393402e',1,'shaka::media::Demuxer']]], ['dispatch',['Dispatch',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#accd62dd4def920571f95f4e1a98ab7ca',1,'shaka::media::MediaHandler']]], - ['dispatchmediaevent',['DispatchMediaEvent',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a1c4c8b216cb4f902e522f0abd4571b86',1,'shaka::media::MediaHandler']]], + ['dispatchcueevent',['DispatchCueEvent',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a6aa5cdf6732f0a0fc19559ec408a9318',1,'shaka::media::MediaHandler']]], ['dispatchmediasample',['DispatchMediaSample',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a96d8a53afdeeb838218b981e7b2d71eb',1,'shaka::media::MediaHandler']]], - ['dispatchperiodinfo',['DispatchPeriodInfo',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#aadccc177c1ca19a3d112484d78d4ee28',1,'shaka::media::MediaHandler']]], + ['dispatchscte35event',['DispatchScte35Event',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#aac0bb4f2b49054ae6cc706517efc71b9',1,'shaka::media::MediaHandler']]], ['dispatchsegmentinfo',['DispatchSegmentInfo',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#ab0ed6c81bd68250d84f6b04453472c00',1,'shaka::media::MediaHandler']]], ['dispatchstreaminfo',['DispatchStreamInfo',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#af0c7b537e9745a0eb49b4561dbc89f55',1,'shaka::media::MediaHandler']]], ['dispatchtextsample',['DispatchTextSample',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a65d965532a6488eab28551aca51a1a2a',1,'shaka::media::MediaHandler']]], diff --git a/docs/search/functions_4.js b/docs/search/functions_4.js index 6b2a4b0978..c0872dc387 100644 --- a/docs/search/functions_4.js +++ b/docs/search/functions_4.js @@ -3,5 +3,5 @@ var searchData= ['elementstartnotify',['ElementStartNotify',['../d1/d0a/classshaka_1_1media_1_1MkvWriter.html#a6603ba573e802e660921f329192738f3',1,'shaka::media::MkvWriter']]], ['empty',['Empty',['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#ad20705b713d6b5ded3312d800740b7ff',1,'shaka::media::ProducerConsumerQueue']]], ['encrypt',['Encrypt',['../d9/d0c/classshaka_1_1media_1_1RsaPublicKey.html#ab9dcf591f3235b8f4eaa02886f9845e3',1,'shaka::media::RsaPublicKey']]], - ['encryptedsegmentpmt',['EncryptedSegmentPmt',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#a7f40bf474758b80e57fede27c2610756',1,'shaka::media::mp2t::ProgramMapTableWriter::EncryptedSegmentPmt()'],['../de/d27/classshaka_1_1media_1_1mp2t_1_1H264ProgramMapTableWriter.html#a14d7933ee669e7c5daeb8d03f2f0b1d0',1,'shaka::media::mp2t::H264ProgramMapTableWriter::EncryptedSegmentPmt()'],['../d4/dc8/classshaka_1_1media_1_1mp2t_1_1AacProgramMapTableWriter.html#a37616e314cb20775644b9c5e3417f8e5',1,'shaka::media::mp2t::AacProgramMapTableWriter::EncryptedSegmentPmt()']]] + ['encryptedsegmentpmt',['EncryptedSegmentPmt',['../dc/d03/classshaka_1_1media_1_1mp2t_1_1ProgramMapTableWriter.html#a258bff0465507799b591006138698150',1,'shaka::media::mp2t::ProgramMapTableWriter']]] ]; diff --git a/docs/search/functions_5.js b/docs/search/functions_5.js index 4b4c4d5344..8c271dbd73 100644 --- a/docs/search/functions_5.js +++ b/docs/search/functions_5.js @@ -6,7 +6,7 @@ var searchData= ['finalizefragment',['FinalizeFragment',['../db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html#ae943e13eb86d54cffb7174d4513e4541',1,'shaka::media::mp4::Fragmenter']]], ['finalizesegment',['FinalizeSegment',['../de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html#ac0c76888b5c3b3a25600a3f126dc92f8',1,'shaka::media::mp2t::TsSegmenter::FinalizeSegment()'],['../de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html#ae9979f940d7a07127709576aa1f766a1',1,'shaka::media::mp2t::TsWriter::FinalizeSegment()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#adfe43b76600564a2836ed78070549656',1,'shaka::media::mp4::Segmenter::FinalizeSegment()'],['../d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html#acadda71dd534ab0f6889ab653fbffe42',1,'shaka::media::webm::MultiSegmentSegmenter::FinalizeSegment()'],['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a3c7123d6d9321c72d8bd737f1f9d3c01',1,'shaka::media::webm::Segmenter::FinalizeSegment()'],['../d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html#a7c34c5c8dacbe1a18444cdb6abce0a30',1,'shaka::media::webm::SingleSegmentSegmenter::FinalizeSegment()']]], ['findstartcodeinclearrange',['FindStartCodeInClearRange',['../db/d86/classshaka_1_1media_1_1NaluReader.html#aa14b3cd5da5657d8a3d0ecfdf301a184',1,'shaka::media::NaluReader']]], - ['flush',['Flush',['../dd/d40/classshaka_1_1CallbackFile.html#aef34f60f2e94f862e495c254edc58bd9',1,'shaka::CallbackFile::Flush()'],['../d3/d73/classshaka_1_1File.html#a5fa625751e03b9e7652ba1bfa98b8ca4',1,'shaka::File::Flush()'],['../d7/dbd/classshaka_1_1LocalFile.html#a04b4523a7352572b2c6d72f1d6f3a077',1,'shaka::LocalFile::Flush()'],['../de/dad/classshaka_1_1MemoryFile.html#aecf76d1658ea5f088ef1e42f04b9b64d',1,'shaka::MemoryFile::Flush()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#a2b53b72d99aad4439781e3887492452c',1,'shaka::ThreadedIoFile::Flush()'],['../d4/dcb/classshaka_1_1UdpFile.html#a4b5430ec1d24434f5f6d9b20692efbc2',1,'shaka::UdpFile::Flush()'],['../d9/deb/classshaka_1_1hls_1_1HlsNotifier.html#a5d788d47d01aee4f75c7b55251d69edf',1,'shaka::hls::HlsNotifier::Flush()'],['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a153fe931c8e6fe3e585ebd925d75d229',1,'shaka::hls::SimpleHlsNotifier::Flush()'],['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#a26752164d7e8ae6a9a894512291ad9cd',1,'shaka::media::MediaParser::Flush()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#afdb1a88116e3347e67afeb7715847135',1,'shaka::media::mp2t::Mp2tMediaParser::Flush()'],['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#a71ea0819224b94ba9df5c951424bc6b1',1,'shaka::media::mp2t::PesPacketGenerator::Flush()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#a6f26e0d76aeda601fa87190901de27ea',1,'shaka::media::mp4::MP4MediaParser::Flush()'],['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#ac3d4be1a12667ed722915be727747eee',1,'shaka::media::WebMClusterParser::Flush()'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a6c2d4b5b36304831e637f7ae1b9e54a2',1,'shaka::media::WebMMediaParser::Flush()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#aa666cb1b9ee2ff940d9fc7efda4b50d7',1,'shaka::media::WebVttMediaParser::Flush()'],['../de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html#aa02d5ce7d9609b3841835fbab74b8c81',1,'shaka::media::WebVttSampleConverter::Flush()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#ac5680e3bd6cdb07fd65af3f39fce999a',1,'shaka::media::wvm::WvmMediaParser::Flush()'],['../d4/d70/classshaka_1_1DashIopMpdNotifier.html#ab3411eb75eedce9a26f0767210280e71',1,'shaka::DashIopMpdNotifier::Flush()'],['../d3/dd0/classshaka_1_1MpdNotifier.html#af8149126f4793506bef385d067561dbf',1,'shaka::MpdNotifier::Flush()'],['../d8/de1/classshaka_1_1SimpleMpdNotifier.html#a8ea622a21a5807775bb2d998fa04658f',1,'shaka::SimpleMpdNotifier::Flush()']]], + ['flush',['Flush',['../dd/d40/classshaka_1_1CallbackFile.html#aef34f60f2e94f862e495c254edc58bd9',1,'shaka::CallbackFile::Flush()'],['../d3/d73/classshaka_1_1File.html#a5fa625751e03b9e7652ba1bfa98b8ca4',1,'shaka::File::Flush()'],['../d7/dbd/classshaka_1_1LocalFile.html#a04b4523a7352572b2c6d72f1d6f3a077',1,'shaka::LocalFile::Flush()'],['../de/dad/classshaka_1_1MemoryFile.html#aecf76d1658ea5f088ef1e42f04b9b64d',1,'shaka::MemoryFile::Flush()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#a2b53b72d99aad4439781e3887492452c',1,'shaka::ThreadedIoFile::Flush()'],['../d4/dcb/classshaka_1_1UdpFile.html#a4b5430ec1d24434f5f6d9b20692efbc2',1,'shaka::UdpFile::Flush()'],['../d9/deb/classshaka_1_1hls_1_1HlsNotifier.html#a5d788d47d01aee4f75c7b55251d69edf',1,'shaka::hls::HlsNotifier::Flush()'],['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a153fe931c8e6fe3e585ebd925d75d229',1,'shaka::hls::SimpleHlsNotifier::Flush()'],['../dc/d76/classshaka_1_1media_1_1BitWriter.html#a1c14f04a0bb3090edb3ac0fffa346bc1',1,'shaka::media::BitWriter::Flush()'],['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#a26752164d7e8ae6a9a894512291ad9cd',1,'shaka::media::MediaParser::Flush()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#afdb1a88116e3347e67afeb7715847135',1,'shaka::media::mp2t::Mp2tMediaParser::Flush()'],['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#a71ea0819224b94ba9df5c951424bc6b1',1,'shaka::media::mp2t::PesPacketGenerator::Flush()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#a6f26e0d76aeda601fa87190901de27ea',1,'shaka::media::mp4::MP4MediaParser::Flush()'],['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#ac3d4be1a12667ed722915be727747eee',1,'shaka::media::WebMClusterParser::Flush()'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a6c2d4b5b36304831e637f7ae1b9e54a2',1,'shaka::media::WebMMediaParser::Flush()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#aa666cb1b9ee2ff940d9fc7efda4b50d7',1,'shaka::media::WebVttMediaParser::Flush()'],['../de/ddd/classshaka_1_1media_1_1WebVttSampleConverter.html#aa02d5ce7d9609b3841835fbab74b8c81',1,'shaka::media::WebVttSampleConverter::Flush()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#ac5680e3bd6cdb07fd65af3f39fce999a',1,'shaka::media::wvm::WvmMediaParser::Flush()'],['../d4/d70/classshaka_1_1DashIopMpdNotifier.html#ab3411eb75eedce9a26f0767210280e71',1,'shaka::DashIopMpdNotifier::Flush()'],['../d3/dd0/classshaka_1_1MpdNotifier.html#af8149126f4793506bef385d067561dbf',1,'shaka::MpdNotifier::Flush()'],['../d8/de1/classshaka_1_1SimpleMpdNotifier.html#a8ea622a21a5807775bb2d998fa04658f',1,'shaka::SimpleMpdNotifier::Flush()']]], ['flushalldownstreams',['FlushAllDownstreams',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#ab644ca7b0a0dbcbc42936f2dfb979ca5',1,'shaka::media::MediaHandler']]], ['flushdownstream',['FlushDownstream',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#ad5001bf12073101a949b062943769f5b',1,'shaka::media::MediaHandler']]], ['forcesetsegmentalignment',['ForceSetSegmentAlignment',['../d8/d8e/classshaka_1_1AdaptationSet.html#a40532ecbed5f71de85bde0cb7eb1ef9d',1,'shaka::AdaptationSet']]], diff --git a/docs/search/functions_6.js b/docs/search/functions_6.js index 988f239514..f9dd6a05c7 100644 --- a/docs/search/functions_6.js +++ b/docs/search/functions_6.js @@ -4,11 +4,9 @@ var searchData= ['generatesegmentreference',['GenerateSegmentReference',['../db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html#af1f1d56215c1e9543bfb516136862fa6',1,'shaka::media::mp4::Fragmenter']]], ['generatesignature',['GenerateSignature',['../df/d3c/classshaka_1_1media_1_1RequestSigner.html#a1c77d503f9ffc3462c1bf45b4f35bf32',1,'shaka::media::RequestSigner::GenerateSignature()'],['../d9/d8c/classshaka_1_1media_1_1AesRequestSigner.html#a3010ad8c4c1588358a8d31a97afd6428',1,'shaka::media::AesRequestSigner::GenerateSignature()'],['../d7/ddd/classshaka_1_1media_1_1RsaRequestSigner.html#ac83306b0555581b8ac9591b6e3d3bdbc',1,'shaka::media::RsaRequestSigner::GenerateSignature()'],['../d0/dce/classshaka_1_1media_1_1RsaPrivateKey.html#ad05d8951dfe3a8af754490022e95e5f2',1,'shaka::media::RsaPrivateKey::GenerateSignature()']]], ['get',['Get',['../d7/de0/classshaka_1_1media_1_1HttpKeyFetcher.html#a6b5b2c193d6055ca49d2d6af2b2ac4cc',1,'shaka::media::HttpKeyFetcher']]], - ['getadtsframesize',['GetAdtsFrameSize',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a149fb9c7fa2718d719008af2dce8157f',1,'shaka::media::mp2t::AdtsHeader']]], - ['getadtsheadersize',['GetAdtsHeaderSize',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a107e1269d5f826583c1940fb50c8cf92',1,'shaka::media::mp2t::AdtsHeader']]], ['getaudiodefaultduration',['GetAudioDefaultDuration',['../d8/d86/classshaka_1_1media_1_1WebMTracksParser.html#a554135ee3a8ad995beeab868c67aba36',1,'shaka::media::WebMTracksParser']]], ['getaudioobjecttype',['GetAudioObjectType',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a6db422543c33402a51da27d2350b009b',1,'shaka::media::AACAudioSpecificConfig']]], - ['getaudiospecificconfig',['GetAudioSpecificConfig',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a5ca14cc4eb4a28906fe832ab263ba5a2',1,'shaka::media::mp2t::AdtsHeader']]], + ['getaudiospecificconfig',['GetAudioSpecificConfig',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a9a3da0ed02d1790ec176a75bbbdef146',1,'shaka::media::mp2t::Ac3Header::GetAudioSpecificConfig()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a97a2aae441248e718e056ac3559ecfd9',1,'shaka::media::mp2t::AdtsHeader::GetAudioSpecificConfig()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a80da92426102c52da09690a7587d4272',1,'shaka::media::mp2t::AudioHeader::GetAudioSpecificConfig()']]], ['getaudiostreaminfo',['GetAudioStreamInfo',['../d3/d7c/classshaka_1_1media_1_1WebMAudioClient.html#a0fcbddd20199044f860331b3bd9ef3b8',1,'shaka::media::WebMAudioClient']]], ['getcodecstring',['GetCodecString',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html#aee79e7aa61b741bb96f451c6de1c9d42',1,'shaka::media::AudioStreamInfo::GetCodecString()'],['../d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html#a66b23ef2de8b851482628fefafafce17',1,'shaka::media::AVCDecoderConfigurationRecord::GetCodecString(FourCC codec_fourcc) const '],['../d6/d57/classshaka_1_1media_1_1AVCDecoderConfigurationRecord.html#a30a6df8df89c670fd4c8894b8bacffa9',1,'shaka::media::AVCDecoderConfigurationRecord::GetCodecString(FourCC codec_fourcc, uint8_t profile_indication, uint8_t profile_compatibility, uint8_t avc_level)'],['../d4/d8a/classshaka_1_1media_1_1HEVCDecoderConfigurationRecord.html#aa612802ce249bdff2cd4a8b50a05268c',1,'shaka::media::HEVCDecoderConfigurationRecord::GetCodecString()'],['../d1/da5/classshaka_1_1media_1_1VPCodecConfigurationRecord.html#a86b48fb506b476538a7440d9ccf9a533',1,'shaka::media::VPCodecConfigurationRecord::GetCodecString()']]], ['getcontenttype',['GetContentType',['../d8/daf/namespaceshaka.html#a5ea880937da26d677ff6a48c0219d090',1,'shaka']]], @@ -19,7 +17,8 @@ var searchData= ['getduration',['GetDuration',['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#a7283c64cb63a94264ff8fe405b8ce5c2',1,'shaka::media::mp4::Segmenter']]], ['getdurationinseconds',['GetDurationInSeconds',['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a6a2b5d9e2218abcace63e7aeee3da34f',1,'shaka::media::webm::Segmenter']]], ['getfilesize',['GetFileSize',['../d3/d73/classshaka_1_1File.html#ac978d5c0585850d4d9948fdf39b33292',1,'shaka::File']]], - ['getheadersize',['GetHeaderSize',['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html#a3346c5afaf83a18cfcf688c36049d586',1,'shaka::media::VideoSliceHeaderParser::GetHeaderSize()'],['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html#a5957ea62985810662158c02a163aac60',1,'shaka::media::H264VideoSliceHeaderParser::GetHeaderSize()'],['../d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html#a54459b6748f64be2bd328c5af79798f3',1,'shaka::media::H265VideoSliceHeaderParser::GetHeaderSize()']]], + ['getframesize',['GetFrameSize',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a8065975e78028683180cd3ae65925c37',1,'shaka::media::mp2t::Ac3Header::GetFrameSize()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ae12d18e7fcbff02121886ca4b459340d',1,'shaka::media::mp2t::AdtsHeader::GetFrameSize()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#af8acf05003d2c0dbd062a9f12a2140b3',1,'shaka::media::mp2t::AudioHeader::GetFrameSize()']]], + ['getheadersize',['GetHeaderSize',['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html#a3346c5afaf83a18cfcf688c36049d586',1,'shaka::media::VideoSliceHeaderParser::GetHeaderSize()'],['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html#a5957ea62985810662158c02a163aac60',1,'shaka::media::H264VideoSliceHeaderParser::GetHeaderSize()'],['../d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html#a54459b6748f64be2bd328c5af79798f3',1,'shaka::media::H265VideoSliceHeaderParser::GetHeaderSize()'],['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a58d93e453c2fed3d500badb40a349eed',1,'shaka::media::mp2t::Ac3Header::GetHeaderSize()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#aadfb99a9a34a9684040e9b9aa000a402',1,'shaka::media::mp2t::AdtsHeader::GetHeaderSize()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a60fce7a6810efa2fc0f40a8038805116',1,'shaka::media::mp2t::AudioHeader::GetHeaderSize()']]], ['getindexrange',['GetIndexRange',['../d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html#acd917150490f8e5721fad28904422eca',1,'shaka::media::mp4::MultiSegmentSegmenter::GetIndexRange()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#a7ab68d898343b322dc32c08ad42e859c',1,'shaka::media::mp4::Segmenter::GetIndexRange()'],['../d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html#a5877fd31ed73a048529385b36437364a',1,'shaka::media::mp4::SingleSegmentSegmenter::GetIndexRange()']]], ['getindexrangestartandend',['GetIndexRangeStartAndEnd',['../d2/dd5/classshaka_1_1media_1_1webm_1_1MultiSegmentSegmenter.html#a75b572a055a0de68bf2809f61b319526',1,'shaka::media::webm::MultiSegmentSegmenter::GetIndexRangeStartAndEnd()'],['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a3a6c1932e6c4894a61eb7230022bceb5',1,'shaka::media::webm::Segmenter::GetIndexRangeStartAndEnd()'],['../d3/da1/classshaka_1_1media_1_1webm_1_1SingleSegmentSegmenter.html#a1708739c73c4565d5dfda6bedffd89a8',1,'shaka::media::webm::SingleSegmentSegmenter::GetIndexRangeStartAndEnd()']]], ['getinitrange',['GetInitRange',['../d8/db7/classshaka_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html#a15f78aada048b15472d485b80875e838',1,'shaka::media::mp4::MultiSegmentSegmenter::GetInitRange()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#a3a1c6721aa53a124af8be50bb3f7599c',1,'shaka::media::mp4::Segmenter::GetInitRange()'],['../d0/dab/classshaka_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html#a61e71cfc720342ecb16b830e6fca0fe4',1,'shaka::media::mp4::SingleSegmentSegmenter::GetInitRange()']]], @@ -29,15 +28,17 @@ var searchData= ['getlibraryversion',['GetLibraryVersion',['../db/dd0/classshaka_1_1Packager.html#a7bae5b5c202a716f5d890e70afae51b2',1,'shaka::Packager']]], ['getlongestsegmentduration',['GetLongestSegmentDuration',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#ad69a0d67cfe55584efeaaf18f82b0bdc',1,'shaka::hls::MediaPlaylist']]], ['getmaxclearoffset',['GetMaxClearOffset',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#ae7a223474c46dd542e7390030893cca4',1,'shaka::media::mp4::TrackRunIterator']]], + ['getminframesize',['GetMinFrameSize',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a3c589cda189b06d9ca3b90a56db24829',1,'shaka::media::mp2t::Ac3Header::GetMinFrameSize()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ad35ff50f5159e663103613901eccb7a9',1,'shaka::media::mp2t::AdtsHeader::GetMinFrameSize()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a95018a4488867e584338126922bf128a',1,'shaka::media::mp2t::AudioHeader::GetMinFrameSize()']]], ['getnext',['GetNext',['../d8/dd6/classshaka_1_1media_1_1mp2t_1_1ContinuityCounter.html#a63950483c11df9c44e3cb8d559f629d9',1,'shaka::media::mp2t::ContinuityCounter']]], ['getnextpespacket',['GetNextPesPacket',['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#acf11010f62ab9d2b46308f2cce8b3650',1,'shaka::media::mp2t::PesPacketGenerator']]], - ['getnumchannels',['GetNumChannels',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#abbe5493d7ea61fc5306de10378e8539a',1,'shaka::media::AACAudioSpecificConfig::GetNumChannels()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#aaa01e3eb1ce9d4400aedd202b04f7160',1,'shaka::media::mp2t::AdtsHeader::GetNumChannels()']]], - ['getobjecttype',['GetObjectType',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a156a3288ab974557e95dfaba72e6b479',1,'shaka::media::mp2t::AdtsHeader']]], + ['getnumchannels',['GetNumChannels',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#a971834b98828cab3093e094e97c73b16',1,'shaka::hls::MediaPlaylist::GetNumChannels()'],['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#abbe5493d7ea61fc5306de10378e8539a',1,'shaka::media::AACAudioSpecificConfig::GetNumChannels()'],['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#abab9685652b78baf25b7399477401bd7',1,'shaka::media::mp2t::Ac3Header::GetNumChannels()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a6093f6f4a01414cef59347be4c2df5c6',1,'shaka::media::mp2t::AdtsHeader::GetNumChannels()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a47b7cff7bfced3a5e5d02a848627a0c8',1,'shaka::media::mp2t::AudioHeader::GetNumChannels()']]], + ['getobjecttype',['GetObjectType',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a56de14f98afd205f03bda6b110835aae',1,'shaka::media::mp2t::Ac3Header::GetObjectType()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ad8d15d73650add3af331f847719efab6',1,'shaka::media::mp2t::AdtsHeader::GetObjectType()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a9959124b369045fce424f845c50b9c02',1,'shaka::media::mp2t::AudioHeader::GetObjectType()']]], ['getoutputstreamdatavector',['GetOutputStreamDataVector',['../d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html#a1e8a80eb0e887af717527a0880d61417',1,'shaka::media::MediaHandlerGraphTestBase']]], ['getpps',['GetPps',['../de/dc2/classshaka_1_1media_1_1H265Parser.html#af4a103a131c849bf54018b747dbdd80c',1,'shaka::media::H265Parser']]], ['getrawptr',['GetRawPtr',['../d1/d31/classshaka_1_1xml_1_1XmlNode.html#aac9765712087dcc47a0afef4bf7849ff',1,'shaka::xml::XmlNode']]], + ['getsamplesperframe',['GetSamplesPerFrame',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#ac5d9c726fd88989e36e490d2aeb1011f',1,'shaka::media::mp2t::Ac3Header::GetSamplesPerFrame()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a606154feab4b731e1d51a56d21cb23e8',1,'shaka::media::mp2t::AdtsHeader::GetSamplesPerFrame()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#abe0df0b59f89036c9c39a2070875a6a7',1,'shaka::media::mp2t::AudioHeader::GetSamplesPerFrame()']]], ['getsamplespersecond',['GetSamplesPerSecond',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a6bc219a717c8e2362fc1b24be3cf98a3',1,'shaka::media::AACAudioSpecificConfig']]], - ['getsamplingfrequency',['GetSamplingFrequency',['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#afda9a7656576556af8ddec599d5d8d3b',1,'shaka::media::mp2t::AdtsHeader']]], + ['getsamplingfrequency',['GetSamplingFrequency',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#aa238ec0832e097f2f5791e915bf30127',1,'shaka::media::mp2t::Ac3Header::GetSamplingFrequency()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#af4b6c9af726bf95d296e478d350055f0',1,'shaka::media::mp2t::AdtsHeader::GetSamplingFrequency()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#aeb3121ddde96b3e6ca456586c8efdd8c',1,'shaka::media::mp2t::AudioHeader::GetSamplingFrequency()']]], ['getsps',['GetSps',['../de/dc2/classshaka_1_1media_1_1H265Parser.html#ab917855df00b9003c6be4612e2fe0211',1,'shaka::media::H265Parser']]], ['gettotalsizeofsubsamples',['GetTotalSizeOfSubsamples',['../de/d49/classshaka_1_1media_1_1DecryptConfig.html#a338024925bc46a2f65a058906cdcb4a3',1,'shaka::media::DecryptConfig::GetTotalSizeOfSubsamples()'],['../d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html#a870ef304f376ec0822686e1d78765bf2',1,'shaka::media::mp4::SampleEncryptionEntry::GetTotalSizeOfSubsamples()']]], ['getvideostreaminfo',['GetVideoStreamInfo',['../d3/d67/classshaka_1_1media_1_1WebMVideoClient.html#a305b6679d9cd2457a3a3ba72319a3249',1,'shaka::media::WebMVideoClient']]], diff --git a/docs/search/functions_8.js b/docs/search/functions_8.js index f7700c2381..75cb6f6605 100644 --- a/docs/search/functions_8.js +++ b/docs/search/functions_8.js @@ -3,7 +3,7 @@ var searchData= ['id',['id',['../de/d52/classshaka_1_1Representation.html#a6a3ba385179698e57a1451d1a26ad827',1,'shaka::Representation']]], ['ignorebytes',['IgnoreBytes',['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html#a1a0c70e3124677ae08164f7b89f6a1d4',1,'shaka::media::mp4::BoxBuffer']]], ['init',['Init',['../d9/deb/classshaka_1_1hls_1_1HlsNotifier.html#a8bd9273a1893899036e640c1e35fbaff',1,'shaka::hls::HlsNotifier::Init()'],['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a40850c462766a0ce4e9c92014ed77a91',1,'shaka::hls::SimpleHlsNotifier::Init()'],['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#adc7c91bebe75879abba91a56dae52153',1,'shaka::media::MediaParser::Init()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#aa2aff12312827aacf2b7db6e2f792c52',1,'shaka::media::mp2t::Mp2tMediaParser::Init()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#acc87b9752a7f6e8c739109acbc02b69d',1,'shaka::media::mp4::MP4MediaParser::Init()'],['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#ae9f02c32b4e2be8fc41a20f3f00f3494',1,'shaka::media::mp4::TrackRunIterator::Init()'],['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#a4d39eaf8568da29b597411c56f50d86f',1,'shaka::media::mp4::TrackRunIterator::Init(const MovieFragment &moof)'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a5cd5c298938e2c58c45f962b21e43b2e',1,'shaka::media::WebMMediaParser::Init()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#af6c0fb7de806cccd0e1f9dd92b5310f3',1,'shaka::media::WebVttMediaParser::Init()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#a6f931f1702724a9b19c3078a7832bc77',1,'shaka::media::wvm::WvmMediaParser::Init()'],['../d4/d70/classshaka_1_1DashIopMpdNotifier.html#a9dd9d655a538ff2618634ca1f9809478',1,'shaka::DashIopMpdNotifier::Init()'],['../de/d52/classshaka_1_1Representation.html#ae998409ae94f3ba12909a96e8f3f4f7e',1,'shaka::Representation::Init()'],['../d3/dd0/classshaka_1_1MpdNotifier.html#ad6171481d6fb437767b1f5b9e0dac1a3',1,'shaka::MpdNotifier::Init()'],['../d8/de1/classshaka_1_1SimpleMpdNotifier.html#a59bcb401b5ca8d5b893ec7da9461569f',1,'shaka::SimpleMpdNotifier::Init()']]], - ['initialize',['Initialize',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#aed0da512bbd998ec9d0a5c019ad17acb',1,'shaka::media::MediaHandler::Initialize()'],['../d5/d66/classshaka_1_1media_1_1NalUnitToByteStreamConverter.html#a27986db8a2e62669fe1983a39383c546',1,'shaka::media::NalUnitToByteStreamConverter::Initialize()'],['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html#a862422cdf78f370069055037338fa53d',1,'shaka::media::VideoSliceHeaderParser::Initialize()'],['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html#a551bd1e2a852d1a3b23b77df8505b7f7',1,'shaka::media::H264VideoSliceHeaderParser::Initialize()'],['../d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html#a83a25520f713f4818a765ea3324a1438',1,'shaka::media::H265VideoSliceHeaderParser::Initialize()'],['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#aa0346189f99b2f0fc2c71da1543155fa',1,'shaka::media::mp2t::PesPacketGenerator::Initialize()'],['../de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html#aac6e3950224709b78b9f1e054a8ca194',1,'shaka::media::mp2t::TsSegmenter::Initialize()'],['../de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html#a6bee605be771538f78633e2ecfc979c6',1,'shaka::media::mp2t::TsWriter::Initialize()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#acc2d4e58b3fa4b41a0637f52288d81d9',1,'shaka::media::mp4::Segmenter::Initialize()'],['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a32c8a682b36241529d0c302a023140d2',1,'shaka::media::webm::Segmenter::Initialize()'],['../db/dd0/classshaka_1_1Packager.html#ae40969a98da3a27a0b1633927afb3ce2',1,'shaka::Packager::Initialize()']]], + ['initialize',['Initialize',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#aed0da512bbd998ec9d0a5c019ad17acb',1,'shaka::media::MediaHandler::Initialize()'],['../d5/d66/classshaka_1_1media_1_1NalUnitToByteStreamConverter.html#a27986db8a2e62669fe1983a39383c546',1,'shaka::media::NalUnitToByteStreamConverter::Initialize()'],['../dd/de4/classshaka_1_1media_1_1VideoSliceHeaderParser.html#a862422cdf78f370069055037338fa53d',1,'shaka::media::VideoSliceHeaderParser::Initialize()'],['../da/df0/classshaka_1_1media_1_1H264VideoSliceHeaderParser.html#a551bd1e2a852d1a3b23b77df8505b7f7',1,'shaka::media::H264VideoSliceHeaderParser::Initialize()'],['../d1/d79/classshaka_1_1media_1_1H265VideoSliceHeaderParser.html#a83a25520f713f4818a765ea3324a1438',1,'shaka::media::H265VideoSliceHeaderParser::Initialize()'],['../d5/de0/classshaka_1_1media_1_1mp2t_1_1PesPacketGenerator.html#aa0346189f99b2f0fc2c71da1543155fa',1,'shaka::media::mp2t::PesPacketGenerator::Initialize()'],['../de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html#aac6e3950224709b78b9f1e054a8ca194',1,'shaka::media::mp2t::TsSegmenter::Initialize()'],['../d9/d26/classshaka_1_1media_1_1mp4_1_1Segmenter.html#acc2d4e58b3fa4b41a0637f52288d81d9',1,'shaka::media::mp4::Segmenter::Initialize()'],['../dd/dc5/classshaka_1_1media_1_1webm_1_1Segmenter.html#a32c8a682b36241529d0c302a023140d2',1,'shaka::media::webm::Segmenter::Initialize()'],['../db/dd0/classshaka_1_1Packager.html#ae40969a98da3a27a0b1633927afb3ce2',1,'shaka::Packager::Initialize()']]], ['initializefragment',['InitializeFragment',['../db/d95/classshaka_1_1media_1_1mp4_1_1Fragmenter.html#aa702c2af5ea5096d94f2943076a21e4a',1,'shaka::media::mp4::Fragmenter']]], ['initializeinternal',['InitializeInternal',['../da/dfd/classshaka_1_1media_1_1MediaHandler.html#a0e05325d62bfb66318301c1ed790a46e',1,'shaka::media::MediaHandler::InitializeInternal()'],['../d1/d36/classshaka_1_1media_1_1FakeMediaHandler.html#af43db7170cd6b53aa937e0b68e210e25',1,'shaka::media::FakeMediaHandler::InitializeInternal()'],['../df/d46/classshaka_1_1media_1_1Muxer.html#a36882e12df5c5bfd48a7b94d1dfad857',1,'shaka::media::Muxer::InitializeInternal()'],['../d4/d43/classshaka_1_1media_1_1ChunkingHandler.html#a76a5f4b74da3876cc72f44301c389ebd',1,'shaka::media::ChunkingHandler::InitializeInternal()'],['../d6/d4c/classshaka_1_1media_1_1EncryptionHandler.html#a3f1808a4386081e5e1c9a798a1a69dd0',1,'shaka::media::EncryptionHandler::InitializeInternal()'],['../dd/d17/classshaka_1_1media_1_1Demuxer.html#a7488d8ea312be5822c67f5b69a8dbd9f',1,'shaka::media::Demuxer::InitializeInternal()']]], ['initializewithiv',['InitializeWithIv',['../df/d87/classshaka_1_1media_1_1AesCryptor.html#a41954df34b76b04d561892732dd0ec2f',1,'shaka::media::AesCryptor::InitializeWithIv()'],['../df/d2d/classshaka_1_1media_1_1AesCbcDecryptor.html#a71ff0b9654de96f9990b29c35fa9b7bf',1,'shaka::media::AesCbcDecryptor::InitializeWithIv()'],['../d3/d75/classshaka_1_1media_1_1AesEncryptor.html#a0695df5615cadf6977fdbac978daeffa',1,'shaka::media::AesEncryptor::InitializeWithIv()'],['../d3/dfe/classshaka_1_1media_1_1AesPatternCryptor.html#af878688f0f277f3f6757e85654439c34',1,'shaka::media::AesPatternCryptor::InitializeWithIv()']]], @@ -18,6 +18,7 @@ var searchData= ['isrunvalid',['IsRunValid',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#afa91b1bb4a5a587734d1892f560d3f16',1,'shaka::media::mp4::TrackRunIterator']]], ['issamplevalid',['IsSampleValid',['../de/df6/classshaka_1_1media_1_1mp4_1_1TrackRunIterator.html#a213a839157f1cdf5ed0585bea274a9ea',1,'shaka::media::mp4::TrackRunIterator']]], ['issyncsample',['IsSyncSample',['../d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html#a63e36297541bfc5f1568f74abf5512b1',1,'shaka::media::mp4::SyncSampleIterator::IsSyncSample() const '],['../d7/d26/classshaka_1_1media_1_1mp4_1_1SyncSampleIterator.html#a0b6070fb8ab19e106595ecca86917715',1,'shaka::media::mp4::SyncSampleIterator::IsSyncSample(uint32_t sample) const ']]], + ['issyncword',['IsSyncWord',['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a44c8ac7a2dd57a1b099722632e7e39f0',1,'shaka::media::mp2t::Ac3Header::IsSyncWord()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ab7385cf2dfd15688dbd87f97706e3690',1,'shaka::media::mp2t::AdtsHeader::IsSyncWord()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a1e5c41162d4a4ff75dc9760a4d12e496',1,'shaka::media::mp2t::AudioHeader::IsSyncWord()']]], ['isvalid',['IsValid',['../d9/d57/classshaka_1_1media_1_1mp4_1_1ChunkInfoIterator.html#a231ba71e0511c3efa3142acb43d7e8aa',1,'shaka::media::mp4::ChunkInfoIterator::IsValid()'],['../db/d4e/classshaka_1_1media_1_1mp4_1_1CompositionOffsetIterator.html#ae3bf00a0597ca56dbef692f6eaebf2aa',1,'shaka::media::mp4::CompositionOffsetIterator::IsValid()'],['../d1/d20/classshaka_1_1media_1_1mp4_1_1DecodingTimeIterator.html#ae7becbbfd8328a0cd243cf9a8fc862df',1,'shaka::media::mp4::DecodingTimeIterator::IsValid()']]], ['isvalidconfig',['IsValidConfig',['../da/d4e/classshaka_1_1media_1_1AudioStreamInfo.html#a3c50d026e8deadac46741143d4b5ddb9',1,'shaka::media::AudioStreamInfo::IsValidConfig()'],['../d5/db1/classshaka_1_1media_1_1StreamInfo.html#a6e5c5ade77b7bcf0b7822de568695dc8',1,'shaka::media::StreamInfo::IsValidConfig()'],['../db/dab/classshaka_1_1media_1_1TextStreamInfo.html#ab40aed17c046e639efde04a2075e25a8',1,'shaka::media::TextStreamInfo::IsValidConfig()'],['../d6/db1/classshaka_1_1media_1_1VideoStreamInfo.html#a8978ca2bc2dd63c2e25e77cdcf676162',1,'shaka::media::VideoStreamInfo::IsValidConfig()']]], ['iv',['iv',['../df/d87/classshaka_1_1media_1_1AesCryptor.html#a96dde16f12a82a563c77f6d5522571f3',1,'shaka::media::AesCryptor']]] diff --git a/docs/search/functions_d.js b/docs/search/functions_d.js index 518e8cba83..239d388f44 100644 --- a/docs/search/functions_d.js +++ b/docs/search/functions_d.js @@ -1,6 +1,6 @@ var searchData= [ - ['parse',['Parse',['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#a0c85f3cb0591f67c036276be82a1ba9d',1,'shaka::media::MediaParser::Parse()'],['../d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html#a13b0f93b68efff614c5356df081f2560',1,'shaka::media::ProtectionSystemSpecificInfo::Parse()'],['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a6b3deca725a42113bf7303387ab74f0f',1,'shaka::media::AACAudioSpecificConfig::Parse()'],['../de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html#ab05a1971c60e510b7bc0b5b578dfb04b',1,'shaka::media::DecoderConfigurationRecord::Parse(const std::vector< uint8_t > &data)'],['../de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html#a07b7d0dbae45971d4fd4a24652980f65',1,'shaka::media::DecoderConfigurationRecord::Parse(const uint8_t *data, size_t data_size)'],['../d8/d14/classshaka_1_1media_1_1VP8Parser.html#a8baec0e4c74b0b220b777426d0c463e1',1,'shaka::media::VP8Parser::Parse()'],['../db/d5a/classshaka_1_1media_1_1VP9Parser.html#ae915c36aa472d70b55e3d65b24612e57',1,'shaka::media::VP9Parser::Parse()'],['../db/dcb/classshaka_1_1media_1_1VPxParser.html#abb83c8c74d304e83efb8fa60bd7bb722',1,'shaka::media::VPxParser::Parse()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#a2e154d7423498baf8cd8888c70dcfca9',1,'shaka::media::mp2t::AdtsHeader::Parse()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#af1a8a33b4ce61777c876717b005d0026',1,'shaka::media::mp2t::Mp2tMediaParser::Parse()'],['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#a209382fcd42e82a896c29e856627ca52',1,'shaka::media::mp4::Box::Parse()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#a4105cdbe5ece03071a17c06fb27699b0',1,'shaka::media::mp4::MP4MediaParser::Parse()'],['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#aba1bae97c2d96181027e43b0a1993e67',1,'shaka::media::WebMClusterParser::Parse()'],['../db/dae/classshaka_1_1media_1_1WebMInfoParser.html#ae0b4d37e02d43627b1bc9c64f43ee3f7',1,'shaka::media::WebMInfoParser::Parse()'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a40940ec01d965e3a78213861a93f7cfc',1,'shaka::media::WebMMediaParser::Parse()'],['../dc/dca/classshaka_1_1media_1_1WebMListParser.html#acd805b7eb25afcd9a3be2d8d88e3c6af',1,'shaka::media::WebMListParser::Parse()'],['../d8/d86/classshaka_1_1media_1_1WebMTracksParser.html#aa4b6d4ac9fa57b47cbc17ee7c1bd3639',1,'shaka::media::WebMTracksParser::Parse()'],['../d4/d59/classshaka_1_1media_1_1WebMWebVTTParser.html#a4e6f754e4fba24f7ea77fd0db959908b',1,'shaka::media::WebMWebVTTParser::Parse()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#a5295c061b251726d1525cefc091101a2',1,'shaka::media::WebVttMediaParser::Parse()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#a246702aa75891cbe396ca7cc11e13eeb',1,'shaka::media::wvm::WvmMediaParser::Parse()']]], + ['parse',['Parse',['../d3/d0a/classshaka_1_1media_1_1MediaParser.html#a0c85f3cb0591f67c036276be82a1ba9d',1,'shaka::media::MediaParser::Parse()'],['../d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html#a13b0f93b68efff614c5356df081f2560',1,'shaka::media::ProtectionSystemSpecificInfo::Parse()'],['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a6b3deca725a42113bf7303387ab74f0f',1,'shaka::media::AACAudioSpecificConfig::Parse()'],['../de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html#ab05a1971c60e510b7bc0b5b578dfb04b',1,'shaka::media::DecoderConfigurationRecord::Parse(const std::vector< uint8_t > &data)'],['../de/de0/classshaka_1_1media_1_1DecoderConfigurationRecord.html#a07b7d0dbae45971d4fd4a24652980f65',1,'shaka::media::DecoderConfigurationRecord::Parse(const uint8_t *data, size_t data_size)'],['../d8/d14/classshaka_1_1media_1_1VP8Parser.html#a8baec0e4c74b0b220b777426d0c463e1',1,'shaka::media::VP8Parser::Parse()'],['../db/d5a/classshaka_1_1media_1_1VP9Parser.html#ae915c36aa472d70b55e3d65b24612e57',1,'shaka::media::VP9Parser::Parse()'],['../db/dcb/classshaka_1_1media_1_1VPxParser.html#abb83c8c74d304e83efb8fa60bd7bb722',1,'shaka::media::VPxParser::Parse()'],['../dc/d21/classshaka_1_1media_1_1mp2t_1_1Ac3Header.html#a04733336c57460238d0279decaa3939c',1,'shaka::media::mp2t::Ac3Header::Parse()'],['../d3/d0c/classshaka_1_1media_1_1mp2t_1_1AdtsHeader.html#ac1cdf6cf0f3d4a7438ae4c4cc8fb0762',1,'shaka::media::mp2t::AdtsHeader::Parse()'],['../d1/dba/classshaka_1_1media_1_1mp2t_1_1AudioHeader.html#a334c1ceea413b309a5950cc06619853f',1,'shaka::media::mp2t::AudioHeader::Parse()'],['../d3/dc1/classshaka_1_1media_1_1mp2t_1_1Mp2tMediaParser.html#af1a8a33b4ce61777c876717b005d0026',1,'shaka::media::mp2t::Mp2tMediaParser::Parse()'],['../d1/d2d/structshaka_1_1media_1_1mp4_1_1Box.html#a209382fcd42e82a896c29e856627ca52',1,'shaka::media::mp4::Box::Parse()'],['../d7/dd5/classshaka_1_1media_1_1mp4_1_1MP4MediaParser.html#a4105cdbe5ece03071a17c06fb27699b0',1,'shaka::media::mp4::MP4MediaParser::Parse()'],['../da/de4/classshaka_1_1media_1_1WebMClusterParser.html#aba1bae97c2d96181027e43b0a1993e67',1,'shaka::media::WebMClusterParser::Parse()'],['../db/dae/classshaka_1_1media_1_1WebMInfoParser.html#ae0b4d37e02d43627b1bc9c64f43ee3f7',1,'shaka::media::WebMInfoParser::Parse()'],['../d2/ddb/classshaka_1_1media_1_1WebMMediaParser.html#a40940ec01d965e3a78213861a93f7cfc',1,'shaka::media::WebMMediaParser::Parse()'],['../dc/dca/classshaka_1_1media_1_1WebMListParser.html#acd805b7eb25afcd9a3be2d8d88e3c6af',1,'shaka::media::WebMListParser::Parse()'],['../d8/d86/classshaka_1_1media_1_1WebMTracksParser.html#aa4b6d4ac9fa57b47cbc17ee7c1bd3639',1,'shaka::media::WebMTracksParser::Parse()'],['../d4/d59/classshaka_1_1media_1_1WebMWebVTTParser.html#a4e6f754e4fba24f7ea77fd0db959908b',1,'shaka::media::WebMWebVTTParser::Parse()'],['../dc/df2/classshaka_1_1media_1_1WebVttMediaParser.html#a5295c061b251726d1525cefc091101a2',1,'shaka::media::WebVttMediaParser::Parse()'],['../dc/d18/classshaka_1_1media_1_1wvm_1_1WvmMediaParser.html#a246702aa75891cbe396ca7cc11e13eeb',1,'shaka::media::wvm::WvmMediaParser::Parse()']]], ['parseboxes',['ParseBoxes',['../d0/dd4/classshaka_1_1media_1_1ProtectionSystemSpecificInfo.html#aa984e27d2655a451ea87ff0a4ddd8b79',1,'shaka::media::ProtectionSystemSpecificInfo']]], ['parsecallbackfilename',['ParseCallbackFileName',['../d3/d73/classshaka_1_1File.html#ae87642f9661588e47479721cd101bf7d',1,'shaka::File']]], ['parsefrombuffer',['ParseFromBuffer',['../d6/dcb/structshaka_1_1media_1_1mp4_1_1SampleEncryptionEntry.html#a247ca9987470a6c724f1e099a78d3460',1,'shaka::media::mp4::SampleEncryptionEntry']]], diff --git a/docs/search/functions_f.js b/docs/search/functions_f.js index 6f222da3ed..13d5d8609e 100644 --- a/docs/search/functions_f.js +++ b/docs/search/functions_f.js @@ -37,7 +37,6 @@ var searchData= ['setlanguageoverride',['SetLanguageOverride',['../dd/d17/classshaka_1_1media_1_1Demuxer.html#aa3fe0a64a2745fa6f462c3d179809c3b',1,'shaka::media::Demuxer']]], ['setmediainfo',['SetMediaInfo',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#acacd79e086a620c82101f1a0f3ba8df9',1,'shaka::hls::MediaPlaylist']]], ['setmuxerlistener',['SetMuxerListener',['../df/d46/classshaka_1_1media_1_1Muxer.html#a0e76dd0a5c07dd538221459365ae824a',1,'shaka::media::Muxer']]], - ['setprogrammaptablewriterfortesting',['SetProgramMapTableWriterForTesting',['../de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html#a6eeeadf8e60dc09378b5df7c62eb2bf0',1,'shaka::media::mp2t::TsWriter']]], ['setprogresslistener',['SetProgressListener',['../df/d46/classshaka_1_1media_1_1Muxer.html#a25a146d553c385aad70dbff6b3e87eec',1,'shaka::media::Muxer']]], ['setsampleduration',['SetSampleDuration',['../de/d52/classshaka_1_1Representation.html#a11b32833166b9c4bea78cca2c6069d98',1,'shaka::Representation']]], ['setstreamtypefortesting',['SetStreamTypeForTesting',['../dd/d1c/classshaka_1_1hls_1_1MediaPlaylist.html#a2ab66ed311668017fd62d04db0476e79',1,'shaka::hls::MediaPlaylist']]], @@ -46,7 +45,7 @@ var searchData= ['settswriterfileopenedfortesting',['SetTsWriterFileOpenedForTesting',['../de/dde/classshaka_1_1media_1_1mp2t_1_1TsSegmenter.html#a34ab9fbaee43115d68be87e4b9e90918',1,'shaka::media::mp2t::TsSegmenter']]], ['setupgraph',['SetUpGraph',['../d3/d9a/classshaka_1_1media_1_1MediaHandlerGraphTestBase.html#af0a4c542b34e3e3a340c4e9b0ac2c152',1,'shaka::media::MediaHandlerGraphTestBase']]], ['signalencrypted',['SignalEncrypted',['../de/d64/classshaka_1_1media_1_1mp2t_1_1TsWriter.html#afc47f61bce7cd4f8f6a6ea0ec2c96d4c',1,'shaka::media::mp2t::TsWriter']]], - ['simplehlsnotifier',['SimpleHlsNotifier',['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#a8550250a5d368ae2d9ded8999b878449',1,'shaka::hls::SimpleHlsNotifier']]], + ['simplehlsnotifier',['SimpleHlsNotifier',['../d7/d5c/classshaka_1_1hls_1_1SimpleHlsNotifier.html#ad0d43e4492e7ea0aa601ccf6602b6937',1,'shaka::hls::SimpleHlsNotifier']]], ['size',['Size',['../dd/d40/classshaka_1_1CallbackFile.html#ab6bcbc6773b29fee1664507558e8759f',1,'shaka::CallbackFile::Size()'],['../d3/d73/classshaka_1_1File.html#aeb98b64a05f141140e110170bef1bc55',1,'shaka::File::Size()'],['../d7/dbd/classshaka_1_1LocalFile.html#ad20649d0ee575b81830a5abf88e2bde1',1,'shaka::LocalFile::Size()'],['../de/dad/classshaka_1_1MemoryFile.html#a151634866be009cf0eb10e783432d5cb',1,'shaka::MemoryFile::Size()'],['../dd/d0c/classshaka_1_1ThreadedIoFile.html#af23f2da404e1602c240bb59d2601f1b9',1,'shaka::ThreadedIoFile::Size()'],['../d4/dcb/classshaka_1_1UdpFile.html#a0a1c8d7af211bba4da62eb44504d745d',1,'shaka::UdpFile::Size()'],['../d5/d33/classshaka_1_1media_1_1ProducerConsumerQueue.html#a4f2483c665f2693f583e7b467101d844',1,'shaka::media::ProducerConsumerQueue::Size()'],['../d1/da1/classshaka_1_1media_1_1mp4_1_1BoxBuffer.html#a90fe62338ba20817d27cf4e34949000e',1,'shaka::media::mp4::BoxBuffer::Size()']]], ['skipbits',['SkipBits',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a4ab20ef220c76072eaecb982aba0541d',1,'shaka::media::BitReader']]], ['skipbitsconditional',['SkipBitsConditional',['../d6/da9/classshaka_1_1media_1_1BitReader.html#a98bbbbc849a3fadc1a136662174d470e',1,'shaka::media::BitReader']]], diff --git a/docs/search/search.js b/docs/search/search.js index 5d4752818c..7d3fb035a0 100644 --- a/docs/search/search.js +++ b/docs/search/search.js @@ -11,7 +11,7 @@ var indexSectionsWithContent = 1: "abcdefhiklmnoprstuvwx", 2: "s", 3: "abcdefghilmnoprstuvwx~", - 4: "bcdeghiklmoprstuvw", + 4: "abcdeghiklmoprstuvw", 5: "in", 6: "hkp", 7: "k", diff --git a/docs/search/variables_0.js b/docs/search/variables_0.js index 483d77e51f..7131c1c4c1 100644 --- a/docs/search/variables_0.js +++ b/docs/search/variables_0.js @@ -1,7 +1,4 @@ var searchData= [ - ['bandwidth',['bandwidth',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#a930587b1f3a3e38cf1e7974f01d8ce1e',1,'shaka::media::MuxerOptions::bandwidth()'],['../d2/d7b/structshaka_1_1StreamDescriptor.html#a9bcce2ca86a33f41803f7a6417a2758c',1,'shaka::StreamDescriptor::bandwidth()']]], - ['base_5furl',['base_url',['../d0/da8/structshaka_1_1HlsParams.html#a546dcdf68c8a0a5e188f84b5c9fca9dd',1,'shaka::HlsParams']]], - ['base_5furls',['base_urls',['../df/ddc/structshaka_1_1MpdParams.html#a9fe508f9c56a6424fd857d43a4a69e7c',1,'shaka::MpdParams']]], - ['buffer_5fcallback_5fparams',['buffer_callback_params',['../d5/de3/structshaka_1_1PackagingParams.html#aaaf233248e46b6ff3285bbac87857f81',1,'shaka::PackagingParams']]] + ['ad_5fcue_5fgenerator_5fparams',['ad_cue_generator_params',['../d5/de3/structshaka_1_1PackagingParams.html#aa52d546c86b3b36234bcfc0cd50ef083',1,'shaka::PackagingParams']]] ]; diff --git a/docs/search/variables_1.js b/docs/search/variables_1.js index 83c97db825..483d77e51f 100644 --- a/docs/search/variables_1.js +++ b/docs/search/variables_1.js @@ -1,10 +1,7 @@ var searchData= [ - ['ca_5ffile',['ca_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a745d002043a10ae7c01983fe5fe93846',1,'shaka::PlayreadyEncryptionParams']]], - ['chunking_5fparams',['chunking_params',['../d5/de3/structshaka_1_1PackagingParams.html#ac992ff58f67ad9b737dfc62d517be8ed',1,'shaka::PackagingParams']]], - ['clear_5flead_5fin_5fseconds',['clear_lead_in_seconds',['../dc/da0/structshaka_1_1EncryptionParams.html#a1ad46963dc926aa4b72813dccb3f6a45',1,'shaka::EncryptionParams']]], - ['client_5fcert_5ffile',['client_cert_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#afdc9477270b8a626163940cddff4fa8c',1,'shaka::PlayreadyEncryptionParams']]], - ['client_5fcert_5fprivate_5fkey_5ffile',['client_cert_private_key_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#af6f3b909425a27e17a7d6e473d7eb8ac',1,'shaka::PlayreadyEncryptionParams']]], - ['client_5fcert_5fprivate_5fkey_5fpassword',['client_cert_private_key_password',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a2d492f0c28b5d291ef512aa0248dc8ba',1,'shaka::PlayreadyEncryptionParams']]], - ['content_5fid',['content_id',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a6b9770524a9507d0a9a3606ceef23075',1,'shaka::WidevineEncryptionParams']]] + ['bandwidth',['bandwidth',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#a930587b1f3a3e38cf1e7974f01d8ce1e',1,'shaka::media::MuxerOptions::bandwidth()'],['../d2/d7b/structshaka_1_1StreamDescriptor.html#a9bcce2ca86a33f41803f7a6417a2758c',1,'shaka::StreamDescriptor::bandwidth()']]], + ['base_5furl',['base_url',['../d0/da8/structshaka_1_1HlsParams.html#a546dcdf68c8a0a5e188f84b5c9fca9dd',1,'shaka::HlsParams']]], + ['base_5furls',['base_urls',['../df/ddc/structshaka_1_1MpdParams.html#a9fe508f9c56a6424fd857d43a4a69e7c',1,'shaka::MpdParams']]], + ['buffer_5fcallback_5fparams',['buffer_callback_params',['../d5/de3/structshaka_1_1PackagingParams.html#aaaf233248e46b6ff3285bbac87857f81',1,'shaka::PackagingParams']]] ]; diff --git a/docs/search/variables_10.js b/docs/search/variables_10.js index c6409a7305..3929deb245 100644 --- a/docs/search/variables_10.js +++ b/docs/search/variables_10.js @@ -1,4 +1,4 @@ var searchData= [ - ['vp9_5fsubsample_5fencryption',['vp9_subsample_encryption',['../dc/da0/structshaka_1_1EncryptionParams.html#a48d415f17d51306ce7e1931fd954c37c',1,'shaka::EncryptionParams']]] + ['use_5fdecoding_5ftimestamp_5fin_5ftimeline',['use_decoding_timestamp_in_timeline',['../d0/d43/structshaka_1_1Mp4OutputParams.html#a4e0de7f58e0a83896e14e5603e2f965f',1,'shaka::Mp4OutputParams']]] ]; diff --git a/docs/search/variables_11.js b/docs/search/variables_11.js index 02421ec15d..c6409a7305 100644 --- a/docs/search/variables_11.js +++ b/docs/search/variables_11.js @@ -1,4 +1,4 @@ var searchData= [ - ['write_5ffunc',['write_func',['../d9/da8/structshaka_1_1BufferCallbackParams.html#ad966040c5a75389ac6376c6378a0f307',1,'shaka::BufferCallbackParams']]] + ['vp9_5fsubsample_5fencryption',['vp9_subsample_encryption',['../dc/da0/structshaka_1_1EncryptionParams.html#a48d415f17d51306ce7e1931fd954c37c',1,'shaka::EncryptionParams']]] ]; diff --git a/docs/search/variables_12.html b/docs/search/variables_12.html new file mode 100644 index 0000000000..faca26f37a --- /dev/null +++ b/docs/search/variables_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/search/variables_12.js b/docs/search/variables_12.js new file mode 100644 index 0000000000..02421ec15d --- /dev/null +++ b/docs/search/variables_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['write_5ffunc',['write_func',['../d9/da8/structshaka_1_1BufferCallbackParams.html#ad966040c5a75389ac6376c6378a0f307',1,'shaka::BufferCallbackParams']]] +]; diff --git a/docs/search/variables_2.js b/docs/search/variables_2.js index 2c9cb68038..5962557a42 100644 --- a/docs/search/variables_2.js +++ b/docs/search/variables_2.js @@ -1,6 +1,11 @@ var searchData= [ - ['default_5flanguage',['default_language',['../df/ddc/structshaka_1_1MpdParams.html#a74df80bd74635090e97837f3a5941d73',1,'shaka::MpdParams']]], - ['drm_5flabel',['drm_label',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a8f2a517450433cf69bbc87cef17d05cf',1,'shaka::StreamDescriptor']]], - ['dump_5fstream_5finfo',['dump_stream_info',['../d6/d62/structshaka_1_1TestParams.html#a7a22e04cdfc14d73266397bf673fae6e',1,'shaka::TestParams']]] + ['ca_5ffile',['ca_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a745d002043a10ae7c01983fe5fe93846',1,'shaka::PlayreadyEncryptionParams']]], + ['chunking_5fparams',['chunking_params',['../d5/de3/structshaka_1_1PackagingParams.html#ac992ff58f67ad9b737dfc62d517be8ed',1,'shaka::PackagingParams']]], + ['clear_5flead_5fin_5fseconds',['clear_lead_in_seconds',['../dc/da0/structshaka_1_1EncryptionParams.html#a1ad46963dc926aa4b72813dccb3f6a45',1,'shaka::EncryptionParams']]], + ['client_5fcert_5ffile',['client_cert_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#afdc9477270b8a626163940cddff4fa8c',1,'shaka::PlayreadyEncryptionParams']]], + ['client_5fcert_5fprivate_5fkey_5ffile',['client_cert_private_key_file',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#af6f3b909425a27e17a7d6e473d7eb8ac',1,'shaka::PlayreadyEncryptionParams']]], + ['client_5fcert_5fprivate_5fkey_5fpassword',['client_cert_private_key_password',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a2d492f0c28b5d291ef512aa0248dc8ba',1,'shaka::PlayreadyEncryptionParams']]], + ['content_5fid',['content_id',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a6b9770524a9507d0a9a3606ceef23075',1,'shaka::WidevineEncryptionParams']]], + ['cue_5fpoints',['cue_points',['../dd/dfd/structshaka_1_1AdCueGeneratorParams.html#aad54b86efce820dc46959aafd9faab7c',1,'shaka::AdCueGeneratorParams']]] ]; diff --git a/docs/search/variables_3.js b/docs/search/variables_3.js index 7b28832e82..3efc2d8b57 100644 --- a/docs/search/variables_3.js +++ b/docs/search/variables_3.js @@ -1,4 +1,7 @@ var searchData= [ - ['encryption_5fparams',['encryption_params',['../d5/de3/structshaka_1_1PackagingParams.html#a7792bf4a71a35d2a3f99d8b4806a3913',1,'shaka::PackagingParams']]] + ['default_5flanguage',['default_language',['../df/ddc/structshaka_1_1MpdParams.html#a74df80bd74635090e97837f3a5941d73',1,'shaka::MpdParams']]], + ['drm_5flabel',['drm_label',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a8f2a517450433cf69bbc87cef17d05cf',1,'shaka::StreamDescriptor']]], + ['dump_5fstream_5finfo',['dump_stream_info',['../d6/d62/structshaka_1_1TestParams.html#a7a22e04cdfc14d73266397bf673fae6e',1,'shaka::TestParams']]], + ['duration_5fin_5fseconds',['duration_in_seconds',['../de/deb/structshaka_1_1Cuepoint.html#a31f0ed2c50901473e6b8ce3180c63793',1,'shaka::Cuepoint']]] ]; diff --git a/docs/search/variables_4.js b/docs/search/variables_4.js index 4566f0f6ad..7b28832e82 100644 --- a/docs/search/variables_4.js +++ b/docs/search/variables_4.js @@ -1,6 +1,4 @@ var searchData= [ - ['generate_5fdash_5fif_5fiop_5fcompliant_5fmpd',['generate_dash_if_iop_compliant_mpd',['../df/ddc/structshaka_1_1MpdParams.html#aa1b2ec6746586d4981655cee62669ba2',1,'shaka::MpdParams']]], - ['generate_5fstatic_5flive_5fmpd',['generate_static_live_mpd',['../df/ddc/structshaka_1_1MpdParams.html#ab5a09b17ee41a0960e813bd0c72bf4f6',1,'shaka::MpdParams']]], - ['group_5fid',['group_id',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a6d69402cd4c66d546be180c7800e6d09',1,'shaka::WidevineEncryptionParams']]] + ['encryption_5fparams',['encryption_params',['../d5/de3/structshaka_1_1PackagingParams.html#a7792bf4a71a35d2a3f99d8b4806a3913',1,'shaka::PackagingParams']]] ]; diff --git a/docs/search/variables_5.js b/docs/search/variables_5.js index ad5dded8fe..4566f0f6ad 100644 --- a/docs/search/variables_5.js +++ b/docs/search/variables_5.js @@ -1,7 +1,6 @@ var searchData= [ - ['hls_5fgroup_5fid',['hls_group_id',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a25764b4ffa8cb0da3b88cc251928ad96',1,'shaka::StreamDescriptor']]], - ['hls_5fname',['hls_name',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a92efcc01f52430f3d3ec030beb8c65c7',1,'shaka::StreamDescriptor']]], - ['hls_5fparams',['hls_params',['../d5/de3/structshaka_1_1PackagingParams.html#a88e4e2cc444fb79b8e35075dd5a20fbe',1,'shaka::PackagingParams']]], - ['hls_5fplaylist_5fname',['hls_playlist_name',['../d2/d7b/structshaka_1_1StreamDescriptor.html#aa0d36cf55c46def14bc2fa6c293859ef',1,'shaka::StreamDescriptor']]] + ['generate_5fdash_5fif_5fiop_5fcompliant_5fmpd',['generate_dash_if_iop_compliant_mpd',['../df/ddc/structshaka_1_1MpdParams.html#aa1b2ec6746586d4981655cee62669ba2',1,'shaka::MpdParams']]], + ['generate_5fstatic_5flive_5fmpd',['generate_static_live_mpd',['../df/ddc/structshaka_1_1MpdParams.html#ab5a09b17ee41a0960e813bd0c72bf4f6',1,'shaka::MpdParams']]], + ['group_5fid',['group_id',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a6d69402cd4c66d546be180c7800e6d09',1,'shaka::WidevineEncryptionParams']]] ]; diff --git a/docs/search/variables_6.js b/docs/search/variables_6.js index e6f5abc7d3..ad5dded8fe 100644 --- a/docs/search/variables_6.js +++ b/docs/search/variables_6.js @@ -1,10 +1,7 @@ var searchData= [ - ['include_5fcommon_5fpssh',['include_common_pssh',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a5985f2d6fbe33273654695050757d0b0',1,'shaka::WidevineEncryptionParams']]], - ['index_5frange',['index_range',['../d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html#aa15231fb064efc4b56800df24b074b29',1,'shaka::media::MuxerListener::MediaRanges']]], - ['init_5frange',['init_range',['../d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html#a6070da9ce7fab251c82b25a4020373c0',1,'shaka::media::MuxerListener::MediaRanges']]], - ['inject_5ffake_5fclock',['inject_fake_clock',['../d6/d62/structshaka_1_1TestParams.html#a90ba653c71c94709b8ef3e7c3cc07e6c',1,'shaka::TestParams']]], - ['injected_5flibrary_5fversion',['injected_library_version',['../d6/d62/structshaka_1_1TestParams.html#ac72df3ec74369d0723f0217eac6b5098',1,'shaka::TestParams']]], - ['input',['input',['../d2/d7b/structshaka_1_1StreamDescriptor.html#ae86324b838baa66dbab9a3d35352e200',1,'shaka::StreamDescriptor']]], - ['iv',['iv',['../df/d22/structshaka_1_1WidevineSigner.html#a6db96d4c3f1189bbd09515732bec94d9',1,'shaka::WidevineSigner::iv()'],['../d0/db4/structshaka_1_1RawKeyParams.html#aab733ab6920dd8fbed523810e64ea3f1',1,'shaka::RawKeyParams::iv()']]] + ['hls_5fgroup_5fid',['hls_group_id',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a25764b4ffa8cb0da3b88cc251928ad96',1,'shaka::StreamDescriptor']]], + ['hls_5fname',['hls_name',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a92efcc01f52430f3d3ec030beb8c65c7',1,'shaka::StreamDescriptor']]], + ['hls_5fparams',['hls_params',['../d5/de3/structshaka_1_1PackagingParams.html#a88e4e2cc444fb79b8e35075dd5a20fbe',1,'shaka::PackagingParams']]], + ['hls_5fplaylist_5fname',['hls_playlist_name',['../d2/d7b/structshaka_1_1StreamDescriptor.html#aa0d36cf55c46def14bc2fa6c293859ef',1,'shaka::StreamDescriptor']]] ]; diff --git a/docs/search/variables_7.js b/docs/search/variables_7.js index 93c9e42862..e6f5abc7d3 100644 --- a/docs/search/variables_7.js +++ b/docs/search/variables_7.js @@ -1,15 +1,10 @@ var searchData= [ - ['kadtsheadersize',['kADTSHeaderSize',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a233ffcb063079b9ca34863c48d4a19e1',1,'shaka::media::AACAudioSpecificConfig']]], - ['kdecryptionkeysize',['kDecryptionKeySize',['../de/d49/classshaka_1_1media_1_1DecryptConfig.html#afa140203b87d3e46d5fd94b231734f53',1,'shaka::media::DecryptConfig']]], - ['key',['key',['../df/d22/structshaka_1_1WidevineSigner.html#ad5c378d29df509280d8697f986163324',1,'shaka::WidevineSigner::key()'],['../df/d22/structshaka_1_1WidevineSigner.html#a25bb558aa06563d24c3d7f9733ff8898',1,'shaka::WidevineSigner::key()'],['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a2ba545b465d64da1ac9458ba45338f76',1,'shaka::PlayreadyEncryptionParams::key()']]], - ['key_5fid',['key_id',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a872107e40137be5a6c1f932db67c2a9d',1,'shaka::PlayreadyEncryptionParams']]], - ['key_5fmap',['key_map',['../d0/db4/structshaka_1_1RawKeyParams.html#a14e44fed95583d0bb319c082fb1ddb84',1,'shaka::RawKeyParams']]], - ['key_5fprovider',['key_provider',['../dc/da0/structshaka_1_1EncryptionParams.html#adcf61ebf8d129a5bcf3f159b9b076eed',1,'shaka::EncryptionParams::key_provider()'],['../d1/d4f/structshaka_1_1DecryptionParams.html#ad93d153f9e777cccb6404611d5b4d339',1,'shaka::DecryptionParams::key_provider()']]], - ['key_5fserver_5furl',['key_server_url',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#ac222c5bd0620e5a6f9bf5e9fec534fb9',1,'shaka::WidevineEncryptionParams::key_server_url()'],['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a3a31b3002f86834b1799279bf5b5fc11',1,'shaka::PlayreadyEncryptionParams::key_server_url()'],['../d8/d48/structshaka_1_1WidevineDecryptionParams.html#adb765979bcc7f63ce46c9ed6ead1ee5b',1,'shaka::WidevineDecryptionParams::key_server_url()']]], - ['knokeyrotation',['kNoKeyRotation',['../dc/da0/structshaka_1_1EncryptionParams.html#a92ad4ca8e1ccb7d6b5fa2ee0b1b196fa',1,'shaka::EncryptionParams']]], - ['knosidxboxinsegment',['kNoSidxBoxInSegment',['../d0/d43/structshaka_1_1Mp4OutputParams.html#a41ff299070f75fd0dca96d83706d32ff',1,'shaka::Mp4OutputParams']]], - ['korderinvalid',['kOrderInvalid',['../dc/da6/classshaka_1_1media_1_1ContentEncoding.html#a3ba32d5ca8b0688b2dc6b2ec8a5be6d2',1,'shaka::media::ContentEncoding']]], - ['kprotectionschemecenc',['kProtectionSchemeCenc',['../dc/da0/structshaka_1_1EncryptionParams.html#a1d7a8c6b5e46b51ccadcaef3f9cf9cb0',1,'shaka::EncryptionParams']]], - ['ksuggestedpresentationdelaynotset',['kSuggestedPresentationDelayNotSet',['../df/ddc/structshaka_1_1MpdParams.html#a13705544aac44c5d2065b8a842744bf0',1,'shaka::MpdParams']]] + ['include_5fcommon_5fpssh',['include_common_pssh',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a5985f2d6fbe33273654695050757d0b0',1,'shaka::WidevineEncryptionParams']]], + ['index_5frange',['index_range',['../d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html#aa15231fb064efc4b56800df24b074b29',1,'shaka::media::MuxerListener::MediaRanges']]], + ['init_5frange',['init_range',['../d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html#a6070da9ce7fab251c82b25a4020373c0',1,'shaka::media::MuxerListener::MediaRanges']]], + ['inject_5ffake_5fclock',['inject_fake_clock',['../d6/d62/structshaka_1_1TestParams.html#a90ba653c71c94709b8ef3e7c3cc07e6c',1,'shaka::TestParams']]], + ['injected_5flibrary_5fversion',['injected_library_version',['../d6/d62/structshaka_1_1TestParams.html#ac72df3ec74369d0723f0217eac6b5098',1,'shaka::TestParams']]], + ['input',['input',['../d2/d7b/structshaka_1_1StreamDescriptor.html#ae86324b838baa66dbab9a3d35352e200',1,'shaka::StreamDescriptor']]], + ['iv',['iv',['../df/d22/structshaka_1_1WidevineSigner.html#a6db96d4c3f1189bbd09515732bec94d9',1,'shaka::WidevineSigner::iv()'],['../d0/db4/structshaka_1_1RawKeyParams.html#aab733ab6920dd8fbed523810e64ea3f1',1,'shaka::RawKeyParams::iv()']]] ]; diff --git a/docs/search/variables_8.js b/docs/search/variables_8.js index 942e2442d7..40e00c01e9 100644 --- a/docs/search/variables_8.js +++ b/docs/search/variables_8.js @@ -1,4 +1,16 @@ var searchData= [ - ['language',['language',['../d2/d7b/structshaka_1_1StreamDescriptor.html#af2e3479d90070a03a801ecc5a3d35d7e',1,'shaka::StreamDescriptor']]] + ['kadtsheadersize',['kADTSHeaderSize',['../d0/da2/classshaka_1_1media_1_1AACAudioSpecificConfig.html#a233ffcb063079b9ca34863c48d4a19e1',1,'shaka::media::AACAudioSpecificConfig']]], + ['kdecryptionkeysize',['kDecryptionKeySize',['../de/d49/classshaka_1_1media_1_1DecryptConfig.html#afa140203b87d3e46d5fd94b231734f53',1,'shaka::media::DecryptConfig']]], + ['key',['key',['../df/d22/structshaka_1_1WidevineSigner.html#ad5c378d29df509280d8697f986163324',1,'shaka::WidevineSigner::key()'],['../df/d22/structshaka_1_1WidevineSigner.html#a25bb558aa06563d24c3d7f9733ff8898',1,'shaka::WidevineSigner::key()'],['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a2ba545b465d64da1ac9458ba45338f76',1,'shaka::PlayreadyEncryptionParams::key()']]], + ['key_5fid',['key_id',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a872107e40137be5a6c1f932db67c2a9d',1,'shaka::PlayreadyEncryptionParams']]], + ['key_5fmap',['key_map',['../d0/db4/structshaka_1_1RawKeyParams.html#a14e44fed95583d0bb319c082fb1ddb84',1,'shaka::RawKeyParams']]], + ['key_5fprovider',['key_provider',['../dc/da0/structshaka_1_1EncryptionParams.html#adcf61ebf8d129a5bcf3f159b9b076eed',1,'shaka::EncryptionParams::key_provider()'],['../d1/d4f/structshaka_1_1DecryptionParams.html#ad93d153f9e777cccb6404611d5b4d339',1,'shaka::DecryptionParams::key_provider()']]], + ['key_5fserver_5furl',['key_server_url',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#ac222c5bd0620e5a6f9bf5e9fec534fb9',1,'shaka::WidevineEncryptionParams::key_server_url()'],['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a3a31b3002f86834b1799279bf5b5fc11',1,'shaka::PlayreadyEncryptionParams::key_server_url()'],['../d8/d48/structshaka_1_1WidevineDecryptionParams.html#adb765979bcc7f63ce46c9ed6ead1ee5b',1,'shaka::WidevineDecryptionParams::key_server_url()']]], + ['key_5furi',['key_uri',['../d0/da8/structshaka_1_1HlsParams.html#a68414aff0f65059c2d05c8d168aadf5f',1,'shaka::HlsParams']]], + ['knokeyrotation',['kNoKeyRotation',['../dc/da0/structshaka_1_1EncryptionParams.html#a92ad4ca8e1ccb7d6b5fa2ee0b1b196fa',1,'shaka::EncryptionParams']]], + ['knosidxboxinsegment',['kNoSidxBoxInSegment',['../d0/d43/structshaka_1_1Mp4OutputParams.html#a41ff299070f75fd0dca96d83706d32ff',1,'shaka::Mp4OutputParams']]], + ['korderinvalid',['kOrderInvalid',['../dc/da6/classshaka_1_1media_1_1ContentEncoding.html#a3ba32d5ca8b0688b2dc6b2ec8a5be6d2',1,'shaka::media::ContentEncoding']]], + ['kprotectionschemecenc',['kProtectionSchemeCenc',['../dc/da0/structshaka_1_1EncryptionParams.html#a1d7a8c6b5e46b51ccadcaef3f9cf9cb0',1,'shaka::EncryptionParams']]], + ['ksuggestedpresentationdelaynotset',['kSuggestedPresentationDelayNotSet',['../df/ddc/structshaka_1_1MpdParams.html#a13705544aac44c5d2065b8a842744bf0',1,'shaka::MpdParams']]] ]; diff --git a/docs/search/variables_9.js b/docs/search/variables_9.js index 7029708b6b..942e2442d7 100644 --- a/docs/search/variables_9.js +++ b/docs/search/variables_9.js @@ -1,10 +1,4 @@ var searchData= [ - ['master_5fplaylist_5foutput',['master_playlist_output',['../d0/da8/structshaka_1_1HlsParams.html#ae3706891d39f8da72ed59d8fb13f2e30',1,'shaka::HlsParams']]], - ['min_5fbuffer_5ftime',['min_buffer_time',['../df/ddc/structshaka_1_1MpdParams.html#aee1510b64b9acbc17b8bfccac2e132a3',1,'shaka::MpdParams']]], - ['minimum_5fupdate_5fperiod',['minimum_update_period',['../df/ddc/structshaka_1_1MpdParams.html#a4a5dafe570fd7e35749ce12d83ca9559',1,'shaka::MpdParams']]], - ['mp4_5foutput_5fparams',['mp4_output_params',['../d5/de3/structshaka_1_1PackagingParams.html#a794072e13c04de6b98e5d1e7cc5b57d6',1,'shaka::PackagingParams']]], - ['mp4_5fparams',['mp4_params',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#aa616f5958ea9df2d70f3fe42ff47ff43',1,'shaka::media::MuxerOptions']]], - ['mpd_5foutput',['mpd_output',['../df/ddc/structshaka_1_1MpdParams.html#aa6ca18997bb307d3b5fe1c9ced161ff6',1,'shaka::MpdParams']]], - ['mpd_5fparams',['mpd_params',['../d5/de3/structshaka_1_1PackagingParams.html#acfa10a8e9c877a3c2baf83525837a254',1,'shaka::PackagingParams']]] + ['language',['language',['../d2/d7b/structshaka_1_1StreamDescriptor.html#af2e3479d90070a03a801ecc5a3d35d7e',1,'shaka::StreamDescriptor']]] ]; diff --git a/docs/search/variables_a.js b/docs/search/variables_a.js index 08a1796be4..7029708b6b 100644 --- a/docs/search/variables_a.js +++ b/docs/search/variables_a.js @@ -1,7 +1,10 @@ var searchData= [ - ['output',['output',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a08ce812991297de47354b99cdaec5415',1,'shaka::StreamDescriptor']]], - ['output_5ffile_5fname',['output_file_name',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#a5397ee8759a663aea68261600e528d82',1,'shaka::media::MuxerOptions']]], - ['output_5fformat',['output_format',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a025d9a9a1612654da2b0c99fe81378db',1,'shaka::StreamDescriptor']]], - ['output_5fmedia_5finfo',['output_media_info',['../d5/de3/structshaka_1_1PackagingParams.html#a9206160a0fb92a9e9ee27fd8e9725ea1',1,'shaka::PackagingParams']]] + ['master_5fplaylist_5foutput',['master_playlist_output',['../d0/da8/structshaka_1_1HlsParams.html#ae3706891d39f8da72ed59d8fb13f2e30',1,'shaka::HlsParams']]], + ['min_5fbuffer_5ftime',['min_buffer_time',['../df/ddc/structshaka_1_1MpdParams.html#aee1510b64b9acbc17b8bfccac2e132a3',1,'shaka::MpdParams']]], + ['minimum_5fupdate_5fperiod',['minimum_update_period',['../df/ddc/structshaka_1_1MpdParams.html#a4a5dafe570fd7e35749ce12d83ca9559',1,'shaka::MpdParams']]], + ['mp4_5foutput_5fparams',['mp4_output_params',['../d5/de3/structshaka_1_1PackagingParams.html#a794072e13c04de6b98e5d1e7cc5b57d6',1,'shaka::PackagingParams']]], + ['mp4_5fparams',['mp4_params',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#aa616f5958ea9df2d70f3fe42ff47ff43',1,'shaka::media::MuxerOptions']]], + ['mpd_5foutput',['mpd_output',['../df/ddc/structshaka_1_1MpdParams.html#aa6ca18997bb307d3b5fe1c9ced161ff6',1,'shaka::MpdParams']]], + ['mpd_5fparams',['mpd_params',['../d5/de3/structshaka_1_1PackagingParams.html#acfa10a8e9c877a3c2baf83525837a254',1,'shaka::PackagingParams']]] ]; diff --git a/docs/search/variables_b.js b/docs/search/variables_b.js index 7414a86011..08a1796be4 100644 --- a/docs/search/variables_b.js +++ b/docs/search/variables_b.js @@ -1,8 +1,7 @@ var searchData= [ - ['playlist_5ftype',['playlist_type',['../d0/da8/structshaka_1_1HlsParams.html#a9bfeae8a0c112ca82830dd3f228438e6',1,'shaka::HlsParams']]], - ['policy',['policy',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a469f3db91b42af20f270a280c4d42b4f',1,'shaka::WidevineEncryptionParams']]], - ['private_5fframe',['private_frame',['../d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html#a33c145fa8ed1417799dce66a94f8e95c',1,'shaka::media::mp4::ID3v2']]], - ['program_5fidentifier',['program_identifier',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a74199b0293ca77eaac30aea53a9ec2aa',1,'shaka::PlayreadyEncryptionParams']]], - ['pssh',['pssh',['../d0/db4/structshaka_1_1RawKeyParams.html#a448b8c435fc86d4fbc85214e523f2ac5',1,'shaka::RawKeyParams']]] + ['output',['output',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a08ce812991297de47354b99cdaec5415',1,'shaka::StreamDescriptor']]], + ['output_5ffile_5fname',['output_file_name',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#a5397ee8759a663aea68261600e528d82',1,'shaka::media::MuxerOptions']]], + ['output_5fformat',['output_format',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a025d9a9a1612654da2b0c99fe81378db',1,'shaka::StreamDescriptor']]], + ['output_5fmedia_5finfo',['output_media_info',['../d5/de3/structshaka_1_1PackagingParams.html#a9206160a0fb92a9e9ee27fd8e9725ea1',1,'shaka::PackagingParams']]] ]; diff --git a/docs/search/variables_c.js b/docs/search/variables_c.js index b08daeb2a2..7414a86011 100644 --- a/docs/search/variables_c.js +++ b/docs/search/variables_c.js @@ -1,4 +1,8 @@ var searchData= [ - ['read_5ffunc',['read_func',['../d9/da8/structshaka_1_1BufferCallbackParams.html#a6e6e97682ba2be686a2d1e9b62d26e13',1,'shaka::BufferCallbackParams']]] + ['playlist_5ftype',['playlist_type',['../d0/da8/structshaka_1_1HlsParams.html#a9bfeae8a0c112ca82830dd3f228438e6',1,'shaka::HlsParams']]], + ['policy',['policy',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a469f3db91b42af20f270a280c4d42b4f',1,'shaka::WidevineEncryptionParams']]], + ['private_5fframe',['private_frame',['../d3/dad/structshaka_1_1media_1_1mp4_1_1ID3v2.html#a33c145fa8ed1417799dce66a94f8e95c',1,'shaka::media::mp4::ID3v2']]], + ['program_5fidentifier',['program_identifier',['../d3/df5/structshaka_1_1PlayreadyEncryptionParams.html#a74199b0293ca77eaac30aea53a9ec2aa',1,'shaka::PlayreadyEncryptionParams']]], + ['pssh',['pssh',['../d0/db4/structshaka_1_1RawKeyParams.html#a448b8c435fc86d4fbc85214e523f2ac5',1,'shaka::RawKeyParams']]] ]; diff --git a/docs/search/variables_d.js b/docs/search/variables_d.js index 2c78f2c898..b08daeb2a2 100644 --- a/docs/search/variables_d.js +++ b/docs/search/variables_d.js @@ -1,16 +1,4 @@ var searchData= [ - ['sample_5fencryption_5fdata',['sample_encryption_data',['../d4/dad/structshaka_1_1media_1_1mp4_1_1SampleEncryption.html#a621791262888f30b4ee8a8acb37cd5a3',1,'shaka::media::mp4::SampleEncryption']]], - ['segment_5fduration_5fin_5fseconds',['segment_duration_in_seconds',['../d2/d1f/structshaka_1_1ChunkingParams.html#a01414f1502775576d68e45d172029358',1,'shaka::ChunkingParams']]], - ['segment_5fsap_5faligned',['segment_sap_aligned',['../d2/d1f/structshaka_1_1ChunkingParams.html#a1ab10c82260dc073fb3830efcdabb171',1,'shaka::ChunkingParams']]], - ['segment_5ftemplate',['segment_template',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#ab98cfd28046fc5c52ab2a45dba1a339a',1,'shaka::media::MuxerOptions::segment_template()'],['../d2/d7b/structshaka_1_1StreamDescriptor.html#af3e55c8970e8a7604ca79a98f4642872',1,'shaka::StreamDescriptor::segment_template()']]], - ['signer',['signer',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a233141ad4baf2f2afce30f96adf340ae',1,'shaka::WidevineEncryptionParams::signer()'],['../d8/d48/structshaka_1_1WidevineDecryptionParams.html#acf84772bb9787f61110e388490412939',1,'shaka::WidevineDecryptionParams::signer()']]], - ['signer_5fname',['signer_name',['../df/d22/structshaka_1_1WidevineSigner.html#a6768d5addb3c90f33ce5f241705c827e',1,'shaka::WidevineSigner']]], - ['signing_5fkey_5ftype',['signing_key_type',['../df/d22/structshaka_1_1WidevineSigner.html#a656fbc14799c96fa8b822e3917070cf6',1,'shaka::WidevineSigner']]], - ['skip_5fencryption',['skip_encryption',['../d2/d7b/structshaka_1_1StreamDescriptor.html#abbaf07b1faa84803478f89bc6dd8cb4a',1,'shaka::StreamDescriptor']]], - ['stream_5flabel_5ffunc',['stream_label_func',['../dc/da0/structshaka_1_1EncryptionParams.html#a7686a6aca6a7c3d077a5d7215c39fc51',1,'shaka::EncryptionParams']]], - ['stream_5fselector',['stream_selector',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a386c5e3717b5f982f72698abba09df2c',1,'shaka::StreamDescriptor']]], - ['subsegment_5fduration_5fin_5fseconds',['subsegment_duration_in_seconds',['../d2/d1f/structshaka_1_1ChunkingParams.html#ae303f5bf58edbb231b0cfbbf9c4e05d7',1,'shaka::ChunkingParams']]], - ['subsegment_5franges',['subsegment_ranges',['../d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html#a836626da601a9f6ea54502c7e5bdd7c9',1,'shaka::media::MuxerListener::MediaRanges']]], - ['subsegment_5fsap_5faligned',['subsegment_sap_aligned',['../d2/d1f/structshaka_1_1ChunkingParams.html#afcde8cc6cf9646c78f5bf13181022aa7',1,'shaka::ChunkingParams']]] + ['read_5ffunc',['read_func',['../d9/da8/structshaka_1_1BufferCallbackParams.html#a6e6e97682ba2be686a2d1e9b62d26e13',1,'shaka::BufferCallbackParams']]] ]; diff --git a/docs/search/variables_e.js b/docs/search/variables_e.js index e0a48bbd2a..0ceae9f738 100644 --- a/docs/search/variables_e.js +++ b/docs/search/variables_e.js @@ -1,6 +1,17 @@ var searchData= [ - ['temp_5fdir',['temp_dir',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#a872d1150a71d9f0fb5db0ab81334d614',1,'shaka::media::MuxerOptions::temp_dir()'],['../d5/de3/structshaka_1_1PackagingParams.html#ae179e88ad853856b0e006326ff445f6e',1,'shaka::PackagingParams::temp_dir()']]], - ['time_5fshift_5fbuffer_5fdepth',['time_shift_buffer_depth',['../d0/da8/structshaka_1_1HlsParams.html#adc19a9eebbfe20c3f9fe03dd452e4b1b',1,'shaka::HlsParams::time_shift_buffer_depth()'],['../df/ddc/structshaka_1_1MpdParams.html#a95e4824708c8de4b882b86772f680032',1,'shaka::MpdParams::time_shift_buffer_depth()']]], - ['trick_5fplay_5ffactor',['trick_play_factor',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a5cc00f367691729460e0b75b8ec6c512',1,'shaka::StreamDescriptor']]] + ['sample_5fencryption_5fdata',['sample_encryption_data',['../d4/dad/structshaka_1_1media_1_1mp4_1_1SampleEncryption.html#a621791262888f30b4ee8a8acb37cd5a3',1,'shaka::media::mp4::SampleEncryption']]], + ['segment_5fduration_5fin_5fseconds',['segment_duration_in_seconds',['../d2/d1f/structshaka_1_1ChunkingParams.html#a01414f1502775576d68e45d172029358',1,'shaka::ChunkingParams']]], + ['segment_5fsap_5faligned',['segment_sap_aligned',['../d2/d1f/structshaka_1_1ChunkingParams.html#a1ab10c82260dc073fb3830efcdabb171',1,'shaka::ChunkingParams']]], + ['segment_5ftemplate',['segment_template',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#ab98cfd28046fc5c52ab2a45dba1a339a',1,'shaka::media::MuxerOptions::segment_template()'],['../d2/d7b/structshaka_1_1StreamDescriptor.html#af3e55c8970e8a7604ca79a98f4642872',1,'shaka::StreamDescriptor::segment_template()']]], + ['signer',['signer',['../d9/dd2/structshaka_1_1WidevineEncryptionParams.html#a233141ad4baf2f2afce30f96adf340ae',1,'shaka::WidevineEncryptionParams::signer()'],['../d8/d48/structshaka_1_1WidevineDecryptionParams.html#acf84772bb9787f61110e388490412939',1,'shaka::WidevineDecryptionParams::signer()']]], + ['signer_5fname',['signer_name',['../df/d22/structshaka_1_1WidevineSigner.html#a6768d5addb3c90f33ce5f241705c827e',1,'shaka::WidevineSigner']]], + ['signing_5fkey_5ftype',['signing_key_type',['../df/d22/structshaka_1_1WidevineSigner.html#a656fbc14799c96fa8b822e3917070cf6',1,'shaka::WidevineSigner']]], + ['skip_5fencryption',['skip_encryption',['../d2/d7b/structshaka_1_1StreamDescriptor.html#abbaf07b1faa84803478f89bc6dd8cb4a',1,'shaka::StreamDescriptor']]], + ['start_5ftime_5fin_5fseconds',['start_time_in_seconds',['../de/deb/structshaka_1_1Cuepoint.html#a18272c3d7ac008355717b75816fba4b8',1,'shaka::Cuepoint']]], + ['stream_5flabel_5ffunc',['stream_label_func',['../dc/da0/structshaka_1_1EncryptionParams.html#a7686a6aca6a7c3d077a5d7215c39fc51',1,'shaka::EncryptionParams']]], + ['stream_5fselector',['stream_selector',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a386c5e3717b5f982f72698abba09df2c',1,'shaka::StreamDescriptor']]], + ['subsegment_5fduration_5fin_5fseconds',['subsegment_duration_in_seconds',['../d2/d1f/structshaka_1_1ChunkingParams.html#ae303f5bf58edbb231b0cfbbf9c4e05d7',1,'shaka::ChunkingParams']]], + ['subsegment_5franges',['subsegment_ranges',['../d1/d03/structshaka_1_1media_1_1MuxerListener_1_1MediaRanges.html#a836626da601a9f6ea54502c7e5bdd7c9',1,'shaka::media::MuxerListener::MediaRanges']]], + ['subsegment_5fsap_5faligned',['subsegment_sap_aligned',['../d2/d1f/structshaka_1_1ChunkingParams.html#afcde8cc6cf9646c78f5bf13181022aa7',1,'shaka::ChunkingParams']]] ]; diff --git a/docs/search/variables_f.js b/docs/search/variables_f.js index 3929deb245..e0a48bbd2a 100644 --- a/docs/search/variables_f.js +++ b/docs/search/variables_f.js @@ -1,4 +1,6 @@ var searchData= [ - ['use_5fdecoding_5ftimestamp_5fin_5ftimeline',['use_decoding_timestamp_in_timeline',['../d0/d43/structshaka_1_1Mp4OutputParams.html#a4e0de7f58e0a83896e14e5603e2f965f',1,'shaka::Mp4OutputParams']]] + ['temp_5fdir',['temp_dir',['../d0/d27/structshaka_1_1media_1_1MuxerOptions.html#a872d1150a71d9f0fb5db0ab81334d614',1,'shaka::media::MuxerOptions::temp_dir()'],['../d5/de3/structshaka_1_1PackagingParams.html#ae179e88ad853856b0e006326ff445f6e',1,'shaka::PackagingParams::temp_dir()']]], + ['time_5fshift_5fbuffer_5fdepth',['time_shift_buffer_depth',['../d0/da8/structshaka_1_1HlsParams.html#adc19a9eebbfe20c3f9fe03dd452e4b1b',1,'shaka::HlsParams::time_shift_buffer_depth()'],['../df/ddc/structshaka_1_1MpdParams.html#a95e4824708c8de4b882b86772f680032',1,'shaka::MpdParams::time_shift_buffer_depth()']]], + ['trick_5fplay_5ffactor',['trick_play_factor',['../d2/d7b/structshaka_1_1StreamDescriptor.html#a5cc00f367691729460e0b75b8ec6c512',1,'shaka::StreamDescriptor']]] ]; diff --git a/html/.buildinfo b/html/.buildinfo index ac07d3eb6f..91f221b8ad 100644 --- a/html/.buildinfo +++ b/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 4ed0b3e0fcf03d7d7273c0f88fb9b4f2 +config: deaaba7b0f7a19b51955217e9825c785 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/html/_images/graphviz-3d064d3d3c78c2f86da25ace49db3e3c4e03a691.png b/html/_images/graphviz-3d064d3d3c78c2f86da25ace49db3e3c4e03a691.png new file mode 100644 index 0000000000000000000000000000000000000000..4742596cd41d8ce835a02beaf429d7c725f2d937 GIT binary patch literal 75226 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 + diff --git a/html/_images/graphviz-426ceb00b0739eba2ed2de6d0d71f24a0021c268.png b/html/_images/graphviz-426ceb00b0739eba2ed2de6d0d71f24a0021c268.png new file mode 100644 index 0000000000000000000000000000000000000000..73694a31f946e5cf0557bcbdf63066424263fa21 GIT binary patch literal 14328 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 literal 0 HcmV?d00001 diff --git a/html/_images/graphviz-426ceb00b0739eba2ed2de6d0d71f24a0021c268.png.map b/html/_images/graphviz-426ceb00b0739eba2ed2de6d0d71f24a0021c268.png.map new file mode 100644 index 0000000000..d4062a6248 --- /dev/null +++ b/html/_images/graphviz-426ceb00b0739eba2ed2de6d0d71f24a0021c268.png.map @@ -0,0 +1,2 @@ + + diff --git a/html/_images/graphviz-787838559a989a01982bde69df7d1ba50dba3dae.png b/html/_images/graphviz-787838559a989a01982bde69df7d1ba50dba3dae.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d0891e04c4a49227b4d201e8a38332e810f13f GIT binary patch literal 6762 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 literal 0 HcmV?d00001 diff --git a/html/_images/graphviz-787838559a989a01982bde69df7d1ba50dba3dae.png.map b/html/_images/graphviz-787838559a989a01982bde69df7d1ba50dba3dae.png.map new file mode 100644 index 0000000000..6a101f50b3 --- /dev/null +++ b/html/_images/graphviz-787838559a989a01982bde69df7d1ba50dba3dae.png.map @@ -0,0 +1,2 @@ + + diff --git a/html/_images/graphviz-d08592da92fae1a4929d96c1cb6e446e05714101.png b/html/_images/graphviz-d08592da92fae1a4929d96c1cb6e446e05714101.png new file mode 100644 index 0000000000000000000000000000000000000000..5d76a74fe41a40bc48cfb60dc949537492184c20 GIT binary patch literal 50735 zcmd43cRbhaA2$4LX=zg;X-Y=2MQDhOvbQKowyel5smLfRBovZO_8tw1k}?Vzp^WUk z@8fh`*Zn;A^Ljn6=lSox{eHjKugmrA`}us%^F5B^cpvA-Q~sjlrVaEPC=|*jsq^BB z6v~<$3T1`(Ix75z=KQKw{2!H`jHEbaiTo$3C@z3P*+-EQKdo#Z{`coCZDrfe#U+zd z>(p+^%EB z8(3ejV;vOsdhy_c(^Ai$`B8K06`NP3{^_*b`!ST~k9PZq!areCC-k|Well2ryC6T8 zMf6O)FaGmq3Z?YtixzU5J-SMl4oZzpJE7^E8<5B+3dt-#b(9m+G?mzc`yJZp2! zz#!p_#|Gn;+;mozgc$sfW};(x?WXpzvB~`S@uMlnA~Hp%C?Vgr-}u9${SG7VcBvFO zOz72Q=vQpM5XLJdwm2PaWo4xtEwO24dioW<&C14xeexuQ5_s*_ty>=}D{E_`C2iYF zS4b(|-^@s}cW=s(NGHYakF+y|eIW-pa>mBS_->6}_1VoMv3c`mdS1gvdtK)(vy8q; zWM^levsEXHaB6@4t+AKc7Hug^uJZ~R2A>qo%~M)kmz;~nzskHDDOZWR`0VRbi{khn z8P^lfJ>2Oq+Z$J(ab2!HRk!4W-zExWQRn8(Y}Hhq<=ynG2AcRTgd9K30c7enf9(ZmtR&J2y4d=r~j)nU0&JP-0Kvq7$u-Lql4-F($mxX8dD=@CkGOj=1P{>GM)eY z{+-}BH5evjoACS7)3`07)2FZ{9@(xGiu`!K-B5~Ib9Qf2mWlDVmp+q!e<<}-u+&xg zvuo$dFU(GSYqls!c3qll^T^U7*EqF)atX~ zy+5`boT_>~U!I4FI_JAA&RowjYo3gl;xVYEbDr+FuUYJrcjnBQ4P5&vl;a;gHtwn` zc6K}=BxKzA-p9js(_s109E+CR=lAzIoW~ldX={fgTQ(ltL+-d#x~seUC=1K^>opPe z5h9LPuV1%ooco?<9oLj?mgpz8sGeFhsktp?HH9J}B`xib&AGRkF#&Nv`~KL*KdTNO zxfuQ`TGG!LYeRMit48&sx!L4%_z5Aat_RE)!|fZVI9XWa#l`Om*$v8K&rcog`tv6) zUBANk*IQ3%DXF7@&aG3`1K;B0s;a7FI7{YVzxQR-VtG!!jM88<-cyS>dj0k5SLB(i=EvPPtFm!2zEzD$D)Y_ zt*HVw@^x-O3?dGhc>IZaHQk>h&e)sxJ`8cUSFKevT}6@iLiQV#-(9bnZ5lc`&}`Q> zSCDGeY|3vkJKpOsnD?ivtIMYC3i%>R!>7thsT$F_q?Z?-z7!Twut%MezId@=xZ}-3 zK}KwZrr%zXuHN2wqi-*NP8AO(wp=`a{tKSE4*5B^c_sM{7RK3${y4IFH4!3qnG3J4 zRVkOaI2)MZR;a#z|K8(yB;pHxIq0f8W&H<%7;n}6k@^(*tCXD_TG`66(m|Q{wQ!RQ zuD*eqn*EnDg%TCBj+(j-k7UzP?lIR?;~dm{^ytyiiHV@ftNE$R$>8?&&HMKf#l^)~ z{=Db`B}K)$T+7Y_7uQfI(q39Mb9O?i(>zlu=DN8zP9HmVY>IaIlJc{;`T2eGGh=p{ z12bcPZkes8oZ9`Xua8yA?&QCpFLAkq?D?Oc7Zem^5fGU2%`S3T$lq()nk_&}+#{MA(~)Y{hn*Tw%|?&<&dUoS73+mh|{ z@RelEtdBi(*Y3ExyGJ;UN+CNL7_rfmb9YB3+BU9VuYe-y?YpA=n1cB#igb8RtAotg z?@v5J5}_SkT`?%8Ej@JjILiU=)FmC%Xg<3^?Pz^Uu8el@YKr`?mcm;~sJ1{L?B@#4 zE4sK8mo5DwpO?nx9oBE!bWN68{pkNOz~lcX1X3@`%@v$Ly=M-P!hZoM`o6|K3=^|r>6p1*^V6^yE4%T^<+0hB}D^l zsTZ}kUp^-(DdXQ)pBQJ`-(Z9eGTZ$`cl_5wPErezqND^?&?$%cLCffm>yZn+ z*}6_69v`1@a!Q5q8u`yJEId5PL}?)b%tFhm{A!<+L;LNu?ER*urga5&7G_PEQh9lK z4u8`tY$p0tq7RT-quQx@WngG16*tsddV5t#^Y5<8fczUBclzq$4@z0xxWUrkO*uur zal*JhA(phk`&*bA09*8INTVnkrDQbE>_%VoWw#IcadjHvbuT&CMH*DDO6)54b6mmCA#4&qzYKYU-)s;g%?G&yQ z)s$%z9T-SMaNVIp;#f`9{)Xf%*Cm%Km*^KS*c%xGWB&d%y$~)ql5Okh>A7L^=HSY! zim5t9HjDGOibmcuSlQV%0^%+4cVg)$#%jd+gVc0LT-*G5yWY0<>p9!Lx>__wuTDv< zts8fgMO$%#Qk*X`KP4%Ny=u0w@Z`Jq?-SHgbzJSm-oK@It?K5dM9JQ`c~fFS@Y(lsCwr$%+hlkUgF2ySz_Sth{G~4#VQ~vrF=N@)- zc19ODPJOJcRfvy|*UT{R0eG0t+0Ch)yAQqW+_`f{d3cm~u79p87%EPD^k^&cdDk~N zQlVon{w_ zT=(iZqwvj^o9x2E1#OH=u8lw)eYmf0=yNn%w?-8^&wWHwx0=(v=I!VA1mL0N=g-4Z z9UUDcB7oewySkKLi3yN+H>(j_D%``!2>gDi%H9DnK|1c@sEfDf3K~Atk5i$Ko;-;I zOh~-)=AM5HF8rafQOzJ@#!d$9^KhkAewPKVzi9p}BV)`g&al;|Az6!!n_ICt$3hMG z*}P!jB6rjG`B`P1EaQ4dAyHg)*e?9pGrp@Iw&L4l#pZ|IZw|F`Y}v9!C0;RBezGQn zuC$2Ir@-|ljVbj$3^~ z<)@XFROLEcftpEF8wDiNc`}q)E+Pp)c2`sJ?j5Ug)dHI-Zi+*QCwf2s&YPcz2(VFQL<(rzCs;H*|Y1 zDv7~|dI8$%zsAb&+4OvA&Mx9hoCPpv)h#Z(CZexLIp-4!0GgO%^o@BF1HY_)U}$K( zn;S)BwkNvpXF(1?WuohRCsPwx56Y-so?lT>QA3hObj4mr*^Rr7)qQw;&=%4EDU?St zh*jk)l6+#a*+RyDGm~f%a5EdgduV8=e@srBi`Ji-$i`i|PS4-m-y-7=ko(H|&u5Lr zy>xW1mKLW<=ml>?3Elk5qN}UBX^)`1hK5F%m}{}aMBiaGHMJ`5o!75lr=_9kNw3)Z zZM^r}5_fcRaLvRN#8y3AO*WB{0IbzZTa=?A?@D1$D|xcGcou?FZJ4~U4Lru z=ivn*$Jv3LwuX_;io;TG?rr)O%%R0TcSV*u>Q!j9>&?LrjO#XT3^;^#vrBUyg<|h= zR1_;c_NOLizIp|Ph23t<>GRk&`Aj<9B|aBXH?9pGGh+A1`u+2hcosGNpPw`#1nR#( z|GR&^9JAzJ+{*3#e&>pfi2*4(n{cThyVg=Vsjg0$QPfG@d3Ia@OaZ(m7R9TwxmgPk zR-$6n@UH(*TavPlP6RhMcVKvU68a9lhULTw4V2q_rDz9=^f(Nw69Deff;X{9a z|4h>#+}EyN?Ll8@oak>nEQO91^yJAC6ir;@FefMHEl0=1)9zHSb8-X(Pf-5DI&6=E zgI@xsvm8Er4qx6>;##tK@5xv5^G;I!sHcTRMfD(RB6EK;G)r8He%C~%8hi?imkwg3 zisQ^nP)U4wbD-%c^pUc%GHF>^Wdnnkib_frTB^yKv7HruGXAD!W-6cyBxxObW1mnj zZgzY95Wrdf0OLt}d8L=KTtY z{mY#-8^=>!7i6Hs0JN2txv%Z+=y(q1(%Tys8H`ns@Y|b=N<}JDj+x`k=(X6`Sfhca zEQhgA0vtSrE9l(Gb${g+6tFQfOQ5+)NFJTQ{dNETZLkcjTW${z-|%4))4?~W_|Wq$ z+7u83)Lwdf!wd@5-4M^k>SPga91C$K*k{CO{zQr?WUeDaTsOx?^V zL^scgdgmt0Wz}_FC0SEN|GoFjH?wThA1?s8j7!~C5Rw_=&sSV*)$N5gq>`?84&8|^ z;!ne9<&ntq{s#^mST1K1jk=8_Ylp9g2L{GKWiqM`;nKEaI8F!1K$$vv@}xGR$3G^| z`VT8J^ZRx}Q&@cV?Ab#q^o3_aDp=%_0uclp+Pv!J%TX_0ytv98N_~E&Q8h{Zc}t5n zE^GMCi&mmy=Il`6n6HlG0N*)raYM)?B?SvV?b=j+=G*e&=~jJRG0j1OZSbtDthdYj zh~&>)%d`Gh_4T8%*v~|ro7%6Ei<_a-KTlLkO+Y%#HkK^fHk+Z&D4ak4z{%N}cE^r` z!otGtii=qglKMODGc`cINWz~P82`vQ&yQ4)?KpGxY!>iK)oij>jxlKE$LeZjg3+wH zrB^Afj6#cSKek8AMH|gXNnJfeGs`#@xA5cp{E}SUnl)>nh;=kMl6&Db$k0F)dV>CN z;NU@2!5Ai&>C<4Z0f#PuY~slR5N^T8E+ve1S22W7`#lqL)e&154*+CLU0j$m>HZi* zU~6sq;-ku|UjakwlC=bY(PRqjhJp_vvZN6~LQd0Z1XKcZCIVLx6jkPV`?V*6)UBZX z_wScznAjW%BO{}H^gnwZW8vBxOxw^VNsRn9l;`?K z02b_egZFM80tboy2O6QOtQ?3Q9ft;SR8UYI>D~nWr8fOGx5x4ggXYspeeJG#f}%5Z zzxl>3$VZeGKQy^l&U2G}Z6zf_wtX>~nY_ra*3r|yq4yOxr0S-YmY#}@i!*^n;(-3W z>Ec3T@zSCr>9Xi=iqHqqk-@Z~SM?5DDBV#g< ztdt@)n|9BhB-}iGARUVqsie6wc8cn4`6nx7IE$323Bi`v{QDzA68BHI60lHENXV;K zuUPU53fi(S0WcGJa-gk57s_1#0^qdgP&N7&!Rv{xON+s_3v*MAU{E#yE2{z)ickVs z(R42r+^h$Noxk6lY5r5w($cai*D@MXaD9>nkB5gxFFL@x@SXqN6V%FDMl(A|U(G2V z1c1$lqDix{v&(`Ss6j&Iw`fi3=`jSvSm<>o1OPw;9pvV_knvV=Ny$XLcV2xzGUBdX z0`^fx5lGApk9_*{scMRLJR)SN`zD}b9sWeiz>tWJgVN7-;J_Uoq1y+R6@^O=(=@}vp2^Y&Hkfv}dTU*X$) zOv*|I>^{qR?k0-+?ng<6KfZrw;pJ6^coZgR`NE(&WIw)uD8gWu=%>_|2AG)~tBuz^hp0Fz#z!&~13lTLeKJSVcrG0sezC@d)WW4iT`3 zAS5CxDyr@0P80)rK4Zhh`5CH1Y%-wOA7b z{7lH!+gF7hk}09RSk0pc4*c4ZQ~BY8ytK5}U zuxZij9vn ze83_TRFlI9xOZ1VD3+clyy@!I7?r;c%mS=m<9~`88P}-e zcmbGL$N;?_)sHABB=n27!94|#@qusV`KQ0Ho!LYUP7Rrf!C`Y!X9Z|gbOd1U9 z6I958%+Jr$Y}@u6>rKbFi6xzsJeJiW4&#pwp@e>FKSV;z95Uv&yX$wE+(8D!z%%9Qon<5q@j+gq7O7M=*-C(jPx|Gj36>zRGM8(;ode^VV;fomsZ=3=a zs#ViTVT{ zq4;k8Rp&FVI}iL>i;|0*qPvGSMt<5Y4ly&cqQ#N<9ORenJ9g00(#E2DVTG@q2j-zg zazbMendu6k7j?>oqMr~FLKhvq;vT^mN5{wO2q%SXarp3IvOCNHl|A;Q zOxQ~$#4drD`0`iCtqmJDDoIG(tF3iAKr}P*^RWcI5d|i>;)o}h33B-l9f7tULIVZXa@CIQ3!Wl zUS5jJwU3HM2$<93{(UyI1B>FBm+$?UK%+RxLZFPIxeRXncduA>5YCjAc09}Uha#A? zW|2eIi|FX?KYy;<@J4-5c_n}P@#DuIF?dvx6Ny#RxpfXQjVkakia&X5(v-=MbQbQF z<-mb6SZHZXVhV4KEtllc4+lwTTtYDO;WlT27+Vh(xSyNBAko3V8ZW%fTWz?S2I01|-v zfglc`dcEKk$`!thS(cp=2yr`atN#Z)#p6m;5H!m40i#fiHjg1gofjq=9sWGC3yg?J z`JaV>MS-+f>)*16nVI__x+nu}5xfTZ2lqd%wS51v&?V^@$&AId^q=D3;^Kk`sUxGt zf0RAQjKSzP81@gnVIXjum71pd?&BDQP z0c)g&I_>RCr5*&@Wr#XV0#{Qr?BBqJfX9Ga`cH?yoCV1(83`tWok&oKzW2Wrg*4;S zr%yxVd16o#kqi-ruxwz2K!{0KZFo!XV8zIf`ZL@Wo_dCPHs6)<)u5+9691K!hEDK0uLlnvfgzKd!i>uV+k+OuEkrMG z455_`)OFNilA0f$#XZzTS z#y$(9&Z^nl=l=cs7Y!y*3W57=dZaT5S_3BgMqskg5}!4sTr#oY4dfylkDsWwTu(oR zov?lh=FbNnN{|S0Mjj0YTo*O^6j3A)nwfS(IwV`M?2y?TFpbs2*KGSIe!|1|NGYB^ zeY;EwUnw02>XLxzBR%)k2N*vGhJ_^nt5m&v_pZl~vgnqRlY=~kD$WlNMi!9!l`B`I zWn@UlII#>I%K`OyQL3cALKK~V(7?KXe_1<0Zn1B`L1+-Zl6!B7qnF6*>EYI1DCd}8 zLZ0NV!i1w1GZcgwE2EIjc|>5>5A79S>?|PPQ zh5Lg19zmVyIA#7RQcPF)=3jaI-P&48%aMS}m@i-CiBt-Z=k@Sm0QL{;I~HS%=+5VX z|3%z8*8h)4iQ4+Vf^hH^QUeGG|EEhQ?fI`x?!+$|0Y%8n88Zgyq2jreuiw5A`4F`h zSc&D#zmOVH_aCH&noKyf&Die?(Vb<|K|BPr9{%y};VxUy+U8&_@GM*SK%~BAn>8Pj z;^N{8ZU#_hXLzdHCYg<106MM$rC23NU4fQORoP<$t=EV!N=ySYo(!NR-=^0eU_U4z zKtFE)Z4yHH^qV=1Yo#!f@IQn*12oehd=&pPXNaVUyK`qHQAr>RJV!h)SM=19#e8jT zZ7-3HUJ}@_6zx1c4N?K}KAH0Oqk#pd`Y{SK_fDo~5amB(5{IN&ya5tZrZNH&&A z2@ppGY@RF^kY-?FVj`ZatFO;^20BC^!9<`il}7m}Y3U#iY#8-O`t7ZU;f4%m&^x8$ zrKJM$vFq0_Jq=vdTtm0urWv^nXrd)?rYsK7 zVCltN3W<3H!=VJAi&>z3B%L4{N6XYAMmUMp)w0h{-cp1WC2PKQVW7>T$aA_`K-a50 zxzUM)2y&4<-_9<#Hv!#+uZ8xYqK8RKDvxt^{;KWK-R z1*e4qm;neVh8O#ZP7SpA6$T#;{cV^B$ZR8AkL(oytrd)0)oCfp@&2)Q5$vO8JgbI? zWPOeQSMt|+WKpnfj#m|ctBlbt$emS(S7M5#lBy#@EKX3UpFkfa5-)5v_{N3qbi0A3 z*bg7hV>YWv29hYJ^aAEiQ)0?A3CL!GHwk!$>`UfEFvw|cAa)$By>T#eBxq*!naO+# z@b@o!>Vo;g4=^x5eJz)o#mTI;9@he@|#s{zel7JA3J>jTIt~>?>wgD4t z8%$@f@2J(LISO z0)h!HMU;t;H8oEvuM%)_^5n@b3?;Cz>WhON9SVPWo)1l=JEANCmJVm*^XJ%9lfK|9 zQ4Eo@M-XWkd49zFXN$=ABP2pBZiZ&m?uv-)?>WJm-iG)_pk0rh>nQNaASd5dRDi== z3O)>>4zn`sF$AYtv)B|rKe^BoLH)1?5?vYm9&;npqccFV1bOB1A1^ zj*7x!WjE$fdzIS=N|v4Nt<+yPk)*_xK@ftIQz8B_UgpWMc<5y?xIV_##P&>pECMbn zr)c+v%iTo%C0z38Q7L#O)lfFbb|8Y$P%F#IPD4Y7@dKfsjfVkQ2fq zGXCYPaqSBah#%B>2F@DRxD~V3LJd?s6`*QhVH?1KA5BdOK;prAjS#d!s75Czk4^9l zr=l_6`t$^=bK)!um>tA0lrq&s)nxXEB_&I35to#<)0B_7QUkL@iNkgHW$McT z0!<1ox=e2oJifQDasB6K!plY-(4eNmTNxxYLFGTdn}K?magu*wex8gOF)pWP{E?tt z?4&_@kF@k_@8>(VZ-*!s4Q+&E7>tUsNV-=*rJ^)hTlWC9LdXtobc01P5by%pQ1VU= z&E=1Nd%3B^VyP6V78o3Sv)QB=t(XNx5S>a9*-2(5uzjEc)b!+*5Cw^a_LxrLEBKX? z)zi$g}X9x4Z&Rl~TmB)ng7Y(NlXC zY>vz<%A{6M8a~rk4IGs8H5~c%PP5QHoqQZ78KQO{KQ50E3$%eMkxRd#lky=hlUxRt z(m?*yBUGWm9T5`~n;875MTW6}2{WaCODq>=ZOwkXK8FV<1?S9}J5Wf-0FwxT;1MbX zHwWsV>5HCBf1nN8vwr=0C~{As{bgON+DUBNNEq~lJUH3FZP{TUTHG{P3h{;({@GZW zC&qxR#Ji2TBb+oFZ3kO4Ab6-^&1PhuJHidQhD0*aWAANZAgKK(tZUH66yVgXOH|`T z6l9Bsdk_~?nkHJ#>_`PumfpJ!Do&eh{`B z&|x!gbetjcX2Ro#T8m)l7F$C_75w0J>>)uS)Us>5Ae*gQq62tKR3=RFfU{qqQH@AE zEV~$SG9EJ<^6wE0=$pY%fL5+tNeC5UopdXS3U;m(-I5eQ_T>#u*Ykk;o((C7J!`g7 zttfJFJGj^cO)(4h7LrZq^QsV^2%y|6;_%9Ds1-f)DJ-2U&b}tRH|ZmQBCqSB6R}Td z<(LNn+5(=v#6qzCrL)f{h|0Z?aKwa!euloxJ9nxwGkx>V z#1O=J>Zcuaj|dQr7@~)fM~00AxXQ;@jhRrpO8>)}`8M&{=0911;5N}6KLtrF6W^?o zq(Ri;!x2AB8}O?b@E1+stU#bl7>T1%IWgx8snQL+{I4|x)HD`Gfmguk^v5r|5s-`! zg)~8tFAsWaH3xvUjF#cNBxMRB^p}mCg;6N?+{|3+=nus+zZp=HWKb=Yp}7$>g?|~` zR~4)cl8|w|20$!>JQa*h=b+@)2gr%WqZsXdqS}Y*NCu?De}MAY2R=mv1oX<7xCn=Y zy2#zPpl}f`J^TBqMJ60c1i#gs9P@@Tt@am;=`mi2raWha&QrE+CKsJz#dobt#d^b-$}a zF??1ac?--%20lO(0z!JvmyMU@8#zCG`gFmfaO57*Ls3KeV2dOZj5~Mk*lTNYVT$K* z_wI5aqElw#3CxM_Zztno zg!kPo9+`^3&UGbA3l?aAAFQOW5RKKLXFtr8ZvMpl0SS<#9082D+BJhFgnM4_&Gp@w zC}KyYabtB5d4VM3VG@TrB7^3h)yH)o(F*uh_woV*T8%VX#y8BF2p1%gg_vvi7mR&` zW`!t?Jz@R32bPj$lP73YJd%+_4Qi8Ky`M>Mqv9N#t3lu)2A{*@VeMcAFGHtMLNS(^ z_^~V20|rj)BcJ|zYJ%lq*Q|y3MqDS5Ig7=gv=Bmf=JC^~i9}|GwmLgn#X0ew!J-FG zLpBJb0b`q!H2$z663v}~-}DP29_VFDFVoWW{eNdUbVwnJ)K?H@a*6~aE;5A$Oq56W zL4*_iA-c0;GYa@c;{Njw2q5Ks6Fo0M7hllIe0*=JnFlp-Xl8!dA$RgQ9^D8gPXg1C zpv*}7=z}jpl#x_qw2MR}eG+9RQ7%#xbtgzAxCNNa0m;)1oB(dv+n-vZ3MWsi^VB8G zDv;t+%URE3;0+i(fdnyznSsbM#NLUbLB}{`M~cZ5TIV$~0bQI(b;Z2!3~)X%4x(Qe z*znRkM;4Pq7ep%s%^)BF*s34%7^vHnz$;k$09clSIdxMkN)}WBwotzrc-AI|;J1V; zpkokJhwelSIY>Dl-^m=5wglq2K_gT{jm<*OgeqLs*4EZzcw8NOnRU5rB~XJ5*a7hy z*X7%q07f$~4*0%(`}P$I9XWMHY%|0IMNUhQju9RG{1HwD^yK}CP{O?Pz4z{DSOCvp z)rk?w+xI2|xL2u20i+}1N6;y9I10>x(n2qMlRZQ3V+eY}a<5Oj;*LeD$9xxxQGK65 z1cj2+j5@<>_+_8S()<{iMh8Kb#33b3e*VJ092|rNAbku6Tk>XMbs_f)puL;1e+v;) zIE%*p2}(mHBCHJ)rpF|+aKCqr8j?auQ~ zT2EXTI3E?*6dMB5eXG;h1^gxv4FqMY9;5~)lEcx_Qba~?iAJ81<20IiRGI{|+!;YdFg7Lvt5yQj1IY0S zHJFin0Fpv$k_BOb`_efU@kY9u=QC?k#w8^xmY=BziWD0VI^kV} zxd3%AFs?s*7mGn$s|1+<>yiAI8Ncs`O~cWyxjH0XUT!WSF8lZImykTebpx*Me>Gx~ zkr>HINctbT5OGoiH?IWfkJ}@5+hd;Y!Uo)-B?779M@iHC~QiVrjJAC+E&v{5shPWb5ZOLN*OvAuXrE&F|H;^<25OM2wF!#LM zrCWz%V!Cf$)6mcu!m~(*o1*i>XVLrOl&cN9*-z>dT>*u-o_OJ&=r~BhwE`9X_LW=2 zqe_Hu3{5ow)QGyKzB7;-y7(8^>}laS1sy;XeNJO14h%vM|06|`Nk&DEfGc@0Rc7GKvWR-u2ZK&0EO!rED9|p=YBv; zfYs?(K;@1pw z>zY{XLuHw9eG@PkB47X|8P5m|HKw+i`S}s{fuw{bzZORZZSawjlM;}4mVL#8Ei;^A z`-+e64LF&y6b{>%mPJu4IaNt!)HttbeBPG~oniCBXzv>)gI--tP48v|!7{&Gk91}R zmmxwj$~Szxi@Gj4Tm8O?O_r|O0zZfZEcUsJOpa5GJL|KuR?Npf7;mMC)!3?hN?yV1 z0rmG&=iaq$l+fqRd!NE3aOuLYi3HDdx1!6t*u3v3yMGl|VCOYbTpc6b+{QE`sP=X< z&;8dfH9T_FSAPGs8$WJ6879*2%^9w-1<@1+w^x6! zRph|8suV3n)nYD$OP`MNyR-9KJD0HC;8h6d^X*)KBcb{E4(|HHwihgAzgjN1;FOvy z8Y?+Ek<=L+9Q+z(kZbMQwW=yAhrg!3wcW$6@%k?6e~?*Q@iUwYy<7S5BR9nq_ck&3 zBsloJOmXn5gaj{4?=nz_GBD5fbNE|Pyi{_VGr5KN?$*)MU}dXCL`3GNN|tD=>`}}q z6yQFD?g{`(;~SBX(N4N9?wOsPr7ZSNwS4Dl8>cOR@}rMV%~TkfAEb{bZQ+NsZ2B{w zRz*eSJA{;It889+dU`>do~`h*dbzLNGRk;=>zVUx?fv~5L0#<~9Usn@KmH|p1Ug75 zYV;S>zt)UQUaf4?+b>@-V~v=zxtPRUydjWvfC;?=@Oj7myHVG56Lxlw@J(v$YRe?# z-c=NsM833hK@*yWD@4?u8nnXD$f#(_<=-^~ep1gdXDpr{l}S(WU09qOdK?<+iBjhI zSF6DGt>qq!toI2B?1Cg+4*cbdYVxZk&zj<<>$(tBpo=(z@9My$6GsqShM31c7$3Kp zN8{0Biu7u}yY);fM1ieOICUZ735$;gwb{)8t(DQe0nB8WH$`bw&%NOpy-fIzE1s2JNQ>3$SoD#mx~{RCR<111hG+ zsePv~TP$);(k;#_V)Id5sxAK zX7td0w(Z(A)%s`q?%nGtEp466lS)cT?omO&E`}eQF zS$k~*xQbFDCz>P1<|dDBhDY-(9@e7hIG!hSbB;wDS?_cd@pRw0qkj&0bBT+KUj`;6 z->0cbFX6jqJwktcsEr8*(22nkNNTd-g4l}Hl`RTS+Lsrk*7mznNVFV&}i+;rT@OPw3LF$&9)hJoV$QyhZ?Nu@Tf|1>eCa} z%#_QR7`0@hcbo73nAj{AE_fS%g?GBN%lXeoTQH{MHa+r4{PME0+rn|qD*B&)FckP@ z-_Txl3fLnJqvLQv%as7<2bgLa8+Q#f=iCPp{!rl%#G-35Ffh<&-$C~0dsEX&3QE|0 z+$YXPmy9%Twh1r(37oo*gJToM1&{qy09pDa&=}$bYhdGLD;>nZXMD*4WrM1olYs zkd13+F;bV6mQH9b2Cv>tG0@X1H$!+b@bL2+cyp<0XjH<`7ZM+D;u;mCk=ta`@l*W8c&Ch{>LZAjObBwzgc^=mqPZ-Bs1Xky$@ zm|sRmzX7Y;t?zw8P%w>5OC9IuJ_qfdYvamqHW>MWGrlbV%^bFo)2tNRO-G+|XJv}9shEM(RpI59kY z8Q5a3ea^LdZb@re(emlmGarOSTo=PvTn7HoV=5TDP#hKIhN7N^@wMfVUKEbMaFTeZ z3q+p0d-v{*UGw$}zyJKHKz7qncJA7xHe`vNOUy}aYHFf7B0yRp0#py1tEBYC+s7v~ zGt$oEy&&gVP>x<>zms(wQi=8UX$lqU8O1>Q2 z^LzLSYjxC^sj(^A95KGCr`aV&T34?g3h?*WgQc^&xw)XVCT#9R1qxGTU48vI(a%7B z>aZ@0i+*lS($4c=ak*rEbYoRb&2?2()uim~U?TFYxD2)X>J}!^tE;G}4TryPnGr}5 zK86C3Td@G)=L&@cWuBRj2=h}tCbN#*6n%5^&p^KiM=h(XtG|PAe6R#ycCU$ z;y-X2&K^t6Wu)U|}!@@C7p|<YjUtI=Fu* z=K1p#Xea68wvJB@%LJb~b7m!QO&Q=p+SN*byVjDJnAO0v6Ap%rSi6oCZXIRi@mdYo zh`!*AfK7h`NV@5Cm(-`Y!RxSdKJfIsjgkn#@Un%)77L4^DbYW_@wS$Y$Qh@KeRsEh zy<=o(h<*0U84;Td?=nM~TGt+VrXGpM1z|WOEX*ngR%?n|eEd=H2G+0a7K&P04=enb zNXr2drBX9p+v*zeE(abbLt|qvr#%-gT)2Aenx|8E4i_Kaxe}L!VPFU+2#6sxj|Pt!ZQA6Mqob^_M|?zc zE&*lsjH>ER=uN9qXIf(pGsU5k?WpP>N_>@zaOir5%hqBQ?s|B5+P35i{LWvxi3Neg z^1$1h01zZY?%d*-*~?k{NnS_C7o(zv=7>j++|b3W*|K$u%IEKgi8%5fI&|o`-rENb zyZfyQkJiNf{bNQB36a%3^L#5h>uKaT)X1gQKh*;7>B`@{xq_N+M?<(ph=<1-J$-#} zZX9c;cf2^t4__vQA}J|}R>G@(`#KuYz!;j-h2YphEh8MwQBhUpx37jYa~%FMpxaL9 zPv6t7tXhsnNEo%3v!Yq>Qj2zY9?r|j?V3@yP|Eq0saxWry-g1Bfqht`PfegtaImU- zg>zp?2fE`53YyB=FT7+mnU105B5Kmo(}4*vSvn1!`9nqgLEpwEAy{@!J2(hI2!HC( zR<~*W`i{l2*W8d^z7gZIR| z8DM%h-^lEYVI)hu)b6yqpfe%DrpXF4CtbxW0Y;s)wSVl$7KR z-OLB`S}w|8tO;7YPN97nL{)00kl4-+w!m8#;B# z*ok5bv3vLKQBx8V5)!5aH*MMk|Ir(|xj3~P6gvjN8|{vfJo4OFv&nIKct12=2ErgI-|>_hwzhl^A3Pxat@D@;Obln3j~=ar5KgB*Bvzy6U1IHv za>jh*NX6p(m>h7Af<~ZZqoh4=B^$;rTEmTh9h2#Bj_zb+{3NoO!o$mZm7FX7f!WLtz(@^a<38a?YcPg6oHc39ms3atmV~>{ zhD!=4^sKl_3&0`#4+hBR3ybGs<3CIFZ8%1t1rD3A3kWW%ynK96^qt>}7=UF^Q&ifSIZtFrJOUurF4{MSe(nNqY zP7v=TS_MBl(}aq{=*T~m(jDU;DmWdsSA{@{IW8a|35VzncqPswQm$!#%~n=ZdsA7t z9<}}rrqXC$Y{8b868NBAbfVcp?A%oq;&VDRYyO1eBs-Y&LntDbaV4htTtDX}SN9!t z)&y*>)hKZhLHu<5{{6oHT=@AaYYeuLd^_{dXTR*J5Bc50bBrvEKL8jc3B* zFc-XxqV3>@;>3v2Sn<;6|@fJ8oycU0IrIQ)Vh<5Y1g4xT~EQo#*6BTcMa$nh&H zaZaFpU|^G!)JU)pit7!S()OINS`8Hg4s+W6>6i)DW5@2@zrPkXj@vLOjlP!e!pjqG zdwQ)3`uAVH_c__qO08-{-?#d$0sHpJb7|YP*6}$V=5D% zRH@yeuins@cEGRx1`1%B^`DEyom-Jj*U&|8z-@_gQ`*|P7tO>;(l`qE1!JUBAkvi5 zs;Wed-=>ujVy>IfA6xJ?G%(;V-@bJoz7NF>>ccjAdM~^S?8_}~qs+Bi_LhG9xWRR4 zK>($dtb~qLrbXLcSSr3WG~Dy?*#u~6UpaDYT(im#r^u-3j#JPVwr=ov^!Rbd;kC>9 zf)mZ9OPAJpoayQBe}m$aQgDhM81fC)z!QVGD{z@kgOfo6&k!)4t_ae{WAUWdJT3l*S3Erj2)g! z^MAzZ+LCCiG*SNrEcI(>uWzHDyp zi@vv-ib@aW5qZ>UVNDTG+3%1d?w;9Co)vQs^6zZ+*Yiicd`Si0o&*ZwR$5x(nm299 z-3Id0DNMf{YP`PKI@ED@z&3pZ7OL($l&ms3d|;bJ(55TUq3&Up zbby8B!H~MRI6N+!AyzwK4j95~v>i_W;}{JV>sv0DftXrl6_s?DB3epZnLtTP(Ty*g znfU;NcA(HZRUACG{D=SPnomD=%+uE#WC1V`th;fEpg&}D8wprzQE0Xc+QUi&yG=pDq%NB;hIFtgMH z8a>X2TXrsjDEvisE_LTHb=d^y-7Jr(kY@xpH|N@riII?#;$OSqQF}3hY#Je zv-!ir!;fQ$SFc|EG?K5n0Asp$kdJ=t)6YVdwgPo zEQ>ydljmh+-=ZOeO&Aa4z#d(W@%3Y@2a#0au?E3<6Ls4C2F#gY9m9-|AE@8Dbpm2H z1#dzc@2lTPBxlh6$Km1Lm{^}hryY6_`L?>68f>5pTd1I_N(HaCy1II4MaBK!D>>xP zom+#XcgM==V+{8yDd{c#q9sgj2G(ZojZ$e6PT|}j`V_;PYB3lN9MB}RwPbOEld|Nb zmkL&EYdb+DfUSO8Q9@_`|tLrgaeCJ`DrPLxjnJBS+R^)OZJa zw~$Sb8vry$3G+TVD12mPFaqtIJBl{bQHJ>n&KQzjH^_CthwC0*NkgDGUgL5W@RaNN z=RHKe0O38bJHV+B(qy=>-DW67)qhIo@*kHH53$oRL;zqg(sC}lmd)LR_(!BxwNyB@B$ZUji9FQ1_oqE?UUb8z>OFNX8rzy37;odmVbQxKXj&)i` zXD^h?{-2PQatA7;BecAmf7!|g|pCo zK1>FME?R~5T)#g*dkACD*t9HBBV$j{=IGkOPe}R$Mgdg%)Fk`i((h<*|8hWWbq*B* zxg3%SsT8P&r13#XLJ?4Ox44%jK?G%oah87|(0ar#ic{H}H>+0Ora%pKl03w;AGZUR zOy&##>Lidb{ge$kz5-q64CW-$zAQTd?1x82%HX1T6dq13BO^n02sa{$T%Pfjq+Gpv zwH;N?miAb6@$}cyLtvaxH;#k-!RJ-@^zqC0n0YY`c>v}gmoy%ou z!H%E_Kn4QIkOJ*}eO@rr=%I&aI(SK<{E?0e_vZsx2hTu-hYQ6Gm;=hA2TZfi_80he>s+71a)ImcIknF%CFK|l z!JF$c}Z?)Ne7X@k6rI3-6Y@c=5MaJdV2A&x{_%J7FKfumb3|0$>QU9-4}8 zMgc@+!%42Y_wM~7**-gd6w(sTQ%evWh51E1-d%%4!hCDLjg8F>ywAqYCCCbCJ&nV> zBl9!XD4`EJdkK&<2y?WYQz4P(Jj+XV2xI#XRaIyAZM}?l<=(KeI)f(M(?9ML7!>4z zevb}b-qyy1AnSqP4=cfaJY`PP&P_hh`EJ8EIz2bniGul|vhuc<*9N@Q^vdYG`@07$8cicPEnBv z-i_l2O!u{aU@bs+IZ6m2c9{2&{laEpC*I*eGl8I}9xuQ;og~)`*W72stXt4^@gy=! z%vRu^`t1UgMZy6yBJw1d+yk(`0NsI?c%oPuuUqwisM?7WP3px?Cjf|=;x6;2WoR0Q^7-v@)AJXwplCWr%o3NMAchkJaM!ME)_9jOmEg$=EC zKlTu_jn(?pXmve53j{!fE*lwn0t~!)`*yXarlwPcc>`AbQAo%G*vQ_#e}4dV488rV zhQ@BZJD|46(GKHAtBn>8<2_||U8=E|EI>F#%@V(Sc^?Rh2fF@;j~~mwe%+2Y8W3E4 z#mHzq76b$`V(3Gm1Iie=AsDg<&Lk)L(08z`UqDY#6}I3^6zWVlqVegq#ANhEaEje1 zs%cqS3w1x`$uR5uSsdWawd&pgu7Ljnq7$9{_9+Tj)VkFxQSeWzsqKQnr-C>UD5REQ zLa`3hDQLcLe*DO*{Yd;k8M|Iyf=$Mu}AfBg7c_9R;?ii)vQX)LACqU`$~S}@j9C|gJ>S`fybElb9< z+3KyNq{P_D7A;aJTOmY=@BPZ0^E;p0@B7F1+|D^OW9t2Wy`IbUyspRfcs!oBZ>vLV z#3Qm~O9aHp!_*lUFJ9zGDBN=Lg6CL0R>eZu`^_6UIXSI|G7w}wDFReRfa+O~FUDAV4XCp^}DMo0J)3bis2B$1|qPcG;K0)VfHy6zrns zqej&k#J1oe?>>4In4D~d)=mxRy!7>J>*2$L6LByK8cBc6X)qf{w>)@`=7*whJ!xDK_-TT7 zxxOr6#`FHj`19w^InA5b$i~J-HqWeC?WhFSQ?rpTAYp7cv&kQ95P~IY5-p;501j|v zNk;wq>+%9LO6++^#h{TRL%S6|s)=V_?>>0&;$8o3eZhQR+-^7PGWLasVG=8ZkN_;i zn?-ep+#mUG1@IJ45g5JNVN6 zg9r8L3mm2|f2+>7gG-avd}|3~Nj~+Z50w)~UzGRh$Vi2P+~_cDf`TPJD>_%&k40wq5Ajv15HYF4Qd&6{#(#B~8H4%2bAxSHCV|_+nwG zl$Mqrj*V@O+%ARmJN=VdYnKoMGcyf7DT5qJInkEPGGNy(Eslf_pI(h8IW+3ks~PLI zwmL~LjHfR{&-3tKf2jgVvXhtQTAiOaivxswL_V4rDY+Cnrm>EWA)p|HDg&5w)2EKN zXBw%}WZ9C>@_b>$HfpN63Kpv|<~V|M*#xLPd-vupiJbHvDUi@=s*$?2rOy+-^*VDy zIzsrBVv4nB&6|>xI>zPRxDoW5HvLX(pPOq;3=LKI(*zKV)5=&U+5trCgrX(+>o9bG z&wEj7CKc4cJU?>!bQ5A);d&gG+VVKwr!BVj?9%0#>Jt_m61JGie$4;8dGqdf%YO6f)r0D@$;oT?FE+a0 zdgA2CMocZauEX%*f@=ZXDhK`n)@N5_E(aKEe&!#u!mA%#`my$P;FjeTmnOR}kGZrw zCNZXGhRTm`m$LZ@)sG;hO@lr~z1jo$)=tW1z+XYaLmz7jnsqEno@~&dL6;_xc642` zeEAF2%^4XP?atp}2e3U;DOy;O{y@!}vM=Y7NqOL)F5t7|yaYA8UN<535I{&mfS<~I zSUZ-7^buE2-wiD$`AO?HE=F`rO ziJxZ9Vy(^~H`DU|@nM0%v9iljn->Ecy!ILMvn#7UI^C8KkYIglf6z;km(rX#BOd5T zRMf5NuAbT7Wx;pq6ga)bjL8#j-?>wwdWR1HPl}uzviAInYdXbR2a`ho`fI_ZrCzKN z{>74XPeGizcJ<697!g{toR;@Lf5pHZw-!hDKbPendOBfEbhlBLFTRh2`^&Lbl#-<;MY};R)o{9h%nxR1ANq;a+QAnR><9CIY$bDUh;~6C*os!Q`0k39h>-3-5QJ(uOP|D zpx!yno_#+jf2^dF)6U>;<(Rah1+1Du^X7GizI8Y{TK$hdN=Cc=o_zps5iGxS_n6L6 zg<-k@z3ycXyN|e-G}qP+qyW-d?Gf6H%BT*#fIa*77Zc9ilSV^Df=Lnps%brWa=hKl z$TuS+{Xv|~)*UjPmBh}WHj72L`2EeSpDibv@pK#C7m|mQ=B9%-z6X5lo8GgwVC`|8 zRJKLSmRB@CGet;D2RzWjoG--8YOe1;<6og}H2e5(F^5m}& zdYw^0Mt$)K7Hl9GrxwW@$xMV13jV$@D8H6mwy$@F4n8_c7q1m7`ccq3&zY01d6u9f z$GP`}xNppD>>qdZ`FOL0_Y!qUSqqDbHjvlh7CXQ%Lv&13 z05K$E=2*#{ka$8`AZC3bRtXp-Erz@VUkdBeSFfC*^#6+_knMcka(%zxo_v5L4$PBe zCx=j%s0s0y;6x>N+jZE7Re-7^MvgS0ddGjZUEUWy?bEwlZL&eWV%+|BGpZIeX$8bh z5PGoC*_3`hU-m(72kR|7#>b-ksM`~a2UH2my`s3Is zQ#N%Oe?odFisslTL7R4A7cBlOwyD5~U%4?!e#rpvMS%n8&!wGeeSmd?``QUzYTT^u|vauU6JAxc^??6K+n`}f=T>9ecaG8r5P zAV~<4P~8&}6VqsX6S>#ecigyb?of@2bn0Yh$U{>73jh-lQ5S|esaxO2Iuax2 zJ=V%Gk!lEy>r+{N8_*N-P|cF}vZ=O>1~(-V8yOmonKn(81s z$Uh!o+^MZ0eQjcuOJjb<3_Vb&`wNb34u`=GCLchD7EwkclD1@{^X6b<(kAV*_{m1} z{e_4hHyrCQ7o4yE|$l^!QrpFRYaPflI z8`(Z*BVawWu4&PQRmEEej_an~!U8@iv`_j3(q_WxnRlGnxl5N+%KB$KGKXG=PMyYc z=sE1Ssj!o!zDcJx4Oe$n!+OQh#Dd7kcf!sq3K~l(BjAn2g3}X-fW+1I9Xiw_8J8~n zw=MVQf)%>LVG%GBJ+IS(1vk8pO)7by^&5yZY0&3sd*oyxY8F}i#-{4BuNNFJ1KX>T zKh4iQXyp^cQNMI?J=V`*kU>&530`*(55Aj~^~_?f=rb*8)HfhY?FR#g1A=dTNnmy+ zrIM~brk8N4nlZ-HV&aV(tE&$o*OXlDoVnR7=>~7wBsov^1ra$&A3q4wr=h5VuOLZ_ zbni2I6m%aR-Gvz4&+DxY$ktchYiv8WwX}h-BURx|Xn{F6I2_hug-!B(87#Z0g^4sY zrp1#?)~jFNBmFI)@%@Jn1;@=(yfzFU=OoXPZEH#Sv%|21oynqT)l?psU zzom}xldn~+rvX_?NTt)TwfuReKso2-%|4hX}#LOO$xp+5e zHE{ZpL{%TENf|$~zn2y* zR|fVyZ!C})O#*p`P4)kGBFvio+VB2jI&Y+vM&d3wG5PNjyFFmygCMPzM?N=_yoq#> zz;;FU9r-6*DTh0U23~_N(Y$qQRd;vyGRO61>mEOTOq0f!kD?=)bJ+hnoPsP=ZON`J zt*5p4&#R8Q>wTrML6TF5fw}p<>0@=Yv;sKLrc9lhnxC)7x#Axc)q_pCDz+1~mzMt|cGT6E5EA5*$XTUdwSRvwZ8>MGjQ=-h9ol-cNdOiH z&Lrh~AXVcHxrI!vLN9pJdR|osL13<5tE#N0Pv2ke@VphL8@+%7-MmP&ZD_lqn1I}O z()~_zYpcfp8UOpc*be5sW+tVOVJlsRQhiZS2_4LB&S84LPfdol;)F|ME|*|&wJ7&O zQ?fI*gdu8~MnoZgx{w-F=xa~I99l&#bRPGpE58ve3(KnYf4)aHoLTt)OXQGBhE6d} ziuOH5>V-{;9}M$cs#2aPZ&*ucOboSTu4uFQswf;{9U zN0+VIe@7G%%eE>VSBN<;gC5fgg8nF21)+KEw-?%KZTm^flB{e1euuazH{X7 zq;M4KQS0S(P5d|apmGq30XZ+N+N@szX|5p&mbCBb=+I{fWe*YI%xp-31R;@ait~dS z-KZ-NvB8+ryv+=Ua0=%IEk3-q$qt^Q@afMVeJKW6AXjJX88>Uzp_2RmZq;2Io@{TP z-9UOuAh`cMAjR$su1AWd!Mu)oD|cM{@dV*$Dst8Olt;-%VOoW}n!pNF!!jXNu^~%9 zNB`|o$U9Cm_)kQNEa_vgIQ31`5Yj$?(K?VGqSreuT-XHEGC5-V+`s62w@yAED1}f=?u)3y_~25jNLh`t&wnqy*Y}??*S; zanWlUwde8wZpqimkq*Ow{nDf6wNmvL4j`!s#sFzPKDo4nv$H?xYJD?f)1}hWepXhd z-mYD{+QfPDIYZL$6ab*RT~O5VwDTax^flNT8tRXr3DCG6bW}#>zva_0O`N5#0&E^RdQ?~o$bCYY z(5B?g{&ctSn_f@7D1BLC@CJC`PqQ4F%%#-hb5^Wed4yJytO%^2$b;fQmWaOpT~*WS zOjC|*wDtc#B*kA`1os8#qR^u2{1-@~V&`QUa`#efwqI^>1)WtwuOfyjcF>GJ}mRt z_;~wTF4oW|n}AJ4KU%eL$6O=&SWxHE$nc~@WORrKlgcO+{zb}PpEveczTBU@Hjalg5tqh4BL&7jv;Dy!-|>CDBf~c`1cZ>6^Q@Z;4&Pry~t-Yqds)RGYao zP>3wg1;&+7!Z3w!@JZO5Lwnh%XU{FG?`+w;`P8E;w!gSO+jgC}y>{c8M*q8lM@B)u zr|in>Dneb*9$|^Ia9F@XiU0w7I(BFquj((0g_2Kf6)_kc4gy4@lQ33upr=Y!E6ba* zI_K;k&Cbs=H2fEQAwew$apsvPSJf-60LEZRbjoejS#sD z9Fp6oQqACK8P`Eh`0qg-!ZAiU7*MGzM*#9F)cif4W$Q%=3Bi zf7kKiq0^3%G7EfyFEWSUAUK`85AgW(^0oZYil+l(P&aXmzgdjpbORb-%x#2)KtvIy z!=#&+jz&f{q7Rr?59--}!dlQGOs-h>Hs9M(<5AVX_jj^ak6ksj`K!)$`&w!Y zz8jh2YBm{5&#QTPd-C!o+zU1NysFiX{a07~p1vo?_(J4*!=UztD&vk-s;dm2J|)NU z^1$!!)=Z5{JF~N-X4S1GI$k9MA}W@69qhk!NcSPY47P?Xp5*3I$ofJvJ9pv2(UT|b zU!Dgnn74Sb&*67nyL8Eq>vt4F(emZXrEg8^jsBElvempKA&1LZl7xU~MS-gswoVRwdX?ICtxczw$Em~p1!FaH|UwvHJ1x{Ye&3B(Xxe@hdgh23Hno@aFQ|2NVN#{u;K`9nSp zU=v8mPjLSH`Ew+2E>lDu#9~OOWG0r@@60>vv~GPvBSOX?Dk}eE~Ow{JfQ6J*IWYSi{#f zV%xNCJ!bOcz<_`TBstfUCbMzO&CS7Fe90FpFX5K3J5c`M?%nnLJ-_4ZJZ@o?bBg;m3-6{3wh)=V8gzSXK#tHz8UzeCyT)t91O0Rb87-)*%u z^c~c`aLBsh<*!-xzLW_pq?;ERZy`gRKmTW9XK>YZQq9P$WGKgR&)GQ#a|4gx3B#ZZ}krI+vVK9zme6)(0jaLd<+O44Jf+$ZQGuV~u8bIpi_qyZqAlZ%TAi8RV<4h0qdl~Hm(bn*VY$An3fP@L_m zp2jk{c+p(`kv%Nzi`CQsw40g;np(IRsrN4`<`<>rn!{#&`V@iQn2rx+nR|9RV)kHD zk!)ouR9fw1kJfYM93Nqjn3UxB^5I;Ji_I;_S4sI z-i&2Y@-TZwgco4*L4ZF$2yyU`#4WjZ@%YW$A5W1)W2=r3QqNCB4m%m(O^?5^fMmrn&ST%GVF;{g5=P{Y3`jpkb z`s{<&uC)>(2M!=FocVNusq)eAYC9SgWmh(vX|IlH(|hjC^;i2kGH{+Xt`jHzIil?I z%*mKaT(alq0oWXW486<&2DrcW{)=bxENbUD^KeAbmvHKKBMw|dPk^)#tax69Tljz{ zIXO%GC$sg54beIaU0r)0jz}Hicl-9J=&uGdAVJMuyK9T_`PkU?J9e~^S1BzOIT=~I z<)^4*_K#FG-beTD+SPy^4u}sz+;Rs`D#yC8W1T&QTDBv=JY?I zTefRWIBv9=MvC%zf;6{)(qqv8)7Xa0qL-j1eRIb%%9%{enXwSi__B{KGb3& z1vs4i$!poNjh8Oftk?9|R3sasW)5Q*FA#mjOZp40uw_ltC(Tc_H!qsPM5eAbU9;TV zI|B2l#GIa&)&uk3h+>D-TXMP-N0)xlKbI|8vL0lO+m96Vr|XwrFZBemK$o$l&4U@^ z#;Kqi7NI1ay48hUMi9xv!ozQA#vT7Q+0pT)W(;d|j@8L&%%H~1sK5Un^4+P)$~UiH z7Y#|Nyq#9yy{u2)zIDG|9 zn!pfwSb}V2zY7Y_t5X1h^Arb}@;9WFW0sXhjAQQM-zu-*%%R2Kpt@1nY^wt3jdmw3 zH+TPZApL~tGj&~sYdrbpC z+n;B$>A_M@6k4{gym$Zp)fcbc4QC?y=5J6c`=h%~xO|qUFzr7)U<*kF5Q`yT)tg>i z*-_0kTs|kl!}DX;7F==2B1ixN@4c+d#@|pU#ANSJ8xTgR{QmhT_{7uJ^+HU9uw`!E zngF?J>sEUn0Sor#0EuMIu)-O9uX0|J(Xr49X>)z?T(*KIArXToEFGFU=XHvw4jK1b~^g@Bep(^N2jDNGG567EO^(gX%HH{@eXij-qSpbpiKzKOK zfqw&e;fp;E6J(=p|_%IGW^Acw`yuFgTW&*oI1jUi1(Yyl~A#LB^R+ zFoD9XE5cGrWiU+SZZ`M!sWlIC*a#Dzw)^I8bD1X_qCd4+qehJc3X}cMAGWSo~cL|_xN#tR3&Z;TJorNf#%(L zlO^$^XYoU92S!mmq&#=IsrGd&?V}KW-lws$9`7 z`$unxw;iO9ge;+%3d|mQ(dVL0T zK*8CG;p3O>nZ1Y2m4;kD;W*tm>Mkg-SE;i>T8SUyeLRJEJ5iu&j04b43|BzVl3R`ci zmEsfE9(yQYA~n+rHsN+p5jZhYG)R_pYNb1d1gW2QSzG)*f@M_kbb{HPL4=8evpe>4 zNE3E5Z;$S#h`NP_obTz=-SpRe_mELS;6n!~NPS1hAPx)J8t_yCaiRfGY9ky#U=P8z z_}ON!^_EM2g~soJriY5WNQZG6+YC&qNmv)J1zgrQi!M{HWpzIkVkPENO9~Y*tH+X~%bL*;qQl!aR{ZA_``{q5G`lw#3%$!}o8@gTSvU0>|&@ zql!ZD%yB7kjek*{xXKnh}5!O#=z7A)w> zQ5=Wsu1MkW1oND~qt@P_QP|ldQ}ci+GthHA zF>f5K-?=v#s637N{lK6U!{*W7)okWJH*a1A0`e$KsY9yV9+eS~A`$6DYh4fFWFXvp zo1dr+wCRt^7~lP=qGtfV2~sZ)qe=b@y2cQ6Kpg$C+>HXoNxJJn>Y>{#TB`a(BsLa0 z5JQ`S;*AUcOreMle0!o9S3+GwW%B_;P-vFg*j=R1V||8geCgdr$`}aKqRhg~u?-nd z99tsk^TX+MI@{g#s->)MY~J6Z-?4xjoQX2Yh$U0S9SVaT;JiXgxfLI;cRH0bL}L_3 z83?dFZ8g#mk(GY0DPI>D9Na_{^ZdG9;EGxJP1@Nxi^kL2`x+9h_lGd*6siV#VLYt| zDTfT{0K0b4lXHy`$%_&V2h{*Tevyx2$l3~sQA4k&t_7G4J^uGt3fq9ifVgJfxpNI{ zbfo`c(_`}&ED#W1G8BsAJ^GbnF6Xx*SC( zz^?yY^TPF5QZj!bi1SCXg7{W}iUo1UnmX%Q3+X=(h&33Ww`7nGI78aQ$4;D(KBw98 zI=T~Ciy!FKVic-DH$5Gckt%ExQRv9Ia}%R$gz%%sWa@MV|3y!wyt94@}^%?u584VjS6X`%p16}U_<{v^w(>(txiX_jPY9L|R!8XrjqEh3;<9-Pw~@Q!F;RdH7eVM@;gE@5V>f9qUv1IfL6Uw8^8aCiK`8Ok& zcQZFbZ0JG-kXQE&VcBMUJGDAHgX_A(ruvF?{1UEPq3eVrj|W+i7F#K{Z zF7GBH6b@?tbepQ9j%`-}D?klt$;CGtwpvv+!k)!!qOg0c1G@Wb#y6u%z^*VA#-MbL z(}p~M$089)@QMNY{1;QX@~S7K1s*ZeF*1U5QuW{qZ0?le4;rn9b8Q#T9V96d4`+J0 zqO$TD2HjPIayK*BBs=_=)D;wZLV=N!EHWGLi7n0wk`wC5vU0f))J4_iMv>XO|>q{L)529^z=HkY+Q}!^j^A&tKXe}w8z#^_x>0063!_8kh9-Cxqs>6;Y}aL z{U{3Vb%w@nEK?I8KKLVSZ2amtVgD3y^9_iZM$4z~7LV(xeh~TbiIXRNYi_F?6~I>Jg4$rPEICc zev@clo)DE9Vz=P%h5GC1tzZB9pUh0BS|ilzOEu3%8HUA@k@N;g@*@8nJb!#=4O3{9 zb6s82Fqdg~{8qJ++zGg4Hb=Ut_BqIWn98(FTTMwb!p_dW28BiIonOl4#8%z$9i;4cW@v|&U-16!O{;F# zwr%fI$|L^G3g4z29yR=mPMXkw%F4FLl}K}g)a_QhI=(waCymqfL5Vl<|0)AmosXY~ z_^zlW4+K^~!$Uq__B!USYHkzvGfA736@0Du8Ik@f|4x2{-dPv(4su2| zSNIJm`2x@++Gybj0Ow3#p)iDfE9}~Gvz-65&0_AX)^QcYp<7In3J5J5 zUF={4pb>_(c{?){Wwh!o#v*|&4%b{}ylK_37FG5f*?ZlEv3y~ctC z8p6D2Vuqbpp6+5IH6RC=*!JXA!5iq#gGl%zVQQ|Sv619-by-7&a2FKD2)kFi*>~3} zhO;kI44WpHYM+wU_fAO!**ILmJ@m}9&$64R(fC!~smwiL2vSxU*lsOuP^#4E9Uonw z)BYZAkhZuVLJsQi=z{)3FrYel`)sCkr2yw0d>*zNu%bEX>)WM+OV?hzI03dj7pT;y zJfXDw)8e<)Z${s4dbJO*msdf78{99UgTYGbPj)4%ZVt{{f3=gHvfltt4=(?jf-g;d!$T4-Ox8f};_r=;uL^@|V+76gJtn|9ZA?Ag>kek)rb?n>j@Dgxua35iBA1ETl zd!w;Gk~HzVq~y59ir7m!Ne4qsyOM&NYbf4XRw|>T%MRvFI0l|^!Sls1<%JJC zes6k3zi9=(cyc>J1V?yxN?bxuif(H4>r*GEP*vP}_;4=B^oR~EO)_-$W8aH0_3o8F zYql)U_|eOL=IVF9Yr*AD<}gO(mW~W!3dw(E@{i{T0{lKs@;VggS@6Y+tAHD#-+4=tIf$w^F$mh{Hs&h;`!geu?z)*X&$?G2< ze&9e(!**-#9{R0e$S1!gG%jT*P<`fY7B3Z=8M8z3FC}m@Sc)QZK;AsE6U<>r%NEX? z=LACiXBX3gn1q_naSp*fyr*$Z*=>&LG({|X-6Eq`$1sPg18Sm>T7=;?|AHJ=*fIMlh@?d$q-u&*+igrG}0PUx43MAUw6yS+~RIM7-tIRK1y?A_> zBt9=+zwY{|k96$idKu+~tah9f=5eyN)A&RE$|mNWaBTZc*;y-iFMx72_i{ZyQv;rP;_tt20^ju7{jSn} zUDfCe9U3++RG6j}_T*4|#RjoV>7d)lIop1-ENiACe4W2KX9GZ zOfJZw=^*}KISC#{;;r>`c*%)>a022BsMnsBPXX1IYJskd#g89QNfZhiJWoy5p0dba zRn0Xah#v|$V6EYBkp4ixy;rgvg$t;Oa$!hi?iRCMbT%`S%DIOuO^!j#C3QuO!PC{X zw7gVZR&nXVDFTaQzF?Qn6LG1eD;7TzX%%JXR1ip-1 z@zct3zweia18OdP+6y3w+qYU`*jG@peCxiSHTex*ybEudp7bvCS}`1wLD3a47tWni zBrJDq`uoS%z1%Btz7?Cl{Xv5dei+-c;PIGSb|mb?fa_7cXdMSm>8|g2Xrk|r&xcZ? zzH=c%tC>EZCsKm0zf)pFM-#9xZ(-T8w!=?ay^?{a)#)Ajr>DpBlB47abW^1r!g{d_ zw2^{!tlOB9JQ{NL^XI>E>ho=o6q!K2@O<^eKbC(?w|}yQKE6WeZK9{e6cd?E0`3g; z6r#t3!qe2DJBc%nAiMT19W$)ERs?vELjRR5jQ(J$3TW}k9zexA;8UNfv*7}HA&Hms zio_1MbrXX0r{0GG|DrlC(+Sh2ONj*X`uWfwa+L<>1$5w8E=xs>rjimB=+6yvhS=)} z-4Q7Aaml5vRX^PpEKpT=*TlEm^!;Q~%|N3b?yDENyNk=j*EPv`Pe^Gtu!bJZQv3a5 zX|L7Q6bo=Xe5v&2jVX$7-1+hg+m zp!V~8-bn6`h+ok~`{x~po9VPWn4PiCsDc|A*jzcR70(L`56yp_(~b+hYF-x>ij|He z5K!nvn?Lg(oz;c!3OHC5l3~zhHqMx>^{Va<9oM`a@2cAbb4I}3w_?lg{Y*w7uHFeP zdeT8ySy;1;OD(15BuE;yiZI*KuqIyl)T?YRcqP#6APm(&)f&&07yW5fvD+c^MJzhP;iVqY zKq;%vwVyt&XF)#W19XcFap=ng-Fb|-V|26Mw?0`nj6<||?;i(K4_dCqU91jC*Sr*$ z2*;$vusxz4x1BO&&(Sm-@U0suj}P3jZ@}BO3#cQgQ>MBt?PvvKplgHmB;y`$0DZl$ ztsDiYt*dyLm1S^trui(Va^*`&a9+NBn^$r^{_-E~U0>0FepxKe+_@+Nb1@BtQQ)fL zyM6}cV3%&)db_&1%4rE@B!^zbUK*QqQ&@If%7M{|vEpWS_V(NhY$5tOE>sEP<~$n` zhMFP~pa}5BwYGLFuJ~5@y)yZ!7l10ylb_$CA{nUa4D5)EoG4{eNLM*@o68dKgv2Gf zjUOxL4nsF(=FEeRxlq(xIq2V#>Fi!;QIkbpK`ZPrH+mVIO~wog7m9-A(f2qLyuG}3 z?cG0)GK$mp45)$Ik80n{bvJUe!s0K<^I9Fc(`Qjm`^pQFn6O$BJzoUnaX#GsLuAb#?&LaBY;lL<@jK;I1G_t)O^>h@p z4c3RliT9m3dMP3m6l}K}RQhfYG5NA}-FH9A{5UYhA7(X~0$ge7>vN8Qke}iA7&yZm zps|EzubKY0QSk*u`ftyGFM4s`pqoYZj?d+ne;$1B=+RjUa;W%y9_Hn(d33?Oms_(5 z-6?z*(I&Wg_wKg6`}Uoo>Rj6HsIIGIiE_CX%fghgvie$Bw+{`jFB~B9mB3FqToaeN zcpa$&*>b(>BPGw#RJ~m&twXtCN{veRo4ASc~ zPQn+1=a+M;I1SL>`i>Pj=E-Ue_IP5k-QmQj-4~z6>626fS>6Fd1kHMrLxuSmg!6W| zhPv(Tu?1VUB)yaJ9{ogbny-_lPw!Uw1+1Zoy82vz-^rymR~wwZoJ5XFnf<(AUA3Xl z;aqm(9@aS9qhfuAy%Yo=*rd)}5r*lzL)l_f7h9*o7tvS{7-au$;A%O4$f>qX75>f4 zl`k|KtS7L?0YP{X6C|n7YeGm}#KDpG;RDG38K&q)`q-VpguB_I8bp znUCw}yEgM^_hIodiaI(-0TH)&*Zs5M*OrjM=<^gd%6 zWmvDY$KHw_yI*!0^XB^>GCWy+!{Z~ZhZxd|xXc{M6)DmNZQk6t^E=WTF(QQFL{qM; zci+!TtZO>HiXm<`1R+dANNLQCZ_4;bcke0yCtyn$QJTTC^K{>_4JK%`I!%w#w{PVN zU<`0_8m@X8aiEq0uyFu)LYkNKQE=r(5zRp}tF z#y~6h1NZ$pu{OT4h#DM^ZJM_#_6;ir(x57>T@os_VTl{nCW3N^KP9XeVrFHEzuaiD zaa*c!Y5HOXsW|IM1s)s@<)MH|HZ7b#4TpTF7?ZUvFAH@&l!3Z%F~v2!+1l142uig^ zp3>dnOiPF6-q5mvbwC7xGwJ7#YW|FCFT?`_H?+goC~}2qK+{9uSVZc6`e}m>|JXi& zM6SCu@kzr5)AFK9>KplPD_Rkb3}M|-#BBftGgchBT(FX>;?owk#-XBf`;a8aV|?+7;`Bj^l0ucGY^fnn!5bEuF^4a z1uIwq_J)O>xO4lbpT%oY2q74O@9F)AI_()h7A{C}=9t~vw#jN(L&dV<#h;Ux{P?~S z7J9et`hXL3?~A$eHCyCQYz>H% z|GJ(S!owlE5Ty_&xiQW~c7e4Z2DvM-yj>xnT|0trV0^)az`=@KFEs=wskAQZi1!9Q6&}~BIAR78^tkA4aMqF9 z{#xF>ZJpif#t&KH!%pwqz5CViqb>af%EH489v5T%JTG2|9Zny|R{-p^>x0MMEQV(mc#A@UUjYhH7q|q+aQTniUB$t?M zXzCSM66K#!JPv`)C}$^K&xYvSSClDB=3T63`ZruK=@W@e8v>bd8ANYRHLV)1S~`<_ zglk(j(?gKoL)j}ohYO9EiVW_q)y>@2T0dw?_ged2Y>8kxi7%(1yuuaYo(qHJzMCc6 ze(n}9!ejc4oE#ll_}Gobv2Uez0Z613BhRbj%KL?mdl11$TZ`2LP>y?BfB+|CfO;2|J!4AMVfH)N-n{8BbT3uupUMtmCtE2Ndl z*bgLbMwK>i7er||`S}mpPZCTB6o^lqScLNyEt;@w)5cGDkoi%cJClo;1I|hoTu!Ni?j| zMgis40JhT9t94q)tXmwnc0w?R%TNW@m<=0rKb*VV%c}^j-B+qi@#};?=nQfy?&UaB zym;8tK&}{0tsG9`2qUzktDhp+ETRjN6kmw-AD>?r%#v%S#cR$k(7q8( z1hKuOTZYOzmDMZw1E%ys)l#0f&?%`kAkclFuKuma%bkPqD~nnD*crW4(%o*$5|zrP z!_;Ok%goG75$Xyx3OgnZD#7RhAL)@LN!7rM>Ri z%5=bHTf+mmF^SP1YE23Qu`NXwro*DO@f=m{YsiRkeMDRHWsPL$U0scsPo;HVpP3!~ zy7cb7quacbI7QQY6s0WXYmk)fHySOjwUj0m518zc7|&7M7R-6w_YV!x2mTN9j4H*( zD|v{i8ClyiY6tEuOQo4OcGj$B92(s*I%2o!J?Ip{p(7p>@~TjJge*XIB`7>whRDJB z_IuHg)a^$`1JXc-5@RJylEe1xQ$?9YYgWu=L0sE>zIFnk0ozx|nQRyFe!~Yg7h}Ld0Ven7!f$6fB;+;YmhJJQ;nW@`F+)>g6(ee$ zr%w;P8Q5v$KHG}cJL+(wE6j`Lty=lv8^(fZy7|u8{}P~{7G2PARg*a+cNFpu{xcg) z0_0)gG09w$;9*pMGFIpMT_Ze0zI~h{@g1%j7HstqD3QX*6Ooa@8QndqpF5b89|)@a z6huIp8{~qZ^SUZ^>zYu6xE0Kz2D1wsK4cGN|sAboYB5nPbgof+h{aM?qU%z_AwU7;HOfMo4Dp3!*f7 z0Cf7^bu!aBR~}#zK=#qIAtD)JDUEtL_kLV!UlOVoEL9FlrD%`^7rm)aQF}ZajdjOePI!>FQALiZ9W>R8Xp6QAi==?rJ{4 zbdz|U5||hsc9S9G2{sUkx-?Z}5K%B9ljv%G-`TE1%V!*J!Ym?{67x>VC>kv(SlQ6K z&$F)Y{?S;}4coUHp5-gKj{WbyrC5*#JM4!~mET*SzFy*AhSiJ+HQ<#B+VrnC1Bo-# z?5wo(Axa1cED9l6a#-T!qsl=l5~|Qa>P?&apFCL-nLNJ88S$B1f+8suGc8LR`Z*C2 z!KFtqADTa7up)1ju_qJ*l!#Y)kREL$SPCmW(Sw-}yk8P^WJRs#z_u21o@>Ut!=?|x zkkoA`{Oi%9oBg^Ur0M9^io#fg=%*8hk zZV=6?)1}+&HGYv~qjgq7$D=LdQQ!TSmVwLu8cWK8N?Ed;t_MQ7D|N9@j?mvj@ehSH zP9EdwzX*IzxMMQRlYvp{+gqAyYH48}yt&&!I6FtNQ>mkd1(}Zjle>G$hv}NvgNxjS9ToUb};#N~2Gkxa7Wf-?q1Z z5sLr*9FuT~o{Q8yFxu(p-^oX(HE_}By2LXm>dEmI7FV*wo= z=TitJpy5bzBEmiyZG@>y<5gs%ByF_Kgw4(-00DLik!uY>vhzG3VAKa|MhMi!{QKD9 z9a;+Go(Prq^bsK(4zK4rS1xBRM1aoB!o5l1GNm84)xozd(Sg|^4-tP{oS@-dGo#j> zHLTf?JVsu++I)l1AHOw=hU_DVC7d(Iu<=j4NdR16d*&J58fbNBw01~fV^$HYbAV@| zcv0sGF_(2BMW=#<JLr{~yh>c(>lo&Q?+Ie`2E6S7ny@#i3-}saZQ#vmU~9@Qxtf){Bu*sg+o zR=>Qy@({#%E2GuD={0|RhzD1n12YeB z=%Av|(a{klLtf?@)-=~f_*UID_=|qnKNhbt3&@kpdJ|Au!*oo@6Lv~a0U^<5!Ns7g zL0o4AQ>MCmw_EAC6=PujflKf)uk3=u-uE59>e_SAU`;($;V}(4@k2BIGTp$W4;gJh zCR%&M4>8T)qRrcy<5p`=VsoNaRpfR3o9?q`r=|?DNVwwSYW>1*-Qrs9n8HiC`_Mw7 zDiWC)^Dm;YP9keWnS(a4oMwVlW!br)CJ$bU~s@}SYsdNy;S$M*P`zIZy zaiidjWh!o(b40Gl&=W^wtn%{O(#ONW+aJ9h{8}UiQ7M+K3&3^~jzc9zvBg*XUujhI zilz#>xOw$ATg=#Vc#YmlO5hP$L#AEj-apa&R+^KSK-}iP;>UvoP+siJnGKw|L{%JB zM_kMFf#xD60n9y?z9qZpP5vuPgu0jahFY>(!-CJjonw&pEBj3}m#n@`#?cG!$msV? z6=1>gk!0Vy1LbZ2#tpw4WT*4ClsCMOpoX&?E`{(HSuq?`+pecUDJ=U8Wy$f!<66Di z!8XQNjvr023~R^X0asosc%jv5>Z$*C2DzP67+9RtoV9ARooqy_M8rsF7Q;L^dQ7Tv zo@Cy#Zmq#Qx<|$plGPGBcTRPdnfOPr=uMwCix2yq*Fh;gg#IbC`vlP-Gp*M&<7obg zNE*mPf=M~xUh$}Nw6`fzl)?2`7&Peo7yy;ZZEBj3Rk2C5C2WDFjNvYnj~_in3-kt( z_03x4h{y62$c%|Wq`;Nm7C1Q>8wM>xJSX~Y)U*4Lx#s2Ftm)poQ9{x388gC1 zm?UyBkxSg3+$|iGz$WD@OyuST&}m8^v!WfD;A$^=&Ky>qS@4ug&j0z;5FV6c*z{Fl z!=^23W8u~P(X4`GwMWWB$9-Oe?~?Jqe}Bn0bglyClwIkyq+73B+&LRuFWdS!_A`%S zvOifxOsCrTB|v=Ksq$FOAMna6R}txZHiU4`Qc;sv*|*OH>nI=3(NAXm#X4Qmt6jK5 zha%5W?VIz818GJ-6e%`K$x;2`qeqqB`u6VIx5O&3U~L_EB3pA*zFYz-O1pEX88Hd@ z)tF`d1l7^qTQwOu2R|Y=k_m;efoZHW4PNo`l2w@bmk4-yiB2c^N0_N7)z6MFa74lz zZs9BOlXMt0D(PrLAd9j}!nQ=hg9i)N--@H@o5ep6RYl28Y022rljBrwBArqs#<0`N zjwMw_j_ksul4o6^vL=DgiyQz2nU}ty@r?m1bv`&dMYQ%n4Wo~I8I_(ZBItAHGBrF_ zliC&s<+EAk%%n*})IW>`IKUyS@WH69SZKDV_8wCx>K_f@i1^$qL<`nXB&?1_jcqjd9tbhS}-$FK37kjHeu(FEhp3sKDO_n|KQ=n z8yee>`9z+JWPt9M6#YqP(we+zhkmZ;(s?Y;@%v(U&%BGipuw2?-F^JHF;xdY)l=Kw z+JNqba`~kuIh9Ye=O3ESHNcwH$DaI%{k6N#NcU{R zPktEvT`XQUB)iG<>>?%2f!#6LhJ(u=IoKbm)DLsRO21}AeG^m1{KeuO^*RsH;vwu@@yuVFtK%N}s)oqF zV)tble|k9G{n@{6B1D`2#N24Vn&fr2(SZwfkA99Xx)R?;LI3@=oq)N}i(2xpk6igB z6^VXo6kq2sVmzn=ayC_%jTMztcv0 zuFWAUrm(LJFToi1*TZF|>d4J5Fxl|b9{LNqR|~4M`tNw;1eE7~qI>;i51ciYC!9`rIVIUg8;N34Uzuc#%!{_5t}tNmL3uRazbg0|pSD|XE; z7&Zo}*8+AC|D@bh`XttGq9y$r;-l0Xkh!pF?7a2Fuje+{sAkB%{Q0Or?`UUje~-3n zQ`=m1y0>6bcdh)ud?yX-@5#mz~->t0>rKlI8~-*3^LdrBUs{Jb?# z{lKebt)nJ&i+;3lQJ*%>Z4_TOS!?HIcApBFl64YJBBBXZvjIW?i{ z0xgAN{m;^GYcky8gFmm*JN=-m{#N^&bI=X z|I9fs>SW}Eu32vJ5!0fyEV=R|rB|L?e80Bp9+#g+WX-#}q+dwZJdMw*YVMt^qga=_ zy6B5{b&b`9+{JCTUQ2N78CLSmqNI*O@%2dee~wN%ZFlx@$jlh+@KGiAI@M7mB@J|| ztKdH=y)-M1bdbMOXbjD3Ab)M&zo?J=RdKyVJio6{IBX$6@Sj1RR~O4)72Az|{qnZ9 s9&O~G*FWEsD}PmVu>b%35f$~vEFZ5k_RQy*@{2?5M%hMNJ8k%X00iCCcK`qY literal 0 HcmV?d00001 diff --git a/html/_images/graphviz-d08592da92fae1a4929d96c1cb6e446e05714101.png.map b/html/_images/graphviz-d08592da92fae1a4929d96c1cb6e446e05714101.png.map new file mode 100644 index 0000000000..d4062a6248 --- /dev/null +++ b/html/_images/graphviz-d08592da92fae1a4929d96c1cb6e446e05714101.png.map @@ -0,0 +1,2 @@ + + diff --git a/html/_images/plantuml-d388f7ab1eb3f4d70c57feb299c189351a097db9.png b/html/_images/plantuml-d388f7ab1eb3f4d70c57feb299c189351a097db9.png new file mode 100644 index 0000000000000000000000000000000000000000..06b465f5003dcec15b8fec72d1f761bb0aa38da9 GIT binary patch literal 10479 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 literal 0 HcmV?d00001 diff --git a/html/_sources/design.rst.txt b/html/_sources/design.rst.txt new file mode 100644 index 0000000000..d960d11196 --- /dev/null +++ b/html/_sources/design.rst.txt @@ -0,0 +1,131 @@ +Design +====== + +Architecture diagram +-------------------- + +.. graphviz:: + + digraph shaka_packager { + label=<Shaka Packager Architecture> + labelloc=t + + subgraph cluster_media { + label=<Media Processing Pipeline> + + Demuxer, ChunkingHandler, EncryptionHandler, Replicator, + TrickplayHandler, Muxer [shape=rectangle] + + Demuxer -> ChunkingHandler [style=bold headlabel="many" taillabel="1"] + ChunkingHandler -> EncryptionHandler -> Replicator -> TrickplayHandler + -> Muxer [style=bold] + ChunkingHandler -> Replicator -> Muxer [style=bold] + } + + MuxerListener, MpdNotifyMuxerListener, HlsNotifyMuxerListener, + MpdNotifier, HlsNotifier [shape=rectangle style=rounded] + + Muxer -> MuxerListener + MuxerListener -> MpdNotifyMuxerListener, HlsNotifyMuxerListener + [dir=back arrowtail=onormal] + + subgraph cluster_manifest { + label=<Manifest Generation> + + HlsNotifyMuxerListener -> HlsNotifier [headlabel="1" taillabel="many"] + MpdNotifyMuxerListener -> MpdNotifier [headlabel="1" taillabel="many"] + + MasterPlaylist, MediaPlaylist, MpdBuilder, AdaptationSet, + Representation [shape=trapezium] + + HlsNotifier -> MasterPlaylist + MasterPlaylist -> MediaPlaylist + [dir=back arrowtail=diamond headlabel="many" taillabel="1"] + MpdNotifier -> MpdBuilder + MpdBuilder -> AdaptationSet -> Representation + [dir=back arrowtail=diamond headlabel="many" taillabel="1"] + + {rank=same; MasterPlaylist, MpdBuilder} + {rank=same; MediaPlaylist, Representation} + } + } + +.. graphviz:: + + digraph shaka_packager { + subgraph cluster_demuxer { + style=rounded + label=< > + + Demuxer2 [label="Demuxer" shape=rectangle] + Demuxer2 -> MediaParser + [dir=back arrowtail=diamond headlabel="1" taillabel="1"] + MediaParser -> Mp4MediaParser, WebMMediaParser, Mp2tMediaParser, + WvmMediaParser [dir=back arrowtail=onormal] + } + + subgraph cluster_muxer { + style=rounded + label=< > + + Muxer2 [label="Muxer" shape=rectangle] + Muxer2 -> Mp4Muxer, WebMMuxer, Mp2tMuxer [dir=back arrowtail=onormal] + } + } + +.. graphviz:: + + digraph shaka_packager { + subgraph cluster_legend { + style=rounded + label=<Legend> + + node [shape=plaintext] + + blank1 [label="" height=0] + blank2 [label="" height=0] + blank3 [label="" height=0] + + "Composition" -> blank1 [dir=back arrowtail=diamond] + "Inheritance" -> blank2 [dir=back arrowtail=onormal] + "MediaHandler data flow" -> blank3 [style=bold] + + "Bridge Class" [shape=rectangle style=rounded] + "Manifest Class" [shape=trapezium] + MediaHandler [shape=rectangle] + } + } + +Media handler data flow +----------------------- + +.. graphviz:: + + digraph g { + rankdir=LR + + StreamData [ + label="{... | SegmentInfo | MediaSample ... | SegmentInfo | MediaSample ... | StreamInfo}" + shape=record + style=rounded + ]; + + MediaHandler [shape=rectangle] + MediaHandler2 [shape=rectangle, label=MediaHandler] + MediaHandler -> StreamData -> MediaHandler2 + } + +.. uml:: + + MediaHandler -> MediaHandler2 : StreamInfo + MediaHandler -> MediaHandler2 : MediaSample + MediaHandler -> MediaHandler2 : MediaSample + MediaHandler -> MediaHandler2 : ... + MediaHandler -> MediaHandler2 : MediaSample + MediaHandler -> MediaHandler2 : SegmentInfo + MediaHandler -> MediaHandler2 : MediaSample + MediaHandler -> MediaHandler2 : MediaSample + MediaHandler -> MediaHandler2 : ... + MediaHandler -> MediaHandler2 : MediaSample + MediaHandler -> MediaHandler2 : SegmentInfo + MediaHandler -> MediaHandler2 : ... diff --git a/html/_sources/docker_instructions.md.txt b/html/_sources/docker_instructions.md.txt index c1f73b6ced..13a350e0e3 100644 --- a/html/_sources/docker_instructions.md.txt +++ b/html/_sources/docker_instructions.md.txt @@ -32,6 +32,14 @@ This runs the container and maps `host_media_path` to `media` in the container: $ docker run -v /host_media_path/:/media -it --rm google/shaka-packager ``` +Note that the networking in the container is containerized by default, so if +you want to access UDP multicast in the host network, you will need to configure +the network explicitly. You may do this with `--net=host` option, i.e. + +```shell +$ docker run -v /host_media_path/:/media -it --net=host --rm google/shaka-packager +``` + Then in the container, run the packager command, e.g.: ```shell diff --git a/html/_sources/index.rst.txt b/html/_sources/index.rst.txt index 1dd070ed8f..f2cdb5f20e 100644 --- a/html/_sources/index.rst.txt +++ b/html/_sources/index.rst.txt @@ -13,6 +13,7 @@ source code repository: https://github.com/google/shaka-packager documentation.rst tutorials/tutorials.rst + design.rst library.rst .. include a hidden TOC to avoid sphinx complaint. @@ -20,7 +21,6 @@ source code repository: https://github.com/google/shaka-packager :hidden: build_instructions.md - design.rst docker_instructions.md library_details.rst tutorials/encoding.rst diff --git a/html/_sources/options/hls_options.rst.txt b/html/_sources/options/hls_options.rst.txt index d36e28dc85..52969215e6 100644 --- a/html/_sources/options/hls_options.rst.txt +++ b/html/_sources/options/hls_options.rst.txt @@ -11,6 +11,11 @@ HLS options The base URL for the Media Playlists and media files listed in the playlists. This is the prefix for the files. +--hls_key_uri + + The key uri for 'identity' and 'com.apple.streamingkeydelivery' key formats. + Ignored if the playlist is not encrypted or not using the above key formats. + --hls_playlist_type VOD, EVENT, or LIVE. This defines the EXT-X-PLAYLIST-TYPE in the HLS diff --git a/html/_sources/options/udp_file_options.rst.txt b/html/_sources/options/udp_file_options.rst.txt index 05de7102dd..025c524d16 100644 --- a/html/_sources/options/udp_file_options.rst.txt +++ b/html/_sources/options/udp_file_options.rst.txt @@ -11,7 +11,7 @@ options: :interface=, source=: Multicast group interface address. Only the packets sent to this address is - received. + received. Default to "0.0.0.0" if not specified. :timeout=: diff --git a/html/_sources/tutorials/basic_usage.md.txt b/html/_sources/tutorials/basic_usage.md.txt deleted file mode 100644 index 259df894e8..0000000000 --- a/html/_sources/tutorials/basic_usage.md.txt +++ /dev/null @@ -1,61 +0,0 @@ -# Basic Usage - -## Getting help - -```shell -$ packager --help -``` - -## Media file analysis - -Shaka Packager can be used to inspect the content of a media file and dump basic -stream information. - -```shell -$ packager input=some_content.mp4 --dump_stream_info -``` - -The output looks like: - -```shell -File "some_content.mp4": -Found 2 stream(s). -Stream [0] type: Video - codec_string: avc1.4d001e - time_scale: 24000 - duration: 3002000 (125.1 seconds) - is_encrypted: false - codec: H264 - width: 720 - height: 360 - pixel_aspect_ratio: 8:9 - trick_play_factor: 0 - nalu_length_size: 4 - -Stream [1] type: Audio - codec_string: mp4a.40.2 - time_scale: 44100 - duration: 5517311 (125.1 seconds) - is_encrypted: false - codec: AAC - sample_bits: 16 - num_channels: 2 - sampling_frequency: 44100 - language: eng -``` - -## Basic transmuxing - -Shaka Packager can be used to extract streams, optionally transmuxes the streams -from one container format to another container format. - -Here is a simple command that extracts video and audio from the input file: - -```shell -$ packager in=some_content.mp4,stream=video,out=video.mp4 \ - in=some_content.mp4,stream=audio,out=audio.mp4 -``` - -Shaka Packager is also capable of more complex tasks, such as applying -encryption, packaging contents to DASH or HLS formats, etc. Refer -:doc:`tutorials`. diff --git a/html/_sources/tutorials/basic_usage.rst.txt b/html/_sources/tutorials/basic_usage.rst.txt new file mode 100644 index 0000000000..ade33ab12c --- /dev/null +++ b/html/_sources/tutorials/basic_usage.rst.txt @@ -0,0 +1,59 @@ +Basic Usage +=========== + +Getting help +------------ + +:: + + $ packager --help + +Media file analysis +------------------- + +Shaka Packager can be used to inspect the content of a media file and dump basic +stream information:: + + $ packager input=some_content.mp4 --dump_stream_info + +The output looks like:: + + File "some_content.mp4": + Found 2 stream(s). + Stream [0] type: Video + codec_string: avc1.4d001e + time_scale: 24000 + duration: 3002000 (125.1 seconds) + is_encrypted: false + codec: H264 + width: 720 + height: 360 + pixel_aspect_ratio: 8:9 + trick_play_factor: 0 + nalu_length_size: 4 + + Stream [1] type: Audio + codec_string: mp4a.40.2 + time_scale: 44100 + duration: 5517311 (125.1 seconds) + is_encrypted: false + codec: AAC + sample_bits: 16 + num_channels: 2 + sampling_frequency: 44100 + language: eng + +Basic transmuxing +----------------- + +Shaka Packager can be used to extract streams, optionally transmuxes the streams +from one container format to another container format. + +Here is a simple command that extracts video and audio from the input file:: + + $ packager in=some_content.mp4,stream=video,out=video.mp4 \ + in=some_content.mp4,stream=audio,out=audio.mp4 + +Shaka Packager is also capable of more complex tasks, such as applying +encryption, packaging contents to DASH or HLS formats, etc. Refer to +:doc:`tutorials`. diff --git a/html/_sources/tutorials/tutorials.rst.txt b/html/_sources/tutorials/tutorials.rst.txt index ad16fd6c9d..c5786155c0 100644 --- a/html/_sources/tutorials/tutorials.rst.txt +++ b/html/_sources/tutorials/tutorials.rst.txt @@ -4,9 +4,9 @@ Tutorials .. toctree:: :maxdepth: 2 - basic_usage.md + basic_usage.rst dash.rst - hls.md - live.md + hls.rst + live.rst drm.rst ffmpeg_piping.rst diff --git a/html/design.html b/html/design.html new file mode 100644 index 0000000000..53da9ef225 --- /dev/null +++ b/html/design.html @@ -0,0 +1,238 @@ + + + + + + + + Design — Shaka Packager documentation + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +

    Design

    +
    +

    Architecture diagram

    +digraph shaka_packager {
+  label=<<u>Shaka Packager Architecture</u>>
+  labelloc=t
+
+  subgraph cluster_media {
+    label=<<u>Media Processing Pipeline</u>>
+
+    Demuxer, ChunkingHandler, EncryptionHandler, Replicator,
+        TrickplayHandler, Muxer [shape=rectangle]
+
+    Demuxer -> ChunkingHandler [style=bold headlabel="many" taillabel="1"]
+    ChunkingHandler -> EncryptionHandler -> Replicator -> TrickplayHandler
+        -> Muxer [style=bold]
+    ChunkingHandler -> Replicator -> Muxer [style=bold]
+  }
+
+  MuxerListener, MpdNotifyMuxerListener, HlsNotifyMuxerListener,
+      MpdNotifier, HlsNotifier [shape=rectangle style=rounded]
+
+  Muxer -> MuxerListener
+  MuxerListener -> MpdNotifyMuxerListener, HlsNotifyMuxerListener
+      [dir=back arrowtail=onormal]
+
+  subgraph cluster_manifest {
+    label=<<u>Manifest Generation</u>>
+
+    HlsNotifyMuxerListener -> HlsNotifier [headlabel="1" taillabel="many"]
+    MpdNotifyMuxerListener -> MpdNotifier [headlabel="1" taillabel="many"]
+
+    MasterPlaylist, MediaPlaylist, MpdBuilder, AdaptationSet,
+        Representation [shape=trapezium]
+
+    HlsNotifier -> MasterPlaylist
+    MasterPlaylist -> MediaPlaylist
+        [dir=back arrowtail=diamond headlabel="many" taillabel="1"]
+    MpdNotifier -> MpdBuilder
+    MpdBuilder -> AdaptationSet -> Representation
+        [dir=back arrowtail=diamond headlabel="many" taillabel="1"]
+
+    {rank=same; MasterPlaylist, MpdBuilder}
+    {rank=same; MediaPlaylist, Representation}
+  }
+} +digraph shaka_packager {
+    subgraph cluster_demuxer {
+      style=rounded
+      label=<<u> </u>>
+
+      Demuxer2 [label="Demuxer" shape=rectangle]
+      Demuxer2 -> MediaParser
+          [dir=back arrowtail=diamond headlabel="1" taillabel="1"]
+      MediaParser -> Mp4MediaParser, WebMMediaParser, Mp2tMediaParser,
+          WvmMediaParser [dir=back arrowtail=onormal]
+    }
+
+    subgraph cluster_muxer {
+      style=rounded
+      label=<<u> </u>>
+
+      Muxer2 [label="Muxer" shape=rectangle]
+      Muxer2 -> Mp4Muxer, WebMMuxer, Mp2tMuxer [dir=back arrowtail=onormal]
+    }
+} +digraph shaka_packager {
+  subgraph cluster_legend {
+    style=rounded
+    label=<<u>Legend</u>>
+
+    node [shape=plaintext]
+
+    blank1 [label="" height=0]
+    blank2 [label="" height=0]
+    blank3 [label="" height=0]
+
+    "Composition" -> blank1 [dir=back arrowtail=diamond]
+    "Inheritance" -> blank2 [dir=back arrowtail=onormal]
+    "MediaHandler data flow" -> blank3 [style=bold]
+
+    "Bridge Class" [shape=rectangle style=rounded]
+    "Manifest Class" [shape=trapezium]
+    MediaHandler [shape=rectangle]
+  }
+} +
    +
    +

    Media handler data flow

    +digraph g {
+  rankdir=LR
+
+  StreamData [
+    label="{... | SegmentInfo | MediaSample ... | SegmentInfo | MediaSample ... | StreamInfo}"
+    shape=record
+    style=rounded
+  ];
+
+  MediaHandler [shape=rectangle]
+  MediaHandler2 [shape=rectangle, label=MediaHandler]
+  MediaHandler -> StreamData -> MediaHandler2
+} +

    +MediaHandler -> MediaHandler2 : StreamInfo
+MediaHandler -> MediaHandler2 : MediaSample
+MediaHandler -> MediaHandler2 : MediaSample
+MediaHandler -> MediaHandler2 : ...
+MediaHandler -> MediaHandler2 : MediaSample
+MediaHandler -> MediaHandler2 : SegmentInfo
+MediaHandler -> MediaHandler2 : MediaSample
+MediaHandler -> MediaHandler2 : MediaSample
+MediaHandler -> MediaHandler2 : ...
+MediaHandler -> MediaHandler2 : MediaSample
+MediaHandler -> MediaHandler2 : SegmentInfo
+MediaHandler -> MediaHandler2 : ... +

    +
    +
    + + +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/html/docker_instructions.html b/html/docker_instructions.html index 00c2858c1c..04e3053468 100644 --- a/html/docker_instructions.html +++ b/html/docker_instructions.html @@ -115,6 +115,12 @@ machine.

    $ docker run -v /host_media_path/:/media -it --rm google/shaka-packager
     
    +

    Note that the networking in the container is containerized by default, so if +you want to access UDP multicast in the host network, you will need to configure +the network explicitly. You may do this with --net=host option, i.e.

    +
    $ docker run -v /host_media_path/:/media -it --net=host --rm google/shaka-packager
    +
    +

    Then in the container, run the packager command, e.g.:

    $ packager input=/media/example.mp4,stream=audio,output=/media/audio.mp4 \
                input=/media/example.mp4,stream=video,output=/media/video.mp4 \
    diff --git a/html/documentation.html b/html/documentation.html
    index acddc8ab8f..bcf40b2710 100644
    --- a/html/documentation.html
    +++ b/html/documentation.html
    @@ -363,6 +363,11 @@ output HLS.
      The base URL for the Media Playlists and media files listed in the
     playlists. This is the prefix for the files.
     
    +--hls_key_uri <uri>
    +
    + The key uri for ‘identity’ and ‘com.apple.streamingkeydelivery’ key formats.
    +Ignored if the playlist is not encrypted or not using the above key formats.
    +
     --hls_playlist_type <type>
     
      VOD, EVENT, or LIVE. This defines the EXT-X-PLAYLIST-TYPE in the HLS
    diff --git a/html/genindex.html b/html/genindex.html
    index 5f30913566..9c2f01da73 100644
    --- a/html/genindex.html
    +++ b/html/genindex.html
    @@ -148,6 +148,8 @@
           
  • shaka::HlsParams (C++ class)
  • shaka::HlsParams::base_url (C++ member) +
  • +
  • shaka::HlsParams::key_uri (C++ member)
  • shaka::HlsParams::master_playlist_output (C++ member)
  • @@ -214,6 +216,8 @@
  • shaka::Packager::Run (C++ function)
  • shaka::PackagingParams (C++ class) +
  • +
  • shaka::PackagingParams::ad_cue_generator_params (C++ member)
  • shaka::PackagingParams::buffer_callback_params (C++ member)
  • diff --git a/html/index.html b/html/index.html index 58e4d8fe94..7c060e5b84 100644 --- a/html/index.html +++ b/html/index.html @@ -101,6 +101,11 @@
  • FFmpeg piping
  • +
  • Design +
  • Shaka Packager Library
  • diff --git a/html/library.html b/html/library.html index 56a6602549..7ad93f920b 100644 --- a/html/library.html +++ b/html/library.html @@ -29,7 +29,7 @@ - +